@@ -10,6 +10,10 @@ bullets-own [ | |||
travel-distance | |||
] | |||
;; ========== | |||
;; Procedures | |||
;; ========== | |||
to fire-bullet | |||
hatch-bullets 1 [ | |||
set max-travel-distance 8 | |||
@@ -31,13 +35,14 @@ to do-bullet-logic | |||
fd speed | |||
set travel-distance travel-distance + speed | |||
if travel-distance > max-travel-distance [ | |||
explode "decay" | |||
die | |||
] | |||
let mxcor xcor | |||
let mycor ycor | |||
let is-close-enough false | |||
let target min-one-of (turtles-here with [breed = tanks]) [distancexy mxcor mycor] | |||
let target min-one-of tanks-here [distancexy mxcor mycor] | |||
if target != nobody [ | |||
ask target [ | |||
if distancexy mxcor mycor < 0.65 [ | |||
@@ -0,0 +1,66 @@ | |||
;; lobo: Logo Bolo | |||
;; (c) Ben Kurtovic, 2011 | |||
globals [ | |||
explodes | |||
] | |||
breed [explosions explosion] | |||
explosions-own [ | |||
midlife | |||
size-increment | |||
time-to-live | |||
] | |||
;; ========== | |||
;; Procedures | |||
;; ========== | |||
to make-explosions-table | |||
; 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 7.5 2] | |||
["explosion-decay" 0.65 7.5 2 ] ["explosion-decay" 0.65 5 3] | |||
["explosion-decay" 0.65 5 3 ]] | |||
end | |||
to explode [name] | |||
debug "EXPLODE" name | |||
let data table:get explodes name | |||
foreach data [create-explosion ?] | |||
end | |||
to create-explosion [info] | |||
let sprite (item 0 info) | |||
let maxsize (item 1 info) | |||
let lifespan (item 2 info) | |||
let deviation (item 3 info) | |||
hatch-explosions 1 [ | |||
set shape sprite | |||
set size maxsize / 2 | |||
set midlife lifespan / 2 | |||
set size-increment (maxsize / lifespan) * 2 | |||
set time-to-live lifespan | |||
set heading random 360 | |||
fd (random 100) / (100 / deviation) | |||
] | |||
end | |||
to keep-exploding | |||
if time-to-live = 0 [ | |||
die | |||
] | |||
set time-to-live time-to-live - 1 | |||
set midlife midlife - 1 | |||
ifelse midlife > 0 [ | |||
set size size + size-increment | |||
] [ | |||
set size size - size-increment | |||
] | |||
end |
@@ -6,6 +6,7 @@ | |||
__includes [ | |||
"bullet.nls" | |||
"explosion.nls" | |||
"player.nls" | |||
"tank.nls" | |||
] | |||
@@ -19,12 +20,6 @@ globals [ | |||
last-tick-time | |||
max-fps | |||
mouse-was-down? | |||
player | |||
player-deaths | |||
player-has-target? | |||
player-kills | |||
player-target-xcor | |||
player-target-ycor | |||
sounds | |||
] | |||
@@ -36,9 +31,9 @@ to setup | |||
clear-all | |||
no-display | |||
setup-defaults | |||
ask patches [ | |||
set pcolor (random 3) - 5 + green | |||
] | |||
make-sounds-table | |||
make-explosions-table | |||
load-map | |||
spawn-player | |||
spawn-tank 0 ask tank 1 [ setxy -6 0 ] | |||
spawn-tank 1 ask tank 2 [ setxy 6 0 ] | |||
@@ -56,6 +51,9 @@ to go | |||
ask bullets [ | |||
do-bullet-logic | |||
] | |||
ask explosions [ | |||
keep-exploding | |||
] | |||
show-crosshair | |||
render | |||
keep-time | |||
@@ -93,18 +91,20 @@ to setup-defaults | |||
set player-kills 0 | |||
set player-target-xcor 0 | |||
set player-target-ycor 0 | |||
make-sounds-table | |||
end | |||
to make-sounds-table | |||
set sounds table:make | |||
table:put sounds "fire" "Hand Clap" | |||
table:put sounds "shot player" "Acoustic Snare" | |||
table:put sounds "shot ally" "Acoustic Snare" | |||
table:put sounds "shot enemy" "Acoustic Snare" | |||
table:put sounds "kill player" "Electric Snare" | |||
table:put sounds "kill ally" "Electric Snare" | |||
table:put sounds "kill enemy" "Electric Snare" | |||
table:put sounds "fire" "Hand Clap" | |||
table:put sounds "noammo" "Cowbell" | |||
table:put sounds "shot" "Acoustic Snare" | |||
table:put sounds "kill" "Electric Snare" | |||
end | |||
to load-map | |||
ask patches [ | |||
set pcolor (random 3) - 5 + green | |||
] | |||
end | |||
to show-crosshair | |||
@@ -412,6 +412,27 @@ Rectangle -7500403 true false 165 210 195 268 | |||
Rectangle -7500403 true false 105 210 135 268 | |||
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 | |||
false | |||
0 | |||
Circle -6459832 true false 2 2 297 | |||
Circle -2674135 true false 30 30 240 | |||
Circle -955883 true false 60 60 180 | |||
Circle -1184463 true false 90 90 120 | |||
explosion-shot | |||
false | |||
0 | |||
Circle -2674135 true false 0 0 300 | |||
Circle -955883 true false 45 45 210 | |||
Circle -1184463 true false 90 90 120 | |||
tank | |||
true | |||
1 | |||
@@ -1,6 +1,19 @@ | |||
;; lobo: Logo Bolo | |||
;; (c) Ben Kurtovic, 2011 | |||
globals [ | |||
player | |||
player-deaths | |||
player-has-target? | |||
player-kills | |||
player-target-xcor | |||
player-target-ycor | |||
] | |||
;; ========== | |||
;; Procedures | |||
;; ========== | |||
to spawn-player | |||
create-tanks 1 [ | |||
set player tank who | |||
@@ -11,10 +24,16 @@ end | |||
to do-player-logic | |||
if mouse-inside? [ | |||
if mouse-down? and not mouse-was-down? [ | |||
set is-accelerating? true | |||
set player-has-target? true | |||
set player-target-xcor (round mouse-xcor) | |||
set player-target-ycor (round mouse-ycor) | |||
let txcor round mouse-xcor | |||
let tycor round mouse-ycor | |||
ifelse player-has-target? and player-target-xcor = txcor and player-target-ycor = tycor [ | |||
cancel-target | |||
] [ | |||
set is-accelerating? true | |||
set player-has-target? true | |||
set player-target-xcor txcor | |||
set player-target-ycor tycor | |||
] | |||
] | |||
set mouse-was-down? mouse-down? | |||
] | |||
@@ -23,6 +42,8 @@ to do-player-logic | |||
tank-facexy player-target-xcor player-target-ycor | |||
let dist distancexy player-target-xcor player-target-ycor | |||
if dist < 2 and speed > 0.075 [ | |||
; Turn on "brakes" if we're getting | |||
; close and we're moving fast: | |||
decelerate friction * 5 | |||
] | |||
if dist < 0.1 [ | |||
@@ -42,4 +63,5 @@ end | |||
to cancel-target | |||
set is-accelerating? false | |||
set player-has-target? false | |||
set speed speed / 2 | |||
end |
@@ -18,6 +18,10 @@ tanks-own [ | |||
team | |||
] | |||
;; ========== | |||
;; Procedures | |||
;; ========== | |||
to spawn-tank [tank-team] | |||
create-tanks 1 [ | |||
set-tank-vars tank-team false | |||
@@ -83,12 +87,16 @@ to tank-facexy [txcor tycor] | |||
end | |||
to fire | |||
if ammunition > 0 and fire-cool-down = 0 [ | |||
debug "FIRE" (word who " (" ammunition " left)") | |||
set ammunition ammunition - 1 | |||
if fire-cool-down = 0 [ | |||
ifelse ammunition > 0 [ | |||
debug "FIRE" (word who " (" ammunition " left)") | |||
set ammunition ammunition - 1 | |||
fire-bullet | |||
play-sound "fire" | |||
] [ | |||
play-sound "noammo" | |||
] | |||
set fire-cool-down max-fire-rate | |||
fire-bullet | |||
play-sound "fire" | |||
] | |||
end | |||
@@ -96,15 +104,17 @@ to shot-at | |||
debug "SHOT" (word who " by " ([shooter] of myself)) | |||
set armor armor - 1 | |||
ifelse armor = 0 [ | |||
explode "kill" | |||
play-sound "kill" | |||
kill-tank | |||
] [ | |||
play-sound (word "shot " get-tank-affiliation) | |||
explode "shot" | |||
play-sound "shot" | |||
] | |||
end | |||
to kill-tank | |||
debug "KILL" (word who " by " ([shooter] of myself)) | |||
play-sound (word "kill " get-tank-affiliation) | |||
if is-player? [ | |||
set player-deaths player-deaths + 1 | |||
] | |||
@@ -114,6 +124,10 @@ to kill-tank | |||
die | |||
end | |||
;; ========= | |||
;; Reporters | |||
;; ========= | |||
to-report get-tank-affiliation | |||
if is-player? [ report "player" ] | |||
if team = 0 [ report "ally" ] | |||