package com.amaya.game.entities; import com.amaya.game.Spacefish; import com.amaya.game.entities.behavior.StrategiesFactory; import com.amaya.game.entities.modifiers.Expirable; import com.amaya.game.entities.modifiers.Modifier; import com.badlogic.gdx.Gdx; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static com.amaya.game.Spacefish.Dimensions.FISH_HEIGHT; import static com.amaya.game.Spacefish.Dimensions.FISH_WIDTH; import static com.amaya.game.Spacefish.Dimensions.VIRTUAL_SCREEN_HEIGHT; import static com.amaya.game.Spacefish.Dimensions.VIRTUAL_SCREEN_WIDTH; /** Fish abstraction. represent user entity. */ public class Fish extends StrategyObject { /* [ CONSTANTS ] ========================================================================================================================================= */ /** Logging tag. */ public static final String TAG = Spacefish.LOG_TAG; /* [ MEMBERS ] =========================================================================================================================================== */ /** Fish health. */ private int mHealth = 1; /** Collected points. */ private int mPoints = 0; /** Stack of modifiers for game object properties. */ private final Map<String, List<Modifier>> mModifiers = new HashMap<String, List<Modifier>>(); /* [ CONSTRUCTORS ] ====================================================================================================================================== */ /** default constructor. */ public Fish() { super((VIRTUAL_SCREEN_WIDTH - FISH_WIDTH) / 2, (VIRTUAL_SCREEN_HEIGHT - FISH_HEIGHT) / 2, FISH_WIDTH, FISH_HEIGHT); setSpeed(1.0f); setStrategy(StrategiesFactory.MomentumMoveByVector); } /* [ IMPLEMENTATION & HELPERS ] ========================================================================================================================== */ public int getHealth() { int health = this.mHealth; if (mModifiers.containsKey(Fields.HEALTH)) { for (Modifier cmd : mModifiers.get(Fields.HEALTH)) { health += cmd.Value; } } return health; } public int getPoints() { int points = mPoints; if (mModifiers.containsKey(Fields.POINTS)) { final List<Modifier> modifiers = mModifiers.get(Fields.POINTS); for (int i = modifiers.size() - 1; i >= 0; i--) { points += modifiers.get(i).Value; modifiers.remove(i); } } return points; } @Override public float getSpeed(final float gameTime) { float speed = super.getSpeed(); final List<Modifier> speedMandates = mModifiers.get(Fields.SPEED); if (null != speedMandates) { for (int i = speedMandates.size() - 1; i >= 0; i--) { final Expirable ec = (Expirable) speedMandates.get(i); if (ec.isExpired(gameTime)) { if (Spacefish.Debug.EXPIRED_COMMANDS) { Gdx.app.log(TAG, "[expired] is expired, apply: " + ec.getApplyTime() + ", expire: " + ec.getExpiredAt() + ", time: " + gameTime); } speedMandates.remove(i); } else { speed *= ec.Value; } } } return speed; } /** Reset entity to initial state. */ public void reset() { mPoints = 0; mHealth = 1; mModifiers.clear(); setSpeed(1.0f); } public Fish addModifier(final Modifier cmd) { // create array for modifiers if (!mModifiers.containsKey(cmd.Name)) { mModifiers.put(cmd.Name, new ArrayList<Modifier>()); } mModifiers.get(cmd.Name).add(cmd); return this; } /* [ NESTED DECLARATIONS ] =============================================================================================================================== */ /** * Syntax hack. reduce the number of 'static final' repeats during declarations, * in addition defines domain of the constants. */ public interface Fields { /** speed of game object */ String SPEED = "Speed"; /** health */ String HEALTH = "Health"; /** score points */ String POINTS = "Points"; /** position */ String POSITION = "Position"; } }