Browse Source

Pillboxes!

master
Ben Kurtovic 13 years ago
parent
commit
88f66e551e
6 changed files with 296 additions and 72 deletions
  1. +24
    -23
      base.nls
  2. +28
    -15
      bullet.nls
  3. +14
    -11
      explosion.nls
  4. +102
    -14
      lobo.nlogo
  5. +117
    -0
      pillbox.nls
  6. +11
    -9
      tank.nls

+ 24
- 23
base.nls View File

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


+ 28
- 15
bullet.nls View File

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

+ 14
- 11
explosion.nls View File

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


+ 102
- 14
lobo.nlogo View File

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


+ 117
- 0
pillbox.nls View File

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

+ 11
- 9
tank.nls View File

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



Loading…
Cancel
Save