| @@ -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" ] | ||||