[Back to EGAVGA SWAG index]  [Back to Main SWAG index]  [Original]

{
    Fire v1.0
    Written By Evan Jones

The Flame Effect :-

  X = Pixel  A,B,C = Values to average  DV = Decay Value

  123  123
  4X5  4X5
  678  ABC  X's colour = A+B+C / 3 ( beacause were adding 3 values ) - DV
        ^ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  ^ X and its surrounding pixel colours. À> X and the pixels we've chosen

The basics of the flame effect are to choose as many of the 8 pixels
( you could use others ) arround the pixel, you are trying to finds
colour, as you want.  Then find the average ( add up all the values and
divide by the ammount of values you added ) of the pixels and then
use this as the pixel's colour.  You have to do this for every one of the
pixels in your pixel array.
Because were calculating values then putting them in the array you can't
just use the screen.  So you are going to have to use another array to do
all your calculations and then move that to the screen.

This file is provided so that you programmers who want to write demos and
stuff like that can learn how to.  I've commented most of the source and
have only used a couple of assembler statments so those of you ( you know
who you are ) who don't know how to write in assembler can still know what
is going on, although I can't guarentee that.

I would like it if you could send me a message saying what you think of this
and if you have added things I'd also like a copy of the source. You can
mail me at :-

  Evan.Jones@Millenium.Cbr.Fidonet.Org
  - Or by Fidonet -
  "Evan Jones" at 3:620/265
}

Program Flames;

Const
  Pal : array[1..768-16*3] Of Byte =
  (   0,  0,  0,  0,  0, 24,  0,  0, 24,  0,  0, 28,
  0,  0, 32,  0,  0, 32,  0,  0, 36,  0,  0, 40,
  8,  0, 40, 16,  0, 36, 24,  0, 36, 32,  0, 32,
  40, 0, 28, 48,  0, 28, 56,  0, 24, 64,  0, 20,
  72, 0, 20, 80,  0, 16, 88,  0, 16, 96,  0, 12,
  104,0, 8, 112,  0,  8,120,  0,  4,128,  0,  0,
  128,0, 0, 132,  0,  0,136,  0,  0,140,  0,  0,
  144,  0,  0,144, 0,  0,148,  0,  0,152,  0,  0,
  156,  0,  0,160, 0,  0,160,  0,  0,164,  0,  0,
  168,  0,  0,172,  0,  0,176,  0,  0,180,  0,  0,
  184,  4,  0,188,  4,  0,192,  8,  0,196,  8,  0,
  200, 12,  0,204, 12,  0,208, 16,  0,212, 16,  0,
  216, 20,  0,220, 20,  0,224, 24,  0,228, 24,  0,
  232, 28,  0,236, 28,  0,240, 32,  0,244, 32,  0,
  252, 36,  0,252, 36,  0,252, 40,  0,252, 40,  0,
  252, 44,  0,252, 44,  0,252, 48,  0,252, 48,  0,
  252, 52,  0,252, 52,  0,252, 56,  0,252, 56,  0,
  252, 60,  0,252, 60,  0,252, 64,  0,252, 64,  0,
  252, 68,  0,252, 68,  0,252, 72,  0,252, 72,  0,
  252, 76,  0,252, 76,  0,252, 80,  0,252, 80,  0,
  252, 84,  0,252, 84,  0,252, 88,  0,252, 88,  0,
  252, 92,  0,252, 96,  0,252, 96,  0,252,100,  0,
  252,100,  0,252,104,  0,252,104,  0,252,108,  0,
  252,108,  0,252,112,  0,252,112,  0,252,116,  0,
  252,116,  0,252,120,  0,252,120,  0,252,124,  0,
  252,124,  0,252,128,  0,252,128,  0,252,132,  0,
  252,132,  0,252,136,  0,252, 136,   0,252, 140,   0,
  252,152,  0,252, 152,   0,252, 156,   0,252, 156,   0,
  252,160,  0,252, 160,   0,252, 164,   0,252, 164,   0,
  252,168,  0,252, 168,   0,252, 172,   0,252, 172,   0,
  252,176,  0,252, 176,   0,252, 180,   0,252, 180,   0,
  252,184,  0,252, 184,   0,252, 188,   0,252, 188,   0,
  252,196,  0,252, 196,   0,252, 196,   0,252, 190,   0,
  252,200,  0,252, 200,   0,252, 204,   0,252, 208,   0,
  252,208,  0,252, 208,   0,252, 208,   0,252, 208,   0,
  252,212,  0,252, 212,   0,252, 212,   0,252, 212,   0,
  252,216,  0,252, 216,   0,252, 216,   0,252, 216,   0,
  252,216,  0,252, 220,   0,252, 220,   0,252, 220,   0,
  252,224,  0,252, 228,   0,252, 228,   0,252, 228,   0,
  252,228,  0,252, 228,   0,252, 232,   0,252, 232,   0,
  252,236,  0,252, 236,   0,252, 240,   0,252, 240,   0,
  252,240,  0,252, 240,   0,252, 240,   0,252, 244,   0,
  252,248,  0,252, 248,   0,252, 248,   0,252, 252,   0,
  252,252,  4,252, 252,   8,252, 252,  12,252, 252,  16,
  252,252, 20,252, 252,  24,252, 252,  28,252, 252,  32,
  252,252, 36,252, 252,  40,252, 252,  40,252, 252,  44,
  252,252, 48,252, 252,  52,252, 252,  56,252, 252,  60,
  252,252, 64,252, 252,  68,252, 252,  72,252, 252,  76,
  252,252, 82,252, 252,  84,252, 252,  86,252, 252,  88,
  252,252, 92,252, 252,  96,252, 252, 100,252, 252, 104,
  252,252,108,252, 252, 112,252, 252, 116,252, 252, 120,
  252,252,124,252, 252, 124,252, 252, 128,252, 252, 132,
  252,252,136,252, 252, 140,252, 252, 144,252, 252, 148,
  252,252,152,252, 252, 154,252, 252, 162,252, 252, 164,
  252,252,168,252, 252, 168,252, 252, 172,252, 252, 176,
  252,252,180,252, 252, 184,252, 252, 188,252, 252, 192,
  252,252,196,252, 252, 200,252, 252, 204,252, 252, 208,
  252,252,208,252, 252, 212,252, 252, 216,252, 252, 220,
  252,252,224,252, 252, 228,252, 252, 232,252, 252, 236,
  252,252,240,252, 252, 244,252, 252, 248,252, 252, 252);

Var
  FlameArr      : Array[0..99,0..159] Of Byte;
  {^ the array to calculate everything }
  B,P           : Byte;
  { ^ some dummy variables }

Procedure PlotPixel ( X, Y : Word; C : Byte ); Assembler;
{ Sorry it's in assembler but I would be even slower if I didn't}
Asm
  Mov   AX, 320
  Mul   Y           { Get the Y Pos ( Y * 320 cuz were in 320x200 mode ) }
  Mov   DI, AX
  Add   DI, X       { add the X value to find the offset }
  Mov   AX, 0A000h
  Mov   ES, AX      { set ES to the video seg }
  Mov   AL, C
  Mov   [ES:DI], AL { move the colour to the video memory }
End;

Procedure CalcFlames;
Var
  X, Y    : Word;
  { two variables for accessing the points in the array and screen }
  Calc    : Word;
  { a temp value for CALCulating things }

Begin
{ For flame effect scroll through every pixel and  }
{ choose some other pixels around it. Divide by    }
{ the ammount of pixels you added up and then      }
{ subtract a decay ammount.                        }
{                                        2          }
{  123   A23   X = 1+5+6/3 - Decay Value. = 4 - DV }
{  3X5   3XB       ^ ^ ^                           }
{  692   C92       A+B+C/3                         }
{                                                  }
{ X = Pixel                                        }
{                                                  }
  For Y := 0 To 99 Do  { number of rows }
    For X := 0 To 159 Do { number of cols }
      Begin
        Calc := FlameArr[Y+1,X] + FlameArr[Y+1,X-1] +
          FlameArr[Y+1,X+1] + FlameArr[Y,X];
          { add the values of the surrounding pixels }
        FlameArr[Y,X] := Calc Div 4;
        { divide by the number of pixels added up }
        If FlameArr[Y,X] > 2 Then
          Dec ( FlameArr[Y,X], 2 );
        { decrement by the decay value }
      End;
  For X := 0 To 159 Do                    { Comment this and the next line }
    FlameArr[99,X] := Random ( 204 ) + 11;{ for interesting effect }
  { set a new bottom line }
  For Y := 0 To 97 Do
    For X := 0 To 159 Do
      Begin
        { plot the pixels to the screen }
        PlotPixel ( X+80, Y+50, FlameArr[Y,X] );
        { added 80 to X and 50 to Y to center on screen}
       {PlotPixel ( X * 2, Y * 2, FlameArr[Y,X] );
        PlotPixel ( X * 2+1, Y * 2+1, FlameArr[Y,X] );
       {^^ Un-comment these two lines for a "Grid" Effect }
      End;
End;

Procedure SetColour ( Index, R, G, B : Byte );
{ Sets a colour to a specific RGB value }
Begin
  Port[$3C8] := Index;
  Port[$3C9] := R;
  Port[$3C9] := G;
  Port[$3C9] := B;
End;

Begin
  { Change to MCGA 320x200x256 mode }
  Asm
    Mov AX, 13h
    Int 10h
  End;
  { Initalize random seed }
  Randomize;
  { Clear the Flame Array }
  FillChar ( FlameArr, SizeOf ( FlameArr ), 0 );
  { calculate a new bottom line }
  For B := 0 To 159 Do
    FlameArr[99,B] := Random ( 204 ) + 11;
  { make a the colours go from black to red }
  For B := 0 To 255 Do
    SetColour ( B, ( B * 43 ) Shr 7, 0, 0 );
  Repeat
    { calculate the flames }
    CalcFlames;
  { until ESC is pressed }
  Until ( Port[$60] = $81 );
  { go back to 80x25x16 text mode }
  Asm
    Mov AX, 3
    Int 10h
  End;
End.---

[Back to EGAVGA SWAG index]  [Back to Main SWAG index]  [Original]