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; |
|
64 Surf: PSDL_Surface; |
64 end; |
65 end; |
65 |
66 |
66 function AddGear(X, Y: integer; Kind: TGearType; State: Cardinal; const dX: real=0.0; dY: real=0.0; Timer: LongWord=0): PGear; |
67 function AddGear(X, Y: integer; Kind: TGearType; State: Cardinal; const dX: real=0.0; dY: real=0.0; Timer: LongWord=0): PGear; |
67 procedure ProcessGears; |
68 procedure ProcessGears; |
68 procedure SetAllToActive; |
69 procedure SetAllToActive; |
72 procedure AddMiscGears; |
73 procedure AddMiscGears; |
73 procedure AssignHHCoords; |
74 procedure AssignHHCoords; |
74 |
75 |
75 var CurAmmoGear: PGear = nil; |
76 var CurAmmoGear: PGear = nil; |
76 GearsList: PGear = nil; |
77 GearsList: PGear = nil; |
|
78 GearsListMutex: PSDL_mutex; |
77 |
79 |
78 implementation |
80 implementation |
79 uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions, |
81 uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions, |
80 uLand, uIO, uLandGraphics, uAIMisc, uLocale; |
82 uLand, uIO, uLandGraphics, uAIMisc, uLocale; |
81 var RopePoints: record |
83 var RopePoints: record |
233 gtFirePunch: begin |
235 gtFirePunch: begin |
234 Result.Radius:= 15; |
236 Result.Radius:= 15; |
235 Result.Tag:= Y |
237 Result.Tag:= Y |
236 end; |
238 end; |
237 end; |
239 end; |
|
240 SDL_LockMutex(GearsListMutex); |
238 if GearsList = nil then GearsList:= Result |
241 if GearsList = nil then GearsList:= Result |
239 else begin |
242 else begin |
240 GearsList.PrevGear:= Result; |
243 GearsList.PrevGear:= Result; |
241 Result.NextGear:= GearsList; |
244 Result.NextGear:= GearsList; |
242 GearsList:= Result |
245 GearsList:= Result |
243 end |
246 end; |
|
247 SDL_UnlockMutex(GearsListMutex) |
244 end; |
248 end; |
245 |
249 |
246 procedure DeleteGear(Gear: PGear); |
250 procedure DeleteGear(Gear: PGear); |
247 var team: PTeam; |
251 var team: PTeam; |
248 begin |
252 begin |
249 if Gear.CollIndex < High(Longword) then DeleteCI(Gear); |
253 if Gear.CollIndex < High(Longword) then DeleteCI(Gear); |
|
254 if Gear.Surf <> nil then SDL_FreeSurface(Gear.Surf); |
250 if Gear.Kind = gtHedgehog then |
255 if Gear.Kind = gtHedgehog then |
251 if CurAmmoGear <> nil then |
256 if CurAmmoGear <> nil then |
252 begin |
257 begin |
253 {$IFDEF DEBUGFILE}AddFileLog('DeleteGear: Sending gm_Destroy, hh handle = '+inttostr(integer(Gear)));{$ENDIF} |
258 {$IFDEF DEBUGFILE}AddFileLog('DeleteGear: Sending gm_Destroy, hh handle = '+inttostr(integer(Gear)));{$ENDIF} |
254 Gear.Message:= gm_Destroy; |
259 Gear.Message:= gm_Destroy; |
258 begin |
263 begin |
259 team:= PHedgehog(Gear.Hedgehog).Team; |
264 team:= PHedgehog(Gear.Hedgehog).Team; |
260 PHedgehog(Gear.Hedgehog).Gear:= nil; |
265 PHedgehog(Gear.Hedgehog).Gear:= nil; |
261 RecountTeamHealth(team); |
266 RecountTeamHealth(team); |
262 end; |
267 end; |
|
268 {$IFDEF DEBUGFILE}AddFileLog('DeleteGear: handle = '+inttostr(integer(Gear)));{$ENDIF} |
|
269 SDL_LockMutex(GearsListMutex); |
263 if CurAmmoGear = Gear then CurAmmoGear:= nil; |
270 if CurAmmoGear = Gear then CurAmmoGear:= nil; |
264 if FollowGear = Gear then FollowGear:= nil; |
271 if FollowGear = Gear then FollowGear:= nil; |
265 {$IFDEF DEBUGFILE}AddFileLog('DeleteGear: handle = '+inttostr(integer(Gear)));{$ENDIF} |
|
266 if Gear.NextGear <> nil then Gear.NextGear.PrevGear:= Gear.PrevGear; |
272 if Gear.NextGear <> nil then Gear.NextGear.PrevGear:= Gear.PrevGear; |
267 if Gear.PrevGear <> nil then Gear.PrevGear.NextGear:= Gear.NextGear |
273 if Gear.PrevGear <> nil then Gear.PrevGear.NextGear:= Gear.NextGear |
268 else begin |
274 else begin |
269 GearsList:= Gear^.NextGear; |
275 GearsList:= Gear^.NextGear; |
270 if GearsList <> nil then GearsList.PrevGear:= nil |
276 if GearsList <> nil then GearsList.PrevGear:= nil |
271 end; |
277 end; |
|
278 SDL_UnlockMutex(GearsListMutex); |
272 Dispose(Gear) |
279 Dispose(Gear) |
273 end; |
280 end; |
274 |
281 |
275 function CheckNoDamage: boolean; // returns TRUE in case of no damaged hhs |
282 function CheckNoDamage: boolean; // returns TRUE in case of no damaged hhs |
276 var Gear: PGear; |
283 var Gear: PGear; |
486 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); |
487 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, Sign(Gear.dX), |
488 0, PHedgehog(Gear.Hedgehog).visStepPos div 2, |
495 0, PHedgehog(Gear.Hedgehog).visStepPos div 2, |
489 Surface); |
496 Surface); |
490 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); |
491 gtHealthTag: DrawCaption(Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, PHedgehog(Gear.Hedgehog).HealthTagRect, Surface, true); |
498 gtHealthTag: if Gear.Surf <> nil then DrawCentered(Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.Surf, Surface); |
492 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); |
493 gtUFO: DrawSprite(sprUFO, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, (GameTicks shr 7) mod 4, Surface); |
500 gtUFO: DrawSprite(sprUFO, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, (GameTicks shr 7) mod 4, Surface); |
494 gtSmokeTrace: if Gear.State < 8 then DrawSprite(sprSmokeTrace, Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.State, Surface); |
501 gtSmokeTrace: if Gear.State < 8 then DrawSprite(sprSmokeTrace, Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.State, Surface); |
495 gtRope: begin |
502 gtRope: begin |
496 roplen:= 0; |
503 roplen:= 0; |
548 procedure AddMiscGears; |
555 procedure AddMiscGears; |
549 var i: integer; |
556 var i: integer; |
550 begin |
557 begin |
551 for i:= 0 to cCloudsNumber do |
558 for i:= 0 to cCloudsNumber do |
552 AddGear( - cScreenWidth + i * ((cScreenWidth * 2 + 2304) div cCloudsNumber), -140, gtCloud, random(4), |
559 AddGear( - cScreenWidth + i * ((cScreenWidth * 2 + 2304) div cCloudsNumber), -140, gtCloud, random(4), |
553 (0.5-random)*0.02, ((i mod 2) * 2 - 1) * (0.005 + 0.015*random)); |
560 (0.5-random)*0.1, ((i mod 2) * 2 - 1) * (0.005 + 0.015*random)); |
554 AddGear(0, 0, gtATStartGame, 0, 0, 0, 2000); |
561 AddGear(0, 0, gtATStartGame, 0, 0, 0, 2000); |
555 if (GameFlags and gfForts) = 0 then |
562 if (GameFlags and gfForts) = 0 then |
556 for i:= 0 to 3 do |
563 for i:= 0 to 3 do |
557 FindPlace(AddGear(0, 0, gtMine, 0), false, 0, 2048); |
564 FindPlace(AddGear(0, 0, gtMine, 0), false, 0, 2048); |
558 end; |
565 end; |