
function SoundPlayer(){}
SoundPlayer.prototype.defaultIfEmpty=function(val1,val2){if(val1==undefined){return val2;}else{return val1;}}
SoundPlayer.prototype.makeActionScriptCall=function(callStr){try{window.document['soundPlayer'].SetVariable('actionScriptCall',callStr);}catch(ex){}}
SoundPlayer.prototype.play=function(fileURL,volumeLevel,loopCount,isNewTrack){return;volumeLevel=this.defaultIfEmpty(volumeLevel,100);loopCount=this.defaultIfEmpty(loopCount,0);isNewTrack=this.defaultIfEmpty(isNewTrack,false);var actionScriptCall='play('+fileURL+','+volumeLevel+','+
loopCount+','+isNewTrack+')';this.makeActionScriptCall(actionScriptCall);}
SoundPlayer.prototype.setVolume=function(fileURL,volumeLevel,fadeTime){var actionScriptCall='setVolume('+fileURL+','+volumeLevel+')';this.makeActionScriptCall(actionScriptCall);}
SoundPlayer.prototype.setGlobalVolume=function(volumeLevel){var actionScriptCall='setGlobalVolume('+volumeLevel+')';this.makeActionScriptCall(actionScriptCall);}
var soundPlayer=new SoundPlayer();function Animator(maxTargets)
{this.target=null;this.finished=true;this.targets=new Array();for(var i=0;i<maxTargets;i++)
this.targets.push([0,0]);this.index=-1;this.looping=false;this.loopVal=null;}
Animator.prototype.reset=function(val,steps)
{this.val=val;this.finished=false;this.steps=steps;this.index=steps-1;this.target=null;return this;}
Animator.prototype.setTarget=function(step,target,duration)
{this.targets[this.index-step][0]=target;this.targets[this.index-step][1]=duration;}
Animator.prototype.update=function(elapsedTime)
{if(this.target==null&&this.index!=-1)
{var targetObj=this.targets[this.index];this.index--;this.target=targetObj[0];this.duration=targetObj[1];this.time=0;this.start=this.val;this.delta=this.target-this.start;}
if(this.target!=null)
{this.time+=elapsedTime;this.val=this.start+this.delta*this.time/this.duration;if(this.time>this.duration)
{this.val=this.target;this.target=null;}}
else
{if(!this.looping)
{this.finished=true;}
else
{this.index=this.steps-1;if(this.loopVal!=null)
this.val=this.loopVal;}}}
function Banner()
{}
Banner.prototype=new Model();Banner.prototype.init=function(shapeID,x,y,z)
{this.temp=Model.prototype.init;this.temp(shapeID,x,y,z);this.ticking=true;this.tagNum=0;this.cookieName=g_currentFilename+'Banner'+this.modelID;var factor=1.0/g_shape[shapeID].scale;var frontTag=new Image(g_textures['tag'+this.tagNum],false);frontTag.transform.parent=this.transform;frontTag.transform.localMatrix=g_math.matrix4.identity();frontTag.transform.scale([3.6,3.6,1.0]);frontTag.transform.translate([0*factor,0.05*factor,0.1*factor]);frontTag.transform.visible=false;this.frontTag=frontTag;var hint=new Image(g_textures['tagHint'],false);hint.transform.parent=this.transform;hint.transform.localMatrix=g_math.matrix4.identity();hint.transform.scale([2.2,2.2,2.2]);hint.transform.translate([0*factor,0.6*factor,0.2*factor]);hint.transform.visible=false;this.hint=hint;var tagNum=getCookie(this.cookieName);if(tagNum!=null)
this.setTagNum(tagNum);}
Banner.prototype.onTick=function(elapsedTime)
{this.temp=Model.prototype.onTick;this.temp(elapsedTime);if(this.left<g_player.right&&this.right>g_player.left&&this.bottom<g_player.top&&this.top>g_player.bottom)
{this.hint.transform.visible=true;g_player.banner=this;}
else
{this.hint.transform.visible=false;if(g_player.banner==this)
g_player.banner=null;}}
Banner.prototype.setTagTexture=function(texture)
{this.frontTag.transform.visible=true;this.frontTag.setTexture(texture);}
Banner.prototype.setTagNum=function(tagNum)
{this.tagNum=tagNum;this.setTagTexture(g_textures['tag'+this.tagNum]);setCookie(this.cookieName,tagNum);}
Banner.prototype.cycleTagTexture=function()
{this.setTagNum((this.tagNum+1)%g_numTagTextures);}
var date=new Date();function setCookie(name,value,days)
{if(days)
{date.setTime(date.getTime()+(days*24*60*60*1000));var expires="; expires="+date.toGMTString();}
else
{var expires="";}
document.cookie=name+"="+value+expires+"; path=/";}
function getCookie(name)
{var nameEQ=name+"=";var ca=document.cookie.split(';');for(var i=0;i<ca.length;i++)
{var c=ca[i];while(c.charAt(0)==' ')
c=c.substring(1,c.length);if(c.indexOf(nameEQ)==0)
return c.substring(nameEQ.length,c.length);}
return null;}
function eraseCookie(name)
{setCookie(name,"",-1);}
function Exit()
{}
Exit.prototype=new Model();Exit.prototype.init=function(shapeID,x,y,z)
{this.temp=Model.prototype.init;this.temp(shapeID,x,y,z);this.ticking=true;this.rippleTransform=g_pack.createObject('Transform');this.rippleTransform.addShape(g_ripplePlane);this.rippleTransform.parent=g_3dRoot;var matrix=g_math.matrix4.identity();matrix=applyRotationZYX(matrix,Math.PI*0.5,0,0);matrix=applyTranslation(matrix,[this.x-0.16,this.y+0.85,this.z-0.3]);this.rippleTransform.localMatrix=matrix;var posParam=this.rippleTransform.createParam('objectWorldPos','ParamFloat3');posParam.value=[x,y,z];this.setClosed();}
Exit.prototype.onRemove=function()
{this.rippleTransform.removeShape(g_ripplePlane);this.rippleTransform.parent=null;g_pack.removeObject(this.rippleTransform);this.rippleTransform=null;this.temp=Model.prototype.onRemove;this.temp();}
Exit.prototype.setOpen=function()
{this.open=true;this.rippleTransform.visible=true;}
Exit.prototype.setClosed=function()
{this.open=false;this.rippleTransform.visible=false;}
var g_pendingExit=false;var g_exitZoomInc;Exit.prototype.onTick=function(elapsedTime)
{this.temp=Model.prototype.onTick;this.temp(elapsedTime);var open=g_plants.length>=g_goalFlowers;if(open&&!this.open)
this.setOpen();else if(!open&&this.open)
this.setClosed();if(g_player.groundBelow&&this.open&&this.left<g_player.right&&this.right>g_player.left&&this.bottom<g_player.top&&this.top>g_player.bottom)
{soundPlayer.play('sound/portal.mp3',100,0,true);g_pendingExit=true;}
var dist=Math.abs(g_player.x-this.x);if(dist<=g_exitZoomThreshold)
g_exitZoomInc=g_math.lerpScalar(g_exitZoomIncMax,g_exitZoomIncMin,dist/g_exitZoomThreshold);else
g_exitZoomInc=0;}
function doExit()
{removeActor(g_player);for(var i=0;i<g_plants.length;i++)
addActor(g_plants[i].seed);for(var i=0;i<g_player.seeds.length;i++)
addActor(g_player.seeds[i]);g_plants=new Array();hideGame();clearLevel();g_onLevelLoaded=onNextLevelLoaded;loadLevel('levels/'+g_nextLevel+'.xml');g_client.setTickCallback(onTick);g_loaded=false;}
function onNextLevelLoaded()
{addActor(g_player);addGlobalActor(g_player);g_player.reset();g_initCamera=true;updateUI();setLight();setFog();g_client.clearTickCallback();g_loaded=true;showGame();}
function Image(texture,forHUD)
{this.transform=g_pack.createObject('Transform');this.transform.parent=forHUD?g_hudRoot:g_3dRoot;this.scaleTransform=g_pack.createObject('Transform');this.scaleTransform.parent=this.transform;this.sampler=g_pack.createObject('Sampler');this.sampler.addressModeU=g_o3d.Sampler.CLAMP;this.sampler.addressModeV=g_o3d.Sampler.CLAMP;this.paramSampler=this.scaleTransform.createParam('texSampler0','ParamSampler');this.paramSampler.value=this.sampler;this.paramColorMult=this.scaleTransform.createParam('colorMult','ParamFloat4');this.setColor(1,1,1,1);this.sampler.texture=texture;this.shape=forHUD?g_hudPlaneShape:g_3dPlaneShape;this.scaleTransform.addShape(this.shape);this.scaleTransform.scale(texture.width,forHUD?-texture.height:texture.height,1);this.width=texture.width;this.height=texture.height;this.forHUD=forHUD;}
Image.prototype.setTexture=function(texture)
{this.sampler.texture=texture;this.scaleTransform.localMatrix=g_math.matrix4.scaling([texture.width,this.forHUD?-texture.height:texture.height,1,1]);}
Image.prototype.setColor=function(r,g,b,a)
{this.paramColorMult.set(r,g,b,a);};Image.prototype.onRemove=function()
{this.scaleTransform.removeShape(this.shape);this.scaleTransform.parent=null;this.transform.parent=null;g_pack.removeObject(this.scaleTransform);g_pack.removeObject(this.transform);this.scaleTransform=null;this.transform=null;}
var g_3dPlaneShape;var g_hudPlaneShape;function setupImageDisplay()
{var effect=g_pack.createObject('Effect');o3djs.effect.loadEffect(effect,'shaders/texture-colormult.shader');var material=g_pack.createObject('Material');material.effect=effect;material.drawList=g_viewInfo.zOrderedDrawList;effect.createUniformParameters(material);material.getParam('colorMult').value=[1,1,1,1];g_3dPlaneShape=o3djs.primitives.createPlane(g_pack,material,1,1,1,1,[[1,0,0,0],[0,0,1,0],[0,-1,0,0],[0,0,0,1]]);var material=g_pack.createObject('Material');material.effect=effect;material.drawList=g_hudViewInfo.zOrderedDrawList;effect.createUniformParameters(material);material.getParam('colorMult').value=[1,1,1,1];g_hudPlaneShape=o3djs.primitives.createPlane(g_pack,material,1,1,1,1,[[1,0,0,0],[0,0,1,0],[0,-1,0,0],[0,0,0,1]]);}
var BACKSPACE=8
var TAB=9
var ENTER=13
var SHIFT=16
var CTRL=17
var ALT=18
var ESCAPE=27
var PAGEUP=33
var PAGEDOWN=34
var END=35
var HOME=36
var LEFT=37
var UP=38
var RIGHT=39
var DOWN=40
var DELETE=46
var SPACE=32
var KEY_A=65;var KEY_D=68;var KEY_F=70;var KEY_G=71;var KEY_H=72;var KEY_L=76;var KEY_S=83;var KEY_T=84;var KEY_W=87;var KEY_Z=90;var NUMPAD0=96;var NUMPAD1=97;var NUMPAD2=98;var NUMPAD3=99;var NUMPAD4=100;var NUMPAD5=101;var NUMPAD6=102;var NUMPAD7=103;var NUMPAD8=104;var NUMPAD9=105;var MULTIPLY=106;var ADD=107;var SUBTRACT=109;var DIVIDE=111;var NUMLOCK=144;var SCROLLLOCK=145;var keyIsDown={};var prevKeyIsDown={};function keyHit(key)
{return keyIsDown[key]&&!prevKeyIsDown[key];}
function storePrevKeys()
{for(var i=0;i<256;i++)
prevKeyIsDown[i]=keyIsDown[i];}
document.onkeydown=onKeyDown;document.onkeyup=onKeyUp;function onKeyDown(e)
{var keycode;if(window.event)
keycode=window.event.keyCode;else if(e)
keycode=e.which;keyIsDown[keycode]=true;}
function onKeyUp(e)
{var keycode;if(window.event)
keycode=window.event.keyCode;else if(e)
keycode=e.which;keyIsDown[keycode]=false;}
function onKeyDownPlugin(e)
{keyIsDown[e.keyCode]=true;}
function onKeyUpPlugin(e)
{keyIsDown[e.keyCode]=false;}
function saveLevel(form)
{var data="";data+="<root>";data+="<nextLevel>"+g_nextLevel+"</nextLevel>";data+="<skyShape>"+g_skyShapeName+"</skyShape>";data+="<skyScaleX>"+g_skyScaleX+"</skyScaleX>";data+="<skyScaleY>"+g_skyScaleY+"</skyScaleY>";data+="<skyScaleZ>"+g_skyScaleZ+"</skyScaleZ>";data+="<skyX>"+g_skyX+"</skyX>";data+="<skyY>"+g_skyY+"</skyY>";data+="<skyZ>"+g_skyZ+"</skyZ>";data+="<goalFlowers>"+g_goalFlowers+"</goalFlowers>";data+="<fogStart>"+$('fogStart').value+"</fogStart>";data+="<fogEnd>"+$('fogEnd').value+"</fogEnd>";data+="<fogMin>"+$('fogMin').value+"</fogMin>";data+="<fogMax>"+$('fogMax').value+"</fogMax>";data+="<fogRed>"+$('fogRed').value+"</fogRed>";data+="<fogGreen>"+$('fogGreen').value+"</fogGreen>";data+="<fogBlue>"+$('fogBlue').value+"</fogBlue>";data+="<lightX>"+$('lightX').value+"</lightX>";data+="<lightY>"+$('lightY').value+"</lightY>";data+="<lightZ>"+$('lightZ').value+"</lightZ>";data+="<lightCameraX>"+$('lightCameraX').value+"</lightCameraX>";data+="<lightCameraY>"+$('lightCameraY').value+"</lightCameraY>";data+="<lightCameraZ>"+$('lightCameraZ').value+"</lightCameraZ>";data+="<lightR>"+$('lightR').value+"</lightR>";data+="<lightG>"+$('lightG').value+"</lightG>";data+="<lightB>"+$('lightB').value+"</lightB>";data+="<lightA>"+$('lightA').value+"</lightA>";for(var i=0;i<g_actors.length;i++)
{data+="<thing>";var thing=g_actors[i];data+="<shape>"+thing.shapeID+"</shape>";data+="<x>"+thing.x+"</x>";data+="<y>"+thing.y+"</y>";data+="<z>"+thing.z+"</z>";data+="<scalex>"+thing.scaleX+"</scalex>";data+="<scaley>"+thing.scaleY+"</scaley>";data+="<scalez>"+thing.scaleZ+"</scalez>";data+="</thing>";}
data+="</root>";saveFile(form,data);}
function saveFile(form,data)
{f=form.elements;var w=window.frames.w;if(!w)
{w=document.createElement('iframe');w.id='w';w.style.display='none';document.body.insertBefore(w);w=window.frames.w;if(!w)
{w=window.open('','_temp','width=100,height=100');if(!w)
{window.alert('Sorry, could not create file.');return false;}}}
var d=w.document;name='level.xml';d.open('text/xml','replace');d.charset='utf-8';d.write(data);d.close();if(d.execCommand('SaveAs',null,name))
{window.alert(name+' saved.');}
else
{window.alert('The file NOT saved.');}
w.close();return false;}
function getNodeTextContent(node)
{if(o3djs.base.IsMSIE())
return node.text;else
return node.textContent;}
var g_start=[0,0,0];var g_nextLevel;var g_runkingID=0;var g_seedID=0;var g_skyShapeName;var g_skyScaleX;var g_skyScaleY;var g_skyScaleZ;var g_skyX;var g_skyY;var g_skyZ;var g_currentFilename;var g_thingsNode=null;var g_thingsCreated=0;function loadLevel(filename)
{g_currentFilename=filename;var xmlDoc=o3djs.io.loadXmlDoc(filename);g_nextLevel=getNodeTextContent(xmlDoc.getElementsByTagName("nextLevel")[0]);g_skyShapeName=getNodeTextContent(xmlDoc.getElementsByTagName("skyShape")[0]);g_skyScaleX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("skyScaleX")[0]));g_skyScaleY=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("skyScaleY")[0]));g_skyScaleZ=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("skyScaleZ")[0]));g_skyX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("skyX")[0]));g_skyY=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("skyY")[0]));g_skyZ=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("skyZ")[0]));g_goalFlowers=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("goalFlowers")[0]));$('fogStart').value=getNodeTextContent(xmlDoc.getElementsByTagName("fogStart")[0]);$('fogEnd').value=getNodeTextContent(xmlDoc.getElementsByTagName("fogEnd")[0]);$('fogMin').value=getNodeTextContent(xmlDoc.getElementsByTagName("fogMin")[0]);$('fogMax').value=getNodeTextContent(xmlDoc.getElementsByTagName("fogMax")[0]);$('fogRed').value=getNodeTextContent(xmlDoc.getElementsByTagName("fogRed")[0]);$('fogGreen').value=getNodeTextContent(xmlDoc.getElementsByTagName("fogGreen")[0]);$('fogBlue').value=getNodeTextContent(xmlDoc.getElementsByTagName("fogBlue")[0]);$('lightX').value=getNodeTextContent(xmlDoc.getElementsByTagName("lightX")[0]);$('lightY').value=getNodeTextContent(xmlDoc.getElementsByTagName("lightY")[0]);$('lightZ').value=getNodeTextContent(xmlDoc.getElementsByTagName("lightZ")[0]);$('lightCameraX').value=getNodeTextContent(xmlDoc.getElementsByTagName("lightCameraX")[0]);$('lightCameraY').value=getNodeTextContent(xmlDoc.getElementsByTagName("lightCameraY")[0]);$('lightCameraZ').value=getNodeTextContent(xmlDoc.getElementsByTagName("lightCameraZ")[0]);$('lightR').value=getNodeTextContent(xmlDoc.getElementsByTagName("lightR")[0]);$('lightG').value=getNodeTextContent(xmlDoc.getElementsByTagName("lightG")[0]);$('lightB').value=getNodeTextContent(xmlDoc.getElementsByTagName("lightB")[0]);$('lightA').value=getNodeTextContent(xmlDoc.getElementsByTagName("lightA")[0]);g_thingsNode=xmlDoc.getElementsByTagName("thing");g_thingsCreated=0;}
function createNextThing()
{var i=g_thingsCreated;g_thingsCreated++;var thing=g_thingsNode[i];var shape=getNodeTextContent(thing.getElementsByTagName("shape")[0]);shape=g_libraryCasing[shape.toLowerCase()];var x=parseFloat(getNodeTextContent(thing.getElementsByTagName("x")[0]));var y=parseFloat(getNodeTextContent(thing.getElementsByTagName("y")[0]));var z=parseFloat(getNodeTextContent(thing.getElementsByTagName("z")[0]));if(!g_editMode)
{if(shape==g_startName)
{g_start[0]=x;g_start[1]=y;g_start[2]=z;return;}
if(shape==g_runkingName)
{var r=new Runking();r.init(shape+g_runkingID,x,y,z+g_playerOffsetZ,'settings/grunkin.xml');g_runkingID++;addActor(r);return;}
if(shape==g_bannerName)
{var b=new Banner();b.modelID=i;b.init(shape,x,y,z);addActor(b);return;}
if(shape==g_mushroomName)
{var m=new Mushroom();m.init(shape,x,y,z);addActor(m);return;}
if(shape==g_exitName)
{var e=new Exit();e.init(shape,x,y,z);addActor(e);return;}
if(shape==g_seedName)
{var s=new Seed();s.init(shape,x,y,z);addActor(s);var plant=new Plant();plant.init((g_seedID%2==0)?"flowerA":"flowerB",0,0,0);plant.transform.visible=false;s.plant=plant;plant.seed=s;g_seedID++;return;}}
var m=new Model();m.init(shape,x,y,z);addActor(m);}
var g_onLevelLoaded=null;function onThingsCreated()
{setupSky();if(!g_editMode)
assignSectors();g_thingsNode=null;g_loadStage='';g_onLevelLoaded();}
var g_sectorSize=3;var g_numSectors;var g_sectors;var g_worldLeft;var g_worldRight;var g_sectorChoiceBuffer=2;var g_globalActors;function assignSectors()
{g_sectors=new Array();g_globalActors=new Array();var left=null;var right=null;for(var i=0;i<g_actors.length;i++)
{var actor=g_actors[i];if(!actor.solid||Math.abs(actor.z)>=1)
continue;if(!left||actor.left<left)
left=actor.left;if(!right||actor.right>right)
right=actor.right;}
g_worldLeft=left-g_sectorSize;g_worldRight=right+g_sectorSize;g_numSectors=Math.ceil((g_worldRight-g_worldLeft)/g_sectorSize);for(var i=0;i<g_numSectors;i++)
g_sectors.push(new Array());var leftSector;var rightSector;for(var i=0;i<g_actors.length;i++)
{var actor=g_actors[i];if(!actor.solid||Math.abs(actor.z)>=1)
continue;if(!actor.isRunking)
{leftSector=getSector(actor.left);rightSector=getSector(actor.right);for(var j=leftSector;j<=rightSector;j++)
g_sectors[j].push(actor);}
else
{addGlobalActor(actor);}}}
function getSector(x)
{return Math.floor((x-g_worldLeft)/g_sectorSize);}
function clearLevel()
{for(var i=0;i<g_actors.length;i++)
{var actor=g_actors[i];deleteModel(actor);}
g_actors=new Array();g_runkingID=0;}
var g_textureNames=new Array();var g_texturePaths=new Array();function storeTextureSetting(name,path)
{g_textureNames.push(name);g_texturePaths.push(path);}
var g_numTagTextures=5;function loadTextureSettings(filename)
{var xmlDoc=o3djs.io.loadXmlDoc(filename);var items=xmlDoc.getElementsByTagName("item");var count=items.length;for(var i=0;i<count;i++)
{var item=items[i];var name=getNodeTextContent(item.getElementsByTagName("name")[0]);storeTextureSetting(name,'assets/textures/'+name);}
for(var i=0;i<=9;i++)
{storeTextureSetting(i,'assets/ui/'+i+'.png');storeTextureSetting('green_'+i,'assets/ui/greenCharacters/'+i+'.png');}
for(var i=0;i<g_numTagTextures;i++)
storeTextureSetting('tag'+i,'assets/tags/'+i+'.png');storeTextureSetting('loadingSplash','assets/ui/loadingSplash.jpg');storeTextureSetting('fullScreenBtn','assets/ui/fullScreenBtn.png');storeTextureSetting('flowerCounterIcon','assets/ui/flowerCounterIcon.png');storeTextureSetting('seedCounterIcon','assets/ui/seedCounterIcon.png');storeTextureSetting('slash','assets/ui/slash.png');storeTextureSetting('green_slash','assets/ui/greenCharacters/slash.png');storeTextureSetting('ExitOpen','assets/ui/greenCharacters/ExitOpen.png');storeTextureSetting('seedHint','assets/ui/seedHint.png');storeTextureSetting('flowerHint','assets/ui/flowerHint.png');storeTextureSetting('tagHint','assets/ui/tagHint.png');if(g_editMode)
{for(var i=0;i<g_libraryShapes.length;i++)
{var shapeName=g_libraryShapes[i];var textureName=g_shape[shapeName].image;storeTextureSetting(textureName,'assets/levelEditorIcons/'+textureName+'.png');}}}
var g_libraryShapes=new Array();var g_libraryCasing={};function loadLibrarySettings(filename)
{var xmlDoc=o3djs.io.loadXmlDoc(filename);var items=xmlDoc.getElementsByTagName("item");var count=items.length;for(var i=0;i<count;i++)
{var item=items[i];var name=getNodeTextContent(item.getElementsByTagName("shape")[0]);g_libraryShapes.push(name);g_libraryCasing[name.toLowerCase()]=name;g_shape[name]={};g_shape[name].plantable=parseInt(getNodeTextContent(item.getElementsByTagName("plantable")[0]));g_shape[name].solid=parseInt(getNodeTextContent(item.getElementsByTagName("solid")[0]));g_shape[name].image=getNodeTextContent(item.getElementsByTagName("image")[0]);g_shape[name].scale=parseFloat(getNodeTextContent(item.getElementsByTagName("scale")[0]));g_shape[name].buildingBlock=parseInt(getNodeTextContent(item.getElementsByTagName("buildingBlock")[0]));if(item.getElementsByTagName("emissiveMap").length)
g_shape[name].emissiveMap=getNodeTextContent(item.getElementsByTagName("emissiveMap")[0]);if(item.getElementsByTagName("ambientMap").length)
g_shape[name].ambientMap=getNodeTextContent(item.getElementsByTagName("ambientMap")[0]);if(item.getElementsByTagName("diffuseMap").length)
g_shape[name].diffuseMap=getNodeTextContent(item.getElementsByTagName("diffuseMap")[0]);if(item.getElementsByTagName("specularMap").length)
g_shape[name].specularMap=getNodeTextContent(item.getElementsByTagName("specularMap")[0]);if(item.getElementsByTagName("bumpMap").length)
g_shape[name].bumpMap=getNodeTextContent(item.getElementsByTagName("bumpMap")[0]);if(item.getElementsByTagName("skipPartialAlpha").length)
g_shape[name].skipPartialAlpha=parseInt(getNodeTextContent(item.getElementsByTagName("skipPartialAlpha")[0]));if(item.getElementsByTagName("shader").length)
g_shape[name].shader=getNodeTextContent(item.getElementsByTagName("shader")[0]);if(item.getElementsByTagName("transparent").length)
g_shape[name].transparent=parseInt(getNodeTextContent(item.getElementsByTagName("transparent")[0]));if(item.getElementsByTagName("numFrames").length)
g_shape[name].numFrames=parseFloat(getNodeTextContent(item.getElementsByTagName("numFrames")[0]));if(item.getElementsByTagName("frameDuration").length)
g_shape[name].frameDuration=parseFloat(getNodeTextContent(item.getElementsByTagName("frameDuration")[0]));}}
function applySamplerTexture(material,type,shapeName)
{var textureName=g_shape[shapeName][type+'Map'];if(textureName)
{var texture=g_textures[textureName];if(texture)
{var param=material.getParam(type+'Sampler');if(param)
{var sampler=param.value;}
else
{var param=material.createParam(type+'Sampler','ParamSampler');var sampler=g_pack.createObject('Sampler');param.value=sampler;}
sampler.texture=texture;}
else
{errormsg('sampler texture missing: '+shapeName+' : '+textureName);}}}
var g_exception;var g_playerOffsetY=-0.4;var g_heroName='Hero';var g_runkingName='Grunkin';var g_startName='start';var g_bannerName='banner';var g_mushroomName='mushroom';var g_exitName='Exit';var g_seedName='Seed';function loadShape(loader,url,name,scaleX,scaleY,scaleZ)
{function callback(pack,parent,exception)
{g_exception=exception;if(exception)
{errormsg('loadShape failed; shape:'+url+'<br>'+exception);errormsg('retrying');loadShape(loader,url,name,scaleX,scaleY,scaleZ);return;}
var shape=g_pack.getObjectsByClassName('o3d.Shape')[g_pack.getObjectsByClassName('o3d.Shape').length-1];g_shape[name].shape=shape;enableCulling(shape,true);if(g_shape[name].skipPartialAlpha)
skipPartialAlpha(shape);var material=shape.elements[0].material;if(g_shape[name].shader)
setupEffectEx(material,g_shape[name].shader);applySamplerTexture(material,'emissive',name);applySamplerTexture(material,'ambient',name);applySamplerTexture(material,'diffuse',name);applySamplerTexture(material,'specular',name);applySamplerTexture(material,'bump',name);if(g_shape[name].transparent!=undefined)
material.drawList=g_shape[name].transparent?g_viewInfo.zOrderedDrawList:g_viewInfo.performanceDrawList;if(g_shape[name].frameDuration!=undefined)
material.getParam('frameDuration').value=g_shape[name].frameDuration;if(g_shape[name].numFrames!=undefined)
material.getParam('numFrames').value=g_shape[name].numFrames;var matrix=g_math.matrix4.scaling([scaleX,scaleY,scaleZ]);if(name==g_heroName)
matrix=applyTranslation(matrix,[0,g_playerOffsetY,0]);if(name==g_heroName||name.substr(0,7)==g_runkingName)
matrix=applyAxisRotation(matrix,[0,1,0],g_math.degToRad(90));g_shape[name].transform=matrix;parent.parent=null;var tempParent=g_pack.createObject('Transform');var temp=g_pack.createObject('Transform');temp.parent=tempParent;temp.addShape(shape);temp.localMatrix=g_shape[name].transform;var bbox=o3djs.util.getBoundingBoxOfTree(tempParent);var bounds=new Object();bounds.left=bbox.minExtent[0];bounds.right=bbox.maxExtent[0];bounds.bottom=bbox.minExtent[1];bounds.top=bbox.maxExtent[1];g_shape[name].bounds=bounds;}
if(!g_shape[name])
{g_shape[name]={};g_shape[name].plantable=false;g_shape[name].solid=false;}
var transform=g_pack.createObject('Transform');transform.createParam('pickable','ParamBoolean').value=false;transform.parent=g_3dRoot;var createAnimTimeParam=!g_editMode&&(name==g_heroName||name.substr(0,7)==g_runkingName);if(createAnimTimeParam)
{g_shape[name].clock=g_paramObject.createParam(name+'_clock','ParamFloat');loader.loadScene(g_client,g_pack,transform,url,callback,{opt_animSource:g_shape[name].clock});}
else
loader.loadScene(g_client,g_pack,transform,url,callback);}
function loadTexture(loader,url,name)
{function callback(texture,exception)
{if(exception)
{errormsg('loadTexture failed; texture:'+url+'<br>'+exception);errormsg('retrying');loadTexture(loader,url,name);return;}
else
{g_textures[name]=texture;}}
loader.loadTexture(g_pack,url,callback);}
function bindMaterialParams()
{var materials=g_pack.getObjectsByClassName('o3d.Material');for(var m=0;m<materials.length;++m)
{var material=materials[m];bindParam(material,'lightWorldPos',g_lightPosParam);bindParam(material,'lightColor',g_lightColorParam);setParam(material,'lightColor1',[1,1,1,1]);setParam(material,'lightColor2',[0.65,0.7,1,1]);bindParam(material,'fogStart',g_fogStartParam);bindParam(material,'fogRange',g_fogRangeParam);bindParam(material,'fogMin',g_fogMinParam);bindParam(material,'fogMax',g_fogMaxParam);bindParam(material,'fogColor',g_fogColorParam);bindParam(material,'time',g_clockParam);bindParam(material,'cameraWorldPos',g_cameraPosParam);bindParam(material,'playerPos',g_playerPosParam);}}
var g_lightX;var g_lightY;var g_lightZ;var g_lightCameraX;var g_lightCameraY;var g_lightCameraZ;function setLight()
{g_lightX=parseFloat($('lightX').value);g_lightY=parseFloat($('lightY').value);g_lightZ=parseFloat($('lightZ').value);g_lightCameraX=parseInt($('lightCameraX').value);g_lightCameraY=parseInt($('lightCameraY').value);g_lightCameraZ=parseInt($('lightCameraZ').value);g_lightColorParam.value=[parseFloat($('lightR').value),parseFloat($('lightG').value),parseFloat($('lightB').value),parseFloat($('lightA').value)];}
function setFog()
{var start=parseFloat($('fogStart').value);g_fogStartParam.value=start;var end=parseFloat($('fogEnd').value);g_fogRangeParam.value=end-start;var min=parseFloat($('fogMin').value);g_fogMinParam.value=min;var max=parseFloat($('fogMax').value);g_fogMaxParam.value=max;var r=parseFloat($('fogRed').value);var g=parseFloat($('fogGreen').value);var b=parseFloat($('fogBlue').value);g_fogColorParam.value=[r,g,b];}
function clearFog()
{g_fogMinParam.value=0;g_fogMaxParam.value=0;}
function setupEffect()
{var shaderName=document.getElementById('shader').value;var materialID=document.getElementById('material').value;var shape=g_pack.getObjectsByClassName('o3d.Shape')[g_pack.getObjectsByClassName('o3d.Shape').length-1];var material=shape.elements[materialID].material;setupEffectEx(material,shaderName);}
function setupEffectEx(material,shaderName)
{var effect=g_pack.createObject('Effect');o3djs.effect.loadEffect(effect,'shaders/'+shaderName);var error=g_client.lastError;material.effect=effect;effect.createUniformParameters(material);var colorParamValue=[0.8,0.8,0.8,1];bindParam(material,'lightPos',g_lightPosParam);bindParam(material,'lightWorldPos',g_lightPosParam);bindParam(material,'lightColor',g_lightColorParam);setParam(material,'cameraEye',[197.58,-63.5702,0]);setParam(material,'color',colorParamValue);setParam(material,'colorMult',[.75,.75,75.,1]);setParam(material,'useTexture',1);setParam(material,'emissive',[0.04,0.04,0.04,1]);setParam(material,'ambient',[0.04,0.04,0.04,1]);setParam(material,'diffuse',colorParamValue);setParam(material,'specular',[0.5,0.5,0.5,1]);setParam(material,'shininess',50);}
function setCullMode(shape,mode)
{var elements=shape.elements;for(var i=0;i<elements.length;i++)
{var material=elements[i].material;if(!material.state)
{var state=g_pack.createObject('State');material.state=state;}
material.state.getStateParam('CullMode').value=mode;}}
function enableCulling(shape,state)
{var elements=shape.elements;for(var i=0;i<elements.length;i++)
elements[i].cull=state;}
function skipPartialAlpha(shape)
{var elements=shape.elements;for(var i=0;i<elements.length;i++)
{var material=elements[i].material;var state=g_pack.createObject('State');state.getStateParam('AlphaReference').value=1.0;state.getStateParam('AlphaBlendEnable').value=true;state.getStateParam('AlphaComparisonFunction').value=o3djs.base.o3d.State.CMP_GEQUAL;material.state=state;}}
function setDrawList(shape,drawList)
{var elements=shape.elements;for(var i=0;i<elements.length;i++)
{var material=elements[i].material;material.drawList=drawList;}}
function Model()
{}
Model.prototype.init=function(shapeID,x,y,z)
{this.active=true;this.solid=g_shape[shapeID].solid;var transform=g_pack.createObject('Transform');transform.createParam('pickable','ParamBoolean').value=true;transform.parent=g_3dRoot;transform.addShape(g_shape[shapeID].shape);this.shapeID=shapeID;this.transform=transform;this.x=x;this.y=y;this.z=z;this.scaleX=1;this.scaleY=1;this.scaleZ=1;this.rotateX=0;this.rotateY=0;this.rotateZ=0;this.hiliteShape=null;this.ticking=false;this.remove=false;this.updateBounds();this.syncTransform();}
Model.prototype.onRemove=function()
{this.transform.removeShape(g_shape[this.shapeID].shape);this.transform.parent=null;g_pack.removeObject(this.transform);this.transform=null;}
function applyAxisRotation(matrix,axis,angle)
{return g_math.mulMatrixMatrix4(matrix,g_math.matrix4.axisRotation(axis,angle));}
function applyRotationZYX(matrix,xrot,yrot,zrot)
{return g_math.mulMatrixMatrix4(matrix,g_math.matrix4.rotationZYX([xrot,yrot,zrot]));}
function applyTranslation(matrix,offset)
{return g_math.mulMatrixMatrix4(matrix,g_math.matrix4.translation(offset));}
function applyScaling(matrix,scale)
{return g_math.mulMatrixMatrix4(matrix,g_math.matrix4.scaling(scale));}
var yAxis=[0,1,0];Model.prototype.syncTransform=function()
{var baseScale=g_shape[this.shapeID].scale;this.transform.identity();this.transform.translate(this.x,this.y,this.z);this.transform.scale(baseScale*this.scaleX,baseScale*this.scaleY,baseScale*this.scaleZ);this.transform.rotateZYX([this.rotateX,this.rotateY,this.rotateZ]);if(this.isRunking||this.isPlayer)
this.transform.axisRotate(yAxis,g_math.degToRad(90));if(this.isPlayer)
this.transform.translate(0,g_playerOffsetY/(baseScale*this.scaleY),0);}
Model.prototype.updateBounds=function()
{var bounds=g_shape[this.shapeID].bounds;this.left=this.x+bounds.left*this.scaleX;this.right=this.x+bounds.right*this.scaleX;this.top=this.y+bounds.top*this.scaleY;this.bottom=this.y+bounds.bottom*this.scaleY;}
Model.prototype.onTickX=function(elapsedTime)
{}
Model.prototype.onTick=function(elapsedTime)
{var updateTransform=false;if(this.yAnim&&!this.yAnim.finished)
{this.yAnim.update(elapsedTime);this.y=this.yAnim.val;updateTransform=true;}
if(this.scaleYAnim&&!this.scaleYAnim.finished)
{this.scaleYAnim.update(elapsedTime);this.scaleY=this.scaleYAnim.val;updateTransform=true;}
if(this.rotateYAnim&&!this.rotateYAnim.finished)
{this.rotateYAnim.update(elapsedTime);this.rotateY=this.rotateYAnim.val;updateTransform=true;}
if(this.rotateZAnim&&!this.rotateZAnim.finished)
{this.rotateZAnim.update(elapsedTime);this.rotateZ=this.rotateZAnim.val;updateTransform=true;}
if(updateTransform)
{this.syncTransform();this.updateBounds();}}
Model.prototype.TestFreeRight=function(delta)
{var left=this.right;var right=this.right+delta;var top=this.top;var bottom=this.bottom;leftSector=getSector(left-g_sectorChoiceBuffer);rightSector=getSector(right+g_sectorChoiceBuffer);var sector;for(var i=leftSector;i<=rightSector+1;i++)
{sector=(i<=rightSector)?g_sectors[i]:g_globalActors;for(var j=0;j<sector.length;j++)
{var model2=sector[j];if(!model2.active)
continue;if(this.isSeed&&model2.isRunking)
continue;if(left<model2.right&&right>model2.left&&bottom<model2.top&&top>model2.bottom)
{if(model2.left-left<delta)
{delta=model2.left-left;this.obstacleRight=model2;}}}}
return Math.max(delta,0);}
Model.prototype.TestFreeLeft=function(delta)
{var left=this.left-delta;var right=this.left;var top=this.top;var bottom=this.bottom;leftSector=getSector(left-g_sectorChoiceBuffer);rightSector=getSector(right+g_sectorChoiceBuffer);var sector;for(var i=leftSector;i<=rightSector+1;i++)
{sector=(i<=rightSector)?g_sectors[i]:g_globalActors;for(var j=0;j<sector.length;j++)
{var model2=sector[j];if(!model2.active)
continue;if(this.isSeed&&model2.isRunking)
continue;if(left<model2.right&&right>model2.left&&bottom<model2.top&&top>model2.bottom)
{if(right-model2.right<delta)
{delta=right-model2.right;this.obstacleLeft=model2;}}}}
return Math.max(delta,0);}
Model.prototype.TestFreeDown=function(delta)
{var left=this.left;var right=this.right;var top=this.bottom;var bottom=this.bottom-delta;leftSector=getSector(left-g_sectorChoiceBuffer);rightSector=getSector(right+g_sectorChoiceBuffer);var sector;for(var i=leftSector;i<=rightSector+1;i++)
{sector=(i<=rightSector)?g_sectors[i]:g_globalActors;for(var j=0;j<sector.length;j++)
{var model2=sector[j];if(!model2.active)
continue;if(this.isSeed&&model2.isRunking)
continue;if(left<model2.right&&right>model2.left&&bottom<model2.top&&top>model2.bottom)
{if(top-model2.top<delta)
{delta=top-model2.top;this.obstacleDown=model2;}}}}
return Math.max(delta,0);}
Model.prototype.TestFreeUp=function(delta)
{var left=this.left;var right=this.right;var top=this.top+delta;var bottom=this.top;leftSector=getSector(left-g_sectorChoiceBuffer);rightSector=getSector(right+g_sectorChoiceBuffer);var sector;for(var i=leftSector;i<=rightSector+1;i++)
{sector=(i<=rightSector)?g_sectors[i]:g_globalActors;for(var j=0;j<sector.length;j++)
{var model2=sector[j];if(!model2.active)
continue;if(this.isSeed&&model2.isRunking)
continue;if(left<model2.right&&right>model2.left&&bottom<model2.top&&top>model2.bottom)
{if(model2.bottom-bottom<delta)
{delta=model2.bottom-bottom;this.obstacleUp=model2;}}}}
return Math.max(delta,0);}
Model.prototype.SafeMove=function(dx,dy)
{var sdx=0,sdy=0;if(dx>0)
sdx=this.TestFreeRight(dx);if(dx<0)
sdx=-this.TestFreeLeft(-dx);if(sdx!=0)
{this.x+=sdx;this.updateBounds();}
if(dy<0)
sdy=-this.TestFreeDown(-dy);if(dy>0)
sdy=this.TestFreeUp(dy);if(sdy!=0)
{this.y+=sdy;this.updateBounds();}
return(dx==sdx&&dy==sdy);}
Model.prototype.setHilite=function(status)
{if(status&&!this.hiliteShape)
{var hiliteShape=o3djs.shape.duplicateShape(g_pack,g_shape[this.shapeID].shape,'highlight_');var elements=hiliteShape.elements;for(var ee=0;ee<elements.length;ee++)
elements[ee].material=g_highlightMaterial;this.transform.addShape(hiliteShape);g_flashTimer=0.0;this.hiliteShape=hiliteShape;}
else if(!status&&this.hiliteShape)
{this.transform.removeShape(this.hiliteShape);o3djs.shape.deleteDuplicateShape(this.hiliteShape,g_pack);this.hiliteShape=null;}}
function Mushroom()
{}
Mushroom.prototype=new Model();Mushroom.prototype.init=function(shapeID,x,y,z)
{this.temp=Model.prototype.init;this.temp(shapeID,x,y,z);this.ticking=true;this.isMushroom=true;this.scaleXAnim=new Animator(3);this.scaleYAnim=new Animator(3);}
function setupSeedCollection(pos,scale)
{var transform=g_pack.createObject('Transform');transform.parent=g_3dRoot;transform.localMatrix=applyTranslation(transform.localMatrix,pos);var timeRange=4;var counter=g_pack.createObject('SecondCounter');counter.setCount(timeRange);counter.addCallback(timeRange*2,callback);var emitter=g_particleSystem.createParticleEmitter(null,counter.getParam('count'));emitter.setState(o3djs.particles.ParticleStateIds.ADD);emitter.setColorRamp([0.9,0.9,0.4,1,0.5,0.3,0.0,0]);emitter.setParameters({numParticles:9,lifeTime:0.5,timeRange:timeRange,startSize:25*scale,endSize:50*scale,velocity:[0*scale,200*scale,0*scale],velocityRange:[75*scale,15*scale,75*scale],acceleration:[0*scale,-450*scale,0*scale],spinSpeedRange:10});transform.addShape(emitter.shape);function callback()
{transform.removeShape(emitter.shape);transform.parent=null;counter.removeAllCallbacks();}}
function Plant()
{}
Plant.prototype=new Model();Plant.prototype.init=function(shapeID,x,y,z)
{this.temp=Model.prototype.init;this.temp(shapeID,x,y,z);this.ticking=true;this.scaleYAnim=new Animator(7);}
function Player()
{}
Player.prototype=new Model();Player.prototype.init=function(shapeID,x,y,z,filename)
{this.isPlayer=true;this.temp=Model.prototype.init;this.temp(shapeID,x,y,z);this.ticking=true;this.velX=0;this.velY=0;this.slam=false;this.jumps=0;this.anim='walk';this.animTime=0;this.direction='right';this.hurt=false;this.hitTime=0;this.rotateYAnim=new Animator(1);this.rotateZAnim=new Animator(1);this.seeds=new Array();var hint=new Image(g_textures['tagHint'],false);hint.transform.visible=false;this.hint=hint;this.loadSettings(filename);}
Player.prototype.loadSettings=function(filename)
{var xmlDoc=o3djs.io.loadXmlDoc(filename);this.gravity=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("gravity")[0]));this.slamGravity=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("slamGravity")[0]));this.walkVelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("walkVelX")[0]));this.runVelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("runVelX")[0]));this.pushVelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("pushVelX")[0]));this.groundAccelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("groundAccelX")[0]));this.airAccelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("airAccelX")[0]));this.groundCounterAccelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("groundCounterAccelX")[0]));this.airCounterAccelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("airCounterAccelX")[0]));this.groundDecelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("groundDecelX")[0]));this.airDecelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("airDecelX")[0]));this.bounceVelY=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("bounceVelY")[0]));this.jumpVelY=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("jumpVelY")[0]));this.maxJumps=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("maxJumps")[0]));this.stunDuration=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("stunDuration")[0]));this.hurtVelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("hurtVelX")[0]));this.hurtVelY=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("hurtVelY")[0]));this.keyReloadSettings=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("keyReloadSettings")[0]));this.keyLeft=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("keyLeft")[0]));this.keyRight=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("keyRight")[0]));this.keyJump=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("keyJump")[0]));this.keySlam=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("keySlam")[0]));this.keyPlant=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("keyPlant")[0]));this.keyReset=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("keyReset")[0]));this.keyTag=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("keyTag")[0]));this.keySkip=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("keySkip")[0]));this.keyPause=parseInt(getNodeTextContent(xmlDoc.getElementsByTagName("keyPause")[0]));var walkAnim=xmlDoc.getElementsByTagName("walkAnim")[0];this.walkAnim={};this.walkAnim.start=parseFloat(getNodeTextContent(walkAnim.getElementsByTagName("start")[0]));this.walkAnim.end=parseFloat(getNodeTextContent(walkAnim.getElementsByTagName("end")[0]));this.walkAnim.speed=parseFloat(getNodeTextContent(walkAnim.getElementsByTagName("speed")[0]));this.walkAnim.loop=parseInt(getNodeTextContent(walkAnim.getElementsByTagName("loop")[0]));var jumpAnim=xmlDoc.getElementsByTagName("jumpAnim")[0];this.jumpAnim={};this.jumpAnim.start=parseFloat(getNodeTextContent(jumpAnim.getElementsByTagName("start")[0]));this.jumpAnim.end=parseFloat(getNodeTextContent(jumpAnim.getElementsByTagName("end")[0]));this.jumpAnim.speed=parseFloat(getNodeTextContent(jumpAnim.getElementsByTagName("speed")[0]));this.jumpAnim.loop=parseInt(getNodeTextContent(jumpAnim.getElementsByTagName("loop")[0]));var doubleJumpAnim=xmlDoc.getElementsByTagName("doubleJumpAnim")[0];this.doubleJumpAnim={};this.doubleJumpAnim.start=parseFloat(getNodeTextContent(doubleJumpAnim.getElementsByTagName("start")[0]));this.doubleJumpAnim.end=parseFloat(getNodeTextContent(doubleJumpAnim.getElementsByTagName("end")[0]));this.doubleJumpAnim.speed=parseFloat(getNodeTextContent(doubleJumpAnim.getElementsByTagName("speed")[0]));this.doubleJumpAnim.loop=parseInt(getNodeTextContent(doubleJumpAnim.getElementsByTagName("loop")[0]));var idleAnim=xmlDoc.getElementsByTagName("idleAnim")[0];this.idleAnim={};this.idleAnim.start=parseFloat(getNodeTextContent(idleAnim.getElementsByTagName("start")[0]));this.idleAnim.end=parseFloat(getNodeTextContent(idleAnim.getElementsByTagName("end")[0]));this.idleAnim.speed=parseFloat(getNodeTextContent(idleAnim.getElementsByTagName("speed")[0]));this.idleAnim.loop=parseInt(getNodeTextContent(idleAnim.getElementsByTagName("loop")[0]));var pushAnim=xmlDoc.getElementsByTagName("pushAnim")[0];this.pushAnim={};this.pushAnim.start=parseFloat(getNodeTextContent(pushAnim.getElementsByTagName("start")[0]));this.pushAnim.end=parseFloat(getNodeTextContent(pushAnim.getElementsByTagName("end")[0]));this.pushAnim.speed=parseFloat(getNodeTextContent(pushAnim.getElementsByTagName("speed")[0]));this.pushAnim.loop=parseInt(getNodeTextContent(pushAnim.getElementsByTagName("loop")[0]));}
Player.prototype.onTick=function(elapsedTime)
{this.temp=Model.prototype.onTick;this.temp(elapsedTime);this.processControls(elapsedTime);this.integrate(elapsedTime);this.updateAnimations(elapsedTime);this.updateHint();}
Player.prototype.updateAnimations=function(elapsedTime)
{if(this.anim=='walk')
{var animStart=this.walkAnim.start;var animEnd=this.walkAnim.end;var animSpeed=this.walkAnim.speed*Math.abs(this.velX/this.runVelX);var loop=this.walkAnim.loop;}
else if(this.anim=='jump')
{var animStart=this.jumpAnim.start;var animEnd=this.jumpAnim.end;var animSpeed=this.jumpAnim.speed;var loop=this.jumpAnim.loop;}
else if(this.anim=='doubleJump')
{var animStart=this.doubleJumpAnim.start;var animEnd=this.doubleJumpAnim.end;var animSpeed=this.doubleJumpAnim.speed;var loop=this.doubleJumpAnim.loop;}
else if(this.anim=='idle')
{var animStart=this.idleAnim.start;var animEnd=this.idleAnim.end;var animSpeed=this.idleAnim.speed;var loop=this.idleAnim.loop;}
else if(this.anim=='push')
{var animStart=this.pushAnim.start;var animEnd=this.pushAnim.end;var animSpeed=this.pushAnim.speed;var loop=this.pushAnim.loop;}
this.animTime=this.animTime+elapsedTime*animSpeed;var animLength=animEnd-animStart;if(this.animTime>animLength)
{if(loop)
this.animTime-=animLength;else
this.animTime=animLength;}
g_shape[this.shapeID].clock.value=animStart+this.animTime;}
Player.prototype.processHorizontalDecel=function(elapsedTime)
{var decelX;if(this.groundBelow&&this.velY<=0)
decelX=this.groundDecelX;else
decelX=this.airDecelX;if(this.velX>0)
{this.velX-=decelX*elapsedTime;if(this.velX<0)
this.velX=0;}
else if(this.velX<0)
{this.velX+=decelX*elapsedTime;if(this.velX>0)
this.velX=0;}}
Player.prototype.processHorizontalAccel=function(elapsedTime,flip)
{if(flip&&this.direction!='left')
{this.direction='left';var animator=this.rotateYAnim.reset(this.rotateY,1);animator.setTarget(0,-Math.PI,0.2);}
else if(!flip&&this.direction!='right')
{this.direction='right';var animator=this.rotateYAnim.reset(this.rotateY,1);animator.setTarget(0,0,0.2);}
if(flip)
this.velX=-this.velX;var accelX;var counterAccelX;if(this.groundBelow)
{accelX=this.groundAccelX;counterAccelX=this.groundCounterAccelX;}
else
{accelX=this.airAccelX;counterAccelX=this.airCounterAccelX;}
if(this.velX>=0&&this.velX<this.walkVelX)
this.velX=this.walkVelX;else if(this.velX>=this.walkVelX&&this.velX<this.runVelX)
this.velX+=accelX*elapsedTime;else if(this.velX<0)
{this.velX+=counterAccelX*elapsedTime;if(this.velX>0)
this.velX=0;}
if(this.velX>this.runVelX)
this.velX=this.runVelX;if(flip)
this.velX=-this.velX;if(this.anim=='idle')
{this.anim='walk';this.animTime=0;}}
Player.prototype.reset=function()
{this.x=g_start[0];this.y=g_start[1];this.z=g_start[2]+g_playerOffsetZ;this.velX=0;this.velY=0;this.syncTransform();this.updateBounds();this.slam=false;this.jumps=0;this.anim='walk';this.animTime=0;this.direction='right';this.hurt=false;this.hitTime=0;this.rotateX=0;this.rotateY=0;this.rotateZ=0;this.transform.visible=true;this.seeds=new Array();}
Player.prototype.processControls=function(elapsedTime)
{if(keyHit(this.keyReset))
{this.reset();return;}
if(this.banner&&keyHit(this.keyTag))
{soundPlayer.play('sound/tag.mp3',100,0,true);this.banner.cycleTagTexture();return;}
if(keyHit(this.keySkip))
{g_pendingExit=true;return;}
if(keyHit(this.keyPause))
{g_paused=!g_paused;return;}
if(keyHit(this.keyReloadSettings))
{loadSettings('settings/misc.xml');return;}
this.groundBelow=!this.TestFreeDown(g_testDepth);if(this.hurt)
{this.processHorizontalDecel(elapsedTime);return;}
if(keyIsDown[this.keyRight])
this.processHorizontalAccel(elapsedTime,false);else if(keyIsDown[this.keyLeft])
this.processHorizontalAccel(elapsedTime,true);else
this.processHorizontalDecel(elapsedTime);if(keyHit(this.keyJump))
{if(this.jumps<this.maxJumps&&this.velY<this.jumpVelY&&(this.jumps>0||this.groundBelow))
{this.velY=this.jumpVelY;if(this.jumps==0)
{this.anim='jump';this.animTime=0;}
else
{this.anim='doubleJump';this.animTime=0;this.rotationZ=this.direction=='right'?Math.PI*2:-Math.PI*2;var animator=this.rotateZAnim.reset(this.rotationZ,1);animator.setTarget(0,0,0.4);}
this.jumps++;soundPlayer.play('sound/jump.mp3',100,0,true);this.groundBelow=false;}}
else if(keyIsDown[this.keySlam]&&!this.groundBelow)
{this.slam=true;this.velX=0;}
if(keyHit(this.keyPlant)&&this.seeds.length&&this.groundBelow)
{var left=this.left-0.5;var right=this.right+0.5;var top=this.bottom;var bottom=this.bottom-g_testDepth;var ground=null;for(var i=0;i<g_actors.length;i++)
{var model2=g_actors[i];if(!model2.active||!model2.solid||Math.abs(model2.z)>=1)
continue;if(model2.plant||!g_shape[model2.shapeID].plantable)
continue;if(left<model2.right&&right>model2.left&&bottom<model2.top&&top>model2.bottom)
{if(!ground||Math.abs(model2.x-this.x)<Math.abs(ground.x-this.x))
ground=model2;}}
if(ground)
this.plantPlant(ground);}
if(this.groundBelow&&this.velX==0&&this.velY==0&&this.anim!='idle')
{this.anim='idle';this.animTime=0;}}
var g_flowerHintCount=0;Player.prototype.plantPlant=function(ground)
{var seed=this.seeds.shift();var plant=seed.plant;plant.transform.visible=true;addActor(plant);addPlant(plant);var plantYOffset=0.7;var plantZOffset=0.3;plant.x=ground.x;plant.y=ground.y+plantYOffset;plant.z=ground.z+plantZOffset;plant.syncTransform();plant.updateBounds();ground.plant=plant;plant.ground=ground;plant.scaleY=0.1;plant.syncTransform();var animator=plant.scaleYAnim.reset(plant.scaleY,2);animator.setTarget(0,1.5,0.2);animator.setTarget(1,1.0,0.1);if(g_flowerHintCount==0)
{g_player.showHint('flowerHint');g_flowerHintCount++;}
soundPlayer.play('sound/flower.mp3',100,0,true);updateUI();}
Player.prototype.integrate=function(elapsedTime)
{if(!this.slam)
this.velY+=this.gravity*elapsedTime;else
this.velY+=this.slamGravity*elapsedTime;this.active=false;this.obstacleDown=null;this.obstacleUp=null;this.obstacleLeft=null;this.obstacleRight=null;if(!this.SafeMove(this.velX*elapsedTime,0))
{var killVelX=true;if(!this.hurt)
{if(this.obstacleRight&&this.obstacleRight.isRunking&&this.obstacleRight.groundBelow)
{var runking=this.obstacleRight;if(runking.state!='hurt'&&runking.state!='recover')
{if(runking.direction=='left')
this.onHit(true);killVelX=false;}
else if(this.groundBelow)
{var origBottom=runking.bottom;runking.bottom=this.bottom;runking.SafeMove(this.pushVelX*elapsedTime,0);runking.hitTime=g_clock;runking.bottom=origBottom;this.velX=this.walkVelX;killVelX=false;if(this.anim!='push')
{this.anim='push';this.animTime=0;}}}
else if(this.obstacleLeft&&this.obstacleLeft.isRunking&&this.obstacleLeft.groundBelow)
{var runking=this.obstacleLeft;if(runking.state!='hurt'&&runking.state!='recover')
{if(runking.direction=='right')
this.onHit(true);killVelX=false;}
else if(this.groundBelow)
{var origBottom=runking.bottom;runking.bottom=this.bottom;runking.SafeMove(-this.pushVelX*elapsedTime,0);runking.hitTime=g_clock;runking.bottom=origBottom;this.velX=-this.walkVelX;killVelX=false;if(this.anim!='push')
{this.anim='push';this.animTime=0;}}}}
if(killVelX)
this.velX=0;}
if(!this.SafeMove(0,this.velY*elapsedTime))
{if(this.velY<0)
{this.jumps=0;if(this.anim=='jump'||this.anim=='doubleJump')
{this.anim='walk';this.animTime=0;}
var obstacle=this.obstacleDown;if(obstacle&&obstacle.isMushroom)
{this.doMushroomBounce(obstacle);}
else if(obstacle&&obstacle.isRunking)
{this.doRunkingAttack(obstacle);}
else
{this.velY=0;}}
else
{this.velY=0;}
this.slam=false;}
this.syncTransform();this.active=true;if(this.hurt)
{var timeElapsed=g_clock-this.hitTime;this.transform.visible=fmod(timeElapsed,0.2)>0.1;if(timeElapsed>this.stunDuration)
{this.hurt=false;this.transform.visible=true;}}}
Player.prototype.doMushroomBounce=function(mushroom)
{this.jumps=1;this.velY=this.bounceVelY;var animator=mushroom.scaleYAnim.reset(mushroom.scaleY,3);animator.setTarget(0,0.5,0.1);animator.setTarget(1,1.5,0.1);animator.setTarget(2,1,0.1);var animator=mushroom.scaleXAnim.reset(mushroom.scaleX,3);animator.setTarget(0,1.5,0.1);animator.setTarget(1,0.5,0.1);animator.setTarget(2,1,0.1);}
Player.prototype.doRunkingAttack=function(runking)
{var targetY;if(runking.state!='hurt'&&runking.state!='recover')
{targetY=runking.y-0.2;runking.origY=runking.y;this.velX=0;this.jumps=1;this.velY=this.jumpVelY*0.5;runking.anim='die';runking.animTime=0;soundPlayer.play('sound/runkingHit.mp3',100,0,true);}
else
{targetY=runking.origY-0.2;}
var animator=runking.yAnim.reset(runking.y,1);animator.setTarget(0,targetY,g_runkingSquishDuration);runking.state='hurt';runking.hitTime=g_clock;if(runking.seeds.length)
launchSeeds([runking.x,runking.y,runking.z],runking.seeds,runking.seeds.length);if(runking.plant)
{var plant=runking.plant;runking.plant=null;var animator=plant.scaleYAnim.reset(plant.scaleY,2);animator.setTarget(0,1.25,0.75);animator.setTarget(1,1,0.25);}
updateUI();}
function launchSeeds(pos,seeds,count)
{var startAngle=30;var endAngle=150;var range=endAngle-startAngle;var angleInc=range/count;var vel=6.0;for(var i=0;i<count;i++)
{var s=seeds.shift();s.transform.visible=true;addActor(s);s.x=pos[0];s.y=pos[1];s.z=pos[2];s.syncTransform();s.updateBounds();s.spawnTime=g_clock;var angle=g_math.degToRad(startAngle+angleInc*i);s.velX=Math.cos(angle)*vel;s.velY=Math.sin(angle)*vel;s.gravity=-30;s.dynamic=true;}}
Player.prototype.onHit=function(fromRight)
{this.hurt=true;this.hitTime=g_clock;this.velX=fromRight?-this.hurtVelX:this.hurtVelX;this.velY=this.hurtVelY;launchSeeds([this.x,this.y,this.z],this.seeds,Math.min(this.seeds.length,3))
soundPlayer.play('sound/playerHit.mp3',100,0,true);updateUI();}
Player.prototype.showHint=function(textureName)
{var scale=0.01;this.hint.transform.localMatrix=g_math.matrix4.identity();this.hint.transform.localMatrix=applyScaling(this.hint.transform.localMatrix,[scale,scale,scale]);this.hint.transform.localMatrix=applyTranslation(this.hint.transform.localMatrix,[this.x,this.y+1.0,this.z]);this.hint.setTexture(g_textures[textureName]);this.hint.transform.visible=true;this.hintTime=g_clock;}
Player.prototype.updateHint=function()
{if(!this.hint.transform.visible)
return;var timeElapsed=g_clock-this.hintTime;if(timeElapsed>=g_hintDuration)
{this.hint.transform.visible=false;return;}
var a=1-(timeElapsed/g_hintDuration);this.hint.setColor(1,1,1,a);}
function Runking()
{}
Runking.prototype=new Model();Runking.prototype.init=function(shapeID,x,y,z,filename)
{this.isRunking=true;this.temp=Model.prototype.init;this.temp(shapeID,x,y,z);this.ticking=true;this.velX=0;this.velY=0;this.slam=false;this.anim='walk';this.animTime=0;this.state='walking';this.direction='right';this.seeds=new Array();this.rotateYAnim=new Animator(1);this.yAnim=new Animator(1);this.loadSettings(filename);}
Runking.prototype.loadSettings=function(filename)
{var xmlDoc=o3djs.io.loadXmlDoc(filename);this.gravity=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("gravity")[0]));this.walkVelX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("walkVelX")[0]));var walkAnim=xmlDoc.getElementsByTagName("walkAnim")[0];this.walkAnim={};this.walkAnim.start=parseFloat(getNodeTextContent(walkAnim.getElementsByTagName("start")[0]));this.walkAnim.end=parseFloat(getNodeTextContent(walkAnim.getElementsByTagName("end")[0]));this.walkAnim.speed=parseFloat(getNodeTextContent(walkAnim.getElementsByTagName("speed")[0]));this.walkAnim.loop=parseInt(getNodeTextContent(walkAnim.getElementsByTagName("loop")[0]));var eatAnim=xmlDoc.getElementsByTagName("eatAnim")[0];this.eatAnim={};this.eatAnim.start=parseFloat(getNodeTextContent(eatAnim.getElementsByTagName("start")[0]));this.eatAnim.end=parseFloat(getNodeTextContent(eatAnim.getElementsByTagName("end")[0]));this.eatAnim.speed=parseFloat(getNodeTextContent(eatAnim.getElementsByTagName("speed")[0]));this.eatAnim.loop=parseInt(getNodeTextContent(eatAnim.getElementsByTagName("loop")[0]));var dieAnim=xmlDoc.getElementsByTagName("dieAnim")[0];this.dieAnim={};this.dieAnim.start=parseFloat(getNodeTextContent(dieAnim.getElementsByTagName("start")[0]));this.dieAnim.end=parseFloat(getNodeTextContent(dieAnim.getElementsByTagName("end")[0]));this.dieAnim.speed=parseFloat(getNodeTextContent(dieAnim.getElementsByTagName("speed")[0]));this.dieAnim.loop=parseInt(getNodeTextContent(dieAnim.getElementsByTagName("loop")[0]));}
var g_runkingSquishDuration=0.2;Runking.prototype.onTick=function(elapsedTime)
{this.temp=Model.prototype.onTick;this.temp(elapsedTime);this.processControls(elapsedTime);this.integrate(elapsedTime);this.updateAnimations(elapsedTime);if(this.state=='hurt'||this.state=='recover')
{this.updateStun();}
else
{if(!this.plant)
this.findPlant();else
this.updateEating();}}
Runking.prototype.updateEating=function()
{var plant=this.plant;if(plant.scaleYAnim.finished)
{this.plant=null;plant.ground.plant=null;plant.transform.visible=false;removePlant(plant);removeActor(plant);updateUI();this.seeds.push(plant.seed);this.anim='walk';this.animTime=0;this.state='walking';if(this.direction=='right')
{var animator=this.rotateYAnim.reset(this.rotateY,1);animator.setTarget(0,0,0.2);}
else if(this.direction=='left')
{var animator=this.rotateYAnim.reset(this.rotateY,1);animator.setTarget(0,-Math.PI,0.2);}}}
Runking.prototype.findPlant=function()
{for(var i=0;i<g_plants.length;i++)
{var plant=g_plants[i];if(Math.abs(this.x-plant.x)<0.2&&this.bottom<plant.top&&this.top>plant.bottom)
{this.plant=plant;this.state='eating';var animator=this.rotateYAnim.reset(this.rotateY,1);animator.setTarget(0,-Math.PI*0.5,0.2);this.anim='eat';this.animTime=0;var animator=plant.scaleYAnim.reset(plant.scaleY,7);animator.setTarget(0,0.8,0.2);animator.setTarget(1,0.9,0.1);animator.setTarget(2,0.5,0.2);animator.setTarget(3,0.6,0.1);animator.setTarget(4,0.2,0.2);animator.setTarget(5,0.3,0.1);animator.setTarget(6,0.1,0.2);return;}}}
Runking.prototype.updateStun=function()
{if(!this.groundBelow)
{this.state='walking';this.anim='walk';this.animTime=0;this.yAnim.finished=true;return;}
if(this.state=='hurt'&&g_clock-this.hitTime>=g_runkingStunDuration)
{var animator=this.yAnim.reset(this.y,1);animator.setTarget(0,this.origY,g_runkingSquishDuration);this.state='recover';}
if(this.state=='recover'&&this.yAnim.finished)
{if(this.direction=='right')
{var animator=this.rotateYAnim.reset(this.rotateY,1);animator.setTarget(0,0,0.2);}
else
{var animator=this.rotateYAnim.reset(this.rotateY,1);animator.setTarget(0,-Math.PI,0.2);}
this.anim='walk';this.animTime=0;this.state='walking';}}
Runking.prototype.updateAnimations=function(elapsedTime)
{if(this.anim=='walk')
{var animStart=this.walkAnim.start;var animEnd=this.walkAnim.end;var animSpeed=this.walkAnim.speed;var loop=this.walkAnim.loop;}
else if(this.anim=='eat')
{var animStart=this.eatAnim.start;var animEnd=this.eatAnim.end;var animSpeed=this.eatAnim.speed;var loop=this.eatAnim.loop;}
else if(this.anim=='die')
{var animStart=this.dieAnim.start;var animEnd=this.dieAnim.end;var animSpeed=this.dieAnim.speed;var loop=this.dieAnim.loop;}
this.animTime=this.animTime+elapsedTime*animSpeed;var animLength=animEnd-animStart;if(this.animTime>animLength)
{if(loop)
this.animTime-=animLength;else
this.animTime=animLength;}
g_shape[this.shapeID].clock.value=animStart+this.animTime;}
var g_testDepth=0.1;Runking.prototype.processControls=function(elapsedTime)
{this.groundBelow=!this.TestFreeDown(g_testDepth);var forwardTest=this.direction=='right'?0.5:-0.5;this.left+=forwardTest;this.right+=forwardTest;this.groundAhead=!this.TestFreeDown(0.1);this.left-=forwardTest;this.right-=forwardTest;if(this.state=='walking')
{if(this.direction=='right'&&this.velX<=0)
{this.velX=this.walkVelX;var animator=this.rotateYAnim.reset(this.rotateY,1);animator.setTarget(0,0,0.2);}
else if(this.direction=='left'&&this.velX>=0)
{this.velX=-this.walkVelX;var animator=this.rotateYAnim.reset(this.rotateY,1);animator.setTarget(0,-Math.PI,0.2);}}
else
this.velX=0;}
Runking.prototype.integrate=function(elapsedTime)
{this.velY+=this.gravity*elapsedTime;this.active=false;this.obstacleDown=null;this.obstacleUp=null;this.obstacleLeft=null;this.obstacleRight=null;if(!this.SafeMove(this.velX*elapsedTime,0))
{this.velX=0;if(this.groundBelow&&this.obstacleRight&&this.obstacleRight==g_player)
g_player.onHit(false);else if(this.groundBelow&&this.obstacleLeft&&this.obstacleLeft==g_player)
g_player.onHit(true);}
if(this.obstacleRight||this.obstacleLeft||!this.groundAhead)
{if(this.direction=='right')
this.direction='left';else if(this.direction=='left')
this.direction='right';}
if(!this.SafeMove(0,this.velY*elapsedTime))
{this.velY=0;}
this.syncTransform();this.active=true;}
function Seed()
{}
Seed.prototype=new Model();Seed.prototype.init=function(shapeID,x,y,z)
{this.temp=Model.prototype.init;this.temp(shapeID,x,y,z);this.ticking=true;this.isSeed=true;this.rotateYAnim=new Animator(1);this.yAnim=new Animator(2);var animator=this.rotateYAnim.reset(this.rotateY,1);animator.setTarget(0,Math.PI*2,3);animator.looping=true;animator.loopVal=0;var bobHeight=0.05;var bobTime=2;var animator=this.yAnim.reset(this.y-bobHeight,2);animator.setTarget(0,this.y+bobHeight,bobTime);animator.setTarget(1,this.y-bobHeight,bobTime);animator.looping=true;}
var g_seedHintCount=0;Seed.prototype.onTick=function(elapsedTime)
{this.temp=Model.prototype.onTick;this.temp(elapsedTime);if(this.left<g_player.right&&this.right>g_player.left&&this.bottom<g_player.top&&this.top>g_player.bottom&&(!this.dynamic||g_clock-this.spawnTime>0.5))
{this.transform.visible=false;removeActor(this);this.rotateYAnim.finished=true;this.yAnim.finished=true;g_player.seeds.push(this);setupSeedCollection([this.x,this.y,this.z-0.5],0.01);soundPlayer.play('sound/seed.mp3',100,0,true);updateUI();if(g_seedHintCount==0)
{g_player.showHint('seedHint');g_seedHintCount++;}}
if(this.dynamic)
this.integrate(elapsedTime);}
Seed.prototype.integrate=function(elapsedTime)
{this.groundBelow=!this.TestFreeDown(g_testDepth);if(this.groundBelow)
this.velX*=0.85;this.velY+=this.gravity*elapsedTime;this.active=false;this.obstacleDown=null;this.obstacleUp=null;this.obstacleLeft=null;this.obstacleRight=null;g_player.active=false;if(!this.SafeMove(this.velX*elapsedTime,0))
this.velX=-this.velX*0.5;if(!this.SafeMove(0,this.velY*elapsedTime))
this.velY=-this.velY*0.5;g_player.active=true;this.syncTransform();this.active=true;}
var g_playerScale;var g_playerOffsetZ;var g_skyDistance;var g_goalFlowers;var g_camSoftX;var g_camSoftY;var g_camSoftZ;var g_camEyeX;var g_camEyeY;var g_camEyeZ;var g_camTargetX;var g_camTargetY;var g_camTargetZ;var g_stillZoom;var g_runZoom;var g_exitZoomThreshold;var g_exitZoomIncMin;var g_exitZoomIncMax;var g_runkingStunDuration;var g_hintDuration;function loadSettings(fileName)
{var xmlDoc=o3djs.io.loadXmlDoc(fileName);g_playerScale=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("playerScale")[0]));g_playerOffsetZ=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("playerOffsetZ")[0]));g_camSoftX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("camSoftX")[0]));g_camSoftY=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("camSoftY")[0]));g_camSoftZ=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("camSoftZ")[0]));g_camEyeX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("camEyeX")[0]));g_camEyeY=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("camEyeY")[0]));g_camEyeZ=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("camEyeZ")[0]));g_camTargetX=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("camTargetX")[0]));g_camTargetY=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("camTargetY")[0]));g_camTargetZ=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("camTargetZ")[0]));g_stillZoom=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("stillZoom")[0]));g_runZoom=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("runZoom")[0]));g_exitZoomThreshold=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("exitZoomThreshold")[0]));g_exitZoomIncMin=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("exitZoomIncMin")[0]));g_exitZoomIncMax=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("exitZoomIncMax")[0]));g_runkingStunDuration=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("runkingStunDuration")[0]));g_hintDuration=parseFloat(getNodeTextContent(xmlDoc.getElementsByTagName("hintDuration")[0]));}
var g_skyTransform;var g_skyCurrShapeName;function setupSky()
{if(g_skyTransform)
{g_skyTransform.removeShape(g_shape[g_skyCurrShapeName].shape);g_skyTransform.parent=null;g_pack.removeObject(g_skyTransform);g_skyTransform=null;}
g_skyShape=g_shape[g_skyShapeName].shape;var transform=g_pack.createObject('Transform');transform.createParam('pickable','ParamBoolean').value=false;transform.parent=g_3dRoot;transform.addShape(g_skyShape);g_skyTransform=transform;g_skyCurrShapeName=g_skyShapeName;}
function updateSky()
{if(!g_editMode)
{var x=g_player.x+g_skyX;var y=g_player.y+g_skyY;var z=g_player.z+g_skyZ;}
else
{var x=g_camera.target[0]+g_skyX;var y=g_camera.target[1]+g_skyY;var z=g_camera.target[2]+g_skyZ;}
var baseScale=g_shape[g_skyShapeName].scale;g_skyTransform.identity();g_skyTransform.translate(x,y,z);g_skyTransform.scale(g_skyScaleX*baseScale,g_skyScaleY*baseScale,g_skyScaleZ*baseScale);}
function selectConflicts()
{unselectAll();for(var i=0;i<g_actors.length;i++)
{var actor=g_actors[i];actor.marked=false;}
for(var i=0;i<g_actors.length;i++)
{var actor=g_actors[i];if(actor.marked)
continue;while(!checkGridPos(actor))
{addSelected(g_conflictedModel);g_conflictedModel.marked=true;}}
for(var i=0;i<g_actors.length;i++)
{var actor=g_actors[i];actor.marked=false;}}
var g_conflictedModel;function checkGridPos(testModel)
{if(!g_shape[testModel.shapeID].buildingBlock)
{return true;}
var free=true;for(var i=0;i<g_actors.length;i++)
{var model=g_actors[i];if(model==testModel||model.marked)
continue;if(!g_shape[model.shapeID].buildingBlock)
continue;if(model.x==testModel.x&&model.y==testModel.y&&model.z==testModel.z)
{g_conflictedModel=model;return false;}}
return true;}
function errormsg(msg)
{o3djs.dump.dump(msg);$('errors').innerHTML+=msg+'<br>';}
function bindParam(object,paramName,target)
{var param=object.getParam(paramName);if(param)
param.bind(target);}
function setParam(object,paramName,value)
{var param=object.getParam(paramName);if(param)
param.value=value;}
function forceBindParam(object,paramName,paramType,target)
{var param=object.getParam(paramName);if(!param)
param=object.createParam(paramName,paramType);param.bind(target);}
function forceSetParam(object,paramName,paramType,value)
{var param=object.getParam(paramName);if(!param)
param=object.createParam(paramName,paramType);param.value=value;}
function fmod(a,b)
{return a-Math.floor(a/b)*b;}
function deleteModel(model)
{model.onRemove();}
function showGame()
{if(g_loadingSplash)
{g_loadingSplash.onRemove();g_loadingSplash=null;}}
function hideGame()
{g_loadingSplash=new Image(g_textures['loadingSplash'],true);g_loadingSplash.scaleTransform.localMatrix=g_math.matrix4.scaling([g_virtualPixelWidth,-g_virtualPixelHeight,1]);g_loadingSplash.transform.localMatrix=g_math.matrix4.translation([g_virtualPixelWidth/2,g_virtualPixelHeight/2,0]);}
var g_concurrentTextureLoads=3;var g_texturesRequested=0;var g_texturesLoaded=0;function loadNextTexture()
{var loader=o3djs.loader.createLoader(onTextureLoaded);var name=g_textureNames[g_texturesRequested];var path=g_texturePaths[g_texturesRequested];loadTexture(loader,o3djs.util.getCurrentURI()+path,name);g_texturesRequested++;loader.finish();}
function onTextureLoaded()
{g_texturesLoaded++;if(g_texturesLoaded==g_textureNames.length)
onTexturesLoaded();else if(g_texturesRequested<g_textureNames.length)
loadNextTexture();}
var g_concurrentShapeLoads=3;var g_shapesRequested=0;var g_shapesLoaded=0;function loadNextShape()
{var loader=o3djs.loader.createLoader(onShapeLoaded);var shapeID=g_libraryShapes[g_shapesRequested];var scale=g_shape[shapeID].scale;loadShape(loader,o3djs.util.getCurrentURI()+'assets/'+shapeID+'.tgz',shapeID,scale,scale,scale);g_shapesRequested++;loader.finish();}
function onShapeLoaded()
{g_shapesLoaded++;if(g_shapesLoaded==g_libraryShapes.length)
onShapesLoaded();else if(g_shapesRequested<g_libraryShapes.length)
loadNextShape();}
var g_loadStage=null;var g_loadLabel='';function statusUpdate()
{if(g_loadStage=='textures')
var progress=g_texturesLoaded/g_textureNames.length;else if(g_loadStage=='shapes')
var progress=g_shapesLoaded/g_libraryShapes.length;else if(g_loadStage=='runkings')
var progress=g_runkingsLoaded/g_runkingClones;else if(g_loadStage=='materials')
var progress=g_materialsSetup/g_materials.length;else if(g_loadStage=='things')
var progress=g_thingsCreated/g_thingsNode.length;else
{$('loadstatus').innerHTML='';return;}
$('loadstatus').innerHTML=g_loadLabel+': '+Math.floor(progress*100)+'%';}
o3djs.require('o3djs.dump');o3djs.require('o3djs.effect');o3djs.require('o3djs.fps');o3djs.require('o3djs.io');o3djs.require('o3djs.loader');o3djs.require('o3djs.math');o3djs.require('o3djs.pack');o3djs.require('o3djs.particles');o3djs.require('o3djs.primitives');o3djs.require('o3djs.quaternions');o3djs.require('o3djs.rendergraph');o3djs.require('o3djs.scene');o3djs.require('o3djs.util');var g_o3d;var g_math;var g_client;var g_3dRoot;var g_viewInfo;var g_context;var g_hudRoot;var g_hudViewInfo;var g_hudContext;var g_fpsManager;var g_thisRot;var g_lastRot;var g_pack;var g_paramObject;var g_lightPosParam;var g_lightColorParam;var g_playerPosParam;var g_cameraPosParam;var g_clockParam;var g_fogStartParam;var g_fogRangeParam;var g_fogMinParam;var g_fogMaxParam;var g_fogColorParam;var g_particleSystem;var g_loadingElement;var g_o3dWidth=-1;var g_o3dHeight=-1;var g_o3dElement;var frameCount=0;var g_camera={farPlane:5000,nearPlane:0.1};var g_shape={};var g_textures={};var g_actors=new Array();var g_player;var g_loaded=false;var g_clock=0;var g_plants=new Array();var g_virtualPixelWidth=800;var g_virtualPixelHeight=600;function addActor(model)
{g_actors.push(model);}
function removeActor(model)
{for(var i=0;i<g_actors.length;i++)
{if(g_actors[i]==model)
g_actors.splice(i,1);}}
function addGlobalActor(model)
{g_globalActors.push(model);}
function removeGlobalActor(model)
{for(var i=0;i<g_globalActors.length;i++)
{if(g_globalActors[i]==model)
g_globalActors.splice(i,1);}}
function addPlant(plant)
{g_plants.push(plant);}
function removePlant(plant)
{for(var i=0;i<g_plants.length;i++)
{if(g_plants[i]==plant)
g_plants.splice(i,1);}}
function gotMouseDown(e)
{}
function gotMouseMove(e)
{}
function gotMouseUp(e)
{}
function gotWheel(e)
{}
var lightPos=[0,0,0];var up=[0,1,0];function updateView()
{g_context.view=g_math.matrix4.lookAt(g_camera.zoomEye,g_camera.target,up);lightPos[0]=g_lightX+(g_lightCameraX?g_camera.eye[0]:0);lightPos[1]=g_lightY+(g_lightCameraY?g_camera.eye[1]:0);lightPos[2]=g_lightZ+(g_lightCameraZ?g_camera.eye[2]:0);g_lightPosParam.value=lightPos;if(g_player)
g_playerPosParam.value=[g_player.x,g_player.y,g_player.z];g_cameraPosParam.value=g_camera.zoomEye;updateSky();}
function enableInput(enable)
{document.getElementById("load").disabled=!enable;}
function updateProjection()
{g_context.projection=g_math.matrix4.perspective(g_math.degToRad(45),g_o3dWidth/g_o3dHeight,g_camera.nearPlane,g_camera.farPlane);}
function setClientSize()
{g_o3dWidth=g_virtualPixelWidth;g_o3dHeight=g_virtualPixelHeight;updateProjection();if(g_fpsManager)
g_fpsManager.resize(g_o3dWidth,g_o3dHeight);}
function $(id)
{return document.getElementById(id);}
var g_thingBatchSize=50;var g_materialBatchSize=2;function onTick(tickEvent)
{if(g_thingsNode)
{for(var i=0;i<g_thingBatchSize;i++)
{if(g_thingsCreated<g_thingsNode.length)
{createNextThing();}
else
{onThingsCreated();break;}}}
if(g_materials)
{for(var i=0;i<g_materialBatchSize;i++)
{if(g_materialsSetup<g_materials.length)
{o3djs.material.prepareMaterial(g_pack,g_viewInfo,g_materials[g_materialsSetup]);g_materialsSetup++;}
else
{onMaterialsSetup();break;}}}
statusUpdate();}
var g_unprocessedTime=0;var g_frameCount=0;var g_paused=false;function onRender(renderEvent)
{var elapsedTime=g_paused?0:renderEvent.elapsedTime;g_clock+=elapsedTime;if(g_loaded)
nextFrame(elapsedTime);if(g_clockParam)
g_clockParam.value=g_clock;if(g_fpsManager)
g_fpsManager.update(renderEvent);}
var g_maxIntegration=1/20;var g_showFPS=false;function nextFrame(elapsedTime)
{if(g_pendingExit)
{doExit();g_pendingExit=false;}
if(elapsedTime>g_maxIntegration)
elapsedTime=g_maxIntegration;var actor;for(var i=g_actors.length-1;i>=0;i--)
{actor=g_actors[i];if(actor.ticking)
actor.onTick(elapsedTime);}
for(var i=g_actors.length-1;i>=0;i--)
{actor=g_actors[i];if(actor.remove)
{deleteModel(actor);removeActor(actor);}}
updateCamera();updateView();if(keyHit(KEY_Z))
{g_showFPS=!g_showFPS;g_fpsManager.setVisible(g_showFPS);}
storePrevKeys();}
var g_initCamera=true;var g_currentZoom=1.0;function updateCamera()
{if(!g_initCamera)
{var newEyeX=g_player.x+(g_player.direction=='left'?-g_camEyeX:g_camEyeX);var newEyeY=g_player.y+g_camEyeY;var newEyeZ=g_player.z+g_camEyeZ;g_camera.eye[0]=(newEyeX+g_camera.eye[0]*g_camSoftX)/(g_camSoftX+1);g_camera.eye[1]=(newEyeY+g_camera.eye[1]*g_camSoftY)/(g_camSoftY+1);g_camera.eye[2]=(newEyeZ+g_camera.eye[2]*g_camSoftZ)/(g_camSoftZ+1);g_camera.target[0]=(g_camera.target[0]+g_player.x+(g_player.direction=='left'?-g_camTargetX:g_camTargetX))/2;g_camera.target[1]=(g_camera.target[1]+g_player.y+g_camTargetY)/2;g_camera.target[2]=(g_camera.target[2]+g_player.z+g_camTargetZ)/2;}
else
{g_camera.eye[0]=g_player.x+(g_player.direction=='left'?-g_camEyeX:g_camEyeX);g_camera.eye[1]=g_player.y+g_camEyeY;g_camera.eye[2]=g_player.z+g_camEyeZ;g_camera.target[0]=g_player.x+g_camTargetX;g_camera.target[1]=g_player.y+g_camTargetY;g_camera.target[2]=g_player.z+g_camTargetZ;g_initCamera=false;}
var targetZoom;var playerVel=Math.abs(g_player.velX);if(!g_exitZoomInc)
targetZoom=g_math.lerpScalar(g_stillZoom,g_runZoom,playerVel/g_player.runVelX);else
targetZoom=g_stillZoom+g_exitZoomInc;g_currentZoom=(targetZoom+g_currentZoom*g_camSoftZ)/(g_camSoftZ+1);g_camera.zoomEye[0]=g_math.lerpScalar(g_camera.target[0],g_camera.eye[0],1/g_currentZoom);g_camera.zoomEye[1]=g_math.lerpScalar(g_camera.target[1],g_camera.eye[1],1/g_currentZoom);g_camera.zoomEye[2]=g_math.lerpScalar(g_camera.target[2],g_camera.eye[2],1/g_currentZoom);}
function init()
{if(!o3djs.base.IsMSIE())
o3djs.util.setMainEngine(o3djs.util.Engine.V8);if(!g_useCombinedSrc)
{o3djs.util.addScriptUri('com');o3djs.util.addScriptUri('platformer');o3djs.util.addScriptUri('sound');}
else
{o3djs.util.addScriptUri('game');}
o3djs.util.makeClients(initStep2);}
var g_archive={};var g_runkingUrl;function initStep2(clientElements)
{g_runkingUrl=o3djs.util.getCurrentURI()+'assets/'+g_runkingName+'.tgz';soundPlayer.play('sound/music.mp3',100,999);soundPlayer.setVolume('sound/music.mp3',15);loadSettings('settings/misc.xml');loadLibrarySettings('settings/library.xml');loadTextureSettings('settings/textures.xml');g_o3dElement=clientElements[0];g_o3d=g_o3dElement.o3d;g_math=o3djs.math;g_quaternions=o3djs.quaternions;g_client=g_o3dElement.client;o3djs.event.addEventListener(g_o3dElement,'keydown',onKeyDownPlugin);o3djs.event.addEventListener(g_o3dElement,'keyup',onKeyUpPlugin);g_client.setRenderCallback(onRender);g_client.setTickCallback(onTick);g_pack=g_client.createPack();g_paramObject=g_pack.createObject('ParamObject');g_3dRoot=g_pack.createObject('Transform');g_hudRoot=g_pack.createObject('Transform');g_viewInfo=o3djs.rendergraph.createBasicView(g_pack,g_3dRoot,g_client.renderGraphRoot);g_context=g_viewInfo.drawContext;g_hudViewInfo=o3djs.rendergraph.createBasicView(g_pack,g_hudRoot,g_client.renderGraphRoot);g_hudContext=g_hudViewInfo.drawContext;g_viewInfo.root.priority=1;g_hudViewInfo.root.priority=2;g_hudViewInfo.clearBuffer.clearColorFlag=false;g_viewInfo.clearBuffer.clearColorFlag=true;g_viewInfo.clearBuffer.clearColor=[1,0.1,1,1];g_hudViewInfo.zOrderedState.getStateParam('CullMode').value=g_o3d.State.CULL_NONE;g_hudViewInfo.zOrderedState.getStateParam('ZWriteEnable').value=false;g_hudContext.projection=g_math.matrix4.orthographic(0+0.5,g_virtualPixelWidth+0.5,g_virtualPixelHeight+0.5,0+0.5,0.001,1000);g_hudContext.view=g_math.matrix4.lookAt([0,0,1],[0,0,0],[0,1,0]);g_lastRot=g_math.matrix4.identity();g_thisRot=g_math.matrix4.identity();g_lightPosParam=g_paramObject.createParam('lightPos','ParamFloat3');g_lightColorParam=g_paramObject.createParam('lightColor','ParamFloat4');g_cameraPosParam=g_paramObject.createParam('cameraPos','ParamFloat3');g_clockParam=g_paramObject.createParam('clock','ParamFloat');g_camera.target=[0,0,0];g_camera.eye=[0,0,0];g_camera.zoomEye=[0,0,0];g_fogStartParam=g_paramObject.createParam('fogStart','ParamFloat');g_fogRangeParam=g_paramObject.createParam('fogRange','ParamFloat');g_fogMinParam=g_paramObject.createParam('fogMin','ParamFloat');g_fogMaxParam=g_paramObject.createParam('fogMax','ParamFloat');g_fogColorParam=g_paramObject.createParam('fogColor','ParamFloat3');g_playerPosParam=g_paramObject.createParam('playerPos','ParamFloat3');g_playerPosParam.value=[0,0,0];g_archive[g_runkingUrl]={};setupImageDisplay();g_loadStage='textures';g_loadLabel='Loading Textures';for(var i=0;i<g_concurrentTextureLoads;i++)
loadNextTexture();}
function onTexturesLoaded()
{var loader=o3djs.loader.createLoader(loadNextShape);loadShape(loader,o3djs.util.getCurrentURI()+'assets/'+g_heroName+'.tgz',g_heroName,g_playerScale,g_playerScale,g_playerScale);loader.finish();g_loadStage='shapes';g_loadLabel='Loading Shapes';for(var i=0;i<g_concurrentShapeLoads-1;i++)
loadNextShape();}
var g_runkingClones=11;var g_concurrentRunkingLoads=4;function onShapesLoaded()
{g_shape[g_heroName].scale=g_playerScale;var settings=g_shape[g_runkingName];g_shape[g_runkingName+'0']=settings;g_loadStage='runkings';g_loadLabel='Cloning Runkings';for(var i=0;i<g_concurrentRunkingLoads;i++)
loadNextRunking();}
function profile(label)
{var g_date=new Date();errormsg(label+":"+g_date.getTime()*0.001);}
g_runkingsRequested=0;g_runkingsLoaded=0;function loadNextRunking()
{var settings=g_shape[g_runkingName];var loader=o3djs.loader.createLoader(onRunkingLoaded);var shapeID=g_runkingName+(g_runkingsRequested+1);g_shape[shapeID]={};g_shape[shapeID].plantable=settings.plantable;g_shape[shapeID].solid=settings.solid;g_shape[shapeID].image=settings.image;g_shape[shapeID].scale=settings.scale;g_shape[shapeID].buildingBlock=settings.buildingBlock;g_shape[shapeID].emissiveMap=settings.emissiveMap;g_shape[shapeID].ambientMap=settings.ambientMap;g_shape[shapeID].diffuseMap=settings.diffuseMap;g_shape[shapeID].specularMap=settings.specularMap;g_shape[shapeID].bumpMap=settings.bumpMap;g_shape[shapeID].skipPartialAlpha=settings.skipPartialAlpha;var scale=g_shape[shapeID].scale;loadShape(loader,g_runkingUrl,shapeID,scale,scale,scale);g_runkingsRequested++;loader.finish();}
function onRunkingLoaded()
{g_runkingsLoaded++;if(g_runkingsLoaded==g_runkingClones)
setupMaterials();else if(g_runkingsRequested<g_runkingClones)
loadNextRunking();}
var g_materials=null;var g_materialsSetup=0;function setupMaterials()
{g_materials=g_pack.getObjectsByClassName('o3d.Material');g_materialsSetup=0;g_loadStage='materials';g_loadLabel='Configuring Materials';}
var g_ripplePlane;function onMaterialsSetup()
{g_materials=null;o3djs.shape.prepareShapes(g_pack);o3djs.event.addEventListener(g_o3dElement,'mousedown',gotMouseDown);o3djs.event.addEventListener(g_o3dElement,'mousemove',gotMouseMove);o3djs.event.addEventListener(g_o3dElement,'mouseup',gotMouseUp);o3djs.event.addEventListener(g_o3dElement,'wheel',gotWheel);bindMaterialParams();var rippleMaterial=createRippleMaterial();g_ripplePlane=o3djs.primitives.createDisc(g_pack,rippleMaterial,1,40,40,0,1);setupUI();g_onLevelLoaded=onFirstLevelLoaded;loadLevel('levels/level.xml');g_loadStage='things';g_loadLabel='Instancing Models';}
function onFirstLevelLoaded()
{g_shape[g_heroName].solid=true;g_player=new Player();g_player.init(g_heroName,g_start[0],g_start[1],g_start[2]+g_playerOffsetZ,'settings/player.xml');addActor(g_player);addGlobalActor(g_player);updateView();if(g_archive[g_runkingUrl])
{g_archive[g_runkingUrl].archive.destroy();g_archive[g_runkingUrl].archive=null;g_archive[g_runkingUrl]=null;}
g_fpsManager=o3djs.fps.createFPSManager(g_pack,g_client.width,g_client.height,g_client.renderGraphRoot);g_fpsManager.setVisible(g_showFPS);g_fpsManager.setPerfVisible(false);g_particleSystem=o3djs.particles.createParticleSystem(g_pack,g_viewInfo);updateUI();setLight();setFog();g_o3dElement.style.width=g_virtualPixelWidth+'px';g_o3dElement.style.height=g_virtualPixelHeight+'px';setClientSize();$('loadstatus').innerHTML='';g_client.setFullscreenClickRegion(g_fullScreenBtn.left,g_fullScreenBtn.top,g_fullScreenBtn.width,g_fullScreenBtn.height,getFullscreenModeId());o3djs.event.addEventListener(g_o3dElement,'resize',handleResizeEvent);g_client.clearTickCallback();g_loaded=true;}
function handleResizeEvent(event)
{g_fullScreenBtn.transform.visible=!event.fullscreen;}
var g_iconSeedTens;var g_iconSeedOnes;var g_iconGoalFlowerTens;var g_iconGoalFlowerOnes;var g_iconCurrentFlowerTens;var g_iconCurrentFlowerOnes;var g_iconSlash;var g_fullScreenBtn;var g_loadingSplash;function setupUI()
{g_fullScreenBtn=new Image(g_textures['fullScreenBtn'],true);g_fullScreenBtn.left=2;g_fullScreenBtn.top=g_virtualPixelHeight-2-g_fullScreenBtn.height;g_fullScreenBtn.x=g_fullScreenBtn.left+g_fullScreenBtn.width/2;g_fullScreenBtn.y=g_fullScreenBtn.top+g_fullScreenBtn.height/2;g_fullScreenBtn.transform.localMatrix=g_math.matrix4.translation([g_fullScreenBtn.x,g_fullScreenBtn.y,0]);var icon=new Image(g_textures['seedCounterIcon'],true);icon.transform.localMatrix=g_math.matrix4.translation([40,40,0]);var icon=new Image(g_textures['flowerCounterIcon'],true);icon.transform.localMatrix=g_math.matrix4.translation([760,40,0]);g_iconExitOpen=new Image(g_textures['ExitOpen'],true);g_iconExitOpen.transform.localMatrix=g_math.matrix4.translation([700,100,0]);g_iconSeedTens=new Image(g_textures[0],true);g_iconSeedTens.transform.localMatrix=g_math.matrix4.translation([80,40,0]);g_iconSeedOnes=new Image(g_textures[0],true);g_iconSeedOnes.transform.localMatrix=g_math.matrix4.translation([100,40,0]);g_iconCurrentFlowerTens=new Image(g_textures[0],true);g_iconCurrentFlowerTens.transform.localMatrix=g_math.matrix4.translation([620,40,0]);g_iconCurrentFlowerOnes=new Image(g_textures[0],true);g_iconCurrentFlowerOnes.transform.localMatrix=g_math.matrix4.translation([640,40,0]);g_iconSlash=new Image(g_textures['slash'],true);g_iconSlash.transform.localMatrix=g_math.matrix4.translation([660,40,0]);g_iconGoalFlowerTens=new Image(g_textures[0],true);g_iconGoalFlowerTens.transform.localMatrix=g_math.matrix4.translation([680,40,0]);g_iconGoalFlowerOnes=new Image(g_textures[0],true);g_iconGoalFlowerOnes.transform.localMatrix=g_math.matrix4.translation([700,40,0]);}
function updateUI()
{var currentFlowers=g_plants.length;var currentSeeds=g_player.seeds.length;var won=currentFlowers>=g_goalFlowers;var prefix=won?'green_':'';g_iconExitOpen.transform.visible=won;g_iconSlash.setTexture(g_textures[prefix+'slash']);var num=Math.floor(currentSeeds/10)
g_iconSeedTens.setTexture(g_textures[prefix+num]);var num=fmod(currentSeeds,10);g_iconSeedOnes.setTexture(g_textures[prefix+num]);var num=Math.floor(currentFlowers/10)
g_iconCurrentFlowerTens.setTexture(g_textures[prefix+num]);var num=fmod(currentFlowers,10);g_iconCurrentFlowerOnes.setTexture(g_textures[prefix+num]);var num=Math.floor(g_goalFlowers/10)
g_iconGoalFlowerTens.setTexture(g_textures[prefix+num]);var num=fmod(g_goalFlowers,10);g_iconGoalFlowerOnes.setTexture(g_textures[prefix+num]);}
function dumpSceneInfo()
{o3djs.dump.dump('---dumping context---\n');o3djs.dump.dumpParamObject(g_viewInfo.drawContext);o3djs.dump.dump('---dumping root---\n');o3djs.dump.dumpTransformTree(g_3dRoot);o3djs.dump.dump('---dumping render root---\n');o3djs.dump.dumpRenderNodeTree(g_client.renderGraphRoot);o3djs.dump.dump('---dump g_pack shapes---\n');var shapes=g_pack.getObjectsByClassName('o3d.Shape');for(var t=0;t<shapes.length;t++)
o3djs.dump.dumpShape(shapes[t]);o3djs.dump.dump('---dump g_pack materials---\n');var materials=g_pack.getObjectsByClassName('o3d.Material');for(var t=0;t<materials.length;t++)
{o3djs.dump.dump('  '+t+' : '+materials[t].className+' : "'+materials[t].name+'"\n');o3djs.dump.dumpParams(materials[t],'    ');}
o3djs.dump.dump('---dump g_pack textures---\n');var textures=g_pack.getObjectsByClassName('o3d.Texture');for(var t=0;t<textures.length;t++)
o3djs.dump.dumpTexture(textures[t]);o3djs.dump.dump('---dump g_pack effects---\n');var effects=g_pack.getObjectsByClassName('o3d.Effect');for(var t=0;t<effects.length;t++)
{o3djs.dump.dump('  '+t+' : '+effects[t].className+' : "'+effects[t].name+'"\n');o3djs.dump.dumpParams(effects[t],'    ');}}
function uninit()
{if(g_client)
{g_client.clearRenderCallback();g_client.clearTickCallback();g_client.cleanup();}}
function createRippleMaterial()
{var material=g_pack.createObject('Material');var effect=g_pack.createObject('Effect');o3djs.effect.loadEffect(effect,'shaders/ripple.shader');material.effect=effect;effect.createUniformParameters(material);material.drawList=g_viewInfo.zOrderedDrawList;bindParam(material,'clock',g_clockParam);var sampler=g_pack.createObject('Sampler');var param=material.getParam('diffuseSampler');param.value=sampler;sampler.texture=g_textures['Portal_CO.png'];return material;}
function getFullscreenModeId()
{var displayModes=g_client.getDisplayModes();var bestMode;for(var index in displayModes)
{var mode=displayModes[index];if(mode.width==640&&mode.height==480)
return mode.id;if(!bestMode||(mode.width>bestMode.width&&mode.height>bestMode.height))
bestMode=mode;}
if(bestMode)
return bestMode.id;else
return g_o3d.Renderer.DISPLAY_MODE_DEFAULT;}