From 88f66e551e14c004f04c5ec16fe22f47911a1fff Mon Sep 17 00:00:00 2001 From: Ben Kurtovic Date: Fri, 30 Dec 2011 00:50:17 -0500 Subject: [PATCH] Pillboxes! --- base.nls | 47 +++++++++++------------ bullet.nls | 43 +++++++++++++-------- explosion.nls | 25 +++++++------ lobo.nlogo | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++------- pillbox.nls | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tank.nls | 20 +++++----- 6 files changed, 296 insertions(+), 72 deletions(-) create mode 100644 pillbox.nls diff --git a/base.nls b/base.nls index dd8a740..7f12355 100644 --- a/base.nls +++ b/base.nls @@ -62,33 +62,33 @@ to do-base-logic end 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 color get-base-color + set last-armor-regen timer ; Don't regenerate armor right after being claimed end to refuel-tank [tank-to-refuel] - let did-armor-refuel? false - let did-ammo-refuel? false let time-since-last-refuel timer - last-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 @@ -97,11 +97,11 @@ to regenerate let time-since-last-ammo-regen timer - last-ammo-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 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 last-armor-regen timer ] @@ -109,13 +109,14 @@ end to base-shot-at set armor armor - 1 + set last-armor-regen timer ; Don't regenerate armor right after being shot ifelse armor > 0 [ debug who "BASE-SHOT" (word "by " ([shooter] of myself)) - explode "decay" + explode "small" play-sound "shot" ] [ debug who "BASE-KILL" (word "by " ([shooter] of myself)) - explode "shot" + explode "medium" play-sound "kill" ] end diff --git a/bullet.nls b/bullet.nls index e82691c..c985c0d 100644 --- a/bullet.nls +++ b/bullet.nls @@ -4,9 +4,12 @@ breed [bullets bullet] bullets-own [ + is-shooter-player? + is-shooter-tank? max-travel-distance shooter speed + team-of-shooter travel-distance ] @@ -14,14 +17,24 @@ bullets-own [ ;; Procedures ;; ========== -to fire-bullet +to fire-bullet [dist] 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 speed 1 + set team-of-shooter [team] of myself set travel-distance 0 set color white + set label "" set shape "bullet" set size 0.5 @@ -34,30 +47,30 @@ end to do-bullet-logic fd speed set travel-distance travel-distance + speed - if travel-distance > max-travel-distance [ - explode "decay" + if travel-distance >= max-travel-distance [ + explode "small" die ] let mxcor xcor 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] if target != nobody [ ask target [ 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 diff --git a/explosion.nls b/explosion.nls index 1791623..8b14742 100644 --- a/explosion.nls +++ b/explosion.nls @@ -2,7 +2,7 @@ ;; (c) Ben Kurtovic, 2011 globals [ - explodes + explosions-table ] breed [explosions explosion] @@ -19,19 +19,22 @@ explosions-own [ 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 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 to explode [name] - let data table:get explodes name + let data table:get explosions-table name foreach data [ create-explosion ? ] diff --git a/lobo.nlogo b/lobo.nlogo index c93d646..574de3d 100644 --- a/lobo.nlogo +++ b/lobo.nlogo @@ -8,6 +8,7 @@ __includes [ "base.nls" "bullet.nls" "explosion.nls" + "pillbox.nls" "player.nls" "tank.nls" ] @@ -38,20 +39,22 @@ to setup spawn-player 0 0 0 spawn-tank 0 -6 0 90 spawn-tank 1 6 0 270 - ;spawn-base -3 -7 spawn-base 0 -7 - ;spawn-base 3 -7 + spawn-pillbox 6 6 render set last-tick-time timer end to go ask player [ - do-player-logic + do-player-logic ] ask tanks [ do-tank-logic ] + ask pillboxes [ + do-pill-logic + ] ask bases [ do-base-logic ] @@ -61,7 +64,8 @@ to go ask explosions [ keep-exploding ] - show-crosshair + show-crosshairs + show-hud render keep-time end @@ -102,14 +106,17 @@ to setup-defaults set tank-max-armor 8 set base-max-ammo 50 set base-max-armor 20 + set pill-anger-range [1.2 0.2] + set pill-max-armor 8 end to make-sounds-table set sounds table:make table:put sounds "fire" "Hand Clap" + table:put sounds "kill" "Electric Snare" table:put sounds "noammo" "Cowbell" + table:put sounds "pickup" "Hi Bongo" table:put sounds "shot" "Acoustic Snare" - table:put sounds "kill" "Electric Snare" end to load-map @@ -118,7 +125,7 @@ to load-map ] end -to show-crosshair +to show-crosshairs clear-drawing if mouse-inside? [ ask patch mouse-xcor mouse-ycor [ @@ -151,6 +158,9 @@ to draw-border [b-color b-thickness] ] end +to show-hud +end + to render display no-display @@ -359,6 +369,55 @@ C 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? ----------- @@ -456,13 +515,7 @@ 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 +explosion-large false 0 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 -1184463 true false 90 90 120 -explosion-shot +explosion-med false 0 Circle -2674135 true false 0 0 300 Circle -955883 true false 45 45 210 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 true 1 diff --git a/pillbox.nls b/pillbox.nls new file mode 100644 index 0000000..53e4b03 --- /dev/null +++ b/pillbox.nls @@ -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 diff --git a/tank.nls b/tank.nls index c1c6fca..fb7c3a0 100644 --- a/tank.nls +++ b/tank.nls @@ -19,6 +19,7 @@ tanks-own [ max-fire-rate max-speed max-turn + number-of-pills speed team ] @@ -44,6 +45,7 @@ to set-tank-vars [player? tteam txcor tycor theading] set max-fire-rate 7 set max-speed 0.25 set max-turn 24 + set number-of-pills 0 set speed 0 set team tteam @@ -95,9 +97,9 @@ end to fire if fire-cool-down = 0 [ ifelse ammunition > 0 [ - debug who "TANK-FIRE" (word ammunition " left") + debug who "TANK-FIRE" (word (ammunition - 1) " left") set ammunition ammunition - 1 - fire-bullet + fire-bullet 8 play-sound "fire" ] [ play-sound "noammo" @@ -107,26 +109,26 @@ to fire end to tank-shot-at - debug who "TANK-SHOT" (word "by " ([shooter] of myself)) set armor armor - 1 ifelse armor = 0 [ - explode "kill" + debug who "TANK-KILL" (word "by " ([shooter] of myself)) + explode "huge" play-sound "kill" kill-tank ] [ - explode "shot" + debug who "TANK-SHOT" (word "by " ([shooter] of myself)) + explode "medium" play-sound "shot" ] end to kill-tank - debug who "TANK-KILL" (word "by " ([shooter] of myself)) if is-player? [ 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 end