<?xml version="1.0" encoding="UTF-8"?>
<otrunk id="43efd265-65b7-401c-b518-0b46a5e7c230">
  <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.OTSliderLabel" />
    <import class="org.concord.otrunk.ui.OTText" />
    <import class="org.concord.framework.otrunk.view.OTFrame" />
  </imports>
  <idMap> 
  	<idMapping local_id="rabbit-species" id="f05fc1b1-ea0e-4d6e-a21e-7d089860445a"/>
  </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-thin.otml" />
        <OTInclude href="species/white-rabbits.otml" />
      </includes>
      <root>
        <OTCompoundDoc>
          <bodyText>
            <table width="100%">
              <tr>
                <td>
                  <object refid="${env-holder}" />
                </td>
                <td width="5%" />
                <td>
                  Time:
                  <br />
                  <object refid="${timer}" />
                  seconds
                  <br />
                  <br />
                  Hunger:
                  <br />
                  <br />
                  <object refid="${slider}" />
                </td>
              </tr>
            </table>
            <object refid="${graph}"/>
          </bodyText>
          <documentRefs>
          <OTDataCollector name="Model Data"
							local_id="graph" multipleGraphableEnabled="false"
							autoScaleEnabled="false" showControlBar="false">
							<source>
								<OTDataGraphable connectPoints="true"
									color="0x00aa00" drawMarks="false" name="Number of plants in field"
									xColumn="0" yColumn="1">
									<dataProducer>
										<OTBiologicaModelDataProducer local_id="dp" lineGraph="true">
											<modelHolder>
                                    			<object refid="${env-holder}" />
                                  			</modelHolder>
                                  			<species>
                                  				<string>Fast Plants</string>
                                  			</species>
                                  	</OTBiologicaModelDataProducer>
									</dataProducer>
								</OTDataGraphable>
							</source>
							<!--<graphables>
								<OTDataGraphable connectPoints="true"
									color="0x0000ff" drawMarks="false" name="Temperature"
									xColumn="0" yColumn="2">
									<dataProducer>
										<object refid="${dp}" />
									</dataProducer>
								</OTDataGraphable>
							</graphables>
							--><xDataAxis>
								<OTDataAxis min="0" max="100"
									label="Time" units="s" local_id="xAxis">
								</OTDataAxis>
							</xDataAxis>
							<yDataAxis>
								<OTDataAxis min="0" max="130"
									label="Number of plants" local_id="yAxis">
								</OTDataAxis>
							</yDataAxis>
						</OTDataCollector>
            <OTText local_id="timer" text="0" columns="3" />
            <OTEnvironmentHolder local_id="env-holder" width="590" height="460" toolbar="run,reset" useSpeedSlider="false">
              <environment>
                <OTEnvironment local_id="environment" environmentWidth="5" environmentHeight="5" showRunButton="false" winterLength="5" summerLength="50" showWinterImage="false" orgSizeMultiplier="1.9" backgroundImageSrc="images/grass.jpg">
                  <world>
                    <OTWorld local_id="peasimple_world" speciesPath="org/concord/biologica/worlds/peasimple.xml" />
                  </world>
                  <rules>
                    <OTRule description="lower growth rate">
	                  <conditions>
	                    <OTRuleCondition property="species name" equals="Fast Plants"/>
	                  </conditions>
	                  <consequences>
	                    <OTRuleConsequence property="growth rate" newValueFloat="0.005"/>
	                  </consequences>
	                </OTRule>
                  </rules>
                </OTEnvironment>
              </environment>
              <scripts>
                <OTScriptObject local_id="setup-script" name="Setup world">
                  <script>
                    <OTJavascript src="scripts/gradated-sunlight/setup.js">
                      <script>importPackage(Packages.java.lang);
							importPackage(Packages.java.awt);
							importPackage(Packages.org.concord.biologica.environment);
							importClass(Packages.javax.swing.JOptionPane);
							
							function init() {
									setup()
									env.addChangeListener(resetListener)
							        
									return true;
								}
								
								function setup(){
									env.removeAllAgents()
									env.setStepCount(0)
									envHolder.pauseAction()
									var world = env.getWorld();
									env.setWrapNorthSouth(false);
									env.setWrapEastWest(false);
							        
							        for (var i = 0; i &lt; 80; i++) {
							        	var plant = plant_species.createAgent();
										plant.setProperty("food quantity",100)
										plant.setProperty("max offspring distance", 20)
										plant.setProperty("min offspring", 1)
										plant.setProperty("max offspring", 4)
                    plant.setProperty("age of maturity", 14)
										env.addAgent(plant)
							        }
								}
								
								var resetHandler= {
									environmentChanged: function(evt){
										if (evt.getType() == EnvironmentChangeEvent.RESET){
											setup()
										}
									}
								}
											
								var resetListener = new EnvironmentChangeListener(resetHandler)
						
						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>
                    <OTScriptVariableRealObject name="plant_species">
                      <reference>
                        <object refid="8a6918a9-a82b-4627-977f-2215d41395be" />
                      </reference>
                    </OTScriptVariableRealObject>
                  </variables>
                  <scriptState />
                </OTScriptObject>
                <OTScriptObject local_id="rabbit-script" name="Setup world">
                  <script>
                    <OTJavascript src="scripts/gradated-sunlight/setup.js" id="e286ee82-e83e-4a66-b2ed-86f98e1712a3">
                      <script>importPackage(Packages.java.lang);
							importPackage(Packages.java.awt);
							importPackage(Packages.java.awt.event);
							importPackage(Packages.java.swing);
							importPackage(Packages.java.util);
							importPackage(Packages.org.concord.biologica.environment);
							importClass(Packages.javax.swing.JOptionPane);
							
							var rabbit
							var startTime
							var time
							var previousTime
							var isRunning = false
							var recentlyAddedRabbit = true			// added a rabbit this past second
							
							var ADD_RABBIT_RATE = 10;			// seconds before adding another rabbit
							  			
							function init() {
						        setup()
								env.addStepListener(stepListener)
								env.addChangeListener(resetListener)
								envHolder.getParent().getParent().requestFocus()
								envHolder.getParent().getParent().addKeyListener(arrowListener)
						        
								return true;
							}
							
							function setup(){
								rabbit = rabbit_species.createAgent();
						        rabbit.setAge(20)
								rabbit.setProperty("Speed", 0)
								rabbit.setProperty("is immortal", true)
								rabbit.setProperty("max offspring", 0)
								rabbit.setProperty("calculate drives", false)
								rabbit.setProperty("current behavior", "WANDERING")
								rabbit.setProperty("is selected", 1)
								var loc = env.getRandomLocation(10,10,80,80)
								rabbit.setEnvironment(env)
								rabbit.setLocation(loc)
						        env.addAgent(rabbit)
								
								recentlyAddedRabbit = true
								
								
								time = 0
								previousTime = 0
								timerText.text = 0
						        
						        if (envHolder.getToolbar().getButton("Run") != null)
						        	envHolder.getToolbar().getButton("Run").setEnabled(true)
						        
							}
							
							
							var arrowHandler =
							{
							    keyPressed: function(evt)
							    {
							    	if (rabbit != null &amp;&amp; isRunning) {
								    	var keyCode = evt.getKeyCode()
								    	var loc = rabbit.getLocation()
								    	var newLoc
								    	if (keyCode == evt.VK_UP){
								    		newLoc = new Point(loc.x, loc.y - 3)
								    	} else if (keyCode == evt.VK_DOWN){
								    		newLoc = new Point(loc.x, loc.y + 3)
								    	} else if (keyCode == evt.VK_LEFT){
								    		newLoc = new Point(loc.x - 3, loc.y)
								    	} else if (keyCode == evt.VK_RIGHT){
								    		newLoc = new Point(loc.x + 3, loc.y)
								    	}
								    	rabbit.setLocation(newLoc)
							    	}
							    }
							
							}
							var arrowListener = new KeyListener(arrowHandler)
							
							var stepHandler =
							{
								environmentStepped: function()
								{
									updateTimer();
									
									if (time &gt; 100000){
									     logSuccess(otEnvHolder)
                      showMessageAndLog("¡Felicidades! Tu conejo sobrevivió por 100 segundos.\nPasa a la siguiente página, o si te gustaría intentarlo de nuevo, haz clic en Reset.", env, envHolder, otEnvHolder)    
                      logSuccess(otEnvHolder);
                      envHolder.pauseAction()
                      envHolder.getToolbar().getButton("Run").setEnabled(false)
                      return;
									}
									
									if (rabbit != null){
										envHolder.getParent().getParent().requestFocus()
										var hunger = 100 - rabbit.getProperty("energy").intValue()
										slider.setValue(hunger)
										if (hunger &gt; 5){
											rabbit.setProperty("current behavior", "EATING")
										} else {
											rabbit.setProperty("current behavior", "WANDERING")
										}
										
										if (hunger &gt; 70){
											rabbit.setProperty("show food bubble", true);
										} else {
											rabbit.setProperty("show food bubble", false);
										}
										
										
										if (hunger &gt; 99){
											env.removeAgent(rabbit)
											showMessageAndLog("¡El conejito murió porque no fue capaz de encontrar suficiente comida para vivir!\n¿Por cuánto tiempo lograste sobrevivir? ¿Cuántos conejos hay en el campo?\nSi quisieras intentarlo nuevamente, haz clic en Reset.", env, envHolder, otEnvHolder)
											envHolder.pauseAction()
                      envHolder.getToolbar().getButton("Run").setEnabled(false)
										}
									}
									
									checkRabbitAdding();
										
								}
							}
							var stepListener = new EnvironmentStepListener(stepHandler)
							
							var resetRunHandler= {
									environmentChanged: function(evt){
										if (evt.getType() == EnvironmentChangeEvent.RESET){
											isRunning = false
											setup()
										} else if (evt.getType() == EnvironmentChangeEvent.RUN){
											isRunning = true
											startTime = System.currentTimeMillis()
										} else if (evt.getType() == EnvironmentChangeEvent.PAUSE){
											previousTime = time;
										}
									}
								}
											
							var resetListener = new EnvironmentChangeListener(resetRunHandler)
							
							function updateTimer(){
								timeSinceLastStart = System.currentTimeMillis() - startTime;
								time =  previousTime + timeSinceLastStart;
								timerText.text = Math.floor(time / 1000);
							}
							
							function checkRabbitAdding(){
								seconds = Math.floor(time / 1000);
								if (seconds % ADD_RABBIT_RATE == 0){
									if (!recentlyAddedRabbit) {
										recentlyAddedRabbit = true;
										addRabbit();
									}
								} else {
									recentlyAddedRabbit = false;
								}
							}
							
							function addRabbit(){
								var newRabbit = rabbit_species.createAgent();
							        newRabbit.setAge(50)
									newRabbit.setProperty("is immortal", true)
									newRabbit.setProperty("max offspring", 0)
									newRabbit.setProperty("mating bonus", -1000)
									newRabbit.setProperty("hunger bonus", -50)
									newRabbit.setProperty("is selected", 0)
									var loc = env.getRandomLocation()
									newRabbit.setEnvironment(env)
									newRabbit.setLocation(loc)
							        env.addAgent(newRabbit)
							  }
						
						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="8a6918a9-a82b-4627-977f-2215d41395be" />
                      </reference>
                    </OTScriptVariableRealObject>
                    <OTScriptVariableRealObject name="rabbit_species">
                      <reference>
                        <object refid="f05fc1b1-ea0e-4d6e-a21e-7d089860445a" />
                      </reference>
                    </OTScriptVariableRealObject>
                    <OTScriptVariable name="slider">
                      <reference>
                        <object refid="${slider}" />
                      </reference>
                    </OTScriptVariable>
                    <OTScriptVariable name="timerText">
                      <reference>
                        <object refid="${timer}" />
                      </reference>
                    </OTScriptVariable>
                  </variables>
                  <scriptState />
                </OTScriptObject>
              </scripts>
            </OTEnvironmentHolder>
		        <OTSlider local_id="slider" controllable="false" minimum="0" maximum="100" value="0" numMajorTicks="2" snapToMarks="false" precision="1" length="200" numTicks="0" showTickMarks="false">
              <labels>
                    <OTSliderLabel value="0" label="Not hungry" />
                    <OTSliderLabel value="100" label="Very hungry" />
              </labels>
            </OTSlider>
          </documentRefs>
        </OTCompoundDoc>
      </root>
    </OTSystem>
  </objects>
</otrunk>

