package com.cookbook.ai; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.ai.fsm.DefaultStateMachine; import com.badlogic.gdx.ai.fsm.State; import com.badlogic.gdx.ai.fsm.StateMachine; import com.badlogic.gdx.ai.msg.MessageManager; import com.badlogic.gdx.ai.msg.Telegram; import com.badlogic.gdx.ai.msg.Telegraph; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.utils.TimeUtils; import com.cookbook.ai.Caveman.CavemanState; public class Dinosaur implements Telegraph { private static final String TAG = "Dinosaur"; private StateMachine<Dinosaur> fsm; private float energy; private Caveman caveman; public enum DinosaurState implements State<Dinosaur> { HOME() { @Override public void enter(Dinosaur dinosaur) { // TODO Auto-generated method stub } @Override public void update(Dinosaur dinosaur) { dinosaur.increaseEnergy(.8f); if(dinosaur.energy == 100) dinosaur.getFSM().changeState(GO_FOR_A_WALK); } @Override public void exit(Dinosaur dinosaur) { // TODO Auto-generated method stub dinosaur.say("Ready for a new day"); } @Override public boolean onMessage(Dinosaur entity, Telegram telegram) { return false; } }, GO_FOR_A_WALK() { @Override public void enter(Dinosaur dinosaur) { dinosaur.say("Let's breathe some fresh air"); } @Override public void update(Dinosaur dinosaur) { dinosaur.decreaseEnergy(.05f); // 1 in 1000 if (MathUtils.randomBoolean(0.001f) && dinosaur.cavemanInState(CavemanState.HUNTING)) { MessageManager.getInstance().dispatchMessage( 0.0f, // no delay dinosaur, dinosaur.caveman, MessageType.GRRRRRRRR, null); dinosaur.say("GRRRRRRRRR"); } if(dinosaur.energy == 0) { dinosaur.say("Enough for today"); dinosaur.getFSM().changeState(GO_HOME); } } @Override public void exit(Dinosaur dinosaur) { // TODO Auto-generated method stub } @Override public boolean onMessage(Dinosaur entity, Telegram telegram) { return false; } }, GO_HOME() { private double beginningTime; @Override public void enter(Dinosaur dinosaur) { beginningTime = TimeUtils.millis(); dinosaur.say("On my way to home"); } @Override public void update(Dinosaur dinosaur) { if(TimeUtils.millis() - beginningTime > 2000) { dinosaur.say("Good to arrive so soon"); dinosaur.getFSM().changeState(HOME); } } @Override public void exit(Dinosaur dinosaur) { // TODO Auto-generated method stub } @Override public boolean onMessage(Dinosaur entity, Telegram telegram) { return false; } }; } public Dinosaur(Caveman caveman) { fsm = new DefaultStateMachine<Dinosaur> (this, DinosaurState.HOME); energy = MathUtils.random(0, 100); this.caveman = caveman; } public StateMachine<Dinosaur> getFSM() { return fsm; } public void update(float delta) { fsm.update(); } public void increaseEnergy(float value) { energy = MathUtils.clamp(energy+value, 0, 100); } public void decreaseEnergy(float value) { energy = MathUtils.clamp(energy-value, 0, 100); } private boolean cavemanInState(CavemanState state) { return caveman.getFSM().isInState(state); } private void say(String thought) { Gdx.app.log(TAG, thought); } @Override public boolean handleMessage(Telegram msg) { return fsm.handleMessage(msg); } }