<?xml version="1.0" encoding="UTF-8"?>
<otrunk id="b0ac2879-70a7-48c9-81da-2c3699fa0014">
	<imports>
		<import class="org.concord.data.state.OTDataStore" />
		<import class="org.concord.data.state.OTDataChannelDescription" />
		<import class="org.concord.data.state.OTDataField" />
		<import class="org.concord.data.state.OTDataTable" />
		<import class="org.concord.datagraph.state.OTDataGraph" />
		<import class="org.concord.datagraph.state.OTDataAxis" />
		<import class="org.concord.datagraph.state.OTDataGraphable" />
		<import class="org.concord.datagraph.state.OTDataCollector" />
		<import class="org.concord.datagraph.state.OTMultiDataGraph" />
		<import class="org.concord.datagraph.state.OTPluginView" />
		<import class="org.concord.datagraph.state.OTDataBarGraphable" />
		<import class="org.concord.otrunk.OTIncludeRootObject" />
		<import class="org.concord.otrunk.OTInclude" />
		<import class="org.concord.otrunk.OTSystem" />
		<import class="org.concord.otrunk.biologica.OTOrganismPlacement" />
		<import class="org.concord.otrunk.biologica.OTEnvironment" />
		<import class="org.concord.otrunk.biologica.OTOrganism" />
		<import class="org.concord.otrunk.biologica.OTWorld" />
		<import class="org.concord.otrunk.biologica.agent.OTAgentSpecies" />
		<import class="org.concord.otrunk.biologica.agent.OTAgentTrait" />
		<import class="org.concord.otrunk.biologica.agent.OTAgentPropertyImageMap" />
		<import class="org.concord.otrunk.biologica.environment.OTAddAgentButton" />
		<import class="org.concord.otrunk.biologica.environment.OTEnvironmentHolder" />
		<import
			class="org.concord.otrunk.biologica.data.OTBiologicaModelDataProducer" />
		<import class="org.concord.otrunk.biologica.rules.OTRule" />
		<import class="org.concord.otrunk.biologica.rules.OTRuleCondition" />
		<import class="org.concord.otrunk.biologica.rules.OTRuleConsequence" />
		<import class="org.concord.otrunk.ui.OTCurriculumUnit" />
		<import class="org.concord.otrunk.ui.OTPlacement" />
		<import class="org.concord.otrunk.ui.snapshot.OTSnapshot" />
		<import class="org.concord.otrunk.ui.snapshot.OTSnapshotButton" />
		<import class="org.concord.otrunk.ui.snapshot.OTSnapshotAlbum" />
		<import class="org.concord.otrunk.ui.snapshot.OTSnapshotChooser" />
		<import class="org.concord.otrunk.view.OTViewEntry" />
		<import class="org.concord.otrunk.view.OTViewBundle" />
		<import class="org.concord.otrunk.view.OTViewMode" />
		<import class="org.concord.otrunk.view.document.OTCompoundDoc" />
		<import class="org.concord.otrunk.script.ui.OTScriptObject" />
		<import class="org.concord.otrunk.script.js.OTJavascript" />
		<import class="org.concord.otrunk.script.OTScriptEngineBundle" />
		<import class="org.concord.otrunk.script.OTScriptEngineEntry" />
		<import class="org.concord.otrunk.script.ui.OTScriptVariable" />
		<import class="org.concord.otrunk.script.ui.OTScriptVariableComponent" />
		<import class="org.concord.otrunk.script.ui.OTScriptVariableRealObject" />
		<import class="org.concord.otrunk.script.ui.OTScriptVariableView" />
		<import class="org.concord.otrunk.script.ui.OTScriptButton" />
		<import class="org.concord.otrunk.ui.OTSlider" />
		<import class="org.concord.otrunk.ui.OTText" />
		<import class="org.concord.framework.otrunk.view.OTFrame" />
		<import class="org.concord.framework.otrunk.wrapper.OTObjectSet" />
	</imports>
	<idMap>
		<idMapping local_id="rabbit-species" id="eec525fc-4ca5-4fa9-be17-e3d9fa44ed24" />
		<idMapping local_id="plant-species" id="6904840c-03f6-4f2d-b822-bc85aebe70db" />
    <idMapping local_id="hawk-species" id="8cf33f49-8820-4c6f-9e5f-49fcca68acbd" />
	</idMap>
	<objects>
		<OTSystem>
			<bundles>
				<object refid="8d880970-c22a-11dc-95ff-0800200c9a66" />
				<OTViewBundle>
					<frame>
						<OTFrame useScrollPane="false" openMaximized="false"
							width="900" height="500" />
					</frame>
				</OTViewBundle>
				<OTScriptEngineBundle>
					<engines>
						<OTScriptEngineEntry objectClass="org.concord.otrunk.script.js.OTJavascript"
							engineClass="org.concord.otrunk.script.js.OTJavascriptEngine" />
					</engines>
				</OTScriptEngineBundle>
			</bundles>
			<includes>
				<OTInclude href="../global-imports/er-view-bundle.otml" />
				<OTInclude href="species/fast-plants-roots.otml" />
				<OTInclude href="species/white-brown-rabbits.otml" />
        <OTInclude href="species/hawks.otml" />
			</includes>
			<root>
				<OTCompoundDoc>
					<bodyText>
					 <table>
					   <tr>
					     <td>
                  <object refid="${env-holder}" />
					     </td>
					     <td>
					         <object refid="${graph}"/>
					     </td>
					   </tr>
					 </table>
					</bodyText>
					<documentRefs>
						<OTEnvironmentHolder local_id="env-holder"
							width="590" height="460" toolbar="run,info,reset" useSpeedSlider="true">
							<environment>
								<OTEnvironment local_id="environment"
									environmentWidth="10" environmentHeight="10" showRunButton="false"
									winterLength="5" summerLength="50" showWinterImage="false"
									orgSizeMultiplier="1" backgroundImageSrc="images/snow.png">
									<world>
										<OTWorld local_id="peasimple_world"
											speciesPath="org/concord/biologica/worlds/peasimple.xml" />
									</world>
									<rules>
                    <OTRule description="white rabbit visibility" local_id="white-rule">
                      <conditions>
                        <OTRuleCondition property="species name" equals="Mixed Rabbits" />
                        <OTRuleCondition property="color" equals="white" />
                      </conditions>
                      <consequences>
                        <OTRuleConsequence property="chance of being seen" newValueFloat="0.0" />
                      </consequences>
                    </OTRule>
                    <OTRule description="brown rabbit visibility" local_id="brown-rule">
                      <conditions>
                        <OTRuleCondition property="species name" equals="Mixed Rabbits" />
                        <OTRuleCondition property="color" equals="brown" />
                      </conditions>
                      <consequences>
                        <OTRuleConsequence property="chance of being seen" newValueFloat="0.4" />
                      </consequences>
                    </OTRule>
                  </rules>
								</OTEnvironment>
							</environment>
							<scripts>
								<OTScriptObject local_id="setup-script" name="Setup script">
									<script>
										<OTJavascript src="scripts/gradated-sunlight-five-blocks/setup.js" id="04001928-f1d1-4e84-8d46-1c772ed6f665">
											<script>
												importPackage(Packages.java.lang);
                        importPackage(Packages.java.awt);
                        importPackage(Packages.java.awt.event);
                        importPackage(Packages.java.net);
                        importPackage(Packages.org.concord.biologica.environment);
                        importPackage(Packages.org.concord.biologica.ui);
                        
                        var isRunning = false;
                        var brownness = 0;
                        var lastBkgdUrl;
                        var addedHawks, addedRabbits;
                        var numRabbits;
                        
                        var baseUrl = otEnvHolder.getOTObjectService().getCodebase(otEnvHolder);
                        
                        function init() {
                          env.removeAllAgents()
                          env.setStepCount(0)
                          envHolder.pauseAction()
                          env.setWrapNorthSouth(false)
                          env.setWrapEastWest(false)
                          
                          env.addStepListener(stepListener)
                          env.addChangeListener(resetListener)
                          
                          var url = new URL(baseUrl, "images/snow-1.png")
                          envHolder.getEnvironmentView().addBackgroundImageUrl(url)
                          var url2 = new URL(baseUrl, "images/snow-2.png")
                          envHolder.getEnvironmentView().addBackgroundImageUrl(url2)
                          var url3 = new URL(baseUrl, "images/snow-3.png")
                          envHolder.getEnvironmentView().addBackgroundImageUrl(url3)
                          var url4 = new URL(baseUrl, "images/snow-4.png")
                          envHolder.getEnvironmentView().addBackgroundImageUrl(url4)
                          var url5 = new URL(baseUrl, "images/snow-5.png")
                          envHolder.getEnvironmentView().addBackgroundImageUrl(url5)
                          var url6 = new URL(baseUrl, "images/snow-6.png")
                          envHolder.getEnvironmentView().addBackgroundImageUrl(url6)
                          var url7 = new URL(baseUrl, "images/snow-7.png")
                          envHolder.getEnvironmentView().addBackgroundImageUrl(url7)
                          var url8 = new URL(baseUrl, "images/snow-8.png")
                          envHolder.getEnvironmentView().addBackgroundImageUrl(url8)
                          var url9 = new URL(baseUrl, "images/snow-9.png")
                          envHolder.getEnvironmentView().addBackgroundImageUrl(url9)
                          
                          setup();
                          
                          return true;
                        }
                        
                        function setup() {
                          var url = new URL(baseUrl, "images/snow.png");
                          envHolder.getEnvironmentView().setBackgroundImageUrl(url);
                          
                          brownness = 0;
                          addedHawks = addedRabbits = false;
                          numRabbits = 0;
                          
                          envHolder.getToolbar().getButton("Run").setEnabled(true)
                        }
                        
                        var stepHandler =
                        {
                          environmentStepped: function()
                          {
                            checkRabbits();
                            checkHawks();
                            
                            updateTimer();
                        //    if (time / 1000 &gt; 60){
                        //     showMessage("How many white rabbits and how many brown rabbits are left?\nWrite down the number in the table.", env, envHolder);
                        //     envHolder.pauseAction()
                        //     envHolder.getToolbar().getButton("Run").setEnabled(false)
                        //    }
                          }
                        }
                        var stepListener = new EnvironmentStepListener(stepHandler)
                        
                        function checkHawks(){
                           var allHawks = env.getAgents(hawk_species);
                           
                           var numHawks = allHawks.size();
                           
                           if (numHawks == 0){
                            if (addedHawks) {
	                             if (addedRabbits) {
	                               showMessageAndLog("Uh oh, all the animals have died!\nWas there any food for the rabbits to eat? Reset the model and try it again.", env, envHolder, otEnvHolder);
	                               envHolder.pauseAction()
	                               envHolder.getToolbar().getButton("Run").setEnabled(false)
	                             } else {
	                               showMessageAndLog("Uh oh, all the hawks have died!\nWere there any rabbits for them to eat? Reset the model and try it again.", env, envHolder, otEnvHolder);
	                               envHolder.pauseAction()
                                 envHolder.getToolbar().getButton("Run").setEnabled(false)
	                             }
	                           }
                             return;
                           }
                           
                           if (!addedHawks &amp;&amp; numHawks &gt; 0){
                             addedHawks = true;
                           }
                           
                           if (addedHawks &amp;&amp; numRabbits &gt; 0 &amp;&amp; numHawks &lt; 2){
                            addAgent(hawk_species);
                           }
                           
                           if (numHawks &lt; 3 &amp;&amp; numRabbits &gt; 0){
                             setProperty(allHawks, "is immortal", true);
                             setProperty(allHawks, "mating desire bonus", 0);
                             setProperty(allHawks, "hunger bonus", 5);
                           } else {
                             if (allHawks.get(0).getProperty("is immortal")){
                              setProperty(allHawks, "is immortal", false);
                             }
                             
                             if (numHawks &gt; 4){
                              setProperty(allHawks, "mating desire bonus", -30);
                              setProperty(allHawks, "hunger bonus", -40);
                             } else {
                              setProperty(allHawks, "mating desire bonus", -15);
                              setProperty(allHawks, "hunger bonus", -5);
                             }
                           }
                        }
                        
                        function checkRabbits(){
                           var allRabbits = env.getAgents(rabbit_species);
                           numRabbits = allRabbits.size();
                           if (numRabbits == 0){
                            if (addedRabbits &amp;&amp; !addedHawks){
	                            showMessageAndLog("Uh oh, all the rabbits have died!\nDid you add any plants? Reset the model and try it again.", env, envHolder, otEnvHolder);
	                            envHolder.pauseAction()
                              envHolder.getToolbar().getButton("Run").setEnabled(false)
	                          }
                            return;
                           }
                           
                           var numPlants = env.getAgents(plant_species).size();
                           
                           if (!addedRabbits &amp;&amp; numRabbits &gt; 0){
                             addedRabbits = true;
                           }
                           
                           if (addedRabbits &amp;&amp; numPlants &gt; 0 &amp;&amp; numRabbits &lt; 9){
                            addAgent(rabbit_species, [["resource consumption rate", 10]]);
                            addAgent(rabbit_species, [["resource consumption rate", 10]]);
                            // faking here
                            var color = brownness &gt; 0.5 ? "brown" : "white"
                            addAgent(rabbit_species, [["resource consumption rate", 10],["color", color]]);
                            addAgent(rabbit_species, [["resource consumption rate", 10],["color", color]]);
                            
                           } 
                           
                           if (numRabbits &lt; 16){
                           //  setProperty(allRabbits, "metabolism", 0);
                           //  setProperty(allRabbits, "mating desire bonus", 10);
                           //  setProperty(allRabbits, "hunger bonus", -10);
                             setProperty(allRabbits, "min offspring", 5);
                             setProperty(allRabbits, "speed", 7);
                           } else {
                             setProperty(allRabbits, "metabolism", 1);
                             setProperty(allRabbits, "mating desire bonus", -20);
                             setProperty(allRabbits, "hunger bonus", -10);
                             setProperty(allRabbits, "min offspring", 1);
                             setProperty(allRabbits, "speed", 5);
                           }
                           
                           if (numRabbits &gt; 50){
                             setProperty(allRabbits, "mating desire bonus", -40);
                           }
                        }
                        
                        function setProperty(agents, property, value){
                         for (var i = 0; i &lt; agents.size(); i++){
                           agents.get(i).setProperty(property, value);
                         }
                        }
                        
                        function addAgent(species, properties){
                          var newAgent = species.createAgent();
                          
                          if (!!properties){
                           for (var i = 0; i &lt; properties.length; i++){
                             newAgent.setProperty(properties[i][0], properties[i][1]);
                           }
                          }
                          
                          var loc = env.getRandomLocation();
                          newAgent.setEnvironment(env);
                          newAgent.setLocation(loc);
                          env.addAgent(newAgent);
                        }
                        
                        var resetRunHandler= {
                            environmentChanged: function(evt){
                              if (evt.getType() == EnvironmentChangeEvent.RESET){
                                isRunning = false
                                setup()
                              } else if (evt.getType() == EnvironmentChangeEvent.RUN){
                                isRunning = true
                              } else if (evt.getType() == EnvironmentChangeEvent.USER_ADDED_AGENTS &amp;&amp; evt.getValue() == rabbit_species){
                                env.removeAgents(rabbit_species);
                                addRabbits();
                              }
                            }
                          }    
                        var resetListener = new EnvironmentChangeListener(resetRunHandler);
                        
                        function addRabbits(){
                          for (var i = 0; i &lt; 30; i++){
                            var color = i % 2 == 0 ? "brown" : "white"
                            addAgent(rabbit_species, [["resource consumption rate", 10],["metabolism", 1],["mating desire bonus", -20],["hunger bonus", -10],["color", color]]);
                          }
                        }
                        
                        function updateTimer(){
                          var step = env.getStepCount();
                          if (step % 80 === 0){
                           updateColor();
                          }
                          
                          if (step === 900){
                           showMessageAndLog("All the snow is gone. Look at the graph.\nHow many white and brown rabbits are left in the field?\nEnter the number of rabbits in the table and then go on to the next page.", env, envHolder, otEnvHolder);
                           envHolder.pauseAction()
                           envHolder.getToolbar().getButton("Run").setEnabled(false)
                          }
                        }
                        
                        function updateColor(){
                         if (brownness &lt; 0.9) {
                           brownness += 0.1;
                           var brownVisibility = 0.4 - (brownness*0.4);
                           var whiteVisibility = 0 + (brownness*0.4);
                           
                           var brownConsequence = brownRule.getConsequences()[0];
                           brownConsequence.setConsequence("chance of being seen", brownVisibility);
                           
                           var whiteConsequence = whiteRule.getConsequences()[0];
                           whiteConsequence.setConsequence("chance of being seen", whiteVisibility);
                           
                            if (brownness &lt; 0.19){
                              var url = new URL(baseUrl, "images/snow-1.png")
                            } else if (brownness &lt; 0.29){
                              var url = new URL(baseUrl, "images/snow-2.png")
                            } else if (brownness &lt; 0.39){
                              var url = new URL(baseUrl, "images/snow-3.png")
                            } else if (brownness &lt; 0.49){
                              var url = new URL(baseUrl, "images/snow-4.png")
                            } else if (brownness &lt; 0.59){
                              var url = new URL(baseUrl, "images/snow-5.png")
                            } else if (brownness &lt; 0.69){
                              var url = new URL(baseUrl, "images/snow-6.png")
                            } else if (brownness &lt; 0.79){
                              var url = new URL(baseUrl, "images/snow-7.png")
                            } else if (brownness &lt; 0.89){
                              var url = new URL(baseUrl, "images/snow-8.png")
                            } else {
                              var url = new URL(baseUrl, "images/snow-9.png")
                            }
                            
                            
                            if (!url.equals(lastBkgdUrl)) {
                              envHolder.getEnvironmentView().setBackgroundImageUrl(url)
                              lastBkgdUrl = url;
                             }
                         }
                        }
                        
// by putting these urls after "src" we can ensure that the installer will cache
// the images:
// src="images/snow-1.png"
// src="images/snow-2.png"
// src="images/snow-3.png"
// src="images/snow-4.png"
// src="images/snow-5.png"
// src="images/snow-6.png"
// src="images/snow-7.png"
// src="images/snow-8.png"
// src="images/snow-9.png"

                        function save() {
                          return true;
                        }
												</script>
												<scripts>
                        <OTJavascript src="scripts/common/message.js" />
                      </scripts>
										</OTJavascript>
									</script>
									<variables>
										<OTScriptVariableRealObject name="env">
											<reference>
												<object refid="${environment}" />
											</reference>
										</OTScriptVariableRealObject>
										<OTScriptVariableRealObject name="envHolder">
											<reference>
												<object refid="${env-holder}" />
											</reference>
										</OTScriptVariableRealObject>
										<OTScriptVariable name="otEnvHolder">
                      <reference>
                        <object refid="${env-holder}" />
                      </reference>
                    </OTScriptVariable>
                    <OTScriptVariableRealObject name="plant_species">
                      <reference>
                        <object refid="${plant-species}" />
                      </reference>
                    </OTScriptVariableRealObject>
										<OTScriptVariableRealObject name="rabbit_species">
											<reference>
												<object refid="${rabbit-species}" />
											</reference>
										</OTScriptVariableRealObject>
                    <OTScriptVariableRealObject name="hawk_species">
                      <reference>
                        <object refid="${hawk-species}" />
                      </reference>
                    </OTScriptVariableRealObject>
                    <OTScriptVariableRealObject name="whiteRule">
                      <reference>
                        <object refid="${white-rule}" />
                      </reference>
                    </OTScriptVariableRealObject>
                    <OTScriptVariableRealObject name="brownRule">
                      <reference>
                        <object refid="${brown-rule}" />
                      </reference>
                    </OTScriptVariableRealObject>
									</variables>
								</OTScriptObject>
							</scripts>
							<addAgentsButtons>
                <OTAddAgentButton text="Add Plants" limit="50" click="false" quantity="10">
                  <species>
                    <object refid="${plant-species}" />
                  </species>
                  <agentTraits>
                    <OTAgentTrait property="resource consumption rate">
                      <possibleValues>
                        <int>2</int>
                      </possibleValues>
                    </OTAgentTrait>
                  </agentTraits>
                </OTAddAgentButton>
								<OTAddAgentButton text="Add Rabbits" limit="30" click="false" quantity="30">
									<species>
										<object refid="${rabbit-species}" />
									</species>
									<agentTraits>
                    <OTAgentTrait property="mating desire bonus">
                      <possibleValues>
                        <int>-20</int>
                      </possibleValues>
                    </OTAgentTrait>
                    <OTAgentTrait property="hunger bonus">
                      <possibleValues>
                        <int>-10</int>
                      </possibleValues>
                    </OTAgentTrait>
                    <OTAgentTrait property="metabolism">
                      <possibleValues>
                        <int>1</int>
                      </possibleValues>
                    </OTAgentTrait>
                    <OTAgentTrait property="resource consumption rate">
                      <possibleValues>
                        <int>10</int>
                      </possibleValues>
                    </OTAgentTrait>
                  </agentTraits>
								</OTAddAgentButton>
                <OTAddAgentButton text="Add Hawk" limit="2" click="false" quantity="2">
                  <species>
                    <object refid="${hawk-species}" />
                  </species>
                  <agentTraits>
                    <OTAgentTrait property="mating desire bonus">
                      <possibleValues>
                        <int>-15</int>
                      </possibleValues>
                    </OTAgentTrait>
                  </agentTraits>
                </OTAddAgentButton>
							</addAgentsButtons>
							<traitsToShow>
								<string>color</string>
							</traitsToShow>
						</OTEnvironmentHolder>
						<OTDataCollector name="Model Data"
              local_id="graph" multipleGraphableEnabled="false" title="Number of rabbits"
              useDefaultToolBar="false" showControlBar="false" displayButtons="0,3,6" restoreScaleOnReset="true" graphableListEditable="false">
              <source>
                <OTDataGraphable connectPoints="true"
                  color="0x999999" drawMarks="false" name="White rabbits"
                  xColumn="0" yColumn="1">
                  <dataProducer>
                    <OTBiologicaModelDataProducer local_id="dp" lineGraph="true">
                      <modelHolder>
                        <object refid="${env-holder}" />
                      </modelHolder>
                      <lineRules>
                        <OTRule name="white rabbits">
                          <conditions>
	                          <OTRuleCondition property="species name" equals="Mixed Rabbits" />
	                          <OTRuleCondition property="color" equals="white" />
                          </conditions>
                        </OTRule>
                        <OTRule name="brown rabbits">
                          <conditions>
	                          <OTRuleCondition property="species name" equals="Mixed Rabbits" />
	                          <OTRuleCondition property="color" equals="brown" />
                          </conditions>
                        </OTRule>
                      </lineRules>
                  </OTBiologicaModelDataProducer>
                  </dataProducer>
                </OTDataGraphable>
              </source>
              <graphables>
                <OTDataGraphable connectPoints="true"
                  color="0x995500" drawMarks="false"
                  xColumn="0" yColumn="2" name="Brown rabbits">
                  <dataProducer>
                    <object refid="${dp}" />
                  </dataProducer>
                </OTDataGraphable>
              </graphables>
              <xDataAxis>
                <OTDataAxis min="0" max="170"
                  label="Time" units="s" local_id="xAxis">
                </OTDataAxis>
              </xDataAxis>
              <yDataAxis>
                <OTDataAxis min="0" max="60"
                  label="Number of rabbits" local_id="yAxis">
                </OTDataAxis>
              </yDataAxis>
            </OTDataCollector>
					</documentRefs>
				</OTCompoundDoc>
			</root>
		</OTSystem>
	</objects>
</otrunk>

