author | nemo |
Wed, 25 Jul 2012 10:56:14 -0400 | |
changeset 7426 | 55b49cc1f33a |
parent 7416 | 2f2f78fc65a3 |
child 7437 | a46ce1812419 |
permissions | -rw-r--r-- |
4 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
6700 | 3 |
* Copyright (c) 2004-2012 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, |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
33 |
uAmmos, SysUtils{$IFNDEF USE_SDLTHREADS} {$IFDEF UNIX}, cthreads{$ENDIF} {$ENDIF}, uTypes, |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
34 |
uVariables, uCommands, uUtils, uDebug; |
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; |
6462 | 39 |
{$IFDEF USE_SDLTHREADS} |
5504 | 40 |
ThinkThread: PSDL_Thread = nil; |
6460 | 41 |
{$ELSE} |
42 |
ThinkThread: TThreadID; |
|
43 |
{$ENDIF} |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
44 |
hasThread: LongInt; |
7028 | 45 |
StartTicks: Longword; |
599 | 46 |
|
369 | 47 |
procedure FreeActionsList; |
64 | 48 |
begin |
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
49 |
AddFileLog('FreeActionsList called'); |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
50 |
if hasThread <> 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
|
51 |
begin |
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
52 |
AddFileLog('Waiting AI thread to finish'); |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
53 |
StopThinking:= true; |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
54 |
repeat |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
55 |
SDL_Delay(10) |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
56 |
until hasThread = 0 |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
57 |
end; |
434 | 58 |
|
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
59 |
with CurrentHedgehog^ do |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
60 |
if Gear <> nil then |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
61 |
if BotLevel <> 0 then |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
62 |
StopMessages(Gear^.Message); |
740 | 63 |
|
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
64 |
BestActions.Count:= 0; |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
65 |
BestActions.Pos:= 0 |
369 | 66 |
end; |
67 |
||
6392 | 68 |
|
69 |
||
70 |
const cBranchStackSize = 12; |
|
71 |
type TStackEntry = record |
|
72 |
WastedTicks: Longword; |
|
73 |
MadeActions: TActions; |
|
74 |
Hedgehog: TGear; |
|
75 |
end; |
|
76 |
||
77 |
var Stack: record |
|
78 |
Count: Longword; |
|
79 |
States: array[0..Pred(cBranchStackSize)] of TStackEntry; |
|
80 |
end; |
|
81 |
||
82 |
function Push(Ticks: Longword; const Actions: TActions; const Me: TGear; Dir: integer): boolean; |
|
83 |
var bRes: boolean; |
|
84 |
begin |
|
85 |
bRes:= (Stack.Count < cBranchStackSize) and (Actions.Count < MAXACTIONS - 5); |
|
86 |
if bRes then |
|
87 |
with Stack.States[Stack.Count] do |
|
88 |
begin |
|
89 |
WastedTicks:= Ticks; |
|
90 |
MadeActions:= Actions; |
|
91 |
Hedgehog:= Me; |
|
92 |
Hedgehog.Message:= Dir; |
|
93 |
inc(Stack.Count) |
|
94 |
end; |
|
95 |
Push:= bRes |
|
96 |
end; |
|
97 |
||
98 |
procedure Pop(var Ticks: Longword; var Actions: TActions; var Me: TGear); |
|
99 |
begin |
|
100 |
dec(Stack.Count); |
|
101 |
with Stack.States[Stack.Count] do |
|
102 |
begin |
|
103 |
Ticks:= WastedTicks; |
|
104 |
Actions:= MadeActions; |
|
105 |
Me:= Hedgehog |
|
106 |
end |
|
107 |
end; |
|
108 |
||
109 |
||
110 |
||
543
465e2ec8f05f
- Better randomness of placing hedgehogs on the land
unc0rr
parents:
542
diff
changeset
|
111 |
procedure TestAmmos(var Actions: TActions; Me: PGear; isMoved: boolean); |
3407 | 112 |
var BotLevel: Byte; |
543
465e2ec8f05f
- Better randomness of placing hedgehogs on the land
unc0rr
parents:
542
diff
changeset
|
113 |
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
|
114 |
Score, i, dAngle: LongInt; |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
115 |
a, aa: TAmmoType; |
4 | 116 |
begin |
4372 | 117 |
BotLevel:= Me^.Hedgehog^.BotLevel; |
7078
a3408d9ba5ad
AI can't use cWindSpeedf since it now does a smooth transition
nemo
parents:
7028
diff
changeset
|
118 |
windSpeed:= hwFloat2Float(cWindSpeed); |
433 | 119 |
|
64 | 120 |
for i:= 0 to Pred(Targets.Count) do |
509 | 121 |
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
|
122 |
begin |
6748 | 123 |
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
|
124 |
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
|
125 |
aa:= a; |
6460 | 126 |
{$IFDEF USE_SDLTHREADS} |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
127 |
SDL_delay(0); //ThreadSwitch was only a hint |
6460 | 128 |
{$ELSE} |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
129 |
ThreadSwitch(); |
6460 | 130 |
{$ENDIF} |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
131 |
repeat |
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
|
132 |
if (CanUseAmmo[a]) |
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
|
133 |
and ((not isMoved) or ((AmmoTests[a].flags and amtest_OnTurn) = 0)) |
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
|
134 |
and ((i = 0) or ((AmmoTests[a].flags and amtest_NoTarget) = 0)) |
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
|
135 |
then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
136 |
begin |
3407 | 137 |
{$HINTS OFF} |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
138 |
Score:= AmmoTests[a].proc(Me, Targets.ar[i].Point, BotLevel, ap); |
3407 | 139 |
{$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
|
140 |
if Actions.Score + Score > BestActions.Score then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
141 |
if (BestActions.Score < 0) or (Actions.Score + Score > BestActions.Score + Byte(BotLevel) * 2048) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
142 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
143 |
BestActions:= Actions; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
144 |
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
|
145 |
BestActions.isWalkingToABetterPlace:= false; |
194 | 146 |
|
7132 | 147 |
AddAction(BestActions, aia_Weapon, Longword(a), 300 + random(400), 0, 0); |
5162 | 148 |
|
7132 | 149 |
if (ap.Angle > 0) then |
150 |
AddAction(BestActions, aia_LookRight, 0, 200, 0, 0) |
|
151 |
else if (ap.Angle < 0) then |
|
152 |
AddAction(BestActions, aia_LookLeft, 0, 200, 0, 0); |
|
153 |
||
154 |
if (ap.Time <> 0) then |
|
155 |
AddAction(BestActions, aia_Timer, ap.Time div 1000, 400, 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
|
156 |
|
7132 | 157 |
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
|
158 |
begin |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
159 |
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
|
160 |
if dAngle > 0 then |
7132 | 161 |
begin |
162 |
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
|
163 |
AddAction(BestActions, aia_Up, aim_release, dAngle, 0, 0) |
7132 | 164 |
end |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
165 |
else if dAngle < 0 then |
7132 | 166 |
begin |
167 |
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
|
168 |
AddAction(BestActions, aia_Down, aim_release, -dAngle, 0, 0) |
7132 | 169 |
end |
170 |
end; |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
171 |
|
7132 | 172 |
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
|
173 |
begin |
7132 | 174 |
AddAction(BestActions, aia_Put, 0, 1, ap.AttackPutX, ap.AttackPutY) |
175 |
end; |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
176 |
|
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
177 |
if (Ammoz[a].Ammo.Propz and ammoprop_OscAim) <> 0 then |
7132 | 178 |
begin |
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_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
|
180 |
AddAction(BestActions, aia_attack, aim_release, 1, 0, 0); |
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
|
181 |
|
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
|
182 |
AddAction(BestActions, aia_Down, aim_push, 100 + random(150), 0, 0); |
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
|
183 |
AddAction(BestActions, aia_Down, aim_release, 32, 0, 0); |
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
|
184 |
|
7197
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_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
|
186 |
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
|
187 |
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
|
188 |
end else |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
189 |
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
|
190 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
191 |
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
|
192 |
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
|
193 |
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
|
194 |
|
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 |
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
|
196 |
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
|
197 |
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
|
198 |
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
|
199 |
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
|
200 |
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
|
201 |
|
7132 | 202 |
if ap.ExplR > 0 then |
203 |
AddAction(BestActions, aia_AwareExpl, ap.ExplR, 10, ap.ExplX, ap.ExplY); |
|
204 |
end |
|
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; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
206 |
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
|
207 |
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
|
208 |
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
|
209 |
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
|
210 |
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
|
211 |
end |
64 | 212 |
end; |
4 | 213 |
|
6393 | 214 |
procedure Walk(Me: PGear; var Actions: TActions); |
80 | 215 |
const FallPixForBranching = cHHRadius * 2 + 8; |
6393 | 216 |
var |
3407 | 217 |
ticks, maxticks, steps, tmp: Longword; |
433 | 218 |
BaseRate, BestRate, Rate: integer; |
75 | 219 |
GoInfo: TGoInfo; |
80 | 220 |
CanGo: boolean; |
221 |
AltMe: TGear; |
|
3407 | 222 |
BotLevel: Byte; |
6392 | 223 |
a: TAmmoType; |
64 | 224 |
begin |
3407 | 225 |
ticks:= 0; // avoid compiler hint |
433 | 226 |
Stack.Count:= 0; |
6392 | 227 |
|
228 |
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
|
229 |
CanUseAmmo[a]:= Assigned(AmmoTests[a].proc) and (HHHasAmmo(Me^.Hedgehog^, a) > 0); |
6392 | 230 |
|
4372 | 231 |
BotLevel:= Me^.Hedgehog^.BotLevel; |
75 | 232 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
233 |
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
|
234 |
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
|
235 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
236 |
maxticks:= TurnTimeLeft; |
75 | 237 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
238 |
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
|
239 |
TestAmmos(Actions, Me, false); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
240 |
|
433 | 241 |
BestRate:= RatePlace(Me); |
4374 | 242 |
BaseRate:= Max(BestRate, 0); |
75 | 243 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
244 |
// switch to 'skip' if we can't 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
|
245 |
if (Ammoz[Me^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NeedTarget) <> 0 then |
7132 | 246 |
AddAction(Actions, aia_Weapon, Longword(amSkip), 100 + random(200), 0, 0); |
247 |
||
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
248 |
if ((CurrentHedgehog^.MultiShootAttacks = 0) or ((Ammoz[Me^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NoMoveAfter) = 0)) |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
249 |
and (GameFlags and gfArtillery = 0) then |
433 | 250 |
begin |
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
251 |
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
|
252 |
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
|
253 |
Push(0, Actions, Me^, tmp xor 3); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
254 |
|
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
255 |
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
|
256 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
257 |
Pop(ticks, Actions, Me^); |
193 | 258 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
259 |
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
|
260 |
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
|
261 |
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
|
262 |
else |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
263 |
AddAction(Actions, aia_WaitXR, 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
|
264 |
|
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
265 |
steps:= 0; |
82 | 266 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
267 |
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
|
268 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
269 |
{$HINTS OFF} |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
270 |
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
|
271 |
{$HINTS ON} |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
272 |
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
|
273 |
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
|
274 |
break; |
194 | 275 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
276 |
if (BotLevel < 5) and (GoInfo.JumpType = jmpHJump) then // hjump support |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
277 |
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
|
278 |
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
|
279 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
280 |
if Me^.dX.isNegative then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
281 |
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
|
282 |
else |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
283 |
AddAction(MadeActions, aia_LookLeft, 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
|
284 |
|
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
285 |
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
|
286 |
AddAction(MadeActions, aia_HJump, 0, 350, 0, 0); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
287 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
288 |
if Me^.dX.isNegative then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
289 |
AddAction(MadeActions, aia_LookLeft, 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
|
290 |
else |
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_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
|
292 |
end; |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
293 |
if (BotLevel < 3) and (GoInfo.JumpType = jmpLJump) then // ljump support |
7250 | 294 |
begin |
295 |
// push current position so we proceed from it after checking jump opportunities |
|
296 |
if CanGo then Push(ticks, Actions, Me^, Me^.Message); |
|
297 |
// first check where we go after jump |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
298 |
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
|
299 |
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
|
300 |
AddAction(MadeActions, aia_LJump, 0, 305 + random(50), 0, 0); |
7250 | 301 |
break |
302 |
end; |
|
433 | 303 |
|
7197
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
304 |
// 'not CanGO' means we can't go straight, possible jumps are checked above |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
305 |
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
|
306 |
break; |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
307 |
|
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
308 |
inc(steps); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
309 |
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
|
310 |
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
|
311 |
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
|
312 |
begin |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
313 |
BestActions:= Actions; |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
314 |
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
|
315 |
BestRate:= Rate; |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
316 |
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
|
317 |
end |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
318 |
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
|
319 |
break; |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
320 |
if ((Me^.State and gstAttacked) = 0) and ((steps mod 4) = 0) then |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
321 |
TestAmmos(Actions, Me, true); |
5a9775b97c7e
- TestSniperRifle ftw (still needs some consts adjustments, because AI seems to love sniper rifle too much)
unc0rr
parents:
7178
diff
changeset
|
322 |
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
|
323 |
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
|
324 |
end {while}; |
193 | 325 |
|
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 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
|
327 |
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
|
328 |
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
|
329 |
end {if} |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
330 |
end; |
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
331 |
|
508 | 332 |
function Think(Me: Pointer): ptrint; |
74 | 333 |
var BackMe, WalkMe: TGear; |
6992 | 334 |
switchCount: LongInt; |
335 |
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
|
336 |
switchImmediatelyAvailable: boolean; |
6393 | 337 |
Actions: TActions; |
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
338 |
begin |
509 | 339 |
InterlockedIncrement(hasThread); |
433 | 340 |
StartTicks:= GameTicks; |
6393 | 341 |
currHedgehogIndex:= CurrentTeam^.CurrHedgehog; |
342 |
itHedgehog:= currHedgehogIndex; |
|
343 |
switchesNum:= 0; |
|
344 |
||
345 |
switchImmediatelyAvailable:= (CurAmmoGear <> nil) and (CurAmmoGear^.Kind = gtSwitcher); |
|
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
|
346 |
if PGear(Me)^.Hedgehog^.BotLevel <> 5 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
|
347 |
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
|
348 |
else switchCount:= 0; |
509 | 349 |
|
500 | 350 |
if (PGear(Me)^.State and gstAttacked) = 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
|
351 |
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
|
352 |
begin |
6393 | 353 |
// iterate over current team hedgehogs |
354 |
repeat |
|
355 |
WalkMe:= CurrentTeam^.Hedgehogs[itHedgehog].Gear^; |
|
356 |
||
357 |
Actions.Count:= 0; |
|
358 |
Actions.Pos:= 0; |
|
359 |
Actions.Score:= 0; |
|
360 |
if switchesNum > 0 then |
|
361 |
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
|
362 |
if not switchImmediatelyAvailable then |
6393 | 363 |
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
|
364 |
// when AI has to use switcher, make it cost smth unless they have a lot of switches |
6992 | 365 |
if (switchCount < 10) then Actions.Score:= (-27+switchCount*3)*4000; |
6393 | 366 |
AddAction(Actions, aia_Weapon, Longword(amSwitch), 300 + random(200), 0, 0); |
367 |
AddAction(Actions, aia_attack, aim_push, 300 + random(300), 0, 0); |
|
368 |
AddAction(Actions, aia_attack, aim_release, 1, 0, 0); |
|
369 |
end; |
|
370 |
for i:= 1 to switchesNum do |
|
371 |
AddAction(Actions, aia_Switch, 0, 300 + random(200), 0, 0); |
|
372 |
end; |
|
373 |
Walk(@WalkMe, Actions); |
|
374 |
||
375 |
// find another hog in team |
|
376 |
repeat |
|
377 |
itHedgehog:= Succ(itHedgehog) mod CurrentTeam^.HedgehogsNumber; |
|
378 |
until (itHedgehog = currHedgehogIndex) or (CurrentTeam^.Hedgehogs[itHedgehog].Gear <> nil); |
|
379 |
||
6748 | 380 |
|
6393 | 381 |
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
|
382 |
until (not (switchImmediatelyAvailable or (switchCount > 0))) |
6393 | 383 |
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
|
384 |
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
|
385 |
or BestActions.isWalkingToABetterPlace; |
6393 | 386 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
387 |
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
|
388 |
SDL_Delay(1000); |
6393 | 389 |
|
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
|
390 |
if (BestActions.Score < -1023) and (not BestActions.isWalkingToABetterPlace) then |
6393 | 391 |
begin |
392 |
BestActions.Count:= 0; |
|
393 |
AddAction(BestActions, aia_Skip, 0, 250, 0, 0); |
|
394 |
end; |
|
395 |
||
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
396 |
end else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
397 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
398 |
begin |
6393 | 399 |
BackMe:= PGear(Me)^; |
400 |
while (not StopThinking) and (BestActions.Count = 0) do |
|
401 |
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
|
402 |
(* |
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
|
403 |
// 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
|
404 |
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
|
405 |
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
|
406 |
*) |
6393 | 407 |
FillBonuses(true); |
408 |
WalkMe:= BackMe; |
|
409 |
Actions.Count:= 0; |
|
410 |
Actions.Pos:= 0; |
|
411 |
Actions.Score:= 0; |
|
412 |
Walk(@WalkMe, Actions); |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
413 |
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
|
414 |
SDL_Delay(100) |
6393 | 415 |
end |
416 |
end; |
|
417 |
||
7426
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7416
diff
changeset
|
418 |
PGear(Me)^.State:= PGear(Me)^.State and (not gstHHThinking); |
509 | 419 |
Think:= 0; |
420 |
InterlockedDecrement(hasThread) |
|
66
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
421 |
end; |
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
422 |
|
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
423 |
procedure StartThink(Me: PGear); |
9643d75baf1e
Many AI improvements, bots do think in separate thread
unc0rr
parents:
64
diff
changeset
|
424 |
begin |
542 | 425 |
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
|
426 |
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
|
427 |
exit; |
506 | 428 |
|
2376 | 429 |
//DeleteCI(Me); // this might break demo |
369 | 430 |
Me^.State:= Me^.State or gstHHThinking; |
431 |
Me^.Message:= 0; |
|
509 | 432 |
|
433 |
BestActions.Count:= 0; |
|
434 |
BestActions.Pos:= 0; |
|
5163 | 435 |
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
|
436 |
BestActions.isWalkingToABetterPlace:= false; |
509 | 437 |
|
433 | 438 |
StopThinking:= false; |
439 |
ThinkingHH:= Me; |
|
509 | 440 |
|
70 | 441 |
FillTargets; |
80 | 442 |
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
|
443 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
444 |
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
|
445 |
exit |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
446 |
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
|
447 |
|
369 | 448 |
FillBonuses((Me^.State and gstAttacked) <> 0); |
4900 | 449 |
AddFileLog('Enter Think Thread'); |
6460 | 450 |
{$IFDEF USE_SDLTHREADS} |
451 |
ThinkThread := SDL_CreateThread(@Think{$IFDEF SDL13}, nil{$ENDIF}, Me); |
|
452 |
{$ELSE} |
|
6027 | 453 |
BeginThread(@Think, Me, ThinkThread); |
454 |
{$ENDIF} |
|
5504 | 455 |
AddFileLog('Thread started'); |
433 | 456 |
end; |
191
a03c2d037e24
Bots are in the same thread as game. Fixes FreePascal issues.
unc0rr
parents:
183
diff
changeset
|
457 |
|
7216 | 458 |
//var scoreShown: boolean = false; |
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
|
459 |
|
433 | 460 |
procedure ProcessBot; |
6982 | 461 |
const cStopThinkTime = 40; |
4 | 462 |
begin |
602 | 463 |
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
|
464 |
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
|
465 |
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
|
466 |
and (TurnTimeLeft < cHedgehogTurnTime - 50) then |
433 | 467 |
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
|
468 |
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
|
469 |
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
|
470 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
471 |
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
|
472 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
473 |
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
|
474 |
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
|
475 |
end; |
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
|
476 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
477 |
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
|
478 |
exit; |
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
|
479 |
|
7216 | 480 |
//scoreShown:= false; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
481 |
StartThink(Gear); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
482 |
StartTicks:= GameTicks |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6462
diff
changeset
|
483 |
|
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
|
484 |
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
|
485 |
begin |
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
|
486 |
{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
|
487 |
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
|
488 |
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
|
489 |
scoreShown:= true |
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
|
490 |
end;} |
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
|
491 |
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
|
492 |
end |
509 | 493 |
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
|
494 |
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
|
495 |
StopThinking:= true |
369 | 496 |
end; |
4 | 497 |
|
3038 | 498 |
procedure initModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
499 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
500 |
hasThread:= 0; |
6982 | 501 |
StartTicks:= 0; |
6025
cac1d5601d7c
reviewed the build system and parts of the previous merge, performed some code cleanup
koda
parents:
5611
diff
changeset
|
502 |
ThinkThread:= ThinkThread; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
503 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
504 |
|
3038 | 505 |
procedure freeModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
506 |
begin |
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6992
diff
changeset
|
507 |
FreeActionsList(); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
508 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
509 |
|
4 | 510 |
end. |