@@ -0,0 +1,149 @@ | |||||
;; lobo: Logo Bolo | |||||
;; (c) Ben Kurtovic, 2011-2012 | |||||
to ai-do-cycle | |||||
if ai-objective = "nothing" [ | |||||
set ai-objective ai-get-objective | |||||
] | |||||
if ai-objective = "base-run" [ | |||||
ai-do-base-run | |||||
] | |||||
if ai-objective = "place-pill" [ | |||||
ai-do-place-pill | |||||
] | |||||
if ai-objective = "refuel" [ | |||||
ai-do-refuel | |||||
] | |||||
if ai-objective = "capture-pill" [ | |||||
ai-do-capture-pill | |||||
] | |||||
if ai-objective = "capture-base" [ | |||||
ai-do-capture-base | |||||
] | |||||
if ai-objective = "attack-player" [ | |||||
ai-do-attack-player | |||||
] | |||||
end | |||||
to-report ai-get-objective | |||||
if any? bases with [team = -1] [ | |||||
report "base-run" | |||||
] | |||||
if number-of-pills > 0 [ | |||||
report "place-pill" | |||||
] | |||||
if any? pillboxes with [team != 1] and ammunition > 4 and armor > 6 [ | |||||
report "capture-pill" | |||||
] | |||||
if any? bases with [team = 0] and ammunition > (max-ammo / 2) and armor > 2 [ | |||||
report "capture-base" | |||||
] | |||||
if player != nobody and ammunition > (max-ammo / 2) and armor > 2 [ | |||||
report "attack-player" | |||||
] | |||||
if any? bases with [team = 1] and (ammunition < max-ammo or armor < max-armor) [ | |||||
report "refuel" | |||||
] | |||||
if player != nobody [ | |||||
report "attack-player" | |||||
] | |||||
report "nothing" | |||||
end | |||||
to ai-do-base-run | |||||
let mxcor xcor | |||||
let mycor ycor | |||||
let target min-one-of (bases with [team = -1]) [distancexy mxcor mycor] | |||||
let dist ai-approach-target target 0.1 | |||||
if dist < 0.1 [ | |||||
set ai-objective "nothing" | |||||
] | |||||
end | |||||
to ai-do-place-pill | |||||
let mxcor xcor | |||||
let mycor ycor | |||||
let target min-one-of bases [distancexy mxcor mycor] | |||||
let dist ai-approach-target target 1 | |||||
if dist < 2 [ | |||||
place-pill | |||||
] | |||||
set ai-objective "nothing" | |||||
end | |||||
to ai-do-refuel | |||||
let mxcor xcor | |||||
let mycor ycor | |||||
let target min-one-of (bases with [team = 1]) [distancexy mxcor mycor] | |||||
let dist ai-approach-target target 0.1 | |||||
if dist < 1 and ammunition > (max-ammo / 2) and armor > (max-armor / 2) [ | |||||
set ai-objective "nothing" | |||||
] | |||||
end | |||||
to ai-do-capture-pill | |||||
let mxcor xcor | |||||
let mycor ycor | |||||
let target min-one-of (pillboxes with [team != 1]) [distancexy mxcor mycor] | |||||
let dist ai-approach-target target 2 | |||||
ifelse number-of-pills > 0 or ammunition = 0 [ | |||||
set ai-objective "nothing" | |||||
] [ | |||||
if dist < 5 and [armor] of target > 0 [ | |||||
fire | |||||
] | |||||
if [armor] of target = 0 [ | |||||
set dist ai-approach-target target 0.1 | |||||
] | |||||
] | |||||
end | |||||
to ai-do-capture-base | |||||
let mxcor xcor | |||||
let mycor ycor | |||||
let target min-one-of (bases with [team != 1]) [distancexy mxcor mycor] | |||||
let dist ai-approach-target target 2 | |||||
ifelse target = nobody or ammunition = 0 [ | |||||
set ai-objective "nothing" | |||||
] [ | |||||
if dist < 5 and [armor] of target > 0 [ | |||||
fire | |||||
] | |||||
if [armor] of target = 0 [ | |||||
set dist ai-approach-target target 0.1 | |||||
] | |||||
] | |||||
end | |||||
to ai-do-attack-player | |||||
let mxcor xcor | |||||
let mycor ycor | |||||
ifelse player = nobody [ | |||||
set ai-objective "nothing" | |||||
] [ | |||||
let dist ai-approach-target player 1 | |||||
if ammunition = 0 [ | |||||
set ai-objective "nothing" | |||||
] | |||||
if dist < 5 [ | |||||
fire | |||||
] | |||||
] | |||||
end | |||||
to-report ai-approach-target [target min-dist] | |||||
if target != nobody [ | |||||
tank-facexy ([xcor] of target) ([ycor] of target) | |||||
set is-accelerating? true | |||||
let dist distancexy ([xcor] of target) ([ycor] of target) | |||||
if dist < 2 and speed > 0.075 [ | |||||
decelerate friction * 5 | |||||
] | |||||
if dist < min-dist [ | |||||
set is-accelerating? false | |||||
set speed speed / 2 | |||||
] | |||||
report dist | |||||
] | |||||
report 0 | |||||
end |
@@ -57,7 +57,7 @@ to do-bullet-logic | |||||
let shootable-pills-here pillboxes-here with [alive? = true] | let shootable-pills-here pillboxes-here with [alive? = true] | ||||
let targets (turtle-set tanks-here shootable-pills-here) | let targets (turtle-set tanks-here shootable-pills-here) | ||||
if is-shooter-tank? [ ; Only tanks can shoot at bases | if is-shooter-tank? [ ; Only tanks can shoot at bases | ||||
let shootable-bases-here bases-here with [armor > 0 and team != -1 and team != team-of-shooter] | |||||
let shootable-bases-here bases-here with [armor > 0 and team != -1 and team != [team-of-shooter] of myself] | |||||
set targets (turtle-set targets shootable-bases-here) | set targets (turtle-set targets shootable-bases-here) | ||||
] | ] | ||||
let target min-one-of targets [distancexy mxcor mycor] | let target min-one-of targets [distancexy mxcor mycor] | ||||
@@ -5,6 +5,7 @@ | |||||
;; | ;; | ||||
__includes [ | __includes [ | ||||
"ai.nls" | |||||
"base.nls" | "base.nls" | ||||
"bullet.nls" | "bullet.nls" | ||||
"explosion.nls" | "explosion.nls" | ||||
@@ -452,6 +453,17 @@ TEXTBOX | |||||
0.0 | 0.0 | ||||
1 | 1 | ||||
MONITOR | |||||
59 | |||||
466 | |||||
187 | |||||
511 | |||||
Current AI Routine | |||||
[ai-objective] of one-of tanks with [not is-player?] | |||||
17 | |||||
1 | |||||
11 | |||||
@#$#@#$#@ | @#$#@#$#@ | ||||
LOBO | LOBO | ||||
---- | ---- | ||||
@@ -501,7 +513,9 @@ CREDITS / MISC | |||||
* My dad for introducing me to Bolo many years ago, and for helping me simplify the original Bolo game into something possible with NetLogo. | * My dad for introducing me to Bolo many years ago, and for helping me simplify the original Bolo game into something possible with NetLogo. | ||||
* Josh Hofing for advice on implementing certain features and emotional support. | |||||
* Josh Hofing for advice on implementing certain features and positive encouragement. | |||||
* Chain Algorithm - I wrote the entire AI routine in less than an hour immediately before the project was due (ha!), and I don't think it would be possible if I hadn't been listening to your music on loop the entire time. Really gets your blood pumping, y'know? Yeah. | |||||
This project is available on GitHub at https://github.com/earwig/lobo. I used it for syncing code between my netbook and my desktop when working on the project away from home. | This project is available on GitHub at https://github.com/earwig/lobo. I used it for syncing code between my netbook and my desktop when working on the project away from home. | ||||
@@ -43,6 +43,7 @@ to set-pill-vars [p-team] | |||||
set color get-pill-color | set color get-pill-color | ||||
set shape (word "pillbox-alive-" armor) | set shape (word "pillbox-alive-" armor) | ||||
set size 1.1 | set size 1.1 | ||||
setxy pxcor pycor | |||||
end | end | ||||
to do-pill-logic | to do-pill-logic | ||||
@@ -19,6 +19,7 @@ tanks-own [ | |||||
number-of-pills | number-of-pills | ||||
speed | speed | ||||
team | team | ||||
ai-objective | |||||
] | ] | ||||
;; ========== | ;; ========== | ||||
@@ -47,6 +48,7 @@ to set-tank-vars [player? tteam theading] | |||||
set number-of-pills 0 | set number-of-pills 0 | ||||
set speed 0 | set speed 0 | ||||
set team tteam | set team tteam | ||||
set ai-objective "nothing" | |||||
set color get-tank-color | set color get-tank-color | ||||
set heading theading | set heading theading | ||||
@@ -55,6 +57,9 @@ to set-tank-vars [player? tteam theading] | |||||
end | end | ||||
to do-tank-logic | to do-tank-logic | ||||
if not is-player? [ | |||||
ai-do-cycle | |||||
] | |||||
if is-accelerating? [ | if is-accelerating? [ | ||||
accelerate acceleration | accelerate acceleration | ||||
] | ] | ||||
@@ -147,6 +152,16 @@ to kill-tank | |||||
ask max-one-of tanks [who] [ ; Tank that was just spawned | ask max-one-of tanks [who] [ ; Tank that was just spawned | ||||
play-sound "spawn" | play-sound "spawn" | ||||
] | ] | ||||
if number-of-pills > 0 [ | |||||
ask patch ((3 - random 6) + xcor) ((3 - random 6) + ycor) [ | |||||
spawn-pillbox | |||||
ask max-one-of pillboxes [who] [ | |||||
set armor 0 | |||||
set alive? false | |||||
set shape "pillbox-dead" | |||||
] | |||||
] | |||||
] | |||||
die | die | ||||
end | end | ||||