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; |
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 |