hedgewars/uTeams.pas
changeset 14611 3cf7799e04b5
parent 14573 9be988a01565
child 14656 db05d9bf7466
equal deleted inserted replaced
14610:de34abf040ed 14611:3cf7799e04b5
    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
   533     end;
   537     end;
   534 
   538 
   535 with team^.Clan^ do
   539 with team^.Clan^ do
   536     begin
   540     begin
   537     Teams[TeamsNumber]:= team;
   541     Teams[TeamsNumber]:= team;
       
   542     Passive:= false;
   538     inc(TeamsNumber)
   543     inc(TeamsNumber)
   539     end;
   544     end;
   540 
   545 
   541 // mirror changes into array for clans to spawn
   546 // mirror changes into array for clans to spawn
   542 SpawnClansArray:= ClansArray;
   547 SpawnClansArray:= ClansArray;