// Doppeldrop by uja
// 20.08.03: Grafiken, Plan
// 12.02.04: Titel, Hintergrund, HTML-Grundbausteine
// 21.03.04: Mainloop
// 22.03.04: 1.spielbare Version, Joker, Bombe, Block, Highscoreanbindung, 10 Levels
// 23.03.04: Pfeile rauf und runter, weitere Steine (jetzt 12), 20 Levels
// 09.04.05: Option fuer doppelte Spielfeldgtoesse
// --------------------------------------------------------------------------------------------------------

var t=window.location.search;
mult=t.split("=",2);
mult=parseInt(mult[1]); 
if (isNaN(mult)) mult=1;
dx=mult*32; 
dy=mult*24;                        // Bildgröße
// ----------------------------------------------


maxlevels=24;
steineprolevel=50;
zeit=10; // Timer : noch nicht implementiert

xmax=8; ymax=16; zmax=xmax*ymax; // Playfieldgröße

mitte=Math.floor(ymax/2);
addup=new Array(0,0,0,5,7,10,25,50,100,200,500,1000);

bild=new Array('leer.gif','drot.gif','creme.gif','grau.gif','schwarz.gif','gruen.gif','rose.gif','lind.gif','bleu.gif',
               'gold.gif','weiss.gif','hbraun.gif','sandel.gif',
               'block.gif','geplatzt.gif','joker.gif','bombe.gif','rauf.gif','runter.gif','stern.gif');
block=13; geplatzt=block+1; joker=geplatzt+1; bombe=joker+1; rauf=bombe+1; runter=rauf+1; stern=runter+1;

// ---
var i,j,k,t,level=0,punkte,speed,anz,a_oben,a_unten,steinpos=0,count,aktiv=false;
var f=new Array(); 
var voro=new Array();
var voru=new Array();
var liste=new Array();
var liste2=new Array();
 
var ima=new Array(); for (i=0; i<bild.length; i++) { ima[i]=new Image(); ima[i].src=bild[i]; }
// ----------------------------------------------------------------------------------------------------------

function neu(flag)
{ var i,j,k,sh,start,ende;
  aktiv=false;
  if (flag)
  { level=0;
    punkte=0;
  }   
  count=0; 
  for (i=0; i<zmax; i++) f[i]=0;
  for (i=0; i<xmax; i++) loesche_steine(i);
  if (level==0)      { k=2; anz=4; sh=2; }
  else if (level==1) { k=3; anz=4; sh=1; }
  else if (level==2) { k=2; anz=5; sh=1; }
  else if (level==3) { k=3; anz=5; sh=2; }
  else if (level==4) { k=2; anz=6; sh=1; }
  else if (level==5) { k=3; anz=6; sh=2; }
  else if (level==6) { k=2; anz=7; sh=2; }
  else if (level==7) { k=3; anz=7; sh=2; }
  else if (level==8) { k=2; anz=8; sh=2; }
  else if (level==9) { k=3; anz=8; sh=2; }
  else if (level==10) { k=2; anz=9; sh=0; }
  else if (level==11) { k=3; anz=9; sh=2; }
  else if (level==12) { k=2; anz=10; sh=1; }
  else if (level==13) { k=3; anz=10; sh=3; }
  else if (level==14) { k=2; anz=11; sh=0; }
  else if (level==15) { k=3; anz=11; sh=4; }
  else if (level==16) { k=2; anz=12; sh=1; }
  else if (level==17) { k=3; anz=12; sh=5; }
  else if (level==18) { k=2; anz=13; sh=0; }
  else if (level==19) { k=3; anz=13; sh=6; }
  else                { anz=13+(level-20); k=4; if (anz%2>0) sh=2; else sh=1; }

  for (i=0; i<4; i++) 
  { voro[i]=Math.floor(anz*Math.random())%anz+1;
    voru[i]=Math.floor(anz*Math.random())%anz+1;
    if (voro[i]>block) voro[i]=block;
    if (voru[i]>block) voru[i]=block;
  }
  start=xmax*(mitte-k);
  ende=xmax*(mitte+k);
  for (i=start; i<ende; i++) if (Math.floor(i/xmax)%2==0) f[i]=i%anz+1; else f[i]=(i+sh)%anz+1;
  for (i=0; i<zmax; i++) { if (f[i]>block) f[i]=block; zeige_feld(i); }

  document.form1.level.value=level;
  document.form1.punkte.value=punkte;
  init_steine();
}  

function zeige_feld(nr)     { document.images['i'+nr].src=ima[f[nr]].src; }

function loesche_steine(nr)
{ document.images['o'+nr].src=ima[0].src;
  document.images['u'+nr].src=ima[0].src;
}

function move_steine(nr)   
{ if (aktiv)
  { loesche_steine(steinpos);
    document.images['o'+nr].src=ima[a_oben].src; 
    document.images['u'+nr].src=ima[a_unten].src;
    steinpos=nr;
  }
}

function init_steine()
{ count++;
  if (count>=steineprolevel) aufpunkten(0);
  else
  { steinpos=Math.floor(xmax*Math.random())%xmax;
    if (count<(steineprolevel-4)) 
    { voro[4]=Math.floor(anz*Math.random())%anz+1;
      voru[4]=Math.floor(anz*Math.random())%anz+1;
      if (voro[4]>block) voro[4]=block;
      if (voru[4]>block) voru[4]=block;
      if (level>3)
      { if (Math.random()<0.05) voro[4]=joker;  
        if (Math.random()<0.05) voru[4]=joker;  
        if (Math.random()<0.03) voro[4]=block;  
        if (Math.random()<0.03) voru[4]=block;  
      }
      if (level>5)
      { if (Math.random()<0.03) voro[4]=bombe;  
        if (Math.random()<0.03) voru[4]=bombe;  
      }
      if (level>7)
      { if (Math.random()<0.02) voro[4]=rauf;  
        if (Math.random()<0.02) voru[4]=rauf;  
      }
      if (level>9)
      { if (Math.random()<0.01) voro[4]=runter;  
        if (Math.random()<0.01) voru[4]=runter;  
      }
    } 
    else { voro[4]=0; voru[4]=0; }
    a_oben=voro[0];  
    a_unten=voru[0];
    for (var i=0; i<4; i++)
    { voro[i]=voro[i+1];
      voru[i]=voru[i+1]; 
      document.images['vo'+i].src=ima[voro[i]].src;
      document.images['vu'+i].src=ima[voru[i]].src;
    }
    aktiv=true;
    move_steine(steinpos);
  }
}
 
function klick(nr) { if (aktiv) { move_steine(nr); window.setTimeout('drop()',50); } }

function drop()
{ var i,k0,k1;
  aktiv=false;
  // check, ob Spalte frei ist, dann drop bis zur Mitte:
  k0=-1; for (i=ymax-1; i>=0; i--) if (f[i*xmax+steinpos]>0) k0=i;
  k1=-1; for (i=0; i<ymax; i++)    if (f[i*xmax+steinpos]>0) k1=i;
  if ((k0==0) || (k1==ymax-1))
  { if (k0==0) document.images['o'+steinpos].src=ima[geplatzt].src;
    if (k1==ymax-1) document.images['u'+steinpos].src=ima[geplatzt].src;
    window.setTimeout('gameover()',500);
  }
  else
  { if (k0<0) { k1=mitte; k0=k1-1; } else { k0--; k1++; }
    loesche_steine(steinpos);
    droppen(-1,k0,ymax,k1);
  }
}

function droppen(von0,bis0,von1,bis1)
{ var flag=false,platt=false,k,t;
  if (von0<bis0)
  { if (von0<0) k=steinpos; else { k=von0*xmax+steinpos; f[k]=0; zeige_feld(k); k=k+xmax; }  
    f[k]=a_oben;
    flag=true;
    zeige_feld(k);
  }
  if (von1>bis1)
  { if (von1>=ymax) k=(ymax-1)*xmax+steinpos; else { k=von1*xmax+steinpos; f[k]=0; zeige_feld(k); k=k-xmax; }
    f[k]=a_unten;
    flag=true;
    zeige_feld(k);
  }
  if (flag)
  { t='droppen('+(von0+1)+','+bis0+','+(von1-1)+','+bis1+')';
    window.setTimeout(t,50);
  }
  else
  { if (a_oben==joker)   { k=bis0*xmax+steinpos; f[k]=f[k+xmax]; zeige_feld(k); }
    if (a_unten==joker)  { k=bis1*xmax+steinpos; f[k]=f[k-xmax]; zeige_feld(k); }
    if (a_oben==bombe)   { k=bis0*xmax+steinpos; f[k]=f[k+xmax]; k=f[k]; if (k>0) weg_mit(k); }
    if (a_unten==bombe)  { k=bis1*xmax+steinpos; f[k]=f[k-xmax]; k=f[k]; if (k>0) weg_mit(k); }
    if (a_oben==rauf)    { f[bis0*xmax+steinpos]=0; if (spalte_rauf(steinpos)) platt=true; }
    if (a_unten==rauf)   { f[bis1*xmax+steinpos]=0; if (spalte_rauf(steinpos)) platt=true; }
    if (a_oben==runter)  { f[bis0*xmax+steinpos]=0; if (spalte_runter(steinpos)) platt=true; }
    if (a_unten==runter) { f[bis1*xmax+steinpos]=0; if (spalte_runter(steinpos)) platt=true; }
    if (platt) window.setTimeout('gameover()',500); else window.setTimeout('auswerten()',200);
  }
}
 
function weg_mit(farbe)
{ var i,j,k,add=0;
  for (i=0; i<zmax; i++) if (f[i]==farbe) 
  { punkte++;
    document.form1.punkte.value=punkte;
    f[i]=geplatzt; zeige_feld(i); 
    f[i]=0;
  }
  window.setTimeout('zusammenschieben(false)',100);
}

function spalte_rauf(nr) // returnt, ob Spalte anstößt
{ var i,k,over;
  over=(f[nr]>0);
  if (over) f[nr]=geplatzt;
  else for (i=0; i<ymax-1; i++) { k=i*xmax+nr; f[k]=f[k+xmax]; } f[(ymax-1)*xmax+nr]=0;
  for (i=0; i<ymax; i++) { k=i*xmax+nr; zeige_feld(k); }
  return over;
}

function spalte_runter(nr) // returnt, ob Spalte anstößt
{ var i,k,over;
  k=(ymax-1)*xmax+nr;
  over=(f[k]>0);
  if (over) f[k]=geplatzt;
  else for (i=ymax-1; i>0; i--) { k=i*xmax+nr; f[k]=f[k-xmax]; } f[nr]=0;
  for (i=0; i<ymax; i++) { k=i*xmax+nr; zeige_feld(k); }
  return over;
}

function kette(nr)
{ var i,j,k,k1,weiter=true;
  k=0; liste[0]=1; liste[1]=nr; k1=liste[0];
  while (weiter)
  { weiter=false;
    for (i=k+1; i<=k1; i++)
    { liste2[0]=0; get_nachbar(liste[i]);
      if (liste2[0]>0) { for (j=1; j<=liste2[0]; j++) add_liste(liste2[j],liste); weiter=true; }
    }
    k=k1;
    k1=liste[0];
  }
}

function get_nachbar(nr)
{ var i,x=nr%xmax,y=Math.floor(nr/xmax),z=f[nr];
  i=nr-1; if (x>0)        if (f[i]==z) if (!in_liste(i,liste)) add_liste(i,liste2); 
  i=nr+1; if (x<(xmax-1)) if (f[i]==z) if (!in_liste(i,liste)) add_liste(i,liste2); 
  i=nr-xmax; if (i>=0)    if (f[i]==z) if (!in_liste(i,liste)) add_liste(i,liste2); 
  i=nr+xmax; if (i<zmax)  if (f[i]==z) if (!in_liste(i,liste)) add_liste(i,liste2); 
}

function zusammenschieben(flag)
{ var i,j,k; var hl=new Array(); 
  for (i=0; i<xmax; i++)
  { hl[0]=0;
    for (j=mitte-1; j>=0; j--) { k=j*xmax+i; if (f[k]>0) { hl[0]++; hl[hl[0]]=f[k]; f[k]=0; } }
    k=mitte-1; if (hl[0]>0) for (j=1; j<=hl[0]; j++) { f[k*xmax+i]=hl[j]; k--; }
    hl[0]=0;
    for (j=mitte; j<ymax; j++) { k=j*xmax+i; if (f[k]>0) { hl[0]++; hl[hl[0]]=f[k]; f[k]=0; } }
    k=mitte; if (hl[0]>0) for (j=1; j<=hl[0]; j++) { f[k*xmax+i]=hl[j]; k++; }
    for (j=0; j<ymax; j++) zeige_feld(j*xmax+i);
  }
  if (flag) window.setTimeout('auswerten()',100);
}

function auswerten()
{ var i,j,k,weiter=false;
  for (i=0; i<zmax; i++) if ((f[i]>0) && (f[i]<block))
  { kette(i);
    if (liste[0]>2) 
    { weiter=true;
      punkte=punkte+addup[liste[0]];
      document.form1.punkte.value=punkte;
      for (j=1; j<=liste[0]; j++) { k=liste[j]; f[k]=0; zeige_feld(k); }
    }
  }
  if (weiter) window.setTimeout('zusammenschieben(true)',100); else init_steine();
}


function in_liste(e,l)  { var i,ok=false; if (l[0]>0) for (i=1; i<=l[0]; i++) if (e==l[i]) ok=true; return (ok); }
function add_liste(e,l) { if (!in_liste(e,l)) l[0]++; l[l[0]]=e; } 
function gameover()     { document.form1.punkte.value=punkte; document.form1.modus.value=1; document.form1.submit(); }
function hilfe(nr)      { var win2=window.open('hilfe.htm','popup','width=592,height=376,scrollbars=yes'); }
function show_hsc(nr)   { document.form1.modus.value=0; document.form1.submit(); }

// --- Levelende: ------------------------

function aufpunkten(nr)
{ if (f[nr]<1) 
  { punkte++;
    document.form1.punkte.value=punkte;
    document.images['i'+nr].src=ima[stern].src;
  }
  if (nr<(zmax-1)) { if (f[nr]==0) window.setTimeout('aufpunkten('+(nr+1)+')',50); else aufpunkten((nr+1)); }
  else window.setTimeout('levelende()',1500); 
}

function levelende()
{ level++;
  if (level>maxlevels) 
  { punkte=punkte+punkte;
    alert('Mehr Levels hamma nich!\nPunkteverdopplung!');
    gameover();
  }
  else neu(false);
}


