// colorix-js by uja 12.9.07
// todo: Hilfetext

// Konstanten:
xmax=9; ymax=14; dx=24; dy=24; ofx=40; ofy=0; cmax=4;

// Variable:
var i,j,k,t,aktiv,punkte,punkte0,level,zeit,speedfac,rinvers;
var timrec1,timrec2,timetic=50,timecount;

// Strukturen:
var aktchip=new chip();
var liw=new Array();
var lis=new Array();
var f=new Array(); for (j=0; j<ymax; j++) f[j]=new Array();
var ima=new Array();
k=0; ima[k]=new Image(); ima[k].src='leer.gif'; k++;
for (i=0; i<cmax; i++) { ima[k]=new Image(); ima[k].src='blinker_'+i+'0.gif'; k++; } // 1-4
for (i=0; i<cmax; i++) { ima[k]=new Image(); ima[k].src='blinker_'+i+'1.gif'; k++; } // 5-8
for (i=0; i<cmax; i++) { ima[k]=new Image(); ima[k].src='single_'+i+'.gif'; k++; }   // 9-12
for (i=0; i<cmax; i++) { ima[k]=new Image(); ima[k].src='oben_'+i+'.gif'; k++; }     // 13-16
for (i=0; i<cmax; i++) { ima[k]=new Image(); ima[k].src='unten_'+i+'.gif'; k++; }    // 17-20
for (i=0; i<cmax; i++) { ima[k]=new Image(); ima[k].src='links_'+i+'.gif'; k++; }    // 21-24
for (i=0; i<cmax; i++) { ima[k]=new Image(); ima[k].src='rechts_'+i+'.gif'; k++; }   // 25-28
for (i=0; i<3; i++)    { ima[k]=new Image(); ima[k].src='bombe_'+i+'.gif'; k++; }    // 29-31
ima[k]=new Image(); ima[k].src='blocker.gif'; k++; // 32
// ======================================================================================================0
function neu(flag)
{ var i,j,k;
  if (timrec1) clearTimeout(timrec1);
  if (timrec2) clearTimeout(timrec2);
  if (flag) { level=0; punkte=0; }
  punkte0=punkte;
  k=ymax-level%4-3;
  for (j=0; j<k; j++) for (i=0; i<xmax; i++) f[i][j]=0;
  for (j=k; j<ymax; j++) for (i=0; i<xmax; i++) f[i][j]=Math.floor((cmax+1)*Math.random())%(cmax+1);
  do { k=elim4waa(); k=elim4senk(); } while (k==0);
  for (j=0; j<ymax; j++) for (i=0; i<xmax; i++) document.images['i_'+i+'_'+j].src=ima[f[i][j]].src;
  zeit=500;
  document.form1.level.value=level;
  document.form1.zeit.value=zeit;
  document.form1.punkte.value=punkte;
  neuer_chip(level);
  timecount=0;
  timrec1=setTimeout('zeitschleife()',timetic);
}

function elim4waa()
{ var i,j,k,last,sum;
  var ok=1;
  for (j=0; j<ymax; j++)
  { last=-1; sum=0;
    for (i=0; i<xmax; i++)
    if (f[i][j]>0) 
    { k=f[i][j];
      if (k==last) sum++; else { last=k; sum=1; }
      if (sum>3) { ok=0; f[i][j]=k+1; if (f[i][j]>cmax) f[i][j]=1; last=f[i][j]; sum=1; }
    }
    else { last=-1; sum=0; }
  }
  return ok;
}

function elim4senk()
{ var i,j,k,last,sum;
  var ok=1;
  for (i=0; i<xmax; i++)
  { last=-1; sum=0;
    for (j=0; j<ymax; j++)
    if (f[i][j]>0) 
    { k=f[i][j];
      if (k==last) sum++; else { last=k; sum=1; }
      if (sum>3) { ok=01; f[i][j]=k+1; if (f[i][j]>cmax) f[i][j]=1; last=f[i][j]; sum=1; }
    }
    else { last=-1; sum=0; }
  }
  return ok;
}

// 3 Bomben, Blocker, Farbkugel
function neuer_chip(nr)
{ var k=Math.floor(nr/4);
  rinvers=false;
  switch(k)
  { case 0: if (Math.random()<0.1) set_bombe(); else set_doppler(); break;
    case 1: if (Math.random()<0.1) set_blocker(); else set_doppler(); break; break;
    case 2: if (Math.random()<0.1) set_farbbombe(); else set_doppler(); break;
    case 3: if (Math.random()<0.3) rinvers=true; set_doppler(); break;
    case 4: if (Math.random()<0.1) set_bombe();
            else if  (Math.random()<0.1) set_blocker();
            else set_doppler();
            break;
    case 5: if (Math.random()<0.1) set_bombe();
            else if  (Math.random()<0.1) set_blocker();
            else set_doppler();
            if (Math.random()<0.3) rinvers=true;
            break;
    default:
            if (Math.random()<0.1) set_bombe();
            else if  (Math.random()<0.1) set_blocker();
            else if  (Math.random()<0.1) set_farbbombe();
            else set_doppler();
            if (Math.random()<0.3) rinvers=true;
  }
  aktchip.zeichne();
  if (overlap()) gameover(1); else aktiv=true;
}

function set_doppler()
{ speedfac=8;
  aktchip.init(0,Math.floor(cmax*Math.random())%cmax+1,Math.floor(cmax*Math.random())%cmax+1);
  aktchip.move_to(3,0);
}

function set_bombe() 
{ speedfac=4;
  aktchip.init(1,29+Math.floor(3*Math.random())%3,0);
  aktchip.move_to(4,0);
}

function set_blocker() 
{ speedfac=4;
  aktchip.init(1,32,0);
  aktchip.move_to(Math.floor(xmax*Math.random())%xmax,0);
}

function set_farbbombe()
{ speedfac=1;
  aktchip.init(1,Math.floor(cmax*Math.random())%cmax+1,0);
  aktchip.move_to(Math.floor(xmax*Math.random())%xmax,0);
}

// -----------------------------------------------------------------------------------------------------
function zeitschleife()
{ var k;
  if (aktiv)
  { if (timecount>199) timecount=0; // 10sek�ndlich resetten
    if (timecount%20==0) { if (zeit>0) zeit--; else gameover(0); document.form1.zeit.value=zeit; }
    k=timecount%speedfac;
    aktchip.yy=k*dy/speedfac;
    if (k==0) { if (platz_unten()) aktchip.move_to(aktchip.ix,aktchip.iy+1); else uebernehmen(); }
    else if (platz_unten()) aktchip.move_to(aktchip.ix,aktchip.iy);
    if (timecount<2) blinken();
    timecount++;
  }
  timrec1=setTimeout('zeitschleife()',timetic);
}

function gameover(watt)
{ if (timrec1) clearTimeout(timrec1);
  aktiv=false;
  switch(watt)
  { case 0: alert('Deine Zeit ist abgelaufen!'); break;
    case 1: alert('Dieser Stein hatte keinen Platz mehr!'); break;
    default: alert('mehr Levels hamma nich!');
  }
  eintrag('form1');
}

function blinken()
{ var i,j;
  for (j=0; j<ymax; j++) for (i=0; i<xmax; i++) if ((f[i][j]>0) && (f[i][j]<9))
  { if (f[i][j]>cmax) f[i][j]=f[i][j]-cmax; else f[i][j]=f[i][j]+cmax;
    document.images['i_'+i+'_'+j].src=ima[f[i][j]].src;
  }
}
// ===============================================================================
// Auswertung:
function uebernehmen()
{ var i,j,xx=aktchip.ix,yy=aktchip.iy;
  aktchip.move_to(2,-2);
  aktiv=false;
  punkte++;
  document.form1.punkte.value=punkte;
  if (xx>=0) if (xx>=0) switch(aktchip.trans)
  { case 0: f[xx][yy]=aktchip.patt[0][0]+20;
            f[xx+1][yy]=aktchip.patt[1][0]+24;
            document.images['i_'+xx+'_'+yy].src=ima[f[xx][yy]].src;
            document.images['i_'+(xx+1)+'_'+yy].src=ima[f[xx+1][yy]].src;
            vierer();
            break;
    case 1: f[xx][yy]=aktchip.patt[0][0]+12;
            f[xx][yy+1]=aktchip.patt[0][1]+16;
            document.images['i_'+xx+'_'+yy].src=ima[f[xx][yy]].src;
            document.images['i_'+xx+'_'+(yy+1)].src=ima[f[xx][yy+1]].src;
            vierer();
            break;
    default: switch(aktchip.patt[0][0]) // Sondersteine
            { case 29: if (yy<ymax-1) // schlappste Bombe: bombt unteren Stein weg
                       { f[xx][yy+1]=0;
                         document.images['i_'+xx+'_'+yy].src=ima[0].src;
                         brechen(xx,yy+1);
                       }
                       break;
              case 30: if (xx<xmax-1) // bombt Stein re und li weg
                       { f[xx+1][yy]=0;
                         document.images['i_'+(xx+1)+'_'+yy].src=ima[0].src;
                         brechen(xx+1,yy);
                       }
                       if (xx>0)
                       { f[xx-1][yy]=0;
                         document.images['i_'+(xx-1)+'_'+yy].src=ima[0].src;
                         brechen(xx-1,yy);
                       }
                       break;
              case 31: for (var j=yy-1; j<=yy+1; j++) if ((j>0) && (j<ymax))
                        for (var i=xx-1; i<=xx+1; i++) if ((i>0) && (i<xmax))
                        { f[i][j]=0;
                          document.images['i_'+i+'_'+j].src=ima[0].src;
                          brechen(i,j);
                        }
                        break;
              default: f[xx][yy]=aktchip.patt[0][0];
                       document.images['i_'+xx+'_'+yy].src=ima[f[xx][yy]].src;
                       vierer();
                       break;
            }
            sacken();
    }
}

// Check, ob Platz f�r Chip frei ist:
function platz_unten()
{ var frei=true;
  switch(aktchip.trans)
  { case 0: if (aktchip.iy+1>=ymax) frei=false;
            else if (f[aktchip.ix][aktchip.iy+1]>0) frei=false;
            else if (f[aktchip.ix+1][aktchip.iy+1]>0) frei=false;
            break;
    case 1: if (aktchip.iy+2>=ymax) frei=false; // senkrecht
            else if (f[aktchip.ix][aktchip.iy+2]>0) frei=false;
            break;
    default: if (aktchip.iy+1>=ymax) frei=false;  // 1dim
             else if (f[aktchip.ix][aktchip.iy+1]>0) frei=false;
  }
 return frei;
}
function platz_weiter_unten()
{ var frei=true;
  switch(aktchip.trans)
  { case 0: if (aktchip.iy+2>=ymax) frei=false;
            else if (f[aktchip.ix][aktchip.iy+2]>0) frei=false;
            else if (f[aktchip.ix+1][aktchip.iy+2]>0) frei=false;
            break;
    case 1: if (aktchip.iy+3>=ymax) frei=false; // senkrecht
            else if (f[aktchip.ix][aktchip.iy+3]>0) frei=false;
            break;
    default: if (aktchip.iy+2>=ymax) frei=false;  // 1dim
             else if (f[aktchip.ix][aktchip.iy+2]>0) frei=false;
  }
 return frei;
}

function platz_links()
{ var frei=true;
  if (aktchip.ix<1) frei=false;
  if (frei) if (f[aktchip.ix-1][aktchip.iy]>0) frei=false;
  if (frei) if (aktchip.trans==1) if (f[aktchip.ix-1][aktchip.iy+1]>0) frei=false;
  return frei;
}

function platz_rechts()
{ var frei=true;
  switch(aktchip.trans)
  { case 0: if (aktchip.ix>xmax-3) frei=false;
            else if (f[aktchip.ix+2][aktchip.iy]>0) frei=false;
            break;
    case 1: if (aktchip.ix>xmax-2) frei=false;
            else if (f[aktchip.ix+1][aktchip.iy]>0) frei=false;
            else if (f[aktchip.ix+1][aktchip.iy+1]>0) frei=false;
            break;
    default: if (aktchip.ix>xmax-2) frei=false;
            else if (f[aktchip.ix+1][aktchip.iy]>0) frei=false;
  }
  return frei;
}

function platz_dreh() 
{ var frei=0; // 0:nix, 1: ohne shift, 1.shiftup bei Waagerecht, 2:shift down bei senkrecht
  var xx=aktchip.ix,yy=aktchip.iy;
  if (aktchip.iy>=0)
  { if (aktchip.trans==0) { if (yy<ymax-1) { if (f[xx][yy+1]==0) frei=1; else if (f[xx+1][yy+1]==0) frei=2; } }
    else if (aktchip.trans==1)
    { if (xx<xmax-1) if (f[xx+1][yy]<1) frei=1;
      if (frei==0) if (xx>0) if (f[xx-1][yy]<1) frei=3;
    }
  }
  return frei;
}

function overlap()
{ var i,j;
  var olap=false;
  for (i=0; i<2; i++) for (j=0; j<2; j++) if (aktchip.patt[i][j]>0)
  { if (j+aktchip.iy>=ymax) olap=true;
    else if (i+aktchip.ix>=xmax) olap=true;
    else if (f[i+aktchip.ix][j+aktchip.iy]>0) olap=true;
  }
  return olap;
}

// === Beute machen ===============
function vierer()
{ var i,j,k,k0,last,sum;
  liw[0]=0;
  lis[0]=0;
  // waagerechte Vierer:
  for (j=0; j<ymax; j++)
  { sum=0; last=-1;
    for (i=0; i<xmax; i++)
    { if ((f[i][j]>0) && (f[i][j]<29)) // Steine und Teilsteine
      { k0=(f[i][j]-1)%4;
        if (k0!=last) { sum=1; last=k0; }
        else { sum++; if (sum>3) for (k=0; k<4; k++) add_liste(j*xmax+i-k,liw); }
      }
      else if (f[i][j]>31) // Einzelsteine
      { k0=f[i][j];
        if (k0!=last) { sum=1; last=k0; }
        else { sum++; if (sum>3) for (k=0; k<4; k++) add_liste(j*xmax+i-k,liw); }
      }
      else { sum=0; last=-1; } // L�cken
    }
  }
  // senkrechte Vierer
  for (i=0; i<xmax; i++)
  { sum=0; last=-1;
    for (j=0; j<ymax; j++)
    { if ((f[i][j]>0) && (f[i][j]<29))
      { k0=(f[i][j]-1)%4;
        if (k0!=last) { sum=1; last=k0; }
        else { sum++; if (sum>3) for (k=0; k<4; k++) add_liste((j-k)*xmax+i,lis); }
      }
      else if (f[i][j]>31) // Einzelsteine
      { k0=f[i][j];
        if (k0!=last) { sum=1; last=k0; }
        else { sum++; if (sum>3) for (k=0; k<4; k++) add_liste((j-k)*xmax+i,lis); }
      }
      else { sum=0; last=-1; }
    }
  }
  sum=liw[0]+lis[0];
  if (sum>3) { punkte=punkte+sum*sum; document.form1.punkte.value=punkte; loeschen(); } else neuer_chip(level);
}

// Loeschen der Vierer, Brechen der betroffenen Doppler zu Stein 9-12:
  function loeschen()
  { var i,j,kx,ky;
    if (liw[0]>0) for (i=1; i<=liw[0]; i++) 
    { kx=liw[i]%xmax; ky=(liw[i]-kx)/xmax;
      f[kx][ky]=0;
      brechen(kx,ky);
    }
    if (lis[0]>0) for (i=1; i<=lis[0]; i++)
    { kx=lis[i]%xmax; ky=(lis[i]-kx)/xmax;
      f[kx][ky]=0;
      brechen(kx,ky);
    }
    for (i=0; i<xmax; i++) for (j=0; j<ymax; j++) document.images['i_'+i+'_'+j].src=ima[f[i][j]].src;
    timrec2=setTimeout('sacken()',100);
  }
  function brechen(kx,ky)
  { if (ky>0) if ((f[kx][ky-1]>12) && (f[kx][ky-1]<17)) f[kx][ky-1]=f[kx][ky-1]-4;       // brechen oben
    if (ky<ymax-1) if ((f[kx][ky+1]>16) && (f[kx][ky+1]<21)) f[kx][ky+1]=f[kx][ky+1]-8;  // brechen unten
    if (kx>0) if ((f[kx-1][ky]>20) && (f[kx-1][ky]<25)) f[kx-1][ky]=f[kx-1][ky]-12;      // brechen links
    if (kx<xmax-1) if ((f[kx+1][ky]>24) && (f[kx+1][ky]<29)) f[kx+1][ky]=f[kx+1][ky]-16; // brechen links
  }

// Feld droppen: Doppler zusammenhalten
  function sacken()
  { var i,j,k,kx,ky;
    var weiter;
    do
    { weiter=false;
      for (i=0; i<xmax; i++) for (j=0; j<ymax-1; j++) if (f[i][j]>8)
      { if ((f[i][j]<13) || (f[i][j]>28)) // Einzelsteine abgesehen von Basis
        { if (f[i][j+1]==0)
          { weiter=true;
            f[i][j+1]=f[i][j];
            f[i][j]=0;
          }
        }
        else if ((f[i][j]>16) && (f[i][j]<21)) // unterer Stangenteil
        { if (f[i][j+1]==0) 
          { weiter=true;
            f[i][j+1]=f[i][j]; f[i][j]=f[i][j-1];
            f[i][j-1]=0;
          }
        }
        else if ((f[i][j]>20) && (f[i][j]<25)) // waagerechte Stange, linker Teil
        { if ((f[i][j+1]==0) && (f[i+1][j+1]==0))
          { weiter=true;
            f[i][j+1]=f[i][j]; f[i][j]=0;
            f[i+1][j+1]=f[i+1][j]; f[i+1][j]=0;
          }
        }
      }
    }
    while (weiter);
    for (i=0; i<xmax; i++) for (j=0; j<ymax; j++) document.images['i_'+i+'_'+j].src=ima[f[i][j]].src;
    if (levelende()) timrec2=setTimeout('levelup()',1000); else timrec2=setTimeout('vierer()',100);
  }


function levelende()
{ var i,j,k;
  var ende=true;
  for (i=0; i<xmax; i++) for (j=0; j<ymax; j++) if (f[i][j]>0) if (f[i][j]<9) ende=false;
  return ende;
}
function levelup() { punkte=punkte+10*zeit; document.form1.punkte.value=punkte; level++; neu(false); }


// ==========================================
// Key-Interface: abmarsch(charactercode)
function abmarsch(cc)
{ var xx=aktchip.ix,yy=aktchip.iy,yyy=aktchip.yy,k;
  if (rinvers) { if (cc==37) cc=39; else if (cc==39) cc=37; } // invers ab Level 15 
  if ((cc==37) && (aktchip.iy>=0))
  { if (aktchip.yy<dy/3) { if (platz_links()) { aktchip.yy=0; aktchip.move_to(aktchip.ix-1,aktchip.iy); } }
    else if (aktchip.yy>dy*2/3)
    { aktchip.iy++;
      if (platz_links()) { aktchip.yy=0; aktchip.move_to(aktchip.ix-1,aktchip.iy); }
      else aktchip.iy--;
    }
    else if (platz_links())
    { aktchip.iy++;
      if (platz_links()) aktchip.move_to(aktchip.ix-1,aktchip.iy-1); else aktchip.iy--; 
    }
  } 
  else if ((cc==38) && (aktchip.iy>=0))
  { if (aktchip.yy<dy/3) switch(platz_dreh())
    { case 1: aktchip.yy=0; aktchip.transform(); aktchip.zeichne(); break;
      case 2: aktchip.yy=0; aktchip.ix++; aktchip.transform(); aktchip.zeichne(); break;
      case 3: aktchip.yy=0; aktchip.ix--; aktchip.transform(); aktchip.zeichne(); break;
    }
    else if (aktchip.yy>dy*2/3) 
    { aktchip.iy++;
      switch(platz_dreh())
      { case 1: aktchip.yy=0; aktchip.transform(); aktchip.zeichne(); break;
        case 2: aktchip.yy=0; aktchip.ix++; aktchip.transform(); aktchip.zeichne(); break;
        case 3: aktchip.yy=0; aktchip.ix--; aktchip.transform(); aktchip.zeichne(); break;
        default: aktchip.iy--;
      }
    }
    else switch(platz_dreh())
    { case 1: aktchip.iy++; if (platz_dreh()>0) aktchip.transform(); aktchip.iy--; aktchip.zeichne(); break;
      case 2: aktchip.ix++; aktchip.iy++;
              if (platz_dreh()>0) aktchip.transform(); else aktchip.ix--; aktchip.iy--; aktchip.zeichne(); break;
    }
  }
  else if ((cc==39) && (aktchip.iy>=0))
  { if (aktchip.yy<dy/3) { if (platz_rechts()) { aktchip.yy=0; aktchip.move_to(aktchip.ix+1,aktchip.iy); } }
    else  if (aktchip.yy>dy*2/3)
    { aktchip.iy++;
      if (platz_rechts()) { aktchip.yy=0; aktchip.move_to(aktchip.ix+1,aktchip.iy); }
      else aktchip.iy--;
    }
    else if (platz_rechts())
    { aktchip.iy++;
      if (platz_rechts()) aktchip.move_to(aktchip.ix+1,aktchip.iy-1); else aktchip.iy--; 
    }
  } 
  else if (cc==40) speedfac=1;
}
function durchmarsch(cc) { abmarsch(cc); }


