# HG changeset patch # User unc0rr # Date 1183412001 0 # Node ID b81a055f2d06b7b16d22868d304d59246211d8bc # Parent 0e7cc3fb05cd9b25689a857c85dc624669754723 Convert teams list to array diff -r 0e7cc3fb05cd -r b81a055f2d06 hedgewars/CCHandlers.inc --- a/hedgewars/CCHandlers.inc Mon Jul 02 18:35:31 2007 +0000 +++ b/hedgewars/CCHandlers.inc Mon Jul 02 21:33:21 2007 +0000 @@ -46,15 +46,11 @@ end end; -const TeamsCount: Longword = 0; - procedure chAddTeam(var s: shortstring); begin if isDeveloperMode then begin - inc(TeamsCount); ParseCommand('ammstore 93919294221912103323', true); - TryDo(TeamsCount <= 6, 'Too many teams', true); AddTeam; diff -r 0e7cc3fb05cd -r b81a055f2d06 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Mon Jul 02 18:35:31 2007 +0000 +++ b/hedgewars/GSHandlers.inc Mon Jul 02 21:33:21 2007 +0000 @@ -874,19 +874,18 @@ end; procedure doStepTeamHealthSorter(Gear: PGear); -var team: PTeam; - i, t: Longword; +var i, t: Longword; begin AllInactive:= false; -team:= TeamsList; i:= 0; -while team <> nil do +for t:= 0 to Pred(TeamsCount) do + with TeamsArray[t]^ do begin - thexchar[i].oy:= team^.DrawHealthY; - thexchar[i].team:= team; + thexchar[i].oy:= DrawHealthY; + thexchar[i].team:= TeamsArray[t]; inc(i); - team:= team^.Next end; + thexchcnt:= i; for i:= 1 to thexchcnt do for t:= 0 to thexchcnt - 2 do @@ -896,6 +895,7 @@ thexchar[t]:= thexchar[Succ(t)]; thexchar[Succ(t)]:= thexchar[5] end; + t:= cScreenHeight - 4; for i:= 0 to Pred(thexchcnt) do with thexchar[i] do @@ -903,6 +903,7 @@ dec(t, team^.HealthRect.h + 2); ny:= t end; + Gear^.Timer:= 640; Gear^.doStep:= @doStepTeamHealthSorterWork; currsorter:= Gear diff -r 0e7cc3fb05cd -r b81a055f2d06 hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Mon Jul 02 18:35:31 2007 +0000 +++ b/hedgewars/uAIMisc.pas Mon Jul 02 21:33:21 2007 +0000 @@ -69,27 +69,25 @@ end = (X: 0; Y: 0; Radius: 0); procedure FillTargets; -var t: PTeam; - i: Longword; +var i, t: Longword; begin Targets.Count:= 0; -t:= TeamsList; -while t <> nil do +for t:= 0 to Pred(TeamsCount) do + with TeamsArray[t]^ do begin for i:= 0 to cMaxHHIndex do - if (t^.Hedgehogs[i].Gear <> nil) - and (t^.Hedgehogs[i].Gear <> ThinkingHH) then + if (Hedgehogs[i].Gear <> nil) + and (Hedgehogs[i].Gear <> ThinkingHH) then begin - with Targets.ar[Targets.Count], t^.Hedgehogs[i] do + with Targets.ar[Targets.Count], Hedgehogs[i] do begin Point.X:= hwRound(Gear^.X); Point.Y:= hwRound(Gear^.Y); - if t^.Color <> CurrentTeam^.Color then Score:= Gear^.Health - else Score:= -Gear^.Health + if Color <> CurrentTeam^.Color then Score:= Gear^.Health + else Score:= -Gear^.Health end; inc(Targets.Count) end; - t:= t^.Next end end; diff -r 0e7cc3fb05cd -r b81a055f2d06 hedgewars/uAmmos.pas --- a/hedgewars/uAmmos.pas Mon Jul 02 18:35:31 2007 +0000 +++ b/hedgewars/uAmmos.pas Mon Jul 02 21:33:21 2007 +0000 @@ -79,16 +79,15 @@ end; procedure AssignStores; -var tteam: PTeam; +var t: LongInt; i: Longword; begin -tteam:= TeamsList; -while tteam <> nil do +for t:= 0 to Pred(TeamsCount) do + with TeamsArray[t]^ do begin for i:= 0 to cMaxHHIndex do - if tteam^.Hedgehogs[i].Gear <> nil then - tteam^.Hedgehogs[i].Ammo:= GetAmmoByNum(tteam^.Hedgehogs[i].AmmoStore); - tteam:= tteam^.Next + if Hedgehogs[i].Gear <> nil then + Hedgehogs[i].Ammo:= GetAmmoByNum(Hedgehogs[i].AmmoStore); end end; diff -r 0e7cc3fb05cd -r b81a055f2d06 hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Mon Jul 02 18:35:31 2007 +0000 +++ b/hedgewars/uConsts.pas Mon Jul 02 21:33:21 2007 +0000 @@ -115,6 +115,7 @@ cTransparentColor: Longword = $000000; + cMaxTeams = 6; cMaxHHIndex = 7; cMaxHHs = 30; cMaxSpawnPoints = 1024; diff -r 0e7cc3fb05cd -r b81a055f2d06 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Mon Jul 02 18:35:31 2007 +0000 +++ b/hedgewars/uGears.pas Mon Jul 02 21:33:21 2007 +0000 @@ -774,37 +774,34 @@ end; procedure AssignHHCoords; -var Team: PTeam; - i, t: LongInt; +var i, t, p: LongInt; ar: array[0..Pred(cMaxHHs)] of PGear; Count: Longword; begin -Team:= TeamsList; - if (GameFlags and gfForts) <> 0 then begin t:= 0; - while Team <> nil do + for p:= 0 to Pred(TeamsCount) do + with TeamsArray[p]^ do begin for i:= 0 to cMaxHHIndex do - with Team^.Hedgehogs[i] do + with Hedgehogs[i] do if Gear <> nil then FindPlace(Gear, false, t, t + 1024); inc(t, 1024); - Team:= Team^.Next end end else // mix hedgehogs begin Count:= 0; - while Team <> nil do + for p:= 0 to Pred(TeamsCount) do + with TeamsArray[p]^ do begin for i:= 0 to cMaxHHIndex do - with Team^.Hedgehogs[i] do + with Hedgehogs[i] do if Gear <> nil then begin ar[Count]:= Gear; inc(Count) end; - Team:= Team^.Next end; while (Count > 0) do diff -r 0e7cc3fb05cd -r b81a055f2d06 hedgewars/uLand.pas --- a/hedgewars/uLand.pas Mon Jul 02 18:35:31 2007 +0000 +++ b/hedgewars/uLand.pas Mon Jul 02 21:33:21 2007 +0000 @@ -488,25 +488,22 @@ end; procedure MakeFortsMap; -var p: PTeam; - tmpsurf: PSDL_Surface; +var tmpsurf: PSDL_Surface; begin WriteLnToConsole('Generating forts land...'); -p:= TeamsList; -TryDo(p <> nil, 'No teams on map!', true); +TryDo(TeamsCount = 2, 'More or less than 2 teams on map in forts mode!', true); + with PixelFormat^ do LandSurface:= SDL_CreateRGBSurface(SDL_HWSURFACE, 2048, 1024, BitsPerPixel, RMask, GMask, BMask, AMask); SDL_FillRect(LandSurface, nil, 0); -tmpsurf:= LoadImage(Pathz[ptForts] + '/' + p^.FortName + 'L', false, true, true); + +tmpsurf:= LoadImage(Pathz[ptForts] + '/' + TeamsArray[0]^.FortName + 'L', false, true, true); BlitImageAndGenerateCollisionInfo(0, 0, tmpsurf, LandSurface); SDL_FreeSurface(tmpsurf); -p:= p^.Next; -TryDo(p <> nil, 'Only one team on map!', true); -tmpsurf:= LoadImage(Pathz[ptForts] + '/' + p^.FortName + 'R', false, true, true); + +tmpsurf:= LoadImage(Pathz[ptForts] + '/' + TeamsArray[1]^.FortName + 'R', false, true, true); BlitImageAndGenerateCollisionInfo(1024, 0, tmpsurf, LandSurface); SDL_FreeSurface(tmpsurf); -p:= p^.Next; -TryDo(p = nil, 'More than 2 teams on map in forts mode!', true); end; procedure LoadMap; diff -r 0e7cc3fb05cd -r b81a055f2d06 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Mon Jul 02 18:35:31 2007 +0000 +++ b/hedgewars/uStore.pas Mon Jul 02 21:33:21 2007 +0000 @@ -132,7 +132,7 @@ tmpsurf: PSDL_Surface; procedure WriteNames(Font: THWFont); - var Team: PTeam; + var t: LongInt; i: LongInt; r, rr: TSDL_Rect; drY: LongInt; @@ -140,81 +140,77 @@ r.x:= 0; r.y:= 272; drY:= cScreenHeight - 4; - Team:= TeamsList; - while Team<>nil do + for t:= 0 to Pred(TeamsCount) do + with TeamsArray[t]^ do begin r.w:= 104; - Team^.NameTag:= RenderString(Team^.TeamName, Team^.Color, Font); + NameTag:= RenderString(TeamName, Color, Font); r.w:= cTeamHealthWidth + 5; - r.h:= Team^.NameTag^.h; + r.h:= NameTag^.h; DrawRoundRect(@r, cWhiteColor, cColorNearBlack, StoreSurface, true); - Team^.HealthRect:= r; + HealthRect:= r; rr:= r; inc(rr.x, 2); dec(rr.w, 4); inc(rr.y, 2); dec(rr.h, 4); - DrawRoundRect(@rr, Team^.AdjColor, Team^.AdjColor, StoreSurface, false); + DrawRoundRect(@rr, AdjColor, AdjColor, StoreSurface, false); inc(r.y, r.h); dec(drY, r.h + 2); - Team^.DrawHealthY:= drY; + DrawHealthY:= drY; for i:= 0 to 7 do - with Team^.Hedgehogs[i] do + with Hedgehogs[i] do if Gear <> nil then - NameTag:= RenderString(Name, Team^.Color, fnt16); - Team:= Team^.Next + NameTag:= RenderString(Name, Color, fnt16); end; end; procedure MakeCrossHairs; - var Team: PTeam; + var t: LongInt; tmpsurf: PSDL_Surface; s: string; begin s:= Pathz[ptGraphics] + '/' + cCHFileName; tmpsurf:= LoadImage(s, true, true, false); - Team:= TeamsList; - while Team<>nil do + for t:= 0 to Pred(TeamsCount) do + with TeamsArray[t]^ do begin - Team^.CrosshairSurf:= SDL_CreateRGBSurface(SDL_HWSURFACE, tmpsurf^.w, tmpsurf^.h, cBits, PixelFormat^.RMask, PixelFormat^.GMask, PixelFormat^.BMask, PixelFormat^.AMask); - TryDo(Team^.CrosshairSurf <> nil, errmsgCreateSurface, true); - SDL_FillRect(Team^.CrosshairSurf, nil, Team^.AdjColor); - SDL_UpperBlit(tmpsurf, nil, Team^.CrosshairSurf, nil); - TryDo(SDL_SetColorKey(Team^.CrosshairSurf, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); - Team:= Team^.Next + CrosshairSurf:= SDL_CreateRGBSurface(SDL_HWSURFACE, tmpsurf^.w, tmpsurf^.h, cBits, PixelFormat^.RMask, PixelFormat^.GMask, PixelFormat^.BMask, PixelFormat^.AMask); + TryDo(CrosshairSurf <> nil, errmsgCreateSurface, true); + SDL_FillRect(CrosshairSurf, nil, AdjColor); + SDL_UpperBlit(tmpsurf, nil, CrosshairSurf, nil); + TryDo(SDL_SetColorKey(CrosshairSurf, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); end; SDL_FreeSurface(tmpsurf) end; procedure InitHealth; - var p: PTeam; - i: LongInt; + var i, t: LongInt; begin - p:= TeamsList; - while p <> nil do + for t:= 0 to Pred(TeamsCount) do + if TeamsArray[t] <> nil then + with TeamsArray[t]^ do begin for i:= 0 to cMaxHHIndex do - if p^.Hedgehogs[i].Gear <> nil then - RenderHealth(p^.Hedgehogs[i]); - p:= p^.Next + if Hedgehogs[i].Gear <> nil then + RenderHealth(Hedgehogs[i]); end end; procedure LoadGraves; - var p: PTeam; - l: LongInt; + var t, l: LongInt; begin - p:= TeamsList; l:= 512; - while p <> nil do + for t:= 0 to Pred(TeamsCount) do + if TeamsArray[t] <> nil then + with TeamsArray[t]^ do begin dec(l, 32); - if p^.GraveName = '' then p^.GraveName:= 'Simple'; - LoadToSurface(Pathz[ptGraves] + '/' + p^.GraveName, StoreSurface, l, 512); - p^.GraveRect.x:= l; - p^.GraveRect.y:= 512; - p^.GraveRect.w:= 32; - p^.GraveRect.h:= 256; - p:= p^.Next + if GraveName = '' then GraveName:= 'Simple'; + LoadToSurface(Pathz[ptGraves] + '/' + GraveName, StoreSurface, l, 512); + GraveRect.x:= l; + GraveRect.y:= 512; + GraveRect.w:= 32; + GraveRect.h:= 256; end end; diff -r 0e7cc3fb05cd -r b81a055f2d06 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Mon Jul 02 18:35:31 2007 +0000 +++ b/hedgewars/uTeams.pas Mon Jul 02 21:33:21 2007 +0000 @@ -42,7 +42,6 @@ MaxStepDamage: Longword; end; TTeam = record - Next: PTeam; Color, AdjColor: Longword; TeamName: string[MAXNAMELEN]; ExtDriven: boolean; @@ -62,7 +61,8 @@ end; var CurrentTeam: PTeam = nil; - TeamsList: PTeam = nil; + TeamsArray: array[0..Pred(cMaxTeams)] of PTeam; + TeamsCount: Longword = 0; CurMinAngle, CurMaxAngle: Longword; function AddTeam: PTeam; @@ -84,34 +84,20 @@ function CheckForWin: boolean; var team, AliveTeam: PTeam; - AliveCount: Longword; s: shortstring; begin -AliveCount:= 0; -AliveTeam:= nil; -team:= TeamsList; -while team <> nil do - begin - if team^.TeamHealth > 0 then - begin - inc(AliveCount); - AliveTeam:= team - end; - team:= team^.Next - end; - -if AliveCount >= 2 then exit(false); +if TeamsCount >= 2 then exit(false); CheckForWin:= true; TurnTimeLeft:= 0; -if AliveCount = 0 then +if TeamsCount = 0 then begin // draw AddCaption(trmsg[sidDraw], $FFFFFF, capgrpGameState); SendStat(siGameResult, trmsg[sidDraw]); AddGear(0, 0, gtATFinishGame, 0, _0, _0, 2000) end else // win begin - s:= Format(trmsg[sidWinner], AliveTeam^.TeamName); + s:= Format(trmsg[sidWinner], TeamsArray[0]^.TeamName); AddCaption(s, $FFFFFF, capgrpGameState); SendStat(siGameResult, s); AddGear(0, 0, gtATFinishGame, 0, _0, _0, 2000) @@ -120,14 +106,14 @@ end; procedure SwitchHedgehog; -var tteam: PTeam; - th: LongInt; +var th: LongInt; + t: LongWord; g: PGear; begin FreeActionsList; TargetPoint.X:= NoPointX; TryDo(CurrentTeam <> nil, 'nil Team', true); -tteam:= CurrentTeam; + with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do if Gear <> nil then begin @@ -138,16 +124,14 @@ InsertGearToList(Gear) end; +t:= 0; +while CurrentTeam <> TeamsArray[t] do inc(t); +CurrentTeam:= TeamsArray[(t + 1) mod TeamsCount]; + +th:= CurrentTeam^.CurrHedgehog; repeat - CurrentTeam:= CurrentTeam^.Next; - if CurrentTeam = nil then CurrentTeam:= TeamsList; - th:= CurrentTeam^.CurrHedgehog; - repeat - CurrentTeam^.CurrHedgehog:= Succ(CurrentTeam^.CurrHedgehog) mod (cMaxHHIndex + 1); - until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) or (CurrentTeam^.CurrHedgehog = th) -until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) or (CurrentTeam = tteam); - -TryDo(CurrentTeam <> tteam, 'Switch hedgehog: only one team?!', true); + CurrentTeam^.CurrHedgehog:= Succ(CurrentTeam^.CurrHedgehog) mod (cMaxHHIndex + 1); +until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) or (CurrentTeam^.CurrHedgehog = th); with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do begin @@ -177,58 +161,46 @@ function AddTeam: PTeam; var Result: PTeam; begin +TryDo(TeamsCount <= cMaxTeams, 'Too many teams', true); New(Result); TryDo(Result <> nil, 'AddTeam: Result = nil', true); FillChar(Result^, sizeof(TTeam), 0); Result^.AttackBar:= 2; Result^.CurrHedgehog:= cMaxHHIndex; -if TeamsList = nil then TeamsList:= Result - else begin - Result^.Next:= TeamsList; - TeamsList:= Result - end; + +TeamsArray[TeamsCount]:= Result; +inc(TeamsCount); + CurrentTeam:= Result; AddTeam:= Result end; procedure FreeTeamsList; -var t, tt: PTeam; +var t: LongInt; begin -tt:= TeamsList; -TeamsList:= nil; -while tt <> nil do - begin - t:= tt; - tt:= tt^.Next; - Dispose(t) - end; +for t:= 0 to Pred(TeamsCount) do Dispose(TeamsArray[t]); +TeamsCount:= 0 end; procedure RecountAllTeamsHealth; -var p: PTeam; -begin -p:= TeamsList; -while p <> nil do - begin - RecountTeamHealth(p); - p:= p^.Next - end +var t: LongInt; +begin +for t:= 0 to Pred(TeamsCount) do + RecountTeamHealth(TeamsArray[t]) end; procedure InitTeams; -var p: PTeam; - i: LongInt; +var i, t: LongInt; th: LongInt; begin -p:= TeamsList; -while p <> nil do +for t:= 0 to Pred(TeamsCount) do + with TeamsArray[t]^ do begin th:= 0; for i:= 0 to cMaxHHIndex do - if p^.Hedgehogs[i].Gear <> nil then - inc(th, p^.Hedgehogs[i].Gear^.Health); + if Hedgehogs[i].Gear <> nil then + inc(th, Hedgehogs[i].Gear^.Health); if th > MaxTeamHealth then MaxTeamHealth:= th; - p:= p^.Next end; RecountAllTeamsHealth end; @@ -307,14 +279,10 @@ end; procedure RestoreTeamsFromSave; -var p: PTeam; +var t: LongInt; begin -p:= TeamsList; -while p <> nil do - begin - p^.ExtDriven:= false; - p:= p^.Next - end; +for t:= 0 to Pred(TeamsCount) do + TeamsArray[t]^.ExtDriven:= false end; procedure SetWeapon(weap: TAmmoType); @@ -331,21 +299,19 @@ end; procedure SendStats; -var p: PTeam; - i: LongInt; +var i, t: LongInt; msd: Longword; msdhh: PHedgehog; begin msd:= 0; msdhh:= nil; -p:= TeamsList; -while p <> nil do +for t:= 0 to Pred(TeamsCount) do + with TeamsArray[t]^ do begin for i:= 0 to cMaxHHIndex do - if p^.Hedgehogs[i].MaxStepDamage > msd then + if Hedgehogs[i].MaxStepDamage > msd then begin - msdhh:= @(p^.Hedgehogs[i]); - msd:= p^.Hedgehogs[i].MaxStepDamage + msdhh:= @Hedgehogs[i]; + msd:= Hedgehogs[i].MaxStepDamage end; - p:= p^.Next end; if msdhh <> nil then SendStat(siMaxStepDamage, inttostr(msdhh^.MaxStepDamage) + ' ' + msdhh^.Name + ' (' + msdhh^.Team^.TeamName + ')'); diff -r 0e7cc3fb05cd -r b81a055f2d06 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Mon Jul 02 18:35:31 2007 +0000 +++ b/hedgewars/uWorld.pas Mon Jul 02 21:33:21 2007 +0000 @@ -153,7 +153,6 @@ procedure DrawWorld(Lag: LongInt; Surface: PSDL_Surface); var i, t: LongInt; r: TSDL_Rect; - team: PTeam; tdx, tdy: Double; grp: TCapGroup; s: string[15]; @@ -273,25 +272,24 @@ end; // Teams Healths -team:= TeamsList; -while team <> nil do +for t:= 0 to Pred(TeamsCount) do + with TeamsArray[t]^ do begin - r.x:= cScreenWidth div 2 - team^.NameTag^.w - 3; - r.y:= team^.DrawHealthY; - r.w:= team^.NameTag^.w; - r.h:= team^.NameTag^.h; - SDL_UpperBlit(team^.NameTag, nil, Surface, @r); - r:= team^.HealthRect; - r.w:= 2 + team^.TeamHealthBarWidth; + r.x:= cScreenWidth div 2 - NameTag^.w - 3; + r.y:= DrawHealthY; + r.w:= NameTag^.w; + r.h:= NameTag^.h; + SDL_UpperBlit(NameTag, nil, Surface, @r); + r:= HealthRect; + r.w:= 2 + TeamHealthBarWidth; DrawFromStoreRect(cScreenWidth div 2, - Team^.DrawHealthY, + DrawHealthY, @r, Surface); inc(r.x, cTeamHealthWidth + 2); r.w:= 3; - DrawFromStoreRect(cScreenWidth div 2 + team^.TeamHealthBarWidth + 2, - Team^.DrawHealthY, + DrawFromStoreRect(cScreenWidth div 2 + TeamHealthBarWidth + 2, + DrawHealthY, @r, Surface); - team:= team^.Next end; // Lag alert