hedgewars/uGears.pas
changeset 108 08f1fe6f21f8
parent 107 b08ce0293a51
child 126 93df479aa1b9
equal deleted inserted replaced
107:b08ce0293a51 108:08f1fe6f21f8
    41      TGearStepProcedure = procedure (Gear: PGear);
    41      TGearStepProcedure = procedure (Gear: PGear);
    42      TGear = record
    42      TGear = record
    43              NextGear, PrevGear: PGear;
    43              NextGear, PrevGear: PGear;
    44              Active: Boolean;
    44              Active: Boolean;
    45              State : Cardinal;
    45              State : Cardinal;
    46              X : Real;
    46              X : Double;
    47              Y : Real;
    47              Y : Double;
    48              dX: Real;
    48              dX: Double;
    49              dY: Real;
    49              dY: Double;
    50              Kind: TGearType;
    50              Kind: TGearType;
    51              Pos: Longword;
    51              Pos: Longword;
    52              doStep: TGearStepProcedure;
    52              doStep: TGearStepProcedure;
    53              Radius: integer;
    53              Radius: integer;
    54              Angle, Power : Cardinal;
    54              Angle, Power : Cardinal;
    55              DirAngle: Double;
    55              DirAngle: Double;
    56              Timer : LongWord;
    56              Timer : LongWord;
    57              Elasticity: Real;
    57              Elasticity: Double;
    58              Friction  : Real;
    58              Friction  : Double;
    59              Message : Longword;
    59              Message : Longword;
    60              Hedgehog: pointer;
    60              Hedgehog: pointer;
    61              Health, Damage: integer;
    61              Health, Damage: integer;
    62              CollIndex: Longword;
    62              CollIndex: Longword;
    63              Tag: integer;
    63              Tag: integer;
    77     GearsList: PGear = nil;
    77     GearsList: PGear = nil;
    78     GearsListMutex: PSDL_mutex;
    78     GearsListMutex: PSDL_mutex;
    79 
    79 
    80 implementation
    80 implementation
    81 uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions,
    81 uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions,
    82      uLand, uIO, uLandGraphics, uAIMisc, uLocale{$IFDEF FPC}, Math{$ENDIF};
    82      uLand, uIO, uLandGraphics, uAIMisc, uLocale;
    83 var RopePoints: record
    83 var RopePoints: record
    84                 Count: Longword;
    84                 Count: Longword;
    85                 HookAngle: integer;
    85                 HookAngle: integer;
    86                 ar: array[0..300] of record
    86                 ar: array[0..300] of record
    87                                   X, Y: Double;
    87                                   X, Y: Double;
   132 
   132 
   133 function AddGear(X, Y: integer; Kind: TGearType; State: Cardinal; const dX: Double=0.0; dY: Double=0.0; Timer: LongWord=0): PGear;
   133 function AddGear(X, Y: integer; Kind: TGearType; State: Cardinal; const dX: Double=0.0; dY: Double=0.0; Timer: LongWord=0): PGear;
   134 const Counter: Longword = 0;
   134 const Counter: Longword = 0;
   135 begin
   135 begin
   136 inc(Counter);
   136 inc(Counter);
   137 {$IFDEF DEBUGFILE}AddFileLog('AddGear: ('+inttostr(x)+','+inttostr(y)+')');{$ENDIF}
   137 {$IFDEF DEBUGFILE}AddFileLog('AddGear: ('+inttostr(x)+','+inttostr(y)+'), d('+floattostr(dX)+','+floattostr(dY)+')');{$ENDIF}
   138 New(Result);
   138 New(Result);
   139 {$IFDEF DEBUGFILE}AddFileLog('AddGear: handle = '+inttostr(integer(Result)));{$ENDIF}
   139 {$IFDEF DEBUGFILE}AddFileLog('AddGear: handle = '+inttostr(integer(Result)));{$ENDIF}
   140 FillChar(Result^, sizeof(TGear), 0);
   140 FillChar(Result^, sizeof(TGear), 0);
   141 Result.X:= X;
   141 Result.X:= X;
   142 Result.Y:= Y;
   142 Result.Y:= Y;
   489 while Gear<>nil do
   489 while Gear<>nil do
   490       begin
   490       begin
   491       case Gear.Kind of
   491       case Gear.Kind of
   492            gtCloud: DrawSprite(sprCloud   , Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.State, Surface);
   492            gtCloud: DrawSprite(sprCloud   , Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.State, Surface);
   493        gtAmmo_Bomb: DrawSprite(sprBomb , Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface);
   493        gtAmmo_Bomb: DrawSprite(sprBomb , Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface);
   494         gtHedgehog: DrawHedgehog(Round(Gear.X) - 14 + WorldDx, Round(Gear.Y) - 18 + WorldDy, Sign(Gear.dX),
   494         gtHedgehog: DrawHedgehog(Round(Gear.X) - 14 + WorldDx, Round(Gear.Y) - 18 + WorldDy, hwSign(Gear.dX),
   495                                  0, PHedgehog(Gear.Hedgehog).visStepPos div 2,
   495                                  0, PHedgehog(Gear.Hedgehog).visStepPos div 2,
   496                                  Surface);
   496                                  Surface);
   497     gtAmmo_Grenade: DrawSprite(sprGrenade , Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, DxDy2Angle32(Gear.dY, Gear.dX), Surface);
   497     gtAmmo_Grenade: DrawSprite(sprGrenade , Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, DxDy2Angle32(Gear.dY, Gear.dX), Surface);
   498        gtHealthTag: if Gear.Surf <> nil then DrawCentered(Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.Surf, Surface);
   498        gtHealthTag: if Gear.Surf <> nil then DrawCentered(Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.Surf, Surface);
   499            gtGrave: DrawSpriteFromRect(PHedgehog(Gear.Hedgehog).Team.GraveRect, Round(Gear.X) + WorldDx - 16, Round(Gear.Y) + WorldDy - 16, 32, (GameTicks shr 7) and 7, Surface);
   499            gtGrave: DrawSpriteFromRect(PHedgehog(Gear.Hedgehog).Team.GraveRect, Round(Gear.X) + WorldDx - 16, Round(Gear.Y) + WorldDy - 16, 32, (GameTicks shr 7) and 7, Surface);
   587                   gtCase,
   587                   gtCase,
   588                  gtFlame: begin
   588                  gtFlame: begin
   589                           if (Mask and EXPLNoDamage) = 0 then inc(Gear.Damage, dmg);
   589                           if (Mask and EXPLNoDamage) = 0 then inc(Gear.Damage, dmg);
   590                           if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear.Kind <> gtHedgehog) then
   590                           if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear.Kind <> gtHedgehog) then
   591                              begin
   591                              begin
   592                              Gear.dX:= Gear.dX + dmg / 200 * Sign(Gear.X - X);
   592                              Gear.dX:= Gear.dX + dmg / 200 * hwSign(Gear.X - X);
   593                              Gear.dY:= Gear.dY + dmg / 200 * Sign(Gear.Y - Y);
   593                              Gear.dY:= Gear.dY + dmg / 200 * hwSign(Gear.Y - Y);
   594                              Gear.Active:= true;
   594                              Gear.Active:= true;
   595                              FollowGear:= Gear
   595                              FollowGear:= Gear
   596                              end;
   596                              end;
   597                           end;
   597                           end;
   598                  gtGrave: begin
   598                  gtGrave: begin