Code viewer for World: Capture The Egg (clone by ...

// Cloned by Lorcan Dunne on 1 Dec 2022 from World "Capture The Egg (clone by Jon Bryan Ortiz)" by Jon Bryan Ortiz 
// Please leave this clone trail here.
 


// Cloned by Jon Bryan Ortiz on 28 Nov 2022 from World "Capture The Egg" by tuitef2 
// Please leave this clone trail here.
 
function World() 
{ 
    
    
    //config
    var pointsToWin = 11;
    
    //
    var cam;
    var meshFloor;
    var food_list = [];
    var keyboard = {};
    var distance;
    var updatedPosX;
    var updatedPosZ;
    var egg = [];
    var hasEgg = false;
    var play;
    var player_base;
    var ai_base;
    var AiFoodCount = 0;
    var playerFoodCount=0;
    var pspan;
    var pspan2;
    var Aspan;
    var Aspan1;
    var birdsView = false;
    var disFood;
    var botEgg = false;
    var eggSpawned = false;
    var playerEgg = false;
    var eggTimer = 10000;
    var aiCaptures = 1;
    var playerCaptures = 1;
    //Ai vars
    //camera
    //player
    var objLoader = new THREE.OBJLoader();
    objLoader.setPath("/uploads/tuitef2/");
    var mtlLoader = new THREE.MTLLoader();
    mtlLoader.setPath("/uploads/tuitef2/");
    
    var objLoader1 = new THREE.OBJLoader();
    objLoader1.setPath("/uploads/tuitef2/");
    var mtlLoader1 = new THREE.MTLLoader();
    mtlLoader1.setPath("/uploads/tuitef2/");
    
    var objLoader2 = new THREE.OBJLoader();
    objLoader2.setPath("/uploads/tuitef2/");
    var mtlLoader2 = new THREE.MTLLoader();
    mtlLoader2.setPath("/uploads/tuitef2/");
    
    var objLoader3 = new THREE.OBJLoader();
    objLoader3.setPath("/uploads/tuitef2/");
    var mtlLoader3 = new THREE.MTLLoader();
    mtlLoader3.setPath("/uploads/tuitef2/");
    
    var objLoader4 = new THREE.OBJLoader();
    objLoader4.setPath("/uploads/tuitef2/");
    var mtlLoader4 = new THREE.MTLLoader();
    mtlLoader4.setPath("/uploads/tuitef2/");
    var botSpeed = 0.3;
    var update_speed = 0.2;//
    var player = { height:2, speed:0.3, turnSpeed:0.09}; //to get player position get cam position

    
    var scene = new THREE.Scene(); //CREATE SCENE
    var sky_texture = new THREE.TextureLoader().load( 'uploads/tuitef2/skyyy.png' );
    scene.background = sky_texture;
    
    var renderer = new THREE.WebGLRenderer();
    
    function render(){
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);
    }
    
    function camera(){
        cam = new THREE.PerspectiveCamera(90, window.innerWidth/window.innerHeight, 0.1, 1000);
        cam.position.set(0, 3.5, -160); //position.x,position.y,position.z
        cam.lookAt(scene.position);
    }
    
    function create_player(){

        var geometry = new THREE.BoxGeometry( 1, 1, 1 );
        var material = new THREE.MeshBasicMaterial( {color: "#c91092"} );
        play = new THREE.Mesh( geometry, material );
        play.scale.multiplyScalar(2);
        play.position.set(0,player.height,-160);
        scene.add(play);
    }
    
    function ground(){
        var texture = new THREE.TextureLoader().load( 'uploads/tuitef2/ground_texture1.png' );
        
        texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
        texture.offset.set( 0, 0 );
        texture.repeat.set( 2, 2 );
        
        // immediately use the texture for material creation
        meshFloor = new THREE.Mesh(
        new THREE.PlaneGeometry(400,400), new THREE.MeshBasicMaterial({map:texture}));
        
        meshFloor.rotation.x -= Math.PI / 2; // Rotate the plane 90 degrees as if you don't do this it'll be like a tv screen.
        scene.add(meshFloor);
    }
    
    function tree_border(i){
        mtlLoader.load("PUSHILIN_forest.mtl", function(materials) {
            materials.preload();
            objLoader.setMaterials(materials);
            
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += i; 
            	    mesh.position.x += 180;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
             objLoader.load("PUSHILIN_forest.obj", function(mesh){//bottom
                    mesh.position.z += i; 
            	    mesh.position.x += -180;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
             objLoader.load("PUSHILIN_forest.obj", function(mesh){//right
                    mesh.position.z += 180; 
            	    mesh.position.x += i;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
              objLoader.load("PUSHILIN_forest.obj", function(mesh){//left
                    mesh.position.z += -180; 
            	    mesh.position.x += i;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            var light = new THREE.DirectionalLight( "#7fe093", 0.3 );
            light.position.set( 0, 1, 0 );
            scene.add( light );
        });
    }
    
    function place_trees(){
        mtlLoader.load("PUSHILIN_forest.mtl", function(materials) {
            materials.preload();
            objLoader.setMaterials(materials);
            
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 120; 
            	    mesh.position.x += 120;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 120; 
            	    mesh.position.x += -120;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 120; 
            	    mesh.position.x += -130;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 120; 
            	    mesh.position.x += 130;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
               
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 90; 
            	    mesh.position.x += 90;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 90; 
            	    mesh.position.x += -90;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 50; 
            	    mesh.position.x += -60;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 50; 
            	    mesh.position.x += 60;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 50; 
            	    mesh.position.x += 100;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 90; 
            	    mesh.position.x += -100;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
             objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 90; 
            	    mesh.position.x += 20;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
             objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 70; 
            	    mesh.position.x += -10;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += 60; 
            	    mesh.position.x += -20;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top//
                    mesh.position.z += -10; 
            	    mesh.position.x += -50;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
             objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top//
                    mesh.position.z += -10; 
            	    mesh.position.x += 50;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -120; 
            	    mesh.position.x += 120;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top -
                    mesh.position.z += -120; 
            	    mesh.position.x += -120;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -120; 
            	    mesh.position.x += -130;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -120; 
            	    mesh.position.x += 130;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
               
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -90; 
            	    mesh.position.x += 90;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -90; 
            	    mesh.position.x += -90;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -50; 
            	    mesh.position.x += -60;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -50; 
            	    mesh.position.x += 60;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -50; 
            	    mesh.position.x += 100;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -90; 
            	    mesh.position.x += -100;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
             objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -90; 
            	    mesh.position.x += 20;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
             objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -70; 
            	    mesh.position.x += -10;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
            objLoader.load("PUSHILIN_forest.obj", function(mesh){ //top
                    mesh.position.z += -60; 
            	    mesh.position.x += -20;
                    mesh.position.y+=5;
                    mesh.scale.multiplyScalar(15);
                    scene.add(mesh);
               });
        });
    }
    
    function base(){
        mtlLoader3.load("materials1.mtl", function(material) { //BUILDING FOR EGG
            material.preload();
            objLoader3.setMaterials(material);
            
            objLoader3.load("model-triangulated.obj", function(mesh){ //player base
                    mesh.position.y+=1;
                   // mesh.scale.multiplyScalar(5);
                    mesh.scale.set(15,5,5);
                    mesh.position.x += 0;
                    mesh.position.z += -160;
                    scene.add(mesh);
                    player_base = mesh;
                    
                    var light = new THREE.PointLight("#c91092", 5, 100 );
                    light.position.set(0, 2, -160 );
                    scene.add( light ); 
               });
            
            objLoader3.load("model-triangulated.obj", function(mesh){ //AI base
                    mesh.position.y+=1;
                    mesh.scale.set(15,5,5);
                    mesh.position.x += 0;
                    mesh.position.z += 160;
                    scene.add(mesh);
                    ai_base = mesh;
                    
                    var light = new THREE.PointLight("#1061a0", 5, 100 );
                    light.position.set(0, 2, 160 );
                    scene.add( light ); 
              });
        });
    }
    
    function place_structure(){
        mtlLoader1.load("01.mtl", function(m) { //BUILDING FOR EGG
            m.preload();
            objLoader1.setMaterials(m);
            
            objLoader1.load("01.obj", function(mesh){ //top
                    mesh.position.y+=2;
                    mesh.scale.set(0.5,0.5,0.5);
                    mesh.position.x += 20;
                    mesh.position.z +=20;
                    scene.add(mesh);
               });
               
        });
    }
    
    function place_egg(){
        mtlLoader2.load("tfx95.mtl", function(m) { //EGG place in middle
            m.preload();
            objLoader2.setMaterials(m);
            
            objLoader2.load("tfx95.obj", function(mesh){ //top
                    mesh.position.y+=2.3;
                    mesh.scale.set(1.8,1.8,1.8);
                    mesh.position.x += -2;
                    mesh.position.z += -12;
                    mesh.rotation.z += 2;
                    scene.add(mesh);
                    egg.push(mesh);
               });
            
            var light = new THREE.PointLight(0xff0000, 5, 150 );
            light.position.set(-2, 2, -12 );
            scene.add( light );
        });
    }
    var inBaseAi = false;
    var inBase = false;
    function eat_egg(){
            for(i=0;i<egg.length;i++){
                distance1 = Math.abs((parseInt(play.position.x)) - egg[i].position.x);
                distance2 =  Math.abs((parseInt(play.position.z)) - egg[i].position.z);
                if(distance1 <=2 && distance2 <= 2 && hasEgg !== true){
                    hasEgg = true;
                    playerEgg=true;
                }
                if(hasEgg === true && playerEgg === true && inBase === false){
                    egg[i].position.x = play.position.x+1.5;
                    egg[i].position.z = play.position.z+1.5;
                        playerPositionEgg()}
                }
            }
        function eat_eggAi(){
            for(i=0;i<egg.length;i++){
                distance1 = Math.abs((parseInt(ai.position.x)) - egg[i].position.x);
                distance2 =  Math.abs((parseInt(ai.position.z)) - egg[i].position.z);
                if(distance1 <=2 && distance2 <= 2 && hasEgg !== true){
                    hasEgg = true;
                    botEgg = true;
                }
                if(hasEgg === true && botEgg === true && inBaseAi === false){
                    egg[i].position.x = ai.position.x+1.5;
                    egg[i].position.z = ai.position.z+1.5;
                    aiPositionEgg();
                }
            }  
        }
    
    function hide_egg(){
        setTimeout(function() { //places egg after 50 seconds
            place_egg();
        }, 50000); //70000
    }
    function repositionEgg(){
        hasEgg = false;
        if(botEgg === true){
            aiCaptures++;
            botEgg = false;
        }
        else if(playerEgg === true){
            playerCaptures++;
            playerEgg = false;
        }
        setTimeout(function(){
            for(i=0;i<egg.length;i++){
                egg[i].position.x = -2;
                egg[i].position.z = -12;
                egg[i].position.y = 2;
                inBaseAi = false;
                botEgg = false;
                playerEgg = false;
                inBase = false;
                hasEgg = false;
            }
        },8000);
        //eat_eggAi();
        //eat_egg(); 
    }
    
    function playerPositionEgg(){//player position egg at base
        for(i=0;i<egg.length;i++){
            distance2BaseX = Math.abs((parseInt(updatedPosX)) - player_base.position.x);
            distance2BaseZ =  Math.abs((parseInt(updatedPosZ)) - player_base.position.z);
            if(distance2BaseX <=20 && distance2BaseZ <= 2){
                egg[i].position.x = player_base.position.x;
                egg[i].position.z = player_base.position.z;
                egg[i].position.y = 3.2;
                inBase = true;
                eggPlayer1.innerHTML = playerCaptures;
                repositionEgg(); 
                eat_egg();
                endRun();
            }
        }
    }
    function aiPositionEgg(){
         for(i=0;i<egg.length;i++){
            distance2BaseX = Math.abs((parseInt(ai.position.x)) - ai_base.position.x);
            distance2BaseZ =  Math.abs((parseInt(ai.position.z)) - ai_base.position.z);
            if(distance2BaseX <=20 && distance2BaseZ <= 2){
                egg[i].position.x = ai_base.position.x;
                egg[i].position.z = ai_base.position.z;
                egg[i].position.y = 3.2;
                inBaseAi = true;
                eggAi1.innerHTML = aiCaptures;
                repositionEgg();  
                eat_eggAi();
                endRun();
            }
        }
    }
    
    
    function food(){
        for (i=0; i < 8; i++){ //8 foods on plane
            mesh = new THREE.Mesh(
                    new THREE.SphereGeometry(1),
                    new THREE.MeshBasicMaterial({color:0xff4444}));
            mesh.position.z += AB.randomIntAtoB(-160,120); 
            mesh.position.x += AB.randomIntAtoB(-160,120);
            mesh.position.y += 2; // Move the mesh up 1 meter
            mesh.scale.multiplyScalar(1.5);
            scene.add(mesh);
            food_list.push(mesh);
        }
    }
    
    function food_color(){
        setTimeout(function() { //changes color of food after 5 seconds
            for(i = 0;i <food_list.length; i++){
                    food_list[i].material.color.set("#ffcc00"); //yellow color
            }
            food_positionChange();
        }, 6000);
    }
    
    function food_positionChange(){
        setTimeout(function() { //changes position of food after 5 seconds
             for(i = 0;i <food_list.length; i++){
                food_list[i].position.x = AB.randomIntAtoB(-160,120);
                food_list[i].position.z = AB.randomIntAtoB(-160,120);
                food_list[i].material.color.set(0xff4444);//red color
             }
             food_color();
        bestx = 999;
        bestz = 999;
        smallestDist = 999;
        closestFood(); 
        }, 10000);
    }
    
    function eat_food(){
        for(i = 0;i <food_list.length; i++){
            distanceX = Math.abs((parseInt(updatedPosX)) - food_list[i].position.x);
            distanceZ =  Math.abs((parseInt(updatedPosZ)) - food_list[i].position.z);
            if(distanceX <=2 && distanceZ <= 2 ){ //if player is close 
                food_list[i].position.x = AB.randomIntAtoB(-160,120);
                food_list[i].position.z = AB.randomIntAtoB(-160,120);//change the position of the item
                food_list[i].material.color.set(0xff4444); //red color
                playerFoodCount++;
                console.log(playerFoodCount++);
                player.speed += 0.01;
                pspan2.innerHTML = playerFoodCount;
                bestx = 999;
                bestz = 999;
                smallestDist = 999;
                
                closestFood();
            }
        
        }
    }
    function eat_foodAI(){
        for(i = 0;i <food_list.length; i++){
            distanceX = Math.abs((parseInt(ai.position.x)) - food_list[i].position.x);
            distanceZ =  Math.abs((parseInt(ai.position.z)) - food_list[i].position.z);
            if(distanceX <=2 && distanceZ <= 2 ){ //if player is close 
                food_list[i].position.x = AB.randomIntAtoB(-160,120);
                food_list[i].position.z = AB.randomIntAtoB(-160,120);//change the position of the item
                food_list[i].material.color.set(0xff4444); //red color
                AiFoodCount++;
                botSpeed += 0.02;
                Aspan.innerHTML = AiFoodCount;
                bestx = 999;
                bestz = 999;
                smallestDist = 999;
                
                closestFood();
            }
        }
    }       
    
    
    var bestx = 999;
    var bestz = 999;
    var smallestDist = 999;
    
    function closestFood(){
        var dX;
        var dZ;
        
        for(i=0;i<food_list.length;i++){
            dX =  (parseInt(ai.position.x)) - food_list[i].position.x;
            dZ =  (parseInt(ai.position.z)) - food_list[i].position.z;
            disFood = Math.sqrt(dX * dX + dZ*dZ);
            if (disFood < smallestDist){
                bestx = food_list[i].position.x;
                bestz = food_list[i].position.z;
                smallestDist = disFood;
            }
        }
    }
    

    function collisionDection(){
        var xdis = Math.abs(parseInt(play.position.x - ai.position.x));
        var zdis = Math.abs(parseInt(play.position.z - ai.position.z));
        var dis = Math.sqrt(xdis * xdis + zdis + zdis);
        
        if( xdis <= 2 && zdis <= 2){
            if(playerEgg === true){
                playerEgg = false;
                hasEgg = false;
                for(i=0;i<egg.length;i++){
                    egg[i].position.x = -2;
                    egg[i].position.z = -12;
                    egg[i].position.y = 2;}
                play.position.set(0,player.height,+160);
            }
        
            
            else if(botEgg === true){
                botEgg = false;
                hasEgg = false;
                for(i=0;i<egg.length;i++){
                    egg[i].position.x = -2;
                    egg[i].position.z = -12;
                    egg[i].position.y = 2;}
                ai.position.set(0,2,-160);
            }
            else if(playerFoodCount < AiFoodCount){
                play.position.set(0,player.height,-160);
            }
            else if(playerFoodCount > AiFoodCount){
                ai.position.set(0,2,160);
            }
    }
    }
    function movement(){
        if(playerCaptures ===pointsToWin ){
            return;
        }
        requestAnimationFrame(movement);
        collisionDection();
        setTimeout(function(){eggSpawned = true},20000);
        for (j = 0; j < food_list.length; j++){
            food_list[j].rotation.x += 0.01;
            food_list[j].rotation.y += 0.02;
        }
        
        for(i=0;i<egg.length;i++){
            egg[i].rotation.x += 0.01;
            egg[i].rotation.y += 0.02;
            eat_egg();
            eat_eggAi();
        }
       // ----mind movement --//
        var dPtoAiX =  parseInt(play.position.x) - parseInt(ai.position.x);
        var dPtoAiZ =  parseInt(play.position.z) - parseInt(ai.position.z);
        var disPlayer = Math.sqrt(dPtoAiX * dPtoAiX + dPtoAiZ * dPtoAiZ);
        var dir = AB.randomIntAtoB(0,3);
        
        //AI LOOKING FOR FOOD
        closestFood();
        
            if(playerEgg === true){
                AiMovePlay();
                }
            else{
                if(botEgg ===false){
                        if(AiFoodCount-10 >= playerFoodCount && inBaseAi === false){
                            getEgg();
                        }
                        else{
                        if(smallestDist < disPlayer){
                                foodMovement();
                            }
                            
                        else{
                            if(playerFoodCount + 1 > AiFoodCount){
                                foodMovement();
                                eat_foodAI(ai);}
                            else{
                                AiMovePlay();
                                closestFood();}
                        }
                
                }
                
            }else{
                    AiReturn();
                }
            }
        // Keyboard movement inputs
        
        if(keyboard[87]){ // W key
            if (play.position.x<= 200 && play.position.x>= -200){
                        play.position.x -= Math.sin(play.rotation.y) * player.speed;
                        play.position.z -= -Math.cos(play.rotation.y) * player.speed;
                        updatedPosX = play.position.x;
                        updatedPosZ = play.position.z;
                
                    }
                    else{
                        play.position.x += Math.sin(play.rotation.y) * player.speed;
                 
                    }
            if(play.position.z<= 200 && play.position.z>= -200){
                play.position.x -= Math.sin(play.rotation.y) * player.speed;
                play.position.z -= -Math.cos(play.rotation.y) * player.speed;
                updatedPosX = play.position.x;
                updatedPosZ = play.position.z;
                
            }
            else{
                play.position.z += -Math.cos(play.rotation.y) * player.speed;
                
            }
            eat_food();
        }
        if(keyboard[83]){ // S key
            if (play.position.x<= 200 && play.position.x>= -200){
                    play.position.x += Math.sin(play.rotation.y) * player.speed;
                    play.position.z += -Math.cos(play.rotation.y) * player.speed;
                    updatedPosX = play.position.x;
                    updatedPosZ = play.position.z;
            }
                else{
                    play.position.x -= Math.sin(play.rotation.y) * player.speed;
                    }
            if(play.position.z<= 200 && play.position.z>= -200){
                play.position.x += Math.sin(play.rotation.y) * player.speed;
                play.position.z += -Math.cos(play.rotation.y) * player.speed;
                updatedPosX = play.position.x;
                updatedPosZ = play.position.z;
            }
            else{
                play.position.z -= -Math.cos(play.rotation.y) * player.speed;
            }
            eat_food();
        }
    
        if(keyboard[65]){ // A key
                // Redirect motion by 90 degrees
            if (play.position.x <= 200 && play.position.x >= -200){
                    play.position.x += Math.sin(play.rotation.y + Math.PI/2) * player.speed;
                    play.position.z += -Math.cos(play.rotation.y + Math.PI/2) * player.speed;
                    updatedPosX = play.position.x;
                    updatedPosZ = play.position.z;
            }
                else{
                    play.position.x = Math.sin(play.rotation.y - Math.PI/2) * player.speed;
                    }
            if(play.position.z <= 200 && play.position.z >= -200){
                play.position.x += Math.sin(play.rotation.y + Math.PI/2) * player.speed;
                play.position.z += -Math.cos(play.rotation.y + Math.PI/2) * player.speed;
            }
            else{
                play.position.z = -Math.cos(play.rotation.y - Math.PI/2) * player.speed;
            }
            eat_food();
        }
        if(keyboard[68]){ // D key
            if (play.position.x<= 200 && play.position.x>= -200){
                    play.position.x += Math.sin(play.rotation.y - Math.PI/2) * player.speed;
                    play.position.z += -Math.cos(play.rotation.y - Math.PI/2) * player.speed;
                    updatedPosX = play.position.x;
                    updatedPosZ = play.position.z;
            }
                else{
                    play.position.x = Math.sin(play.rotation.y + Math.PI/2) * player.speed;
                    }
            if(play.position.z<= 200 && play.position.z>= -200){
                play.position.x += Math.sin(play.rotation.y - Math.PI/2) * player.speed;
                play.position.z += -Math.cos(play.rotation.y - Math.PI/2) * player.speed;
            }
            else{
                play.position.z = -Math.cos(play.rotation.y + Math.PI/2) * player.speed;
            }
            eat_food();
        }
                
        if(birdsView === false){    // Keyboard turn inputs// STOPS PLAYERS FROM USING ARROW KEYS WHEN IN SKY VIEW.
            if(keyboard[37]){ // left arrow key
                    cam.rotation.y -= player.turnSpeed;
                    play.rotation.y -= player.turnSpeed;
                    cam.position.z = play.position.z ;
            }
            if(keyboard[39]){ // right arrow key
                    cam.rotation.y += player.turnSpeed;
                    play.rotation.y += player.turnSpeed;
                    cam.position.z = play.position.z;
            }
            
        }
        cam.position.x = play.position.x ;
        cam.position.z = play.position.z -5;
    
        renderer.render(scene, cam);
    }
    
    
    function keyDown(event){
        keyboard[event.keyCode] = true;
    }
    
    function keyUp(event){
        keyboard[event.keyCode] = false;
    }
    window.addEventListener('keydown', keyDown); 
    window.addEventListener('keyup', keyUp);
    
    var ai;
     function createMind(){
        var geometry = new THREE.BoxGeometry( 1, 1, 1 );
        var material = new THREE.MeshBasicMaterial( {color: "blue"} );
        ai = new THREE.Mesh( geometry, material );
        ai.position.set(0,2,160);
        ai.scale.multiplyScalar(2);
        scene.add( ai );
     }
     
    ////// CAMERA STUFFS 
        function hud(event){
        pspan = document.getElementById("user_span1");
        pspan2 = document.getElementById("user_span2");
        pspan.innerHTML = "<br>Player food count: ";
        
        pspan.style.fontSize = '20px';
        pspan2.style.fontSize = '20px';
        
        Aspan1 = document.getElementById("user_span3");
        Aspan = document.getElementById("user_span4");
        Aspan1.innerHTML = "  AI food count: ";
        
        Aspan1.style.padding = '5px';
        Aspan1.style.fontSize = '20px';
        Aspan.style.fontSize = '20px';
        
        eggPlayer = document.getElementById("user_span5");
        eggPlayer.innerHTML = "<br><br>Player Egg Count:";
        eggPlayer1 = document.getElementById("user_span6");
        
        eggAi = document.getElementById("user_span7");
        eggAi.innerHTML = "AI Egg Count:";
        eggAi1 = document.getElementById("user_span8");
        
        eggPlayer.style.fontSize = 20;
        eggAi.style.fontSize = 20;
        
        let span = document.getElementById('api_span1');
        let span1 = document.getElementById('api_span2');
        var button = document.createElement("button");
        var button2 = document.createElement("button");
        let run = document.getElementById('w2m_runcontrols');
        run.innerHTML = "";
        
        span.innerHTML = 'Change view: ';

        button.style.background= '#ed8c0e';
        button.style.color = 'white';
        button.style.border = 'none';
        button.style.cursor = 'pointer';
        button.style.borderRadius = '3px';
        button.style.fontSize = '18';
        button.style.padding = '5px';
        
        
        button2.style.background = '#4CAF50';
        button2.style.color = 'white';
        button2.style.fontSize = '18';
        button2.style.border = 'none';
        button2.style.cursor = 'pointer';
        button2.style.borderRadius = '3px';
        button2.style.padding = '5px';
        
        
        button.innerHTML = "Third Person";
        button2.innerHTML = "Birds Eye";
        
        span.appendChild(button);
        span1.appendChild(button2);
        
        button.addEventListener("click", camView1);
        button2.addEventListener("click", camView2);
    }
    function camView1(){
        birdsView = false;
        cam.position.x = play.position.x ;
        cam.position.z = play.position.z -5;
        cam.position.y = 3.5;
        cam.rotation.y = 0;
        cam.rotation.z = -3.141592653589793;
        cam.rotation.x = -3.1197211417647925;
        play.rotation.x= 0;
        play.rotation.y= 0;
        play.rotation.z = 0;
    }
    function camView2(){
        birdsView = true;
        cam.position.x = play.position.x;
        cam.position.z = play.position.z + 20;
        cam.position.y = 60;
        cam.rotation.y = 0;
        cam.rotation.z = -3.141592653589793;
        cam.rotation.x = 29.5;
        play.rotation.x= 0;
        play.rotation.y= 0;
        play.rotation.z = 0;
        
    }
    //AI MOVESTUFF IS 
    function foodMovement(){
            if(ai.position.x < bestx){
                    ai.position.x += botSpeed;
                    eat_foodAI();
                    closestFood();
                }
                 if(ai.position.x > bestx){
                    ai.position.x -= botSpeed;
                    eat_foodAI();
                    closestFood();
                }
                
                if(ai.position.z < bestz){
                    ai.position.z += botSpeed;
                    eat_foodAI();
                    closestFood();
                }
                  if(ai.position.z > bestz){
                    ai.position.z -= botSpeed;
                    eat_foodAI();
                    closestFood();
                }
        
    }
    function AiMovePlay(){
                if (updatedPosX < ai.position.x){
                    ai.position.x -= botSpeed;
                }
                if (updatedPosX > ai.position.x){
                    ai.position.x += botSpeed;
                }
                
                if (updatedPosZ < ai.position.z){
                    ai.position.z -=botSpeed;
                }
                if (updatedPosZ > ai.position.z){
                    ai.position.z += botSpeed;
                }
                    
                
    }
    function getEgg(){
        for(i=0;i<egg.length;i++){
        var disXegg = parseInt(ai.position.x)-parseInt(play.position.x);
        var disZegg = parseInt(ai.position.z)-parseInt(play.position.z);
        var disPlayer = Math.sqrt(disXegg * disXegg + disZegg * disZegg)
        if( disPlayer < 10){
                if (play.position.z < ai.position.x){
                    ai.position.x += botSpeed;
                }
                if (play.position.x > ai.position.x){
                    ai.position.x -= botSpeed;
                }
                
                if (play.position.z < ai.position.z){
                    ai.position.z +=botSpeed;
                }
                if (play.position.z > ai.position.z){
                    ai.position.z -= botSpeed;
                }}
        else{
        if(egg[i].position.x <= ai.position.x){
            ai.position.x -= botSpeed;
        }
        if(egg[i].position.x >= ai.position.x){
            ai.position.x += botSpeed;
        }
        if(egg[i].position.z >= ai.position.z){
            ai.position.z += botSpeed;
        }
        if(egg[i].position.z <= ai.position.z){
            ai.position.z -= botSpeed;
        }
        }}
        }
    function AiReturn(){
        var dPtoAiX =  parseInt(play.position.x) - parseInt(ai.position.x);
        var dPtoAiZ =  parseInt(play.position.z) - parseInt(ai.position.z);
        var disPlayer = Math.sqrt(dPtoAiX * dPtoAiX + dPtoAiZ * dPtoAiZ);
        if( disPlayer < 10){
                if (play.position.z < ai.position.x){
                    ai.position.x += botSpeed;
                }
                if (play.position.x > ai.position.x){
                    ai.position.x -= botSpeed;
                }
                
                if (play.position.z < ai.position.z){
                    ai.position.z +=botSpeed;
                }
                if (play.position.z > ai.position.z){
                    ai.position.z -= botSpeed;
                }}
                
            if (ai_base.position.x > ai.position.x){
                    ai.position.x += botSpeed;
                }
                if (ai_base.position.x > ai.position.x){
                    ai.position.x -= botSpeed;
                }
                
                if (ai_base.position.z < ai.position.z){
                    ai.position.z -=botSpeed;
                }
                if (ai_base.position.z > ai.position.z){
                    ai.position.z += botSpeed;
                } 
        }
    function winner(){
         AB.newSplash();
         let splash = document.getElementById("splash-inner");
         let span = document.getElementById("splashbutton");
         span.innerHTML = "Restart";
         span.addEventListener("click", beginGame);
         var winmessage = document.createElement("p");
         winmessage.innerHTML = "<b><br>Congratulations! Winner<b>";
         splash.append(winmessage);
         
         winmessage.style.fontSize = "25px";
    }
    
    function loser(){
        AB.newSplash();
         let splash = document.getElementById("splash-inner");
         let span = document.getElementById("splashbutton");
         span.innerHTML = "Restart";
         span.addEventListener("click", beginGame);
         var winmessage = document.createElement("p");
         winmessage.innerHTML = "<br><b>Better luck next time..<b>";
         splash.append(winmessage);
         
         winmessage.style.fontSize = "25px";
    }
    
    function splash(){
        AB.newSplash();
        //AB.removeSplash();
        let span = document.getElementById("splashbutton");
        span.addEventListener("click", beginGame);
        
        let splash = document.getElementById("splash-inner");
        var h1 = document.createElement("p");
        h1.innerHTML = "How To Play!";
        splash.appendChild(h1);
        
        var p = document.createElement("p");
        var p1 = document.createElement("p");
        var h2 = document.createElement("p");
        
        p.innerHTML = "The objective of the game is to race to the centre of the map which hosts an egg item,<br> which must be returned to your base (pink) while also avoiding <br> the enemy who will be attempting to snatch it from you.<br><br><b>FUN TIP:</b> You can kill the enemy by touching it. However, you must have a greater number of food!";//"The objective of this game is to capture the egg found in the center of the map<br>and bring it back to your base(pink) without the enemy obtaining it back from you.<br> If you eat more food than the enemy, you're able to kill the enemy by touching it.";
        h2.innerHTML = "Controls";
        p1.innerHTML = "<b>W</b>: Forward <br><b>S</b>: Backwards<br><b> A</b>: Left <br><b>D</b>: Right <br> <b>Arrow key left</b>: Turns player to the left<br><b>Arrow key right</b> : Turns player to the right";
        splash.appendChild(p);
        splash.appendChild(h2);
        splash.appendChild(p1);
        
        h1.style.fontSize = "25px";
        h1.style.borderTop = "2px solid green";
        h1.style.paddingTop = "8px";
        
        h2.style.fontSize = "25px";
        h2.style.borderTop = "2px solid green";
        h2.style.paddingTop = "8px";
        
    }
 
    
    function beginGame(){
        AB.removeSplash();
        movement();
        food_color();
    }
	this.newRun = function()
	{   
	    splash();
		render();
		create_player();
        camera();
        hud();
        ground();
        //base();
        createMind();
        //food();
        //eat_food();
        //place_structure();
        //hide_egg();
        //eat_foodAI();
        //eat_eggAi();
        //eat_egg(); 
        //place_trees();
        
        for(i=-180;i<180;i++){
            if(i%22===0){
                tree_border(i);
            }
        }
        AB.showRunHeader(); 
        endRun();
    };
    function endRun(){
        if (playerCaptures === pointsToWin){
            winner();
        }
        else if(aiCaptures === pointsToWin){
            loser();
        }
    }

}