author  unc0rr 
Sat, 07 Mar 2009 17:42:54 +0000  
changeset 1865  ebc6dfca60d4 
parent 1863  705c01571196 
child 1867  2fc0e1e39b11 
permissions  rwrr 
4  1 
(* 
1066  2 
* Hedgewars, a free turn based strategy game 
1689  3 
* Copyright (c) 20042009 Andrey Korotaev <unC0Rr@gmail.com> 
4  4 
* 
183  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 

4  8 
* 
183  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. 

4  13 
* 
183  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 021111307, USA 

4  17 
*) 
18 

19 
unit uGears; 

20 
interface 

351  21 
uses SDLh, uConsts, uFloat; 
4  22 
{$INCLUDE options.inc} 
23 
const AllInactive: boolean = false; 

868  24 
PrvInactive: boolean = false; 
4  25 

26 
type PGear = ^TGear; 

1259  27 
TGearStepProcedure = procedure (Gear: PGear); 
28 
TGear = record 

29 
NextGear, PrevGear: PGear; 

30 
Active: Boolean; 

1849  31 
Invulnerable: Boolean; 
1259  32 
Ammo : PAmmo; 
33 
State : Longword; 

34 
X : hwFloat; 

35 
Y : hwFloat; 

36 
dX: hwFloat; 

37 
dY: hwFloat; 

38 
Kind: TGearType; 

39 
Pos: Longword; 

40 
doStep: TGearStepProcedure; 

41 
Radius: LongInt; 

42 
Angle, Power : Longword; 

43 
DirAngle: real; 

44 
Timer : LongWord; 

45 
Elasticity: hwFloat; 

46 
Friction : hwFloat; 

47 
Message, MsgParam : Longword; 

48 
Hedgehog: pointer; 

49 
Health, Damage: LongInt; 

50 
CollisionIndex: LongInt; 

51 
Tag: LongInt; 

52 
Tex: PTexture; 

53 
Z: Longword; 

54 
IntersectGear: PGear; 

55 
TriggerId: Longword; 

1503  56 
uid: Longword; 
1259  57 
end; 
4  58 

371  59 
function AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear; 
4  60 
procedure ProcessGears; 
1849  61 
procedure ResetUtilities; 
4  62 
procedure SetAllToActive; 
63 
procedure SetAllHHToActive; 

956  64 
procedure DrawGears; 
4  65 
procedure FreeGearsList; 
10  66 
procedure AddMiscGears; 
4  67 
procedure AssignHHCoords; 
294  68 
procedure InsertGearToList(Gear: PGear); 
69 
procedure RemoveGearFromList(Gear: PGear); 

4  70 

71 
var CurAmmoGear: PGear = nil; 

68  72 
GearsList: PGear = nil; 
307  73 
KilledHHs: Longword = 0; 
70  74 

4  75 
implementation 
81  76 
uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions, 
1259  77 
uLand, uIO, uLandGraphics, uAIMisc, uLocale, uAI, uAmmos, uTriggers, GL, 
78 
uStats, uVisualGears; 

789  79 

1207
ceaab010269e
Some adjusting... it still doesn't solve problem fully
unc0rr
parents:
1200
diff
changeset

80 
const MAXROPEPOINTS = 384; 
68  81 
var RopePoints: record 
4  82 
Count: Longword; 
776
8fc7e59d9cb4
Convert the rest of rotated sprites to be rotated by OpenGL
unc0rr
parents:
775
diff
changeset

83 
HookAngle: GLfloat; 
789  84 
ar: array[0..MAXROPEPOINTS] of record 
351  85 
X, Y: hwFloat; 
86 
dLen: hwFloat; 

4  87 
b: boolean; 
88 
end; 

89 
end; 

90 

1515  91 
procedure DeleteGear(Gear: PGear); forward; 
371  92 
procedure doMakeExplosion(X, Y, Radius: LongInt; Mask: LongWord); forward; 
93 
procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt); forward; 

1433  94 
//procedure AmmoFlameWork(Ammo: PGear); forward; 
371  95 
function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear; forward; 
15  96 
procedure SpawnBoxOfSmth; forward; 
32
78bff13b11c0
With this patch the game doesn't crash when gaming by net
unc0rr
parents:
24
diff
changeset

97 
procedure AfterAttack; forward; 
1515  98 
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); forward; 
302  99 
procedure HedgehogStep(Gear: PGear); forward; 
1528  100 
procedure doStepHedgehogMoving(Gear: PGear); forward; 
303
1659c4aad5ab
Now blow torch angle can be changed during blowing :)
unc0rr
parents:
302
diff
changeset

101 
procedure HedgehogChAngle(Gear: PGear); forward; 
506  102 
procedure ShotgunShot(Gear: PGear); forward; 
1689  103 
procedure PickUp(HH, Gear: PGear); forward; 
4  104 

105 
{$INCLUDE GSHandlers.inc} 

106 
{$INCLUDE HHHandlers.inc} 

107 

108 
const doStepHandlers: array[TGearType] of TGearStepProcedure = ( 

1259  109 
@doStepBomb, 
110 
@doStepHedgehog, 

111 
@doStepGrenade, 

112 
@doStepHealthTag, 

113 
@doStepGrave, 

114 
@doStepUFO, 

115 
@doStepShotgunShot, 

116 
@doStepPickHammer, 

117 
@doStepRope, 

118 
@doStepSmokeTrace, 

119 
@doStepExplosion, 

120 
@doStepMine, 

121 
@doStepCase, 

122 
@doStepDEagleShot, 

123 
@doStepDynamite, 

124 
@doStepTeamHealthSorter, 

125 
@doStepBomb, 

126 
@doStepCluster, 

127 
@doStepShover, 

128 
@doStepFlame, 

129 
@doStepFirePunch, 

130 
@doStepActionTimer, 

131 
@doStepActionTimer, 

132 
@doStepActionTimer, 

133 
@doStepParachute, 

134 
@doStepAirAttack, 

135 
@doStepAirBomb, 

136 
@doStepBlowTorch, 

137 
@doStepGirder, 

138 
@doStepTeleport, 

139 
@doStepSwitcher, 

140 
@doStepCase, 

141 
@doStepMortar, 

142 
@doStepWhip, 

143 
@doStepKamikaze, 

144 
@doStepCake, 

1261  145 
@doStepSeduction, 
1279  146 
@doStepWatermelon, 
1263  147 
@doStepCluster, 
148 
@doStepBomb, 

1298  149 
@doStepSmokeTrace, 
1573  150 
@doStepWaterUp, 
1601  151 
@doStepDrill, 
152 
@doStepBallgun, 

1689  153 
@doStepBomb, 
154 
@doStepRCPlane 

1259  155 
); 
4  156 

294  157 
procedure InsertGearToList(Gear: PGear); 
803  158 
var tmp, ptmp: PGear; 
294  159 
begin 
160 
if GearsList = nil then 

1505  161 
GearsList:= Gear 
162 
else begin 

163 
tmp:= GearsList; 

164 
ptmp:= GearsList; 

165 
while (tmp <> nil) and (tmp^.Z <= Gear^.Z) do 

166 
begin 

167 
ptmp:= tmp; 

168 
tmp:= tmp^.NextGear 

169 
end; 

294  170 

1505  171 
if ptmp <> nil then 
172 
begin 

173 
Gear^.NextGear:= ptmp^.NextGear; 

174 
Gear^.PrevGear:= ptmp; 

175 
if ptmp^.NextGear <> nil then ptmp^.NextGear^.PrevGear:= Gear; 

176 
ptmp^.NextGear:= Gear 

177 
end 

178 
else GearsList:= Gear 

179 
end 

294  180 
end; 
181 

182 
procedure RemoveGearFromList(Gear: PGear); 

183 
begin 

351  184 
if Gear^.NextGear <> nil then Gear^.NextGear^.PrevGear:= Gear^.PrevGear; 
1505  185 
if Gear^.PrevGear <> nil then 
186 
Gear^.PrevGear^.NextGear:= Gear^.NextGear 

187 
else 

188 
GearsList:= Gear^.NextGear 

294  189 
end; 
190 

371  191 
function AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear; 
79  192 
const Counter: Longword = 0; 
351  193 
var Result: PGear; 
4  194 
begin 
79  195 
inc(Counter); 
1495  196 
{$IFDEF DEBUGFILE} 
1503  197 
AddFileLog('AddGear: #' + inttostr(Counter) + ' (' + inttostr(x) + ',' + inttostr(y) + '), d(' + floattostr(dX) + ',' + floattostr(dY) + ') type = ' + inttostr(ord(Kind))); 
1495  198 
{$ENDIF} 
199 

4  200 
New(Result); 
201 
FillChar(Result^, sizeof(TGear), 0); 

498  202 
Result^.X:= int2hwFloat(X); 
203 
Result^.Y:= int2hwFloat(Y); 

351  204 
Result^.Kind := Kind; 
205 
Result^.State:= State; 

206 
Result^.Active:= true; 

207 
Result^.dX:= dX; 

208 
Result^.dY:= dY; 

209 
Result^.doStep:= doStepHandlers[Kind]; 

511  210 
Result^.CollisionIndex:= 1; 
351  211 
Result^.Timer:= Timer; 
1270  212 
Result^.Z:= cUsualZ; 
1503  213 
Result^.uid:= Counter; 
505
fcba7d7aea0d
Fix old bug with grenade(bomd, etc..) not colliding with attacking hedgehog
unc0rr
parents:
503
diff
changeset

214 

4  215 
if CurrentTeam <> nil then 
1505  216 
begin 
217 
Result^.Hedgehog:= CurrentHedgehog; 

218 
Result^.IntersectGear:= CurrentHedgehog^.Gear 

219 
end; 

802
ed5450a89b96
Start implementing 'visual gears'  gears, that don't need to be synchronized (clouds and flakes)
unc0rr
parents:
789
diff
changeset

220 

4  221 
case Kind of 
915  222 
gtAmmo_Bomb, 
223 
gtClusterBomb: begin 

351  224 
Result^.Radius:= 4; 
225 
Result^.Elasticity:= _0_6; 

997  226 
Result^.Friction:= _0_96; 
4  227 
end; 
1261  228 
gtWatermelon: begin 
229 
Result^.Radius:= 4; 

230 
Result^.Elasticity:= _0_8; 

231 
Result^.Friction:= _0_995; 

232 
end; 

4  233 
gtHedgehog: begin 
351  234 
Result^.Radius:= cHHRadius; 
235 
Result^.Elasticity:= _0_35; 

236 
Result^.Friction:= _0_999; 

237 
Result^.Angle:= cMaxAngle div 2; 

238 
Result^.Z:= cHHZ; 

4  239 
end; 
240 
gtAmmo_Grenade: begin 

351  241 
Result^.Radius:= 4; 
4  242 
end; 
243 
gtHealthTag: begin 

351  244 
Result^.Timer:= 1500; 
522  245 
Result^.Z:= 2001; 
4  246 
end; 
247 
gtGrave: begin 

351  248 
Result^.Radius:= 10; 
249 
Result^.Elasticity:= _0_6; 

4  250 
end; 
251 
gtUFO: begin 

351  252 
Result^.Radius:= 5; 
253 
Result^.Timer:= 500; 

254 
Result^.Elasticity:= _0_9 

4  255 
end; 
256 
gtShotgunShot: begin 

351  257 
Result^.Timer:= 900; 
258 
Result^.Radius:= 2 

4  259 
end; 
260 
gtPickHammer: begin 

351  261 
Result^.Radius:= 10; 
262 
Result^.Timer:= 4000 

4  263 
end; 
1263  264 
gtSmokeTrace, 
265 
gtEvilTrace: begin 

498  266 
Result^.X:= Result^.X  _16; 
267 
Result^.Y:= Result^.Y  _16; 

1270  268 
Result^.State:= 8; 
269 
Result^.Z:= cSmokeZ 

4  270 
end; 
271 
gtRope: begin 

351  272 
Result^.Radius:= 3; 
498  273 
Result^.Friction:= _450; 
4  274 
RopePoints.Count:= 0; 
275 
end; 

9  276 
gtExplosion: begin 
1012  277 
Result^.X:= Result^.X; 
278 
Result^.Y:= Result^.Y; 

9  279 
end; 
10  280 
gtMine: begin 
503  281 
Result^.State:= Result^.State or gstMoving; 
915  282 
Result^.Radius:= 2; 
351  283 
Result^.Elasticity:= _0_55; 
284 
Result^.Friction:= _0_995; 

285 
Result^.Timer:= 3000; 

10  286 
end; 
14
81f125629b25
 Mine checks whether a hedgehog is near less frequently
unc0rr
parents:
10
diff
changeset

287 
gtCase: begin 
351  288 
Result^.Radius:= 16; 
601
78a68cc4d846
Special game mode allowing the only clan on map for training mode
unc0rr
parents:
595
diff
changeset

289 
Result^.Elasticity:= _0_3 
14
81f125629b25
 Mine checks whether a hedgehog is near less frequently
unc0rr
parents:
10
diff
changeset

290 
end; 
37  291 
gtDEagleShot: begin 
351  292 
Result^.Radius:= 1; 
293 
Result^.Health:= 50 

37  294 
end; 
39  295 
gtDynamite: begin 
351  296 
Result^.Radius:= 3; 
297 
Result^.Elasticity:= _0_55; 

298 
Result^.Friction:= _0_03; 

299 
Result^.Timer:= 5000; 

39  300 
end; 
910  301 
gtCluster: Result^.Radius:= 2; 
878  302 
gtShover: Result^.Radius:= 20; 
79  303 
gtFlame: begin 
1586  304 
Result^.Tag:= Counter mod 32; 
351  305 
Result^.Radius:= 1; 
1586  306 
Result^.Health:= 5; 
1555  307 
if (Result^.dY.QWordValue = 0) and (Result^.dX.QWordValue = 0) then 
308 
begin 

309 
Result^.dY:= (getrandom  _0_8) * _0_03; 

310 
Result^.dX:= (getrandom  _0_5) * _0_4 

311 
end 

79  312 
end; 
82  313 
gtFirePunch: begin 
351  314 
Result^.Radius:= 15; 
315 
Result^.Tag:= Y 

82  316 
end; 
302  317 
gtAirBomb: begin 
543
465e2ec8f05f
 Better randomness of placing hedgehogs on the land
unc0rr
parents:
542
diff
changeset

318 
Result^.Radius:= 5; 
302  319 
end; 
320 
gtBlowTorch: begin 

511  321 
Result^.Radius:= cHHRadius + cBlowTorchC; 
351  322 
Result^.Timer:= 7500; 
302  323 
end; 
540  324 
gtSwitcher: begin 
325 
Result^.Z:= cCurrHHZ 

326 
end; 

593  327 
gtTarget: begin 
601
78a68cc4d846
Special game mode allowing the only clan on map for training mode
unc0rr
parents:
595
diff
changeset

328 
Result^.Radius:= 16; 
78a68cc4d846
Special game mode allowing the only clan on map for training mode
unc0rr
parents:
595
diff
changeset

329 
Result^.Elasticity:= _0_3 
593  330 
end; 
924  331 
gtMortar: begin 
994  332 
Result^.Radius:= 4; 
924  333 
Result^.Elasticity:= _0_2; 
334 
Result^.Friction:= _0_08 

335 
end; 

925  336 
gtWhip: Result^.Radius:= 20; 
984  337 
gtKamikaze: begin 
338 
Result^.Health:= 2048; 

339 
Result^.Radius:= 20 

340 
end; 

1089  341 
gtCake: begin 
1261  342 
Result^.Health:= 2048; 
1103  343 
Result^.Radius:= 7; 
1109  344 
Result^.Z:= cOnHHZ; 
1089  345 
if hwSign(dX) > 0 then Result^.Angle:= 1 else Result^.Angle:= 3 
346 
end; 

1263  347 
gtHellishBomb: begin 
348 
Result^.Radius:= 4; 

349 
Result^.Elasticity:= _0_5; 

350 
Result^.Friction:= _0_96; 

351 
end; 

1573  352 
gtDrill: begin 
353 
Result^.Timer:= 5000; 

354 
Result^.Radius:= 4; 

355 
end; 

1601  356 
gtBall: begin 
357 
Result^.Radius:= 5; 

358 
Result^.Tag:= random(8); 

359 
Result^.Timer:= 5000; 

360 
Result^.Elasticity:= _0_7; 

361 
Result^.Friction:= _0_995; 

362 
end; 

363 
gtBallgun: begin 

364 
Result^.Timer:= 5001; 

365 
end; 

1689  366 
gtRCPlane: begin 
367 
Result^.Timer:= 15000; 

368 
Result^.Health:= 3; 

369 
Result^.Radius:= 8; 

370 
end; 

4  371 
end; 
351  372 
InsertGearToList(Result); 
373 
AddGear:= Result 

4  374 
end; 
375 

1515  376 
procedure DeleteGear(Gear: PGear); 
48  377 
var team: PTeam; 
1515  378 
t: Longword; 
4  379 
begin 
503  380 
DeleteCI(Gear); 
762  381 

382 
if Gear^.Tex <> nil then 

1495  383 
begin 
384 
FreeTexture(Gear^.Tex); 

385 
Gear^.Tex:= nil 

386 
end; 

762  387 

351  388 
if Gear^.Kind = gtHedgehog then 
1495  389 
if CurAmmoGear <> nil then 
390 
begin 

391 
Gear^.Message:= gm_Destroy; 

392 
CurAmmoGear^.Message:= gm_Destroy; 

393 
exit 

394 
end 

395 
else 

396 
begin 

397 
if not (hwRound(Gear^.Y) < cWaterLine) then 

398 
begin 

399 
t:= max(Gear^.Damage, Gear^.Health); 

400 
Gear^.Damage:= t; 

401 
AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtHealthTag, t, _0, _0, 0)^.Hedgehog:= Gear^.Hedgehog; 

402 
uStats.HedgehogDamaged(Gear) 

403 
end; 

1515  404 

1495  405 
team:= PHedgehog(Gear^.Hedgehog)^.Team; 
406 
if CurrentHedgehog^.Gear = Gear then 

407 
FreeActionsList; // to avoid ThinkThread on drawned gear 

1515  408 

1495  409 
PHedgehog(Gear^.Hedgehog)^.Gear:= nil; 
410 
inc(KilledHHs); 

1515  411 
RecountTeamHealth(team) 
1495  412 
end; 
413 
{$IFDEF DEBUGFILE} 

1503  414 
with Gear^ do AddFileLog('Delete: #' + inttostr(uid) + ' (' + inttostr(hwRound(x)) + ',' + inttostr(hwRound(y)) + '), d(' + floattostr(dX) + ',' + floattostr(dY) + ') type = ' + inttostr(ord(Kind))); 
1495  415 
{$ENDIF} 
416 

595
5ee863f2f568
Triggers PoC: targets are spawned right after the previous damaged
unc0rr
parents:
593
diff
changeset

417 
if Gear^.TriggerId <> 0 then TickTrigger(Gear^.TriggerId); 
82  418 
if CurAmmoGear = Gear then CurAmmoGear:= nil; 
4  419 
if FollowGear = Gear then FollowGear:= nil; 
294  420 
RemoveGearFromList(Gear); 
1515  421 
Dispose(Gear) 
4  422 
end; 
423 

424 
function CheckNoDamage: boolean; // returns TRUE in case of no damaged hhs 

425 
var Gear: PGear; 

1849  426 
dmg: LongInt; 
4  427 
begin 
351  428 
CheckNoDamage:= true; 
4  429 
Gear:= GearsList; 
430 
while Gear <> nil do 

867  431 
begin 
432 
if Gear^.Kind = gtHedgehog then 

1861  433 
begin 
1849  434 
if (Gear^.Damage <> 0) and 
435 
(not Gear^.Invulnerable) then 

1861  436 
begin 
437 
CheckNoDamage:= false; 

438 
uStats.HedgehogDamaged(Gear); 

439 
dmg:= Gear^.Damage; 

440 
if Gear^.Health < dmg then 

441 
Gear^.Health:= 0 

442 
else 

443 
dec(Gear^.Health, dmg); 

351  444 

1861  445 
AddGear(hwRound(Gear^.X), hwRound(Gear^.Y)  cHHRadius  12, 
446 
gtHealthTag, dmg, _0, _0, 0)^.Hedgehog:= Gear^.Hedgehog; 

867  447 

1861  448 
RenderHealth(PHedgehog(Gear^.Hedgehog)^); 
449 
RecountTeamHealth(PHedgehog(Gear^.Hedgehog)^.Team); 

1505  450 

1861  451 
end; 
452 
Gear^.Damage:= 0; 

453 
end; 

867  454 
Gear:= Gear^.NextGear 
455 
end; 

4  456 
end; 
457 

1054  458 
procedure HealthMachine; 
459 
var Gear: PGear; 

460 
begin 

461 
Gear:= GearsList; 

462 

463 
while Gear <> nil do 

464 
begin 

465 
if Gear^.Kind = gtHedgehog then 

466 
Gear^.Damage:= min(cHealthDecrease, Gear^.Health  1); 

467 

468 
Gear:= Gear^.NextGear 

469 
end; 

470 
end; 

471 

4  472 
procedure ProcessGears; 
614  473 
const delay: LongWord = 0; 
1797  474 
step: (stDelay, stChDmg, stSweep, stTurnReact, 
1495  475 
stAfterDelay, stChWin, stWater, stChWin2, stHealth, 
476 
stSpawn, stNTurn) = stDelay; 

1054  477 

4  478 
var Gear, t: PGear; 
479 
begin 

868  480 
PrvInactive:= AllInactive; 
4  481 
AllInactive:= true; 
1495  482 

4  483 
t:= GearsList; 
1054  484 
while t <> nil do 
1352
405ad07cf875
Add more support for handling disconnects while playing (not fully tested)
unc0rr
parents:
1346
diff
changeset

485 
begin 
405ad07cf875
Add more support for handling disconnects while playing (not fully tested)
unc0rr
parents:
1346
diff
changeset

486 
Gear:= t; 
405ad07cf875
Add more support for handling disconnects while playing (not fully tested)
unc0rr
parents:
1346
diff
changeset

487 
t:= Gear^.NextGear; 
405ad07cf875
Add more support for handling disconnects while playing (not fully tested)
unc0rr
parents:
1346
diff
changeset

488 
if Gear^.Active then Gear^.doStep(Gear); 
405ad07cf875
Add more support for handling disconnects while playing (not fully tested)
unc0rr
parents:
1346
diff
changeset

489 
end; 
89  490 

4  491 
if AllInactive then 
1343  492 
case step of 
493 
stDelay: begin 

494 
if delay = 0 then 

495 
delay:= cInactDelay 

496 
else 

497 
dec(delay); 

614  498 

1343  499 
if delay = 0 then 
500 
inc(step) 

501 
end; 

1797  502 
stChDmg: if CheckNoDamage then inc(step) else step:= stDelay; 
503 
stSweep: if SweepDirty then 

1792  504 
begin 
505 
SetAllToActive; 

506 
step:= stChDmg 

1797  507 
end else inc(step); 
1343  508 
stTurnReact: begin 
509 
if (not bBetweenTurns) and (not isInMultiShoot) then 

510 
begin 

511 
uStats.TurnReaction; 

512 
inc(step) 

513 
end else 

514 
inc(step, 2); 

515 
end; 

516 
stAfterDelay: begin 

517 
if delay = 0 then 

518 
delay:= cInactDelay 

519 
else 

520 
dec(delay); 

815  521 

1343  522 
if delay = 0 then 
523 
inc(step) 

524 
end; 

525 
stChWin: begin 

526 
CheckForWin; 

527 
inc(step) 

528 
end; 

529 
stWater: if (not bBetweenTurns) and (not isInMultiShoot) then 

530 
begin 

1782
e7589e37a6d6
Options for bonus box probability tuning and number of turn until sudden death
unc0rr
parents:
1781
diff
changeset

531 
if TotalRounds = cSuddenDTurns + 2 then bWaterRising:= true; 
1055
9af540b23409
Water rises after 25 mins of round, health is decreased after 20 mins
unc0rr
parents:
1054
diff
changeset

532 

1343  533 
if bWaterRising then 
534 
AddGear(0, 0, gtWaterUp, 0, _0, _0, 0); 

1055
9af540b23409
Water rises after 25 mins of round, health is decreased after 20 mins
unc0rr
parents:
1054
diff
changeset

535 

1343  536 
inc(step) 
537 
end else inc(step); 

538 
stChWin2: begin 

539 
CheckForWin; 

540 
inc(step) 

541 
end; 

542 
stHealth: begin 

1782
e7589e37a6d6
Options for bonus box probability tuning and number of turn until sudden death
unc0rr
parents:
1781
diff
changeset

543 
if (TotalRounds = cSuddenDTurns) and (cHealthDecrease = 0) then 
1343  544 
begin 
545 
cHealthDecrease:= 5; 

546 
AddCaption(trmsg[sidSuddenDeath], $FFFFFF, capgrpGameState) 

547 
end; 

1055
9af540b23409
Water rises after 25 mins of round, health is decreased after 20 mins
unc0rr
parents:
1054
diff
changeset

548 

1343  549 
if (cHealthDecrease = 0) 
550 
or bBetweenTurns 

551 
or isInMultiShoot 

552 
or (TotalRounds = 0) then inc(step) 

553 
else begin 

554 
bBetweenTurns:= true; 

555 
HealthMachine; 

556 
step:= stChDmg 

557 
end 

558 
end; 

559 
stSpawn: begin 

560 
if not isInMultiShoot then SpawnBoxOfSmth; 

561 
inc(step) 

562 
end; 

563 
stNTurn: begin 

564 
if isInMultiShoot then isInMultiShoot:= false 

565 
else begin 

1849  566 
ResetUtilities; 
1343  567 
ParseCommand('/nextturn', true); 
568 
SwitchHedgehog; 

1298  569 

1343  570 
inc(step); 
1298  571 

1343  572 
AfterSwitchHedgehog; 
573 
bBetweenTurns:= false 

574 
end; 

575 
step:= Low(step) 

576 
end; 

577 
end; 

15  578 

4  579 
if TurnTimeLeft > 0 then 
870  580 
if CurrentHedgehog^.Gear <> nil then 
581 
if ((CurrentHedgehog^.Gear^.State and gstAttacking) = 0) 

582 
and not isInMultiShoot then 

583 
begin 

584 
if (TurnTimeLeft = 5000) 

585 
and (CurrentHedgehog^.Gear <> nil) 

1669  586 
and ((CurrentHedgehog^.Gear^.State and gstAttacked) = 0) then 
587 
PlaySound(sndHurry, false, CurrentTeam^.voicepack); 

870  588 
dec(TurnTimeLeft) 
589 
end; 

351  590 

651  591 
if (not CurrentTeam^.ExtDriven) and 
917  592 
((GameTicks and $FFFF) = $FFFF) then 
593 
begin 

594 
SendIPCTimeInc; 

595 
inc(hiTicks) // we do not recieve a message for this 

596 
end; 

656
6d6d9d7b1054
Fix network game bug caused by recent protocol changes
unc0rr
parents:
651
diff
changeset

597 

515  598 
inc(GameTicks) 
4  599 
end; 
600 

1854  601 
//Purpose, to reset all transient attributes toggled by a utility. 
602 
//If any of these are set as permanent toggles in the frontend, that needs to be checked and skipped here. 

1849  603 
procedure ResetUtilities; 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

604 
var i: LongInt; 
1849  605 
begin 
606 
cGravity:= cMaxWindSpeed; 

607 
cDamageModifier:= _1; 

1854  608 
cLaserSighting:= false; 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

609 
// have to sweep *all* current team hedgehogs since it is theoretically possible if you have enough invulnerabilities and switch turns to make your entire team invulnerable 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

610 

ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

611 
if (CurrentTeam <> nil) then 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

612 
with CurrentTeam^ do 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

613 
for i:= 0 to cMaxHHIndex do 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

614 
with Hedgehogs[i] do 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

615 
if (Gear <> nil) then 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

616 
Gear^.Invulnerable:= false; 
1849  617 
end; 
618 

4  619 
procedure SetAllToActive; 
620 
var t: PGear; 

621 
begin 

622 
AllInactive:= false; 

623 
t:= GearsList; 

351  624 
while t <> nil do 
1505  625 
begin 
626 
t^.Active:= true; 

627 
t:= t^.NextGear 

628 
end 

4  629 
end; 
630 

631 
procedure SetAllHHToActive; 

632 
var t: PGear; 

633 
begin 

634 
AllInactive:= false; 

635 
t:= GearsList; 

351  636 
while t <> nil do 
1505  637 
begin 
638 
if t^.Kind = gtHedgehog then t^.Active:= true; 

639 
t:= t^.NextGear 

640 
end 

4  641 
end; 
642 

841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

643 
procedure DrawHH(Gear: PGear); 
371  644 
var t: LongInt; 
822  645 
amt: TAmmoType; 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

646 
hx, hy, cx, cy, tx, ty, sx, sy, m: LongInt; // hedgehog, crosshair, temp, sprite` 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

647 
lx, ly, dx, dy, ax, ay, aAngle, dAngle: real; // laser, change 
1253  648 
defaultPos, HatVisible: boolean; 
292  649 
begin 
868  650 
if (Gear^.State and gstHHDeath) <> 0 then 
651 
begin 

652 
DrawSprite(sprHHDeath, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  26 + WorldDy, Gear^.Pos); 

653 
exit 

654 
end; 

1002  655 

824  656 
defaultPos:= true; 
1253  657 
HatVisible:= false; 
847  658 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

659 
sx:= hwRound(Gear^.X) + 1 + WorldDx; 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

660 
sy:= hwRound(Gear^.Y)  3 + WorldDy; 
1002  661 
if (Gear^.State and gstDrowning) <> 0 then 
662 
begin 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

663 
DrawHedgehog(sx, sy, 
1002  664 
hwSign(Gear^.dX), 
665 
1, 

666 
7, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

667 
0); 
1002  668 
defaultPos:= false 
669 
end else 

670 

1011  671 
if (Gear^.State and gstWinner) <> 0 then 
672 
begin 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

673 
DrawHedgehog(sx, sy, 
1011  674 
hwSign(Gear^.dX), 
675 
2, 

676 
0, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

677 
0); 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

678 
defaultPos:= false 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

679 
end else 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

680 
if (Gear^.State and gstLoser) <> 0 then // for now using the jackhammer for its kind of bemused "oops" look 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

681 
begin 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

682 
DrawHedgehog(sx, sy, 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

683 
hwSign(Gear^.dX), 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

684 
1, 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

685 
2, 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

686 
0); 
1011  687 
defaultPos:= false 
688 
end else 

689 

821
e6c0408b54ed
Use 'regular standing' and 'rope swing' hedgehog sprites
unc0rr
parents:
815
diff
changeset

690 
if (Gear^.State and gstHHDriven) <> 0 then 
966  691 
begin 
1002  692 
hx:= hwRound(Gear^.X) + 1 + 8 * hwSign(Gear^.dX) + WorldDx; 
693 
hy:= hwRound(Gear^.Y)  2 + WorldDy; 

694 
aangle:= Gear^.Angle * 180 / cMaxAngle  90; 

874  695 

1002  696 
if CurAmmoGear <> nil then 
697 
begin 

698 
case CurAmmoGear^.Kind of 

1294
50198e5c7f02
 Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1286
diff
changeset

699 
gtShotgunShot: begin 
50198e5c7f02
 Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1286
diff
changeset

700 
if (CurAmmoGear^.State and gstAnimation <> 0) then 
50198e5c7f02
 Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1286
diff
changeset

701 
DrawRotated(sprShotgun, hx, hy, hwSign(Gear^.dX), aangle) 
50198e5c7f02
 Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1286
diff
changeset

702 
else 
50198e5c7f02
 Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1286
diff
changeset

703 
DrawRotated(sprHandShotgun, hx, hy, hwSign(Gear^.dX), aangle); 
50198e5c7f02
 Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1286
diff
changeset

704 
HatVisible:= true 
50198e5c7f02
 Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1286
diff
changeset

705 
end; 
1002  706 
gtDEagleShot: DrawRotated(sprDEagle, hx, hy, hwSign(Gear^.dX), aangle); 
1601  707 
gtBallgun: DrawRotated(sprHandBallgun, hx, hy, hwSign(Gear^.dX), aangle); 
1717  708 
gtRCPlane: begin 
709 
DrawRotated(sprHandPlane, hx, hy, hwSign(Gear^.dX), 0); 

710 
defaultPos:= false 

711 
end; 

1002  712 
gtRope: begin 
713 
if Gear^.X < CurAmmoGear^.X then 

714 
begin 

715 
dAngle:= 0; 

716 
m:= 1 

717 
end else 

718 
begin 

719 
dAngle:= 180; 

720 
m:= 1 

966  721 
end; 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

722 
sx:= hwRound(Gear^.X) + WorldDx; 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

723 
sy:= hwRound(Gear^.Y) + WorldDy; 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

724 
DrawHedgehog(sx, sy, 
1002  725 
m, 
726 
1, 

727 
0, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

728 
DxDy2Angle(CurAmmoGear^.dY, CurAmmoGear^.dX) + dAngle); 
1002  729 
defaultPos:= false 
730 
end; 

731 
gtBlowTorch: begin 

732 
DrawRotated(sprBlowTorch, hx, hy, hwSign(Gear^.dX), aangle); 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

733 
DrawHedgehog(sx, sy, 
1002  734 
hwSign(Gear^.dX), 
735 
3, 

1113  736 
PHedgehog(Gear^.Hedgehog)^.visStepPos div 2, 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

737 
0); 
1002  738 
defaultPos:= false 
739 
end; 

740 
gtShover: DrawRotated(sprHandBaseball, hx, hy, hwSign(Gear^.dX), aangle + 180); 

741 
gtFirePunch: begin 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

742 
DrawHedgehog(sx, sy, 
1002  743 
hwSign(Gear^.dX), 
744 
1, 

745 
4, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

746 
0); 
1002  747 
defaultPos:= false 
748 
end; 

749 
gtPickHammer, 

750 
gtTeleport: defaultPos:= false; 

1010  751 
gtWhip: begin 
752 
DrawRotatedF(sprWhip, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

753 
sx, 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

754 
sy, 
1010  755 
1, 
756 
hwSign(Gear^.dX), 

757 
0); 

758 
defaultPos:= false 

759 
end; 

1002  760 
gtKamikaze: begin 
1286  761 
if CurAmmoGear^.Pos = 0 then 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

762 
DrawHedgehog(sx, sy, 
1286  763 
hwSign(Gear^.dX), 
764 
1, 

765 
6, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

766 
0) 
1286  767 
else 
768 
DrawRotatedF(sprKamikaze, 

769 
hwRound(Gear^.X) + WorldDx, 

770 
hwRound(Gear^.Y) + WorldDy, 

771 
CurAmmoGear^.Pos  1, 

772 
1, 

773 
DxDy2Angle(Gear^.dY, Gear^.dX)); 

774 
defaultPos:= false 

775 
end; 

776 
gtSeduction: begin 

777 
if CurAmmoGear^.Pos >= 6 then 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

778 
DrawHedgehog(sx, sy, 
1286  779 
hwSign(Gear^.dX), 
780 
2, 

781 
2, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

782 
0) 
1286  783 
else 
784 
begin 

785 
DrawRotatedF(sprDress, 

786 
hwRound(Gear^.X) + WorldDx, 

787 
hwRound(Gear^.Y) + WorldDy, 

788 
CurAmmoGear^.Pos, 

789 
hwSign(Gear^.dX), 

790 
0); 

791 
DrawSprite(sprCensored, hwRound(Gear^.X)  32 + WorldDx, hwRound(Gear^.Y)  20 + WorldDy, 0) 

792 
end; 

793 
defaultPos:= false 

794 
end; 

1002  795 
end; 
796 

797 
case CurAmmoGear^.Kind of 

798 
gtShotgunShot, 

799 
gtDEagleShot, 

800 
gtShover: begin 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

801 
DrawHedgehog(sx, sy, 
1002  802 
hwSign(Gear^.dX), 
803 
0, 

804 
4, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

805 
0); 
1002  806 
defaultPos:= false 
807 
end 

808 
end 

809 
end else 

876  810 

1002  811 
if ((Gear^.State and gstHHJumping) <> 0) then 
812 
begin 

813 
if ((Gear^.State and gstHHHJump) <> 0) then 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

814 
DrawHedgehog(sx, sy, 
1002  815 
 hwSign(Gear^.dX), 
816 
1, 

817 
1, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

818 
0) 
1002  819 
else 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

820 
DrawHedgehog(sx, sy, 
1002  821 
hwSign(Gear^.dX), 
822 
1, 

823 
1, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

824 
0); 
1002  825 
defaultPos:= false 
826 
end else 

874  827 

1002  828 
if (Gear^.Message and (gm_Left or gm_Right) <> 0) then 
824  829 
begin 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

830 
DrawHedgehog(sx, sy, 
1002  831 
hwSign(Gear^.dX), 
832 
0, 

833 
PHedgehog(Gear^.Hedgehog)^.visStepPos div 2, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

834 
0); 
1257  835 
defaultPos:= false; 
836 
HatVisible:= true 

1002  837 
end 
838 
else 

839 

1033  840 
if ((Gear^.State and gstAnimation) <> 0) then 
841 
begin 

1034  842 
DrawRotatedF(Wavez[TWave(Gear^.Tag)].Sprite, 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

843 
sx, 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

844 
sy, 
1033  845 
Gear^.Pos, 
846 
hwSign(Gear^.dX), 

847 
0.0); 

848 
defaultPos:= false 

849 
end 

850 
else 

1002  851 
if ((Gear^.State and gstAttacked) = 0) then 
852 
begin 

853 
amt:= CurrentHedgehog^.Ammo^[CurrentHedgehog^.CurSlot, CurrentHedgehog^.CurAmmo].AmmoType; 

854 
case amt of 

855 
amBazooka, 

1717  856 
amMortar: DrawRotated(sprHandBazooka, hx, hy, hwSign(Gear^.dX), aangle); 
857 
amBallgun: DrawRotated(sprHandBallgun, hx, hy, hwSign(Gear^.dX), aangle); 

858 
amDrill: DrawRotated(sprHandDrill, hx, hy, hwSign(Gear^.dX), aangle); 

1002  859 
amRope: DrawRotated(sprHandRope, hx, hy, hwSign(Gear^.dX), aangle); 
860 
amShotgun: DrawRotated(sprHandShotgun, hx, hy, hwSign(Gear^.dX), aangle); 

861 
amDEagle: DrawRotated(sprHandDEagle, hx, hy, hwSign(Gear^.dX), aangle); 

862 
amBlowTorch: DrawRotated(sprHandBlowTorch, hx, hy, hwSign(Gear^.dX), aangle); 

1717  863 
amRCPlane: begin 
864 
DrawRotated(sprHandPlane, hx, hy, hwSign(Gear^.dX), 0); 

865 
defaultPos:= false 

866 
end; 

1002  867 
end; 
868 

869 
case amt of 

870 
amAirAttack, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

871 
amMineStrike: DrawRotated(sprHandAirAttack, sx, hwRound(Gear^.Y) + WorldDy, hwSign(Gear^.dX), 0); 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

872 
amPickHammer: DrawHedgehog(sx, sy, 
1002  873 
hwSign(Gear^.dX), 
874 
1, 

875 
2, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

876 
0); 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

877 
amBlowTorch: DrawHedgehog(sx, sy, 
1002  878 
hwSign(Gear^.dX), 
879 
1, 

880 
3, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

881 
0); 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

882 
amTeleport: DrawRotatedF(sprTeleport, sx, sy, 0, hwSign(Gear^.dX), 0); 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

883 
amKamikaze: DrawHedgehog(sx, sy, 
1002  884 
hwSign(Gear^.dX), 
885 
1, 

886 
5, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

887 
0); 
1221  888 
amWhip: DrawRotatedF(sprWhip, 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

889 
sx, 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

890 
sy, 
1010  891 
0, 
892 
hwSign(Gear^.dX), 

893 
0); 

1002  894 
else 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

895 
DrawHedgehog(sx, sy, 
822  896 
hwSign(Gear^.dX), 
897 
0, 

1002  898 
4, 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

899 
0); 
1253  900 

901 
HatVisible:= true; 

902 
with PHedgehog(Gear^.Hedgehog)^ do 

1294
50198e5c7f02
 Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1286
diff
changeset

903 
if (HatTex <> nil) 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

904 
and (HatVisibility > 0) then 
1253  905 
DrawTextureF(HatTex, 
906 
HatVisibility, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

907 
sx, 
1253  908 
hwRound(Gear^.Y)  8 + WorldDy, 
909 
0, 

910 
hwSign(Gear^.dX), 

911 
32); 

1002  912 
end; 
966  913 

1002  914 
case amt of 
915 
amBaseballBat: DrawRotated(sprHandBaseball, 

916 
hwRound(Gear^.X) + 1  4 * hwSign(Gear^.dX) + WorldDx, 

917 
hwRound(Gear^.Y) + 6 + WorldDy, hwSign(Gear^.dX), aangle); 

918 
end; 

966  919 

1002  920 
defaultPos:= false 
921 
end 

922 
end else // not gstHHDriven 

1012  923 
begin 
1014
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

924 
if (Gear^.Damage > 0) 
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

925 
and (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > _0_003) then 
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

926 
begin 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

927 
DrawHedgehog(sx, sy, 
1012  928 
hwSign(Gear^.dX), 
1014
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

929 
2, 
1012  930 
1, 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

931 
Gear^.DirAngle); 
1012  932 
defaultPos:= false 
1020  933 
end else 
1014
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

934 

3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

935 
if ((Gear^.State and gstHHJumping) <> 0) then 
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

936 
begin 
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

937 
if ((Gear^.State and gstHHHJump) <> 0) then 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

938 
DrawHedgehog(sx, sy, 
1014
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

939 
 hwSign(Gear^.dX), 
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

940 
1, 
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

941 
1, 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

942 
0) 
1014
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

943 
else 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

944 
DrawHedgehog(sx, sy, 
1014
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

945 
hwSign(Gear^.dX), 
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

946 
1, 
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

947 
1, 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

948 
0); 
1014
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

949 
defaultPos:= false 
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

950 
end; 
1012  951 
end; 
834  952 

1251  953 
with PHedgehog(Gear^.Hedgehog)^ do 
970  954 
begin 
1251  955 
if defaultPos then 
956 
begin 

957 
DrawRotatedF(sprHHIdle, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

958 
sx, 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

959 
sy, 
1251  960 
(RealTicks div 128 + Gear^.Pos) mod 19, 
961 
hwSign(Gear^.dX), 

962 
0); 

1253  963 
HatVisible:= true; 
964 
end; 

965 

966 
if HatVisible then 

1251  967 
if HatVisibility < 1.0 then 
1254  968 
HatVisibility:= HatVisibility + 0.2 
1253  969 
else 
1251  970 
else 
971 
if HatVisibility > 0.0 then 

1254  972 
HatVisibility:= HatVisibility  0.2; 
1253  973 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

974 
if (HatTex <> nil) 
1294
50198e5c7f02
 Hedgehog doesn't take off hat when shooting from shotgun
unc0rr
parents:
1286
diff
changeset

975 
and (HatVisibility > 0) then 
1255  976 
if DefaultPos then 
977 
DrawTextureF(HatTex, 

978 
HatVisibility, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

979 
sx, 
1255  980 
hwRound(Gear^.Y)  8 + WorldDy, 
981 
(RealTicks div 128 + Gear^.Pos) mod 19, 

982 
hwSign(Gear^.dX), 

983 
32) 

984 
else 

985 
DrawTextureF(HatTex, 

986 
HatVisibility, 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

987 
sx, 
1255  988 
hwRound(Gear^.Y)  8 + WorldDy, 
989 
0, 

990 
hwSign(Gear^.dX), 

991 
32); 

970  992 
end; 
292  993 

1251  994 

351  995 
with PHedgehog(Gear^.Hedgehog)^ do 
994  996 
begin 
1011  997 
if ((Gear^.State and not gstWinner) = 0) 
994  998 
or (bShowFinger and ((Gear^.State and gstHHDriven) <> 0)) then 
958  999 
begin 
1660  1000 
t:= hwRound(Gear^.Y)  cHHRadius  12 + WorldDy; 
1001 
if (cTagsMask and 1) <> 0 then 

1002 
begin 

1003 
dec(t, HealthTagTex^.h + 2); 

1004 
DrawCentered(hwRound(Gear^.X) + WorldDx, t, HealthTagTex) 

1005 
end; 

1006 
if (cTagsMask and 2) <> 0 then 

1007 
begin 

1008 
dec(t, NameTagTex^.h + 2); 

1009 
DrawCentered(hwRound(Gear^.X) + WorldDx, t, NameTagTex) 

1010 
end; 

1011 
if (cTagsMask and 4) <> 0 then 

1012 
begin 

1013 
dec(t, Team^.NameTagTex^.h + 2); 

1014 
DrawCentered(hwRound(Gear^.X) + WorldDx, t, Team^.NameTagTex) 

1015 
end 

958  1016 
end; 
994  1017 
if (Gear^.State and gstHHDriven) <> 0 then // Current hedgehog 
958  1018 
begin 
1019 
if bShowFinger and ((Gear^.State and gstHHDriven) <> 0) then 

1020 
DrawSprite(sprFinger, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  64 + WorldDy, 

1021 
GameTicks div 32 mod 16); 

821
e6c0408b54ed
Use 'regular standing' and 'rope swing' hedgehog sprites
unc0rr
parents:
815
diff
changeset

1022 

958  1023 
if (Gear^.State and gstDrowning) = 0 then 
1024 
if (Gear^.State and gstHHThinking) <> 0 then 

1025 
DrawSprite(sprQuestion, hwRound(Gear^.X)  10 + WorldDx, hwRound(Gear^.Y)  cHHRadius  34 + WorldDy, 0) 

1026 
else 

1033  1027 
if ShowCrosshair and ((Gear^.State and (gstAttacked or gstAnimation)) = 0) then 
958  1028 
begin 
1854  1029 
(* These calculations are a little complex for a few reasons: 
1030 
1: I need to draw the laser from weapon origin to nearest land 

1031 
2: I need to start the beam outside the hedgie for attractiveness. 

1032 
3: I need to extend the beam beyond land. 

1033 
This routine perhaps should be pushed into uStore or somesuch instead of continuuing the increase in size of this function. 

1034 
*) 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1035 
if ((Gear^.State and gstHHHJump) <> 0) then m:= 1 else m:= 1; 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1036 
dx:= hwSign(Gear^.dX) * m * Sin(Gear^.Angle * pi / cMaxAngle); 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1037 
dy:=  Cos(Gear^.Angle * pi / cMaxAngle); 
1854  1038 
if cLaserSighting then 
1039 
begin 

1040 
lx:= hwRound(Gear^.X); 

1041 
ly:= hwRound(Gear^.Y); 

1042 
lx:= lx + dx * 16; 

1043 
ly:= ly + dy * 16; 

1044 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1045 
ax:= dx * 4; 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1046 
ay:= dy * 4; 
1854  1047 

1048 
tx:= round(lx); 

1049 
ty:= round(ly); 

1050 
hx:= tx; 

1051 
hy:= ty; 

1052 
while ((ty and LAND_HEIGHT_MASK) = 0) and 

1053 
((tx and LAND_WIDTH_MASK) = 0) and 

1054 
(Land[ty, tx] = 0) do 

1055 
begin 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1056 
lx:= lx + ax; 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1057 
ly:= ly + ay; 
1854  1058 
tx:= round(lx); 
1059 
ty:= round(ly) 

1060 
end; 

1061 
// reached edge of land. assume infinite beam. Extend it way out past camera 

1062 
if ((ty and LAND_HEIGHT_MASK) <> 0) or ((tx and LAND_WIDTH_MASK) <> 0) then 

1063 
begin 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1064 
tx:= round(lx + ax * (LAND_WIDTH div 4)); 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1065 
ty:= round(ly + ay * (LAND_WIDTH div 4)); 
1854  1066 
end; 
1067 

1068 
//if (abs(lxtx)>8) or (abs(lyty)>8) then 

1069 
begin 

1070 
glDisable(GL_TEXTURE_2D); 

1071 
glEnable(GL_LINE_SMOOTH); 

1072 
glBegin(GL_LINES); 

1073 
glColor4ub($FF, $00, $00, $C0); 

1074 
glVertex2i(hx + WorldDx, hy + WorldDy); 

1075 
glVertex2i(tx + WorldDx, ty + WorldDy); 

1076 
glEnd(); 

1077 
glColor4f(1, 1, 1, 1); 

1078 
glEnable(GL_TEXTURE_2D); 

1079 
glDisable(GL_LINE_SMOOTH); 

1080 
end; 

1081 
end; 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1082 
// draw crosshair 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1083 
cx:= Round(hwRound(Gear^.X) + dx * 80); 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1084 
cy:= Round(hwRound(Gear^.Y) + dy * 80); 
958  1085 
DrawRotatedTex(Team^.CrosshairTex, 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1086 
12, 12, cx + WorldDx, cy + WorldDy, 0, 
1854  1087 
hwSign(Gear^.dX) * (Gear^.Angle * 180.0) / cMaxAngle); 
958  1088 
end 
994  1089 
end 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1090 
end; 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1091 

ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1092 
if Gear^.Invulnerable then 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1093 
begin 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1094 
DrawSprite(sprInvulnerable, sx  24, sy  24, 0); 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1095 
end; 
292  1096 
end; 
1097 

956  1098 
procedure DrawGears; 
853  1099 
var Gear, HHGear: PGear; 
4  1100 
i: Longword; 
371  1101 
roplen: LongInt; 
4  1102 

371  1103 
procedure DrawRopeLine(X1, Y1, X2, Y2: LongInt); 
1104 
var eX, eY, dX, dY: LongInt; 

1105 
i, sX, sY, x, y, d: LongInt; 

366  1106 
b: boolean; 
4  1107 
begin 
37  1108 
if (X1 = X2) and (Y1 = Y2) then 
1109 
begin 

351  1110 
OutError('WARNING: zero length rope line!', false); 
37  1111 
exit 
1112 
end; 

366  1113 
eX:= 0; 
1114 
eY:= 0; 

1115 
dX:= X2  X1; 

1116 
dY:= Y2  Y1; 

1117 

1118 
if (dX > 0) then sX:= 1 

1119 
else 

1120 
if (dX < 0) then 

1121 
begin 

1122 
sX:= 1; 

1123 
dX:= dX 

1124 
end else sX:= dX; 

1125 

1126 
if (dY > 0) then sY:= 1 

1127 
else 

1128 
if (dY < 0) then 

4  1129 
begin 
366  1130 
sY:= 1; 
1131 
dY:= dY 

1132 
end else sY:= dY; 

1133 

1134 
if (dX > dY) then d:= dX 

1135 
else d:= dY; 

1136 

1137 
x:= X1; 

1138 
y:= Y1; 

1139 

1140 
for i:= 0 to d do 

1141 
begin 

1142 
inc(eX, dX); 

1143 
inc(eY, dY); 

1144 
b:= false; 

1145 
if (eX > d) then 

35  1146 
begin 
366  1147 
dec(eX, d); 
1148 
inc(x, sX); 

1149 
b:= true 

35  1150 
end; 
366  1151 
if (eY > d) then 
35  1152 
begin 
366  1153 
dec(eY, d); 
1154 
inc(y, sY); 

1155 
b:= true 

35  1156 
end; 
366  1157 
if b then 
1158 
begin 

1159 
inc(roplen); 

841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1160 
if (roplen mod 4) = 0 then DrawSprite(sprRopeNode, x  2, y  2, 0) 
366  1161 
end 
4  1162 
end 
366  1163 
end; 
4  1164 

1165 
begin 

1166 
Gear:= GearsList; 

1167 
while Gear<>nil do 

1689  1168 
begin 
1169 
case Gear^.Kind of 

822  1170 
gtAmmo_Bomb: DrawRotated(sprBomb, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle); 
1689  1171 

1696  1172 
gtRCPlane: if (Gear^.Tag = 1) then 
1689  1173 
DrawRotated(sprPlane, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 1, DxDy2Angle(Gear^.dX, Gear^.dY) + 90) 
1174 
else 

1175 
DrawRotated(sprPlane, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy,0,DxDy2Angle(Gear^.dY, Gear^.dX)); 

1176 

1601  1177 
gtBall: DrawRotatedf(sprBalls, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Tag,0, DxDy2Angle(Gear^.dY, Gear^.dX)); 
1689  1178 

1573  1179 
gtDrill: DrawRotated(sprDrill, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, DxDy2Angle(Gear^.dY, Gear^.dX)); 
1689  1180 

841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1181 
gtHedgehog: DrawHH(Gear); 
1689  1182 

822  1183 
gtAmmo_Grenade: DrawRotated(sprGrenade, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, DxDy2Angle(Gear^.dY, Gear^.dX)); 
1689  1184 

1505  1185 
gtHealthTag: if Gear^.Tex <> nil then DrawCentered(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Tex); 
1689  1186 

841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1187 
gtGrave: DrawSurfSprite(hwRound(Gear^.X) + WorldDx  16, hwRound(Gear^.Y) + WorldDy  16, 32, (GameTicks shr 7) and 7, PHedgehog(Gear^.Hedgehog)^.Team^.GraveTex); 
1689  1188 

841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1189 
gtUFO: DrawSprite(sprUFO, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  16 + WorldDy, (GameTicks shr 7) mod 4); 
1689  1190 

848  1191 
gtPickHammer: DrawSprite(sprPHammer, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  50 + LongInt(((GameTicks shr 5) and 1) * 2) + WorldDy, 0); 
4  1192 
gtRope: begin 
35  1193 
roplen:= 0; 
4  1194 
if RopePoints.Count > 0 then 
1195 
begin 

1196 
i:= 0; 

1197 
while i < Pred(RopePoints.Count) do 

1198 
begin 

351  1199 
DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy, 
1200 
hwRound(RopePoints.ar[Succ(i)].X) + WorldDx, hwRound(RopePoints.ar[Succ(i)].Y) + WorldDy); 

4  1201 
inc(i) 
1202 
end; 

351  1203 
DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy, 
1204 
hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy); 

1205 
DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 

1206 
hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.X) + WorldDx, hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.Y) + WorldDy); 

822  1207 
DrawRotated(sprRopeHook, hwRound(RopePoints.ar[0].X) + WorldDx, hwRound(RopePoints.ar[0].Y) + WorldDy, 1, RopePoints.HookAngle) 
4  1208 
end else 
1781  1209 
if Gear^.Elasticity.QWordValue > 0 then 
35  1210 
begin 
351  1211 
DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 
1212 
hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.X) + WorldDx, hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.Y) + WorldDy); 

822  1213 
DrawRotated(sprRopeHook, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, DxDy2Angle(Gear^.dY, Gear^.dX)); 
35  1214 
end; 
4  1215 
end; 
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1216 
gtSmokeTrace: if Gear^.State < 8 then DrawSprite(sprSmokeTrace, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State); 
1012  1217 
gtExplosion: DrawSprite(sprExplosion50, hwRound(Gear^.X)  32 + WorldDx, hwRound(Gear^.Y)  32 + WorldDy, Gear^.State); 
351  1218 
gtMine: if ((Gear^.State and gstAttacking) = 0)or((Gear^.Timer and $3FF) < 420) 
822  1219 
then DrawRotated(sprMineOff, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle) 
1220 
else DrawRotated(sprMineOn, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle); 

351  1221 
gtCase: case Gear^.Pos of 
1794  1222 
posCaseAmmo : begin 
1223 
i:= (GameTicks shr 6) mod 64; 

1224 
if i > 18 then i:= 0; 

1225 
DrawSprite(sprCase, hwRound(Gear^.X)  24 + WorldDx, hwRound(Gear^.Y)  24 + WorldDy, i); 

1226 
end; 

1009  1227 
posCaseHealth: begin 
1863  1228 
i:= ((GameTicks shr 6) + 38) mod 64; 
1229 
if i > 13 then i:= 0; 

1009  1230 
DrawSprite(sprFAid, hwRound(Gear^.X)  24 + WorldDx, hwRound(Gear^.Y)  24 + WorldDy, i); 
1231 
end; 

1861  1232 
posCaseUtility: begin 
1863  1233 
i:= (GameTicks shr 6) mod 70; 
1234 
if i > 23 then i:= 0; 

1235 
DrawSprite(sprUtility, hwRound(Gear^.X)  24 + WorldDx, hwRound(Gear^.Y)  24 + WorldDy, i); 

1861  1236 
end; 
42  1237 
end; 
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1238 
gtDynamite: DrawSprite2(sprDynamite, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  25 + WorldDy, Gear^.Tag and 1, Gear^.Tag shr 1); 
822  1239 
gtClusterBomb: DrawRotated(sprClusterBomb, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle); 
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1240 
gtCluster: DrawSprite(sprClusterParticle, hwRound(Gear^.X)  8 + WorldDx, hwRound(Gear^.Y)  8 + WorldDy, 0); 
1560
e140bc57ff68
Quick replay round to spectators until current move
unc0rr
parents:
1555
diff
changeset

1241 
gtFlame: DrawSprite(sprFlame, hwRound(Gear^.X)  8 + WorldDx, hwRound(Gear^.Y)  8 + WorldDy, (GameTicks div 128 + LongWord(Gear^.Tag)) mod 8); 
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1242 
gtParachute: DrawSprite(sprParachute, hwRound(Gear^.X)  24 + WorldDx, hwRound(Gear^.Y)  48 + WorldDy, 0); 
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1243 
gtAirAttack: if Gear^.Tag > 0 then DrawSprite(sprAirplane, hwRound(Gear^.X)  60 + WorldDx, hwRound(Gear^.Y)  25 + WorldDy, 0) 
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1244 
else DrawSprite(sprAirplane, hwRound(Gear^.X)  60 + WorldDx, hwRound(Gear^.Y)  25 + WorldDy, 1); 
822  1245 
gtAirBomb: DrawRotated(sprAirBomb, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, DxDy2Angle(Gear^.dY, Gear^.dX)); 
853  1246 
gtTeleport: begin 
1247 
HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; 

1248 
DrawRotatedF(sprTeleport, hwRound(Gear^.X) + 1 + WorldDx, hwRound(Gear^.Y)  3 + WorldDy, Gear^.Pos, hwSign(HHGear^.dX), 0); 

1249 
DrawRotatedF(sprTeleport, hwRound(HHGear^.X) + 1 + WorldDx, hwRound(HHGear^.Y)  3 + WorldDy, 11  Gear^.Pos, hwSign(HHGear^.dX), 0); 

1250 
end; 

841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1251 
gtSwitcher: DrawSprite(sprSwitch, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  56 + WorldDy, (GameTicks shr 6) mod 12); 
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1252 
gtTarget: DrawSprite(sprTarget, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  16 + WorldDy, 0); 
959  1253 
gtMortar: DrawRotated(sprMortar, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, DxDy2Angle(Gear^.dY, Gear^.dX)); 
1108  1254 
gtCake: if Gear^.Pos = 6 then 
1255 
DrawRotatedf(sprCakeWalk, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, (GameTicks div 40) mod 6, hwSign(Gear^.dX), Gear^.DirAngle + hwSign(Gear^.dX) * 90) 

1256 
else 

1262  1257 
DrawRotatedf(sprCakeDown, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 5  Gear^.Pos, hwSign(Gear^.dX), 0); 
1367  1258 
gtSeduction: if Gear^.Pos >= 14 then DrawSprite(sprSeduction, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  16 + WorldDy, 0); 
1262  1259 
gtWatermelon: DrawRotatedf(sprWatermelon, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, 0, Gear^.DirAngle); 
1260 
gtMelonPiece: DrawRotatedf(sprWatermelon, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 1, 0, Gear^.DirAngle); 

1263  1261 
gtHellishBomb: DrawRotated(sprHellishBomb, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle); 
1262 
gtEvilTrace: if Gear^.State < 8 then DrawSprite(sprEvilTrace, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State); 

1263 
end; 

351  1264 
Gear:= Gear^.NextGear 
4  1265 
end; 
1266 
end; 

1267 

1268 
procedure FreeGearsList; 

1269 
var t, tt: PGear; 

1270 
begin 

1271 
tt:= GearsList; 

1272 
GearsList:= nil; 

1505  1273 
while tt <> nil do 
1274 
begin 

1275 
t:= tt; 

1276 
tt:= tt^.NextGear; 

1277 
Dispose(t) 

1278 
end; 

4  1279 
end; 
1280 

10  1281 
procedure AddMiscGears; 
371  1282 
var i: LongInt; 
1515  1283 
Gear: PGear; 
4  1284 
begin 
498  1285 
AddGear(0, 0, gtATStartGame, 0, _0, _0, 2000); 
1435
d4b32ee3caa6
Fix using freed memory (could be the cause of queue error problem and other bugs)
unc0rr
parents:
1434
diff
changeset

1286 

22  1287 
if (GameFlags and gfForts) = 0 then 
1435
d4b32ee3caa6
Fix using freed memory (could be the cause of queue error problem and other bugs)
unc0rr
parents:
1434
diff
changeset

1288 
for i:= 0 to Pred(cLandAdditions) do 
1515  1289 
begin 
1290 
Gear:= AddGear(0, 0, gtMine, 0, _0, _0, 0); 

1760  1291 
FindPlace(Gear, false, 0, LAND_WIDTH) 
1515  1292 
end 
4  1293 
end; 
1294 

371  1295 
procedure doMakeExplosion(X, Y, Radius: LongInt; Mask: LongWord); 
4  1296 
var Gear: PGear; 
506  1297 
dmg, dmgRadius: LongInt; 
4  1298 
begin 
1299 
TargetPoint.X:= NoPointX; 

1434  1300 
{$IFDEF DEBUGFILE}if Radius > 4 then AddFileLog('Explosion: at (' + inttostr(x) + ',' + inttostr(y) + ')');{$ENDIF} 
1049  1301 
if (Radius > 10) then AddGear(X, Y, gtExplosion, 0, _0, _0, 0); 
1669  1302 
if (Mask and EXPLAutoSound) <> 0 then PlaySound(sndExplosion, false, nil); 
1433  1303 

1304 
if (Mask and EXPLAllDamageInRadius) = 0 then 

1305 
dmgRadius:= Radius shl 1 

1306 
else 

1307 
dmgRadius:= Radius; 

1308 

4  1309 
Gear:= GearsList; 
1310 
while Gear <> nil do 

1200  1311 
begin 
1312 
dmg:= dmgRadius + cHHRadius div 2  hwRound(Distance(Gear^.X  int2hwFloat(X), Gear^.Y  int2hwFloat(Y))); 

1313 
if (dmg > 1) and 

1314 
((Gear^.State and gstNoDamage) = 0) then 

1315 
begin 

1861  1316 
dmg:= modifyDamage(min(dmg div 2, Radius)); 
1200  1317 
case Gear^.Kind of 
1318 
gtHedgehog, 

1319 
gtMine, 

1320 
gtCase, 

1321 
gtTarget, 

1322 
gtFlame: begin 

1346  1323 
//{$IFDEF DEBUGFILE}AddFileLog('Damage: ' + inttostr(dmg));{$ENDIF} 
1200  1324 
if (Mask and EXPLNoDamage) = 0 then 
1325 
begin 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1326 
if not Gear^.Invulnerable then 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1327 
begin 
1854  1328 
inc(Gear^.Damage, dmg); 
1329 
if Gear^.Kind = gtHedgehog then 

1330 
AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), dmg, PHedgehog(Gear^.Hedgehog)^.Team^.Clan^.Color); 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1331 
end 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1332 
else 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1333 
Gear^.State:= Gear^.State or gstWinner; 
1200  1334 
end; 
1335 
if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog) then 

1336 
begin 

1337 
DeleteCI(Gear); 

1338 
Gear^.dX:= Gear^.dX + SignAs(_0_005 * dmg + cHHKick, Gear^.X  int2hwFloat(X)); 

1339 
Gear^.dY:= Gear^.dY + SignAs(_0_005 * dmg + cHHKick, Gear^.Y  int2hwFloat(Y)); 

1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1340 
Gear^.State:= Gear^.State or gstMoving; 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1341 
if not Gear^.Invulnerable then 
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

1342 
Gear^.State:= Gear^.State and (not gstWinner); 
1200  1343 
Gear^.Active:= true; 
1344 
FollowGear:= Gear 

1345 
end; 

1346 
end; 

1347 
gtGrave: begin 

1348 
Gear^.dY:=  _0_004 * dmg; 

1349 
Gear^.Active:= true; 

1350 
end; 

1351 
end; 

1352 
end; 

1353 
Gear:= Gear^.NextGear 

1354 
end; 

1355 

621  1356 
if (Mask and EXPLDontDraw) = 0 then 
1200  1357 
if (GameFlags and gfSolidLand) = 0 then DrawExplosion(X, Y, Radius); 
1358 

498  1359 
uAIMisc.AwareOfExplosion(0, 0, 0) 
4  1360 
end; 
1361 

506  1362 
procedure ShotgunShot(Gear: PGear); 
1363 
var t: PGear; 

955  1364 
dmg: LongInt; 
506  1365 
begin 
509  1366 
Gear^.Radius:= cShotgunRadius; 
506  1367 
t:= GearsList; 
1368 
while t <> nil do 

1286  1369 
begin 
1861  1370 
dmg:= modifyDamage(min(Gear^.Radius + t^.Radius  hwRound(Distance(Gear^.X  t^.X, Gear^.Y  t^.Y)), 25)); 
1286  1371 
if dmg > 0 then 
1372 
case t^.Kind of 

1373 
gtHedgehog, 

1374 
gtMine, 

1375 
gtCase, 

1376 
gtTarget: begin 

1854  1377 
if (not t^.Invulnerable) then 
1378 
begin 

1849  1379 
inc(t^.Damage, dmg); 
1854  1380 
if t^.Kind = gtHedgehog then 
1381 
AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), dmg, PHedgehog(t^.Hedgehog)^.Team^.Clan^.Color); 

1865
