56 |
56 |
57 function CheckForWin: boolean; |
57 function CheckForWin: boolean; |
58 var AliveClan: PClan; |
58 var AliveClan: PClan; |
59 s, cap: ansistring; |
59 s, cap: ansistring; |
60 ts: array[0..(cMaxTeams - 1)] of ansistring; |
60 ts: array[0..(cMaxTeams - 1)] of ansistring; |
61 t, AliveCount, i, j: LongInt; |
61 t, ActiveAliveCount, i, j: LongInt; |
62 allWin, winCamera: boolean; |
62 allWin, winCamera: boolean; |
63 begin |
63 begin |
64 CheckForWin:= false; |
64 CheckForWin:= false; |
65 AliveCount:= 0; |
65 ActiveAliveCount:= 0; |
|
66 // Victory if there is 1 living and non-passive clan left |
66 for t:= 0 to Pred(ClansCount) do |
67 for t:= 0 to Pred(ClansCount) do |
67 if ClansArray[t]^.ClanHealth > 0 then |
68 if (ClansArray[t]^.ClanHealth > 0) and (not ClansArray[t]^.Passive) then |
68 begin |
69 begin |
69 inc(AliveCount); |
70 inc(ActiveAliveCount); |
70 AliveClan:= ClansArray[t] |
71 AliveClan:= ClansArray[t] |
71 end; |
72 end; |
72 |
73 |
73 if (AliveCount > 1) or ((AliveCount = 1) and ((GameFlags and gfOneClanMode) <> 0)) then |
74 // Exception: gfOneClanMode, then there is no winner |
|
75 if (ActiveAliveCount > 1) or ((ActiveAliveCount = 1) and ((GameFlags and gfOneClanMode) <> 0)) then |
74 exit; |
76 exit; |
75 CheckForWin:= true; |
77 CheckForWin:= true; |
76 |
78 |
77 TurnTimeLeft:= 0; |
79 TurnTimeLeft:= 0; |
78 ReadyTimeLeft:= 0; |
80 ReadyTimeLeft:= 0; |
87 TurnStatsReset(); |
89 TurnStatsReset(); |
88 end; |
90 end; |
89 |
91 |
90 if not TeamsGameOver then |
92 if not TeamsGameOver then |
91 begin |
93 begin |
92 if AliveCount = 0 then |
94 if ActiveAliveCount = 0 then |
93 begin // draw |
95 begin // draw |
94 AddCaption(GetEventString(eidRoundDraw), capcolDefault, capgrpGameState); |
96 AddCaption(GetEventString(eidRoundDraw), capcolDefault, capgrpGameState); |
95 if SendGameResultOn then |
97 if SendGameResultOn then |
96 SendStat(siGameResult, shortstring(trmsg[sidDraw])); |
98 SendStat(siGameResult, shortstring(trmsg[sidDraw])); |
97 if PreviousTeam <> nil then |
99 if PreviousTeam <> nil then |
276 PrevTeam:= CurrTeam; |
278 PrevTeam:= CurrTeam; |
277 repeat |
279 repeat |
278 CurrTeam:= Succ(CurrTeam) mod TeamsNumber; |
280 CurrTeam:= Succ(CurrTeam) mod TeamsNumber; |
279 CurrentTeam:= Teams[CurrTeam]; |
281 CurrentTeam:= Teams[CurrTeam]; |
280 with CurrentTeam^ do |
282 with CurrentTeam^ do |
281 begin |
283 if (not Passive) then |
282 PrevHH:= CurrHedgehog mod HedgehogsNumber; // prevent infinite loop when CurrHedgehog = 7, but HedgehogsNumber < 8 (team is destroyed before its first turn) |
284 begin |
283 repeat |
285 PrevHH:= CurrHedgehog mod HedgehogsNumber; // prevent infinite loop when CurrHedgehog = 7, but HedgehogsNumber < 8 (team is destroyed before its first turn) |
284 CurrHedgehog:= Succ(CurrHedgehog) mod HedgehogsNumber; |
286 repeat |
285 until ((Hedgehogs[CurrHedgehog].Gear <> nil) and (Hedgehogs[CurrHedgehog].Effects[heFrozen] < 256)) or (CurrHedgehog = PrevHH) |
287 CurrHedgehog:= Succ(CurrHedgehog) mod HedgehogsNumber; |
286 end |
288 until ((Hedgehogs[CurrHedgehog].Gear <> nil) and (Hedgehogs[CurrHedgehog].Effects[heFrozen] < 256)) or (CurrHedgehog = PrevHH) |
287 until ((CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] < 256)) or (PrevTeam = CurrTeam) or ((CurrTeam = TagTeamIndex) and ((GameFlags and gfTagTeam) <> 0)) |
289 end |
288 end; |
290 until ((not CurrentTeam^.Passive) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] < 256)) or (PrevTeam = CurrTeam) or ((CurrTeam = TagTeamIndex) and ((GameFlags and gfTagTeam) <> 0)) |
289 if (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = nil) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255) then |
291 end; |
|
292 if (CurrentTeam^.Passive) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = nil) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255) then |
290 begin |
293 begin |
291 with CurrentTeam^.Clan^ do |
294 with CurrentTeam^.Clan^ do |
292 for t:= 0 to Pred(TeamsNumber) do |
295 for t:= 0 to Pred(TeamsNumber) do |
293 with Teams[t]^ do |
296 with Teams[t]^ do |
294 for i:= 0 to Pred(HedgehogsNumber) do |
297 for i:= 0 to Pred(HedgehogsNumber) do |
296 begin |
299 begin |
297 if Effects[heFrozen] > 255 then Effects[heFrozen]:= max(255,Effects[heFrozen]-50000); |
300 if Effects[heFrozen] > 255 then Effects[heFrozen]:= max(255,Effects[heFrozen]-50000); |
298 if (Gear <> nil) and (Effects[heFrozen] < 256) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255) then |
301 if (Gear <> nil) and (Effects[heFrozen] < 256) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255) then |
299 CurrHedgehog:= i |
302 CurrHedgehog:= i |
300 end; |
303 end; |
301 if (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = nil) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255) then |
304 if (not CurrentTeam^.Passive) and ((CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = nil) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255)) then |
302 inc(CurrentTeam^.Clan^.TurnNumber); |
305 inc(CurrentTeam^.Clan^.TurnNumber); |
303 end |
306 end; |
304 until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] < 256); |
307 until (not CurrentTeam^.Passive) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] < 256); |
305 |
308 |
306 SwitchCurrentHedgehog(@(CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog])); |
309 SwitchCurrentHedgehog(@(CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog])); |
307 {$IFDEF USE_TOUCH_INTERFACE} |
310 {$IFDEF USE_TOUCH_INTERFACE} |
308 if (Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NoCrosshair) = 0 then |
311 if (Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NoCrosshair) = 0 then |
309 begin |
312 begin |
506 TeamsArray[TeamsCount]:= team; |
509 TeamsArray[TeamsCount]:= team; |
507 inc(TeamsCount); |
510 inc(TeamsCount); |
508 inc(VisibleTeamsCount); |
511 inc(VisibleTeamsCount); |
509 |
512 |
510 team^.Binds:= DefaultBinds; |
513 team^.Binds:= DefaultBinds; |
|
514 team^.Passive:= false; |
511 |
515 |
512 c:= Pred(ClansCount); |
516 c:= Pred(ClansCount); |
513 while (c >= 0) and (ClansArray[c]^.Color <> TeamColor) do dec(c); |
517 while (c >= 0) and (ClansArray[c]^.Color <> TeamColor) do dec(c); |
514 if c < 0 then |
518 if c < 0 then |
515 begin |
519 begin |