62 Kills : LongWord = 0; |
62 Kills : LongWord = 0; |
63 KillsTotal : LongWord = 0; |
63 KillsTotal : LongWord = 0; |
64 HitTargets : LongWord = 0; // Target (gtTarget) hits per turn |
64 HitTargets : LongWord = 0; // Target (gtTarget) hits per turn |
65 AmmoUsedCount : Longword = 0; |
65 AmmoUsedCount : Longword = 0; |
66 AmmoDamagingUsed : boolean = false; |
66 AmmoDamagingUsed : boolean = false; |
|
67 LeaveMeAlone : boolean = false; |
67 SkippedTurns: LongWord = 0; |
68 SkippedTurns: LongWord = 0; |
68 isTurnSkipped: boolean = false; |
69 isTurnSkipped: boolean = false; |
69 vpHurtSameClan: PVoicepack = nil; |
70 vpHurtSameClan: PVoicepack = nil; |
70 vpHurtEnemy: PVoicepack = nil; |
71 vpHurtEnemy: PVoicepack = nil; |
71 |
72 |
97 else |
98 else |
98 begin |
99 begin |
99 vpHurtEnemy:= Gear^.Hedgehog^.Team^.voicepack; |
100 vpHurtEnemy:= Gear^.Hedgehog^.Team^.voicepack; |
100 if (not killed) then |
101 if (not killed) then |
101 begin |
102 begin |
|
103 // Check if victim got attacked by RevengeHog again |
|
104 if (Gear^.Hedgehog^.RevengeHog <> nil) and (Gear^.Hedgehog^.RevengeHog = Attacker) then |
|
105 LeaveMeAlone:= true; |
102 // Check if attacker got revenge |
106 // Check if attacker got revenge |
103 if (Attacker^.RevengeHog <> nil) and (Attacker^.RevengeHog = Gear^.Hedgehog) then |
107 if (Attacker^.RevengeHog <> nil) and (Attacker^.RevengeHog = Gear^.Hedgehog) then |
104 begin |
108 begin |
105 Attacker^.stats.GotRevenge:= true; |
109 Attacker^.stats.GotRevenge:= true; |
|
110 // Also reset the "in-row" counter to restore LeaveMeAlone/CutItOut taunts |
|
111 Attacker^.stats.StepDamageRecvInRow:= 0; |
106 Attacker^.RevengeHog:= nil; |
112 Attacker^.RevengeHog:= nil; |
107 end |
113 end |
108 // If not, victim remembers their attacker to plan *their* revenge |
114 // If not, victim remembers their attacker to plan *their* revenge |
109 else |
115 else |
110 Gear^.Hedgehog^.RevengeHog:= Attacker; |
116 Gear^.Hedgehog^.RevengeHog:= Attacker; |
159 inc(FinishedTurnsTotal); |
165 inc(FinishedTurnsTotal); |
160 |
166 |
161 for t:= 0 to Pred(TeamsCount) do // send even on zero turn |
167 for t:= 0 to Pred(TeamsCount) do // send even on zero turn |
162 with TeamsArray[t]^ do |
168 with TeamsArray[t]^ do |
163 for i:= 0 to cMaxHHIndex do |
169 for i:= 0 to cMaxHHIndex do |
|
170 begin |
164 with Hedgehogs[i].stats do |
171 with Hedgehogs[i].stats do |
165 begin |
172 begin |
166 inc(DamageRecv, StepDamageRecv); |
173 inc(DamageRecv, StepDamageRecv); |
167 inc(DamageGiven, StepDamageGiven); |
174 inc(DamageGiven, StepDamageGiven); |
168 if StepDamageRecv > MaxStepDamageRecv then |
175 if StepDamageRecv > MaxStepDamageRecv then |
169 MaxStepDamageRecv:= StepDamageRecv; |
176 MaxStepDamageRecv:= StepDamageRecv; |
170 if StepDamageGiven > MaxStepDamageGiven then |
177 if StepDamageGiven > MaxStepDamageGiven then |
171 MaxStepDamageGiven:= StepDamageGiven; |
178 MaxStepDamageGiven:= StepDamageGiven; |
172 if StepKills > MaxStepKills then |
179 if StepKills > MaxStepKills then |
173 MaxStepKills:= StepKills; |
180 MaxStepKills:= StepKills; |
|
181 if (Hedgehogs[i].Team <> nil) and (Hedgehogs[i].Team^.Clan^.ClanIndex <> CurrentHedgehog^.Team^.Clan^.ClanIndex) then |
|
182 begin |
|
183 if StepDamageRecv > 0 then |
|
184 inc(StepDamageRecvInRow) |
|
185 else |
|
186 StepDamageRecvInRow:= 0; |
|
187 if StepDamageRecvInRow >= 3 then |
|
188 LeaveMeAlone:= true; |
|
189 end; |
174 end; |
190 end; |
|
191 end; |
|
192 |
175 |
193 |
176 // Write into the death log which clans died in this turn, |
194 // Write into the death log which clans died in this turn, |
177 // important for final rankings. |
195 // important for final rankings. |
178 c:= 0; |
196 c:= 0; |
179 newEntry:= nil; |
197 newEntry:= nil; |
274 // 1 kill |
292 // 1 kill |
275 else if Kills = (killsCheck + 1) then |
293 else if Kills = (killsCheck + 1) then |
276 AddVoice(sndEnemyDown, CurrentTeam^.voicepack) |
294 AddVoice(sndEnemyDown, CurrentTeam^.voicepack) |
277 // 0 kills, only damage or poison |
295 // 0 kills, only damage or poison |
278 else |
296 else |
|
297 // possible reactions of victim, in the order of preference: |
|
298 // 1. claiming revenge |
|
299 // 2. complaining about getting attacked too often |
|
300 // 3. threatening enemy with retaliation |
279 if CurrentHedgehog^.stats.GotRevenge then |
301 if CurrentHedgehog^.stats.GotRevenge then |
280 AddVoice(sndRevenge, CurrentHedgehog^.Team^.voicepack) |
302 AddVoice(sndRevenge, CurrentHedgehog^.Team^.voicepack) |
281 else |
303 else |
282 // TODO: Maybe play sndExcellent for a high damage shot. |
304 if LeaveMeAlone then |
283 // Not done yet because the fallback is sndEnemyDown. |
305 if random(2) = 0 then |
284 if random(2) = 0 then |
306 AddVoice(sndCutItOut, vpHurtEnemy) |
285 AddVoice(sndRegret, vpHurtEnemy) |
307 else |
|
308 AddVoice(sndLeaveMeAlone, vpHurtEnemy) |
286 else |
309 else |
287 AddVoice(sndGonnaGetYou, vpHurtEnemy) |
310 if random(2) = 0 then |
|
311 AddVoice(sndRegret, vpHurtEnemy) |
|
312 else |
|
313 AddVoice(sndGonnaGetYou, vpHurtEnemy) |
288 |
314 |
289 // Missed shot |
315 // Missed shot |
290 // A miss is defined as a shot with a damaging weapon with 0 kills, 0 damage, 0 hogs poisoned and 0 targets hit |
316 // A miss is defined as a shot with a damaging weapon with 0 kills, 0 damage, 0 hogs poisoned and 0 targets hit |
291 else if AmmoDamagingUsed and (Kills <= killsCheck) and (PoisonTurn = 0) and (PoisonClan = 0) and (DamageTurn = 0) and (HitTargets = 0) then |
317 else if AmmoDamagingUsed and (Kills <= killsCheck) and (PoisonTurn = 0) and (PoisonClan = 0) and (DamageTurn = 0) and (HitTargets = 0) then |
292 // Chance to call hedgehog stupid or nutter if sacrificed for nothing |
318 // Chance to call hedgehog stupid or nutter if sacrificed for nothing |