package Organisms2.g3;
import java.awt.Color;
import java.io.*;
import java.security.*;
import java.util.*;
import Organisms2.*;
//Group3 small brain player
public class Group3SmallBrain implements IFCPlayer {
	private static final Color kColor = Color.BLUE;
	private static final String kName = "If I Only Had a Brain";	
	private static Random sRng = new SecureRandom();
	private Organisms2 mOrg;	
	private int mKey;
	private boolean[] mFoodPresent;
	private int[] mEnemies;		
	public void register(Organisms2 iOrg, int iKey) throws Exception {
		mOrg = iOrg;		
		if (iKey == -1) {mKey = sRng.nextInt();}
		else {mKey = iKey;} }
	public Move move(boolean[] iFoodPresent, int[] iEnemies, int iFoodLeft, int iEnergyLeft) throws Exception {
		mFoodPresent = iFoodPresent;
		mEnemies = iEnemies;		
		int foodNeighbor = getEmptyFoodCell(iFoodPresent, iEnemies);			
		if ((iEnergyLeft / (float) mOrg.M()) > 0.95) {
			if (foodNeighbor == -1) {return new Move(_CREPRODUCE, sRng.nextInt(4) + 1, mKey);}
                        else {return new Move(_CREPRODUCE, foodNeighbor, mKey);	} }
		if (iFoodLeft > 0) {
                    if (foodNeighbor!=-1 && getHungryFriend(iFoodPresent, iEnemies)!=-1)
                        return new Move (foodNeighbor);
                    else 
			return new Move(_CSTAYPUT);}		
		if (foodNeighbor != -1) {return new Move(foodNeighbor);}
		float stayMoveRatio = mOrg.s() / (float) mOrg.v();		
                if (sRng.nextFloat() >= stayMoveRatio) {return new Move(0);}
                else {return new Move(sRng.nextInt(4) + 1);} }	
      private int getHungryFriend(boolean[] iFoodPresent, int[] iEnemies){
          int id=0, key=0;
          key |= (mKey & 0xff000000);
          key=key>>>24;
          for (int i = 1; i <= 4; i++) {
              id |= (iEnemies[i] & 0xff);
              if ((id == key) && !iFoodPresent[i]) {return i;  }
              id = 0; }
          return -1;}
      private int getEmptyFoodCell(boolean[] iFoodPresent, int[] iEnemies){
          for (int i=1; i<=4; i++){
              if (iFoodPresent[i] && iEnemies[i]==-1) {return i;}}
          return -1;}
	public int externalState() throws Exception {
		int state = 0;
		state |= (mKey & 0xff000000);
		return state>>>24;}
	public boolean interactive() throws Exception {return false;}
	public String name() throws Exception {return kName;};	
	public Color color() throws Exception {return kColor;} }