

{ *********************************************************************** }
{                                                                         }
{  ExpBox V1.03 explodes a Box on the display using BGI routines.         }
{  You define the final box area, how many steps in the explosion,        }
{  the speed at which the explosion occurs, and where the explosion       }
{  is to start at. You also define the color and pattern of the           }
{  exploding box. You can optionally specifiy a rectangle to follow       }
{  the exploding box to provide more action. The color of the rectangle   }
{  can also be defined.                                                   }
{    Uses the TP graph unit and the CRT unit (only uses the Delay         }
{  function from the CRT unit). If you don't use the CRT unit, then you   }
{  might want to consider using the CRTI unit from the Borland TP4        }
{  library on CompuServe which allows you to remove unwanted functions.   }
{                                                                         }
{      Originally written by Michael Day as 20 November 1988              }
{                  Copyright 1988 by Michael Day                          }
{           This release (V1.03) as of 14 February 1989                   }
{            Released to the public domain by author.                     }
{                                                                         }
{ *********************************************************************** }
{ History:                                                                }
{ V1.01 - Original release                                                }
{ V1.02 - Removed excess unused code                                      }
{ V1.03 - Adjusted number to match new release of SDI                     }

unit ExpBox;
interface

uses graph,CRT;

{ *********************************************************************** }
{--                    External access definitions                      --}
{ *********************************************************************** }

{-------------------------------------------------------------------------}
{Explodes a box on the screen}
{x1,y1,x2,y2=final box size, Step=explosion steps, }
{Speed=delay in ms between explosions, Style=how to explode}
{Color=box color, Pattern=background pattern, }
{RColor=rectangle color (if used) }

procedure ExplodeBox(x1,y1,x2,y2:integer;
                     Speed,Step,Style:word;
                     Color,Pattern,RColor:byte);


{ *********************************************************************** }

implementation


procedure ExpRect(x1,y1,x2,y2:integer; Style:word);
var i,Rc,rx,ry,ix,iy:integer;
begin
   bar(X1, Y1, X2, Y2);
   Rc := (style shr 5) and 7;
   if Rc > 0 then
   begin
     ix := ((x2-x1)shr 1)shr rc;
     iy := ((y2-y1)shr 1)shr rc;
     for i := Rc downto 1 do
     begin
       rx := ((x2-x1)shr(i))-ix;
       ry := ((y2-y1)shr(i))-iy;
       rectangle(succ(X1+rx), succ(Y1+ry), pred(X2-rx), pred(Y2-ry) );
     end;
   end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
{                         misc special effects                            }
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

{-------------------------------------------------------------------------}
{Explodes a box on the screen}

{Styles: 0=explode from center, 1=explode from top, 2=explode from bottom,}
{3=explode from left, 4=explode from right, 5=explode from top left corner,}
{6=explode bot left corner, 7=explode top right corner, }
{8=explode from bottom right corner. 9 and Above = no explode.}
{if Style bits 5,6,7 are set, then rectangles will be drawn while exploding.}
{a Step value of 0 or 1 will not cause an explode, the value must be larger}
{than 1 to get an explode to happen. Speed sets the delay in ms between}
{explode steps. Color and Pattern set the exploding box color and pattern.}
{RColor sets the rectangle color (when used). If Style bit 4 is on, then }
{sound effects will also be added.}

procedure ExplodeBox(x1,y1,x2,y2:integer;
                     Speed,Step,Style:word;
                     Color,Pattern,RColor:byte);
var si,i,Sx,Sy : integer;
begin
   if Step > 0 then
   begin
     if (Style and $10) = $10 then NoSound;
     Sx := (x2-x1) div Step;
     Sy := (y2-y1) div Step;
     SetFillStyle(Pattern,Color);
     setcolor(RColor);
     for i := pred(Step) downto 1 do
     begin
       case (Style and $f) of
         {center explode}
         0: ExpRect(x1+((Sx*i)shr 1), y1+((Sy*i)shr 1),
                    x2-((Sx*i)shr 1), y2-((Sy*i)shr 1), Style);

         {top explode}
         1: ExpRect(x1, y1, x2, y2-(Sy*i), Style);

         {bot explode}
         2: ExpRect(x1, y1+(Sy*i), x2, y2, Style);

         {left explode}
         3: ExpRect(x1, y1, x2-(Sx*i), y2, Style);

         {right explode}
         4: ExpRect(x1+(Sx*i), y1, x2, y2, Style);

         {top left explode}
         5: ExpRect(x1, y1, x2-(Sx*i), y2-(Sy*i), Style);

         {bot left explode}
         6: ExpRect(x1, y1+(Sy*i), x2-(Sx*i), y2, Style);

         {top right explode}
         7: ExpRect(x1+(Sx*i), y1, x2, y2-(Sy*i), Style);

         {bot right explode}
         8: ExpRect(x1+(Sx*i), y1+(Sy*i), x2, y2, Style);

       end; {case}

       if (Style and $10) = $10 then Sound(i shl 8);
       if (Style and $f) < 9 then delay(Speed);
     end;
     bar(x1,y1,x2,y2);  {draw final box}
     if (Style and $10) = $10 then NoSound; {turn the sound off if was on}
   end;
end;


{ *********************************************************************** }

end.
