From d7cfa47277823bc969473e6d858122dcaf84d064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 13:44:15 +0100 Subject: [PATCH 01/15] Replace assertTrue with assertThat hasItem --- src/main/java/Inventory/Inventory.java | 5 +++-- src/test/java/PlayerTest.java | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/Inventory/Inventory.java b/src/main/java/Inventory/Inventory.java index 786cfda..40cc222 100644 --- a/src/main/java/Inventory/Inventory.java +++ b/src/main/java/Inventory/Inventory.java @@ -1,6 +1,7 @@ package Inventory; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class Inventory { @@ -10,8 +11,8 @@ public class Inventory { items = new ArrayList<>(); } - List getItems() { - return items; + public List getItems() { + return Collections.unmodifiableList(items); } public void addItem(String item) { diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index 970f0f9..d9b23ab 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -7,6 +7,8 @@ import Entity.Player; import org.junit.jupiter.api.Test; import Job.Wizard; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; import static org.junit.jupiter.api.Assertions.*; class PlayerTest { @@ -55,7 +57,7 @@ class PlayerTest { var p = new Player("John"); p.learnJob(new Miner()); p.performAction(new DigAction()); - assertTrue(p.getInventory().containsItem("Stone")); + assertThat(p.getInventory().getItems(), hasItem("Stone")); } @Test -- 2.39.5 From 11da3ee4aa7d4ba370ceaee63b3aae68bd1c3fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 13:52:20 +0100 Subject: [PATCH 02/15] Make Miner require HasInventory actor --- src/main/java/Action/DigAction.java | 2 +- src/main/java/Job/Miner.java | 10 +++++----- src/test/java/MinerTest.java | 15 ++++++--------- src/test/java/PlayerTest.java | 7 ++++--- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/main/java/Action/DigAction.java b/src/main/java/Action/DigAction.java index 4d652e2..0243137 100644 --- a/src/main/java/Action/DigAction.java +++ b/src/main/java/Action/DigAction.java @@ -7,7 +7,7 @@ public class DigAction implements Action { @Override public void execute(Actor actor) { Miner miner = requireMiner(actor); - miner.dig(actor); + miner.dig(); } private Miner requireMiner(Actor actor) { diff --git a/src/main/java/Job/Miner.java b/src/main/java/Job/Miner.java index 79c56ec..31fb41e 100644 --- a/src/main/java/Job/Miner.java +++ b/src/main/java/Job/Miner.java @@ -5,13 +5,13 @@ import Inventory.HasInventory; public class Miner extends Job { - public Miner() { + HasInventory actor; + public Miner(HasInventory actor) { super("Miner"); + this.actor = actor; } - public void dig(Actor actor) { - if (actor instanceof HasInventory a) { - a.getInventory().addItem("Stone"); - } + public void dig() { + actor.getInventory().addItem("Stone"); } } diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java index cb187fb..b1781bd 100644 --- a/src/test/java/MinerTest.java +++ b/src/test/java/MinerTest.java @@ -1,13 +1,14 @@ +import Entity.Player; import Job.Miner; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class MinerTest { - + private Player defaultPlayer() {return new Player("John"); } @Test void can_level_up() { - var job = new Miner(); + var job = new Miner(defaultPlayer()); assertEquals(1, job.getLevel()); job.levelUp(); assertEquals(2, job.getLevel()); @@ -15,29 +16,25 @@ public class MinerTest { @Test void can_gain_xp() { - var job = new Miner(); + var job = new Miner(defaultPlayer()); job.gainExperience(25); assertEquals(25, job.getExperience()); } @Test void level_up_when_experience_cap_is_reached() { - var job = new Miner(); + var job = new Miner(defaultPlayer()); job.gainExperience(job.remainingXpUntilLevelUp()); assertEquals(2, job.getLevel()); } @Test void additional_xp_carries_over_on_level_up() { - var job = new Miner(); + var job = new Miner(defaultPlayer()); job.gainExperience(job.remainingXpUntilLevelUp() + 10); assertEquals(10, job.getExperience()); } - @Test - void dig_on_ice_require_ice_pick() { - - } diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index d9b23ab..d0f555c 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -9,6 +9,7 @@ import Job.Wizard; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.*; class PlayerTest { @@ -47,15 +48,15 @@ class PlayerTest { var p = defaultPlayer(); assertNull(p.getJob()); - var job = new Miner(); + var job = new Miner(p); p.learnJob(job); - assertEquals(new Miner(), p.getJob()); + assertThat(p.getJob(), instanceOf(Miner.class)); } @Test void miner_can_dig() { var p = new Player("John"); - p.learnJob(new Miner()); + p.learnJob(new Miner(p)); p.performAction(new DigAction()); assertThat(p.getInventory().getItems(), hasItem("Stone")); } -- 2.39.5 From 2d4b5d21a7f1e56ba38c99f37ec59543afc7bd98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 13:52:46 +0100 Subject: [PATCH 03/15] remove unused import statement --- src/main/java/Job/Miner.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/Job/Miner.java b/src/main/java/Job/Miner.java index 31fb41e..466401c 100644 --- a/src/main/java/Job/Miner.java +++ b/src/main/java/Job/Miner.java @@ -1,6 +1,5 @@ package Job; -import Action.Actor; import Inventory.HasInventory; -- 2.39.5 From 10cd7cbba7023407691e0da81431ea2f1c988fa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 14:05:39 +0100 Subject: [PATCH 04/15] Create dig on biome test --- src/test/java/MinerTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java index b1781bd..df29307 100644 --- a/src/test/java/MinerTest.java +++ b/src/test/java/MinerTest.java @@ -2,6 +2,8 @@ import Entity.Player; import Job.Miner; import org.junit.jupiter.api.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; import static org.junit.jupiter.api.Assertions.assertEquals; public class MinerTest { @@ -35,6 +37,15 @@ public class MinerTest { assertEquals(10, job.getExperience()); } + @Test + void dig_on_biome_alters_loot() { + var job = new Miner(defaultPlayer()); + job.dig(Biomes.COAST); + assertThat(job.getWorker().getInventory(), hasItem("Sand")); + job.dig(Biomes.MOUNTAIN); + assertThat(job.getWorker().getInventory(), hasItem("Ore")); + } + -- 2.39.5 From e32ea5517215a4e34479cfab8c3a0d94d1ff3fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 14:06:54 +0100 Subject: [PATCH 05/15] Make biomes available to project --- src/main/java/{ => Terrain}/Biomes.java | 2 ++ 1 file changed, 2 insertions(+) rename src/main/java/{ => Terrain}/Biomes.java (83%) diff --git a/src/main/java/Biomes.java b/src/main/java/Terrain/Biomes.java similarity index 83% rename from src/main/java/Biomes.java rename to src/main/java/Terrain/Biomes.java index 3c61251..52e7845 100644 --- a/src/main/java/Biomes.java +++ b/src/main/java/Terrain/Biomes.java @@ -1,3 +1,5 @@ +package Terrain; + public enum Biomes { GRASSLAND, MOUNTAIN, COAST, FOREST //Är inte fäst vid dessa } -- 2.39.5 From 90e6c7f42dcb9653c47a95f47f02fb5ee60ebaa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 21:13:02 +0100 Subject: [PATCH 06/15] Pass biome from dig action --- src/main/java/Action/DigAction.java | 7 ++++++- src/main/java/Job/Miner.java | 20 ++++++++++++++++++-- src/main/java/Monster.java | 1 + src/test/java/MinerTest.java | 5 +++-- src/test/java/PlayerTest.java | 5 +++-- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/Action/DigAction.java b/src/main/java/Action/DigAction.java index 0243137..2b6103e 100644 --- a/src/main/java/Action/DigAction.java +++ b/src/main/java/Action/DigAction.java @@ -2,12 +2,17 @@ package Action; import Job.HasJob; import Job.Miner; +import Terrain.Biomes; public class DigAction implements Action { + Biomes biome; + public DigAction(Biomes biome) { + this.biome = biome; + } @Override public void execute(Actor actor) { Miner miner = requireMiner(actor); - miner.dig(); + miner.dig(biome); } private Miner requireMiner(Actor actor) { diff --git a/src/main/java/Job/Miner.java b/src/main/java/Job/Miner.java index 466401c..fde8439 100644 --- a/src/main/java/Job/Miner.java +++ b/src/main/java/Job/Miner.java @@ -1,16 +1,32 @@ package Job; import Inventory.HasInventory; +import Terrain.Biomes; public class Miner extends Job { HasInventory actor; + public Miner(HasInventory actor) { super("Miner"); this.actor = actor; } - public void dig() { - actor.getInventory().addItem("Stone"); + public HasInventory getActor() { + return actor; + } + + public void dig(Biomes biome) { + switch (biome) { + case COAST: + actor.getInventory().addItem("Sand"); + break; + case MOUNTAIN: + actor.getInventory().addItem("Stone"); + break; + default: + actor.getInventory().addItem("Clay"); + break; + } } } diff --git a/src/main/java/Monster.java b/src/main/java/Monster.java index a9b3efc..8e031ba 100644 --- a/src/main/java/Monster.java +++ b/src/main/java/Monster.java @@ -1,4 +1,5 @@ import Entity.Position; +import Terrain.Biomes; import java.util.*; diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java index df29307..25a859b 100644 --- a/src/test/java/MinerTest.java +++ b/src/test/java/MinerTest.java @@ -1,5 +1,6 @@ import Entity.Player; import Job.Miner; +import Terrain.Biomes; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -41,9 +42,9 @@ public class MinerTest { void dig_on_biome_alters_loot() { var job = new Miner(defaultPlayer()); job.dig(Biomes.COAST); - assertThat(job.getWorker().getInventory(), hasItem("Sand")); + assertThat(job.getActor().getInventory().getItems(), hasItem("Sand")); job.dig(Biomes.MOUNTAIN); - assertThat(job.getWorker().getInventory(), hasItem("Ore")); + assertThat(job.getActor().getInventory().getItems(), hasItem("Stone")); } diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index d0f555c..c8ceb7c 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -4,6 +4,7 @@ import Combat.OffensiveDamageSpell; import Entity.Position; import Job.Miner; import Entity.Player; +import Terrain.Biomes; import org.junit.jupiter.api.Test; import Job.Wizard; @@ -57,8 +58,8 @@ class PlayerTest { void miner_can_dig() { var p = new Player("John"); p.learnJob(new Miner(p)); - p.performAction(new DigAction()); - assertThat(p.getInventory().getItems(), hasItem("Stone")); + p.performAction(new DigAction(Biomes.FOREST)); + assertThat(p.getInventory().getItems(), hasItem("Clay")); } @Test -- 2.39.5 From a75ba1f55d29d7d6bf8dcc2618a0554a9a57c74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 21:13:02 +0100 Subject: [PATCH 07/15] Pass biome from dig action --- src/main/java/Action/DigAction.java | 7 ++++++- src/main/java/Job/Miner.java | 20 ++++++++++++++++++-- src/main/java/Monster.java | 1 + src/test/java/MinerTest.java | 9 +++------ src/test/java/PlayerTest.java | 5 +++-- 5 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/main/java/Action/DigAction.java b/src/main/java/Action/DigAction.java index 0243137..2b6103e 100644 --- a/src/main/java/Action/DigAction.java +++ b/src/main/java/Action/DigAction.java @@ -2,12 +2,17 @@ package Action; import Job.HasJob; import Job.Miner; +import Terrain.Biomes; public class DigAction implements Action { + Biomes biome; + public DigAction(Biomes biome) { + this.biome = biome; + } @Override public void execute(Actor actor) { Miner miner = requireMiner(actor); - miner.dig(); + miner.dig(biome); } private Miner requireMiner(Actor actor) { diff --git a/src/main/java/Job/Miner.java b/src/main/java/Job/Miner.java index 466401c..fde8439 100644 --- a/src/main/java/Job/Miner.java +++ b/src/main/java/Job/Miner.java @@ -1,16 +1,32 @@ package Job; import Inventory.HasInventory; +import Terrain.Biomes; public class Miner extends Job { HasInventory actor; + public Miner(HasInventory actor) { super("Miner"); this.actor = actor; } - public void dig() { - actor.getInventory().addItem("Stone"); + public HasInventory getActor() { + return actor; + } + + public void dig(Biomes biome) { + switch (biome) { + case COAST: + actor.getInventory().addItem("Sand"); + break; + case MOUNTAIN: + actor.getInventory().addItem("Stone"); + break; + default: + actor.getInventory().addItem("Clay"); + break; + } } } diff --git a/src/main/java/Monster.java b/src/main/java/Monster.java index a9b3efc..8e031ba 100644 --- a/src/main/java/Monster.java +++ b/src/main/java/Monster.java @@ -1,4 +1,5 @@ import Entity.Position; +import Terrain.Biomes; import java.util.*; diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java index df29307..9e7f2e1 100644 --- a/src/test/java/MinerTest.java +++ b/src/test/java/MinerTest.java @@ -1,5 +1,6 @@ import Entity.Player; import Job.Miner; +import Terrain.Biomes; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -41,14 +42,10 @@ public class MinerTest { void dig_on_biome_alters_loot() { var job = new Miner(defaultPlayer()); job.dig(Biomes.COAST); - assertThat(job.getWorker().getInventory(), hasItem("Sand")); + assertThat(job.getActor().getInventory().getItems(), hasItem("Sand")); job.dig(Biomes.MOUNTAIN); - assertThat(job.getWorker().getInventory(), hasItem("Ore")); + assertThat(job.getActor().getInventory().getItems(), hasItem("Stone")); } - - - - } diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index d0f555c..c8ceb7c 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -4,6 +4,7 @@ import Combat.OffensiveDamageSpell; import Entity.Position; import Job.Miner; import Entity.Player; +import Terrain.Biomes; import org.junit.jupiter.api.Test; import Job.Wizard; @@ -57,8 +58,8 @@ class PlayerTest { void miner_can_dig() { var p = new Player("John"); p.learnJob(new Miner(p)); - p.performAction(new DigAction()); - assertThat(p.getInventory().getItems(), hasItem("Stone")); + p.performAction(new DigAction(Biomes.FOREST)); + assertThat(p.getInventory().getItems(), hasItem("Clay")); } @Test -- 2.39.5 From b4c79875bf048d536eb36d41ec079bc110992d80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 22:16:37 +0100 Subject: [PATCH 08/15] Cleanup --- src/main/java/Terrain/Biomes.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/Terrain/Biomes.java b/src/main/java/Terrain/Biomes.java index 52e7845..d65bfde 100644 --- a/src/main/java/Terrain/Biomes.java +++ b/src/main/java/Terrain/Biomes.java @@ -2,4 +2,6 @@ package Terrain; public enum Biomes { GRASSLAND, MOUNTAIN, COAST, FOREST //Är inte fäst vid dessa + + } -- 2.39.5 From 39846e575ca793ec0048b54db9c16722539f19a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 22:19:17 +0100 Subject: [PATCH 09/15] Create loot table --- src/main/java/Shared/LootTable.java | 24 +++++++++++++++++++ src/test/java/LootTableTest.java | 37 +++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/main/java/Shared/LootTable.java create mode 100644 src/test/java/LootTableTest.java diff --git a/src/main/java/Shared/LootTable.java b/src/main/java/Shared/LootTable.java new file mode 100644 index 0000000..1d5eeb2 --- /dev/null +++ b/src/main/java/Shared/LootTable.java @@ -0,0 +1,24 @@ +package Shared; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Random; + +public class LootTable { + private Random random = new Random(); + private final List items = new ArrayList<>(); + + public LootTable(Random random) { + this.random = random; + } + + public void addEntry(T entry, int weight) { + items.add(entry); + } + + public T roll() { + return items.getFirst(); + } + +} diff --git a/src/test/java/LootTableTest.java b/src/test/java/LootTableTest.java new file mode 100644 index 0000000..b827218 --- /dev/null +++ b/src/test/java/LootTableTest.java @@ -0,0 +1,37 @@ +import Shared.LootTable; +import org.junit.jupiter.api.Test; + +import java.util.Random; + +import static org.hamcrest.CoreMatchers.anyOf; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class LootTableTest { + LootTable defaultLootTable() { + LootTable lootTable = new LootTable<>(); + lootTable.addEntry("Stone", 90); + lootTable.addEntry("Iron", 10); + return lootTable; + } + + @Test + void returns_an_item_was_added() { + LootTable loot = defaultLootTable(); + String result = loot.roll(); + assertThat(result, anyOf(equalTo("Stone"), equalTo("Iron"))); + } + + void respects_weight_when_rolling() { + var mockRandom = mock(Random.class); + when(mockRandom.nextInt(anyInt())).thenReturn(94); + LootTable loot = new LootTable<>(mockRandom); + loot.addEntry("Stone", 90); + loot.addEntry("Iron", 10); + String result = loot.roll(); + assertThat(result, equalTo("Iron")); + } +} -- 2.39.5 From d72e0a876561fef4acb7d170a319e1c580b46057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 22:42:17 +0100 Subject: [PATCH 10/15] Impl LootTable --- src/main/java/Shared/LootEntry.java | 4 ++++ src/main/java/Shared/LootTable.java | 21 ++++++++++++++++----- src/test/java/LootTableTest.java | 10 +++++++--- 3 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 src/main/java/Shared/LootEntry.java diff --git a/src/main/java/Shared/LootEntry.java b/src/main/java/Shared/LootEntry.java new file mode 100644 index 0000000..1586bb4 --- /dev/null +++ b/src/main/java/Shared/LootEntry.java @@ -0,0 +1,4 @@ +package Shared; + +public record LootEntry(T item, int weight) { +} diff --git a/src/main/java/Shared/LootTable.java b/src/main/java/Shared/LootTable.java index 1d5eeb2..93939b9 100644 --- a/src/main/java/Shared/LootTable.java +++ b/src/main/java/Shared/LootTable.java @@ -1,24 +1,35 @@ package Shared; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Random; public class LootTable { - private Random random = new Random(); - private final List items = new ArrayList<>(); + private final Random random; + private final List> entries = new ArrayList<>(); + public LootTable() { + this.random = new Random(); + } public LootTable(Random random) { this.random = random; } public void addEntry(T entry, int weight) { - items.add(entry); + entries.add(new LootEntry<>(entry,weight)); } public T roll() { - return items.getFirst(); + int totalWeight = entries.stream().mapToInt(LootEntry::weight).sum(); + int roll = random.nextInt(totalWeight); + int current = 0; + for(LootEntry entry : entries) { + current += entry.weight(); + if (roll < current) { + return entry.item(); + } + } + return null; } } diff --git a/src/test/java/LootTableTest.java b/src/test/java/LootTableTest.java index b827218..02a9a0a 100644 --- a/src/test/java/LootTableTest.java +++ b/src/test/java/LootTableTest.java @@ -25,10 +25,14 @@ public class LootTableTest { assertThat(result, anyOf(equalTo("Stone"), equalTo("Iron"))); } + @Test void respects_weight_when_rolling() { - var mockRandom = mock(Random.class); - when(mockRandom.nextInt(anyInt())).thenReturn(94); - LootTable loot = new LootTable<>(mockRandom); + LootTable loot = new LootTable<>(new Random() { + @Override + public int nextInt(int bound) { + return 94; + } + }); loot.addEntry("Stone", 90); loot.addEntry("Iron", 10); String result = loot.roll(); -- 2.39.5 From 8a8930c44cf60152effe11c5bebb67b5672a9421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 22:42:43 +0100 Subject: [PATCH 11/15] Impl LootTable --- src/test/java/LootTableTest.java | 3 --- src/test/java/MinerTest.java | 7 ++++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/LootTableTest.java b/src/test/java/LootTableTest.java index 02a9a0a..cfafbb9 100644 --- a/src/test/java/LootTableTest.java +++ b/src/test/java/LootTableTest.java @@ -6,9 +6,6 @@ import java.util.Random; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class LootTableTest { LootTable defaultLootTable() { diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java index 9e7f2e1..800a9b5 100644 --- a/src/test/java/MinerTest.java +++ b/src/test/java/MinerTest.java @@ -39,10 +39,15 @@ public class MinerTest { } @Test - void dig_on_biome_alters_loot() { + void dig_in_coast_use_coast_loot() { var job = new Miner(defaultPlayer()); job.dig(Biomes.COAST); assertThat(job.getActor().getInventory().getItems(), hasItem("Sand")); + } + + @Test + void dig_in_mountain_use_mountain_loot() { + var job = new Miner(defaultPlayer()); job.dig(Biomes.MOUNTAIN); assertThat(job.getActor().getInventory().getItems(), hasItem("Stone")); } -- 2.39.5 From dec4206024265f36532cd7fc9def0b1de90c4ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 22:42:49 +0100 Subject: [PATCH 12/15] Update mockito --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a427f23..4954a6f 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ org.mockito mockito-core - 5.12.0 + 5.20.0 test -- 2.39.5 From 3107451ec0be8803990ab048d6c59a0bafe40cb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 22:44:51 +0100 Subject: [PATCH 13/15] Rename Biomes -> Biome --- src/main/java/Action/DigAction.java | 6 +++--- src/main/java/Job/Miner.java | 4 ++-- src/main/java/Monster.java | 14 +++++++------- src/main/java/Terrain/{Biomes.java => Biome.java} | 2 +- src/test/java/MinerTest.java | 6 +++--- src/test/java/PlayerTest.java | 4 ++-- 6 files changed, 18 insertions(+), 18 deletions(-) rename src/main/java/Terrain/{Biomes.java => Biome.java} (80%) diff --git a/src/main/java/Action/DigAction.java b/src/main/java/Action/DigAction.java index 2b6103e..d657191 100644 --- a/src/main/java/Action/DigAction.java +++ b/src/main/java/Action/DigAction.java @@ -2,11 +2,11 @@ package Action; import Job.HasJob; import Job.Miner; -import Terrain.Biomes; +import Terrain.Biome; public class DigAction implements Action { - Biomes biome; - public DigAction(Biomes biome) { + Biome biome; + public DigAction(Biome biome) { this.biome = biome; } @Override diff --git a/src/main/java/Job/Miner.java b/src/main/java/Job/Miner.java index fde8439..94d7b78 100644 --- a/src/main/java/Job/Miner.java +++ b/src/main/java/Job/Miner.java @@ -1,7 +1,7 @@ package Job; import Inventory.HasInventory; -import Terrain.Biomes; +import Terrain.Biome; public class Miner extends Job { @@ -16,7 +16,7 @@ public class Miner extends Job { return actor; } - public void dig(Biomes biome) { + public void dig(Biome biome) { switch (biome) { case COAST: actor.getInventory().addItem("Sand"); diff --git a/src/main/java/Monster.java b/src/main/java/Monster.java index 8e031ba..9e1d6d7 100644 --- a/src/main/java/Monster.java +++ b/src/main/java/Monster.java @@ -1,33 +1,33 @@ import Entity.Position; -import Terrain.Biomes; +import Terrain.Biome; import java.util.*; public abstract class Monster extends Character{ - private final List habitat = new ArrayList<>(); + private final List habitat = new ArrayList<>(); public Monster() { - habitat.addAll(Arrays.asList(Biomes.GRASSLAND, Biomes.MOUNTAIN, Biomes.COAST, Biomes.FOREST)); + habitat.addAll(Arrays.asList(Biome.GRASSLAND, Biome.MOUNTAIN, Biome.COAST, Biome.FOREST)); } public Monster(Position position) { super(position); - habitat.addAll(Arrays.asList(Biomes.GRASSLAND, Biomes.MOUNTAIN, Biomes.COAST, Biomes.FOREST)); + habitat.addAll(Arrays.asList(Biome.GRASSLAND, Biome.MOUNTAIN, Biome.COAST, Biome.FOREST)); } public Monster(double health, double level, double energy, Position position) { super(health, level, energy, position); - habitat.addAll(Arrays.asList(Biomes.GRASSLAND, Biomes.MOUNTAIN, Biomes.COAST, Biomes.FOREST)); + habitat.addAll(Arrays.asList(Biome.GRASSLAND, Biome.MOUNTAIN, Biome.COAST, Biome.FOREST)); } - public Monster(double health, double level, double energy, Position position, List habitat) { + public Monster(double health, double level, double energy, Position position, List habitat) { super(health, level, energy, position); this.habitat.addAll(habitat); } //Är detta bra??? Med unmodifiableList dvs - public List getHabitat() { + public List getHabitat() { return Collections.unmodifiableList(habitat); } } diff --git a/src/main/java/Terrain/Biomes.java b/src/main/java/Terrain/Biome.java similarity index 80% rename from src/main/java/Terrain/Biomes.java rename to src/main/java/Terrain/Biome.java index d65bfde..62b4b54 100644 --- a/src/main/java/Terrain/Biomes.java +++ b/src/main/java/Terrain/Biome.java @@ -1,6 +1,6 @@ package Terrain; -public enum Biomes { +public enum Biome { GRASSLAND, MOUNTAIN, COAST, FOREST //Är inte fäst vid dessa diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java index 800a9b5..023ea69 100644 --- a/src/test/java/MinerTest.java +++ b/src/test/java/MinerTest.java @@ -1,6 +1,6 @@ import Entity.Player; import Job.Miner; -import Terrain.Biomes; +import Terrain.Biome; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -41,14 +41,14 @@ public class MinerTest { @Test void dig_in_coast_use_coast_loot() { var job = new Miner(defaultPlayer()); - job.dig(Biomes.COAST); + job.dig(Biome.COAST); assertThat(job.getActor().getInventory().getItems(), hasItem("Sand")); } @Test void dig_in_mountain_use_mountain_loot() { var job = new Miner(defaultPlayer()); - job.dig(Biomes.MOUNTAIN); + job.dig(Biome.MOUNTAIN); assertThat(job.getActor().getInventory().getItems(), hasItem("Stone")); } } diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index c8ceb7c..f088764 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -4,7 +4,7 @@ import Combat.OffensiveDamageSpell; import Entity.Position; import Job.Miner; import Entity.Player; -import Terrain.Biomes; +import Terrain.Biome; import org.junit.jupiter.api.Test; import Job.Wizard; @@ -58,7 +58,7 @@ class PlayerTest { void miner_can_dig() { var p = new Player("John"); p.learnJob(new Miner(p)); - p.performAction(new DigAction(Biomes.FOREST)); + p.performAction(new DigAction(Biome.FOREST)); assertThat(p.getInventory().getItems(), hasItem("Clay")); } -- 2.39.5 From 8ebe495c83a6341b714b99d3ff211480f99388d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Mon, 27 Oct 2025 23:31:28 +0100 Subject: [PATCH 14/15] Implement loot table --- src/main/java/Job/Miner.java | 13 +----- .../java/Shared/DefaultRandomProvider.java | 11 +++++ src/main/java/Shared/LootTable.java | 17 +++++-- src/main/java/Shared/RandomProvider.java | 5 +++ src/main/java/Terrain/Biome.java | 44 ++++++++++++++++++- src/test/java/LootTableTest.java | 13 +++--- src/test/java/MinerTest.java | 13 ++++-- src/test/java/PlayerTest.java | 6 ++- 8 files changed, 96 insertions(+), 26 deletions(-) create mode 100644 src/main/java/Shared/DefaultRandomProvider.java create mode 100644 src/main/java/Shared/RandomProvider.java diff --git a/src/main/java/Job/Miner.java b/src/main/java/Job/Miner.java index 94d7b78..f731381 100644 --- a/src/main/java/Job/Miner.java +++ b/src/main/java/Job/Miner.java @@ -17,16 +17,7 @@ public class Miner extends Job { } public void dig(Biome biome) { - switch (biome) { - case COAST: - actor.getInventory().addItem("Sand"); - break; - case MOUNTAIN: - actor.getInventory().addItem("Stone"); - break; - default: - actor.getInventory().addItem("Clay"); - break; - } + var item = biome.getLootTable().roll(); + actor.getInventory().addItem(item); } } diff --git a/src/main/java/Shared/DefaultRandomProvider.java b/src/main/java/Shared/DefaultRandomProvider.java new file mode 100644 index 0000000..2cc40fe --- /dev/null +++ b/src/main/java/Shared/DefaultRandomProvider.java @@ -0,0 +1,11 @@ +package Shared; + +import java.util.Random; + +public class DefaultRandomProvider implements RandomProvider { + private final Random random = new Random(); + @Override + public int nextInt(int bound) { + return random.nextInt(bound); + } +} diff --git a/src/main/java/Shared/LootTable.java b/src/main/java/Shared/LootTable.java index 93939b9..3b02763 100644 --- a/src/main/java/Shared/LootTable.java +++ b/src/main/java/Shared/LootTable.java @@ -5,13 +5,24 @@ import java.util.List; import java.util.Random; public class LootTable { - private final Random random; + private RandomProvider random; private final List> entries = new ArrayList<>(); + public LootTable() { - this.random = new Random(); + this.random = new DefaultRandomProvider(); } - public LootTable(Random random) { + + public LootTable(List> entries) { + this.random = new DefaultRandomProvider(); + this.entries.addAll(entries); + } + + public void setRandomProvider(RandomProvider random) { + this.random = random; + } + + public LootTable(RandomProvider random) { this.random = random; } diff --git a/src/main/java/Shared/RandomProvider.java b/src/main/java/Shared/RandomProvider.java new file mode 100644 index 0000000..bbaf10d --- /dev/null +++ b/src/main/java/Shared/RandomProvider.java @@ -0,0 +1,5 @@ +package Shared; + +public interface RandomProvider { + int nextInt(int bound); +} diff --git a/src/main/java/Terrain/Biome.java b/src/main/java/Terrain/Biome.java index 62b4b54..32b65d0 100644 --- a/src/main/java/Terrain/Biome.java +++ b/src/main/java/Terrain/Biome.java @@ -1,7 +1,49 @@ package Terrain; +import Shared.LootEntry; +import Shared.LootTable; + +import java.util.ArrayList; +import java.util.List; + public enum Biome { - GRASSLAND, MOUNTAIN, COAST, FOREST //Är inte fäst vid dessa + GRASSLAND("Grassland", new LootTable<>(new ArrayList<>(List.of( + new LootEntry<>("Mud", 10), + new LootEntry<>("Earth Root", 50), + new LootEntry<>("Crystal core", 180) + )) { + })), + MOUNTAIN("Mountain", new LootTable<>(new ArrayList<>(List.of( + new LootEntry<>("Rock", 10), + new LootEntry<>("Iron", 50), + new LootEntry<>("Diamond", 180) + )) { + })), + COAST("Coast", new LootTable<>(new ArrayList<>(List.of( + new LootEntry<>("Sand", 10), + new LootEntry<>("Shell", 50), + new LootEntry<>("Sandfish", 180) + )) { + })), + FOREST("Forest", new LootTable<>(new ArrayList<>(List.of( + new LootEntry<>("Moss", 10), + new LootEntry<>("Fairy rock", 50), + new LootEntry<>("Unicorn horn", 230) + )) { + })); + private final String name; + private final LootTable lootTable; + Biome(String name, LootTable lootTable) { + this.name = name; + this.lootTable = lootTable; + } + public String getName() { + return name; + } + + public LootTable getLootTable() { + return lootTable; + } } diff --git a/src/test/java/LootTableTest.java b/src/test/java/LootTableTest.java index cfafbb9..f91bcab 100644 --- a/src/test/java/LootTableTest.java +++ b/src/test/java/LootTableTest.java @@ -1,4 +1,5 @@ import Shared.LootTable; +import Shared.RandomProvider; import org.junit.jupiter.api.Test; import java.util.Random; @@ -6,6 +7,9 @@ import java.util.Random; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class LootTableTest { LootTable defaultLootTable() { @@ -24,12 +28,9 @@ public class LootTableTest { @Test void respects_weight_when_rolling() { - LootTable loot = new LootTable<>(new Random() { - @Override - public int nextInt(int bound) { - return 94; - } - }); + var mockRandomProvider = mock(RandomProvider.class); + when(mockRandomProvider.nextInt(anyInt())).thenReturn(94); + LootTable loot = new LootTable<>(mockRandomProvider); loot.addEntry("Stone", 90); loot.addEntry("Iron", 10); String result = loot.roll(); diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java index 023ea69..c075cf0 100644 --- a/src/test/java/MinerTest.java +++ b/src/test/java/MinerTest.java @@ -1,11 +1,15 @@ import Entity.Player; import Job.Miner; +import Shared.RandomProvider; import Terrain.Biome; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class MinerTest { private Player defaultPlayer() {return new Player("John"); } @@ -37,19 +41,22 @@ public class MinerTest { job.gainExperience(job.remainingXpUntilLevelUp() + 10); assertEquals(10, job.getExperience()); } - @Test - void dig_in_coast_use_coast_loot() { + void respects_biome_loot_table() { + RandomProvider random = bound -> 9; var job = new Miner(defaultPlayer()); + Biome.COAST.getLootTable().setRandomProvider(random); job.dig(Biome.COAST); assertThat(job.getActor().getInventory().getItems(), hasItem("Sand")); } @Test void dig_in_mountain_use_mountain_loot() { + RandomProvider random = bound -> 15; var job = new Miner(defaultPlayer()); + Biome.MOUNTAIN.getLootTable().setRandomProvider(random); job.dig(Biome.MOUNTAIN); - assertThat(job.getActor().getInventory().getItems(), hasItem("Stone")); + assertThat(job.getActor().getInventory().getItems(), hasItem("Iron")); } } diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index f088764..593629f 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -12,6 +12,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; class PlayerTest { private Player defaultPlayer() { @@ -58,8 +59,9 @@ class PlayerTest { void miner_can_dig() { var p = new Player("John"); p.learnJob(new Miner(p)); - p.performAction(new DigAction(Biome.FOREST)); - assertThat(p.getInventory().getItems(), hasItem("Clay")); + var mockAction = mock(DigAction.class); + p.performAction(mockAction); + verify(mockAction, times(1)).execute(any()); } @Test -- 2.39.5 From b61d678b5c5e3b7f1fd77f46f4162b03bce1c969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Tue, 28 Oct 2025 11:20:43 +0100 Subject: [PATCH 15/15] Implement Item --- src/main/java/Inventory/Inventory.java | 8 ++++--- src/main/java/Item/BasicItem.java | 13 +++++++++++ src/main/java/Item/Item.java | 6 +++++ src/main/java/Terrain/Biome.java | 32 ++++++++++++++------------ src/test/java/InventoryTest.java | 17 ++++++++++++++ src/test/java/MinerTest.java | 11 ++++----- 6 files changed, 63 insertions(+), 24 deletions(-) create mode 100644 src/main/java/Item/BasicItem.java create mode 100644 src/main/java/Item/Item.java create mode 100644 src/test/java/InventoryTest.java diff --git a/src/main/java/Inventory/Inventory.java b/src/main/java/Inventory/Inventory.java index 40cc222..6d65070 100644 --- a/src/main/java/Inventory/Inventory.java +++ b/src/main/java/Inventory/Inventory.java @@ -1,21 +1,23 @@ package Inventory; +import Item.Item; + import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Inventory { - List items; + List items; public Inventory() { items = new ArrayList<>(); } - public List getItems() { + public List getItems() { return Collections.unmodifiableList(items); } - public void addItem(String item) { + public void addItem(Item item) { items.add(item); } diff --git a/src/main/java/Item/BasicItem.java b/src/main/java/Item/BasicItem.java new file mode 100644 index 0000000..863776a --- /dev/null +++ b/src/main/java/Item/BasicItem.java @@ -0,0 +1,13 @@ +package Item; + +public record BasicItem(String id, String name) implements Item { + @Override + public String getId() { + return id; + } + + @Override + public String getName() { + return name; + } +} \ No newline at end of file diff --git a/src/main/java/Item/Item.java b/src/main/java/Item/Item.java new file mode 100644 index 0000000..6d88ff4 --- /dev/null +++ b/src/main/java/Item/Item.java @@ -0,0 +1,6 @@ +package Item; + +public interface Item { + String getId(); + String getName(); +} \ No newline at end of file diff --git a/src/main/java/Terrain/Biome.java b/src/main/java/Terrain/Biome.java index 32b65d0..185871d 100644 --- a/src/main/java/Terrain/Biome.java +++ b/src/main/java/Terrain/Biome.java @@ -1,5 +1,7 @@ package Terrain; +import Item.BasicItem; +import Item.Item; import Shared.LootEntry; import Shared.LootTable; @@ -8,33 +10,33 @@ import java.util.List; public enum Biome { GRASSLAND("Grassland", new LootTable<>(new ArrayList<>(List.of( - new LootEntry<>("Mud", 10), - new LootEntry<>("Earth Root", 50), - new LootEntry<>("Crystal core", 180) + new LootEntry<>(new BasicItem("mud", "Mud"), 10), + new LootEntry<>(new BasicItem("earth_root", "Earth Root"), 50), + new LootEntry<>(new BasicItem("crystal_core", "Crystal core"), 180) )) { })), MOUNTAIN("Mountain", new LootTable<>(new ArrayList<>(List.of( - new LootEntry<>("Rock", 10), - new LootEntry<>("Iron", 50), - new LootEntry<>("Diamond", 180) + new LootEntry<>(new BasicItem("rock", "Rock"), 10), + new LootEntry<>(new BasicItem("iron", "Iron"), 50), + new LootEntry<>(new BasicItem("diamond", "Diamond"), 180) )) { })), COAST("Coast", new LootTable<>(new ArrayList<>(List.of( - new LootEntry<>("Sand", 10), - new LootEntry<>("Shell", 50), - new LootEntry<>("Sandfish", 180) + new LootEntry<>(new BasicItem("sand", "Sand"), 10), + new LootEntry<>(new BasicItem("shell", "Shell"), 50), + new LootEntry<>(new BasicItem("sandfish", "Sandfish"), 180) )) { })), FOREST("Forest", new LootTable<>(new ArrayList<>(List.of( - new LootEntry<>("Moss", 10), - new LootEntry<>("Fairy rock", 50), - new LootEntry<>("Unicorn horn", 230) + new LootEntry<>(new BasicItem("moss", "Moss"), 10), + new LootEntry<>(new BasicItem("fairy_rock", "Fairy rock"), 50), + new LootEntry<>(new BasicItem("unicorn_horn", "Unicorn horn"), 230) )) { })); private final String name; - private final LootTable lootTable; - Biome(String name, LootTable lootTable) { + private final LootTable lootTable; + Biome(String name, LootTable lootTable) { this.name = name; this.lootTable = lootTable; } @@ -43,7 +45,7 @@ public enum Biome { return name; } - public LootTable getLootTable() { + public LootTable getLootTable() { return lootTable; } } diff --git a/src/test/java/InventoryTest.java b/src/test/java/InventoryTest.java new file mode 100644 index 0000000..1d143db --- /dev/null +++ b/src/test/java/InventoryTest.java @@ -0,0 +1,17 @@ +import Inventory.Inventory; +import Item.BasicItem; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +public class InventoryTest { + @Test + void can_add_item_to_inventory() { + var inventory = new Inventory(); + inventory.addItem(new BasicItem("iron_sword", "Iron Sword")); + assertThat(inventory.getItems(), hasItem( + hasProperty("id", equalTo("iron_sword")) + )); + } +} diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java index c075cf0..177d65a 100644 --- a/src/test/java/MinerTest.java +++ b/src/test/java/MinerTest.java @@ -5,11 +5,9 @@ import Terrain.Biome; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.*; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class MinerTest { private Player defaultPlayer() {return new Player("John"); } @@ -42,12 +40,13 @@ public class MinerTest { assertEquals(10, job.getExperience()); } @Test - void respects_biome_loot_table() { + void dig_in_coast_use_coast_loot() { RandomProvider random = bound -> 9; var job = new Miner(defaultPlayer()); Biome.COAST.getLootTable().setRandomProvider(random); job.dig(Biome.COAST); - assertThat(job.getActor().getInventory().getItems(), hasItem("Sand")); + assertThat(job.getActor().getInventory().getItems(), hasItem( + hasProperty("id", equalTo("sand")))); } @Test @@ -56,7 +55,7 @@ public class MinerTest { var job = new Miner(defaultPlayer()); Biome.MOUNTAIN.getLootTable().setRandomProvider(random); job.dig(Biome.MOUNTAIN); - assertThat(job.getActor().getInventory().getItems(), hasItem("Iron")); + assertThat(job.getActor().getInventory().getItems(), hasItem( hasProperty("id", equalTo("iron")))); } } -- 2.39.5