author  nemo 
Sat, 16 May 2009 19:03:08 +0000  
changeset 2067  7524a783bd8c 
parent 2057  cf0d84479251 
child 2070  28891bb36ba5 
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; 

2042
905c554d62e6
Move Speech to visual gears. This checkin CRASHES on deletion of visual gear outside the doStep
nemo
parents:
2031
diff
changeset

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; 
2017  62 
procedure ApplyDamage(Gear: PGear; Damage: Longword); 
4  63 
procedure SetAllToActive; 
64 
procedure SetAllHHToActive; 

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

4  71 

72 
var CurAmmoGear: PGear = nil; 

68  73 
GearsList: PGear = nil; 
307  74 
KilledHHs: Longword = 0; 
2017  75 
SuddenDeathDmg: Boolean = false; 
76 
SpeechType: Longword = 1; 

77 
SpeechText: shortstring; 

70  78 

4  79 
implementation 
81  80 
uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions, 
1906  81 
uLand, uIO, uLandGraphics, uAIMisc, uLocale, uAI, uAmmos, uTriggers, 
82 
{$IFDEF IPHONE} 

83 
gles11, 

84 
{$ELSE} 

85 
GL, 

86 
{$ENDIF} 

1259  87 
uStats, uVisualGears; 
789  88 

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

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

92 
HookAngle: GLfloat; 
789  93 
ar: array[0..MAXROPEPOINTS] of record 
351  94 
X, Y: hwFloat; 
95 
dLen: hwFloat; 

4  96 
b: boolean; 
97 
end; 

98 
end; 

99 

1515  100 
procedure DeleteGear(Gear: PGear); forward; 
371  101 
procedure doMakeExplosion(X, Y, Radius: LongInt; Mask: LongWord); forward; 
102 
procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt); forward; 

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

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

110 
procedure HedgehogChAngle(Gear: PGear); forward; 
506  111 
procedure ShotgunShot(Gear: PGear); forward; 
1689  112 
procedure PickUp(HH, Gear: PGear); forward; 
1964  113 
procedure HHSetWeapon(Gear: PGear); forward; 
114 

4  115 

116 
{$INCLUDE GSHandlers.inc} 

117 
{$INCLUDE HHHandlers.inc} 

118 

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

1259  120 
@doStepBomb, 
121 
@doStepHedgehog, 

122 
@doStepGrenade, 

123 
@doStepHealthTag, 

124 
@doStepGrave, 

125 
@doStepUFO, 

126 
@doStepShotgunShot, 

127 
@doStepPickHammer, 

128 
@doStepRope, 

129 
@doStepSmokeTrace, 

130 
@doStepExplosion, 

131 
@doStepMine, 

132 
@doStepCase, 

133 
@doStepDEagleShot, 

134 
@doStepDynamite, 

135 
@doStepBomb, 

136 
@doStepCluster, 

137 
@doStepShover, 

138 
@doStepFlame, 

139 
@doStepFirePunch, 

140 
@doStepActionTimer, 

141 
@doStepActionTimer, 

142 
@doStepActionTimer, 

143 
@doStepParachute, 

144 
@doStepAirAttack, 

145 
@doStepAirBomb, 

146 
@doStepBlowTorch, 

147 
@doStepGirder, 

148 
@doStepTeleport, 

149 
@doStepSwitcher, 

150 
@doStepCase, 

151 
@doStepMortar, 

152 
@doStepWhip, 

153 
@doStepKamikaze, 

154 
@doStepCake, 

1261  155 
@doStepSeduction, 
1279  156 
@doStepWatermelon, 
1263  157 
@doStepCluster, 
158 
@doStepBomb, 

1298  159 
@doStepSmokeTrace, 
1573  160 
@doStepWaterUp, 
1601  161 
@doStepDrill, 
162 
@doStepBallgun, 

1689  163 
@doStepBomb, 
2017  164 
@doStepRCPlane, 
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

165 
@doStepSniperRifleShot 
1259  166 
); 
4  167 

294  168 
procedure InsertGearToList(Gear: PGear); 
803  169 
var tmp, ptmp: PGear; 
294  170 
begin 
171 
if GearsList = nil then 

1505  172 
GearsList:= Gear 
173 
else begin 

174 
tmp:= GearsList; 

175 
ptmp:= GearsList; 

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

177 
begin 

178 
ptmp:= tmp; 

179 
tmp:= tmp^.NextGear 

180 
end; 

294  181 

1505  182 
if ptmp <> nil then 
183 
begin 

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

185 
Gear^.PrevGear:= ptmp; 

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

187 
ptmp^.NextGear:= Gear 

188 
end 

189 
else GearsList:= Gear 

190 
end 

294  191 
end; 
192 

193 
procedure RemoveGearFromList(Gear: PGear); 

194 
begin 

351  195 
if Gear^.NextGear <> nil then Gear^.NextGear^.PrevGear:= Gear^.PrevGear; 
1505  196 
if Gear^.PrevGear <> nil then 
197 
Gear^.PrevGear^.NextGear:= Gear^.NextGear 

198 
else 

199 
GearsList:= Gear^.NextGear 

294  200 
end; 
201 

371  202 
function AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear; 
79  203 
const Counter: Longword = 0; 
351  204 
var Result: PGear; 
4  205 
begin 
79  206 
inc(Counter); 
1495  207 
{$IFDEF DEBUGFILE} 
1503  208 
AddFileLog('AddGear: #' + inttostr(Counter) + ' (' + inttostr(x) + ',' + inttostr(y) + '), d(' + floattostr(dX) + ',' + floattostr(dY) + ') type = ' + inttostr(ord(Kind))); 
1495  209 
{$ENDIF} 
210 

4  211 
New(Result); 
212 
FillChar(Result^, sizeof(TGear), 0); 

498  213 
Result^.X:= int2hwFloat(X); 
214 
Result^.Y:= int2hwFloat(Y); 

351  215 
Result^.Kind := Kind; 
216 
Result^.State:= State; 

217 
Result^.Active:= true; 

218 
Result^.dX:= dX; 

219 
Result^.dY:= dY; 

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

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

225 

4  226 
if CurrentTeam <> nil then 
1505  227 
begin 
228 
Result^.Hedgehog:= CurrentHedgehog; 

229 
Result^.IntersectGear:= CurrentHedgehog^.Gear 

230 
end; 

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

231 

4  232 
case Kind of 
915  233 
gtAmmo_Bomb, 
234 
gtClusterBomb: begin 

351  235 
Result^.Radius:= 4; 
236 
Result^.Elasticity:= _0_6; 

997  237 
Result^.Friction:= _0_96; 
4  238 
end; 
1261  239 
gtWatermelon: begin 
240 
Result^.Radius:= 4; 

241 
Result^.Elasticity:= _0_8; 

242 
Result^.Friction:= _0_995; 

243 
end; 

4  244 
gtHedgehog: begin 
351  245 
Result^.Radius:= cHHRadius; 
246 
Result^.Elasticity:= _0_35; 

247 
Result^.Friction:= _0_999; 

248 
Result^.Angle:= cMaxAngle div 2; 

249 
Result^.Z:= cHHZ; 

4  250 
end; 
251 
gtAmmo_Grenade: begin 

351  252 
Result^.Radius:= 4; 
4  253 
end; 
254 
gtHealthTag: begin 

351  255 
Result^.Timer:= 1500; 
2017  256 
Result^.Z:= 2002; 
257 
end; 

4  258 
gtGrave: begin 
351  259 
Result^.Radius:= 10; 
260 
Result^.Elasticity:= _0_6; 

4  261 
end; 
262 
gtUFO: begin 

351  263 
Result^.Radius:= 5; 
264 
Result^.Timer:= 500; 

265 
Result^.Elasticity:= _0_9 

4  266 
end; 
267 
gtShotgunShot: begin 

351  268 
Result^.Timer:= 900; 
269 
Result^.Radius:= 2 

4  270 
end; 
271 
gtPickHammer: begin 

351  272 
Result^.Radius:= 10; 
273 
Result^.Timer:= 4000 

4  274 
end; 
1263  275 
gtSmokeTrace, 
276 
gtEvilTrace: begin 

498  277 
Result^.X:= Result^.X  _16; 
278 
Result^.Y:= Result^.Y  _16; 

1270  279 
Result^.State:= 8; 
280 
Result^.Z:= cSmokeZ 

4  281 
end; 
282 
gtRope: begin 

351  283 
Result^.Radius:= 3; 
498  284 
Result^.Friction:= _450; 
4  285 
RopePoints.Count:= 0; 
286 
end; 

9  287 
gtExplosion: begin 
1012  288 
Result^.X:= Result^.X; 
289 
Result^.Y:= Result^.Y; 

9  290 
end; 
10  291 
gtMine: begin 
503  292 
Result^.State:= Result^.State or gstMoving; 
915  293 
Result^.Radius:= 2; 
351  294 
Result^.Elasticity:= _0_55; 
295 
Result^.Friction:= _0_995; 

2031
b6f3e56fb100
david_ac's game scheme options for mine delay/quantity, tweaks to sniper rifle
nemo
parents:
2028
diff
changeset

296 
if cMinesTime < 0 then 
b6f3e56fb100
david_ac's game scheme options for mine delay/quantity, tweaks to sniper rifle
nemo
parents:
2028
diff
changeset

297 
Result^.Timer:= getrandom(3)*1000 
b6f3e56fb100
david_ac's game scheme options for mine delay/quantity, tweaks to sniper rifle
nemo
parents:
2028
diff
changeset

298 
else 
b6f3e56fb100
david_ac's game scheme options for mine delay/quantity, tweaks to sniper rifle
nemo
parents:
2028
diff
changeset

299 
Result^.Timer:= cMinesTime*1; 
10  300 
end; 
14
81f125629b25
 Mine checks whether a hedgehog is near less frequently
unc0rr
parents:
10
diff
changeset

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

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

304 
end; 
37  305 
gtDEagleShot: begin 
351  306 
Result^.Radius:= 1; 
307 
Result^.Health:= 50 

37  308 
end; 
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

309 
gtSniperRifleShot: begin 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

310 
Result^.Radius:= 1; 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

311 
Result^.Health:= 50 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

312 
end; 
39  313 
gtDynamite: begin 
351  314 
Result^.Radius:= 3; 
315 
Result^.Elasticity:= _0_55; 

316 
Result^.Friction:= _0_03; 

317 
Result^.Timer:= 5000; 

39  318 
end; 
910  319 
gtCluster: Result^.Radius:= 2; 
878  320 
gtShover: Result^.Radius:= 20; 
79  321 
gtFlame: begin 
1586  322 
Result^.Tag:= Counter mod 32; 
351  323 
Result^.Radius:= 1; 
1586  324 
Result^.Health:= 5; 
1555  325 
if (Result^.dY.QWordValue = 0) and (Result^.dX.QWordValue = 0) then 
326 
begin 

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

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

329 
end 

79  330 
end; 
82  331 
gtFirePunch: begin 
351  332 
Result^.Radius:= 15; 
333 
Result^.Tag:= Y 

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

336 
Result^.Radius:= 5; 
302  337 
end; 
338 
gtBlowTorch: begin 

511  339 
Result^.Radius:= cHHRadius + cBlowTorchC; 
351  340 
Result^.Timer:= 7500; 
302  341 
end; 
540  342 
gtSwitcher: begin 
343 
Result^.Z:= cCurrHHZ 

344 
end; 

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

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

347 
Result^.Elasticity:= _0_3 
593  348 
end; 
924  349 
gtMortar: begin 
994  350 
Result^.Radius:= 4; 
924  351 
Result^.Elasticity:= _0_2; 
352 
Result^.Friction:= _0_08 

353 
end; 

925  354 
gtWhip: Result^.Radius:= 20; 
984  355 
gtKamikaze: begin 
356 
Result^.Health:= 2048; 

357 
Result^.Radius:= 20 

358 
end; 

1089  359 
gtCake: begin 
1261  360 
Result^.Health:= 2048; 
1103  361 
Result^.Radius:= 7; 
1109  362 
Result^.Z:= cOnHHZ; 
1089  363 
if hwSign(dX) > 0 then Result^.Angle:= 1 else Result^.Angle:= 3 
364 
end; 

1263  365 
gtHellishBomb: begin 
366 
Result^.Radius:= 4; 

367 
Result^.Elasticity:= _0_5; 

368 
Result^.Friction:= _0_96; 

369 
end; 

1573  370 
gtDrill: begin 
371 
Result^.Timer:= 5000; 

372 
Result^.Radius:= 4; 

373 
end; 

1601  374 
gtBall: begin 
375 
Result^.Radius:= 5; 

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

377 
Result^.Timer:= 5000; 

378 
Result^.Elasticity:= _0_7; 

379 
Result^.Friction:= _0_995; 

380 
end; 

381 
gtBallgun: begin 

382 
Result^.Timer:= 5001; 

383 
end; 

1689  384 
gtRCPlane: begin 
385 
Result^.Timer:= 15000; 

386 
Result^.Health:= 3; 

387 
Result^.Radius:= 8; 

388 
end; 

4  389 
end; 
351  390 
InsertGearToList(Result); 
391 
AddGear:= Result 

4  392 
end; 
393 

1515  394 
procedure DeleteGear(Gear: PGear); 
48  395 
var team: PTeam; 
1515  396 
t: Longword; 
4  397 
begin 
503  398 
DeleteCI(Gear); 
762  399 

400 
if Gear^.Tex <> nil then 

1495  401 
begin 
402 
FreeTexture(Gear^.Tex); 

403 
Gear^.Tex:= nil 

404 
end; 

762  405 

351  406 
if Gear^.Kind = gtHedgehog then 
1495  407 
if CurAmmoGear <> nil then 
408 
begin 

409 
Gear^.Message:= gm_Destroy; 

410 
CurAmmoGear^.Message:= gm_Destroy; 

411 
exit 

412 
end 

413 
else 

414 
begin 

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

416 
begin 

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

418 
Gear^.Damage:= t; 

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

420 
uStats.HedgehogDamaged(Gear) 

421 
end; 

1515  422 

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

425 
FreeActionsList; // to avoid ThinkThread on drawned gear 

1515  426 

1495  427 
PHedgehog(Gear^.Hedgehog)^.Gear:= nil; 
428 
inc(KilledHHs); 

1515  429 
RecountTeamHealth(team) 
1495  430 
end; 
431 
{$IFDEF DEBUGFILE} 

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

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

435 
if Gear^.TriggerId <> 0 then TickTrigger(Gear^.TriggerId); 
82  436 
if CurAmmoGear = Gear then CurAmmoGear:= nil; 
4  437 
if FollowGear = Gear then FollowGear:= nil; 
294  438 
RemoveGearFromList(Gear); 
1515  439 
Dispose(Gear) 
4  440 
end; 
441 

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

443 
var Gear: PGear; 

1849  444 
dmg: LongInt; 
4  445 
begin 
351  446 
CheckNoDamage:= true; 
4  447 
Gear:= GearsList; 
448 
while Gear <> nil do 

867  449 
begin 
450 
if Gear^.Kind = gtHedgehog then 

1861  451 
begin 
1849  452 
if (Gear^.Damage <> 0) and 
453 
(not Gear^.Invulnerable) then 

1861  454 
begin 
455 
CheckNoDamage:= false; 

456 
uStats.HedgehogDamaged(Gear); 

457 
dmg:= Gear^.Damage; 

458 
if Gear^.Health < dmg then 

459 
Gear^.Health:= 0 

460 
else 

461 
dec(Gear^.Health, dmg); 

351  462 

2017  463 
if (PHedgehog(Gear^.Hedgehog)^.Team = CurrentTeam) and 
464 
not SuddenDeathDmg then 

465 
Gear^.State:= Gear^.State or gstLoser; 

466 

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

867  469 

1861  470 
RenderHealth(PHedgehog(Gear^.Hedgehog)^); 
471 
RecountTeamHealth(PHedgehog(Gear^.Hedgehog)^.Team); 

1505  472 

1861  473 
end; 
474 
Gear^.Damage:= 0; 

475 
end; 

867  476 
Gear:= Gear^.NextGear 
477 
end; 

2017  478 
SuddenDeathDmg:= false; 
4  479 
end; 
480 

1054  481 
procedure HealthMachine; 
482 
var Gear: PGear; 

483 
begin 

484 
Gear:= GearsList; 

485 

486 
while Gear <> nil do 

487 
begin 

488 
if Gear^.Kind = gtHedgehog then 

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

490 

491 
Gear:= Gear^.NextGear 

492 
end; 

493 
end; 

494 

4  495 
procedure ProcessGears; 
614  496 
const delay: LongWord = 0; 
1797  497 
step: (stDelay, stChDmg, stSweep, stTurnReact, 
1495  498 
stAfterDelay, stChWin, stWater, stChWin2, stHealth, 
499 
stSpawn, stNTurn) = stDelay; 

1054  500 

4  501 
var Gear, t: PGear; 
502 
begin 

868  503 
PrvInactive:= AllInactive; 
4  504 
AllInactive:= true; 
1495  505 

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

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

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

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

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

512 
end; 
89  513 

4  514 
if AllInactive then 
1343  515 
case step of 
516 
stDelay: begin 

517 
if delay = 0 then 

518 
delay:= cInactDelay 

519 
else 

520 
dec(delay); 

614  521 

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

524 
end; 

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

1792  527 
begin 
1918  528 
SetAllToActive; 
1792  529 
step:= stChDmg 
1797  530 
end else inc(step); 
1343  531 
stTurnReact: begin 
532 
if (not bBetweenTurns) and (not isInMultiShoot) then 

533 
begin 

534 
uStats.TurnReaction; 

535 
inc(step) 

536 
end else 

537 
inc(step, 2); 

538 
end; 

539 
stAfterDelay: begin 

540 
if delay = 0 then 

541 
delay:= cInactDelay 

542 
else 

543 
dec(delay); 

815  544 

1343  545 
if delay = 0 then 
546 
inc(step) 

547 
end; 

548 
stChWin: begin 

549 
CheckForWin; 

550 
inc(step) 

551 
end; 

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

553 
begin 

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

554 
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

555 

1343  556 
if bWaterRising then 
557 
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

558 

1343  559 
inc(step) 
560 
end else inc(step); 

561 
stChWin2: begin 

562 
CheckForWin; 

563 
inc(step) 

564 
end; 

565 
stHealth: begin 

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

566 
if (TotalRounds = cSuddenDTurns) and (cHealthDecrease = 0) then 
1343  567 
begin 
568 
cHealthDecrease:= 5; 

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

570 
end; 

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

571 

1343  572 
if (cHealthDecrease = 0) 
573 
or bBetweenTurns 

574 
or isInMultiShoot 

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

576 
else begin 

577 
bBetweenTurns:= true; 

578 
HealthMachine; 

2017  579 
SuddenDeathDmg:= true; 
1343  580 
step:= stChDmg 
581 
end 

582 
end; 

583 
stSpawn: begin 

584 
if not isInMultiShoot then SpawnBoxOfSmth; 

585 
inc(step) 

586 
end; 

587 
stNTurn: begin 

588 
if isInMultiShoot then isInMultiShoot:= false 

589 
else begin 

1849  590 
ResetUtilities; 
1343  591 
ParseCommand('/nextturn', true); 
592 
SwitchHedgehog; 

1298  593 

2045
b0588498bc3a
 Fix network (my crappy fault, triggered by nemo's patch)
unc0rr
parents:
2042
diff
changeset

594 
inc(step); // FIXME wtf is that, it overflows step, and does nothing 
1298  595 

1343  596 
AfterSwitchHedgehog; 
597 
bBetweenTurns:= false 

598 
end; 

599 
step:= Low(step) 

600 
end; 

601 
end; 

15  602 

4  603 
if TurnTimeLeft > 0 then 
870  604 
if CurrentHedgehog^.Gear <> nil then 
605 
if ((CurrentHedgehog^.Gear^.State and gstAttacking) = 0) 

606 
and not isInMultiShoot then 

607 
begin 

608 
if (TurnTimeLeft = 5000) 

609 
and (CurrentHedgehog^.Gear <> nil) 

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

870  612 
dec(TurnTimeLeft) 
613 
end; 

351  614 

651  615 
if (not CurrentTeam^.ExtDriven) and 
917  616 
((GameTicks and $FFFF) = $FFFF) then 
617 
begin 

618 
SendIPCTimeInc; 

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

620 
end; 

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

621 

515  622 
inc(GameTicks) 
4  623 
end; 
624 

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

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

628 
var i: LongInt; 
1849  629 
begin 
2017  630 
SpeechText:= ''; // in case it hasn't been consumed 
631 

1895  632 
if (GameFlags and gfLowGravity) = 0 then 
633 
cGravity:= cMaxWindSpeed; 

634 

2017  635 
if (GameFlags and gfVampiric) = 0 then 
636 
cVampiric:= false; 

637 

1849  638 
cDamageModifier:= _1; 
1895  639 

640 
if (GameFlags and gfLaserSight) = 0 then 

641 
cLaserSighting:= false; 

2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

642 

41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

643 
if (GameFlags and gfArtillery) = 0 then 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

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

645 

2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

646 
// 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 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

647 
if (CurrentTeam <> nil) then 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

648 
with CurrentTeam^ do 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

649 
for i:= 0 to cMaxHHIndex do 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

650 
with Hedgehogs[i] do 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

651 
begin 
2045
b0588498bc3a
 Fix network (my crappy fault, triggered by nemo's patch)
unc0rr
parents:
2042
diff
changeset

652 
if (SpeechGear <> nil) then 
b0588498bc3a
 Fix network (my crappy fault, triggered by nemo's patch)
unc0rr
parents:
2042
diff
changeset

653 
begin 
b0588498bc3a
 Fix network (my crappy fault, triggered by nemo's patch)
unc0rr
parents:
2042
diff
changeset

654 
DeleteVisualGear(SpeechGear); // remove to restore persisting beyond end of turn. Tiy says was too much of a gameplay issue 
b0588498bc3a
 Fix network (my crappy fault, triggered by nemo's patch)
unc0rr
parents:
2042
diff
changeset

655 
SpeechGear:= nil 
b0588498bc3a
 Fix network (my crappy fault, triggered by nemo's patch)
unc0rr
parents:
2042
diff
changeset

656 
end; 
b0588498bc3a
 Fix network (my crappy fault, triggered by nemo's patch)
unc0rr
parents:
2042
diff
changeset

657 

2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

658 
if (Gear <> nil) then 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

659 
if (GameFlags and gfInvulnerable) = 0 then 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

660 
Gear^.Invulnerable:= false; 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

661 
end; 
1849  662 
end; 
2045
b0588498bc3a
 Fix network (my crappy fault, triggered by nemo's patch)
unc0rr
parents:
2042
diff
changeset

663 

2017  664 
procedure ApplyDamage(Gear: PGear; Damage: Longword); 
665 
var s: shortstring; 

2067
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

666 
vampDmg, tmpDmg: Longword; 
2017  667 
begin 
668 
if Gear^.Kind = gtHedgehog then 

669 
begin 

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

2067
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

671 
tmpDmg:= min(Damage, max(0,Gear^.HealthGear^.Damage)); 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

672 
if (Gear <> CurrentHedgehog^.Gear) and (CurrentHedgehog^.Gear <> nil) and (tmpDmg >= 1) then 
2017  673 
begin 
674 
if cVampiric then 

675 
begin 

2067
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

676 
vampDmg:= hwRound(int2hwFloat(tmpDmg)*_0_8); 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

677 
if vampDmg >= 1 then 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

678 
begin 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

679 
// was considering pulsing on attack, Tiy thinks it should be permanent while in play 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

680 
//CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State or gstVampiric; 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

681 
inc(CurrentHedgehog^.Gear^.Health,vampDmg); 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

682 
str(vampDmg, s); 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

683 
s:= '+' + s; 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

684 
AddCaption(s, CurrentHedgehog^.Team^.Clan^.Color, capgrpAmmoinfo); 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

685 
RenderHealth(CurrentHedgehog^); 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

686 
RecountTeamHealth(CurrentHedgehog^.Team); 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

687 
end 
2017  688 
end; 
689 
if ((GameFlags and gfKarma) <> 0) and 

690 
((GameFlags and gfInvulnerable) = 0) and 

691 
not CurrentHedgehog^.Gear^.Invulnerable then 

692 
begin // this cannot just use Damage or it interrupts shotgun and gets you called stupid 

2067
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

693 
if CurrentHedgehog^.Gear^.Health < int(tmpDmg) then 
2017  694 
begin 
695 
// Add damage to trigger normal resolution 

696 
CurrentHedgehog^.Gear^.Health := 0; 

697 
inc(CurrentHedgehog^.Gear^.Damage); 

698 
end 

699 
else 

2067
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

700 
dec(CurrentHedgehog^.Gear^.Health, tmpDmg); 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

701 
AddGear(hwRound(CurrentHedgehog^.Gear^.X), 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

702 
hwRound(CurrentHedgehog^.Gear^.Y), 
7524a783bd8c
use separate variable for vamp/karma calcs, move karma damage tag from point of damage origin to originating hedgehog at unc0rr's request
nemo
parents:
2057
diff
changeset

703 
gtHealthTag, tmpDmg, _0, _0, 0)^.Hedgehog:= CurrentHedgehog; 
2017  704 
RenderHealth(CurrentHedgehog^); 
705 
RecountTeamHealth(CurrentHedgehog^.Team); 

706 
end; 

707 
end; 

708 
end; 

2057
cf0d84479251
Prevent gaining more health than hedgehog actually has
nemo
parents:
2053
diff
changeset

709 
inc(Gear^.Damage, Damage); 
2017  710 
end; 
1849  711 

4  712 
procedure SetAllToActive; 
713 
var t: PGear; 

714 
begin 

715 
AllInactive:= false; 

716 
t:= GearsList; 

351  717 
while t <> nil do 
1505  718 
begin 
719 
t^.Active:= true; 

720 
t:= t^.NextGear 

721 
end 

4  722 
end; 
723 

724 
procedure SetAllHHToActive; 

725 
var t: PGear; 

726 
begin 

727 
AllInactive:= false; 

728 
t:= GearsList; 

351  729 
while t <> nil do 
1505  730 
begin 
731 
if t^.Kind = gtHedgehog then t^.Active:= true; 

732 
t:= t^.NextGear 

733 
end 

4  734 
end; 
735 

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

736 
procedure DrawHH(Gear: PGear); 
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

737 
var i, t: LongInt; 
822  738 
amt: TAmmoType; 
2020  739 
hx, hy, cx, cy, tx, ty, sx, sy, m: LongInt; // hedgehog, crosshair, temp, sprite, direction 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

740 
lx, ly, dx, dy, ax, ay, aAngle, dAngle: real; // laser, change 
1253  741 
defaultPos, HatVisible: boolean; 
1906  742 
VertexBuffer: array [0..1] of TVertex2f; 
292  743 
begin 
2020  744 
m:= 1; 
745 
if (Gear^.State and gstHHHJump) <> 0 then m:= 1; 

868  746 
if (Gear^.State and gstHHDeath) <> 0 then 
747 
begin 

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

749 
exit 

750 
end; 

1002  751 

824  752 
defaultPos:= true; 
1253  753 
HatVisible:= false; 
847  754 

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

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

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

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

759 
DrawHedgehog(sx, sy, 
1002  760 
hwSign(Gear^.dX), 
761 
1, 

762 
7, 

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

763 
0); 
1002  764 
defaultPos:= false 
765 
end else 

1892  766 
if ((Gear^.State and gstWinner) <> 0) and 
767 
((CurAmmoGear = nil) or (CurAmmoGear^.Kind <> gtPickHammer)) then 

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

769 
DrawHedgehog(sx, sy, 
1011  770 
hwSign(Gear^.dX), 
771 
2, 

772 
0, 

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

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

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

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

776 
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

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

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

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

780 
2, 
2053
9a8a4add3eff
Use shrug frame for injuring yourself/teammate, add custom theme music to Sheep theme
nemo
parents:
2045
diff
changeset

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

782 
0); 
1011  783 
defaultPos:= false 
784 
end else 

785 

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

786 
if (Gear^.State and gstHHDriven) <> 0 then 
966  787 
begin 
2028  788 
if ((Gear^.State and gstHHThinking) = 0) and 
789 
ShowCrosshair and 

790 
((Gear^.State and (gstAttacked or gstAnimation)) = 0) then 

791 
begin 

792 
(* These calculations are a little complex for a few reasons: 

793 
1: I need to draw the laser from weapon origin to nearest land 

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

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

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

797 
*) 

798 
dx:= hwSign(Gear^.dX) * m * Sin(Gear^.Angle * pi / cMaxAngle); 

799 
dy:=  Cos(Gear^.Angle * pi / cMaxAngle); 

800 
if cLaserSighting then 

801 
begin 

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

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

804 
lx:= lx + dx * 16; 

805 
ly:= ly + dy * 16; 

806 

807 
ax:= dx * 4; 

808 
ay:= dy * 4; 

809 

810 
tx:= round(lx); 

811 
ty:= round(ly); 

812 
hx:= tx; 

813 
hy:= ty; 

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

815 
((tx and LAND_WIDTH_MASK) = 0) and 

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

817 
begin 

818 
lx:= lx + ax; 

819 
ly:= ly + ay; 

820 
tx:= round(lx); 

821 
ty:= round(ly) 

822 
end; 

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

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

825 
begin 

826 
tx:= round(lx + ax * (LAND_WIDTH div 4)); 

827 
ty:= round(ly + ay * (LAND_WIDTH div 4)); 

828 
end; 

829 

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

831 
begin 

832 
glDisable(GL_TEXTURE_2D); 

833 
glEnable(GL_LINE_SMOOTH); 

834 

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

836 
VertexBuffer[0].X:= hx + WorldDx; 

837 
VertexBuffer[0].Y:= hy + WorldDy; 

838 
VertexBuffer[1].X:= tx + WorldDx; 

839 
VertexBuffer[1].Y:= ty + WorldDy; 

840 

841 
glEnableClientState(GL_VERTEX_ARRAY); 

842 
glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); 

843 
glDrawArrays(GL_LINES, 0, Length(VertexBuffer)); 

844 
glColor4f(1, 1, 1, 1); 

845 
glEnable(GL_TEXTURE_2D); 

846 
glDisable(GL_LINE_SMOOTH); 

847 
end; 

848 
end; 

849 
// draw crosshair 

850 
cx:= Round(hwRound(Gear^.X) + dx * 80); 

851 
cy:= Round(hwRound(Gear^.Y) + dy * 80); 

852 
DrawRotatedTex(PHedgehog(Gear^.Hedgehog)^.Team^.CrosshairTex, 

853 
12, 12, cx + WorldDx, cy + WorldDy, 0, 

854 
hwSign(Gear^.dX) * (Gear^.Angle * 180.0) / cMaxAngle); 

855 
end; 

1002  856 
hx:= hwRound(Gear^.X) + 1 + 8 * hwSign(Gear^.dX) + WorldDx; 
857 
hy:= hwRound(Gear^.Y)  2 + WorldDy; 

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

874  859 

1002  860 
if CurAmmoGear <> nil then 
861 
begin 

862 
case CurAmmoGear^.Kind of 

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

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

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

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

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

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

868 
end; 
1002  869 
gtDEagleShot: DrawRotated(sprDEagle, hx, hy, hwSign(Gear^.dX), aangle); 
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

870 
gtSniperRifleShot: begin 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

871 
if (CurAmmoGear^.State and gstAnimation <> 0) then 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

872 
DrawRotatedF(sprSniperRifle, hx, hy, 1, hwSign(Gear^.dX), aangle) 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

873 
else 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

874 
DrawRotatedF(sprSniperRifle, hx, hy, 0, hwSign(Gear^.dX), aangle) 
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

875 
end; 
1601  876 
gtBallgun: DrawRotated(sprHandBallgun, hx, hy, hwSign(Gear^.dX), aangle); 
1717  877 
gtRCPlane: begin 
878 
DrawRotated(sprHandPlane, hx, hy, hwSign(Gear^.dX), 0); 

879 
defaultPos:= false 

880 
end; 

1002  881 
gtRope: begin 
882 
if Gear^.X < CurAmmoGear^.X then 

883 
begin 

884 
dAngle:= 0; 

2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

885 
i:= 1 
1002  886 
end else 
887 
begin 

888 
dAngle:= 180; 

2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

889 
i:= 1 
966  890 
end; 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

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

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

893 
DrawHedgehog(sx, sy, 
2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

894 
i, 
1002  895 
1, 
896 
0, 

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

897 
DxDy2Angle(CurAmmoGear^.dY, CurAmmoGear^.dX) + dAngle); 
1002  898 
defaultPos:= false 
899 
end; 

900 
gtBlowTorch: begin 

901 
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

902 
DrawHedgehog(sx, sy, 
1002  903 
hwSign(Gear^.dX), 
904 
3, 

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

906 
0); 
1002  907 
defaultPos:= false 
908 
end; 

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

910 
gtFirePunch: begin 

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

911 
DrawHedgehog(sx, sy, 
1002  912 
hwSign(Gear^.dX), 
913 
1, 

914 
4, 

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

915 
0); 
1002  916 
defaultPos:= false 
917 
end; 

1892  918 
gtPickHammer: begin 
919 
defaultPos:= false; 

920 
dec(sy,20); 

921 
end; 

1002  922 
gtTeleport: defaultPos:= false; 
1010  923 
gtWhip: begin 
924 
DrawRotatedF(sprWhip, 

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

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

926 
sy, 
1010  927 
1, 
928 
hwSign(Gear^.dX), 

929 
0); 

930 
defaultPos:= false 

931 
end; 

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

934 
DrawHedgehog(sx, sy, 
1286  935 
hwSign(Gear^.dX), 
936 
1, 

937 
6, 

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

938 
0) 
1286  939 
else 
940 
DrawRotatedF(sprKamikaze, 

941 
hwRound(Gear^.X) + WorldDx, 

942 
hwRound(Gear^.Y) + WorldDy, 

943 
CurAmmoGear^.Pos  1, 

2025
692308790912
Adjust routines impacted by DrawRotatedF modification, clear gstHHHJump in rope to avoid crosshair/hat drawing bug.
nemo
parents:
2023
diff
changeset

944 
hwSign(Gear^.dX), 
692308790912
Adjust routines impacted by DrawRotatedF modification, clear gstHHHJump in rope to avoid crosshair/hat drawing bug.
nemo
parents:
2023
diff
changeset

945 
aangle); 
1286  946 
defaultPos:= false 
947 
end; 

948 
gtSeduction: begin 

949 
if CurAmmoGear^.Pos >= 6 then 

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

950 
DrawHedgehog(sx, sy, 
1286  951 
hwSign(Gear^.dX), 
952 
2, 

953 
2, 

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

954 
0) 
1286  955 
else 
956 
begin 

957 
DrawRotatedF(sprDress, 

958 
hwRound(Gear^.X) + WorldDx, 

959 
hwRound(Gear^.Y) + WorldDy, 

960 
CurAmmoGear^.Pos, 

961 
hwSign(Gear^.dX), 

962 
0); 

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

964 
end; 

965 
defaultPos:= false 

966 
end; 

1002  967 
end; 
968 

969 
case CurAmmoGear^.Kind of 

970 
gtShotgunShot, 

971 
gtDEagleShot, 

2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

972 
gtSniperRifleShot, 
1002  973 
gtShover: begin 
1865
ebc6dfca60d4
 nemo's patch: some animations, zero probability for infinite weapons
unc0rr
parents:
1863
diff
changeset

974 
DrawHedgehog(sx, sy, 
1002  975 
hwSign(Gear^.dX), 
976 
0, 

977 
4, 

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

978 
0); 
1977  979 
defaultPos:= false; 
980 
HatVisible:= true 

1002  981 
end 
982 
end 

983 
end else 

876  984 

1002  985 
if ((Gear^.State and gstHHJumping) <> 0) then 
986 
begin 

2020  987 
DrawHedgehog(sx, sy, 
988 
hwSign(Gear^.dX)*m, 

989 
1, 

990 
1, 

991 
0); 

992 
HatVisible:= true; 

2017  993 
HatVisible:= true; 
1002  994 
defaultPos:= false 
995 
end else 

874  996 

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

999 
DrawHedgehog(sx, sy, 
1002  1000 
hwSign(Gear^.dX), 
1001 
0, 

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

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

1003 
0); 
1257  1004 
defaultPos:= false; 
1005 
HatVisible:= true 

1002  1006 
end 
1007 
else 

1008 

1033  1009 
if ((Gear^.State and gstAnimation) <> 0) then 
1010 
begin 

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

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

1013 
sy, 
1033  1014 
Gear^.Pos, 
1015 
hwSign(Gear^.dX), 

1016 
0.0); 

1017 
defaultPos:= false 

1018 
end 

1019 
else 

1002  1020 
if ((Gear^.State and gstAttacked) = 0) then 
1021 
begin 

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

1023 
case amt of 

1024 
amBazooka, 

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

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

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

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

2023
41d3afaa20c7
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump
nemo
parents:
2020
diff
changeset

1031 
amSniperRifle: DrawRotatedF(sprSniperRifle, hx, hy, 0, hwSign(Gear^.dX), aangle); 
1002  1032 
amBlowTorch: DrawRotated(sprHandBlowTorch, hx, hy, hwSign(Gear^.dX), aangle); 
1717  1033 
amRCPlane: begin 
1034 
DrawRotated(sprHandPlane, hx, hy, hwSign(Gear^.dX), 0); 

1035 
defaultPos:= false 

1036 
end; 

1939  1037 
amGirder: begin 
1038 
DrawSpriteClipped(sprGirder, 

1039 
sx256, 

1040 
sy256, 

1041 
LongInt(topY)+WorldDy, 

1042 
LongInt(rightX)+WorldDx, 

1043 
cWaterLine+WorldDy, 

1044 
LongInt(leftX)+WorldDx); 

1045 
end; 

1002  1046 
end; 
1047 

1048 
case amt of 

1049 
amAirAttack, 

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

1050 
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

1051 
amPickHammer: DrawHedgehog(sx, sy, 
1002  1052 
hwSign(Gear^.dX), 
1053 
1, 

1054 
2, 

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

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

1056 
amBlowTorch: DrawHedgehog(sx, sy, 
1002  1057 
hwSign(Gear^.dX), 
1058 
1, 

1059 
3, 

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

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

1061 
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

1062 
amKamikaze: DrawHedgehog(sx, sy, 
1002  1063 
hwSign(Gear^.dX), 
1064 
1, 

1065 
5, 

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

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

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

1069 
sy, 
1010  1070 
0, 
1071 
hwSign(Gear^.dX), 

1072 
0); 

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

1074 
DrawHedgehog(sx, sy, 
822  1075 
hwSign(Gear^.dX), 
1076 
0, 

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

1078 
0); 
1253  1079 

1080 
HatVisible:= true; 

1081 
with PHedgehog(Gear^.Hedgehog)^ do 

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

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

1083 
and (HatVisibility > 0) then 
1253  1084 
DrawTextureF(HatTex, 
1085 
HatVisibility, 

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

1086 
sx, 
1253  1087 
hwRound(Gear^.Y)  8 + WorldDy, 
1088 
0, 

1089 
hwSign(Gear^.dX), 

1090 
32); 

1002  1091 
end; 
966  1092 

1002  1093 
case amt of 
1094 
amBaseballBat: DrawRotated(sprHandBaseball, 

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

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

1097 
end; 

966  1098 

1002  1099 
defaultPos:= false 
1100 
end 

1101 
end else // not gstHHDriven 

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

1103 
if (Gear^.Damage > 0) 
2028  1104 
and (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > _0_003) then 
1014
3c7d4e7ccdff
 Fix firepunch sprite direction when use in high jump
unc0rr
parents:
1013
diff
changeset

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

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

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

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

1113 

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

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

1115 
begin 
2020  1116 
DrawHedgehog(sx, sy, 
1117 
hwSign(Gear^.dX)*m, 

1118 
1, 

1119 
1, 

1120 
0); 

1121 
defaultPos:= false 

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

1122 
end; 
1012  1123 
end; 
834  1124 

1251  1125 
with PHedgehog(Gear^.Hedgehog)^ do 
970  1126 
begin 
1251  1127 
if defaultPos then 
1128 
begin 

1129 
DrawRotatedF(sprHHIdle, 

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

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

1131 
sy, 
1251  1132 
(RealTicks div 128 + Gear^.Pos) mod 19, 
1133 
hwSign(Gear^.dX), 

1134 
0); 

1253  1135 
HatVisible:= true; 
1136 
end; 

1137 

1138 
if HatVisible then 

1251  1139 
if HatVisibility < 1.0 then 
1254  1140 
HatVisibility:= HatVisibility + 0.2 
1253  1141 
else 
1251  1142 
else 
1143 
if HatVisibility > 0.0 then 

1254  1144 
HatVisibility:= HatVisibility  0.2; 
1253  1145 

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

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

1147 
and (HatVisibility > 0) then 
1255  1148 
if DefaultPos then 
1149 
DrawTextureF(HatTex, 

1150 
HatVisibility, 

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

1151 
sx, 
1255  1152 
hwRound(Gear^.Y)  8 + WorldDy, 
1153 
(RealTicks div 128 + Gear^.Pos) mod 19, 

1154 
hwSign(Gear^.dX), 

1155 
32) 

1156 
else 

1157 
DrawTextureF(HatTex, 

1158 
HatVisibility, 

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

1159 
sx, 
1255  1160 
hwRound(Gear^.Y)  8 + WorldDy, 
1161 
0, 

2020  1162 
hwSign(Gear^.dX)*m, 
1255  1163 
32); 
970  1164 
end; 
292  1165 

1251  1166 

351  1167 
with PHedgehog(Gear^.Hedgehog)^ do 
994  1168 
begin 
1011  1169 
if ((Gear^.State and not gstWinner) = 0) 
994  1170 
or (bShowFinger and ((Gear^.State and gstHHDriven) <> 0)) then 
958  1171 
begin 
1660  1172 
t:= hwRound(Gear^.Y)  cHHRadius  12 + WorldDy; 
1173 
if (cTagsMask and 1) <> 0 then 

1174 
begin 

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

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

1177 
end; 

1178 
if (cTagsMask and 2) <> 0 then 

1179 
begin 

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

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

1182 
end; 

1183 
if (cTagsMask and 4) <> 0 then 

1184 
begin 

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

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

1187 
end 

958  1188 
end; 
994  1189 
if (Gear^.State and gstHHDriven) <> 0 then // Current hedgehog 
958  1190 
begin 
1191 
if bShowFinger and ((Gear^.State and gstHHDriven) <> 0) then 

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

1193 
GameTicks div 32 mod 16); 

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

1194 

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

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

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

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

1200 

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

1201 
if Gear^.Invulnerable then 
2017  1202 
begin 
1203 
DrawSprite(sprInvulnerable, sx  24, sy  24, 0); 

1204 
end; 

1205 
if cVampiric and 

1206 
(CurrentHedgehog^.Gear <> nil) and 

1207 
(CurrentHedgehog^.Gear = Gear) then 

1208 
begin 

1209 
DrawSprite(sprVampiric, sx  24, sy  24, 0); 

1210 
end; 

292  1211 
end; 
1212 

956  1213 
procedure DrawGears; 
853  1214 
var Gear, HHGear: PGear; 
4  1215 
i: Longword; 
371  1216 
roplen: LongInt; 
4  1217 

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

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

366  1221 
b: boolean; 
4  1222 
begin 
37  1223 
if (X1 = X2) and (Y1 = Y2) then 
1224 
begin 

351  1225 
OutError('WARNING: zero length rope line!', false); 
37  1226 
exit 
1227 
end; 

366  1228 
eX:= 0; 
1229 
eY:= 0; 

1230 
dX:= X2  X1; 

1231 
dY:= Y2  Y1; 

1232 

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

1234 
else 

1235 
if (dX < 0) then 

1236 
begin 

1237 
sX:= 1; 

1238 
dX:= dX 

1239 
end else sX:= dX; 

1240 

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

1242 
else 

1243 
if (dY < 0) then 

4  1244 
begin 
366  1245 
sY:= 1; 
1246 
dY:= dY 

1247 
end else sY:= dY; 

1248 

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

1250 
else d:= dY; 

1251 

1252 
x:= X1; 

1253 
y:= Y1; 

1254 

1255 
for i:= 0 to d do 

1256 
begin 

1257 
inc(eX, dX); 

1258 
inc(eY, dY); 

1259 
b:= false; 

1260 
if (eX > d) then 

35  1261 
begin 
366  1262 
dec(eX, d); 
1263 
inc(x, sX); 

1264 
b:= true 

35  1265 
end; 
366  1266 
if (eY > d) then 
35  1267 
begin 
366  1268 
dec(eY, d); 
1269 
inc(y, sY); 

1270 
b:= true 

35  1271 
end; 
366  1272 
if b then 
1273 
begin 

1274 
inc(roplen); 

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

1275 
if (roplen mod 4) = 0 then DrawSprite(sprRopeNode, x  2, y  2, 0) 
366  1276 
end 
4  1277 
end 
366  1278 
end; 
4  1279 

1280 
begin 

1281 
Gear:= GearsList; 

1282 
while Gear<>nil do 

1689  1283 
begin 
1284 
case Gear^.Kind of 

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

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

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

1291 

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

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

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

1296 
gtHedgehog: DrawHH(Gear); 
1689  1297 

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

1505  1300 
gtHealthTag: if Gear^.Tex <> nil then DrawCentered(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Tex); 
2017  1301 

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

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

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

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

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

1311 
i:= 0; 

1312 
while i < Pred(RopePoints.Count) do 

1313 
begin 

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

4  1316 
inc(i) 
1317 
end; 

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

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

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

822  1322 
DrawRotated(sprRopeHook, hwRound(RopePoints.ar[0].X) + WorldDx, hwRound(RopePoints.ar[0].Y) + WorldDy, 1, RopePoints.HookAngle) 
4  1323 
end else 
1781  1324 
if Gear^.Elasticity.QWordValue > 0 then 
35  1325 
begin 
351  1326 
DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 
1327 
hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.X) + WorldDx, hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.Y) + WorldDy); 

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

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

351  1336 
gtCase: case Gear^.Pos of 
1794  1337 
posCaseAmmo : begin 
1338 
i:= (GameTicks shr 6) mod 64; 

1339 
if i > 18 then i:= 0; 

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

1341 
end; 

1009  1342 
posCaseHealth: begin 
1863  1343 
i:= ((GameTicks shr 6) + 38) mod 64; 
1344 
if i > 13 then i:= 0; 

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

1861  1347 
posCaseUtility: begin 
1863  1348 
i:= (GameTicks shr 6) mod 70; 
1349 
if i > 23 then i:= 0; 

1909  1350 
i:= i mod 12; 
1863  1351 
DrawSprite(sprUtility, hwRound(Gear^.X)  24 + WorldDx, hwRound(Gear^.Y)  24 + WorldDy, i); 
1861  1352 
end; 
42  1353 
end; 
841
0700e3d3474d
Get rid if deprecated Surface parameter of Draw* calls
unc0rr
parents:
840
diff
changeset

1354 
gtDynamite: DrawSprite2(sprDynamite, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  25 + WorldDy, Gear^.Tag and 1, Gear^.Tag shr 1); 
822  1355 
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

1356 
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

1357 
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

1358 
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

1359 
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

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

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

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

1366 
end; 

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

1367 
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

1368 
gtTarget: DrawSprite(sprTarget, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  16 + WorldDy, 0); 
959  1369 
gtMortar: DrawRotated(sprMortar, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, DxDy2Angle(Gear^.dY, Gear^.dX)); 
1108  1370 
gtCake: if Gear^.Pos = 6 then 
2025
692308790912
Adjust routines impacted by DrawRotatedF modification, clear gstHHHJump in rope to avoid crosshair/hat drawing bug.
nemo
parents:
2023
diff
changeset

1371 
DrawRotatedf(sprCakeWalk, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, (GameTicks div 40) mod 6, hwSign(Gear^.dX), Gear^.DirAngle * hwSign(Gear^.dX) + 90) 
1108  1372 
else 
1262  1373 
DrawRotatedf(sprCakeDown, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 5  Gear^.Pos, hwSign(Gear^.dX), 0); 
1367  1374 
gtSeduction: if Gear^.Pos >= 14 then DrawSprite(sprSeduction, hwRound(Gear^.X)  16 + WorldDx, hwRound(Gear^.Y)  16 + WorldDy, 0); 
1262  1375 
gtWatermelon: DrawRotatedf(sprWatermelon, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, 0, Gear^.DirAngle); 
1376 
gtMelonPiece: DrawRotatedf(sprWatermelon, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 1, 0, Gear^.DirAngle); 

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

1379 
end; 

351  1380 
Gear:= Gear^.NextGear 
4  1381 
end; 