From 2c0534e27a89b788f4b779d3a8b5a75565333a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Fri, 17 Oct 2025 10:02:56 +0200 Subject: [PATCH] Refactor job into interfaces --- README.md | 4 +- src/main/java/Action/Action.java | 4 +- src/main/java/Action/Actor.java | 8 +++ src/main/java/Action/Dig.java | 5 -- src/main/java/Action/DigAction.java | 20 ++++++ src/main/java/Character.java | 22 ------- src/main/java/Combat/HasHealth.java | 6 ++ src/main/java/Entity.java | 14 ----- src/main/java/Entity/Entity.java | 13 ++++ src/main/java/Entity/HasPosition.java | 6 ++ src/main/java/{ => Entity}/Movable.java | 4 ++ src/main/java/Entity/Player.java | 76 +++++++++++++++++++++++ src/main/java/{ => Entity}/Position.java | 2 + src/main/java/Inventory/HasInventory.java | 7 +++ src/main/java/Job/HasJob.java | 6 ++ src/main/java/Job/Job.java | 35 ++++++++--- src/main/java/Job/Miner.java | 32 +++------- src/main/java/Player.java | 40 ------------ src/test/java/MinerTest.java | 9 +-- src/test/java/PlayerTest.java | 2 + 20 files changed, 196 insertions(+), 119 deletions(-) create mode 100644 src/main/java/Action/Actor.java delete mode 100644 src/main/java/Action/Dig.java create mode 100644 src/main/java/Action/DigAction.java delete mode 100644 src/main/java/Character.java create mode 100644 src/main/java/Combat/HasHealth.java delete mode 100644 src/main/java/Entity.java create mode 100644 src/main/java/Entity/Entity.java create mode 100644 src/main/java/Entity/HasPosition.java rename src/main/java/{ => Entity}/Movable.java (52%) create mode 100644 src/main/java/Entity/Player.java rename src/main/java/{ => Entity}/Position.java (70%) create mode 100644 src/main/java/Inventory/HasInventory.java create mode 100644 src/main/java/Job/HasJob.java delete mode 100644 src/main/java/Player.java diff --git a/README.md b/README.md index 3e0431b..cccb987 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,10 @@ RWRD implements common elements from roguelikes, and games in general. ### The player The player object is a representation of the user and it's agency in the game world -### Player +### Entity.Player -- Player +- Entity.Player - Enemies -- Bosses - Class system diff --git a/src/main/java/Action/Action.java b/src/main/java/Action/Action.java index 51397fc..e1bf012 100644 --- a/src/main/java/Action/Action.java +++ b/src/main/java/Action/Action.java @@ -1,5 +1,5 @@ package Action; -public abstract class Action { - public static Dig Dig = new Dig(); +public interface Action { + void exectue(Actor player); } diff --git a/src/main/java/Action/Actor.java b/src/main/java/Action/Actor.java new file mode 100644 index 0000000..040075a --- /dev/null +++ b/src/main/java/Action/Actor.java @@ -0,0 +1,8 @@ +package Action; + +import Job.Job; + +public interface Actor { + Job getJob(); + void performAction(Action action); +} diff --git a/src/main/java/Action/Dig.java b/src/main/java/Action/Dig.java deleted file mode 100644 index 4234101..0000000 --- a/src/main/java/Action/Dig.java +++ /dev/null @@ -1,5 +0,0 @@ -package Action; - -public class Dig extends Action { - -} diff --git a/src/main/java/Action/DigAction.java b/src/main/java/Action/DigAction.java new file mode 100644 index 0000000..7fcc7fa --- /dev/null +++ b/src/main/java/Action/DigAction.java @@ -0,0 +1,20 @@ +package Action; + +import Job.HasJob; +import Job.Miner; + +public class DigAction implements Action { + @Override + public void exectue(Actor actor) { + Miner miner = requireMiner(actor); + miner.dig(actor); + } + + private Miner requireMiner(Actor actor) { + if (actor instanceof HasJob hasJob + && hasJob.getJob() instanceof Miner miner) { + return miner; + } + throw new IllegalStateException(actor + " cannot perform this action without being a Miner!"); + } +} diff --git a/src/main/java/Character.java b/src/main/java/Character.java deleted file mode 100644 index bca6c68..0000000 --- a/src/main/java/Character.java +++ /dev/null @@ -1,22 +0,0 @@ -public abstract class Character extends Entity { - protected String name; - protected int health; - protected int level; - - - public Character(String name) { - super(new Position(0, 0)); - this.name = name; - this.health = 10; - this.level = 1; - } - - public void setHealth(int i) { - this.health = i; - } - - public boolean isAlive() { - return health > 0; - } - -} diff --git a/src/main/java/Combat/HasHealth.java b/src/main/java/Combat/HasHealth.java new file mode 100644 index 0000000..47e44c8 --- /dev/null +++ b/src/main/java/Combat/HasHealth.java @@ -0,0 +1,6 @@ +package Combat; + +public interface HasHealth { + void setHealth(int health); + boolean isAlive(); +} diff --git a/src/main/java/Entity.java b/src/main/java/Entity.java deleted file mode 100644 index 84093a9..0000000 --- a/src/main/java/Entity.java +++ /dev/null @@ -1,14 +0,0 @@ -public class Entity { - private Position position; - public Entity(Position position) { - this.position = position; - } - - public Position getPosition() { - return position; - } - - public void setPosition(Position position) { - this.position = position; - } -} diff --git a/src/main/java/Entity/Entity.java b/src/main/java/Entity/Entity.java new file mode 100644 index 0000000..5492543 --- /dev/null +++ b/src/main/java/Entity/Entity.java @@ -0,0 +1,13 @@ +package Entity; + + +public abstract class Entity implements HasPosition { + protected String name; + protected Position position; + + + public Entity(String name) { + this.name = name; + } + +} diff --git a/src/main/java/Entity/HasPosition.java b/src/main/java/Entity/HasPosition.java new file mode 100644 index 0000000..247c45f --- /dev/null +++ b/src/main/java/Entity/HasPosition.java @@ -0,0 +1,6 @@ +package Entity; + +public interface HasPosition { + Position getPosition(); + void setPosition(Position position); +} diff --git a/src/main/java/Movable.java b/src/main/java/Entity/Movable.java similarity index 52% rename from src/main/java/Movable.java rename to src/main/java/Entity/Movable.java index 8e2d448..3b4ee43 100644 --- a/src/main/java/Movable.java +++ b/src/main/java/Entity/Movable.java @@ -1,3 +1,7 @@ +package Entity; + + public interface Movable { void moveTo(Position position); + boolean canMoveTo(Position position); } diff --git a/src/main/java/Entity/Player.java b/src/main/java/Entity/Player.java new file mode 100644 index 0000000..8b49942 --- /dev/null +++ b/src/main/java/Entity/Player.java @@ -0,0 +1,76 @@ +package Entity; + +import Action.Action; +import Action.Actor; +import Combat.HasHealth; +import Job.Job; +import Job.HasJob; +import Inventory.HasInventory; + +import java.util.LinkedList; +import java.util.List; + +public class Player extends Entity implements Movable, Actor, HasInventory, HasJob, HasHealth { + protected int health; + protected Job job; + protected Position position; + protected List items = new LinkedList<>(); + public Player(String name, Job job) { + super(name); + this.job = job; + this.position = new Position(0,0); + } + + public Player(String name) { + super(name); + } + + @Override + public void moveTo(Position position) { + if(canMoveTo(position)){ + setPosition(position); + } + } + + @Override + public boolean canMoveTo(Position position) { + return false; + } + public Job getJob() { + return job; + } + + @Override + public void learnJob(Job job) { + this.job = job; + } + + public List getInventory() { + return items; + } + + @Override + public void performAction(Action action) { + action.exectue(this); + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public void setPosition(Position position) { + this.position = position; + } + + @Override + public void setHealth(int health) { + this.health = health; + } + + @Override + public boolean isAlive() { + return health > 0; + } +} diff --git a/src/main/java/Position.java b/src/main/java/Entity/Position.java similarity index 70% rename from src/main/java/Position.java rename to src/main/java/Entity/Position.java index aab1c7e..b02e6ba 100644 --- a/src/main/java/Position.java +++ b/src/main/java/Entity/Position.java @@ -1 +1,3 @@ +package Entity; + public record Position(int x, int y) {} diff --git a/src/main/java/Inventory/HasInventory.java b/src/main/java/Inventory/HasInventory.java new file mode 100644 index 0000000..856c2da --- /dev/null +++ b/src/main/java/Inventory/HasInventory.java @@ -0,0 +1,7 @@ +package Inventory; + +import java.util.List; + +public interface HasInventory { + List getInventory(); +} diff --git a/src/main/java/Job/HasJob.java b/src/main/java/Job/HasJob.java new file mode 100644 index 0000000..3034402 --- /dev/null +++ b/src/main/java/Job/HasJob.java @@ -0,0 +1,6 @@ +package Job; + +public interface HasJob { + Job getJob(); + void learnJob(Job job); +} diff --git a/src/main/java/Job/Job.java b/src/main/java/Job/Job.java index 7eecaa7..39d9bc5 100644 --- a/src/main/java/Job/Job.java +++ b/src/main/java/Job/Job.java @@ -1,21 +1,40 @@ package Job; -public abstract class Job { - private int level; - abstract void performJobAction(); +import Action.Actor; - Job() { +import java.util.Objects; + +public abstract class Job { + protected int level; + protected String name; + + Job(String name) { + this.name = name; this.level = 1; } - Job(int level) { - this.level = level; - } public double getLevel() { return level; - }; + } public void levelUp() { level++; } + + @Override + public String toString() { + return String.format("Job: %s. Level: %d", name, level); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + return o != null && getClass() == o.getClass(); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + } diff --git a/src/main/java/Job/Miner.java b/src/main/java/Job/Miner.java index 5e223fe..3266fb8 100644 --- a/src/main/java/Job/Miner.java +++ b/src/main/java/Job/Miner.java @@ -1,30 +1,18 @@ package Job; -import java.util.Objects; +import Action.Actor; +import Inventory.HasInventory; public class Miner extends Job { - private final String jobName = "Miner"; + public Miner() { + super("Miner"); + } - public Miner() {} - @Override - public void performJobAction() { - System.out.println("Dig..."); - } + public void dig(Actor actor) { + if(actor instanceof HasInventory a) { + a.getInventory().add("Stone"); + } + } - @Override - public String toString() { - return "Miner"; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - return o != null && getClass() == o.getClass(); - } - - @Override - public int hashCode() { - return Objects.hash(jobName); - } } diff --git a/src/main/java/Player.java b/src/main/java/Player.java deleted file mode 100644 index dfa73cf..0000000 --- a/src/main/java/Player.java +++ /dev/null @@ -1,40 +0,0 @@ -import Action.Dig; -import Job.Job; - -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; - -public class Player extends Character implements Movable { - protected Job job; - protected List items = new LinkedList<>(); - public Player(String name, Job job) { - super(name); - this.job = job; - } - - public Player(String name) { - super(name); - } - - @Override - public void moveTo(Position position) { - setPosition(position); - } - - public void learnJob(Job job) { - this.job = job; - } - - public Job getJob() { - return job; - } - - public void performAction(Dig dig) { - items.add("Stone"); - } - - public List getInventory() { - return items; - } -} diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java index 9657d4c..4cb87a8 100644 --- a/src/test/java/MinerTest.java +++ b/src/test/java/MinerTest.java @@ -1,23 +1,24 @@ -import Action.Action; +import Entity.Player; import Job.Miner; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import Action.DigAction; + public class MinerTest { @Test void miner_can_dig() { - var p = new Player("Steve"); + var p = new Player("John"); var job = new Miner(); p.learnJob(job); - p.performAction(Action.Dig); + p.performAction(new DigAction()); assertTrue(p.getInventory().contains("Stone")); } @Test void miner_can_level_up() { - var p = new Player("Steve"); var job = new Miner(); assertEquals(1, job.getLevel()); job.levelUp(); diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index a246e22..8c04ae4 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -1,4 +1,6 @@ +import Entity.Position; import Job.Miner; +import Entity.Player; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; -- 2.39.5