diff --git a/.gitignore b/.gitignore index 5ff6309..ec87178 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,7 @@ build/ .vscode/ ### Mac OS ### -.DS_Store \ No newline at end of file +.DS_Store + +## Personal notes +notes.md diff --git a/src/main/java/Action/Action.java b/src/main/java/Action/Action.java new file mode 100644 index 0000000..e1bf012 --- /dev/null +++ b/src/main/java/Action/Action.java @@ -0,0 +1,5 @@ +package Action; + +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 new file mode 100644 index 0000000..d6f9e38 --- /dev/null +++ b/src/main/java/Action/Dig.java @@ -0,0 +1,8 @@ +package Action; + +public class Dig implements Action { + @Override + public void exectue(Actor actor) { + actor.performAction(this); + } +} diff --git a/src/main/java/Character.java b/src/main/java/Character.java index 17ca63e..bca6c68 100644 --- a/src/main/java/Character.java +++ b/src/main/java/Character.java @@ -1,21 +1,16 @@ -public abstract class Character { +public abstract class Character extends Entity { protected String name; protected int health; protected int level; - protected Position position; public Character(String name) { + super(new Position(0, 0)); this.name = name; this.health = 10; this.level = 1; } - public Character(String name, int level) { - this.name = name; - this.level = level; - } - public void setHealth(int i) { this.health = i; } @@ -24,5 +19,4 @@ public abstract class Character { return health > 0; } - public abstract void spawn(int x, int y); } diff --git a/src/main/java/Character/HasInventory.java b/src/main/java/Character/HasInventory.java new file mode 100644 index 0000000..598ccc8 --- /dev/null +++ b/src/main/java/Character/HasInventory.java @@ -0,0 +1,7 @@ +package Character; + +import java.util.List; + +public interface HasInventory { + List getInventory(); +} diff --git a/src/main/java/Entity.java b/src/main/java/Entity.java new file mode 100644 index 0000000..84093a9 --- /dev/null +++ b/src/main/java/Entity.java @@ -0,0 +1,14 @@ +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/Job/HasJob.java b/src/main/java/Job/HasJob.java new file mode 100644 index 0000000..1187f9f --- /dev/null +++ b/src/main/java/Job/HasJob.java @@ -0,0 +1,5 @@ +package Job; + +public interface HasJob { + Job getJob(); +} diff --git a/src/main/java/Job/Job.java b/src/main/java/Job/Job.java new file mode 100644 index 0000000..39d9bc5 --- /dev/null +++ b/src/main/java/Job/Job.java @@ -0,0 +1,40 @@ +package Job; + +import Action.Actor; + +import java.util.Objects; + +public abstract class Job { + protected int level; + protected String name; + + Job(String name) { + this.name = name; + this.level = 1; + } + + 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 new file mode 100644 index 0000000..58dd987 --- /dev/null +++ b/src/main/java/Job/Miner.java @@ -0,0 +1,18 @@ +package Job; + +import Action.Actor; +import Character.HasInventory; + +public class Miner extends Job { + public Miner() { + super("Miner"); + } + + + @Override + void performJobAction(Actor actor) { + if(actor instanceof HasInventory a) { + a.getInventory().add("Rock"); + } + } +} diff --git a/src/main/java/Movable.java b/src/main/java/Movable.java new file mode 100644 index 0000000..8e2d448 --- /dev/null +++ b/src/main/java/Movable.java @@ -0,0 +1,3 @@ +public interface Movable { + void moveTo(Position position); +} diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 907f225..d765b47 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,13 +1,45 @@ -public class Player extends Character { +import Action.Action; +import Action.Actor; +import Action.Dig; +import Job.Job; +import Job.HasJob; +import Character.HasInventory; +import java.util.LinkedList; +import java.util.List; + +public class Player extends Character implements Movable, Actor, HasInventory, HasJob { + 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 List getInventory() { + return items; + } @Override - public void spawn(int x, int y) { - + public void performAction(Action action) { + action.exectue(this); } + } diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java new file mode 100644 index 0000000..8a8b38a --- /dev/null +++ b/src/test/java/MinerTest.java @@ -0,0 +1,29 @@ +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.Dig; + +public class MinerTest { + @Test + void miner_can_dig() { + var p = new Player("Steve"); + var job = new Miner(); + p.learnJob(job); + p.performAction(new Dig()); + assertTrue(p.getInventory().contains("Stone")); + } + + @Test + void miner_can_level_up() { + var job = new Miner(); + assertEquals(1, job.getLevel()); + job.levelUp(); + assertEquals(2, job.getLevel()); + } + +} + + diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index 22b1140..a246e22 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -1,9 +1,9 @@ +import Job.Miner; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class PlayerTest { - private Player defaultPlayer() { return new Player("abc"); } @@ -18,9 +18,17 @@ class PlayerTest { @Test public void can_change_position() { var p = defaultPlayer(); - assertEquals(new Position(0,0), p.getPosition()); p.moveTo(new Position(1,1)); assertEquals(new Position(1,1), p.getPosition()); } + @Test + public void can_change_job() { + var p = defaultPlayer(); + assertNull(p.getJob()); + + var job = new Miner(); + p.learnJob(job); + assertEquals(new Miner(), p.getJob()); + } } \ No newline at end of file