// Urwald II, Bäumchendrehen by uja
// -----------------------------------------------------------------------------
// 051025: voll spielbar mit Joker und Blocker
// 051026: Bonus 50, Code für Extrapunkte, Countermanipulation, Feldflippen
// 051104: 48 Levels, Abtrennung Javascript-Teil
// 051116: zugliste neu bestimmt, nun 60 Levels
// ----------------------------------------------------------------------------------------------------------------
dsize=get_winparam('dsize');
if (dsize=='') { if (screen.availWidth<800) dsize=32; else if (screen.availWidth<1025) dsize=40; else dsize=48; }

xmax=10; ymax=10; zmax=xmax*ymax; numfarben=15; 
bild=new Array('holz_1','holz_2','holz_3','holz_1b','holz_2b','holz_3b',
               'holz_1a','holz_2a','holz_3a','holz_1c','holz_2c','holz_3c',
               'joker_','block_');
joker=13; blocker=14; senk=blocker+1; sorten=3;

leer=new Image(); leer.src='leer.gif';
ima=new Array();
var i,k=0; for (i=0; i<bild.length; i++) 
{ ima[k]=new Image(); ima[k].src=bild[i]+'x.gif'; k++; 
  ima[k]=new Image(); ima[k].src=bild[i]+'y.gif'; k++; 
  ima[k]=new Image(); ima[k].src=bild[i]+'z.gif'; k++; 
  ima[k]=new Image(); ima[k].src=bild[i]+'w.gif'; k++; 
 
  ima[k]=new Image(); ima[k].src=bild[i]+'t.gif'; k++; 
  ima[k]=new Image(); ima[k].src=bild[i]+'u.gif'; k++; 
  ima[k]=new Image(); ima[k].src=bild[i]+'v.gif'; k++; 
  ima[k]=new Image(); ima[k].src=bild[i]+'s.gif'; k++; 
}
ima_c=new Array(); for (i=0; i<3; i++) { ima_c[i]=new Image(); ima_c[i].src='stern_'+i+'.gif'; }
var f=new Array();
var co=new Array(0,0,0);

// -----------------------------------------------------------------------------------------------------------
function mach_spielfeld()
{ var i,j,k=0,t='<table cellpadding=0 cellspacing=1 align=left ';
  t=t+'style="background-color:#223; background-image:url(wald_0.jpg); ';
  t=t+'border:1px #fc0 solid"><tr><td rowspan='+(ymax+2)+'><img src="leer.gif" width='+dsize+' height='+dsize+' border=0><\/td>';
  for (i=0; i<xmax; i++) t=t+'<td><img src="leer.gif" width='+dsize+' height='+dsize+' border=0><\/td>';
  t=t+'<td rowspan='+(ymax+2)+'><img src="leer.gif" width='+dsize+' height='+dsize+' border=0><\/td><\/tr>';
  for (j=0; j<ymax; j++)
  { t=t+'<tr>'
    for (i=0; i<xmax; i++)  
    { t=t+'<td><a href="javascript:drehe('+k+')"><img src="'+ima[k%ima.length].src+'" width='+dsize+' height='+dsize;
      t=t+' name="i'+k+'" border=0><\/td>';
      k++;
    }
    t=t+'</\tr>';
  }
  t=t+'<tr>';
  for (i=0; i<xmax; i++) 
   t=t+'<td><img src="leer.gif" width='+dsize+' height='+dsize+' border=0><\/td>';
  t=t+'<\/tr><\/table>';
  return t;
}


function zeige_feld(nr) // Farben auf waagerecht 0,1,2, senkrecht +senk - 8 Phasenbilder pro Farbe
{ if (f[nr]<=0) document.images['i'+nr].src=leer.src;
  else
  { var k=8*(f[nr]%senk)-8; // Feld isoliert
    if (f[nr]<senk) 
    { if (hat_nachbar(nr,1)) k=k+1;
      if (hat_nachbar(nr,3)) k=k+2;
    }
    else 
    { k=k+4;
      if (hat_nachbar(nr,0)) k=k+2;
      if (hat_nachbar(nr,2)) k=k+1;
    }
    document.images['i'+nr].src=ima[k].src; 
  }
}

function zeige_code(code)
{ for (var i=0; i<3; i++)
  if (code[i]<1) document.images['ic'+i].src=leer.src;
  else document.images['ic'+i].src=ima_c[code[i]-1].src;
}
// --------------------------------------------------------------------------------------------------------------

function passt(ri,n1,n2)
{ var ok=((n1>=0) && (n2>=0));                  // Plätze besetzt
  if (ok)
  { ok=((n1%senk==joker) || (n2%senk==joker));  // Joker abhandeln
    if (!ok) if ((n1%senk<joker) && (n2%senk<joker)) ok=(n1%sorten==n2%sorten); // Reduktion auf Grundfarben
    if (!ok) ok=(n1==n2); // Blockerpatch
  }
  if (ok) ok=(((n1<senk) && (n2<senk)) || ((n1>=senk) && (n2>=senk))); // gleiche Richtung
  if (ok) // Blocker in Reihe:
  { if (n1==blocker) if (ri%2<1) ok=false;
    if (n2==blocker) if (ri%2<1) ok=false;
    if (n1==blocker+senk) if (ri%2>0) ok=false;
    if (n2==blocker+senk) if (ri%2>0) ok=false;
  }
  return ok;
}

function hat_nachbar(nr,ri)
{ var hat,n1;
  switch(ri)
  { case 0: n1=nr-xmax; hat=(n1>=0);     break;
    case 1: n1=nr+1;    hat=(n1%xmax>0); break;
    case 2: n1=nr+xmax; hat=(n1<zmax);   break;
    case 3: n1=nr-1;    hat=(nr%xmax>0); break;
  }
  if (hat) hat=passt(ri,f[nr],f[n1]);
  return hat;
}

function zug_nachbar(nr,ri)
{ var hat,n1,f0,f1,f2,f3;
  switch(ri)
  { case 0: n1=nr-xmax; hat=(n1>=0);     break;
    case 1: n1=nr+1;    hat=(n1%xmax>0); break;
    case 2: n1=nr+xmax; hat=(n1<zmax);   break;
    case 3: n1=nr-1;    hat=(nr%xmax>0); break;
  }
  if (hat) 
  { f0=f[nr]%senk; f2=f0+senk; if (f0==blocker) { f0=f[nr]; f2=f0; }
    f1=f[n1]%senk; f3=f1+senk; if (f1==blocker) { f1=f[n1]; f3=f1; }
    if (ri%2>0) hat=passt(ri,f0,f1); else hat=passt(ri,f2,f3); 
  }
  return hat;
}

function zug() // noch auf Blocker reagieren
{ var i,k=-1;
  for (i=0; i<zmax; i++) if (f[i]>0) if (k<0) 
  { if ((zug_nachbar(i,0)) && (zug_nachbar(i,2))) k=i; 
    if (k<0) if ((zug_nachbar(i,1)) && (zug_nachbar(i,3))) k=i; 
  }
  return k;
}
// --------------------------------------------------------------------------------

function drehe(nr)
{ var i,jy0,y1,x0,x1;
  if ((f[nr]>0) && (f[nr]%senk!=blocker))
  { aktiv=false;
    if (f[nr]<senk) f[nr]=f[nr]+senk; else f[nr]=f[nr]-senk;
    x0=nr%xmax; x1=x0; y0=(nr-x0)/xmax; y1=y0;
    if (x0>0) x0--; if (x1<xmax-1) x1++;
    if (y0>0) y0--; if (y1<ymax-1) y1++;
    for (i=x0; i<=x1; i++) for (j=y0; j<=y1; j++) zeige_feld(i+xmax*j);
    auswerten(true);
  }
}

function auswerten(flag) // triplets finden, Punkte gutschreiben (Goodies!), Triplets entfernen, nachsacken lassen (Loch!)
{ var i,j,k,t,padd=0;
  liste[0]=0;
  for (i=0; i<zmax; i++) if (f[i]>0)
  { if (f[i]<senk) 
    { if ((hat_nachbar(i,1)) && (hat_nachbar(i,3))) 
      { add_liste(i,liste);
        add_liste(i-1,liste);
        add_liste(i+1,liste);
      }
    }
    else
    { if ((hat_nachbar(i,0)) && (hat_nachbar(i,2))) 
      { add_liste(i,liste);
        add_liste(i-xmax,liste);
        add_liste(i+xmax,liste);
      }
    }
  }
  // --------------------------------
  if (liste[0]>0)
  { if (flag)
    { count--; updat_count(count);
      padd=5;
      if (liste[0]>3) for (i=4; i<=liste[0]; i++) padd=padd+padd;
      if (bonus_on) for (i=1; i<=liste[0]; i++) if (f[liste[i]]%senk>3) if (f[liste[i]]%senk<joker) 
      { padd=padd+50; // Bonus 
        if (code_on) code_auswerten(f[liste[i]]%senk);
      }
      if (blocker_on) for (i=1; i<=liste[0]; i++) if (f[liste[i]]%senk==blocker) padd=padd+100; // Blockerbonus
      punkte=punkte+padd;
      updat_punkte(punkte); 
      for (i=1; i<=liste[0]; i++) { f[liste[i]]=0; zeige_feld(liste[i]); }
      if (feld_flippen) flippe_feld();
      timrec2=setTimeout('droppen(true)',100);
    }
    else { for (i=1; i<=liste[0]; i++) f[liste[i]]=0; droppen(flag); }
  }
  else 
  { if (count<=0) 
    { if (punkte<pmin) { alert('Zuwenig Punkte!'); gameover(); }
      else { level++; alert('Level '+level+' geschafft!'); neu(false); }
    }
    else 
    { k=zug();
      if ((k>=0) && (k<zmax) && (f[k]>=0)) aktiv=true; 
      else { alert('Sorry, kein Tripel mehr zu bekommen!'); gameover(); }
    }
  }
}

function droppen(flag)
{ var i,j,sptr;
  var spalte=new Array();
  for (i=0; i<xmax; i++)
  { sptr=0; for (j=0; j<ymax; j++) if (f[i+j*xmax]>0) { spalte[sptr]=f[i+j*xmax]; sptr++; }
    for (j=0; j<ymax; j++) if (f[i+j*xmax]>0) f[i+j*xmax]=0;
    for (j=ymax-1; j>=0; j--) if (f[i+j*xmax]==0) { sptr--; if (sptr>=0) f[i+j*xmax]=spalte[sptr]; }
    if (flag) for (j=0; j<ymax; j++) zeige_feld(i+xmax*j);
  }
  if (flag) timrec2=setTimeout('fuellen(true)',100); else fuellen(flag);
}

function fuellen(flag)
{ var i;
  for (i=0; i<zmax; i++) if (f[i]==0) f[i]=neuer_stein(level);
  for (i=0; i<zmax; i++) zeige_feld(i);
  if (flag) timrec2=setTimeout('auswerten(true)',100); else auswerten(flag);
}

function code_auswerten(nr)
{ co[0]=co[1]; co[1]=co[2]; 
  if (nr>9) co[2]=3; else if (nr>6) co[2]=2; else co[2]=1;
  zeige_code(co);
  if (co[0]>0)
  { if ((co[0]==co[1]) && (co[0]==co[2])) punkte=punkte+100; // 3 gleiche Sterne: Bonus 250
    else if (co[0]==co[2]) feld_flippen=true;                   // Aussensterne gleich: Feld flippen
    else if (co[0]==co[1]) count=count-2;                    // Counter manipulieren
    else if (co[1]==co[2]) count=count+2;                    // Counter manipulieren
    else punkte=punkte+250; 
    timrec1=setTimeout('code_loeschen()',100);
  }
}

function code_loeschen() { for (var i=0; i<3; i++) co[i]=0; zeige_code(co); }

function flippe_feld()
{ var i,j,k=0;
  feld_flippen=false;
  var g=new Array();
  for (i=0; i<xmax; i++) for (j=0; j<ymax; j++) g[i+j*xmax]=f[i+xmax*(ymax-j-1)];
  for (i=0; i<zmax; i++) f[i]=g[i];
  for (i=0; i<zmax; i++) zeige_feld(i);
}

// ===================================================================================================================
// Spielstart und Restart: Brett erstellen, Tripletts entfernen, Punkte, count setzen 
var aktiv,plev,pmin,punkte,punkte0,count,level=0,timrec1,timrec2;
var joker_on=false,bonus_on=false,blocker_on=false,code_on=false,feld_flippen=false;

function neu(flag)
{ var i,j,k;
  aktiv=false;
  feld_flippen=false;
  count=1000;
  if (timrec1) clearTimeout(timrec1);
  if (timrec2) clearTimeout(timrec2);
  if (flag) { plev=0; level=0; co=Array(0,0,0); } else plev=punkte;
  for (i=0; i<zmax; i++) f[i]=0;                                          // normales Feld für erste Levels
  k=Math.floor(level/6);
  switch(k)
  { case 0: break;
    case 1: for (j=4; j<6; j++) for (i=4; i<6; i++) f[i+xmax*j]=-1; break; // Loch in Mitte
    case 2: f[2+xmax*2]=f[7+xmax*7]=f[2+xmax*7]=f[7+xmax*2]=-1;     break; // 4 kleine löcher, gleichm. verteilt 
    case 3: for (i=0; i<2; i++) for (j=0; j<2; j++)                        // 4 große Löcher in den Ecken
            { f[2+i+xmax*(2+j)]=f[6+i+xmax*(6+j)]=-1;
              f[6+i+xmax*(2+j)]=f[2+i+xmax*(6+j)]=-1;
            }
            break; 
    case 4: for (i=0; i<2; i++) for (j=0; j<2; j++)                        // 4 große Löcher, o,u,r,l
            { f[14+i+j*xmax]=f[74+i+j*xmax]=-1; 
              f[41+i+j*xmax]=f[47+i+j*xmax]=-1; 
            }
            break;
    case 5: f[11]=-1; f[12]=-1; f[21]=-1; f[24]=-1; f[42]=-1;              // Winkel 18a
            for (j=0; j<ymax/2; j++) for (i=0; i<xmax/2; i++) if (f[i+j*xmax]<0) f[xmax-i-1+j*xmax]=-1;
            for (i=0; i<zmax/2; i++) if (f[i]<0) f[zmax-i-1]=-1;
            break;
    case 6: f[11]=-1; f[12]=-1; f[21]=-1; f[33]=-1; f[44]=-1;              // Winkel 18b
            for (j=0; j<ymax/2; j++) for (i=0; i<xmax/2; i++) if (f[i+j*xmax]<0) f[xmax-i-1+j*xmax]=-1;
            for (i=0; i<zmax/2; i++) if (f[i]<0) f[zmax-i-1]=-1;
            break;
    case 7: for (i=0; i<xmax; i++) { f[i+i*xmax]=-1; f[xmax-1-i+i*xmax]=-1; } break; // Kreuz20
    case 8: for (i=0; i<zmax; i++) f[i]=-1;
            for (i=0; i<4; i++) for (j=0; j<4; j++) { f[i+j*xmax]=0; f[zmax-1-i-j*xmax]=0; } // Bonbon
            for (i=2; i<xmax-2; i++) for (j=2; j<ymax-2; j++) f[i+j*xmax]=0;
            break;
    case 9: for (i=0; i<zmax; i++) f[i]=-1;
            for (i=0; i<4; i++) for (j=0; j<4; j++) // Diagonale
            { f[i+j*xmax]=0; f[i+2+(j+2)*xmax]=0; f[i+4+(j+4)*xmax]=0; f[i+6+(j+6)*xmax]=0; }
            break;
    case 10: for (i=0; i<xmax; i++) for (j=4; j<6; j++) { f[i+j*xmax]=-1; f[j+i*xmax]=-1; } break;
    case 11: for (j=0; j<4; j++) for (i=0; i<4-j; i++) 
             { f[i+j*xmax]=-1; f[xmax-1-i+j*xmax]=-1; 
               f[i+(ymax-j-1)*xmax]=-1; f[xmax-1-i+(ymax-j-1)*xmax]=-1; 
             }
             for (i=4; i<6; i++) for (j=4; j<6; j++) { f[i+j*xmax]=-1; f[j+i*xmax]=-1; }
             break;
    case 12: for (j=0; j<4; j++) for (i=0; i<4-j; i++) 
             { f[i+j*xmax]=-1; f[xmax-1-i+j*xmax]=-1; 
               f[i+(ymax-j-1)*xmax]=-1; f[xmax-1-i+(ymax-j-1)*xmax]=-1; 
             }
             for (i=3; i<7; i++) for (j=4; j<6; j++) { f[i+j*xmax]=-1; f[j+i*xmax]=-1; }
             f[11]=0; f[12]=0; f[21]=0; f[17]=0; f[18]=0; f[28]=0; 
             f[71]=0; f[81]=0; f[82]=0; f[78]=0; f[87]=0; f[88]=0; 
             break;
    case 13: for (j=0; j<4; j++) for (i=0; i<j; i++) 
             { f[i+j*xmax]=-1; f[xmax-1-i+j*xmax]=-1; 
               f[i+(ymax-j-1)*xmax]=-1; f[xmax-1-i+(ymax-j-1)*xmax]=-1; 
             }
             for (i=4; i<6; i++) for (j=4; j<6; j++) { f[i+j*xmax]=-1; f[j+i*xmax]=-1; }
             break;
    case 14: for (j=0; j<4; j++) for (i=0; i<j; i++) 
             { f[i+j*xmax]=-1; f[xmax-1-i+j*xmax]=-1; 
               f[i+(ymax-j-1)*xmax]=-1; f[xmax-1-i+(ymax-j-1)*xmax]=-1; 
             }
             for (i=3; i<7; i++) for (j=4; j<6; j++) { f[i+j*xmax]=-1; f[j+i*xmax]=-1; }
             break;
    default:  k=-1; alert('mehr Levels hamma nich!'); gameover();
  }
  if (k>=0)
  { i=level%6;
    switch(i)
    { case 0: pmin=plev+250-k*20; break;
      case 1: pmin=plev+300-k*20; break; 
      case 2: pmin=plev+400-k*20; break; 
      case 3: pmin=plev+250-k*20; break; 
      case 4: pmin=plev+300-k*20; 
      default: pmin=plev+500-k*20;
    }
    joker_on=false; bonus_on=false; blocker_on=false; code_on=false;
    if (i>0) joker_on=true;
    if (i>1) bonus_on=true;
    if (i>2) blocker_on=true;
    if (i>3) code_on=true;

    verteile(level);
    auswerten(false);
    counter_starten(plev);
    punkte0=punkte;
  }
}

function laden() { punkte=0; level=0; get_cookie('urwald2');  neu(false); }

function speichern() 
{ set_cookie('urwald2',level,punkte0);
  if (document.cookie) alert("Spielstand gespeichert"); 
  else alert('konnte Spielstand nicht speichern!\nCookies zugelassen?');
}

function counter_starten(p)
{ aktiv=true;
  switch(level%6)
  { case 0: count=30; break; // easy
    case 1: count=40; break; 
    case 2: count=30; break; 
    case 3: count=30; break; 
    case 4: count=30; break; 
    case 5: count=20; break;
    default: count=40;
  }
  code_loeschen();
  updat_minp(pmin); updat_count(count);
  punkte=p; updat_punkte(punkte); updat_level(level+1);
}

function verteile()
{ var i;
  for (i=0; i<zmax; i++) if (f[i]>=0) f[i]=neuer_stein();
  for (i=0; i<zmax; i++) zeige_feld(i);
}

function neuer_stein()
{ var k=Math.floor(3*Math.random())%3+1; // waagerechter Stein, normal
  if (code_on) 
  { if (Math.random()<0.02) k=k+3;
    else if (Math.random()<0.02) k=k+6;
    else if (Math.random()<0.02) k=k+9;
  }
  else if (bonus_on) if (Math.random()<0.05) k=k+3;
  if (joker_on)   if (Math.random()<0.05) k=joker;
  if (blocker_on) if (Math.random()<0.05) k=blocker;
  if (Math.random()<0.5) k=k+senk;
  return k;
}

function gameover()
{ if (timrec1) clearTimeout(timrec1);
  if (timrec2) clearTimeout(timrec2);
  eintrag('form1');
  punkte=0;
}

function zug_zeigen()
{ aktiv=false;
  var k=zug();
  punkte=punkte-50; updat_punkte(punkte);
  if (k>=0) blinken(k,5); else { alert('Sorry, kein Tripel mehr zu bekommen!'); gameover(); }
}

function blinken(nr,phase)
{ if (phase%2>0) document.images['i'+nr].src=leer.src; else zeige_feld(nr);
  if (phase>0) timrec2=setTimeout('blinken('+nr+','+(phase-1)+')',200); else aktiv=true;
}

// =================================================================================================================

