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 |