%include "parameter" || parameter.m
%include "zellen"    || zellen.m



|| Die Steine haben die folgenden Operationen:

abstype tstein with
  neuerstein    :: num -> tstein    || jeder Zahl ist ein Stein zugeordnet 
  steindrehen   :: tstein -> tstein
  steinlinks    :: tstein -> tstein
  steinrechts   :: tstein -> tstein
  steinunten    :: tstein -> tstein
  gibkoordinaten:: tstein -> (num,num)  
  steinstruktur :: tstein -> tzellen


|| Im Stein sind also die Koordinaten bezueglich des 
|| Spielfeldes miteinkodiert


 
||-----------------------------------------------
|| Implementation:

|| Die Steine benutzen Zellstrukturen, siehe zellen.m
||
|| Genauer bestehen Steine aus:
||   x,y - Koordinate
||   Einer Liste von einzelnen Zellstrukturen, die jeweils einen 
||     einen Stein in einer bestimmten Drehung darstellen.


tstein == (koordinatex,koordinatey,[tzellen])

koordinatex == num
koordinatey == num


neuerstein nummer  
= langer,
  if nummer = 0
= quadrat,
  if nummer = 1
= sform,
  if nummer = 2
= sspiegel,
  if nummer = 3
= lform,
  if nummer = 4
= lspiegel,
  if nummer = 5
= tform,
  if nummer = 6
= neuerstein (nummer mod 7),
  otherwise

  where

  || Erzeugung der Steine (Zellstrukturlisten):
  || Startposition ist in der Mitte, weit oben.

  langer        = (breite div 2 - 2,-3,(map neuezellen maskelanger))
  maskelanger   = [(4,4,"0100 0100 0100 0100"),
                   (4,4,"0000 1111 0000 0000")] ++ maskelanger

  quadrat       = (breite div 2 - 1,-1,(map neuezellen maskequadrat))
  maskequadrat  = [(2,2,"11 11")] ++ maskequadrat

  sform         = (breite div 2 - 2,-2,(map neuezellen maskesform))
  maskesform    = [(3,3,"100 110 010"),
                   (3,3,"011 110 000")] ++ maskesform

  sspiegel      = (breite div 2 - 2,-2,(map neuezellen maskesspiegel))
  maskesspiegel = [(3,3,"010 110 100"),
                   (3,3,"110 011 000")] ++ maskesspiegel

  lform         = (breite div 2 - 2,-2,(map neuezellen maskelform))
  maskelform    = [(3,3,"110 010 010"),
                   (3,3,"001 111 000"),
                   (3,3,"010 010 011"),
                   (3,3,"000 111 100")] ++ maskelform

  lspiegel      = (breite div 2 - 2,-2,(map neuezellen maskelspiegel))
  maskelspiegel = [(3,3,"011 010 010"),
                   (3,3,"000 111 001"),
                   (3,3,"010 010 110"),
                   (3,3,"100 111 000")] ++ maskelspiegel

  tform         = (breite div 2 - 2,-2,(map neuezellen masketform))
  masketform    = [(3,3,"000 111 010"),
                   (3,3,"010 110 010"),
                   (3,3,"010 111 000"),
                   (3,3,"010 011 010")] ++ masketform



|| aktuelle Drehung ist die vorderste
steinstruktur (x,y,steine) 
= hd steine


|| drehen: (Elegant, was?)
steindrehen (x,y,steine) 
= (x,y,tl steine)

steinlinks (x,y,stein) 
= (x-1,y,stein)

steinrechts (x,y,stein) 
= (x+1,y,stein)

steinunten (x,y,stein) 
= (x,y+1,stein)

gibkoordinaten (x,y,steine)
= (x,y)