author | Periklis Ntanasis <pntanasis@gmail.com> |
Sun, 09 Jun 2013 01:18:58 +0300 | |
changeset 9177 | d5e98b81e135 |
parent 9080 | 9b42757d7e71 |
child 9127 | e350500c4edb |
child 9317 | a04c30940d2d |
permissions | -rw-r--r-- |
4 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
9080 | 3 |
* Copyright (c) 2004-2013 Andrey Korotaev <unC0Rr@gmail.com> |
4 | 4 |
* |
183 | 5 |
* This program is free software; you can redistribute it and/or modify |
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
4 | 8 |
* |
183 | 9 |
* This program is distributed in the hope that it will be useful, |
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
4 | 13 |
* |
183 | 14 |
* You should have received a copy of the GNU General Public License |
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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, |
8865 | 33 |
uAmmos, SysUtils, uTypes, |
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
|
34 |
uVariables, uCommands, uUtils, uDebug, uAILandMarks; |
4 | 35 |
|
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
36 |
var BestActions: TActions; |
509 | 37 |
CanUseAmmo: array [TAmmoType] of boolean; |
433 | 38 |
StopThinking: boolean; |
7028 | 39 |
StartTicks: Longword; |
8908
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
40 |
ThinkThread: PSDL_Thread; |
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
41 |
ThreadLock: PSDL_Mutex; |
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'); |
8911 | 46 |
if (ThinkThread <> nil) then |
47 |
begin |
|
48 |
StopThinking:= true; |
|
49 |
SDL_WaitThread(ThinkThread, nil); |
|
50 |
end; |
|
8908
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
51 |
SDL_LockMutex(ThreadLock); |
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
52 |
ThinkThread:= nil; |
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
53 |
SDL_UnlockMutex(ThreadLock); |
434 | 54 |
|
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
55 |
with CurrentHedgehog^ do |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
56 |
if Gear <> nil then |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
57 |
if BotLevel <> 0 then |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
58 |
StopMessages(Gear^.Message); |
740 | 59 |
|
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
60 |
BestActions.Count:= 0; |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
61 |
BestActions.Pos:= 0 |
369 | 62 |
end; |
63 |
||
6392 | 64 |
|
65 |
const cBranchStackSize = 12; |
|
66 |
type TStackEntry = record |
|
67 |
WastedTicks: Longword; |
|
68 |
MadeActions: TActions; |
|
69 |
Hedgehog: TGear; |
|
70 |
end; |
|
71 |
||
72 |
var Stack: record |
|
73 |
Count: Longword; |
|
74 |
States: array[0..Pred(cBranchStackSize)] of TStackEntry; |
|
75 |
end; |
|
76 |
||
77 |
function Push(Ticks: Longword; const Actions: TActions; const Me: TGear; Dir: integer): boolean; |
|
78 |
var bRes: boolean; |
|
79 |
begin |
|
80 |
bRes:= (Stack.Count < cBranchStackSize) and (Actions.Count < MAXACTIONS - 5); |
|
81 |
if bRes then |
|
82 |
with Stack.States[Stack.Count] do |
|
83 |
begin |
|
84 |
WastedTicks:= Ticks; |
|
85 |
MadeActions:= Actions; |
|
86 |
Hedgehog:= Me; |
|
87 |
Hedgehog.Message:= Dir; |
|
88 |
inc(Stack.Count) |
|
89 |
end; |
|
90 |
Push:= bRes |
|
91 |
end; |
|
92 |
||
93 |
procedure Pop(var Ticks: Longword; var Actions: TActions; var Me: TGear); |
|
94 |
begin |
|
95 |
dec(Stack.Count); |
|
96 |
with Stack.States[Stack.Count] do |
|
97 |
begin |
|
98 |
Ticks:= WastedTicks; |
|
99 |
Actions:= MadeActions; |
|
100 |
Me:= Hedgehog |
|
101 |
end |
|
102 |
end; |
|
103 |
||
104 |
||
105 |
||
7789
838d2e06c377
Check cake and air attack again if walked far from initial position (not tested)
unc0rr
parents:
7787
diff
changeset
|
106 |
procedure TestAmmos(var Actions: TActions; Me: PGear; rareChecks: boolean); |
3407 | 107 |
var BotLevel: Byte; |
543
465e2ec8f05f
- Better randomness of placing hedgehogs on the land
unc0rr
parents:
542
diff
changeset
|
108 |
ap: TAttackParams; |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
109 |
Score, i, dAngle: LongInt; |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
110 |
a, aa: TAmmoType; |
4 | 111 |
begin |
4372 | 112 |
BotLevel:= Me^.Hedgehog^.BotLevel; |
7078
a3408d9ba5ad
AI can't use cWindSpeedf since it now does a smooth transition
nemo
parents:
7028
diff
changeset
|
113 |
windSpeed:= hwFloat2Float(cWindSpeed); |
433 | 114 |
|
64 | 115 |
for i:= 0 to Pred(Targets.Count) do |
509 | 116 |
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
|
117 |
begin |
6748 | 118 |
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
|
119 |
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
|
120 |
aa:= a; |
8865 | 121 |
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
|
122 |
repeat |
8865 | 123 |
if (CanUseAmmo[a]) |
124 |
and ((not rareChecks) or ((AmmoTests[a].flags and amtest_Rare) = 0)) |
|
125 |
and ((i = 0) or ((AmmoTests[a].flags and amtest_NoTarget) = 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
|
126 |
then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
127 |
begin |
3407 | 128 |
{$HINTS OFF} |
8959 | 129 |
Score:= AmmoTests[a].proc(Me, Targets.ar[i], BotLevel, ap); |
3407 | 130 |
{$HINTS ON} |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
131 |
if Actions.Score + Score > BestActions.Score then |
9003
896c6b21c87f
Best level AI should maximize the score at all costs.
unc0rr
parents:
8965
diff
changeset
|
132 |
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
|
133 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
134 |
BestActions:= Actions; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
135 |
inc(BestActions.Score, Score); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
136 |
BestActions.isWalkingToABetterPlace:= false; |
194 | 137 |
|
7132 | 138 |
AddAction(BestActions, aia_Weapon, Longword(a), 300 + random(400), 0, 0); |
5162 | 139 |
|
7132 | 140 |
if (ap.Angle > 0) then |
141 |
AddAction(BestActions, aia_LookRight, 0, 200, 0, 0) |
|
142 |
else if (ap.Angle < 0) then |
|
143 |
AddAction(BestActions, aia_LookLeft, 0, 200, 0, 0); |
|
8865 | 144 |
|
7790 | 145 |
if (Ammoz[a].Ammo.Propz and ammoprop_Timerable) <> 0 then |
7132 | 146 |
AddAction(BestActions, aia_Timer, ap.Time div 1000, 400, 0, 0); |
8865 | 147 |
|
7132 | 148 |
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
|
149 |
begin |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
150 |
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
|
151 |
if dAngle > 0 then |
7132 | 152 |
begin |
153 |
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
|
154 |
AddAction(BestActions, aia_Up, aim_release, dAngle, 0, 0) |
7132 | 155 |
end |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
156 |
else if dAngle < 0 then |
7132 | 157 |
begin |
158 |
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
|
159 |
AddAction(BestActions, aia_Down, aim_release, -dAngle, 0, 0) |
7132 | 160 |
end |
161 |
end; |
|
8865 | 162 |
|
7132 | 163 |
if (Ammoz[a].Ammo.Propz and ammoprop_NeedTarget) <> 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
|
164 |
begin |
7132 | 165 |
AddAction(BestActions, aia_Put, 0, 1, ap.AttackPutX, ap.AttackPutY) |
166 |
end; |
|
8865 | 167 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
168 |
if (Ammoz[a].Ammo.Propz and ammoprop_OscAim) <> 0 then |
7132 | 169 |
begin |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
170 |
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
|
171 |
AddAction(BestActions, aia_attack, aim_release, 1, 0, 0); |
8865 | 172 |
|
7453 | 173 |
if abs(ap.Angle) > 32 then |
7450 | 174 |
begin |
175 |
AddAction(BestActions, aia_Down, aim_push, 100 + random(150), 0, 0); |
|
176 |
AddAction(BestActions, aia_Down, aim_release, 32, 0, 0); |
|
177 |
end; |
|
8865 | 178 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
179 |
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
|
180 |
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
|
181 |
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
|
182 |
end else |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
183 |
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
|
184 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
185 |
AddAction(BestActions, aia_attack, aim_push, 650 + random(300), 0, 0); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
186 |
AddAction(BestActions, aia_attack, aim_release, ap.Power, 0, 0); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
187 |
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
|
188 |
|
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
|
189 |
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
|
190 |
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
|
191 |
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
|
192 |
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
|
193 |
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
|
194 |
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
|
195 |
|
7132 | 196 |
if ap.ExplR > 0 then |
197 |
AddAction(BestActions, aia_AwareExpl, ap.ExplR, 10, ap.ExplX, ap.ExplY); |
|
198 |
end |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
199 |
end; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
200 |
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
|
201 |
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
|
202 |
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
|
203 |
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
|
204 |
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
|
205 |
end |
64 | 206 |
end; |
4 | 207 |
|
6393 | 208 |
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
|
209 |
const FallPixForBranching = cHHRadius; |
6393 | 210 |
var |
7789
838d2e06c377
Check cake and air attack again if walked far from initial position (not tested)
unc0rr
parents:
7787
diff
changeset
|
211 |
ticks, maxticks, oldticks, steps, tmp: Longword; |
433 | 212 |
BaseRate, BestRate, Rate: integer; |
75 | 213 |
GoInfo: TGoInfo; |
80 | 214 |
CanGo: boolean; |
215 |
AltMe: TGear; |
|
3407 | 216 |
BotLevel: Byte; |
6392 | 217 |
a: TAmmoType; |
64 | 218 |
begin |
7789
838d2e06c377
Check cake and air attack again if walked far from initial position (not tested)
unc0rr
parents:
7787
diff
changeset
|
219 |
ticks:= 0; |
838d2e06c377
Check cake and air attack again if walked far from initial position (not tested)
unc0rr
parents:
7787
diff
changeset
|
220 |
oldticks:= 0; // avoid compiler hint |
433 | 221 |
Stack.Count:= 0; |
6392 | 222 |
|
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
223 |
clearAllMarks; |
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
224 |
|
6392 | 225 |
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
|
226 |
CanUseAmmo[a]:= Assigned(AmmoTests[a].proc) and (HHHasAmmo(Me^.Hedgehog^, a) > 0); |
6392 | 227 |
|
4372 | 228 |
BotLevel:= Me^.Hedgehog^.BotLevel; |
75 | 229 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
230 |
if (Me^.State and gstAttacked) = 0 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
231 |
maxticks:= Max(0, TurnTimeLeft - 5000 - LongWord(4000 * BotLevel)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
232 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
233 |
maxticks:= TurnTimeLeft; |
75 | 234 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
235 |
if (Me^.State and gstAttacked) = 0 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
236 |
TestAmmos(Actions, Me, false); |
8865 | 237 |
|
433 | 238 |
BestRate:= RatePlace(Me); |
4374 | 239 |
BaseRate:= Max(BestRate, 0); |
75 | 240 |
|
8865 | 241 |
// switch to 'skip' 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
|
242 |
if (Ammoz[Me^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NeedTarget) <> 0 then |
7132 | 243 |
AddAction(Actions, aia_Weapon, Longword(amSkip), 100 + random(200), 0, 0); |
8865 | 244 |
|
245 |
if ((CurrentHedgehog^.MultiShootAttacks = 0) or ((Ammoz[Me^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NoMoveAfter) = 0)) |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
246 |
and (GameFlags and gfArtillery = 0) then |
433 | 247 |
begin |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
248 |
tmp:= random(2) + 1; |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
249 |
Push(0, Actions, Me^, tmp); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
250 |
Push(0, Actions, Me^, tmp xor 3); |
8865 | 251 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
252 |
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
|
253 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
254 |
Pop(ticks, Actions, Me^); |
193 | 255 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
256 |
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
|
257 |
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
|
258 |
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
|
259 |
else |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
260 |
AddAction(Actions, aia_WaitXR, hwRound(Me^.X), 0, 0, 0); |
8865 | 261 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
262 |
steps:= 0; |
82 | 263 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
264 |
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
|
265 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
266 |
{$HINTS OFF} |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
267 |
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
|
268 |
{$HINTS ON} |
7789
838d2e06c377
Check cake and air attack again if walked far from initial position (not tested)
unc0rr
parents:
7787
diff
changeset
|
269 |
oldticks:= ticks; |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
270 |
inc(ticks, GoInfo.Ticks); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
271 |
if ticks > maxticks then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
272 |
break; |
194 | 273 |
|
8865 | 274 |
if (BotLevel < 5) |
275 |
and (GoInfo.JumpType = jmpHJump) |
|
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
276 |
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
|
277 |
then // hjump support |
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
278 |
begin |
7446 | 279 |
// 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
|
280 |
addMark(hwRound(Me^.X), hwRound(Me^.Y), markHJumped); |
7446 | 281 |
if Push(ticks, 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
|
282 |
begin |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
283 |
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
|
284 |
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
|
285 |
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
|
286 |
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
|
287 |
else |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
288 |
AddAction(MadeActions, aia_LookLeft, 0, 200, 0, 0); |
8865 | 289 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
290 |
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
|
291 |
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
|
292 |
end; |
7446 | 293 |
// but first check walking forward |
294 |
Push(ticks, 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
|
295 |
end; |
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
296 |
end; |
8865 | 297 |
if (BotLevel < 3) |
298 |
and (GoInfo.JumpType = jmpLJump) |
|
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
299 |
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
|
300 |
then // ljump support |
7250 | 301 |
begin |
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
302 |
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
|
303 |
// at final check where we go after jump walking backward |
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
|
304 |
if Push(ticks, Actions, AltMe, Me^.Message xor 3) then |
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
|
305 |
with Stack.States[Pred(Stack.Count)] do |
8017 | 306 |
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
|
307 |
if (Me^.Message and gmLeft) <> 0 then |
8017 | 308 |
AddAction(MadeActions, aia_LookLeft, 0, 200, 0, 0) |
309 |
else |
|
310 |
AddAction(MadeActions, aia_LookRight, 0, 200, 0, 0); |
|
311 |
||
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
|
312 |
AddAction(MadeActions, aia_LJump, 0, 305 + random(50), 0, 0); |
8017 | 313 |
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
|
314 |
|
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
|
315 |
// push current position so we proceed from it after checking jump+forward walk opportunities |
7250 | 316 |
if CanGo then Push(ticks, Actions, Me^, Me^.Message); |
8865 | 317 |
|
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
|
318 |
// first check where we go after jump walking forward |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
319 |
if Push(ticks, Actions, AltMe, Me^.Message) then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
320 |
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
|
321 |
AddAction(MadeActions, aia_LJump, 0, 305 + random(50), 0, 0); |
7250 | 322 |
break |
323 |
end; |
|
433 | 324 |
|
8865 | 325 |
// '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
|
326 |
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
|
327 |
break; |
8865 | 328 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
329 |
inc(steps); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
330 |
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
|
331 |
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
|
332 |
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
|
333 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
334 |
BestActions:= Actions; |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
335 |
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
|
336 |
BestRate:= Rate; |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
337 |
Me^.State:= Me^.State or gstAttacked // we have better place, go there and do not use ammo |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
338 |
end |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
339 |
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
|
340 |
break; |
8865 | 341 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
342 |
if ((Me^.State and gstAttacked) = 0) 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
|
343 |
begin |
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
344 |
if (steps > 4) and checkMark(hwRound(Me^.X), hwRound(Me^.Y), markWalkedHere) then |
8865 | 345 |
break; |
7787
67c96b9c179c
Mark places where tried to jump, avoid too much of thinking
unc0rr
parents:
7453
diff
changeset
|
346 |
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
|
347 |
|
838d2e06c377
Check cake and air attack again if walked far from initial position (not tested)
unc0rr
parents:
7787
diff
changeset
|
348 |
TestAmmos(Actions, Me, ticks shr 12 = oldticks shr 12); |
8865 | 349 |
|
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
|
350 |
end; |
8865 | 351 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
352 |
if GoInfo.FallPix >= FallPixForBranching then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
353 |
Push(ticks, Actions, Me^, Me^.Message xor 3); // aia_Left xor 3 = aia_Right |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
354 |
end {while}; |
193 | 355 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
356 |
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
|
357 |
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
|
358 |
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
|
359 |
end {if} |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
360 |
end; |
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
361 |
|
8865 | 362 |
function Think(Me: PGear): LongInt; cdecl; export; |
74 | 363 |
var BackMe, WalkMe: TGear; |
6992 | 364 |
switchCount: LongInt; |
365 |
StartTicks, 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
|
366 |
switchImmediatelyAvailable: boolean; |
6393 | 367 |
Actions: TActions; |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
368 |
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
|
369 |
dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent; |
433 | 370 |
StartTicks:= GameTicks; |
6393 | 371 |
currHedgehogIndex:= CurrentTeam^.CurrHedgehog; |
372 |
itHedgehog:= currHedgehogIndex; |
|
373 |
switchesNum:= 0; |
|
374 |
||
375 |
switchImmediatelyAvailable:= (CurAmmoGear <> nil) and (CurAmmoGear^.Kind = gtSwitcher); |
|
8865 | 376 |
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
|
377 |
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
|
378 |
else switchCount:= 0; |
509 | 379 |
|
8946 | 380 |
if ((Me^.State and gstAttacked) = 0) or isInMultiShoot then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
381 |
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
|
382 |
begin |
6393 | 383 |
// iterate over current team hedgehogs |
384 |
repeat |
|
385 |
WalkMe:= CurrentTeam^.Hedgehogs[itHedgehog].Gear^; |
|
386 |
||
387 |
Actions.Count:= 0; |
|
388 |
Actions.Pos:= 0; |
|
389 |
Actions.Score:= 0; |
|
390 |
if switchesNum > 0 then |
|
391 |
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
|
392 |
if not switchImmediatelyAvailable then |
6393 | 393 |
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
|
394 |
// when AI has to use switcher, make it cost smth unless they have a lot of switches |
6992 | 395 |
if (switchCount < 10) then Actions.Score:= (-27+switchCount*3)*4000; |
8865 | 396 |
AddAction(Actions, aia_Weapon, Longword(amSwitch), 300 + random(200), 0, 0); |
6393 | 397 |
AddAction(Actions, aia_attack, aim_push, 300 + random(300), 0, 0); |
398 |
AddAction(Actions, aia_attack, aim_release, 1, 0, 0); |
|
399 |
end; |
|
400 |
for i:= 1 to switchesNum do |
|
401 |
AddAction(Actions, aia_Switch, 0, 300 + random(200), 0, 0); |
|
402 |
end; |
|
403 |
Walk(@WalkMe, Actions); |
|
404 |
||
405 |
// find another hog in team |
|
406 |
repeat |
|
407 |
itHedgehog:= Succ(itHedgehog) mod CurrentTeam^.HedgehogsNumber; |
|
8677 | 408 |
until (itHedgehog = currHedgehogIndex) or ((CurrentTeam^.Hedgehogs[itHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[itHedgehog].Effects[heFrozen]=0)); |
6393 | 409 |
|
410 |
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
|
411 |
until (not (switchImmediatelyAvailable or (switchCount > 0))) |
8865 | 412 |
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
|
413 |
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
|
414 |
or BestActions.isWalkingToABetterPlace; |
6393 | 415 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
416 |
if (StartTicks > GameTicks - 1500) and (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
|
417 |
SDL_Delay(1000); |
6393 | 418 |
|
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
|
419 |
if (BestActions.Score < -1023) and (not BestActions.isWalkingToABetterPlace) then |
6393 | 420 |
begin |
421 |
BestActions.Count:= 0; |
|
422 |
AddAction(BestActions, aia_Skip, 0, 250, 0, 0); |
|
423 |
end; |
|
424 |
||
8017 | 425 |
end else SDL_Delay(100) |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
426 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
427 |
begin |
8865 | 428 |
BackMe:= Me^; |
8946 | 429 |
i:= 12; |
430 |
while (not StopThinking) and (BestActions.Count = 0) and (i > 0) do |
|
6393 | 431 |
begin |
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
|
432 |
(* |
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
|
433 |
// 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
|
434 |
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
|
435 |
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
|
436 |
*) |
6393 | 437 |
FillBonuses(true); |
438 |
WalkMe:= BackMe; |
|
439 |
Actions.Count:= 0; |
|
440 |
Actions.Pos:= 0; |
|
441 |
Actions.Score:= 0; |
|
442 |
Walk(@WalkMe, Actions); |
|
8946 | 443 |
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
|
444 |
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
|
445 |
SDL_Delay(100) |
6393 | 446 |
end |
447 |
end; |
|
448 |
||
8865 | 449 |
Me^.State:= Me^.State and (not gstHHThinking); |
8908
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
450 |
SDL_LockMutex(ThreadLock); |
8865 | 451 |
ThinkThread:= nil; |
8908
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
452 |
SDL_UnlockMutex(ThreadLock); |
509 | 453 |
Think:= 0; |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
454 |
end; |
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
455 |
|
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
456 |
procedure StartThink(Me: PGear); |
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
457 |
begin |
542 | 458 |
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
|
459 |
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
|
460 |
exit; |
506 | 461 |
|
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
|
462 |
//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
|
463 |
|
369 | 464 |
Me^.State:= Me^.State or gstHHThinking; |
465 |
Me^.Message:= 0; |
|
509 | 466 |
|
467 |
BestActions.Count:= 0; |
|
468 |
BestActions.Pos:= 0; |
|
5163 | 469 |
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
|
470 |
BestActions.isWalkingToABetterPlace:= false; |
509 | 471 |
|
433 | 472 |
StopThinking:= false; |
473 |
ThinkingHH:= Me; |
|
509 | 474 |
|
70 | 475 |
FillTargets; |
80 | 476 |
if Targets.Count = 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
|
477 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
478 |
OutError('AI: no targets!?', false); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
479 |
exit |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
480 |
end; |
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
|
481 |
|
8946 | 482 |
FillBonuses(((Me^.State and gstAttacked) <> 0) and (not isInMultiShoot)); |
8908
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
483 |
|
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
484 |
SDL_LockMutex(ThreadLock); |
8865 | 485 |
ThinkThread:= SDL_CreateThread(@Think{$IFDEF SDL13}, 'think'{$ENDIF}, Me); |
8908
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
486 |
SDL_UnlockMutex(ThreadLock); |
433 | 487 |
end; |
191
a03c2d037e24
Bots are in the same thread as game. Fixes FreePascal issues.
unc0rr
parents:
183
diff
changeset
|
488 |
|
8965 | 489 |
{$IFDEF DEBUGAI} |
490 |
var scoreShown: boolean = false; |
|
491 |
{$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
|
492 |
|
433 | 493 |
procedure ProcessBot; |
6982 | 494 |
const cStopThinkTime = 40; |
4 | 495 |
begin |
602 | 496 |
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
|
497 |
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
|
498 |
and ((Gear^.State and gstHHDriven) <> 0) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
499 |
and (TurnTimeLeft < cHedgehogTurnTime - 50) then |
433 | 500 |
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
|
501 |
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
|
502 |
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
|
503 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
504 |
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
|
505 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
506 |
StopMessages(Gear^.Message); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
507 |
TryDo((Gear^.Message and gmAllStoppable) = 0, 'Engine bug: AI may break demos playing', true); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
508 |
end; |
8865 | 509 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
510 |
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
|
511 |
exit; |
8865 | 512 |
|
8965 | 513 |
{$IFDEF DEBUGAI} |
514 |
scoreShown:= false; |
|
515 |
{$ENDIF} |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
516 |
StartThink(Gear); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
517 |
StartTicks:= GameTicks |
8865 | 518 |
|
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
|
519 |
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
|
520 |
begin |
8965 | 521 |
{$IFDEF DEBUGAI} |
522 |
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
|
523 |
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
|
524 |
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
|
525 |
scoreShown:= true |
8965 | 526 |
end; |
527 |
{$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
|
528 |
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
|
529 |
end |
509 | 530 |
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
|
531 |
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
|
532 |
StopThinking:= true |
369 | 533 |
end; |
4 | 534 |
|
3038 | 535 |
procedure initModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
536 |
begin |
6982 | 537 |
StartTicks:= 0; |
8865 | 538 |
ThinkThread:= nil; |
8908
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
539 |
ThreadLock:= SDL_CreateMutex(); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
540 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
541 |
|
3038 | 542 |
procedure freeModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
543 |
begin |
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
544 |
FreeActionsList(); |
8908
d3033e3a4113
let's try to kill the thread right away and protect the thread variable with a mutex
koda
parents:
8884
diff
changeset
|
545 |
SDL_DestroyMutex(ThreadLock); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
546 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
547 |
|
4 | 548 |
end. |