author | unC0Rr |
Fri, 19 Jan 2024 13:07:22 +0100 | |
branch | transitional_engine |
changeset 16038 | 7544a7d7c819 |
parent 16004 | 2146cb7be36f |
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 |
|
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
25 |
procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword); |
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 |
|
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
42 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); |
6986
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); |
15763
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
44 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity, deleteOnFail: boolean); |
15986
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
45 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right, Bottom: LongInt; skipProximity, deleteOnFail: boolean); |
15731 | 46 |
function CountLand(x, y, r, c: LongInt; mask, antimask: LongWord): LongInt; |
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
47 |
|
13399 | 48 |
function CheckGearNear(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt): PGear; |
6581 | 49 |
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
|
50 |
function CheckGearDrowning(var Gear: PGear): boolean; |
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
51 |
procedure CheckCollision(Gear: PGear); |
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
52 |
procedure CheckCollisionWithLand(Gear: PGear); |
6581 | 53 |
|
9285 | 54 |
procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt); |
14027
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
55 |
procedure AmmoShoveCache(Ammo: PGear; Damage, Power: LongInt); |
12898 | 56 |
procedure AmmoShoveLine(Ammo: PGear; Damage, Power: LongInt; oX, oY, tX, tY: hwFloat); |
9285 | 57 |
function GearsNear(X, Y: hwFloat; Kind: TGearType; r: LongInt): PGearArrayS; |
14789
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
58 |
function SpawnBoxOfSmth: PGear; |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
59 |
procedure PlayBoxSpawnTaunt(Gear: PGear); |
9285 | 60 |
procedure ShotgunShot(Gear: PGear); |
15762
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
61 |
function CountHogsInTeam(HHGear: PGear; countHidden: boolean): LongInt; |
12712
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
62 |
function CanUseTardis(HHGear: PGear): boolean; |
9285 | 63 |
|
64 |
procedure SetAllToActive; |
|
65 |
procedure SetAllHHToActive(Ice: boolean); |
|
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
66 |
procedure SetAllHHToActive(); |
9285 | 67 |
|
68 |
function GetAmmo(Hedgehog: PHedgehog): TAmmoType; |
|
69 |
function GetUtility(Hedgehog: PHedgehog): TAmmoType; |
|
70 |
||
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
71 |
function WorldWrap(var Gear: PGear): boolean; |
14535
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
72 |
function HomingWrap(var Gear: PGear): boolean; |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
73 |
|
15015
d9de740e194c
Add utility function to get hog left/right looking dir
Wuzzy <Wuzzy2@mail.ru>
parents:
14947
diff
changeset
|
74 |
function IsHogFacingLeft(Gear: PGear): boolean; |
11847 | 75 |
function IsHogLocal(HH: PHedgehog): boolean; |
9285 | 76 |
|
77 |
||
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
78 |
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
|
79 |
|
6581 | 80 |
var doStepHandlers: array[TGearType] of TGearStepProcedure; |
81 |
||
82 |
implementation |
|
9285 | 83 |
uses uSound, uCollisions, uUtils, uConsts, uVisualGears, uAIMisc, |
6581 | 84 |
uVariables, uLandGraphics, uScript, uStats, uCaptions, uTeams, uStore, |
10015 | 85 |
uLocale, uTextures, uRenderUtils, uRandom, SDLh, uDebug, |
9285 | 86 |
uGearsList, Math, uVisualGearsList, uGearsHandlersMess, |
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
87 |
uGearsHedgehog, uLandUtils; |
6581 | 88 |
|
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
89 |
procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword); |
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
90 |
begin |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
91 |
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
|
92 |
end; |
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
93 |
|
6581 | 94 |
procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword; const Tint: LongWord); |
95 |
var Gear: PGear; |
|
6769
44ad49a3a126
Add drowning to grenade too, try some little optimisations
nemo
parents:
6765
diff
changeset
|
96 |
dmg, dmgBase: LongInt; |
6765 | 97 |
fX, fY, tdX, tdY: hwFloat; |
6581 | 98 |
vg: PVisualGear; |
99 |
i, cnt: LongInt; |
|
10653 | 100 |
wrap: boolean; |
10827 | 101 |
bubble: PVisualGear; |
12169
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
102 |
s: ansistring; |
6581 | 103 |
begin |
104 |
if Radius > 4 then AddFileLog('Explosion: at (' + inttostr(x) + ',' + inttostr(y) + ')'); |
|
105 |
if Radius > 25 then KickFlakes(Radius, X, Y); |
|
106 |
||
107 |
if ((Mask and EXPLNoGfx) = 0) then |
|
108 |
begin |
|
109 |
vg:= nil; |
|
10827 | 110 |
if CheckCoordInWater(X, Y - Radius) then |
111 |
begin |
|
112 |
cnt:= 2 * Radius; |
|
113 |
for i:= (Radius * Radius) div 4 downto 0 do |
|
114 |
begin |
|
115 |
bubble := AddVisualGear(X - Radius + random(cnt), Y - Radius + random(cnt), vgtBubble); |
|
116 |
if bubble <> nil then |
|
117 |
bubble^.dY:= 0.1 + random(20)/10; |
|
118 |
end |
|
119 |
end |
|
120 |
else if Radius > 50 then vg:= AddVisualGear(X, Y, vgtBigExplosion) |
|
6581 | 121 |
else if Radius > 10 then vg:= AddVisualGear(X, Y, vgtExplosion); |
122 |
if vg <> nil then |
|
123 |
vg^.Tint:= Tint; |
|
124 |
end; |
|
125 |
if (Mask and EXPLAutoSound) <> 0 then PlaySound(sndExplosion); |
|
126 |
||
6765 | 127 |
dmgBase:= Radius shl 1 + cHHRadius div 2; |
10653 | 128 |
|
129 |
// we might have to run twice if weWrap is enabled |
|
130 |
wrap:= false; |
|
10659 | 131 |
repeat |
10653 | 132 |
|
10654 | 133 |
fX:= int2hwFloat(X); |
134 |
fY:= int2hwFloat(Y); |
|
135 |
Gear:= GearsList; |
|
136 |
||
6581 | 137 |
while Gear <> nil do |
138 |
begin |
|
139 |
dmg:= 0; |
|
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 |
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
|
150 |
gtAirMine, |
6581 | 151 |
gtCase, |
152 |
gtTarget, |
|
153 |
gtFlame, |
|
7754 | 154 |
gtKnife, |
15732 | 155 |
gtExplosives, |
156 |
gtSentry: begin |
|
6581 | 157 |
// Run the calcs only once we know we have a type that will need damage |
6765 | 158 |
tdX:= Gear^.X-fX; |
159 |
tdY:= Gear^.Y-fY; |
|
7721 | 160 |
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
|
161 |
dmg:= dmgBase - hwRound(Distance(tdX, tdY)); |
6581 | 162 |
if dmg > 1 then |
163 |
begin |
|
164 |
dmg:= ModifyDamage(min(dmg div 2, Radius), Gear); |
|
165 |
//AddFileLog('Damage: ' + inttostr(dmg)); |
|
166 |
if (Mask and EXPLNoDamage) = 0 then |
|
167 |
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
|
168 |
if (Gear^.Kind <> gtHedgehog) or (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) then |
6581 | 169 |
ApplyDamage(Gear, AttackingHog, dmg, dsExplosion) |
170 |
else |
|
171 |
Gear^.State:= Gear^.State or gstWinner; |
|
172 |
end; |
|
173 |
if ((Mask and EXPLDoNotTouchAny) = 0) and (((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog)) then |
|
174 |
begin |
|
175 |
DeleteCI(Gear); |
|
6765 | 176 |
Gear^.dX:= Gear^.dX + SignAs(_0_005 * dmg + cHHKick, tdX)/(Gear^.Density/_3); |
177 |
Gear^.dY:= Gear^.dY + SignAs(_0_005 * dmg + cHHKick, tdY)/(Gear^.Density/_3); |
|
6581 | 178 |
|
179 |
Gear^.State:= (Gear^.State or gstMoving) and (not gstLoser); |
|
7767 | 180 |
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
|
181 |
if (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) then |
14947
60340c8a6fae
Don't remove gstWinner after GameOver
Wuzzy <Wuzzy2@mail.ru>
parents:
14789
diff
changeset
|
182 |
begin |
60340c8a6fae
Don't remove gstWinner after GameOver
Wuzzy <Wuzzy2@mail.ru>
parents:
14789
diff
changeset
|
183 |
Gear^.State:= (Gear^.State or gstMoving) and (not (gstHHJumping or gstHHHJump)); |
60340c8a6fae
Don't remove gstWinner after GameOver
Wuzzy <Wuzzy2@mail.ru>
parents:
14789
diff
changeset
|
184 |
if (not GameOver) then |
60340c8a6fae
Don't remove gstWinner after GameOver
Wuzzy <Wuzzy2@mail.ru>
parents:
14789
diff
changeset
|
185 |
Gear^.State:= (Gear^.State and (not gstWinner)); |
60340c8a6fae
Don't remove gstWinner after GameOver
Wuzzy <Wuzzy2@mail.ru>
parents:
14789
diff
changeset
|
186 |
end; |
15869 | 187 |
if Gear^.Kind = gtSentry then |
188 |
Gear^.State:= Gear^.State and (not gstHHJumping); |
|
6581 | 189 |
Gear^.Active:= true; |
14224 | 190 |
if Gear^.Kind <> gtFlame then FollowGear:= Gear; |
191 |
if Gear^.Kind = gtAirMine then |
|
192 |
begin |
|
193 |
Gear^.Tag:= 1; |
|
194 |
Gear^.FlightTime:= 5000; |
|
195 |
end |
|
6581 | 196 |
end; |
11867 | 197 |
if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and |
198 |
(Gear^.Hedgehog^.Effects[heInvulnerable] = 0) and (Gear^.Hedgehog^.Effects[heFrozen] = 0) and |
|
199 |
(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
|
200 |
begin |
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
201 |
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
|
202 |
begin |
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
203 |
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
|
204 |
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
|
205 |
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
|
206 |
end; |
869cf5f34700
More ticker messages: Sick, king died, resurrect, time box return, timeout, kamikaze
Wuzzy <almikes@aol.com>
parents:
12150
diff
changeset
|
207 |
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
|
208 |
end |
6581 | 209 |
end; |
210 |
||
211 |
end; |
|
9814 | 212 |
gtGrave: if Mask and EXPLDoNotTouchAny = 0 then |
6581 | 213 |
// Run the calcs only once we know we have a type that will need damage |
214 |
begin |
|
9814 | 215 |
tdX:= Gear^.X-fX; |
216 |
tdY:= Gear^.Y-fY; |
|
217 |
if LongInt(tdX.Round + tdY.Round + 2) < dmgBase then |
|
218 |
dmg:= dmgBase - hwRound(Distance(tdX, tdY)); |
|
219 |
if dmg > 1 then |
|
220 |
begin |
|
221 |
dmg:= ModifyDamage(min(dmg div 2, Radius), Gear); |
|
222 |
Gear^.dY:= - _0_004 * dmg; |
|
223 |
Gear^.Active:= true |
|
224 |
end |
|
225 |
end; |
|
6581 | 226 |
end; |
227 |
end; |
|
228 |
Gear:= Gear^.NextGear |
|
229 |
end; |
|
230 |
||
231 |
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
|
232 |
if ((GameFlags and gfSolidLand) = 0) or ((Mask and EXPLForceDraw) <> 0) then |
6581 | 233 |
begin |
234 |
cnt:= DrawExplosion(X, Y, Radius) div 1608; // approx 2 16x16 circles to erase per chunk |
|
235 |
if (cnt > 0) and (SpritesData[sprChunk].Texture <> nil) then |
|
236 |
for i:= 0 to cnt do |
|
237 |
AddVisualGear(X, Y, vgtChunk) |
|
238 |
end; |
|
239 |
||
10653 | 240 |
if (WorldEdge = weWrap) then |
241 |
begin |
|
242 |
// already wrapped? let's not wrap again! |
|
243 |
if wrap then |
|
244 |
break; |
|
245 |
||
246 |
// Radius + 5 because that's the actual radius the explosion changes graphically |
|
14303
6015b74eea55
overall, using LongInt for leftX/rightX results in fewer casts, since most comparisons are against ints.
nemo
parents:
14224
diff
changeset
|
247 |
if X + (Radius + 5) > rightX then |
10653 | 248 |
begin |
249 |
dec(X, playWidth); |
|
250 |
wrap:= true; |
|
251 |
end |
|
14303
6015b74eea55
overall, using LongInt for leftX/rightX results in fewer casts, since most comparisons are against ints.
nemo
parents:
14224
diff
changeset
|
252 |
else if X - (Radius + 5) < leftX then |
10653 | 253 |
begin |
254 |
inc(X, playWidth); |
|
255 |
wrap:= true; |
|
256 |
end; |
|
257 |
end; |
|
258 |
||
259 |
until (not wrap); |
|
260 |
||
6581 | 261 |
uAIMisc.AwareOfExplosion(0, 0, 0) |
262 |
end; |
|
263 |
||
264 |
function ModifyDamage(dmg: Longword; Gear: PGear): Longword; |
|
265 |
var i: hwFloat; |
|
266 |
begin |
|
267 |
(* Invulnerability cannot be placed in here due to still needing kicks |
|
268 |
Not without a new damage machine. |
|
269 |
King check should be in here instead of ApplyDamage since Tiy wants them kicked less |
|
270 |
*) |
|
271 |
i:= _1; |
|
272 |
if (CurrentHedgehog <> nil) and CurrentHedgehog^.King then |
|
273 |
i:= _1_5; |
|
10015 | 274 |
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
|
275 |
(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
|
276 |
ModifyDamage:= hwRound(cDamageModifier * dmg * i * cDamagePercent * _0_5 * _0_01) |
9149 | 277 |
else |
10526
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
278 |
ModifyDamage:= hwRound(cDamageModifier * dmg * i * cDamagePercent * _0_01); |
6581 | 279 |
end; |
280 |
||
281 |
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
|
282 |
var vampDmg, tmpDmg, i: Longword; |
6581 | 283 |
vg: PVisualGear; |
284 |
begin |
|
285 |
if Damage = 0 then |
|
286 |
exit; // nothing to apply |
|
287 |
||
288 |
if (Gear^.Kind = gtHedgehog) then |
|
289 |
begin |
|
290 |
Gear^.LastDamage := AttackerHog; |
|
291 |
||
292 |
Gear^.Hedgehog^.Team^.Clan^.Flawless:= false; |
|
15216
7d41e7889123
Explode hog instantly when taking damage while dying
Wuzzy <Wuzzy2@mail.ru>
parents:
15202
diff
changeset
|
293 |
|
15301
b12f63054c94
No longer explode dying hogs that take damage
Wuzzy <Wuzzy2@mail.ru>
parents:
15248
diff
changeset
|
294 |
if (Gear^.State and gstHHDeath) = 0 then |
15216
7d41e7889123
Explode hog instantly when taking damage while dying
Wuzzy <Wuzzy2@mail.ru>
parents:
15202
diff
changeset
|
295 |
begin |
7d41e7889123
Explode hog instantly when taking damage while dying
Wuzzy <Wuzzy2@mail.ru>
parents:
15202
diff
changeset
|
296 |
HHHurt(Gear^.Hedgehog, Source, Damage); |
7d41e7889123
Explode hog instantly when taking damage while dying
Wuzzy <Wuzzy2@mail.ru>
parents:
15202
diff
changeset
|
297 |
AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), Damage, Gear^.Hedgehog^.Team^.Clan^.Color); |
7d41e7889123
Explode hog instantly when taking damage while dying
Wuzzy <Wuzzy2@mail.ru>
parents:
15202
diff
changeset
|
298 |
end; |
7d41e7889123
Explode hog instantly when taking damage while dying
Wuzzy <Wuzzy2@mail.ru>
parents:
15202
diff
changeset
|
299 |
|
6581 | 300 |
tmpDmg:= min(Damage, max(0,Gear^.Health-Gear^.Damage)); |
301 |
if (Gear <> CurrentHedgehog^.Gear) and (CurrentHedgehog^.Gear <> nil) and (tmpDmg >= 1) then |
|
302 |
begin |
|
303 |
if cVampiric then |
|
304 |
begin |
|
305 |
vampDmg:= hwRound(int2hwFloat(tmpDmg)*_0_8); |
|
306 |
if vampDmg >= 1 then |
|
307 |
begin |
|
308 |
// was considering pulsing on attack, Tiy thinks it should be permanent while in play |
|
309 |
//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
|
310 |
vampDmg:= IncHogHealth(CurrentHedgehog, vampDmg); |
6581 | 311 |
RenderHealth(CurrentHedgehog^); |
312 |
RecountTeamHealth(CurrentHedgehog^.Team); |
|
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
313 |
HHHeal(CurrentHedgehog, vampDmg, true, $FF0000FF); |
6581 | 314 |
end |
315 |
end; |
|
12289
c20fbf96b853
Fix hedgehog self-damage not counted, and there were never Stupid taunts/announces
Wuzzy <almikes@aol.com>
parents:
12209
diff
changeset
|
316 |
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
|
317 |
(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
|
318 |
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
|
319 |
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
|
320 |
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
|
321 |
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
|
322 |
end; |
6581 | 323 |
end; |
12289
c20fbf96b853
Fix hedgehog self-damage not counted, and there were never Stupid taunts/announces
Wuzzy <almikes@aol.com>
parents:
12209
diff
changeset
|
324 |
|
8330 | 325 |
uStats.HedgehogDamaged(Gear, AttackerHog, Damage, false); |
10526
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
326 |
|
15846 | 327 |
if AprilOne and (Gear^.Hedgehog^.Hat = 'fr_tomato') and (Damage > 2) then |
328 |
for i := 0 to random(min(Damage,20))+5 do |
|
15202 | 329 |
begin |
15846 | 330 |
vg:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot); |
331 |
if vg <> nil then |
|
332 |
with vg^ do |
|
333 |
begin |
|
334 |
dx:= 0.001 * (random(100)+10); |
|
335 |
dy:= 0.001 * (random(100)+10); |
|
336 |
tdy:= -cGravityf; |
|
337 |
if random(2) = 0 then |
|
338 |
dx := -dx; |
|
339 |
FrameTicks:= random(500) + 1000; |
|
340 |
State:= ord(sprBubbles); |
|
341 |
Tint:= $ff0000ff |
|
342 |
end |
|
15202 | 343 |
end |
15846 | 344 |
end else if AttackerHog <> nil then |
345 |
Gear^.Hedgehog:= AttackerHog; |
|
6581 | 346 |
inc(Gear^.Damage, Damage); |
8330 | 347 |
|
6581 | 348 |
ScriptCall('onGearDamage', Gear^.UID, Damage); |
349 |
end; |
|
350 |
||
351 |
procedure spawnHealthTagForHH(HHGear: PGear; dmg: Longword); |
|
352 |
var tag: PVisualGear; |
|
353 |
begin |
|
354 |
tag:= AddVisualGear(hwRound(HHGear^.X), hwRound(HHGear^.Y), vgtHealthTag, dmg); |
|
355 |
if (tag <> nil) then |
|
356 |
tag^.Hedgehog:= HHGear^.Hedgehog; // the tag needs the tag to determine the text color |
|
357 |
AllInactive:= false; |
|
358 |
HHGear^.Active:= true; |
|
359 |
end; |
|
8330 | 360 |
|
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
361 |
// 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
|
362 |
procedure HHHurt(Hedgehog: PHedgehog; Source: TDamageSource; Damage: Longword); |
6581 | 363 |
begin |
9071 | 364 |
if Hedgehog^.Effects[heFrozen] <> 0 then exit; |
10526
b43d175d1577
Avoid promoting violence to hedgehogs. At least once a year.
nemo
parents:
10512
diff
changeset
|
365 |
|
14062
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
366 |
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
|
367 |
begin |
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
368 |
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
|
369 |
// 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
|
370 |
OuchTauntTimer:= 1250; |
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
371 |
end |
44f20c9e6861
Add Ouch taunt for particulary damaging hits (fall, bullet, shove, hammer)
Wuzzy <Wuzzy2@mail.ru>
parents:
14061
diff
changeset
|
372 |
else if (Source = dsFall) or (Source = dsExplosion) then |
6581 | 373 |
case random(3) of |
7053 | 374 |
0: PlaySoundV(sndOoff1, Hedgehog^.Team^.voicepack); |
375 |
1: PlaySoundV(sndOoff2, Hedgehog^.Team^.voicepack); |
|
376 |
2: PlaySoundV(sndOoff3, Hedgehog^.Team^.voicepack); |
|
6581 | 377 |
end |
378 |
else if (Source = dsPoison) then |
|
379 |
case random(2) of |
|
7053 | 380 |
0: PlaySoundV(sndPoisonCough, Hedgehog^.Team^.voicepack); |
381 |
1: PlaySoundV(sndPoisonMoan, Hedgehog^.Team^.voicepack); |
|
6581 | 382 |
end |
383 |
else |
|
384 |
case random(4) of |
|
7053 | 385 |
0: PlaySoundV(sndOw1, Hedgehog^.Team^.voicepack); |
386 |
1: PlaySoundV(sndOw2, Hedgehog^.Team^.voicepack); |
|
387 |
2: PlaySoundV(sndOw3, Hedgehog^.Team^.voicepack); |
|
388 |
3: PlaySoundV(sndOw4, Hedgehog^.Team^.voicepack); |
|
6581 | 389 |
end |
390 |
end; |
|
391 |
||
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
392 |
{- |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
393 |
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
|
394 |
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
|
395 |
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
|
396 |
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
|
397 |
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
|
398 |
-} |
13617
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
399 |
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
|
400 |
var i: LongInt; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
401 |
vg: PVisualGear; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
402 |
s: ansistring; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
403 |
begin |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
404 |
if healthBoost < 1 then |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
405 |
exit; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
406 |
|
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
407 |
if showMessage then |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
408 |
begin |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
409 |
s:= IntToStr(healthBoost); |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
410 |
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
|
411 |
end; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
412 |
|
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
413 |
i:= 0; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
414 |
// 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
|
415 |
if (vgTint <> 0) then |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
416 |
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
|
417 |
begin |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
418 |
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
|
419 |
if vg <> nil then |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
420 |
with vg^ do |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
421 |
begin |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
422 |
Tint:= vgTint; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
423 |
State:= ord(sprHealth) |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
424 |
end; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
425 |
inc(i, 5) |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
426 |
end; |
12937
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
427 |
end; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
428 |
|
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
429 |
// 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
|
430 |
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
|
431 |
begin |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
432 |
HHHeal(Hedgehog, healthBoost, showMessage, $00FF00FF); |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
433 |
end; |
a84a05719454
Refactor health gain effects and message into util fuction HHHeal
Wuzzy <Wuzzy2@mail.ru>
parents:
12920
diff
changeset
|
434 |
|
13617
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
435 |
// 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
|
436 |
// 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
|
437 |
// Returns actual amount healed. |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
438 |
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
|
439 |
var oldHealth: LongInt; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
440 |
begin |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
441 |
if healthBoost < 1 then |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
442 |
begin |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
443 |
IncHogHealth:= 0; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
444 |
exit; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
445 |
end; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
446 |
oldHealth:= Hedgehog^.Gear^.Health; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
447 |
inc(Hedgehog^.Gear^.Health, healthBoost); |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
448 |
// Prevent overflow |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
449 |
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
|
450 |
Hedgehog^.Gear^.Health:= cMaxHogHealth; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
451 |
IncHogHealth:= Hedgehog^.Gear^.Health - oldHealth; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
452 |
end; |
a6abc2c1fc1a
Show correct health increase when hog health cap is reached
Wuzzy <Wuzzy2@mail.ru>
parents:
13609
diff
changeset
|
453 |
|
6581 | 454 |
procedure CheckHHDamage(Gear: PGear); |
10015 | 455 |
var |
9809 | 456 |
dmg: LongInt; |
8003 | 457 |
i: LongWord; |
6581 | 458 |
particle: PVisualGear; |
459 |
begin |
|
9071 | 460 |
if _0_4 < Gear^.dY then |
461 |
begin |
|
462 |
dmg := ModifyDamage(1 + hwRound((Gear^.dY - _0_4) * 70), Gear); |
|
463 |
if Gear^.Hedgehog^.Effects[heFrozen] = 0 then |
|
464 |
PlaySound(sndBump) |
|
465 |
else PlaySound(sndFrozenHogImpact); |
|
466 |
if dmg < 1 then |
|
467 |
exit; |
|
6581 | 468 |
|
9809 | 469 |
for i:= min(12, 3 + dmg div 10) downto 0 do |
9071 | 470 |
begin |
471 |
particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust); |
|
472 |
if particle <> nil then |
|
473 |
particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480); |
|
474 |
end; |
|
6581 | 475 |
|
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
|
476 |
if ((Gear^.Hedgehog^.Effects[heInvulnerable] <> 0)) then |
9071 | 477 |
exit; |
6581 | 478 |
|
9071 | 479 |
if Gear^.LastDamage <> nil then |
480 |
ApplyDamage(Gear, Gear^.LastDamage, dmg, dsFall) |
|
481 |
else |
|
482 |
ApplyDamage(Gear, CurrentHedgehog, dmg, dsFall); |
|
6581 | 483 |
end |
484 |
end; |
|
485 |
||
486 |
||
487 |
procedure CalcRotationDirAngle(Gear: PGear); |
|
8330 | 488 |
var |
6581 | 489 |
dAngle: real; |
490 |
begin |
|
7825 | 491 |
// Frac/Round to be kind to JS as of 2012-08-27 where there is yet no int64/uint64 |
492 |
dAngle := (Gear^.dX.Round + Gear^.dY.Round) / 2 + (Gear^.dX.Frac/$100000000+Gear^.dY.Frac/$100000000); |
|
6581 | 493 |
if not Gear^.dX.isNegative then |
494 |
Gear^.DirAngle := Gear^.DirAngle + dAngle |
|
495 |
else |
|
496 |
Gear^.DirAngle := Gear^.DirAngle - dAngle; |
|
497 |
||
498 |
if Gear^.DirAngle < 0 then |
|
499 |
Gear^.DirAngle := Gear^.DirAngle + 360 |
|
500 |
else if 360 < Gear^.DirAngle then |
|
501 |
Gear^.DirAngle := Gear^.DirAngle - 360 |
|
502 |
end; |
|
503 |
||
10363 | 504 |
procedure AddSplashForGear(Gear: PGear; justSkipping: boolean); |
505 |
var x, y, i, distL, distR, distB, minDist, maxDrops: LongInt; |
|
506 |
splash, particle: PVisualGear; |
|
507 |
speed, hwTmp: hwFloat; |
|
508 |
vi, vs, tmp: real; // impact speed and sideways speed |
|
509 |
isImpactH, isImpactRight: boolean; |
|
10419 | 510 |
const dist2surf = 4; |
10363 | 511 |
begin |
512 |
x:= hwRound(Gear^.X); |
|
513 |
y:= hwRound(Gear^.Y); |
|
514 |
||
10419 | 515 |
// find position for splash and impact speed |
10363 | 516 |
|
517 |
distB:= cWaterline - y; |
|
518 |
||
519 |
if WorldEdge <> weSea then |
|
520 |
minDist:= distB |
|
521 |
else |
|
522 |
begin |
|
523 |
distL:= x - leftX; |
|
524 |
distR:= rightX - x; |
|
525 |
minDist:= min(distB, min(distL, distR)); |
|
526 |
end; |
|
527 |
||
528 |
isImpactH:= (minDist <> distB); |
|
529 |
||
530 |
if not isImpactH then |
|
531 |
begin |
|
10417 | 532 |
y:= cWaterline - dist2surf; |
10363 | 533 |
speed:= hwAbs(Gear^.dY); |
534 |
end |
|
535 |
else |
|
536 |
begin |
|
537 |
isImpactRight := minDist = distR; |
|
538 |
if isImpactRight then |
|
10419 | 539 |
x:= rightX - dist2surf |
10363 | 540 |
else |
10419 | 541 |
x:= leftX + dist2surf; |
10363 | 542 |
speed:= hwAbs(Gear^.dX); |
543 |
end; |
|
544 |
||
545 |
// splash sound |
|
546 |
||
547 |
if justSkipping then |
|
548 |
PlaySound(sndSkip) |
|
549 |
else |
|
550 |
begin |
|
551 |
// adjust water impact sound based on gear speed and density |
|
552 |
hwTmp:= hwAbs(Gear^.Density * speed); |
|
553 |
||
554 |
if hwTmp > _1 then |
|
555 |
PlaySound(sndSplash) |
|
556 |
else if hwTmp > _0_5 then |
|
557 |
PlaySound(sndSkip) |
|
12150 | 558 |
else if hwTmp > _0_0002 then // arbitrary sanity cutoff. mostly for airmines |
10363 | 559 |
PlaySound(sndDroplet2); |
560 |
end; |
|
561 |
||
10419 | 562 |
|
563 |
// splash visuals |
|
564 |
||
565 |
if ((cReducedQuality and rqPlainSplash) <> 0) then |
|
566 |
exit; |
|
567 |
||
568 |
splash:= AddVisualGear(x, y, vgtSplash); |
|
569 |
if splash = nil then |
|
570 |
exit; |
|
571 |
||
572 |
if not isImpactH then |
|
573 |
vs:= abs(hwFloat2Float(Gear^.dX)) |
|
574 |
else |
|
575 |
begin |
|
576 |
if isImpactRight then |
|
577 |
splash^.Angle:= -90 |
|
578 |
else |
|
579 |
splash^.Angle:= 90; |
|
580 |
vs:= abs(hwFloat2Float(Gear^.dY)); |
|
581 |
end; |
|
582 |
||
583 |
||
584 |
vi:= hwFloat2Float(speed); |
|
585 |
||
10363 | 586 |
with splash^ do |
587 |
begin |
|
588 |
Scale:= abs(hwFloat2Float(Gear^.Density / _3 * speed)); |
|
589 |
if Scale > 1 then Scale:= power(Scale,0.3333) |
|
590 |
else Scale:= Scale + ((1-Scale) / 2); |
|
591 |
if Scale > 1 then Timer:= round(min(Scale*0.0005/cGravityf,4)) |
|
592 |
else Timer:= 1; |
|
15248
263b9850c16d
Tweak position of big splashes right or left
Wuzzy <Wuzzy2@mail.ru>
parents:
15244
diff
changeset
|
593 |
if Scale > 1 then |
263b9850c16d
Tweak position of big splashes right or left
Wuzzy <Wuzzy2@mail.ru>
parents:
15244
diff
changeset
|
594 |
if (not isImpactH) then |
263b9850c16d
Tweak position of big splashes right or left
Wuzzy <Wuzzy2@mail.ru>
parents:
15244
diff
changeset
|
595 |
Y:= Y + 10 |
263b9850c16d
Tweak position of big splashes right or left
Wuzzy <Wuzzy2@mail.ru>
parents:
15244
diff
changeset
|
596 |
else if isImpactRight then |
263b9850c16d
Tweak position of big splashes right or left
Wuzzy <Wuzzy2@mail.ru>
parents:
15244
diff
changeset
|
597 |
X:= X + 10 |
263b9850c16d
Tweak position of big splashes right or left
Wuzzy <Wuzzy2@mail.ru>
parents:
15244
diff
changeset
|
598 |
else |
263b9850c16d
Tweak position of big splashes right or left
Wuzzy <Wuzzy2@mail.ru>
parents:
15244
diff
changeset
|
599 |
X:= X - 10; |
10363 | 600 |
// Low Gravity |
601 |
FrameTicks:= FrameTicks*Timer; |
|
602 |
end; |
|
603 |
||
604 |
||
605 |
// eject water drops |
|
606 |
||
607 |
maxDrops := (hwRound(Gear^.Density) * 3) div 2 + round((vi + vs) * hwRound(Gear^.Density) * 6); |
|
608 |
for i:= max(maxDrops div 3, min(32, Random(maxDrops))) downto 0 do |
|
609 |
begin |
|
610 |
if isImpactH then |
|
611 |
particle := AddVisualGear(x, y - 3 + Random(7), vgtDroplet) |
|
612 |
else |
|
613 |
particle := AddVisualGear(x - 3 + Random(7), y, vgtDroplet); |
|
614 |
||
615 |
if particle <> nil then |
|
616 |
with particle^ do |
|
617 |
begin |
|
618 |
// dX and dY were initialized to have a random value on creation (see uVisualGearsList) |
|
619 |
if isImpactH then |
|
620 |
begin |
|
621 |
tmp:= dX; |
|
622 |
if isImpactRight then |
|
623 |
dX:= dY - vi / 5 |
|
624 |
else |
|
625 |
dX:= -dy + vi / 5; |
|
626 |
dY:= tmp * (1 + vs / 10); |
|
627 |
end |
|
628 |
else |
|
629 |
begin |
|
630 |
dX:= dX * (1 + vs / 10); |
|
631 |
dY:= dY - vi / 5; |
|
632 |
end; |
|
633 |
||
634 |
if splash <> nil then |
|
635 |
begin |
|
636 |
if splash^.Scale > 1 then |
|
637 |
begin |
|
638 |
dX:= dX * power(splash^.Scale, 0.3333); // tone down the droplet height further |
|
639 |
dY:= dY * power(splash^.Scale, 0.3333); |
|
640 |
end |
|
641 |
else |
|
642 |
begin |
|
643 |
dX:= dX * splash^.Scale; |
|
644 |
dY:= dY * splash^.Scale; |
|
645 |
end; |
|
646 |
end; |
|
647 |
end |
|
648 |
end; |
|
649 |
||
650 |
end; |
|
651 |
||
10354 | 652 |
procedure DrownGear(Gear: PGear); |
653 |
begin |
|
654 |
Gear^.doStep := @doStepDrowningGear; |
|
655 |
||
656 |
Gear^.Timer := 5000; // how long game should wait |
|
657 |
end; |
|
658 |
||
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
659 |
function CheckGearDrowning(var Gear: PGear): boolean; |
10015 | 660 |
var |
10363 | 661 |
skipSpeed, skipAngle, skipDecay: hwFloat; |
662 |
tmp, X, Y, dist2Water: LongInt; |
|
663 |
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
|
664 |
s: ansistring; |
6581 | 665 |
begin |
666 |
// probably needs tweaking. might need to be in a case statement based upon gear type |
|
10354 | 667 |
X:= hwRound(Gear^.X); |
6581 | 668 |
Y:= hwRound(Gear^.Y); |
10354 | 669 |
|
670 |
dist2Water:= cWaterLine - (Y + Gear^.Radius); |
|
10363 | 671 |
isDirH:= false; |
10354 | 672 |
|
673 |
if WorldEdge = weSea then |
|
6581 | 674 |
begin |
10363 | 675 |
tmp:= dist2Water; |
14303
6015b74eea55
overall, using LongInt for leftX/rightX results in fewer casts, since most comparisons are against ints.
nemo
parents:
14224
diff
changeset
|
676 |
dist2Water:= min(dist2Water, min(X - Gear^.Radius - leftX, rightX - (X + Gear^.Radius))); |
10363 | 677 |
// if water on sides is closer than on bottom -> horizontal direction |
678 |
isDirH:= tmp <> dist2Water; |
|
10354 | 679 |
end; |
680 |
||
10363 | 681 |
isImpact:= false; |
682 |
||
10354 | 683 |
if dist2Water < 0 then |
684 |
begin |
|
685 |
// invisible gears will just be deleted |
|
686 |
// 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
|
687 |
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
|
688 |
begin |
7406
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
689 |
if Gear^.Kind = gtGenericFaller then |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
690 |
begin |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
691 |
Gear^.X:= int2hwFloat(GetRandom(rightX-leftX)+leftX); |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
692 |
Gear^.Y:= int2hwFloat(GetRandom(LAND_HEIGHT-topY)+topY); |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
693 |
Gear^.dX:= _90-(GetRandomf*_360); |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
694 |
Gear^.dY:= _90-(GetRandomf*_360) |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
695 |
end |
1fe2c821f9bf
Try avoiding spamming the log by retaining the gears. untested.
nemo
parents:
7389
diff
changeset
|
696 |
else DeleteGear(Gear); |
10245 | 697 |
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
|
698 |
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
|
699 |
isSubmersible:= ((Gear = CurrentHedgehog^.Gear) and (CurAmmoGear <> nil) and (CurAmmoGear^.State and gstSubmersible <> 0)) or (Gear^.State and gstSubmersible <> 0); |
10363 | 700 |
|
6581 | 701 |
skipSpeed := _0_25; |
702 |
skipAngle := _1_9; |
|
703 |
skipDecay := _0_87; |
|
10363 | 704 |
|
10354 | 705 |
|
706 |
// skipping |
|
707 |
||
10512
25021aac078e
fix underwater-skipping bug and make air-strike missiles submersible when fired from within weSea
sheepluva
parents:
10508
diff
changeset
|
708 |
if (not isSubmersible) and (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > skipSpeed) |
10363 | 709 |
and ( ((not isDirH) and (hwAbs(Gear^.dX) > skipAngle * hwAbs(Gear^.dY))) |
710 |
or (isDirH and (hwAbs(Gear^.dY) > skipAngle * hwAbs(Gear^.dX))) ) then |
|
6581 | 711 |
begin |
10363 | 712 |
isSkip:= true; |
10354 | 713 |
// if skipping we move the gear out of water |
10363 | 714 |
if isDirH then |
10354 | 715 |
begin |
716 |
Gear^.dX.isNegative := (not Gear^.dX.isNegative); |
|
717 |
Gear^.X:= Gear^.X + Gear^.dX; |
|
718 |
end |
|
719 |
else |
|
720 |
begin |
|
721 |
Gear^.dY.isNegative := (not Gear^.dY.isNegative); |
|
722 |
Gear^.Y:= Gear^.Y + Gear^.dY; |
|
723 |
end; |
|
6581 | 724 |
Gear^.dY := Gear^.dY * skipDecay; |
725 |
Gear^.dX := Gear^.dX * skipDecay; |
|
726 |
CheckGearDrowning := false; |
|
727 |
end |
|
10354 | 728 |
else // not skipping |
6581 | 729 |
begin |
10363 | 730 |
isImpact:= true; |
731 |
isSkip:= false; |
|
6581 | 732 |
if not isSubmersible then |
733 |
begin |
|
734 |
CheckGearDrowning := true; |
|
735 |
Gear^.State := gstDrowning; |
|
12177
bfeeb1c35e77
Set turn time to 0 when current hog drowns
Wuzzy <almikes@aol.com>
parents:
12176
diff
changeset
|
736 |
if Gear = CurrentHedgehog^.Gear then |
bfeeb1c35e77
Set turn time to 0 when current hog drowns
Wuzzy <almikes@aol.com>
parents:
12176
diff
changeset
|
737 |
TurnTimeLeft := 0; |
6581 | 738 |
Gear^.RenderTimer := false; |
739 |
if (Gear^.Kind <> gtSniperRifleShot) and (Gear^.Kind <> gtShotgunShot) |
|
12898 | 740 |
and (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) |
741 |
and (Gear^.Kind <> gtMinigunBullet) then |
|
6581 | 742 |
if Gear^.Kind = gtHedgehog then |
743 |
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
|
744 |
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
|
745 |
begin |
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
746 |
// 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
|
747 |
ResurrectHedgehog(Gear); |
10245 | 748 |
exit(true) |
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
749 |
end |
6581 | 750 |
else |
751 |
begin |
|
10354 | 752 |
DrownGear(Gear); |
6581 | 753 |
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
|
754 |
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
|
755 |
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
|
756 |
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
|
757 |
else |
13642
3d14950641a4
Refactor text color variable names, export 2 color values to Lua
Wuzzy <Wuzzy2@mail.ru>
parents:
13629
diff
changeset
|
758 |
AddCaption(FormatA(GetEventString(eidDrowned), s), capcolDefault, capgrpMessage); |
6581 | 759 |
end |
760 |
end |
|
761 |
else |
|
10354 | 762 |
DrownGear(Gear); |
10419 | 763 |
if Gear^.Kind = gtFlake then |
10354 | 764 |
exit(true); // skip splashes |
8990 | 765 |
end |
10363 | 766 |
else // submersible |
767 |
begin |
|
14555
c38dd843763f
Fix double water splash if flying saucer drowns (bug 681)
Wuzzy <Wuzzy2@mail.ru>
parents:
14535
diff
changeset
|
768 |
// drown submersible gears if far below map |
10363 | 769 |
if (Y > cWaterLine + cVisibleWater*4) then |
770 |
begin |
|
771 |
DrownGear(Gear); |
|
772 |
exit(true); // no splashes needed |
|
773 |
end; |
|
10354 | 774 |
|
10363 | 775 |
CheckGearDrowning := false; |
776 |
||
777 |
// check if surface was penetrated |
|
10354 | 778 |
|
10363 | 779 |
// 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
|
780 |
if ((dist2Water + Gear^.Radius div 2) < 0) or (abs(dist2Water + Gear^.Radius) >= Gear^.Radius) then |
10363 | 781 |
isImpact:= false |
6804 | 782 |
else |
10354 | 783 |
begin |
10363 | 784 |
// get distance to water of last tick |
785 |
if isDirH then |
|
786 |
begin |
|
787 |
tmp:= hwRound(Gear^.X - Gear^.dX); |
|
12600 | 788 |
if abs(tmp - real(leftX)) < abs(tmp - real(rightX)) then // left edge |
789 |
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
|
790 |
else |
12600 | 791 |
isImpact:= (abs(tmp-real(rightX)) >= Gear^.Radius) and (not Gear^.dX.isNegative); |
10363 | 792 |
end |
10354 | 793 |
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
|
794 |
begin |
10363 | 795 |
tmp:= hwRound(Gear^.Y - Gear^.dY); |
796 |
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
|
797 |
// 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
|
798 |
isImpact:= (tmp >= Gear^.Radius) and (not Gear^.dY.isNegative); |
10363 | 799 |
end; |
10354 | 800 |
|
10363 | 801 |
end; |
802 |
end; // end of submersible |
|
803 |
end; // end of not skipping |
|
804 |
||
805 |
// splash sound animation and droplets |
|
806 |
if isImpact or isSkip then |
|
14555
c38dd843763f
Fix double water splash if flying saucer drowns (bug 681)
Wuzzy <Wuzzy2@mail.ru>
parents:
14535
diff
changeset
|
807 |
if (not (((dist2Water + Gear^.Radius div 2) < 0) or (abs(dist2Water + Gear^.Radius) >= Gear^.Radius))) then |
c38dd843763f
Fix double water splash if flying saucer drowns (bug 681)
Wuzzy <Wuzzy2@mail.ru>
parents:
14535
diff
changeset
|
808 |
addSplashForGear(Gear, isSkip); |
10363 | 809 |
|
10668 | 810 |
if isSkip then |
811 |
ScriptCall('onGearWaterSkip', Gear^.uid); |
|
6581 | 812 |
end |
813 |
else |
|
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
814 |
CheckGearDrowning := false |
6581 | 815 |
end; |
816 |
||
817 |
||
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
818 |
procedure ResurrectHedgehog(var gear: PGear); |
6581 | 819 |
var tempTeam : PTeam; |
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
820 |
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
|
821 |
gX, gY: LongInt; |
6581 | 822 |
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
|
823 |
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
|
824 |
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
|
825 |
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
|
826 |
uStats.HedgehogDamaged(Gear, CurrentHedgehog, 0, true); |
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
827 |
// Reset gear state |
6581 | 828 |
AttackBar:= 0; |
829 |
gear^.dX := _0; |
|
830 |
gear^.dY := _0; |
|
831 |
gear^.Damage := 0; |
|
832 |
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
|
833 |
gear^.Hedgehog^.Effects[hePoisoned] := 0; |
7176
fb4b0c6dfdbd
Make watching AI v AI on ai survival a bit more entertaining
nemo
parents:
7168
diff
changeset
|
834 |
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
|
835 |
and (Gear^.Hedgehog^.Team^.Clan <> CurrentHedgehog^.Team^.Clan)) then |
8330 | 836 |
with CurrentHedgehog^ do |
6581 | 837 |
begin |
838 |
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
|
839 |
FreeAndNilTexture(Team^.AIKillsTex); |
10124
aabd1b75d5a3
Even more explicit type conversions and other stuff to help pas2c use ansistrings
unc0rr
parents:
10116
diff
changeset
|
840 |
Team^.AIKillsTex := RenderStringTex(ansistring(inttostr(Team^.stats.AIKills)), Team^.Clan^.Color, fnt16); |
6581 | 841 |
end; |
842 |
tempTeam := gear^.Hedgehog^.Team; |
|
843 |
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
|
844 |
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
|
845 |
gY := hwRound(gear^.Y); |
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
846 |
// Spawn a few sparkles at death position. |
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
847 |
// 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
|
848 |
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
|
849 |
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
|
850 |
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
|
851 |
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
|
852 |
end; |
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
853 |
// Set new position of gear (might fail) |
8330 | 854 |
FindPlace(gear, false, 0, LAND_WIDTH, true); |
6581 | 855 |
if gear <> nil then |
856 |
begin |
|
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
857 |
// Visual effect at position of resurrection |
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
858 |
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
|
859 |
PlaySound(sndWarp); |
6581 | 860 |
RenderHealth(gear^.Hedgehog^); |
13629
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
861 |
if expl <> nil then |
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
862 |
ScriptCall('onGearResurrect', gear^.uid, expl^.uid) |
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
863 |
else |
c9a49d06f1a2
Report spawning visual gear in onGearResurrect
Wuzzy <Wuzzy2@mail.ru>
parents:
13627
diff
changeset
|
864 |
ScriptCall('onGearResurrect', gear^.uid); |
6581 | 865 |
gear^.State := gstWait; |
8947
e906ebd59612
CheckGearDrowning could delete hedgehogs gear! (CheckGearDrowning -> ResurrectHedgehog -> FindPlace). Fixes bug 620.
unc0rr
parents:
8763
diff
changeset
|
866 |
end; |
6581 | 867 |
RecountTeamHealth(tempTeam); |
868 |
end; |
|
869 |
||
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 |
function CountLand(x, y, r, c: LongInt; mask, antimask: LongWord): LongInt; |
6581 | 871 |
var i: LongInt; |
872 |
count: LongInt = 0; |
|
873 |
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
|
874 |
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
|
875 |
for i:= max(x - r, 0) to min(x + r, LAND_WIDTH - 1) do |
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
876 |
if (LandGet(y, i) and mask <> 0) and (LandGet(y, i) and antimask = 0) 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
|
877 |
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
|
878 |
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
|
879 |
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
|
880 |
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
|
881 |
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
|
882 |
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
|
883 |
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
|
884 |
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
|
885 |
CountLand:= count; |
6581 | 886 |
end; |
887 |
||
10272
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
888 |
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
|
889 |
var cnt, i: LongInt; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
890 |
begin |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
891 |
cnt:= 0; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
892 |
isSteadyPosition:= false; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
893 |
|
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
894 |
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
|
895 |
begin |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
896 |
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
|
897 |
begin |
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
898 |
if (LandGet(y, x - i) and mask <> 0) then inc(cnt); |
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
899 |
if (LandGet(y, x + i) and mask <> 0) then inc(cnt); |
10272
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
900 |
|
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
901 |
if cnt >= c then |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
902 |
begin |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
903 |
isSteadyPosition:= true; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
904 |
exit |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
905 |
end; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
906 |
end; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
907 |
end; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
908 |
end; |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
909 |
|
6888 | 910 |
|
911 |
function NoGearsToAvoid(mX, mY: LongInt; rX, rY: LongInt): boolean; |
|
912 |
var t: PGear; |
|
913 |
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
|
914 |
NoGearsToAvoid:= false; |
6888 | 915 |
t:= GearsList; |
916 |
rX:= sqr(rX); |
|
917 |
rY:= sqr(rY); |
|
918 |
while t <> nil do |
|
919 |
begin |
|
920 |
if t^.Kind <= gtExplosives then |
|
921 |
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
|
922 |
exit; |
6888 | 923 |
t:= t^.NextGear |
924 |
end; |
|
925 |
NoGearsToAvoid:= true |
|
926 |
end; |
|
927 |
||
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
928 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); |
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
929 |
begin |
15763
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
930 |
FindPlace(Gear, withFall, Left, Right, false, true); |
6986
409dd3851309
add support for default pascal mode by removing default arguments value (maybe this also helps the parser)
koda
parents:
6888
diff
changeset
|
931 |
end; |
6888 | 932 |
|
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
933 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean); |
15763
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
934 |
begin |
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
935 |
FindPlace(Gear, withFall, Left, Right, skipProximity, true); |
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
936 |
end; |
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
937 |
|
15986
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
938 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity, deleteOnFail: boolean); inline; |
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
939 |
begin |
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
940 |
FindPlace(Gear, withFall, Left, Right, cWaterLine, skipProximity, deleteOnFail); |
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
941 |
end; |
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
942 |
|
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
943 |
procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right, Bottom: LongInt; skipProximity, deleteOnFail: boolean); |
6581 | 944 |
var x: LongInt; |
11193
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
945 |
y, sy, dir: LongInt; |
8007 | 946 |
ar: array[0..1023] of TPoint; |
947 |
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
|
948 |
temp: TPoint; |
6581 | 949 |
cnt, cnt2: Longword; |
950 |
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
|
951 |
ignoreNearObjects, ignoreOverlap, tryAgain: boolean; |
6581 | 952 |
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
|
953 |
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
|
954 |
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 | 955 |
tryAgain:= true; |
10015 | 956 |
if WorldEdge <> weNone then |
9477 | 957 |
begin |
14303
6015b74eea55
overall, using LongInt for leftX/rightX results in fewer casts, since most comparisons are against ints.
nemo
parents:
14224
diff
changeset
|
958 |
Left:= max(Left, leftX + Gear^.Radius); |
9477 | 959 |
Right:= min(Right,rightX-Gear^.Radius) |
960 |
end; |
|
6581 | 961 |
while tryAgain do |
962 |
begin |
|
8007 | 963 |
delta:= LAND_WIDTH div 16; |
6581 | 964 |
cnt2:= 0; |
965 |
repeat |
|
11193
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
966 |
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
|
967 |
x:= max(LAND_WIDTH div 2048, LongInt(GetRandom(Delta))); |
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
968 |
if dir = 1 then x:= Left + x else x:= Right - x; |
6581 | 969 |
repeat |
970 |
cnt:= 0; |
|
9809 | 971 |
y:= min(1024, topY) - Gear^.Radius shl 1; |
15986
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
972 |
while y < Bottom do |
6581 | 973 |
begin |
974 |
repeat |
|
975 |
inc(y, 2); |
|
15986
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
976 |
until (y >= Bottom) or |
15730 | 977 |
(ignoreOverLap and (CountLand(x, y, Gear^.Radius - 1, 1, lfLandMask, 0) = 0)) or |
978 |
(not ignoreOverLap and (CountLand(x, y, Gear^.Radius - 1, 1, lfAll, 0) = 0)); |
|
6581 | 979 |
|
980 |
sy:= y; |
|
981 |
||
982 |
repeat |
|
983 |
inc(y); |
|
15986
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
984 |
until (y >= Bottom) 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
|
985 |
(ignoreOverlap and |
15730 | 986 |
(CountLand(x, y, Gear^.Radius - 1, 1, lfAll, 0) <> 0)) or |
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
987 |
(not ignoreOverlap and |
12449 | 988 |
(CountLand(x, y, Gear^.Radius - 1, 1, lfLandMask, 0) <> 0)); |
6581 | 989 |
|
15986
7125918637e9
Make tardis avoid water during Sudden Death
Wuzzy <Wuzzy@disroot.org>
parents:
15926
diff
changeset
|
990 |
if (y - sy > Gear^.Radius * 2) and (y < Bottom) |
6581 | 991 |
and (((Gear^.Kind = gtExplosives) |
10272
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
992 |
and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 60, 60)) |
15730 | 993 |
and (isSteadyPosition(x, y+1, Gear^.Radius - 1, 3, lfAll) |
994 |
or (CountLand(x, y+1, Gear^.Radius - 1, Gear^.Radius+1, lfAll, 0) > Gear^.Radius) |
|
10274 | 995 |
)) |
10272
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
996 |
or |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
997 |
((Gear^.Kind <> gtExplosives) |
31ee88c9b4d0
Allow barrels to spawn in U-shaped pits in stable position
unc0rr
parents:
10245
diff
changeset
|
998 |
and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 110, 110)) |
12449 | 999 |
and (isSteadyPosition(x, y+1, Gear^.Radius - 1, 3, lfIce) |
15730 | 1000 |
or (CountLand(x, y+1, Gear^.Radius - 1, Gear^.Radius+1, lfAll, lfIce) <> 0) |
12449 | 1001 |
))) then |
6888 | 1002 |
begin |
6581 | 1003 |
ar[cnt].X:= x; |
1004 |
if withFall then |
|
1005 |
ar[cnt].Y:= sy + Gear^.Radius |
|
1006 |
else |
|
1007 |
ar[cnt].Y:= y - Gear^.Radius; |
|
1008 |
inc(cnt) |
|
1009 |
end; |
|
1010 |
||
7603
e9c3c67b5dfd
reducing this value is sufficient to ensure crates drop just below top border or a girder
nemo
parents:
7599
diff
changeset
|
1011 |
inc(y, 10) |
6581 | 1012 |
end; |
1013 |
||
1014 |
if cnt > 0 then |
|
10015 | 1015 |
begin |
1016 |
temp := ar[GetRandom(cnt)]; |
|
1017 |
with temp do |
|
6581 | 1018 |
begin |
1019 |
ar2[cnt2].x:= x; |
|
1020 |
ar2[cnt2].y:= y; |
|
1021 |
inc(cnt2) |
|
11193
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
1022 |
end; |
11192
0f6916065849
This should probably fix feedback that hogs weren't spawning on left side of map.
nemo
parents:
11046
diff
changeset
|
1023 |
end; |
11193
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
1024 |
inc(x, Delta*dir) |
283b6e6cf7ea
Scan from right too. Not sure this is actually helpful, so committing separately.
nemo
parents:
11192
diff
changeset
|
1025 |
until ((dir = 1) and (x > Right)) or ((dir = -1) and (x < Left)); |
6581 | 1026 |
|
1027 |
dec(Delta, 60) |
|
1028 |
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
|
1029 |
// 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
|
1030 |
if (cnt2 = 0) and skipProximity and (not ignoreOverlap) then |
6581 | 1031 |
tryAgain:= true |
1032 |
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
|
1033 |
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
|
1034 |
ignoreNearObjects:= true; |
6581 | 1035 |
end; |
1036 |
||
1037 |
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
|
1038 |
begin |
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
8007
diff
changeset
|
1039 |
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
|
1040 |
with temp do |
6581 | 1041 |
begin |
1042 |
Gear^.X:= int2hwFloat(x); |
|
1043 |
Gear^.Y:= int2hwFloat(y); |
|
15763
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
1044 |
AddFileLog('FindPlace: Assigned Gear coordinates (' + inttostr(x) + ',' + inttostr(y) + ')'); |
6581 | 1045 |
end |
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
8007
diff
changeset
|
1046 |
end |
11477
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1047 |
else |
6581 | 1048 |
begin |
15763
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
1049 |
OutError('FindPlace: Can''t find place for Gear', false); |
6581 | 1050 |
if Gear^.Kind = gtHedgehog then |
11477
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1051 |
begin |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1052 |
cnt:= 0; |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1053 |
if GameTicks = 0 then |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1054 |
begin |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1055 |
while (cnt < 1000) do |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1056 |
begin |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1057 |
inc(cnt); |
11751
20e0a72e0e2c
make hog fallback (flower-in-hole) positioning respect limits (e.g. used by gfDivideTeams)
sheepluva
parents:
11551
diff
changeset
|
1058 |
x:= left+GetRandom(right-left-2*cHHRadius)+cHHRadius; |
11479 | 1059 |
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
|
1060 |
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
|
1061 |
begin |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1062 |
Gear^.State:= Gear^.State or gsttmpFlag; |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1063 |
Gear^.X:= int2hwFloat(x); |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1064 |
Gear^.Y:= int2hwFloat(y); |
15763
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
1065 |
AddFileLog('FindPlace: Picked alternative spot for hog at coordinates (' + inttostr(hwRound(Gear^.X)) + ',' + inttostr(hwRound(Gear^.Y)) + ')'); |
11477
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1066 |
cnt:= 2000 |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1067 |
end |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1068 |
end; |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1069 |
end; |
15763
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
1070 |
if (deleteOnFail) and (cnt < 2000) then |
11477
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1071 |
begin |
15763
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
1072 |
AddFileLog('FindPlace: No place found, deleting hog'); |
11477
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1073 |
Gear^.Hedgehog^.Effects[heResurrectable] := 0; |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1074 |
DeleteGear(Gear); |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1075 |
Gear:= nil |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1076 |
end |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1077 |
end |
15763
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
1078 |
else if (deleteOnFail) then |
11477
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1079 |
begin |
15763
8997e212be4c
Fix hog not returning from TimeBox when all land was destroyed
Wuzzy <Wuzzy2@mail.ru>
parents:
15762
diff
changeset
|
1080 |
AddFileLog('FindPlace: No place found, deleting Gear'); |
11477
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1081 |
DeleteGear(Gear); |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1082 |
Gear:= nil |
e425a6eb9da3
Force locations for hogs if even TryHard fails on initial spawn.
nemo
parents:
11472
diff
changeset
|
1083 |
end |
6581 | 1084 |
end |
1085 |
end; |
|
1086 |
||
13920 | 1087 |
function CheckGearNearImpl(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt; exclude: PGear): PGear; |
13921 | 1088 |
var t: PGear; |
15926 | 1089 |
width, dX, dY: hwFloat; |
13912 | 1090 |
isHit: Boolean; |
15926 | 1091 |
i, j, bound: LongWord; |
6581 | 1092 |
begin |
15926 | 1093 |
bound:= max(rX, rY) * 3 div 2; |
13912 | 1094 |
rX:= sqr(rX); |
1095 |
rY:= sqr(rY); |
|
13913 | 1096 |
width:= int2hwFloat(RightX - LeftX); |
15202 | 1097 |
if (Kind = gtHedgehog) then |
13399 | 1098 |
begin |
15202 | 1099 |
for j:= 0 to Pred(TeamsCount) do |
1100 |
if TeamsArray[j]^.TeamHealth > 0 then // it's impossible for a team to have hogs in game and zero health right? |
|
1101 |
with TeamsArray[j]^ do |
|
1102 |
for i:= 0 to cMaxHHIndex do |
|
1103 |
with Hedgehogs[i] do |
|
15863 | 1104 |
if (not Unplaced) and (Gear <> nil) and (Gear <> exclude) then |
15202 | 1105 |
begin |
1106 |
// code duplication - could throw into an inline function I guess |
|
1107 |
dX := X - Gear^.X; |
|
1108 |
dY := Y - Gear^.Y; |
|
15926 | 1109 |
isHit := (dX.Round + dY.Round < bound) |
15202 | 1110 |
and (not ((hwSqr(dX) / rX + hwSqr(dY) / rY) > _1)); |
13912 | 1111 |
|
15202 | 1112 |
if (not isHit) and (WorldEdge = weWrap) then |
1113 |
begin |
|
15926 | 1114 |
if ((dX - width).Round + dY.Round < bound) |
15202 | 1115 |
and (not ((hwSqr(dX - width) / rX + hwSqr(dY) / rY) > _1)) then |
1116 |
isHit := true |
|
15926 | 1117 |
else if ((dX + width).Round + dY.Round < bound) |
15202 | 1118 |
and (not ((hwSqr(dX + width) / rX + hwSqr(dY) / rY) > _1)) then |
1119 |
isHit := true |
|
1120 |
end; |
|
1121 |
||
1122 |
if isHit then |
|
1123 |
begin |
|
1124 |
CheckGearNearImpl:= Gear; |
|
1125 |
exit; |
|
1126 |
end |
|
1127 |
end; |
|
1128 |
end |
|
1129 |
else |
|
1130 |
begin |
|
1131 |
t:= GearsList; |
|
1132 |
||
1133 |
while t <> nil do |
|
13912 | 1134 |
begin |
15202 | 1135 |
if (t <> exclude) and (t^.Kind = Kind) then |
1136 |
begin |
|
1137 |
dX := X - t^.X; |
|
1138 |
dY := Y - t^.Y; |
|
15926 | 1139 |
isHit := (dX.Round + dY.Round < bound) |
15202 | 1140 |
and (not ((hwSqr(dX) / rX + hwSqr(dY) / rY) > _1)); |
13912 | 1141 |
|
15202 | 1142 |
if (not isHit) and (WorldEdge = weWrap) then |
1143 |
begin |
|
15926 | 1144 |
if ((dX - width).Round + dY.Round < bound) |
15202 | 1145 |
and (not ((hwSqr(dX - width) / rX + hwSqr(dY) / rY) > _1)) then |
1146 |
isHit := true |
|
15926 | 1147 |
else if ((dX + width).Round + dY.Round < bound) |
15202 | 1148 |
and (not ((hwSqr(dX + width) / rX + hwSqr(dY) / rY) > _1)) then |
1149 |
isHit := true |
|
1150 |
end; |
|
1151 |
||
1152 |
if isHit then |
|
1153 |
begin |
|
1154 |
CheckGearNearImpl:= t; |
|
1155 |
exit; |
|
1156 |
end; |
|
1157 |
end; |
|
1158 |
t:= t^.NextGear |
|
1159 |
end |
|
13399 | 1160 |
end; |
1161 |
||
13922 | 1162 |
CheckGearNearImpl:= nil |
13912 | 1163 |
end; |
1164 |
||
1165 |
function CheckGearNear(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt): PGear; |
|
1166 |
begin |
|
1167 |
CheckGearNear := CheckGearNearImpl(Kind, X, Y, rX, rY, nil); |
|
13399 | 1168 |
end; |
1169 |
||
1170 |
function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear; |
|
1171 |
begin |
|
13912 | 1172 |
CheckGearNear := CheckGearNearImpl(Kind, Gear^.X, Gear^.Y, rX, rY, Gear); |
6581 | 1173 |
end; |
1174 |
||
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
1175 |
procedure CheckCollision(Gear: PGear); |
7592 | 1176 |
begin |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1177 |
if (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0) |
7592 | 1178 |
or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then |
1179 |
Gear^.State := Gear^.State or gstCollision |
|
1180 |
else |
|
1181 |
Gear^.State := Gear^.State and (not gstCollision) |
|
1182 |
end; |
|
1183 |
||
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
1184 |
procedure CheckCollisionWithLand(Gear: PGear); |
7592 | 1185 |
begin |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1186 |
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
|
1187 |
or (TestCollisionY(Gear, hwSign(Gear^.dY)) <> 0) then |
7592 | 1188 |
Gear^.State := Gear^.State or gstCollision |
8330 | 1189 |
else |
7592 | 1190 |
Gear^.State := Gear^.State and (not gstCollision) |
1191 |
end; |
|
1192 |
||
7719
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1193 |
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
|
1194 |
begin |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1195 |
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
|
1196 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1197 |
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
|
1198 |
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
|
1199 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1200 |
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
|
1201 |
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
|
1202 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1203 |
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
|
1204 |
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
|
1205 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1206 |
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
|
1207 |
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
|
1208 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1209 |
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
|
1210 |
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
|
1211 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1212 |
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
|
1213 |
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
|
1214 |
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
|
1215 |
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
|
1216 |
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
|
1217 |
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
|
1218 |
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
|
1219 |
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
|
1220 |
end; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1221 |
|
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1222 |
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
|
1223 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1224 |
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
|
1225 |
MakeHedgehogsStep:= true |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1226 |
end else |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1227 |
MakeHedgehogsStep:= false; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1228 |
|
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1229 |
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
|
1230 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1231 |
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
|
1232 |
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
|
1233 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1234 |
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
|
1235 |
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
|
1236 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1237 |
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
|
1238 |
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
|
1239 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1240 |
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
|
1241 |
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
|
1242 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1243 |
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
|
1244 |
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
|
1245 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1246 |
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
|
1247 |
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
|
1248 |
begin |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1249 |
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
|
1250 |
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
|
1251 |
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
|
1252 |
exit |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1253 |
end; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1254 |
end |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1255 |
end |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1256 |
end |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1257 |
end |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1258 |
end |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1259 |
end; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1260 |
end; |
eeae1cb6b6bf
Move hedgehog's step routine into separate function, use it in both hedgehog and ai code
unc0rr
parents:
7627
diff
changeset
|
1261 |
|
9285 | 1262 |
|
1263 |
procedure ShotgunShot(Gear: PGear); |
|
1264 |
var t: PGear; |
|
1265 |
dmg, r, dist: LongInt; |
|
1266 |
dx, dy: hwFloat; |
|
1267 |
begin |
|
1268 |
Gear^.Radius:= cShotgunRadius; |
|
1269 |
t:= GearsList; |
|
1270 |
while t <> nil do |
|
1271 |
begin |
|
1272 |
case t^.Kind of |
|
1273 |
gtHedgehog, |
|
1274 |
gtMine, |
|
1275 |
gtSMine, |
|
13407
06792533ef91
ensure shotgun works with portals and make it hit airmines
alfadur
parents:
13403
diff
changeset
|
1276 |
gtAirMine, |
9285 | 1277 |
gtKnife, |
1278 |
gtCase, |
|
1279 |
gtTarget, |
|
15732 | 1280 |
gtExplosives, |
1281 |
gtSentry: begin |
|
9285 | 1282 |
//addFileLog('ShotgunShot radius: ' + inttostr(Gear^.Radius) + ', t^.Radius = ' + inttostr(t^.Radius) + ', distance = ' + inttostr(dist) + ', dmg = ' + inttostr(dmg)); |
1283 |
dmg:= 0; |
|
1284 |
r:= Gear^.Radius + t^.Radius; |
|
1285 |
dx:= Gear^.X-t^.X; |
|
1286 |
dx.isNegative:= false; |
|
1287 |
dy:= Gear^.Y-t^.Y; |
|
1288 |
dy.isNegative:= false; |
|
1289 |
if r-hwRound(dx+dy) > 0 then |
|
1290 |
begin |
|
1291 |
dist:= hwRound(Distance(dx, dy)); |
|
11472 | 1292 |
dmg:= ModifyDamage(min(r - dist, Gear^.Boom), t); |
9285 | 1293 |
end; |
1294 |
if dmg > 0 then |
|
1295 |
begin |
|
10558 | 1296 |
if (t^.Kind <> gtHedgehog) or (t^.Hedgehog^.Effects[heInvulnerable] = 0) then |
9285 | 1297 |
ApplyDamage(t, Gear^.Hedgehog, dmg, dsBullet) |
1298 |
else |
|
1299 |
Gear^.State:= Gear^.State or gstWinner; |
|
1300 |
||
1301 |
DeleteCI(t); |
|
1302 |
t^.dX:= t^.dX + Gear^.dX * dmg * _0_01 + SignAs(cHHKick, Gear^.dX); |
|
1303 |
t^.dY:= t^.dY + Gear^.dY * dmg * _0_01; |
|
1304 |
t^.State:= t^.State or gstMoving; |
|
1305 |
if t^.Kind = gtKnife then t^.State:= t^.State and (not gstCollision); |
|
1306 |
t^.Active:= true; |
|
14221 | 1307 |
FollowGear:= t; |
1308 |
||
1309 |
if t^.Kind = gtAirmine then |
|
1310 |
begin |
|
1311 |
t^.Tag:= 1; |
|
1312 |
t^.FlightTime:= 5000; |
|
1313 |
end |
|
9285 | 1314 |
end |
1315 |
end; |
|
1316 |
gtGrave: begin |
|
1317 |
dmg:= 0; |
|
1318 |
r:= Gear^.Radius + t^.Radius; |
|
1319 |
dx:= Gear^.X-t^.X; |
|
1320 |
dx.isNegative:= false; |
|
1321 |
dy:= Gear^.Y-t^.Y; |
|
1322 |
dy.isNegative:= false; |
|
1323 |
if r-hwRound(dx+dy) > 0 then |
|
1324 |
begin |
|
1325 |
dist:= hwRound(Distance(dx, dy)); |
|
11472 | 1326 |
dmg:= ModifyDamage(min(r - dist, Gear^.Boom), t); |
9285 | 1327 |
end; |
1328 |
if dmg > 0 then |
|
1329 |
begin |
|
1330 |
t^.dY:= - _0_1; |
|
1331 |
t^.Active:= true |
|
1332 |
end |
|
1333 |
end; |
|
1334 |
end; |
|
1335 |
t:= t^.NextGear |
|
1336 |
end; |
|
1337 |
if (GameFlags and gfSolidLand) = 0 then |
|
1338 |
DrawExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), cShotgunRadius) |
|
1339 |
end; |
|
1340 |
||
15762
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1341 |
// Return number of living hogs in HHGear's team |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1342 |
// * HHGear: hog gear for which to count team hogs |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1343 |
// * countHidden: if true, also count hidden hogs (e.g. time-travel) |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1344 |
function CountHogsInTeam(HHGear: PGear; countHidden: boolean): LongInt; |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1345 |
var i, j, cnt: LongInt; |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1346 |
HH: PHedgehog; |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1347 |
begin |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1348 |
if HHGear = nil then |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1349 |
exit(0); |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1350 |
HH:= HHGear^.Hedgehog; |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1351 |
cnt:= 0; |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1352 |
for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1353 |
for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1354 |
if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil) |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1355 |
and ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0) |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1356 |
and (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health > HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1357 |
inc(cnt) |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1358 |
else if countHidden and (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].GearHidden <> nil) then |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1359 |
inc(cnt); |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1360 |
CountHogsInTeam:= cnt; |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1361 |
end; |
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1362 |
|
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1363 |
|
12712
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1364 |
// 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
|
1365 |
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
|
1366 |
var usable: boolean; |
15762
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1367 |
cnt: LongInt; |
12712
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1368 |
HH: PHedgehog; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1369 |
begin |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1370 |
(* |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1371 |
Conditions for not activating. |
15810
acf70c44065b
Use the singular 'they' in code comments, where it makes sense
Wuzzy <Wuzzy2@mail.ru>
parents:
15775
diff
changeset
|
1372 |
1. Hog is last of their clan |
12712
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1373 |
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
|
1374 |
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
|
1375 |
*) |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1376 |
usable:= true; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1377 |
HH:= HHGear^.Hedgehog; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1378 |
if HHGear <> nil then |
12920
21827fc9ca98
Fix timebox being usable in SD w/ damage=0
Wuzzy <Wuzzy2@mail.ru>
parents:
12898
diff
changeset
|
1379 |
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
|
1380 |
usable:= false; |
15762
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15732
diff
changeset
|
1381 |
cnt:= CountHogsInTeam(HHGear, false); |
12712
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1382 |
if (cnt < 2) then |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1383 |
usable:= false; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1384 |
CanUseTardis:= usable; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1385 |
end; |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12656
diff
changeset
|
1386 |
|
12898 | 1387 |
procedure AmmoShoveImpl(Ammo: PGear; Damage, Power: LongInt; collisions: PGearArray); |
9285 | 1388 |
var t: PGearArray; |
1389 |
Gear: PGear; |
|
1390 |
i, j, tmpDmg: LongInt; |
|
1391 |
VGear: PVisualGear; |
|
1392 |
begin |
|
12898 | 1393 |
t:= collisions; |
1394 |
||
9285 | 1395 |
// Just to avoid hogs on rope dodging fire. |
1396 |
if (CurAmmoGear <> nil) and ((CurAmmoGear^.Kind = gtRope) or (CurAmmoGear^.Kind = gtJetpack) or (CurAmmoGear^.Kind = gtBirdy)) |
|
1397 |
and (CurrentHedgehog^.Gear <> nil) and (CurrentHedgehog^.Gear^.CollisionIndex = -1) |
|
1398 |
and (sqr(hwRound(Ammo^.X) - hwRound(CurrentHedgehog^.Gear^.X)) + sqr(hwRound(Ammo^.Y) - hwRound(CurrentHedgehog^.Gear^.Y)) <= sqr(cHHRadius + Ammo^.Radius)) then |
|
1399 |
begin |
|
1400 |
t^.ar[t^.Count]:= CurrentHedgehog^.Gear; |
|
1401 |
inc(t^.Count) |
|
1402 |
end; |
|
1403 |
||
1404 |
i:= t^.Count; |
|
1405 |
||
1406 |
if (Ammo^.Kind = gtFlame) and (i > 0) then |
|
1407 |
Ammo^.Health:= 0; |
|
1408 |
while i > 0 do |
|
1409 |
begin |
|
1410 |
dec(i); |
|
1411 |
Gear:= t^.ar[i]; |
|
14028 | 1412 |
if (Ammo^.Kind in [gtDEagleShot, gtSniperRifleShot, gtMinigunBullet, |
14358 | 1413 |
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
|
1414 |
and (((Ammo^.Data <> nil) and (PGear(Ammo^.Data) = Gear)) |
15678 | 1415 |
or (not UpdateHitOrder( |
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
1416 |
Gear, |
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
1417 |
Ammo^.WDTimer, |
15864 | 1418 |
(Ammo^.Kind = gtMinigunBullet) and (Ammo^.Pos <> 0)))) then |
11550
881231c1ba46
disallow bullets to hit the hedgehog that fired them (unless bounced/wrapped/portal'd)
sheepluva
parents:
11479
diff
changeset
|
1419 |
continue; |
12898 | 1420 |
|
10015 | 1421 |
if ((Ammo^.Kind = gtFlame) or (Ammo^.Kind = gtBlowTorch)) and |
12898 | 1422 |
(Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heFrozen] > 255) then |
9285 | 1423 |
Gear^.Hedgehog^.Effects[heFrozen]:= max(255,Gear^.Hedgehog^.Effects[heFrozen]-10000); |
1424 |
tmpDmg:= ModifyDamage(Damage, Gear); |
|
1425 |
if (Gear^.State and gstNoDamage) = 0 then |
|
1426 |
begin |
|
1427 |
||
1428 |
if (Gear^.Kind = gtHedgehog) and (Ammo^.State and gsttmpFlag <> 0) and (Ammo^.Kind = gtShover) then |
|
1429 |
Gear^.FlightTime:= 1; |
|
1430 |
||
1431 |
case Gear^.Kind of |
|
1432 |
gtHedgehog, |
|
1433 |
gtMine, |
|
13399 | 1434 |
gtAirMine, |
9285 | 1435 |
gtSMine, |
1436 |
gtKnife, |
|
1437 |
gtTarget, |
|
1438 |
gtCase, |
|
15732 | 1439 |
gtExplosives, |
1440 |
gtSentry: |
|
9285 | 1441 |
begin |
14028 | 1442 |
if (Ammo^.Kind in [gtFirePunch, gtKamikaze]) and (Gear^.Kind <> gtSMine) then |
14020 | 1443 |
PlaySound(sndFirePunchHit); |
1444 |
||
13807 | 1445 |
if Ammo^.Kind in [gtDEagleShot, gtSniperRifleShot, gtMinigunBullet] then |
1446 |
begin |
|
1447 |
VGear := AddVisualGear(t^.cX[i], t^.cY[i], vgtBulletHit); |
|
1448 |
if VGear <> nil then |
|
1449 |
VGear^.Angle := DxDy2Angle(-Ammo^.dX, Ammo^.dY); |
|
1450 |
end; |
|
9285 | 1451 |
if (Ammo^.Kind = gtDrill) then |
1452 |
begin |
|
1453 |
Ammo^.Timer:= 0; |
|
1454 |
exit; |
|
1455 |
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
|
1456 |
if (Gear^.Kind <> gtHedgehog) or (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) then |
9285 | 1457 |
begin |
1458 |
if (Ammo^.Kind = gtKnife) and (tmpDmg > 0) then |
|
1459 |
for j:= 1 to max(1,min(3,tmpDmg div 5)) do |
|
1460 |
begin |
|
12898 | 1461 |
VGear:= AddVisualGear( |
1462 |
t^.cX[i] - ((t^.cX[i] - hwround(Gear^.X)) div 2), |
|
1463 |
t^.cY[i] - ((t^.cY[i] - hwround(Gear^.Y)) div 2), |
|
1464 |
vgtStraightShot); |
|
9285 | 1465 |
if VGear <> nil then |
1466 |
with VGear^ do |
|
1467 |
begin |
|
1468 |
Tint:= $FFCC00FF; |
|
1469 |
Angle:= random(360); |
|
1470 |
dx:= 0.0005 * (random(100)); |
|
1471 |
dy:= 0.0005 * (random(100)); |
|
1472 |
if random(2) = 0 then |
|
1473 |
dx := -dx; |
|
1474 |
if random(2) = 0 then |
|
1475 |
dy := -dy; |
|
1476 |
FrameTicks:= 600+random(200); |
|
1477 |
State:= ord(sprStar) |
|
1478 |
end |
|
1479 |
end; |
|
14221 | 1480 |
ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg, dsShove); |
1481 |
||
1482 |
if Gear^.Kind = gtAirmine then |
|
1483 |
begin |
|
1484 |
Gear^.Tag:= 1; |
|
1485 |
Gear^.FlightTime:= 5000; |
|
1486 |
end |
|
9285 | 1487 |
end |
1488 |
else |
|
1489 |
Gear^.State:= Gear^.State or gstWinner; |
|
10015 | 1490 |
if (Gear^.Kind = gtExplosives) and (Ammo^.Kind = gtBlowtorch) then |
9285 | 1491 |
begin |
1492 |
if (Ammo^.Hedgehog^.Gear <> nil) then |
|
1493 |
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
|
1494 |
ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg * 100, dsExplosion); // crank up damage for explosives + blowtorch |
9285 | 1495 |
end; |
1496 |
||
1497 |
if (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.King or (Gear^.Hedgehog^.Effects[heFrozen] > 0)) then |
|
1498 |
begin |
|
13803 | 1499 |
Gear^.dX:= Ammo^.dX * Power * _0_005; |
1500 |
Gear^.dY:= Ammo^.dY * Power * _0_005 |
|
9285 | 1501 |
end |
1502 |
else if ((Ammo^.Kind <> gtFlame) or (Gear^.Kind = gtHedgehog)) and (Power <> 0) then |
|
1503 |
begin |
|
15647 | 1504 |
if (Ammo^.Kind in [gtMinigunBullet]) then |
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
1505 |
begin |
15647 | 1506 |
Gear^.dX:= Gear^.dX + Ammo^.dX * Power * _0_01; |
1507 |
Gear^.dY:= Gear^.dY + Ammo^.dY * Power * _0_01 |
|
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
1508 |
end |
15647 | 1509 |
else |
1510 |
begin |
|
1511 |
Gear^.dX:= Ammo^.dX * Power * _0_01; |
|
1512 |
Gear^.dY:= Ammo^.dY * Power * _0_01 |
|
1513 |
end |
|
9285 | 1514 |
end; |
1515 |
||
1516 |
if (not isZero(Gear^.dX)) or (not isZero(Gear^.dY)) then |
|
1517 |
begin |
|
1518 |
Gear^.Active:= true; |
|
1519 |
DeleteCI(Gear); |
|
1520 |
Gear^.State:= Gear^.State or gstMoving; |
|
1521 |
if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision); |
|
1522 |
// 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
|
1523 |
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then |
9285 | 1524 |
begin |
9706
5178d2263521
return land word from uCollisions to make decisions based on it. Should be handy for trampoline.
nemo
parents:
9685
diff
changeset
|
1525 |
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
|
1526 |
(TestCollisionYwithGear(Gear, -1) = 0) then |
9285 | 1527 |
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
|
1528 |
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
|
1529 |
(TestCollisionYwithGear(Gear, -1) = 0) then |
9285 | 1530 |
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
|
1531 |
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
|
1532 |
(TestCollisionYwithGear(Gear, -1) = 0) then |
9285 | 1533 |
Gear^.Y:= Gear^.Y - _1; |
1534 |
end |
|
1535 |
end; |
|
1536 |
||
1537 |
||
1538 |
if (Ammo^.Kind <> gtFlame) or ((Ammo^.State and gsttmpFlag) = 0) then |
|
1539 |
FollowGear:= Gear |
|
1540 |
end; |
|
1541 |
end |
|
1542 |
end; |
|
1543 |
end; |
|
1544 |
if i <> 0 then |
|
1545 |
SetAllToActive |
|
1546 |
end; |
|
1547 |
||
12898 | 1548 |
procedure AmmoShoveLine(Ammo: PGear; Damage, Power: LongInt; oX, oY, tX, tY: hwFloat); |
1549 |
var t: PGearArray; |
|
1550 |
begin |
|
13403
9c9d29be9e00
make all bullets function similar to machinegun bullets (can hit/shove objects without checkin)
nemo
parents:
13399
diff
changeset
|
1551 |
t:= CheckAllGearsLineCollision(Ammo, oX, oY, tX, tY); |
12898 | 1552 |
AmmoShoveImpl(Ammo, Damage, Power, t); |
1553 |
end; |
|
1554 |
||
1555 |
procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt); |
|
1556 |
begin |
|
1557 |
AmmoShoveImpl(Ammo, Damage, Power, |
|
1558 |
CheckGearsCollision(Ammo)); |
|
1559 |
end; |
|
1560 |
||
14027
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
1561 |
procedure AmmoShoveCache(Ammo: PGear; Damage, Power: LongInt); |
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
1562 |
begin |
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
1563 |
AmmoShoveImpl(Ammo, Damage, Power, |
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
1564 |
CheckCacheCollision(Ammo)); |
105793e575d6
make firepunch hit moving gears (airmines are not amused)
alfadur
parents:
14026
diff
changeset
|
1565 |
end; |
9285 | 1566 |
|
1567 |
function CountGears(Kind: TGearType): Longword; |
|
1568 |
var t: PGear; |
|
1569 |
count: Longword = 0; |
|
1570 |
begin |
|
1571 |
||
1572 |
t:= GearsList; |
|
1573 |
while t <> nil do |
|
1574 |
begin |
|
1575 |
if t^.Kind = Kind then |
|
1576 |
inc(count); |
|
1577 |
t:= t^.NextGear |
|
1578 |
end; |
|
1579 |
CountGears:= count; |
|
1580 |
end; |
|
1581 |
||
1582 |
procedure SetAllToActive; |
|
1583 |
var t: PGear; |
|
1584 |
begin |
|
1585 |
AllInactive:= false; |
|
1586 |
t:= GearsList; |
|
1587 |
while t <> nil do |
|
1588 |
begin |
|
1589 |
t^.Active:= true; |
|
1590 |
t:= t^.NextGear |
|
1591 |
end |
|
1592 |
end; |
|
1593 |
||
15929
128ace913837
Introduce hwengine-future library, use Land allocated in it
unC0Rr
parents:
15926
diff
changeset
|
1594 |
procedure SetAllHHToActive; |
9285 | 1595 |
begin |
1596 |
SetAllHHToActive(true) |
|
1597 |
end; |
|
1598 |
||
1599 |
||
1600 |
procedure SetAllHHToActive(Ice: boolean); |
|
1601 |
var t: PGear; |
|
1602 |
begin |
|
1603 |
AllInactive:= false; |
|
1604 |
t:= GearsList; |
|
1605 |
while t <> nil do |
|
1606 |
begin |
|
1607 |
if (t^.Kind = gtHedgehog) or (t^.Kind = gtExplosives) then |
|
1608 |
begin |
|
1609 |
if (t^.Kind = gtHedgehog) and Ice then CheckIce(t); |
|
1610 |
t^.Active:= true |
|
1611 |
end; |
|
1612 |
t:= t^.NextGear |
|
1613 |
end |
|
1614 |
end; |
|
1615 |
||
1616 |
||
1617 |
var GearsNearArray : TPGearArray; |
|
1618 |
function GearsNear(X, Y: hwFloat; Kind: TGearType; r: LongInt): PGearArrayS; |
|
1619 |
var |
|
1620 |
t: PGear; |
|
1621 |
s: Longword; |
|
12743
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1622 |
xc, xc_left, xc_right, yc: hwFloat; |
9285 | 1623 |
begin |
1624 |
r:= r*r; |
|
1625 |
s:= 0; |
|
1626 |
SetLength(GearsNearArray, s); |
|
1627 |
t := GearsList; |
|
10015 | 1628 |
while t <> nil do |
9285 | 1629 |
begin |
12743
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1630 |
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
|
1631 |
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
|
1632 |
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
|
1633 |
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
|
1634 |
if (t^.Kind = Kind) |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1635 |
and ((xc + yc < int2hwFloat(r)) |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1636 |
or ((WorldEdge = weWrap) and |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1637 |
((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
|
1638 |
(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
|
1639 |
begin |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1640 |
inc(s); |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1641 |
SetLength(GearsNearArray, s); |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1642 |
GearsNearArray[s - 1] := t; |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1643 |
end; |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1644 |
t := t^.NextGear; |
f45ffb4cf1e1
Make GearsNear and CheckGearNear check gears across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
12737
diff
changeset
|
1645 |
end; |
9285 | 1646 |
|
1647 |
GearsNear.size:= s; |
|
1648 |
GearsNear.ar:= @GearsNearArray |
|
1649 |
end; |
|
1650 |
||
14789
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1651 |
function SpawnBoxOfSmth: PGear; |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1652 |
var t, aTot, uTot, a, h: LongInt; |
9285 | 1653 |
i: TAmmoType; |
1654 |
begin |
|
14789
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1655 |
SpawnBoxOfSmth:= nil; |
15241
ceb289e8a582
King Mode: Fix king placement phase not working correctly with multiple teams in a clan
Wuzzy <Wuzzy2@mail.ru>
parents:
15216
diff
changeset
|
1656 |
if (PlacingHogs) or (PlacingKings) or |
9285 | 1657 |
(cCaseFactor = 0) |
13627
605767bbd022
Move max. number of crate spawns into variable
Wuzzy <Wuzzy2@mail.ru>
parents:
13617
diff
changeset
|
1658 |
or (CountGears(gtCase) >= cMaxCaseDrops) |
9285 | 1659 |
or (GetRandom(cCaseFactor) <> 0) then |
1660 |
exit; |
|
1661 |
||
1662 |
FollowGear:= nil; |
|
1663 |
aTot:= 0; |
|
1664 |
uTot:= 0; |
|
1665 |
for i:= Low(TAmmoType) to High(TAmmoType) do |
|
1666 |
if (Ammoz[i].Ammo.Propz and ammoprop_Utility) = 0 then |
|
1667 |
inc(aTot, Ammoz[i].Probability) |
|
1668 |
else |
|
1669 |
inc(uTot, Ammoz[i].Probability); |
|
1670 |
||
1671 |
t:=0; |
|
1672 |
a:=aTot; |
|
1673 |
h:= 1; |
|
1674 |
||
1675 |
if (aTot+uTot) <> 0 then |
|
1676 |
if ((GameFlags and gfInvulnerable) = 0) then |
|
1677 |
begin |
|
1678 |
h:= cHealthCaseProb * 100; |
|
1679 |
t:= GetRandom(10000); |
|
1680 |
a:= (10000-h)*aTot div (aTot+uTot) |
|
1681 |
end |
|
1682 |
else |
|
1683 |
begin |
|
1684 |
t:= GetRandom(aTot+uTot); |
|
1685 |
h:= 0 |
|
1686 |
end; |
|
1687 |
||
1688 |
||
1689 |
if t<h then |
|
1690 |
begin |
|
1691 |
FollowGear:= AddGear(0, 0, gtCase, 0, _0, _0, 0); |
|
14770
533ac9774279
Add key to display extra gear info tags
Wuzzy <Wuzzy2@mail.ru>
parents:
14595
diff
changeset
|
1692 |
FollowGear^.RenderHealth:= true; |
9285 | 1693 |
FollowGear^.Health:= cHealthCaseAmount; |
1694 |
FollowGear^.Pos:= posCaseHealth; |
|
10506 | 1695 |
// health crate is smaller than the other crates |
1696 |
FollowGear^.Radius := cCaseHealthRadius; |
|
13642
3d14950641a4
Refactor text color variable names, export 2 color values to Lua
Wuzzy <Wuzzy2@mail.ru>
parents:
13629
diff
changeset
|
1697 |
AddCaption(GetEventString(eidNewHealthPack), capcolDefault, capgrpAmmoInfo); |
9285 | 1698 |
end |
1699 |
else if (t<a+h) then |
|
1700 |
begin |
|
1701 |
t:= aTot; |
|
1702 |
if (t > 0) then |
|
1703 |
begin |
|
1704 |
FollowGear:= AddGear(0, 0, gtCase, 0, _0, _0, 0); |
|
1705 |
t:= GetRandom(t); |
|
1706 |
i:= Low(TAmmoType); |
|
1707 |
FollowGear^.Pos:= posCaseAmmo; |
|
1708 |
FollowGear^.AmmoType:= i; |
|
13642
3d14950641a4
Refactor text color variable names, export 2 color values to Lua
Wuzzy <Wuzzy2@mail.ru>
parents:
13629
diff
changeset
|
1709 |
AddCaption(GetEventString(eidNewAmmoPack), capcolDefault, capgrpAmmoInfo); |
9285 | 1710 |
end |
1711 |
end |
|
1712 |
else |
|
1713 |
begin |
|
1714 |
t:= uTot; |
|
1715 |
if (t > 0) then |
|
1716 |
begin |
|
1717 |
FollowGear:= AddGear(0, 0, gtCase, 0, _0, _0, 0); |
|
1718 |
t:= GetRandom(t); |
|
1719 |
i:= Low(TAmmoType); |
|
1720 |
FollowGear^.Pos:= posCaseUtility; |
|
1721 |
FollowGear^.AmmoType:= i; |
|
13642
3d14950641a4
Refactor text color variable names, export 2 color values to Lua
Wuzzy <Wuzzy2@mail.ru>
parents:
13629
diff
changeset
|
1722 |
AddCaption(GetEventString(eidNewUtilityPack), capcolDefault, capgrpAmmoInfo); |
9285 | 1723 |
end |
1724 |
end; |
|
1725 |
||
1726 |
// handles case of no ammo or utility crates - considered also placing booleans in uAmmos and altering probabilities |
|
1727 |
if (FollowGear <> nil) then |
|
1728 |
begin |
|
1729 |
FindPlace(FollowGear, true, 0, LAND_WIDTH); |
|
14789
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1730 |
PlayBoxSpawnTaunt(FollowGear); |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1731 |
SpawnBoxOfSmth:= FollowGear; |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1732 |
end |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1733 |
end; |
9285 | 1734 |
|
14789
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1735 |
procedure PlayBoxSpawnTaunt(Gear: PGear); |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1736 |
const |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1737 |
// Max. distance between hog and crate for sndThisOneIsMine taunt |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1738 |
ThisOneIsMineDistance : LongInt = 130; |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1739 |
var d, minD: LongInt; |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1740 |
gi, closestHog: PGear; |
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1741 |
begin |
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1742 |
// Taunt |
14789
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1743 |
if (Gear <> nil) then |
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1744 |
begin |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1745 |
// 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
|
1746 |
gi := GearsList; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1747 |
minD := LAND_WIDTH + ThisOneIsMineDistance + 1; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1748 |
closestHog:= nil; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1749 |
while gi <> nil do |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1750 |
begin |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1751 |
if (gi^.Kind = gtHedgehog) then |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1752 |
begin |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1753 |
// Y axis is ignored to simplify calculations |
14789
185f07ec4d12
New callback: onCaseDrop (called when engine MIGHT drop a crate)
Wuzzy <Wuzzy2@mail.ru>
parents:
14770
diff
changeset
|
1754 |
d := hwRound(hwAbs(gi^.X - Gear^.X)); |
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1755 |
if d < minD then |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1756 |
begin |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1757 |
minD := d; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1758 |
closestHog:= gi; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1759 |
end; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1760 |
end; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1761 |
gi := gi^.NextGear; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1762 |
end; |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1763 |
|
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1764 |
// 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
|
1765 |
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
|
1766 |
// 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
|
1767 |
if random(3) > 0 then |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1768 |
AddVoice(sndThisOneIsMine, closestHog^.Hedgehog^.Team^.voicepack) |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1769 |
else |
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1770 |
AddVoice(sndReinforce, CurrentTeam^.voicepack) |
14035 | 1771 |
else |
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1772 |
// Default crate drop taunt |
14035 | 1773 |
AddVoice(sndReinforce, CurrentTeam^.voicepack); |
14043
e155b300d49f
Only play sndThisOneIsMine if crate drops close to hog
Wuzzy <Wuzzy2@mail.ru>
parents:
14035
diff
changeset
|
1774 |
end; |
9285 | 1775 |
end; |
1776 |
||
1777 |
||
1778 |
function GetAmmo(Hedgehog: PHedgehog): TAmmoType; |
|
1779 |
var t, aTot: LongInt; |
|
1780 |
i: TAmmoType; |
|
1781 |
begin |
|
1782 |
Hedgehog:= Hedgehog; // avoid hint |
|
1783 |
||
1784 |
aTot:= 0; |
|
1785 |
for i:= Low(TAmmoType) to High(TAmmoType) do |
|
1786 |
if (Ammoz[i].Ammo.Propz and ammoprop_Utility) = 0 then |
|
1787 |
inc(aTot, Ammoz[i].Probability); |
|
1788 |
||
1789 |
t:= aTot; |
|
1790 |
i:= Low(TAmmoType); |
|
1791 |
if (t > 0) then |
|
1792 |
begin |
|
1793 |
t:= GetRandom(t); |
|
1794 |
while t >= 0 do |
|
1795 |
begin |
|
1796 |
inc(i); |
|
1797 |
if (Ammoz[i].Ammo.Propz and ammoprop_Utility) = 0 then |
|
1798 |
dec(t, Ammoz[i].Probability) |
|
1799 |
end |
|
1800 |
end; |
|
1801 |
GetAmmo:= i |
|
1802 |
end; |
|
1803 |
||
1804 |
function GetUtility(Hedgehog: PHedgehog): TAmmoType; |
|
1805 |
var t, uTot: LongInt; |
|
1806 |
i: TAmmoType; |
|
1807 |
begin |
|
1808 |
||
1809 |
uTot:= 0; |
|
1810 |
for i:= Low(TAmmoType) to High(TAmmoType) do |
|
1811 |
if ((Ammoz[i].Ammo.Propz and ammoprop_Utility) <> 0) |
|
1812 |
and ((Hedgehog^.Team^.HedgehogsNumber > 1) or (Ammoz[i].Ammo.AmmoType <> amSwitch)) then |
|
1813 |
inc(uTot, Ammoz[i].Probability); |
|
1814 |
||
1815 |
t:= uTot; |
|
1816 |
i:= Low(TAmmoType); |
|
1817 |
if (t > 0) then |
|
1818 |
begin |
|
1819 |
t:= GetRandom(t); |
|
1820 |
while t >= 0 do |
|
1821 |
begin |
|
1822 |
inc(i); |
|
1823 |
if ((Ammoz[i].Ammo.Propz and ammoprop_Utility) <> 0) and ((Hedgehog^.Team^.HedgehogsNumber > 1) |
|
1824 |
or (Ammoz[i].Ammo.AmmoType <> amSwitch)) then |
|
1825 |
dec(t, Ammoz[i].Probability) |
|
1826 |
end |
|
1827 |
end; |
|
1828 |
GetUtility:= i |
|
1829 |
end; |
|
1830 |
||
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1831 |
(* |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1832 |
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
|
1833 |
* Normal - infinite world, do nothing |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1834 |
* 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
|
1835 |
* 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
|
1836 |
* 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
|
1837 |
|
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1838 |
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
|
1839 |
*) |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1840 |
function WorldWrap(var Gear: PGear): boolean; |
14584
ca9c632db2cf
Bounce off gears at bouncy world edge only if they move towards it
Wuzzy <Wuzzy2@mail.ru>
parents:
14555
diff
changeset
|
1841 |
var bounced: boolean; |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1842 |
begin |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1843 |
WorldWrap:= false; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1844 |
if WorldEdge = weNone then exit(false); |
14303
6015b74eea55
overall, using LongInt for leftX/rightX results in fewer casts, since most comparisons are against ints.
nemo
parents:
14224
diff
changeset
|
1845 |
if (hwRound(Gear^.X) < leftX) or |
6015b74eea55
overall, using LongInt for leftX/rightX results in fewer casts, since most comparisons are against ints.
nemo
parents:
14224
diff
changeset
|
1846 |
(hwRound(Gear^.X) > rightX) then |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1847 |
begin |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1848 |
if WorldEdge = weWrap then |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1849 |
begin |
14303
6015b74eea55
overall, using LongInt for leftX/rightX results in fewer casts, since most comparisons are against ints.
nemo
parents:
14224
diff
changeset
|
1850 |
if (hwRound(Gear^.X) < leftX) then |
10160 | 1851 |
Gear^.X:= Gear^.X + int2hwfloat(rightX - leftX) |
1852 |
else Gear^.X:= Gear^.X - int2hwfloat(rightX - leftX); |
|
9557 | 1853 |
LeftImpactTimer:= 150; |
14592
1d3dc553829c
Fix WorldWrap returning sometimes true unjustifiably
Wuzzy <Wuzzy2@mail.ru>
parents:
14584
diff
changeset
|
1854 |
RightImpactTimer:= 150; |
1d3dc553829c
Fix WorldWrap returning sometimes true unjustifiably
Wuzzy <Wuzzy2@mail.ru>
parents:
14584
diff
changeset
|
1855 |
WorldWrap:= true; |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1856 |
end |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1857 |
else if WorldEdge = weBounce then |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1858 |
begin |
14584
ca9c632db2cf
Bounce off gears at bouncy world edge only if they move towards it
Wuzzy <Wuzzy2@mail.ru>
parents:
14555
diff
changeset
|
1859 |
bounced:= false; |
15244
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1860 |
// Bounce left |
15199
d3998dcc076f
weBounce: Fix some weird bouncing behaviour
Wuzzy <Wuzzy2@mail.ru>
parents:
15171
diff
changeset
|
1861 |
if (hwRound(Gear^.X) - Gear^.Radius < leftX) and (((hwSign(Gear^.dX) = -1) and (not isZero(Gear^.dX))) or (Gear^.Kind = gtHedgehog)) then |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1862 |
begin |
9557 | 1863 |
LeftImpactTimer:= 333; |
15244
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1864 |
// Set X coordinate to bounce edge, unless the gear spawned inside the bounce edge before |
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1865 |
if (Gear^.State and gstInBounceEdge) = 0 then |
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1866 |
Gear^.X:= int2hwfloat(leftX + Gear^.Radius); |
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1867 |
// Invert horizontal speed |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1868 |
Gear^.dX.isNegative:= false; |
14584
ca9c632db2cf
Bounce off gears at bouncy world edge only if they move towards it
Wuzzy <Wuzzy2@mail.ru>
parents:
14555
diff
changeset
|
1869 |
bounced:= true; |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1870 |
end |
15244
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1871 |
// Bounce right |
15199
d3998dcc076f
weBounce: Fix some weird bouncing behaviour
Wuzzy <Wuzzy2@mail.ru>
parents:
15171
diff
changeset
|
1872 |
else if (hwRound(Gear^.X) + Gear^.Radius > rightX) and (((hwSign(Gear^.dX) = 1) and (not isZero(Gear^.dX))) or (Gear^.Kind = gtHedgehog)) then |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1873 |
begin |
9557 | 1874 |
RightImpactTimer:= 333; |
15244
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1875 |
// Set X coordinate to bounce edge, unless the gear spawned inside the bounce edge before |
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1876 |
if (Gear^.State and gstInBounceEdge) = 0 then |
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1877 |
Gear^.X:= int2hwfloat(rightX - Gear^.Radius); |
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1878 |
// Invert horizontal speed |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1879 |
Gear^.dX.isNegative:= true; |
14584
ca9c632db2cf
Bounce off gears at bouncy world edge only if they move towards it
Wuzzy <Wuzzy2@mail.ru>
parents:
14555
diff
changeset
|
1880 |
bounced:= true; |
9557 | 1881 |
end; |
15244
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1882 |
// Clear gstInBounceEdge when gear is no longer inside a bounce edge area |
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1883 |
if ((Gear^.State and gstInBounceEdge) <> 0) and (hwRound(Gear^.X) - Gear^.Radius >= leftX) and (hwRound(Gear^.X) + Gear^.Radius <= rightX) then |
32678e65b25e
Bounce world edge: Fix buggy gear behaviour if gear spawned inside bounce edge area
Wuzzy <Wuzzy2@mail.ru>
parents:
15241
diff
changeset
|
1884 |
Gear^.State:= Gear^.State and (not gstInBounceEdge); |
14592
1d3dc553829c
Fix WorldWrap returning sometimes true unjustifiably
Wuzzy <Wuzzy2@mail.ru>
parents:
14584
diff
changeset
|
1885 |
if (bounced) then |
1d3dc553829c
Fix WorldWrap returning sometimes true unjustifiably
Wuzzy <Wuzzy2@mail.ru>
parents:
14584
diff
changeset
|
1886 |
begin |
1d3dc553829c
Fix WorldWrap returning sometimes true unjustifiably
Wuzzy <Wuzzy2@mail.ru>
parents:
14584
diff
changeset
|
1887 |
WorldWrap:= true; |
14595
6e5cda26f676
Tweak bounce effects of some gears
Wuzzy <Wuzzy2@mail.ru>
parents:
14593
diff
changeset
|
1888 |
if (Gear^.dX.QWordValue > _0_001.QWordValue) then |
14592
1d3dc553829c
Fix WorldWrap returning sometimes true unjustifiably
Wuzzy <Wuzzy2@mail.ru>
parents:
14584
diff
changeset
|
1889 |
AddBounceEffectForGear(Gear); |
1d3dc553829c
Fix WorldWrap returning sometimes true unjustifiably
Wuzzy <Wuzzy2@mail.ru>
parents:
14584
diff
changeset
|
1890 |
end; |
1d3dc553829c
Fix WorldWrap returning sometimes true unjustifiably
Wuzzy <Wuzzy2@mail.ru>
parents:
14584
diff
changeset
|
1891 |
end |
1d3dc553829c
Fix WorldWrap returning sometimes true unjustifiably
Wuzzy <Wuzzy2@mail.ru>
parents:
14584
diff
changeset
|
1892 |
else |
1d3dc553829c
Fix WorldWrap returning sometimes true unjustifiably
Wuzzy <Wuzzy2@mail.ru>
parents:
14584
diff
changeset
|
1893 |
WorldWrap:= true; |
9473
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1894 |
end; |
a51a69094c24
partial implementation of non-infinite world (edge wrap/warp/bounce)
nemo
parents:
9285
diff
changeset
|
1895 |
end; |
9285 | 1896 |
|
14535
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1897 |
(* |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1898 |
Applies wrap-around logic for the target of homing gears. |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1899 |
|
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1900 |
In wrap-around world edge, the shortest way may to the target might |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1901 |
be across the border, so the X value of the target would lead the |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1902 |
gear to the wrong direction across the whole map. This procedure |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1903 |
changes the target X in this case. |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1904 |
This function must be called after the gear passed through |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1905 |
the wrap-around world edge (WorldWrap returned true). |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1906 |
|
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1907 |
No-op for other world edges. |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1908 |
|
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1909 |
Returns true if target has been changed. |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1910 |
*) |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1911 |
function HomingWrap(var Gear: PGear): boolean; |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1912 |
var dist_center, dist_right, dist_left: hwFloat; |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1913 |
begin |
15775 | 1914 |
HomingWrap:= false; |
1915 |
||
14535
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1916 |
if WorldEdge = weWrap then |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1917 |
begin |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1918 |
// We just check the same target 3 times: |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1919 |
// 1) in current section (no change) |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1920 |
// 2) clone in the right section |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1921 |
// 3) clone in the left section |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1922 |
// The gear will go for the target with the shortest distance to the gear. |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1923 |
// For simplicity, we only check distance on the X axis. |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1924 |
dist_center:= hwAbs(Gear^.X - int2hwFloat(Gear^.Target.X)); |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1925 |
dist_right:= hwAbs(Gear^.X - int2hwFloat(Gear^.Target.X + (RightX-LeftX))); |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1926 |
dist_left:= hwAbs(Gear^.X - int2hwFloat(Gear^.Target.X - (RightX-LeftX))); |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1927 |
if (dist_left < dist_right) and (dist_left < dist_center) then |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1928 |
begin |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1929 |
dec(Gear^.Target.X, RightX-LeftX); |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1930 |
HomingWrap:= true; |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1931 |
end |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1932 |
else if (dist_right < dist_left) and (dist_right < dist_center) then |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1933 |
begin |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1934 |
inc(Gear^.Target.X, RightX-LeftX); |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1935 |
HomingWrap:= true; |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1936 |
end; |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1937 |
end; |
5ac181cb2396
Fix bee targeting fail across wrap world edge
Wuzzy <Wuzzy2@mail.ru>
parents:
14358
diff
changeset
|
1938 |
end; |
13609
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1939 |
|
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1940 |
// 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
|
1941 |
// Graphical effect is based on speed. |
10508 | 1942 |
procedure AddBounceEffectForGear(Gear: PGear); |
13609
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1943 |
begin |
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1944 |
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
|
1945 |
end; |
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1946 |
|
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1947 |
// 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
|
1948 |
procedure AddBounceEffectForGear(Gear: PGear; imageScale: Single); |
10508 | 1949 |
var boing: PVisualGear; |
1950 |
begin |
|
14595
6e5cda26f676
Tweak bounce effects of some gears
Wuzzy <Wuzzy2@mail.ru>
parents:
14593
diff
changeset
|
1951 |
if (Gear^.Density < _0_01) or (Gear^.Radius < 2) then |
13572
a71e6856ffab
Fix freeze ray not working through wrap world edge; add DrawLineWrapped
Wuzzy <Wuzzy2@mail.ru>
parents:
13568
diff
changeset
|
1952 |
exit; |
10508 | 1953 |
boing:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot, 0, false, 1); |
1954 |
if boing <> nil then |
|
1955 |
with boing^ do |
|
1956 |
begin |
|
1957 |
Angle:= random(360); |
|
1958 |
dx:= 0; |
|
1959 |
dy:= 0; |
|
1960 |
FrameTicks:= 200; |
|
13609
13f68f3e7153
Add bounce effect to cake when it touches bounce edge
Wuzzy <Wuzzy2@mail.ru>
parents:
13604
diff
changeset
|
1961 |
Scale:= imageScale; |
10508 | 1962 |
State:= ord(sprBoing) |
1963 |
end; |
|
13872
f01798038c2e
Rename amDuck and related symbols to amCreeper, gtCreeper, etc.
Wuzzy <Wuzzy2@mail.ru>
parents:
13807
diff
changeset
|
1964 |
PlaySound(sndMelonImpact, true) |
10508 | 1965 |
end; |
1966 |
||
15015
d9de740e194c
Add utility function to get hog left/right looking dir
Wuzzy <Wuzzy2@mail.ru>
parents:
14947
diff
changeset
|
1967 |
function IsHogFacingLeft(Gear: PGear): boolean; |
d9de740e194c
Add utility function to get hog left/right looking dir
Wuzzy <Wuzzy2@mail.ru>
parents:
14947
diff
changeset
|
1968 |
var sign: LongInt; |
d9de740e194c
Add utility function to get hog left/right looking dir
Wuzzy <Wuzzy2@mail.ru>
parents:
14947
diff
changeset
|
1969 |
begin |
d9de740e194c
Add utility function to get hog left/right looking dir
Wuzzy <Wuzzy2@mail.ru>
parents:
14947
diff
changeset
|
1970 |
sign:= hwSign(Gear^.dX); |
15167
6b7d92fa4912
Keep hog facing direction while on parachute
Wuzzy <Wuzzy2@mail.ru>
parents:
15073
diff
changeset
|
1971 |
if (CurAmmoGear <> nil) and (CurAmmoGear^.Kind = gtParachute) then |
6b7d92fa4912
Keep hog facing direction while on parachute
Wuzzy <Wuzzy2@mail.ru>
parents:
15073
diff
changeset
|
1972 |
IsHogFacingLeft:= CurAmmoGear^.Tag = -1 |
6b7d92fa4912
Keep hog facing direction while on parachute
Wuzzy <Wuzzy2@mail.ru>
parents:
15073
diff
changeset
|
1973 |
else if ((Gear^.State and gstHHHJump) <> 0) and (Gear^.Hedgehog^.Effects[heArtillery] = 0) then |
15015
d9de740e194c
Add utility function to get hog left/right looking dir
Wuzzy <Wuzzy2@mail.ru>
parents:
14947
diff
changeset
|
1974 |
IsHogFacingLeft:= sign > 0 |
d9de740e194c
Add utility function to get hog left/right looking dir
Wuzzy <Wuzzy2@mail.ru>
parents:
14947
diff
changeset
|
1975 |
else |
d9de740e194c
Add utility function to get hog left/right looking dir
Wuzzy <Wuzzy2@mail.ru>
parents:
14947
diff
changeset
|
1976 |
IsHogFacingLeft:= sign < 0; |
d9de740e194c
Add utility function to get hog left/right looking dir
Wuzzy <Wuzzy2@mail.ru>
parents:
14947
diff
changeset
|
1977 |
end; |
d9de740e194c
Add utility function to get hog left/right looking dir
Wuzzy <Wuzzy2@mail.ru>
parents:
14947
diff
changeset
|
1978 |
|
11847 | 1979 |
function IsHogLocal(HH: PHedgehog): boolean; |
1980 |
begin |
|
15073
1a754860b0e5
Refactor definition of "local" clans
Wuzzy <Wuzzy2@mail.ru>
parents:
15015
diff
changeset
|
1981 |
IsHogLocal:= (not (HH^.Team^.ExtDriven or (HH^.BotLevel > 0))) or (HH^.Team^.Clan^.LocalOrAlly) or (GameType = gmtDemo); |
11847 | 1982 |
end; |
1983 |
||
6581 | 1984 |
end. |