<?xml version="1.0" encoding="UTF-8"?>
<otrunk id="8e0b9f06-44e0-4b0b-9c20-655c4f0757c3">
  <imports>
    <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.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.framework.otrunk.view.OTFrame" />
  </imports>
  <idMap> 
  	<idMapping local_id="rabbit-species" id="f05fc1b1-ea0e-4d6e-a21e-7d089860445a"/>
  	<idMapping local_id="fox-species" id="c59a7a17-5585-4860-b6a5-803e74ea2dbd"/>
  	<idMapping local_id="holes" id="d670b7f4-2f3b-466a-90da-8a18e2862430"/>
  </idMap> 
  <objects>
    <OTSystem>
      <bundles>
        <object refid="8d880970-c22a-11dc-95ff-0800200c9a66" />
        <OTViewBundle>
        	<frame>
            	<OTFrame useScrollPane="false" openMaximized="false" width="900" height="600"/>
          </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/annual-varied-plants.otml" />
        <OTInclude href="species/white-rabbits.otml" />
        <OTInclude href="species/foxes.otml" />
        <OTInclude href="species/env-feature-holes.otml" />
      </includes>
      <root>
      	<OTCompoundDoc>
      		<bodyText>
      			<table width="100%">
      				<tr>
      					<td>
      						<object refid="${env-holder}"/>
      					</td>
      					<td width="5%"></td>
      					<td>
      					Hunger:<br/><br/>
      						<object refid="${slider}"/>
      					</td>
      				</tr>
      			</table>
      		</bodyText>
      		<documentRefs>
		      	<OTEnvironmentHolder local_id="env-holder" width="590" height="460" toolbar="run,reset" useSpeedSlider="true">
		          <environment>
		            <OTEnvironment local_id="environment" environmentWidth="15" environmentHeight="15" showRunButton="false" winterLength="5" summerLength="50" showWinterImage="false" orgSizeMultiplier="2.8" backgroundImageSrc="images/grass.jpg">
		              <world>
		                <OTWorld local_id="peasimple_world" speciesPath="org/concord/biologica/worlds/peasimple.xml" />
		              </world>
		              <barriers>
		                <OTPlacement x="0" y="0" width="10" height="150" />
		              </barriers>
		              <rules>
		                <OTRule description="All plants healthy">
		                  <conditions>
		                    <OTRuleCondition property="species name" equals="Plants" />
		                  </conditions>
		                  <consequences>
		                    <OTRuleConsequence property="Health" newValueFloat="0.99" />
		                  </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; 15; i++) {
								        for (var j = 0; j &lt; 15; j++) {
								        	var envUnit = new EnvironmentUnit(env, null, i, j)
								        	env.setEnvironmentUnit(envUnit, i, j)
								        	envUnit.setProperty("sunlight", new Float((j+1)/10))
								        	var color = new Color(0.3, 0.2, 0.1)
								        	var terrain = new Terrain(world, "terrain", color)
								        	envUnit.setTerrain(terrain)
							            }
							        }
							        
							        for (var i = 0; i &lt; 23; i++) {
							        	var plant = plant_species.createAgent();
										plant.setAge(i*2)
										plant.setProperty("food quantity",100)
										plant.setProperty("min offspring", 1)
										plant.setProperty("max offspring", 6)
										plant.setProperty("max offspring distance", 22)
										env.addAgent(plant)
							        }
							        
							        env.step()
								}
								
								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="f5732706-c9c2-4e29-8c99-4c668dda89b0"/>
		                	</reference>
		                </OTScriptVariableRealObject>
		              </variables>
		              <scriptState />
		            </OTScriptObject>
		            <OTScriptObject local_id="rabbit-script" name="Setup world">
		              <script>
		                <OTJavascript src="scripts/gradated-sunlight/setup.js">
		                  <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);
							importPackage(Packages.org.concord.biologica.agent);
							importClass(Packages.javax.swing.JOptionPane);
							
							var rabbit
							var timer
							var timerTask
							var isRunning = false
							var addedRabbits = false
							  			
							function init() {
						        setup()
								env.addStepListener(stepListener)
								env.addChangeListener(resetListener)
								envHolder.getParent().getParent().requestFocus()
								envHolder.getParent().getParent().addKeyListener(arrowListener)
						        
								return true;
							}
							
							function setup(){
							
								addHoles()
						        
						        timer = new Timer();
						        timerTask = null;
						        
							}
							
							var timesWon = 0
							var lastTimeUsedFast = false
							
							var timerTaskHandler =
							{
								run: function()
								{
									envHolder.getEnvironmentView().pause()
									var usedFast = rabbit.getProperty("type").equalsIgnoreCase("fast")
									if (timesWon == 0 || usedFast != lastTimeUsedFast){
										timesWon++
										lastTimeUsedFast = usedFast
										}
										
									if (timesWon &lt; 3){
										var otherType = usedFast ? "small" : "fast"
										showMessageWithoutPausing("Hooray, your rabbit lived for 30 seconds!\nNow try the game using the "+otherType+" rabbit.\nHit Reset to start again.", envHolder)
									} else {
										showMessageWithoutPausing("Hooray, your rabbit lived for 30 seconds!\nYou've survived many times! Go on to the next page now.", envHolder)
									}
									rabbit = null
								}
							}
							
							function addMoreRabbits(){
								for (var i = 0; i &lt; 6; i++){
									var newRabbit = rabbit_species.createAgent();
									if (i &lt; 4){
										newRabbit.setProperty("speed", 5)
										newRabbit.setProperty("type", "slow")
									} else {
										newRabbit.setProperty("speed", 9)
										newRabbit.setProperty("type", "fast")
										newRabbit.setProperty("hiding place", "")
									}
							        newRabbit.setAge(20)
									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 addFoxes(){
								for (var i = 0; i &lt; 2; i++){
									var fox = fox_species.createAgent();
							        fox.setAge(20)
									fox.setProperty("is immortal", true)
									fox.setProperty("max offspring", 0)
									fox.setProperty("mating bonus", -1000)
									fox.setProperty("speed", 6)
									var loc
									do {
										loc = env.getRandomLocation()
										var distance = loc.distance(rabbit.getLocation())
									} while (distance &lt; 40)
									fox.setEnvironment(env)
									fox.setLocation(loc)
							        env.addAgent(fox)
								}
							}
							
							function addHoles(){
								for (var i = 0; i &lt; 5; i++){
									var hole = holes.createAgent();
									var loc = env.getRandomLocation()
									hole.setEnvironment(env)
									hole.setLocation(loc)
							        env.addAgent(hole)
								}
							}
							
							
							var arrowHandler =
							{
							    keyPressed: function(evt)
							    {
							    	if (rabbit != null &amp;&amp; isRunning) {
							    		var speed = 3
							    		if (rabbit.getProperty("type").equalsIgnoreCase("fast"))
							    			speed = 7
								    	var keyCode = evt.getKeyCode()
								    	var loc = rabbit.getLocation()
								    	var newLoc
								    	if (keyCode == evt.VK_UP){
								    		newLoc = new Point(loc.x, loc.y - speed)
								    	} else if (keyCode == evt.VK_DOWN){
								    		newLoc = new Point(loc.x, loc.y + speed)
								    	} else if (keyCode == evt.VK_LEFT){
								    		newLoc = new Point(loc.x - speed, loc.y)
								    	} else if (keyCode == evt.VK_RIGHT){
								    		newLoc = new Point(loc.x + speed, loc.y)
								    	}
								    	rabbit.setLocation(newLoc)
							    	}
							    }
							
							}
							var arrowListener = new KeyListener(arrowHandler)
							
							var stepHandler =
							{
								environmentStepped: function()
								{
									if (rabbit != null){
										if (rabbit.getEnvironment() == null &amp;&amp; env.getStepCount() &gt; 1){
											showEatenMessage()
											rabbit = null
											return;
										}
									
										var hidingPlaceType = rabbit.getProperty(BasicAnimal.PROPERTY_HIDING_PLACE);
										var hidingPlace = rabbit.getClosestAgent(rabbit, hidingPlaceType);
										if (hidingPlace != null &amp;&amp; hidingPlace.distanceSq &lt; 9){
											rabbit.setProperty("current behavior", "HIDING")
										} else {
											rabbit.setProperty("current behavior", "EATING")
										}
										
										envHolder.getParent().getParent().requestFocus()
										var hunger = 100 - rabbit.getProperty("energy").intValue()
										slider.setValue(hunger)
										
										if (hunger &gt; 99){
											env.removeAgent(rabbit)
											envHolder.pauseAction()
											rabbit.setProperty("Hunger", 0)
											showMessageWithoutPausing("Oh no! Your rabbit died of hunger.\nTry again by pressing the Restart button.", envHolder)
											rabbit = null
										}
									}
										
								}
							}
							var stepListener = new EnvironmentStepListener(stepHandler)
							
							function showEatenMessage(){
								envHolder.getEnvironmentView().pause()
								showMessageWithoutPausing("Oh no, your rabbit got eaten by a fox!.\nTry again by pressing the Restart button.", envHolder)
							}
							
							var timeRemaining = 0
							var resetRunHandler= {
									environmentChanged: function(evt){
										if (evt.getType() == EnvironmentChangeEvent.RESET){
											isRunning = false
											rabbit = null
											setup()
										} else if (evt.getType() == EnvironmentChangeEvent.RUN){
											isRunning = true
											if (timerTask == null){
												timerTask = new TimerTask(timerTaskHandler)
						        				timer.schedule(timerTask, 30000);
						        			} else {
						        				timer.schedule(timerTask, timeRemaining);
						        			}
										} else if (evt.getType() == EnvironmentChangeEvent.PAUSE){
											isRunning = false
											timeRemaining = timerTask.scheduledExecutionTime() - System.currentTimeMillis()
											if (timer != null)
												timer.cancel()
											timer = new Timer();
											timerTask = new TimerTask(timerTaskHandler)
										} else if (evt.getType() == EnvironmentChangeEvent.USER_ADDED_AGENTS){
											rabbit = evt.getValue()
											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) 
									        
									        
									        addMoreRabbits()
									        addFoxes()
									        
									        var buttons = envHolder.getToolbar().getAddAgentsButtons()
									        for (var i = 0; i &lt; buttons.size(); i++){
									        	buttons.get(i).setEnabled(false)
									        }
										}
									}
								}
											
							var resetListener = new EnvironmentChangeListener(resetRunHandler)
						
						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="f5732706-c9c2-4e29-8c99-4c668dda89b0"/>
		                	</reference>
		                </OTScriptVariableRealObject>
		                <OTScriptVariableRealObject name="rabbit_species">
		                	<reference>
		                		<object refid="f05fc1b1-ea0e-4d6e-a21e-7d089860445a"/>
		                	</reference>
		                </OTScriptVariableRealObject>
		                <OTScriptVariableRealObject name="fox_species">
		                	<reference>
		                		<object refid="${fox-species}"/>
		                	</reference>
		                </OTScriptVariableRealObject>
		                <OTScriptVariableRealObject name="holes">
		                	<reference>
		                		<object refid="${holes}"/>
		                	</reference>
		                </OTScriptVariableRealObject>
		                <OTScriptVariable name="slider">
		                	<reference>
		                		<object refid="${slider}"/>
		                	</reference>
		                </OTScriptVariable>
		              </variables>
		              <scriptState />
		            </OTScriptObject>
		            --><OTScriptObject local_id="setup-species-script" name="Setup species">
		              <script>
		                <OTJavascript>
		                  <script>function init()
			      				{
			      					species.setMutationChance(0)
			      				}</script>
		                </OTJavascript>
		              </script>
		              <variables>
		                <OTScriptVariableRealObject name="species">
		                  <reference>
		                    <object refid="f5732706-c9c2-4e29-8c99-4c668dda89b0" />
		                  </reference>
		                </OTScriptVariableRealObject>
		              </variables>
		              <scriptState />
		            </OTScriptObject>
		          </scripts>
		          <addAgentsButtons>
		          	<OTAddAgentButton text="Add Small Rabbit" quantity="1" click="false" limit="1" annotation="small">
	                    <species>
	                      <object refid="${rabbit-species}" />
	                    </species>
	                    <agentTraits>
	                    	<OTAgentTrait property="type">
	                    		<possibleValues>
	                    			<string>slow</string>
	                    		</possibleValues>
	                    	</OTAgentTrait>
	                    </agentTraits>
	                  </OTAddAgentButton>
	                  <OTAddAgentButton text="Add Fast Rabbit" quantity="1" click="false" limit="1" annotation="fast">
	                    <species>
	                      <object refid="${rabbit-species}" />
	                    </species>
	                    <agentTraits>
	                    	<OTAgentTrait property="type">
	                    		<possibleValues>
	                    			<string>fast</string>
	                    		</possibleValues>
	                    	</OTAgentTrait>
	                    	<OTAgentTrait property="hiding place" name="">
				              <possibleValues>
				                <string></string>
				              </possibleValues>
				            </OTAgentTrait>
	                    </agentTraits>
	                  </OTAddAgentButton>
		          </addAgentsButtons>
		          <traitsToShow>
		            <string>size of leaves</string>
		          </traitsToShow>
		          <logAddedAgentProperties>
		          	<string>size of leaves</string>
		          </logAddedAgentProperties>
		        </OTEnvironmentHolder>
		        <OTSlider local_id="slider" minimum="0" maximum="100" value="0" numTicks="10"/>
      		</documentRefs>
      	</OTCompoundDoc>
        
      </root>
    </OTSystem>
  </objects>
</otrunk>

