globals [ num-players old-show-labels? ;; lists colors color-names ;; quick start instructions variables quick-start ;; current quickstart instruction displayed in the quickstart monitor qs-item ;; index of the current quickstart instruction qs-items ;; list of quickstart instructions ] breeds [ rockets players ] players-own [ user-id ;; unique id, input by the client when they log in, to identify each student turtle player-num alive? economy power ready? rocket-mode ] rockets-own [ sender speed bomb? countdown ] ;;;;;;;;;;;;;;;;;;;;; ;; Setup Functions ;; ;;;;;;;;;;;;;;;;;;;;; to startup setup setup-quick-start hubnet-set-client-interface "COMPUTER" [ "hub-trade-rockets-client.nlogo" ] hubnet-reset end ;; give the user some information about what the setup button does so they can ;; know whether they want to proceed before actually doing the setup to setup-prompt if user-yes-or-no? ("The SETUP button should only be used when starting " + "over with a new group (such as a new set of students) since " + "all data is lost. Use the RE-RUN button for continuing with " + "an existing group." + "\n\nDo you really want to setup the model?") [ user-message "Before closing this dialog, please do the following:" + "\n -Have everyone that is currently logged in, log off and " + "then kick all remaining clients with the HubNet Console." setup ] end to setup ca set color-names [ "gray" "red" "orange" "brown" "yellow" "blue" "lime" "turquoise" "cyan" "sky" "blue" "violet" "magenta" "pink" ] set colors n-values (length color-names) [ 5 + 10 * ? ] set old-show-labels? show-labels? restart end to restart ask rockets [ die ] clear-patches clear-all-plots let x 0 - screen-edge-x let yrand 0 - (random (screen-size-y / 3)) while [ x <= screen-edge-x ] [ set yrand yrand + random 7 - 3 if (yrand > 0) [ set yrand 0 ] if (yrand < 1 - screen-edge-y) [ set yrand 1 - screen-edge-y ] ask patches with [ pxcor = x and pycor < yrand] [ set pcolor green ] set x x + 1 ] ask players [ setup-player-vars send-info-to-clients ] apply-gravity end to apply-gravity ask patches with [ pcolor = black ] [ without-interruption [ let i 1 while [ (pcolor-of (patch-at 0 i)) = green and (pycor + i) <= screen-edge-y ] [ set i i + 1 ] if (i != 1) [ set pcolor green set pcolor-of (patch-at 0 (i - 1)) black ] ] ] ask players [ while [ pcolor = black ] [ set ycor ycor - .2 wait .001 ] ] end to shoot-rocket hatch-rockets 1 [ set size 2.0 set shape "rocket" set sender myself set speed (power-of myself) / 200.0 if (speed <= 0.0) [ set speed 0.005 ] fd (0.5 + speed / 2) ifelse (rocket-mode-of myself = "attack") [ set bomb? true ] [ set bomb? false ] set countdown 1000 set label "" hideturtle ] end to do-rocket-launches ifelse (simultaneous-firing?) [ ask rockets [ move-rocket ] ] [ while [count rockets > 0] [ ask random-one-of rockets [ move-rocket ] ] ] end to move-rocket showturtle while [pcolor = black and countdown > 0] [ ifelse ( ycor > screen-edge-y - 1 ) [ facexy (xcor + speed * dx) (ycor - abs(speed * dy ) - gravity / 10000.0 ) ] [ facexy (xcor + speed * dx) (ycor + speed * dy - gravity / 10000.0) ] if ( abs(xcor) > screen-edge-x - 1) [ facexy (xcor - speed * dx) (ycor + speed * dy) ] fd speed set countdown (countdown - 1) wait .02 ] ifelse bomb? [ set shape "circle" set color 13 set size 4 ask (players with [alive? = true]) in-radius-nowrap 3 [ set economy (economy - attack-damage) updatelabel if ((sender-of myself) != self) [ ask (sender-of myself) [ set economy economy + attack-profit updatelabel ] ] ] wait .25 if ( pycor > 0 - screen-edge-y ) [ set pcolor black ] ask neighbors [ if ( pycor > 0 - screen-edge-y ) [ set pcolor black ] ] ] [ set shape "circle" set color 92 set size 4 let receiver (one-of (players with [ alive? = true ]) in-radius-nowrap 3) let tempcolor black ifelse (receiver != nobody and receiver != sender) [ set (economy-of receiver) (economy-of receiver) + trade-in-profit ask receiver [ updatelabel ] set tempcolor color-of receiver set (color-of receiver) 92 set (economy-of sender) (economy-of sender) + trade-out-profit ask sender [ updatelabel ] wait .25 set (color-of receiver) tempcolor ] [ wait .25 ] ] die end to go every 0.1 [ ;; get commands and data from the clients listen-clients if (count players with [ alive? and not ready? ] = 0) [ next-round ] if (old-show-labels? != show-labels?) [ set old-show-labels? show-labels? ask players [ updatelabel ] ] ] end to next-round ask players with [ alive? ] [ set ready? false set economy (economy - cost-of-living) updatelabel shoot-rocket ] do-rocket-launches apply-gravity ask players with [ alive? ] [ if (economy <= 0) [ set alive? false set color black set economy 0 ] if (power > economy and power-limited-by-economy?) [ set power economy ] send-info-to-clients ] plot-economies end to plot-economies if (any? players) [ set-current-plot "Economies Graph" set-current-plot-pen "Avg" plot (mean values-from players [ economy ]) set-current-plot-pen "Min" plot (min values-from players [ economy ]) set-current-plot-pen "Max" plot (max values-from players [ economy ]) ] end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Code for interacting with the clients ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; determines which client sent a command, and what the command was to listen-clients while [ hubnet-message-waiting? ] [ hubnet-fetch-message ifelse hubnet-enter-message? [ create-new-player ] [ ifelse hubnet-exit-message? [ remove-player ] [ execute-command hubnet-message-tag ] ] ] end ;; NetLogo knows what each student turtle is supposed to be ;; doing based on the tag sent by the node: to execute-command [command] if (count players with [user-id = hubnet-message-source and alive? ] = 0) [ stop ] if command = "Up" [ change-power 1 stop ] if command = "Down" [ change-power -1 stop ] if command = "Right" [ change-heading 2 stop ] if command = "Left" [ change-heading -2 stop ] if command = "ready?" [ ask players with [user-id = hubnet-message-source] [ set ready? hubnet-message ] stop ] if command = "rocket-mode" [ ask players with [user-id = hubnet-message-source] [ set rocket-mode hubnet-message ] stop ] end ;; Create a turtle for the player to create-new-player create-custom-players 1 [ set user-id hubnet-message-source set player-num num-players setup-player-vars send-info-to-clients ] set num-players num-players + 1 apply-gravity end ;; sets the turtle variables to appropriate initial values to setup-player-vars ;; turtle procedure set xcor ((player-num * 8 + 1) mod screen-size-x) - screen-edge-x set ycor 0 set size 3.0 set color item (player-num mod length colors) colors if (color = green) [ set color blue ] set heading (random 180) - 90 set economy starting-economy set power economy set ready? false set alive? true set rocket-mode "trade" end ;; sends the appropriate monitor information back to the client to send-info-to-clients if (color != black) [ hubnet-send user-id "Color:" (item (position color colors) color-names) ] hubnet-send user-id "Economy:" economy hubnet-send user-id "Power:" power hubnet-send user-id "Heading:" heading hubnet-send user-id "ready?" ready? hubnet-send user-id "rocket-mode" rocket-mode ifelse (alive?) [ hubnet-send user-id "Alive:" "Yes" ] [ hubnet-send user-id "Alive:" "NO" ] updatelabel end to updatelabel ifelse (show-labels?) [ ifelse (economy > 0) [ set label-color white set label economy + " " ] [ set label-color red set label "X" ] ] [ set label "" ] end ;; Kill the turtle to remove-player ask players with [user-id = hubnet-message-source] [ die ] end to change-power [ pchange ] ask players with [user-id = hubnet-message-source] [ set power power + pchange if (power > economy and power-limited-by-economy?) [ set power economy ] if (power > 99) [ set power 99 ] if (power < 0) [ set power 0 ] hubnet-send user-id "Power:" power ] end to change-heading [ hchange ] ask players with [user-id = hubnet-message-source] [ set heading heading + hchange if (heading > 90 and heading < 180) [ set heading 90 ] if (heading < 270 and heading > 180) [ set heading -90 ] hubnet-send user-id "Heading:" heading ] end ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Quick Start functions ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; instructions to quickly setup the model, and clients to run this activity to setup-quick-start set qs-item 0 set qs-items [ "Teacher: Follow these directions to run the HubNet activity." "Optional: Change any of the settings...." "If you do change the settings, press the SETUP button." "Press the GO button." "Everyone: Open up a HubNet Client on your machine and..." "type your user name, select this activity and press ENTER." "Everyone: Find your turtle and try changinge the angle" "Everyone: Stop playing around now: think of your turtle as a nation." "Everyone: You may either send trade rockets or attack rockets." "Everyone: Trade rockets profit both sender and receiver." "Everyone: Attack rockets profit sender and damage receiver." "Everyone: Every turn your economy goes down by cost-of-living." "Everyone: Your launch power is limited by the size of your economy." "Everyone: The rockets will launch after everyone has checked 'ready'." "Teacher: (Decide if students may talk (and make deals) or not.)" "Teacher: To rerun the activity with the same group,..." "stop the model by pressing the NetLogo GO button, if it is on." "Change any of the settings that you would like." "Press the NetLogo Restart button." "Teacher: Restart the simulation by pressing the NetLogo GO button again." "Teacher: To start the simulation over with a new group,..." "stop the model by pressing the NetLogo GO button, if it is on..." "and follow these instructions again from the beginning." ] set quick-start (item qs-item qs-items) end ;; view the next item in the quickstart monitor to view-next set qs-item qs-item + 1 if qs-item >= length qs-items [ set qs-item length qs-items - 1 ] set quick-start (item qs-item qs-items) end ;; view the previous item in the quickstart monitor to view-prev set qs-item qs-item - 1 if qs-item < 0 [ set qs-item 0 ] set quick-start (item qs-item qs-items) end @#$#@#$#@ GRAPHICS-WINDOW 273 94 691 533 25 25 8.0 1 10 1 1 1 0 0 0 1 CC-WINDOW 5 547 702 642 Command Center 0 BUTTON 11 10 71 43 Setup setup-prompt NIL 1 T OBSERVER T NIL BUTTON 139 10 203 43 Go go T 1 T OBSERVER T NIL BUTTON 72 10 141 43 Restart restart NIL 1 T OBSERVER T NIL BUTTON 273 60 391 93 Reset Instructions setup-quick-start NIL 1 T OBSERVER T NIL BUTTON 609 60 693 93 NEXT >>> view-next NIL 1 T OBSERVER T NIL BUTTON 532 60 610 93 <<< PREV view-prev NIL 1 T OBSERVER T NIL MONITOR 273 10 693 59 Quick Start Instructions- More in Info Window quick-start 0 1 SLIDER 10 82 121 115 gravity gravity 0 100 50 1 1 NIL SLIDER 132 83 252 116 starting-economy starting-economy 1 100 50 1 1 NIL SLIDER 9 128 122 161 trade-out-profit trade-out-profit 0 10 4 1 1 NIL SLIDER 132 130 253 163 trade-in-profit trade-in-profit 0 10 6 1 1 NIL SLIDER 15 223 160 256 cost-of-living cost-of-living 0 20 10 1 1 NIL SLIDER 132 173 254 206 attack-damage attack-damage 0 10 8 1 1 NIL SLIDER 9 172 122 205 attack-profit attack-profit 0 10 2 1 1 NIL SWITCH 3 447 147 480 simultaneous-firing? simultaneous-firing? 1 1 -1000 MONITOR 186 220 255 269 avg econ. mean values-from players [ economy ] 3 1 PLOT 14 285 265 435 Economies Graph time Economy 0.0 25.0 0.0 100.0 true false PENS "Avg" 1.0 0 -16777216 true "Min" 1.0 0 -13345367 true "Max" 1.0 0 -2674135 true SWITCH 159 446 267 479 show-labels? show-labels? 0 1 -1000 SWITCH 2 486 185 519 power-limited-by-economy? power-limited-by-economy? 0 1 -1000 @#$#@#$#@ WHAT IS IT? ----------- This model simulates nations trading or fighting with each other. Since the model is highly simplistic, it is highly dubious that any real conclusions about the behavior of nations should be drawn. Rather, this model should be considered as an investigation in psychology and/or game theory, regarding how players will act under a given set of rules. Depending on the purposes of the simulation (and the values of the sliders), this may be played as a cut-throat game until only one player remains. Or it may be run until some player's economy reaches some arbitrary value (e.g. 100). Or it may simply be run for a while until patterns in the players behavior have been discovered. The general idea is: Nations may either trade with each other, or fight with each other. * Trade deals profits both nations. * Battles benefits one nation and and hurts another. The amounts of gain and loss for trade and attack are set by the sliders. It is inherently more or less difficult to trade with some nations than with others. The topographical features of the playing field represent this difficulty, by making it harder to send rockets to some locations than to others. In this model's metaphor, each nation produces different types of resources, so without international trade, economies may falter. This is expressed through the COST-OF-LIVING slider, which takes some number of economy points away from each player each turn. Another important consideration is that nations with more economic power have a greater capability to make trade deals with far-away nations (in this model it is expressed graphically as geographical distance, but in the metaphor it could stand for cultural or other differences instead.) They way this is treated in the model is by the following rule: each player's launching power is limited by the value of their economy. (This feature can be turned off with the "power-limited-by-economy?" switch.) This activity uses hub-trade-rockets-client.nlogo for the HubNet Client interface. For further documentation, see the Participatory Simulations Guide found at http://ccl.northwestern.edu/ps/ HOW TO USE IT ------------- Quickstart Instructions: ------------------------ Teacher: Follow these directions to run the HubNet activity. ( Optional: Change any of the settings... If you do change the settings, press the SETUP button.) Teacher: Press the GO button. Everyone: Open up a HubNet Client on your machine and ... type your user name, select this activity and press ENTER. Find your turtle and try changinge the angle Stop playing around now: think of your turtle as a nation. You may either send trade rockets or attack rockets. Trade rockets profit both sender and receiver. Attack rockets profit sender and damage receiver. Every turn your economy goes down by cost-of-living. Your launch power is limited by the size of your economy. The rockets will launch after everyone has checked 'ready'. Teacher: (Decide if players may talk to each other during rounds or not.) Teacher: To rerun the activity with the same group,... stop the model by pressing the NetLogo GO button, if it is on. Change any of the settings that you would like. Press the NetLogo Restart button. Teacher: Restart the simulation by pressing the NetLogo GO button again. Teacher: To start the simulation over with a new group,... stop the model by pressing the NetLogo GO button, if it is on... and follow these instructions again from the beginning. Buttons: -------- SETUP - clears all turtles and patches and the plot. This should only be pressed when starting out with a new group of users since all data is lost. GO - runs the simulation RESTART - Generates new terrain, sets all player economies to STARTING-ECONOMY, and resets the plot. NEXT >>> - shows the next quick start instruction <<< PREVIOUS - shows the previous quick start instruction RESET INSTRUCTIONS - shows the first quick start instruction Sliders: -------- GRAVITY - gravity determines how quickly rockets turn groundward. STARTING-ECONOMY - Sets the initial value for each player's economy TRADE-OUT-PROFIT - When a trade rocket makes it close enough to another player, the economy of the rocket's *sender* goes up by this much. TRADE-IN-PROFIT - When a trade rocket makes it close enough to another player, the economy of the rocket's *receiver* goes up by this much. ATTACK-PROFIT - When an attack rocket hits another player, the economy of the rocket's *sender* goes up by this much (spoils of war) ATTACK-DAMAGE - If hit by an attack rocket, your economy goes down by this much. COST-OF-LIVING - Each turn, every player's economy goes down by this much. Switches: --------- SIMULTANEOUS-FIRING? - Determines if rockets move one by one, or all together. SHOW-LABELS? - Determines if each players economy is displayed on the screen. Monitors: --------- AVG ECON. - The mean (average) value of all players' economies. Plots: ------ ECONOMIES GRAPH - Plots the mean, max, and min of the player's economies. Client Information ------------------ After logging in, the client interface will appear for the students, and if GO is pressed in NetLogo they will be assigned a turtle (whose color will be told in the "Color:" monitor. There are also monitors showing whether the player is "alive", and the value of their economy. They can also tell what angle their turtle is pointed at, and how much power they will be launching their rocket at. Students may adjust these values by using the UP/DOWN LEFT/RIGHT buttons provided. Students may also choose whether their next launch will be a TRADE rocket or an ATTACK rocket. And after they are satisfied with their selections for the next round, they should toggle the READY? switch to ON. THINGS TO NOTICE ---------------- One thing to consider: If the sum of trade-out-profit and trade-in-profit is less than cost-of-living, then all nations are destined to die out... it's just a matter of time, to see which ones live longer. If the sum is equal to the cost-of-living, it is possible for stable trading cycles to be formed where the economies will stay constant. If the sum is greater than the cost-of-living, then it is possible for the system as a whole (and each player's economy) to keep growing indefinitely -- whether or not it will do so depends on whether people decide to stop trading, and attack each other instead. Also, as the cost of living slider goes up, expect students to be more cautious about breaking their current trading patterns. Each missed shot brings them closer to poverty, which means that if your current trajectory is a hit, then the risk-free choice is to stay with it. *To be completed later* (This model has not been run yet with an actual group, so it is difficult to recommend trends to watch.) THINGS TO TRY ------------- Try turning the attack-profit and attack-damage down to zero. This takes war entirely out of the picture, and allows you to observe the interactions on a strictly trading basis. Questions to ask include: do stable trading patterns form? how many nations die out? Try turning trade-out-profit to 0, and trade-in-profit to 10. Essentially, then, each player has no explicit benefit from sending a rocket to another player. However, they desperately need rockets to be sent to them, in order to survive. Try it first without letting students talk to each other during the simulation. Then try it again, allowing conversation and deal-making. Will players make deals, and cooperate? Or will players try to coerce other players with the threat of attack? Try turning trade-out-profit up to 9, and trade-in-profit down to 1. What differences in behavior do we find? Try turning off the labels which show players economies. How much are the players affected by this knowledge, when they are choosing trading partners? Is there a sort of "gang-up-on-the-leader" mentality? Try turning off the "power-limited-by-economy?" switch. How much of an effect does it have on players' choices of trading partners? Do they favor close partners as strongly as they did before? EXTENDING THE MODEL ------------------- There are numerous options for extending this model. Here are a couple of them: Add a wind-speed variable that will affect the path of the rockets. This could represent the difficulty of maintaining established trade relations with another nation. Change it so that players cannot see which direction other players are aiming. This might be helpful for players who are trying to bluff other players into thinking they are trading partners, so as to get multiple incoming rockets. Change this model to represents companies in different levels of industry. For instance, have producers and retailers (use different shapes to identify them). Make it so that trades between a producer and a retailer provide economic profit, but trades between two companies of the same type do not. (I expect this to provide some very interesting game-theory scenarios -- would players try to kill off all of the other players that are the same shape, to gain a monopoly on the market? And would they succeed?) Add a client-side choice of "internal growth" wherein a player launches no rocket that turn, but undergoes some amount of economic growth. Add special colored patches deep in the dirt. These could represent minerals, oil, or any form of natural resource that requires developing. Players gain bonus economic points when they shoot a rocket into one of these. Or perhaps they "win". Players will then have to choose between devoting resources toward trade (to stay alive) or toward burrowing (to eventually get greater gain). (Again, it is highly dubious that this accurately reflects international relations in any way, but it does sound like fun, and could be interesting, right?) CREDITS AND REFERENCES ---------------------- Copyright 2005, Forrest Sondahl. Northwestern University CS 360 - Multi-Agent Modeling Some code was gratefully borrowed from the library Hubnet model "Disease". @#$#@#$#@ default true 0 Polygon -7500403 true true 150 5 40 250 150 205 260 250 airplane true 0 Polygon -7500403 true true 150 0 135 15 120 60 120 105 15 165 15 195 120 180 135 240 105 270 120 285 150 270 180 285 210 270 165 240 180 180 285 195 285 165 180 105 180 60 165 15 android false 0 Polygon -7500403 true true 210 90 240 195 210 210 165 90 Circle -7500403 true true 110 3 80 Polygon -7500403 true true 105 88 120 193 105 240 105 298 135 300 150 210 165 300 195 298 195 240 180 193 195 88 Rectangle -7500403 true true 127 81 172 96 Rectangle -16777216 true false 135 33 165 60 Polygon -7500403 true true 90 90 60 195 90 210 135 90 box false 0 Polygon -7500403 true true 150 285 285 225 285 75 150 135 Polygon -7500403 true true 150 135 15 75 150 15 285 75 Polygon -7500403 true true 15 75 15 225 150 285 150 135 Line -16777216 false 150 285 150 135 Line -16777216 false 150 135 15 75 Line -16777216 false 150 135 285 75 butterfly false 0 Rectangle -7500403 true true 92 135 207 224 Circle -7500403 true true 158 53 134 Circle -7500403 true true 165 180 90 Circle -7500403 true true 45 180 90 Circle -7500403 true true 8 53 134 Line -16777216 false 43 189 253 189 Rectangle -7500403 true true 135 60 165 285 Circle -7500403 true true 165 15 30 Circle -7500403 true true 105 15 30 Line -7500403 true 120 30 135 60 Line -7500403 true 165 60 180 30 Line -16777216 false 135 60 135 285 Line -16777216 false 165 285 165 60 cactus false 0 Rectangle -7500403 true true 135 30 175 177 Rectangle -7500403 true true 67 105 100 214 Rectangle -7500403 true true 217 89 251 167 Rectangle -7500403 true true 157 151 220 185 Rectangle -7500403 true true 94 189 148 233 Rectangle -7500403 true true 135 162 184 297 Circle -7500403 true true 219 76 28 Circle -7500403 true true 138 7 34 Circle -7500403 true true 67 93 30 Circle -7500403 true true 201 145 40 Circle -7500403 true true 69 193 40 car false 0 Polygon -7500403 true true 300 180 279 164 261 144 240 135 226 132 213 106 203 84 185 63 159 50 135 50 75 60 0 150 0 165 0 225 300 225 300 180 Circle -16777216 true false 180 180 90 Circle -16777216 true false 30 180 90 Polygon -16777216 true false 162 80 132 78 134 135 209 135 194 105 189 96 180 89 Circle -7500403 true true 47 195 58 Circle -7500403 true true 195 195 58 cat false 0 Line -7500403 true 285 240 210 240 Line -7500403 true 195 300 165 255 Line -7500403 true 15 240 90 240 Line -7500403 true 285 285 195 240 Line -7500403 true 105 300 135 255 Line -16777216 false 150 270 150 285 Line -16777216 false 15 75 15 120 Polygon -7500403 true true 300 15 285 30 255 30 225 75 195 60 255 15 Polygon -7500403 true true 285 135 210 135 180 150 180 45 285 90 Polygon -7500403 true true 120 45 120 210 180 210 180 45 Polygon -7500403 true true 180 195 165 300 240 285 255 225 285 195 Polygon -7500403 true true 180 225 195 285 165 300 150 300 150 255 165 225 Polygon -7500403 true true 195 195 195 165 225 150 255 135 285 135 285 195 Polygon -7500403 true true 15 135 90 135 120 150 120 45 15 90 Polygon -7500403 true true 120 195 135 300 60 285 45 225 15 195 Polygon -7500403 true true 120 225 105 285 135 300 150 300 150 255 135 225 Polygon -7500403 true true 105 195 105 165 75 150 45 135 15 135 15 195 Polygon -7500403 true true 285 120 270 90 285 15 300 15 Line -7500403 true 15 285 105 240 Polygon -7500403 true true 15 120 30 90 15 15 0 15 Polygon -7500403 true true 0 15 15 30 45 30 75 75 105 60 45 15 Line -16777216 false 164 262 209 262 Line -16777216 false 223 231 208 261 Line -16777216 false 136 262 91 262 Line -16777216 false 77 231 92 261 circle false 0 Circle -7500403 true true 0 0 300 cow skull false 0 Polygon -7500403 true true 150 90 75 105 60 150 75 210 105 285 195 285 225 210 240 150 225 105 Polygon -16777216 true false 150 150 90 195 90 150 Polygon -16777216 true false 150 150 210 195 210 150 Polygon -16777216 true false 105 285 135 270 150 285 165 270 195 285 Polygon -7500403 true true 240 150 263 143 278 126 287 102 287 79 280 53 273 38 261 25 246 15 227 8 241 26 253 46 258 68 257 96 246 116 229 126 Polygon -7500403 true true 60 150 37 143 22 126 13 102 13 79 20 53 27 38 39 25 54 15 73 8 59 26 47 46 42 68 43 96 54 116 71 126 dog false 0 Polygon -7500403 true true 300 165 300 195 270 210 183 204 180 240 165 270 165 300 120 300 0 240 45 165 75 90 75 45 105 15 135 45 165 45 180 15 225 15 255 30 225 30 210 60 225 90 225 105 Polygon -16777216 true false 0 240 120 300 165 300 165 285 120 285 10 221 Line -16777216 false 210 60 180 45 Line -16777216 false 90 45 90 90 Line -16777216 false 90 90 105 105 Line -16777216 false 105 105 135 60 Line -16777216 false 90 45 135 60 Line -16777216 false 135 60 135 45 Line -16777216 false 181 203 151 203 Line -16777216 false 150 201 105 171 Circle -16777216 true false 171 88 34 Circle -16777216 false false 261 162 30 ghost false 0 Polygon -7500403 true true 30 165 13 164 -2 149 0 135 -2 119 0 105 15 75 30 75 58 104 43 119 43 134 58 134 73 134 88 104 73 44 78 14 103 -1 193 -1 223 29 208 89 208 119 238 134 253 119 240 105 238 89 240 75 255 60 270 60 283 74 300 90 298 104 298 119 300 135 285 135 285 150 268 164 238 179 208 164 208 194 238 209 253 224 268 239 268 269 238 299 178 299 148 284 103 269 58 284 43 299 58 269 103 254 148 254 193 254 163 239 118 209 88 179 73 179 58 164 Line -16777216 false 189 253 215 253 Circle -16777216 true false 102 30 30 Polygon -16777216 true false 165 105 135 105 120 120 105 105 135 75 165 75 195 105 180 120 Circle -16777216 true false 160 30 30 heart false 0 Circle -7500403 true true 152 19 134 Polygon -7500403 true true 150 105 240 105 270 135 150 270 Polygon -7500403 true true 150 105 60 105 30 135 150 270 Line -7500403 true 150 270 150 135 Rectangle -7500403 true true 135 90 180 135 Circle -7500403 true true 14 19 134 key false 0 Rectangle -7500403 true true 90 120 300 150 Rectangle -7500403 true true 270 135 300 195 Rectangle -7500403 true true 195 135 225 195 Circle -7500403 true true 0 60 150 Circle -16777216 true false 30 90 90 leaf false 0 Polygon -7500403 true true 150 210 135 195 120 210 60 210 30 195 60 180 60 165 15 135 30 120 15 105 40 104 45 90 60 90 90 105 105 120 120 120 105 60 120 60 135 30 150 15 165 30 180 60 195 60 180 120 195 120 210 105 240 90 255 90 263 104 285 105 270 120 285 135 240 165 240 180 270 195 240 210 180 210 165 195 Polygon -7500403 true true 135 195 135 240 120 255 105 255 105 285 135 285 165 240 165 195 monster false 0 Polygon -7500403 true true 75 150 90 195 210 195 225 150 255 120 255 45 180 0 120 0 45 45 45 120 Circle -16777216 true false 165 60 60 Circle -16777216 true false 75 60 60 Polygon -7500403 true true 225 150 285 195 285 285 255 300 255 210 180 165 Polygon -7500403 true true 75 150 15 195 15 285 45 300 45 210 120 165 Polygon -7500403 true true 210 210 225 285 195 285 165 165 Polygon -7500403 true true 90 210 75 285 105 285 135 165 Rectangle -7500403 true true 135 165 165 270 moon false 0 Polygon -7500403 true true 175 7 83 36 25 108 27 186 79 250 134 271 205 274 281 239 207 233 152 216 113 185 104 132 110 77 132 51 rocket true 0 Polygon -7500403 true true 120 165 75 285 135 255 165 255 225 285 180 165 Polygon -1 true false 135 285 105 135 105 105 120 45 135 15 150 0 165 15 180 45 195 105 195 135 165 285 Rectangle -7500403 true true 147 176 153 288 Polygon -7500403 true true 120 45 180 45 165 15 150 0 135 15 Line -7500403 true 105 105 135 120 Line -7500403 true 135 120 165 120 Line -7500403 true 165 120 195 105 Line -7500403 true 105 135 135 150 Line -7500403 true 135 150 165 150 Line -7500403 true 165 150 195 135 star false 0 Polygon -7500403 true true 151 1 185 108 298 108 207 175 242 282 151 216 59 282 94 175 3 108 116 108 target false 0 Circle -7500403 true true 0 0 300 Circle -16777216 true false 30 30 240 Circle -7500403 true true 60 60 180 Circle -16777216 true false 90 90 120 Circle -7500403 true true 120 120 60 wheel false 0 Circle -7500403 true true 3 3 294 Circle -16777216 true false 30 30 240 Line -7500403 true 150 285 150 15 Line -7500403 true 15 150 285 150 Circle -7500403 true true 120 120 60 Line -7500403 true 216 40 79 269 Line -7500403 true 40 84 269 221 Line -7500403 true 40 216 269 79 Line -7500403 true 84 40 221 269 @#$#@#$#@ NetLogo 3.0 @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ @#$#@#$#@