// ----------------------------------------------------
// dynamische Generierung von 3D-Labyrinthen, (c)uja
// Aufruf: f=gen_laby(breite,tiefe,hoehe);
// moeglichst nicht über 500 - 1000 Zellen generieren!
// ----------------------------------------------------

function gen_laby3d(xmax,ymax,zmax) 
{ var max=xmax*ymax*zmax;
  var f=new Array(),liste=new Array(),gang=new Array();

  function get_nachbar(ind)
  { var x=ind%xmax,rest=Math.round((ind-x)/xmax),y=rest%ymax,z=Math.round((rest-y)/ymax);
    liste[0]=0; 
    if (x<(xmax-1)) if (f[ind+1]==0) add_liste(ind+1,liste);
    if (x>0) if (f[ind-1]==0) add_liste(ind-1,liste);
    if (y<(ymax-1)) if (f[ind+xmax]==0) add_liste(ind+xmax,liste);
    if (y>0) if (f[ind-xmax]==0) add_liste(ind-xmax,liste);
    if (z<(zmax-1)) if (f[ind+xmax*ymax]==0) add_liste(ind+xmax*ymax,liste);
    if (z>0) if (f[ind-xmax*ymax]==0) add_liste(ind-xmax*ymax,liste);
  }

  function weg_bahnen(ind)
  { var i=-1;
    get_nachbar(ind);
    if (liste[0]>0) 
    { i=liste[Math.floor(liste[0]*Math.random())+1]; // einen Nachbarn herauspicken
    // Nachbarschaft bestimmen, Waende oeffnen:
      if (i==ind-1) { f[ind]=f[ind]+8; f[i]=f[i]+2; } // links
      else if (i==ind+1) { f[ind]=f[ind]+2; f[i]=f[i]+8; } // rechts
      else if (i==(ind-xmax)) { f[ind]=f[ind]+1; f[i]=f[i]+4; } // vorne
      else if (i==(ind+xmax)) { f[ind]=f[ind]+4; f[i]=f[i]+1; } // hinten
      else if (i==(ind-xmax*ymax)) { f[ind]=f[ind]+32; f[i]=f[i]+16; } // oben
      else if (i==(ind+xmax*ymax)) { f[ind]=f[ind]+16; f[i]=f[i]+32; } // unten
      add_liste(i,gang);
    }
    else // zurueck zur letzten Verzweigung
    { do { gang[0]--; if (gang[0]>0) get_nachbar(gang[gang[0]]); } while ((liste[0]==0) && (gang[0]>0));
      if (gang[0]>0) i=gang[gang[0]];
    }
    if (i>=0) weg_bahnen(i);
  }

  function in_liste(e,l)  { var 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; } }

  // main:
  for (var i=0; i<max; i++) f[i]=0; 
  gang=Array(1,Math.floor(max*Math.random())%max);
  weg_bahnen(gang[1]);
  return f;
}

