hedgewars/uTeams.pas
changeset 83 207c85fbef51
parent 81 d74e0e914b50
child 89 f9db56409a86
equal deleted inserted replaced
82:2f4f3236cccc 83:207c85fbef51
    79 procedure OnUsedAmmo(Ammo: PHHAmmo);
    79 procedure OnUsedAmmo(Ammo: PHHAmmo);
    80 function  HHHasAmmo(Hedgehog: PHedgehog; Ammo: TAmmoType): boolean;
    80 function  HHHasAmmo(Hedgehog: PHedgehog; Ammo: TAmmoType): boolean;
    81 function  TeamSize(p: PTeam): Longword;
    81 function  TeamSize(p: PTeam): Longword;
    82 procedure RecountTeamHealth(team: PTeam);
    82 procedure RecountTeamHealth(team: PTeam);
    83 procedure RestoreTeamsFromSave;
    83 procedure RestoreTeamsFromSave;
       
    84 procedure CheckForWin;
    84 
    85 
    85 implementation
    86 implementation
    86 uses uMisc, uStore, uWorld, uIO, uAI, uLocale;
    87 uses uMisc, uStore, uWorld, uIO, uAI, uLocale;
    87 const MaxTeamHealth: integer = 0;
    88 const MaxTeamHealth: integer = 0;
    88 
    89 
    89 procedure FreeTeamsList; forward;
    90 procedure FreeTeamsList; forward;
       
    91 
       
    92 procedure CheckForWin;
       
    93 var team, AliveTeam: PTeam;
       
    94     AliveCount: Longword;
       
    95 begin
       
    96 AliveCount:= 0;
       
    97 AliveTeam:= nil;
       
    98 team:= TeamsList;
       
    99 while team <> nil do
       
   100       begin
       
   101       if team.TeamHealth > 0 then
       
   102          begin
       
   103          inc(AliveCount);
       
   104          AliveTeam:= team
       
   105          end;
       
   106       team:= team.Next
       
   107       end;
       
   108 
       
   109 if AliveCount >= 2 then exit;
       
   110 
       
   111 TurnTimeLeft:= 0;
       
   112 if AliveCount = 0 then
       
   113    begin // draw
       
   114    AddCaption(trmsg[sidDraw], $FFFFFF, capgrpGameState);
       
   115    AddGear(0, 0, gtATFinishGame, 0, 0, 0, 2000)
       
   116    end else // win
       
   117    begin
       
   118    AddCaption(Format(trmsg[sidWinner], AliveTeam.TeamName), $FFFFFF, capgrpGameState);
       
   119    AddGear(0, 0, gtATFinishGame, 0, 0, 0, 2000)
       
   120    end;
       
   121 end;
    90 
   122 
    91 procedure SwitchHedgehog;
   123 procedure SwitchHedgehog;
    92 var tteam: PTeam;
   124 var tteam: PTeam;
    93     th: integer;
   125     th: integer;
    94 begin
   126 begin
   102 repeat
   134 repeat
   103   CurrentTeam:= CurrentTeam.Next;
   135   CurrentTeam:= CurrentTeam.Next;
   104   if CurrentTeam = nil then CurrentTeam:= TeamsList;
   136   if CurrentTeam = nil then CurrentTeam:= TeamsList;
   105   th:= CurrentTeam.CurrHedgehog;
   137   th:= CurrentTeam.CurrHedgehog;
   106   repeat
   138   repeat
   107     CurrentTeam.CurrHedgehog:= Succ(CurrentTeam.CurrHedgehog) mod cMaxHHIndex;
   139     CurrentTeam.CurrHedgehog:= Succ(CurrentTeam.CurrHedgehog) mod (cMaxHHIndex + 1);
   108   until (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear <> nil) or (CurrentTeam.CurrHedgehog = th)
   140   until (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear <> nil) or (CurrentTeam.CurrHedgehog = th)
   109 until (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear <> nil) or (CurrentTeam = tteam);
   141 until (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear <> nil) or (CurrentTeam = tteam);
   110 
   142 
   111 if (CurrentTeam = tteam) then
   143 TryDo(CurrentTeam <> tteam, 'Switch hedgehog: only one team?!', true);
   112    begin
   144 
   113    if GameType = gmtDemo then
       
   114       begin
       
   115       SendIPC('q');
       
   116       GameState:= gsExit;
       
   117       exit
       
   118       end else OutError('There''s only one team on map!', true);
       
   119    end;
       
   120 with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do
   145 with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do
   121      begin
   146      begin
   122      AttacksNum:= 0;
   147      AttacksNum:= 0;
   123      with Gear^ do
   148      with Gear^ do
   124           begin
   149           begin
   127           end;
   152           end;
   128      FollowGear:= Gear
   153      FollowGear:= Gear
   129      end;
   154      end;
   130 ResetKbd;
   155 ResetKbd;
   131 cWindSpeed:= (GetRandom * 2 - 1) * cMaxWindSpeed;
   156 cWindSpeed:= (GetRandom * 2 - 1) * cMaxWindSpeed;
   132 AddGear(0, 0, gtActionTimer, gtsSmoothWindCh).Tag:= round(72 * cWindSpeed / cMaxWindSpeed);
   157 AddGear(0, 0, gtATSmoothWindCh, 0, 0, 0, 1).Tag:= round(72 * cWindSpeed / cMaxWindSpeed);
   133 {$IFDEF DEBUGFILE}AddFileLog('Wind = '+FloatToStr(cWindSpeed));{$ENDIF}
   158 {$IFDEF DEBUGFILE}AddFileLog('Wind = '+FloatToStr(cWindSpeed));{$ENDIF}
   134 ApplyAmmoChanges(CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog]);
   159 ApplyAmmoChanges(CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog]);
   135 TurnTimeLeft:= cHedgehogTurnTime
   160 TurnTimeLeft:= cHedgehogTurnTime
   136 end;
       
   137 
       
   138 procedure SetFirstTurnHedgehog;
       
   139 var i: integer;
       
   140 begin
       
   141 if CurrentTeam=nil then OutError('nil Team (SetFirstTurnHedgehog)', true);
       
   142 i:= 0;
       
   143 while (i<cMaxHHIndex)and(CurrentTeam.Hedgehogs[i].Gear=nil) do inc(i);
       
   144 if CurrentTeam.Hedgehogs[i].Gear = nil then OutError(errmsgIncorrectUse + ' (sfth)', true);
       
   145 CurrentTeam.CurrHedgehog:= i;
       
   146 end;
   161 end;
   147 
   162 
   148 function AddTeam: PTeam;
   163 function AddTeam: PTeam;
   149 begin
   164 begin
   150 New(Result);
   165 New(Result);
   151 TryDo(Result <> nil, 'AddTeam: Result = nil', true);
   166 TryDo(Result <> nil, 'AddTeam: Result = nil', true);
   152 FillChar(Result^, sizeof(TTeam), 0);
   167 FillChar(Result^, sizeof(TTeam), 0);
   153 Result.AttackBar:= 2;
   168 Result.AttackBar:= 2;
       
   169 Result.CurrHedgehog:= cMaxHHIndex;
   154 if TeamsList = nil then TeamsList:= Result
   170 if TeamsList = nil then TeamsList:= Result
   155                    else begin
   171                    else begin
   156                         Result.Next:= TeamsList;
   172                         Result.Next:= TeamsList;
   157                         TeamsList:= Result
   173                         TeamsList:= Result
   158                         end;
   174                         end;
   215              // will have common set of ammo
   231              // will have common set of ammo
   216              end;
   232              end;
   217       if th > MaxTeamHealth then MaxTeamHealth:= th;
   233       if th > MaxTeamHealth then MaxTeamHealth:= th;
   218       p:= p.Next
   234       p:= p.Next
   219       end;
   235       end;
   220 SetFirstTurnHedgehog;
       
   221 RecountAllTeamsHealth
   236 RecountAllTeamsHealth
   222 end;
   237 end;
   223 
   238 
   224 procedure ApplyAmmoChanges(var Hedgehog: THedgehog);
   239 procedure ApplyAmmoChanges(var Hedgehog: THedgehog);
   225 var s: shortstring;
   240 var s: shortstring;
   236      begin
   251      begin
   237      s:= trammo[Ammoz[AmmoType].NameId];
   252      s:= trammo[Ammoz[AmmoType].NameId];
   238      if Count <> AMMO_INFINITE then
   253      if Count <> AMMO_INFINITE then
   239         s:= s + ' (' + IntToStr(Count) + ')';
   254         s:= s + ' (' + IntToStr(Count) + ')';
   240      if (Propz and ammoprop_Timerable) <> 0 then
   255      if (Propz and ammoprop_Timerable) <> 0 then
   241         s:= s + ', ' + inttostr(Timer div 1000) + ' ' + trmsg[sidSeconds];
   256         s:= s + ', ' + inttostr(Timer div 1000) + ' ' + trammo[sidSeconds];
   242      AddCaption(s, Team.Color, capgrpAmmoinfo);
   257      AddCaption(s, Team.Color, capgrpAmmoinfo);
   243      if (Propz and ammoprop_NeedTarget) <> 0
   258      if (Propz and ammoprop_NeedTarget) <> 0
   244         then begin
   259         then begin
   245         Gear.State:= Gear.State or      gstHHChooseTarget;
   260         Gear.State:= Gear.State or      gstHHChooseTarget;
   246         isCursorVisible:= true
   261         isCursorVisible:= true