diff --git a/build/game.min.js b/build/game.min.js index 1019896222..7a24041e44 100644 --- a/build/game.min.js +++ b/build/game.min.js @@ -9,86 +9,87 @@ computeVertexNormals()}function BlockGeometry(e,t,n,r,i,s,o,u,a,f,l){function S( ,e.position)}var o,u=0;this.lights.sort(s);for(o=0;oMath.PI&&(u-=Math.PI*2);var a=n*u;return a>r&&(a=r),a<-r&&(a=-r),i.setAngularVelocity(e.set(0,a,0)),i.position.distanceToSquared(s)>=o?(Math.abs(u)n?n:e}if(!this.mouseEnabled||!this.active)return;if(this.pointerLockEnabled){if(e.mozMovementX===0&&e.mozMovementY===0)return;this.mouseX=e.movementX||e.webkitMovementX||e.mozMovementX||0,this.mouseY=e.movementY||e.webkitMovementY||e.mozMovementY||0,this.mouseX=t(this.mouseX*20,-600,600),this.mouseY= -t(this.mouseY*20,-600,600)}else this.domElement===document?(this.mouseX=e.pageX-p,this.mouseY=e.pageY-d):(this.mouseX=e.pageX-this.domElement.offsetLeft-p,this.mouseY=e.pageY-this.domElement.offsetTop-d)},this.onKeyDown=function(e){switch(e.keyCode){case 38:case 87:u=!0;break;case 37:case 65:f=!0;break;case 40:case 83:a=!0;break;case 39:case 68:l=!0;break;case 82:reload();break;case 70:pl.shadow.visible=!pl.shadow.visible;break;case 123:screenshot(!0)}},this.onKeyUp=function(e){switch(e.keyCode){case 38:case 87 -:u=!1;break;case 37:case 65:f=!1;break;case 40:case 83:a=!1;break;case 39:case 68:l=!1}},this.update=function(e){if(!this.active)return;var t=e*this.movementSpeed,n=this.mouseEnabled?e*this.lookSpeed:0,p=this.object.position;if(this.pointerLockEnabled||this.mouseFallback&&this.mouseX*this.mouseX+this.mouseY*this.mouseY>5e3)i+=this.mouseX*n,this.lookVertical&&(r-=this.mouseY*n);r=Math.max(-85,Math.min(85,r)),s=(90-r)*Math.PI/180,o=i*Math.PI/180,this.constrainVerticalLook&&(s=THREE.Math.mapLinear(s,0,Math.PI,this -.verticalMin,this.verticalMax)),this.target.x=p.x+100*Math.sin(s)*Math.cos(o),this.target.y=p.y+100*Math.cos(s),this.target.z=p.z+100*Math.sin(s)*Math.sin(o),this.pointerLockEnabled&&(this.mouseX=0,this.mouseY=0),this.object.lookAt(this.target),u||this.autoForward&&!a?this.object.translateZ(-t):a&&this.object.translateZ(t),f?this.object.translateX(-t):l&&this.object.translateX(t),c?this.object.translateY(t):h&&this.object.translateY(-t)},this.domElement.addEventListener("contextmenu",function(e){e.preventDefault -()},!1),this.domElement.addEventListener("mousemove",v(this,this.onMouseMove),!1),this.domElement.addEventListener("mousedown",v(this,this.onMouseDown),!1),this.domElement.addEventListener("mouseup",v(this,this.onMouseUp),!1),this.domElement.addEventListener("keydown",v(this,this.onKeyDown),!1),this.domElement.addEventListener("keyup",v(this,this.onKeyUp),!1),this.handleResize()}function Map(e,t,n){function o(t,n,r,i,s,u){var a=t.get(n,r);if(a!=i&&a!=u)return;a!=u&&(t.map[r*e+n]=s),o(t,n-1,r,i,s,u),o(t,n+1,r -,i,s,u),o(t,n,r-1,i,s,u),o(t,n,r+1,i,s,u)}function u(e,t,n,r){var i=n-e,s=r-t;return i*i+s*s}this.map=new Array(e*t);if(n&&n.length&&n instanceof Array)for(var r=0;r=e||r<0||r>=t?i||null:this.map[r*e+n]},this.put=function(n,r,i){if(n<0||n>=e||r<0||r>=t)return;this.map[r*e+n]=i},this.toJSON=function(){var n=new Array(t);for(var r=0;rs*s){if(this.map[(n|0)*e+(t|0)]==WALL)return!1;t+=a,n+=f}return!0},this.getWalkableMatrix=function(){var n=new Array(t);for(var r=0;r=30);c=u1?new THREE.MeshFaceMaterial(f):f[0];if(s.collision){var v=Physijs.createMaterial(d,.7,.2);if(s.collision=="plane")l=new Physijs.PlaneMesh(a,v,c);else if(s.collision=="box")l=new Physijs.BoxMesh(a,v,c);else if( -s.collision=="sphere")l=new Physijs.SphereMesh(a,v,c);else if(s.collision=="cylinder")l=new Physijs.CylinderMesh(a,v,c);else if(s.collision=="cone")l=new Physijs.ConeMesh(a,v,c);else if(s.collision=="capsule")l=new Physijs.CapsuleMesh(a,v,c);else if(s.collision=="convex")l=new Physijs.ConvexMesh(a,v,c);else{if(s.collision!="concave")throw"Unsupported collision mesh type "+s.collision;l=new Physijs.ConcaveMesh(a,v,c)}r.objects.push(l)}else l=new THREE.Mesh(a,d);s.door&&(n.x=Math.floor(n.x)+.5,n.z=Math.floor(n -.z)+.5),n.x*=t.gridSize,n.z*=t.gridSize,!n.y&&n.y!==0&&(n.y=.5*(a.boundingBox.max.y-a.boundingBox.min.y)+.001),l.position.copy(n),i&&(l.rotation.y=i/180*Math.PI),l.scale.set(h,h,h),!s.noShadows&&!s.animation&&(l.castShadow=!0,l.receiveShadow=!0),c===0&&!s.character&&(l.matrixAutoUpdate=!1,l.updateMatrix()),s.animation&&(l.visible=!1,l.geometry=u,l.mesh=animationManager.createAnimatedMesh(a,f,s),s.noShadows||(l.mesh.castShadow=!0,l.mesh.receiveShadow=!0),l.add(l.mesh)),s.character&&(s.character.hp&&(l.hp=s.character -.hp),l.faction=s.character.faction||1,r.monsters.push(l)),s.item&&(l.items={},l.items[s.item.type]=s.item.value||1,l.itemName=s.name),l.addEventListener("collision",function(e,t,n){if(t.lengthSq()<1)return;e.damage&&s.sound&&soundManager.playSpatial(s.sound,e.position,10);if(this.dead)return;this.hp&&e.damage&&e.position.y>.3&&this.faction!=e.faction&&(this.hp-=e.damage,e.damage=0,this.hp<=0&&(soundManager.playSpatial("robot-death",20),this.dead=!0,this.mesh&&(this.mesh.animate=!1),this.setAngularFactor({x:1 -,y:1,z:1}),this.setAngularVelocity({x:0,y:0,z:0}),this.setLinearVelocity({x:0,y:0,z:0}),this.mass=2e3,this.mesh?this.mesh.material=o:this.material=o))}),e.add(l),s.character&&s.collision&&l.setAngularFactor({x:0,y:1,z:0}),s.character&&(l.speed=s.character.speed);if(s.door){l.setAngularFactor({x:0,y:1,z:0});var m=l.position.clone(),g=.5*(a.boundingBox.max.x-a.boundingBox.min.x)-.1;m.x-=Math.cos(l.rotation.y)*g,m.z+=Math.sin(l.rotation.y)*g;var y=new Physijs.HingeConstraint(l,m,new THREE.Vector3(0,1,0));e.addConstraint -(y),y.setLimits(-Math.PI/2*.95+l.rotation.y,Math.PI/2*.95+l.rotation.y,.3,.01)}}}function l(n){typeof n=="string"&&(n=JSON.parse(n)),n.map instanceof Array&&(n.map=new Map(n.width,n.depth,n.map)),t.geometry.computeBoundingBox(),t.position.x=n.start[0]*n.gridSize,t.position.y=.5*(t.geometry.boundingBox.max.y-t.geometry.boundingBox.min.y)+.001,t.position.z=n.start[1]*n.gridSize,n.startAngle&&controls.setYAngle(n.startAngle),cache.loadModel("assets/models/gun/gun.js",function(n,r){t.rhand=new Physijs.BoxMesh(n,new -THREE.MeshFaceMaterial(r)),t.rhand.ammoGood=r[2].clone(),t.rhand.ammoOut=r[2].clone(),t.rhand.ammoOut.color.setRGB(.3,.1,.1),t.rhand.castShadow=!0,t.rhand.receiveShadow=!0,t.rhand.position.set(.4,.2,-1),t.add(t.rhand),e.add(t),t.setAngularFactor({x:0,y:0,z:0})},a+"gun"),cache.loadModel("assets/models/fork/fork.js",function(t,n){r.forks=[],r.forkIndex=0,r.forkTypes={plain:{damage:5,material:n[0]},heated:{damage:8,material:n[0].clone()},plasma:{damage:20,material:n[0].clone()}},r.forkTypes.heated.material.ambient -.setRGB(1,.3,.3),r.forkTypes.plasma.material.ambient.setRGB(1,.3,1);for(var i=0;i<40;++i){var s=new Physijs.BoxMesh(t,r.forkTypes.plain.material,100);s.damage=r.forkTypes.plain.damage,r.forks.push(s),s.visible=!1,s.scale.set(3,3,1),e.add(s),s.scale.set(1,1,1)}}),r.generateMesh(n),r.addLights(n),r.addObjects(n),r.addItems(n),r.addMonsters(n),lightManager.update(pl),r.level=n,r.grid=new PF.Grid(n.width,n.depth,n.map.getWalkableMatrix()),r.pathFinder=new PF.AStarFinder({allowDiagonal:!0,dontCrossCorners:!0,heurestic -:PF.Heuristic.euclidean}),r.onLoad?r.onLoad():r.onLoad=!0,n.title&&displayMessage(n.title)}var r=this;this.onLoad=null,this.objects=[],this.monsters=[],this.grid=null,this.pathFinder=null,this.level=null;var i=new THREE.MeshBasicMaterial({color:0}),s=new THREE.MeshBasicMaterial({color:16711935}),o=new THREE.MeshLambertMaterial({color:2236962,ambient:2236962}),u=new THREE.Geometry,a="assets/models/";CONFIG.textureQuality===0?a="assets/models-256/":CONFIG.textureQuality==1&&(a="assets/models-512/"),this.generateMesh= -function(t){var n=Math.sqrt(2),r=cache.getMaterial(t.materials.wall),s=assets.materials[t.materials.wall]||{},o=new THREE.Geometry,u=new THREE.Mesh,a,f,l,c,h,p,d,v,m,g,y,b;for(var w=0;w1?new THREE.MeshFaceMaterial(i):i[0],u=new Physijs.CylinderMesh -(r,o,0);u.position.copy(t),u.rotation.y=n,u.matrixAutoUpdate=!1,u.updateMatrix(),e.add(u)}}e.add(new THREE.AmbientLight(4473924));var i=new THREE.Vector2,s=new THREE.Vector3;for(var o=0;o24){var h=window.atob(n);l(JSON.parse(h))}else $.get -("assets/levels/"+n+".json",l);this.serialize=function(){return JSON.stringify(this.level)},this.ready=function(e){this.onLoad===!0?e():this.onLoad=e}}function initUI(){var e=document.getElementById("container");e.appendChild(renderer.domElement),renderStats=new Stats,renderStats.domElement.style.position="absolute",renderStats.domElement.style.bottom="0px",e.appendChild(renderStats.domElement),physicsStats=new Stats,physicsStats.domElement.style.position="absolute",physicsStats.domElement.style.bottom="0px" -,physicsStats.domElement.style.left="85px",e.appendChild(physicsStats.domElement),CONFIG.showStats||(renderStats.domElement.style.display="none",physicsStats.domElement.style.display="none"),rendererInfo=document.getElementById("renderer-info"),e.requestPointerLock=e.requestPointerLock||e.mozRequestPointerLock||e.webkitRequestPointerLock,e.requestFullscreen=e.requestFullscreen||e.mozRequestFullscreen||e.mozRequestFullScreen||e.webkitRequestFullscreen,$(window).resize(onWindowResize),$(window).blur(pause),$(window -).focus(resume),$("#instructions").click(function(){if(CONFIG.fullscreen||/Firefox/i.test(navigator.userAgent)){var t=function(n){if(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullscreenElement||document.mozFullScreenElement)document.removeEventListener("fullscreenchange",t),document.removeEventListener("mozfullscreenchange",t),document.removeEventListener("webkitfullscreenchange",t),e.requestPointerLock()};document.addEventListener("fullscreenchange",t,!1),document.addEventListener -("mozfullscreenchange",t,!1),document.addEventListener("webkitfullscreenchange",t,!1),e.requestFullscreen()}else e.requestPointerLock()}),document.addEventListener("pointerlockchange",onPointerLockChange,!1),document.addEventListener("webkitpointerlockchange",onPointerLockChange,!1),document.addEventListener("mozpointerlockchange",onPointerLockChange,!1),$("#instructions").show();var t=new dat.GUI;t.add(CONFIG,"fullscreen").onChange(updateConfig),t.add(CONFIG,"resolution",.1,1).step(.1).onChange(function(){updateConfig -(),onWindowResize()}),t.add(CONFIG,"physicsFPS",30,100).step(10).onChange(updateConfig),t.add(CONFIG,"showStats").onChange(updateConfig),t.add(CONFIG,"sounds").onChange(updateConfig),t.add(controls,"mouseFallback"),t.add(window,"editLevel");var n=t.addFolder("Renderer options (reload required)");n.add(CONFIG,"antialias").onChange(updateConfig),n.add(CONFIG,"physicalShading").onChange(updateConfig),n.add(CONFIG,"normalMapping").onChange(updateConfig),n.add(CONFIG,"specularMapping").onChange(updateConfig),n.add -(CONFIG,"particles").onChange(updateConfig),n.add(window,"reload");var r=t.addFolder("Light and shadow");r.add(CONFIG,"maxLights",0,6).step(1).onChange(updateConfig),r.add(CONFIG,"maxShadows",0,6).step(1).onChange(updateConfig),r.add(CONFIG,"shadows").onChange(updateMaterials),r.add(CONFIG,"softShadows").onChange(updateMaterials);var i=t.addFolder("Texture options");i.add(CONFIG,"textureQuality",0,2).step(1).onChange(updateConfig),i.add(CONFIG,"anisotropy",1,renderer.getMaxAnisotropy()).step(1).onChange(updateTextures -),i.add(CONFIG,"linearTextureFilter").onChange(updateTextures);var s=t.addFolder("Post-processing");s.add(CONFIG,"postprocessing").onChange(updateConfig),s.add(CONFIG,"SSAO").onChange(updateConfig),s.add(CONFIG,"FXAA").onChange(updateConfig),s.add(CONFIG,"bloom").onChange(updateConfig),t.close()}function updateHUD(){$("#health").html(pl.hp),$("#bullets").html(pl.bullets),$("#clips").html(pl.clips)}function displayMessage(e){var t=$("#message");messageTimer&&window.clearTimeout(messageTimer),t.is(":visible")&& -t.stop(!0,!0).hide(),t.html(e).fadeIn(2e3),messageTimer=window.setTimeout(function(){t.fadeOut(5e3),messageTimer=null},3e3)}function displayMinorMessage(e){var t=$("#minor-messages");t.is(":visible")||t.html(""),t.stop(!0,!0),t.prepend(e+"
").show().fadeOut(5e3)}function editLevel(){var e="editor/index.html#level="+window.btoa(dungeon.serialize());window.open(e,"_blank")}function onWindowResize(){var e=CONFIG.resolution;pl.camera.aspect=window.innerWidth/window.innerHeight,pl.camera.updateProjectionMatrix -(),renderer.setSize(window.innerWidth*e,window.innerHeight*e),colorTarget=new THREE.WebGLRenderTarget(window.innerWidth*e,window.innerHeight*e,renderTargetParametersRGB),composer.reset(colorTarget),depthTarget=new THREE.WebGLRenderTarget(window.innerWidth*e,window.innerHeight*e,renderTargetParametersRGBA),depthPassPlugin.renderTarget=depthTarget,passes.ssao.uniforms.tDepth.value=depthTarget,passes.ssao.uniforms.size.value.set(window.innerWidth*e,window.innerHeight*e),passes.fxaa.uniforms.resolution.value.set -(e/window.innerWidth,e/window.innerHeight),controls.handleResize()}function onPointerLockChange(){document.pointerLockElement||document.mozPointerLockElement||document.webkitPointerLockElement?(controls.pointerLockEnabled=!0,$("#instructions").hide()):(controls.pointerLockEnabled=!1,pl.dead||$("#instructions").show())}function pause(){controls.active=!1}function resume(){controls.active=!0}function reload(){updateConfig(),window.location.reload()}function init(){scene=new Physijs.Scene({fixedTimeStep:1/CONFIG -.physicsFPS}),scene.setGravity(new THREE.Vector3(0,-10,0)),scene.fog=new THREE.FogExp2(0,.05),scene.addEventListener("update",function(){CONFIG.showStats&&physicsStats.update()}),pl=new Physijs.CapsuleMesh(new THREE.CylinderGeometry(.8,.8,2),new THREE.MeshBasicMaterial({color:16711935}),100),pl.visible=!1,pl.addEventListener("collision",function(e,t,n){if(this.dead)return;if(e.items){for(var r in e.items)pl[r]!==undefined&&(typeof e.items[r]=="number"?pl[r]+=e.items[r]:pl[r]=e.items[r]);soundManager.play("pick-up" -),displayMinorMessage("Picked up "+e.itemName),updateHUD(),e.items=undefined,e.visible=!1,e.parent.remove(e)}e.damage&&e.position.y>.3&&pl.faction!=e.faction&&(this.hp-=e.damage,updateHUD())});var e={};hashParams.level&&localStorage.getItem("campaingState-"+hashParams.level)?(e=JSON.parse(localStorage.getItem("campaingState-"+hashParams.level)),pl.hp=e.hp,pl.bulletsPerClip=e.bulletsPerClip,pl.bullets=e.bullets,pl.clips=e.clips,pl.ammoType=e.ammoType||"plain"):(pl.hp=100,pl.bulletsPerClip=15,pl.bullets=pl.bulletsPerClip -,pl.clips=5,pl.ammoType="plain"),pl.reloading=!1,pl.faction=0,updateHUD(),pl.camera=new THREE.PerspectiveCamera(60,window.innerWidth/window.innerHeight,.1,25),controls=new Controls(pl.camera,{mouse:mouseHandler}),controls.movementSpeed=10,controls.lookSpeed=.5,controls.lookVertical=!0,controls.constrainVerticalLook=!0,controls.verticalMin=1.1,controls.verticalMax=2.2,renderer=new THREE.WebGLRenderer({clearColor:0,maxLights:CONFIG.maxLights+2,antialias:CONFIG.antialias,preserveDrawingBuffer:!0}),renderer.setSize -(window.innerWidth,window.innerHeight),renderer.shadowMapEnabled=CONFIG.shadows,renderer.shadowMapSoft=CONFIG.softShadows,renderer.shadowMapDebug=!1,renderer.gammaInput=!0,renderer.gammaOutput=!0,renderer.physicallyBasedShading=CONFIG.physicalShading,renderer.autoClear=!1,CONFIG.anisotropy||(CONFIG.anisotropy=renderer.getMaxAnisotropy()),renderTargetParametersRGB={minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBFormat},renderTargetParametersRGBA={minFilter:THREE.LinearFilter,magFilter -:THREE.LinearFilter,format:THREE.RGBAFormat},depthTarget=new THREE.WebGLRenderTarget(window.innerWidth,window.innerHeight,renderTargetParametersRGBA),colorTarget=new THREE.WebGLRenderTarget(window.innerWidth,window.innerHeight,renderTargetParametersRGB),passes.scene=new THREE.RenderPass(scene,pl.camera),passes.ssao=new THREE.ShaderPass(THREE.ShaderExtras.ssao),passes.ssao.uniforms.tDepth.value=depthTarget,passes.ssao.uniforms.size.value.set(window.innerWidth,window.innerHeight),passes.ssao.uniforms.cameraNear -.value=pl.camera.near,passes.ssao.uniforms.cameraFar.value=pl.camera.far,passes.ssao.uniforms.fogNear.value=scene.fog.near,passes.ssao.uniforms.fogFar.value=scene.fog.far,passes.ssao.uniforms.fogEnabled.value=0,passes.ssao.uniforms.aoClamp.value=.4,passes.ssao.uniforms.onlyAO.value=0,passes.fxaa=new THREE.ShaderPass(THREE.ShaderExtras.fxaa),passes.fxaa.uniforms.resolution.value.set(1/window.innerWidth,1/window.innerHeight),passes.bloom=new THREE.BloomPass(.5),passes.adjust=new THREE.ShaderPass(THREE.ShaderExtras -.hueSaturation),passes.adjust.uniforms.saturation.value=.2,composer=new THREE.EffectComposer(renderer,colorTarget),composer.addPass(passes.ssao),composer.addPass(passes.fxaa),composer.addPass(passes.bloom),composer.addPass(passes.adjust),composer.passes[composer.passes.length-1].renderToScreen=!0,depthPassPlugin=new THREE.DepthPassPlugin,depthPassPlugin.renderTarget=depthTarget,renderer.addPrePlugin(depthPassPlugin),CONFIG.resolution!=1&&onWindowResize(),resetLevel(),updateConfig(),dumpInfo(),initUI()}function resetLevel -(e){if(e=="[credits]"){window.location="credits.html";return}dungeon&&(e&&(window.location.hash="#level="+e),window.location.reload(!0)),lightManager=new LightManager({maxLights:CONFIG.maxLights,maxShadows:CONFIG.maxShadows}),animationManager=new AnimationManager,soundManager=new SoundManager,aiManager=new AIManager,dungeon=new Dungeon(scene,pl,e)}function savePlayerState(e){var t={hp:pl.hp,bulletsPerClip:pl.bulletsPerClip,bullets:pl.bullets,clips:pl.clips,ammoType:pl.ammoType};localStorage.setItem("campaingState-"+ -e,JSON.stringify(t))}function shoot(e,t,n,r,i){var s=dungeon.forks[dungeon.forkIndex];dungeon.forkIndex=(dungeon.forkIndex+1)%dungeon.forks.length,s.position.copy(e.matrixWorld.getPosition()),soundManager.playSpatial("shoot",s.position,20),s.matrixRotationWorld.extractRotation(e.matrixWorld),i&&s.matrixRotationWorld.rotateY(Math.PI),s.rotation.setEulerFromRotationMatrix(s.matrixRotationWorld),s.updateMatrix(),s.matrixRotationWorld.multiplyVector3(shootVector.set(0,0,1)),s.translateX(r.x),s.translateY(r.y),s. -translateZ(r.z),s.__dirtyPosition=!0,s.__dirtyRotation=!0;var o=e.parent instanceof THREE.Scene?e:e.parent;s.setLinearVelocity(shootVector.multiplyScalar(25).addSelf(o.getLinearVelocity())),s.damage=dungeon.forkTypes[t].damage,s.material=dungeon.forkTypes[t].material,s.faction=n,s.visible=!0}function reload(){if(pl.reloading||pl.bullets>=pl.bulletsPerClip)return;if(pl.clips<=0){displayMinorMessage("Out of ammo");return}pl.reloading=!0,window.setTimeout(function(){pl.bullets=pl.bulletsPerClip,--pl.clips,updateHUD -(),pl.reloading=!1,pl.rhand.material.materials[2]=pl.rhand.ammoGood,pl.rhand.materialNeedsUpdate=!0},2e3),soundManager.play("reload")}function mouseHandler(e){if(e==0&&pl.rhand&&pl.bullets<=0&&!pl.reloading)soundManager.play("shoot-dry"),reload();else if(e==0&&pl.rhand&&pl.bullets>0&&!pl.reloading)--pl.bullets,pl.bullets<=0&&(pl.rhand.material.materials[2]=pl.rhand.ammoOut,pl.rhand.materialNeedsUpdate=!0),shoot(pl.rhand,pl.ammoType,pl.faction,{x:0,y:.11,z:1},!0),updateHUD();else if(e==2){shootVector.set(0,0,1 -),projector.unprojectVector(shootVector,pl.camera);var t=new THREE.Ray(pl.camera.position,shootVector.subSelf(pl.camera.position).normalize()),n=t.intersectObjects(dungeon.objects);if(n.length>0){var r=n[0].object;r.position.distanceToSquared(pl.position)<9&&r.applyCentralImpulse(shootVector.multiplyScalar(1e4))}}}function animate(e){function t(e){return Math.abs(e-(e|0)-.5)*2}function n(e){return e-(e|0)}var r,i=new THREE.Vector3;animationManager.update(e);var s=(new Date).getTime();for(r=0;r1?new THREE.MeshFaceMaterial(t):t[0];return n.animation.type==="morph"?(e.computeMorphNormals(),r=new THREE.MorphAnimMesh(e,s),r.duration=n.animation.duration,r.time=r.duration*Math.random()):n.animation.type==="bones"&&(r=new THREE.SkinnedMesh(e,s),THREE.AnimationHandler.add(e.animation),r.animation=new THREE.Animation(r,"walk")),this.anims.push(r),r},AnimationManager.prototype.update=function(e){for(var t=0;t.05&&(i=.05),e.set(pl.camera.position.x,0,pl.camera.position.z),controls.update(i),t.set(pl -.camera.position.x,0,pl.camera.position.z),t.subSelf(e),t.divideScalar(i);var s=pl.getLinearVelocity().y;pl.setLinearVelocity({x:t.x,y:s<0?s:0,z:t.z}),scene.simulate(),controls.object.position.set(pl.position.x,pl.position.y+.5,pl.position.z),pl.rotation.copy(pl.camera.rotation),pl.__dirtyRotation=!0,animate(i),renderer.clear(),CONFIG.postprocessing?(renderer.shadowMapEnabled=CONFIG.shadows,depthPassPlugin.enabled=!0,renderer.render(scene,pl.camera,composer.renderTarget2,!0),CONFIG.showStats&&(rendererInfo.innerHTML= -n(renderer.info)),renderer.shadowMapEnabled=!1,depthPassPlugin.enabled=!1,composer.render(i)):(renderer.render(scene,pl.camera),CONFIG.showStats&&(rendererInfo.innerHTML=n(renderer.info))),CONFIG.showStats&&renderStats.update()}var e=new THREE.Vector3,t=new THREE.Vector3;init(),dungeon.ready(function(){window.setInterval(function(){lightManager.update(pl)},690),window.setInterval(function(){pl.dead||aiManager.process()},100),window.setInterval(function(){!pl.dead&&pl.hp<=0&&(pl.dead=!0,controls.active=!1,$("#deathscreen" -).is(":visible")||$("#deathscreen").fadeIn(500),$("#instructions").hide());var e=dungeon.getTriggerAt(pl.position);e&&e.type=="message"&&displayMessage(e.message),dungeon.isAtExit(pl.position)&&(savePlayerState(dungeon.level.next),resetLevel(dungeon.level.next))},45),r()})}); \ No newline at end of file +.findPath(s.position.x/r|0,s.position.z/r|0,pl.position.x/r|0,pl.position.z/r|0,dungeon.grid.clone());s.waypoints=[];for(n=0;nn?n:e}if(!this.mouseEnabled||!this.active)return;if(this.pointerLockEnabled){if(e.mozMovementX===0&&e.mozMovementY===0)return;this +.mouseX=e.movementX||e.webkitMovementX||e.mozMovementX||0,this.mouseY=e.movementY||e.webkitMovementY||e.mozMovementY||0,this.mouseX=t(this.mouseX*20,-600,600),this.mouseY=t(this.mouseY*20,-600,600)}else this.domElement===document?(this.mouseX=e.pageX-p,this.mouseY=e.pageY-d):(this.mouseX=e.pageX-this.domElement.offsetLeft-p,this.mouseY=e.pageY-this.domElement.offsetTop-d)},this.onKeyDown=function(e){switch(e.keyCode){case 38:case 87:u=!0;break;case 37:case 65:f=!0;break;case 40:case 83:a=!0;break;case 39:case 68 +:l=!0;break;case 82:reload();break;case 70:pl.shadow.visible=!pl.shadow.visible;break;case 123:screenshot(!0)}},this.onKeyUp=function(e){switch(e.keyCode){case 38:case 87:u=!1;break;case 37:case 65:f=!1;break;case 40:case 83:a=!1;break;case 39:case 68:l=!1}},this.update=function(e){if(!this.active)return;var t=e*this.movementSpeed,n=this.mouseEnabled?e*this.lookSpeed:0,p=this.object.position;if(this.pointerLockEnabled||this.mouseFallback&&this.mouseX*this.mouseX+this.mouseY*this.mouseY>5e3)i+=this.mouseX*n,this +.lookVertical&&(r-=this.mouseY*n);r=Math.max(-85,Math.min(85,r)),s=(90-r)*Math.PI/180,o=i*Math.PI/180,this.constrainVerticalLook&&(s=THREE.Math.mapLinear(s,0,Math.PI,this.verticalMin,this.verticalMax)),this.target.x=p.x+100*Math.sin(s)*Math.cos(o),this.target.y=p.y+100*Math.cos(s),this.target.z=p.z+100*Math.sin(s)*Math.sin(o),this.pointerLockEnabled&&(this.mouseX=0,this.mouseY=0),this.object.lookAt(this.target),u||this.autoForward&&!a?this.object.translateZ(-t):a&&this.object.translateZ(t),f?this.object.translateX +(-t):l&&this.object.translateX(t),c?this.object.translateY(t):h&&this.object.translateY(-t)},this.domElement.addEventListener("contextmenu",function(e){e.preventDefault()},!1),this.domElement.addEventListener("mousemove",v(this,this.onMouseMove),!1),this.domElement.addEventListener("mousedown",v(this,this.onMouseDown),!1),this.domElement.addEventListener("mouseup",v(this,this.onMouseUp),!1),this.domElement.addEventListener("keydown",v(this,this.onKeyDown),!1),this.domElement.addEventListener("keyup",v(this,this +.onKeyUp),!1),this.handleResize()}function Map(e,t,n){function o(t,n,r,i,s,u){var a=t.get(n,r);if(a!=i&&a!=u)return;a!=u&&(t.map[r*e+n]=s),o(t,n-1,r,i,s,u),o(t,n+1,r,i,s,u),o(t,n,r-1,i,s,u),o(t,n,r+1,i,s,u)}function u(e,t,n,r){var i=n-e,s=r-t;return i*i+s*s}this.map=new Array(e*t);if(n&&n.length&&n instanceof Array)for(var r=0;r=e||r<0||r>=t?i||null:this.map[r*e+n]},this.put= +function(n,r,i){if(n<0||n>=e||r<0||r>=t)return;this.map[r*e+n]=i},this.toJSON=function(){var n=new Array(t);for(var r=0;rs*s){if(this.map[(n|0)*e+(t|0)]==WALL)return!1;t+=a +,n+=f}return!0},this.getWalkableMatrix=function(){var n=new Array(t);for(var r=0;r=30);c=u1?new THREE.MeshFaceMaterial +(f):f[0];if(s.collision){var v=Physijs.createMaterial(d,.7,.2);if(s.collision=="plane")l=new Physijs.PlaneMesh(a,v,c);else if(s.collision=="box")l=new Physijs.BoxMesh(a,v,c);else if(s.collision=="sphere")l=new Physijs.SphereMesh(a,v,c);else if(s.collision=="cylinder")l=new Physijs.CylinderMesh(a,v,c);else if(s.collision=="cone")l=new Physijs.ConeMesh(a,v,c);else if(s.collision=="capsule")l=new Physijs.CapsuleMesh(a,v,c);else if(s.collision=="convex")l=new Physijs.ConvexMesh(a,v,c);else{if(s.collision!="concave" +)throw"Unsupported collision mesh type "+s.collision;l=new Physijs.ConcaveMesh(a,v,c)}r.objects.push(l)}else l=new THREE.Mesh(a,d);s.door&&(n.x=Math.floor(n.x)+.5,n.z=Math.floor(n.z)+.5),n.x*=t.gridSize,n.z*=t.gridSize,!n.y&&n.y!==0&&(n.y=.5*(a.boundingBox.max.y-a.boundingBox.min.y)+.001),l.position.copy(n),i&&(l.rotation.y=i/180*Math.PI),l.scale.set(h,h,h),!s.noShadows&&!s.animation&&(l.castShadow=!0,l.receiveShadow=!0),c===0&&!s.character&&(l.matrixAutoUpdate=!1,l.updateMatrix()),s.animation&&(l.visible=!1 +,l.geometry=u,l.mesh=animationManager.createAnimatedMesh(a,f,s),s.noShadows||(l.mesh.castShadow=!0,l.mesh.receiveShadow=!0),l.add(l.mesh)),s.character&&(s.character.hp&&(l.hp=s.character.hp),l.faction=s.character.faction||1,r.monsters.push(l)),s.item&&(l.items={},l.items[s.item.type]=s.item.value||1,l.itemName=s.name),l.addEventListener("collision",function(e,t,n){if(t.lengthSq()<1)return;e.damage&&s.sound&&soundManager.playSpatial(s.sound,e.position,10);if(this.dead)return;this.hp&&e.damage&&e.position.y>.3&& +this.faction!=e.faction&&(this.hp-=e.damage,e.damage=0,this.hp<=0&&(soundManager.playSpatial("robot-death",20),this.dead=!0,this.mesh&&(this.mesh.animate=!1),this.setAngularFactor({x:1,y:1,z:1}),this.setAngularVelocity({x:0,y:0,z:0}),this.setLinearVelocity({x:0,y:0,z:0}),this.mass=2e3,this.mesh?this.mesh.material=o:this.material=o))}),e.add(l),s.character&&s.collision&&l.setAngularFactor({x:0,y:1,z:0}),s.character&&(l.speed=s.character.speed);if(s.door){l.setAngularFactor({x:0,y:1,z:0});var m=l.position.clone +(),g=.5*(a.boundingBox.max.x-a.boundingBox.min.x)-.1;m.x-=Math.cos(l.rotation.y)*g,m.z+=Math.sin(l.rotation.y)*g;var y=new Physijs.HingeConstraint(l,m,new THREE.Vector3(0,1,0));e.addConstraint(y),y.setLimits(-Math.PI/2*.95+l.rotation.y,Math.PI/2*.95+l.rotation.y,.3,.01)}}}function l(n){typeof n=="string"&&(n=JSON.parse(n)),n.map instanceof Array&&(n.map=new Map(n.width,n.depth,n.map)),t.geometry.computeBoundingBox(),t.position.x=n.start[0]*n.gridSize,t.position.y=.5*(t.geometry.boundingBox.max.y-t.geometry.boundingBox +.min.y)+.001,t.position.z=n.start[1]*n.gridSize,n.startAngle&&controls.setYAngle(n.startAngle),cache.loadModel("assets/models/gun/gun.js",function(n,r){t.rhand=new Physijs.BoxMesh(n,new THREE.MeshFaceMaterial(r)),t.rhand.ammoGood=r[2].clone(),t.rhand.ammoOut=r[2].clone(),t.rhand.ammoOut.color.setRGB(.3,.1,.1),t.rhand.castShadow=!0,t.rhand.receiveShadow=!0,t.rhand.position.set(.4,.2,-1),t.add(t.rhand),e.add(t),t.setAngularFactor({x:0,y:0,z:0})},a+"gun"),cache.loadModel("assets/models/fork/fork.js",function(t, +n){r.forks=[],r.forkIndex=0,r.forkTypes={plain:{damage:5,material:n[0]},heated:{damage:8,material:n[0].clone()},plasma:{damage:20,material:n[0].clone()}},r.forkTypes.heated.material.ambient.setRGB(1,.3,.3),r.forkTypes.plasma.material.ambient.setRGB(1,.3,1);for(var i=0;i<40;++i){var s=new Physijs.BoxMesh(t,r.forkTypes.plain.material,100);s.damage=r.forkTypes.plain.damage,r.forks.push(s),s.visible=!1,s.scale.set(3,3,1),e.add(s),s.scale.set(1,1,1)}}),r.generateMesh(n),r.addLights(n),r.addObjects(n),r.addItems(n +),r.addMonsters(n),lightManager.update(pl),r.level=n,r.grid=new PF.Grid(n.width,n.depth,n.map.getWalkableMatrix()),r.pathFinder=new PF.AStarFinder({allowDiagonal:!0,dontCrossCorners:!0,heurestic:PF.Heuristic.euclidean}),r.onLoad?r.onLoad():r.onLoad=!0,n.title&&displayMessage(n.title)}var r=this;this.onLoad=null,this.objects=[],this.monsters=[],this.grid=null,this.pathFinder=null,this.level=null;var i=new THREE.MeshBasicMaterial({color:0}),s=new THREE.MeshBasicMaterial({color:16711935}),o=new THREE.MeshLambertMaterial +({color:2236962,ambient:2236962}),u=new THREE.Geometry,a="assets/models/";CONFIG.textureQuality===0?a="assets/models-256/":CONFIG.textureQuality==1&&(a="assets/models-512/"),this.generateMesh=function(t){var n=Math.sqrt(2),r=cache.getMaterial(t.materials.wall),s=assets.materials[t.materials.wall]||{},o=new THREE.Geometry,u=new THREE.Mesh,a,f,l,c,h,p,d,v,m,g,y,b;for(var w=0;w1?new THREE.MeshFaceMaterial(i):i[0],u=new Physijs.CylinderMesh(r,o,0);u.position.copy(t),u.rotation.y=n,u.matrixAutoUpdate=!1,u.updateMatrix(),e.add(u)}}e.add(new THREE.AmbientLight(4473924));var i=new THREE.Vector2,s=new THREE.Vector3;for(var o=0;o24){var h=window.atob(n);l(JSON.parse(h))}else $.get("assets/levels/"+n+".json",l);this.serialize=function(){return JSON.stringify(this.level)},this.ready=function(e){this.onLoad===!0?e():this.onLoad=e}}function initUI(){var e=document.getElementById("container");e.appendChild(renderer.domElement),renderStats=new Stats,renderStats.domElement.style.position="absolute" +,renderStats.domElement.style.bottom="0px",e.appendChild(renderStats.domElement),physicsStats=new Stats,physicsStats.domElement.style.position="absolute",physicsStats.domElement.style.bottom="0px",physicsStats.domElement.style.left="85px",e.appendChild(physicsStats.domElement),CONFIG.showStats||(renderStats.domElement.style.display="none",physicsStats.domElement.style.display="none"),rendererInfo=document.getElementById("renderer-info"),e.requestPointerLock=e.requestPointerLock||e.mozRequestPointerLock||e.webkitRequestPointerLock +,e.requestFullscreen=e.requestFullscreen||e.mozRequestFullscreen||e.mozRequestFullScreen||e.webkitRequestFullscreen,$(window).resize(onWindowResize),$(window).blur(pause),$(window).focus(resume),$("#instructions").click(function(){if(CONFIG.fullscreen||/Firefox/i.test(navigator.userAgent)){var t=function(n){if(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullscreenElement||document.mozFullScreenElement)document.removeEventListener("fullscreenchange",t),document.removeEventListener +("mozfullscreenchange",t),document.removeEventListener("webkitfullscreenchange",t),e.requestPointerLock()};document.addEventListener("fullscreenchange",t,!1),document.addEventListener("mozfullscreenchange",t,!1),document.addEventListener("webkitfullscreenchange",t,!1),e.requestFullscreen()}else e.requestPointerLock()}),document.addEventListener("pointerlockchange",onPointerLockChange,!1),document.addEventListener("webkitpointerlockchange",onPointerLockChange,!1),document.addEventListener("mozpointerlockchange" +,onPointerLockChange,!1),$("#instructions").show(),dat.GUI.TEXT_CLOSED="Close Options",dat.GUI.TEXT_OPEN="Options";var t=new dat.GUI;t.add(CONFIG,"fullscreen").onChange(updateConfig),t.add(CONFIG,"resolution",.1,1).step(.1).onChange(function(){updateConfig(),onWindowResize()}),t.add(CONFIG,"physicsFPS",30,100).step(10).onChange(updateConfig),t.add(CONFIG,"showStats").onChange(updateConfig),t.add(controls,"mouseFallback"),t.add(window,"editLevel");var n=t.addFolder("Audio");n.add(CONFIG,"sounds").onChange(updateConfig +),n.add(CONFIG,"music").onChange(function(){CONFIG.music?soundManager.playMusic("dark-ambiance-01"):soundManager.stopMusic(),updateConfig()});var r=t.addFolder("Renderer options (reload required)");r.add(CONFIG,"antialias").onChange(updateConfig),r.add(CONFIG,"physicalShading").onChange(updateConfig),r.add(CONFIG,"normalMapping").onChange(updateConfig),r.add(CONFIG,"specularMapping").onChange(updateConfig),r.add(CONFIG,"particles").onChange(updateConfig),r.add(window,"reload");var i=t.addFolder("Light and shadow" +);i.add(CONFIG,"maxLights",0,6).step(1).onChange(updateConfig),i.add(CONFIG,"maxShadows",0,6).step(1).onChange(updateConfig),i.add(CONFIG,"shadows").onChange(updateMaterials),i.add(CONFIG,"softShadows").onChange(updateMaterials);var s=t.addFolder("Texture options");s.add(CONFIG,"textureQuality",0,2).step(1).onChange(updateConfig),s.add(CONFIG,"anisotropy",1,renderer.getMaxAnisotropy()).step(1).onChange(updateTextures),s.add(CONFIG,"linearTextureFilter").onChange(updateTextures);var o=t.addFolder("Post-processing" +);o.add(CONFIG,"postprocessing").onChange(updateConfig),o.add(CONFIG,"SSAO").onChange(updateConfig),o.add(CONFIG,"FXAA").onChange(updateConfig),o.add(CONFIG,"bloom").onChange(updateConfig),t.close()}function updateHUD(){$("#health").html(pl.hp),$("#bullets").html(pl.bullets),$("#clips").html(pl.clips)}function displayMessage(e){var t=$("#message");messageTimer&&window.clearTimeout(messageTimer),t.is(":visible")&&t.stop(!0,!0).hide(),t.html(e).fadeIn(2e3),messageTimer=window.setTimeout(function(){t.fadeOut(5e3 +),messageTimer=null},3e3)}function displayMinorMessage(e){var t=$("#minor-messages");t.is(":visible")||t.html(""),t.stop(!0,!0),t.prepend(e+"
").show().fadeOut(5e3)}function editLevel(){var e="editor/index.html#level="+window.btoa(dungeon.serialize());window.open(e,"_blank")}function onWindowResize(){var e=CONFIG.resolution;pl.camera.aspect=window.innerWidth/window.innerHeight,pl.camera.updateProjectionMatrix(),renderer.setSize(window.innerWidth*e,window.innerHeight*e),colorTarget=new THREE.WebGLRenderTarget +(window.innerWidth*e,window.innerHeight*e,renderTargetParametersRGB),composer.reset(colorTarget),depthTarget=new THREE.WebGLRenderTarget(window.innerWidth*e,window.innerHeight*e,renderTargetParametersRGBA),depthPassPlugin.renderTarget=depthTarget,passes.ssao.uniforms.tDepth.value=depthTarget,passes.ssao.uniforms.size.value.set(window.innerWidth*e,window.innerHeight*e),passes.fxaa.uniforms.resolution.value.set(e/window.innerWidth,e/window.innerHeight),controls.handleResize()}function onPointerLockChange(){document +.pointerLockElement||document.mozPointerLockElement||document.webkitPointerLockElement?(controls.pointerLockEnabled=!0,$("#instructions").hide()):(controls.pointerLockEnabled=!1,pl.dead||$("#instructions").show())}function pause(){controls.active=!1}function resume(){controls.active=!0}function reload(){updateConfig(),window.location.reload()}function init(){scene=new Physijs.Scene({fixedTimeStep:1/CONFIG.physicsFPS}),scene.setGravity(new THREE.Vector3(0,-10,0)),scene.fog=new THREE.FogExp2(0,.05),scene.addEventListener +("update",function(){CONFIG.showStats&&physicsStats.update()}),pl=new Physijs.CapsuleMesh(new THREE.CylinderGeometry(.8,.8,2),new THREE.MeshBasicMaterial({color:16711935}),100),pl.visible=!1,pl.addEventListener("collision",function(e,t,n){if(this.dead)return;if(e.items){for(var r in e.items)pl[r]!==undefined&&(typeof e.items[r]=="number"?pl[r]+=e.items[r]:pl[r]=e.items[r]);soundManager.play("pick-up"),displayMinorMessage("Picked up "+e.itemName),updateHUD(),e.items=undefined,e.visible=!1,e.parent.remove(e)}e +.damage&&e.position.y>.3&&pl.faction!=e.faction&&(this.hp-=e.damage,updateHUD())});var e={};hashParams.level&&localStorage.getItem("campaingState-"+hashParams.level)?(e=JSON.parse(localStorage.getItem("campaingState-"+hashParams.level)),pl.hp=e.hp,pl.bulletsPerClip=e.bulletsPerClip,pl.bullets=e.bullets,pl.clips=e.clips,pl.ammoType=e.ammoType||"plain"):(pl.hp=100,pl.bulletsPerClip=15,pl.bullets=pl.bulletsPerClip,pl.clips=5,pl.ammoType="plain"),pl.reloading=!1,pl.faction=0,updateHUD(),pl.camera=new THREE.PerspectiveCamera +(60,window.innerWidth/window.innerHeight,.1,25),controls=new Controls(pl.camera,{mouse:mouseHandler}),controls.movementSpeed=10,controls.lookSpeed=.5,controls.lookVertical=!0,controls.constrainVerticalLook=!0,controls.verticalMin=1.1,controls.verticalMax=2.2,renderer=new THREE.WebGLRenderer({clearColor:0,maxLights:CONFIG.maxLights+2,antialias:CONFIG.antialias,preserveDrawingBuffer:!0}),renderer.setSize(window.innerWidth,window.innerHeight),renderer.shadowMapEnabled=CONFIG.shadows,renderer.shadowMapSoft=CONFIG +.softShadows,renderer.shadowMapDebug=!1,renderer.gammaInput=!0,renderer.gammaOutput=!0,renderer.physicallyBasedShading=CONFIG.physicalShading,renderer.autoClear=!1,CONFIG.anisotropy||(CONFIG.anisotropy=renderer.getMaxAnisotropy()),renderTargetParametersRGB={minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBFormat},renderTargetParametersRGBA={minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat},depthTarget=new THREE.WebGLRenderTarget(window.innerWidth,window +.innerHeight,renderTargetParametersRGBA),colorTarget=new THREE.WebGLRenderTarget(window.innerWidth,window.innerHeight,renderTargetParametersRGB),passes.scene=new THREE.RenderPass(scene,pl.camera),passes.ssao=new THREE.ShaderPass(THREE.ShaderExtras.ssao),passes.ssao.uniforms.tDepth.value=depthTarget,passes.ssao.uniforms.size.value.set(window.innerWidth,window.innerHeight),passes.ssao.uniforms.cameraNear.value=pl.camera.near,passes.ssao.uniforms.cameraFar.value=pl.camera.far,passes.ssao.uniforms.fogNear.value= +scene.fog.near,passes.ssao.uniforms.fogFar.value=scene.fog.far,passes.ssao.uniforms.fogEnabled.value=0,passes.ssao.uniforms.aoClamp.value=.4,passes.ssao.uniforms.onlyAO.value=0,passes.fxaa=new THREE.ShaderPass(THREE.ShaderExtras.fxaa),passes.fxaa.uniforms.resolution.value.set(1/window.innerWidth,1/window.innerHeight),passes.bloom=new THREE.BloomPass(.5),passes.adjust=new THREE.ShaderPass(THREE.ShaderExtras.hueSaturation),passes.adjust.uniforms.saturation.value=.2,composer=new THREE.EffectComposer(renderer,colorTarget +),composer.addPass(passes.ssao),composer.addPass(passes.fxaa),composer.addPass(passes.bloom),composer.addPass(passes.adjust),composer.passes[composer.passes.length-1].renderToScreen=!0,depthPassPlugin=new THREE.DepthPassPlugin,depthPassPlugin.renderTarget=depthTarget,renderer.addPrePlugin(depthPassPlugin),CONFIG.resolution!=1&&onWindowResize(),resetLevel(),updateConfig(),dumpInfo(),initUI()}function resetLevel(e){if(e=="[credits]"){window.location="credits.html";return}dungeon&&(e&&(window.location.hash="#level="+ +e),window.location.reload(!0)),lightManager=new LightManager({maxLights:CONFIG.maxLights,maxShadows:CONFIG.maxShadows}),animationManager=new AnimationManager,soundManager=new SoundManager,aiManager=new AIManager,dungeon=new Dungeon(scene,pl,e),CONFIG.music&&soundManager.playMusic("dark-ambiance-01")}function savePlayerState(e){var t={hp:pl.hp,bulletsPerClip:pl.bulletsPerClip,bullets:pl.bullets,clips:pl.clips,ammoType:pl.ammoType};localStorage.setItem("campaingState-"+e,JSON.stringify(t))}function shoot(e,t,n +,r,i){var s=dungeon.forks[dungeon.forkIndex];dungeon.forkIndex=(dungeon.forkIndex+1)%dungeon.forks.length,s.position.copy(e.matrixWorld.getPosition()),soundManager.playSpatial("shoot",s.position,20),s.matrixRotationWorld.extractRotation(e.matrixWorld),i&&s.matrixRotationWorld.rotateY(Math.PI),s.rotation.setEulerFromRotationMatrix(s.matrixRotationWorld),s.updateMatrix(),s.matrixRotationWorld.multiplyVector3(shootVector.set(0,0,1)),s.translateX(r.x),s.translateY(r.y),s.translateZ(r.z),s.__dirtyPosition=!0,s.__dirtyRotation=!0 +;var o=e.parent instanceof THREE.Scene?e:e.parent;s.setLinearVelocity(shootVector.multiplyScalar(25).addSelf(o.getLinearVelocity())),s.damage=dungeon.forkTypes[t].damage,s.material=dungeon.forkTypes[t].material,s.faction=n,s.visible=!0}function reload(){if(pl.reloading||pl.bullets>=pl.bulletsPerClip)return;if(pl.clips<=0){displayMinorMessage("Out of ammo");return}pl.reloading=!0,window.setTimeout(function(){pl.bullets=pl.bulletsPerClip,--pl.clips,updateHUD(),pl.reloading=!1,pl.rhand.material.materials[2]=pl. +rhand.ammoGood,pl.rhand.materialNeedsUpdate=!0},2e3),soundManager.play("reload")}function mouseHandler(e){if(e==0&&pl.rhand&&pl.bullets<=0&&!pl.reloading)soundManager.play("shoot-dry"),reload();else if(e==0&&pl.rhand&&pl.bullets>0&&!pl.reloading)--pl.bullets,pl.bullets<=0&&(pl.rhand.material.materials[2]=pl.rhand.ammoOut,pl.rhand.materialNeedsUpdate=!0),shoot(pl.rhand,pl.ammoType,pl.faction,{x:0,y:.11,z:1},!0),updateHUD();else if(e==2){shootVector.set(0,0,1),projector.unprojectVector(shootVector,pl.camera);var t=new +THREE.Ray(pl.camera.position,shootVector.subSelf(pl.camera.position).normalize()),n=t.intersectObjects(dungeon.objects);if(n.length>0){var r=n[0].object;r.position.distanceToSquared(pl.position)<9&&r.applyCentralImpulse(shootVector.multiplyScalar(1e4))}}}function animate(e){function t(e){return Math.abs(e-(e|0)-.5)*2}function n(e){return e-(e|0)}var r,i=new THREE.Vector3;animationManager.update(e);var s=(new Date).getTime();for(r=0;r1?new THREE.MeshFaceMaterial(t):t[0];return n.animation.type==="morph"?(e.computeMorphNormals(),r=new THREE.MorphAnimMesh(e,s),r.duration=n.animation.duration,r.time=r.duration*Math.random()):n.animation.type==="bones"&&(r=new THREE.SkinnedMesh(e,s),THREE.AnimationHandler.add(e.animation),r.animation=new THREE.Animation(r,"walk")),this.anims.push(r),r},AnimationManager.prototype.update=function(e){for(var t=0;t.05&&(i=.05),e.set(pl.camera.position.x,0,pl.camera.position.z),controls.update(i),t.set(pl.camera.position.x,0,pl.camera.position.z),t.subSelf +(e),t.divideScalar(i);var s=pl.getLinearVelocity().y;pl.setLinearVelocity({x:t.x,y:s<0?s:0,z:t.z}),scene.simulate(),controls.object.position.set(pl.position.x,pl.position.y+.5,pl.position.z),pl.rotation.copy(pl.camera.rotation),pl.__dirtyRotation=!0,animate(i),renderer.clear(),CONFIG.postprocessing?(renderer.shadowMapEnabled=CONFIG.shadows,depthPassPlugin.enabled=!0,renderer.render(scene,pl.camera,composer.renderTarget2,!0),CONFIG.showStats&&(rendererInfo.innerHTML=n(renderer.info)),renderer.shadowMapEnabled=!1 +,depthPassPlugin.enabled=!1,composer.render(i)):(renderer.render(scene,pl.camera),CONFIG.showStats&&(rendererInfo.innerHTML=n(renderer.info))),CONFIG.showStats&&renderStats.update()}var e=new THREE.Vector3,t=new THREE.Vector3;init(),dungeon.ready(function(){window.setInterval(function(){lightManager.update(pl)},690),window.setInterval(function(){pl.dead||aiManager.process()},100),window.setInterval(function(){!pl.dead&&pl.hp<=0&&(pl.dead=!0,controls.active=!1,$("#deathscreen").is(":visible")||$("#deathscreen" +).fadeIn(500),$("#instructions").hide());var e=dungeon.getTriggerAt(pl.position);e&&e.type=="message"&&displayMessage(e.message),dungeon.isAtExit(pl.position)&&(savePlayerState(dungeon.level.next),resetLevel(dungeon.level.next))},45),r()})}); \ No newline at end of file