home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / EGA_VGA / FIREWKS1.ZIP / EGAFIRE.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-08-09  |  7.9 KB  |  380 lines

  1. Program ArtExample;
  2.  
  3. const
  4.   MemorySize = 5;
  5.   Rays       = 90;
  6.   Max_Rockets = 15;
  7.   Max_Stars = 10;
  8.   Wind : Integer = 0;
  9.   PolarX : Integer = 320;
  10.   PolarY : Integer = 50;
  11.   Step   : integer    = 1;
  12.  
  13. Type
  14.   Rocket_Type      = record
  15.     X              : Array[0..MemorySize] of Integer;
  16.     Y              : Array[0..MemorySize] of Integer;
  17.     DX             : Integer;
  18.     DY             : Integer;
  19.     end;
  20.  
  21.   StarBurst        = Record
  22.     Trail          : Array[0..Rays] of Rocket_type;
  23.     Counter        : Integer;
  24.     Head           : Integer;
  25.     Color          : Integer;
  26.     end;
  27.  
  28.   BlinkingStar     = Record
  29.     Radius         : Integer;
  30.     Angle          : Integer;
  31.     Color          : Integer;
  32.     end;
  33. var
  34.   Rockets   : Array[0..Max_Rockets] of StarBurst;
  35.   Launched  : Array[0..1] of Integer;
  36.   Delta_Theta : Real;
  37.   Sine        : Array [ 0..1079 ] of Real;
  38.   Cosine      : Array [ 0..1079 ] of Real;
  39.   Stars       : Array [ 0..Max_Stars ] of BlinkingStar;
  40.  
  41. {$I GPAll.P }
  42.  
  43. procedure Check;
  44.  
  45. begin
  46.  
  47.   GPPARMS;
  48.  
  49.   if GDTYPE <> 5 then
  50.     begin
  51.     ClrScr;
  52.     Writeln('Enhanced Graphic Adapter and Display not found!');
  53.     Halt(1);
  54.     end;
  55.  
  56.   if GDMEMORY = 64 then
  57.     begin
  58.     ClrScr;
  59.     Writeln('This program works much better with 128k or more EGA memory!');
  60.     Writeln;
  61.     Delay(1000);
  62.     end;
  63.  
  64. end;
  65.  
  66. Procedure New_Rocket(Var Rocket : StarBurst);
  67. var
  68.   i,j           : integer;
  69.   XPosn         : Integer;
  70.   Temp          : Integer;
  71.   temp2         : Integer;
  72.  
  73. begin
  74. Rocket.Counter := -(Random(30) + 15);
  75. Rocket.Head := 0;
  76. Rocket.Color := DarkGray;
  77. if random(2) = 0
  78.   then
  79.     begin
  80.     Launched[0] := Succ(Launched[0]);
  81.     XPosn := Random(10) + 100;
  82.     Temp := Random(3072);
  83.     end
  84.   else
  85.     begin
  86.     Launched[1] := Succ(Launched[1]);
  87.     Xposn := Random(10) + 540;
  88.     Temp := -Random(3072);
  89.     end;
  90. GPMove(Xposn,339);
  91. GPMerge(3);
  92. GPColor(Red);
  93. for i := 1 to 2 do
  94.   GPCir(i shl 2);
  95.  
  96. Xposn := XPosn Shl 6;
  97. Temp2 := -(Random(256) + 2048);
  98. for J := 0 to Rays do
  99.   With Rocket.Trail[j] do
  100.     For I := 0 to MemorySize do
  101.       begin
  102.       X[I] := Xposn;
  103.       Y[I] := 339 Shl 6;
  104.       DX := temp;
  105.       DY := Temp2;
  106.       end;
  107. For I := 1 to 2 do
  108.   GPCir(i shl 2);
  109.  
  110. GPMerge(0);
  111. NoSound;
  112.  
  113.  
  114. end;
  115.  
  116. procedure Init;
  117. var
  118.   i             : integer;
  119.   Theta         : Real;
  120.   X,Y           : Integer;
  121.   Temp          : Real;
  122.   RX,RY         : Real;
  123.  
  124.  
  125. begin
  126. Delta_Theta := 2.0 * Pi / 1080.0;
  127. GPINIT;
  128. GPColor(Black);
  129. GPMove(0,0);
  130. GPBox(639,349);
  131. GPColor(White);
  132. GPMove(9,9);
  133. GPRect(630,340);
  134. GPVIEWPORT(10,10,629,339);
  135. For I := 0 to 1 do
  136.   Launched[i] := 0;
  137. for I := 0 to Max_Rockets do
  138.   New_Rocket(Rockets[i]);
  139. for I := 0 to 1079 do
  140.   begin
  141.   Theta := I * Delta_Theta;
  142.   Sine[i] := Sin(Theta);
  143.   Cosine[i] := Cos(Theta);
  144.   end;
  145. Stars[0].Radius := 0;
  146. Stars[0].Angle := 0;
  147. Stars[0].Color := White;
  148. GPColor(White);
  149. GPMove(PolarX,PolarY);
  150. GPLine(PolarX,PolarY);
  151. for I := 1 to Max_Stars do
  152.   With Stars[i] do
  153.     begin
  154.     Radius := Random(150);
  155.     Angle := Random(1080);
  156.     Case Random(3) of
  157.     0  : Color := White;
  158.     1  : Color := LightGray;
  159.     2  : Color := DarkGray;
  160.     end;
  161.     X := round(Radius shl 1 * Cosine[Angle] + PolarX);
  162.     Y := round(Radius * Sine[Angle] + PolarY);
  163.     GPColor(Color);
  164.     GPmove(X,Y);
  165.     GPLine(X,Y);
  166.     end;
  167. Stars[Max_Stars].Color := Brown;
  168.  
  169. end;
  170.  
  171.  
  172. Procedure Draw_Rocket(Var Rocket : StarBurst);
  173.  
  174. var
  175.   I,J       : Integer;
  176.   Posn      : Integer;
  177.   TX,TY     : Integer;
  178.  
  179. begin
  180. With Rocket do
  181.   begin
  182.   Posn := (Head + 1 + MemorySize) Mod MemorySize;
  183.   For J := 0 to Rays do
  184.     With Rocket.Trail[J] do
  185.       begin
  186.       GPColor(Black);
  187.       TX := (X[Posn] Shr 6) and $3FF;
  188.       TY := (Y[Posn] shr 6) and $3FF;
  189.       GPMove(TX,TY);
  190.       GPLine(TX,TY);
  191.       X[Posn] := X[Head] + DX;
  192.       Y[Posn] := Y[Head] + DY;
  193.       TX := (X[Posn] Shr 6) and $3FF;
  194.       TY := (Y[Posn] shr 6) and $3FF;
  195.       GPColor(Rocket.Color);
  196.       if TY > 339
  197.         then
  198.           begin
  199.           DX := DX div 3;
  200.           DY := -DY div 3;
  201.           Y[Posn] := 339 shl 6;
  202.           end;
  203.       GPMove(TX,TY);
  204.       GPLine(TX,TY);
  205.       DY := DY + 8 - (DY DIV 8);
  206.       Dx := Dx - ((DX - Wind) DIV 8);
  207.       end;
  208.   Head := Posn;
  209.   Counter := Succ(Counter);
  210.   end;
  211. end;
  212.  
  213. Procedure End_Rocket(Var Rocket : StarBurst);
  214.  
  215. var
  216.   I,J       : Integer;
  217.   Posn      : Integer;
  218.   TX,TY     : Integer;
  219.  
  220. begin
  221. With Rocket do
  222.   begin
  223.   Posn := (Head + 1 + MemorySize) Mod MemorySize;
  224.   For J := 0 to Rays do
  225.     With Rocket.Trail[J] do
  226.       begin
  227.       GPColor(Black);
  228.       TX := (X[Posn] Shr 6) and $3FF;
  229.       TY := (Y[Posn] shr 6) and $3FF;
  230.       GPMove(TX,TY);
  231.       GPLine(TX,TY);
  232.       end;
  233.   Head := Posn;
  234.   Counter := Succ(Counter);
  235.   end;
  236. end;
  237.  
  238.  
  239. Procedure Explode_Rocket(Var Rocket : StarBurst);
  240.  
  241. var
  242.   J         : Integer;
  243.   Temp      : Integer;
  244.   Temp2     : Integer;
  245.   BurstSize : Integer;
  246.   TX,TY     : Integer;
  247.   Range     : Real;
  248.   Angle     : Integer;
  249.  
  250. begin
  251. Temp := Random(6) + 1;
  252. BurstSize := Temp Shl 1;
  253. Temp2 := Temp Shl 8;
  254. Temp := Temp shl 7;
  255. Rocket.Color := Random(3) + 13;
  256. J := Rocket.Head;
  257. GPMerge(3);
  258. GPColor(White);
  259. With Rocket.Trail[J] do
  260.   begin
  261.   TX := (X[J] Shr 6) and $3FF;
  262.   TY := (Y[J] shr 6) and $3FF;
  263.   end;
  264. GPMove(TX,TY);
  265. {Sound(8 * BurstSize);}
  266. for J := 1 to BurstSize do
  267.   GPCir(j);
  268. For J := 0 to Rays do
  269.   With Rocket.Trail[J] do
  270.     begin
  271.     Range := (Random(temp2) - Temp);
  272.     Angle := Random(1080);
  273.     DY := Round(Range * Sine[Angle]) + DY;
  274.     DX := Round(Range * Cosine[Angle]) shl 1 + DX;
  275.     end;
  276. For J := 1 to BurstSize do
  277.   GPCir(J);
  278. NoSound;
  279. GPMerge(0);
  280. end;
  281.  
  282. Procedure Time_Step;
  283.  
  284. var
  285.   i           : Integer;
  286.   X           : Integer;
  287.   Y           : Integer;
  288. begin
  289. for I := 0 to Max_Stars do
  290.   With Stars[i] do
  291.     begin
  292.     X := round(Radius shl 1 * Cosine[Angle] + PolarX);
  293.     Y := round(Radius * Sine[Angle] + PolarY);
  294.     GPColor(Black);
  295.     GPmove(X,Y);
  296.     GPLine(X,Y);
  297.     Angle := (Angle + Step) mod 1080;
  298.     X := round(Radius shl 1 * Cosine[Angle] + PolarX);
  299.     Y := round(Radius * Sine[Angle] + PolarY);
  300.     GPColor(Color);
  301.     GPmove(X,Y);
  302.     GPLine(X,Y);
  303.     end;
  304.  
  305. end;
  306.  
  307. Procedure Rockets_Red_Glare;
  308.  
  309. Var
  310.   I,J         : Integer;
  311.   X,Y,C       : Integer;
  312.   Star        : Integer;
  313.  
  314. Begin
  315. GPMerge(0);
  316. Star := 0;
  317. Repeat
  318.   Star := Succ(Star) Mod (Max_Stars + 1);
  319. {  if Star = 0
  320.     then
  321.       Time_Step;}
  322.   GPColor(Black);
  323.   With Stars[Star] do
  324.     begin
  325.     X := round(Radius shl 1* Cosine[Angle] + PolarX);
  326.     Y := round(Radius * Sine[Angle] + PolarY);
  327.     C := Color;
  328.     GPmove(X,Y);
  329.     GPLine(X,Y);
  330.     Angle := (Angle + step) mod 1080;
  331.     X := round(Radius shl 1* Cosine[Angle] + PolarX);
  332.     Y := round(Radius * Sine[Angle] + PolarY);
  333.     end;
  334.   For J := 0 to Max_Rockets do
  335.     Begin
  336.     Case Rockets[J].Counter of
  337.  
  338.       0          : Begin
  339.                    Draw_Rocket(Rockets[J]);
  340.                    Explode_Rocket(Rockets[J]);
  341.                    end;
  342.       -200 .. -1 ,
  343.       1 .. 2,
  344.       4 .. 28,
  345.       30         : Draw_Rocket(Rockets[J]);
  346.       3          : begin
  347.                    Sound(50);
  348.                    Rockets[J].color := Random(15) + 1;
  349.                    Draw_Rocket(Rockets[J]);
  350.                    Nosound;
  351.                    end;
  352.  
  353.       29          : begin
  354.                    Rockets[J].color := DarkGray;
  355.                    Draw_Rocket(Rockets[J]);
  356.                    end;
  357.  
  358.  
  359.       31 .. 1000 : begin
  360.                    End_Rocket(Rockets[J]);
  361.                    if Rockets[J].Counter > (31 + MemorySize)
  362.                      then
  363.                        New_Rocket(Rockets[J]);
  364.                    end;
  365.       end;
  366.     end;
  367.   GPColor(C);
  368.   GPMove(X,Y);
  369.   GPLine(X,Y);
  370.   Until KeyPressed;
  371. end;
  372.  
  373. begin
  374.   ClrScr;
  375.   Check;
  376.   Init;
  377.   Rockets_Red_Glare;
  378.   TextMode;
  379. end.
  380.