@@ -21,7 +21,8 @@ to fire-bullet | |||
set shape "bullet" | |||
set size 0.5 | |||
lt random 10 ; Bullets shouldn't travel perfectly straight | |||
; Bullets shouldn't travel perfectly straight: | |||
lt random 10 | |||
rt random 10 | |||
] | |||
end | |||
@@ -20,9 +20,11 @@ globals [ | |||
max-fps | |||
mouse-was-down? | |||
player | |||
player-accelerate-for | |||
player-deaths | |||
player-has-target? | |||
player-kills | |||
player-target-xcor | |||
player-target-ycor | |||
sounds | |||
] | |||
@@ -38,8 +40,8 @@ to setup | |||
set pcolor (random 3) - 5 + green | |||
] | |||
spawn-player | |||
spawn-tank 0 ask tank 1 [ setxy -10 0 ] | |||
spawn-tank 1 ask tank 2 [ setxy 10 0 ] | |||
spawn-tank 0 ask tank 1 [ setxy -6 0 ] | |||
spawn-tank 1 ask tank 2 [ setxy 6 0 ] | |||
render | |||
set last-tick-time timer | |||
end | |||
@@ -74,9 +76,11 @@ to setup-defaults | |||
resize-world -8 8 -8 8 | |||
set max-fps 30 | |||
set mouse-was-down? false | |||
set player-accelerate-for 0 | |||
set player-deaths 0 | |||
set player-has-target? false | |||
set player-kills 0 | |||
set player-target-xcor 0 | |||
set player-target-ycor 0 | |||
make-sounds-table | |||
end | |||
@@ -95,27 +99,33 @@ to show-crosshair | |||
clear-drawing | |||
if mouse-inside? [ | |||
ask patch mouse-xcor mouse-ycor [ | |||
sprout 1 [ | |||
set color white | |||
set heading 0 | |||
make-square | |||
die | |||
] | |||
draw-border white 1 | |||
] | |||
] | |||
if player-has-target? [ | |||
ask patch player-target-xcor player-target-ycor [ | |||
draw-border white 2 | |||
] | |||
] | |||
end | |||
to make-square | |||
fd 0.5 | |||
pd | |||
rt 90 | |||
fd 0.5 | |||
repeat 3 [ | |||
to draw-border [b-color b-thickness] | |||
sprout 1 [ | |||
set color b-color | |||
set pen-size b-thickness | |||
set heading 0 | |||
fd 0.5 | |||
pd | |||
rt 90 | |||
fd 1 | |||
fd 0.5 | |||
repeat 3 [ | |||
rt 90 | |||
fd 1 | |||
] | |||
rt 90 | |||
fd 0.5 | |||
die | |||
] | |||
rt 90 | |||
fd 0.5 | |||
end | |||
to render | |||
@@ -165,7 +175,7 @@ GRAPHICS-WINDOW | |||
0 | |||
0 | |||
1 | |||
ticks | |||
frames | |||
BUTTON | |||
43 | |||
@@ -231,8 +241,8 @@ MONITOR | |||
350 | |||
389 | |||
399 | |||
Player Accel Time | |||
player-accelerate-for | |||
Player Has Target? | |||
player-has-target? | |||
5 | |||
1 | |||
12 | |||
@@ -299,6 +309,17 @@ enable-sound? | |||
1 | |||
-1000 | |||
MONITOR | |||
272 | |||
411 | |||
390 | |||
460 | |||
Player Target | |||
word \"(\" player-target-xcor \", \" player-target-ycor \")\" | |||
10 | |||
1 | |||
12 | |||
@#$#@#$#@ | |||
WHAT IS IT? | |||
----------- | |||
@@ -17,41 +17,25 @@ end | |||
to do-player-logic | |||
if mouse-inside? [ | |||
if mouse-down? and not mouse-was-down? [ | |||
set player-accelerate-for player-accelerate-for + 10 | |||
if player-accelerate-for > 60 [ | |||
set player-accelerate-for 60 | |||
] | |||
set is-accelerating? true | |||
set player-has-target? true | |||
set player-target-xcor (round mouse-xcor) | |||
set player-target-ycor (round mouse-ycor) | |||
] | |||
set mouse-was-down? mouse-down? | |||
let old-heading heading | |||
; Slow down the tank a bit more than usual if we're | |||
; very close to the mouse: | |||
let mouse-dist distancexy mouse-xcor mouse-ycor | |||
if mouse-dist < 3 [ | |||
decelerate friction | |||
] | |||
if mouse-dist < 1.5 [ | |||
decelerate friction * 6.5 | |||
] | |||
if mouse-dist < 0.35 [ | |||
set speed 0 | |||
set player-accelerate-for 0 | |||
] | |||
facexy mouse-xcor mouse-ycor | |||
if subtract-headings old-heading heading > max-turn [ | |||
set heading old-heading - max-turn | |||
] | |||
ifelse player-has-target? [ | |||
tank-facexy player-target-xcor player-target-ycor | |||
let dist distancexy player-target-xcor player-target-ycor | |||
if dist < 2 and speed > 0.075 [ | |||
decelerate friction * 5 | |||
] | |||
if subtract-headings old-heading heading < 0 - max-turn [ | |||
set heading old-heading + max-turn | |||
if dist < 0.1 [ | |||
set is-accelerating? false | |||
set player-has-target? false | |||
] | |||
] | |||
ifelse player-accelerate-for > 0 [ | |||
set player-accelerate-for player-accelerate-for - 1 | |||
set is-accelerating? true | |||
] [ | |||
set is-accelerating? false | |||
tank-facexy mouse-xcor mouse-ycor | |||
] | |||
end |
@@ -69,6 +69,19 @@ to decelerate [amount] | |||
] | |||
end | |||
to tank-facexy [txcor tycor] | |||
;; Face a target at (txcor, tycor) like facexy, but don't | |||
;; turn more than our max turn rate (max-turn¡): | |||
let old-heading heading | |||
facexy txcor tycor | |||
if subtract-headings old-heading heading > max-turn [ | |||
set heading old-heading - max-turn | |||
] | |||
if subtract-headings old-heading heading < 0 - max-turn [ | |||
set heading old-heading + max-turn | |||
] | |||
end | |||
to fire | |||
if ammunition > 0 and fire-cool-down = 0 [ | |||
debug "FIRE" (word who " (" ammunition " left)") | |||