author | alfadur |
Tue, 13 Feb 2024 00:58:17 +0300 | |
changeset 16018 | fb389df02e3e |
parent 15762 | 0a172cfe8840 |
child 16043 | e66feb918d71 |
permissions | -rw-r--r-- |
4 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
11046 | 3 |
* Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com> |
4 | 4 |
* |
183 | 5 |
* This program is free software; you can redistribute it and/or modify |
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
4 | 8 |
* |
183 | 9 |
* This program is distributed in the hope that it will be useful, |
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
4 | 13 |
* |
183 | 14 |
* You should have received a copy of the GNU General Public License |
15 |
* along with this program; if not, write to the Free Software |
|
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:
10098
diff
changeset
|
16 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
4 | 17 |
*) |
18 |
||
2630 | 19 |
{$INCLUDE "options.inc"} |
20 |
||
4 | 21 |
unit uAI; |
22 |
interface |
|
351 | 23 |
uses uFloat; |
2630 | 24 |
|
3038 | 25 |
procedure initModule; |
26 |
procedure freeModule; |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
27 |
|
433 | 28 |
procedure ProcessBot; |
64 | 29 |
procedure FreeActionsList; |
4 | 30 |
|
31 |
implementation |
|
4377 | 32 |
uses uConsts, SDLh, uAIMisc, uAIAmmoTests, uAIActions, |
11825 | 33 |
uAmmos, uTypes, |
12712
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12710
diff
changeset
|
34 |
uVariables, uCommands, uUtils, uDebug, uAILandMarks, |
31f7e0a31736
AI player checks if it can use tardis before selecting it
Wuzzy <almikes@aol.com>
parents:
12710
diff
changeset
|
35 |
uGearsUtils; |
4 | 36 |
|
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
37 |
var BestActions: TActions; |
509 | 38 |
CanUseAmmo: array [TAmmoType] of boolean; |
433 | 39 |
StopThinking: boolean; |
7028 | 40 |
StartTicks: Longword; |
15386 | 41 |
ThreadSem: PSDL_Sem; |
599 | 42 |
|
369 | 43 |
procedure FreeActionsList; |
64 | 44 |
begin |
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
45 |
AddFileLog('FreeActionsList called'); |
15386 | 46 |
|
47 |
StopThinking:= true; |
|
48 |
SDL_SemWait(ThreadSem); |
|
49 |
SDL_SemPost(ThreadSem); |
|
434 | 50 |
|
11538 | 51 |
if CurrentHedgehog <> nil then |
52 |
with CurrentHedgehog^ do |
|
53 |
if Gear <> nil then |
|
54 |
if BotLevel <> 0 then |
|
55 |
StopMessages(Gear^.Message); |
|
740 | 56 |
|
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
57 |
BestActions.Count:= 0; |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
58 |
BestActions.Pos:= 0 |
369 | 59 |
end; |
60 |
||
6392 | 61 |
|
62 |
const cBranchStackSize = 12; |
|
63 |
type TStackEntry = record |
|
64 |
MadeActions: TActions; |
|
65 |
Hedgehog: TGear; |
|
66 |
end; |
|
67 |
||
68 |
var Stack: record |
|
69 |
Count: Longword; |
|
70 |
States: array[0..Pred(cBranchStackSize)] of TStackEntry; |
|
71 |
end; |
|
72 |
||
14528 | 73 |
function Push(const Actions: TActions; const Me: TGear; Dir: integer): boolean; |
6392 | 74 |
var bRes: boolean; |
75 |
begin |
|
76 |
bRes:= (Stack.Count < cBranchStackSize) and (Actions.Count < MAXACTIONS - 5); |
|
77 |
if bRes then |
|
78 |
with Stack.States[Stack.Count] do |
|
79 |
begin |
|
80 |
MadeActions:= Actions; |
|
81 |
Hedgehog:= Me; |
|
82 |
Hedgehog.Message:= Dir; |
|
83 |
inc(Stack.Count) |
|
84 |
end; |
|
85 |
Push:= bRes |
|
86 |
end; |
|
87 |
||
14528 | 88 |
procedure Pop(var Actions: TActions; var Me: TGear); |
6392 | 89 |
begin |
90 |
dec(Stack.Count); |
|
91 |
with Stack.States[Stack.Count] do |
|
92 |
begin |
|
93 |
Actions:= MadeActions; |
|
94 |
Me:= Hedgehog |
|
95 |
end |
|
96 |
end; |
|
97 |
||
98 |
||
99 |
||
7789
838d2e06c377
Check cake and air attack again if walked far from initial position (not tested)
unc0rr
parents:
7787
diff
changeset
|
100 |
procedure TestAmmos(var Actions: TActions; Me: PGear; rareChecks: boolean); |
3407 | 101 |
var BotLevel: Byte; |
543
465e2ec8f05f
- Better randomness of placing hedgehogs on the land
unc0rr
parents:
542
diff
changeset
|
102 |
ap: TAttackParams; |
15713 | 103 |
Score, i, l, t, n, dAngle: LongInt; |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
104 |
a, aa: TAmmoType; |
15713 | 105 |
useThisActions, hasLowGrav: boolean; |
4 | 106 |
begin |
4372 | 107 |
BotLevel:= Me^.Hedgehog^.BotLevel; |
15711
975232e840c7
Rename windSpeed variable to aiWindSpeed
Wuzzy <Wuzzy2@mail.ru>
parents:
15710
diff
changeset
|
108 |
aiWindSpeed:= hwFloat2Float(cWindSpeed); |
15658 | 109 |
aiLaserSighting:= (cLaserSighting) or (HHHasAmmo(Me^.Hedgehog^, amLaserSight) > 0); |
15714
e55c4bad720a
AI: Reset remembered gravity on Think and TestAmmos
Wuzzy <Wuzzy2@mail.ru>
parents:
15713
diff
changeset
|
110 |
aiGravity:= cGravity; |
e55c4bad720a
AI: Reset remembered gravity on Think and TestAmmos
Wuzzy <Wuzzy2@mail.ru>
parents:
15713
diff
changeset
|
111 |
aiGravityf:= cGravityf; |
15762
0a172cfe8840
AI: Don't sacrifice final hog with kami or piano
Wuzzy <Wuzzy2@mail.ru>
parents:
15761
diff
changeset
|
112 |
aiHogsInTeam:= CountHogsInTeam(Me, true); |
15713 | 113 |
hasLowGrav:= HHHasAmmo(Me^.Hedgehog^, amLowGravity) > 0; |
10098
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
114 |
useThisActions:= false; |
15466
6031c0cfec89
Make sure AI doesn't skip after collecting ammo. Fixes bug 796
Wuzzy <Wuzzy2@mail.ru>
parents:
15386
diff
changeset
|
115 |
Me^.AIHints:= Me^.AIHints and (not aihAmmosChanged); |
433 | 116 |
|
15713 | 117 |
for l:= 0 to 1 do // 0 = test with normal gravity. 1 = test with low gravity |
118 |
if (l = 0) or ((hasLowGrav) and (not cLowGravity)) then |
|
119 |
begin |
|
120 |
// simulate normal or low gravity |
|
121 |
if (l = 0) then |
|
122 |
begin |
|
123 |
aiGravity:= cGravity; |
|
124 |
aiGravityf:= cGravityf; |
|
125 |
end |
|
126 |
else if (l = 1) then |
|
127 |
begin |
|
128 |
// We calculate the values to better support scripts like Gravity. |
|
129 |
// This might have a slight inaccuracy, but none have been spotted in testing. |
|
130 |
aiGravity:= cGravity / _2; |
|
131 |
aiGravityf:= cGravityf / 2; |
|
132 |
end; |
|
64 | 133 |
for i:= 0 to Pred(Targets.Count) do |
509 | 134 |
if (Targets.ar[i].Score >= 0) and (not StopThinking) then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
135 |
begin |
6748 | 136 |
with Me^.Hedgehog^ do |
3836
833c0f32e326
Change all use of curslot/idx to CurAmmoType to try and avoid some bugs with use of last weapon.
nemo
parents:
3617
diff
changeset
|
137 |
a:= CurAmmoType; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
138 |
aa:= a; |
8865 | 139 |
SDL_delay(0); // hint to let the context switch run |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
140 |
repeat |
8865 | 141 |
if (CanUseAmmo[a]) |
142 |
and ((not rareChecks) or ((AmmoTests[a].flags and amtest_Rare) = 0)) |
|
143 |
and ((i = 0) or ((AmmoTests[a].flags and amtest_NoTarget) = 0)) |
|
15713 | 144 |
and ((l = 0) or ((AmmoTests[a].flags and amtest_NoLowGravity) = 0)) |
7178
c61cfc9eb29d
Don't make unnecessary calls to TestWhip, TestFirePunch, TestBaseballBat and TestHammer functions as they have no need to take Targ parameter into account and thus may only be called once per position
unc0rr
parents:
7164
diff
changeset
|
145 |
then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
146 |
begin |
3407 | 147 |
{$HINTS OFF} |
15546
fbcee515b946
disable fall tracing for cheese. it will probably be incorrect.
nemo
parents:
15466
diff
changeset
|
148 |
Score:= AmmoTests[a].proc(Me, Targets.ar[i], BotLevel, ap, AmmoTests[a].flags); |
3407 | 149 |
{$HINTS ON} |
10098
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
150 |
if (Score > BadTurn) and (Actions.Score + Score > BestActions.Score) then |
9003
896c6b21c87f
Best level AI should maximize the score at all costs.
unc0rr
parents:
8965
diff
changeset
|
151 |
if (BestActions.Score < 0) or (Actions.Score + Score > BestActions.Score + Byte(BotLevel - 1) * 2048) then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
152 |
begin |
10510 | 153 |
if useThisActions then |
10098
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
154 |
begin |
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
155 |
BestActions.Count:= Actions.Count |
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
156 |
end |
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
157 |
else |
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
158 |
begin |
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
159 |
BestActions:= Actions; |
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
160 |
BestActions.isWalkingToABetterPlace:= false; |
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
161 |
useThisActions:= true |
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
162 |
end; |
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
163 |
|
f00dee04b5d7
- Cut actions array instead of performing full copy, when it is possible
unc0rr
parents:
10084
diff
changeset
|
164 |
BestActions.Score:= Actions.Score + Score; |
194 | 165 |
|
15658 | 166 |
// if not between shots, activate invulnerability/vampirism/etc. if available |
10231
b2a68e75e55c
Don't activate invulnerability/vampirism between shots of multiattack weapon
unc0rr
parents:
10164
diff
changeset
|
167 |
if CurrentHedgehog^.MultiShootAttacks = 0 then |
10084
83156a03e574
AI always activates invulnerability and extra damage if it has them
unc0rr
parents:
10015
diff
changeset
|
168 |
begin |
15658 | 169 |
if (not cLaserSighting) and (HHHasAmmo(Me^.Hedgehog^, amLaserSight) > 0) and ((AmmoTests[a].flags and amtest_LaserSight) <> 0) then |
170 |
begin |
|
171 |
AddAction(BestActions, aia_Weapon, Longword(amLaserSight), 80, 0, 0); |
|
172 |
AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); |
|
173 |
AddAction(BestActions, aia_attack, aim_release, 10, 0, 0); |
|
174 |
end; |
|
15659
fd1a580a35d6
AI: Don't use vamp/invuln for kamikaze, piano and other weapons
Wuzzy <Wuzzy2@mail.ru>
parents:
15658
diff
changeset
|
175 |
if ((AmmoTests[a].flags and amtest_NoInvulnerable) = 0) and |
fd1a580a35d6
AI: Don't use vamp/invuln for kamikaze, piano and other weapons
Wuzzy <Wuzzy2@mail.ru>
parents:
15658
diff
changeset
|
176 |
(HHHasAmmo(Me^.Hedgehog^, amInvulnerable) > 0) and (Me^.Hedgehog^.Effects[heInvulnerable] = 0) then |
10231
b2a68e75e55c
Don't activate invulnerability/vampirism between shots of multiattack weapon
unc0rr
parents:
10164
diff
changeset
|
177 |
begin |
b2a68e75e55c
Don't activate invulnerability/vampirism between shots of multiattack weapon
unc0rr
parents:
10164
diff
changeset
|
178 |
AddAction(BestActions, aia_Weapon, Longword(amInvulnerable), 80, 0, 0); |
b2a68e75e55c
Don't activate invulnerability/vampirism between shots of multiattack weapon
unc0rr
parents:
10164
diff
changeset
|
179 |
AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); |
b2a68e75e55c
Don't activate invulnerability/vampirism between shots of multiattack weapon
unc0rr
parents:
10164
diff
changeset
|
180 |
AddAction(BestActions, aia_attack, aim_release, 10, 0, 0); |
b2a68e75e55c
Don't activate invulnerability/vampirism between shots of multiattack weapon
unc0rr
parents:
10164
diff
changeset
|
181 |
end; |
15713 | 182 |
if (l = 1) and (hasLowGrav) then |
183 |
begin |
|
184 |
AddAction(BestActions, aia_Weapon, Longword(amLowGravity), 80, 0, 0); |
|
185 |
AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); |
|
186 |
AddAction(BestActions, aia_attack, aim_release, 10, 0, 0); |
|
187 |
end; |
|
12709
8673892ebf24
AI doesn't use extra damage/vampirism/invulnerable again if already active
Wuzzy <almikes@aol.com>
parents:
11825
diff
changeset
|
188 |
if (HHHasAmmo(Me^.Hedgehog^, amExtraDamage) > 0) and (cDamageModifier <> _1_5) then |
10231
b2a68e75e55c
Don't activate invulnerability/vampirism between shots of multiattack weapon
unc0rr
parents:
10164
diff
changeset
|
189 |
begin |
b2a68e75e55c
Don't activate invulnerability/vampirism between shots of multiattack weapon
unc0rr
parents:
10164
diff
changeset
|
190 |
AddAction(BestActions, aia_Weapon, Longword(amExtraDamage), 80, 0, 0); |
b2a68e75e55c
Don't activate invulnerability/vampirism between shots of multiattack weapon
unc0rr
parents:
10164
diff
changeset
|
191 |
AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); |
b2a68e75e55c
Don't activate invulnerability/vampirism between shots of multiattack weapon
unc0rr
parents:
10164
diff
changeset
|
192 |
AddAction(BestActions, aia_attack, aim_release, 10, 0, 0); |
10510 | 193 |
end; |
15659
fd1a580a35d6
AI: Don't use vamp/invuln for kamikaze, piano and other weapons
Wuzzy <Wuzzy2@mail.ru>
parents:
15658
diff
changeset
|
194 |
if (not cVampiric) and ((AmmoTests[a].flags and amtest_NoVampiric) = 0) and |
fd1a580a35d6
AI: Don't use vamp/invuln for kamikaze, piano and other weapons
Wuzzy <Wuzzy2@mail.ru>
parents:
15658
diff
changeset
|
195 |
(HHHasAmmo(Me^.Hedgehog^, amVampiric) > 0) then |
11608 | 196 |
begin |
197 |
AddAction(BestActions, aia_Weapon, Longword(amVampiric), 80, 0, 0); |
|
198 |
AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); |
|
199 |
AddAction(BestActions, aia_attack, aim_release, 10, 0, 0); |
|
200 |
end; |
|
10084
83156a03e574
AI always activates invulnerability and extra damage if it has them
unc0rr
parents:
10015
diff
changeset
|
201 |
end; |
194 | 202 |
|
7132 | 203 |
if (ap.Angle > 0) then |
204 |
AddAction(BestActions, aia_LookRight, 0, 200, 0, 0) |
|
205 |
else if (ap.Angle < 0) then |
|
206 |
AddAction(BestActions, aia_LookLeft, 0, 200, 0, 0); |
|
8865 | 207 |
|
15761
94f4d0a96143
Prevent AI from getting stuck in attempt to look in another direction after choosing bee weapon
unC0Rr
parents:
15729
diff
changeset
|
208 |
AddAction(BestActions, aia_Weapon, Longword(a), 300 + random(400), 0, 0); |
94f4d0a96143
Prevent AI from getting stuck in attempt to look in another direction after choosing bee weapon
unC0Rr
parents:
15729
diff
changeset
|
209 |
|
7790 | 210 |
if (Ammoz[a].Ammo.Propz and ammoprop_Timerable) <> 0 then |
7132 | 211 |
AddAction(BestActions, aia_Timer, ap.Time div 1000, 400, 0, 0); |
8865 | 212 |
|
15625 | 213 |
if ((Ammoz[a].Ammo.Propz and ammoprop_SetBounce) > 0) and (ap.Bounce > 0) then |
15624
30ad3fd974f1
Teach AI to set minimum mine bounce for improved aiming
Wuzzy <Wuzzy2@mail.ru>
parents:
15622
diff
changeset
|
214 |
begin |
30ad3fd974f1
Teach AI to set minimum mine bounce for improved aiming
Wuzzy <Wuzzy2@mail.ru>
parents:
15622
diff
changeset
|
215 |
AddAction(BestActions, aia_Precise, aim_push, 10, 0, 0); |
15625 | 216 |
AddAction(BestActions, aia_Timer, ap.Bounce, 200, 0, 0); |
15624
30ad3fd974f1
Teach AI to set minimum mine bounce for improved aiming
Wuzzy <Wuzzy2@mail.ru>
parents:
15622
diff
changeset
|
217 |
AddAction(BestActions, aia_Precise, aim_release, 10, 0, 0); |
30ad3fd974f1
Teach AI to set minimum mine bounce for improved aiming
Wuzzy <Wuzzy2@mail.ru>
parents:
15622
diff
changeset
|
218 |
end; |
30ad3fd974f1
Teach AI to set minimum mine bounce for improved aiming
Wuzzy <Wuzzy2@mail.ru>
parents:
15622
diff
changeset
|
219 |
|
15626 | 220 |
if (Ammoz[a].Ammo.Propz and ammoprop_NeedTarget) <> 0 then |
221 |
begin |
|
222 |
AddAction(BestActions, aia_Put, 0, 8, ap.AttackPutX, ap.AttackPutY) |
|
223 |
end; |
|
224 |
||
7132 | 225 |
if (Ammoz[a].Ammo.Propz and ammoprop_NoCrosshair) = 0 then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
226 |
begin |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
227 |
dAngle:= LongInt(Me^.Angle) - Abs(ap.Angle); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
228 |
if dAngle > 0 then |
7132 | 229 |
begin |
230 |
AddAction(BestActions, aia_Up, aim_push, 300 + random(250), 0, 0); |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
231 |
AddAction(BestActions, aia_Up, aim_release, dAngle, 0, 0) |
7132 | 232 |
end |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
233 |
else if dAngle < 0 then |
7132 | 234 |
begin |
235 |
AddAction(BestActions, aia_Down, aim_push, 300 + random(250), 0, 0); |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
236 |
AddAction(BestActions, aia_Down, aim_release, -dAngle, 0, 0) |
7132 | 237 |
end |
238 |
end; |
|
8865 | 239 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
240 |
if (Ammoz[a].Ammo.Propz and ammoprop_OscAim) <> 0 then |
7132 | 241 |
begin |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
242 |
AddAction(BestActions, aia_attack, aim_push, 350 + random(200), 0, 0); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
243 |
AddAction(BestActions, aia_attack, aim_release, 1, 0, 0); |
8865 | 244 |
|
7453 | 245 |
if abs(ap.Angle) > 32 then |
7450 | 246 |
begin |
247 |
AddAction(BestActions, aia_Down, aim_push, 100 + random(150), 0, 0); |
|
248 |
AddAction(BestActions, aia_Down, aim_release, 32, 0, 0); |
|
249 |
end; |
|
8865 | 250 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
251 |
AddAction(BestActions, aia_waitAngle, ap.Angle, 250, 0, 0); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
252 |
AddAction(BestActions, aia_attack, aim_push, 1, 0, 0); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
253 |
AddAction(BestActions, aia_attack, aim_release, 1, 0, 0); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
254 |
end else |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
255 |
if (Ammoz[a].Ammo.Propz and ammoprop_AttackingPut) = 0 then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
256 |
begin |
9495
2fc346fadae3
- AI quickly shoots with desert eagle till hits the target
unc0rr
parents:
9317
diff
changeset
|
257 |
if (AmmoTests[a].flags and amtest_MultipleAttacks) = 0 then |
2fc346fadae3
- AI quickly shoots with desert eagle till hits the target
unc0rr
parents:
9317
diff
changeset
|
258 |
n:= 1 else n:= ap.AttacksNum; |
2fc346fadae3
- AI quickly shoots with desert eagle till hits the target
unc0rr
parents:
9317
diff
changeset
|
259 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
260 |
AddAction(BestActions, aia_attack, aim_push, 650 + random(300), 0, 0); |
15708
034955e721a1
AI: Teach how to use resurrector fast
Wuzzy <Wuzzy2@mail.ru>
parents:
15703
diff
changeset
|
261 |
if (a = amResurrector) and (BotLevel < 4) then |
034955e721a1
AI: Teach how to use resurrector fast
Wuzzy <Wuzzy2@mail.ru>
parents:
15703
diff
changeset
|
262 |
AddAction(BestActions, aia_Up, aim_push, 1, 0, 0); |
9495
2fc346fadae3
- AI quickly shoots with desert eagle till hits the target
unc0rr
parents:
9317
diff
changeset
|
263 |
for t:= 2 to n do |
2fc346fadae3
- AI quickly shoots with desert eagle till hits the target
unc0rr
parents:
9317
diff
changeset
|
264 |
begin |
2fc346fadae3
- AI quickly shoots with desert eagle till hits the target
unc0rr
parents:
9317
diff
changeset
|
265 |
AddAction(BestActions, aia_attack, aim_push, 150, 0, 0); |
2fc346fadae3
- AI quickly shoots with desert eagle till hits the target
unc0rr
parents:
9317
diff
changeset
|
266 |
AddAction(BestActions, aia_attack, aim_release, ap.Power, 0, 0); |
2fc346fadae3
- AI quickly shoots with desert eagle till hits the target
unc0rr
parents:
9317
diff
changeset
|
267 |
end; |
15708
034955e721a1
AI: Teach how to use resurrector fast
Wuzzy <Wuzzy2@mail.ru>
parents:
15703
diff
changeset
|
268 |
if (a = amResurrector) and (BotLevel < 4) then |
15729
26c6e5325075
Fix AI sometimes using up all health in resurrector
Wuzzy <Wuzzy2@mail.ru>
parents:
15714
diff
changeset
|
269 |
begin |
15708
034955e721a1
AI: Teach how to use resurrector fast
Wuzzy <Wuzzy2@mail.ru>
parents:
15703
diff
changeset
|
270 |
AddAction(BestActions, aia_Up, aim_release, ap.Power, 0, 0); |
15729
26c6e5325075
Fix AI sometimes using up all health in resurrector
Wuzzy <Wuzzy2@mail.ru>
parents:
15714
diff
changeset
|
271 |
AddAction(BestActions, aia_attack, aim_release, 0, 0, 0); |
26c6e5325075
Fix AI sometimes using up all health in resurrector
Wuzzy <Wuzzy2@mail.ru>
parents:
15714
diff
changeset
|
272 |
end |
26c6e5325075
Fix AI sometimes using up all health in resurrector
Wuzzy <Wuzzy2@mail.ru>
parents:
15714
diff
changeset
|
273 |
else |
26c6e5325075
Fix AI sometimes using up all health in resurrector
Wuzzy <Wuzzy2@mail.ru>
parents:
15714
diff
changeset
|
274 |
AddAction(BestActions, aia_attack, aim_release, ap.Power, 0, 0); |
15710
31ca6451056a
AI: 0.01% chance to use kamikaze with "wishes" ;-)
Wuzzy <Wuzzy2@mail.ru>
parents:
15708
diff
changeset
|
275 |
|
31ca6451056a
AI: 0.01% chance to use kamikaze with "wishes" ;-)
Wuzzy <Wuzzy2@mail.ru>
parents:
15708
diff
changeset
|
276 |
// Just for fun: 0.01% chance for kamikaze with "wishes" ;-) |
31ca6451056a
AI: 0.01% chance to use kamikaze with "wishes" ;-)
Wuzzy <Wuzzy2@mail.ru>
parents:
15708
diff
changeset
|
277 |
if (a = amKamikaze) and (random(10000) = 0) then |
31ca6451056a
AI: 0.01% chance to use kamikaze with "wishes" ;-)
Wuzzy <Wuzzy2@mail.ru>
parents:
15708
diff
changeset
|
278 |
begin |
31ca6451056a
AI: 0.01% chance to use kamikaze with "wishes" ;-)
Wuzzy <Wuzzy2@mail.ru>
parents:
15708
diff
changeset
|
279 |
AddAction(BestActions, aia_Switch, 0, 1, 0, 0); |
31ca6451056a
AI: 0.01% chance to use kamikaze with "wishes" ;-)
Wuzzy <Wuzzy2@mail.ru>
parents:
15708
diff
changeset
|
280 |
AddAction(BestActions, aia_Precise, aim_push, 1, 0, 0); |
31ca6451056a
AI: 0.01% chance to use kamikaze with "wishes" ;-)
Wuzzy <Wuzzy2@mail.ru>
parents:
15708
diff
changeset
|
281 |
AddAction(BestActions, aia_Precise, aim_release, 5000, 0, 0); |
31ca6451056a
AI: 0.01% chance to use kamikaze with "wishes" ;-)
Wuzzy <Wuzzy2@mail.ru>
parents:
15708
diff
changeset
|
282 |
end; |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
283 |
end; |
7416
2f2f78fc65a3
AI uses cake! Known issues: AI could damage itself for no reason, could let cake go looping in a hole with exit closed by AI hog.
unc0rr
parents:
7375
diff
changeset
|
284 |
|
2f2f78fc65a3
AI uses cake! Known issues: AI could damage itself for no reason, could let cake go looping in a hole with exit closed by AI hog.
unc0rr
parents:
7375
diff
changeset
|
285 |
if (Ammoz[a].Ammo.Propz and ammoprop_Track) <> 0 then |
2f2f78fc65a3
AI uses cake! Known issues: AI could damage itself for no reason, could let cake go looping in a hole with exit closed by AI hog.
unc0rr
parents:
7375
diff
changeset
|
286 |
begin |
2f2f78fc65a3
AI uses cake! Known issues: AI could damage itself for no reason, could let cake go looping in a hole with exit closed by AI hog.
unc0rr
parents:
7375
diff
changeset
|
287 |
AddAction(BestActions, aia_waitAmmoXY, 0, 12, ap.ExplX, ap.ExplY); |
2f2f78fc65a3
AI uses cake! Known issues: AI could damage itself for no reason, could let cake go looping in a hole with exit closed by AI hog.
unc0rr
parents:
7375
diff
changeset
|
288 |
AddAction(BestActions, aia_attack, aim_push, 1, 0, 0); |
2f2f78fc65a3
AI uses cake! Known issues: AI could damage itself for no reason, could let cake go looping in a hole with exit closed by AI hog.
unc0rr
parents:
7375
diff
changeset
|
289 |
AddAction(BestActions, aia_attack, aim_release, 7, 0, 0); |
2f2f78fc65a3
AI uses cake! Known issues: AI could damage itself for no reason, could let cake go looping in a hole with exit closed by AI hog.
unc0rr
parents:
7375
diff
changeset
|
290 |
end; |
2f2f78fc65a3
AI uses cake! Known issues: AI could damage itself for no reason, could let cake go looping in a hole with exit closed by AI hog.
unc0rr
parents:
7375
diff
changeset
|
291 |
|
7132 | 292 |
if ap.ExplR > 0 then |
293 |
AddAction(BestActions, aia_AwareExpl, ap.ExplR, 10, ap.ExplX, ap.ExplY); |
|
294 |
end |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
295 |
end; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
296 |
if a = High(TAmmoType) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
297 |
a:= Low(TAmmoType) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
298 |
else inc(a) |
7178
c61cfc9eb29d
Don't make unnecessary calls to TestWhip, TestFirePunch, TestBaseballBat and TestHammer functions as they have no need to take Targ parameter into account and thus may only be called once per position
unc0rr
parents:
7164
diff
changeset
|
299 |
until (a = aa) or (CurrentHedgehog^.MultiShootAttacks > 0) {shooting same weapon} |
c61cfc9eb29d
Don't make unnecessary calls to TestWhip, TestFirePunch, TestBaseballBat and TestHammer functions as they have no need to take Targ parameter into account and thus may only be called once per position
unc0rr
parents:
7164
diff
changeset
|
300 |
or StopThinking |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
301 |
end |
64 | 302 |
end; |
15714
e55c4bad720a
AI: Reset remembered gravity on Think and TestAmmos
Wuzzy <Wuzzy2@mail.ru>
parents:
15713
diff
changeset
|
303 |
aiGravity:= cGravity; |
e55c4bad720a
AI: Reset remembered gravity on Think and TestAmmos
Wuzzy <Wuzzy2@mail.ru>
parents:
15713
diff
changeset
|
304 |
aiGravityf:= cGravityf; |
15713 | 305 |
end; |
4 | 306 |
|
6393 | 307 |
procedure Walk(Me: PGear; var Actions: TActions); |
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
308 |
const FallPixForBranching = cHHRadius; |
6393 | 309 |
var |
14528 | 310 |
maxticks, oldticks, steps, tmp: Longword; |
15622
dc62f1c13bb2
Teach AI to spam extra time if infinite
Wuzzy <Wuzzy2@mail.ru>
parents:
15546
diff
changeset
|
311 |
BaseRate, BestRate, Rate, i: LongInt; |
75 | 312 |
GoInfo: TGoInfo; |
80 | 313 |
CanGo: boolean; |
314 |
AltMe: TGear; |
|
3407 | 315 |
BotLevel: Byte; |
6392 | 316 |
a: TAmmoType; |
14528 | 317 |
isAfterAttack: boolean; |
64 | 318 |
begin |
14528 | 319 |
Actions.ticks:= 0; |
7789
838d2e06c377
Check cake and air attack again if walked far from initial position (not tested)
unc0rr
parents:
7787
diff
changeset
|
320 |
oldticks:= 0; // avoid compiler hint |
433 | 321 |
Stack.Count:= 0; |
6392 | 322 |
|
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
323 |
clearAllMarks; |
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
324 |
|
6392 | 325 |
for a:= Low(TAmmoType) to High(TAmmoType) do |
6770
7d2c6cdb816a
Start on adding drowning bonus to bat/firepunch/whip. AI still is not smart enough to change direction when firepunching to face the water, or change the angle of the bat.
nemo
parents:
6748
diff
changeset
|
326 |
CanUseAmmo[a]:= Assigned(AmmoTests[a].proc) and (HHHasAmmo(Me^.Hedgehog^, a) > 0); |
6392 | 327 |
|
4372 | 328 |
BotLevel:= Me^.Hedgehog^.BotLevel; |
75 | 329 |
|
14528 | 330 |
isAfterAttack:= ((Me^.State and gstAttacked) <> 0) and ((GameFlags and gfInfAttack) = 0); |
331 |
if isAfterAttack then |
|
332 |
maxticks:= Max(0, TurnTimeLeft - 500) |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
333 |
else |
14528 | 334 |
maxticks:= Max(0, TurnTimeLeft - 5000 - LongWord(4000 * BotLevel)); |
75 | 335 |
|
14528 | 336 |
if not isAfterAttack then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
337 |
TestAmmos(Actions, Me, false); |
8865 | 338 |
|
433 | 339 |
BestRate:= RatePlace(Me); |
4374 | 340 |
BaseRate:= Max(BestRate, 0); |
75 | 341 |
|
15703
a92220611821
AI: Switch to amNothing instead of amSkip to unselect weapon
Wuzzy <Wuzzy2@mail.ru>
parents:
15659
diff
changeset
|
342 |
// unselect weapon if we cannot move because of mouse cursor being shown |
5148
73b3b4b8359c
Make AI switch to amNothing before trying to walk if it holds weapon which needs targeting (not tested)
unc0rr
parents:
4976
diff
changeset
|
343 |
if (Ammoz[Me^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NeedTarget) <> 0 then |
15703
a92220611821
AI: Switch to amNothing instead of amSkip to unselect weapon
Wuzzy <Wuzzy2@mail.ru>
parents:
15659
diff
changeset
|
344 |
AddAction(Actions, aia_Weapon, Longword(amNothing), 100 + random(200), 0, 0); |
8865 | 345 |
|
346 |
if ((CurrentHedgehog^.MultiShootAttacks = 0) or ((Ammoz[Me^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NoMoveAfter) = 0)) |
|
15712
c4d7eb75fd8a
AI: Add aiGravity and aiGravityf variables
Wuzzy <Wuzzy2@mail.ru>
parents:
15711
diff
changeset
|
347 |
and (CurrentHedgehog^.Effects[heArtillery] = 0) and (aiGravityf <> 0) then |
433 | 348 |
begin |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
349 |
tmp:= random(2) + 1; |
14528 | 350 |
Push(Actions, Me^, tmp); |
351 |
Push(Actions, Me^, tmp xor 3); |
|
8865 | 352 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
353 |
while (Stack.Count > 0) and (not StopThinking) do |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
354 |
begin |
14528 | 355 |
Pop(Actions, Me^); |
193 | 356 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
357 |
AddAction(Actions, Me^.Message, aim_push, 250, 0, 0); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
358 |
if (Me^.Message and gmLeft) <> 0 then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
359 |
AddAction(Actions, aia_WaitXL, hwRound(Me^.X), 0, 0, 0) |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
360 |
else |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
361 |
AddAction(Actions, aia_WaitXR, hwRound(Me^.X), 0, 0, 0); |
8865 | 362 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
363 |
steps:= 0; |
82 | 364 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
365 |
while (not StopThinking) do |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
366 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
367 |
{$HINTS OFF} |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
368 |
CanGo:= HHGo(Me, @AltMe, GoInfo); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
369 |
{$HINTS ON} |
14528 | 370 |
oldticks:= Actions.ticks; |
371 |
inc(Actions.ticks, GoInfo.Ticks); |
|
372 |
if (Actions.ticks > maxticks) or (TurnTimeLeft < BestActions.ticks + 5000) then |
|
373 |
begin |
|
374 |
if (BotLevel < 5) |
|
375 |
and (not isAfterAttack) |
|
376 |
and (BestActions.Score > 0) // we have a good move |
|
377 |
and (TurnTimeLeft < BestActions.ticks + 5000) // we won't have a lot of time after attack |
|
378 |
and (HHHasAmmo(Me^.Hedgehog^, amExtraTime) > 0) // but can use extra time |
|
379 |
then |
|
380 |
begin |
|
381 |
BestActions.Count:= 0; |
|
382 |
AddAction(BestActions, aia_Weapon, Longword(amExtraTime), 80, 0, 0); |
|
383 |
AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); |
|
384 |
AddAction(BestActions, aia_attack, aim_release, 10, 0, 0); |
|
15622
dc62f1c13bb2
Teach AI to spam extra time if infinite
Wuzzy <Wuzzy2@mail.ru>
parents:
15546
diff
changeset
|
385 |
// Better bot levels know they can spam extra time if infinite |
dc62f1c13bb2
Teach AI to spam extra time if infinite
Wuzzy <Wuzzy2@mail.ru>
parents:
15546
diff
changeset
|
386 |
if (BotLevel < 3) and (HHHasAmmo(Me^.Hedgehog^, amExtraTime) = AMMO_INFINITE) then |
dc62f1c13bb2
Teach AI to spam extra time if infinite
Wuzzy <Wuzzy2@mail.ru>
parents:
15546
diff
changeset
|
387 |
for i:= 1 to 3 do |
dc62f1c13bb2
Teach AI to spam extra time if infinite
Wuzzy <Wuzzy2@mail.ru>
parents:
15546
diff
changeset
|
388 |
begin |
dc62f1c13bb2
Teach AI to spam extra time if infinite
Wuzzy <Wuzzy2@mail.ru>
parents:
15546
diff
changeset
|
389 |
AddAction(BestActions, aia_attack, aim_push, 100, 0, 0); |
dc62f1c13bb2
Teach AI to spam extra time if infinite
Wuzzy <Wuzzy2@mail.ru>
parents:
15546
diff
changeset
|
390 |
AddAction(BestActions, aia_attack, aim_release, 100, 0, 0); |
dc62f1c13bb2
Teach AI to spam extra time if infinite
Wuzzy <Wuzzy2@mail.ru>
parents:
15546
diff
changeset
|
391 |
end; |
14528 | 392 |
end; |
393 |
||
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
394 |
break; |
14528 | 395 |
end; |
194 | 396 |
|
8865 | 397 |
if (BotLevel < 5) |
398 |
and (GoInfo.JumpType = jmpHJump) |
|
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
399 |
and (not checkMark(hwRound(Me^.X), hwRound(Me^.Y), markHJumped)) |
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
400 |
then // hjump support |
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
401 |
begin |
7446 | 402 |
// check if we could go backwards and maybe ljump over a gap after this hjump |
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
403 |
addMark(hwRound(Me^.X), hwRound(Me^.Y), markHJumped); |
14528 | 404 |
if Push(Actions, AltMe, Me^.Message xor 3) then |
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
405 |
begin |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
406 |
with Stack.States[Pred(Stack.Count)] do |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
407 |
begin |
8036
89740f927254
Don't rely on hedgehog facing direction, check intentions instead. Should fix excessive turns around and weird jumps to water
unc0rr
parents:
8017
diff
changeset
|
408 |
if (Me^.Message and gmLeft) <> 0 then |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
409 |
AddAction(MadeActions, aia_LookRight, 0, 200, 0, 0) |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
410 |
else |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
411 |
AddAction(MadeActions, aia_LookLeft, 0, 200, 0, 0); |
8865 | 412 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
413 |
AddAction(MadeActions, aia_HJump, 0, 305 + random(50), 0, 0); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
414 |
AddAction(MadeActions, aia_HJump, 0, 350, 0, 0); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
415 |
end; |
7446 | 416 |
// but first check walking forward |
14528 | 417 |
Push(Stack.States[Pred(Stack.Count)].MadeActions, AltMe, Me^.Message) |
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
418 |
end; |
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
419 |
end; |
8865 | 420 |
if (BotLevel < 3) |
421 |
and (GoInfo.JumpType = jmpLJump) |
|
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
422 |
and (not checkMark(hwRound(Me^.X), hwRound(Me^.Y), markLJumped)) |
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
423 |
then // ljump support |
7250 | 424 |
begin |
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
425 |
addMark(hwRound(Me^.X), hwRound(Me^.Y), markLJumped); |
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
426 |
// at final check where we go after jump walking backward |
14528 | 427 |
if Push(Actions, AltMe, Me^.Message xor 3) then |
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
428 |
with Stack.States[Pred(Stack.Count)] do |
8017 | 429 |
begin |
8036
89740f927254
Don't rely on hedgehog facing direction, check intentions instead. Should fix excessive turns around and weird jumps to water
unc0rr
parents:
8017
diff
changeset
|
430 |
if (Me^.Message and gmLeft) <> 0 then |
8017 | 431 |
AddAction(MadeActions, aia_LookLeft, 0, 200, 0, 0) |
432 |
else |
|
433 |
AddAction(MadeActions, aia_LookRight, 0, 200, 0, 0); |
|
434 |
||
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
435 |
AddAction(MadeActions, aia_LJump, 0, 305 + random(50), 0, 0); |
8017 | 436 |
end; |
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
437 |
|
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
438 |
// push current position so we proceed from it after checking jump+forward walk opportunities |
14528 | 439 |
if CanGo then Push(Actions, Me^, Me^.Message); |
8865 | 440 |
|
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
441 |
// first check where we go after jump walking forward |
14528 | 442 |
if Push(Actions, AltMe, Me^.Message) then |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
443 |
with Stack.States[Pred(Stack.Count)] do |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
444 |
AddAction(MadeActions, aia_LJump, 0, 305 + random(50), 0, 0); |
14528 | 445 |
|
7250 | 446 |
break |
447 |
end; |
|
433 | 448 |
|
8865 | 449 |
// 'not CanGO' means we cannot go straight, possible jumps are checked above |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
450 |
if not CanGo then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
451 |
break; |
8865 | 452 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
453 |
inc(steps); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
454 |
Actions.actions[Pred(Actions.Count)].Param:= hwRound(Me^.X); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
455 |
Rate:= RatePlace(Me); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
456 |
if Rate > BestRate then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
457 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
458 |
BestActions:= Actions; |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
459 |
BestActions.isWalkingToABetterPlace:= true; |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
460 |
BestRate:= Rate; |
14528 | 461 |
isAfterAttack:= true // we have better place, go there and do not use ammo |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
462 |
end |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
463 |
else if Rate < BestRate then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
464 |
break; |
8865 | 465 |
|
14528 | 466 |
if (not isAfterAttack) and ((steps mod 4) = 0) then |
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
467 |
begin |
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
468 |
if (steps > 4) and checkMark(hwRound(Me^.X), hwRound(Me^.Y), markWalkedHere) then |
8865 | 469 |
break; |
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
470 |
addMark(hwRound(Me^.X), hwRound(Me^.Y), markWalkedHere); |
7789
838d2e06c377
Check cake and air attack again if walked far from initial position (not tested)
unc0rr
parents:
7787
diff
changeset
|
471 |
|
14528 | 472 |
TestAmmos(Actions, Me, Actions.ticks shr 12 = oldticks shr 12); |
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
473 |
end; |
8865 | 474 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
475 |
if GoInfo.FallPix >= FallPixForBranching then |
14528 | 476 |
Push(Actions, Me^, Me^.Message xor 3); // aia_Left xor 3 = aia_Right |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
477 |
end {while}; |
193 | 478 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
479 |
if BestRate > BaseRate then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
480 |
exit |
7164
fad64b97947e
Some brainfucking code which greatly reduces number of TestCollision* calls in hedgehog walk routine. Especially helpful to AI optimization. Also fixes some edge cases.
unc0rr
parents:
7132
diff
changeset
|
481 |
end {while} |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
482 |
end {if} |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
483 |
end; |
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
484 |
|
8865 | 485 |
function Think(Me: PGear): LongInt; cdecl; export; |
74 | 486 |
var BackMe, WalkMe: TGear; |
6992 | 487 |
switchCount: LongInt; |
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7790
diff
changeset
|
488 |
currHedgehogIndex, itHedgehog, switchesNum, i: Longword; |
6770
7d2c6cdb816a
Start on adding drowning bonus to bat/firepunch/whip. AI still is not smart enough to change direction when firepunching to face the water, or change the angle of the bat.
nemo
parents:
6748
diff
changeset
|
489 |
switchImmediatelyAvailable: boolean; |
6393 | 490 |
Actions: TActions; |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
491 |
begin |
8884
08fe08651130
set translucency on fruit theme water, clamp size to even number (same sdl window resize) and honouring min size, reduce calls to dmgmod a bit
nemo
parents:
8865
diff
changeset
|
492 |
dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent; |
15714
e55c4bad720a
AI: Reset remembered gravity on Think and TestAmmos
Wuzzy <Wuzzy2@mail.ru>
parents:
15713
diff
changeset
|
493 |
aiGravity:= cGravity; |
e55c4bad720a
AI: Reset remembered gravity on Think and TestAmmos
Wuzzy <Wuzzy2@mail.ru>
parents:
15713
diff
changeset
|
494 |
aiGravityf:= cGravityf; |
433 | 495 |
StartTicks:= GameTicks; |
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7790
diff
changeset
|
496 |
|
6393 | 497 |
currHedgehogIndex:= CurrentTeam^.CurrHedgehog; |
498 |
itHedgehog:= currHedgehogIndex; |
|
499 |
switchesNum:= 0; |
|
500 |
||
501 |
switchImmediatelyAvailable:= (CurAmmoGear <> nil) and (CurAmmoGear^.Kind = gtSwitcher); |
|
8865 | 502 |
if Me^.Hedgehog^.BotLevel <> 5 then |
7375
16ae2e1c9005
Tell AI to avoid edges, especially ones over water (this does not include checking whether a knock could drown yet). Also make flakes pick a new random dx/dy on respawn to further reduce patterns. Also disable a couple of weapons for the particularly dumb AI levels, and disable switching for the dumbest.
nemo
parents:
7250
diff
changeset
|
503 |
switchCount:= HHHasAmmo(PGear(Me)^.Hedgehog^, amSwitch) |
16ae2e1c9005
Tell AI to avoid edges, especially ones over water (this does not include checking whether a knock could drown yet). Also make flakes pick a new random dx/dy on respawn to further reduce patterns. Also disable a couple of weapons for the particularly dumb AI levels, and disable switching for the dumbest.
nemo
parents:
7250
diff
changeset
|
504 |
else switchCount:= 0; |
509 | 505 |
|
15466
6031c0cfec89
Make sure AI doesn't skip after collecting ammo. Fixes bug 796
Wuzzy <Wuzzy2@mail.ru>
parents:
15386
diff
changeset
|
506 |
if ((Me^.State and gstAttacked) = 0) or isInMultiShoot or bonuses.activity or ((Me^.AIHints and aihAmmosChanged) <> 0) then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
507 |
if Targets.Count > 0 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
508 |
begin |
6393 | 509 |
// iterate over current team hedgehogs |
510 |
repeat |
|
511 |
WalkMe:= CurrentTeam^.Hedgehogs[itHedgehog].Gear^; |
|
512 |
||
513 |
Actions.Count:= 0; |
|
514 |
Actions.Pos:= 0; |
|
515 |
Actions.Score:= 0; |
|
516 |
if switchesNum > 0 then |
|
517 |
begin |
|
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7790
diff
changeset
|
518 |
if (not switchImmediatelyAvailable) then |
6393 | 519 |
begin |
6770
7d2c6cdb816a
Start on adding drowning bonus to bat/firepunch/whip. AI still is not smart enough to change direction when firepunching to face the water, or change the angle of the bat.
nemo
parents:
6748
diff
changeset
|
520 |
// when AI has to use switcher, make it cost smth unless they have a lot of switches |
6992 | 521 |
if (switchCount < 10) then Actions.Score:= (-27+switchCount*3)*4000; |
8865 | 522 |
AddAction(Actions, aia_Weapon, Longword(amSwitch), 300 + random(200), 0, 0); |
6393 | 523 |
AddAction(Actions, aia_attack, aim_push, 300 + random(300), 0, 0); |
524 |
AddAction(Actions, aia_attack, aim_release, 1, 0, 0); |
|
525 |
end; |
|
526 |
for i:= 1 to switchesNum do |
|
527 |
AddAction(Actions, aia_Switch, 0, 300 + random(200), 0, 0); |
|
528 |
end; |
|
529 |
Walk(@WalkMe, Actions); |
|
530 |
||
531 |
// find another hog in team |
|
532 |
repeat |
|
533 |
itHedgehog:= Succ(itHedgehog) mod CurrentTeam^.HedgehogsNumber; |
|
8677 | 534 |
until (itHedgehog = currHedgehogIndex) or ((CurrentTeam^.Hedgehogs[itHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[itHedgehog].Effects[heFrozen]=0)); |
6393 | 535 |
|
536 |
inc(switchesNum); |
|
6770
7d2c6cdb816a
Start on adding drowning bonus to bat/firepunch/whip. AI still is not smart enough to change direction when firepunching to face the water, or change the angle of the bat.
nemo
parents:
6748
diff
changeset
|
537 |
until (not (switchImmediatelyAvailable or (switchCount > 0))) |
8865 | 538 |
or StopThinking |
6395
bb04d7a9f7e2
Make AI be less scared by crates. Actually, now it starts using switcher just to pick a crate up.
unc0rr
parents:
6393
diff
changeset
|
539 |
or (itHedgehog = currHedgehogIndex) |
bb04d7a9f7e2
Make AI be less scared by crates. Actually, now it starts using switcher just to pick a crate up.
unc0rr
parents:
6393
diff
changeset
|
540 |
or BestActions.isWalkingToABetterPlace; |
6393 | 541 |
|
14528 | 542 |
if (StartTicks > GameTicks - 1500) and (not StopThinking) then |
543 |
SDL_Delay(700); |
|
6393 | 544 |
|
6395
bb04d7a9f7e2
Make AI be less scared by crates. Actually, now it starts using switcher just to pick a crate up.
unc0rr
parents:
6393
diff
changeset
|
545 |
if (BestActions.Score < -1023) and (not BestActions.isWalkingToABetterPlace) then |
6393 | 546 |
begin |
547 |
BestActions.Count:= 0; |
|
10164
0570d4b22187
AI doesn't skip till action on the map stops (mostly dedicated to highlander) + various small tweaks
unc0rr
parents:
10108
diff
changeset
|
548 |
|
0570d4b22187
AI doesn't skip till action on the map stops (mostly dedicated to highlander) + various small tweaks
unc0rr
parents:
10108
diff
changeset
|
549 |
FillBonuses(false); |
10510 | 550 |
|
12710
1ab53b945140
AI hogs use timebox instead of skip if clueless what to do
Wuzzy <almikes@aol.com>
parents:
12709
diff
changeset
|
551 |
// Hog has no idea what to do. Use tardis or skip |
15466
6031c0cfec89
Make sure AI doesn't skip after collecting ammo. Fixes bug 796
Wuzzy <Wuzzy2@mail.ru>
parents:
15386
diff
changeset
|
552 |
if (not bonuses.activity) and ((Me^.AIHints and aihAmmosChanged) = 0) then |
14690
fd22b6d474e7
Fix AI trying to use tardis during multishoot
Wuzzy <Wuzzy2@mail.ru>
parents:
14607
diff
changeset
|
553 |
if (((GameFlags and gfInfAttack) <> 0) or (CurrentHedgehog^.MultiShootAttacks = 0)) and (HHHasAmmo(Me^.Hedgehog^, amTardis) > 0) and (CanUseTardis(Me^.Hedgehog^.Gear)) and (random(4) < 3) then |
12710
1ab53b945140
AI hogs use timebox instead of skip if clueless what to do
Wuzzy <almikes@aol.com>
parents:
12709
diff
changeset
|
554 |
// Tardis brings hog to a random place. Perfect for clueless AI |
1ab53b945140
AI hogs use timebox instead of skip if clueless what to do
Wuzzy <almikes@aol.com>
parents:
12709
diff
changeset
|
555 |
begin |
1ab53b945140
AI hogs use timebox instead of skip if clueless what to do
Wuzzy <almikes@aol.com>
parents:
12709
diff
changeset
|
556 |
AddAction(BestActions, aia_Weapon, Longword(amTardis), 80, 0, 0); |
1ab53b945140
AI hogs use timebox instead of skip if clueless what to do
Wuzzy <almikes@aol.com>
parents:
12709
diff
changeset
|
557 |
AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); |
1ab53b945140
AI hogs use timebox instead of skip if clueless what to do
Wuzzy <almikes@aol.com>
parents:
12709
diff
changeset
|
558 |
AddAction(BestActions, aia_attack, aim_release, 10, 0, 0); |
1ab53b945140
AI hogs use timebox instead of skip if clueless what to do
Wuzzy <almikes@aol.com>
parents:
12709
diff
changeset
|
559 |
end |
1ab53b945140
AI hogs use timebox instead of skip if clueless what to do
Wuzzy <almikes@aol.com>
parents:
12709
diff
changeset
|
560 |
else |
1ab53b945140
AI hogs use timebox instead of skip if clueless what to do
Wuzzy <almikes@aol.com>
parents:
12709
diff
changeset
|
561 |
AddAction(BestActions, aia_Skip, 0, 250, 0, 0); |
15466
6031c0cfec89
Make sure AI doesn't skip after collecting ammo. Fixes bug 796
Wuzzy <Wuzzy2@mail.ru>
parents:
15386
diff
changeset
|
562 |
Me^.AIHints := ME^.AIHints and (not aihAmmosChanged); |
6393 | 563 |
end; |
564 |
||
15654
25132742a948
Fix AI thread erroring out when there are no targets
Wuzzy <Wuzzy2@mail.ru>
parents:
15626
diff
changeset
|
565 |
end |
25132742a948
Fix AI thread erroring out when there are no targets
Wuzzy <Wuzzy2@mail.ru>
parents:
15626
diff
changeset
|
566 |
else |
25132742a948
Fix AI thread erroring out when there are no targets
Wuzzy <Wuzzy2@mail.ru>
parents:
15626
diff
changeset
|
567 |
begin |
25132742a948
Fix AI thread erroring out when there are no targets
Wuzzy <Wuzzy2@mail.ru>
parents:
15626
diff
changeset
|
568 |
// No target found, skip turn |
25132742a948
Fix AI thread erroring out when there are no targets
Wuzzy <Wuzzy2@mail.ru>
parents:
15626
diff
changeset
|
569 |
BestActions.Count:= 0; |
25132742a948
Fix AI thread erroring out when there are no targets
Wuzzy <Wuzzy2@mail.ru>
parents:
15626
diff
changeset
|
570 |
AddAction(BestActions, aia_Skip, 0, 250, 0, 0); |
25132742a948
Fix AI thread erroring out when there are no targets
Wuzzy <Wuzzy2@mail.ru>
parents:
15626
diff
changeset
|
571 |
Me^.AIHints := ME^.AIHints and (not aihAmmosChanged); |
25132742a948
Fix AI thread erroring out when there are no targets
Wuzzy <Wuzzy2@mail.ru>
parents:
15626
diff
changeset
|
572 |
end |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
573 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
574 |
begin |
8865 | 575 |
BackMe:= Me^; |
10164
0570d4b22187
AI doesn't skip till action on the map stops (mostly dedicated to highlander) + various small tweaks
unc0rr
parents:
10108
diff
changeset
|
576 |
i:= 4; |
8946 | 577 |
while (not StopThinking) and (BestActions.Count = 0) and (i > 0) do |
6393 | 578 |
begin |
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7790
diff
changeset
|
579 |
|
7375
16ae2e1c9005
Tell AI to avoid edges, especially ones over water (this does not include checking whether a knock could drown yet). Also make flakes pick a new random dx/dy on respawn to further reduce patterns. Also disable a couple of weapons for the particularly dumb AI levels, and disable switching for the dumbest.
nemo
parents:
7250
diff
changeset
|
580 |
(* |
16ae2e1c9005
Tell AI to avoid edges, especially ones over water (this does not include checking whether a knock could drown yet). Also make flakes pick a new random dx/dy on respawn to further reduce patterns. Also disable a couple of weapons for the particularly dumb AI levels, and disable switching for the dumbest.
nemo
parents:
7250
diff
changeset
|
581 |
// Maybe this would get a bit of movement out of them? Hopefully not *toward* water. Need to check how often he'd choose that strategy |
16ae2e1c9005
Tell AI to avoid edges, especially ones over water (this does not include checking whether a knock could drown yet). Also make flakes pick a new random dx/dy on respawn to further reduce patterns. Also disable a couple of weapons for the particularly dumb AI levels, and disable switching for the dumbest.
nemo
parents:
7250
diff
changeset
|
582 |
if SuddenDeathDmg and ((hwRound(BackMe.Y)+cWaterRise*2) > cWaterLine) then |
16ae2e1c9005
Tell AI to avoid edges, especially ones over water (this does not include checking whether a knock could drown yet). Also make flakes pick a new random dx/dy on respawn to further reduce patterns. Also disable a couple of weapons for the particularly dumb AI levels, and disable switching for the dumbest.
nemo
parents:
7250
diff
changeset
|
583 |
AddBonus(hwRound(BackMe.X), hwRound(BackMe.Y), 250, -40); |
16ae2e1c9005
Tell AI to avoid edges, especially ones over water (this does not include checking whether a knock could drown yet). Also make flakes pick a new random dx/dy on respawn to further reduce patterns. Also disable a couple of weapons for the particularly dumb AI levels, and disable switching for the dumbest.
nemo
parents:
7250
diff
changeset
|
584 |
*) |
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7790
diff
changeset
|
585 |
|
6393 | 586 |
FillBonuses(true); |
587 |
WalkMe:= BackMe; |
|
588 |
Actions.Count:= 0; |
|
589 |
Actions.Pos:= 0; |
|
590 |
Actions.Score:= 0; |
|
591 |
Walk(@WalkMe, Actions); |
|
10164
0570d4b22187
AI doesn't skip till action on the map stops (mostly dedicated to highlander) + various small tweaks
unc0rr
parents:
10108
diff
changeset
|
592 |
if not bonuses.activity then dec(i); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
593 |
if not StopThinking then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
594 |
SDL_Delay(100) |
6393 | 595 |
end |
596 |
end; |
|
597 |
||
8865 | 598 |
Me^.State:= Me^.State and (not gstHHThinking); |
509 | 599 |
Think:= 0; |
15386 | 600 |
SDL_SemPost(ThreadSem); |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
601 |
end; |
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
602 |
|
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
603 |
procedure StartThink(Me: PGear); |
15386 | 604 |
var ThinkThread: PSDL_Thread; |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
605 |
begin |
542 | 606 |
if ((Me^.State and (gstAttacking or gstHHJumping or gstMoving)) <> 0) |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
607 |
or isInMultiShoot then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
608 |
exit; |
506 | 609 |
|
15386 | 610 |
SDL_SemWait(ThreadSem); |
7433
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
611 |
//DeleteCI(Me); // this will break demo/netplay |
c7fff3e61d49
- Implement AI land marks which only used to tracks visited areas on the map for now. Significantly reduces wasting of cpu time by AI checking same place several times (10x or even more in rare cases)
unc0rr
parents:
7416
diff
changeset
|
612 |
|
369 | 613 |
Me^.State:= Me^.State or gstHHThinking; |
614 |
Me^.Message:= 0; |
|
509 | 615 |
|
616 |
BestActions.Count:= 0; |
|
617 |
BestActions.Pos:= 0; |
|
5163 | 618 |
BestActions.Score:= Low(LongInt); |
6395
bb04d7a9f7e2
Make AI be less scared by crates. Actually, now it starts using switcher just to pick a crate up.
unc0rr
parents:
6393
diff
changeset
|
619 |
BestActions.isWalkingToABetterPlace:= false; |
509 | 620 |
|
433 | 621 |
StopThinking:= false; |
622 |
ThinkingHH:= Me; |
|
509 | 623 |
|
70 | 624 |
FillTargets; |
941
b5222ddafe1f
- Fix bug with picking up ammos from cases, when total ammo count may become more than AMMO_INFINITE
unc0rr
parents:
936
diff
changeset
|
625 |
|
14527
a4d560aeda96
- Never consider a bot in inf attacks mode being in after attack mode, helps action in inf attack
unc0rr
parents:
14247
diff
changeset
|
626 |
FillBonuses(((Me^.State and gstAttacked) <> 0) and (not isInMultiShoot) and ((GameFlags and gfInfAttack) = 0)); |
8908
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
627 |
|
11367 | 628 |
ThinkThread:= SDL_CreateThread(@Think, PChar('think'), Me); |
15386 | 629 |
SDL_DetachThread(ThinkThread); |
433 | 630 |
end; |
191
a03c2d037e24
Bots are in the same thread as game. Fixes FreePascal issues.
unc0rr
parents:
183
diff
changeset
|
631 |
|
8965 | 632 |
{$IFDEF DEBUGAI} |
633 |
var scoreShown: boolean = false; |
|
634 |
{$ENDIF} |
|
7204
522f165cd2e7
- Fix damage calculation in TestSniperRifle, aim a bit lower to compensate initial angle shift in sniper rifle. As a result, AI seems to never fail sniper rifle shots.
unc0rr
parents:
7197
diff
changeset
|
635 |
|
433 | 636 |
procedure ProcessBot; |
6982 | 637 |
const cStopThinkTime = 40; |
4 | 638 |
begin |
602 | 639 |
with CurrentHedgehog^ do |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
640 |
if (Gear <> nil) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
641 |
and ((Gear^.State and gstHHDriven) <> 0) |
14527
a4d560aeda96
- Never consider a bot in inf attacks mode being in after attack mode, helps action in inf attack
unc0rr
parents:
14247
diff
changeset
|
642 |
and ((TurnTimeLeft < cHedgehogTurnTime - 50) or (TurnTimeLeft > cHedgehogTurnTime)) then |
433 | 643 |
if ((Gear^.State and gstHHThinking) = 0) then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
644 |
if (BestActions.Pos >= BestActions.Count) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
645 |
and (TurnTimeLeft > cStopThinkTime) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
646 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
647 |
if Gear^.Message <> 0 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
648 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
649 |
StopMessages(Gear^.Message); |
11532 | 650 |
if checkFails((Gear^.Message and gmAllStoppable) = 0, 'Engine bug: AI may break demos playing', true) then exit; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
651 |
end; |
8865 | 652 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
653 |
if Gear^.Message <> 0 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
654 |
exit; |
8865 | 655 |
|
8965 | 656 |
{$IFDEF DEBUGAI} |
657 |
scoreShown:= false; |
|
658 |
{$ENDIF} |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
659 |
StartThink(Gear); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
660 |
StartTicks:= GameTicks |
8865 | 661 |
|
7204
522f165cd2e7
- Fix damage calculation in TestSniperRifle, aim a bit lower to compensate initial angle shift in sniper rifle. As a result, AI seems to never fail sniper rifle shots.
unc0rr
parents:
7197
diff
changeset
|
662 |
end else |
522f165cd2e7
- Fix damage calculation in TestSniperRifle, aim a bit lower to compensate initial angle shift in sniper rifle. As a result, AI seems to never fail sniper rifle shots.
unc0rr
parents:
7197
diff
changeset
|
663 |
begin |
8965 | 664 |
{$IFDEF DEBUGAI} |
665 |
if not scoreShown then |
|
7204
522f165cd2e7
- Fix damage calculation in TestSniperRifle, aim a bit lower to compensate initial angle shift in sniper rifle. As a result, AI seems to never fail sniper rifle shots.
unc0rr
parents:
7197
diff
changeset
|
666 |
begin |
522f165cd2e7
- Fix damage calculation in TestSniperRifle, aim a bit lower to compensate initial angle shift in sniper rifle. As a result, AI seems to never fail sniper rifle shots.
unc0rr
parents:
7197
diff
changeset
|
667 |
if BestActions.Score > 0 then ParseCommand('/say Expected score = ' + inttostr(BestActions.Score div 1024), true); |
522f165cd2e7
- Fix damage calculation in TestSniperRifle, aim a bit lower to compensate initial angle shift in sniper rifle. As a result, AI seems to never fail sniper rifle shots.
unc0rr
parents:
7197
diff
changeset
|
668 |
scoreShown:= true |
8965 | 669 |
end; |
670 |
{$ENDIF} |
|
7204
522f165cd2e7
- Fix damage calculation in TestSniperRifle, aim a bit lower to compensate initial angle shift in sniper rifle. As a result, AI seems to never fail sniper rifle shots.
unc0rr
parents:
7197
diff
changeset
|
671 |
ProcessAction(BestActions, Gear) |
522f165cd2e7
- Fix damage calculation in TestSniperRifle, aim a bit lower to compensate initial angle shift in sniper rifle. As a result, AI seems to never fail sniper rifle shots.
unc0rr
parents:
7197
diff
changeset
|
672 |
end |
509 | 673 |
else if ((GameTicks - StartTicks) > cMaxAIThinkTime) |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
674 |
or (TurnTimeLeft <= cStopThinkTime) then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
675 |
StopThinking:= true |
369 | 676 |
end; |
4 | 677 |
|
3038 | 678 |
procedure initModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
679 |
begin |
6982 | 680 |
StartTicks:= 0; |
15386 | 681 |
ThreadSem:= SDL_CreateSemaphore(1); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
682 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
683 |
|
3038 | 684 |
procedure freeModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
685 |
begin |
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
686 |
FreeActionsList(); |
15386 | 687 |
SDL_DestroySemaphore(ThreadSem); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
688 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
689 |
|
4 | 690 |
end. |