@@ -10,6 +10,10 @@ bullets-own [ | |||||
travel-distance | travel-distance | ||||
] | ] | ||||
;; ========== | |||||
;; Procedures | |||||
;; ========== | |||||
to fire-bullet | to fire-bullet | ||||
hatch-bullets 1 [ | hatch-bullets 1 [ | ||||
set max-travel-distance 8 | set max-travel-distance 8 | ||||
@@ -31,13 +35,14 @@ 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 [ | if travel-distance > max-travel-distance [ | ||||
explode "decay" | |||||
die | die | ||||
] | ] | ||||
let mxcor xcor | let mxcor xcor | ||||
let mycor ycor | let mycor ycor | ||||
let is-close-enough false | 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 [ | if target != nobody [ | ||||
ask target [ | ask target [ | ||||
if distancexy mxcor mycor < 0.65 [ | 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 [ | __includes [ | ||||
"bullet.nls" | "bullet.nls" | ||||
"explosion.nls" | |||||
"player.nls" | "player.nls" | ||||
"tank.nls" | "tank.nls" | ||||
] | ] | ||||
@@ -19,12 +20,6 @@ globals [ | |||||
last-tick-time | last-tick-time | ||||
max-fps | max-fps | ||||
mouse-was-down? | mouse-was-down? | ||||
player | |||||
player-deaths | |||||
player-has-target? | |||||
player-kills | |||||
player-target-xcor | |||||
player-target-ycor | |||||
sounds | sounds | ||||
] | ] | ||||
@@ -36,9 +31,9 @@ to setup | |||||
clear-all | clear-all | ||||
no-display | no-display | ||||
setup-defaults | setup-defaults | ||||
ask patches [ | |||||
set pcolor (random 3) - 5 + green | |||||
] | |||||
make-sounds-table | |||||
make-explosions-table | |||||
load-map | |||||
spawn-player | spawn-player | ||||
spawn-tank 0 ask tank 1 [ setxy -6 0 ] | spawn-tank 0 ask tank 1 [ setxy -6 0 ] | ||||
spawn-tank 1 ask tank 2 [ setxy 6 0 ] | spawn-tank 1 ask tank 2 [ setxy 6 0 ] | ||||
@@ -56,6 +51,9 @@ to go | |||||
ask bullets [ | ask bullets [ | ||||
do-bullet-logic | do-bullet-logic | ||||
] | ] | ||||
ask explosions [ | |||||
keep-exploding | |||||
] | |||||
show-crosshair | show-crosshair | ||||
render | render | ||||
keep-time | keep-time | ||||
@@ -93,18 +91,20 @@ to setup-defaults | |||||
set player-kills 0 | set player-kills 0 | ||||
set player-target-xcor 0 | set player-target-xcor 0 | ||||
set player-target-ycor 0 | set player-target-ycor 0 | ||||
make-sounds-table | |||||
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 "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 | end | ||||
to show-crosshair | to show-crosshair | ||||
@@ -412,6 +412,27 @@ 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 | |||||
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 | tank | ||||
true | true | ||||
1 | 1 | ||||
@@ -1,6 +1,19 @@ | |||||
;; lobo: Logo Bolo | ;; lobo: Logo Bolo | ||||
;; (c) Ben Kurtovic, 2011 | ;; (c) Ben Kurtovic, 2011 | ||||
globals [ | |||||
player | |||||
player-deaths | |||||
player-has-target? | |||||
player-kills | |||||
player-target-xcor | |||||
player-target-ycor | |||||
] | |||||
;; ========== | |||||
;; Procedures | |||||
;; ========== | |||||
to spawn-player | to spawn-player | ||||
create-tanks 1 [ | create-tanks 1 [ | ||||
set player tank who | set player tank who | ||||
@@ -11,10 +24,16 @@ end | |||||
to do-player-logic | to do-player-logic | ||||
if mouse-inside? [ | if mouse-inside? [ | ||||
if mouse-down? and not mouse-was-down? [ | 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? | set mouse-was-down? mouse-down? | ||||
] | ] | ||||
@@ -23,6 +42,8 @@ to do-player-logic | |||||
tank-facexy player-target-xcor player-target-ycor | tank-facexy player-target-xcor player-target-ycor | ||||
let dist distancexy player-target-xcor player-target-ycor | let dist distancexy player-target-xcor player-target-ycor | ||||
if dist < 2 and speed > 0.075 [ | if dist < 2 and speed > 0.075 [ | ||||
; Turn on "brakes" if we're getting | |||||
; close and we're moving fast: | |||||
decelerate friction * 5 | decelerate friction * 5 | ||||
] | ] | ||||
if dist < 0.1 [ | if dist < 0.1 [ | ||||
@@ -42,4 +63,5 @@ end | |||||
to cancel-target | to cancel-target | ||||
set is-accelerating? false | set is-accelerating? false | ||||
set player-has-target? false | set player-has-target? false | ||||
set speed speed / 2 | |||||
end | end |
@@ -18,6 +18,10 @@ tanks-own [ | |||||
team | team | ||||
] | ] | ||||
;; ========== | |||||
;; Procedures | |||||
;; ========== | |||||
to spawn-tank [tank-team] | to spawn-tank [tank-team] | ||||
create-tanks 1 [ | create-tanks 1 [ | ||||
set-tank-vars tank-team false | set-tank-vars tank-team false | ||||
@@ -83,12 +87,16 @@ to tank-facexy [txcor tycor] | |||||
end | end | ||||
to fire | 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 | set fire-cool-down max-fire-rate | ||||
fire-bullet | |||||
play-sound "fire" | |||||
] | ] | ||||
end | end | ||||
@@ -96,15 +104,17 @@ to shot-at | |||||
debug "SHOT" (word who " by " ([shooter] of myself)) | debug "SHOT" (word who " by " ([shooter] of myself)) | ||||
set armor armor - 1 | set armor armor - 1 | ||||
ifelse armor = 0 [ | ifelse armor = 0 [ | ||||
explode "kill" | |||||
play-sound "kill" | |||||
kill-tank | kill-tank | ||||
] [ | ] [ | ||||
play-sound (word "shot " get-tank-affiliation) | |||||
explode "shot" | |||||
play-sound "shot" | |||||
] | ] | ||||
end | end | ||||
to kill-tank | to kill-tank | ||||
debug "KILL" (word who " by " ([shooter] of myself)) | debug "KILL" (word who " by " ([shooter] of myself)) | ||||
play-sound (word "kill " get-tank-affiliation) | |||||
if is-player? [ | if is-player? [ | ||||
set player-deaths player-deaths + 1 | set player-deaths player-deaths + 1 | ||||
] | ] | ||||
@@ -114,6 +124,10 @@ to kill-tank | |||||
die | die | ||||
end | end | ||||
;; ========= | |||||
;; Reporters | |||||
;; ========= | |||||
to-report get-tank-affiliation | to-report get-tank-affiliation | ||||
if is-player? [ report "player" ] | if is-player? [ report "player" ] | ||||
if team = 0 [ report "ally" ] | if team = 0 [ report "ally" ] | ||||