<?xml version="1.0" encoding="UTF-8"?>
<otrunk id="6c1aafef-50d7-4942-8a57-49b0d1a6e68d">
	<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="b4cb01cb-189d-4450-a705-079dfa05ce58">
											<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("¿Cuántos conejos blancos y cuántos conejos cafés quedan?\n Anota el número en la tabla.", 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("¡Oh oh, todos los animales han muerto!\n ¿Había algo de comida para que comieran los conejos? Hazle Reset al modelo e intentalo nuevamente.", env, envHolder, otEnvHolder);
	                               envHolder.pauseAction()
	                               envHolder.getToolbar().getButton("Run").setEnabled(false)
	                             } else {
	                               showMessageAndLog("¡Oh oh, todos los halcones han muerto!\n ¿Había algunos conejos para que ellos comieran? Hazle Reset al modelo e intentalo nuevamente.", 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("¡Oh oh, todos los conejos han muerto!\n ¿Les pusiste algunas plantas? Hazle Reset al modelo e intentalo nuevamente.", 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("La nieve se ha ido ya. ¿Ha cambiado la población de los conejos?\nVe el número de conejos blancos y cafés usando la gráfica. Luego ve a la siguiente página.", 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"
              useDefaultToolBar="false" showControlBar="false" displayButtons="0,3,6" restoreScaleOnReset="true">
              <source>
                <OTDataGraphable connectPoints="true"
                  color="0x999999" drawMarks="false" name="Number of 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">
                  <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>

