author | KoBeWi |
Thu, 01 Nov 2018 08:39:22 +0100 | |
changeset 14077 | 7b78c87d80a1 |
parent 14062 | 44f20c9e6861 |
child 14217 | ab5e710d353d |
permissions | -rw-r--r-- |
6581 | 1 |
(* |
2 |
* Hedgewars, a free turn based strategy game |
|
11046 | 3 |
* Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com> |
6581 | 4 |
* |
5 |
* This program is free software; you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
8 |
* |
|
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program; if not, write to the Free Software |
|
10108
c68cf030eded
update FSF address. note: two sdl include files (by Sam Lantinga) still have the old FSF address in their copyright - but I ain't gonna touch their copyright headers
sheepluva
parents:
10105
diff
changeset
|
16 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
6581 | 17 |
*) |
18 |
||
19 |
{$INCLUDE "options.inc"} |
|
20 |
||
21 |
unit uGearsUtils; |
|
22 |
interface |
|
9285 | 23 |
uses uTypes, uFloat; |
6581 | 24 |
|
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
25 |
procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword); inline; |
8330 | 26 |
procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword; const Tint: LongWord); |
10363 | 27 |
procedure AddSplashForGear(Gear: PGear; justSkipping: boolean); |
13609
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
28 |
procedure AddBounceEffectForGear(Gear: PGear; imageScale: Single); |
10508 | 29 |
procedure AddBounceEffectForGear(Gear: PGear); |
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
30 |
|
6581 | 31 |
function ModifyDamage(dmg: Longword; Gear: PGear): Longword; |
32 |
procedure ApplyDamage(Gear: PGear; AttackerHog: PHedgehog; Damage: Longword; Source: TDamageSource); |
|
33 |
procedure spawnHealthTagForHH(HHGear: PGear; dmg: Longword); |
|
14062
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
34 |
procedure HHHurt(Hedgehog: PHedgehog; Source: TDamageSource; Damage: Longword); |
13617
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
35 |
procedure HHHeal(Hedgehog: PHedgehog; healthBoost: LongInt; showMessage: boolean; vgTint: Longword); |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
36 |
procedure HHHeal(Hedgehog: PHedgehog; healthBoost: LongInt; showMessage: boolean); |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
37 |
function IncHogHealth(Hedgehog: PHedgehog; healthBoost: LongInt): LongInt; |
6581 | 38 |
procedure CheckHHDamage(Gear: PGear); |
39 |
procedure CalcRotationDirAngle(Gear: PGear); |
|
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
40 |
procedure ResurrectHedgehog(var gear: PGear); |
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
41 |
|
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
42 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); inline; |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
43 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean); |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
44 |
|
13399 | 45 |
function CheckGearNear(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt): PGear; |
6581 | 46 |
function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear; |
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
47 |
function CheckGearDrowning(var Gear: PGear): boolean; |
7592 | 48 |
procedure CheckCollision(Gear: PGear); inline; |
49 |
procedure CheckCollisionWithLand(Gear: PGear); inline; |
|
6581 | 50 |
|
9285 | 51 |
procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt); |
14027
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
52 |
procedure AmmoShoveCache(Ammo: PGear; Damage, Power: LongInt); |
12898 | 53 |
procedure AmmoShoveLine(Ammo: PGear; Damage, Power: LongInt; oX, oY, tX, tY: hwFloat); |
9285 | 54 |
function GearsNear(X, Y: hwFloat; Kind: TGearType; r: LongInt): PGearArrayS; |
55 |
procedure SpawnBoxOfSmth; |
|
56 |
procedure ShotgunShot(Gear: PGear); |
|
12712
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
57 |
function CanUseTardis(HHGear: PGear): boolean; |
9285 | 58 |
|
59 |
procedure SetAllToActive; |
|
60 |
procedure SetAllHHToActive(Ice: boolean); |
|
9954 | 61 |
procedure SetAllHHToActive(); inline; |
9285 | 62 |
|
63 |
function GetAmmo(Hedgehog: PHedgehog): TAmmoType; |
|
64 |
function GetUtility(Hedgehog: PHedgehog): TAmmoType; |
|
65 |
||
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
66 |
function WorldWrap(var Gear: PGear): boolean; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
67 |
|
11847 | 68 |
function IsHogLocal(HH: PHedgehog): boolean; |
9285 | 69 |
|
70 |
||
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
71 |
function MakeHedgehogsStep(Gear: PGear) : boolean; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
72 |
|
6581 | 73 |
var doStepHandlers: array[TGearType] of TGearStepProcedure; |
74 |
||
75 |
implementation |
|
9285 | 76 |
uses uSound, uCollisions, uUtils, uConsts, uVisualGears, uAIMisc, |
6581 | 77 |
uVariables, uLandGraphics, uScript, uStats, uCaptions, uTeams, uStore, |
10015 | 78 |
uLocale, uTextures, uRenderUtils, uRandom, SDLh, uDebug, |
9285 | 79 |
uGearsList, Math, uVisualGearsList, uGearsHandlersMess, |
80 |
uGearsHedgehog; |
|
6581 | 81 |
|
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
82 |
procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword); inline; |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
83 |
begin |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
84 |
doMakeExplosion(X, Y, Radius, AttackingHog, Mask, $FFFFFFFF); |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
85 |
end; |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
86 |
|
6581 | 87 |
procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword; const Tint: LongWord); |
88 |
var Gear: PGear; |
|
6769
44ad49a3a126
Add drowning to grenade too, try some little optimisations
nemo
parents:
6765
diff
changeset
|
89 |
dmg, dmgBase: LongInt; |
6765 | 90 |
fX, fY, tdX, tdY: hwFloat; |
6581 | 91 |
vg: PVisualGear; |
92 |
i, cnt: LongInt; |
|
10653 | 93 |
wrap: boolean; |
10827 | 94 |
bubble: PVisualGear; |
12169
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
95 |
s: ansistring; |
6581 | 96 |
begin |
97 |
if Radius > 4 then AddFileLog('Explosion: at (' + inttostr(x) + ',' + inttostr(y) + ')'); |
|
98 |
if Radius > 25 then KickFlakes(Radius, X, Y); |
|
99 |
||
100 |
if ((Mask and EXPLNoGfx) = 0) then |
|
101 |
begin |
|
102 |
vg:= nil; |
|
10827 | 103 |
if CheckCoordInWater(X, Y - Radius) then |
104 |
begin |
|
105 |
cnt:= 2 * Radius; |
|
106 |
for i:= (Radius * Radius) div 4 downto 0 do |
|
107 |
begin |
|
108 |
bubble := AddVisualGear(X - Radius + random(cnt), Y - Radius + random(cnt), vgtBubble); |
|
109 |
if bubble <> nil then |
|
110 |
bubble^.dY:= 0.1 + random(20)/10; |
|
111 |
end |
|
112 |
end |
|
113 |
else if Radius > 50 then vg:= AddVisualGear(X, Y, vgtBigExplosion) |
|
6581 | 114 |
else if Radius > 10 then vg:= AddVisualGear(X, Y, vgtExplosion); |
115 |
if vg <> nil then |
|
116 |
vg^.Tint:= Tint; |
|
117 |
end; |
|
118 |
if (Mask and EXPLAutoSound) <> 0 then PlaySound(sndExplosion); |
|
119 |
||
6765 | 120 |
(*if (Mask and EXPLAllDamageInRadius) = 0 then |
6581 | 121 |
dmgRadius:= Radius shl 1 |
122 |
else |
|
123 |
dmgRadius:= Radius; |
|
6765 | 124 |
dmgBase:= dmgRadius + cHHRadius div 2;*) |
125 |
dmgBase:= Radius shl 1 + cHHRadius div 2; |
|
10653 | 126 |
|
127 |
// we might have to run twice if weWrap is enabled |
|
128 |
wrap:= false; |
|
10659 | 129 |
repeat |
10653 | 130 |
|
10654 | 131 |
fX:= int2hwFloat(X); |
132 |
fY:= int2hwFloat(Y); |
|
133 |
Gear:= GearsList; |
|
134 |
||
6581 | 135 |
while Gear <> nil do |
136 |
begin |
|
137 |
dmg:= 0; |
|
138 |
//dmg:= dmgRadius + cHHRadius div 2 - hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y))); |
|
139 |
//if (dmg > 1) and |
|
140 |
if (Gear^.State and gstNoDamage) = 0 then |
|
141 |
begin |
|
142 |
case Gear^.Kind of |
|
143 |
gtHedgehog, |
|
144 |
gtMine, |
|
145 |
gtBall, |
|
146 |
gtMelonPiece, |
|
147 |
gtGrenade, |
|
148 |
gtClusterBomb, |
|
149 |
// gtCluster, too game breaking I think |
|
150 |
gtSMine, |
|
10789
acbf69e2e5cf
experiment with air mines. thought they could make shoppa... interesting. ToDo: Allow mines to give up, tweak distances, real graphics, toggle for whether they can acquire a new target while they haven't given up.
nemo
parents:
10668
diff
changeset
|
151 |
gtAirMine, |
6581 | 152 |
gtCase, |
153 |
gtTarget, |
|
154 |
gtFlame, |
|
7754 | 155 |
gtKnife, |
8161 | 156 |
gtExplosives: begin //, |
157 |
//gtStructure: begin |
|
6581 | 158 |
// Run the calcs only once we know we have a type that will need damage |
6765 | 159 |
tdX:= Gear^.X-fX; |
160 |
tdY:= Gear^.Y-fY; |
|
7721 | 161 |
if LongInt(tdX.Round + tdY.Round + 2) < dmgBase then |
7272
71df899c4163
Second part of the change. Make collision check use the new mask bit.
nemo
parents:
7190
diff
changeset
|
162 |
dmg:= dmgBase - hwRound(Distance(tdX, tdY)); |
6581 | 163 |
if dmg > 1 then |
164 |
begin |
|
165 |
dmg:= ModifyDamage(min(dmg div 2, Radius), Gear); |
|
166 |
//AddFileLog('Damage: ' + inttostr(dmg)); |
|
167 |
if (Mask and EXPLNoDamage) = 0 then |
|
168 |
begin |
|
10011
ead5e4b21671
Add check for gear kind of hedgehog on invulnerability effect. This probably fixes bug #766, is similar to change in previous r2a1483d91977 and was introduced by r7d925e82e572
nemo
parents:
10010
diff
changeset
|
169 |
if (Gear^.Kind <> gtHedgehog) or (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) then |
6581 | 170 |
ApplyDamage(Gear, AttackingHog, dmg, dsExplosion) |
171 |
else |
|
172 |
Gear^.State:= Gear^.State or gstWinner; |
|
173 |
end; |
|
174 |
if ((Mask and EXPLDoNotTouchAny) = 0) and (((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog)) then |
|
175 |
begin |
|
176 |
DeleteCI(Gear); |
|
6765 | 177 |
Gear^.dX:= Gear^.dX + SignAs(_0_005 * dmg + cHHKick, tdX)/(Gear^.Density/_3); |
178 |
Gear^.dY:= Gear^.dY + SignAs(_0_005 * dmg + cHHKick, tdY)/(Gear^.Density/_3); |
|
6581 | 179 |
|
180 |
Gear^.State:= (Gear^.State or gstMoving) and (not gstLoser); |
|
7767 | 181 |
if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision); |
10011
ead5e4b21671
Add check for gear kind of hedgehog on invulnerability effect. This probably fixes bug #766, is similar to change in previous r2a1483d91977 and was introduced by r7d925e82e572
nemo
parents:
10010
diff
changeset
|
182 |
if (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) then |
6581 | 183 |
Gear^.State:= (Gear^.State or gstMoving) and (not gstWinner); |
184 |
Gear^.Active:= true; |
|
185 |
if Gear^.Kind <> gtFlame then FollowGear:= Gear |
|
186 |
end; |
|
11867 | 187 |
if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and |
188 |
(Gear^.Hedgehog^.Effects[heInvulnerable] = 0) and (Gear^.Hedgehog^.Effects[heFrozen] = 0) and |
|
189 |
(Gear^.State and gstHHDeath = 0) then |
|
12169
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
190 |
begin |
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
191 |
if Gear^.Hedgehog^.Effects[hePoisoned] = 0 then |
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
192 |
begin |
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
193 |
s:= ansistring(Gear^.Hedgehog^.Name); |
13642
3d14950641a4
Refactor text color variable names, export 2 color values to Lua
Wuzzy <Wuzzy2@mail.ru>
parents:
13629
diff
changeset
|
194 |
AddCaption(FormatA(GetEventString(eidPoisoned), s), capcolDefault, capgrpMessage); |
12176
29f1ea94488b
Fix enemy saying “Missed” when poisoned w/o damage
Wuzzy <almikes@aol.com>
parents:
12169
diff
changeset
|
195 |
uStats.HedgehogPoisoned(Gear, AttackingHog) |
12169
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
196 |
end; |
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
197 |
Gear^.Hedgehog^.Effects[hePoisoned] := 5; |
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
198 |
end |
6581 | 199 |
end; |
200 |
||
201 |
end; |
|
9814 | 202 |
gtGrave: if Mask and EXPLDoNotTouchAny = 0 then |
6581 | 203 |
// Run the calcs only once we know we have a type that will need damage |
204 |
begin |
|
9814 | 205 |
tdX:= Gear^.X-fX; |
206 |
tdY:= Gear^.Y-fY; |
|
207 |
if LongInt(tdX.Round + tdY.Round + 2) < dmgBase then |
|
208 |
dmg:= dmgBase - hwRound(Distance(tdX, tdY)); |
|
209 |
if dmg > 1 then |
|
210 |
begin |
|
211 |
dmg:= ModifyDamage(min(dmg div 2, Radius), Gear); |
|
212 |
Gear^.dY:= - _0_004 * dmg; |
|
213 |
Gear^.Active:= true |
|
214 |
end |
|
215 |
end; |
|
6581 | 216 |
end; |
217 |
end; |
|
218 |
Gear:= Gear^.NextGear |
|
219 |
end; |
|
220 |
||
221 |
if (Mask and EXPLDontDraw) = 0 then |
|
13604
73b096e1d895
Fix hammer/pickhammer not digging land with gfSolidLand on
Wuzzy <Wuzzy2@mail.ru>
parents:
13597
diff
changeset
|
222 |
if ((GameFlags and gfSolidLand) = 0) or ((Mask and EXPLForceDraw) <> 0) then |
6581 | 223 |
begin |
224 |
cnt:= DrawExplosion(X, Y, Radius) div 1608; // approx 2 16x16 circles to erase per chunk |
|
225 |
if (cnt > 0) and (SpritesData[sprChunk].Texture <> nil) then |
|
226 |
for i:= 0 to cnt do |
|
227 |
AddVisualGear(X, Y, vgtChunk) |
|
228 |
end; |
|
229 |
||
10653 | 230 |
if (WorldEdge = weWrap) then |
231 |
begin |
|
232 |
// already wrapped? let's not wrap again! |
|
233 |
if wrap then |
|
234 |
break; |
|
235 |
||
236 |
// Radius + 5 because that's the actual radius the explosion changes graphically |
|
237 |
if X + (Radius + 5) > LongInt(rightX) then |
|
238 |
begin |
|
239 |
dec(X, playWidth); |
|
240 |
wrap:= true; |
|
241 |
end |
|
242 |
else if X - (Radius + 5) < LongInt(leftX) then |
|
243 |
begin |
|
244 |
inc(X, playWidth); |
|
245 |
wrap:= true; |
|
246 |
end; |
|
247 |
end; |
|
248 |
||
249 |
until (not wrap); |
|
250 |
||
6581 | 251 |
uAIMisc.AwareOfExplosion(0, 0, 0) |
252 |
end; |
|
253 |
||
254 |
function ModifyDamage(dmg: Longword; Gear: PGear): Longword; |
|
255 |
var i: hwFloat; |
|
256 |
begin |
|
257 |
(* Invulnerability cannot be placed in here due to still needing kicks |
|
258 |
Not without a new damage machine. |
|
259 |
King check should be in here instead of ApplyDamage since Tiy wants them kicked less |
|
260 |
*) |
|
261 |
i:= _1; |
|
262 |
if (CurrentHedgehog <> nil) and CurrentHedgehog^.King then |
|
263 |
i:= _1_5; |
|
10015 | 264 |
if (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog <> nil) and |
10010
2a1483d91977
well. let's fix this at least - only apply to gears that are actually hedgehogs, not just ones associated with a hedgehog (which can be pretty much any gear since damage tracking was added)
nemo
parents:
9998
diff
changeset
|
265 |
(Gear^.Hedgehog^.King or (Gear^.Hedgehog^.Effects[heFrozen] > 0)) then |
9148
78c699d8fdfd
move 0.01 to the end to avoid increase damage fail on small values like fire. thanks to hedgewars wiki for noting this for fire damage.
nemo
parents:
9080
diff
changeset
|
266 |
ModifyDamage:= hwRound(cDamageModifier * dmg * i * cDamagePercent * _0_5 * _0_01) |
9149 | 267 |
else |
10526
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
268 |
ModifyDamage:= hwRound(cDamageModifier * dmg * i * cDamagePercent * _0_01); |
6581 | 269 |
end; |
270 |
||
271 |
procedure ApplyDamage(Gear: PGear; AttackerHog: PHedgehog; Damage: Longword; Source: TDamageSource); |
|
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
272 |
var vampDmg, tmpDmg, i: Longword; |
6581 | 273 |
vg: PVisualGear; |
274 |
begin |
|
275 |
if Damage = 0 then |
|
276 |
exit; // nothing to apply |
|
277 |
||
278 |
if (Gear^.Kind = gtHedgehog) then |
|
279 |
begin |
|
280 |
Gear^.LastDamage := AttackerHog; |
|
281 |
||
282 |
Gear^.Hedgehog^.Team^.Clan^.Flawless:= false; |
|
14062
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
283 |
HHHurt(Gear^.Hedgehog, Source, Damage); |
6581 | 284 |
AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), Damage, Gear^.Hedgehog^.Team^.Clan^.Color); |
285 |
tmpDmg:= min(Damage, max(0,Gear^.Health-Gear^.Damage)); |
|
286 |
if (Gear <> CurrentHedgehog^.Gear) and (CurrentHedgehog^.Gear <> nil) and (tmpDmg >= 1) then |
|
287 |
begin |
|
288 |
if cVampiric then |
|
289 |
begin |
|
290 |
vampDmg:= hwRound(int2hwFloat(tmpDmg)*_0_8); |
|
291 |
if vampDmg >= 1 then |
|
292 |
begin |
|
293 |
// was considering pulsing on attack, Tiy thinks it should be permanent while in play |
|
294 |
//CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State or gstVampiric; |
|
13617
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
295 |
vampDmg:= IncHogHealth(CurrentHedgehog, vampDmg); |
6581 | 296 |
RenderHealth(CurrentHedgehog^); |
297 |
RecountTeamHealth(CurrentHedgehog^.Team); |
|
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
298 |
HHHeal(CurrentHedgehog, vampDmg, true, $FF0000FF); |
6581 | 299 |
end |
300 |
end; |
|
12289
c20fbf96b853
Fix hedgehog self-damage not counted, and there were never Stupid taunts/announces
Wuzzy <almikes@aol.com>
parents:
12209
diff
changeset
|
301 |
if (GameFlags and gfKarma <> 0) and (GameFlags and gfInvulnerable = 0) and |
c20fbf96b853
Fix hedgehog self-damage not counted, and there were never Stupid taunts/announces
Wuzzy <almikes@aol.com>
parents:
12209
diff
changeset
|
302 |
(CurrentHedgehog^.Effects[heInvulnerable] = 0) then |
c20fbf96b853
Fix hedgehog self-damage not counted, and there were never Stupid taunts/announces
Wuzzy <almikes@aol.com>
parents:
12209
diff
changeset
|
303 |
begin // this cannot just use Damage or it interrupts shotgun and gets you called stupid |
c20fbf96b853
Fix hedgehog self-damage not counted, and there were never Stupid taunts/announces
Wuzzy <almikes@aol.com>
parents:
12209
diff
changeset
|
304 |
inc(CurrentHedgehog^.Gear^.Karma, tmpDmg); |
c20fbf96b853
Fix hedgehog self-damage not counted, and there were never Stupid taunts/announces
Wuzzy <almikes@aol.com>
parents:
12209
diff
changeset
|
305 |
CurrentHedgehog^.Gear^.LastDamage := CurrentHedgehog; |
c20fbf96b853
Fix hedgehog self-damage not counted, and there were never Stupid taunts/announces
Wuzzy <almikes@aol.com>
parents:
12209
diff
changeset
|
306 |
spawnHealthTagForHH(CurrentHedgehog^.Gear, tmpDmg); |
c20fbf96b853
Fix hedgehog self-damage not counted, and there were never Stupid taunts/announces
Wuzzy <almikes@aol.com>
parents:
12209
diff
changeset
|
307 |
end; |
6581 | 308 |
end; |
12289
c20fbf96b853
Fix hedgehog self-damage not counted, and there were never Stupid taunts/announces
Wuzzy <almikes@aol.com>
parents:
12209
diff
changeset
|
309 |
|
8330 | 310 |
uStats.HedgehogDamaged(Gear, AttackerHog, Damage, false); |
10526
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
311 |
|
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
312 |
if AprilOne and (Gear^.Hedgehog^.Hat = 'fr_tomato') and (Damage > 2) then |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
313 |
for i := 0 to random(min(Damage,20))+5 do |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
314 |
begin |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
315 |
vg:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot); |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
316 |
if vg <> nil then |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
317 |
with vg^ do |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
318 |
begin |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
319 |
dx:= 0.001 * (random(100)+10); |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
320 |
dy:= 0.001 * (random(100)+10); |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
321 |
tdy:= -cGravityf; |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
322 |
if random(2) = 0 then |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
323 |
dx := -dx; |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
324 |
//if random(2) = 0 then |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
325 |
// dy := -dy; |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
326 |
FrameTicks:= random(500) + 1000; |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
327 |
State:= ord(sprBubbles); |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
328 |
//Tint:= $bd2f03ff |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
329 |
Tint:= $ff0000ff |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
330 |
end |
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
331 |
end |
8199
886ed135665b
Fix crashes and wtf behaviour introduced in r0b8beacff8a5
unc0rr
parents:
8161
diff
changeset
|
332 |
end else |
8161 | 333 |
//else if Gear^.Kind <> gtStructure then // not gtHedgehog nor gtStructure |
6581 | 334 |
Gear^.Hedgehog:= AttackerHog; |
335 |
inc(Gear^.Damage, Damage); |
|
8330 | 336 |
|
6581 | 337 |
ScriptCall('onGearDamage', Gear^.UID, Damage); |
338 |
end; |
|
339 |
||
340 |
procedure spawnHealthTagForHH(HHGear: PGear; dmg: Longword); |
|
341 |
var tag: PVisualGear; |
|
342 |
begin |
|
343 |
tag:= AddVisualGear(hwRound(HHGear^.X), hwRound(HHGear^.Y), vgtHealthTag, dmg); |
|
344 |
if (tag <> nil) then |
|
345 |
tag^.Hedgehog:= HHGear^.Hedgehog; // the tag needs the tag to determine the text color |
|
346 |
AllInactive:= false; |
|
347 |
HHGear^.Active:= true; |
|
348 |
end; |
|
8330 | 349 |
|
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
350 |
// Play effects for hurt hedgehog |
14062
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
351 |
procedure HHHurt(Hedgehog: PHedgehog; Source: TDamageSource; Damage: Longword); |
6581 | 352 |
begin |
9071 | 353 |
if Hedgehog^.Effects[heFrozen] <> 0 then exit; |
10526
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
354 |
|
14062
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
355 |
if (Damage >= ouchDmg) and (OuchTauntTimer = 0) and ((Source = dsFall) or (Source = dsBullet) or (Source = dsShove) or (Source = dsHammer)) then |
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
356 |
begin |
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
357 |
PlaySoundV(sndOuch, Hedgehog^.Team^.voicepack); |
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
358 |
// Prevent sndOuch from being played too often in short time |
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
359 |
OuchTauntTimer:= 1250; |
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
360 |
end |
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
361 |
else if (Source = dsFall) or (Source = dsExplosion) then |
6581 | 362 |
case random(3) of |
7053 | 363 |
0: PlaySoundV(sndOoff1, Hedgehog^.Team^.voicepack); |
364 |
1: PlaySoundV(sndOoff2, Hedgehog^.Team^.voicepack); |
|
365 |
2: PlaySoundV(sndOoff3, Hedgehog^.Team^.voicepack); |
|
6581 | 366 |
end |
367 |
else if (Source = dsPoison) then |
|
368 |
case random(2) of |
|
7053 | 369 |
0: PlaySoundV(sndPoisonCough, Hedgehog^.Team^.voicepack); |
370 |
1: PlaySoundV(sndPoisonMoan, Hedgehog^.Team^.voicepack); |
|
6581 | 371 |
end |
372 |
else |
|
373 |
case random(4) of |
|
7053 | 374 |
0: PlaySoundV(sndOw1, Hedgehog^.Team^.voicepack); |
375 |
1: PlaySoundV(sndOw2, Hedgehog^.Team^.voicepack); |
|
376 |
2: PlaySoundV(sndOw3, Hedgehog^.Team^.voicepack); |
|
377 |
3: PlaySoundV(sndOw4, Hedgehog^.Team^.voicepack); |
|
6581 | 378 |
end |
379 |
end; |
|
380 |
||
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
381 |
{- |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
382 |
Show heal particles and message at hog gear. |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
383 |
Hedgehog: Hedgehog which gets the health boost |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
384 |
healthBoost: Amount of added health added |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
385 |
showMessage: Whether to show announcer message |
13617
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
386 |
vgTint: Tint of heal particle (if 0, don't render particles) |
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
387 |
-} |
13617
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
388 |
procedure HHHeal(Hedgehog: PHedgehog; healthBoost: LongInt; showMessage: boolean; vgTint: Longword); |
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
389 |
var i: LongInt; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
390 |
vg: PVisualGear; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
391 |
s: ansistring; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
392 |
begin |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
393 |
if healthBoost < 1 then |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
394 |
exit; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
395 |
|
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
396 |
if showMessage then |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
397 |
begin |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
398 |
s:= IntToStr(healthBoost); |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
399 |
AddCaption(FormatA(trmsg[sidHealthGain], s), Hedgehog^.Team^.Clan^.Color, capgrpAmmoinfo) |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
400 |
end; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
401 |
|
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
402 |
i:= 0; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
403 |
// One particle for every 5 HP. Max. 200 particles |
13617
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
404 |
if (vgTint <> 0) then |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
405 |
while (i < healthBoost) and (i < 1000) do |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
406 |
begin |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
407 |
vg:= AddVisualGear(hwRound(Hedgehog^.Gear^.X), hwRound(Hedgehog^.Gear^.Y), vgtStraightShot); |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
408 |
if vg <> nil then |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
409 |
with vg^ do |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
410 |
begin |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
411 |
Tint:= vgTint; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
412 |
State:= ord(sprHealth) |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
413 |
end; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
414 |
inc(i, 5) |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
415 |
end; |
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
416 |
end; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
417 |
|
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
418 |
// Shorthand for the same above, but with tint implied |
13617
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
419 |
procedure HHHeal(Hedgehog: PHedgehog; healthBoost: LongInt; showMessage: boolean); |
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
420 |
begin |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
421 |
HHHeal(Hedgehog, healthBoost, showMessage, $00FF00FF); |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
422 |
end; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
423 |
|
13617
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
424 |
// Increase hog health by healthBoost (at least 1). |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
425 |
// Resulting health is capped at cMaxHogHealth. |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
426 |
// Returns actual amount healed. |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
427 |
function IncHogHealth(Hedgehog: PHedgehog; healthBoost: LongInt): LongInt; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
428 |
var oldHealth: LongInt; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
429 |
begin |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
430 |
if healthBoost < 1 then |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
431 |
begin |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
432 |
IncHogHealth:= 0; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
433 |
exit; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
434 |
end; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
435 |
oldHealth:= Hedgehog^.Gear^.Health; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
436 |
inc(Hedgehog^.Gear^.Health, healthBoost); |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
437 |
// Prevent overflow |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
438 |
if (Hedgehog^.Gear^.Health < 1) or (Hedgehog^.Gear^.Health > cMaxHogHealth) then |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
439 |
Hedgehog^.Gear^.Health:= cMaxHogHealth; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
440 |
IncHogHealth:= Hedgehog^.Gear^.Health - oldHealth; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
441 |
end; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
442 |
|
6581 | 443 |
procedure CheckHHDamage(Gear: PGear); |
10015 | 444 |
var |
9809 | 445 |
dmg: LongInt; |
8003 | 446 |
i: LongWord; |
6581 | 447 |
particle: PVisualGear; |
448 |
begin |
|
9071 | 449 |
if _0_4 < Gear^.dY then |
450 |
begin |
|
451 |
dmg := ModifyDamage(1 + hwRound((Gear^.dY - _0_4) * 70), Gear); |
|
452 |
if Gear^.Hedgehog^.Effects[heFrozen] = 0 then |
|
453 |
PlaySound(sndBump) |
|
454 |
else PlaySound(sndFrozenHogImpact); |
|
455 |
if dmg < 1 then |
|
456 |
exit; |
|
6581 | 457 |
|
9809 | 458 |
for i:= min(12, 3 + dmg div 10) downto 0 do |
9071 | 459 |
begin |
460 |
particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust); |
|
461 |
if particle <> nil then |
|
462 |
particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480); |
|
463 |
end; |
|
6581 | 464 |
|
9685
7d925e82e572
Tweak trophyrace to work better w/ skip (probably, needs testing), drop Invulnerable in favour of effects - heInvulnerable is already in effects,
nemo
parents:
9561
diff
changeset
|
465 |
if ((Gear^.Hedgehog^.Effects[heInvulnerable] <> 0)) then |
9071 | 466 |
exit; |
6581 | 467 |
|
9071 | 468 |
//if _0_6 < Gear^.dY then |
469 |
// PlaySound(sndOw4, Gear^.Hedgehog^.Team^.voicepack) |
|
470 |
//else |
|
471 |
// PlaySound(sndOw1, Gear^.Hedgehog^.Team^.voicepack); |
|
6581 | 472 |
|
9071 | 473 |
if Gear^.LastDamage <> nil then |
474 |
ApplyDamage(Gear, Gear^.LastDamage, dmg, dsFall) |
|
475 |
else |
|
476 |
ApplyDamage(Gear, CurrentHedgehog, dmg, dsFall); |
|
6581 | 477 |
end |
478 |
end; |
|
479 |
||
480 |
||
481 |
procedure CalcRotationDirAngle(Gear: PGear); |
|
8330 | 482 |
var |
6581 | 483 |
dAngle: real; |
484 |
begin |
|
7825 | 485 |
// Frac/Round to be kind to JS as of 2012-08-27 where there is yet no int64/uint64 |
486 |
//dAngle := (Gear^.dX.QWordValue + Gear^.dY.QWordValue) / $80000000; |
|
487 |
dAngle := (Gear^.dX.Round + Gear^.dY.Round) / 2 + (Gear^.dX.Frac/$100000000+Gear^.dY.Frac/$100000000); |
|
6581 | 488 |
if not Gear^.dX.isNegative then |
489 |
Gear^.DirAngle := Gear^.DirAngle + dAngle |
|
490 |
else |
|
491 |
Gear^.DirAngle := Gear^.DirAngle - dAngle; |
|
492 |
||
493 |
if Gear^.DirAngle < 0 then |
|
494 |
Gear^.DirAngle := Gear^.DirAngle + 360 |
|
495 |
else if 360 < Gear^.DirAngle then |
|
496 |
Gear^.DirAngle := Gear^.DirAngle - 360 |
|
497 |
end; |
|
498 |
||
10363 | 499 |
procedure AddSplashForGear(Gear: PGear; justSkipping: boolean); |
500 |
var x, y, i, distL, distR, distB, minDist, maxDrops: LongInt; |
|
501 |
splash, particle: PVisualGear; |
|
502 |
speed, hwTmp: hwFloat; |
|
503 |
vi, vs, tmp: real; // impact speed and sideways speed |
|
504 |
isImpactH, isImpactRight: boolean; |
|
10419 | 505 |
const dist2surf = 4; |
10363 | 506 |
begin |
507 |
x:= hwRound(Gear^.X); |
|
508 |
y:= hwRound(Gear^.Y); |
|
509 |
||
10419 | 510 |
// find position for splash and impact speed |
10363 | 511 |
|
512 |
distB:= cWaterline - y; |
|
513 |
||
514 |
if WorldEdge <> weSea then |
|
515 |
minDist:= distB |
|
516 |
else |
|
517 |
begin |
|
518 |
distL:= x - leftX; |
|
519 |
distR:= rightX - x; |
|
520 |
minDist:= min(distB, min(distL, distR)); |
|
521 |
end; |
|
522 |
||
523 |
isImpactH:= (minDist <> distB); |
|
524 |
||
525 |
if not isImpactH then |
|
526 |
begin |
|
10417 | 527 |
y:= cWaterline - dist2surf; |
10363 | 528 |
speed:= hwAbs(Gear^.dY); |
529 |
end |
|
530 |
else |
|
531 |
begin |
|
532 |
isImpactRight := minDist = distR; |
|
533 |
if isImpactRight then |
|
10419 | 534 |
x:= rightX - dist2surf |
10363 | 535 |
else |
10419 | 536 |
x:= leftX + dist2surf; |
10363 | 537 |
speed:= hwAbs(Gear^.dX); |
538 |
end; |
|
539 |
||
540 |
// splash sound |
|
541 |
||
542 |
if justSkipping then |
|
543 |
PlaySound(sndSkip) |
|
544 |
else |
|
545 |
begin |
|
546 |
// adjust water impact sound based on gear speed and density |
|
547 |
hwTmp:= hwAbs(Gear^.Density * speed); |
|
548 |
||
549 |
if hwTmp > _1 then |
|
550 |
PlaySound(sndSplash) |
|
551 |
else if hwTmp > _0_5 then |
|
552 |
PlaySound(sndSkip) |
|
12150 | 553 |
else if hwTmp > _0_0002 then // arbitrary sanity cutoff. mostly for airmines |
10363 | 554 |
PlaySound(sndDroplet2); |
555 |
end; |
|
556 |
||
10419 | 557 |
|
558 |
// splash visuals |
|
559 |
||
560 |
if ((cReducedQuality and rqPlainSplash) <> 0) then |
|
561 |
exit; |
|
562 |
||
563 |
splash:= AddVisualGear(x, y, vgtSplash); |
|
564 |
if splash = nil then |
|
565 |
exit; |
|
566 |
||
567 |
if not isImpactH then |
|
568 |
vs:= abs(hwFloat2Float(Gear^.dX)) |
|
569 |
else |
|
570 |
begin |
|
571 |
if isImpactRight then |
|
572 |
splash^.Angle:= -90 |
|
573 |
else |
|
574 |
splash^.Angle:= 90; |
|
575 |
vs:= abs(hwFloat2Float(Gear^.dY)); |
|
576 |
end; |
|
577 |
||
578 |
||
579 |
vi:= hwFloat2Float(speed); |
|
580 |
||
10363 | 581 |
with splash^ do |
582 |
begin |
|
583 |
Scale:= abs(hwFloat2Float(Gear^.Density / _3 * speed)); |
|
584 |
if Scale > 1 then Scale:= power(Scale,0.3333) |
|
585 |
else Scale:= Scale + ((1-Scale) / 2); |
|
586 |
if Scale > 1 then Timer:= round(min(Scale*0.0005/cGravityf,4)) |
|
587 |
else Timer:= 1; |
|
588 |
// Low Gravity |
|
589 |
FrameTicks:= FrameTicks*Timer; |
|
590 |
end; |
|
591 |
||
592 |
||
593 |
// eject water drops |
|
594 |
||
595 |
maxDrops := (hwRound(Gear^.Density) * 3) div 2 + round((vi + vs) * hwRound(Gear^.Density) * 6); |
|
596 |
for i:= max(maxDrops div 3, min(32, Random(maxDrops))) downto 0 do |
|
597 |
begin |
|
598 |
if isImpactH then |
|
599 |
particle := AddVisualGear(x, y - 3 + Random(7), vgtDroplet) |
|
600 |
else |
|
601 |
particle := AddVisualGear(x - 3 + Random(7), y, vgtDroplet); |
|
602 |
||
603 |
if particle <> nil then |
|
604 |
with particle^ do |
|
605 |
begin |
|
606 |
// dX and dY were initialized to have a random value on creation (see uVisualGearsList) |
|
607 |
if isImpactH then |
|
608 |
begin |
|
609 |
tmp:= dX; |
|
610 |
if isImpactRight then |
|
611 |
dX:= dY - vi / 5 |
|
612 |
else |
|
613 |
dX:= -dy + vi / 5; |
|
614 |
dY:= tmp * (1 + vs / 10); |
|
615 |
end |
|
616 |
else |
|
617 |
begin |
|
618 |
dX:= dX * (1 + vs / 10); |
|
619 |
dY:= dY - vi / 5; |
|
620 |
end; |
|
621 |
||
622 |
if splash <> nil then |
|
623 |
begin |
|
624 |
if splash^.Scale > 1 then |
|
625 |
begin |
|
626 |
dX:= dX * power(splash^.Scale, 0.3333); // tone down the droplet height further |
|
627 |
dY:= dY * power(splash^.Scale, 0.3333); |
|
628 |
end |
|
629 |
else |
|
630 |
begin |
|
631 |
dX:= dX * splash^.Scale; |
|
632 |
dY:= dY * splash^.Scale; |
|
633 |
end; |
|
634 |
end; |
|
635 |
end |
|
636 |
end; |
|
637 |
||
638 |
end; |
|
639 |
||
10354 | 640 |
procedure DrownGear(Gear: PGear); |
641 |
begin |
|
642 |
Gear^.doStep := @doStepDrowningGear; |
|
643 |
||
644 |
Gear^.Timer := 5000; // how long game should wait |
|
645 |
end; |
|
646 |
||
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
647 |
function CheckGearDrowning(var Gear: PGear): boolean; |
10015 | 648 |
var |
10363 | 649 |
skipSpeed, skipAngle, skipDecay: hwFloat; |
650 |
tmp, X, Y, dist2Water: LongInt; |
|
651 |
isSubmersible, isDirH, isImpact, isSkip: boolean; |
|
10124
aabd1b75d5a3
Even more explicit type conversions and other stuff to help pas2c use ansistrings
unc0rr
parents:
10116
diff
changeset
|
652 |
s: ansistring; |
6581 | 653 |
begin |
654 |
// probably needs tweaking. might need to be in a case statement based upon gear type |
|
10354 | 655 |
X:= hwRound(Gear^.X); |
6581 | 656 |
Y:= hwRound(Gear^.Y); |
10354 | 657 |
|
658 |
dist2Water:= cWaterLine - (Y + Gear^.Radius); |
|
10363 | 659 |
isDirH:= false; |
10354 | 660 |
|
661 |
if WorldEdge = weSea then |
|
6581 | 662 |
begin |
10363 | 663 |
tmp:= dist2Water; |
10494 | 664 |
dist2Water:= min(dist2Water, min(X - Gear^.Radius - LongInt(leftX), LongInt(rightX) - (X + Gear^.Radius))); |
10363 | 665 |
// if water on sides is closer than on bottom -> horizontal direction |
666 |
isDirH:= tmp <> dist2Water; |
|
10354 | 667 |
end; |
668 |
||
10363 | 669 |
isImpact:= false; |
670 |
||
10354 | 671 |
if dist2Water < 0 then |
672 |
begin |
|
673 |
// invisible gears will just be deleted |
|
674 |
// unless they are generic fallers, then they will be "respawned" |
|
7389
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7372
diff
changeset
|
675 |
if Gear^.State and gstInvisible <> 0 then |
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7372
diff
changeset
|
676 |
begin |
7406
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
677 |
if Gear^.Kind = gtGenericFaller then |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
678 |
begin |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
679 |
Gear^.X:= int2hwFloat(GetRandom(rightX-leftX)+leftX); |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
680 |
Gear^.Y:= int2hwFloat(GetRandom(LAND_HEIGHT-topY)+topY); |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
681 |
Gear^.dX:= _90-(GetRandomf*_360); |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
682 |
Gear^.dY:= _90-(GetRandomf*_360) |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
683 |
end |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
684 |
else DeleteGear(Gear); |
10245 | 685 |
exit(true) |
7389
15c3fb4882df
Sorry about the slight delay in pickup. You can blame a few lame cheaters. This is to make their cheating a bit harder.
nemo
parents:
7372
diff
changeset
|
686 |
end; |
8992
5b0be812dcdb
Rename submersible state, increase getaway time for attack underwater, slow down gear dx/dy underwater to simulate water resistance
nemo
parents:
8991
diff
changeset
|
687 |
isSubmersible:= ((Gear = CurrentHedgehog^.Gear) and (CurAmmoGear <> nil) and (CurAmmoGear^.State and gstSubmersible <> 0)) or (Gear^.State and gstSubmersible <> 0); |
10363 | 688 |
|
6581 | 689 |
skipSpeed := _0_25; |
690 |
skipAngle := _1_9; |
|
691 |
skipDecay := _0_87; |
|
10363 | 692 |
|
10354 | 693 |
|
694 |
// skipping |
|
695 |
||
10512
25021aac078e
fix underwater-skipping bug and make air-strike missiles submersible when fired from within weSea
sheepluva
parents:
10508
diff
changeset
|
696 |
if (not isSubmersible) and (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > skipSpeed) |
10363 | 697 |
and ( ((not isDirH) and (hwAbs(Gear^.dX) > skipAngle * hwAbs(Gear^.dY))) |
698 |
or (isDirH and (hwAbs(Gear^.dY) > skipAngle * hwAbs(Gear^.dX))) ) then |
|
6581 | 699 |
begin |
10363 | 700 |
isSkip:= true; |
10354 | 701 |
// if skipping we move the gear out of water |
10363 | 702 |
if isDirH then |
10354 | 703 |
begin |
704 |
Gear^.dX.isNegative := (not Gear^.dX.isNegative); |
|
705 |
Gear^.X:= Gear^.X + Gear^.dX; |
|
706 |
end |
|
707 |
else |
|
708 |
begin |
|
709 |
Gear^.dY.isNegative := (not Gear^.dY.isNegative); |
|
710 |
Gear^.Y:= Gear^.Y + Gear^.dY; |
|
711 |
end; |
|
6581 | 712 |
Gear^.dY := Gear^.dY * skipDecay; |
713 |
Gear^.dX := Gear^.dX * skipDecay; |
|
714 |
CheckGearDrowning := false; |
|
715 |
end |
|
10354 | 716 |
else // not skipping |
6581 | 717 |
begin |
10363 | 718 |
isImpact:= true; |
719 |
isSkip:= false; |
|
6581 | 720 |
if not isSubmersible then |
721 |
begin |
|
722 |
CheckGearDrowning := true; |
|
723 |
Gear^.State := gstDrowning; |
|
12177
bfeeb1c35e77
Set turn time to 0 when current hog drowns
Wuzzy <almikes@aol.com>
parents:
12176
diff
changeset
|
724 |
if Gear = CurrentHedgehog^.Gear then |
bfeeb1c35e77
Set turn time to 0 when current hog drowns
Wuzzy <almikes@aol.com>
parents:
12176
diff
changeset
|
725 |
TurnTimeLeft := 0; |
6581 | 726 |
Gear^.RenderTimer := false; |
727 |
if (Gear^.Kind <> gtSniperRifleShot) and (Gear^.Kind <> gtShotgunShot) |
|
12898 | 728 |
and (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) |
729 |
and (Gear^.Kind <> gtMinigunBullet) then |
|
6581 | 730 |
if Gear^.Kind = gtHedgehog then |
731 |
begin |
|
7010
10a0a31804f3
Switch effects to longint for convenience of tracking ice states. I could add a new Hedgehog value, but since we have this effects list being all useless as booleans anyway...
nemo
parents:
6990
diff
changeset
|
732 |
if Gear^.Hedgehog^.Effects[heResurrectable] <> 0 then |
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
733 |
begin |
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
734 |
// Gear could become nil after this, just exit to skip splashes |
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
735 |
ResurrectHedgehog(Gear); |
10245 | 736 |
exit(true) |
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
737 |
end |
6581 | 738 |
else |
739 |
begin |
|
10354 | 740 |
DrownGear(Gear); |
6581 | 741 |
Gear^.State := Gear^.State and (not gstHHDriven); |
10124
aabd1b75d5a3
Even more explicit type conversions and other stuff to help pas2c use ansistrings
unc0rr
parents:
10116
diff
changeset
|
742 |
s:= ansistring(Gear^.Hedgehog^.Name); |
12169
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
743 |
if Gear^.Hedgehog^.King then |
13642
3d14950641a4
Refactor text color variable names, export 2 color values to Lua
Wuzzy <Wuzzy2@mail.ru>
parents:
13629
diff
changeset
|
744 |
AddCaption(FormatA(GetEventString(eidKingDied), s), capcolDefault, capgrpMessage) |
12169
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
745 |
else |
13642
3d14950641a4
Refactor text color variable names, export 2 color values to Lua
Wuzzy <Wuzzy2@mail.ru>
parents:
13629
diff
changeset
|
746 |
AddCaption(FormatA(GetEventString(eidDrowned), s), capcolDefault, capgrpMessage); |
6581 | 747 |
end |
748 |
end |
|
749 |
else |
|
10354 | 750 |
DrownGear(Gear); |
10419 | 751 |
if Gear^.Kind = gtFlake then |
10354 | 752 |
exit(true); // skip splashes |
8990 | 753 |
end |
10363 | 754 |
else // submersible |
755 |
begin |
|
756 |
// drown submersible grears if far below map |
|
757 |
if (Y > cWaterLine + cVisibleWater*4) then |
|
758 |
begin |
|
759 |
DrownGear(Gear); |
|
760 |
exit(true); // no splashes needed |
|
761 |
end; |
|
10354 | 762 |
|
10363 | 763 |
CheckGearDrowning := false; |
764 |
||
765 |
// check if surface was penetrated |
|
10354 | 766 |
|
10363 | 767 |
// no penetration if center's water distance not smaller than radius |
12446
48ee3777e42e
trying to eliminate that annoying impact sound for gears that are well under the water and not even exiting it. sheepluva might want to look this over since this is modifying his code and should perhaps be part of the addSplashForGear checks, but hadn't had much luck getting him to examine it past year or so
nemo
parents:
12445
diff
changeset
|
768 |
if ((dist2Water + Gear^.Radius div 2) < 0) or (abs(dist2Water + Gear^.Radius) >= Gear^.Radius) then |
10363 | 769 |
isImpact:= false |
6804 | 770 |
else |
10354 | 771 |
begin |
10363 | 772 |
// get distance to water of last tick |
773 |
if isDirH then |
|
774 |
begin |
|
775 |
tmp:= hwRound(Gear^.X - Gear^.dX); |
|
12600 | 776 |
if abs(tmp - real(leftX)) < abs(tmp - real(rightX)) then // left edge |
777 |
isImpact:= (abs(tmp-real(leftX)) >= Gear^.Radius) and (Gear^.dX.isNegative) |
|
12446
48ee3777e42e
trying to eliminate that annoying impact sound for gears that are well under the water and not even exiting it. sheepluva might want to look this over since this is modifying his code and should perhaps be part of the addSplashForGear checks, but hadn't had much luck getting him to examine it past year or so
nemo
parents:
12445
diff
changeset
|
778 |
else |
12600 | 779 |
isImpact:= (abs(tmp-real(rightX)) >= Gear^.Radius) and (not Gear^.dX.isNegative); |
10363 | 780 |
end |
10354 | 781 |
else |
6803
0e70f3ea3bf8
bit of an experiment in variable splash sizes based on object/speed. not sure if it looks good yet. need to drown more stuff.
nemo
parents:
6769
diff
changeset
|
782 |
begin |
10363 | 783 |
tmp:= hwRound(Gear^.Y - Gear^.dY); |
784 |
tmp:= abs(cWaterLine - tmp); |
|
12446
48ee3777e42e
trying to eliminate that annoying impact sound for gears that are well under the water and not even exiting it. sheepluva might want to look this over since this is modifying his code and should perhaps be part of the addSplashForGear checks, but hadn't had much luck getting him to examine it past year or so
nemo
parents:
12445
diff
changeset
|
785 |
// there was an impact if distance was >= radius |
48ee3777e42e
trying to eliminate that annoying impact sound for gears that are well under the water and not even exiting it. sheepluva might want to look this over since this is modifying his code and should perhaps be part of the addSplashForGear checks, but hadn't had much luck getting him to examine it past year or so
nemo
parents:
12445
diff
changeset
|
786 |
isImpact:= (tmp >= Gear^.Radius) and (not Gear^.dY.isNegative); |
10363 | 787 |
end; |
10354 | 788 |
|
10363 | 789 |
end; |
790 |
end; // end of submersible |
|
791 |
end; // end of not skipping |
|
792 |
||
793 |
// splash sound animation and droplets |
|
794 |
if isImpact or isSkip then |
|
795 |
addSplashForGear(Gear, isSkip); |
|
796 |
||
10668 | 797 |
if isSkip then |
798 |
ScriptCall('onGearWaterSkip', Gear^.uid); |
|
6581 | 799 |
end |
800 |
else |
|
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
801 |
CheckGearDrowning := false |
6581 | 802 |
end; |
803 |
||
804 |
||
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
805 |
procedure ResurrectHedgehog(var gear: PGear); |
6581 | 806 |
var tempTeam : PTeam; |
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
807 |
sparkles, expl: PVisualGear; |
7092
c9ca770fd7fc
Add an emergency return to the timebox in the case of death of rest of team. Also add a small visual effect to AI survival
nemo
parents:
7066
diff
changeset
|
808 |
gX, gY: LongInt; |
6581 | 809 |
begin |
7357
06454899d0d2
Score AI resurrection as a kill. These values will not be the same as the in-game scoring, since in-game scoring doesn't count friendlies.
nemo
parents:
7272
diff
changeset
|
810 |
if (Gear^.LastDamage <> nil) then |
06454899d0d2
Score AI resurrection as a kill. These values will not be the same as the in-game scoring, since in-game scoring doesn't count friendlies.
nemo
parents:
7272
diff
changeset
|
811 |
uStats.HedgehogDamaged(Gear, Gear^.LastDamage, 0, true) |
06454899d0d2
Score AI resurrection as a kill. These values will not be the same as the in-game scoring, since in-game scoring doesn't count friendlies.
nemo
parents:
7272
diff
changeset
|
812 |
else |
06454899d0d2
Score AI resurrection as a kill. These values will not be the same as the in-game scoring, since in-game scoring doesn't count friendlies.
nemo
parents:
7272
diff
changeset
|
813 |
uStats.HedgehogDamaged(Gear, CurrentHedgehog, 0, true); |
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
814 |
// Reset gear state |
6581 | 815 |
AttackBar:= 0; |
816 |
gear^.dX := _0; |
|
817 |
gear^.dY := _0; |
|
818 |
gear^.Damage := 0; |
|
819 |
gear^.Health := gear^.Hedgehog^.InitialHealth; |
|
7010
10a0a31804f3
Switch effects to longint for convenience of tracking ice states. I could add a new Hedgehog value, but since we have this effects list being all useless as booleans anyway...
nemo
parents:
6990
diff
changeset
|
820 |
gear^.Hedgehog^.Effects[hePoisoned] := 0; |
7176
fb4b0c6dfdbd
Make watching AI v AI on ai survival a bit more entertaining
nemo
parents:
7168
diff
changeset
|
821 |
if (CurrentHedgehog^.Effects[heResurrectable] = 0) or ((CurrentHedgehog^.Effects[heResurrectable] <> 0) |
fb4b0c6dfdbd
Make watching AI v AI on ai survival a bit more entertaining
nemo
parents:
7168
diff
changeset
|
822 |
and (Gear^.Hedgehog^.Team^.Clan <> CurrentHedgehog^.Team^.Clan)) then |
8330 | 823 |
with CurrentHedgehog^ do |
6581 | 824 |
begin |
825 |
inc(Team^.stats.AIKills); |
|
10634
35d059bd0932
Use FreeAndNil across the board. Even if we are immediately assigning after, probably avoids accidental mistakes. Also free neglected owner tex on shutdown, and delete hog gears using the normal deletion procedure if for any reason they still exist (EndGame call?).
nemo
parents:
10558
diff
changeset
|
826 |
FreeAndNilTexture(Team^.AIKillsTex); |
10124
aabd1b75d5a3
Even more explicit type conversions and other stuff to help pas2c use ansistrings
unc0rr
parents:
10116
diff
changeset
|
827 |
Team^.AIKillsTex := RenderStringTex(ansistring(inttostr(Team^.stats.AIKills)), Team^.Clan^.Color, fnt16); |
6581 | 828 |
end; |
829 |
tempTeam := gear^.Hedgehog^.Team; |
|
830 |
DeleteCI(gear); |
|
7092
c9ca770fd7fc
Add an emergency return to the timebox in the case of death of rest of team. Also add a small visual effect to AI survival
nemo
parents:
7066
diff
changeset
|
831 |
gX := hwRound(gear^.X); |
c9ca770fd7fc
Add an emergency return to the timebox in the case of death of rest of team. Also add a small visual effect to AI survival
nemo
parents:
7066
diff
changeset
|
832 |
gY := hwRound(gear^.Y); |
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
833 |
// Spawn a few sparkles at death position. |
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
834 |
// Might need more sparkles for a column. |
7092
c9ca770fd7fc
Add an emergency return to the timebox in the case of death of rest of team. Also add a small visual effect to AI survival
nemo
parents:
7066
diff
changeset
|
835 |
sparkles:= AddVisualGear(gX, gY, vgtDust, 1); |
c9ca770fd7fc
Add an emergency return to the timebox in the case of death of rest of team. Also add a small visual effect to AI survival
nemo
parents:
7066
diff
changeset
|
836 |
if sparkles <> nil then |
c9ca770fd7fc
Add an emergency return to the timebox in the case of death of rest of team. Also add a small visual effect to AI survival
nemo
parents:
7066
diff
changeset
|
837 |
begin |
c9ca770fd7fc
Add an emergency return to the timebox in the case of death of rest of team. Also add a small visual effect to AI survival
nemo
parents:
7066
diff
changeset
|
838 |
sparkles^.Tint:= tempTeam^.Clan^.Color shl 8 or $FF; |
c9ca770fd7fc
Add an emergency return to the timebox in the case of death of rest of team. Also add a small visual effect to AI survival
nemo
parents:
7066
diff
changeset
|
839 |
end; |
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
840 |
// Set new position of gear (might fail) |
8330 | 841 |
FindPlace(gear, false, 0, LAND_WIDTH, true); |
6581 | 842 |
if gear <> nil then |
843 |
begin |
|
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
844 |
// Visual effect at position of resurrection |
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
845 |
expl:= AddVisualGear(hwRound(gear^.X), hwRound(gear^.Y), vgtExplosion); |
7168
8defaabce92e
warp sound when AI survival hog respawns. attempt at a bit of a crate spawn animation (moar sparkles and a quick fadein)
nemo
parents:
7092
diff
changeset
|
846 |
PlaySound(sndWarp); |
6581 | 847 |
RenderHealth(gear^.Hedgehog^); |
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
848 |
if expl <> nil then |
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
849 |
ScriptCall('onGearResurrect', gear^.uid, expl^.uid) |
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
850 |
else |
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
851 |
ScriptCall('onGearResurrect', gear^.uid); |
6581 | 852 |
gear^.State := gstWait; |
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
853 |
end; |
6581 | 854 |
RecountTeamHealth(tempTeam); |
855 |
end; |
|
856 |
||
12448
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
857 |
function CountLand(x, y, r, c: LongInt; mask, antimask: LongWord): LongInt; |
6581 | 858 |
var i: LongInt; |
859 |
count: LongInt = 0; |
|
860 |
begin |
|
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6986
diff
changeset
|
861 |
if (y and LAND_HEIGHT_MASK) = 0 then |
10272
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
862 |
for i:= max(x - r, 0) to min(x + r, LAND_WIDTH - 1) do |
12448
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
863 |
if (Land[y, i] and mask <> 0) and (Land[y, i] and antimask = 0) then |
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
864 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6986
diff
changeset
|
865 |
inc(count); |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6986
diff
changeset
|
866 |
if count = c then |
12448
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
867 |
begin |
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
868 |
CountLand:= count; |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6986
diff
changeset
|
869 |
exit |
12448
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
870 |
end; |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6986
diff
changeset
|
871 |
end; |
12448
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
872 |
CountLand:= count; |
6581 | 873 |
end; |
874 |
||
10272
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
875 |
function isSteadyPosition(x, y, r, c: LongInt; mask: Longword): boolean; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
876 |
var cnt, i: LongInt; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
877 |
begin |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
878 |
cnt:= 0; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
879 |
isSteadyPosition:= false; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
880 |
|
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
881 |
if ((y and LAND_HEIGHT_MASK) = 0) and (x - r >= 0) and (x + r < LAND_WIDTH) then |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
882 |
begin |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
883 |
for i:= r - c + 2 to r do |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
884 |
begin |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
885 |
if (Land[y, x - i] and mask <> 0) then inc(cnt); |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
886 |
if (Land[y, x + i] and mask <> 0) then inc(cnt); |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
887 |
|
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
888 |
if cnt >= c then |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
889 |
begin |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
890 |
isSteadyPosition:= true; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
891 |
exit |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
892 |
end; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
893 |
end; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
894 |
end; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
895 |
end; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
896 |
|
6888 | 897 |
|
898 |
function NoGearsToAvoid(mX, mY: LongInt; rX, rY: LongInt): boolean; |
|
899 |
var t: PGear; |
|
900 |
begin |
|
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6986
diff
changeset
|
901 |
NoGearsToAvoid:= false; |
6888 | 902 |
t:= GearsList; |
903 |
rX:= sqr(rX); |
|
904 |
rY:= sqr(rY); |
|
905 |
while t <> nil do |
|
906 |
begin |
|
907 |
if t^.Kind <= gtExplosives then |
|
908 |
if not (hwSqr(int2hwFloat(mX) - t^.X) / rX + hwSqr(int2hwFloat(mY) - t^.Y) / rY > _1) then |
|
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6986
diff
changeset
|
909 |
exit; |
6888 | 910 |
t:= t^.NextGear |
911 |
end; |
|
912 |
NoGearsToAvoid:= true |
|
913 |
end; |
|
914 |
||
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
915 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); inline; |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
916 |
begin |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
917 |
FindPlace(Gear, withFall, Left, Right, false); |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
918 |
end; |
6888 | 919 |
|
6581 | 920 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean); |
921 |
var x: LongInt; |
|
11193
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
922 |
y, sy, dir: LongInt; |
8007 | 923 |
ar: array[0..1023] of TPoint; |
924 |
ar2: array[0..2047] of TPoint; |
|
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
8007
diff
changeset
|
925 |
temp: TPoint; |
6581 | 926 |
cnt, cnt2: Longword; |
927 |
delta: LongInt; |
|
7190
aa8d68817c32
Make it AI survival almost definitely impossible by adding a 3rd pass to FindGear. 1st pass normal, 2nd pass allow close to objects, 3rd pass, allow overlapping objects.
nemo
parents:
7176
diff
changeset
|
928 |
ignoreNearObjects, ignoreOverlap, tryAgain: boolean; |
6581 | 929 |
begin |
7190
aa8d68817c32
Make it AI survival almost definitely impossible by adding a 3rd pass to FindGear. 1st pass normal, 2nd pass allow close to objects, 3rd pass, allow overlapping objects.
nemo
parents:
7176
diff
changeset
|
930 |
ignoreNearObjects:= false; // try not skipping proximity at first |
aa8d68817c32
Make it AI survival almost definitely impossible by adding a 3rd pass to FindGear. 1st pass normal, 2nd pass allow close to objects, 3rd pass, allow overlapping objects.
nemo
parents:
7176
diff
changeset
|
931 |
ignoreOverlap:= false; // this not only skips proximity, but allows overlapping objects (barrels, mines, hogs, crates). Saving it for a 3rd pass. With this active, winning AI Survival goes back to virtual impossibility |
6581 | 932 |
tryAgain:= true; |
10015 | 933 |
if WorldEdge <> weNone then |
9477 | 934 |
begin |
9809 | 935 |
Left:= max(Left, LongInt(leftX) + Gear^.Radius); |
9477 | 936 |
Right:= min(Right,rightX-Gear^.Radius) |
937 |
end; |
|
6581 | 938 |
while tryAgain do |
939 |
begin |
|
8007 | 940 |
delta:= LAND_WIDTH div 16; |
6581 | 941 |
cnt2:= 0; |
942 |
repeat |
|
11193
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
943 |
if GetRandom(2) = 0 then dir:= -1 else dir:= 1; |
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
944 |
x:= max(LAND_WIDTH div 2048, LongInt(GetRandom(Delta))); |
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
945 |
if dir = 1 then x:= Left + x else x:= Right - x; |
6581 | 946 |
repeat |
947 |
cnt:= 0; |
|
9809 | 948 |
y:= min(1024, topY) - Gear^.Radius shl 1; |
6581 | 949 |
while y < cWaterLine do |
950 |
begin |
|
951 |
repeat |
|
952 |
inc(y, 2); |
|
7190
aa8d68817c32
Make it AI survival almost definitely impossible by adding a 3rd pass to FindGear. 1st pass normal, 2nd pass allow close to objects, 3rd pass, allow overlapping objects.
nemo
parents:
7176
diff
changeset
|
953 |
until (y >= cWaterLine) or |
12448
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
954 |
(ignoreOverLap and (CountLand(x, y, Gear^.Radius - 1, 1, $FF00, 0) = 0)) or |
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
955 |
(not ignoreOverLap and (CountLand(x, y, Gear^.Radius - 1, 1, $FFFF, 0) = 0)); |
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
956 |
|
6581 | 957 |
|
958 |
sy:= y; |
|
959 |
||
960 |
repeat |
|
961 |
inc(y); |
|
7190
aa8d68817c32
Make it AI survival almost definitely impossible by adding a 3rd pass to FindGear. 1st pass normal, 2nd pass allow close to objects, 3rd pass, allow overlapping objects.
nemo
parents:
7176
diff
changeset
|
962 |
until (y >= cWaterLine) or |
12448
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
963 |
(ignoreOverlap and |
12449 | 964 |
(CountLand(x, y, Gear^.Radius - 1, 1, $FFFF, 0) <> 0)) or |
12448
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
965 |
(not ignoreOverlap and |
12449 | 966 |
(CountLand(x, y, Gear^.Radius - 1, 1, lfLandMask, 0) <> 0)); |
6581 | 967 |
|
10272
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
968 |
if (y - sy > Gear^.Radius * 2) and (y < cWaterLine) |
6581 | 969 |
and (((Gear^.Kind = gtExplosives) |
10272
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
970 |
and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 60, 60)) |
10274 | 971 |
and (isSteadyPosition(x, y+1, Gear^.Radius - 1, 3, $FFFF) |
12448
8b89fe2115ad
So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP
nemo
parents:
12446
diff
changeset
|
972 |
or (CountLand(x, y+1, Gear^.Radius - 1, Gear^.Radius+1, $FFFF, 0) > Gear^.Radius) |
10274 | 973 |
)) |
10272
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
974 |
or |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
975 |
((Gear^.Kind <> gtExplosives) |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
976 |
and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 110, 110)) |
12449 | 977 |
and (isSteadyPosition(x, y+1, Gear^.Radius - 1, 3, lfIce) |
978 |
or (CountLand(x, y+1, Gear^.Radius - 1, Gear^.Radius+1, $FFFF, lfIce) <> 0) |
|
979 |
))) then |
|
6888 | 980 |
begin |
6581 | 981 |
ar[cnt].X:= x; |
982 |
if withFall then |
|
983 |
ar[cnt].Y:= sy + Gear^.Radius |
|
984 |
else |
|
985 |
ar[cnt].Y:= y - Gear^.Radius; |
|
986 |
inc(cnt) |
|
987 |
end; |
|
988 |
||
7603
e9c3c67b5dfd
reducing this value is sufficient to ensure crates drop just below top border or a girder
nemo
parents:
7599
diff
changeset
|
989 |
inc(y, 10) |
6581 | 990 |
end; |
991 |
||
992 |
if cnt > 0 then |
|
10015 | 993 |
begin |
994 |
temp := ar[GetRandom(cnt)]; |
|
995 |
with temp do |
|
6581 | 996 |
begin |
997 |
ar2[cnt2].x:= x; |
|
998 |
ar2[cnt2].y:= y; |
|
999 |
inc(cnt2) |
|
11193
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
1000 |
end; |
11192
0f6916065849
This should probably fix feedback that hogs weren't spawning on left side of map.
nemo
parents:
11046
diff
changeset
|
1001 |
end; |
11193
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
1002 |
inc(x, Delta*dir) |
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
1003 |
until ((dir = 1) and (x > Right)) or ((dir = -1) and (x < Left)); |
6581 | 1004 |
|
1005 |
dec(Delta, 60) |
|
1006 |
until (cnt2 > 0) or (Delta < 70); |
|
7190
aa8d68817c32
Make it AI survival almost definitely impossible by adding a 3rd pass to FindGear. 1st pass normal, 2nd pass allow close to objects, 3rd pass, allow overlapping objects.
nemo
parents:
7176
diff
changeset
|
1007 |
// if either of these has not been tried, do another pass |
aa8d68817c32
Make it AI survival almost definitely impossible by adding a 3rd pass to FindGear. 1st pass normal, 2nd pass allow close to objects, 3rd pass, allow overlapping objects.
nemo
parents:
7176
diff
changeset
|
1008 |
if (cnt2 = 0) and skipProximity and (not ignoreOverlap) then |
6581 | 1009 |
tryAgain:= true |
1010 |
else tryAgain:= false; |
|
7190
aa8d68817c32
Make it AI survival almost definitely impossible by adding a 3rd pass to FindGear. 1st pass normal, 2nd pass allow close to objects, 3rd pass, allow overlapping objects.
nemo
parents:
7176
diff
changeset
|
1011 |
if ignoreNearObjects then ignoreOverlap:= true; |
aa8d68817c32
Make it AI survival almost definitely impossible by adding a 3rd pass to FindGear. 1st pass normal, 2nd pass allow close to objects, 3rd pass, allow overlapping objects.
nemo
parents:
7176
diff
changeset
|
1012 |
ignoreNearObjects:= true; |
6581 | 1013 |
end; |
1014 |
||
1015 |
if cnt2 > 0 then |
|
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
8007
diff
changeset
|
1016 |
begin |
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
8007
diff
changeset
|
1017 |
temp := ar2[GetRandom(cnt2)]; |
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
8007
diff
changeset
|
1018 |
with temp do |
6581 | 1019 |
begin |
1020 |
Gear^.X:= int2hwFloat(x); |
|
1021 |
Gear^.Y:= int2hwFloat(y); |
|
1022 |
AddFileLog('Assigned Gear coordinates (' + inttostr(x) + ',' + inttostr(y) + ')'); |
|
1023 |
end |
|
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
8007
diff
changeset
|
1024 |
end |
11477
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1025 |
else |
6581 | 1026 |
begin |
1027 |
OutError('Can''t find place for Gear', false); |
|
1028 |
if Gear^.Kind = gtHedgehog then |
|
11477
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1029 |
begin |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1030 |
cnt:= 0; |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1031 |
if GameTicks = 0 then |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1032 |
begin |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1033 |
//AddFileLog('Trying to make a hole'); |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1034 |
while (cnt < 1000) do |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1035 |
begin |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1036 |
inc(cnt); |
11751
20e0a72e0e2c
make hog fallback (flower-in-hole) positioning respect limits (e.g. used by gfDivideTeams)
sheepluva
parents:
11551
diff
changeset
|
1037 |
x:= left+GetRandom(right-left-2*cHHRadius)+cHHRadius; |
11479 | 1038 |
y:= topY+GetRandom(LAND_HEIGHT-topY-64)+48; |
11478
8c95d5a4366c
Tweak the hole carving to become less agressive about spacing if random points keep failing.
nemo
parents:
11477
diff
changeset
|
1039 |
if NoGearsToAvoid(x, y, 100 div max(1,cnt div 100), 100 div max(1,cnt div 100)) then |
11477
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1040 |
begin |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1041 |
Gear^.State:= Gear^.State or gsttmpFlag; |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1042 |
Gear^.X:= int2hwFloat(x); |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1043 |
Gear^.Y:= int2hwFloat(y); |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1044 |
AddFileLog('Picked a spot for hog at coordinates (' + inttostr(hwRound(Gear^.X)) + ',' + inttostr(hwRound(Gear^.Y)) + ')'); |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1045 |
cnt:= 2000 |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1046 |
end |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1047 |
end; |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1048 |
end; |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1049 |
if cnt < 2000 then |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1050 |
begin |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1051 |
Gear^.Hedgehog^.Effects[heResurrectable] := 0; |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1052 |
DeleteGear(Gear); |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1053 |
Gear:= nil |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1054 |
end |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1055 |
end |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1056 |
else |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1057 |
begin |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1058 |
DeleteGear(Gear); |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1059 |
Gear:= nil |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1060 |
end |
6581 | 1061 |
end |
1062 |
end; |
|
1063 |
||
13920 | 1064 |
function CheckGearNearImpl(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt; exclude: PGear): PGear; |
13921 | 1065 |
var t: PGear; |
13922 | 1066 |
width, bound, dX, dY: hwFloat; |
13912 | 1067 |
isHit: Boolean; |
6581 | 1068 |
begin |
13912 | 1069 |
t:= GearsList; |
13915 | 1070 |
bound:= _1_5 * int2hwFloat(max(rX, rY)); |
13912 | 1071 |
rX:= sqr(rX); |
1072 |
rY:= sqr(rY); |
|
13913 | 1073 |
width:= int2hwFloat(RightX - LeftX); |
13399 | 1074 |
|
13912 | 1075 |
while t <> nil do |
13399 | 1076 |
begin |
13912 | 1077 |
if (t <> exclude) and (t^.Kind = Kind) then |
13399 | 1078 |
begin |
13912 | 1079 |
dX := X - t^.X; |
1080 |
dY := Y - t^.Y; |
|
13915 | 1081 |
isHit := (hwAbs(dX) + hwAbs(dY) < bound) |
1082 |
and (not ((hwSqr(dX) / rX + hwSqr(dY) / rY) > _1)); |
|
13912 | 1083 |
|
1084 |
if (not isHit) and (WorldEdge = weWrap) then |
|
1085 |
begin |
|
13915 | 1086 |
if (hwAbs(dX - width) + hwAbs(dY) < bound) |
1087 |
and (not ((hwSqr(dX - width) / rX + hwSqr(dY) / rY) > _1)) then |
|
13912 | 1088 |
isHit := true |
13915 | 1089 |
else if (hwAbs(dX + width) + hwAbs(dY) < bound) |
1090 |
and (not ((hwSqr(dX + width) / rX + hwSqr(dY) / rY) > _1)) then |
|
13912 | 1091 |
isHit := true |
1092 |
end; |
|
1093 |
||
1094 |
if isHit then |
|
1095 |
begin |
|
13922 | 1096 |
CheckGearNearImpl:= t; |
13912 | 1097 |
exit; |
1098 |
end; |
|
13399 | 1099 |
end; |
13912 | 1100 |
t:= t^.NextGear |
13399 | 1101 |
end; |
1102 |
||
13922 | 1103 |
CheckGearNearImpl:= nil |
13912 | 1104 |
end; |
1105 |
||
1106 |
function CheckGearNear(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt): PGear; |
|
1107 |
begin |
|
1108 |
CheckGearNear := CheckGearNearImpl(Kind, X, Y, rX, rY, nil); |
|
13399 | 1109 |
end; |
1110 |
||
1111 |
function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear; |
|
1112 |
begin |
|
13912 | 1113 |
CheckGearNear := CheckGearNearImpl(Kind, Gear^.X, Gear^.Y, rX, rY, Gear); |
6581 | 1114 |
end; |
1115 |
||
7592 | 1116 |
procedure CheckCollision(Gear: PGear); inline; |
1117 |
begin |
|
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1118 |
if (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0) |
7592 | 1119 |
or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then |
1120 |
Gear^.State := Gear^.State or gstCollision |
|
1121 |
else |
|
1122 |
Gear^.State := Gear^.State and (not gstCollision) |
|
1123 |
end; |
|
1124 |
||
1125 |
procedure CheckCollisionWithLand(Gear: PGear); inline; |
|
1126 |
begin |
|
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1127 |
if (TestCollisionX(Gear, hwSign(Gear^.dX)) <> 0) |
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1128 |
or (TestCollisionY(Gear, hwSign(Gear^.dY)) <> 0) then |
7592 | 1129 |
Gear^.State := Gear^.State or gstCollision |
8330 | 1130 |
else |
7592 | 1131 |
Gear^.State := Gear^.State and (not gstCollision) |
1132 |
end; |
|
1133 |
||
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1134 |
function MakeHedgehogsStep(Gear: PGear) : boolean; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1135 |
begin |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1136 |
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then |
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1137 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1138 |
Gear^.Y:= Gear^.Y - _1; |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1139 |
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then |
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1140 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1141 |
Gear^.Y:= Gear^.Y - _1; |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1142 |
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then |
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1143 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1144 |
Gear^.Y:= Gear^.Y - _1; |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1145 |
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then |
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1146 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1147 |
Gear^.Y:= Gear^.Y - _1; |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1148 |
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then |
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1149 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1150 |
Gear^.Y:= Gear^.Y - _1; |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1151 |
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then |
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1152 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1153 |
Gear^.Y:= Gear^.Y - _1; |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1154 |
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then |
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1155 |
Gear^.Y:= Gear^.Y + _6 |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1156 |
end else Gear^.Y:= Gear^.Y + _5 else |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1157 |
end else Gear^.Y:= Gear^.Y + _4 else |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1158 |
end else Gear^.Y:= Gear^.Y + _3 else |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1159 |
end else Gear^.Y:= Gear^.Y + _2 else |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1160 |
end else Gear^.Y:= Gear^.Y + _1 |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1161 |
end; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1162 |
|
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1163 |
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) = 0 then |
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1164 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1165 |
Gear^.X:= Gear^.X + SignAs(_1, Gear^.dX); |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1166 |
MakeHedgehogsStep:= true |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1167 |
end else |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1168 |
MakeHedgehogsStep:= false; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1169 |
|
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1170 |
if TestCollisionYwithGear(Gear, 1) = 0 then |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1171 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1172 |
Gear^.Y:= Gear^.Y + _1; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1173 |
if TestCollisionYwithGear(Gear, 1) = 0 then |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1174 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1175 |
Gear^.Y:= Gear^.Y + _1; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1176 |
if TestCollisionYwithGear(Gear, 1) = 0 then |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1177 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1178 |
Gear^.Y:= Gear^.Y + _1; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1179 |
if TestCollisionYwithGear(Gear, 1) = 0 then |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1180 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1181 |
Gear^.Y:= Gear^.Y + _1; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1182 |
if TestCollisionYwithGear(Gear, 1) = 0 then |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1183 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1184 |
Gear^.Y:= Gear^.Y + _1; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1185 |
if TestCollisionYwithGear(Gear, 1) = 0 then |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1186 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1187 |
Gear^.Y:= Gear^.Y + _1; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1188 |
if TestCollisionYwithGear(Gear, 1) = 0 then |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1189 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1190 |
Gear^.Y:= Gear^.Y - _6; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1191 |
Gear^.dY:= _0; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1192 |
Gear^.State:= Gear^.State or gstMoving; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1193 |
exit |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1194 |
end; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1195 |
end |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1196 |
end |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1197 |
end |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1198 |
end |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1199 |
end |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1200 |
end; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1201 |
end; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1202 |
|
9285 | 1203 |
|
1204 |
procedure ShotgunShot(Gear: PGear); |
|
1205 |
var t: PGear; |
|
1206 |
dmg, r, dist: LongInt; |
|
1207 |
dx, dy: hwFloat; |
|
1208 |
begin |
|
1209 |
Gear^.Radius:= cShotgunRadius; |
|
1210 |
t:= GearsList; |
|
1211 |
while t <> nil do |
|
1212 |
begin |
|
1213 |
case t^.Kind of |
|
1214 |
gtHedgehog, |
|
1215 |
gtMine, |
|
1216 |
gtSMine, |
|
13407
06792533ef91
ensure shotgun works with portals and make it hit airmines
alfadur
parents:
13403
diff
changeset
|
1217 |
gtAirMine, |
9285 | 1218 |
gtKnife, |
1219 |
gtCase, |
|
1220 |
gtTarget, |
|
1221 |
gtExplosives: begin//, |
|
1222 |
// gtStructure: begin |
|
1223 |
//addFileLog('ShotgunShot radius: ' + inttostr(Gear^.Radius) + ', t^.Radius = ' + inttostr(t^.Radius) + ', distance = ' + inttostr(dist) + ', dmg = ' + inttostr(dmg)); |
|
1224 |
dmg:= 0; |
|
1225 |
r:= Gear^.Radius + t^.Radius; |
|
1226 |
dx:= Gear^.X-t^.X; |
|
1227 |
dx.isNegative:= false; |
|
1228 |
dy:= Gear^.Y-t^.Y; |
|
1229 |
dy.isNegative:= false; |
|
1230 |
if r-hwRound(dx+dy) > 0 then |
|
1231 |
begin |
|
1232 |
dist:= hwRound(Distance(dx, dy)); |
|
11472 | 1233 |
dmg:= ModifyDamage(min(r - dist, Gear^.Boom), t); |
9285 | 1234 |
end; |
1235 |
if dmg > 0 then |
|
1236 |
begin |
|
10558 | 1237 |
if (t^.Kind <> gtHedgehog) or (t^.Hedgehog^.Effects[heInvulnerable] = 0) then |
9285 | 1238 |
ApplyDamage(t, Gear^.Hedgehog, dmg, dsBullet) |
1239 |
else |
|
1240 |
Gear^.State:= Gear^.State or gstWinner; |
|
1241 |
||
1242 |
DeleteCI(t); |
|
1243 |
t^.dX:= t^.dX + Gear^.dX * dmg * _0_01 + SignAs(cHHKick, Gear^.dX); |
|
1244 |
t^.dY:= t^.dY + Gear^.dY * dmg * _0_01; |
|
1245 |
t^.State:= t^.State or gstMoving; |
|
1246 |
if t^.Kind = gtKnife then t^.State:= t^.State and (not gstCollision); |
|
1247 |
t^.Active:= true; |
|
1248 |
FollowGear:= t |
|
1249 |
end |
|
1250 |
end; |
|
1251 |
gtGrave: begin |
|
1252 |
dmg:= 0; |
|
1253 |
r:= Gear^.Radius + t^.Radius; |
|
1254 |
dx:= Gear^.X-t^.X; |
|
1255 |
dx.isNegative:= false; |
|
1256 |
dy:= Gear^.Y-t^.Y; |
|
1257 |
dy.isNegative:= false; |
|
1258 |
if r-hwRound(dx+dy) > 0 then |
|
1259 |
begin |
|
1260 |
dist:= hwRound(Distance(dx, dy)); |
|
11472 | 1261 |
dmg:= ModifyDamage(min(r - dist, Gear^.Boom), t); |
9285 | 1262 |
end; |
1263 |
if dmg > 0 then |
|
1264 |
begin |
|
1265 |
t^.dY:= - _0_1; |
|
1266 |
t^.Active:= true |
|
1267 |
end |
|
1268 |
end; |
|
1269 |
end; |
|
1270 |
t:= t^.NextGear |
|
1271 |
end; |
|
1272 |
if (GameFlags and gfSolidLand) = 0 then |
|
1273 |
DrawExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), cShotgunRadius) |
|
1274 |
end; |
|
1275 |
||
12712
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1276 |
// Returns true if the given hog gear can use the tardis |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1277 |
function CanUseTardis(HHGear: PGear): boolean; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1278 |
var usable: boolean; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1279 |
i, j, cnt: LongInt; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1280 |
HH: PHedgehog; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1281 |
begin |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1282 |
(* |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1283 |
Conditions for not activating. |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1284 |
1. Hog is last of his clan |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1285 |
2. Sudden Death is in play |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1286 |
3. Hog is a king |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1287 |
*) |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1288 |
usable:= true; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1289 |
HH:= HHGear^.Hedgehog; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1290 |
if HHGear <> nil then |
12920
21827fc9ca98
Fix timebox being usable in SD w/ damage=0
Wuzzy <Wuzzy2@mail.ru>
parents:
12898
diff
changeset
|
1291 |
if (HHGear = nil) or (HH^.King) or (SuddenDeathActive) then |
12712
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1292 |
usable:= false; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1293 |
cnt:= 0; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1294 |
for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1295 |
for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1296 |
if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil) |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1297 |
and ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0) |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1298 |
and (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health > HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1299 |
inc(cnt); |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1300 |
if (cnt < 2) then |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1301 |
usable:= false; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1302 |
CanUseTardis:= usable; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1303 |
end; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1304 |
|
12898 | 1305 |
procedure AmmoShoveImpl(Ammo: PGear; Damage, Power: LongInt; collisions: PGearArray); |
9285 | 1306 |
var t: PGearArray; |
1307 |
Gear: PGear; |
|
1308 |
i, j, tmpDmg: LongInt; |
|
1309 |
VGear: PVisualGear; |
|
1310 |
begin |
|
12898 | 1311 |
t:= collisions; |
1312 |
||
9285 | 1313 |
// Just to avoid hogs on rope dodging fire. |
1314 |
if (CurAmmoGear <> nil) and ((CurAmmoGear^.Kind = gtRope) or (CurAmmoGear^.Kind = gtJetpack) or (CurAmmoGear^.Kind = gtBirdy)) |
|
1315 |
and (CurrentHedgehog^.Gear <> nil) and (CurrentHedgehog^.Gear^.CollisionIndex = -1) |
|
1316 |
and (sqr(hwRound(Ammo^.X) - hwRound(CurrentHedgehog^.Gear^.X)) + sqr(hwRound(Ammo^.Y) - hwRound(CurrentHedgehog^.Gear^.Y)) <= sqr(cHHRadius + Ammo^.Radius)) then |
|
1317 |
begin |
|
1318 |
t^.ar[t^.Count]:= CurrentHedgehog^.Gear; |
|
1319 |
inc(t^.Count) |
|
1320 |
end; |
|
1321 |
||
1322 |
i:= t^.Count; |
|
1323 |
||
1324 |
if (Ammo^.Kind = gtFlame) and (i > 0) then |
|
1325 |
Ammo^.Health:= 0; |
|
1326 |
while i > 0 do |
|
1327 |
begin |
|
1328 |
dec(i); |
|
1329 |
Gear:= t^.ar[i]; |
|
14028 | 1330 |
if (Ammo^.Kind in [gtDEagleShot, gtSniperRifleShot, gtMinigunBullet, |
14030
d203bb36225f
and finally make the bat hit moving gears for completeness
alfadur
parents:
14029
diff
changeset
|
1331 |
gtFirePunch, gtKamikaze, gtWhip, gtShover]) |
13403
9c9d29be9e00
make all bullets function similar to machinegun bullets (can hit/shove objects without checkin)
nemo
parents:
13399
diff
changeset
|
1332 |
and (((Ammo^.Data <> nil) and (PGear(Ammo^.Data) = Gear)) |
9c9d29be9e00
make all bullets function similar to machinegun bullets (can hit/shove objects without checkin)
nemo
parents:
13399
diff
changeset
|
1333 |
or (not UpdateHitOrder(Gear, Ammo^.WDTimer))) then |
11550
881231c1ba46
disallow bullets to hit the hedgehog that fired them (unless bounced/wrapped/portal'd)
sheepluva
parents:
11479
diff
changeset
|
1334 |
continue; |
12898 | 1335 |
|
10015 | 1336 |
if ((Ammo^.Kind = gtFlame) or (Ammo^.Kind = gtBlowTorch)) and |
12898 | 1337 |
(Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heFrozen] > 255) then |
9285 | 1338 |
Gear^.Hedgehog^.Effects[heFrozen]:= max(255,Gear^.Hedgehog^.Effects[heFrozen]-10000); |
1339 |
tmpDmg:= ModifyDamage(Damage, Gear); |
|
1340 |
if (Gear^.State and gstNoDamage) = 0 then |
|
1341 |
begin |
|
1342 |
||
1343 |
if (Gear^.Kind = gtHedgehog) and (Ammo^.State and gsttmpFlag <> 0) and (Ammo^.Kind = gtShover) then |
|
1344 |
Gear^.FlightTime:= 1; |
|
1345 |
||
1346 |
case Gear^.Kind of |
|
1347 |
gtHedgehog, |
|
1348 |
gtMine, |
|
13399 | 1349 |
gtAirMine, |
9285 | 1350 |
gtSMine, |
1351 |
gtKnife, |
|
1352 |
gtTarget, |
|
1353 |
gtCase, |
|
1354 |
gtExplosives: //, |
|
1355 |
//gtStructure: |
|
1356 |
begin |
|
14028 | 1357 |
if (Ammo^.Kind in [gtFirePunch, gtKamikaze]) and (Gear^.Kind <> gtSMine) then |
14020 | 1358 |
PlaySound(sndFirePunchHit); |
1359 |
||
13807 | 1360 |
if Ammo^.Kind in [gtDEagleShot, gtSniperRifleShot, gtMinigunBullet] then |
1361 |
begin |
|
1362 |
VGear := AddVisualGear(t^.cX[i], t^.cY[i], vgtBulletHit); |
|
1363 |
if VGear <> nil then |
|
1364 |
VGear^.Angle := DxDy2Angle(-Ammo^.dX, Ammo^.dY); |
|
1365 |
end; |
|
9285 | 1366 |
if (Ammo^.Kind = gtDrill) then |
1367 |
begin |
|
1368 |
Ammo^.Timer:= 0; |
|
1369 |
exit; |
|
1370 |
end; |
|
10011
ead5e4b21671
Add check for gear kind of hedgehog on invulnerability effect. This probably fixes bug #766, is similar to change in previous r2a1483d91977 and was introduced by r7d925e82e572
nemo
parents:
10010
diff
changeset
|
1371 |
if (Gear^.Kind <> gtHedgehog) or (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) then |
9285 | 1372 |
begin |
1373 |
if (Ammo^.Kind = gtKnife) and (tmpDmg > 0) then |
|
1374 |
for j:= 1 to max(1,min(3,tmpDmg div 5)) do |
|
1375 |
begin |
|
12898 | 1376 |
VGear:= AddVisualGear( |
1377 |
t^.cX[i] - ((t^.cX[i] - hwround(Gear^.X)) div 2), |
|
1378 |
t^.cY[i] - ((t^.cY[i] - hwround(Gear^.Y)) div 2), |
|
1379 |
vgtStraightShot); |
|
9285 | 1380 |
if VGear <> nil then |
1381 |
with VGear^ do |
|
1382 |
begin |
|
1383 |
Tint:= $FFCC00FF; |
|
1384 |
Angle:= random(360); |
|
1385 |
dx:= 0.0005 * (random(100)); |
|
1386 |
dy:= 0.0005 * (random(100)); |
|
1387 |
if random(2) = 0 then |
|
1388 |
dx := -dx; |
|
1389 |
if random(2) = 0 then |
|
1390 |
dy := -dy; |
|
1391 |
FrameTicks:= 600+random(200); |
|
1392 |
State:= ord(sprStar) |
|
1393 |
end |
|
1394 |
end; |
|
1395 |
ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg, dsShove) |
|
1396 |
end |
|
1397 |
else |
|
1398 |
Gear^.State:= Gear^.State or gstWinner; |
|
10015 | 1399 |
if (Gear^.Kind = gtExplosives) and (Ammo^.Kind = gtBlowtorch) then |
9285 | 1400 |
begin |
1401 |
if (Ammo^.Hedgehog^.Gear <> nil) then |
|
1402 |
Ammo^.Hedgehog^.Gear^.State:= Ammo^.Hedgehog^.Gear^.State and (not gstNotKickable); |
|
14061
128fbd36eee4
Stop using dsUnknown, replace with concrete damage sources
Wuzzy <Wuzzy2@mail.ru>
parents:
14043
diff
changeset
|
1403 |
ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg * 100, dsExplosion); // crank up damage for explosives + blowtorch |
9285 | 1404 |
end; |
1405 |
||
1406 |
if (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.King or (Gear^.Hedgehog^.Effects[heFrozen] > 0)) then |
|
1407 |
begin |
|
13803 | 1408 |
Gear^.dX:= Ammo^.dX * Power * _0_005; |
1409 |
Gear^.dY:= Ammo^.dY * Power * _0_005 |
|
9285 | 1410 |
end |
1411 |
else if ((Ammo^.Kind <> gtFlame) or (Gear^.Kind = gtHedgehog)) and (Power <> 0) then |
|
1412 |
begin |
|
13803 | 1413 |
Gear^.dX:= Ammo^.dX * Power * _0_01; |
1414 |
Gear^.dY:= Ammo^.dY * Power * _0_01 |
|
9285 | 1415 |
end; |
1416 |
||
1417 |
if (not isZero(Gear^.dX)) or (not isZero(Gear^.dY)) then |
|
1418 |
begin |
|
1419 |
Gear^.Active:= true; |
|
1420 |
DeleteCI(Gear); |
|
1421 |
Gear^.State:= Gear^.State or gstMoving; |
|
1422 |
if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision); |
|
1423 |
// move the gear upwards a bit to throw it over tiny obstacles at start |
|
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1424 |
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then |
9285 | 1425 |
begin |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1426 |
if (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX)) = 0) and |
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1427 |
(TestCollisionYwithGear(Gear, -1) = 0) then |
9285 | 1428 |
Gear^.Y:= Gear^.Y - _1; |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1429 |
if (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) = 0) and |
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1430 |
(TestCollisionYwithGear(Gear, -1) = 0) then |
9285 | 1431 |
Gear^.Y:= Gear^.Y - _1; |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1432 |
if (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) = 0) and |
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1433 |
(TestCollisionYwithGear(Gear, -1) = 0) then |
9285 | 1434 |
Gear^.Y:= Gear^.Y - _1; |
1435 |
end |
|
1436 |
end; |
|
1437 |
||
1438 |
||
1439 |
if (Ammo^.Kind <> gtFlame) or ((Ammo^.State and gsttmpFlag) = 0) then |
|
1440 |
FollowGear:= Gear |
|
1441 |
end; |
|
1442 |
end |
|
1443 |
end; |
|
1444 |
end; |
|
1445 |
if i <> 0 then |
|
1446 |
SetAllToActive |
|
1447 |
end; |
|
1448 |
||
12898 | 1449 |
procedure AmmoShoveLine(Ammo: PGear; Damage, Power: LongInt; oX, oY, tX, tY: hwFloat); |
1450 |
var t: PGearArray; |
|
1451 |
begin |
|
13403
9c9d29be9e00
make all bullets function similar to machinegun bullets (can hit/shove objects without checkin)
nemo
parents:
13399
diff
changeset
|
1452 |
t:= CheckAllGearsLineCollision(Ammo, oX, oY, tX, tY); |
12898 | 1453 |
AmmoShoveImpl(Ammo, Damage, Power, t); |
1454 |
end; |
|
1455 |
||
1456 |
procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt); |
|
1457 |
begin |
|
1458 |
AmmoShoveImpl(Ammo, Damage, Power, |
|
1459 |
CheckGearsCollision(Ammo)); |
|
1460 |
end; |
|
1461 |
||
14027
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
1462 |
procedure AmmoShoveCache(Ammo: PGear; Damage, Power: LongInt); |
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
1463 |
begin |
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
1464 |
AmmoShoveImpl(Ammo, Damage, Power, |
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
1465 |
CheckCacheCollision(Ammo)); |
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
1466 |
end; |
9285 | 1467 |
|
1468 |
function CountGears(Kind: TGearType): Longword; |
|
1469 |
var t: PGear; |
|
1470 |
count: Longword = 0; |
|
1471 |
begin |
|
1472 |
||
1473 |
t:= GearsList; |
|
1474 |
while t <> nil do |
|
1475 |
begin |
|
1476 |
if t^.Kind = Kind then |
|
1477 |
inc(count); |
|
1478 |
t:= t^.NextGear |
|
1479 |
end; |
|
1480 |
CountGears:= count; |
|
1481 |
end; |
|
1482 |
||
1483 |
procedure SetAllToActive; |
|
1484 |
var t: PGear; |
|
1485 |
begin |
|
1486 |
AllInactive:= false; |
|
1487 |
t:= GearsList; |
|
1488 |
while t <> nil do |
|
1489 |
begin |
|
1490 |
t^.Active:= true; |
|
1491 |
t:= t^.NextGear |
|
1492 |
end |
|
1493 |
end; |
|
1494 |
||
1495 |
procedure SetAllHHToActive; inline; |
|
1496 |
begin |
|
1497 |
SetAllHHToActive(true) |
|
1498 |
end; |
|
1499 |
||
1500 |
||
1501 |
procedure SetAllHHToActive(Ice: boolean); |
|
1502 |
var t: PGear; |
|
1503 |
begin |
|
1504 |
AllInactive:= false; |
|
1505 |
t:= GearsList; |
|
1506 |
while t <> nil do |
|
1507 |
begin |
|
1508 |
if (t^.Kind = gtHedgehog) or (t^.Kind = gtExplosives) then |
|
1509 |
begin |
|
1510 |
if (t^.Kind = gtHedgehog) and Ice then CheckIce(t); |
|
1511 |
t^.Active:= true |
|
1512 |
end; |
|
1513 |
t:= t^.NextGear |
|
1514 |
end |
|
1515 |
end; |
|
1516 |
||
1517 |
||
1518 |
var GearsNearArray : TPGearArray; |
|
1519 |
function GearsNear(X, Y: hwFloat; Kind: TGearType; r: LongInt): PGearArrayS; |
|
1520 |
var |
|
1521 |
t: PGear; |
|
1522 |
s: Longword; |
|
12743
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1523 |
xc, xc_left, xc_right, yc: hwFloat; |
9285 | 1524 |
begin |
1525 |
r:= r*r; |
|
1526 |
s:= 0; |
|
1527 |
SetLength(GearsNearArray, s); |
|
1528 |
t := GearsList; |
|
10015 | 1529 |
while t <> nil do |
9285 | 1530 |
begin |
12743
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1531 |
xc:= (X - t^.X)*(X - t^.X); |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1532 |
xc_left:= ((X - int2hwFloat(RightX-LeftX)) - t^.X)*((X - int2hwFloat(RightX-LeftX)) - t^.X); |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1533 |
xc_right := ((X + int2hwFloat(RightX-LeftX)) - t^.X)*((X + int2hwFloat(RightX-LeftX)) - t^.X); |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1534 |
yc:= (Y - t^.Y)*(Y - t^.Y); |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1535 |
if (t^.Kind = Kind) |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1536 |
and ((xc + yc < int2hwFloat(r)) |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1537 |
or ((WorldEdge = weWrap) and |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1538 |
((xc_left + yc < int2hwFloat(r)) or |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1539 |
(xc_right + yc < int2hwFloat(r))))) then |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1540 |
begin |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1541 |
inc(s); |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1542 |
SetLength(GearsNearArray, s); |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1543 |
GearsNearArray[s - 1] := t; |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1544 |
end; |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1545 |
t := t^.NextGear; |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1546 |
end; |
9285 | 1547 |
|
1548 |
GearsNear.size:= s; |
|
1549 |
GearsNear.ar:= @GearsNearArray |
|
1550 |
end; |
|
1551 |
||
1552 |
procedure SpawnBoxOfSmth; |
|
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1553 |
const |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1554 |
// Max. distance between hog and crate for sndThisOneIsMine taunt |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1555 |
ThisOneIsMineDistance : LongInt = 130; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1556 |
var t, aTot, uTot, a, h, d, minD: LongInt; |
9285 | 1557 |
i: TAmmoType; |
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1558 |
gi, closestHog: PGear; |
9285 | 1559 |
begin |
1560 |
if (PlacingHogs) or |
|
1561 |
(cCaseFactor = 0) |
|
13627
605767bbd022
Move max. number of crate spawns into variable
Wuzzy <Wuzzy2@mail.ru>
parents:
13617
diff
changeset
|
1562 |
or (CountGears(gtCase) >= cMaxCaseDrops) |
9285 | 1563 |
or (GetRandom(cCaseFactor) <> 0) then |
1564 |
exit; |
|
1565 |
||
1566 |
FollowGear:= nil; |
|
1567 |
aTot:= 0; |
|
1568 |
uTot:= 0; |
|
1569 |
for i:= Low(TAmmoType) to High(TAmmoType) do |
|
1570 |
if (Ammoz[i].Ammo.Propz and ammoprop_Utility) = 0 then |
|
1571 |
inc(aTot, Ammoz[i].Probability) |
|
1572 |
else |
|
1573 |
inc(uTot, Ammoz[i].Probability); |
|
1574 |
||
1575 |
t:=0; |
|
1576 |
a:=aTot; |
|
1577 |
h:= 1; |
|
1578 |
||
1579 |
if (aTot+uTot) <> 0 then |
|
1580 |
if ((GameFlags and gfInvulnerable) = 0) then |
|
1581 |
begin |
|
1582 |
h:= cHealthCaseProb * 100; |
|
1583 |
t:= GetRandom(10000); |
|
1584 |
a:= (10000-h)*aTot div (aTot+uTot) |
|
1585 |
end |
|
1586 |
else |
|
1587 |
begin |
|
1588 |
t:= GetRandom(aTot+uTot); |
|
1589 |
h:= 0 |
|
1590 |
end; |
|
1591 |
||
1592 |
||
1593 |
if t<h then |
|
1594 |
begin |
|
1595 |
FollowGear:= AddGear(0, 0, gtCase, 0, _0, _0, 0); |
|
1596 |
FollowGear^.Health:= cHealthCaseAmount; |
|
1597 |
FollowGear^.Pos:= posCaseHealth; |
|
10506 | 1598 |
// health crate is smaller than the other crates |
1599 |
FollowGear^.Radius := cCaseHealthRadius; |
|
13642
3d14950641a4
Refactor text color variable names, export 2 color values to Lua
Wuzzy <Wuzzy2@mail.ru>
parents:
13629
diff
changeset
|
1600 |
AddCaption(GetEventString(eidNewHealthPack), capcolDefault, capgrpAmmoInfo); |
9285 | 1601 |
end |
1602 |
else if (t<a+h) then |
|
1603 |
begin |
|
1604 |
t:= aTot; |
|
1605 |
if (t > 0) then |
|
1606 |
begin |
|
1607 |
FollowGear:= AddGear(0, 0, gtCase, 0, _0, _0, 0); |
|
1608 |
t:= GetRandom(t); |
|
1609 |
i:= Low(TAmmoType); |
|
1610 |
FollowGear^.Pos:= posCaseAmmo; |
|
1611 |
FollowGear^.AmmoType:= i; |
|
13642
3d14950641a4
Refactor text color variable names, export 2 color values to Lua
Wuzzy <Wuzzy2@mail.ru>
parents:
13629
diff
changeset
|
1612 |
AddCaption(GetEventString(eidNewAmmoPack), capcolDefault, capgrpAmmoInfo); |
9285 | 1613 |
end |
1614 |
end |
|
1615 |
else |
|
1616 |
begin |
|
1617 |
t:= uTot; |
|
1618 |
if (t > 0) then |
|
1619 |
begin |
|
1620 |
FollowGear:= AddGear(0, 0, gtCase, 0, _0, _0, 0); |
|
1621 |
t:= GetRandom(t); |
|
1622 |
i:= Low(TAmmoType); |
|
1623 |
FollowGear^.Pos:= posCaseUtility; |
|
1624 |
FollowGear^.AmmoType:= i; |
|
13642
3d14950641a4
Refactor text color variable names, export 2 color values to Lua
Wuzzy <Wuzzy2@mail.ru>
parents:
13629
diff
changeset
|
1625 |
AddCaption(GetEventString(eidNewUtilityPack), capcolDefault, capgrpAmmoInfo); |
9285 | 1626 |
end |
1627 |
end; |
|
1628 |
||
1629 |
// handles case of no ammo or utility crates - considered also placing booleans in uAmmos and altering probabilities |
|
1630 |
if (FollowGear <> nil) then |
|
1631 |
begin |
|
1632 |
FindPlace(FollowGear, true, 0, LAND_WIDTH); |
|
1633 |
||
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1634 |
// Taunt |
9285 | 1635 |
if (FollowGear <> nil) then |
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1636 |
begin |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1637 |
// Look for hog closest to the crate (on the X axis) |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1638 |
gi := GearsList; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1639 |
minD := LAND_WIDTH + ThisOneIsMineDistance + 1; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1640 |
closestHog:= nil; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1641 |
while gi <> nil do |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1642 |
begin |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1643 |
if (gi^.Kind = gtHedgehog) then |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1644 |
begin |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1645 |
// Y axis is ignored to simplify calculations |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1646 |
d := hwRound(hwAbs(gi^.X - FollowGear^.X)); |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1647 |
if d < minD then |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1648 |
begin |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1649 |
minD := d; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1650 |
closestHog:= gi; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1651 |
end; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1652 |
end; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1653 |
gi := gi^.NextGear; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1654 |
end; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1655 |
|
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1656 |
// Is closest hog close enough to the crate (on the X axis)? |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1657 |
if (closestHog <> nil) and (closestHog^.Hedgehog <> nil) and (minD <= ThisOneIsMineDistance) then |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1658 |
// If so, there's a chance for a special taunt |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1659 |
if random(3) > 0 then |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1660 |
AddVoice(sndThisOneIsMine, closestHog^.Hedgehog^.Team^.voicepack) |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1661 |
else |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1662 |
AddVoice(sndReinforce, CurrentTeam^.voicepack) |
14035 | 1663 |
else |
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1664 |
// Default crate drop taunt |
14035 | 1665 |
AddVoice(sndReinforce, CurrentTeam^.voicepack); |
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1666 |
end; |
9285 | 1667 |
end |
1668 |
end; |
|
1669 |
||
1670 |
||
1671 |
function GetAmmo(Hedgehog: PHedgehog): TAmmoType; |
|
1672 |
var t, aTot: LongInt; |
|
1673 |
i: TAmmoType; |
|
1674 |
begin |
|
1675 |
Hedgehog:= Hedgehog; // avoid hint |
|
1676 |
||
1677 |
aTot:= 0; |
|
1678 |
for i:= Low(TAmmoType) to High(TAmmoType) do |
|
1679 |
if (Ammoz[i].Ammo.Propz and ammoprop_Utility) = 0 then |
|
1680 |
inc(aTot, Ammoz[i].Probability); |
|
1681 |
||
1682 |
t:= aTot; |
|
1683 |
i:= Low(TAmmoType); |
|
1684 |
if (t > 0) then |
|
1685 |
begin |
|
1686 |
t:= GetRandom(t); |
|
1687 |
while t >= 0 do |
|
1688 |
begin |
|
1689 |
inc(i); |
|
1690 |
if (Ammoz[i].Ammo.Propz and ammoprop_Utility) = 0 then |
|
1691 |
dec(t, Ammoz[i].Probability) |
|
1692 |
end |
|
1693 |
end; |
|
1694 |
GetAmmo:= i |
|
1695 |
end; |
|
1696 |
||
1697 |
function GetUtility(Hedgehog: PHedgehog): TAmmoType; |
|
1698 |
var t, uTot: LongInt; |
|
1699 |
i: TAmmoType; |
|
1700 |
begin |
|
1701 |
||
1702 |
uTot:= 0; |
|
1703 |
for i:= Low(TAmmoType) to High(TAmmoType) do |
|
1704 |
if ((Ammoz[i].Ammo.Propz and ammoprop_Utility) <> 0) |
|
1705 |
and ((Hedgehog^.Team^.HedgehogsNumber > 1) or (Ammoz[i].Ammo.AmmoType <> amSwitch)) then |
|
1706 |
inc(uTot, Ammoz[i].Probability); |
|
1707 |
||
1708 |
t:= uTot; |
|
1709 |
i:= Low(TAmmoType); |
|
1710 |
if (t > 0) then |
|
1711 |
begin |
|
1712 |
t:= GetRandom(t); |
|
1713 |
while t >= 0 do |
|
1714 |
begin |
|
1715 |
inc(i); |
|
1716 |
if ((Ammoz[i].Ammo.Propz and ammoprop_Utility) <> 0) and ((Hedgehog^.Team^.HedgehogsNumber > 1) |
|
1717 |
or (Ammoz[i].Ammo.AmmoType <> amSwitch)) then |
|
1718 |
dec(t, Ammoz[i].Probability) |
|
1719 |
end |
|
1720 |
end; |
|
1721 |
GetUtility:= i |
|
1722 |
end; |
|
1723 |
||
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1724 |
(* |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1725 |
Intended to check Gear X/Y against the map left/right edges and apply one of the world modes |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1726 |
* Normal - infinite world, do nothing |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1727 |
* Wrap (entering left edge exits at same height on right edge) |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1728 |
* Bounce (striking edge is treated as a 100% elasticity bounce) |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1729 |
* From the depths (same as from sky, but from sea, with submersible flag set) |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1730 |
|
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1731 |
Trying to make the checks a little broader than on first pass to catch things that don't move normally. |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1732 |
*) |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1733 |
function WorldWrap(var Gear: PGear): boolean; |
10354 | 1734 |
//var tdx: hwFloat; |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1735 |
begin |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1736 |
WorldWrap:= false; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1737 |
if WorldEdge = weNone then exit(false); |
10160 | 1738 |
if (hwRound(Gear^.X) < LongInt(leftX)) or |
1739 |
(hwRound(Gear^.X) > LongInt(rightX)) then |
|
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1740 |
begin |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1741 |
if WorldEdge = weWrap then |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1742 |
begin |
10160 | 1743 |
if (hwRound(Gear^.X) < LongInt(leftX)) then |
1744 |
Gear^.X:= Gear^.X + int2hwfloat(rightX - leftX) |
|
1745 |
else Gear^.X:= Gear^.X - int2hwfloat(rightX - leftX); |
|
9557 | 1746 |
LeftImpactTimer:= 150; |
1747 |
RightImpactTimer:= 150 |
|
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1748 |
end |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1749 |
else if WorldEdge = weBounce then |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1750 |
begin |
9809 | 1751 |
if (hwRound(Gear^.X) - Gear^.Radius < LongInt(leftX)) then |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1752 |
begin |
9557 | 1753 |
LeftImpactTimer:= 333; |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1754 |
Gear^.dX.isNegative:= false; |
9809 | 1755 |
Gear^.X:= int2hwfloat(LongInt(leftX) + Gear^.Radius) |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1756 |
end |
10015 | 1757 |
else |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1758 |
begin |
9557 | 1759 |
RightImpactTimer:= 333; |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1760 |
Gear^.dX.isNegative:= true; |
9485
3dee8a3b0406
add shotgun wrap, revert 100px offset. Problematic w/ things that rely on Land.
nemo
parents:
9479
diff
changeset
|
1761 |
Gear^.X:= int2hwfloat(rightX-Gear^.Radius) |
9557 | 1762 |
end; |
9561 | 1763 |
if (Gear^.Radius > 2) and (Gear^.dX.QWordValue > _0_001.QWordValue) then |
10508 | 1764 |
AddBounceEffectForGear(Gear); |
10354 | 1765 |
end{ |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1766 |
else if WorldEdge = weSea then |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1767 |
begin |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1768 |
if (hwRound(Gear^.Y) > cWaterLine) and (Gear^.State and gstSubmersible <> 0) then |
9521
8054d9d775fd
merge with latest defaul, fixing compiling with fpc, parsing and rendering with pas2c, some minor problems with compiling with clang
koda
diff
changeset
|
1769 |
Gear^.State:= Gear^.State and (not gstSubmersible) |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1770 |
else |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1771 |
begin |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1772 |
Gear^.State:= Gear^.State or gstSubmersible; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1773 |
Gear^.X:= int2hwFloat(PlayWidth)*int2hwFloat(min(max(0,hwRound(Gear^.Y)),PlayHeight))/PlayHeight; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1774 |
Gear^.Y:= int2hwFloat(cWaterLine+cVisibleWater+Gear^.Radius*2); |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1775 |
tdx:= Gear^.dX; |
9522 | 1776 |
Gear^.dX:= -Gear^.dY; |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1777 |
Gear^.dY:= tdx; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1778 |
Gear^.dY.isNegative:= true |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1779 |
end |
10354 | 1780 |
end}; |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1781 |
(* |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1782 |
* Window in the sky (Gear moved high into the sky, Y is used to determine X) [unfortunately, not a safe thing to do. shame, I thought aerial bombardment would be kinda neat |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1783 |
This one would be really easy to freeze game unless it was flagged unfortunately. |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1784 |
|
10015 | 1785 |
else |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1786 |
begin |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1787 |
Gear^.X:= int2hwFloat(PlayWidth)*int2hwFloat(min(max(0,hwRound(Gear^.Y)),PlayHeight))/PlayHeight; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1788 |
Gear^.Y:= -_2048-_256-_256; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1789 |
tdx:= Gear^.dX; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1790 |
Gear^.dX:= Gear^.dY; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1791 |
Gear^.dY:= tdx; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1792 |
Gear^.dY.isNegative:= false |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1793 |
end |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1794 |
*) |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1795 |
WorldWrap:= true |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1796 |
end; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1797 |
end; |
9285 | 1798 |
|
13609
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1799 |
|
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1800 |
// Add an audiovisual bounce effect for gear after it bounced from bouncy material. |
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1801 |
// Graphical effect is based on speed. |
10508 | 1802 |
procedure AddBounceEffectForGear(Gear: PGear); |
13609
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1803 |
begin |
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1804 |
AddBounceEffectForGear(Gear, hwFloat2Float(Gear^.Density * hwAbs(Gear^.dY) + hwAbs(Gear^.dX)) / 1.5); |
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1805 |
end; |
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1806 |
|
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1807 |
// Same as above, but can specify the size of bounce image with imageScale manually. |
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1808 |
procedure AddBounceEffectForGear(Gear: PGear; imageScale: Single); |
10508 | 1809 |
var boing: PVisualGear; |
1810 |
begin |
|
13572
a71e6856ffab
Fix freeze ray not working through wrap world edge; add DrawLineWrapped
Wuzzy <Wuzzy2@mail.ru>
parents:
13568
diff
changeset
|
1811 |
if Gear^.Density < _0_01 then |
a71e6856ffab
Fix freeze ray not working through wrap world edge; add DrawLineWrapped
Wuzzy <Wuzzy2@mail.ru>
parents:
13568
diff
changeset
|
1812 |
exit; |
10508 | 1813 |
boing:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot, 0, false, 1); |
1814 |
if boing <> nil then |
|
1815 |
with boing^ do |
|
1816 |
begin |
|
1817 |
Angle:= random(360); |
|
1818 |
dx:= 0; |
|
1819 |
dy:= 0; |
|
1820 |
FrameTicks:= 200; |
|
13609
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1821 |
Scale:= imageScale; |
10508 | 1822 |
State:= ord(sprBoing) |
1823 |
end; |
|
13872
f01798038c2e
Rename amDuck and related symbols to amCreeper, gtCreeper, etc.
Wuzzy <Wuzzy2@mail.ru>
parents:
13807
diff
changeset
|
1824 |
PlaySound(sndMelonImpact, true) |
10508 | 1825 |
end; |
1826 |
||
11847 | 1827 |
function IsHogLocal(HH: PHedgehog): boolean; |
1828 |
begin |
|
11848
6a0d6b00dac8
Highlander: give visual and acustic feedback when weapons are collected from a kill, similar to collecting a crate
sheepluva
parents:
11847
diff
changeset
|
1829 |
IsHogLocal:= (not (HH^.Team^.ExtDriven or (HH^.BotLevel > 0))) or (HH^.Team^.Clan^.ClanIndex = LocalClan) or (GameType = gmtDemo); |
11847 | 1830 |
end; |
1831 |
||
6581 | 1832 |
end. |