globals [ g ; gravity constant (for gibbets) kills ;; number of player kills shots ;; number of player shots fired hits ;; number of shots that hit misses ;; number of shots that missed speed ;; overall zombie speed counter ;; counter for level advancement level ;; current game level / wave score ; current score barrier ;; the patches that contain the barrier game-over? ;; is the gamve over? tocks ;; occur every 5 ticks ;; crosshairs ;; the turtle that is the crosshair ;; gun ;; the turtle that is the gun ;; bullet ;; fire? ;; has the fire button been pressed (or, with auto, is it time to fire?) full-auto? ;; is full auto mode on? ;; target ;; the thing that is the current gun target point-blank ;; the xcoord beyond which damage is 8 mid-range ;; the xcoord beyond which damage is 4 long-range ;; the xcoord beyond which damage is 2 truck! ;; keeps track of the last appearance of the zombie truck mid-pxcor ;; half-way bewteen min- and max- pxcor mid-pycor ;; likewise ; message ;; text of message to scroll on screen ; msg-row ;; current row of message ] breed [ bullets a-bullet ] ;; bullet is really just a line breed [ zombies a-zombie ] ;; zombies attack in waves breed [ trucks truck ] ;; a truck is driven by a zombie breed [ giants giant ] ;; a giant zombie breed [ trees a-tree ] ;; an innocent tree, can be destroyed by giants and vehicles breed [ guns a-gun ] ;; the turret that rotates and fires bullets breed [ gibbets a-gibbet ] ;; gobs of zombie gore and truck parts: results of zombie destruction: a particle system breed [ new-gibbets ] breed [ hairs a-hair ] ;; the cross-hair breed [ messengers a-messanger ] ;; used to display messages gibbets-own [ vx vy ;; velocity in x and y, for particle system ttl ;; time-to-live : count-down to removal burning? ;; true if gibbets are burning ] guns-own [ base-shape ;; base of the name..add suffix for flash shapes my-bullet ;; bullet "line" that goes with this gun. gun-type ;; the type of gun/bullet pattern fire-rate ;; how fast does the gun fire (timer mod fire-rate = 0 = fire!) my-crosshair g-number ] bullets-own [ my-gun ] hairs-own [ my-gun target ] zombies-own [ pace ;; how fast this particular zombie moves integrity ;; the current physical integrity of the zombie--at zero, zombie disintegrates frame ;; the current animation frame of this zombie base-shape ;; the base of the shape name for this zombie bonus ;; the score bonus obtained from killing this zombie sub-breed ;; the sub-breed of this zombie (zombie, giant, trucks) inflammable? ;; can this zombie burn? burning? ;; is this zombie currently burning? ] to startup ;; run setup when model loads setup end ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. to setup ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. display clear-all setup-background setup-default-shapes setup-globals setup-barrier setup-gun-and-bullet setup-trees zombie-birth setup-first-message end to setup-gun-and-bullet ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. let emplacements (list patch (min-pxcor + 5) 0 patch (min-pxcor + 5) (0 - (world-height * .25) ) patch (min-pxcor + 5) (0 + (world-height * .25) ) ) let gindex 0 foreach emplacements [ ask ? [ do-sprout-gun gindex ] set gindex gindex + 1 ] end to do-sprout-gun [ gindex ] ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. sprout-guns 1 [ let me nobody ;; set gun self ;; look out! set color gray set heading 90 set size 5 set base-shape "gun" set gun-type 0 set fire-rate 5 set g-number gindex setup-bullet setup-crosshair ] end to setup-trees ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. let row max-pycor repeat world-height [ ask patches with [ pycor = row and pxcor > min-pxcor + 5 and random 10 < 5 and (min-pxcor + random world-width ) < pxcor ] [ sprout-trees 1 [ set shape "tree" set size 3 stamp if random 10 > 2 [ die ] set shape "tree-top" ] ] set row row - 1 ] end to setup-bullet ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. hatch-bullets 1 [ ;; set bullet self set shape "line" set size world-width set color white ; __set-line-thickness .2 set my-gun myself ask my-gun [ set my-bullet myself ] hide-turtle ] end to setup-crosshair ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. hatch-hairs 1 [ ;; set crosshairs self set color white set heading 0 set size 3 set target nobody home set my-gun myself ask my-gun [ set my-crosshair myself ] ] end to setup-first-message message-create "STOP THE ZOMBIES!" end to message-create [ #message ] ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ;; TRICK: since anything can ask a patch to do something, ;; and a patch can always SPROUT, this trick uses a patch to sprout a turtle ;; so that either the observer, a turtle, or even another patch can create a turtle. ask patch mid-pxcor max-pycor [ sprout-messengers 1 [ set shape "message" set size 1 set color white set label (word #message " ") ] ] end to setup-default-shapes ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. set-default-shape zombies "zombie0" set-default-shape guns "gun" set-default-shape gibbets "gibbet" set-default-shape bullets "bullet" set-default-shape hairs "cross-hair" end to setup-globals ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. set g -0.03 ;; gravity constant set game-over? false ;; game over flag set kills 0 set counter 1 set speed .1 set level 0 ; set ticks 0 set tocks random 5 set full-auto? false set long-range min-pxcor + world-width * .5 set mid-range min-pxcor + world-width * .25 set point-blank min-pxcor + world-width * .125 set truck! 0 set full-auto? false set mid-pxcor min-pxcor + world-width * .5 set mid-pycor min-pycor + world-height * .5 end ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. to go ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. every ( 1 / 60 ) [ ifelse game-over? [ if not ( any? zombies or any? gibbets or any? messengers ) [ stop ] ] [ aim fire if ticks mod 100 = 0 [ barrier-repair ] ] zombies-move gibbets-fly message-update tick ] end to aim ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ifelse full-auto? [ ask hairs [ if (not is-a-zombie? target) [ if ( any? zombies with [ pxcor < (max-pxcor - 5) ] ) or random-float 1.0 < 0.25 [ let targets (zombies with [ pxcor < (max-pxcor - 5) ]) ifelse any? targets with [ not burning? ] [ set target min-one-of targets with [ not burning? ] [ [ distance myself ] of [ my-gun ] of myself ] ] [ set target min-one-of targets [ [ distance myself ] of [ my-gun ] of myself ] ] ] ] ifelse is-a-zombie? target ;; move cross-hair to target [ setxy (.6 * xcor + .4 * [ xcor ] of target) (.6 * ycor + .4 * [ ycor ] of target ) ][ setxy (.8 * xcor + .2 * mid-pxcor) ( .8 * ycor + .2 * ( mid-pycor + world-height * .4 * sin (who * 30 + 3 * ticks) ) ) ] ] ask guns [ face my-crosshair ] ask bullets [ set heading [ heading] of my-gun ] set fire? any? hairs with [ is-a-zombie? target ] ] [ if mouse-inside? [ let mx mouse-xcor let my mouse-ycor ask hairs [ setxy mx my ] ask guns [ face my-crosshair ] ask bullets [ set heading [ heading ] of my-gun ] ] set fire? mouse-down? ] end to fire ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ask guns [ ifelse ticks mod fire-rate = 0 and fire? [ ask my-bullet [ show-turtle ] set shape (word base-shape "-fire") set shots shots + 1 if any? zombies [ let hit min-one-of zombies with [ abs subtract-headings (safe-towards myself ) (180 + [heading] of myself ) < 2 ] [ distance myself ] ifelse is-a-zombie? hit [ set hits hits + 1 ask my-bullet [ set size distance hit ] ask hit [ zombie-injury ] ] [ set misses misses + 1 ask my-bullet [ set size world-width ] ] ] ] [ ask my-bullet [ if not hidden? [ hide-turtle ] ] if shape != base-shape [ set shape base-shape ] ] ] end to-report safe-towards [ agent ] ifelse patch-here = [ patch-here ] of agent [ report 0 ] [ report towards agent ] end ;;; ;;; Previous fire routine, when gun fired individual pellets, in various patterns ;;;to fire ;;; ask gun ;;; [ ;;; ifelse gun-type = -1 [ make-bullets 1 0 0 0 0 ] ;;; [ ifelse gun-type = 0 [ make-bullets 2 0 0 -.5 1 ] ;;; [ ifelse gun-type = 1 [ make-bullets 3 0 0 -1 1 ] ;;; [ ifelse gun-type = 2 [ make-bullets 3 -5 5 0 0 ] ;;; [ ifelse gun-type = 3 [ make-bullets 4 0 0 -2 1.25 ] ;;; [ ifelse gun-type = 4 [ make-bullets 5 -20 10 0 0 ] ;;; [ ifelse gun-type = 5 [ make-bullets 5 0 0 -4 2 ] ;;; [ ifelse gun-type = 6 [ make-bullets 7 -15 5 -3 1 ] ;;; [ make-bullets 7 -15 5 -6 2 ] ;;; ]]]]]]] ;;; ] ;;;end ;to bullets-fly ;;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ; ask bullets ; [ if not can-move? 1 ; [ die ] ; jump 1 ; let targets (zombies-on neighbors) with [ abs (pxcor - [pxcor] of myself) < 1.5 and abs (pycor - [pycor] of myself) < 3 ] ; if any? targets ; [ ask one-of targets ; [ zombie-injury ; ] ; die ; ] ; ] ;end to gibbets-fly ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ask gibbets [ set ttl ttl - 1 if ttl <= 0 [ die ] set vy vy + g let nx xcor + vx let ny ycor + vy if nx < min-pxcor or nx > max-pxcor or ny < min-pycor or ny > max-pycor [ die ] setxy nx ny rt 10 ] end to gibbets-birth [ qty looks new-size] ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. hatch-gibbets qty [ gibbet-props ifelse looks = "" [ ;; standard gore ifelse burning? [ set color orange ] [ set color red ] set size one-of [1.0 1.5 2.0 ] ] [ ;; different size or shape gore (e.g.: trucks, mutant ) set shape looks set size new-size ] ] end to gibbet-props ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. set vx -.3 + random-float 2.0 set vy random-float .5 set ttl 20 set label "" end to zombies-move ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. if ticks mod 2 != 0 [ stop ] ;; make new zombies if game-over? != true and count zombies < 35 and random 10 <= counter [ zombie-birth ] ask zombies [ ;; if random 100 <= counter [ face one-of guns ] if not is-patch? patch-ahead 1 [ zombie-death ] if not ( any? (other zombies-on patch-ahead 1) or any? other zombies-here with [ who < [who] of myself ] ) [ if sub-breed = trucks [ stamp-erase ] if sub-breed = giants [ ask trees in-radius (size * .5) [ die ] ] jump pace ] set frame frame + .5 if frame >= 4 [ set frame 0 if burning? [ set integrity integrity - 1 ask zombies in-radius ( size ) [ zombie-start-burning ] if integrity <= 0 [ update-counters zombie-death ] ] ] set shape (word base-shape floor frame) if shade-of? pcolor barrier-base-color [ let rad size * .5 if burning? [ set rad size ] ask barrier in-radius rad [ set pcolor background-color ] zombie-death ] if pxcor <= min-pxcor [ zombie-death ] ] ;; set label integrity end to-report in-far-right-column ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. report pxcor = max-pxcor end to-report in-the-middle-rows ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. report pycor < max-pycor - 5 and pycor > min-pycor + 5 end to-report no [ #things ] ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. report not any? #things end to zombie-birth ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. let birth-patches patches with [ in-far-right-column and in-the-middle-rows and no zombies-here ] if any? birth-patches [ ask one-of birth-patches [ sprout-zombies 1 [ zombie-initialize-regular ;; aim the zombie at some barrier brick ;; when the barrier is broken down, makes the zombies more deadly if any? barrier with [ shade-of? pcolor barrier-base-color ] [ face one-of barrier with [ shade-of? pcolor barrier-base-color ] ] ;; maybe make a fast zombie.. if-else random 100 < 5 + level [ zombie-modify-make-fast ][ ;; maybe make giants!! ifelse level >= 10 and random 100 < 2 [ zombie-modify-make-giant ][ ;; maybe make trucks (or bulldozers) if truck! < level and (level mod 4 = 0 or level > 20) [ zombie-modify-make-truck ]]] ] ] ] end to zombie-initialize-regular ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. set heading 270 set color green + level * 10 - 1 + random-float 2 set size 3 set frame 0 set pace speed + random .1 set integrity 1 + int (level * .1) set base-shape "zombie" set bonus 0 set sub-breed zombies set burning? false set inflammable? true end to zombie-modify-make-fast set pace 1 set color color - color mod 10 + 8 set integrity 1 + int (.25 * integrity) end to zombie-modify-make-giant ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. set size size * 3 set pace .1 + pace * .1 set integrity integrity * 10 set bonus 1000 set sub-breed giants set base-shape "zombie" message-create "ALERT! GIANT MUTANT ZOMBIE!" end to zombie-modify-make-truck ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. set heading 270 set truck! level set base-shape one-of [ "truck" "dozer" ] set size size * 2 set pace .1 set integrity integrity * 50 set bonus 3000 set sub-breed trucks set burning? false set inflammable? false ;; trucks don't burn message-create (word "ALERT! " caps base-shape " RIDING ZOMBIE!" ) end to zombie-injury ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. let damage 0 if [ gun-type = 1 ] of myself [ zombie-start-burning ] set damage damage-by-range set integrity integrity - damage ifelse integrity <= 0 [ update-counters zombie-death ] [ gibbets-birth damage "" 0 ] if [ gun-type = 0 ] of myself [ if xcor + .1 < max-pxcor [ set xcor xcor + .1 ] ] end to zombie-start-burning if inflammable? and not burning? [ set burning? true ;; permanently modify base-shape set base-shape (word base-shape "-burning" ) ] end to-report damage-by-range ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ifelse pxcor < point-blank [ report 8 ][ ifelse pxcor < mid-range [ report 4 ][ ifelse pxcor < long-range [ report 2 ][ report 1]]] end to zombie-death ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. let gc count gibbets + count zombies ;; gibbet-count ;; ngc = new gibbet count let ngc ifelse-value ( gc < 100 ) [ 5 ] [ 0 ] let ngs 1 set base-shape remove "-burning" base-shape if gc < 175 [ gibbets-birth 1 (word base-shape "-part0") size ] if gc < 150 [ let index 1 repeat 4 [ gibbets-birth 1 (word base-shape "-part" index) size set index index + 1 ] ] ifelse gc < 50 [ gibbets-birth 10 "" (1 + random-float 1.0) ] [ if gc < 100 [ gibbets-birth 5 "" (1 + random-float 1.0) ] ] if not any? barrier with [ shade-of? pcolor blue ] [ game-over ] die end to make-bullets [ qty offset spread y-off y-inc ] ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. set offset heading + offset hatch-bullets qty [ jump 2.5 set heading offset let nx xcor + y-off * sin ( heading - 90) let ny ycor + y-off * cos ( heading - 90) set offset offset + spread set y-off y-off + y-inc if nx < min-pxcor or ny < min-pycor or ny > max-pycor [ die ] setxy nx ny set color 8 + 10 * random 13 ] end ;to update-score [ amt ] ;;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ; set score score + amt ; ; set [plabel] of scoreboard (word score ":" level ) ;end to update-counters ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. set kills kills + 1 set score score + level + bonus set counter counter + 1 if counter >= 500 [ set counter counter - 500 set speed speed * 1.2 if speed > .5 [ set speed .1 ] set level level + 1 ask one-of guns [ ifelse gun-type = 0 [ ifelse fire-rate > 2 ; and level mod 1 = 0 [ message-create "RELOAD RATE UPGRADE!" set fire-rate fire-rate - 1 ] [if fire-rate <= 2 and level >= 20 [ set gun-type 1 ask my-bullet [ set color red ] set base-shape "gun1" set fire-rate 6 message-create "WEAPON UPGRADE!" ]] ] [ if fire-rate > 1 ; and level mod 5 = 0 [ set fire-rate fire-rate - 1 ; __set-line-thickness .1 * fire-rate ifelse fire-rate <= 1 [ ask my-bullet [ set color blue ]][ if fire-rate < 3 [ ask my-bullet [ set color lime ]] ] message-create "BEAM REFRESH UPGRADE!" ] ] ] ] end to game-over ask hairs [ home ] if ticks mod 10 = 0 [ message-create "GAME OVER!" ] set game-over? true end to setup-background ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ask patches [ set pcolor background-color ] end to-report background-color ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ;; reports a textured background color for the current patch, based on patch location, etc. report brown - 5 + .1 * random 5 + 6 * ((pycor - min-pycor) / world-height) ; end to setup-barrier ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ;; defines and colors the patches that comprise the barrier set barrier patches with [ pxcor <= min-pxcor + 5 ] ask barrier [ set pcolor barrier-color ] end to-report barrier-color ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ;; reports the barrier color for the current patch report barrier-base-color - 3 + pxcor - min-pxcor + ((pycor + pxcor) mod 2) end to-report barrier-base-color ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ;; reports the barrier base color ;; hack--for better speed should really be a global report blue end to barrier-repair ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ;; if barrier needs repair, repair one cell of the barrier if any? barrier with [ not shade-of? pcolor barrier-base-color ] [ ask one-of barrier with [not shade-of? pcolor barrier-base-color and any? neighbors4 with [ shade-of? pcolor barrier-base-color ] ] [ set pcolor barrier-color ] ] end to auto-fire ;; ~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸.~º°¯°º~.¸_¸. ;; toggle / initialize if needed, the full-auto variable set full-auto? (full-auto? = false) let state "DE-" if full-auto? [ set state "" ] message-create (word "AUTO-FIRE " state "ACTIVATED") end to message-update ask messengers [ if pycor <= min-pycor [ die ] set ycor ycor - .5 set color 9.9 - color ] end to-report caps [ #text ] let uc "ABCDEFGHIJKLMNOPQRSTUVWXYZ" let lc "abcdefghijklmnopqrstuvwxyz" let result "" let c "" foreach n-values length #text [ item ? #text ] [ set c ? let i position c lc if i != false [ set c item i uc ] set result (word result c) ] report result end to-report promote [ #char ] end @#$#@#$#@ GRAPHICS-WINDOW 10 60 913 507 37 17 11.91 1 20 1 1 1 0 0 0 1 -37 37 -17 17 1 1 0 ticks CC-WINDOW 5 521 929 616 Command Center 0 TEXTBOX 10 15 920 60 Directions: Shoot zombies before they reach the blue barrier. \nClick GO to play. Aim and fire with mouse. Click reset to start over.\nClick AUTO-FIRE to toggle automatic firing mode. Weapon upgrade at level 20. 11 0.0 0 BUTTON 855 10 910 55 reset setup NIL 1 T OBSERVER NIL R NIL NIL BUTTON 490 10 545 55 NIL go T 1 T OBSERVER NIL G NIL NIL BUTTON 788 10 843 55 NIL auto-fire NIL 1 T OBSERVER NIL A NIL NIL MONITOR 625 10 694 55 NIL Score 3 1 11 MONITOR 560 10 610 55 Days level 0 1 11 MONITOR 710 10 774 55 Accuracy (word \n (ifelse-value (hits = 0) [ \"\" ][precision (100 * hits / shots) 0 ])\n \"%\"\n ) 3 1 11 @#$#@#$#@ WHAT IS IT? ----------- Defend the city gate barricade from the ZOMBIE HOARDS! HOW TO USE IT ------------- Click Setup, then Go. Aim with the mouse. Shoot by pressing the mouse button. When zombies hit a bullet or the wall, they are injured. If injured enough, they disintegrate! Zombies damage the wall when they hit it. Burning zombies damage the wall even more. As long as even one brick of the barricade remains, the city is safe. Unseen helpers repair damage to the barricade, slowly, but as fast as they can! Watch out for surprises the zombies may have for you! In 20 days, you will receive a new laser gun from a neighboring city! THINGS TO NOTICE ---------------- The gun, bullets, zombies, and even the gobs of gore are all kinds of turtles. Zombies are sometimes hidden behind the trees. Background trees are tree shapes stamped into the drawing layer. Forground trees are tree turtles. As the invasion continues, the zombies attack in waves, attack more quickly, and become tougher to destroy. Now aDifferent kinds of zombies appear from time to time. As long as even one brick of the barricade remains, the city is safe. Unseen helpers repair damage to the barricade, slowly, but as fast as they can! WAYS TO EXTEND THE MODEL ------------------------ Add more kind of zombies Add different kinds of weapons Add the ability to build barricades that the zombies must navigate COPYRIGHT --------- Copyright © 2007, James P. Steiner @#$#@#$#@ default true 3 Polygon -13840069 true false 75 255 30 225 45 225 45 210 60 210 60 195 90 240 Polygon -6459832 true true 120 60 180 60 210 75 225 105 225 210 210 240 180 255 120 255 90 240 75 210 75 120 90 75 120 60 120 90 180 90 105 210 120 225 195 105 195 210 180 225 120 225 105 210 105 105 120 90 Polygon -13840069 true false 135 255 150 270 135 300 165 270 165 255 Polygon -13840069 true false 225 255 270 225 255 225 255 210 240 210 240 195 210 240 Polygon -13840069 true false 225 90 270 60 255 60 255 45 240 45 240 30 210 75 Polygon -13840069 true false 75 90 30 60 45 60 45 45 60 45 60 30 90 75 Polygon -10899396 true false 105 210 105 105 120 90 180 90 Polygon -10899396 true false 120 225 195 105 195 210 180 225 Polygon -13840069 true false 135 60 120 30 135 0 150 -15 165 0 180 30 165 60 bullet false 0 Circle -7500403 true true 135 135 30 cross-hair false 0 Circle -7500403 false true 15 0 270 Circle -7500403 false true 0 15 270 Circle -7500403 false true 15 30 270 Circle -7500403 false true 30 15 270 Line -7500403 true 150 30 150 75 Line -7500403 true 30 150 75 150 Line -7500403 true 150 270 150 225 Line -7500403 true 270 150 225 150 dozer-part0 true 0 Polygon -7500403 true true 194 130 203 142 164 158 161 176 193 209 181 217 152 188 124 222 112 212 143 175 144 157 106 141 111 127 146 143 161 146 Circle -7500403 true true 140 105 26 Circle -16777216 true false 145 111 6 Circle -16777216 true false 154 111 8 Polygon -16777216 true false 144 126 148 119 155 120 159 126 dozer-part1 false 8 Circle -1184463 true false 73 223 62 Circle -1184463 true false 225 225 58 Rectangle -16777216 true false 105 285 150 300 Rectangle -16777216 true false 180 285 225 300 Rectangle -16777216 true false 255 285 285 300 Rectangle -16777216 true false 60 255 75 285 Rectangle -16777216 true false 75 210 105 225 Rectangle -16777216 true false 135 210 180 225 Rectangle -16777216 true false 210 210 255 225 Rectangle -16777216 true false 285 240 300 270 Circle -16777216 false false 90 240 30 Circle -16777216 false false 240 240 30 dozer-part2 false 8 Polygon -1184463 true false 0 60 15 75 30 120 30 165 15 195 0 210 30 195 45 180 45 120 45 90 30 75 Polygon -1184463 true false 225 195 45 150 45 120 225 165 Polygon -16777216 false false 45 120 225 165 225 195 45 150 dozer-part3 false 8 Rectangle -1184463 true false 60 150 270 180 Polygon -1184463 true false 270 150 270 60 180 60 150 150 180 150 195 75 255 75 255 150 dozer-part4 false 8 Rectangle -16777216 true false 45 180 90 195 Rectangle -16777216 true false 105 210 150 225 Rectangle -16777216 true false 195 225 225 240 Rectangle -16777216 true false 45 120 60 150 Rectangle -16777216 true false 90 90 120 105 Rectangle -16777216 true false 135 90 180 105 Rectangle -16777216 true false 210 105 255 120 Rectangle -16777216 true false 255 165 270 195 dozer0 false 8 Rectangle -11221820 true true 195 135 225 165 Rectangle -1184463 true false 60 150 270 210 Polygon -1184463 true false 0 150 15 165 30 210 30 255 15 285 0 300 30 285 45 270 45 210 45 180 30 165 Circle -1184463 true false 73 223 62 Circle -1184463 true false 225 225 58 Rectangle -16777216 true false 75 285 120 300 Rectangle -16777216 true false 150 285 195 300 Rectangle -16777216 true false 225 285 270 300 Rectangle -16777216 true false 60 225 75 270 Rectangle -16777216 true false 90 210 135 225 Rectangle -16777216 true false 165 210 210 225 Rectangle -16777216 true false 240 210 285 225 Rectangle -16777216 true false 285 240 300 285 Rectangle -7500403 true false 135 240 225 270 Polygon -1184463 true false 270 150 270 60 180 60 150 150 180 150 195 75 255 75 255 150 Polygon -1184463 true false 45 210 225 165 225 195 45 240 Polygon -16777216 false false 45 210 225 165 225 195 45 240 Circle -16777216 false false 90 240 30 Circle -16777216 false false 240 240 30 Circle -11221820 true true 195 105 30 dozer1 false 8 Rectangle -11221820 true true 195 135 225 165 Rectangle -1184463 true false 60 150 270 210 Polygon -1184463 true false 0 105 15 120 30 165 30 210 15 240 0 255 30 240 45 225 45 165 45 135 30 120 Circle -1184463 true false 73 223 62 Circle -1184463 true false 225 225 58 Rectangle -16777216 true false 90 285 135 300 Rectangle -16777216 true false 165 285 210 300 Rectangle -16777216 true false 240 285 285 300 Rectangle -16777216 true false 60 240 75 285 Rectangle -16777216 true false 75 210 120 225 Rectangle -16777216 true false 150 210 195 225 Rectangle -16777216 true false 225 210 270 225 Rectangle -16777216 true false 285 225 300 270 Rectangle -7500403 true false 135 240 225 270 Polygon -1184463 true false 270 150 270 60 180 60 150 150 180 150 195 75 255 75 255 150 Circle -16777216 false false 90 240 30 Circle -16777216 false false 240 240 30 Circle -11221820 true true 195 105 30 Polygon -1184463 true false 225 195 45 195 45 165 225 165 Polygon -16777216 false false 225 195 45 195 45 165 225 165 dozer2 false 8 Rectangle -11221820 true true 195 135 225 165 Rectangle -1184463 true false 60 150 270 210 Polygon -1184463 true false 0 60 15 75 30 120 30 165 15 195 0 210 30 195 45 180 45 120 45 90 30 75 Circle -1184463 true false 73 223 62 Circle -1184463 true false 225 225 58 Rectangle -16777216 true false 105 285 150 300 Rectangle -16777216 true false 180 285 225 300 Rectangle -16777216 true false 255 285 300 300 Rectangle -16777216 true false 60 255 75 300 Rectangle -16777216 true false 60 210 105 225 Rectangle -16777216 true false 135 210 180 225 Rectangle -16777216 true false 210 210 255 225 Rectangle -16777216 true false 285 210 300 255 Rectangle -7500403 true false 135 240 225 270 Polygon -1184463 true false 270 150 270 60 180 60 150 150 180 150 195 75 255 75 255 150 Circle -16777216 false false 90 240 30 Circle -16777216 false false 240 240 30 Circle -11221820 true true 195 105 30 Polygon -1184463 true false 225 195 45 150 45 120 225 165 Polygon -16777216 false false 45 120 225 165 225 195 45 150 dozer3 false 8 Rectangle -11221820 true true 195 135 225 165 Rectangle -1184463 true false 60 150 270 210 Polygon -1184463 true false 0 105 15 120 30 165 30 210 15 240 0 255 30 240 45 225 45 165 45 135 30 120 Circle -1184463 true false 73 223 62 Circle -1184463 true false 225 225 58 Rectangle -16777216 true false 120 285 165 300 Rectangle -16777216 true false 195 285 240 300 Rectangle -16777216 true false 270 285 300 300 Rectangle -16777216 true false 60 270 75 300 Rectangle -16777216 true false 60 210 90 225 Rectangle -16777216 true false 120 210 165 225 Rectangle -16777216 true false 195 210 240 225 Rectangle -16777216 true false 285 210 300 240 Rectangle -7500403 true false 135 240 225 270 Polygon -1184463 true false 270 150 270 60 180 60 150 150 180 150 195 75 255 75 255 150 Circle -16777216 false false 90 240 30 Circle -16777216 false false 240 240 30 Circle -11221820 true true 195 105 30 Polygon -1184463 true false 225 195 45 195 45 165 225 165 Polygon -16777216 false false 225 195 45 195 45 165 225 165 Rectangle -16777216 true false 60 225 75 240 Rectangle -16777216 true false 75 285 90 300 Rectangle -16777216 true false 285 270 300 285 Rectangle -16777216 true false 270 210 285 225 gibbet true 1 Circle -2674135 true true 135 135 90 Circle -2674135 true true 135 0 30 Circle -2674135 true true 84 219 42 gun true 0 Circle -7500403 true true 75 75 150 Circle -16777216 false false 75 75 150 Rectangle -7500403 true true 135 0 165 120 Rectangle -16777216 false false 135 0 165 120 Circle -7500403 true true 105 105 90 Circle -16777216 false false 105 105 90 gun-fire true 0 Circle -7500403 true true 75 75 150 Circle -16777216 false false 75 75 150 Circle -1184463 true false 45 -105 210 Circle -1 true false 75 -75 150 Rectangle -7500403 true true 135 0 165 120 Rectangle -16777216 false false 135 0 165 120 Polygon -2674135 true false 120 0 60 -15 120 -15 60 -60 120 -30 105 -90 135 -30 150 -120 165 -30 180 -90 180 -30 240 -60 195 -15 255 -15 180 0 Circle -7500403 true true 105 105 90 Circle -16777216 false false 105 105 90 gun1 true 0 Circle -7500403 true true 120 240 60 Circle -16777216 false false 120 240 60 Circle -7500403 true true 105 180 90 Circle -16777216 false false 105 180 90 Rectangle -7500403 true true 135 0 165 120 Rectangle -16777216 false false 135 0 165 120 Circle -7500403 true true 75 75 150 Rectangle -1184463 true false 120 15 180 30 Rectangle -955883 true false 90 45 210 60 Circle -16777216 false false 75 75 150 Polygon -5825686 true false 165 105 120 150 150 165 135 195 180 150 150 135 Rectangle -2674135 true false 105 75 195 90 gun1-fire true 0 Circle -7500403 true true 120 240 60 Circle -16777216 false false 120 240 60 Circle -7500403 true true 105 180 90 Circle -16777216 false false 105 180 90 Circle -11221820 true false 15 -135 270 Circle -13791810 true false 45 -105 210 Rectangle -7500403 true true 135 0 165 120 Rectangle -16777216 false false 135 0 165 120 Circle -7500403 true true 75 75 150 Circle -16777216 false false 75 75 150 Rectangle -1184463 true false 120 15 180 30 Rectangle -955883 true false 90 45 210 60 Rectangle -2674135 true false 105 75 195 90 Polygon -5825686 true false 165 105 120 150 150 165 135 195 180 150 150 135 Polygon -2674135 true false 135 -150 105 -165 135 -120 90 -105 135 -90 105 -60 135 -60 75 -15 135 15 165 15 225 -15 165 -60 195 -60 165 -90 210 -105 165 -120 195 -165 165 -150 line true 0 Line -7500403 true 150 -150 150 150 link true 0 Line -7500403 true 150 0 150 300 link direction true 0 Line -7500403 true 150 150 30 225 Line -7500403 true 150 150 270 225 message false 7 Polygon -14835848 true true 0 150 300 0 300 300 tree false 0 Polygon -6459832 true false 90 210 120 255 120 300 75 315 150 300 150 315 165 300 210 315 165 285 165 240 225 210 165 225 210 180 225 150 165 195 135 120 135 225 90 180 45 120 Circle -10899396 true false 20 5 170 Circle -13840069 true false 75 75 120 Circle -13840069 true false 30 -45 150 Circle -10899396 true false 138 -12 175 Polygon -6459832 true false 75 15 120 120 105 135 Polygon -6459832 true false 165 120 240 30 180 135 tree-top false 0 Circle -10899396 true false 20 5 170 Circle -13840069 true false 75 75 120 Circle -13840069 true false 30 -45 150 Circle -10899396 true false 138 -12 175 Polygon -6459832 true false 75 15 120 120 105 135 Polygon -6459832 true false 165 120 240 30 180 135 truck-part0 true 0 Polygon -7500403 true true 194 130 203 142 164 158 161 176 193 209 181 217 152 188 124 222 112 212 143 175 144 157 106 141 111 127 146 143 161 146 Circle -7500403 true true 140 105 26 Circle -16777216 true false 145 111 6 Circle -16777216 true false 154 111 8 Polygon -16777216 true false 144 126 148 119 155 120 159 126 truck-part1 true 0 Rectangle -1 false false 90 180 120 225 Rectangle -2674135 true false 75 105 240 195 Rectangle -1 true false 75 120 120 135 Rectangle -16777216 true false 75 135 165 165 truck-part2 false 0 Circle -16777216 true false 120 120 60 Circle -1 false false 120 120 60 Circle -1 true false 135 135 30 truck-part3 false 0 Circle -16777216 true false 90 90 120 Circle -1 false false 90 90 120 Circle -1 true false 135 135 30 truck-part4 true 0 Polygon -2674135 true false 90 255 90 165 120 60 210 60 225 225 210 210 180 195 150 195 120 210 90 255 90 165 195 165 195 75 135 75 120 165 90 165 truck0 false 0 Circle -7500403 true true 219 69 42 Rectangle -7500403 true true 225 120 255 150 Rectangle -1 false false 15 210 45 255 Circle -16777216 true false 180 180 120 Rectangle -2674135 true false 0 135 165 225 Circle -16777216 true false 0 240 60 Circle -1 false false 0 240 60 Circle -1 false false 180 180 120 Circle -1 true false 225 225 30 Rectangle -1 true false 0 150 45 165 Rectangle -16777216 true false 15 165 105 195 Polygon -2674135 true false 165 225 165 135 195 30 285 30 300 195 285 180 255 165 225 165 195 180 165 225 165 135 270 135 270 45 210 45 195 135 165 135 Circle -16777216 true false 236 79 12 Circle -16777216 true false 222 79 12 Polygon -16777216 true false 225 104 234 96 248 104 234 102 Polygon -16777216 true false 243 106 244 95 254 93 248 99 Circle -1 true false 15 255 30 truck1 false 0 Circle -7500403 true true 219 69 42 Rectangle -7500403 true true 225 120 255 150 Rectangle -1 false false 15 210 45 255 Circle -16777216 true false 180 180 120 Rectangle -2674135 true false 0 138 165 228 Circle -16777216 true false 0 240 60 Circle -1 false false 0 240 60 Circle -1 false false 180 180 120 Circle -1 true false 225 225 30 Rectangle -1 true false 1 153 46 168 Rectangle -16777216 true false 15 169 105 199 Polygon -2674135 true false 165 229 165 139 195 34 285 34 300 199 285 184 255 169 225 169 195 184 165 229 165 139 270 139 270 49 210 49 195 139 165 139 Circle -16777216 true false 236 79 12 Circle -16777216 true false 222 79 12 Polygon -16777216 true false 225 104 234 96 248 104 234 102 Polygon -16777216 true false 243 106 244 95 254 93 248 99 Circle -1 true false 15 255 30 truck2 false 0 Circle -7500403 true true 219 69 42 Rectangle -7500403 true true 225 120 255 150 Rectangle -1 false false 15 210 45 255 Circle -16777216 true false 180 180 120 Rectangle -2674135 true false -1 132 164 222 Circle -16777216 true false 0 240 60 Circle -1 false false 0 240 60 Circle -1 false false 180 180 120 Circle -1 true false 225 225 30 Rectangle -1 true false 0 143 45 158 Rectangle -16777216 true false 15 160 105 190 Polygon -2674135 true false 165 222 165 132 195 27 285 27 300 192 285 177 255 162 225 162 195 177 165 222 165 132 270 132 270 42 210 42 195 132 165 132 Circle -16777216 true false 236 79 12 Circle -16777216 true false 222 79 12 Polygon -16777216 true false 225 104 234 96 248 104 234 102 Polygon -16777216 true false 243 106 244 95 254 93 248 99 Circle -1 true false 15 255 30 truck3 false 0 Circle -7500403 true true 219 69 42 Rectangle -7500403 true true 225 120 255 150 Rectangle -1 false false 15 210 45 255 Circle -16777216 true false 180 180 120 Rectangle -2674135 true false 0 135 165 225 Circle -16777216 true false 0 240 60 Circle -1 false false 0 240 60 Circle -1 false false 180 180 120 Circle -1 true false 225 225 30 Rectangle -1 true false 0 150 45 165 Rectangle -16777216 true false 15 165 105 195 Polygon -2674135 true false 165 225 165 135 195 30 285 30 300 195 285 180 255 165 225 165 195 180 165 225 165 135 270 135 270 45 210 45 195 135 165 135 Circle -16777216 true false 236 79 12 Circle -16777216 true false 222 79 12 Polygon -16777216 true false 225 104 234 96 248 104 234 102 Polygon -16777216 true false 243 106 244 95 254 93 248 99 Circle -1 true false 15 255 30 zombie-burning0 false 0 Circle -7500403 true true 103 15 90 Polygon -7500403 true true 45 75 150 90 180 105 180 180 210 285 165 300 150 210 135 300 90 285 120 195 120 150 30 150 30 120 120 120 45 105 Polygon -16777216 true false 165 60 149 70 150 90 Polygon -16777216 true false 105 60 118 70 120 90 Circle -16777216 true false 108 36 18 Circle -16777216 true false 134 37 18 Polygon -16777216 true false 122 87 122 72 134 70 142 75 143 90 133 81 Polygon -955883 true false 105 45 60 -45 105 15 90 -45 135 -15 150 -75 165 -15 210 -60 195 45 135 30 Polygon -1184463 true false 150 105 105 75 75 75 60 45 45 75 75 90 Polygon -1184463 true false 120 120 90 105 75 120 45 105 30 120 75 135 Polygon -2674135 true false 165 105 180 60 180 135 225 90 180 180 225 135 195 225 240 195 210 270 180 255 195 255 165 210 180 210 150 150 165 150 150 90 zombie-burning1 false 0 Circle -7500403 true true 103 15 90 Polygon -7500403 true true 45 75 150 90 180 105 180 180 195 285 150 300 150 210 150 300 105 285 120 195 120 150 30 150 30 120 120 120 45 105 Polygon -16777216 true false 165 60 149 70 150 90 Polygon -16777216 true false 105 60 118 70 120 90 Circle -16777216 true false 108 36 18 Circle -16777216 true false 134 37 18 Polygon -16777216 true false 122 87 122 72 134 70 142 75 143 90 133 81 Polygon -955883 true false 120 45 90 15 120 30 90 -75 135 15 165 -45 165 15 210 -45 195 45 150 30 Polygon -2674135 true false 180 285 210 270 240 210 210 240 210 195 195 210 195 165 180 195 150 135 165 210 120 195 180 255 120 225 Polygon -1184463 true false 30 135 15 105 45 135 45 105 75 135 90 105 90 135 135 120 120 150 Polygon -1184463 true false 45 90 30 60 60 90 75 60 90 90 150 90 135 105 zombie-burning2 false 0 Circle -7500403 true true 118 15 90 Polygon -7500403 true true 45 75 150 90 180 105 180 180 180 285 150 300 150 210 150 300 120 285 120 195 120 150 30 150 30 120 120 120 45 105 Polygon -16777216 true false 180 60 164 70 165 90 Polygon -16777216 true false 120 60 133 70 135 90 Circle -16777216 true false 123 36 18 Circle -16777216 true false 149 37 18 Polygon -16777216 true false 137 87 137 72 149 70 157 75 158 90 148 81 Polygon -955883 true false 120 30 75 -60 135 0 135 -30 150 0 180 -75 180 0 195 -30 195 15 270 -45 195 60 150 45 Polygon -2674135 true false 150 300 120 240 135 240 120 180 135 195 135 120 150 195 180 120 180 195 210 165 180 240 210 225 180 285 Polygon -1184463 true false 30 135 45 105 75 135 90 105 105 135 120 90 135 135 75 150 Polygon -1184463 true false 45 105 30 60 60 90 90 45 90 90 120 60 135 105 zombie-burning3 false 0 Circle -7500403 true true 118 15 90 Polygon -7500403 true true 45 60 150 90 180 105 180 180 195 285 150 300 150 210 150 300 105 285 120 195 120 150 30 165 30 135 120 120 45 90 Polygon -16777216 true false 180 60 164 70 165 90 Polygon -16777216 true false 120 60 133 70 135 90 Circle -16777216 true false 123 36 18 Circle -16777216 true false 149 37 18 Polygon -16777216 true false 137 87 137 72 149 70 157 75 158 90 148 81 Polygon -955883 true false 120 30 105 -15 120 0 120 -90 150 0 195 -90 180 0 225 -30 195 45 120 60 60 0 Polygon -1184463 true false 30 150 45 105 60 135 60 90 75 120 90 90 105 120 120 105 120 135 Polygon -1184463 true false 45 75 60 30 60 60 75 60 90 75 105 75 105 90 135 75 135 105 Polygon -2674135 true false 195 285 240 240 210 255 225 180 210 210 210 120 195 165 180 105 165 150 150 135 180 195 150 180 180 225 150 210 180 255 150 270 zombie-part0 true 0 Circle -7500403 true true 103 105 90 Polygon -16777216 true false 167 159 151 169 148 189 Polygon -16777216 true false 105 157 118 167 120 187 Circle -16777216 true false 115 137 18 Circle -16777216 true false 141 138 18 Polygon -16777216 true false 123 183 123 168 135 166 143 171 144 186 134 177 zombie-part1 true 0 Polygon -7500403 true true 135 135 240 150 240 180 135 165 zombie-part2 true 0 Polygon -7500403 true true 75 135 165 135 165 165 75 165 zombie-part3 true 0 Polygon -7500403 true true 105 225 135 135 165 150 150 240 zombie-part4 true 0 Polygon -7500403 true true 150 240 135 150 165 120 195 225 zombie0 false 0 Circle -7500403 true true 103 15 90 Polygon -7500403 true true 45 75 150 90 180 105 180 180 210 285 165 300 150 210 135 300 90 285 120 195 120 150 30 150 30 120 120 120 45 105 Polygon -16777216 true false 165 60 149 70 150 90 Polygon -16777216 true false 105 60 118 70 120 90 Circle -16777216 true false 108 36 18 Circle -16777216 true false 134 37 18 Polygon -16777216 true false 122 87 122 72 134 70 142 75 143 90 133 81 zombie1 false 0 Circle -7500403 true true 103 15 90 Polygon -7500403 true true 45 75 150 90 180 105 180 180 195 285 150 300 150 210 150 300 105 285 120 195 120 150 30 150 30 120 120 120 45 105 Polygon -16777216 true false 165 60 149 70 150 90 Polygon -16777216 true false 105 60 118 70 120 90 Circle -16777216 true false 108 36 18 Circle -16777216 true false 134 37 18 Polygon -16777216 true false 122 87 122 72 134 70 142 75 143 90 133 81 zombie2 false 0 Circle -7500403 true true 118 15 90 Polygon -7500403 true true 45 75 150 90 180 105 180 180 180 285 150 300 150 210 150 300 120 285 120 195 120 150 30 150 30 120 120 120 45 105 Polygon -16777216 true false 180 60 164 70 165 90 Polygon -16777216 true false 120 60 133 70 135 90 Circle -16777216 true false 123 36 18 Circle -16777216 true false 149 37 18 Polygon -16777216 true false 137 87 137 72 149 70 157 75 158 90 148 81 zombie3 false 0 Circle -7500403 true true 118 15 90 Polygon -7500403 true true 45 60 150 90 180 105 180 180 195 285 150 300 150 210 150 300 105 285 120 195 120 150 30 165 30 135 120 120 45 90 Polygon -16777216 true false 180 60 164 70 165 90 Polygon -16777216 true false 120 60 133 70 135 90 Circle -16777216 true false 123 36 18 Circle -16777216 true false 149 37 18 Polygon -16777216 true false 137 87 137 72 149 70 157 75 158 90 148 81 @#$#@#$#@ NetLogo 4.0.4 @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ default 0.0 -0.2 0 0.0 1.0 0.0 1 1.0 0.0 0.2 0 0.0 1.0 link direction true 0 Line -7500403 true 150 150 90 180 Line -7500403 true 150 150 210 180 @#$#@#$#@