Create modules #6

Merged
erns6604 merged 2 commits from player into main 2025-10-17 16:09:39 +02:00
20 changed files with 196 additions and 119 deletions
Showing only changes of commit 2c0534e27a - Show all commits

View File

@@ -18,10 +18,10 @@ RWRD implements common elements from roguelikes, and games in general.
### The player ### The player
The player object is a representation of the user and it's agency in the game world The player object is a representation of the user and it's agency in the game world
### Player ### Entity.Player
- Player - Entity.Player
- Enemies - Enemies
-- Bosses -- Bosses
- Class system - Class system

View File

@@ -1,5 +1,5 @@
package Action; package Action;
public abstract class Action { public interface Action {
public static Dig Dig = new Dig(); void exectue(Actor player);
} }

View File

@@ -0,0 +1,8 @@
package Action;
import Job.Job;
public interface Actor {
Job getJob();
void performAction(Action action);
}

View File

@@ -1,5 +0,0 @@
package Action;
public class Dig extends Action {
}

View File

@@ -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!");
}
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,6 @@
package Combat;
public interface HasHealth {
void setHealth(int health);
boolean isAlive();
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,6 @@
package Entity;
public interface HasPosition {
Position getPosition();
void setPosition(Position position);
}

View File

@@ -1,3 +1,7 @@
package Entity;
public interface Movable { public interface Movable {
void moveTo(Position position); void moveTo(Position position);
boolean canMoveTo(Position position);
} }

View File

@@ -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<String> 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<String> 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;
}
}

View File

@@ -1 +1,3 @@
package Entity;
public record Position(int x, int y) {} public record Position(int x, int y) {}

View File

@@ -0,0 +1,7 @@
package Inventory;
import java.util.List;
public interface HasInventory {
List<String> getInventory();
}

View File

@@ -0,0 +1,6 @@
package Job;
public interface HasJob {
Job getJob();
void learnJob(Job job);
}

View File

@@ -1,21 +1,40 @@
package Job; package Job;
public abstract class Job { import Action.Actor;
private int level;
abstract void performJobAction();
Job() { import java.util.Objects;
public abstract class Job {
protected int level;
protected String name;
Job(String name) {
this.name = name;
this.level = 1; this.level = 1;
} }
Job(int level) {
this.level = level;
}
public double getLevel() { public double getLevel() {
return level; return level;
}; }
public void levelUp() { public void levelUp() {
level++; 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);
}
} }

View File

@@ -1,30 +1,18 @@
package Job; package Job;
import java.util.Objects; import Action.Actor;
import Inventory.HasInventory;
public class Miner extends Job { public class Miner extends Job {
private final String jobName = "Miner"; public Miner() {
super("Miner");
}
public Miner() {}
@Override public void dig(Actor actor) {
public void performJobAction() { if(actor instanceof HasInventory a) {
System.out.println("Dig..."); 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);
}
} }

View File

@@ -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<String> 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<String> getInventory() {
return items;
}
}

View File

@@ -1,23 +1,24 @@
import Action.Action; import Entity.Player;
import Job.Miner; import Job.Miner;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import Action.DigAction;
public class MinerTest { public class MinerTest {
@Test @Test
void miner_can_dig() { void miner_can_dig() {
var p = new Player("Steve"); var p = new Player("John");
var job = new Miner(); var job = new Miner();
p.learnJob(job); p.learnJob(job);
p.performAction(Action.Dig); p.performAction(new DigAction());
assertTrue(p.getInventory().contains("Stone")); assertTrue(p.getInventory().contains("Stone"));
} }
@Test @Test
void miner_can_level_up() { void miner_can_level_up() {
var p = new Player("Steve");
var job = new Miner(); var job = new Miner();
assertEquals(1, job.getLevel()); assertEquals(1, job.getLevel());
job.levelUp(); job.levelUp();

View File

@@ -1,4 +1,6 @@
import Entity.Position;
import Job.Miner; import Job.Miner;
import Entity.Player;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;