@@ -62,33 +62,33 @@ to do-base-logic | |||||
end | end | ||||
to claim-base [claimer] | to claim-base [claimer] | ||||
debug who "BASE-CLAIM" (word "by " ([who] of claimer) ": " team " -> " [team] of claimer) | |||||
debug who "BASE-TAKE" (word "by " ([who] of claimer) ": " team " -> " [team] of claimer) | |||||
set team [team] of claimer | set team [team] of claimer | ||||
set color get-base-color | set color get-base-color | ||||
set last-armor-regen timer ; Don't regenerate armor right after being claimed | |||||
end | end | ||||
to refuel-tank [tank-to-refuel] | to refuel-tank [tank-to-refuel] | ||||
let did-armor-refuel? false | |||||
let did-ammo-refuel? false | |||||
let time-since-last-refuel timer - last-refuel | let time-since-last-refuel timer - last-refuel | ||||
ask tank-to-refuel [ | ask tank-to-refuel [ | ||||
if armor < tank-max-armor and ([armor] of myself) > 1 and time-since-last-refuel > 25 / max-fps [ ; 25 frames | |||||
set armor armor + 1 | |||||
set did-armor-refuel? true | |||||
] | |||||
if ammunition < tank-max-ammo and ([ammunition] of myself) > 1 and time-since-last-refuel > 10 / max-fps [ ; 10 frames | |||||
set ammunition ammunition + 1 | |||||
set did-ammo-refuel? true | |||||
] | |||||
] | |||||
if did-armor-refuel? or did-ammo-refuel? [ | |||||
set last-refuel timer | |||||
ifelse did-armor-refuel? [ | |||||
set armor armor - 1 | |||||
ifelse armor < tank-max-armor and ([armor] of myself) > 1 [ | |||||
if time-since-last-refuel > 25 / max-fps [ ; 25 frames | |||||
set armor armor + 1 | |||||
ask myself [ | |||||
set armor armor - 1 | |||||
set last-refuel timer | |||||
] | |||||
] | |||||
] [ | ] [ | ||||
set ammunition ammunition - 1 | |||||
if ammunition < tank-max-ammo and ([ammunition] of myself) > 1 [ | |||||
if time-since-last-refuel > 10 / max-fps [ ; 10 frames | |||||
set ammunition ammunition + 1 | |||||
ask myself [ | |||||
set ammunition ammunition - 1 | |||||
set last-refuel timer | |||||
] | |||||
] | |||||
] | |||||
] | ] | ||||
] | ] | ||||
end | end | ||||
@@ -97,11 +97,11 @@ to regenerate | |||||
let time-since-last-ammo-regen timer - last-ammo-regen | let time-since-last-ammo-regen timer - last-ammo-regen | ||||
let time-since-last-armor-regen timer - last-armor-regen | let time-since-last-armor-regen timer - last-armor-regen | ||||
if ammunition < base-max-ammo and time-since-last-ammo-regen > 10 [ | |||||
if ammunition < base-max-ammo and time-since-last-ammo-regen > 6 [ | |||||
set ammunition ammunition + 1 | set ammunition ammunition + 1 | ||||
set last-ammo-regen timer | set last-ammo-regen timer | ||||
] | ] | ||||
if armor < base-max-armor and time-since-last-armor-regen > 25 [ | |||||
if armor < base-max-armor and time-since-last-armor-regen > 15 [ | |||||
set armor armor + 1 | set armor armor + 1 | ||||
set last-armor-regen timer | set last-armor-regen timer | ||||
] | ] | ||||
@@ -109,13 +109,14 @@ end | |||||
to base-shot-at | to base-shot-at | ||||
set armor armor - 1 | set armor armor - 1 | ||||
set last-armor-regen timer ; Don't regenerate armor right after being shot | |||||
ifelse armor > 0 [ | ifelse armor > 0 [ | ||||
debug who "BASE-SHOT" (word "by " ([shooter] of myself)) | debug who "BASE-SHOT" (word "by " ([shooter] of myself)) | ||||
explode "decay" | |||||
explode "small" | |||||
play-sound "shot" | play-sound "shot" | ||||
] [ | ] [ | ||||
debug who "BASE-KILL" (word "by " ([shooter] of myself)) | debug who "BASE-KILL" (word "by " ([shooter] of myself)) | ||||
explode "shot" | |||||
explode "medium" | |||||
play-sound "kill" | play-sound "kill" | ||||
] | ] | ||||
end | end | ||||
@@ -4,9 +4,12 @@ | |||||
breed [bullets bullet] | breed [bullets bullet] | ||||
bullets-own [ | bullets-own [ | ||||
is-shooter-player? | |||||
is-shooter-tank? | |||||
max-travel-distance | max-travel-distance | ||||
shooter | shooter | ||||
speed | speed | ||||
team-of-shooter | |||||
travel-distance | travel-distance | ||||
] | ] | ||||
@@ -14,14 +17,24 @@ bullets-own [ | |||||
;; Procedures | ;; Procedures | ||||
;; ========== | ;; ========== | ||||
to fire-bullet | |||||
to fire-bullet [dist] | |||||
hatch-bullets 1 [ | hatch-bullets 1 [ | ||||
set max-travel-distance 8 | |||||
set max-travel-distance dist | |||||
set is-shooter-player? false | |||||
set is-shooter-tank? false | |||||
if [breed] of myself = tanks [ | |||||
if [is-player?] of myself [ | |||||
set is-shooter-player? true | |||||
] | |||||
set is-shooter-tank? true | |||||
] | |||||
set shooter [who] of myself | set shooter [who] of myself | ||||
set speed 1 | set speed 1 | ||||
set team-of-shooter [team] of myself | |||||
set travel-distance 0 | set travel-distance 0 | ||||
set color white | set color white | ||||
set label "" | |||||
set shape "bullet" | set shape "bullet" | ||||
set size 0.5 | set size 0.5 | ||||
@@ -34,30 +47,30 @@ end | |||||
to do-bullet-logic | to do-bullet-logic | ||||
fd speed | fd speed | ||||
set travel-distance travel-distance + speed | set travel-distance travel-distance + speed | ||||
if travel-distance > max-travel-distance [ | |||||
explode "decay" | |||||
if travel-distance >= max-travel-distance [ | |||||
explode "small" | |||||
die | die | ||||
] | ] | ||||
let mxcor xcor | let mxcor xcor | ||||
let mycor ycor | let mycor ycor | ||||
let is-close-enough false | |||||
let shootable-bases-here bases-here with [armor > 0 and team != -1 and team != [team] of tank [shooter] of myself] | |||||
let targets (turtle-set tanks-here shootable-bases-here) | |||||
let shootable-pills-here pillboxes-here with [alive? = true] | |||||
let targets (turtle-set tanks-here shootable-pills-here) | |||||
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] | |||||
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] | ||||
if target != nobody [ | if target != nobody [ | ||||
ask target [ | ask target [ | ||||
if distancexy mxcor mycor < 0.65 [ | if distancexy mxcor mycor < 0.65 [ | ||||
set is-close-enough true | |||||
ifelse breed = tanks [ | |||||
tank-shot-at | |||||
] [ | |||||
base-shot-at | |||||
if breed = tanks [ tank-shot-at ] | |||||
if breed = pillboxes [ pill-shot-at ] | |||||
if breed = bases [ base-shot-at ] | |||||
ask myself [ | |||||
die | |||||
] | ] | ||||
] | ] | ||||
] | ] | ||||
] | ] | ||||
if is-close-enough [ | |||||
die | |||||
] | |||||
end | end |
@@ -2,7 +2,7 @@ | |||||
;; (c) Ben Kurtovic, 2011 | ;; (c) Ben Kurtovic, 2011 | ||||
globals [ | globals [ | ||||
explodes | |||||
explosions-table | |||||
] | ] | ||||
breed [explosions explosion] | breed [explosions explosion] | ||||
@@ -19,19 +19,22 @@ explosions-own [ | |||||
to make-explosions-table | to make-explosions-table | ||||
; Fun with particle effects! | ; Fun with particle effects! | ||||
set explodes table:make | |||||
table:put explodes "decay" [["explosion-decay" 0.65 10 0.5]] | |||||
table:put explodes "shot" [["explosion-shot" 1.25 10 0.5]] | |||||
table:put explodes "kill" [["explosion-kill" 3 20 0.5] ["explosion-shot" 1.25 15 1] | |||||
["explosion-shot" 1.25 15 1 ] ["explosion-shot" 1.25 10 1] | |||||
["explosion-shot" 1.25 10 1 ] ["explosion-decay" 0.65 10 2] | |||||
["explosion-decay" 0.65 10 2 ] ["explosion-decay" 0.65 8 2] | |||||
["explosion-decay" 0.65 7 2 ] ["explosion-decay" 0.65 5 3] | |||||
["explosion-decay" 0.65 5 3 ]] | |||||
set explosions-table table:make | |||||
table:put explosions-table "small" [["explosion-small" 0.65 10 0.5]] | |||||
table:put explosions-table "medium" [["explosion-med" 1.25 10 0.5]] | |||||
table:put explosions-table "large" [["explosion-large" 2.5 15 0.5] ["explosion-med" 1.25 10 1] | |||||
["explosion-med" 1.1 8 1 ] ["explosion-small" 0.65 7 2] | |||||
["explosion-small" 0.65 5 3 ]] | |||||
table:put explosions-table "huge" [["explosion-large" 3 20 0.5] ["explosion-med" 1.25 15 1] | |||||
["explosion-med" 1.25 15 1 ] ["explosion-med" 1.25 10 1] | |||||
["explosion-med" 1.25 10 1 ] ["explosion-small" 0.65 10 2] | |||||
["explosion-small" 0.65 10 2 ] ["explosion-small" 0.65 8 2] | |||||
["explosion-small" 0.65 7 2 ] ["explosion-small" 0.65 5 3] | |||||
["explosion-small" 0.65 5 3 ]] | |||||
end | end | ||||
to explode [name] | to explode [name] | ||||
let data table:get explodes name | |||||
let data table:get explosions-table name | |||||
foreach data [ | foreach data [ | ||||
create-explosion ? | create-explosion ? | ||||
] | ] | ||||
@@ -8,6 +8,7 @@ __includes [ | |||||
"base.nls" | "base.nls" | ||||
"bullet.nls" | "bullet.nls" | ||||
"explosion.nls" | "explosion.nls" | ||||
"pillbox.nls" | |||||
"player.nls" | "player.nls" | ||||
"tank.nls" | "tank.nls" | ||||
] | ] | ||||
@@ -38,20 +39,22 @@ to setup | |||||
spawn-player 0 0 0 | spawn-player 0 0 0 | ||||
spawn-tank 0 -6 0 90 | spawn-tank 0 -6 0 90 | ||||
spawn-tank 1 6 0 270 | spawn-tank 1 6 0 270 | ||||
;spawn-base -3 -7 | |||||
spawn-base 0 -7 | spawn-base 0 -7 | ||||
;spawn-base 3 -7 | |||||
spawn-pillbox 6 6 | |||||
render | render | ||||
set last-tick-time timer | set last-tick-time timer | ||||
end | end | ||||
to go | to go | ||||
ask player [ | ask player [ | ||||
do-player-logic | |||||
do-player-logic | |||||
] | ] | ||||
ask tanks [ | ask tanks [ | ||||
do-tank-logic | do-tank-logic | ||||
] | ] | ||||
ask pillboxes [ | |||||
do-pill-logic | |||||
] | |||||
ask bases [ | ask bases [ | ||||
do-base-logic | do-base-logic | ||||
] | ] | ||||
@@ -61,7 +64,8 @@ to go | |||||
ask explosions [ | ask explosions [ | ||||
keep-exploding | keep-exploding | ||||
] | ] | ||||
show-crosshair | |||||
show-crosshairs | |||||
show-hud | |||||
render | render | ||||
keep-time | keep-time | ||||
end | end | ||||
@@ -102,14 +106,17 @@ to setup-defaults | |||||
set tank-max-armor 8 | set tank-max-armor 8 | ||||
set base-max-ammo 50 | set base-max-ammo 50 | ||||
set base-max-armor 20 | set base-max-armor 20 | ||||
set pill-anger-range [1.2 0.2] | |||||
set pill-max-armor 8 | |||||
end | end | ||||
to make-sounds-table | to make-sounds-table | ||||
set sounds table:make | set sounds table:make | ||||
table:put sounds "fire" "Hand Clap" | table:put sounds "fire" "Hand Clap" | ||||
table:put sounds "kill" "Electric Snare" | |||||
table:put sounds "noammo" "Cowbell" | table:put sounds "noammo" "Cowbell" | ||||
table:put sounds "pickup" "Hi Bongo" | |||||
table:put sounds "shot" "Acoustic Snare" | table:put sounds "shot" "Acoustic Snare" | ||||
table:put sounds "kill" "Electric Snare" | |||||
end | end | ||||
to load-map | to load-map | ||||
@@ -118,7 +125,7 @@ to load-map | |||||
] | ] | ||||
end | end | ||||
to show-crosshair | |||||
to show-crosshairs | |||||
clear-drawing | clear-drawing | ||||
if mouse-inside? [ | if mouse-inside? [ | ||||
ask patch mouse-xcor mouse-ycor [ | ask patch mouse-xcor mouse-ycor [ | ||||
@@ -151,6 +158,9 @@ to draw-border [b-color b-thickness] | |||||
] | ] | ||||
end | end | ||||
to show-hud | |||||
end | |||||
to render | to render | ||||
display | display | ||||
no-display | no-display | ||||
@@ -359,6 +369,55 @@ C | |||||
NIL | NIL | ||||
NIL | NIL | ||||
BUTTON | |||||
109 | |||||
536 | |||||
368 | |||||
569 | |||||
NIL | |||||
ask one-of bases [claim-base tank 2] | |||||
NIL | |||||
1 | |||||
T | |||||
OBSERVER | |||||
NIL | |||||
NIL | |||||
NIL | |||||
NIL | |||||
MONITOR | |||||
160 | |||||
412 | |||||
259 | |||||
461 | |||||
Player's Pills | |||||
[number-of-pills] of player | |||||
17 | |||||
1 | |||||
12 | |||||
MONITOR | |||||
261 | |||||
584 | |||||
357 | |||||
629 | |||||
Pillbox Anger | |||||
[anger] of pillbox 4 | |||||
6 | |||||
1 | |||||
11 | |||||
MONITOR | |||||
148 | |||||
584 | |||||
246 | |||||
629 | |||||
Pillbox Armor | |||||
[armor] of pillbox 4 | |||||
17 | |||||
1 | |||||
11 | |||||
@#$#@#$#@ | @#$#@#$#@ | ||||
WHAT IS IT? | WHAT IS IT? | ||||
----------- | ----------- | ||||
@@ -456,13 +515,7 @@ Rectangle -7500403 true false 165 210 195 268 | |||||
Rectangle -7500403 true false 105 210 135 268 | Rectangle -7500403 true false 105 210 135 268 | ||||
Polygon -7500403 true false 105 210 135 150 135 210 105 210 | Polygon -7500403 true false 105 210 135 150 135 210 105 210 | ||||
explosion-decay | |||||
false | |||||
0 | |||||
Circle -2674135 true false 2 2 295 | |||||
Circle -955883 true false 75 75 148 | |||||
explosion-kill | |||||
explosion-large | |||||
false | false | ||||
0 | 0 | ||||
Circle -6459832 true false 2 2 297 | Circle -6459832 true false 2 2 297 | ||||
@@ -470,13 +523,48 @@ Circle -2674135 true false 30 30 240 | |||||
Circle -955883 true false 60 60 180 | Circle -955883 true false 60 60 180 | ||||
Circle -1184463 true false 90 90 120 | Circle -1184463 true false 90 90 120 | ||||
explosion-shot | |||||
explosion-med | |||||
false | false | ||||
0 | 0 | ||||
Circle -2674135 true false 0 0 300 | Circle -2674135 true false 0 0 300 | ||||
Circle -955883 true false 45 45 210 | Circle -955883 true false 45 45 210 | ||||
Circle -1184463 true false 90 90 120 | Circle -1184463 true false 90 90 120 | ||||
explosion-small | |||||
false | |||||
0 | |||||
Circle -2674135 true false 2 2 295 | |||||
Circle -955883 true false 75 75 148 | |||||
pillbox-alive | |||||
false | |||||
1 | |||||
Polygon -2674135 true true 270 240 270 270 240 270 180 210 210 180 270 240 | |||||
Rectangle -2674135 true true 225 135 300 165 | |||||
Rectangle -2674135 true true 135 0 165 75 | |||||
Rectangle -2674135 true true 0 135 75 165 | |||||
Rectangle -2674135 true true 135 225 165 300 | |||||
Polygon -2674135 true true 240 30 270 30 270 60 210 120 180 90 240 30 | |||||
Polygon -2674135 true true 30 60 30 30 60 30 120 90 90 120 30 60 | |||||
Polygon -2674135 true true 60 270 30 270 30 240 90 180 120 210 60 270 | |||||
Circle -7500403 true false 45 45 210 | |||||
pillbox-dead | |||||
false | |||||
1 | |||||
Polygon -7500403 true false 240 30 270 30 270 60 240 90 210 60 240 30 | |||||
Rectangle -7500403 true false 135 0 165 45 | |||||
Rectangle -7500403 true false 0 135 45 165 | |||||
Rectangle -7500403 true false 135 255 165 300 | |||||
Rectangle -7500403 true false 255 135 300 165 | |||||
Polygon -7500403 true false 30 60 30 30 60 30 90 60 60 90 30 60 | |||||
Polygon -7500403 true false 60 270 30 270 30 240 60 210 90 240 60 270 | |||||
Polygon -7500403 true false 270 240 270 270 240 270 210 240 240 210 270 240 | |||||
Polygon -2674135 true true 195 165 210 180 210 180 210 210 180 210 165 195 | |||||
Polygon -2674135 true true 165 105 180 90 180 90 210 90 210 120 195 135 | |||||
Polygon -2674135 true true 105 135 90 120 90 120 90 90 120 90 135 105 | |||||
Polygon -2674135 true true 135 195 120 210 120 210 90 210 90 180 105 165 | |||||
tank | tank | ||||
true | true | ||||
1 | 1 | ||||
@@ -0,0 +1,117 @@ | |||||
;; lobo: Logo Bolo | |||||
;; (c) Ben Kurtovic, 2011 | |||||
globals [ | |||||
pill-anger-range | |||||
pill-max-armor | |||||
] | |||||
breed [pillboxes pillbox] | |||||
pillboxes-own [ | |||||
alive? | |||||
anger | |||||
armor | |||||
last-fire-time | |||||
team | |||||
] | |||||
;; ========== | |||||
;; Procedures | |||||
;; ========== | |||||
to spawn-pillbox [pill-xcor pill-ycor] | |||||
create-pillboxes 1 [ | |||||
set-pill-vars (first pill-anger-range) pill-max-armor -1 pill-xcor pill-ycor | |||||
] | |||||
end | |||||
to set-pill-vars [p-anger p-armor p-team p-xcor p-ycor] | |||||
set alive? true | |||||
set anger p-anger | |||||
set armor p-armor | |||||
set last-fire-time timer | |||||
set team p-team | |||||
set color get-pill-color | |||||
set shape "pillbox-alive" | |||||
set size 1.1 | |||||
setxy p-xcor p-ycor | |||||
end | |||||
to do-pill-logic | |||||
set label armor | |||||
ifelse alive? [ | |||||
if timer - last-fire-time > anger [ | |||||
let targets tanks in-radius 9 | |||||
if any? targets [ | |||||
let target min-one-of targets [distancexy [xcor] of myself [ycor] of myself] | |||||
face target | |||||
fire-bullet 9 | |||||
set last-fire-time timer | |||||
] | |||||
] | |||||
relax | |||||
] [ | |||||
if any? tanks-here [ | |||||
pickup-pill | |||||
] | |||||
] | |||||
end | |||||
to pill-shot-at | |||||
set armor armor - 1 | |||||
ifelse armor = 0 [ | |||||
debug who "PILL-KILL" (word "by " ([shooter] of myself)) | |||||
explode "large" | |||||
play-sound "kill" | |||||
set alive? false | |||||
set shape "pillbox-dead" | |||||
] [ | |||||
debug who "PILL-SHOT" (word "by " ([shooter] of myself)) | |||||
explode "medium" | |||||
play-sound "shot" | |||||
enrage | |||||
] | |||||
end | |||||
to relax | |||||
let min-anger first pill-anger-range | |||||
set anger anger + 0.00025 | |||||
if anger > min-anger [ | |||||
set anger min-anger | |||||
] | |||||
end | |||||
to enrage | |||||
let max-anger last pill-anger-range | |||||
set anger anger - 0.2 | |||||
if anger < max-anger [ | |||||
set anger max-anger | |||||
] | |||||
end | |||||
to pickup-pill | |||||
ask one-of tanks-here [ | |||||
debug ([who] of myself) "PILL-TAKE" (word "by " who) | |||||
set number-of-pills number-of-pills + 1 | |||||
] | |||||
play-sound "pickup" | |||||
die | |||||
end | |||||
;; ========= | |||||
;; Reporters | |||||
;; ========= | |||||
to-report get-pill-afiliation | |||||
if team = -1 [ report "neutral" ] | |||||
if team = 0 [ report "ally" ] | |||||
report "enemy" | |||||
end | |||||
to-report get-pill-color | |||||
let affiliation get-base-afiliation | |||||
if affiliation = "ally" [ report green ] | |||||
report red | |||||
end |
@@ -19,6 +19,7 @@ tanks-own [ | |||||
max-fire-rate | max-fire-rate | ||||
max-speed | max-speed | ||||
max-turn | max-turn | ||||
number-of-pills | |||||
speed | speed | ||||
team | team | ||||
] | ] | ||||
@@ -44,6 +45,7 @@ to set-tank-vars [player? tteam txcor tycor theading] | |||||
set max-fire-rate 7 | set max-fire-rate 7 | ||||
set max-speed 0.25 | set max-speed 0.25 | ||||
set max-turn 24 | set max-turn 24 | ||||
set number-of-pills 0 | |||||
set speed 0 | set speed 0 | ||||
set team tteam | set team tteam | ||||
@@ -95,9 +97,9 @@ end | |||||
to fire | to fire | ||||
if fire-cool-down = 0 [ | if fire-cool-down = 0 [ | ||||
ifelse ammunition > 0 [ | ifelse ammunition > 0 [ | ||||
debug who "TANK-FIRE" (word ammunition " left") | |||||
debug who "TANK-FIRE" (word (ammunition - 1) " left") | |||||
set ammunition ammunition - 1 | set ammunition ammunition - 1 | ||||
fire-bullet | |||||
fire-bullet 8 | |||||
play-sound "fire" | play-sound "fire" | ||||
] [ | ] [ | ||||
play-sound "noammo" | play-sound "noammo" | ||||
@@ -107,26 +109,26 @@ to fire | |||||
end | end | ||||
to tank-shot-at | to tank-shot-at | ||||
debug who "TANK-SHOT" (word "by " ([shooter] of myself)) | |||||
set armor armor - 1 | set armor armor - 1 | ||||
ifelse armor = 0 [ | ifelse armor = 0 [ | ||||
explode "kill" | |||||
debug who "TANK-KILL" (word "by " ([shooter] of myself)) | |||||
explode "huge" | |||||
play-sound "kill" | play-sound "kill" | ||||
kill-tank | kill-tank | ||||
] [ | ] [ | ||||
explode "shot" | |||||
debug who "TANK-SHOT" (word "by " ([shooter] of myself)) | |||||
explode "medium" | |||||
play-sound "shot" | play-sound "shot" | ||||
] | ] | ||||
end | end | ||||
to kill-tank | to kill-tank | ||||
debug who "TANK-KILL" (word "by " ([shooter] of myself)) | |||||
if is-player? [ | if is-player? [ | ||||
set player-deaths player-deaths + 1 | set player-deaths player-deaths + 1 | ||||
] | ] | ||||
if [is-player?] of (turtle [shooter] of myself) [ | |||||
set player-kills player-kills + 1 | |||||
] | |||||
if [is-shooter-player?] of myself [ | |||||
set player-kills player-kills + 1 | |||||
] | |||||
die | die | ||||
end | end | ||||