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

/**
 * GH
 */

public class GH extends State { 
    

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

    protected int state;
    
    static {
	colors[0] = new Color(255,255,255);
	colors[1] = new Color(200,200,0);
	colors[2] = new Color(255,0,0);
    }

    public GH() { 
	state = 0;
    }
    
    public static void  initialize(Lattice l, int option) { 
    	switch(option){
    	    case 1: // off-centered
    	    	((GH)l.getState(3*l.getX()/4,l.getY()/2,l.getZ()/2)).state = 2;
    	    	break;
    	    case 2: // spiral
    	    	if (l.getY() > 1){
		    for (int k=0; k<l.getZ(); k++){
    	    	    for (int i=l.getX()/2; i<l.getX(); i++){
    	    	    ((GH)l.getState(i,l.getY()/2,k)).state = 2;
    	    	    ((GH)l.getState(i,l.getY()/2-1,k)).state = 1;
    	    	    }}
		}else{
    	    	    ((GH)l.getState(l.getX()/2,0,0)).state = 2;
    	    	    ((GH)l.getState(l.getX()/2-1,0,0)).state = 1;
		}
    	    	break;
    	    case 3: // 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++){
    	    	    if (Functions.prob(0.02)){
    	    	    	((GH)l.getState(i,j,k)).state = 2;
    	    	    }
    	    	}}}
    	    	break;
    	    case 4: // random2
    	    	for (int i=0; i<l.getX(); i++){
    	    	for (int j=0; j<l.getY(); j++){
    	    	for (int k=0; k<l.getZ(); k++){
    	    	    if (Functions.prob(0.02)){
    	    	    	((GH)l.getState(i,j,k)).state = 2;
    	    	    }else if (Functions.prob(0.02)){
    	    	    	((GH)l.getState(i,j,k)).state = 1;
    	    	    }
    	    	}}}
    	    	break;
    	    case 5: // nothing (used for coupling automata)
    	    	break;
    	    case 6: // 3-d Scroll wave
    	    	if (l.getZ() < 2) break;
    	    	
    	    	for (int i=0; i<l.getX(); i++){
    	    	for (int j=0; j<l.getY(); j++){
    	    	    if ((i-l.getX()/2)*(i-l.getX()/2) +
    	    	    	(j-l.getY()/2)*(j-l.getY()/2) < l.getY()*l.getX()/10){
    	    	    	((GH)l.getState(i,j,l.getZ()/2)).state = 2;
    	    	    	((GH)l.getState(i,j,l.getZ()/2+1)).state = 1;
    	    	    }
    	    	}}
    	    	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;
    	    case 8: // larger
	    	((GH)l.getState(l.getX()/2,l.getY()/2,l.getZ()/2)).state = 2;
	    	((GH)l.getState(l.getX()/2+1,l.getY()/2,l.getZ()/2)).state = 2;
	    	((GH)l.getState(l.getX()/2+1,l.getY()/2+1,l.getZ()/2)).state = 2;
	    	((GH)l.getState(l.getX()/2,l.getY()/2+1,l.getZ()/2)).state = 2;
		break;
    	    case 9: // spiral + random 1s
    	    	for (int i=0; i<l.getX(); i++){
    	    	for (int j=0; j<l.getY(); j++){
    	    	for (int k=0; k<l.getZ(); k++){
    	    	    if (Functions.prob(0.1)){
    	    	    	((GH)l.getState(i,j,k)).state = 1;
    	    	    }
    	    	}}}

    	    	if (l.getY() > 1){
		    for (int k=0; k<l.getZ(); k++){
    	    	    for (int i=l.getX()/2; i<l.getX(); i++){
    	    	    ((GH)l.getState(i,l.getY()/2+1,k)).state = 0;
    	    	    ((GH)l.getState(i,l.getY()/2,k)).state = 2;
    	    	    ((GH)l.getState(i,l.getY()/2-1,k)).state = 1;
    	    	    }}
		}else{
    	    	    ((GH)l.getState(l.getX()/2,0,0)).state = 2;
    	    	    ((GH)l.getState(l.getX()/2-1,0,0)).state = 1;
		}
    	    	break;
    	    default:
	    	((GH)l.getState(l.getX()/2,l.getY()/2,l.getZ()/2)).state = 2;
	}
    }
    
    public void copy(State s) { 
        state = ((GH)s).state;
    }

    public Color getColor() {
      return colors[state];
    }

    public void transition(Cell cell) { 
        int nc = 0;
        
	// System.out.println(cell);
	
        if (state>0) { 
            state--;
        } else { 
            State neighbors[] = cell.getNeighbors();
            if (neighbors!=null) { 
                int i,c;
                c = neighbors.length;
                for (i=0; i<c; i++) { 
                    if (((GH)neighbors[i]).state == 2) { 
                        state = 2;
                        return;
                    }
                }
            }
        }
    }
    
    public State getConstant() { 
        GH s = new GH();
        s.state = 1;
        return s;
    }

    public String toString() {
	return state+" ";
    }
}

