<script src="http://koda.nu/simple.js">
var shots = [];//alla skott
var monster = [];//alla monster
var walls = [];//alla väggar
var upps = [];//alla powerUpps
var g;//jag gillar globala variablar
      //jag vet att det är dåligt
      //just denna hanterar karaktären
var toRad = Math.PI/180;//optimering
var toDeg = 180/Math.PI;//optimering
var score = 0;//huvudpoäng
var wallThiknes = (totalWidth+totalHeight)*0.03;//optimering för vägarnas tjoklek
var skriva =false;//för debugning
var pisSpeed = 3;//den borde inte vara här
var showStart = true;//vissa start
var showEnd = false;//viisa slut
  
//globbala ljud
var soundPistol = new Audio("http://scout.diavol.nu/pistol.wav");
var soundUzi = new Audio("http://scout.diavol.nu/uzi.wav");
var soundShotgun = new Audio("http://scout.diavol.nu/shotgun.wav");
var soundKill = new Audio("http://scout.diavol.nu/kill.wav");
var soundDie = new Audio("http://scout.diavol.nu/die.wav");
var soundBack = new Audio("http://scout.diavol.nu/back.wav");
//starta till att börja med
function start()
{
  //gömma muspekare för att sen visa sikte
  hideMouse();
  //starta backgrundsljudet
  soundBack.play();
  soundBack.loop=true;
  
  //skapa karaktären
  g = new guy(totalWidth/2, totalHeight/2, new weapon(3, 1));
  
  //bygga väggar
  walls.push(new wall(0, 0, 
                      0+wallThiknes, totalHeight, "black"));
  walls.push(new wall(totalWidth-wallThiknes, 0, 
                      totalWidth, totalHeight, "black"));
  walls.push(new wall(0, totalHeight/2, 
                      totalWidth/3, wallThiknes, "black"));
  walls.push(new wall(totalWidth*0.6, totalHeight/3, 
                      totalWidth, wallThiknes, "black"));
  walls.push(new wall(totalWidth*0.6, totalHeight*0.6, 
                      totalWidth, wallThiknes, "black"));
  walls.push(new wall(0, 0, 
                      totalWidth, 0+wallThiknes, "black"));
  walls.push(new wall(0, totalHeight-wallThiknes, 
                    totalWidth, wallThiknes, "black"));
  
  //första monstret
  addNewMonster();
  
  upps.push(new powerUpp(200, 200, 3, 200));
  
}

//powerUpps
function powerUpp(x, y, upp, ammo)
{
  this.x=x;
  this.y=y;
  this.upp=upp;
  this.ammo=ammo;
  this.draw = function()
  {
    if(this.upp==2)
    {
      picture(x, y, "http://scout.diavol.nu/shotgun.jpg");
    }
    else if(this.upp==3)
    {
      picture(x, y, "http://scout.diavol.nu/uzi.jpg");
    }
  }
  this.get = function(i)
  {
    if(this.upp==2 || this.upp==3)
    {
      console.log("g: "+g.weap.type+"  upp: "+this.upp);
      if(g.weap.type==this.upp)
      {
      //skriva=true;
        g.weap.ammo=g.weap.ammo+this.ammo;
      }
      else
      {
        g.weap=new weapon(this.upp, 1, this.ammo);
      }
    }
    upps.splice(i, 1);
  }
}
  
//alla vapen och des hantering
function weapon(type, owner, ammo)//1-pistol, 2-shutgun, 3-pepra; Owner=1->player
{
  this.type = type;  
  //hur mycket får du skuta
  this.ammo = 0;
  if(this.type==2)
  {
   this.ammo=20; 
  }
  else if(this.type==3)
  {
    this.ammo=100;
  }
  if(ammo!=undefined)
  {
    this.ammo=ammo;
  }
  //sjuthastighet i ticks
  this.coolLeft = 0;
  //rita kvarstående ammo
  this.draw = function()
  {
    if(owner==1)
    {
      if(this.type==1)
      {
        text(totalWidth*0.8, totalHeight*0.9, 30, "Ammo: over9000", "black");
      }
      else if(this.ammo<5)
      {
		text(totalWidth*0.8, totalHeight*0.9, 45, "Ammo: "+this.ammo, "red");
      }
      else if(this.ammo>4)
      {
        text(totalWidth*0.8, totalHeight*0.9, 15, "Ammo: "+this.ammo, "darkgreen");
      }
    }
  }
  //vad händer när någon sjuter
  this.shoot = function(x, y, mx, my, oG, collor)
  {
    //pistol
    if(this.type==1 && this.coolLeft==0)
    {
      //skott avfyras
      shots.push(new shot(x+30*Math.sin(oG*toRad), 
                        y-30*Math.cos(oG*toRad), 
                        mx, my, pisSpeed, owner));
      //ljudet
      soundPistol.play();
      //vapnet ska kylas av
      this.coolLeft=20;
    }
    //Shoygun
    else if(this.type==2 && this.coolLeft==0)
    {
      //tre skott med lite ovörutsägbara riktningar
      shots.push(new shot(x+30*Math.sin(oG*toRad), 
                        y-30*Math.cos(oG*toRad), 
                        mx, my, pisSpeed, owner));
      vi = vinkel(mx, my, x, y)-90;
      vi=vi+random(10)-5;
      shots.push(new shot(x+30*Math.sin(oG*toRad), 
                        y-30*Math.cos(oG*toRad), 
                        mx, my, pisSpeed, owner, vi));
      vi = vinkel(mx, my, x, y)-90;
      vi=vi+random(10)-5;
      shots.push(new shot(x+30*Math.sin(oG*toRad), 
                        y-30*Math.cos(oG*toRad), 
                        mx, my, pisSpeed, owner, vi));
      soundShotgun.play();
      //ammo minskar
      this.ammo--;
      //om den inte finns så ta fram pistolen
      if(this.ammo<1)
      {
       this.type=1; 
      }
      //30ticks kyla för shotgun
      this.coolLeft=30;
    }
    //uzi typ
    else if(this.type==3 && this.coolLeft==0)
    {
      shots.push(new shot(x+30*Math.sin(oG*toRad), 
                        y-30*Math.cos(oG*toRad), 
                        mx, my, pisSpeed, owner));
      soundUzi.play();
      this.ammo--;
      if(this.ammo<1)
      {
       this.type=1; 
      }
      //uzi 3 kyl-ticks
      this.coolLeft=3;
    }
  }
}
  
//alla väggar
function wall(x, y, width, height, collor)
{
  //för optimeringen veta var alla sidor finns
  this.top = y;
  this.left = x;
  this.bottom = y+height;
  this.reight = x+width;
  //rita ut väggen
  this.draw = function()
  {
    rectangle(x, y, width, height, collor);
  }
}
  
//skot hamnade i egen klass
//tror att skot fanns innan vapen så...
function shot(startX, startY, slutX, slutY, bulletSpeed, owner, vin)
{
  this.x = startX;
  this.y = startY;
  this.collor="blue";
  if(owner==1)
  {
    this.collor="green";
  }
  //viktigt att veta vem som sjuter
  this.owner = owner;//om 1 är karaktären
  //skottets bana styrs av vinkel mellan den som sjöt och var hen sjöt
  this.vi = vinkel(slutX, slutY, this.x, this.y)-90;
  //om det är shotgun så har vi redan räknat ut det
  if(vin!=undefined)
  {
    this.vi=vin;
  }
  //hur snabbt kan en kula åka?
  this.bulletSpeed= bulletSpeed;
  //rita kulan
  this.draw = function(i)
  {
    //rita ut cirkel
    circle(this.x, this.y, 3, this.collor);
    //hitta ny possition
    this.x=this.x+(Math.sin(this.vi*toRad)*bulletSpeed);
    this.y=this.y-(Math.cos(this.vi*toRad)*bulletSpeed);
    //kolla om vi har träffat på ett vägg
    var krock=false;
    for(var j=0;j<walls.length;j++)
    {
      w=walls[j];
      if(krockar(this.x, this.y, w.left, w.top, w.reight, w.bottom))
      {
        krock=true;
      }
    }
    //om vi har gjört det så finns inte kula kvar
    if(krock)
    {
      circle(this.x, this.y, 5, "darkRed");
      shots.splice(i, 1);
    }
    //kolla om kula träffade målet
    //först om det var kula sjuten av karaktären
    if(owner==1)
    {
      for(var i = 0; i<monster.length;i++)
      {
        m = monster[i];
        if(distance(this.x, this.y, m.x, m.y)<20)
        {
          //ljud är viktigt
          soundKill.play();
          //om fienden hade ett spec vapen får vi den
          if(monster[i].weap.type==2 || monster[i].weap.type==3)
          {
            upps.push(new powerUpp(monster[i].x, monster[i].y, 
                                  monster[i].weap.type, monster[i].weap.ammo));
          }
          monster.splice(i, 1);
          //poäng
          score++;
          circle(this.x, this.y, 5, "darkRed");
          //vi ska inte vara utan viender
          addNewMonster();
          //surprice!
          if(score%10==0)
          {
            addNewMonster() 
          }
        }
      }
    }
    //annars var det kula av fiender
    else
    {
      if(distance(this.x, this.y, g.x, g.y)<20)
        {
          //vi dog:(
          soundDie.play();
          showEnd=true;
          text(totalWidth/3, totalHeight/2, 80, score, "grey");
          circle(this.x, this.y, 5, "darkRed");
        }
    }
  }
}
  
//var tänkt för karaktären men skilnader mellan oss finns bara i våra huvuden
//får ett vapen, och jag orkade inte tänka ut ett bra namn
function guy(x, y, weap)
{
  this.x = x;
  this.y = y;
  //rör sig med tre pixlar per ticks
  this.speed = 3;
  this.weaponSpeed = 3;
  
  //var kollar den, borde kanske ha default värde =0?
  this.grader = 45;
  this.weap=weap;
  
  //rita porträt av saken med vapen
  this.draw = function()
  {
    this.weap.draw();
    //helt ärligt kopierat från läroboken
    //fortfarande rädd att använda det, 
    //men det var det enda som inte har buggat
    save();
  	translate(this.x, this.y);
    rotate(this.grader);
    rectangle(-3, -30, 6, 20, "black");//vapen
    circle(0, 0, 20, "gray");//kropp
    line(19, 0, 0, -20, 5, "pink");
    circle(-19, 0, 6, "green");
    circle(19, 0, 6, "pink");
    circle(0, -19, 6, "pink");
    //rectangle(-6, 19, 20, 6, "white");
    circle(0, 0, 14, "red");//hatten 
    circle(0, 0, 9, "darkred");//hatten toppen
    restore();
    //text(this.x-10, this.x-10, 10, "type "
    //     +this.weap.type+ " ammo: "+this.weap.ammo, "black");
    //väntar på att vapnet ska kylas av, känns som ett dåligt ställe
    if(this.weap.coolLeft!=0)
    {
      this.weap.coolLeft--;
    }
  }
  
  //java: @suppress warning: "unused"
  //jo, kanske
  this.fire = function()
  {
    save();
    translate(this.x, this.y);
    rotate(this.grader);
    rectangle(-8, -36, 16, 16, "orange");//fire
    rectangle(-5, -32, 9, 9, "yellow");//fire
    restore();
  };
  
}

//styr över antalet ticks
function update()
{
  if(showStart)
  {
    fill("black");
    text(totalWidth*0.2, totalHeight*0.2, 20, "Björnar mot andra björnar", "grey");
    text(totalWidth*0.2, totalHeight*0.3, 20, "Spel av Diavol @ Birdie 2016", "grey");
    text(totalWidth*0.2, totalHeight*0.4, 20, "Klicka för att starta", "grey");
    if(mouse.left)
    {
      showStart=false;
    }
  }
  else if(showEnd)
  {
    clearScreen();
    text(totalWidth*0.2, totalHeight*0.4, 50, "Your score: ", "grey");
    text(totalWidth*0.45, totalHeight*0.6, 80, score, "grey");
    text(totalWidth*0.2, totalHeight*0.8, 20, "Högerklicka för att starta om", "grey");
    text(totalWidth*0.1, totalHeight*0.9, 10, 
         "Musik/ljud från www.freesound.org", "grey");
    if(mouse.right)
    {
      shots = [];//alla skott
      monster = [];//alla monster
      walls = [];//alla väggar
      upps = [];//alla powerUpps
      start();
      score=0;
      showStart=true;
      showEnd=false;
    }
  }
  else{
  //töm skärmen
  clearScreen(); 
  
  //rita powerUpps
  for(var i = 0; i<upps.length;i++)
  {
    u = upps[i];
    u.draw();
  }
  
  //musposition
  x = mouse.x;
  y = mouse.y;
  
  
  //visa score
  text(totalWidth*0.9, totalHeight*0.2, 30, score, "blue");
  
  //debugging
  if(skriva)
  {
    text(totalWidth*0.9, totalHeight*0.3, 30, "dsjhfgjshdg", "blue");
  }
  
  
  
  //rita väggar
  for(var i = 0; i<walls.length;i++)
  {
    w = walls[i];
    w.draw();
  }
  //räkna var karaktären siktar
  g.grader = vinkel(g.x, g.y, x, y)+90;
  
  //räkna var monster kollar
  for(var i = 0; i<monster.length;i++)
  {
    m = monster[i];
    m.grader = vinkel(m.x, m.y, g.x, g.y)+90;
  }
  
  //processa monster
  for(var i = 0; i<monster.length;i++)
  {
    var m = monster[i];
    //nya positioner
    tmpX=m.x;
    tmpY=m.y;
    m.x = m.x+(random(5)-2);
    m.y = m.y+(random(5)-2);
    //kolla om de kråkar med väggar
    var krock=false;
    for(var j=0;j<walls.length;j++)
    {
      w=walls[j];
      if(krockar(m.x, m.y, w.left, w.top, w.reight, w.bottom))
      {
        krock=true;
      }
    }
    //om de krokar så straffas med att stå still över en ticks
    if(krock)
    {
      m.x=tmpX;
      m.y=tmpY;
    }
    //rita
    //text(m.x, m.y-50, 10, m.x+" : "+m.y, "black");
    m.draw();
  }
  
  //monster sjuter
  for(var i = 0; i<monster.length;i++)
  {
    var m = monster[i];
    //om de får
    if(m.weap.coolLeft==0)
    {
      m.grader = vinkel(m.x, m.y, g.x, g.y)+90;
      m.weap.shoot(m.x, m.y, g.x, g.y, m.grader);
    }
  }
  
  //rprocessa karaktären
  tmpX=g.x;
  tmpY=g.y;
  
  //ta reda på om hen vill röra på sig
  if(keyboard.up || keyboard.w)
  {
    g.y=g.y-g.speed;
  }
  if(keyboard.down || keyboard.s)
  {
    g.y=g.y+g.speed;
  }
  if(keyboard.left || keyboard.a)
  {
    g.x=g.x-g.speed;
  }
  if(keyboard.right || keyboard.d)
  {
    g.x=g.x+g.speed;
  }
  //krockar hen då?
  krock=false;
  for(var i=0;i<walls.length;i++)
  {
    w=walls[i];
    if(krockar(g.x, g.y, w.left, w.top, w.reight, w.bottom))
    {
      krock=true;
    }
  }
  //i så fall stå kvar
  if(krock)
  {
    g.x=tmpX;
    g.y=tmpY;
  }
  //rita ut
  g.draw();
  //kolla om powerUpps är nära
  for(var i = 0; i<upps.length;i++)
  {
    u = upps[i];
    if(distance(u.x, u.y, g.x, g.y)<40)
    {
      u.get(i);
    }
  }
  
  
  //hantera skott avfyrna av karaktären
  if(mouse.left)
  {
    g.weap.shoot(g.x, g.y, x, y, g.grader);
    g.fire();
  }
  
  //rita ut alla skott
  for(var i = 0; i < shots.length; i++)
  {
    shots[i].draw(i);
  }
  
  //sikte
  ring(x, y, 10, 1, "green");
  line(x-6, y-6, x+6, y+6, 1, "red");
  line(x+6, y-6, x-6, y+6, 1, "red");
}}
  
  
//mer monster, nya och starkare
function addNewMonster()
{
  //först om de får en fancy vapen
  vap=1;
  //sannolighet 1 på 5
  vapen = random(5);
  if(vapen==2)
  {
    vap=random(2)+2;
  }
  ettVapen = new weapon(vap, 2);
  //leta efter en ny possition
  tmpx=random(totalWidth*0.85)+totalWidth*0.05;
  tmpy=random(totalHeight*0.85)+totalHeight*0.05;
  temp=true;
  cont=true;
  while(cont || temp)
  {
    tmpx=ceil(random(totalWidth*0.90)+totalWidth*0.05);
    tmpy=ceil(random(totalHeight*0.90)+totalHeight*0.05);
    //inte spawna i väggar
    for(var j=0;j<walls.length;j++)
    {
      w=walls[j];
      temp=krockar(ceil(tmpx), ceil(tmpy), 
                   ceil(w.left), ceil(w.top), ceil(w.reight), ceil(w.bottom));
      if(temp)
      {
        break;
      }
    }
    //inte för nära spelare
    cont=distance(g.x, g.y, tmpx, tmpy)<100;
  }
  //ny monster färdig
  monster.push(new guy(tmpx, tmpy, ettVapen));
}
  
//snabb vinkel mellan två vektorer i grader
function vinkel(x1, y1, x2, y2)
{
  return Math.atan2(y2 - y1, x2 - x1) * toDeg;
}
  
//tyckte någon att vägen var mjuk? fel.
//först en metod med att kolla om en punkt beffinter sig emellan två andra
function emelan(min, p, max)
{
  result = false;
  if(min < max)
  {
    if(p > min && p < max)
    {
      result = true;
    }
  }
  if(min > max)
  {
    if(p > max && p < min)
    {
      result = true
    }
  }
  if(p == min || p == max)
  {
    result = true;
  }
  return result;
}

//om en punkt beffiner sig mellan 4 linjer
function krockar(x, y, left, top, right, bottom)
{
  result = false;
  if(emelan(ceil(left),ceil(x),ceil(right)) 
     && emelan(ceil(top),ceil(y),ceil(bottom)))
  {
    result = true;
  }
  //console.log("x "+x+" y "+y+" top "+top+" bottom "
  //            +bottom+" left "+left+" right "+right+" result "+result);
    
  return result;
}
</script>