hedgewars/uGears.pas
changeset 79 29b477319854
parent 78 66bb79dd248d
child 80 3c3dc6a148ca
equal deleted inserted replaced
78:66bb79dd248d 79:29b477319854
    88                  end;
    88                  end;
    89 
    89 
    90 procedure DeleteGear(Gear: PGear); forward;
    90 procedure DeleteGear(Gear: PGear); forward;
    91 procedure doMakeExplosion(X, Y, Radius: integer; Mask: LongWord); forward;
    91 procedure doMakeExplosion(X, Y, Radius: integer; Mask: LongWord); forward;
    92 procedure AmmoShove(Ammo: PGear; Damage, Power: integer); forward;
    92 procedure AmmoShove(Ammo: PGear; Damage, Power: integer); forward;
       
    93 procedure AmmoFlameWork(Ammo: PGear); forward;
    93 function  CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: integer): PGear; forward;
    94 function  CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: integer): PGear; forward;
    94 procedure SpawnBoxOfSmth; forward;
    95 procedure SpawnBoxOfSmth; forward;
    95 procedure AfterAttack; forward;
    96 procedure AfterAttack; forward;
    96 procedure FindPlace(Gear: PGear; withFall: boolean; Left, Right: integer); forward;
    97 procedure FindPlace(Gear: PGear; withFall: boolean; Left, Right: integer); forward;
    97 
    98 
   116                                                                doStepCase,
   117                                                                doStepCase,
   117                                                                doStepDEagleShot,
   118                                                                doStepDEagleShot,
   118                                                                doStepDynamite,
   119                                                                doStepDynamite,
   119                                                                doStepTeamHealthSorter,
   120                                                                doStepTeamHealthSorter,
   120                                                                doStepBomb,
   121                                                                doStepBomb,
   121                                                                doStepCluster
   122                                                                doStepCluster,
       
   123                                                                doStepShover,
       
   124                                                                doStepFlame
   122                                                                );
   125                                                                );
   123 
   126 
   124 function AddGear(X, Y: integer; Kind: TGearType; State: Cardinal; const dX: real=0.0; dY: real=0.0; Timer: LongWord=0): PGear;
   127 function AddGear(X, Y: integer; Kind: TGearType; State: Cardinal; const dX: real=0.0; dY: real=0.0; Timer: LongWord=0): PGear;
   125 begin
   128 const Counter: Longword = 0;
       
   129 begin
       
   130 inc(Counter);
   126 {$IFDEF DEBUGFILE}AddFileLog('AddGear: ('+inttostr(x)+','+inttostr(y)+')');{$ENDIF}
   131 {$IFDEF DEBUGFILE}AddFileLog('AddGear: ('+inttostr(x)+','+inttostr(y)+')');{$ENDIF}
   127 New(Result);
   132 New(Result);
   128 {$IFDEF DEBUGFILE}AddFileLog('AddGear: handle = '+inttostr(integer(Result)));{$ENDIF}
   133 {$IFDEF DEBUGFILE}AddFileLog('AddGear: handle = '+inttostr(integer(Result)));{$ENDIF}
   129 FillChar(Result^, sizeof(TGear), 0);
   134 FillChar(Result^, sizeof(TGear), 0);
   130 Result.X:= X;
   135 Result.X:= X;
   215  gtClusterBomb: begin
   220  gtClusterBomb: begin
   216                 Result.Radius:= 4;
   221                 Result.Radius:= 4;
   217                 Result.Elasticity:= 0.6;
   222                 Result.Elasticity:= 0.6;
   218                 Result.Friction:= 0.995;
   223                 Result.Friction:= 0.995;
   219                 Result.Timer:= Timer
   224                 Result.Timer:= Timer
       
   225                 end;
       
   226        gtFlame: begin
       
   227                 Result.Angle:= Counter mod 64;
       
   228                 Result.Radius:= 1;
       
   229                 Result.Health:= 2;
       
   230                 Result.dY:= (getrandom - 0.8) * 0.03;
       
   231                 Result.dX:= (getrandom - 0.5) * 0.4
   220                 end;
   232                 end;
   221      end;
   233      end;
   222 if GearsList = nil then GearsList:= Result
   234 if GearsList = nil then GearsList:= Result
   223                    else begin
   235                    else begin
   224                    GearsList.PrevGear:= Result;
   236                    GearsList.PrevGear:= Result;
   507                          posCaseAmmo  : DrawSprite(sprCase, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, 0, Surface);
   519                          posCaseAmmo  : DrawSprite(sprCase, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, 0, Surface);
   508                          posCaseHealth: DrawSprite(sprFAid, Round(Gear.X) - 24 + WorldDx, Round(Gear.Y) - 24 + WorldDy, (GameTicks shr 6) mod 13, Surface);
   520                          posCaseHealth: DrawSprite(sprFAid, Round(Gear.X) - 24 + WorldDx, Round(Gear.Y) - 24 + WorldDy, (GameTicks shr 6) mod 13, Surface);
   509                          end;
   521                          end;
   510      gtClusterBomb: DrawSprite(sprClusterBomb, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface);
   522      gtClusterBomb: DrawSprite(sprClusterBomb, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface);
   511          gtCluster: DrawSprite(sprClusterParticle, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, 0, Surface);
   523          gtCluster: DrawSprite(sprClusterParticle, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, 0, Surface);
       
   524            gtFlame: DrawSprite(sprFlame, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy,(GameTicks div 128 + Gear.Angle) mod 8, Surface);
   512               end;
   525               end;
   513       Gear:= Gear.NextGear
   526       Gear:= Gear.NextGear
   514       end;
   527       end;
   515 end;
   528 end;
   516 
   529 
   557          begin
   570          begin
   558          dmg:= dmg shr 1;
   571          dmg:= dmg shr 1;
   559          case Gear.Kind of
   572          case Gear.Kind of
   560               gtHedgehog,
   573               gtHedgehog,
   561                   gtMine,
   574                   gtMine,
   562                   gtCase: begin
   575                   gtCase,
       
   576                  gtFlame: begin
   563                           if (Mask and EXPLNoDamage) = 0 then inc(Gear.Damage, dmg);
   577                           if (Mask and EXPLNoDamage) = 0 then inc(Gear.Damage, dmg);
   564                           if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear.Kind <> gtHedgehog) then
   578                           if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear.Kind <> gtHedgehog) then
   565                              begin
   579                              begin
   566                              Gear.dX:= Gear.dX + dmg / 200 * Sign(Gear.X - X);
   580                              Gear.dX:= Gear.dX + dmg / 200 * Sign(Gear.X - X);
   567                              Gear.dY:= Gear.dY + dmg / 200 * Sign(Gear.Y - Y);
   581                              Gear.dY:= Gear.dY + dmg / 200 * Sign(Gear.Y - Y);
   580 end;
   594 end;
   581 
   595 
   582 procedure AmmoShove(Ammo: PGear; Damage, Power: integer);
   596 procedure AmmoShove(Ammo: PGear; Damage, Power: integer);
   583 var t: PGearArray;
   597 var t: PGearArray;
   584     i: integer;
   598     i: integer;
   585     Gear: PGear;
       
   586 begin
   599 begin
   587 t:= CheckGearsCollision(Ammo);
   600 t:= CheckGearsCollision(Ammo);
   588 i:= t.Count;
   601 i:= t.Count;
   589 while i > 0 do
   602 while i > 0 do
   590     begin
   603     begin
   591     dec(i);
   604     dec(i);
   592     case t.ar[i].Kind of
   605     if (t.ar[i].State and gstNoDamage) = 0 then
       
   606        case t.ar[i].Kind of
   593            gtHedgehog,
   607            gtHedgehog,
   594                gtMine,
   608                gtMine,
   595                gtCase: begin
   609                gtCase: begin
   596                        inc(t.ar[i].Damage, Damage);
   610                        inc(t.ar[i].Damage, Damage);
   597                        t.ar[i].dX:= Ammo.dX * Power * 0.01;
   611                        t.ar[i].dX:= Ammo.dX * Power * 0.01;
   599                        t.ar[i].Active:= true;
   613                        t.ar[i].Active:= true;
   600                        DeleteCI(t.ar[i]);
   614                        DeleteCI(t.ar[i]);
   601                        FollowGear:= t.ar[i]
   615                        FollowGear:= t.ar[i]
   602                        end;
   616                        end;
   603            end
   617            end
   604     end;
   618     end
   605 Gear:= GearsList;
       
   606 while Gear <> nil do
       
   607       begin
       
   608       if Round(sqrt(sqr(Gear.X - Ammo.X) + sqr(Gear.Y - Ammo.Y))) < 50 then // why 50?
       
   609          Gear.Active:= true;
       
   610       Gear:= Gear.NextGear
       
   611       end
       
   612 end;
   619 end;
   613 
   620 
   614 procedure AssignHHCoords;
   621 procedure AssignHHCoords;
   615 var Gear: PGear;
   622 var Gear: PGear;
   616 begin
   623 begin
   638             exit
   645             exit
   639             end;
   646             end;
   640       t:= t.NextGear
   647       t:= t.NextGear
   641       end;
   648       end;
   642 Result:= nil
   649 Result:= nil
       
   650 end;
       
   651 
       
   652 procedure AmmoFlameWork(Ammo: PGear);
       
   653 var t: PGear;
       
   654 begin
       
   655 t:= GearsList;
       
   656 while t <> nil do
       
   657       begin
       
   658       if (t.Kind = gtHedgehog) and (t.Y < Ammo.Y) then
       
   659          if sqr(Ammo.X - t.X) + sqr(Ammo.Y - t.Y - cHHRadius) * 2 <= sqr(4) then
       
   660             begin
       
   661             inc(t.Damage, 5);
       
   662             t.dX:= t.dX + (t.X - Ammo.X) * 0.02;
       
   663             t.dY:= - 0.25;
       
   664             t.Active:= true;
       
   665             DeleteCI(t);
       
   666             FollowGear:= t
       
   667             end;
       
   668       t:= t.NextGear
       
   669       end;
   643 end;
   670 end;
   644 
   671 
   645 function CheckGearsNear(mX, mY: integer; Kind: TGearsType; rX, rY: integer): PGear;
   672 function CheckGearsNear(mX, mY: integer; Kind: TGearsType; rX, rY: integer): PGear;
   646 var t: PGear;
   673 var t: PGear;
   647 begin
   674 begin