
/**
 * schoen3.java
 * @author Joerg R. Weimar
 */
import de.tubs.cs.sc.casim.*;
import java.awt.*;
import java.util.Vector;

/**
 * GH
 */

public class schoen3 extends State { 
    

    protected final static Color[] colors = new Color[2];

    protected boolean state;
    int sa,si;
    
    static {
	colors[0] = null;
	colors[1] = new Color(255,0,0);
    }

    public schoen3() { 
	state = false;
    }
    
    public static void  initialize(Lattice l, int option) { 
    	int si = (option/10)%10; 
    	int sa = (option/100)%10; 

    	    	for (int i=0; i<l.getX(); i++){
    	    	for (int j=0; j<l.getY(); j++){
    	    	for (int k=0; k<l.getZ(); k++){
    	    	    schoen3 s = ((schoen3)l.getState(i,j,k));
		    s.sa = sa;
		    s.si = si;
    	    	}}}
 
     	switch(option % 10){

    	    case 1: // random
    	    	for (int i=0; i<l.getX(); i++){
    	    	for (int j=0; j<l.getY(); j++){
    	    	for (int k=0; k<l.getZ(); k++){
    	    	    schoen3 s = ((schoen3)l.getState(i,j,k));
		    s.state = Functions.prob(0.5);
    	    	}}}
    	    	break;
 
    	    case 7: // random neighborhood 
    	    	int neighbors[][] = {{0,0},{0,2},{-1,-2},{3,1},{-2,2}};
    	    	l.defineNeighborsArbitrary(neighbors);
    	    	
	    	((GH)l.getState(l.getX()/2,l.getY()/2,l.getZ()/2)).state = 2;
	    	break;
    	    default:
	    	((schoen3)l.getState(l.getX()/2,l.getY()/2,l.getZ()/2)).state = true;
	    	((schoen3)l.getState(l.getX()/2+1,l.getY()/2,l.getZ()/2)).state = true;
	    	((schoen3)l.getState(l.getX()/2-1,l.getY()/2,l.getZ()/2)).state = true;
	    	((schoen3)l.getState(l.getX()/2,l.getY()/2+1,l.getZ()/2)).state = true;
	    	((schoen3)l.getState(l.getX()/2,l.getY()/2-1,l.getZ()/2)).state = true;
	    	((schoen3)l.getState(l.getX()/2-1,l.getY()/2+1,l.getZ()/2)).state = true;
	    	((schoen3)l.getState(l.getX()/2-1,l.getY()/2-1,l.getZ()/2)).state = true;
	}
    }
    
    public void copy(State s) { 
        state = ((schoen3)s).state;
    }

    public Color getColor() {
      return colors[state?1:0];
    }

    public void transition(Cell cell) { 
        if (Functions.prob(0.5)){
	    State neighbors[] = cell.getNeighborsvonNeumann(1);
	    State neighborsi[] = cell.getNeighborsvonNeumann(2);
            if (neighbors!=null) { 
                int i,c;
                c = neighbors.length;
		int na=0,ni=0;
                for (i=1; i<c; i++) { 
                    if (((schoen3)neighbors[i]).state) { 
                        na++;
                    }
                }
                for (i=1; i<neighborsi.length; i++) { 
                    if (((schoen3)neighborsi[i]).state) { 
                        ni++;
                    }
                }
		state = (na >= sa) && (ni-na <= si);
            }
        }
    }
    
    public State getConstant() { 
        schoen3 s = new schoen3();
        s.state = false;
        return s;
    }

    public String toString() {
	return state?"1":"0";
    }
}


