hedgewars/uGears.pas
changeset 95 1ef5e2c41115
parent 92 0c359a7a2356
child 100 f324a18698fe
equal deleted inserted replaced
94:c6eec0bdb630 95:1ef5e2c41115
    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;
   784 OutError('Couldn''t find place for Gear ' + inttostr(integer(Gear)), false);
   791 OutError('Couldn''t find place for Gear ' + inttostr(integer(Gear)), false);
   785 DeleteGear(Gear)
   792 DeleteGear(Gear)
   786 end;
   793 end;
   787 
   794 
   788 initialization
   795 initialization
       
   796 GearsListMutex:= SDL_CreateMutex;
   789 
   797 
   790 finalization
   798 finalization
   791 FreeGearsList
   799 FreeGearsList;
       
   800 SDL_DestroyMutex(GearsListMutex);
   792 
   801 
   793 end.
   802 end.