diff --git a/src/main/java/io/rpg/model/actions/Action.java b/src/main/java/io/rpg/model/actions/Action.java index 96c16df6..77a2103d 100644 --- a/src/main/java/io/rpg/model/actions/Action.java +++ b/src/main/java/io/rpg/model/actions/Action.java @@ -1,5 +1,8 @@ package io.rpg.model.actions; +import io.rpg.model.object.GameObject; +import org.jetbrains.annotations.Nullable; + /** * A marker interface for action classes. */ @@ -9,7 +12,22 @@ public interface Action { public void acceptActionEngine(ActionEngine engine) { /* noop */ } + + @Override + public void setEmitter(GameObject emitter) { + /* noop */ + } + + @Override + public @Nullable GameObject getEmitter() { + return null; + } }; void acceptActionEngine(final ActionEngine engine); + + void setEmitter(GameObject emitter); + + @Nullable + GameObject getEmitter(); } diff --git a/src/main/java/io/rpg/model/actions/ActionEngine.java b/src/main/java/io/rpg/model/actions/ActionEngine.java index 78b66677..ec316828 100644 --- a/src/main/java/io/rpg/model/actions/ActionEngine.java +++ b/src/main/java/io/rpg/model/actions/ActionEngine.java @@ -119,7 +119,7 @@ public void onAction(BattleAction action) { }); } - private void actionGuard(ConditionalAction action, Runnable actionLogic) { + private void actionGuard(BaseAction action, Runnable actionLogic) { if (action.getCondition() != null && !action.getCondition().acceptEngine(controller().getConditionEngine())) { logger.info("Action not executed due to condition being not satisfied"); return; diff --git a/src/main/java/io/rpg/model/actions/BaseAction.java b/src/main/java/io/rpg/model/actions/BaseAction.java new file mode 100644 index 00000000..22aae86e --- /dev/null +++ b/src/main/java/io/rpg/model/actions/BaseAction.java @@ -0,0 +1,32 @@ +package io.rpg.model.actions; + +import io.rpg.model.actions.condition.Condition; +import io.rpg.model.object.GameObject; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class BaseAction implements Action { + @Nullable + private final Condition condition; + + @Nullable + private GameObject emitter; + + public BaseAction(@Nullable Condition condition) { + this.condition = condition; + } + + @Nullable + public Condition getCondition() { + return condition; + } + + public void setEmitter(GameObject emitter) { + this.emitter = emitter; + } + + @Nullable + public GameObject getEmitter() { + return emitter; + } +} diff --git a/src/main/java/io/rpg/model/actions/BattleAction.java b/src/main/java/io/rpg/model/actions/BattleAction.java index b1b1a7b3..fa22c8f6 100644 --- a/src/main/java/io/rpg/model/actions/BattleAction.java +++ b/src/main/java/io/rpg/model/actions/BattleAction.java @@ -3,8 +3,7 @@ import io.rpg.model.actions.condition.Condition; import io.rpg.model.object.GameObject; -public final class BattleAction extends ConditionalAction { - private GameObject opponent; +public final class BattleAction extends BaseAction { private final int reward; public BattleAction(int reward, Condition condition) { @@ -12,12 +11,8 @@ public BattleAction(int reward, Condition condition) { this.reward = reward; } - public void setOpponent(GameObject object) { - this.opponent = object; - } - public GameObject getOpponent() { - return opponent; + return getEmitter(); } public int getReward() { diff --git a/src/main/java/io/rpg/model/actions/ConditionalAction.java b/src/main/java/io/rpg/model/actions/ConditionalAction.java deleted file mode 100644 index ff6a37ae..00000000 --- a/src/main/java/io/rpg/model/actions/ConditionalAction.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.rpg.model.actions; - -import io.rpg.model.actions.condition.Condition; -import org.jetbrains.annotations.Nullable; - -public abstract class ConditionalAction implements Action { - @Nullable - private final Condition condition; - - public ConditionalAction(@Nullable Condition condition) { - this.condition = condition; - } - - @Nullable - public Condition getCondition() { - return condition; - } -} diff --git a/src/main/java/io/rpg/model/actions/DialogueAction.java b/src/main/java/io/rpg/model/actions/DialogueAction.java index 82b6436f..7409ec49 100644 --- a/src/main/java/io/rpg/model/actions/DialogueAction.java +++ b/src/main/java/io/rpg/model/actions/DialogueAction.java @@ -6,7 +6,7 @@ /** * Class for storing local data needed to perform a dialogue action. */ -public class DialogueAction extends ConditionalAction { +public class DialogueAction extends BaseAction { public final String text; public final Image image; diff --git a/src/main/java/io/rpg/model/actions/GameEndAction.java b/src/main/java/io/rpg/model/actions/GameEndAction.java index 583680b3..29571744 100644 --- a/src/main/java/io/rpg/model/actions/GameEndAction.java +++ b/src/main/java/io/rpg/model/actions/GameEndAction.java @@ -2,7 +2,7 @@ import io.rpg.model.actions.condition.Condition; -public class GameEndAction extends ConditionalAction { +public class GameEndAction extends BaseAction { public final String description; public GameEndAction(String description, Condition condition) { diff --git a/src/main/java/io/rpg/model/actions/LocationChangeAction.java b/src/main/java/io/rpg/model/actions/LocationChangeAction.java index c6dc2edc..1e01eced 100644 --- a/src/main/java/io/rpg/model/actions/LocationChangeAction.java +++ b/src/main/java/io/rpg/model/actions/LocationChangeAction.java @@ -8,7 +8,7 @@ * Class for storing local data needed to preform a location change action. */ -public class LocationChangeAction extends ConditionalAction { +public class LocationChangeAction extends BaseAction { public final String destinationLocationTag; public final Point2D playerPosition; diff --git a/src/main/java/io/rpg/model/actions/QuizAction.java b/src/main/java/io/rpg/model/actions/QuizAction.java index 9849c2ed..cdad48d8 100644 --- a/src/main/java/io/rpg/model/actions/QuizAction.java +++ b/src/main/java/io/rpg/model/actions/QuizAction.java @@ -7,7 +7,7 @@ * Class for storing local data needed to preform a quiz action. */ -public class QuizAction extends ConditionalAction { +public class QuizAction extends BaseAction { public final Question question; private int pointsToEarn; diff --git a/src/main/java/io/rpg/model/actions/ShowDescriptionAction.java b/src/main/java/io/rpg/model/actions/ShowDescriptionAction.java index 179ca776..8f3faf09 100644 --- a/src/main/java/io/rpg/model/actions/ShowDescriptionAction.java +++ b/src/main/java/io/rpg/model/actions/ShowDescriptionAction.java @@ -6,7 +6,7 @@ /** * Class for storing local data needed to perform a show description action. */ -public class ShowDescriptionAction extends ConditionalAction { +public class ShowDescriptionAction extends BaseAction { public final String description; public final Image image; diff --git a/src/main/java/io/rpg/model/object/GameObject.java b/src/main/java/io/rpg/model/object/GameObject.java index 4149221a..c100eed2 100644 --- a/src/main/java/io/rpg/model/object/GameObject.java +++ b/src/main/java/io/rpg/model/object/GameObject.java @@ -116,10 +116,12 @@ public void setPosition(Position playerPosition) { public void setOnRightClickAction(@NotNull Action onRightClickAction) { this.onRightClickAction = onRightClickAction; + this.onRightClickAction.setEmitter(this); } public void setOnLeftClickAction(@NotNull Action onLeftClickAction) { this.onLeftClickAction = onLeftClickAction; + this.onLeftClickAction.setEmitter(this); } public void onRightClick() { @@ -144,5 +146,6 @@ public void onApproach() { public void setOnApproach(Action onApproach) { this.onApproach = onApproach; + this.onApproach.setEmitter(this); } } diff --git a/src/main/java/io/rpg/util/ActionFactory.java b/src/main/java/io/rpg/util/ActionFactory.java index 392bad06..4f9dc5d5 100644 --- a/src/main/java/io/rpg/util/ActionFactory.java +++ b/src/main/java/io/rpg/util/ActionFactory.java @@ -13,6 +13,10 @@ public class ActionFactory { * @return */ public static Action fromConfig(ActionConfigBundle config) { + if (config == null) { + return Action.VOID; + } + assert config.getActionType() != null : "Null action type! Make sure to call validation " + "method after the config object is inflated from JSON!"; diff --git a/src/main/java/io/rpg/util/GameObjectFactory.java b/src/main/java/io/rpg/util/GameObjectFactory.java index 54f0f421..f2840a77 100644 --- a/src/main/java/io/rpg/util/GameObjectFactory.java +++ b/src/main/java/io/rpg/util/GameObjectFactory.java @@ -24,9 +24,9 @@ public class GameObjectFactory { */ public static GameObject fromConfig(GameObjectConfig config) { - Action onLeftClickAction = config.getOnLeftClick() != null ? ActionFactory.fromConfig(config.getOnLeftClick()) : Action.VOID; - Action onRightClickAction = config.getOnRightClick() != null ? ActionFactory.fromConfig(config.getOnRightClick()) : Action.VOID; - Action onApproach = config.getOnApproach() != null ? ActionFactory.fromConfig(config.getOnApproach()) : Action.VOID; + Action onLeftClickAction = ActionFactory.fromConfig(config.getOnLeftClick()); + Action onRightClickAction = ActionFactory.fromConfig(config.getOnRightClick()); + Action onApproach = ActionFactory.fromConfig(config.getOnApproach()); if (onRightClickAction.equals(Action.VOID)) { onRightClickAction = new ShowDescriptionAction( @@ -39,34 +39,17 @@ public static GameObject fromConfig(GameObjectConfig config) { } // Not implemented in model for now, however they should be - Action onClickAction = config.getOnClick() != null ? ActionFactory.fromConfig(config.getOnClick()) : Action.VOID; - + Action onClickAction = ActionFactory.fromConfig(config.getOnClick()); if (config instanceof PlayerConfig) { Player player = new Player(config.getTag(), config.getPosition(), config.getAssetPath()); - player.setOnLeftClickAction(onLeftClickAction); - player.setOnRightClickAction(onRightClickAction); - player.setOnApproach(onApproach); + setActionsOnObject(player, onLeftClickAction, onRightClickAction, onApproach); // player.setStrength(config.getStrength()); return player; } else { GameObject gameObject = new GameObject(config.getTag(), config.getPosition()); - - gameObject.setOnLeftClickAction(onLeftClickAction); - gameObject.setOnRightClickAction(onRightClickAction); - gameObject.setOnApproach(onApproach); - - if (onLeftClickAction instanceof BattleAction) { - ((BattleAction) onLeftClickAction).setOpponent(gameObject); - } - if (onRightClickAction instanceof BattleAction) { - ((BattleAction) onRightClickAction).setOpponent(gameObject); - } - if (onApproach instanceof BattleAction) { - ((BattleAction) onApproach).setOpponent(gameObject); - } - + setActionsOnObject(gameObject, onLeftClickAction, onRightClickAction, onApproach); // TODO: Create ActionFactory & inflate the actions return gameObject; } @@ -88,4 +71,10 @@ public static LinkedList fromConfigs(Iterable conf } return gameObjects; } + + private static void setActionsOnObject(GameObject object, Action onLeftClick, Action onRightClick, Action onApproach) { + object.setOnLeftClickAction(onLeftClick); + object.setOnRightClickAction(onRightClick); + object.setOnApproach(onApproach); + } }