author | nemo |
Fri, 15 Mar 2013 11:55:41 -0400 | |
changeset 8732 | 57c10f640b60 |
parent 8658 | e7df553193ba |
child 8744 | 6c87486fd89b |
permissions | -rw-r--r-- |
6581 | 1 |
(* |
2 |
* Hedgewars, a free turn based strategy game |
|
6700 | 3 |
* Copyright (c) 2004-2012 Andrey Korotaev <unC0Rr@gmail.com> |
6581 | 4 |
* |
5 |
* This program is free software; you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
8 |
* |
|
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|
17 |
*) |
|
18 |
||
19 |
{$INCLUDE "options.inc"} |
|
20 |
||
21 |
unit uGearsHedgehog; |
|
22 |
interface |
|
23 |
uses uTypes; |
|
24 |
||
25 |
procedure doStepHedgehog(Gear: PGear); |
|
26 |
procedure AfterAttack; |
|
27 |
procedure HedgehogStep(Gear: PGear); |
|
28 |
procedure doStepHedgehogMoving(Gear: PGear); |
|
29 |
procedure HedgehogChAngle(HHGear: PGear); |
|
30 |
procedure PickUp(HH, Gear: PGear); |
|
7389
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
31 |
procedure AddPickup(HH: THedgehog; ammo: TAmmoType; cnt, X, Y: LongWord); |
8574 | 32 |
procedure CheckIce(Gear: PGear); inline; |
6581 | 33 |
|
34 |
implementation |
|
6992 | 35 |
uses uConsts, uVariables, uFloat, uAmmos, uSound, uCaptions, |
6581 | 36 |
uCommands, uLocale, uUtils, uVisualGears, uStats, uIO, uScript, |
37 |
uGearsList, uGears, uCollisions, uRandom, uStore, uTeams, |
|
38 |
uGearsUtils; |
|
39 |
||
7028 | 40 |
var GHStepTicks: LongWord = 0; |
41 |
||
6581 | 42 |
// Shouldn't more of this ammo switching stuff be moved to uAmmos ? |
43 |
function ChangeAmmo(HHGear: PGear): boolean; |
|
44 |
var slot, i: Longword; |
|
45 |
ammoidx: LongInt; |
|
7754 | 46 |
prevAmmo: TAmmoType; |
6581 | 47 |
begin |
48 |
ChangeAmmo:= false; |
|
49 |
slot:= HHGear^.MsgParam; |
|
50 |
||
51 |
with HHGear^.Hedgehog^ do |
|
52 |
begin |
|
53 |
HHGear^.Message:= HHGear^.Message and (not gmSlot); |
|
7754 | 54 |
prevAmmo:= CurAmmoType; |
6581 | 55 |
ammoidx:= 0; |
56 |
if ((HHGear^.State and (gstAttacking or gstAttacked)) <> 0) |
|
57 |
or ((HHGear^.State and gstHHDriven) = 0) then |
|
58 |
exit; |
|
59 |
ChangeAmmo:= true; |
|
60 |
||
61 |
while (ammoidx < cMaxSlotAmmoIndex) and (Ammo^[slot, ammoidx].AmmoType <> CurAmmoType) do |
|
62 |
inc(ammoidx); |
|
63 |
||
8553
a8e1cff496d8
Allow switching away from any weapon when during multishoot.
nemo
parents:
8494
diff
changeset
|
64 |
if (MultiShootAttacks > 0) then |
a8e1cff496d8
Allow switching away from any weapon when during multishoot.
nemo
parents:
8494
diff
changeset
|
65 |
begin |
a8e1cff496d8
Allow switching away from any weapon when during multishoot.
nemo
parents:
8494
diff
changeset
|
66 |
if (CurAmmoType = amSniperRifle) and ((GameFlags and gfArtillery) = 0) then |
a8e1cff496d8
Allow switching away from any weapon when during multishoot.
nemo
parents:
8494
diff
changeset
|
67 |
cArtillery := false; |
8631
796ed875aa95
Call act as if attack ended on last shot if switching while in mid multi-shoot. Thanks to AI for discovering this.
nemo
parents:
8616
diff
changeset
|
68 |
if (Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NoRoundEnd) = 0 then |
796ed875aa95
Call act as if attack ended on last shot if switching while in mid multi-shoot. Thanks to AI for discovering this.
nemo
parents:
8616
diff
changeset
|
69 |
begin |
796ed875aa95
Call act as if attack ended on last shot if switching while in mid multi-shoot. Thanks to AI for discovering this.
nemo
parents:
8616
diff
changeset
|
70 |
MultiShootAttacks:= Ammoz[CurAmmoType].Ammo.NumPerTurn; |
796ed875aa95
Call act as if attack ended on last shot if switching while in mid multi-shoot. Thanks to AI for discovering this.
nemo
parents:
8616
diff
changeset
|
71 |
AfterAttack |
796ed875aa95
Call act as if attack ended on last shot if switching while in mid multi-shoot. Thanks to AI for discovering this.
nemo
parents:
8616
diff
changeset
|
72 |
end |
796ed875aa95
Call act as if attack ended on last shot if switching while in mid multi-shoot. Thanks to AI for discovering this.
nemo
parents:
8616
diff
changeset
|
73 |
else OnUsedAmmo(HHGear^.Hedgehog^) |
8553
a8e1cff496d8
Allow switching away from any weapon when during multishoot.
nemo
parents:
8494
diff
changeset
|
74 |
end; |
6581 | 75 |
|
76 |
MultiShootAttacks:= 0; |
|
77 |
HHGear^.Message:= HHGear^.Message and (not (gmLJump or gmHJump)); |
|
78 |
||
79 |
if Ammoz[CurAmmoType].Slot = slot then |
|
80 |
begin |
|
81 |
i:= 0; |
|
82 |
repeat |
|
83 |
inc(ammoidx); |
|
84 |
if (ammoidx > cMaxSlotAmmoIndex) then |
|
85 |
begin |
|
86 |
inc(i); |
|
87 |
CurAmmoType:= amNothing; |
|
88 |
ammoidx:= -1; |
|
89 |
//TryDo(i < 2, 'Engine bug: no ammo in current slot', true) |
|
90 |
end; |
|
91 |
until (i = 1) or ((Ammo^[slot, ammoidx].Count > 0) |
|
92 |
and (Team^.Clan^.TurnNumber > Ammoz[Ammo^[slot, ammoidx].AmmoType].SkipTurns)) |
|
93 |
||
94 |
end |
|
95 |
else |
|
96 |
begin |
|
97 |
i:= 0; |
|
98 |
// check whether there is ammo in slot |
|
99 |
while (i <= cMaxSlotAmmoIndex) and ((Ammo^[slot, i].Count = 0) |
|
100 |
or (Team^.Clan^.TurnNumber <= Ammoz[Ammo^[slot, i].AmmoType].SkipTurns)) |
|
101 |
do inc(i); |
|
102 |
||
103 |
if i <= cMaxSlotAmmoIndex then |
|
104 |
ammoidx:= i |
|
105 |
else ammoidx:= -1 |
|
106 |
end; |
|
107 |
if ammoidx >= 0 then |
|
108 |
CurAmmoType:= Ammo^[slot, ammoidx].AmmoType; |
|
7754 | 109 |
if (prevAmmo <> CurAmmoType) then |
110 |
begin |
|
111 |
if CurAmmoType = amKnife then |
|
112 |
LoadHedgehogHat(HHGear^.Hedgehog^, 'Reserved/chef') |
|
113 |
else if prevAmmo = amKnife then |
|
114 |
LoadHedgehogHat(HHGear^.Hedgehog^, Hat); |
|
8051
f26422ef0333
oft-requested, should make the shoppa guys happy, probably, but, knowing them, I'm sure someone will complain
nemo
parents:
8030
diff
changeset
|
115 |
end; |
f26422ef0333
oft-requested, should make the shoppa guys happy, probably, but, knowing them, I'm sure someone will complain
nemo
parents:
8030
diff
changeset
|
116 |
// Try again in the next slot |
f26422ef0333
oft-requested, should make the shoppa guys happy, probably, but, knowing them, I'm sure someone will complain
nemo
parents:
8030
diff
changeset
|
117 |
if CurAmmoType = prevAmmo then |
f26422ef0333
oft-requested, should make the shoppa guys happy, probably, but, knowing them, I'm sure someone will complain
nemo
parents:
8030
diff
changeset
|
118 |
begin |
f26422ef0333
oft-requested, should make the shoppa guys happy, probably, but, knowing them, I'm sure someone will complain
nemo
parents:
8030
diff
changeset
|
119 |
if slot >= cMaxSlotIndex then slot:= 0 else inc(slot); |
f26422ef0333
oft-requested, should make the shoppa guys happy, probably, but, knowing them, I'm sure someone will complain
nemo
parents:
8030
diff
changeset
|
120 |
HHGear^.MsgParam:= slot; |
f26422ef0333
oft-requested, should make the shoppa guys happy, probably, but, knowing them, I'm sure someone will complain
nemo
parents:
8030
diff
changeset
|
121 |
ChangeAmmo(HHGear) |
7754 | 122 |
end |
6581 | 123 |
end |
124 |
end; |
|
125 |
||
126 |
procedure HHSetWeapon(HHGear: PGear); |
|
127 |
var t: LongInt; |
|
128 |
weap: TAmmoType; |
|
129 |
Hedgehog: PHedgehog; |
|
130 |
s: boolean; |
|
131 |
begin |
|
132 |
s:= false; |
|
133 |
||
134 |
weap:= TAmmoType(HHGear^.MsgParam); |
|
135 |
Hedgehog:= HHGear^.Hedgehog; |
|
136 |
||
137 |
if Hedgehog^.Team^.Clan^.TurnNumber <= Ammoz[weap].SkipTurns then |
|
138 |
exit; // weapon is not activated yet |
|
139 |
||
140 |
HHGear^.MsgParam:= Ammoz[weap].Slot; |
|
141 |
||
142 |
t:= cMaxSlotAmmoIndex; |
|
143 |
||
144 |
HHGear^.Message:= HHGear^.Message and (not gmWeapon); |
|
145 |
||
146 |
with Hedgehog^ do |
|
147 |
while (CurAmmoType <> weap) and (t >= 0) do |
|
148 |
begin |
|
149 |
s:= ChangeAmmo(HHGear); |
|
150 |
dec(t) |
|
151 |
end; |
|
152 |
||
153 |
if s then |
|
154 |
ApplyAmmoChanges(HHGear^.Hedgehog^) |
|
155 |
end; |
|
156 |
||
157 |
procedure HHSetTimer(Gear: PGear); |
|
158 |
var CurWeapon: PAmmo; |
|
159 |
color: LongWord; |
|
160 |
begin |
|
161 |
Gear^.Message:= Gear^.Message and (not gmTimer); |
|
6924 | 162 |
CurWeapon:= GetCurAmmoEntry(Gear^.Hedgehog^); |
6581 | 163 |
with Gear^.Hedgehog^ do |
164 |
if ((Gear^.Message and gmPrecise) <> 0) and ((CurWeapon^.Propz and ammoprop_SetBounce) <> 0) then |
|
165 |
begin |
|
166 |
color:= Gear^.Hedgehog^.Team^.Clan^.Color; |
|
167 |
case Gear^.MsgParam of |
|
168 |
1: begin |
|
7069 | 169 |
AddCaption(FormatA(trmsg[sidBounce], trmsg[sidBounce1]), color, capgrpAmmostate); |
6581 | 170 |
CurWeapon^.Bounciness:= 350; |
171 |
end; |
|
172 |
2: begin |
|
7069 | 173 |
AddCaption(FormatA(trmsg[sidBounce], trmsg[sidBounce2]), color, capgrpAmmostate); |
6581 | 174 |
CurWeapon^.Bounciness:= 700; |
175 |
end; |
|
176 |
3: begin |
|
7069 | 177 |
AddCaption(FormatA(trmsg[sidBounce], trmsg[sidBounce3]), color, capgrpAmmostate); |
6581 | 178 |
CurWeapon^.Bounciness:= 1000; |
179 |
end; |
|
180 |
4: begin |
|
7069 | 181 |
AddCaption(FormatA(trmsg[sidBounce], trmsg[sidBounce4]), color, capgrpAmmostate); |
6581 | 182 |
CurWeapon^.Bounciness:= 2000; |
183 |
end; |
|
184 |
5: begin |
|
7069 | 185 |
AddCaption(FormatA(trmsg[sidBounce], trmsg[sidBounce5]), color, capgrpAmmostate); |
6581 | 186 |
CurWeapon^.Bounciness:= 4000; |
187 |
end |
|
188 |
end |
|
189 |
end |
|
190 |
else if (CurWeapon^.Propz and ammoprop_Timerable) <> 0 then |
|
191 |
begin |
|
192 |
CurWeapon^.Timer:= 1000 * Gear^.MsgParam; |
|
193 |
with CurrentTeam^ do |
|
194 |
ApplyAmmoChanges(Hedgehogs[CurrHedgehog]); |
|
195 |
end; |
|
196 |
end; |
|
197 |
||
198 |
||
199 |
procedure Attack(Gear: PGear); |
|
200 |
var xx, yy, newDx, newDy, lx, ly: hwFloat; |
|
201 |
speech: PVisualGear; |
|
202 |
newGear: PGear; |
|
203 |
CurWeapon: PAmmo; |
|
204 |
altUse: boolean; |
|
205 |
elastic: hwFloat; |
|
206 |
begin |
|
207 |
newGear:= nil; |
|
208 |
bShowFinger:= false; |
|
6924 | 209 |
CurWeapon:= GetCurAmmoEntry(Gear^.Hedgehog^); |
6581 | 210 |
with Gear^, |
211 |
Gear^.Hedgehog^ do |
|
212 |
begin |
|
213 |
if ((State and gstHHDriven) <> 0) and ((State and (gstAttacked or gstHHChooseTarget)) = 0) and (((State and gstMoving) = 0) |
|
214 |
or (Power > 0) |
|
215 |
or (CurAmmoType = amTeleport) |
|
216 |
or |
|
217 |
// Allow attacks while moving on ammo with AltAttack |
|
218 |
((CurAmmoGear <> nil) and ((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_AltAttack) <> 0)) |
|
219 |
or ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AttackInMove) <> 0)) |
|
220 |
and ((TargetPoint.X <> NoPointX) or ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NeedTarget) = 0)) then |
|
221 |
begin |
|
222 |
State:= State or gstAttacking; |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
223 |
if (Power = cMaxPower) or ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_Power) = 0) then |
6581 | 224 |
Message:= Message and (not gmAttack) |
225 |
else |
|
226 |
begin |
|
227 |
if Power = 0 then |
|
228 |
begin |
|
229 |
AttackBar:= CurrentTeam^.AttackBar; |
|
230 |
PlaySound(sndThrowPowerUp) |
|
231 |
end; |
|
232 |
inc(Power) |
|
233 |
end; |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
234 |
if ((Message and gmAttack) <> 0) then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
235 |
exit; |
6581 | 236 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
237 |
if (Ammoz[CurAmmoType].Ammo.Propz and ammoprop_Power) <> 0 then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
238 |
begin |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
239 |
StopSound(sndThrowPowerUp); |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
240 |
PlaySound(sndThrowRelease); |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
241 |
end; |
6581 | 242 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
243 |
xx:= SignAs(AngleSin(Angle), dX); |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
244 |
yy:= -AngleCos(Angle); |
6581 | 245 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
246 |
lx:= X + int2hwfloat(round(GetLaunchX(CurAmmoType, hwSign(dX), Angle))); |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
247 |
ly:= Y + int2hwfloat(round(GetLaunchY(CurAmmoType, Angle))); |
6581 | 248 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
249 |
if ((Gear^.State and gstHHHJump) <> 0) and (not cArtillery) then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
250 |
xx:= - xx; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
251 |
if Ammoz[CurAmmoType].Ammo.AttackVoice <> sndNone then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
252 |
AddVoice(Ammoz[CurAmmoType].Ammo.AttackVoice, CurrentTeam^.voicepack); |
6581 | 253 |
|
254 |
// Initiating alt attack |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
255 |
if (CurAmmoGear <> nil) |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
256 |
and ((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_AltAttack) <> 0) |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
257 |
and ((Gear^.Message and gmLJump) <> 0) |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
258 |
and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AltUse) <> 0) then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
259 |
begin |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
260 |
newDx:= dX; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
261 |
newDy:= dY; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
262 |
altUse:= true |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
263 |
end |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
264 |
else |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
265 |
begin |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
266 |
newDx:= xx*Power/cPowerDivisor; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
267 |
newDy:= yy*Power/cPowerDivisor; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
268 |
altUse:= false |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
269 |
end; |
6581 | 270 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
271 |
case CurAmmoType of |
6581 | 272 |
amGrenade: newGear:= AddGear(hwRound(lx), hwRound(ly), gtGrenade, 0, newDx, newDy, CurWeapon^.Timer); |
273 |
amMolotov: newGear:= AddGear(hwRound(lx), hwRound(ly), gtMolotov, 0, newDx, newDy, 0); |
|
274 |
amClusterBomb: newGear:= AddGear(hwRound(lx), hwRound(ly), gtClusterBomb, 0, newDx, newDy, CurWeapon^.Timer); |
|
275 |
amGasBomb: newGear:= AddGear(hwRound(lx), hwRound(ly), gtGasBomb, 0, newDx, newDy, CurWeapon^.Timer); |
|
276 |
amBazooka: newGear:= AddGear(hwRound(lx), hwRound(ly), gtShell, 0, newDx, newDy, 0); |
|
277 |
amSnowball: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSnowball, 0, newDx, newDy, 0); |
|
278 |
amBee: newGear:= AddGear(hwRound(lx), hwRound(ly), gtBee, 0, newDx, newDy, 0); |
|
279 |
amShotgun: begin |
|
280 |
PlaySound(sndShotgunReload); |
|
281 |
newGear:= AddGear(hwRound(lx), hwRound(ly), gtShotgunShot, 0, xx * _0_5, yy * _0_5, 0); |
|
282 |
end; |
|
283 |
amPickHammer: newGear:= AddGear(hwRound(lx), hwRound(ly) + cHHRadius, gtPickHammer, 0, _0, _0, 0); |
|
284 |
amSkip: ParseCommand('/skip', true); |
|
285 |
amRope: newGear:= AddGear(hwRound(lx), hwRound(ly), gtRope, 0, xx, yy, 0); |
|
7602
a620319d377e
Fix throwing things off rope, also make throwing things a bit more generic and gear density dependent (so you can throw mines further, and also throw dynamite a little).
nemo
parents:
7598
diff
changeset
|
286 |
amMine: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtMine, gstWait, SignAs(_0_02, dX), _0, 3000); |
6581 | 287 |
amSMine: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSMine, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, 0); |
7754 | 288 |
amKnife: begin |
289 |
newGear:= AddGear(hwRound(lx), hwRound(ly), gtKnife, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, 0); |
|
290 |
newGear^.State:= newGear^.State or gstMoving; |
|
8494
53b91a602955
Cleaver tweaks based on feedback. Nerf damage, shrink radius. This means cleaver will embed into ground quite a bit further.
nemo
parents:
8493
diff
changeset
|
291 |
newGear^.Radius:= 4 // temporarily shrink so it doesn't instantly embed in the ground |
7754 | 292 |
end; |
6581 | 293 |
amDEagle: newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtDEagleShot, 0, xx * _0_5, yy * _0_5, 0); |
294 |
amSineGun: newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSineGunShot, 0, xx * _0_5, yy * _0_5, 0); |
|
295 |
amPortalGun: begin |
|
296 |
newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtPortal, 0, xx * _0_6, yy * _0_6, |
|
297 |
// set selected color |
|
298 |
CurWeapon^.Pos); |
|
299 |
end; |
|
300 |
amSniperRifle: begin |
|
301 |
PlaySound(sndSniperReload); |
|
302 |
newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSniperRifleShot, 0, xx * _0_5, yy * _0_5, 0); |
|
303 |
end; |
|
304 |
amDynamite: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtDynamite, 0, SignAs(_0_03, dX), _0, 5000); |
|
305 |
amFirePunch: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtFirePunch, 0, xx, _0, 0); |
|
306 |
amWhip: begin |
|
307 |
newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtWhip, 0, SignAs(_1, dX), - _0_8, 0); |
|
308 |
PlaySound(sndWhipCrack) |
|
309 |
end; |
|
310 |
amHammer: begin |
|
311 |
newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtHammer, 0, SignAs(_1, dX), - _0_8, 0); |
|
312 |
PlaySound(sndWhack) |
|
313 |
end; |
|
314 |
amBaseballBat: begin |
|
315 |
newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtShover, gsttmpFlag, xx * _0_5, yy * _0_5, 0); |
|
316 |
PlaySound(sndBaseballBat) // TODO: Only play if something is hit? |
|
317 |
end; |
|
318 |
amParachute: begin |
|
319 |
newGear:= AddGear(hwRound(lx), hwRound(ly), gtParachute, 0, _0, _0, 0); |
|
320 |
PlaySound(sndParachute) |
|
321 |
end; |
|
322 |
// we save CurWeapon^.Pos (in this case: cursor direction) by using it as (otherwise irrelevant) X value of the new gear. |
|
323 |
amAirAttack: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 0, _0, _0, 0); |
|
324 |
amMineStrike: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 1, _0, _0, 0); |
|
325 |
amDrillStrike: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 3, _0, _0, CurWeapon^.Timer); |
|
326 |
amNapalm: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 2, _0, _0, 0); |
|
327 |
amBlowTorch: newGear:= AddGear(hwRound(lx), hwRound(ly), gtBlowTorch, 0, SignAs(_0_5, dX), _0, 0); |
|
328 |
amGirder: newGear:= AddGear(0, 0, gtGirder, CurWeapon^.Pos, _0, _0, 0); |
|
329 |
amTeleport: newGear:= AddGear(CurWeapon^.Pos, 0, gtTeleport, 0, _0, _0, 0); |
|
330 |
amSwitch: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSwitcher, 0, _0, _0, 0); |
|
331 |
amMortar: begin |
|
332 |
playSound(sndMortar); |
|
333 |
newGear:= AddGear(hwRound(lx), hwRound(ly), gtMortar, 0, xx*cMaxPower/cPowerDivisor, yy*cMaxPower/cPowerDivisor, 0); |
|
334 |
end; |
|
335 |
amRCPlane: begin |
|
336 |
newGear:= AddGear(hwRound(lx), hwRound(ly), gtRCPlane, 0, xx * cMaxPower / cPowerDivisor / 4, yy * cMaxPower / cPowerDivisor / 4, 0); |
|
7053 | 337 |
newGear^.SoundChannel:= LoopSound(sndRCPlane) |
6581 | 338 |
end; |
339 |
amKamikaze: newGear:= AddGear(hwRound(lx), hwRound(ly), gtKamikaze, 0, xx * _0_5, yy * _0_5, 0); |
|
7832 | 340 |
amCake: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 3, hwRound(ly), gtCake, 0, SignAs(cLittle, xx), _0, 0); |
6581 | 341 |
amSeduction: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSeduction, 0, _0, _0, 0); |
342 |
amWatermelon: newGear:= AddGear(hwRound(lx), hwRound(ly), gtWatermelon, 0, newDx, newDy, CurWeapon^.Timer); |
|
343 |
amHellishBomb: newGear:= AddGear(hwRound(lx), hwRound(ly), gtHellishBomb, 0, newDx, newDy, 0); |
|
344 |
amDrill: newGear:= AddGear(hwRound(lx), hwRound(ly), gtDrill, 0, newDx, newDy, 0); |
|
345 |
amBallgun: newGear:= AddGear(hwRound(X), hwRound(Y), gtBallgun, 0, xx * _0_5, yy * _0_5, 0); |
|
346 |
amJetpack: newGear:= AddGear(hwRound(lx), hwRound(ly), gtJetpack, 0, _0, _0, 0); |
|
347 |
amBirdy: begin |
|
348 |
PlaySound(sndWhistle); |
|
349 |
newGear:= AddGear(hwRound(lx), hwRound(ly) - 32, gtBirdy, 0, _0, _0, 0); |
|
350 |
end; |
|
351 |
amLowGravity: begin |
|
352 |
PlaySound(sndLowGravity); |
|
353 |
cGravity:= cMaxWindSpeed; |
|
354 |
cGravityf:= 0.00025 |
|
355 |
end; |
|
356 |
amExtraDamage: begin |
|
357 |
PlaySound(sndHellishImpact4); |
|
358 |
cDamageModifier:= _1_5 |
|
359 |
end; |
|
360 |
amInvulnerable: Invulnerable:= true; |
|
361 |
amExtraTime: begin |
|
362 |
PlaySound(sndSwitchHog); |
|
363 |
TurnTimeLeft:= TurnTimeLeft + 30000 |
|
364 |
end; |
|
365 |
amLaserSight: cLaserSighting:= true; |
|
366 |
amVampiric: begin |
|
7053 | 367 |
PlaySoundV(sndOw1, Team^.voicepack); |
6581 | 368 |
cVampiric:= true; |
369 |
end; |
|
370 |
amPiano: begin |
|
371 |
// Tuck the hedgehog away until the piano attack is completed |
|
372 |
Unplaced:= true; |
|
373 |
X:= _0; |
|
374 |
Y:= _0; |
|
8414
c1ac0b64315e
Start piano higher (piano on maps that matched land_height was really weird before). Experiment w/ trying to make birdy shrink into distance to avoid odd birdy vanishes if tracking it.
nemo
parents:
8161
diff
changeset
|
375 |
newGear:= AddGear(TargetPoint.X, -1024, gtPiano, 0, _0, _0, 0); |
6581 | 376 |
PauseMusic |
377 |
end; |
|
378 |
amFlamethrower: newGear:= AddGear(hwRound(X), hwRound(Y), gtFlamethrower, 0, xx * _0_5, yy * _0_5, 0); |
|
379 |
amLandGun: newGear:= AddGear(hwRound(X), hwRound(Y), gtLandGun, 0, xx * _0_5, yy * _0_5, 0); |
|
380 |
amResurrector: begin |
|
381 |
newGear:= AddGear(hwRound(lx), hwRound(ly), gtResurrector, 0, _0, _0, 0); |
|
382 |
newGear^.SoundChannel := LoopSound(sndResurrector); |
|
383 |
end; |
|
8161 | 384 |
//amStructure: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtStructure, gstWait, SignAs(_0_02, dX), _0, 3000); |
6581 | 385 |
amTardis: newGear:= AddGear(hwRound(X), hwRound(Y), gtTardis, 0, _0, _0, 5000); |
8557 | 386 |
amIceGun: begin |
387 |
newGear:= AddGear(hwRound(X), hwRound(Y), gtIceGun, 0, _0, _0, 0); |
|
388 |
newGear^.radius := 8; |
|
389 |
end; |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
390 |
end; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
391 |
if altUse and (newGear <> nil) then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
392 |
begin |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
393 |
newGear^.dX:= newDx / newGear^.Density; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
394 |
newGear^.dY:= newDY / newGear^.Density |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
395 |
end; |
6581 | 396 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
397 |
case CurAmmoType of |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
398 |
amGrenade, amMolotov, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
399 |
amClusterBomb, amGasBomb, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
400 |
amBazooka, amSnowball, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
401 |
amBee, amSMine, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
402 |
amMortar, amWatermelon, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
403 |
amHellishBomb, amDrill: FollowGear:= newGear; |
6581 | 404 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
405 |
amShotgun, amPickHammer, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
406 |
amRope, amDEagle, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
407 |
amSineGun, amSniperRifle, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
408 |
amFirePunch, amWhip, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
409 |
amHammer, amBaseballBat, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
410 |
amParachute, amBlowTorch, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
411 |
amGirder, amTeleport, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
412 |
amSwitch, amRCPlane, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
413 |
amKamikaze, amCake, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
414 |
amSeduction, amBallgun, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
415 |
amJetpack, amBirdy, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
416 |
amFlamethrower, amLandGun, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
417 |
amResurrector, //amStructure, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
418 |
amTardis, amPiano, |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
419 |
amIceGun: CurAmmoGear:= newGear; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
420 |
end; |
6581 | 421 |
|
422 |
if ((CurAmmoType = amMine) or (CurAmmoType = amSMine)) and (GameFlags and gfInfAttack <> 0) then |
|
423 |
newGear^.FlightTime:= GameTicks + 1000 |
|
424 |
else if CurAmmoType = amDrill then |
|
425 |
newGear^.FlightTime:= GameTicks + 250; |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
426 |
if Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NeedTarget <> 0 then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
427 |
begin |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
428 |
newGear^.Target.X:= TargetPoint.X; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
429 |
newGear^.Target.Y:= TargetPoint.Y |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
430 |
end; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
431 |
if (newGear <> nil) and (newGear^.CollisionMask and $80 <> 0) then newGear^.CollisionMask:= newGear^.CollisionMask and (not $80); |
6581 | 432 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
433 |
// Clear FollowGear if using on a rope/parachute/saucer etc so focus stays with the hog's movement |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
434 |
if altUse then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
435 |
FollowGear:= nil; |
6581 | 436 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
437 |
if (newGear <> nil) and ((Ammoz[newGear^.AmmoType].Ammo.Propz and ammoprop_SetBounce) <> 0) then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
438 |
begin |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
439 |
elastic:= int2hwfloat(CurWeapon^.Bounciness) / _1000; |
6581 | 440 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
441 |
if elastic < _1 then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
442 |
newGear^.Elasticity:= newGear^.Elasticity * elastic |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
443 |
else if elastic > _1 then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
444 |
newGear^.Elasticity:= _1 - ((_1-newGear^.Elasticity) / elastic); |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
445 |
(* Experimented with friction modifier. Didn't seem helpful |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
446 |
fric:= int2hwfloat(CurWeapon^.Bounciness) / _250; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
447 |
if fric < _1 then newGear^.Friction:= newGear^.Friction * fric |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
448 |
else if fric > _1 then newGear^.Friction:= _1 - ((_1-newGear^.Friction) / fric)*) |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
449 |
end; |
6581 | 450 |
|
451 |
||
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
452 |
uStats.AmmoUsed(CurAmmoType); |
6581 | 453 |
|
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
454 |
if not (SpeechText = '') then |
6581 | 455 |
begin |
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
456 |
speech:= AddVisualGear(0, 0, vgtSpeechBubble); |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
457 |
if speech <> nil then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
458 |
begin |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
459 |
speech^.Text:= SpeechText; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
460 |
speech^.Hedgehog:= Gear^.Hedgehog; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
461 |
speech^.FrameTicks:= SpeechType; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
462 |
end; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
463 |
SpeechText:= '' |
6581 | 464 |
end; |
465 |
||
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
466 |
Power:= 0; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
467 |
if (CurAmmoGear <> nil) |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
468 |
and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AltUse) = 0){check for dropping ammo from rope} then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
469 |
begin |
8566
d9627d65edf7
This and the "retain freezing" stuff could probably use a flag.
nemo
parents:
8562
diff
changeset
|
470 |
if CurAmmoType in [amRope,amResurrector] then Message:= Message or gmAttack; |
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
471 |
CurAmmoGear^.Message:= Message |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
472 |
end |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
473 |
else |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
474 |
begin |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
475 |
if not CurrentTeam^.ExtDriven |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
476 |
and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_Power) <> 0) then |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
477 |
SendIPC(_S'a'); |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
478 |
AfterAttack; |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
479 |
end |
6581 | 480 |
end |
8492
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
481 |
else |
67d2ad3b3ce9
Allow moving after firing cleaver. This changes multishoot behaviour quite a bit. Needs a lot of testing.
nemo
parents:
8414
diff
changeset
|
482 |
Message:= Message and (not gmAttack); |
6581 | 483 |
end; |
484 |
TargetPoint.X := NoPointX; |
|
485 |
ScriptCall('onHogAttack'); |
|
486 |
end; |
|
487 |
||
488 |
procedure AfterAttack; |
|
489 |
var s: shortstring; |
|
490 |
a: TAmmoType; |
|
7459
8511a3f899d3
Allow AfterAttack to proceed even if the Hedgehog is dead. They could be resurrected after all.
nemo
parents:
7426
diff
changeset
|
491 |
HHGear: PGear; |
6581 | 492 |
begin |
7459
8511a3f899d3
Allow AfterAttack to proceed even if the Hedgehog is dead. They could be resurrected after all.
nemo
parents:
7426
diff
changeset
|
493 |
with CurrentHedgehog^ do |
6581 | 494 |
begin |
7459
8511a3f899d3
Allow AfterAttack to proceed even if the Hedgehog is dead. They could be resurrected after all.
nemo
parents:
7426
diff
changeset
|
495 |
HHGear:= Gear; |
6581 | 496 |
a:= CurAmmoType; |
7459
8511a3f899d3
Allow AfterAttack to proceed even if the Hedgehog is dead. They could be resurrected after all.
nemo
parents:
7426
diff
changeset
|
497 |
if HHGear <> nil then HHGear^.State:= HHGear^.State and (not gstAttacking); |
6581 | 498 |
if (Ammoz[a].Ammo.Propz and ammoprop_Effect) = 0 then |
499 |
begin |
|
500 |
Inc(MultiShootAttacks); |
|
501 |
||
502 |
if (Ammoz[a].Ammo.NumPerTurn >= MultiShootAttacks) then |
|
503 |
begin |
|
504 |
s:= inttostr(Ammoz[a].Ammo.NumPerTurn - MultiShootAttacks + 1); |
|
505 |
AddCaption(format(trmsg[sidRemaining], s), cWhiteColor, capgrpAmmostate); |
|
506 |
end; |
|
507 |
||
508 |
if (Ammoz[a].Ammo.NumPerTurn >= MultiShootAttacks) |
|
509 |
or ((GameFlags and gfMultiWeapon) <> 0) then |
|
510 |
begin |
|
511 |
isInMultiShoot:= true |
|
512 |
end |
|
513 |
else |
|
514 |
begin |
|
515 |
OnUsedAmmo(CurrentHedgehog^); |
|
516 |
if ((Ammoz[a].Ammo.Propz and ammoprop_NoRoundEnd) = 0) and (((GameFlags and gfInfAttack) = 0) or PlacingHogs) then |
|
517 |
begin |
|
518 |
if TagTurnTimeLeft = 0 then |
|
519 |
TagTurnTimeLeft:= TurnTimeLeft; |
|
520 |
TurnTimeLeft:=(Ammoz[a].TimeAfterTurn * cGetAwayTime) div 100; |
|
521 |
end; |
|
7459
8511a3f899d3
Allow AfterAttack to proceed even if the Hedgehog is dead. They could be resurrected after all.
nemo
parents:
7426
diff
changeset
|
522 |
if ((Ammoz[a].Ammo.Propz and ammoprop_NoRoundEnd) = 0) and (HHGear <> nil) then |
7462 | 523 |
HHGear^.State:= HHGear^.State or gstAttacked; |
6581 | 524 |
if (Ammoz[a].Ammo.Propz and ammoprop_NoRoundEnd) <> 0 then |
525 |
ApplyAmmoChanges(CurrentHedgehog^) |
|
526 |
end; |
|
527 |
end |
|
528 |
else |
|
529 |
begin |
|
530 |
OnUsedAmmo(CurrentHedgehog^); |
|
531 |
ApplyAmmoChanges(CurrentHedgehog^); |
|
532 |
end; |
|
533 |
AttackBar:= 0 |
|
534 |
end |
|
535 |
end; |
|
536 |
||
537 |
//////////////////////////////////////////////////////////////////////////////// |
|
538 |
procedure doStepHedgehogDead(Gear: PGear); |
|
539 |
const frametime = 200; |
|
540 |
timertime = frametime * 6; |
|
541 |
begin |
|
542 |
if Gear^.Hedgehog^.Unplaced then |
|
543 |
exit; |
|
544 |
if Gear^.Timer > 1 then |
|
545 |
begin |
|
546 |
AllInactive:= false; |
|
547 |
dec(Gear^.Timer); |
|
548 |
if (Gear^.Timer mod frametime) = 0 then |
|
549 |
inc(Gear^.Pos) |
|
550 |
end |
|
551 |
else if Gear^.Timer = 1 then |
|
552 |
begin |
|
553 |
Gear^.State:= Gear^.State or gstNoDamage; |
|
554 |
doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, CurrentHedgehog, EXPLAutoSound); |
|
555 |
AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtGrave, 0, _0, _0, 0)^.Hedgehog:= Gear^.Hedgehog; |
|
556 |
DeleteGear(Gear); |
|
557 |
SetAllToActive |
|
558 |
end |
|
559 |
else // Gear^.Timer = 0 |
|
560 |
begin |
|
561 |
AllInactive:= false; |
|
562 |
Gear^.Z:= cCurrHHZ; |
|
563 |
RemoveGearFromList(Gear); |
|
564 |
InsertGearToList(Gear); |
|
7053 | 565 |
PlaySoundV(sndByeBye, Gear^.Hedgehog^.Team^.voicepack); |
6581 | 566 |
Gear^.Pos:= 0; |
567 |
Gear^.Timer:= timertime |
|
568 |
end |
|
569 |
end; |
|
570 |
||
571 |
//////////////////////////////////////////////////////////////////////////////// |
|
572 |
procedure doStepHedgehogGone(Gear: PGear); |
|
573 |
const frametime = 65; |
|
574 |
timertime = frametime * 11; |
|
575 |
begin |
|
576 |
if Gear^.Hedgehog^.Unplaced then |
|
577 |
exit; |
|
578 |
if Gear^.Timer > 1 then |
|
579 |
begin |
|
580 |
AllInactive:= false; |
|
581 |
dec(Gear^.Timer); |
|
582 |
if (Gear^.Timer mod frametime) = 0 then |
|
583 |
inc(Gear^.Pos) |
|
584 |
end |
|
585 |
else |
|
586 |
if Gear^.Timer = 1 then |
|
587 |
begin |
|
588 |
DeleteGear(Gear); |
|
589 |
SetAllToActive |
|
590 |
end |
|
591 |
else // Gear^.Timer = 0 |
|
592 |
begin |
|
593 |
AllInactive:= false; |
|
594 |
Gear^.Z:= cCurrHHZ; |
|
595 |
RemoveGearFromList(Gear); |
|
596 |
InsertGearToList(Gear); |
|
7053 | 597 |
PlaySoundV(sndByeBye, Gear^.Hedgehog^.Team^.voicepack); |
6581 | 598 |
PlaySound(sndWarp); |
599 |
Gear^.Pos:= 0; |
|
600 |
Gear^.Timer:= timertime |
|
601 |
end |
|
602 |
end; |
|
603 |
||
7389
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
604 |
procedure AddPickup(HH: THedgehog; ammo: TAmmoType; cnt, X, Y: LongWord); |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
605 |
var s: shortstring; |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
606 |
vga: PVisualGear; |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
607 |
begin |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
608 |
if cnt <> 0 then AddAmmo(HH, ammo, cnt) |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
609 |
else AddAmmo(HH, ammo); |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
610 |
|
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
611 |
if (not (HH.Team^.ExtDriven |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
612 |
or (HH.BotLevel > 0))) |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
613 |
or (HH.Team^.Clan^.ClanIndex = LocalClan) |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
614 |
or (GameType = gmtDemo) then |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
615 |
begin |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
616 |
if cnt <> 0 then |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
617 |
s:= trammo[Ammoz[ammo].NameId] + ' (+' + IntToStr(cnt) + ')' |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
618 |
else |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
619 |
s:= trammo[Ammoz[ammo].NameId] + ' (+' + IntToStr(Ammoz[ammo].NumberInCase) + ')'; |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
620 |
AddCaption(s, HH.Team^.Clan^.Color, capgrpAmmoinfo); |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
621 |
|
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
622 |
// show ammo icon |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
623 |
vga:= AddVisualGear(X, Y, vgtAmmo); |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
624 |
if vga <> nil then |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
625 |
vga^.Frame:= Longword(ammo); |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
626 |
end; |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
627 |
end; |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
628 |
|
6581 | 629 |
//////////////////////////////////////////////////////////////////////////////// |
630 |
procedure PickUp(HH, Gear: PGear); |
|
631 |
var s: shortstring; |
|
7406
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
632 |
i: LongInt; |
6581 | 633 |
vga: PVisualGear; |
7406
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
634 |
ag, gi: PGear; |
6581 | 635 |
begin |
636 |
Gear^.Message:= gmDestroy; |
|
637 |
if (Gear^.Pos and posCaseExplode) <> 0 then |
|
638 |
if (Gear^.Pos and posCasePoison) <> 0 then |
|
639 |
doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, HH^.Hedgehog, EXPLAutoSound + EXPLPoisoned) |
|
640 |
else |
|
641 |
doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, HH^.Hedgehog, EXPLAutoSound) |
|
642 |
else if (Gear^.Pos and posCasePoison) <> 0 then |
|
643 |
doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, HH^.Hedgehog, EXPLAutoSound + EXPLPoisoned + EXPLNoDamage) |
|
644 |
else |
|
645 |
case Gear^.Pos of |
|
646 |
posCaseUtility, |
|
647 |
posCaseAmmo: begin |
|
7597
1ef520fea21c
make cheating a bit easier (mikade insisted). Also, try flipping dust for a bit more variety.
nemo
parents:
7462
diff
changeset
|
648 |
PlaySound(sndShotgunReload); |
7389
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
649 |
if Gear^.AmmoType <> amNothing then |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
650 |
begin |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
651 |
AddPickup(HH^.Hedgehog^, Gear^.AmmoType, Gear^.Power, hwRound(Gear^.X), hwRound(Gear^.Y)); |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
652 |
end |
6581 | 653 |
else |
654 |
begin |
|
7389
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
655 |
// Add spawning here... |
7409 | 656 |
AddRandomness(GameTicks); |
7406
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
657 |
|
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
658 |
gi := GearsList; |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
659 |
while gi <> nil do |
7391
588eabb4b384
Apparently order of multiple getrandom in params is undefined. Also remove broken and pointless getrandom call.
nemo
parents:
7389
diff
changeset
|
660 |
begin |
8030
165aeaaaf445
Call fallers less often. Should hopefully still be about as effective at the intended purpose. Should help loads quite a bit.
nemo
parents:
8003
diff
changeset
|
661 |
if (gi^.Kind = gtGenericFaller) and (gi^.State and gstInvisible <> 0) then |
7406
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
662 |
begin |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
663 |
gi^.Active:= true; |
8030
165aeaaaf445
Call fallers less often. Should hopefully still be about as effective at the intended purpose. Should help loads quite a bit.
nemo
parents:
8003
diff
changeset
|
664 |
gi^.State:= gi^.State or gstTmpFlag; |
7406
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
665 |
gi^.X:= int2hwFloat(GetRandom(rightX-leftX)+leftX); |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
666 |
gi^.Y:= int2hwFloat(GetRandom(LAND_HEIGHT-topY)+topY); |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
667 |
gi^.dX:= _90-(GetRandomf*_360); |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
668 |
gi^.dY:= _90-(GetRandomf*_360) |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
669 |
end; |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7391
diff
changeset
|
670 |
gi := gi^.NextGear |
7391
588eabb4b384
Apparently order of multiple getrandom in params is undefined. Also remove broken and pointless getrandom call.
nemo
parents:
7389
diff
changeset
|
671 |
end; |
7598 | 672 |
ag:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAddAmmo, gstInvisible, _0, _0, GetRandom(125)+25); |
7389
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
673 |
ag^.Pos:= Gear^.Pos; |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
674 |
ag^.Power:= Gear^.Power |
6581 | 675 |
end; |
676 |
end; |
|
677 |
posCaseHealth: begin |
|
7389
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
678 |
PlaySound(sndShotgunReload); |
6581 | 679 |
inc(HH^.Health, Gear^.Health); |
7010
10a0a31804f3
Switch effects to longint for convenience of tracking ice states. I could add a new Hedgehog value, but since we have this effects list being all useless as booleans anyway...
nemo
parents:
6992
diff
changeset
|
680 |
HH^.Hedgehog^.Effects[hePoisoned] := 0; |
6581 | 681 |
str(Gear^.Health, s); |
682 |
s:= '+' + s; |
|
683 |
AddCaption(s, HH^.Hedgehog^.Team^.Clan^.Color, capgrpAmmoinfo); |
|
684 |
RenderHealth(HH^.Hedgehog^); |
|
685 |
RecountTeamHealth(HH^.Hedgehog^.Team); |
|
686 |
||
687 |
i:= 0; |
|
688 |
while i < Gear^.Health do |
|
689 |
begin |
|
690 |
vga:= AddVisualGear(hwRound(HH^.X), hwRound(HH^.Y), vgtStraightShot); |
|
691 |
if vga <> nil then |
|
692 |
with vga^ do |
|
693 |
begin |
|
694 |
Tint:= $00FF00FF; |
|
695 |
State:= ord(sprHealth) |
|
696 |
end; |
|
697 |
inc(i, 5); |
|
698 |
end; |
|
699 |
end; |
|
700 |
end |
|
701 |
end; |
|
702 |
||
703 |
procedure HedgehogStep(Gear: PGear); |
|
704 |
var PrevdX: LongInt; |
|
705 |
CurWeapon: PAmmo; |
|
706 |
begin |
|
6924 | 707 |
CurWeapon:= GetCurAmmoEntry(Gear^.Hedgehog^); |
6581 | 708 |
if ((Gear^.State and (gstAttacking or gstMoving)) = 0) then |
709 |
begin |
|
710 |
if isCursorVisible then |
|
711 |
with Gear^.Hedgehog^ do |
|
712 |
with CurWeapon^ do |
|
713 |
begin |
|
714 |
if (Gear^.Message and gmLeft ) <> 0 then |
|
715 |
Pos:= (Pos - 1 + Ammoz[AmmoType].PosCount) mod Ammoz[AmmoType].PosCount |
|
716 |
else |
|
717 |
if (Gear^.Message and gmRight ) <> 0 then |
|
718 |
Pos:= (Pos + 1) mod Ammoz[AmmoType].PosCount |
|
719 |
else |
|
720 |
exit; |
|
7028 | 721 |
GHStepTicks:= 200; |
6581 | 722 |
exit |
723 |
end; |
|
724 |
||
725 |
if ((Gear^.Message and gmAnimate) <> 0) then |
|
726 |
begin |
|
727 |
Gear^.Message:= 0; |
|
728 |
Gear^.State:= Gear^.State or gstAnimation; |
|
729 |
Gear^.Tag:= Gear^.MsgParam; |
|
730 |
Gear^.Timer:= 0; |
|
731 |
Gear^.Pos:= 0 |
|
732 |
end; |
|
733 |
||
734 |
if ((Gear^.Message and gmLJump ) <> 0) then |
|
735 |
begin |
|
736 |
Gear^.Message:= Gear^.Message and (not gmLJump); |
|
737 |
DeleteCI(Gear); |
|
738 |
if TestCollisionYwithGear(Gear, -1) = 0 then |
|
739 |
if not TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) then |
|
740 |
Gear^.Y:= Gear^.Y - _2 |
|
741 |
else |
|
742 |
if not TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) then |
|
743 |
Gear^.Y:= Gear^.Y - _1; |
|
744 |
if not (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) |
|
745 |
or (TestCollisionYwithGear(Gear, -1) <> 0)) then |
|
746 |
begin |
|
747 |
Gear^.dY:= -_0_15; |
|
748 |
if not cArtillery then |
|
749 |
Gear^.dX:= SignAs(_0_15, Gear^.dX); |
|
750 |
Gear^.State:= Gear^.State or gstMoving or gstHHJumping; |
|
7053 | 751 |
PlaySoundV(sndJump1, Gear^.Hedgehog^.Team^.voicepack); |
6581 | 752 |
exit |
753 |
end; |
|
754 |
end; |
|
755 |
||
756 |
if ((Gear^.Message and gmHJump ) <> 0) then |
|
757 |
begin |
|
758 |
DeleteCI(Gear); |
|
759 |
Gear^.Message:= Gear^.Message and (not gmHJump); |
|
760 |
||
761 |
Gear^.dY:= -_0_2; |
|
762 |
SetLittle(Gear^.dX); |
|
763 |
Gear^.State:= Gear^.State or gstMoving or gstHHJumping; |
|
7053 | 764 |
PlaySoundV(sndJump3, Gear^.Hedgehog^.Team^.voicepack); |
6581 | 765 |
exit |
766 |
end; |
|
767 |
||
768 |
PrevdX:= hwSign(Gear^.dX); |
|
769 |
if (Gear^.Message and gmLeft )<>0 then |
|
770 |
Gear^.dX:= -cLittle else |
|
771 |
if (Gear^.Message and gmRight )<>0 then |
|
7187
aff30d80bd7b
- Allow camera movement while current hedgehog is falling
unc0rr
parents:
7164
diff
changeset
|
772 |
Gear^.dX:= cLittle |
aff30d80bd7b
- Allow camera movement while current hedgehog is falling
unc0rr
parents:
7164
diff
changeset
|
773 |
else exit; |
6581 | 774 |
|
7187
aff30d80bd7b
- Allow camera movement while current hedgehog is falling
unc0rr
parents:
7164
diff
changeset
|
775 |
StepSoundTimer:= cHHStepTicks; |
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7671
diff
changeset
|
776 |
|
7028 | 777 |
GHStepTicks:= cHHStepTicks; |
6581 | 778 |
if PrevdX <> hwSign(Gear^.dX) then |
779 |
begin |
|
780 |
FollowGear:= Gear; |
|
781 |
exit |
|
782 |
end; |
|
783 |
DeleteCI(Gear); // must be after exit!! (see previous line) |
|
784 |
||
785 |
Gear^.Hedgehog^.visStepPos:= (Gear^.Hedgehog^.visStepPos + 1) and 7; |
|
7164
fad64b97947e
Some brainfucking code which greatly reduces number of TestCollision* calls in hedgehog walk routine. Especially helpful to AI optimization. Also fixes some edge cases.
unc0rr
parents:
7069
diff
changeset
|
786 |
|
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7671
diff
changeset
|
787 |
if (not cArtillery) and ((Gear^.Message and gmPrecise) = 0) then |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7671
diff
changeset
|
788 |
MakeHedgehogsStep(Gear); |
6581 | 789 |
|
8576
286ebfcb3d97
workaround for frequent AllHH active call in hedgehog step
nemo
parents:
8574
diff
changeset
|
790 |
SetAllHHToActive(false); |
6581 | 791 |
AddGearCI(Gear) |
792 |
end |
|
793 |
end; |
|
794 |
||
795 |
procedure HedgehogChAngle(HHGear: PGear); |
|
796 |
var da: LongWord; |
|
797 |
begin |
|
798 |
with HHGear^.Hedgehog^ do |
|
799 |
if ((CurAmmoType = amRope) and ((HHGear^.State and (gstMoving or gstHHJumping)) = gstMoving)) |
|
800 |
or ((CurAmmoType = amPortalGun) and ((HHGear^.State and gstMoving) <> 0)) then |
|
801 |
da:= 2 |
|
802 |
else da:= 1; |
|
803 |
||
804 |
if (((HHGear^.Message and gmPrecise) = 0) or ((GameTicks mod 5) = 1)) then |
|
805 |
if ((HHGear^.Message and gmUp) <> 0) and (HHGear^.Angle >= CurMinAngle + da) then |
|
806 |
dec(HHGear^.Angle, da) |
|
807 |
else |
|
808 |
if ((HHGear^.Message and gmDown) <> 0) and (HHGear^.Angle + da <= CurMaxAngle) then |
|
809 |
inc(HHGear^.Angle, da) |
|
810 |
end; |
|
811 |
||
812 |
||
813 |
//////////////////////////////////////////////////////////////////////////////// |
|
814 |
procedure doStepHedgehogMoving(Gear: PGear); |
|
815 |
var isFalling, isUnderwater: boolean; |
|
816 |
land: Word; |
|
817 |
begin |
|
818 |
land:= 0; |
|
819 |
isUnderwater:= cWaterLine < hwRound(Gear^.Y) + Gear^.Radius; |
|
820 |
if Gear^.dX.QWordValue > 8160437862 then |
|
821 |
Gear^.dX.QWordValue:= 8160437862; |
|
822 |
if Gear^.dY.QWordValue > 8160437862 then |
|
823 |
Gear^.dY.QWordValue:= 8160437862; |
|
824 |
||
825 |
if Gear^.Hedgehog^.Unplaced then |
|
826 |
begin |
|
827 |
Gear^.dY:= _0; |
|
828 |
Gear^.dX:= _0; |
|
829 |
Gear^.State:= Gear^.State and (not gstMoving); |
|
830 |
exit |
|
831 |
end; |
|
7426
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7409
diff
changeset
|
832 |
isFalling:= (Gear^.dY.isNegative) or (not TestCollisionYKick(Gear, 1)); |
6581 | 833 |
if isFalling then |
834 |
begin |
|
835 |
if (Gear^.dY.isNegative) and TestCollisionYKick(Gear, -1) then |
|
836 |
Gear^.dY:= _0; |
|
837 |
Gear^.State:= Gear^.State or gstMoving; |
|
838 |
if (CurrentHedgehog^.Gear = Gear) |
|
839 |
and (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > _0_003) then |
|
840 |
begin |
|
7187
aff30d80bd7b
- Allow camera movement while current hedgehog is falling
unc0rr
parents:
7164
diff
changeset
|
841 |
// TODO: why so aggressive at setting FollowGear when falling? |
6581 | 842 |
FollowGear:= Gear; |
843 |
end; |
|
844 |
if isUnderwater then |
|
845 |
Gear^.dY:= Gear^.dY + cGravity / _2 |
|
846 |
else |
|
847 |
begin |
|
848 |
Gear^.dY:= Gear^.dY + cGravity; |
|
849 |
// this set of circumstances could be less complex if jumping was more clearly identified |
|
850 |
if ((GameFlags and gfMoreWind) <> 0) and (((Gear^.Damage <> 0) |
|
851 |
or ((CurAmmoGear <> nil) and ((CurAmmoGear^.AmmoType = amJetpack) or (CurAmmoGear^.AmmoType = amBirdy))) |
|
852 |
or ((Gear^.dY.QWordValue + Gear^.dX.QWordValue) > _0_55.QWordValue))) then |
|
853 |
Gear^.dX := Gear^.dX + cWindSpeed / Gear^.Density |
|
854 |
end |
|
855 |
end |
|
856 |
else |
|
857 |
begin |
|
858 |
land:= TestCollisionYwithGear(Gear, 1); |
|
859 |
if ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) < _0_55.QWordValue) and ((land and lfIce) = 0) |
|
860 |
and ((Gear^.State and gstHHJumping) <> 0) then |
|
861 |
SetLittle(Gear^.dX); |
|
862 |
||
863 |
if not Gear^.dY.isNegative then |
|
864 |
begin |
|
865 |
CheckHHDamage(Gear); |
|
866 |
||
867 |
if ((Gear^.State and gstHHHJump) <> 0) and (not cArtillery) |
|
868 |
and (Gear^.dX.QWordValue < _0_02.QWordValue) then |
|
869 |
Gear^.dX.isNegative:= not Gear^.dX.isNegative; // landing after high jump |
|
870 |
Gear^.State:= Gear^.State and (not (gstHHJumping or gstHHHJump)); |
|
871 |
Gear^.dY:= _0; |
|
872 |
end |
|
873 |
else |
|
874 |
Gear^.dY:= Gear^.dY + cGravity; |
|
875 |
||
876 |
if ((Gear^.State and gstMoving) <> 0) then |
|
877 |
begin |
|
878 |
if land and lfIce <> 0 then |
|
879 |
begin |
|
880 |
Gear^.dX:= Gear^.dX * (_1 - (_1 - Gear^.Friction) / _2) |
|
881 |
end |
|
882 |
else |
|
883 |
Gear^.dX:= Gear^.dX * Gear^.Friction; |
|
884 |
end |
|
885 |
end; |
|
886 |
||
887 |
if (Gear^.State <> 0) then |
|
888 |
DeleteCI(Gear); |
|
889 |
||
890 |
if isUnderwater then |
|
891 |
begin |
|
892 |
Gear^.dY:= Gear^.dY * _0_999; |
|
893 |
Gear^.dX:= Gear^.dX * _0_999; |
|
894 |
end; |
|
895 |
||
896 |
if (Gear^.State and gstMoving) <> 0 then |
|
897 |
if TestCollisionXKick(Gear, hwSign(Gear^.dX)) then |
|
898 |
if not isFalling then |
|
899 |
if hwAbs(Gear^.dX) > _0_01 then |
|
900 |
if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -1, hwSign(Gear^.dX)) then |
|
901 |
begin |
|
902 |
Gear^.X:= Gear^.X + Gear^.dX; |
|
903 |
Gear^.dX:= Gear^.dX * _0_96; |
|
904 |
Gear^.Y:= Gear^.Y - _1 |
|
905 |
end |
|
906 |
else |
|
907 |
if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -2, hwSign(Gear^.dX)) then |
|
908 |
begin |
|
909 |
Gear^.X:= Gear^.X + Gear^.dX; |
|
910 |
Gear^.dX:= Gear^.dX * _0_93; |
|
911 |
Gear^.Y:= Gear^.Y - _2 |
|
912 |
end |
|
913 |
else |
|
914 |
if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -3, hwSign(Gear^.dX)) then |
|
915 |
begin |
|
916 |
Gear^.X:= Gear^.X + Gear^.dX; |
|
917 |
Gear^.dX:= Gear^.dX * _0_9 ; |
|
918 |
Gear^.Y:= Gear^.Y - _3 |
|
919 |
end |
|
920 |
else |
|
921 |
if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -4, hwSign(Gear^.dX)) then |
|
922 |
begin |
|
923 |
Gear^.X:= Gear^.X + Gear^.dX; |
|
924 |
Gear^.dX:= Gear^.dX * _0_87; |
|
925 |
Gear^.Y:= Gear^.Y - _4 |
|
926 |
end |
|
927 |
else |
|
928 |
if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -5, hwSign(Gear^.dX)) then |
|
929 |
begin |
|
930 |
Gear^.X:= Gear^.X + Gear^.dX; |
|
931 |
Gear^.dX:= Gear^.dX * _0_84; |
|
932 |
Gear^.Y:= Gear^.Y - _5 |
|
933 |
end |
|
934 |
else |
|
935 |
if hwAbs(Gear^.dX) > _0_02 then |
|
936 |
Gear^.dX:= -Gear^.Elasticity * Gear^.dX |
|
937 |
else |
|
938 |
begin |
|
939 |
Gear^.State:= Gear^.State and (not gstMoving); |
|
940 |
while TestCollisionYWithGear(Gear,1) = 0 do |
|
941 |
Gear^.Y:= Gear^.Y+_1; |
|
942 |
SetLittle(Gear^.dX) |
|
943 |
end |
|
944 |
else |
|
945 |
begin |
|
946 |
Gear^.State:= Gear^.State and (not gstMoving); |
|
947 |
while TestCollisionYWithGear(Gear,1) = 0 do |
|
948 |
Gear^.Y:= Gear^.Y+_1; |
|
949 |
SetLittle(Gear^.dX) |
|
950 |
end |
|
951 |
else if (hwAbs(Gear^.dX) > cLittle) |
|
952 |
and ((Gear^.State and gstHHJumping) = 0) then |
|
953 |
Gear^.dX:= -Gear^.Elasticity * Gear^.dX |
|
954 |
else |
|
955 |
SetLittle(Gear^.dX); |
|
956 |
||
957 |
if (not isFalling) |
|
7362
53bcfc714cb3
Fix rare condition when hog's gear stucks in an infinite loop which adds 1 to its Y coordinate not checking for drowning
unc0rr
parents:
7339
diff
changeset
|
958 |
and (hwAbs(Gear^.dX) + hwAbs(Gear^.dY) < _0_03) then |
6581 | 959 |
begin |
960 |
Gear^.State:= Gear^.State and (not gstWinner); |
|
961 |
Gear^.State:= Gear^.State and (not gstMoving); |
|
7426
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7409
diff
changeset
|
962 |
while (TestCollisionYWithGear(Gear,1) = 0) and (not CheckGearDrowning(Gear)) do |
6581 | 963 |
Gear^.Y:= Gear^.Y+_1; |
964 |
SetLittle(Gear^.dX); |
|
965 |
Gear^.dY:= _0 |
|
966 |
end |
|
967 |
else |
|
968 |
Gear^.State:= Gear^.State or gstMoving; |
|
969 |
||
970 |
if (Gear^.State and gstMoving) <> 0 then |
|
971 |
begin |
|
972 |
Gear^.State:= Gear^.State and (not gstAnimation); |
|
973 |
// ARTILLERY but not being moved by explosions |
|
974 |
Gear^.X:= Gear^.X + Gear^.dX; |
|
975 |
Gear^.Y:= Gear^.Y + Gear^.dY; |
|
976 |
if (not Gear^.dY.isNegative) and (not TestCollisionYKick(Gear, 1)) |
|
977 |
and TestCollisionYwithXYShift(Gear, 0, 1, 1) then |
|
978 |
begin |
|
979 |
CheckHHDamage(Gear); |
|
980 |
Gear^.dY:= _0; |
|
981 |
Gear^.Y:= Gear^.Y + _1 |
|
982 |
end; |
|
983 |
CheckGearDrowning(Gear); |
|
984 |
// hide target cursor if current hog is drowning |
|
985 |
if (Gear^.State and gstDrowning) <> 0 then |
|
986 |
if (CurrentHedgehog^.Gear = Gear) then |
|
987 |
isCursorVisible:= false |
|
988 |
end; |
|
7623
addc5b262617
isZero appears to be never used. Use it in a few obvious cases and add web variant.
nemo
parents:
7615
diff
changeset
|
989 |
if (not isZero(Gear^.dY)) and (Gear^.FlightTime > 0) and ((GameFlags and gfLowGravity) = 0) then |
6581 | 990 |
begin |
991 |
inc(Gear^.FlightTime); |
|
8003 | 992 |
if (Gear^.FlightTime > 1500) and ((hwRound(Gear^.X) < LongInt(leftX)-250) or (hwRound(Gear^.X) > LongInt(rightX)+250)) then |
6581 | 993 |
begin |
7763 | 994 |
Gear^.FlightTime:= 0; |
6581 | 995 |
AddCaption(GetEventString(eidHomerun), cWhiteColor, capgrpMessage); |
996 |
PlaySound(sndHomerun) |
|
997 |
end; |
|
998 |
end |
|
999 |
else |
|
1000 |
begin |
|
1001 |
uStats.hedgehogFlight(Gear, Gear^.FlightTime); |
|
1002 |
Gear^.FlightTime:= 0; |
|
1003 |
end; |
|
1004 |
||
1005 |
end; |
|
1006 |
||
1007 |
procedure doStepHedgehogDriven(HHGear: PGear); |
|
1008 |
var t: PGear; |
|
1009 |
wasJumping: boolean; |
|
1010 |
Hedgehog: PHedgehog; |
|
1011 |
begin |
|
1012 |
Hedgehog:= HHGear^.Hedgehog; |
|
8658 | 1013 |
if not isInMultiShoot then |
1014 |
AllInactive:= false |
|
1015 |
else if Hedgehog^.CurAmmoType in [amShotgun, amDEagle, amSniperRifle] then |
|
1016 |
HHGear^.Message:= 0; |
|
6581 | 1017 |
|
1018 |
if (TurnTimeLeft = 0) or (HHGear^.Damage > 0) then |
|
1019 |
begin |
|
8494
53b91a602955
Cleaver tweaks based on feedback. Nerf damage, shrink radius. This means cleaver will embed into ground quite a bit further.
nemo
parents:
8493
diff
changeset
|
1020 |
if (Hedgehog^.CurAmmoType = amKnife) then |
53b91a602955
Cleaver tweaks based on feedback. Nerf damage, shrink radius. This means cleaver will embed into ground quite a bit further.
nemo
parents:
8493
diff
changeset
|
1021 |
LoadHedgehogHat(Hedgehog^, Hedgehog^.Hat); |
6581 | 1022 |
if TagTurnTimeLeft = 0 then |
1023 |
TagTurnTimeLeft:= TurnTimeLeft; |
|
1024 |
TurnTimeLeft:= 0; |
|
1025 |
isCursorVisible:= false; |
|
1026 |
HHGear^.State:= HHGear^.State and (not (gstHHDriven or gstAnimation or gstAttacking)); |
|
1027 |
AttackBar:= 0; |
|
1028 |
if HHGear^.Damage > 0 then |
|
1029 |
HHGear^.State:= HHGear^.State and (not (gstHHJumping or gstHHHJump)); |
|
1030 |
exit |
|
1031 |
end; |
|
1032 |
||
1033 |
if (HHGear^.State and gstAnimation) <> 0 then |
|
1034 |
begin |
|
1035 |
HHGear^.Message:= 0; |
|
1036 |
if (HHGear^.Pos = Wavez[TWave(HHGear^.Tag)].VoiceDelay) and (HHGear^.Timer = 0) then |
|
7053 | 1037 |
PlaySoundV(Wavez[TWave(HHGear^.Tag)].Voice, Hedgehog^.Team^.voicepack); |
6581 | 1038 |
inc(HHGear^.Timer); |
1039 |
if HHGear^.Timer = Wavez[TWave(HHGear^.Tag)].Interval then |
|
1040 |
begin |
|
1041 |
HHGear^.Timer:= 0; |
|
1042 |
inc(HHGear^.Pos); |
|
1043 |
if HHGear^.Pos = Wavez[TWave(HHGear^.Tag)].FramesCount then |
|
1044 |
HHGear^.State:= HHGear^.State and (not gstAnimation) |
|
1045 |
end; |
|
1046 |
exit |
|
1047 |
end; |
|
1048 |
||
1049 |
if ((HHGear^.State and gstMoving) <> 0) |
|
7028 | 1050 |
or (GHStepTicks = cHHStepTicks) |
6581 | 1051 |
or (CurAmmoGear <> nil) then // we are moving |
1052 |
begin |
|
1053 |
with Hedgehog^ do |
|
1054 |
if (CurAmmoGear = nil) |
|
1055 |
and (HHGear^.dY > _0_39) |
|
1056 |
and (CurAmmoType = amParachute) then |
|
1057 |
HHGear^.Message:= HHGear^.Message or gmAttack; |
|
1058 |
// check for case with ammo |
|
1059 |
t:= CheckGearNear(HHGear, gtCase, 36, 36); |
|
1060 |
if t <> nil then |
|
1061 |
PickUp(HHGear, t) |
|
1062 |
end; |
|
1063 |
||
1064 |
if (CurAmmoGear = nil) then |
|
1065 |
if (((HHGear^.Message and gmAttack) <> 0) |
|
1066 |
or ((HHGear^.State and gstAttacking) <> 0)) then |
|
1067 |
Attack(HHGear) // should be before others to avoid desync with '/put' msg and changing weapon msgs |
|
1068 |
else |
|
1069 |
else |
|
1070 |
with Hedgehog^ do |
|
1071 |
if ((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_AltAttack) <> 0) |
|
1072 |
and ((HHGear^.Message and gmLJump) <> 0) |
|
1073 |
and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AltUse) <> 0) then |
|
1074 |
begin |
|
1075 |
Attack(HHGear); |
|
1076 |
HHGear^.Message:= HHGear^.Message and (not gmLJump) |
|
1077 |
end; |
|
1078 |
||
1079 |
if (CurAmmoGear = nil) |
|
7956
61da79e83330
Causes AI fail. Needs testing 'cause at some point, I thought this was needed for portal, I don't remember *why*
nemo
parents:
7832
diff
changeset
|
1080 |
or ((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_AltAttack) <> 0) then |
6581 | 1081 |
begin |
1082 |
if ((HHGear^.Message and gmSlot) <> 0) then |
|
1083 |
if ChangeAmmo(HHGear) then ApplyAmmoChanges(Hedgehog^); |
|
1084 |
||
1085 |
if ((HHGear^.Message and gmWeapon) <> 0) then |
|
1086 |
HHSetWeapon(HHGear); |
|
1087 |
||
1088 |
if ((HHGear^.Message and gmTimer) <> 0) then |
|
1089 |
HHSetTimer(HHGear); |
|
1090 |
end; |
|
1091 |
||
1092 |
if CurAmmoGear <> nil then |
|
1093 |
begin |
|
1094 |
CurAmmoGear^.Message:= HHGear^.Message; |
|
1095 |
exit |
|
1096 |
end; |
|
1097 |
||
1098 |
HedgehogChAngle(HHGear); |
|
1099 |
||
1100 |
if (HHGear^.State and gstMoving) <> 0 then |
|
1101 |
begin |
|
1102 |
wasJumping:= ((HHGear^.State and gstHHJumping) <> 0); |
|
1103 |
||
1104 |
if ((HHGear^.Message and gmHJump) <> 0) and wasJumping and ((HHGear^.State and gstHHHJump) = 0) then |
|
1105 |
if (not (hwAbs(HHGear^.dX) > cLittle)) and (HHGear^.dY < -_0_02) then |
|
1106 |
begin |
|
1107 |
HHGear^.State:= HHGear^.State or gstHHHJump; |
|
1108 |
HHGear^.dY:= -_0_25; |
|
1109 |
if not cArtillery then |
|
1110 |
HHGear^.dX:= -SignAs(_0_02, HHGear^.dX); |
|
7053 | 1111 |
PlaySoundV(sndJump2, Hedgehog^.Team^.voicepack) |
6581 | 1112 |
end; |
1113 |
||
1114 |
HHGear^.Message:= HHGear^.Message and (not (gmLJump or gmHJump)); |
|
1115 |
||
1116 |
if (not cArtillery) and wasJumping and TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then |
|
1117 |
SetLittle(HHGear^.dX); |
|
1118 |
||
1119 |
if Hedgehog^.Gear <> nil then |
|
1120 |
doStepHedgehogMoving(HHGear); |
|
1121 |
||
1122 |
if ((HHGear^.State and (gstMoving or gstDrowning)) = 0) then |
|
1123 |
begin |
|
1124 |
AddGearCI(HHGear); |
|
1125 |
if wasJumping then |
|
7028 | 1126 |
GHStepTicks:= 410 |
6581 | 1127 |
else |
7028 | 1128 |
GHStepTicks:= 95 |
6581 | 1129 |
end; |
1130 |
exit |
|
1131 |
end; |
|
1132 |
||
8562
d9d1cb650ff8
Restore freezing hedgehog for shotgun, sniper rifle and deagle to make unc0rr happy. You'll still be able to get away after throwing cleaver and sticky bomb tho.
nemo
parents:
8553
diff
changeset
|
1133 |
if not(isInMultiShoot and (Hedgehog^.CurAmmoType in [amShotgun, amDEagle, amSniperRifle])) and (Hedgehog^.Gear <> nil) then |
6581 | 1134 |
begin |
7028 | 1135 |
if GHStepTicks > 0 then |
1136 |
dec(GHStepTicks); |
|
1137 |
if (GHStepTicks = 0) then |
|
6581 | 1138 |
HedgehogStep(HHGear) |
1139 |
end |
|
1140 |
end; |
|
1141 |
||
1142 |
//////////////////////////////////////////////////////////////////////////////// |
|
1143 |
procedure doStepHedgehogFree(Gear: PGear); |
|
1144 |
var prevState: Longword; |
|
1145 |
begin |
|
1146 |
prevState:= Gear^.State; |
|
1147 |
||
1148 |
doStepHedgehogMoving(Gear); |
|
1149 |
||
1150 |
if (Gear^.State and (gstMoving or gstDrowning)) <> 0 then |
|
1151 |
begin |
|
1152 |
if Gear^.Damage > 0 then |
|
1153 |
CalcRotationDirAngle(Gear); |
|
1154 |
AllInactive:= false; |
|
1155 |
exit |
|
1156 |
end; |
|
1157 |
||
1158 |
if (Gear^.Health = 0) then |
|
1159 |
begin |
|
1160 |
if PrvInactive or ((GameFlags and gfInfAttack) <> 0) then |
|
1161 |
begin |
|
1162 |
Gear^.Timer:= 0; |
|
1163 |
FollowGear:= Gear; |
|
1164 |
PrvInactive:= false; |
|
1165 |
AllInactive:= false; |
|
1166 |
||
1167 |
if (Gear^.State and gstHHGone) = 0 then |
|
1168 |
begin |
|
7010
10a0a31804f3
Switch effects to longint for convenience of tracking ice states. I could add a new Hedgehog value, but since we have this effects list being all useless as booleans anyway...
nemo
parents:
6992
diff
changeset
|
1169 |
Gear^.Hedgehog^.Effects[hePoisoned] := 0; |
10a0a31804f3
Switch effects to longint for convenience of tracking ice states. I could add a new Hedgehog value, but since we have this effects list being all useless as booleans anyway...
nemo
parents:
6992
diff
changeset
|
1170 |
if Gear^.Hedgehog^.Effects[heResurrectable] <> 0 then |
6581 | 1171 |
begin |
1172 |
ResurrectHedgehog(Gear); |
|
1173 |
end |
|
1174 |
else |
|
1175 |
begin |
|
1176 |
Gear^.State:= (Gear^.State or gstHHDeath) and (not gstAnimation); |
|
1177 |
Gear^.doStep:= @doStepHedgehogDead; |
|
1178 |
// Death message |
|
1179 |
AddCaption(Format(GetEventString(eidDied), Gear^.Hedgehog^.Name), cWhiteColor, capgrpMessage); |
|
1180 |
end; |
|
1181 |
end |
|
1182 |
else |
|
1183 |
begin |
|
1184 |
Gear^.State:= Gear^.State and (not gstAnimation); |
|
1185 |
Gear^.doStep:= @doStepHedgehogGone; |
|
1186 |
||
1187 |
// Gone message |
|
1188 |
AddCaption(Format(GetEventString(eidGone), Gear^.Hedgehog^.Name), cWhiteColor, capgrpMessage); |
|
1189 |
end |
|
1190 |
end; |
|
1191 |
exit |
|
1192 |
end; |
|
1193 |
||
1194 |
if ((Gear^.State and gstWait) = 0) and |
|
1195 |
(prevState <> Gear^.State) then |
|
1196 |
begin |
|
1197 |
Gear^.State:= Gear^.State or gstWait; |
|
1198 |
Gear^.Timer:= 150 |
|
1199 |
end |
|
1200 |
else |
|
1201 |
begin |
|
1202 |
if Gear^.Timer = 0 then |
|
1203 |
begin |
|
1204 |
Gear^.State:= Gear^.State and (not (gstWait or gstLoser or gstWinner or gstAttacked or gstNotKickable or gstHHChooseTarget)); |
|
8563
4d9d8287e601
Trying to improve rendering, sliding and thawing. Messing around w/ making fire thaw faster.
nemo
parents:
8560
diff
changeset
|
1205 |
if Gear^.Hedgehog^.Effects[heFrozen] = 0 then Gear^.Active:= false; |
6581 | 1206 |
AddGearCI(Gear); |
1207 |
exit |
|
1208 |
end |
|
1209 |
else dec(Gear^.Timer) |
|
1210 |
end; |
|
1211 |
||
1212 |
AllInactive:= false |
|
1213 |
end; |
|
1214 |
||
8574 | 1215 |
procedure CheckIce(Gear: PGear); inline; |
6581 | 1216 |
(* |
1217 |
var x,y,tx,ty: LongInt; |
|
1218 |
tdX, tdY, slope: hwFloat; |
|
1219 |
land: Word; *) |
|
1220 |
var slope: hwFloat; |
|
1221 |
begin |
|
8574 | 1222 |
if (Gear^.Message and (gmAllStoppable or gmLJump or gmHJump) = 0) |
1223 |
and (Gear^.State and (gstHHJumping or gstHHHJump or gstAttacking) = 0) |
|
8633 | 1224 |
and ((Gear^.Hedgehog = nil) or ((Gear^.Hedgehog^.Effects[heFrozen] = 0) or (Gear^.Hedgehog^.Effects[heFrozen] > 255))) |
8616
c4536e98c712
Safety check. The main place this can be a problem is on a mild bowl w/ multiple hogs. Could possibly add a hog collision check in here.
nemo
parents:
8589
diff
changeset
|
1225 |
and (not Gear^.dY.isNegative) and (TurnTimeLeft > 0) and (TestCollisionYwithGear(Gear, 1) and lfIce <> 0) then |
8574 | 1226 |
begin |
1227 |
slope:= CalcSlopeBelowGear(Gear); |
|
1228 |
if slope.QWordValue > 730144440 then // ignore mild slopes |
|
1229 |
begin |
|
1230 |
Gear^.dX:=Gear^.dX+slope*cGravity*_256; |
|
1231 |
Gear^.State:= Gear^.State or gstMoving |
|
1232 |
end |
|
1233 |
end; |
|
1234 |
(* |
|
1235 |
x:= hwRound(Gear^.X); |
|
1236 |
y:= hwRound(Gear^.Y); |
|
1237 |
AddVisualGear(x, y, vgtSmokeTrace); |
|
1238 |
AddVisualGear(x - hwRound(_5*slope), y + hwRound(_5*slope), vgtSmokeTrace); |
|
1239 |
AddVisualGear(x + hwRound(_5*slope), y - hwRound(_5*slope), vgtSmokeTrace); |
|
1240 |
AddVisualGear(x - hwRound(_20 * slope), y + hwRound(_20 * slope), vgtSmokeTrace); |
|
1241 |
AddVisualGear(x + hwRound(_20 * slope), y - hwRound(_20 * slope), vgtSmokeTrace); |
|
1242 |
AddVisualGear(x - hwRound(_30 * slope), y + hwRound(_30 * slope), vgtSmokeTrace); |
|
1243 |
AddVisualGear(x + hwRound(_30 * slope), y - hwRound(_30 * slope), vgtSmokeTrace); |
|
1244 |
AddVisualGear(x - hwRound(_40 * slope), y + hwRound(_40 * slope), vgtSmokeTrace); |
|
1245 |
AddVisualGear(x + hwRound(_40 * slope), y - hwRound(_40 * slope), vgtSmokeTrace); |
|
1246 |
AddVisualGear(x - hwRound(_50 * slope), y + hwRound(_50 * slope), vgtSmokeTrace); |
|
1247 |
AddVisualGear(x + hwRound(_50 * slope), y - hwRound(_50 * slope), vgtSmokeTrace); *) |
|
1248 |
end; |
|
1249 |
||
1250 |
//////////////////////////////////////////////////////////////////////////////// |
|
1251 |
procedure doStepHedgehog(Gear: PGear); |
|
1252 |
begin |
|
7389
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7375
diff
changeset
|
1253 |
CheckSum:= CheckSum xor Gear^.Hedgehog^.BotLevel; |
6581 | 1254 |
if (Gear^.Message and gmDestroy) <> 0 then |
1255 |
begin |
|
1256 |
DeleteGear(Gear); |
|
1257 |
exit |
|
1258 |
end; |
|
8576
286ebfcb3d97
workaround for frequent AllHH active call in hedgehog step
nemo
parents:
8574
diff
changeset
|
1259 |
if GameTicks mod 100 = 0 then CheckIce(Gear); |
8655
9fa380a18a65
At multiple requests, change ice to be turn based. This is a more modest adjustment of existing code, that can be fairly easily flagged or reverted if desired. It also allows scripts to extend freezing, and preserves fire melting.
nemo
parents:
8633
diff
changeset
|
1260 |
(* |
8563
4d9d8287e601
Trying to improve rendering, sliding and thawing. Messing around w/ making fire thaw faster.
nemo
parents:
8560
diff
changeset
|
1261 |
if Gear^.Hedgehog^.Effects[heFrozen] > 0 then |
4d9d8287e601
Trying to improve rendering, sliding and thawing. Messing around w/ making fire thaw faster.
nemo
parents:
8560
diff
changeset
|
1262 |
begin |
8632
b5ed76d2a1f9
Make hogs thaw only on enemy turns, make timebox counter decrement only on your turn, adjust knock for frozen hogs, increase damage on frozen hogs, make freezer fuel only reduce when not adjusting angle.
nemo
parents:
8631
diff
changeset
|
1263 |
if (Gear^.Hedgehog^.Effects[heFrozen] > 256) and (CurrentHedgehog^.Team^.Clan <> Gear^.Hedgehog^.Team^.Clan) then |
8563
4d9d8287e601
Trying to improve rendering, sliding and thawing. Messing around w/ making fire thaw faster.
nemo
parents:
8560
diff
changeset
|
1264 |
dec(Gear^.Hedgehog^.Effects[heFrozen]) |
4d9d8287e601
Trying to improve rendering, sliding and thawing. Messing around w/ making fire thaw faster.
nemo
parents:
8560
diff
changeset
|
1265 |
else if GameTicks mod 10 = 0 then |
4d9d8287e601
Trying to improve rendering, sliding and thawing. Messing around w/ making fire thaw faster.
nemo
parents:
8560
diff
changeset
|
1266 |
dec(Gear^.Hedgehog^.Effects[heFrozen]) |
4d9d8287e601
Trying to improve rendering, sliding and thawing. Messing around w/ making fire thaw faster.
nemo
parents:
8560
diff
changeset
|
1267 |
end; |
8655
9fa380a18a65
At multiple requests, change ice to be turn based. This is a more modest adjustment of existing code, that can be fairly easily flagged or reverted if desired. It also allows scripts to extend freezing, and preserves fire melting.
nemo
parents:
8633
diff
changeset
|
1268 |
*) |
9fa380a18a65
At multiple requests, change ice to be turn based. This is a more modest adjustment of existing code, that can be fairly easily flagged or reverted if desired. It also allows scripts to extend freezing, and preserves fire melting.
nemo
parents:
8633
diff
changeset
|
1269 |
if (GameTicks mod 10 = 0) and (Gear^.Hedgehog^.Effects[heFrozen] > 0) and (Gear^.Hedgehog^.Effects[heFrozen] < 256) then |
9fa380a18a65
At multiple requests, change ice to be turn based. This is a more modest adjustment of existing code, that can be fairly easily flagged or reverted if desired. It also allows scripts to extend freezing, and preserves fire melting.
nemo
parents:
8633
diff
changeset
|
1270 |
dec(Gear^.Hedgehog^.Effects[heFrozen]); |
6581 | 1271 |
if (Gear^.State and gstHHDriven) = 0 then |
1272 |
doStepHedgehogFree(Gear) |
|
1273 |
else |
|
1274 |
begin |
|
1275 |
with Gear^.Hedgehog^ do |
|
1276 |
if Team^.hasGone then |
|
1277 |
TeamGoneEffect(Team^) |
|
1278 |
else |
|
1279 |
doStepHedgehogDriven(Gear) |
|
1280 |
end; |
|
1281 |
end; |
|
1282 |
||
1283 |
end. |