// game.js: alles, was unabhaengig von der Darstellung ist: Spielelogik

 var i,j,k,bombe,joker,frage,superbombe,farbbombe,medizinmann,pen,punkte=0,level=0,aktchip;
 var aktiv=false,cursorphase=true,timrec1;

 var f=new Array();
 var b=new Array();
 var v=new Array();
 var l=new Array();

function laden()
{ var i,wert=get_cookie('pattern2'); 
  if (wert.length>0) 
  { wert=wert.split(',');
    level=parseInt(wert[0]);
    punkte=parseInt(wert[1]);
    dropcount=parseInt(wert[2]);
    for (i=0; i<vgroesse; i++) 
    { v[i]=parseInt(wert[3+i]);
      if (i==0) v[0]=Math.abs(v[0]);
      if (v[i]>=0) zeige_vorrat(i,v[i]); else zeige_vorrat(i,frage);
    }
    k=vgroesse+3;
    for (i=0; i<zmax; i++)
    { f[i]=parseInt(wert[i+k]);
      b[i]=parseInt(wert[i+k+zmax]);
      zeige_boden(i,b[i]);
      zeige_zelle(i,f[i]);
    }
    zeige_dropcount();
    updat_level(level);
    updat_punkte(punkte);
    aktchip=v[0];
    aktiv=true;
  }
  else messia('kein Spiel gespeichert!');
}

function speichern() 
{ var i,coo=level+','+punkte+','+dropcount;
  for (i=0; i<v.length; i++) coo=coo+','+v[i];
  for (i=0; i<zmax; i++)     coo=coo+','+f[i];
  for (i=0; i<zmax; i++)     coo=coo+','+b[i];
  set_cookie('pattern2',coo);
  if (check_cookie()) messia('Spielstand gespeichert!'); else messia('Spielstand konnte nicht gespeichert werden!');
}


 function neu(flag)
 { var i;
   aktiv=false;
   if (flag) { punkte=0; level=0; }
   updat_level(level);
   normalrunde(level);
   for (i=0; i<vgroesse; i++) v[i]=0;
   for (i=0; i<vgroesse; i++) vorrat();
   for (i=0; i<zmax; i++) { zeige_boden(i,b[i]); zeige_zelle(i,f[i]); }
   dropcount=0;
   updat_punkte(punkte);
   zeige_dropcount(dropcount);
   aktiv=true;
 }

 function mach_bonusrunde(nr) { bonusflag=true; for (i=0; i<zmax; i++) f[i]=0; bonusrunde(nr); }

 function vorrat()
 { var i,k;
   for (i=0; i<vgroesse-1; i++) v[i]=v[i+1];
   v[vgroesse-1]=get_chip(level);
   if (v[0]<0) v[0]=-v[0]; // Fragezeichen
   aktchip=v[0];
   for (i=0; i<vgroesse; i++) if ((v[i]>=0) || (i==0)) zeige_vorrat(i,v[i]); else zeige_vorrat(i,frage);
 }

 function klick(nr)
 { var ix,iy;
   if (aktiv)
   { ix=nr%xmax;
     iy=Math.floor(nr/xmax);
     if (f[nr]>0)
     { if (aktchip==bombe) drop_bombe(nr);
       else if (aktchip==superbombe) drop_superbombe(ix,iy); 
     }
     else if (f[nr]==0)
     { if (aktchip==medizinmann) drop_medizinmann(iy);
       else if (aktchip>=pen) drop_pen(ix,iy); 
       else if (aktchip>=farbbombe) drop_farbbombe(nr);
       else if (aktchip<=joker) einpassen(ix,iy);
     }
   }
 }

function drop_it() { if (aktiv) { dropcount++; vorrat(); zeige_dropcount(dropcount); if (dropcount>3) gameover(); } }
function loesche_liste() { if (l[0]>0) for (var i=1; i<=l[0]; i++) { f[l[i]]=0; zeige_zelle(l[i],0); } }

 function drop_bombe(nr)  
 { if (aktiv) 
   { l=Array(1,nr);
     zeige_zelle(nr,superbombe);
     vorrat();
     setTimeout('loesche_liste()',100); // hier wait(100);
   }
 }

  function drop_superbombe(ix,iy)
  { if (aktiv)
    { var x0=ix-1; if (x0<0) x0=0;
      var y0=iy-1; if (y0<0) y0=0;
      var xn=ix+1; if (xn>=xmax) xn=xmax-1;
      var yn=iy+1; if (yn>=ymax) yn=ymax-1;
      var i,j;
      l[0]=0;
      for (i=x0; i<=xn; i++) for (j=y0; j<=yn; j++) { l[0]++; l[l[0]]=i+j*xmax; }
      for (i=1; i<=l[0]; i++)
      { j=l[i];
        zeige_zelle(j,superbombe);
      }
      vorrat();
      setTimeout('loesche_liste()',100); // hier wait(100);
    }
  }

  function drop_farbbombe(nr)
  {  var i,j,ncount=0;
     var ix=nr%xmax,iy=Math.floor(nr/xmax);
     var farbe=aktchip-farbbombe;
     { if (ix>0)      if (f[nr-1]>0) { if (farbe_passt(f[nr-1],farbe))    ncount++; else ncount=-99; }
       if (ix<xmax-1) if (f[nr+1]>0) { if (farbe_passt(f[nr+1],farbe))    ncount++; else ncount=-99; }
       if (iy>0)      if (f[nr-xmax]>0) { if (farbe_passt(f[nr-xmax],farbe)) ncount++; else ncount=-99; }
       if (iy<ymax-1) if (f[nr+xmax]>0) { if (farbe_passt(f[nr+xmax],farbe)) ncount++; else ncount=-99; }
     }
     if (ncount>0)
     { l[0]=0;
       for (i=0; i<zmax; i++) if (f[i]>0) if ((f[i]-1)%maxfarben==farbe) { l[0]++; l[l[0]]=i; }
       for (i=1; i<=l[0]; i++) { j=l[i]; zeige_zelle(j,farbbombe+farbe); }
       vorrat();
       setTimeout('loesche_liste()',100); // hier wait(100);
     }
  }

 function drop_pen(ix,iy)
 { var x0=ix-1; if (x0<0) x0=0;
    var y0=iy-1; if (y0<0) y0=0;
    var xn=ix+1; if (xn>=xmax) xn=xmax-1;
    var yn=iy+1; if (yn>=ymax) yn=ymax-1;
    var i,j,k;
    var patt,farbe=aktchip-pen;
    for (i=x0; i<=xn; i++) for (j=y0; j<=yn; j++) 
    { k=i+j*xmax;
      if (f[k]>0) if (f[k]<joker) f[k]=f[k]-((f[k]-1)%maxfarben)+farbe;
      zeige_zelle(k,f[k]);
    }
    vorrat();
 }

 function drop_medizinmann(reihe)
 { var i,j=xmax*reihe;
   for (i=0; i<xmax; i++) { f[i+j]=0; b[i+j]=2; zeige_boden(i+j,2); zeige_zelle(i+j,0); }
   punkte=punkte+10*xmax;
   updat_punkte(punkte);
   vorrat();
   if (check_ende()) levelup();

 }

// ------------------------------------------------------------
  function farbe_passt(nr,farbe) // Farbbombe einpasssen
  { if (nr<joker) return ((nr-1)%maxfarben==farbe);
    else if (nr==joker) return true;
    else if (nr==0) return true;
    else return false;
  }

  function passt(n1,n2)
  { var f1=-1,f2=-1,p1=-1,p2=-1;
    var pass=((n1==joker) || (n2==joker));
    if (!pass) pass=((n1==0) || (n2==0));
    if (!pass) 
    { f1=(n1-1)%maxfarben;
      f2=(n2-1)%maxfarben;
      p1=(n1-1-f1)/maxfarben;
      p2=(n2-1-f2)/maxfarben;
      pass=((f1==f2) || (p1==p2));
    }
    return pass;
  }

  function einpassen(cx,cy)
  { var ncount=0;
    var nr=cx+xmax*cy;
    var voll_x=-1,voll_y=-1;
    var mach_endcheck=false;
    if (aktiv)        // verhindern, dass Thread 2x laeuft
    { aktiv=false;
      if (f[nr]==0)
      { if (cx>0)      if (f[nr-1]>0) { if (passt(aktchip,f[nr-1])) ncount++; else ncount=-99; }
        if (cx<xmax-1) if (f[nr+1]>0) { if (passt(aktchip,f[nr+1])) ncount++; else ncount=-99; }
        if (cy>0)      if (f[nr-xmax]>0) { if (passt(aktchip,f[nr-xmax])) ncount++; else ncount=-99; }
        if (cy<ymax-1) if (f[nr+xmax]>0) { if (passt(aktchip,f[nr+xmax])) ncount++; else ncount=-99; }
      }
      if (ncount>0) // mindestens 1 nachbar
      { 
        f[nr]=aktchip;
        zeige_zelle(nr,aktchip);
        if (dropcount>0) { dropcount--; zeige_dropcount(dropcount); }
        punkte=punkte+ncount*ncount*5;
        if (reihe_voll(cy))  { voll_y=cy; mach_endcheck=true; }
        if (spalte_voll(cx)) { voll_x=cx; mach_endcheck=true; }
        if (voll_x>=0) loesche_spalte(voll_x);
        if (voll_y>=0) loesche_reihe(voll_y);
        vorrat();
      }
      updat_punkte(punkte);
      aktiv=true;
      if (mach_endcheck) if (check_ende()) levelup();
    }
  }

  function reihe_voll(nr)
  { var i,voll=true;
    for (i=0; i<xmax; i++) if (f[i+nr*xmax]<1) voll=false;
    return voll;
  }

  function spalte_voll(nr)
  { var i,voll=true;
    for (i=0; i<ymax; i++) if (f[nr+i*xmax]<1) voll=false;
    return voll;
  }

  function check_ende()
  { var i,is_ende=true;
    for (i=0; i<zmax; i++) if (is_ende) if (b[i]<2) is_ende=false; 
    return is_ende;
  }

  function loesche_spalte(nr)
  { var i,k;
    for (i=0; i<ymax; i++) { k=nr+i*xmax; f[k]=0; b[k]=2; zeige_boden(k,2); zeige_zelle(k,0); }
    punkte=punkte+10*ymax;
    updat_punkte(punkte);
  }

  function loesche_reihe(nr)
  { var i,k;
    for (i=0; i<xmax; i++) { k=i+nr*xmax; f[k]=0; b[k]=2; zeige_boden(k,2); zeige_zelle(k,0); }
    punkte=punkte+10*xmax;
    updat_punkte(punkte);
  }

  function levelup()  { level++; neu(false); }
  function gameover() { aktiv=false; eintrag('form1'); } // noch einzupassen an Handy

// ==================================================================================================

