<?xml version="1.0" encoding="UTF-8"?>
<otrunk id="c0db25d0-28fd-41cd-ac69-51252d5f6579">
  <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.framework.otrunk.view.OTFrame" />
  </imports>
  <objects>
    <OTSystem>
      <bundles>
        <object refid="8d880970-c22a-11dc-95ff-0800200c9a66" />
        <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="three-sunlight-movable-variation.otml" />
      </includes>
      <root>
        <OTEnvironmentHolder local_id="env-holder" width="590" height="460" toolbar="run,info cursor,carry,reset">
          <environment>
            <object refid="23d3fb4f-123a-425f-9d60-d84e145c0678!/environment"/>
          </environment>
          <traitsToShow>
            <string>size of leaves</string>
          </traitsToShow>
          <addAgentsButtons>
            <OTAddAgentButton text="Add Plant A" limit="1">
              <species>
                <object refid="f5732706-c9c2-4e29-8c99-4c668dda89b0" />
              </species>
              <agentTraits>
                <OTAgentTrait property="size of leaves">
                  <defaultValues>
                    <float>2.0</float>
                  </defaultValues>
                </OTAgentTrait>
                <OTAgentTrait property="gen">
                  <defaultValues>
                    <int>1</int>
                  </defaultValues>
                </OTAgentTrait>
                <OTAgentTrait property="complete">
                  <defaultValues>
                    <int>0</int>
                  </defaultValues>
                </OTAgentTrait>
              </agentTraits>
            </OTAddAgentButton>
          </addAgentsButtons>
          <scripts>
            <OTScriptObject local_id="setup-script" name="Setup script">
              <script>
                <OTJavascript src="scripts/gradated-sunlight-five-blocks/setup.js">
                  <script>importPackage(Packages.java.lang);
importPackage(Packages.java.awt);
importPackage(Packages.org.concord.biologica.environment);

function init() {
    env.removeAllAgents()
    env.setStepCount(0)
    envHolder.pauseAction()
	var world = env.getWorld()
	env.setColumns(15)
	env.setRows(15)
	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)
	        	if (j &lt; 5)
	        		percentSunlight = 1.0
	        	else if (j &lt; 10)
	        		percentSunlight = 0.9
	        	else if (j &lt; 15)
	        		percentSunlight = 0.8
	        		
	        	envUnit.setProperty("sunlight", new Float(percentSunlight))
	        	
	        	var r =  (percentSunlight) * 0.5
	        	var g = r * 0.5
	        	var b = g * 0.2
	        	var color = new Color(r+0.3, g+0.2, b+0.1)
	        	var terrain = new Terrain(world, "terrain", color)
	        	envUnit.setTerrain(terrain)
            }
        }
    holder.repaint();
	return true;
}

function save() {
	return true;
}</script>
                </OTJavascript>
              </script>
              <variables>
                <OTScriptVariableRealObject name="env">
                  <reference>
                    <object refid="23d3fb4f-123a-425f-9d60-d84e145c0678!/environment" />
                  </reference>
                </OTScriptVariableRealObject>
                <OTScriptVariableRealObject name="envHolder">
                  <reference>
                    <object refid="${env-holder}" />
                  </reference>
                </OTScriptVariableRealObject>
                <OTScriptVariableRealObject name="holder">
                  <reference>
                    <object refid="${env-holder}" />
                  </reference>
                </OTScriptVariableRealObject>
              </variables>
              <scriptState />
            </OTScriptObject>
            <OTScriptObject local_id="image-script" name="Change environment background">
              <script>
                <OTJavascript>
                  <script>importPackage(Packages.java.lang);
importPackage(Packages.java.awt);
importPackage(Packages.org.concord.biologica.environment);
importPackage(Packages.java.net);

function init() {
	var baseUrl = otEnvHolder.getOTObjectService().getCodebase(otEnvHolder)
	var url = new URL(baseUrl, "images/sun3levels-2-white.png")
    envHolder.getEnvironmentView().setBackgroundImageUrl(url)
	return true;
}

function save() {
	return true;
}

// by putting this urls after "src" we can ensure that the installer will cache
// the images:
// src="images/sun3levels-2-white.png"
</script>
                </OTJavascript>
              </script>
              <variables>
                <OTScriptVariableRealObject name="envHolder">
                  <reference>
                    <object refid="${env-holder}" />
                  </reference>
                </OTScriptVariableRealObject>
                <OTScriptVariable name="otEnvHolder">
                  <reference>
                    <object refid="${env-holder}" />
                  </reference>
                </OTScriptVariable>
              </variables>
              <scriptState />
            </OTScriptObject>
            <OTScriptObject name="Make offspring script">
              <script>
                <OTJavascript id="0e78c188-400a-4818-bdda-ab13ba8876a8">
                  <script>importPackage(Packages.java.lang);
importPackage(Packages.java.awt);
importPackage(Packages.java.util);
importPackage(Packages.org.concord.biologica.environment);
importPackage(Packages.org.concord.biologica.agent);

var rand;
var yearCount;
var message1StepCount;
var message2StepCount;
var message3StepCount;
var message4StepCount;
var waitingForMessage1;
var waitingForMessage2;
var waitingForMessage3;
var waitingForMessage4;
var makeSeedsCount;
var readyToMakeSeeds;
var popSize
var generation
var previousHealth
var shownNoMorePlantsMessage
var shownWiltedMessage
var shownTwoWiltedMessage
var atLeastOneAgentAdded
  			
function init() {
	env.addChangeListener(changeListener)
	env.addStepListener(stepListener)
	env.addChangeListener(resetListener)
	
	rand = new Random()
	
	initializeVariables();
	
	return true;
}

function initializeVariables() {
	env.setWinterLength(2)
	yearCount = 0;
	message1StepCount = 0;
	message2StepCount = 0;
	message3StepCount = 0;
	message4StepCount = 0;
	waitingForMessage1 = false;
	waitingForMessage2 = false;
	waitingForMessage3 = false;
	waitingForMessage4 = false;
	makeSeedsCount = 0;
	readyToMakeSeeds = false;
	popSize = -1
	generation = 1
	previousHealth = -1
	shownNoMorePlantsMessage = false
	shownWiltedMessage = false
	shownTwoWiltedMessage = false
	atLeastOneAgentAdded = false
}



var changeHandler = {
	environmentChanged: function(evt){
		var agents = env.getAllAgents()
		if (agents.size() &gt; 0) {
			var firstAgent = agents.get(0)
			firstAgent.setProperty("Seed mid-Fall", false)
			firstAgent.setProperty("Days to seed", 1000)	
			firstAgent.setProperty("max offspring", 0)    	
			if (evt.getType() == EnvironmentChangeEvent.SEASON_CHANGE){
				var season = evt.getValue()
				if (season == "summer"){
					yearCount ++
				}	
				if (firstAgent.getProperty("gen") == 1){			//first generation
					if(firstAgent.getPropertyValueAsFloat("Health") &lt; 1.0){		//seed planted in the wrong place
						if (season == "summer"){
							if (!shownWiltedMessage){
								showMessage("You planted your seed in a flowerbox where the light level is wrong for it.\n" +
								"It won't make a flower and it won't drop any seeds.", env, envHolder)
								shownWiltedMessage = true
							}
							waitingForMessage3 = true
						}
					}
					else if	(season == "spring"){			//seed planted in the right place		
						setPropertyOnAllAgents("Chance of flowering", 0.0)
					}
					
					else if	(season == "summer" ){	
						setPropertyOnAllAgents("Chance of flowering", 0.2)
					}
					
					else if (season == "fall" &amp;&amp; firstAgent.getPropertyValueAsBoolean("Has flower")){
						readyToMakeSeeds = true
						setPropertyOnAllAgents("is immortal", true)
					}
				}
				else if (firstAgent.getProperty("gen") == 2 &amp;&amp; firstAgent.getProperty("complete") != 1.0){						// second generation
					if (season == "spring"){
						setPropertyOnAllAgents("Chance of flowering", 0.0)
						
					}
					if (season == "summer"){
						setPropertyOnAllAgents("Chance of flowering", 0.0)
						if (!shownTwoWiltedMessage)
							waitingForMessage1 = true;
					}
					if (season == "fall"){
						waitingForMessage2 = true;
						waitingForMessage4 = true
					}
				}
			}
		}
	}
}
				
var changeListener = new EnvironmentChangeListener(changeHandler)	

function setPropertyOnAllAgents(property, value){
	var agents = env.getAllAgents()
	for (var i = 0; i &lt; agents.size(); i++) {
		var agent = agents.get(i)
		agent.setProperty(property, value)
	}
}


var stepHandler = {
	environmentStepped: function(){
	
		var agents = env.getAllAgents()
		if (agents.size() &gt; 0)
			atLeastOneAgentAdded = true
		
		if (agents.size() == 0){
			if (!atLeastOneAgentAdded) {
				env.setStepCount(0) 	// don't start counting days until a seed is planted
				return
			}
			if (!shownNoMorePlantsMessage &amp;&amp; atLeastOneAgentAdded) {
				if (waitingForMessage3)
					showMessageAndLog("Your plant wilted and died, and left no seeds so no new plants will grow.\n Hit 'reset' and try again.", env, envHolder, otEnvHolder)
				else
					showMessageAndLog("You have no more plants!\n If you want to restart, click the Restart button.", env, envHolder, otEnvHolder)
				shownNoMorePlantsMessage = true
			}
			return
		}
		
		
		if (agents.size() &lt; popSize &amp;&amp; agents.size() &lt; 6){
			showMessage("Uh oh, you dropped a plant in between the flower boxes and it died!\n If you want to restart, click the Restart button.", env, envHolder)
			popSize = agents.size()
			return
		}
		
		popSize = agents.size()
		
		if (generation == 1){
			firstAgent = agents.get(0)
			
			var health = firstAgent.getPropertyValueAsFloat("Health")
			if (health &lt; previousHealth &amp;&amp; !shownWiltedMessage){
				showMessage("Careful! You moved your plant to a flowerbox that made it wilted.", env, envHolder)
				shownWiltedMessage = true
				waitingForMessage3 = true
			}
			previousHealth = health
			
			if (readyToMakeSeeds){
				makeSeedsCount++
				if (makeSeedsCount == 10){
					firstAgent.setProperty("is immortal", false)
					firstAgent.setProperty("Has flower", false)
					makeSeeds(firstAgent)
				}
			}
		}
		
		if (waitingForMessage1 == true){
			message1StepCount++;
			if (message1StepCount == 15){
				var season = env.getSeason()
				showMessage("Two of the new plants are wilted.\nUse the Information Tool to look at the plants more closely.\nDo all the plants have the same leaf size?", env, envHolder)
				message1StepCount = 0
				waitingForMessage1 = false
				shownTwoWiltedMessage = true
			}	
		}
		
		if(waitingForMessage2 == true){
			message2StepCount++
			if (message2StepCount == 50){
				var allAgentsAreHealthy = true
				for (var i = 0; i &lt; agents.size(); i++) {
					var agent = agents.get(i)
					var health = agent.getProperty("Health")
					if (health &lt; 0.99) {
						allAgentsAreHealthy = false
						break
					}
				}
				if (!allAgentsAreHealthy){
					showMessage("Try moving your wilted plants to different flowerboxes and see what happens.", env, envHolder)
				}
				message2StepCount = 0
				waitingForMessage2 = false
				
				env.setWinterLength(-1)
			}	
		}
				
		if (waitingForMessage4 == true){
			var allAgentsAreHealthy = true
			for (var i = 0; i &lt; agents.size(); i++) {
				var agent = agents.get(i)
				var health = agent.getProperty("Health")
				if (health &lt; 0.99) {
					allAgentsAreHealthy = false
					break
				}
			}
			
			if (allAgentsAreHealthy){	
				message4StepCount++;
			}
			if (message4StepCount == 10){
				setPropertyOnAllAgents("Chance of flowering", 1.0)
			}
			if	(message4StepCount == 16){
				if (agents.size() == 6) {
				  logSuccess(otEnvHolder)
					showMessageAndLog("Good job! Each of your plants is in an environment that makes it healthy!\nIf you want to experiment again, you can reset the model,\nor you can continue to the next page.", env, envHolder, otEnvHolder)
				} else
					showMessage("Each of your plants is in an environment that makes it healthy!\nHowever, some of your plants were dropped between flower boxes.\nIf you want to try again to make all six plants healthy, you can reset the model.", env, envHolder)
				waitingForMessage4 = false;
				setPropertyOnAllAgents("complete", 1.0)
			}	
		}
	}		
}
			
var stepListener = new EnvironmentStepListener(stepHandler)	

function makeSeeds(agent){
	agent.setProperty("Has flower", false)
	generation = 2
	
	for (var i = 0; i &lt; 4; i++){
		var agentTrait = new AgentTrait("size of leaves")
		agentTrait.setValues(2.0)
		var child = agent.cloneSelf(agentTrait)
		child.setProperty("gen", 2)
		setLocation(agent, child)
		env.addAgent(child)
	}
	var agentTrait = new AgentTrait("size of leaves")
	agentTrait.setValues(1.0)
	var child =  agent.cloneSelf(agentTrait)
	child.setProperty("gen", 2)
	setLocation(agent, child)
	env.addAgent(child)
	
	var agentTrait = new AgentTrait("size of leaves")
	agentTrait.setValues(3.0)
	child =  agent.cloneSelf(agentTrait)
	child.setProperty("gen", 2)
	setLocation(agent, child)
	env.addAgent(child)
}

function setLocation(parent, child){
	var xLocParent = parent.getLocation().x;
	var yLocParent = parent.getLocation().y;
	
	do {
		var xLocChild = xLocParent - 50 + (rand.nextInt(100))
		var yLocChild = yLocParent - 5 + (rand.nextInt(10))
		child.setLocation(new Point(xLocChild, yLocChild))
	} while (env.isInBarrier(child) || onTopOfSomeone(child))
}

function onTopOfSomeone(agent){
	var x1 = agent.getLocation().x
	var y1 = agent.getLocation().y
	var agents = env.getAllAgents()
	for (var i = 0; i &lt; agents.size(); i++) {
		var otherAgent = agents.get(i)
		var x2 = otherAgent.getLocation().x
		var y2 = otherAgent.getLocation().y
		if (Math.abs(x1 - x2) &lt; 5 &amp;&amp; Math.abs(y1 - y2) &lt; 9)
			return true
	}
	return false
}
				
var resetHandler= {
	environmentChanged: function(evt){
		if (evt.getType() == EnvironmentChangeEvent.RESET){
	 		initializeVariables()
		}
	}
}
			
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="23d3fb4f-123a-425f-9d60-d84e145c0678!/environment" />
                  </reference>
                </OTScriptVariableRealObject>
                <OTScriptVariableRealObject name="envHolder">
                  <reference>
                    <object refid="${env-holder}" />
                  </reference>
                </OTScriptVariableRealObject>
                <OTScriptVariable name="otEnvHolder">
                  <reference>
                    <object refid="${env-holder}" />
                  </reference>
                </OTScriptVariable>
              </variables>
              <scriptState />
            </OTScriptObject>
          </scripts>
          <logAddedAgentProperties>
            <string>size of leaves</string>
          </logAddedAgentProperties>
        </OTEnvironmentHolder>
      </root>
    </OTSystem>
  </objects>
</otrunk>

