From 540bd75ac9e75953974ddf55686ca80f744cc932 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Fri, 8 Nov 2024 20:23:32 -0700 Subject: [PATCH 001/154] Half entities finished, API MapFacotry completed --- src/main/java/entity/City.java | 68 ++++++++ src/main/java/entity/Desert.java | 69 ++++++++ src/main/java/entity/Entityconstants.java | 27 ++++ src/main/java/entity/Forest.java | 68 ++++++++ src/main/java/entity/Iceland.java | 69 ++++++++ src/main/java/entity/Inventory.java | 82 ++++++++++ src/main/java/entity/Location.java | 75 +++++++++ src/main/java/entity/Main.java | 16 ++ src/main/java/entity/MapFactory.java | 179 +++++++++++++++++++++ src/main/java/entity/Maps.java | 22 +++ src/main/java/entity/Plain.java | 69 ++++++++ src/main/java/entity/Player.java | 54 +++++++ src/main/java/entity/PlayerAttributes.java | 78 +++++++++ 13 files changed, 876 insertions(+) create mode 100644 src/main/java/entity/City.java create mode 100644 src/main/java/entity/Desert.java create mode 100644 src/main/java/entity/Entityconstants.java create mode 100644 src/main/java/entity/Forest.java create mode 100644 src/main/java/entity/Iceland.java create mode 100644 src/main/java/entity/Inventory.java create mode 100644 src/main/java/entity/Location.java create mode 100644 src/main/java/entity/Main.java create mode 100644 src/main/java/entity/MapFactory.java create mode 100644 src/main/java/entity/Maps.java create mode 100644 src/main/java/entity/Plain.java create mode 100644 src/main/java/entity/Player.java create mode 100644 src/main/java/entity/PlayerAttributes.java diff --git a/src/main/java/entity/City.java b/src/main/java/entity/City.java new file mode 100644 index 000000000..3bed016ee --- /dev/null +++ b/src/main/java/entity/City.java @@ -0,0 +1,68 @@ +package entity; + +/** + * This is city subtype of location. + */ +public class City implements Location { + private double foodresource; + private double waterresource; + private double firearmresource; + private double nonfirearmresource; + private double peopleresource; + private double temperature; + private double threat; + + public City(int dist) { + this.foodresource = Entityconstants.STARTERRESOURCESCALAR; + this.waterresource = Entityconstants.STARTERRESOURCESCALAR; + this.firearmresource = getfirearmresourceavailable(dist); + this.nonfirearmresource = getnonfirearmresourceavailable(dist); + this.peopleresource = getpeopleresourceavailable(dist); + this.temperature = Entityconstants.STARTERRESOURCESCALAR; + this.threat = getthreatlevel(dist); + } + + @Override + public Double gettemperature(int dist) { + return this.temperature; + } + + @Override + public Double getpeopleresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getfoodresourceavailable(int dist) { + return this.foodresource; + } + + @Override + public Double getwaterresourceavailable(int dist) { + return this.waterresource; + } + + @Override + public Double getfirearmresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getnonfirearmresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public void decreaseresourceavailable() { + this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; + this.firearmresource = this.firearmresource * Entityconstants.RESOUCEDECREASERATIO; + this.nonfirearmresource = this.nonfirearmresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public Double getthreatlevel(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } +} diff --git a/src/main/java/entity/Desert.java b/src/main/java/entity/Desert.java new file mode 100644 index 000000000..7fdd0f64b --- /dev/null +++ b/src/main/java/entity/Desert.java @@ -0,0 +1,69 @@ +package entity; + +/** + * This is location form of Desert. + */ +public class Desert implements Location { + private double foodresource; + private double waterresource; + private double firearmresource; + private double nonfirearmresource; + private double peopleresource; + private final double temperature; + private final double threat; + + public Desert(int dist) { + this.foodresource = Entityconstants.STARTERRESOURCESCALAR; + this.waterresource = getwaterresourceavailable(dist); + this.firearmresource = Entityconstants.STARTERRESOURCESCALAR; + this.nonfirearmresource = getnonfirearmresourceavailable(dist); + this.peopleresource = getpeopleresourceavailable(dist); + this.temperature = gettemperature(dist); + this.threat = Entityconstants.STARTERRESOURCESCALAR; + } + + @Override + public Double gettemperature(int dist) { + return Entityconstants.DEFAULTTEMP + (Entityconstants.MAXTEMPDIFF * (1 / (dist + 1))); + } + + @Override + public Double getpeopleresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); + } + + @Override + public Double getfoodresourceavailable(int dist) { + return this.foodresource; + } + + @Override + public Double getwaterresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); + } + + @Override + public Double getfirearmresourceavailable(int dist) { + return this.firearmresource; + } + + @Override + public Double getnonfirearmresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); + } + + @Override + public void decreaseresourceavailable() { + this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; + this.firearmresource = this.firearmresource * Entityconstants.RESOUCEDECREASERATIO; + this.nonfirearmresource = this.nonfirearmresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public Double getthreatlevel(int dist) { + return this.threat; + } + +} diff --git a/src/main/java/entity/Entityconstants.java b/src/main/java/entity/Entityconstants.java new file mode 100644 index 000000000..7eb881487 --- /dev/null +++ b/src/main/java/entity/Entityconstants.java @@ -0,0 +1,27 @@ +package entity; + +/** + * Constants used in this program. + */ +public class Entityconstants { + public static final int STARTERFOOD = 100; + public static final int STARTERWATER = 100; + public static final int STARTFIREARM = 5; + public static final int STARTERNONFIREARM = 5; + public static final int STARTERPEOPLE = 10; + public static final int STARTERATRIBUTEPOINT = 20; + public static final double STARTERRESOURCESCALAR = 1; + public static final double RESOUCEDECREASERATIO = 0.7; + public static final double DEFAULTTEMP = 25; + public static final int CORERANGE = 16; + public static final double DEFAULTTHREAT = 1; + public static final double MAXTEMPDIFF = 50; + public static final double MAXTHREATDIFF = 0.5; + public static final String ICELAND = "Iceland"; + public static final String DESERT = "Desert"; + public static final String FOREST = "Forest"; + public static final String CITY = "City"; + public static final String PLAIN = "Plain"; + public static final int BIOMERADIUS = 16; + +} diff --git a/src/main/java/entity/Forest.java b/src/main/java/entity/Forest.java new file mode 100644 index 000000000..d569804a3 --- /dev/null +++ b/src/main/java/entity/Forest.java @@ -0,0 +1,68 @@ +package entity; + +/** + * This is woods subtype of location. + */ +public class Forest implements Location { + private double foodresource; + private double waterresource; + private double firearmresource; + private double nonfirearmresource; + private double peopleresource; + private double temperature; + private double threat; + + public Forest(int dist) { + this.foodresource = getfoodresourceavailable(dist); + this.waterresource = getwaterresourceavailable(dist); + this.firearmresource = Entityconstants.STARTERRESOURCESCALAR; + this.nonfirearmresource = Entityconstants.STARTERRESOURCESCALAR; + this.peopleresource = Entityconstants.STARTERRESOURCESCALAR; + this.temperature = Entityconstants.STARTERRESOURCESCALAR; + this.threat = Entityconstants.STARTERRESOURCESCALAR; + } + + @Override + public Double gettemperature(int dist) { + return this.temperature; + } + + @Override + public Double getpeopleresourceavailable(int dist) { + return this.peopleresource; + } + + @Override + public Double getfoodresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getwaterresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getfirearmresourceavailable(int dist) { + return this.firearmresource; + } + + @Override + public Double getnonfirearmresourceavailable(int dist) { + return this.nonfirearmresource; + } + + @Override + public void decreaseresourceavailable() { + this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; + this.firearmresource = this.firearmresource * Entityconstants.RESOUCEDECREASERATIO; + this.nonfirearmresource = this.nonfirearmresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public Double getthreatlevel(int dist) { + return this.threat; + } +} diff --git a/src/main/java/entity/Iceland.java b/src/main/java/entity/Iceland.java new file mode 100644 index 000000000..0e3c5f55d --- /dev/null +++ b/src/main/java/entity/Iceland.java @@ -0,0 +1,69 @@ +package entity; + +/** + * This is location form of Iceland. + */ +public class Iceland implements Location { + private double foodresource; + private double waterresource; + private double firearmresource; + private double nonfirearmresource; + private double peopleresource; + private final double temperature; + private final double threat; + + public Iceland(int dist) { + this.foodresource = Entityconstants.STARTERRESOURCESCALAR; + this.waterresource = getwaterresourceavailable(dist); + this.firearmresource = Entityconstants.STARTERRESOURCESCALAR; + this.nonfirearmresource = Entityconstants.STARTERRESOURCESCALAR; + this.peopleresource = getpeopleresourceavailable(dist); + this.temperature = gettemperature(dist); + this.threat = getthreatlevel(dist); + } + + @Override + public Double gettemperature(int dist) { + return Entityconstants.DEFAULTTEMP - (Entityconstants.MAXTEMPDIFF * (1 / (dist + 1))); + } + + @Override + public Double getpeopleresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); + } + + @Override + public Double getfoodresourceavailable(int dist) { + return this.foodresource; + } + + @Override + public Double getwaterresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getfirearmresourceavailable(int dist) { + return this.firearmresource; + } + + @Override + public Double getnonfirearmresourceavailable(int dist) { + return this.nonfirearmresource; + } + + @Override + public void decreaseresourceavailable() { + this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; + this.firearmresource = this.firearmresource * Entityconstants.RESOUCEDECREASERATIO; + this.nonfirearmresource = this.nonfirearmresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public Double getthreatlevel(int dist) { + return Entityconstants.STARTERRESOURCESCALAR - (Entityconstants.MAXTHREATDIFF / (dist + 1)); + } + +} diff --git a/src/main/java/entity/Inventory.java b/src/main/java/entity/Inventory.java new file mode 100644 index 000000000..f4147e3f1 --- /dev/null +++ b/src/main/java/entity/Inventory.java @@ -0,0 +1,82 @@ +package entity; + +/** + * Class reponsible for representing inventory and inventory only, provide initial resources, getter and change method. + */ +public class Inventory { + + private int food; + private int water; + private int firearm; + private int nonfirearm; + private int people; + + public Inventory() { + this.food = Entityconstants.STARTERFOOD; + this.water = Entityconstants.STARTERWATER; + this.firearm = Entityconstants.STARTFIREARM; + this.nonfirearm = Entityconstants.STARTERNONFIREARM; + this.people = Entityconstants.STARTERPEOPLE; + } + + public int getFood() { + return food; + } + + /** + * Changing food in inventory, can be pos or neg. + * @param foodchange the change which is happening. + */ + public void changeFood(int foodchange) { + this.food = this.food + foodchange; + } + + public int getWater() { + return water; + } + + /** + * Changing water in inventory, can be pos or neg. + * @param Waterchange the change which is happening. + */ + public void changeWater(int Waterchange) { + this.water = this.water + Waterchange; + } + + public int getFirearm() { + return firearm; + } + + /** + * Changing firearm in inventory, can be pos or neg. + * @param firearmChange the change which is happening. + */ + public void changeFirearm(int firearmChange) { + this.firearm = this.firearm + firearmChange; + } + + public int getNonfirearm() { + return nonfirearm; + } + + /** + * Changing nonfirearm in inventory, can be pos or neg. + * @param nonfirearmChange the change which is happening. + */ + public void changeNonfirearm(int nonfirearmChange) { + this.nonfirearm = this.nonfirearm + nonfirearmChange; + } + + public int getPeople() { + return people; + } + + /** + * Changing people in inventory, can be pos or neg. + * @param peopleChange the change which is happening. + */ + public void changePeople(int peopleChange) { + this.people = this.people + peopleChange; + } + +} diff --git a/src/main/java/entity/Location.java b/src/main/java/entity/Location.java new file mode 100644 index 000000000..03dd97f9d --- /dev/null +++ b/src/main/java/entity/Location.java @@ -0,0 +1,75 @@ +package entity; + +/** + * Interface for location (each specific xy coordinate), any environment should implement these. + * Notice, these are just basic and essential functions satisfying Interface segregation(no unnessary implement) + * Notice as I said scalar closer to something increases is only for map construction step where each location + * starts with a higher or lower scalar. The only time resource scalar change is when player stay in same spot, decrease + * each day by some perportion. + */ +public interface Location { + + /** + * temperature is crucial for calculating food/water consumption. ideally, more closer to core of iceland, + * Colder it is, as well as desert, specific calculation are for later. + * @param distance distance of location from it's core. + * @return tempurature. + */ + Double gettemperature(int distance); + + /** + * Crucial to the number people joins, in a double represent the number we'll use as scalar for people increase + * Method. + * Ideally, more closer to core of city (center as more populated), it will be higher. + * And the longer they stay in same spot, the scalar decrease(people already joined or don't wanna join so decrease) + * @param distance distance from it's core. + * @return people resource scalar. + */ + Double getpeopleresourceavailable(int distance); + + /** + * Crucial to the number of food gathers act as scalar. Ideally, make it high in city and woods, the scalar decrease + * as the longer they stayed. + * @param distance distance from it's core. + * @return food resource scalar + */ + Double getfoodresourceavailable(int distance); + + /** + * Crucial to the number of water gathers act as scalar. Ideally, make it high in iceland and wood + * the scalar decrease as the longer they stayed. + * @param distance distance from it's core. + * @return water resource scalar + */ + Double getwaterresourceavailable(int distance); + + /** + * Crucial to number of firearm gathered. Closer to city center, this scalar will be higher. + * Same spot, decrease this. + * @param distance distance from it's core. + * @return firearm resouce scalar + */ + Double getfirearmresourceavailable(int distance); + + /** + * Crucial to number of nonfirearm gathered. Closer to city center, this scalar will be higher. + * Same spot, decrease this. + * @param distance distance from it's core. + * @return nonfirearm resouce scalar. + */ + Double getnonfirearmresourceavailable(int distance); + + /** + * The method responsible for decrease the scalar of the location if they stayed, by some perportion + * Notice, it is for all 5 resource scalar. + */ + void decreaseresourceavailable(); + + /** + * The threat level of this location, used for calculating power of the horde, and people decrease. + * Closer to city core, more threatlevel, Closer to iceland/desert,(as they are more isolated) lower threat. + * @param distance distance from it's core. + * @return threatlevel. + */ + Double getthreatlevel(int distance); +} diff --git a/src/main/java/entity/Main.java b/src/main/java/entity/Main.java new file mode 100644 index 000000000..6e44b6f69 --- /dev/null +++ b/src/main/java/entity/Main.java @@ -0,0 +1,16 @@ +package entity; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; + +public class Main { + public static void main(String[] args) { + ArrayList environments = new ArrayList<>(Arrays.asList("Iceland", "Desert", "Forest", "City", "Plain")); + MapFactory Mapfact =new MapFactory(); + ArrayList>>> cores = + Mapfact.getCores(100, 100, environments); + ArrayList> grids = Mapfact.getGrids(100, 100, cores); + Mapfact.printGrids(grids); + } +} diff --git a/src/main/java/entity/MapFactory.java b/src/main/java/entity/MapFactory.java new file mode 100644 index 000000000..bf388f1bd --- /dev/null +++ b/src/main/java/entity/MapFactory.java @@ -0,0 +1,179 @@ +package entity; + +import java.util.*; + +/** + * This class is responsible for creating the map with randomization. + * Method returns location of core for resourse calculation. + * Method returns the grid for map data. + */ +public class MapFactory { + + /** + * Method for generating different core for each environment in the format + * [{City: [(100, 200), (50 100)]}, {iceland: [(50, 50)]}] + * In this example, city have two core (100, 200) (50, 100), which have be used for calculating resources scalar. + * @param xWidth Map size, the width + * @param yLength Map size, the length + * @param typeOfEnvironment list of different environments, iceland woods etc. + * @return Return the description above in that format. + */ + public ArrayList>>> getCores( + final int xWidth, final int yLength, final ArrayList typeOfEnvironment) { + final ArrayList>>> environmentCores = new ArrayList<>(); + final Random random = new Random(); + for (final String environment : typeOfEnvironment) { + final ArrayList> coreCoordinates = new ArrayList<>(); + final int numberOfCores = 1 + random.nextInt(5); + for (int i = 0; i < numberOfCores; i++) { + Map.Entry newCore; + boolean validCore; + do { + final int x = random.nextInt(xWidth); + final int y = random.nextInt(yLength); + newCore = new AbstractMap.SimpleEntry<>(x, y); + validCore = true; + for (Map.Entry existingCore : coreCoordinates) { + if (calculateDistance(existingCore, newCore) < Entityconstants.CORERANGE) { + validCore = false; + break; + } + } + } while (!validCore); + coreCoordinates.add(newCore); + } + final Map>> environmentMap = new HashMap<>(); + environmentMap.put(environment, coreCoordinates); + environmentCores.add(environmentMap); + } + return environmentCores; + } + // This is a hlper method + private double calculateDistance(Map.Entry point1, Map.Entry point2) { + final int xDiff = point1.getKey() - point2.getKey(); + final int yDiff = point1.getValue() - point2.getValue(); + return Math.sqrt(xDiff * xDiff + yDiff * yDiff); + } + + /** + * Construct the map/grid using the cores provided. + * @param xWidth Map size width. + * @param yLength Map size length. + * @param cores DIfferent cores given. + * @return grid made of locations + */ + + public ArrayList> getGrids( + final int xWidth, final int yLength, ArrayList>>> cores + ) { + final ArrayList> grids = initializeGrid(xWidth, yLength); + for (Map>> environmentCores : cores) { + for (Map.Entry>> entry : environmentCores.entrySet()) { + updateGridWithEnvironment(grids, entry, xWidth, yLength); + } + } + return grids; + } + + // Helper method to initialize the grid with default plain as dealut. + private ArrayList> initializeGrid(final int xWidth, final int yLength) { + final ArrayList> grids = new ArrayList<>(); + for (int x = 0; x < xWidth; x++) { + final ArrayList partGrids = new ArrayList<>(); + for (int y = 0; y < yLength; y++) { + partGrids.add(new Plain()); + } + grids.add(partGrids); + } + return grids; + } + + // Helper method to update the grid based on the environment and its core coordinates + private void updateGridWithEnvironment( + final ArrayList> grids, + final Map.Entry>> environmentEntry, + final int xWidth, + final int yLength + ) { + final String environmentType = environmentEntry.getKey(); + final ArrayList> coordinates = environmentEntry.getValue(); + final int radius = Entityconstants.BIOMERADIUS; + for (Map.Entry coordinate : coordinates) { + final int centerX = coordinate.getKey(); + final int centerY = coordinate.getValue(); + iterateGridWithinRadius(grids, environmentType, centerX, centerY, radius, xWidth, yLength); + } + } + + // Helper method to iterate over grid cells within a radius and modify them + private void iterateGridWithinRadius( + final ArrayList> grids, + final String environmentType, + final int centerX, + final int centerY, + final int radius, + final int xWidth, + final int yLength + ) { + for (int x = Math.max(0, centerX - radius); x < Math.min(xWidth, centerX + radius); x++) { + for (int y = Math.max(0, centerY - radius); y < Math.min(yLength, centerY + radius); y++) { + final int distance = (int) Math.sqrt(Math.pow(x - centerX, 2) + Math.pow(y - centerY, 2)); + if (distance <= radius) { + final Location newLocation = createLocationByTypeAndDistance(environmentType, distance); + grids.get(x).set(y, newLocation); + } + } + } + } + + // Helper method to create a Location + private Location createLocationByTypeAndDistance(String environmentType, int distance) { + switch (environmentType) { + case Entityconstants.CITY: + return new City(distance); + case Entityconstants.FOREST: + return new Forest(distance); + case Entityconstants.PLAIN: + return new Plain(); + case Entityconstants.ICELAND: + return new Iceland(distance); + case Entityconstants.DESERT: + return new Desert(distance); + default: + return new Plain(); + } + } + + /** + * Prints the grid to the console, using specific characters to represent each Location type. + * P - Plain, H - Iceland, D - Desert, C - City, F - Forest + * @param grids The grid made of locations. + */ + public void printGrids(ArrayList> grids) { + for (ArrayList row : grids) { + for (Location loc : row) { + // Determine the character representation based on the Location type + if (loc instanceof Plain) { + System.out.print("P "); + } + else if (loc instanceof Iceland) { + System.out.print("i "); + } + else if (loc instanceof Desert) { + System.out.print(" "); + } + else if (loc instanceof City) { + System.out.print("W "); + } + else if (loc instanceof Forest) { + System.out.print("' "); + } + else { + System.out.print("? "); + } + } + System.out.println(); + } + } + +} diff --git a/src/main/java/entity/Maps.java b/src/main/java/entity/Maps.java new file mode 100644 index 000000000..16c7b8f57 --- /dev/null +++ b/src/main/java/entity/Maps.java @@ -0,0 +1,22 @@ +package entity; + +import java.util.ArrayList; +import java.util.Map; + +/** + * This class represent the map of the game. + * Notice, the map generating process (randomly) should be done by map factory class and pass the grid to here in main. + */ + +public class Maps { + private ArrayList> grid; + + public Maps(ArrayList> grid) { + this.grid = grid; + + } + + public ArrayList> getGrid() { + return grid; + } +} diff --git a/src/main/java/entity/Plain.java b/src/main/java/entity/Plain.java new file mode 100644 index 000000000..1ab7ecd15 --- /dev/null +++ b/src/main/java/entity/Plain.java @@ -0,0 +1,69 @@ +package entity; + +/** + * This is location form of plain, more like default, which is not any of special biome (iceland, desert etc). + */ +public class Plain implements Location { + private double foodresource; + private double waterresource; + private double firearmresource; + private double nonfirearmresource; + private double peopleresource; + private final double temperature; + private final double threat; + + public Plain() { + this.foodresource = Entityconstants.STARTERRESOURCESCALAR; + this.waterresource = Entityconstants.STARTERRESOURCESCALAR; + this.firearmresource = Entityconstants.STARTERRESOURCESCALAR; + this.nonfirearmresource = Entityconstants.STARTERRESOURCESCALAR; + this.peopleresource = Entityconstants.STARTERRESOURCESCALAR; + this.temperature = Entityconstants.DEFAULTTEMP; + this.threat = Entityconstants.DEFAULTTHREAT; + } + + @Override + public Double gettemperature(int dist) { + return temperature; + } + + @Override + public Double getpeopleresourceavailable(int dist) { + return this.peopleresource; + } + + @Override + public Double getfoodresourceavailable(int dist) { + return this.foodresource; + } + + @Override + public Double getwaterresourceavailable(int dist) { + return this.waterresource; + } + + @Override + public Double getfirearmresourceavailable(int dist) { + return this.firearmresource; + } + + @Override + public Double getnonfirearmresourceavailable(int dist) { + return this.nonfirearmresource; + } + + @Override + public void decreaseresourceavailable() { + this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; + this.firearmresource = this.firearmresource * Entityconstants.RESOUCEDECREASERATIO; + this.nonfirearmresource = this.nonfirearmresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public Double getthreatlevel(int dist) { + return this.threat; + } + +} diff --git a/src/main/java/entity/Player.java b/src/main/java/entity/Player.java new file mode 100644 index 000000000..d5fb3871c --- /dev/null +++ b/src/main/java/entity/Player.java @@ -0,0 +1,54 @@ +package entity; + +/** + * Player class of the program, could be used for scoreborad extension of the program, ranked by score & won. + * This classes should only be responsible for keeping and updating the data, not score calculation process. + * The class should only be updating any instance (player of it) once and which is after game ends, not termination! + * The getter might be called multiple time for score board representation. + */ +public class Player { + private String name; + private int score; + private int dayssurvived; + private boolean won; + + public Player(String name) { + this.name = name; + this.score = 0; + this.dayssurvived = 0; + this.won = false; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score = score; + } + + public int getDayssurvived() { + return dayssurvived; + } + + public void setDayssurvived(int dayssurvived) { + this.dayssurvived = dayssurvived; + } + + public boolean getWon() { + return won; + } + + public void setWon(boolean won) { + this.won = won; + } + +} diff --git a/src/main/java/entity/PlayerAttributes.java b/src/main/java/entity/PlayerAttributes.java new file mode 100644 index 000000000..88a4de629 --- /dev/null +++ b/src/main/java/entity/PlayerAttributes.java @@ -0,0 +1,78 @@ +package entity; + +/** + * Class responsible for storing attribution information and updates. + * Note, the class shouldn't be called after player formally "started" the game as attributes are fixed. + * Points: how many points you have to allowcate. If difficulty extention introduced, change the starterattributepoint. + * Charismma: Increase the chance and number of people joined after each broadcast. + * Luck: Increase probability of positive events, Decrease probability of negative events. + * Mobilization: Better mobilizartion ability allow group to move faster. num of action perday increase accordingly. + * Thrift: Ability of better allowcating resources, decrease food/water consumption. + * Generalship: Increase firepower by changing/increase perportion of how it's calculated. + * Could be more for modification added later. + */ + +public class PlayerAttributes { + private int points; + private int charisma; + private int luck; + private int mobilization; + private int thrift; + private int generalship; + + public PlayerAttributes() { + this.points = Entityconstants.STARTERATRIBUTEPOINT; + this.charisma = 0; + this.luck = 0; + this.mobilization = 0; + this.thrift = 0; + } + + public int getPoints() { + return points; + } + + public void setPoints(int points) { + this.points = points; + } + + public int getCharisma() { + return charisma; + } + + public void setCharisma(int charisma) { + this.charisma = charisma; + } + + public int getLuck() { + return luck; + } + + public void setLuck(int luck) { + this.luck = luck; + } + + public int getMobilization() { + return mobilization; + } + + public void setMobilization(int mobilization) { + this.mobilization = mobilization; + } + + public int getThrift() { + return thrift; + } + + public void setThrift(int thrift) { + this.thrift = thrift; + } + + public int getGeneralship() { + return generalship; + } + + public void setGeneralship(int generalship) { + this.generalship = generalship; + } +} From db52e202d3f2cccb30207237cbf448ba218a9a53 Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Sun, 10 Nov 2024 13:44:51 -0500 Subject: [PATCH 002/154] creating README.md and User Stories and Functional Requirements --- README.md | 92 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 66 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 5e1d8b77c..41b35a4f8 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,76 @@ -# Note Application +## Group members && GitHub id -This is a minimal example demonstrating usage of the -password-protected user part of the API used in lab 5. +Yitong An - Adidazdoge +Haoze Li +Ze Kun Song +Owen Hexiang Wang +Xiaoshu Lin - Michael-lin6677 -You can find more information about the API endpoints in -[the documentation](https://www.postman.com/cloudy-astronaut-813156/csc207-grade-apis-demo/documentation/fg3zkjm/5-password-protected-user). +## Software Specification +The game is a 60-day simulation in which the player acts as a group leader navigating +the challenges of a zombie apocalypse. Players allocate a set number of initial points +across resources (e.g., people, weaponry, food, luck) before the first day. These choices +impact the group's survival strategies and outcomes. Each day, the program provides a +brief description of the group's current location and what has transpired, such as how +many people survived or died, the quantity of resources found, or any weaponry acquired. -If your team is considering an application for which it would be convenient to -store data in something like a database, you may find that the API calls demonstrated -here will be useful in your project, as this will allow you to store -an arbitrary JSON object associated with a username and password. -In this application, a single note has a name (the "username" in terms of the API) and the note -can be read by anyone who knows the name — but only edited by someone who -knows the password for it. +### User Stories and Functional Requirements -You can see the documentation in the various files for more information. +**1. Allocation of Remaining Points** - Yitong An +- **Feature**: Points Allocation System +- **As a player**: + - I want to allocate my remaining points to my Team, Weapons, Food, and Luck, + - so I can strengthen specific areas and increase my chances of survival. +- **Requirements**: + - Players can see how many points are available to allocate. + - Players can distribute points to Team, Weapons, Food, or Luck as they choose. + - Allocated points are applied immediately and affect the player’s stats. -## Testing +**2. Status Check** - Haoze Li +- **Feature**: Status Update Interface +- **As a player**: + - I want to get updates on the current status so I can make informed decisions. +- **Requirements**: + - Players can view: + - **Weather**: Information on current weather conditions. + - **Environment**: Description of surroundings, including potential threats + - or opportunities. + - **Location**: The current position on the map. + - **Date**: In-game date to help track progression. + - **Backpack**: Inventory overview, showing items and supplies. + - **Body State**: Health and energy status of team members. -The repo also includes an example of a use case interactor test, as well as -an example of an end-to-end test which automates button clicks and inspects -the contents of the actual views. This is something we discussed in the lectures -about testing in CA but had not provided a code example of before. Note, one -could also inspect the contents of the ViewModel objects instead when testing -CA to make a similar test which would be less dependent on the details of the -specific UI implementation. +**3. Decision-Making Actions** - Ze Kun Song +- **Feature**: Action Menu +- **As a player**: + - I want to make strategic decisions like moving, gathering, defending, + - or broadcasting to improve my team’s survival. +- **Requirements**: + - **Move**: Enables relocation to a new area on the map. + - **Gather**: Allows collection of resources from the current environment. + - **Defend**: Option to set up defenses against threats. + - **Broadcast**: Sends out signals or attempts to locate survivors and information. + - Actions have context-dependent outcomes, with feedback influenced by + - the environment or events. -## Project Starter Code +**4. Interaction with Random Events** - Owen Hexiang Wang +- **Feature**: Random Events Engine +- **As a player**: + - I want to interact with unexpected events to experience realistic challenges and + - surprises. +- **Requirements**: + - Random events are triggered based on factors like location, weather, + - and player actions. + - Events impact resources, health, or the environment, requiring adaptive strategies. + +**5. Game Exit** - Xiaoshu Lin +- **Feature**: Exit Game +- **As a player**: + - I want the option to end or save my game to resume later. +- **Requirements**: + - Players can choose to end or save their progress. + - When ending, the game provides a summary of progress, achievements, and challenges + - faced. -Your team may choose to use this repo as starter code for your project. You could -also use the lab 5 code — or start from an empty repo if your team prefers. -If you choose to use one of the repositories we have provided, you can either make -a fork of it or copy the subset of code you want into a completely new repository. From 76c2bd9cd4883b3b5c91de6ce61dab79ae326eec Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Sun, 10 Nov 2024 13:49:56 -0500 Subject: [PATCH 003/154] update Github id --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 41b35a4f8..bf44112c8 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ ## Group members && GitHub id -Yitong An - Adidazdoge +Yitong An Haoze Li Ze Kun Song -Owen Hexiang Wang +Owen Hexiang Wang- Adidazdoge Xiaoshu Lin - Michael-lin6677 ## Software Specification From de2205a2adf082bcdd43c93c68bb0b08fc903875 Mon Sep 17 00:00:00 2001 From: yitong an Date: Sun, 10 Nov 2024 14:21:14 -0500 Subject: [PATCH 004/154] add Yitong An gitid --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bf44112c8..cac9274e7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## Group members && GitHub id -Yitong An +Yitong An - vinkoos Haoze Li Ze Kun Song Owen Hexiang Wang- Adidazdoge From 4be9516296a268d59b79da18f37f69f2653a7fcc Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sun, 10 Nov 2024 16:25:00 -0500 Subject: [PATCH 005/154] update README for Franz --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cac9274e7..110020be2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## Group members && GitHub id Yitong An - vinkoos -Haoze Li +Haoze Li - FlashYDirOX Ze Kun Song Owen Hexiang Wang- Adidazdoge Xiaoshu Lin - Michael-lin6677 From f75908b618f03389d36e09b874963f2413f5334a Mon Sep 17 00:00:00 2001 From: Zekun Song <156867663+UTSGJohnsonSong@users.noreply.github.com> Date: Sun, 10 Nov 2024 18:16:17 -0500 Subject: [PATCH 006/154] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 110020be2..349bfe65c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Yitong An - vinkoos Haoze Li - FlashYDirOX -Ze Kun Song +Ze Kun Song - UTSGJohnsonSong Owen Hexiang Wang- Adidazdoge Xiaoshu Lin - Michael-lin6677 From 4bc442394415216fa4f80defc2a2704bb21e7d3e Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Mon, 11 Nov 2024 13:48:33 -0500 Subject: [PATCH 007/154] Changes for some format errors --- src/main/java/entity/Inventory.java | 26 +++++++------- src/main/java/entity/Location.java | 34 +++++++++--------- src/main/java/entity/MapFactory.java | 5 +-- src/main/java/entity/Plain.java | 40 +++++++++++----------- src/main/java/entity/Player.java | 14 ++++---- src/main/java/entity/PlayerAttributes.java | 15 +++++--- 6 files changed, 70 insertions(+), 64 deletions(-) diff --git a/src/main/java/entity/Inventory.java b/src/main/java/entity/Inventory.java index f4147e3f1..8c29b8017 100644 --- a/src/main/java/entity/Inventory.java +++ b/src/main/java/entity/Inventory.java @@ -8,14 +8,14 @@ public class Inventory { private int food; private int water; private int firearm; - private int nonfirearm; + private int nonFireArm; private int people; public Inventory() { this.food = Entityconstants.STARTERFOOD; this.water = Entityconstants.STARTERWATER; this.firearm = Entityconstants.STARTFIREARM; - this.nonfirearm = Entityconstants.STARTERNONFIREARM; + this.nonFireArm = Entityconstants.STARTERNONFIREARM; this.people = Entityconstants.STARTERPEOPLE; } @@ -25,10 +25,10 @@ public int getFood() { /** * Changing food in inventory, can be pos or neg. - * @param foodchange the change which is happening. + * @param foodChange the change which is happening. */ - public void changeFood(int foodchange) { - this.food = this.food + foodchange; + public void changeFood(int foodChange) { + this.food = this.food + foodChange; } public int getWater() { @@ -37,10 +37,10 @@ public int getWater() { /** * Changing water in inventory, can be pos or neg. - * @param Waterchange the change which is happening. + * @param waterChange the change which is happening. */ - public void changeWater(int Waterchange) { - this.water = this.water + Waterchange; + public void changeWater(int waterChange) { + this.water = this.water + waterChange; } public int getFirearm() { @@ -55,16 +55,16 @@ public void changeFirearm(int firearmChange) { this.firearm = this.firearm + firearmChange; } - public int getNonfirearm() { - return nonfirearm; + public int getNonFireArm() { + return nonFireArm; } /** * Changing nonfirearm in inventory, can be pos or neg. - * @param nonfirearmChange the change which is happening. + * @param nonFirearmChange the change which is happening. */ - public void changeNonfirearm(int nonfirearmChange) { - this.nonfirearm = this.nonfirearm + nonfirearmChange; + public void changeNonfirearm(int nonFirearmChange) { + this.nonFireArm = this.nonFireArm + nonFirearmChange; } public int getPeople() { diff --git a/src/main/java/entity/Location.java b/src/main/java/entity/Location.java index 03dd97f9d..bffe3d34a 100644 --- a/src/main/java/entity/Location.java +++ b/src/main/java/entity/Location.java @@ -2,27 +2,27 @@ /** * Interface for location (each specific xy coordinate), any environment should implement these. - * Notice, these are just basic and essential functions satisfying Interface segregation(no unnessary implement) + * Notice, these are just basic and essential functions satisfying Interface segregation(no unnecessary implement) * Notice as I said scalar closer to something increases is only for map construction step where each location * starts with a higher or lower scalar. The only time resource scalar change is when player stay in same spot, decrease - * each day by some perportion. + * each day by some proportion. */ public interface Location { /** - * temperature is crucial for calculating food/water consumption. ideally, more closer to core of iceland, + * temperature is crucial for calculating food/water consumption. ideally, closer to core of iceland, * Colder it is, as well as desert, specific calculation are for later. - * @param distance distance of location from it's core. - * @return tempurature. + * @param distance distance of location from its core. + * @return temperature. */ Double gettemperature(int distance); /** * Crucial to the number people joins, in a double represent the number we'll use as scalar for people increase * Method. - * Ideally, more closer to core of city (center as more populated), it will be higher. + * Ideally, closer to core of city (center as more populated), it will be higher. * And the longer they stay in same spot, the scalar decrease(people already joined or don't wanna join so decrease) - * @param distance distance from it's core. + * @param distance distance from its core. * @return people resource scalar. */ Double getpeopleresourceavailable(int distance); @@ -30,7 +30,7 @@ public interface Location { /** * Crucial to the number of food gathers act as scalar. Ideally, make it high in city and woods, the scalar decrease * as the longer they stayed. - * @param distance distance from it's core. + * @param distance distance from its core. * @return food resource scalar */ Double getfoodresourceavailable(int distance); @@ -38,7 +38,7 @@ public interface Location { /** * Crucial to the number of water gathers act as scalar. Ideally, make it high in iceland and wood * the scalar decrease as the longer they stayed. - * @param distance distance from it's core. + * @param distance distance from its core. * @return water resource scalar */ Double getwaterresourceavailable(int distance); @@ -46,30 +46,30 @@ public interface Location { /** * Crucial to number of firearm gathered. Closer to city center, this scalar will be higher. * Same spot, decrease this. - * @param distance distance from it's core. - * @return firearm resouce scalar + * @param distance distance from its core. + * @return firearm resource scalar */ Double getfirearmresourceavailable(int distance); /** * Crucial to number of nonfirearm gathered. Closer to city center, this scalar will be higher. * Same spot, decrease this. - * @param distance distance from it's core. - * @return nonfirearm resouce scalar. + * @param distance distance from its core. + * @return nonfirearm resource scalar. */ Double getnonfirearmresourceavailable(int distance); /** - * The method responsible for decrease the scalar of the location if they stayed, by some perportion + * The method responsible for decrease the scalar of the location if they stayed, by some proportion * Notice, it is for all 5 resource scalar. */ void decreaseresourceavailable(); /** * The threat level of this location, used for calculating power of the horde, and people decrease. - * Closer to city core, more threatlevel, Closer to iceland/desert,(as they are more isolated) lower threat. - * @param distance distance from it's core. - * @return threatlevel. + * Closer to city core, more threat level, Closer to iceland/desert,(as they are more isolated) lower threat. + * @param distance distance from its core. + * @return threat level. */ Double getthreatlevel(int distance); } diff --git a/src/main/java/entity/MapFactory.java b/src/main/java/entity/MapFactory.java index bf388f1bd..0131b5848 100644 --- a/src/main/java/entity/MapFactory.java +++ b/src/main/java/entity/MapFactory.java @@ -4,7 +4,7 @@ /** * This class is responsible for creating the map with randomization. - * Method returns location of core for resourse calculation. + * Method returns location of core for resource calculation. * Method returns the grid for map data. */ public class MapFactory { @@ -48,6 +48,7 @@ public ArrayList>>> getCores( } return environmentCores; } + // This is a hlper method private double calculateDistance(Map.Entry point1, Map.Entry point2) { final int xDiff = point1.getKey() - point2.getKey(); @@ -59,7 +60,7 @@ private double calculateDistance(Map.Entry point1, Map.Entry Date: Sat, 16 Nov 2024 15:15:06 -0700 Subject: [PATCH 008/154] Entity demo completed --- src/main/java/entity/City.java | 68 ------------ src/main/java/entity/Desert.java | 69 ------------ src/main/java/entity/Entityconstants.java | 12 +- src/main/java/entity/Event.java | 41 +++++++ src/main/java/entity/EventAmbush.java | 105 ++++++++++++++++++ src/main/java/entity/EventBlizzard.java | 66 +++++++++++ src/main/java/entity/EventSurvivorJoins.java | 89 +++++++++++++++ src/main/java/entity/Forest.java | 68 ------------ src/main/java/entity/Horde.java | 31 ++++++ src/main/java/entity/Iceland.java | 69 ------------ src/main/java/entity/Inventory.java | 28 ++--- src/main/java/entity/Location.java | 52 +++++++-- src/main/java/entity/LocationCity.java | 90 +++++++++++++++ src/main/java/entity/LocationDesert.java | 91 +++++++++++++++ src/main/java/entity/LocationForest.java | 90 +++++++++++++++ src/main/java/entity/LocationIceland.java | 91 +++++++++++++++ .../entity/{Plain.java => LocationPlain.java} | 56 +++++++--- src/main/java/entity/MapFactory.java | 24 ++-- 18 files changed, 802 insertions(+), 338 deletions(-) delete mode 100644 src/main/java/entity/City.java delete mode 100644 src/main/java/entity/Desert.java create mode 100644 src/main/java/entity/Event.java create mode 100644 src/main/java/entity/EventAmbush.java create mode 100644 src/main/java/entity/EventBlizzard.java create mode 100644 src/main/java/entity/EventSurvivorJoins.java delete mode 100644 src/main/java/entity/Forest.java create mode 100644 src/main/java/entity/Horde.java delete mode 100644 src/main/java/entity/Iceland.java create mode 100644 src/main/java/entity/LocationCity.java create mode 100644 src/main/java/entity/LocationDesert.java create mode 100644 src/main/java/entity/LocationForest.java create mode 100644 src/main/java/entity/LocationIceland.java rename src/main/java/entity/{Plain.java => LocationPlain.java} (51%) diff --git a/src/main/java/entity/City.java b/src/main/java/entity/City.java deleted file mode 100644 index 3bed016ee..000000000 --- a/src/main/java/entity/City.java +++ /dev/null @@ -1,68 +0,0 @@ -package entity; - -/** - * This is city subtype of location. - */ -public class City implements Location { - private double foodresource; - private double waterresource; - private double firearmresource; - private double nonfirearmresource; - private double peopleresource; - private double temperature; - private double threat; - - public City(int dist) { - this.foodresource = Entityconstants.STARTERRESOURCESCALAR; - this.waterresource = Entityconstants.STARTERRESOURCESCALAR; - this.firearmresource = getfirearmresourceavailable(dist); - this.nonfirearmresource = getnonfirearmresourceavailable(dist); - this.peopleresource = getpeopleresourceavailable(dist); - this.temperature = Entityconstants.STARTERRESOURCESCALAR; - this.threat = getthreatlevel(dist); - } - - @Override - public Double gettemperature(int dist) { - return this.temperature; - } - - @Override - public Double getpeopleresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); - } - - @Override - public Double getfoodresourceavailable(int dist) { - return this.foodresource; - } - - @Override - public Double getwaterresourceavailable(int dist) { - return this.waterresource; - } - - @Override - public Double getfirearmresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); - } - - @Override - public Double getnonfirearmresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); - } - - @Override - public void decreaseresourceavailable() { - this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; - this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; - this.firearmresource = this.firearmresource * Entityconstants.RESOUCEDECREASERATIO; - this.nonfirearmresource = this.nonfirearmresource * Entityconstants.RESOUCEDECREASERATIO; - this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; - } - - @Override - public Double getthreatlevel(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); - } -} diff --git a/src/main/java/entity/Desert.java b/src/main/java/entity/Desert.java deleted file mode 100644 index 7fdd0f64b..000000000 --- a/src/main/java/entity/Desert.java +++ /dev/null @@ -1,69 +0,0 @@ -package entity; - -/** - * This is location form of Desert. - */ -public class Desert implements Location { - private double foodresource; - private double waterresource; - private double firearmresource; - private double nonfirearmresource; - private double peopleresource; - private final double temperature; - private final double threat; - - public Desert(int dist) { - this.foodresource = Entityconstants.STARTERRESOURCESCALAR; - this.waterresource = getwaterresourceavailable(dist); - this.firearmresource = Entityconstants.STARTERRESOURCESCALAR; - this.nonfirearmresource = getnonfirearmresourceavailable(dist); - this.peopleresource = getpeopleresourceavailable(dist); - this.temperature = gettemperature(dist); - this.threat = Entityconstants.STARTERRESOURCESCALAR; - } - - @Override - public Double gettemperature(int dist) { - return Entityconstants.DEFAULTTEMP + (Entityconstants.MAXTEMPDIFF * (1 / (dist + 1))); - } - - @Override - public Double getpeopleresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); - } - - @Override - public Double getfoodresourceavailable(int dist) { - return this.foodresource; - } - - @Override - public Double getwaterresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); - } - - @Override - public Double getfirearmresourceavailable(int dist) { - return this.firearmresource; - } - - @Override - public Double getnonfirearmresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); - } - - @Override - public void decreaseresourceavailable() { - this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; - this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; - this.firearmresource = this.firearmresource * Entityconstants.RESOUCEDECREASERATIO; - this.nonfirearmresource = this.nonfirearmresource * Entityconstants.RESOUCEDECREASERATIO; - this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; - } - - @Override - public Double getthreatlevel(int dist) { - return this.threat; - } - -} diff --git a/src/main/java/entity/Entityconstants.java b/src/main/java/entity/Entityconstants.java index 7eb881487..551508a77 100644 --- a/src/main/java/entity/Entityconstants.java +++ b/src/main/java/entity/Entityconstants.java @@ -6,8 +6,7 @@ public class Entityconstants { public static final int STARTERFOOD = 100; public static final int STARTERWATER = 100; - public static final int STARTFIREARM = 5; - public static final int STARTERNONFIREARM = 5; + public static final int STARTWEAPON = 5; public static final int STARTERPEOPLE = 10; public static final int STARTERATRIBUTEPOINT = 20; public static final double STARTERRESOURCESCALAR = 1; @@ -23,5 +22,14 @@ public class Entityconstants { public static final String CITY = "City"; public static final String PLAIN = "Plain"; public static final int BIOMERADIUS = 16; + public static final int FIRSTCHOICE = 1; + public static final int SECONDCHOICE = 2; + public static final int THIRDCHOICE = 3; + public static final int FOURTHCHOICE = 4; + public static final double COMMONEVENTBASEPROB = 0.1; + public static final double RAREEVENTBASEPROB = 0.03; + public static final int STARTERHORDEMAGNITUDE = 300; + public static final int STARTERHORDEDURATION = 10; + } diff --git a/src/main/java/entity/Event.java b/src/main/java/entity/Event.java new file mode 100644 index 000000000..888cb7b9c --- /dev/null +++ b/src/main/java/entity/Event.java @@ -0,0 +1,41 @@ +package entity; + +import java.util.Map; + +/** + * The random events of the game, this is an interface, all events should implement this. + */ +public interface Event { + + /** + * Method for getting the probability. + * @return probability of this event occurring in the given location, time, etc. + */ + double getprobability(); + + /** + * Method for setting the probability of this event. + * @param probability probability of this event, + */ + void setprobability(double probability); + + /** + * Getter method for the choices of the event, in map of int, string. String is the "facial" representation + * of the event, but actually for player's input, and response determine step, we use the int. + * @return Choices in map of int string. + */ + Map getchoices(); + + /** + * Getter method for the brief description of the event. + * @return brief description of this event. + */ + String getdescription(); + + /** + * Return of this is an positive event, we need this to determine how luck affect it's probability. + * @return Return positive or not. + */ + boolean getispositive(); + +} diff --git a/src/main/java/entity/EventAmbush.java b/src/main/java/entity/EventAmbush.java new file mode 100644 index 000000000..52c2ec67d --- /dev/null +++ b/src/main/java/entity/EventAmbush.java @@ -0,0 +1,105 @@ +package entity; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * Event of ambush, player decide they want to fight back, pay, escape or talk, different action have different + * result as well as result description. However, notice I'm only doing description here ot make entity simple + * thus avoid complex and coupling calculation in entity and leave it to use case interact to avoid coupling, and + * making sure they process information without knowing anything about other classes. + */ + +public class EventAmbush implements Event { + + private final Boolean isPositive; + private final ArrayList occuringlocation; + private final String description; + private final Map choices; + private double probability; + private final String fightoutcomesuccess; + private final String fightoutcomefailed; + private final String payoutcome; + private final String escapeoutcome; + private final String negotiatesuccessoutcome; + private final String negotiatefailedoutcome; + + public EventAmbush() { + this.isPositive = false; + this.occuringlocation = new ArrayList<>(); + occuringlocation.add("Plain"); + occuringlocation.add("Iceland"); + occuringlocation.add("Wood"); + occuringlocation.add("City"); + occuringlocation.add("Desert"); + this.description = "Your group is ambushed by a small band of desperate bandits demanding your " + + "food supplies. Their ragged appearance suggests they're struggling to survive. What will you do?"; + this.choices = new HashMap<>(); + choices.put(Entityconstants.FIRSTCHOICE, "Fight back"); + choices.put(Entityconstants.SECONDCHOICE, "Pay the bandits"); + choices.put(Entityconstants.THIRDCHOICE, "Try to escape"); + choices.put(Entityconstants.FOURTHCHOICE, "Negotiate"); + this.probability = Entityconstants.COMMONEVENTBASEPROB; + this.fightoutcomesuccess = "You successfully beat the bandits and secured their supplies."; + this.fightoutcomefailed = "You fought hard but were overpowered, losing some supplies."; + this.payoutcome = "You handed over some of your food to avoid conflict with the bandits."; + this.escapeoutcome = "You managed to escape, but the chaos caused you to lose track of direction to where" + + "your group was heading."; + this.negotiatesuccessoutcome = "You successfully negotiated with the bandits, convincing them to leave peacefully."; + this.negotiatefailedoutcome = "Your negotiation failed, and the bandits took a portion of your supplies by force."; + } + + @Override + public double getprobability() { + return this.probability; + } + + @Override + public void setprobability(double prob) { + this.probability = prob; + } + + @Override + public Map getchoices() { + return this.choices; + } + + @Override + public String getdescription() { + return this.description; + } + + @Override + public boolean getispositive() { + return isPositive; + } + + public ArrayList getOccuringlocation() { + return occuringlocation; + } + + public String getFightoutcomesuccess() { + return fightoutcomesuccess; + } + + public String getFightoutcomefailed() { + return fightoutcomefailed; + } + + public String getPayoutcome() { + return payoutcome; + } + + public String getEscapeoutcome() { + return escapeoutcome; + } + + public String getNegotiatesuccessoutcome() { + return negotiatesuccessoutcome; + } + + public String getNegotiatefailedoutcome() { + return negotiatefailedoutcome; + } +} diff --git a/src/main/java/entity/EventBlizzard.java b/src/main/java/entity/EventBlizzard.java new file mode 100644 index 000000000..88e0e1c9c --- /dev/null +++ b/src/main/java/entity/EventBlizzard.java @@ -0,0 +1,66 @@ +package entity; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * Event of a blizzard. This is a negative event that only occurs in Iceland. + * The blizzard causes a loss of food due to hunger brought on by extreme cold. + * Players must decide how to handle the situation, with each choice having specific outcomes. + */ + +public class EventBlizzard implements Event { + + private final Boolean isPositive; + private final ArrayList occuringlocation; + private final String description; + private final Map choices; + private double probability; + private String outcome; + + public EventBlizzard() { + this.isPositive = false; + this.occuringlocation = new ArrayList<>(); + occuringlocation.add("Iceland"); + + this.description = "A harsh blizzard strikes, blanketing the area in ice and snow. The biting cold " + + "and lack of visibility make travel dangerous, and hunger begins to take its toll"; + this.choices = new HashMap<>(); + this.probability = Entityconstants.COMMONEVENTBASEPROB; + this.outcome = "Due to cold, your group had to consume more food"; + } + + @Override + public double getprobability() { + return this.probability; + } + + @Override + public void setprobability(double prob) { + this.probability = prob; + } + + @Override + public Map getchoices() { + return this.choices; + } + + @Override + public String getdescription() { + return this.description; + } + + @Override + public boolean getispositive() { + return isPositive; + } + + public ArrayList getOccuringlocation() { + return occuringlocation; + } + + public String getOutcome() { + return outcome; + } +} diff --git a/src/main/java/entity/EventSurvivorJoins.java b/src/main/java/entity/EventSurvivorJoins.java new file mode 100644 index 000000000..4aab1f3ec --- /dev/null +++ b/src/main/java/entity/EventSurvivorJoins.java @@ -0,0 +1,89 @@ +package entity; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * Event of a group of survivors wanting to join the player. The player can choose to accept, reject, or negotiate terms + * for joining. Different actions have different outcomes, and descriptions for each are provided. This class avoids + * coupling logic and leaves complex calculations to the use case interactor. + */ + +public class EventSurvivorJoins implements Event { + + private final Boolean isPositive; + private final ArrayList occuringlocation; + private final String description; + private final Map choices; + private double probability; + private final String acceptoutcome; + private final String rejectoutcome; + private final String roboutcomesuccess; + private final String roboutcomefail; + + public EventSurvivorJoins() { + this.isPositive = true; + this.occuringlocation = new ArrayList<>(); + occuringlocation.add("Plain"); + occuringlocation.add("Wood"); + occuringlocation.add("City"); + this.description = "You encounter a small group of survivors who ask to join your group. They appear skilled " + + "but wary. What will you do?"; + this.choices = new HashMap<>(); + choices.put(Entityconstants.FIRSTCHOICE, "Accept them into the group"); + choices.put(Entityconstants.SECONDCHOICE, "Politely reject them"); + this.probability = Entityconstants.COMMONEVENTBASEPROB; + this.acceptoutcome = "You've accept them into the group"; + this.rejectoutcome = "You've reject them into the group"; + this.roboutcomesuccess = "You've robbed the survivor, they dear not to fight back as your group overpowered" + + "them, taking their supplies and leaving them helpless."; + this.roboutcomefail = "The robbery failed as they escaped."; + + } + + @Override + public double getprobability() { + return this.probability; + } + + @Override + public void setprobability(double prob) { + this.probability = prob; + } + + @Override + public Map getchoices() { + return this.choices; + } + + @Override + public String getdescription() { + return this.description; + } + + @Override + public boolean getispositive() { + return isPositive; + } + + public ArrayList getOccuringlocation() { + return occuringlocation; + } + + public String getAcceptoutcome() { + return acceptoutcome; + } + + public String getRejectoutcome() { + return rejectoutcome; + } + + public String getRoboutcomesuccess() { + return roboutcomesuccess; + } + + public String getRoboutcomefail() { + return roboutcomefail; + } +} diff --git a/src/main/java/entity/Forest.java b/src/main/java/entity/Forest.java deleted file mode 100644 index d569804a3..000000000 --- a/src/main/java/entity/Forest.java +++ /dev/null @@ -1,68 +0,0 @@ -package entity; - -/** - * This is woods subtype of location. - */ -public class Forest implements Location { - private double foodresource; - private double waterresource; - private double firearmresource; - private double nonfirearmresource; - private double peopleresource; - private double temperature; - private double threat; - - public Forest(int dist) { - this.foodresource = getfoodresourceavailable(dist); - this.waterresource = getwaterresourceavailable(dist); - this.firearmresource = Entityconstants.STARTERRESOURCESCALAR; - this.nonfirearmresource = Entityconstants.STARTERRESOURCESCALAR; - this.peopleresource = Entityconstants.STARTERRESOURCESCALAR; - this.temperature = Entityconstants.STARTERRESOURCESCALAR; - this.threat = Entityconstants.STARTERRESOURCESCALAR; - } - - @Override - public Double gettemperature(int dist) { - return this.temperature; - } - - @Override - public Double getpeopleresourceavailable(int dist) { - return this.peopleresource; - } - - @Override - public Double getfoodresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); - } - - @Override - public Double getwaterresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); - } - - @Override - public Double getfirearmresourceavailable(int dist) { - return this.firearmresource; - } - - @Override - public Double getnonfirearmresourceavailable(int dist) { - return this.nonfirearmresource; - } - - @Override - public void decreaseresourceavailable() { - this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; - this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; - this.firearmresource = this.firearmresource * Entityconstants.RESOUCEDECREASERATIO; - this.nonfirearmresource = this.nonfirearmresource * Entityconstants.RESOUCEDECREASERATIO; - this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; - } - - @Override - public Double getthreatlevel(int dist) { - return this.threat; - } -} diff --git a/src/main/java/entity/Horde.java b/src/main/java/entity/Horde.java new file mode 100644 index 000000000..3cb7c0d0e --- /dev/null +++ b/src/main/java/entity/Horde.java @@ -0,0 +1,31 @@ +package entity; + +/** + * The class represent the horde by it's magnitude and duration. specific calculation involves other class info are for + * Use case interact. + */ +public class Horde { + private int magnitude; + private double duration; + + public Horde() { + this.magnitude = Entityconstants.STARTERHORDEMAGNITUDE; + this.duration = Entityconstants.STARTERHORDEDURATION; + } + + public double getDuration() { + return duration; + } + + public void setDuration(double duration) { + this.duration = duration; + } + + public int getMagnitude() { + return magnitude; + } + + public void setMagnitude(int magnitude) { + this.magnitude = magnitude; + } +} diff --git a/src/main/java/entity/Iceland.java b/src/main/java/entity/Iceland.java deleted file mode 100644 index 0e3c5f55d..000000000 --- a/src/main/java/entity/Iceland.java +++ /dev/null @@ -1,69 +0,0 @@ -package entity; - -/** - * This is location form of Iceland. - */ -public class Iceland implements Location { - private double foodresource; - private double waterresource; - private double firearmresource; - private double nonfirearmresource; - private double peopleresource; - private final double temperature; - private final double threat; - - public Iceland(int dist) { - this.foodresource = Entityconstants.STARTERRESOURCESCALAR; - this.waterresource = getwaterresourceavailable(dist); - this.firearmresource = Entityconstants.STARTERRESOURCESCALAR; - this.nonfirearmresource = Entityconstants.STARTERRESOURCESCALAR; - this.peopleresource = getpeopleresourceavailable(dist); - this.temperature = gettemperature(dist); - this.threat = getthreatlevel(dist); - } - - @Override - public Double gettemperature(int dist) { - return Entityconstants.DEFAULTTEMP - (Entityconstants.MAXTEMPDIFF * (1 / (dist + 1))); - } - - @Override - public Double getpeopleresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); - } - - @Override - public Double getfoodresourceavailable(int dist) { - return this.foodresource; - } - - @Override - public Double getwaterresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); - } - - @Override - public Double getfirearmresourceavailable(int dist) { - return this.firearmresource; - } - - @Override - public Double getnonfirearmresourceavailable(int dist) { - return this.nonfirearmresource; - } - - @Override - public void decreaseresourceavailable() { - this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; - this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; - this.firearmresource = this.firearmresource * Entityconstants.RESOUCEDECREASERATIO; - this.nonfirearmresource = this.nonfirearmresource * Entityconstants.RESOUCEDECREASERATIO; - this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; - } - - @Override - public Double getthreatlevel(int dist) { - return Entityconstants.STARTERRESOURCESCALAR - (Entityconstants.MAXTHREATDIFF / (dist + 1)); - } - -} diff --git a/src/main/java/entity/Inventory.java b/src/main/java/entity/Inventory.java index 8c29b8017..8653fd114 100644 --- a/src/main/java/entity/Inventory.java +++ b/src/main/java/entity/Inventory.java @@ -7,15 +7,13 @@ public class Inventory { private int food; private int water; - private int firearm; - private int nonFireArm; + private int weapon; private int people; public Inventory() { this.food = Entityconstants.STARTERFOOD; this.water = Entityconstants.STARTERWATER; - this.firearm = Entityconstants.STARTFIREARM; - this.nonFireArm = Entityconstants.STARTERNONFIREARM; + this.weapon = Entityconstants.STARTWEAPON; this.people = Entityconstants.STARTERPEOPLE; } @@ -43,28 +41,16 @@ public void changeWater(int waterChange) { this.water = this.water + waterChange; } - public int getFirearm() { - return firearm; + public int getWeapon() { + return Weapon; } /** * Changing firearm in inventory, can be pos or neg. - * @param firearmChange the change which is happening. + * @param weaponChange the change which is happening. */ - public void changeFirearm(int firearmChange) { - this.firearm = this.firearm + firearmChange; - } - - public int getNonFireArm() { - return nonFireArm; - } - - /** - * Changing nonfirearm in inventory, can be pos or neg. - * @param nonFirearmChange the change which is happening. - */ - public void changeNonfirearm(int nonFirearmChange) { - this.nonFireArm = this.nonFireArm + nonFirearmChange; + public void changeweapon(int weaponChange) { + this.Weapon = this.Weapon + weaponChange; } public int getPeople() { diff --git a/src/main/java/entity/Location.java b/src/main/java/entity/Location.java index bffe3d34a..ca6183794 100644 --- a/src/main/java/entity/Location.java +++ b/src/main/java/entity/Location.java @@ -10,12 +10,18 @@ public interface Location { /** - * temperature is crucial for calculating food/water consumption. ideally, closer to core of iceland, + * Temperature is crucial for calculating food/water consumption. ideally, closer to core of iceland, * Colder it is, as well as desert, specific calculation are for later. * @param distance distance of location from its core. * @return temperature. */ - Double gettemperature(int distance); + Double getsettemperature(int distance); + + /** + * Getter method of temperature. + * @return Temperature of that location. + */ + Double gettemperature(); /** * Crucial to the number people joins, in a double represent the number we'll use as scalar for people increase @@ -25,7 +31,13 @@ public interface Location { * @param distance distance from its core. * @return people resource scalar. */ - Double getpeopleresourceavailable(int distance); + Double getsetpeopleresourceavailable(int distance); + + /** + * Getter method of people resource scalar. + * @return people resource scalar of that location. + */ + Double getpeopleresourceavailable(); /** * Crucial to the number of food gathers act as scalar. Ideally, make it high in city and woods, the scalar decrease @@ -33,7 +45,13 @@ public interface Location { * @param distance distance from its core. * @return food resource scalar */ - Double getfoodresourceavailable(int distance); + Double getsetfoodresourceavailable(int distance); + + /** + * Getter method of food resource scalar. + * @return food resource scalar of that location. + */ + Double getfoodresourceavailable(); /** * Crucial to the number of water gathers act as scalar. Ideally, make it high in iceland and wood @@ -41,7 +59,13 @@ public interface Location { * @param distance distance from its core. * @return water resource scalar */ - Double getwaterresourceavailable(int distance); + Double getsetwaterresourceavailable(int distance); + + /** + * Getter method of water resource scalar. + * @return water resource scalar of that location. + */ + Double getwaterresourceavailable(); /** * Crucial to number of firearm gathered. Closer to city center, this scalar will be higher. @@ -49,15 +73,13 @@ public interface Location { * @param distance distance from its core. * @return firearm resource scalar */ - Double getfirearmresourceavailable(int distance); + Double getsetweaponresourceavailable(int distance); /** - * Crucial to number of nonfirearm gathered. Closer to city center, this scalar will be higher. - * Same spot, decrease this. - * @param distance distance from its core. - * @return nonfirearm resource scalar. + * Getter method of firearm resource scalar. + * @return firearm resource scalar of that location. */ - Double getnonfirearmresourceavailable(int distance); + Double getweaponresourceavailable(); /** * The method responsible for decrease the scalar of the location if they stayed, by some proportion @@ -71,5 +93,11 @@ public interface Location { * @param distance distance from its core. * @return threat level. */ - Double getthreatlevel(int distance); + Double getsetthreatlevel(int distance); + + /** + * Getter method of threat scalar. + * @return people threat scalar of that location. + */ + Double getthreatlevel(); } diff --git a/src/main/java/entity/LocationCity.java b/src/main/java/entity/LocationCity.java new file mode 100644 index 000000000..d1b994250 --- /dev/null +++ b/src/main/java/entity/LocationCity.java @@ -0,0 +1,90 @@ +package entity; + +/** + * This is city subtype of location. + */ +public class LocationCity implements Location { + private double foodresource; + private double waterresource; + private double weaponresource; + private double peopleresource; + private double temperature; + private double threat; + + public LocationCity(int dist) { + this.foodresource = Entityconstants.STARTERRESOURCESCALAR; + this.waterresource = Entityconstants.STARTERRESOURCESCALAR; + this.weaponresource = getsetweaponresourceavailable(dist); + this.peopleresource = getsetpeopleresourceavailable(dist); + this.temperature = Entityconstants.STARTERRESOURCESCALAR; + this.threat = getsetthreatlevel(dist); + } + + @Override + public Double getsettemperature(int dist) { + return this.temperature; + } + + @Override + public Double gettemperature() { + return this.temperature; + } + + @Override + public Double getsetpeopleresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getpeopleresourceavailable() { + return this.peopleresource; + } + + @Override + public Double getsetfoodresourceavailable(int dist) { + return this.foodresource; + } + + @Override + public Double getfoodresourceavailable() { + return this.foodresource; + } + + @Override + public Double getsetwaterresourceavailable(int dist) { + return this.waterresource; + } + + @Override + public Double getwaterresourceavailable() { + return this.waterresource; + } + + @Override + public Double getsetweaponresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getweaponresourceavailable() { + return this.weaponresource; + } + + @Override + public void decreaseresourceavailable() { + this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; + this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public Double getsetthreatlevel(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getthreatlevel() { + return this.threat; + } +} diff --git a/src/main/java/entity/LocationDesert.java b/src/main/java/entity/LocationDesert.java new file mode 100644 index 000000000..086faa0ea --- /dev/null +++ b/src/main/java/entity/LocationDesert.java @@ -0,0 +1,91 @@ +package entity; + +/** + * This is location form of Desert. + */ +public class LocationDesert implements Location { + private double foodresource; + private double waterresource; + private double weaponresource; + private double peopleresource; + private final double temperature; + private final double threat; + + public LocationDesert(int dist) { + this.foodresource = Entityconstants.STARTERRESOURCESCALAR; + this.waterresource = getsetwaterresourceavailable(dist); + this.weaponresource = Entityconstants.STARTERRESOURCESCALAR; + this.peopleresource = getsetpeopleresourceavailable(dist); + this.temperature = getsettemperature(dist); + this.threat = Entityconstants.STARTERRESOURCESCALAR; + } + + @Override + public Double getsettemperature(int dist) { + return Entityconstants.DEFAULTTEMP + (Entityconstants.MAXTEMPDIFF * (1 / (dist + 1))); + } + + @Override + public Double gettemperature() { + return this.temperature; + } + + @Override + public Double getsetpeopleresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); + } + + @Override + public Double getpeopleresourceavailable() { + return this.peopleresource; + } + + @Override + public Double getsetfoodresourceavailable(int dist) { + return this.foodresource; + } + + @Override + public Double getfoodresourceavailable() { + return this.foodresource; + } + + @Override + public Double getsetwaterresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); + } + + @Override + public Double getwaterresourceavailable() { + return this.waterresource; + } + + @Override + public Double getsetweaponresourceavailable(int dist) { + return this.weaponresource; + } + + @Override + public Double getweaponresourceavailable() { + return this.weaponresource; + } + + @Override + public void decreaseresourceavailable() { + this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; + this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public Double getsetthreatlevel(int dist) { + return this.threat; + } + + @Override + public Double getthreatlevel() { + return this.threat; + } + +} diff --git a/src/main/java/entity/LocationForest.java b/src/main/java/entity/LocationForest.java new file mode 100644 index 000000000..0dfd7c23d --- /dev/null +++ b/src/main/java/entity/LocationForest.java @@ -0,0 +1,90 @@ +package entity; + +/** + * This is woods subtype of location. + */ +public class LocationForest implements Location { + private double foodresource; + private double waterresource; + private double weaponresource; + private double peopleresource; + private double temperature; + private double threat; + + public LocationForest(int dist) { + this.foodresource = getsetfoodresourceavailable(dist); + this.waterresource = getsetwaterresourceavailable(dist); + this.weaponresource = Entityconstants.STARTERRESOURCESCALAR; + this.peopleresource = Entityconstants.STARTERRESOURCESCALAR; + this.temperature = Entityconstants.STARTERRESOURCESCALAR; + this.threat = Entityconstants.STARTERRESOURCESCALAR; + } + + @Override + public Double getsettemperature(int dist) { + return this.temperature; + } + + @Override + public Double gettemperature() { + return this.temperature; + } + + @Override + public Double getsetpeopleresourceavailable(int dist) { + return this.peopleresource; + } + + @Override + public Double getpeopleresourceavailable() { + return this.peopleresource; + } + + @Override + public Double getsetfoodresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getfoodresourceavailable() { + return this.foodresource; + } + + @Override + public Double getsetwaterresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getwaterresourceavailable() { + return this.waterresource; + } + + @Override + public Double getsetweaponresourceavailable(int dist) { + return this.weaponresource; + } + + @Override + public Double getweaponresourceavailable() { + return this.weaponresource; + } + + @Override + public void decreaseresourceavailable() { + this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; + this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public Double getsetthreatlevel(int dist) { + return this.threat; + } + + @Override + public Double getthreatlevel() { + return this.threat; + } +} diff --git a/src/main/java/entity/LocationIceland.java b/src/main/java/entity/LocationIceland.java new file mode 100644 index 000000000..d4281f133 --- /dev/null +++ b/src/main/java/entity/LocationIceland.java @@ -0,0 +1,91 @@ +package entity; + +/** + * This is location form of Iceland. + */ +public class LocationIceland implements Location { + private double foodresource; + private double waterresource; + private double weaponresource; + private double peopleresource; + private final double temperature; + private final double threat; + + public LocationIceland(int dist) { + this.foodresource = Entityconstants.STARTERRESOURCESCALAR; + this.waterresource = getsetwaterresourceavailable(dist); + this.weaponresource = Entityconstants.STARTERRESOURCESCALAR; + this.peopleresource = getsetpeopleresourceavailable(dist); + this.temperature = getsettemperature(dist); + this.threat = getsetthreatlevel(dist); + } + + @Override + public Double getsettemperature(int dist) { + return Entityconstants.DEFAULTTEMP - (Entityconstants.MAXTEMPDIFF * (1 / (dist + 1))); + } + + @Override + public Double gettemperature() { + return this.temperature; + } + + @Override + public Double getsetpeopleresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); + } + + @Override + public Double getpeopleresourceavailable() { + return this.peopleresource; + } + + @Override + public Double getsetfoodresourceavailable(int dist) { + return this.foodresource; + } + + @Override + public Double getfoodresourceavailable() { + return this.foodresource; + } + + @Override + public Double getsetwaterresourceavailable(int dist) { + return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + } + + @Override + public Double getwaterresourceavailable() { + return this.waterresource; + } + + @Override + public Double getsetweaponresourceavailable(int dist) { + return this.weaponresource; + } + + @Override + public Double getweaponresourceavailable() { + return this.weaponresource; + } + + @Override + public void decreaseresourceavailable() { + this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; + this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public Double getsetthreatlevel(int dist) { + return Entityconstants.STARTERRESOURCESCALAR - (Entityconstants.MAXTHREATDIFF / (dist + 1)); + } + + @Override + public Double getthreatlevel() { + return this.threat; + } + +} diff --git a/src/main/java/entity/Plain.java b/src/main/java/entity/LocationPlain.java similarity index 51% rename from src/main/java/entity/Plain.java rename to src/main/java/entity/LocationPlain.java index c4c9aebef..b758c8f01 100644 --- a/src/main/java/entity/Plain.java +++ b/src/main/java/entity/LocationPlain.java @@ -3,66 +3,88 @@ /** * This is location form of plain, more like default, which is not any of special biome (iceland, desert etc). */ -public class Plain implements Location { +public class LocationPlain implements Location { private double foodResource; private double waterResource; - private double fireArmResource; - private double nonFirearmResource; + private double weaponResource; private double peopleResource; private final double temperature; private final double threat; - public Plain() { + public LocationPlain() { this.foodResource = Entityconstants.STARTERRESOURCESCALAR; this.waterResource = Entityconstants.STARTERRESOURCESCALAR; - this.fireArmResource = Entityconstants.STARTERRESOURCESCALAR; - this.nonFirearmResource = Entityconstants.STARTERRESOURCESCALAR; + this.weaponResource = Entityconstants.STARTERRESOURCESCALAR; this.peopleResource = Entityconstants.STARTERRESOURCESCALAR; this.temperature = Entityconstants.DEFAULTTEMP; this.threat = Entityconstants.DEFAULTTHREAT; } @Override - public Double gettemperature(int dist) { + public Double getsettemperature(int dist) { return temperature; } @Override - public Double getpeopleresourceavailable(int dist) { + public Double gettemperature() { + return temperature; + } + + @Override + public Double getsetpeopleresourceavailable(int dist) { + return this.peopleResource; + } + + @Override + public Double getpeopleresourceavailable() { return this.peopleResource; } @Override - public Double getfoodresourceavailable(int dist) { + public Double getsetfoodresourceavailable(int dist) { + return this.foodResource; + } + + @Override + public Double getfoodresourceavailable() { return this.foodResource; } @Override - public Double getwaterresourceavailable(int dist) { + public Double getsetwaterresourceavailable(int dist) { + return this.waterResource; + } + + @Override + public Double getwaterresourceavailable() { return this.waterResource; } @Override - public Double getfirearmresourceavailable(int dist) { - return this.fireArmResource; + public Double getsetweaponresourceavailable(int dist) { + return this.weaponResource; } @Override - public Double getnonfirearmresourceavailable(int dist) { - return this.nonFirearmResource; + public Double getweaponresourceavailable() { + return this.weaponResource; } @Override public void decreaseresourceavailable() { this.foodResource = this.foodResource * Entityconstants.RESOUCEDECREASERATIO; this.waterResource = this.waterResource * Entityconstants.RESOUCEDECREASERATIO; - this.fireArmResource = this.fireArmResource * Entityconstants.RESOUCEDECREASERATIO; - this.nonFirearmResource = this.nonFirearmResource * Entityconstants.RESOUCEDECREASERATIO; + this.weaponResource = this.weaponResource * Entityconstants.RESOUCEDECREASERATIO; this.peopleResource = this.peopleResource * Entityconstants.RESOUCEDECREASERATIO; } @Override - public Double getthreatlevel(int dist) { + public Double getsetthreatlevel(int dist) { + return this.threat; + } + + @Override + public Double getthreatlevel() { return this.threat; } diff --git a/src/main/java/entity/MapFactory.java b/src/main/java/entity/MapFactory.java index 0131b5848..5cb979b94 100644 --- a/src/main/java/entity/MapFactory.java +++ b/src/main/java/entity/MapFactory.java @@ -82,7 +82,7 @@ private ArrayList> initializeGrid(final int xWidth, final in for (int x = 0; x < xWidth; x++) { final ArrayList partGrids = new ArrayList<>(); for (int y = 0; y < yLength; y++) { - partGrids.add(new Plain()); + partGrids.add(new LocationPlain()); } grids.add(partGrids); } @@ -131,17 +131,17 @@ private void iterateGridWithinRadius( private Location createLocationByTypeAndDistance(String environmentType, int distance) { switch (environmentType) { case Entityconstants.CITY: - return new City(distance); + return new LocationCity(distance); case Entityconstants.FOREST: - return new Forest(distance); + return new LocationForest(distance); case Entityconstants.PLAIN: - return new Plain(); + return new LocationPlain(); case Entityconstants.ICELAND: - return new Iceland(distance); + return new LocationIceland(distance); case Entityconstants.DESERT: - return new Desert(distance); + return new LocationDesert(distance); default: - return new Plain(); + return new LocationPlain(); } } @@ -154,19 +154,19 @@ public void printGrids(ArrayList> grids) { for (ArrayList row : grids) { for (Location loc : row) { // Determine the character representation based on the Location type - if (loc instanceof Plain) { + if (loc instanceof LocationPlain) { System.out.print("P "); } - else if (loc instanceof Iceland) { + else if (loc instanceof LocationIceland) { System.out.print("i "); } - else if (loc instanceof Desert) { + else if (loc instanceof LocationDesert) { System.out.print(" "); } - else if (loc instanceof City) { + else if (loc instanceof LocationCity) { System.out.print("W "); } - else if (loc instanceof Forest) { + else if (loc instanceof LocationForest) { System.out.print("' "); } else { From c450364900db066050a81242681270b58dbd7e98 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sat, 16 Nov 2024 18:54:37 -0700 Subject: [PATCH 009/154] Move usecase completed --- src/main/java/app/MainNoteApplication.java | 56 --------- src/main/java/app/NoteAppBuilder.java | 83 -------------- .../data_access/DBNoteDataAccessObject.java | 107 ------------------ src/main/java/entity/Entityconstants.java | 7 +- src/main/java/entity/Inventory.java | 4 +- .../entity/{Player.java => PlayerInfo.java} | 4 +- src/main/java/entity/PlayerLocation.java | 30 +++++ src/main/java/entity/User.java | 24 ---- .../java/interface_adapter/ViewModel.java | 63 ----------- .../note/NoteController.java | 28 ----- .../interface_adapter/note/NotePresenter.java | 38 ------- .../interface_adapter/note/NoteState.java | 26 ----- .../interface_adapter/note/NoteViewModel.java | 13 --- src/main/java/use_case/c.java | 4 + .../move/MoveDataAccessInterface.java | 37 ++++++ .../java/use_case/move/MoveInputBoundary.java | 13 +++ .../java/use_case/move/MoveInputData.java | 13 +++ .../java/use_case/move/MoveInteractor.java | 91 +++++++++++++++ .../use_case/move/MoveOutputBoundary.java | 19 ++++ .../java/use_case/move/MoveOutputData.java | 32 ++++++ .../use_case/note/DataAccessException.java | 10 -- .../note/NoteDataAccessInterface.java | 30 ----- .../java/use_case/note/NoteInputBoundary.java | 19 ---- .../java/use_case/note/NoteInteractor.java | 59 ---------- .../use_case/note/NoteOutputBoundary.java | 18 --- src/main/java/view/NoteView.java | 95 ---------------- .../java/app/MainNoteApplicationTest.java | 2 - .../{note => }/NoteInteractorTest.java | 3 +- 28 files changed, 249 insertions(+), 679 deletions(-) delete mode 100644 src/main/java/app/MainNoteApplication.java delete mode 100644 src/main/java/app/NoteAppBuilder.java delete mode 100644 src/main/java/data_access/DBNoteDataAccessObject.java rename src/main/java/entity/{Player.java => PlayerInfo.java} (95%) create mode 100644 src/main/java/entity/PlayerLocation.java delete mode 100644 src/main/java/entity/User.java delete mode 100644 src/main/java/interface_adapter/ViewModel.java delete mode 100644 src/main/java/interface_adapter/note/NoteController.java delete mode 100644 src/main/java/interface_adapter/note/NotePresenter.java delete mode 100644 src/main/java/interface_adapter/note/NoteState.java delete mode 100644 src/main/java/interface_adapter/note/NoteViewModel.java create mode 100644 src/main/java/use_case/c.java create mode 100644 src/main/java/use_case/move/MoveDataAccessInterface.java create mode 100644 src/main/java/use_case/move/MoveInputBoundary.java create mode 100644 src/main/java/use_case/move/MoveInputData.java create mode 100644 src/main/java/use_case/move/MoveInteractor.java create mode 100644 src/main/java/use_case/move/MoveOutputBoundary.java create mode 100644 src/main/java/use_case/move/MoveOutputData.java delete mode 100644 src/main/java/use_case/note/DataAccessException.java delete mode 100644 src/main/java/use_case/note/NoteDataAccessInterface.java delete mode 100644 src/main/java/use_case/note/NoteInputBoundary.java delete mode 100644 src/main/java/use_case/note/NoteInteractor.java delete mode 100644 src/main/java/use_case/note/NoteOutputBoundary.java delete mode 100644 src/main/java/view/NoteView.java rename src/test/java/use_case/{note => }/NoteInteractorTest.java (95%) diff --git a/src/main/java/app/MainNoteApplication.java b/src/main/java/app/MainNoteApplication.java deleted file mode 100644 index c37860156..000000000 --- a/src/main/java/app/MainNoteApplication.java +++ /dev/null @@ -1,56 +0,0 @@ -package app; - -import data_access.DBNoteDataAccessObject; -import use_case.note.NoteDataAccessInterface; - -/** - * An application where we can view and add to a note stored by a user. - *

- * This is a minimal example of using the password-protected user API from lab 5, - * but demonstrating the endpoint allowing you to store an arbitrary JSON object. - * This functionality could be used in any project where your team wants to persist - * data which is then accessible across devices.

- *

The code is intentionally somewhat incomplete to leave work to be done if your - * team were to choose to work on a project which would require similar functionality. - * For example, we have intentionally not created a full "Note" entity here, but - * rather just represented a note as a string. - *

- * The ViewManager code has also been removed, since this minimal program only requires a single - * view. Your team may wish to bring back the ViewManager or make your own implementation of supporting - * switching between views depending on your project. - */ -public class MainNoteApplication { - - /** - * The main entry point of the application. - *

- * The program will show you the note currently saved in the system. - * You are able to edit it and then save it to the system. You can refresh - * to update the note to reflect what was saved most recently. This - * uses the API from lab, so there is one database storing the note, - * which means that if anyone updates the note, that is what you will - * see when you refresh. - *

- * You can generalize the code to allow you to - * specify which "user" to save the note for, which will allow your team - * to store information specific to your team which is password-protected. - * The username and password used in this application are currently for - * user jonathan_calver2, but you can change that. As you did in lab 3, - * you will likely want to store password information locally rather than - * in your repo. Or you can require the user to enter their credentials - * in your application; it just depends on what your program's main - * functionality. - *

- * @param args commandline arguments are ignored - */ - public static void main(String[] args) { - - // create the data access and inject it into our builder! - final NoteDataAccessInterface noteDataAccess = new DBNoteDataAccessObject(); - - final NoteAppBuilder builder = new NoteAppBuilder(); - builder.addNoteDAO(noteDataAccess) - .addNoteView() - .addNoteUseCase().build().setVisible(true); - } -} diff --git a/src/main/java/app/NoteAppBuilder.java b/src/main/java/app/NoteAppBuilder.java deleted file mode 100644 index a68cb9ad6..000000000 --- a/src/main/java/app/NoteAppBuilder.java +++ /dev/null @@ -1,83 +0,0 @@ -package app; - -import javax.swing.JFrame; -import javax.swing.WindowConstants; - -import interface_adapter.note.NoteController; -import interface_adapter.note.NotePresenter; -import interface_adapter.note.NoteViewModel; -import use_case.note.NoteDataAccessInterface; -import use_case.note.NoteInteractor; -import use_case.note.NoteOutputBoundary; -import view.NoteView; - -/** - * Builder for the Note Application. - */ -public class NoteAppBuilder { - public static final int HEIGHT = 300; - public static final int WIDTH = 400; - private NoteDataAccessInterface noteDAO; - private NoteViewModel noteViewModel = new NoteViewModel(); - private NoteView noteView; - private NoteInteractor noteInteractor; - - /** - * Sets the NoteDAO to be used in this application. - * @param noteDataAccess the DAO to use - * @return this builder - */ - public NoteAppBuilder addNoteDAO(NoteDataAccessInterface noteDataAccess) { - noteDAO = noteDataAccess; - return this; - } - - /** - * Creates the objects for the Note Use Case and connects the NoteView to its - * controller. - *

This method must be called after addNoteView!

- * @return this builder - * @throws RuntimeException if this method is called before addNoteView - */ - public NoteAppBuilder addNoteUseCase() { - final NoteOutputBoundary noteOutputBoundary = new NotePresenter(noteViewModel); - noteInteractor = new NoteInteractor( - noteDAO, noteOutputBoundary); - - final NoteController controller = new NoteController(noteInteractor); - if (noteView == null) { - throw new RuntimeException("addNoteView must be called before addNoteUseCase"); - } - noteView.setNoteController(controller); - return this; - } - - /** - * Creates the NoteView and underlying NoteViewModel. - * @return this builder - */ - public NoteAppBuilder addNoteView() { - noteViewModel = new NoteViewModel(); - noteView = new NoteView(noteViewModel); - return this; - } - - /** - * Builds the application. - * @return the JFrame for the application - */ - public JFrame build() { - final JFrame frame = new JFrame(); - frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - frame.setTitle("Note Application"); - frame.setSize(WIDTH, HEIGHT); - - frame.add(noteView); - - // refresh so that the note will be visible when we start the program - noteInteractor.executeRefresh(); - - return frame; - - } -} diff --git a/src/main/java/data_access/DBNoteDataAccessObject.java b/src/main/java/data_access/DBNoteDataAccessObject.java deleted file mode 100644 index dadb0cab0..000000000 --- a/src/main/java/data_access/DBNoteDataAccessObject.java +++ /dev/null @@ -1,107 +0,0 @@ -package data_access; - -import java.io.IOException; - -import org.json.JSONException; -import org.json.JSONObject; - -import entity.User; -import okhttp3.MediaType; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import use_case.note.DataAccessException; -import use_case.note.NoteDataAccessInterface; - -/** - * The DAO for accessing notes stored in the database. - *

This class demonstrates how your group can use the password-protected user - * endpoints of the API used in lab 5 to store persistent data in your program. - *

- *

You can also refer to the lab 5 code for signing up a new user and other use cases. - *

- * See - * - * the documentation - * of the API for more details. - */ -public class DBNoteDataAccessObject implements NoteDataAccessInterface { - private static final int SUCCESS_CODE = 200; - private static final int CREDENTIAL_ERROR = 401; - private static final String CONTENT_TYPE_LABEL = "Content-Type"; - private static final String CONTENT_TYPE_JSON = "application/json"; - private static final String STATUS_CODE_LABEL = "status_code"; - private static final String USERNAME = "username"; - private static final String PASSWORD = "password"; - private static final String MESSAGE = "message"; - - @Override - public String saveNote(User user, String note) throws DataAccessException { - final OkHttpClient client = new OkHttpClient().newBuilder() - .build(); - - // POST METHOD - final MediaType mediaType = MediaType.parse(CONTENT_TYPE_JSON); - final JSONObject requestBody = new JSONObject(); - requestBody.put(USERNAME, user.getName()); - requestBody.put(PASSWORD, user.getPassword()); - final JSONObject extra = new JSONObject(); - extra.put("note", note); - requestBody.put("info", extra); - final RequestBody body = RequestBody.create(requestBody.toString(), mediaType); - final Request request = new Request.Builder() - .url("http://vm003.teach.cs.toronto.edu:20112/modifyUserInfo") - .method("PUT", body) - .addHeader(CONTENT_TYPE_LABEL, CONTENT_TYPE_JSON) - .build(); - try { - final Response response = client.newCall(request).execute(); - - final JSONObject responseBody = new JSONObject(response.body().string()); - - if (responseBody.getInt(STATUS_CODE_LABEL) == SUCCESS_CODE) { - return loadNote(user); - } - else if (responseBody.getInt(STATUS_CODE_LABEL) == CREDENTIAL_ERROR) { - throw new DataAccessException("message could not be found or password was incorrect"); - } - else { - throw new DataAccessException("database error: " + responseBody.getString(MESSAGE)); - } - } - catch (IOException | JSONException ex) { - throw new DataAccessException(ex.getMessage()); - } - } - - @Override - public String loadNote(User user) throws DataAccessException { - // Make an API call to get the user object. - final String username = user.getName(); - final OkHttpClient client = new OkHttpClient().newBuilder().build(); - final Request request = new Request.Builder() - .url(String.format("http://vm003.teach.cs.toronto.edu:20112/user?username=%s", username)) - .addHeader("Content-Type", CONTENT_TYPE_JSON) - .build(); - try { - final Response response = client.newCall(request).execute(); - - final JSONObject responseBody = new JSONObject(response.body().string()); - - if (responseBody.getInt(STATUS_CODE_LABEL) == SUCCESS_CODE) { - final JSONObject userJSONObject = responseBody.getJSONObject("user"); - final JSONObject data = userJSONObject.getJSONObject("info"); - return data.getString("note"); - } - else { - throw new DataAccessException(responseBody.getString(MESSAGE)); - } - } - catch (IOException | JSONException ex) { - throw new RuntimeException(ex); - } - } -} diff --git a/src/main/java/entity/Entityconstants.java b/src/main/java/entity/Entityconstants.java index 551508a77..bea36396f 100644 --- a/src/main/java/entity/Entityconstants.java +++ b/src/main/java/entity/Entityconstants.java @@ -30,6 +30,9 @@ public class Entityconstants { public static final double RAREEVENTBASEPROB = 0.03; public static final int STARTERHORDEMAGNITUDE = 300; public static final int STARTERHORDEDURATION = 10; - - + public static final int MOBILIZATIONIMPACTSPEED = 10; + public static final String UP = "up"; + public static final String DOWN = "down"; + public static final String LEFT = "left"; + public static final String RIGHT = "right"; } diff --git a/src/main/java/entity/Inventory.java b/src/main/java/entity/Inventory.java index 8653fd114..1ba7fd8c7 100644 --- a/src/main/java/entity/Inventory.java +++ b/src/main/java/entity/Inventory.java @@ -42,7 +42,7 @@ public void changeWater(int waterChange) { } public int getWeapon() { - return Weapon; + return weapon; } /** @@ -50,7 +50,7 @@ public int getWeapon() { * @param weaponChange the change which is happening. */ public void changeweapon(int weaponChange) { - this.Weapon = this.Weapon + weaponChange; + this.weapon = this.weapon + weaponChange; } public int getPeople() { diff --git a/src/main/java/entity/Player.java b/src/main/java/entity/PlayerInfo.java similarity index 95% rename from src/main/java/entity/Player.java rename to src/main/java/entity/PlayerInfo.java index 542a85957..b2bfac156 100644 --- a/src/main/java/entity/Player.java +++ b/src/main/java/entity/PlayerInfo.java @@ -6,13 +6,13 @@ * The class should only be updating any instance (player of it) once and which is after game ends, not termination! * The getter might be called multiple time for score board representation. */ -public class Player { +public class PlayerInfo { private String name; private int score; private int daysSurvived; private boolean won; - public Player(String name) { + public PlayerInfo(String name) { this.name = name; this.score = 0; this.daysSurvived = 0; diff --git a/src/main/java/entity/PlayerLocation.java b/src/main/java/entity/PlayerLocation.java new file mode 100644 index 000000000..d983e5bf3 --- /dev/null +++ b/src/main/java/entity/PlayerLocation.java @@ -0,0 +1,30 @@ +package entity; + +/** + * Class keep track of player location. + */ +public class PlayerLocation { + private int xcoordinate; + private int ycoordinate; + + public PlayerLocation(int xcoordinate, int ycoordinate) { + this.xcoordinate = xcoordinate; + this.ycoordinate = ycoordinate; + } + + public int getXcoordinate() { + return xcoordinate; + } + + public void setXcoordinate(int xcoordinate) { + this.xcoordinate = xcoordinate; + } + + public int getYcoordinate() { + return ycoordinate; + } + + public void setYcoordinate(int ycoordinate) { + this.ycoordinate = ycoordinate; + } +} diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java deleted file mode 100644 index e0c57e9a6..000000000 --- a/src/main/java/entity/User.java +++ /dev/null @@ -1,24 +0,0 @@ -package entity; - -/** - * The representation of a password-protected user for our program. - */ -public class User { - - private final String name; - private final String password; - - public User(String name, String password) { - this.name = name; - this.password = password; - } - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - -} diff --git a/src/main/java/interface_adapter/ViewModel.java b/src/main/java/interface_adapter/ViewModel.java deleted file mode 100644 index 130d797a1..000000000 --- a/src/main/java/interface_adapter/ViewModel.java +++ /dev/null @@ -1,63 +0,0 @@ -package interface_adapter; - -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; - -/** - * The ViewModel for our CA implementation. - * This class delegates work to a PropertyChangeSupport object for - * managing the property change events. - * - * @param The type of state object contained in the model. - */ -public class ViewModel { - - private final String viewName; - - private final PropertyChangeSupport support = new PropertyChangeSupport(this); - - private T state; - - public ViewModel(String viewName) { - this.viewName = viewName; - } - - public String getViewName() { - return this.viewName; - } - - public T getState() { - return this.state; - } - - public void setState(T state) { - this.state = state; - } - - /** - * Fires a property changed event for the state of this ViewModel. - */ - public void firePropertyChanged() { - this.support.firePropertyChange("state", null, this.state); - } - - /** - * Fires a property changed event for the state of this ViewModel, which - * allows the user to specify a different propertyName. This can be useful - * when a class is listening for multiple kinds of property changes. - *

For example, the LoggedInView listens for two kinds of property changes; - * it can use the property name to distinguish which property has changed.

- * @param propertyName the label for the property that was changed - */ - public void firePropertyChanged(String propertyName) { - this.support.firePropertyChange(propertyName, null, this.state); - } - - /** - * Adds a PropertyChangeListener to this ViewModel. - * @param listener The PropertyChangeListener to be added - */ - public void addPropertyChangeListener(PropertyChangeListener listener) { - this.support.addPropertyChangeListener(listener); - } -} diff --git a/src/main/java/interface_adapter/note/NoteController.java b/src/main/java/interface_adapter/note/NoteController.java deleted file mode 100644 index e3e5dfb32..000000000 --- a/src/main/java/interface_adapter/note/NoteController.java +++ /dev/null @@ -1,28 +0,0 @@ -package interface_adapter.note; - -import use_case.note.NoteInputBoundary; - -/** - * Controller for our Note related Use Cases. - */ -public class NoteController { - - private final NoteInputBoundary noteInteractor; - - public NoteController(NoteInputBoundary noteInteractor) { - this.noteInteractor = noteInteractor; - } - - /** - * Executes the Note related Use Cases. - * @param note the note to be recorded - */ - public void execute(String note) { - if (note != null) { - noteInteractor.executeSave(note); - } - else { - noteInteractor.executeRefresh(); - } - } -} diff --git a/src/main/java/interface_adapter/note/NotePresenter.java b/src/main/java/interface_adapter/note/NotePresenter.java deleted file mode 100644 index d4e416165..000000000 --- a/src/main/java/interface_adapter/note/NotePresenter.java +++ /dev/null @@ -1,38 +0,0 @@ -package interface_adapter.note; - -import use_case.note.NoteOutputBoundary; - -/** - * The presenter for our Note viewing and editing program. - */ -public class NotePresenter implements NoteOutputBoundary { - - private final NoteViewModel noteViewModel; - - public NotePresenter(NoteViewModel noteViewModel) { - this.noteViewModel = noteViewModel; - } - - /** - * Prepares the success view for the Note related Use Cases. - * - * @param note the output data - */ - @Override - public void prepareSuccessView(String note) { - noteViewModel.getState().setNote(note); - noteViewModel.getState().setError(null); - noteViewModel.firePropertyChanged(); - } - - /** - * Prepares the failure view for the Note related Use Cases. - * - * @param errorMessage the explanation of the failure - */ - @Override - public void prepareFailView(String errorMessage) { - noteViewModel.getState().setError(errorMessage); - noteViewModel.firePropertyChanged(); - } -} diff --git a/src/main/java/interface_adapter/note/NoteState.java b/src/main/java/interface_adapter/note/NoteState.java deleted file mode 100644 index c5b2234d6..000000000 --- a/src/main/java/interface_adapter/note/NoteState.java +++ /dev/null @@ -1,26 +0,0 @@ -package interface_adapter.note; - -/** - * The State for a note. - *

For this example, a note is simplay a string.

- */ -public class NoteState { - private String note = ""; - private String error; - - public String getNote() { - return note; - } - - public void setNote(String note) { - this.note = note; - } - - public void setError(String errorMessage) { - this.error = errorMessage; - } - - public String getError() { - return error; - } -} diff --git a/src/main/java/interface_adapter/note/NoteViewModel.java b/src/main/java/interface_adapter/note/NoteViewModel.java deleted file mode 100644 index 6e185d0fa..000000000 --- a/src/main/java/interface_adapter/note/NoteViewModel.java +++ /dev/null @@ -1,13 +0,0 @@ -package interface_adapter.note; - -import interface_adapter.ViewModel; - -/** - * The ViewModel for the NoteView. - */ -public class NoteViewModel extends ViewModel { - public NoteViewModel() { - super("note"); - setState(new NoteState()); - } -} diff --git a/src/main/java/use_case/c.java b/src/main/java/use_case/c.java new file mode 100644 index 000000000..d16947651 --- /dev/null +++ b/src/main/java/use_case/c.java @@ -0,0 +1,4 @@ +package use_case; + +public class c { +} diff --git a/src/main/java/use_case/move/MoveDataAccessInterface.java b/src/main/java/use_case/move/MoveDataAccessInterface.java new file mode 100644 index 000000000..f82c3bf50 --- /dev/null +++ b/src/main/java/use_case/move/MoveDataAccessInterface.java @@ -0,0 +1,37 @@ +package use_case.move; + +import entity.Maps; +import entity.PlayerAttributes; +import entity.PlayerLocation; + +/** + * Data access interface for move use case, retrieve player's current location, and attribute. + * attribute which we care is mobilization, which determine how fast player can move. + */ +public interface MoveDataAccessInterface { + + /** + * Return the player attributes from data access. + * @return player attribute entity. + */ + PlayerAttributes getPlayerAttributes(); + + /** + * Return the player location from data access. + * @return player location. + */ + PlayerLocation getPlayerLocation(); + + /** + * Return the map grid from data access, use to determine if vaild move on the edge etc. + * @return return map. + */ + Maps getMaps(); + + /** + * Update the player location. + * @param newx newx of player + * @param newy newy of player + */ + void updatePlayerLocation(int newx, int newy); +} diff --git a/src/main/java/use_case/move/MoveInputBoundary.java b/src/main/java/use_case/move/MoveInputBoundary.java new file mode 100644 index 000000000..dfbcc8fee --- /dev/null +++ b/src/main/java/use_case/move/MoveInputBoundary.java @@ -0,0 +1,13 @@ +package use_case.move; + +/** + * Input boundary of the use case move. + */ +public interface MoveInputBoundary { + + /** + * Execute the move for player based on given direction. + * @param direction direction player choose. + */ + void execute(String direction); +} diff --git a/src/main/java/use_case/move/MoveInputData.java b/src/main/java/use_case/move/MoveInputData.java new file mode 100644 index 000000000..df9bb3724 --- /dev/null +++ b/src/main/java/use_case/move/MoveInputData.java @@ -0,0 +1,13 @@ +package use_case.move; + + +/** + * Inputdata structure for move usecase. + */ +public class MoveInputData { + private final String direction; + + public MoveInputData(String direction) { + this.direction = direction; + } +} diff --git a/src/main/java/use_case/move/MoveInteractor.java b/src/main/java/use_case/move/MoveInteractor.java new file mode 100644 index 000000000..660e38bac --- /dev/null +++ b/src/main/java/use_case/move/MoveInteractor.java @@ -0,0 +1,91 @@ +package use_case.move; + +import entity.Entityconstants; +import entity.PlayerLocation; + +/** + * Move use case interactor. + */ +public class MoveInteractor implements MoveInputBoundary { + private final MoveDataAccessInterface moveDataAccessObject; + private final MoveOutputBoundary moveOutputBoundary; + + public MoveInteractor(MoveDataAccessInterface moveDataAccessObject, MoveOutputBoundary moveOutputBoundary) { + this.moveDataAccessObject = moveDataAccessObject; + this.moveOutputBoundary = moveOutputBoundary; + } + + @Override + public void execute(String direction) { + // Fetch necessary data + final int speed = 1 + (moveDataAccessObject.getPlayerAttributes().getMobilization() + / Entityconstants.MOBILIZATIONIMPACTSPEED); + final PlayerLocation currentLocation = moveDataAccessObject.getPlayerLocation(); + final int x = currentLocation.getXcoordinate(); + final int y = currentLocation.getYcoordinate(); + final int mapWidth = moveDataAccessObject.getMaps().getGrid().size(); + final int mapHeight = moveDataAccessObject.getMaps().getGrid().get(1).size(); + + // Variables for new coordinates + int newX = x; + int newY = y; + + // Determine new coordinates based on the direction + switch (direction) { + case Entityconstants.UP: + newY = Math.max(0, y - speed); + break; + case Entityconstants.DOWN: + newY = Math.min(mapHeight - 1, y + speed); + break; + case Entityconstants.LEFT: + newX = Math.max(0, x - speed); + break; + case Entityconstants.RIGHT: + newX = Math.min(mapWidth - 1, x + speed); + break; + default: + moveOutputBoundary.prepareFailureView("Invalid direction provided: " + direction); + } + + // Check if the move is valid + if (isInvalidMove(direction, x, y, newX, newY, mapWidth, mapHeight)) { + moveOutputBoundary.prepareFailureView( + "You can't move further in the " + direction + " direction; you're at the edge."); + } + else { + moveDataAccessObject.updatePlayerLocation(newX, newY); + final String successMessage = "You moved to position (" + newX + ", " + newY + ")."; + moveOutputBoundary.prepareSuccessView(new MoveOutputData(newX, newY, true, successMessage)); + } + } + + /** + * Helper method to check if a move is invalid. + * @param direction direction heading. + * @param mapHeight height of the map. + * @param mapWidth width of the map. + * @param newX Changed x. + * @param newY Changed y. + * @param xcoor x of player location currently. + * @param ycoor y of player location currently. + * @return Return if this is a valid move. + */ + private boolean isInvalidMove(String direction, int xcoor, int ycoor, + int newX, int newY, int mapWidth, int mapHeight) { + boolean ans = false; + if (direction.equals(Entityconstants.UP)) { + ans = ycoor == 0 || newY == ycoor; + } + else if (direction.equals(Entityconstants.DOWN)) { + ans = ycoor == mapHeight - 1 || newY == ycoor; + } + else if (direction.equals(Entityconstants.LEFT)) { + ans = xcoor == 0 || newX == xcoor; + } + else if (direction.equals(Entityconstants.RIGHT)) { + ans = xcoor == mapWidth - 1 || newX == xcoor; + } + return ans; + } +} diff --git a/src/main/java/use_case/move/MoveOutputBoundary.java b/src/main/java/use_case/move/MoveOutputBoundary.java new file mode 100644 index 000000000..5336f13ec --- /dev/null +++ b/src/main/java/use_case/move/MoveOutputBoundary.java @@ -0,0 +1,19 @@ +package use_case.move; + +/** + * Interface of output boundary. + */ +public interface MoveOutputBoundary { + + /** + * Outputs for a successful move. + * @param outputData the output for updating the view. + */ + void prepareSuccessView(MoveOutputData outputData); + + /** + * If the move the invaild, example: is on 0,0(edge) but player moved up. + * @param errorMessage message of why is invaild, for the player. + */ + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/use_case/move/MoveOutputData.java b/src/main/java/use_case/move/MoveOutputData.java new file mode 100644 index 000000000..0628b676b --- /dev/null +++ b/src/main/java/use_case/move/MoveOutputData.java @@ -0,0 +1,32 @@ +package use_case.move; + +public class MoveOutputData { + + private final int newx; + private final int newy; + private final boolean usecasesuccess; + private final String failmessage; + + public MoveOutputData(int newx, int newy, boolean usecasesuccess, String failmessage) { + this.newx = newx; + this.newy = newy; + this.usecasesuccess = usecasesuccess; + this.failmessage = failmessage; + } + + public int getNewx() { + return newx; + } + + public int getNewy() { + return newy; + } + + public boolean isUsecasesuccess() { + return usecasesuccess; + } + + public String getFailmessage() { + return failmessage; + } +} diff --git a/src/main/java/use_case/note/DataAccessException.java b/src/main/java/use_case/note/DataAccessException.java deleted file mode 100644 index b8c17920d..000000000 --- a/src/main/java/use_case/note/DataAccessException.java +++ /dev/null @@ -1,10 +0,0 @@ -package use_case.note; - -/** - * Exception thrown when there is an error with accessing data. - */ -public class DataAccessException extends Exception { - public DataAccessException(String string) { - super(string); - } -} diff --git a/src/main/java/use_case/note/NoteDataAccessInterface.java b/src/main/java/use_case/note/NoteDataAccessInterface.java deleted file mode 100644 index b71597828..000000000 --- a/src/main/java/use_case/note/NoteDataAccessInterface.java +++ /dev/null @@ -1,30 +0,0 @@ -package use_case.note; - -import entity.User; - -/** - * Interface for the NoteDAO. It consists of methods for - * both loading and saving a note. - */ -public interface NoteDataAccessInterface { - - /** - * Saves a note for a given user. This will replace any existing note. - *

The password of the user must match that of the user saved in the system.

- * @param user the user information associated with the note - * @param note the note to be saved - * @return the contents of the note - * @throws DataAccessException if the user's note can not be saved for any reason - */ - String saveNote(User user, String note) throws DataAccessException; - - /** - * Returns the note associated with the user. The password - * is not checked, so anyone can read the information. - * @param user the user information associated with the note - * @return the contents of the note - * @throws DataAccessException if the user's note can not be loaded for any reason - */ - String loadNote(User user) throws DataAccessException; - -} diff --git a/src/main/java/use_case/note/NoteInputBoundary.java b/src/main/java/use_case/note/NoteInputBoundary.java deleted file mode 100644 index b41da9bf5..000000000 --- a/src/main/java/use_case/note/NoteInputBoundary.java +++ /dev/null @@ -1,19 +0,0 @@ -package use_case.note; - -/** - * The Input Boundary for our note-related use cases. Since they are closely related, - * we have included them both in the same interface for simplicity. - */ -public interface NoteInputBoundary { - - /** - * Executes the refresh note use case. - */ - void executeRefresh(); - - /** - * Executes the save note use case. - * @param message the input data - */ - void executeSave(String message); -} diff --git a/src/main/java/use_case/note/NoteInteractor.java b/src/main/java/use_case/note/NoteInteractor.java deleted file mode 100644 index 369e9309a..000000000 --- a/src/main/java/use_case/note/NoteInteractor.java +++ /dev/null @@ -1,59 +0,0 @@ -package use_case.note; - -import entity.User; - -/** - * The "Use Case Interactor" for our two note-related use cases of refreshing - * the contents of the note and saving the contents of the note. Since they - * are closely related, we have combined them here for simplicity. - */ -public class NoteInteractor implements NoteInputBoundary { - - private final NoteDataAccessInterface noteDataAccessInterface; - private final NoteOutputBoundary noteOutputBoundary; - // Note: this program has it hardcoded which user object it is getting data for; - // you could change this if you wanted to generalize the code. For example, - // you might allow a user of the program to create a new note, which you - // could store as a "user" through the API OR you might maintain all notes - // in a JSON object stored in one common "user" stored through the API. - private final User user = new User("jonathan_calver2", "abc123"); - - public NoteInteractor(NoteDataAccessInterface noteDataAccessInterface, - NoteOutputBoundary noteOutputBoundary) { - this.noteDataAccessInterface = noteDataAccessInterface; - this.noteOutputBoundary = noteOutputBoundary; - } - - /** - * Executes the refresh note use case. - * - */ - @Override - public void executeRefresh() { - try { - - final String note = noteDataAccessInterface.loadNote(user); - noteOutputBoundary.prepareSuccessView(note); - } - catch (DataAccessException ex) { - noteOutputBoundary.prepareFailView(ex.getMessage()); - } - } - - /** - * Executes the save note use case. - * - * @param note the input data - */ - @Override - public void executeSave(String note) { - try { - - final String updatedNote = noteDataAccessInterface.saveNote(user, note); - noteOutputBoundary.prepareSuccessView(updatedNote); - } - catch (DataAccessException ex) { - noteOutputBoundary.prepareFailView(ex.getMessage()); - } - } -} diff --git a/src/main/java/use_case/note/NoteOutputBoundary.java b/src/main/java/use_case/note/NoteOutputBoundary.java deleted file mode 100644 index c0c2bb1d0..000000000 --- a/src/main/java/use_case/note/NoteOutputBoundary.java +++ /dev/null @@ -1,18 +0,0 @@ -package use_case.note; - -/** - * The output boundary for the Login Use Case. - */ -public interface NoteOutputBoundary { - /** - * Prepares the success view for the Note related Use Cases. - * @param message the output data - */ - void prepareSuccessView(String message); - - /** - * Prepares the failure view for the Note related Use Cases. - * @param errorMessage the explanation of the failure - */ - void prepareFailView(String errorMessage); -} diff --git a/src/main/java/view/NoteView.java b/src/main/java/view/NoteView.java deleted file mode 100644 index 331d76493..000000000 --- a/src/main/java/view/NoteView.java +++ /dev/null @@ -1,95 +0,0 @@ -package view; - -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; - -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextArea; - -import interface_adapter.note.NoteController; -import interface_adapter.note.NoteState; -import interface_adapter.note.NoteViewModel; - -/** - * The View for when the user is viewing a note in the program. - */ -public class NoteView extends JPanel implements ActionListener, PropertyChangeListener { - - private final NoteViewModel noteViewModel; - - private final JLabel noteName = new JLabel("note for jonathan_calver2"); - private final JTextArea noteInputField = new JTextArea(); - - private final JButton saveButton = new JButton("Save"); - private final JButton refreshButton = new JButton("Refresh"); - private NoteController noteController; - - public NoteView(NoteViewModel noteViewModel) { - - noteName.setAlignmentX(Component.CENTER_ALIGNMENT); - this.noteViewModel = noteViewModel; - this.noteViewModel.addPropertyChangeListener(this); - - final JPanel buttons = new JPanel(); - buttons.add(saveButton); - buttons.add(refreshButton); - - saveButton.addActionListener( - evt -> { - if (evt.getSource().equals(saveButton)) { - noteController.execute(noteInputField.getText()); - - } - } - ); - - refreshButton.addActionListener( - evt -> { - if (evt.getSource().equals(refreshButton)) { - noteController.execute(null); - - } - } - ); - - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - - this.add(noteName); - this.add(noteInputField); - this.add(buttons); - } - - /** - * React to a button click that results in evt. - * @param evt the ActionEvent to react to - */ - public void actionPerformed(ActionEvent evt) { - System.out.println("Click " + evt.getActionCommand()); - } - - @Override - public void propertyChange(PropertyChangeEvent evt) { - final NoteState state = (NoteState) evt.getNewValue(); - setFields(state); - if (state.getError() != null) { - JOptionPane.showMessageDialog(this, state.getError(), - "Error", JOptionPane.ERROR_MESSAGE); - } - } - - private void setFields(NoteState state) { - noteInputField.setText(state.getNote()); - } - - public void setNoteController(NoteController controller) { - this.noteController = controller; - } -} - diff --git a/src/test/java/app/MainNoteApplicationTest.java b/src/test/java/app/MainNoteApplicationTest.java index 025d970e2..84b3393d8 100644 --- a/src/test/java/app/MainNoteApplicationTest.java +++ b/src/test/java/app/MainNoteApplicationTest.java @@ -1,9 +1,7 @@ package app; -import entity.User; import org.junit.Before; import org.junit.Test; -import use_case.note.NoteDataAccessInterface; import javax.swing.*; import java.awt.*; diff --git a/src/test/java/use_case/note/NoteInteractorTest.java b/src/test/java/use_case/NoteInteractorTest.java similarity index 95% rename from src/test/java/use_case/note/NoteInteractorTest.java rename to src/test/java/use_case/NoteInteractorTest.java index a3ed466b6..e219e9652 100644 --- a/src/test/java/use_case/note/NoteInteractorTest.java +++ b/src/test/java/use_case/NoteInteractorTest.java @@ -1,6 +1,5 @@ -package use_case.note; +package use_case; -import entity.User; import org.junit.Test; import static org.junit.Assert.*; From b926d17a8f7b0c08b775749886afb8f8e06a58eb Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 17 Nov 2024 10:52:51 -0700 Subject: [PATCH 010/154] Gather usecase completed --- src/main/java/entity/Location.java | 11 +++- src/main/java/entity/LocationCity.java | 5 ++ src/main/java/entity/LocationDesert.java | 4 ++ src/main/java/entity/LocationForest.java | 4 ++ src/main/java/entity/LocationIceland.java | 4 ++ src/main/java/entity/LocationPlain.java | 4 ++ .../gather/GatherDataAccessInterface.java | 44 +++++++++++++ .../use_case/gather/GatherInputBoundary.java | 14 +++++ .../java/use_case/gather/GatherInputData.java | 10 +++ .../use_case/gather/GatherInteractor.java | 61 +++++++++++++++++++ .../use_case/gather/GatherOutputBoundary.java | 20 ++++++ .../use_case/gather/GatherOutputData.java | 24 ++++++++ .../java/use_case/move/MoveInputBoundary.java | 4 +- .../java/use_case/move/MoveInputData.java | 4 ++ .../java/use_case/move/MoveInteractor.java | 3 +- 15 files changed, 211 insertions(+), 5 deletions(-) create mode 100644 src/main/java/use_case/gather/GatherDataAccessInterface.java create mode 100644 src/main/java/use_case/gather/GatherInputBoundary.java create mode 100644 src/main/java/use_case/gather/GatherInputData.java create mode 100644 src/main/java/use_case/gather/GatherInteractor.java create mode 100644 src/main/java/use_case/gather/GatherOutputBoundary.java create mode 100644 src/main/java/use_case/gather/GatherOutputData.java diff --git a/src/main/java/entity/Location.java b/src/main/java/entity/Location.java index ca6183794..447c81143 100644 --- a/src/main/java/entity/Location.java +++ b/src/main/java/entity/Location.java @@ -82,11 +82,18 @@ public interface Location { Double getweaponresourceavailable(); /** - * The method responsible for decrease the scalar of the location if they stayed, by some proportion - * Notice, it is for all 5 resource scalar. + * The method responsible for decrease the scalar of the location if they stayed, by some proportion, determined + * by player's selected move ex: if player gathered, food weapon and water resource drop + * This is for food weapon and water drop. */ void decreaseresourceavailable(); + /** + * Decrease the scalar by some proportion, which is gonna happen if player broadcast, so what's left is less. + */ + void decreaserepeopleavailable(); + + /** * The threat level of this location, used for calculating power of the horde, and people decrease. * Closer to city core, more threat level, Closer to iceland/desert,(as they are more isolated) lower threat. diff --git a/src/main/java/entity/LocationCity.java b/src/main/java/entity/LocationCity.java index d1b994250..7333572bb 100644 --- a/src/main/java/entity/LocationCity.java +++ b/src/main/java/entity/LocationCity.java @@ -75,6 +75,11 @@ public void decreaseresourceavailable() { this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + + } + + @Override + public void decreaserepeopleavailable() { this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; } diff --git a/src/main/java/entity/LocationDesert.java b/src/main/java/entity/LocationDesert.java index 086faa0ea..00149bfba 100644 --- a/src/main/java/entity/LocationDesert.java +++ b/src/main/java/entity/LocationDesert.java @@ -75,6 +75,10 @@ public void decreaseresourceavailable() { this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public void decreaserepeopleavailable() { this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; } diff --git a/src/main/java/entity/LocationForest.java b/src/main/java/entity/LocationForest.java index 0dfd7c23d..df6904ea0 100644 --- a/src/main/java/entity/LocationForest.java +++ b/src/main/java/entity/LocationForest.java @@ -75,6 +75,10 @@ public void decreaseresourceavailable() { this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public void decreaserepeopleavailable() { this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; } diff --git a/src/main/java/entity/LocationIceland.java b/src/main/java/entity/LocationIceland.java index d4281f133..6cca282de 100644 --- a/src/main/java/entity/LocationIceland.java +++ b/src/main/java/entity/LocationIceland.java @@ -75,6 +75,10 @@ public void decreaseresourceavailable() { this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public void decreaserepeopleavailable() { this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; } diff --git a/src/main/java/entity/LocationPlain.java b/src/main/java/entity/LocationPlain.java index b758c8f01..7926f29ac 100644 --- a/src/main/java/entity/LocationPlain.java +++ b/src/main/java/entity/LocationPlain.java @@ -75,6 +75,10 @@ public void decreaseresourceavailable() { this.foodResource = this.foodResource * Entityconstants.RESOUCEDECREASERATIO; this.waterResource = this.waterResource * Entityconstants.RESOUCEDECREASERATIO; this.weaponResource = this.weaponResource * Entityconstants.RESOUCEDECREASERATIO; + } + + @Override + public void decreaserepeopleavailable() { this.peopleResource = this.peopleResource * Entityconstants.RESOUCEDECREASERATIO; } diff --git a/src/main/java/use_case/gather/GatherDataAccessInterface.java b/src/main/java/use_case/gather/GatherDataAccessInterface.java new file mode 100644 index 000000000..5c537870e --- /dev/null +++ b/src/main/java/use_case/gather/GatherDataAccessInterface.java @@ -0,0 +1,44 @@ +package use_case.gather; + +import entity.Inventory; +import entity.Location; + +public interface GatherDataAccessInterface { + + /** + * Get player's inventory, we need the people data for how fast gathering. + * @return Player's inventory, have the data: people we need for calculation. + */ + Inventory getInventory(); + + /** + * This should return the location player is currently on, based on player location x and y, + * to be implemented on DAO. + * @return Location of the player, contain data we need like food and water resource available scalar etc. + */ + Location getLocation(); + + /** + * Call decreaseresourceavailable method in location object to decrease the resource scalar by day + * after a success gather, call the according change method in inventory class. + */ + void decreaseResourceavailable(); + + /** + * Change player's inventory food by the amount they gathered after successful gather use case. + * @param foodgathered foodgathered for this gather. + */ + void changefood(int foodgathered); + + /** + * Change player's inventory water. + * @param watergathered water found in this gather. + */ + void changewater(int watergathered); + + /** + * Change player's inventory weapon. + * @param weapongathered weapons found in this gather, in this location, by the player. + */ + void changeweapon(int weapongathered); +} diff --git a/src/main/java/use_case/gather/GatherInputBoundary.java b/src/main/java/use_case/gather/GatherInputBoundary.java new file mode 100644 index 000000000..96c60d963 --- /dev/null +++ b/src/main/java/use_case/gather/GatherInputBoundary.java @@ -0,0 +1,14 @@ +package use_case.gather; + +/** + * Interface of input, which implemented by according interactor. + */ +public interface GatherInputBoundary { + + /** + * Execute the use case, with input data provided in datatype GatherInputData. + * @param inputdata the input data which is meanness for now since this action only determined by internal data. + */ + void execute(GatherInputData inputdata); +} + diff --git a/src/main/java/use_case/gather/GatherInputData.java b/src/main/java/use_case/gather/GatherInputData.java new file mode 100644 index 000000000..5951d4e13 --- /dev/null +++ b/src/main/java/use_case/gather/GatherInputData.java @@ -0,0 +1,10 @@ +package use_case.gather; + +/** + * Gather input data, which is for player's input, the fact that player clicked on gather. + * However, we don't need this fact for now, the only reason I'm keeping this is because I want to keep the program + * predictable and uniform, as well as maintaining same structure for all use case. + */ +public class GatherInputData { + +} diff --git a/src/main/java/use_case/gather/GatherInteractor.java b/src/main/java/use_case/gather/GatherInteractor.java new file mode 100644 index 000000000..bd270e5f1 --- /dev/null +++ b/src/main/java/use_case/gather/GatherInteractor.java @@ -0,0 +1,61 @@ +package use_case.gather; + +/** + * Use case interactor for gather. + */ +public class GatherInteractor implements GatherInputBoundary { + private final GatherDataAccessInterface dataAccessInterface; + private final GatherOutputBoundary outputBoundary; + + public GatherInteractor(GatherDataAccessInterface DataAccessInterface, GatherOutputBoundary outputBoundary) { + this.dataAccessInterface = DataAccessInterface; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(GatherInputData inputdata) { + final double foodscalar = dataAccessInterface.getLocation().getfoodresourceavailable(); + final double waterscalar = dataAccessInterface.getLocation().getwaterresourceavailable(); + final double weaponscalar = dataAccessInterface.getLocation().getweaponresourceavailable(); + final int people = dataAccessInterface.getInventory().getPeople(); + final int foodgathered = (int) Math.round(foodscalar * Math.sqrt((double) people)); + final int watergathered = (int) Math.round(waterscalar * Math.sqrt((double) people)); + final int weapongathered = (int) Math.round(weaponscalar * Math.sqrt((double) people)); + // not sure if this is a good way of calculation towards game balance, I'll need when game can fully run to + // decide on the change. + StringBuilder successoutputmessage = new StringBuilder("Your group found "); + if (foodgathered > 0) { + successoutputmessage.append(foodgathered).append(" units of food "); + } + if (watergathered > 0) { + successoutputmessage.append(watergathered).append(" units of water "); + } + if (weapongathered > 0) { + successoutputmessage.append(weapongathered).append(" weapons"); + } + if (foodgathered == 0 && watergathered == 0 && weapongathered == 0) { + successoutputmessage = new StringBuilder("Your group found nothing this time."); + } + else { + successoutputmessage.append("."); + } + dataAccessInterface.changefood(foodgathered); + dataAccessInterface.changewater(watergathered); + dataAccessInterface.changeweapon(weapongathered); + if (isvaildgather()) { + outputBoundary.prepareSuccessView(new GatherOutputData(successoutputmessage.toString(), + "Invalid Gather")); + } + else { + outputBoundary.prepareFailureView("Invalid Gather"); + } + } + + /** + * Helper function to determine validity of this gather, right now I can't think of a way of failing. + * @return vaild gather or not. + */ + public boolean isvaildgather() { + return true; + } +} diff --git a/src/main/java/use_case/gather/GatherOutputBoundary.java b/src/main/java/use_case/gather/GatherOutputBoundary.java new file mode 100644 index 000000000..e210b18aa --- /dev/null +++ b/src/main/java/use_case/gather/GatherOutputBoundary.java @@ -0,0 +1,20 @@ +package use_case.gather; + +/** + * Output boundary for gather use case, responsible for providing the new view after the use case executed. + */ +public interface GatherOutputBoundary { + + /** + * Prepare the view for a successful gather use case. + * @param outputdata outputdata been sent. + */ + void prepareSuccessView(GatherOutputData outputdata); + + /** + * Prepare the new for a failed gather use case, though I'm not sure how will this be failed, maybe player clicked + * on gather after used all their daily available action point. + * @param errorMessage error message for such failure. + */ + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/use_case/gather/GatherOutputData.java b/src/main/java/use_case/gather/GatherOutputData.java new file mode 100644 index 000000000..fdfda9623 --- /dev/null +++ b/src/main/java/use_case/gather/GatherOutputData.java @@ -0,0 +1,24 @@ +package use_case.gather; + +/** + * Outputdata for the new view, notice the classes are already updated in execution of interactor, so this is just + * for the view, displaying successmessage as summary of the gather like "Your group found 178 food, 90 water, 10 weapon + * etc" . + */ +public class GatherOutputData { + private String successmessage; + private String errormessage; + + public GatherOutputData(String successmessage, String errormessage) { + this.successmessage = successmessage; + this.errormessage = errormessage; + } + + public String getSuccessmessage() { + return successmessage; + } + + public String getErrorMessage() { + return errormessage; + } +} diff --git a/src/main/java/use_case/move/MoveInputBoundary.java b/src/main/java/use_case/move/MoveInputBoundary.java index dfbcc8fee..c6ccb09c7 100644 --- a/src/main/java/use_case/move/MoveInputBoundary.java +++ b/src/main/java/use_case/move/MoveInputBoundary.java @@ -7,7 +7,7 @@ public interface MoveInputBoundary { /** * Execute the move for player based on given direction. - * @param direction direction player choose. + * @param inputdata direction player choose in MoveInputData format. */ - void execute(String direction); + void execute(MoveInputData inputdata); } diff --git a/src/main/java/use_case/move/MoveInputData.java b/src/main/java/use_case/move/MoveInputData.java index df9bb3724..d3cb336bf 100644 --- a/src/main/java/use_case/move/MoveInputData.java +++ b/src/main/java/use_case/move/MoveInputData.java @@ -10,4 +10,8 @@ public class MoveInputData { public MoveInputData(String direction) { this.direction = direction; } + + public String getDirection() { + return direction; + } } diff --git a/src/main/java/use_case/move/MoveInteractor.java b/src/main/java/use_case/move/MoveInteractor.java index 660e38bac..a95a53cb4 100644 --- a/src/main/java/use_case/move/MoveInteractor.java +++ b/src/main/java/use_case/move/MoveInteractor.java @@ -16,8 +16,9 @@ public MoveInteractor(MoveDataAccessInterface moveDataAccessObject, MoveOutputBo } @Override - public void execute(String direction) { + public void execute(MoveInputData moveInputData) { // Fetch necessary data + final String direction = moveInputData.getDirection(); final int speed = 1 + (moveDataAccessObject.getPlayerAttributes().getMobilization() / Entityconstants.MOBILIZATIONIMPACTSPEED); final PlayerLocation currentLocation = moveDataAccessObject.getPlayerLocation(); From 2af1d853cb60db90372f3ccfba1d78174ae1fbef Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 17 Nov 2024 16:05:48 -0700 Subject: [PATCH 011/154] Respond usecase completed, event ambush finished --- src/main/java/entity/Entityconstants.java | 34 ++++++ src/main/java/entity/EventAmbush.java | 24 ++-- src/main/java/entity/Inventory.java | 64 +++++++++++ src/main/java/entity/PlayerAttributes.java | 12 +- .../respond/RespondDataAccessInterface.java | 77 +++++++++++++ .../respond/RespondInputBoundary.java | 13 +++ .../use_case/respond/RespondInputData.java | 16 +++ .../use_case/respond/RespondInteractor.java | 103 ++++++++++++++++++ .../respond/RespondOutputBoundary.java | 20 ++++ .../use_case/respond/RespondOutputData.java | 50 +++++++++ 10 files changed, 391 insertions(+), 22 deletions(-) create mode 100644 src/main/java/use_case/respond/RespondDataAccessInterface.java create mode 100644 src/main/java/use_case/respond/RespondInputBoundary.java create mode 100644 src/main/java/use_case/respond/RespondInputData.java create mode 100644 src/main/java/use_case/respond/RespondInteractor.java create mode 100644 src/main/java/use_case/respond/RespondOutputBoundary.java create mode 100644 src/main/java/use_case/respond/RespondOutputData.java diff --git a/src/main/java/entity/Entityconstants.java b/src/main/java/entity/Entityconstants.java index bea36396f..9b5e12f66 100644 --- a/src/main/java/entity/Entityconstants.java +++ b/src/main/java/entity/Entityconstants.java @@ -1,7 +1,12 @@ package entity; +import java.util.ArrayList; + /** * Constants used in this program. + * Notice, by changing these constant, we can alter game dramatically. + * this could be used to achieve game balance. + * as well as for difficulty setting implementation. */ public class Entityconstants { public static final int STARTERFOOD = 100; @@ -16,23 +21,52 @@ public class Entityconstants { public static final double DEFAULTTHREAT = 1; public static final double MAXTEMPDIFF = 50; public static final double MAXTHREATDIFF = 0.5; + // map information and calculation scalar settings. public static final String ICELAND = "Iceland"; public static final String DESERT = "Desert"; public static final String FOREST = "Forest"; public static final String CITY = "City"; public static final String PLAIN = "Plain"; + // name we gonna use. public static final int BIOMERADIUS = 16; + // how the radius is gonna be for each biome, used for map generation. public static final int FIRSTCHOICE = 1; public static final int SECONDCHOICE = 2; public static final int THIRDCHOICE = 3; public static final int FOURTHCHOICE = 4; + // how different choices match their represented int. public static final double COMMONEVENTBASEPROB = 0.1; public static final double RAREEVENTBASEPROB = 0.03; + // base event probability(probability at default at start) public static final int STARTERHORDEMAGNITUDE = 300; public static final int STARTERHORDEDURATION = 10; + // horde starter setting, how in default it should start on public static final int MOBILIZATIONIMPACTSPEED = 10; + // how player attribute mobilization have impact on speed(how many box they move per move) public static final String UP = "up"; public static final String DOWN = "down"; public static final String LEFT = "left"; public static final String RIGHT = "right"; + // name we use. + public static final int UNARMPEOPLEPOWER = 1; + public static final int ARMEDPEOPLEPOWER = 5; + // firepower calculation setting. + public static final int AMBUSHPOWER = 35; + public static final int AMBUSHNEGOTIATE = 4; + // for event ambush, what's required firepower to fight back, and required social ability to negotiate etc. + public static final int AMBUSHFIGHTSUCCESSRESOURCEFOOD = 15; + public static final int AMBUSHFIGHTSUCCESSRESOURCEWATER = 15; + public static final int AMBUSHFIGHTSUCCESSRESOURCEPEOPLE = 0; + public static final int AMBUSHFIGHTSUCCESSRESOURCEWEAPON = 4; + // for event ambush, resource get for successful fight back. + public static final int AMBUSHFAILRESOURCEFOOD = -30; + public static final int AMBUSHFAILRESOURCEWATER = -30; + public static final int AMBUSHFAILRESOURCEPEOPLE = -5; + public static final int AMBUSHFAILRESOURCEWEAPON = -10; + // for event ambush, resource lost for failed. + public static final int ESCAPEMAXDISTANCE = 10; + // for any general escape choice, the distance move randomly at max. + public static final int LENGTHMESSAGECOMMA = 17; + + } diff --git a/src/main/java/entity/EventAmbush.java b/src/main/java/entity/EventAmbush.java index 52c2ec67d..67d99c202 100644 --- a/src/main/java/entity/EventAmbush.java +++ b/src/main/java/entity/EventAmbush.java @@ -5,12 +5,10 @@ import java.util.Map; /** - * Event of ambush, player decide they want to fight back, pay, escape or talk, different action have different - * result as well as result description. However, notice I'm only doing description here ot make entity simple - * thus avoid complex and coupling calculation in entity and leave it to use case interact to avoid coupling, and - * making sure they process information without knowing anything about other classes. + * Event of ambush, player decide they want to fight back, pay, or negotiate. Different actions have different + * results as well as result descriptions. This entity is designed to remain simple, avoiding coupling and + * complex logic, which is handled in the use case interactor. */ - public class EventAmbush implements Event { private final Boolean isPositive; @@ -21,7 +19,6 @@ public class EventAmbush implements Event { private final String fightoutcomesuccess; private final String fightoutcomefailed; private final String payoutcome; - private final String escapeoutcome; private final String negotiatesuccessoutcome; private final String negotiatefailedoutcome; @@ -38,16 +35,15 @@ public EventAmbush() { this.choices = new HashMap<>(); choices.put(Entityconstants.FIRSTCHOICE, "Fight back"); choices.put(Entityconstants.SECONDCHOICE, "Pay the bandits"); - choices.put(Entityconstants.THIRDCHOICE, "Try to escape"); - choices.put(Entityconstants.FOURTHCHOICE, "Negotiate"); + choices.put(Entityconstants.THIRDCHOICE, "Negotiate"); this.probability = Entityconstants.COMMONEVENTBASEPROB; this.fightoutcomesuccess = "You successfully beat the bandits and secured their supplies."; this.fightoutcomefailed = "You fought hard but were overpowered, losing some supplies."; this.payoutcome = "You handed over some of your food to avoid conflict with the bandits."; - this.escapeoutcome = "You managed to escape, but the chaos caused you to lose track of direction to where" - + "your group was heading."; - this.negotiatesuccessoutcome = "You successfully negotiated with the bandits, convincing them to leave peacefully."; - this.negotiatefailedoutcome = "Your negotiation failed, and the bandits took a portion of your supplies by force."; + this.negotiatesuccessoutcome = "You successfully negotiated with the bandits, convincing" + + " them to leave peacefully."; + this.negotiatefailedoutcome = "Your negotiation failed, and the bandits" + + " took a portion of your supplies by force."; } @Override @@ -91,10 +87,6 @@ public String getPayoutcome() { return payoutcome; } - public String getEscapeoutcome() { - return escapeoutcome; - } - public String getNegotiatesuccessoutcome() { return negotiatesuccessoutcome; } diff --git a/src/main/java/entity/Inventory.java b/src/main/java/entity/Inventory.java index 1ba7fd8c7..2cad91d47 100644 --- a/src/main/java/entity/Inventory.java +++ b/src/main/java/entity/Inventory.java @@ -65,4 +65,68 @@ public void changePeople(int peopleChange) { this.people = this.people + peopleChange; } + /** + * Calculatign the firepower of the group. + * @return firepower total. + */ + public double getfirepower() { + // Calculate the number of people with weapon. + final int pairs = Math.min(people, weapon); + // Remaining people who are unarmed + final int unarmedPeople = people - pairs; + + // Firepower: each pair contributes 5, and each unarmed person contributes 1 + return (pairs * Entityconstants.ARMEDPEOPLEPOWER) + + unarmedPeople * Entityconstants.UNARMPEOPLEPOWER; + } + + /** + * Method of generating string description on the change of inventory. + * @param foodChange change of food. + * @param waterChange change of water. + * @param peopleChange change of people. + * @param weaponChange change of weapon. + * @return String of the description. + */ + public String generateResourceChangeMessage(final int foodChange, final int waterChange, + final int weaponChange, final int peopleChange) { + final StringBuilder message = new StringBuilder("Your group has "); + boolean hasChanges = false; + + hasChanges |= appendChange(message, "food", foodChange); + hasChanges |= appendChange(message, "water", waterChange); + hasChanges |= appendChange(message, "people", peopleChange); + hasChanges |= appendChange(message, "weapons", weaponChange); + + final String ans; + if (!hasChanges) { + ans = "Nothing has changed for your group."; + } + else { + message.append("."); + ans = message.toString(); + } + + return ans; + } + + private boolean appendChange(final StringBuilder message, final String resourceName, final int change) { + boolean ans = false; + + if (change != 0) { + if (message.length() > Entityconstants.LENGTHMESSAGECOMMA) { + message.append(", "); + } + if (change > 0) { + message.append("gained ").append(change).append(" units of ").append(resourceName); + } + else { + message.append("lost ").append(Math.abs(change)).append(" units of ").append(resourceName); + } + ans = true; + } + + return ans; + } + } diff --git a/src/main/java/entity/PlayerAttributes.java b/src/main/java/entity/PlayerAttributes.java index bc32180c8..d5e41cae1 100644 --- a/src/main/java/entity/PlayerAttributes.java +++ b/src/main/java/entity/PlayerAttributes.java @@ -15,7 +15,7 @@ public class PlayerAttributes { private int points; // Control the amount of people involvement per day - private int charisma; + private int social; // Control the possibility of the positive effects private int luck; // Control the moving scale and moving times @@ -27,7 +27,7 @@ public class PlayerAttributes { public PlayerAttributes() { this.points = Entityconstants.STARTERATRIBUTEPOINT; - this.charisma = 0; + this.social = 0; this.luck = 0; this.mobilization = 0; this.thrift = 0; @@ -41,12 +41,12 @@ public void setPoints(int points) { this.points = points; } - public int getCharisma() { - return charisma; + public int getSocial() { + return social; } - public void setCharisma(int charisma) { - this.charisma = charisma; + public void setSocial(int social) { + this.social = social; } public int getLuck() { diff --git a/src/main/java/use_case/respond/RespondDataAccessInterface.java b/src/main/java/use_case/respond/RespondDataAccessInterface.java new file mode 100644 index 000000000..cd9368c1d --- /dev/null +++ b/src/main/java/use_case/respond/RespondDataAccessInterface.java @@ -0,0 +1,77 @@ +package use_case.respond; + +import entity.Event; +import entity.Inventory; +import entity.PlayerAttributes; +import entity.PlayerLocation; + +/** + * DAO of respond, provide internal data as needed for interactor. + */ +public interface RespondDataAccessInterface { + + /** + * The event which we are working on to respond, assuming already happened. + * @return Event, contains description, choices, and such. + */ + Event getevent(); + + /** + * Return the player attributes as alot of event outcome are determine by competence and attribute of player. + * ex: low social attribute would cause more likely of failure for negotiate. + * @return return player attributes. + */ + PlayerAttributes getPlayerAttributes(); + + /** + * Return the player's inventory as alot of event outcome are determine by what player have currently. + * ex: low firepower(involves people and weapon) FightBack etc choices are likely to fail. + * @return return player inventory. + */ + Inventory getInventory(); + + /** + * Return the player location, for response like run away flee etc, we'll have to change it, thus we need it. + * @return player's current location. + */ + PlayerLocation getPlayerLocation(); + + /** + * How the amount of people changes after the event, for that choice player provide. call the change method in + * inventory. + * @param peoplechange change of people quantity. + */ + void changepeople(int peoplechange); + + /** + * How the amount of food changes after the event, for that choice player provide. call change method in inventory. + * @param foodchange change of people quantity. + */ + void changefood(int foodchange); + + /** + * How the amount of people changes after the event, for that choice player provide. call change method in inventory + * @param waterchange change of people quantity. + */ + void changewater(int waterchange); + + /** + * How the amount of weapon changes after the event, for that choice player provide. call change method in inventory + * @param weaponchange change of people quantity. + */ + void changeweapon(int weaponchange); + + /** + * If for an event's responds alter the location, call this method which calls player location setxcoordinate + * method. + * @param newx new x coordination of the player after the event. + */ + void setplayerxcoor(int newx); + + /** + * If for an event's responds alter the location, call this method which calls player location setycoordinate + * method. + * @param newy new y coordination of the player after the event. + */ + void setplayerycoor(int newy); +} diff --git a/src/main/java/use_case/respond/RespondInputBoundary.java b/src/main/java/use_case/respond/RespondInputBoundary.java new file mode 100644 index 000000000..7246d671f --- /dev/null +++ b/src/main/java/use_case/respond/RespondInputBoundary.java @@ -0,0 +1,13 @@ +package use_case.respond; + +/** + * Input boundary of respond use case. + */ +public interface RespondInputBoundary { + + /** + * Execute method for respond. + * @param inputdata player's input, represented in input data. + */ + void execute(RespondInputData inputdata); +} diff --git a/src/main/java/use_case/respond/RespondInputData.java b/src/main/java/use_case/respond/RespondInputData.java new file mode 100644 index 000000000..c3778799b --- /dev/null +++ b/src/main/java/use_case/respond/RespondInputData.java @@ -0,0 +1,16 @@ +package use_case.respond; + +/** + * Input data form the view/player side like the choice they choose in term os 12345... + */ +public class RespondInputData { + private int choice; + + public RespondInputData(int choice) { + this.choice = choice; + } + + public int getChoice() { + return choice; + } +} diff --git a/src/main/java/use_case/respond/RespondInteractor.java b/src/main/java/use_case/respond/RespondInteractor.java new file mode 100644 index 000000000..2ba6d325d --- /dev/null +++ b/src/main/java/use_case/respond/RespondInteractor.java @@ -0,0 +1,103 @@ +package use_case.respond; + +import entity.Entityconstants; +import entity.Event; +import entity.EventAmbush; +import entity.Inventory; +import entity.PlayerAttributes; +import kotlin.Pair; + +/** + * Interactor for the response use case, for the event, for the specific choice player provide. + */ +public class RespondInteractor implements RespondInputBoundary { + private final RespondDataAccessInterface respondDataAccessObject; + private final RespondOutputBoundary respondOutputBoundary; + + public RespondInteractor(RespondDataAccessInterface respondDataAccessObject, + RespondOutputBoundary respondOutputBoundary) { + this.respondDataAccessObject = respondDataAccessObject; + this.respondOutputBoundary = respondOutputBoundary; + } + + @Override + public void execute(RespondInputData inputdata) { + final Event event = respondDataAccessObject.getevent(); + final int choice = inputdata.getChoice(); + final PlayerAttributes attributes = respondDataAccessObject.getPlayerAttributes(); + final Inventory inventory = respondDataAccessObject.getInventory(); + if (event instanceof EventAmbush) { + final Pair info = + ambushevaluator(attributes, choice, inventory, event); + final boolean success = info.getSecond(); + if (success) { + respondOutputBoundary.prepareSuccessView(info.getFirst()); + } + else { + respondOutputBoundary.prepareFailureView("Invalid choice"); + } + } + } + + private Pair ambushevaluator(PlayerAttributes attributes, + int choice, + Inventory inventory, + Event event) { + String message = ""; + int foodchange = 0; + int waterchange = 0; + int weaponchange = 0; + int peoplechange = 0; + boolean success = true; + final EventAmbush ambush = (EventAmbush) event; + if (choice == Entityconstants.FIRSTCHOICE) { + if (inventory.getfirepower() >= Entityconstants.AMBUSHPOWER) { + foodchange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; + waterchange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; + weaponchange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; + peoplechange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; + message = ambush.getFightoutcomesuccess(); + } + else { + foodchange = Entityconstants.AMBUSHFAILRESOURCEFOOD; + waterchange = Entityconstants.AMBUSHFAILRESOURCEWATER; + weaponchange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; + peoplechange = Entityconstants.AMBUSHFAILRESOURCEPEOPLE; + message = ambush.getFightoutcomefailed(); + } + } + else if (choice == Entityconstants.SECONDCHOICE) { + foodchange = Entityconstants.AMBUSHFAILRESOURCEFOOD; + waterchange = Entityconstants.AMBUSHFAILRESOURCEWATER; + weaponchange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; + message = ambush.getPayoutcome(); + } + else if (choice == Entityconstants.THIRDCHOICE) { + if (attributes.getSocial() < Entityconstants.AMBUSHNEGOTIATE) { + foodchange = Entityconstants.AMBUSHFAILRESOURCEFOOD; + waterchange = Entityconstants.AMBUSHFAILRESOURCEWATER; + weaponchange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; + message = ambush.getNegotiatefailedoutcome(); + } + else { + message = ambush.getNegotiatesuccessoutcome(); + } + } + else { + success = false; + } + final String inventorymessage = inventory.generateResourceChangeMessage( + foodchange, waterchange, weaponchange, peoplechange); + inventory.changeFood(foodchange); + inventory.changeWater(waterchange); + inventory.changeweapon(weaponchange); + inventory.changePeople(peoplechange); + return new Pair<>( + new RespondOutputData( + message, foodchange, waterchange, weaponchange, peoplechange, inventorymessage + ), + success + ); + + } +} diff --git a/src/main/java/use_case/respond/RespondOutputBoundary.java b/src/main/java/use_case/respond/RespondOutputBoundary.java new file mode 100644 index 000000000..ec24d08de --- /dev/null +++ b/src/main/java/use_case/respond/RespondOutputBoundary.java @@ -0,0 +1,20 @@ +package use_case.respond; + +/** + * Output boundary, responsible for passing output data to the controller. + */ +public interface RespondOutputBoundary { + + /** + * Outputs for a successful respond. + * @param outputData the output for updating the view. + */ + void prepareSuccessView(RespondOutputData outputData); + + /** + * If the respond is invaild, example: only choices 1,2,3,4(represented in number internally) but somehow player + * input 5? though it shouldn't happen because at the end we provide player with only buttons. + * @param errorMessage message of why is invaild, for the player. + */ + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/use_case/respond/RespondOutputData.java b/src/main/java/use_case/respond/RespondOutputData.java new file mode 100644 index 000000000..d7d4cd826 --- /dev/null +++ b/src/main/java/use_case/respond/RespondOutputData.java @@ -0,0 +1,50 @@ +package use_case.respond; + +/** + * Output data for the player's respond. + */ +public class RespondOutputData { + private final String message; + private final int peoplechange; + private final int foodchange; + private final int waterchange; + private final int weaponchange; + private final String inventorymessage; + + public RespondOutputData(String message, + int foodchange, int waterchange, int weaponchange, int peoplechange, + String inventorymessage) { + this.message = message; + this.peoplechange = peoplechange; + this.foodchange = foodchange; + this.waterchange = waterchange; + this.weaponchange = weaponchange; + this.inventorymessage = inventorymessage; + + } + + public String getMessage() { + return message; + } + + public int getPeoplechange() { + return peoplechange; + } + + public int getFoodchange() { + return foodchange; + } + + public int getWaterchange() { + return waterchange; + } + + public int getWeaponchange() { + return weaponchange; + } + + public String getInventorymessage() { + return inventorymessage; + } + +} From 78c2226035ae840e02fcbd5fdd88a1aa48bb3db3 Mon Sep 17 00:00:00 2001 From: yitong an Date: Thu, 21 Nov 2024 18:29:01 -0500 Subject: [PATCH 012/154] add sign up view and log in view --- src/main/java/controller/Constants.java | 19 +++++ src/main/java/controller/LoginView.java | 85 +++++++++++++++++++++ src/main/java/controller/SignUpView.java | 94 ++++++++++++++++++++++++ 3 files changed, 198 insertions(+) create mode 100644 src/main/java/controller/Constants.java create mode 100644 src/main/java/controller/LoginView.java create mode 100644 src/main/java/controller/SignUpView.java diff --git a/src/main/java/controller/Constants.java b/src/main/java/controller/Constants.java new file mode 100644 index 000000000..291436570 --- /dev/null +++ b/src/main/java/controller/Constants.java @@ -0,0 +1,19 @@ +package controller; + +/** + * Constants used in this program. + */ +public class Constants { + public static final int THIRTY = 30; + public static final int TWENTY = 20; + public static final int TWO_HUNDRED = 200; + public static final int FORTY = 40; + public static final int TEN = 10; + public static final int FIFTY = 50; + public static final int SIXTY = 60; + public static final int SIX_HUNDRED = 600; + public static final int FOUR_HUNDRED = 400; + public static final int EIGHTY = 80; + + +} diff --git a/src/main/java/controller/LoginView.java b/src/main/java/controller/LoginView.java new file mode 100644 index 000000000..0865aa6e1 --- /dev/null +++ b/src/main/java/controller/LoginView.java @@ -0,0 +1,85 @@ +package controller; + +import javax.swing.*; +import java.awt.*; + + + +/** + * Constants used in this program. + */ +public class LoginView extends JFrame { + private JLabel nameLabel = new JLabel("group project", JLabel.CENTER); + private SpringLayout springLayout = new SpringLayout(); + private JPanel centerPanel = new JPanel(springLayout); + private JLabel userNameLabel = new JLabel("username"); + private JTextField userText = new JTextField(); + private JLabel passwordLabel = new JLabel("password"); + private JPasswordField passwordText = new JPasswordField(); + private JButton loginBotton = new JButton("log in"); + private JButton registerButton = new JButton("sign up"); + + public LoginView() { + super("Log in"); + final Container contentPane = getContentPane(); + // set size + final Font nameFont = new Font("12", Font.PLAIN, Constants.FORTY); + nameLabel.setFont(nameFont); + final Font centerFont = new Font("8", Font.PLAIN, 20); + userNameLabel.setFont(centerFont); + passwordLabel.setFont(centerFont); + registerButton.setFont(centerFont); + loginBotton.setFont(centerFont); + userText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); + passwordText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); + + // add components + centerPanel.add(userNameLabel); + centerPanel.add(userText); + centerPanel.add(passwordLabel); + centerPanel.add(passwordText); + centerPanel.add(loginBotton); + centerPanel.add(registerButton); + + contentPane.add(nameLabel, BorderLayout.NORTH); + contentPane.add(centerPanel, BorderLayout.CENTER); + + // spring layout + final Spring titleLabelWidth = Spring.width(userNameLabel); + final Spring titleTextWidth = Spring.width(userText); + final Spring spaceWidth = Spring.constant(20); + final Spring childWidth = Spring.sum(Spring.sum(titleLabelWidth, titleTextWidth), spaceWidth); + final int offsetX = childWidth.getValue() / 2; + springLayout.putConstraint(SpringLayout.WEST, userNameLabel, -offsetX, SpringLayout.HEIGHT, centerPanel); + springLayout.putConstraint(SpringLayout.NORTH, userNameLabel, Constants.TWENTY, SpringLayout.NORTH, + centerPanel); + // set userText location + springLayout.putConstraint(SpringLayout.WEST, userText, Constants.TEN, SpringLayout.EAST, userNameLabel); + springLayout.putConstraint(SpringLayout.NORTH, userText, 0, SpringLayout.NORTH, userNameLabel); + // set passwordLabel location + springLayout.putConstraint(SpringLayout.EAST, passwordLabel, 0, SpringLayout.EAST, userNameLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, Constants.TEN, SpringLayout.SOUTH, userNameLabel); + // set passwordText location + springLayout.putConstraint(SpringLayout.WEST, passwordText, Constants.TEN, SpringLayout.EAST, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordText, 0, SpringLayout.NORTH, passwordLabel); + // set loginButton location + springLayout.putConstraint(SpringLayout.WEST, loginBotton, Constants.FIFTY, SpringLayout.WEST, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, loginBotton, Constants.TWENTY, + SpringLayout.SOUTH, passwordLabel); + // set registerButton + springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginBotton); + springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginBotton); + + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + // setLocation(null); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + + } + + public static void main(String[] args) { + new LoginView(); + } + +} diff --git a/src/main/java/controller/SignUpView.java b/src/main/java/controller/SignUpView.java new file mode 100644 index 000000000..d54018a08 --- /dev/null +++ b/src/main/java/controller/SignUpView.java @@ -0,0 +1,94 @@ +package controller; + +import javax.swing.*; +import java.awt.*; + +/** + * Constants used in this program. + */ +public class SignUpView extends JFrame { + private JLabel nameLabel = new JLabel("group project", JLabel.CENTER); + private SpringLayout springLayout = new SpringLayout(); + private JPanel centerPanel = new JPanel(springLayout); + private JLabel userNameLabel = new JLabel("username"); + private JTextField userText = new JTextField(); + private JLabel passwordLabel = new JLabel("password"); + private JPasswordField passwordText = new JPasswordField(); + private JButton loginBotton = new JButton("log in"); + private JButton registerButton = new JButton("sign up"); + private JLabel againLabel = new JLabel("again"); + private JTextField againText = new JTextField(); + + public SignUpView() { + super("sign up"); + final Container contentPane = getContentPane(); + // set size + final Font nameFont = new Font("12", Font.PLAIN, 40); + nameLabel.setFont(nameFont); + final Font centerFont = new Font("8", Font.PLAIN, 20); + userNameLabel.setFont(centerFont); + passwordLabel.setFont(centerFont); + againLabel.setFont(centerFont); + registerButton.setFont(centerFont); + loginBotton.setFont(centerFont); + userText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); + passwordText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); + againText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); + + // add components + centerPanel.add(userNameLabel); + centerPanel.add(userText); + centerPanel.add(passwordLabel); + centerPanel.add(passwordText); + centerPanel.add(loginBotton); + centerPanel.add(registerButton); + centerPanel.add(againLabel); + centerPanel.add(againText); + + contentPane.add(nameLabel, BorderLayout.NORTH); + contentPane.add(centerPanel, BorderLayout.CENTER); + + // springlayout + final Spring titleLabelWidth = Spring.width(userNameLabel); + final Spring titleTextWidth = Spring.width(userText); + final Spring spaceWidth = Spring.constant(20); + final Spring childWidth = Spring.sum(Spring.sum(titleLabelWidth, titleTextWidth), spaceWidth); + final int offsetX = childWidth.getValue() / 2; + // set userNameLabel location + springLayout.putConstraint(SpringLayout.WEST, userNameLabel, -offsetX, SpringLayout.HEIGHT, centerPanel); + springLayout.putConstraint(SpringLayout.NORTH, userNameLabel, Constants.TWENTY, SpringLayout.NORTH, centerPanel); + // set userText location + springLayout.putConstraint(SpringLayout.WEST, userText, Constants.TEN, SpringLayout.EAST, userNameLabel); + springLayout.putConstraint(SpringLayout.NORTH, userText, 0, SpringLayout.NORTH, userNameLabel); + // set passwordLabel location + springLayout.putConstraint(SpringLayout.EAST, passwordLabel, 0, SpringLayout.EAST, userNameLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, Constants.TEN, SpringLayout.SOUTH, userNameLabel); + // set passwordText location + springLayout.putConstraint(SpringLayout.WEST, passwordText, Constants.TEN, SpringLayout.EAST, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordText, 0, SpringLayout.NORTH, passwordLabel); + // set loginButton location + springLayout.putConstraint(SpringLayout.WEST, loginBotton, Constants.FIFTY, SpringLayout.WEST, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, loginBotton, Constants.EIGHTY, SpringLayout.SOUTH, passwordLabel); + // set registerButton location + springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginBotton); + springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginBotton); + // set againLabel location + springLayout.putConstraint(SpringLayout.EAST, againLabel, 0, SpringLayout.EAST, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, againLabel, Constants.TEN, SpringLayout.SOUTH, passwordLabel); + // set againText location + springLayout.putConstraint(SpringLayout.WEST, againText, Constants.TEN, SpringLayout.EAST, againLabel); + springLayout.putConstraint(SpringLayout.NORTH, againText, 0, SpringLayout.NORTH, againLabel); + + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + // setLocation(null); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + + } + + public static void main(String[] args) { + new SignUpView(); + } + +} From 2ab5f2f8ef07c588f7f327cf9b0a1c50c59e35a1 Mon Sep 17 00:00:00 2001 From: yitong an Date: Thu, 21 Nov 2024 19:17:20 -0500 Subject: [PATCH 013/154] implement main menu and add a constant file --- src/main/java/controller/Constants.java | 1 - src/main/java/controller/EventView.java | 4 ++ src/main/java/controller/GameOverView.java | 4 ++ src/main/java/controller/GameView.java | 4 ++ src/main/java/controller/MainView.java | 69 ++++++++++++++++++++++ src/main/java/controller/RankingView.java | 4 ++ 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/main/java/controller/EventView.java create mode 100644 src/main/java/controller/GameOverView.java create mode 100644 src/main/java/controller/GameView.java create mode 100644 src/main/java/controller/MainView.java create mode 100644 src/main/java/controller/RankingView.java diff --git a/src/main/java/controller/Constants.java b/src/main/java/controller/Constants.java index 291436570..a899ac542 100644 --- a/src/main/java/controller/Constants.java +++ b/src/main/java/controller/Constants.java @@ -15,5 +15,4 @@ public class Constants { public static final int FOUR_HUNDRED = 400; public static final int EIGHTY = 80; - } diff --git a/src/main/java/controller/EventView.java b/src/main/java/controller/EventView.java new file mode 100644 index 000000000..0db1114a9 --- /dev/null +++ b/src/main/java/controller/EventView.java @@ -0,0 +1,4 @@ +package controller; + +public class EventView { +} diff --git a/src/main/java/controller/GameOverView.java b/src/main/java/controller/GameOverView.java new file mode 100644 index 000000000..93d255ad2 --- /dev/null +++ b/src/main/java/controller/GameOverView.java @@ -0,0 +1,4 @@ +package controller; + +public class GameOverView { +} diff --git a/src/main/java/controller/GameView.java b/src/main/java/controller/GameView.java new file mode 100644 index 000000000..209e82ecf --- /dev/null +++ b/src/main/java/controller/GameView.java @@ -0,0 +1,4 @@ +package controller; + +public class GameView { +} diff --git a/src/main/java/controller/MainView.java b/src/main/java/controller/MainView.java new file mode 100644 index 000000000..7933d0eed --- /dev/null +++ b/src/main/java/controller/MainView.java @@ -0,0 +1,69 @@ +package controller; + +import javax.swing.*; +import java.awt.*; + +public class MainView extends JFrame { + private JButton startGame = new JButton("Start Game"); + private SpringLayout springLayout = new SpringLayout(); + private JButton skill = new JButton("Skill"); + private JButton info = new JButton("Information"); + private JButton rank = new JButton("Ranking"); + private JButton quit = new JButton("Quit"); + private JPanel mainPanel = new JPanel(springLayout); + private JLabel titleLabel = new JLabel("Group project", JLabel.CENTER); + + public MainView() { + super("Main Menu"); + final Container contentPane = getContentPane(); + titleLabel.setFont(new Font("Serif", Font.PLAIN, Constants.THIRTY)); + contentPane.add(titleLabel, BorderLayout.NORTH); + final Font centerFont = new Font("8", Font.PLAIN, 20); + startGame.setFont(centerFont); + skill.setFont(centerFont); + info.setFont(centerFont); + rank.setFont(centerFont); + quit.setFont(centerFont); + mainPanel.add(startGame); + mainPanel.add(skill); + mainPanel.add(info); + mainPanel.add(rank); + mainPanel.add(quit); + contentPane.add(mainPanel, BorderLayout.CENTER); + + springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, + SpringLayout.HORIZONTAL_CENTER, mainPanel); + springLayout.putConstraint(SpringLayout.NORTH, titleLabel, 0, SpringLayout.NORTH, mainPanel); + + springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, startGame, 0, + SpringLayout.HORIZONTAL_CENTER, mainPanel); + springLayout.putConstraint(SpringLayout.NORTH, startGame, Constants.TWENTY, SpringLayout.SOUTH, titleLabel); + + springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, skill, 0, + SpringLayout.HORIZONTAL_CENTER, mainPanel); + springLayout.putConstraint(SpringLayout.NORTH, skill, Constants.TWENTY, SpringLayout.SOUTH, startGame); + + springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, info, 0, + SpringLayout.HORIZONTAL_CENTER, mainPanel); + springLayout.putConstraint(SpringLayout.NORTH, info, Constants.TWENTY, SpringLayout.SOUTH, skill); + + springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, rank, 0, + SpringLayout.HORIZONTAL_CENTER, mainPanel); + springLayout.putConstraint(SpringLayout.NORTH, rank, Constants.TWENTY, SpringLayout.SOUTH, info); + + springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, quit, 0, + SpringLayout.HORIZONTAL_CENTER, mainPanel); + springLayout.putConstraint(SpringLayout.NORTH, quit, Constants.TWENTY, SpringLayout.SOUTH, rank); + + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + + } + + public static void main(String[] args) { + new MainView(); + } + +} diff --git a/src/main/java/controller/RankingView.java b/src/main/java/controller/RankingView.java new file mode 100644 index 000000000..75358382e --- /dev/null +++ b/src/main/java/controller/RankingView.java @@ -0,0 +1,4 @@ +package controller; + +public class RankingView { +} From ca834ecd53a5045159d6f76f3de3fe8f24887462 Mon Sep 17 00:00:00 2001 From: yitong an Date: Thu, 21 Nov 2024 20:04:53 -0500 Subject: [PATCH 014/154] implement game view, gameover view, rank view --- src/main/java/controller/Constants.java | 4 + src/main/java/controller/EventView.java | 4 - src/main/java/controller/GameOverView.java | 53 +++++++++++- src/main/java/controller/GameView.java | 94 +++++++++++++++++++++- src/main/java/controller/RankingView.java | 64 ++++++++++++++- 5 files changed, 210 insertions(+), 9 deletions(-) delete mode 100644 src/main/java/controller/EventView.java diff --git a/src/main/java/controller/Constants.java b/src/main/java/controller/Constants.java index a899ac542..8c97ffee2 100644 --- a/src/main/java/controller/Constants.java +++ b/src/main/java/controller/Constants.java @@ -14,5 +14,9 @@ public class Constants { public static final int SIX_HUNDRED = 600; public static final int FOUR_HUNDRED = 400; public static final int EIGHTY = 80; + public static final int EIGHT_HUNDRED = 800; + public static final int ONE_HUNDRED = 100; + public static final int THREE = 3; + public static final int ONE_THOUSAND = 1000; } diff --git a/src/main/java/controller/EventView.java b/src/main/java/controller/EventView.java deleted file mode 100644 index 0db1114a9..000000000 --- a/src/main/java/controller/EventView.java +++ /dev/null @@ -1,4 +0,0 @@ -package controller; - -public class EventView { -} diff --git a/src/main/java/controller/GameOverView.java b/src/main/java/controller/GameOverView.java index 93d255ad2..5674c91b7 100644 --- a/src/main/java/controller/GameOverView.java +++ b/src/main/java/controller/GameOverView.java @@ -1,4 +1,53 @@ package controller; -public class GameOverView { -} +import javax.swing.*; +import java.awt.*; + +public class GameOverView extends JFrame { + public GameOverView() { + super("Game Over"); + + final Container container = getContentPane(); + final SpringLayout layout = new SpringLayout(); + container.setLayout(layout); + + final JLabel titleLabel = new JLabel("Game Over"); + titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.THIRTY)); + container.add(titleLabel); + + final JLabel scoreLabel = new JLabel("Score: 0"); + scoreLabel.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); + container.add(scoreLabel); + + final JButton rankingButton = new JButton("Ranking"); + rankingButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + container.add(rankingButton); + + final JButton startNewGameButton = new JButton("Start New Game"); + startNewGameButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + container.add(startNewGameButton); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, titleLabel, Constants.TWENTY, SpringLayout.NORTH, container); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, scoreLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, scoreLabel, Constants.FORTY, SpringLayout.SOUTH, titleLabel); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, rankingButton, 0, + SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, rankingButton, Constants.FIFTY, SpringLayout.SOUTH, scoreLabel); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, startNewGameButton, 0, + SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, startNewGameButton, Constants.THIRTY, SpringLayout.SOUTH, rankingButton); + + setSize(Constants.SIX_HUNDRED, Constants.SIX_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + } + + public static void main(String[] args) { + new GameOverView(); + } +} \ No newline at end of file diff --git a/src/main/java/controller/GameView.java b/src/main/java/controller/GameView.java index 209e82ecf..f78c75c69 100644 --- a/src/main/java/controller/GameView.java +++ b/src/main/java/controller/GameView.java @@ -1,4 +1,96 @@ package controller; -public class GameView { +import javax.swing.*; +import java.awt.*; + +public class GameView extends JFrame{ + public GameView() { + super("Game"); + + final Container container = getContentPane(); + final SpringLayout layout = new SpringLayout(); + container.setLayout(layout); + + final JLabel titleLabel = new JLabel("Game"); + titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.THIRTY)); + container.add(titleLabel); + + // get from output + final JLabel dayLabel = new JLabel("Day: 1"); + final JLabel foodLabel = new JLabel("Food: 50"); + final JLabel waterLabel = new JLabel("Water: 30"); + container.add(dayLabel); + container.add(foodLabel); + container.add(waterLabel); + + final JLabel infoLabel = new JLabel("Information:"); + // information + final JTextArea infoArea = new JTextArea("System-generated information will appear here."); + + infoArea.setEditable(false); + infoArea.setBackground(Color.LIGHT_GRAY); + infoArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + container.add(infoLabel); + container.add(infoArea); + + final JButton action1 = new JButton("Action 1"); + final JButton action2 = new JButton("Action 2"); + final JButton action3 = new JButton("Action 3"); + final JButton action4 = new JButton("Action 4"); + container.add(action1); + container.add(action2); + container.add(action3); + container.add(action4); + + final JPanel mapPanel = new JPanel(); + mapPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + mapPanel.setPreferredSize(new Dimension(Constants.ONE_HUNDRED, Constants.ONE_HUNDRED)); + container.add(mapPanel); + final JLabel mapLabel = new JLabel("Small Map"); + mapPanel.add(mapLabel); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, titleLabel, Constants.TWENTY, SpringLayout.NORTH, container); + + layout.putConstraint(SpringLayout.WEST, dayLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, dayLabel, Constants.TWENTY, SpringLayout.SOUTH, titleLabel); + + layout.putConstraint(SpringLayout.WEST, foodLabel, Constants.TWENTY, SpringLayout.EAST, dayLabel); + layout.putConstraint(SpringLayout.NORTH, foodLabel, 0, SpringLayout.NORTH, dayLabel); + + layout.putConstraint(SpringLayout.WEST, waterLabel, Constants.TWENTY, SpringLayout.EAST, foodLabel); + layout.putConstraint(SpringLayout.NORTH, waterLabel, 0, SpringLayout.NORTH, dayLabel); + + layout.putConstraint(SpringLayout.WEST, infoLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, infoLabel, Constants.TWENTY, SpringLayout.SOUTH, dayLabel); + + layout.putConstraint(SpringLayout.WEST, infoArea, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.EAST, infoArea, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, infoArea, Constants.TEN, SpringLayout.SOUTH, infoLabel); + layout.putConstraint(SpringLayout.SOUTH, infoArea, -Constants.TWO_HUNDRED, SpringLayout.SOUTH, container); + + layout.putConstraint(SpringLayout.WEST, mapPanel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, mapPanel, Constants.TWENTY, SpringLayout.SOUTH, infoArea); + + layout.putConstraint(SpringLayout.WEST, action1, Constants.TWENTY, SpringLayout.EAST, mapPanel); + layout.putConstraint(SpringLayout.NORTH, action1, Constants.TWENTY, SpringLayout.SOUTH, infoArea); + + layout.putConstraint(SpringLayout.WEST, action2, 0, SpringLayout.WEST, action1); + layout.putConstraint(SpringLayout.NORTH, action2, Constants.TWENTY, SpringLayout.SOUTH, action1); + + layout.putConstraint(SpringLayout.WEST, action3, 0, SpringLayout.WEST, action1); + layout.putConstraint(SpringLayout.NORTH, action3, Constants.TWENTY, SpringLayout.SOUTH, action2); + + layout.putConstraint(SpringLayout.WEST, action4, 0, SpringLayout.WEST, action1); + layout.putConstraint(SpringLayout.NORTH, action4, Constants.TWENTY, SpringLayout.SOUTH, action3); + + // 窗口设置 + setSize(Constants.SIX_HUNDRED, Constants.EIGHT_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + } + public static void main(String[] args) { + new GameView(); + } } diff --git a/src/main/java/controller/RankingView.java b/src/main/java/controller/RankingView.java index 75358382e..b98ca9ba4 100644 --- a/src/main/java/controller/RankingView.java +++ b/src/main/java/controller/RankingView.java @@ -1,4 +1,64 @@ package controller; -public class RankingView { -} +import javax.swing.*; +import javax.swing.table.DefaultTableModel; +import java.awt.*; + +public class RankingView extends JFrame { + public RankingView() { + super("Ranking"); + final Container container = getContentPane(); + container.setLayout(new BorderLayout()); + + final JLabel titleLabel = new JLabel("Ranking", JLabel.CENTER); + titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.THIRTY)); + container.add(titleLabel, BorderLayout.NORTH); + + // jtable example + final String[] columnNames = {"Rank", "Player", "Score"}; + final Object[][] data = new Object[Constants.ONE_HUNDRED][Constants.THREE]; + for (int i = 0; i < Constants.ONE_HUNDRED; i++) { + // Rank + data[i][0] = "No." + (i + 1); + // Player name (example) + data[i][1] = "Player" + (i + 1); + // Random score + data[i][2] = (int) (Math.random() * Constants.ONE_THOUSAND); + } + + final JTable rankingTable = new JTable(new DefaultTableModel(data, columnNames)); + rankingTable.setEnabled(false); + final JScrollPane scrollPane = new JScrollPane(rankingTable); + container.add(scrollPane, BorderLayout.CENTER); + + final JPanel bottomPanel = new JPanel(); + bottomPanel.setLayout(new GridLayout(3, 1)); + + // example rank + final JLabel yourRankLabel = new JLabel("Your Rank: No. 10", JLabel.CENTER); + yourRankLabel.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); + bottomPanel.add(yourRankLabel); + + final JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER, Constants.TWENTY, Constants.TEN)); + + final JButton mainButton = new JButton("Main"); + final JButton quitButton = new JButton("Quit"); + buttonPanel.add(mainButton); + buttonPanel.add(quitButton); + + bottomPanel.add(buttonPanel); + + container.add(bottomPanel, BorderLayout.SOUTH); + + // 窗口设置 + setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + } + + public static void main(String[] args) { + new RankingView(); + } +} \ No newline at end of file From b006030eed74cb94ccc1eab7943c75f7781d14eb Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 23 Nov 2024 20:41:59 -0500 Subject: [PATCH 015/154] change file name into view --- src/main/java/presenter/Login.java | 63 +++++++++++++++++++ src/main/java/presenter/MainMenu.java | 10 +++ src/main/java/presenter/SignUp.java | 11 ++++ .../java/{controller => view}/Constants.java | 2 +- .../{controller => view}/GameOverView.java | 2 +- .../java/{controller => view}/GameView.java | 2 +- .../java/{controller => view}/LoginView.java | 45 +++++++++---- .../java/{controller => view}/MainView.java | 2 +- .../{controller => view}/RankingView.java | 2 +- .../java/{controller => view}/SignUpView.java | 2 +- 10 files changed, 122 insertions(+), 19 deletions(-) create mode 100644 src/main/java/presenter/Login.java create mode 100644 src/main/java/presenter/MainMenu.java create mode 100644 src/main/java/presenter/SignUp.java rename src/main/java/{controller => view}/Constants.java (97%) rename src/main/java/{controller => view}/GameOverView.java (99%) rename src/main/java/{controller => view}/GameView.java (99%) rename src/main/java/{controller => view}/LoginView.java (82%) rename src/main/java/{controller => view}/MainView.java (99%) rename src/main/java/{controller => view}/RankingView.java (99%) rename src/main/java/{controller => view}/SignUpView.java (99%) diff --git a/src/main/java/presenter/Login.java b/src/main/java/presenter/Login.java new file mode 100644 index 000000000..f0fd53fc0 --- /dev/null +++ b/src/main/java/presenter/Login.java @@ -0,0 +1,63 @@ +package presenter; + +import view.LoginView; +import view.MainView; +import view.SignUpView; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class Login implements ActionListener { + private LoginView loginView; + private MainView mainView = new MainView(); + private SignUpView signUpView = new SignUpView(); + + public Login(LoginView loginView) { + this.loginView = new LoginView(); + final JButton loginButton = LoginView.getLoginButton(); + final JButton registerButton = LoginView.getRegisterButton(); + loginButton.addActionListener(this); + registerButton.addActionListener(this); + mainView.dispose(); + signUpView.dispose(); + loginView.dispose(); + } + + @Override + public void actionPerformed(ActionEvent e) { + + final JButton source = (JButton) e.getSource(); + + if (source.getText().equals("log in")) { + final String username = loginView.getUser(); + final String password = new String(loginView.getPwd()); + // check username and password + if (isValidUser(username, password)) { + + JOptionPane.showMessageDialog(loginView, "Login successful! Welcome to the Main Menu."); + loginView.dispose(); + new MainMenu(mainView); + } + else { + // If doesn't match + JOptionPane.showMessageDialog(loginView, "Invalid username or password. Please try again."); + } + + } + else if (source.getText().equals("sign up")) { + new SignUp(signUpView); + } + } + + private boolean isValidUser(String username, String password) { + // example + return "admin".equals(username) && "password123".equals(password); + } + + public static void main(String[] args) { + final LoginView loginView = new LoginView(); + new Login(loginView); + } +} + diff --git a/src/main/java/presenter/MainMenu.java b/src/main/java/presenter/MainMenu.java new file mode 100644 index 000000000..a391fceec --- /dev/null +++ b/src/main/java/presenter/MainMenu.java @@ -0,0 +1,10 @@ +package presenter; + +import view.MainView; + +public class MainMenu { + private MainView mainView; + public MainMenu(MainView mainView){ + this.mainView = mainView; + } +} diff --git a/src/main/java/presenter/SignUp.java b/src/main/java/presenter/SignUp.java new file mode 100644 index 000000000..140fdcf05 --- /dev/null +++ b/src/main/java/presenter/SignUp.java @@ -0,0 +1,11 @@ +package presenter; + +import view.SignUpView; + +public class SignUp { + private SignUpView signUpView; + + public SignUp(SignUpView signUpView) { + this.signUpView = signUpView; + } +} diff --git a/src/main/java/controller/Constants.java b/src/main/java/view/Constants.java similarity index 97% rename from src/main/java/controller/Constants.java rename to src/main/java/view/Constants.java index 8c97ffee2..4e65763dd 100644 --- a/src/main/java/controller/Constants.java +++ b/src/main/java/view/Constants.java @@ -1,4 +1,4 @@ -package controller; +package view; /** * Constants used in this program. diff --git a/src/main/java/controller/GameOverView.java b/src/main/java/view/GameOverView.java similarity index 99% rename from src/main/java/controller/GameOverView.java rename to src/main/java/view/GameOverView.java index 5674c91b7..0785f7c47 100644 --- a/src/main/java/controller/GameOverView.java +++ b/src/main/java/view/GameOverView.java @@ -1,4 +1,4 @@ -package controller; +package view; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/controller/GameView.java b/src/main/java/view/GameView.java similarity index 99% rename from src/main/java/controller/GameView.java rename to src/main/java/view/GameView.java index f78c75c69..917e57e57 100644 --- a/src/main/java/controller/GameView.java +++ b/src/main/java/view/GameView.java @@ -1,4 +1,4 @@ -package controller; +package view; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/controller/LoginView.java b/src/main/java/view/LoginView.java similarity index 82% rename from src/main/java/controller/LoginView.java rename to src/main/java/view/LoginView.java index 0865aa6e1..317254f2e 100644 --- a/src/main/java/controller/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -1,4 +1,4 @@ -package controller; +package view; import javax.swing.*; import java.awt.*; @@ -13,11 +13,11 @@ public class LoginView extends JFrame { private SpringLayout springLayout = new SpringLayout(); private JPanel centerPanel = new JPanel(springLayout); private JLabel userNameLabel = new JLabel("username"); - private JTextField userText = new JTextField(); + private static JTextField userText = new JTextField(); private JLabel passwordLabel = new JLabel("password"); - private JPasswordField passwordText = new JPasswordField(); - private JButton loginBotton = new JButton("log in"); - private JButton registerButton = new JButton("sign up"); + private static JPasswordField passwordText = new JPasswordField(); + private static JButton loginBotton = new JButton("log in"); + private static JButton registerButton = new JButton("sign up"); public LoginView() { super("Log in"); @@ -50,6 +50,17 @@ public LoginView() { final Spring spaceWidth = Spring.constant(20); final Spring childWidth = Spring.sum(Spring.sum(titleLabelWidth, titleTextWidth), spaceWidth); final int offsetX = childWidth.getValue() / 2; + layout(offsetX); + + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + // setLocation(null); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + + } + + private void layout(int offsetX) { springLayout.putConstraint(SpringLayout.WEST, userNameLabel, -offsetX, SpringLayout.HEIGHT, centerPanel); springLayout.putConstraint(SpringLayout.NORTH, userNameLabel, Constants.TWENTY, SpringLayout.NORTH, centerPanel); @@ -69,17 +80,25 @@ public LoginView() { // set registerButton springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginBotton); springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginBotton); + } - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); - // setLocation(null); - setDefaultCloseOperation(EXIT_ON_CLOSE); - setResizable(false); - setVisible(true); + // public static void main(String[] args) { + // new LoginView(); + // } + + public static String getUser() { + return userText.getText(); + } + public static String getPwd() { + return passwordText.getText(); } - public static void main(String[] args) { - new LoginView(); + public static JButton getLoginButton() { + return loginBotton; } -} + public static JButton getRegisterButton() { + return registerButton; + } +} \ No newline at end of file diff --git a/src/main/java/controller/MainView.java b/src/main/java/view/MainView.java similarity index 99% rename from src/main/java/controller/MainView.java rename to src/main/java/view/MainView.java index 7933d0eed..f105669b9 100644 --- a/src/main/java/controller/MainView.java +++ b/src/main/java/view/MainView.java @@ -1,4 +1,4 @@ -package controller; +package view; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/controller/RankingView.java b/src/main/java/view/RankingView.java similarity index 99% rename from src/main/java/controller/RankingView.java rename to src/main/java/view/RankingView.java index b98ca9ba4..618b456b9 100644 --- a/src/main/java/controller/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -1,4 +1,4 @@ -package controller; +package view; import javax.swing.*; import javax.swing.table.DefaultTableModel; diff --git a/src/main/java/controller/SignUpView.java b/src/main/java/view/SignUpView.java similarity index 99% rename from src/main/java/controller/SignUpView.java rename to src/main/java/view/SignUpView.java index d54018a08..e37f9ec42 100644 --- a/src/main/java/controller/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -1,4 +1,4 @@ -package controller; +package view; import javax.swing.*; import java.awt.*; From 33b581802c891bc521fcdce6ec8c361d0af636e0 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sat, 23 Nov 2024 20:56:31 -0500 Subject: [PATCH 016/154] Updated the structure of the program --- .../java/{entity => entities}/Entityconstants.java | 4 +--- src/main/java/{entity => entities}/Event.java | 2 +- src/main/java/{entity => entities}/EventAmbush.java | 2 +- .../java/{entity => entities}/EventBlizzard.java | 2 +- .../{entity => entities}/EventSurvivorJoins.java | 2 +- src/main/java/{entity => entities}/Horde.java | 2 +- src/main/java/{entity => entities}/Inventory.java | 2 +- src/main/java/{entity => entities}/Location.java | 2 +- src/main/java/{entity => entities}/LocationCity.java | 2 +- .../java/{entity => entities}/LocationDesert.java | 2 +- .../java/{entity => entities}/LocationForest.java | 2 +- .../java/{entity => entities}/LocationIceland.java | 2 +- .../java/{entity => entities}/LocationPlain.java | 2 +- src/main/java/{entity => entities}/Main.java | 2 +- src/main/java/{entity => entities}/MapFactory.java | 2 +- src/main/java/{entity => entities}/Maps.java | 3 +-- .../java/{entity => entities}/PlayerAttributes.java | 2 +- src/main/java/{entity => entities}/PlayerInfo.java | 2 +- .../java/{entity => entities}/PlayerLocation.java | 2 +- src/main/java/{ => frameworks}/view/Constants.java | 2 +- .../java/{ => frameworks}/view/GameOverView.java | 2 +- src/main/java/{ => frameworks}/view/GameView.java | 2 +- src/main/java/{ => frameworks}/view/LoginView.java | 2 +- src/main/java/{ => frameworks}/view/MainView.java | 2 +- src/main/java/{ => frameworks}/view/RankingView.java | 2 +- src/main/java/{ => frameworks}/view/SignUpView.java | 2 +- .../presenters}/Login.java | 8 ++++---- .../presenters}/MainMenu.java | 4 ++-- .../presenters}/SignUp.java | 4 ++-- src/main/java/{use_case => usecases}/c.java | 2 +- .../gather/GatherDataAccessInterface.java | 6 +++--- .../gather/GatherInputBoundary.java | 2 +- .../gather/GatherInputData.java | 2 +- .../gather/GatherInteractor.java | 2 +- .../gather/GatherOutputBoundary.java | 2 +- .../gather/GatherOutputData.java | 2 +- .../move/MoveDataAccessInterface.java | 8 ++++---- .../move/MoveInputBoundary.java | 2 +- .../{use_case => usecases}/move/MoveInputData.java | 2 +- .../{use_case => usecases}/move/MoveInteractor.java | 6 +++--- .../move/MoveOutputBoundary.java | 2 +- .../{use_case => usecases}/move/MoveOutputData.java | 2 +- .../respond/RespondDataAccessInterface.java | 10 +++++----- .../respond/RespondInputBoundary.java | 2 +- .../respond/RespondInputData.java | 2 +- .../respond/RespondInteractor.java | 12 ++++++------ .../respond/RespondOutputBoundary.java | 2 +- .../respond/RespondOutputData.java | 2 +- .../{use_case => usecases}/NoteInteractorTest.java | 2 +- 49 files changed, 70 insertions(+), 73 deletions(-) rename src/main/java/{entity => entities}/Entityconstants.java (98%) rename src/main/java/{entity => entities}/Event.java (98%) rename src/main/java/{entity => entities}/EventAmbush.java (99%) rename src/main/java/{entity => entities}/EventBlizzard.java (99%) rename src/main/java/{entity => entities}/EventSurvivorJoins.java (99%) rename src/main/java/{entity => entities}/Horde.java (97%) rename src/main/java/{entity => entities}/Inventory.java (99%) rename src/main/java/{entity => entities}/Location.java (99%) rename src/main/java/{entity => entities}/LocationCity.java (99%) rename src/main/java/{entity => entities}/LocationDesert.java (99%) rename src/main/java/{entity => entities}/LocationForest.java (99%) rename src/main/java/{entity => entities}/LocationIceland.java (99%) rename src/main/java/{entity => entities}/LocationPlain.java (99%) rename src/main/java/{entity => entities}/Main.java (96%) rename src/main/java/{entity => entities}/MapFactory.java (99%) rename src/main/java/{entity => entities}/Maps.java (92%) rename src/main/java/{entity => entities}/PlayerAttributes.java (99%) rename src/main/java/{entity => entities}/PlayerInfo.java (98%) rename src/main/java/{entity => entities}/PlayerLocation.java (97%) rename src/main/java/{ => frameworks}/view/Constants.java (96%) rename src/main/java/{ => frameworks}/view/GameOverView.java (98%) rename src/main/java/{ => frameworks}/view/GameView.java (99%) rename src/main/java/{ => frameworks}/view/LoginView.java (99%) rename src/main/java/{ => frameworks}/view/MainView.java (99%) rename src/main/java/{ => frameworks}/view/RankingView.java (98%) rename src/main/java/{ => frameworks}/view/SignUpView.java (99%) rename src/main/java/{presenter => interface_adapters/presenters}/Login.java (92%) rename src/main/java/{presenter => interface_adapters/presenters}/MainMenu.java (65%) rename src/main/java/{presenter => interface_adapters/presenters}/SignUp.java (66%) rename src/main/java/{use_case => usecases}/c.java (52%) rename src/main/java/{use_case => usecases}/gather/GatherDataAccessInterface.java (94%) rename src/main/java/{use_case => usecases}/gather/GatherInputBoundary.java (93%) rename src/main/java/{use_case => usecases}/gather/GatherInputData.java (93%) rename src/main/java/{use_case => usecases}/gather/GatherInteractor.java (99%) rename src/main/java/{use_case => usecases}/gather/GatherOutputBoundary.java (96%) rename src/main/java/{use_case => usecases}/gather/GatherOutputData.java (96%) rename src/main/java/{use_case => usecases}/move/MoveDataAccessInterface.java (88%) rename src/main/java/{use_case => usecases}/move/MoveInputBoundary.java (92%) rename src/main/java/{use_case => usecases}/move/MoveInputData.java (92%) rename src/main/java/{use_case => usecases}/move/MoveInteractor.java (97%) rename src/main/java/{use_case => usecases}/move/MoveOutputBoundary.java (95%) rename src/main/java/{use_case => usecases}/move/MoveOutputData.java (96%) rename src/main/java/{use_case => usecases}/respond/RespondDataAccessInterface.java (94%) rename src/main/java/{use_case => usecases}/respond/RespondInputBoundary.java (90%) rename src/main/java/{use_case => usecases}/respond/RespondInputData.java (91%) rename src/main/java/{use_case => usecases}/respond/RespondInteractor.java (96%) rename src/main/java/{use_case => usecases}/respond/RespondOutputBoundary.java (96%) rename src/main/java/{use_case => usecases}/respond/RespondOutputData.java (97%) rename src/test/java/{use_case => usecases}/NoteInteractorTest.java (98%) diff --git a/src/main/java/entity/Entityconstants.java b/src/main/java/entities/Entityconstants.java similarity index 98% rename from src/main/java/entity/Entityconstants.java rename to src/main/java/entities/Entityconstants.java index 9b5e12f66..8281b9fcb 100644 --- a/src/main/java/entity/Entityconstants.java +++ b/src/main/java/entities/Entityconstants.java @@ -1,6 +1,4 @@ -package entity; - -import java.util.ArrayList; +package entities; /** * Constants used in this program. diff --git a/src/main/java/entity/Event.java b/src/main/java/entities/Event.java similarity index 98% rename from src/main/java/entity/Event.java rename to src/main/java/entities/Event.java index 888cb7b9c..ce444a410 100644 --- a/src/main/java/entity/Event.java +++ b/src/main/java/entities/Event.java @@ -1,4 +1,4 @@ -package entity; +package entities; import java.util.Map; diff --git a/src/main/java/entity/EventAmbush.java b/src/main/java/entities/EventAmbush.java similarity index 99% rename from src/main/java/entity/EventAmbush.java rename to src/main/java/entities/EventAmbush.java index 67d99c202..734a4e3b0 100644 --- a/src/main/java/entity/EventAmbush.java +++ b/src/main/java/entities/EventAmbush.java @@ -1,4 +1,4 @@ -package entity; +package entities; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/entity/EventBlizzard.java b/src/main/java/entities/EventBlizzard.java similarity index 99% rename from src/main/java/entity/EventBlizzard.java rename to src/main/java/entities/EventBlizzard.java index 88e0e1c9c..649b4f12b 100644 --- a/src/main/java/entity/EventBlizzard.java +++ b/src/main/java/entities/EventBlizzard.java @@ -1,4 +1,4 @@ -package entity; +package entities; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/entity/EventSurvivorJoins.java b/src/main/java/entities/EventSurvivorJoins.java similarity index 99% rename from src/main/java/entity/EventSurvivorJoins.java rename to src/main/java/entities/EventSurvivorJoins.java index 4aab1f3ec..6487d7096 100644 --- a/src/main/java/entity/EventSurvivorJoins.java +++ b/src/main/java/entities/EventSurvivorJoins.java @@ -1,4 +1,4 @@ -package entity; +package entities; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/entity/Horde.java b/src/main/java/entities/Horde.java similarity index 97% rename from src/main/java/entity/Horde.java rename to src/main/java/entities/Horde.java index 3cb7c0d0e..15b5808b3 100644 --- a/src/main/java/entity/Horde.java +++ b/src/main/java/entities/Horde.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * The class represent the horde by it's magnitude and duration. specific calculation involves other class info are for diff --git a/src/main/java/entity/Inventory.java b/src/main/java/entities/Inventory.java similarity index 99% rename from src/main/java/entity/Inventory.java rename to src/main/java/entities/Inventory.java index 2cad91d47..0528fe6a5 100644 --- a/src/main/java/entity/Inventory.java +++ b/src/main/java/entities/Inventory.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * Class reponsible for representing inventory and inventory only, provide initial resources, getter and change method. diff --git a/src/main/java/entity/Location.java b/src/main/java/entities/Location.java similarity index 99% rename from src/main/java/entity/Location.java rename to src/main/java/entities/Location.java index 447c81143..b511790ad 100644 --- a/src/main/java/entity/Location.java +++ b/src/main/java/entities/Location.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * Interface for location (each specific xy coordinate), any environment should implement these. diff --git a/src/main/java/entity/LocationCity.java b/src/main/java/entities/LocationCity.java similarity index 99% rename from src/main/java/entity/LocationCity.java rename to src/main/java/entities/LocationCity.java index 7333572bb..8d4cc4b44 100644 --- a/src/main/java/entity/LocationCity.java +++ b/src/main/java/entities/LocationCity.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * This is city subtype of location. diff --git a/src/main/java/entity/LocationDesert.java b/src/main/java/entities/LocationDesert.java similarity index 99% rename from src/main/java/entity/LocationDesert.java rename to src/main/java/entities/LocationDesert.java index 00149bfba..fe0f0aef2 100644 --- a/src/main/java/entity/LocationDesert.java +++ b/src/main/java/entities/LocationDesert.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * This is location form of Desert. diff --git a/src/main/java/entity/LocationForest.java b/src/main/java/entities/LocationForest.java similarity index 99% rename from src/main/java/entity/LocationForest.java rename to src/main/java/entities/LocationForest.java index df6904ea0..add4c9ec2 100644 --- a/src/main/java/entity/LocationForest.java +++ b/src/main/java/entities/LocationForest.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * This is woods subtype of location. diff --git a/src/main/java/entity/LocationIceland.java b/src/main/java/entities/LocationIceland.java similarity index 99% rename from src/main/java/entity/LocationIceland.java rename to src/main/java/entities/LocationIceland.java index 6cca282de..60ba2507d 100644 --- a/src/main/java/entity/LocationIceland.java +++ b/src/main/java/entities/LocationIceland.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * This is location form of Iceland. diff --git a/src/main/java/entity/LocationPlain.java b/src/main/java/entities/LocationPlain.java similarity index 99% rename from src/main/java/entity/LocationPlain.java rename to src/main/java/entities/LocationPlain.java index 7926f29ac..73569267f 100644 --- a/src/main/java/entity/LocationPlain.java +++ b/src/main/java/entities/LocationPlain.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * This is location form of plain, more like default, which is not any of special biome (iceland, desert etc). diff --git a/src/main/java/entity/Main.java b/src/main/java/entities/Main.java similarity index 96% rename from src/main/java/entity/Main.java rename to src/main/java/entities/Main.java index 6e44b6f69..b72d1da6a 100644 --- a/src/main/java/entity/Main.java +++ b/src/main/java/entities/Main.java @@ -1,4 +1,4 @@ -package entity; +package entities; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/entity/MapFactory.java b/src/main/java/entities/MapFactory.java similarity index 99% rename from src/main/java/entity/MapFactory.java rename to src/main/java/entities/MapFactory.java index 5cb979b94..bc496db65 100644 --- a/src/main/java/entity/MapFactory.java +++ b/src/main/java/entities/MapFactory.java @@ -1,4 +1,4 @@ -package entity; +package entities; import java.util.*; diff --git a/src/main/java/entity/Maps.java b/src/main/java/entities/Maps.java similarity index 92% rename from src/main/java/entity/Maps.java rename to src/main/java/entities/Maps.java index 16c7b8f57..000413e3f 100644 --- a/src/main/java/entity/Maps.java +++ b/src/main/java/entities/Maps.java @@ -1,7 +1,6 @@ -package entity; +package entities; import java.util.ArrayList; -import java.util.Map; /** * This class represent the map of the game. diff --git a/src/main/java/entity/PlayerAttributes.java b/src/main/java/entities/PlayerAttributes.java similarity index 99% rename from src/main/java/entity/PlayerAttributes.java rename to src/main/java/entities/PlayerAttributes.java index d5e41cae1..959d2dd55 100644 --- a/src/main/java/entity/PlayerAttributes.java +++ b/src/main/java/entities/PlayerAttributes.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * Class responsible for storing attribution information and updates. diff --git a/src/main/java/entity/PlayerInfo.java b/src/main/java/entities/PlayerInfo.java similarity index 98% rename from src/main/java/entity/PlayerInfo.java rename to src/main/java/entities/PlayerInfo.java index b2bfac156..c9216f7fe 100644 --- a/src/main/java/entity/PlayerInfo.java +++ b/src/main/java/entities/PlayerInfo.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * Player class of the program, could be used for scoreboard extension of the program, ranked by score & won. diff --git a/src/main/java/entity/PlayerLocation.java b/src/main/java/entities/PlayerLocation.java similarity index 97% rename from src/main/java/entity/PlayerLocation.java rename to src/main/java/entities/PlayerLocation.java index d983e5bf3..0392469da 100644 --- a/src/main/java/entity/PlayerLocation.java +++ b/src/main/java/entities/PlayerLocation.java @@ -1,4 +1,4 @@ -package entity; +package entities; /** * Class keep track of player location. diff --git a/src/main/java/view/Constants.java b/src/main/java/frameworks/view/Constants.java similarity index 96% rename from src/main/java/view/Constants.java rename to src/main/java/frameworks/view/Constants.java index 4e65763dd..898acd646 100644 --- a/src/main/java/view/Constants.java +++ b/src/main/java/frameworks/view/Constants.java @@ -1,4 +1,4 @@ -package view; +package frameworks.view; /** * Constants used in this program. diff --git a/src/main/java/view/GameOverView.java b/src/main/java/frameworks/view/GameOverView.java similarity index 98% rename from src/main/java/view/GameOverView.java rename to src/main/java/frameworks/view/GameOverView.java index 0785f7c47..f6eaa2bb9 100644 --- a/src/main/java/view/GameOverView.java +++ b/src/main/java/frameworks/view/GameOverView.java @@ -1,4 +1,4 @@ -package view; +package frameworks.view; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/view/GameView.java b/src/main/java/frameworks/view/GameView.java similarity index 99% rename from src/main/java/view/GameView.java rename to src/main/java/frameworks/view/GameView.java index 917e57e57..d47967d29 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/frameworks/view/GameView.java @@ -1,4 +1,4 @@ -package view; +package frameworks.view; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/view/LoginView.java b/src/main/java/frameworks/view/LoginView.java similarity index 99% rename from src/main/java/view/LoginView.java rename to src/main/java/frameworks/view/LoginView.java index 317254f2e..9a405c5c9 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/frameworks/view/LoginView.java @@ -1,4 +1,4 @@ -package view; +package frameworks.view; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/view/MainView.java b/src/main/java/frameworks/view/MainView.java similarity index 99% rename from src/main/java/view/MainView.java rename to src/main/java/frameworks/view/MainView.java index f105669b9..8e1123e57 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/frameworks/view/MainView.java @@ -1,4 +1,4 @@ -package view; +package frameworks.view; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/view/RankingView.java b/src/main/java/frameworks/view/RankingView.java similarity index 98% rename from src/main/java/view/RankingView.java rename to src/main/java/frameworks/view/RankingView.java index 618b456b9..57395fb47 100644 --- a/src/main/java/view/RankingView.java +++ b/src/main/java/frameworks/view/RankingView.java @@ -1,4 +1,4 @@ -package view; +package frameworks.view; import javax.swing.*; import javax.swing.table.DefaultTableModel; diff --git a/src/main/java/view/SignUpView.java b/src/main/java/frameworks/view/SignUpView.java similarity index 99% rename from src/main/java/view/SignUpView.java rename to src/main/java/frameworks/view/SignUpView.java index e37f9ec42..352a0704c 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/frameworks/view/SignUpView.java @@ -1,4 +1,4 @@ -package view; +package frameworks.view; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/presenter/Login.java b/src/main/java/interface_adapters/presenters/Login.java similarity index 92% rename from src/main/java/presenter/Login.java rename to src/main/java/interface_adapters/presenters/Login.java index f0fd53fc0..5538e6d77 100644 --- a/src/main/java/presenter/Login.java +++ b/src/main/java/interface_adapters/presenters/Login.java @@ -1,8 +1,8 @@ -package presenter; +package interface_adapters.presenters; -import view.LoginView; -import view.MainView; -import view.SignUpView; +import frameworks.view.LoginView; +import frameworks.view.MainView; +import frameworks.view.SignUpView; import javax.swing.*; import java.awt.event.ActionEvent; diff --git a/src/main/java/presenter/MainMenu.java b/src/main/java/interface_adapters/presenters/MainMenu.java similarity index 65% rename from src/main/java/presenter/MainMenu.java rename to src/main/java/interface_adapters/presenters/MainMenu.java index a391fceec..9119572a1 100644 --- a/src/main/java/presenter/MainMenu.java +++ b/src/main/java/interface_adapters/presenters/MainMenu.java @@ -1,6 +1,6 @@ -package presenter; +package interface_adapters.presenters; -import view.MainView; +import frameworks.view.MainView; public class MainMenu { private MainView mainView; diff --git a/src/main/java/presenter/SignUp.java b/src/main/java/interface_adapters/presenters/SignUp.java similarity index 66% rename from src/main/java/presenter/SignUp.java rename to src/main/java/interface_adapters/presenters/SignUp.java index 140fdcf05..ddb13afd7 100644 --- a/src/main/java/presenter/SignUp.java +++ b/src/main/java/interface_adapters/presenters/SignUp.java @@ -1,6 +1,6 @@ -package presenter; +package interface_adapters.presenters; -import view.SignUpView; +import frameworks.view.SignUpView; public class SignUp { private SignUpView signUpView; diff --git a/src/main/java/use_case/c.java b/src/main/java/usecases/c.java similarity index 52% rename from src/main/java/use_case/c.java rename to src/main/java/usecases/c.java index d16947651..69bf6b23e 100644 --- a/src/main/java/use_case/c.java +++ b/src/main/java/usecases/c.java @@ -1,4 +1,4 @@ -package use_case; +package usecases; public class c { } diff --git a/src/main/java/use_case/gather/GatherDataAccessInterface.java b/src/main/java/usecases/gather/GatherDataAccessInterface.java similarity index 94% rename from src/main/java/use_case/gather/GatherDataAccessInterface.java rename to src/main/java/usecases/gather/GatherDataAccessInterface.java index 5c537870e..19519fadc 100644 --- a/src/main/java/use_case/gather/GatherDataAccessInterface.java +++ b/src/main/java/usecases/gather/GatherDataAccessInterface.java @@ -1,7 +1,7 @@ -package use_case.gather; +package usecases.gather; -import entity.Inventory; -import entity.Location; +import entities.Inventory; +import entities.Location; public interface GatherDataAccessInterface { diff --git a/src/main/java/use_case/gather/GatherInputBoundary.java b/src/main/java/usecases/gather/GatherInputBoundary.java similarity index 93% rename from src/main/java/use_case/gather/GatherInputBoundary.java rename to src/main/java/usecases/gather/GatherInputBoundary.java index 96c60d963..7d4cdd802 100644 --- a/src/main/java/use_case/gather/GatherInputBoundary.java +++ b/src/main/java/usecases/gather/GatherInputBoundary.java @@ -1,4 +1,4 @@ -package use_case.gather; +package usecases.gather; /** * Interface of input, which implemented by according interactor. diff --git a/src/main/java/use_case/gather/GatherInputData.java b/src/main/java/usecases/gather/GatherInputData.java similarity index 93% rename from src/main/java/use_case/gather/GatherInputData.java rename to src/main/java/usecases/gather/GatherInputData.java index 5951d4e13..8b8abc82c 100644 --- a/src/main/java/use_case/gather/GatherInputData.java +++ b/src/main/java/usecases/gather/GatherInputData.java @@ -1,4 +1,4 @@ -package use_case.gather; +package usecases.gather; /** * Gather input data, which is for player's input, the fact that player clicked on gather. diff --git a/src/main/java/use_case/gather/GatherInteractor.java b/src/main/java/usecases/gather/GatherInteractor.java similarity index 99% rename from src/main/java/use_case/gather/GatherInteractor.java rename to src/main/java/usecases/gather/GatherInteractor.java index bd270e5f1..1057e98bf 100644 --- a/src/main/java/use_case/gather/GatherInteractor.java +++ b/src/main/java/usecases/gather/GatherInteractor.java @@ -1,4 +1,4 @@ -package use_case.gather; +package usecases.gather; /** * Use case interactor for gather. diff --git a/src/main/java/use_case/gather/GatherOutputBoundary.java b/src/main/java/usecases/gather/GatherOutputBoundary.java similarity index 96% rename from src/main/java/use_case/gather/GatherOutputBoundary.java rename to src/main/java/usecases/gather/GatherOutputBoundary.java index e210b18aa..b6411cbb9 100644 --- a/src/main/java/use_case/gather/GatherOutputBoundary.java +++ b/src/main/java/usecases/gather/GatherOutputBoundary.java @@ -1,4 +1,4 @@ -package use_case.gather; +package usecases.gather; /** * Output boundary for gather use case, responsible for providing the new view after the use case executed. diff --git a/src/main/java/use_case/gather/GatherOutputData.java b/src/main/java/usecases/gather/GatherOutputData.java similarity index 96% rename from src/main/java/use_case/gather/GatherOutputData.java rename to src/main/java/usecases/gather/GatherOutputData.java index fdfda9623..5ad02e9d9 100644 --- a/src/main/java/use_case/gather/GatherOutputData.java +++ b/src/main/java/usecases/gather/GatherOutputData.java @@ -1,4 +1,4 @@ -package use_case.gather; +package usecases.gather; /** * Outputdata for the new view, notice the classes are already updated in execution of interactor, so this is just diff --git a/src/main/java/use_case/move/MoveDataAccessInterface.java b/src/main/java/usecases/move/MoveDataAccessInterface.java similarity index 88% rename from src/main/java/use_case/move/MoveDataAccessInterface.java rename to src/main/java/usecases/move/MoveDataAccessInterface.java index f82c3bf50..1ae8f276c 100644 --- a/src/main/java/use_case/move/MoveDataAccessInterface.java +++ b/src/main/java/usecases/move/MoveDataAccessInterface.java @@ -1,8 +1,8 @@ -package use_case.move; +package usecases.move; -import entity.Maps; -import entity.PlayerAttributes; -import entity.PlayerLocation; +import entities.Maps; +import entities.PlayerAttributes; +import entities.PlayerLocation; /** * Data access interface for move use case, retrieve player's current location, and attribute. diff --git a/src/main/java/use_case/move/MoveInputBoundary.java b/src/main/java/usecases/move/MoveInputBoundary.java similarity index 92% rename from src/main/java/use_case/move/MoveInputBoundary.java rename to src/main/java/usecases/move/MoveInputBoundary.java index c6ccb09c7..6a85b97b8 100644 --- a/src/main/java/use_case/move/MoveInputBoundary.java +++ b/src/main/java/usecases/move/MoveInputBoundary.java @@ -1,4 +1,4 @@ -package use_case.move; +package usecases.move; /** * Input boundary of the use case move. diff --git a/src/main/java/use_case/move/MoveInputData.java b/src/main/java/usecases/move/MoveInputData.java similarity index 92% rename from src/main/java/use_case/move/MoveInputData.java rename to src/main/java/usecases/move/MoveInputData.java index d3cb336bf..9b181d02c 100644 --- a/src/main/java/use_case/move/MoveInputData.java +++ b/src/main/java/usecases/move/MoveInputData.java @@ -1,4 +1,4 @@ -package use_case.move; +package usecases.move; /** diff --git a/src/main/java/use_case/move/MoveInteractor.java b/src/main/java/usecases/move/MoveInteractor.java similarity index 97% rename from src/main/java/use_case/move/MoveInteractor.java rename to src/main/java/usecases/move/MoveInteractor.java index a95a53cb4..d1deb589a 100644 --- a/src/main/java/use_case/move/MoveInteractor.java +++ b/src/main/java/usecases/move/MoveInteractor.java @@ -1,7 +1,7 @@ -package use_case.move; +package usecases.move; -import entity.Entityconstants; -import entity.PlayerLocation; +import entities.Entityconstants; +import entities.PlayerLocation; /** * Move use case interactor. diff --git a/src/main/java/use_case/move/MoveOutputBoundary.java b/src/main/java/usecases/move/MoveOutputBoundary.java similarity index 95% rename from src/main/java/use_case/move/MoveOutputBoundary.java rename to src/main/java/usecases/move/MoveOutputBoundary.java index 5336f13ec..e34c6ce6e 100644 --- a/src/main/java/use_case/move/MoveOutputBoundary.java +++ b/src/main/java/usecases/move/MoveOutputBoundary.java @@ -1,4 +1,4 @@ -package use_case.move; +package usecases.move; /** * Interface of output boundary. diff --git a/src/main/java/use_case/move/MoveOutputData.java b/src/main/java/usecases/move/MoveOutputData.java similarity index 96% rename from src/main/java/use_case/move/MoveOutputData.java rename to src/main/java/usecases/move/MoveOutputData.java index 0628b676b..9b480aa8b 100644 --- a/src/main/java/use_case/move/MoveOutputData.java +++ b/src/main/java/usecases/move/MoveOutputData.java @@ -1,4 +1,4 @@ -package use_case.move; +package usecases.move; public class MoveOutputData { diff --git a/src/main/java/use_case/respond/RespondDataAccessInterface.java b/src/main/java/usecases/respond/RespondDataAccessInterface.java similarity index 94% rename from src/main/java/use_case/respond/RespondDataAccessInterface.java rename to src/main/java/usecases/respond/RespondDataAccessInterface.java index cd9368c1d..f99cce677 100644 --- a/src/main/java/use_case/respond/RespondDataAccessInterface.java +++ b/src/main/java/usecases/respond/RespondDataAccessInterface.java @@ -1,9 +1,9 @@ -package use_case.respond; +package usecases.respond; -import entity.Event; -import entity.Inventory; -import entity.PlayerAttributes; -import entity.PlayerLocation; +import entities.Event; +import entities.Inventory; +import entities.PlayerAttributes; +import entities.PlayerLocation; /** * DAO of respond, provide internal data as needed for interactor. diff --git a/src/main/java/use_case/respond/RespondInputBoundary.java b/src/main/java/usecases/respond/RespondInputBoundary.java similarity index 90% rename from src/main/java/use_case/respond/RespondInputBoundary.java rename to src/main/java/usecases/respond/RespondInputBoundary.java index 7246d671f..731efbac9 100644 --- a/src/main/java/use_case/respond/RespondInputBoundary.java +++ b/src/main/java/usecases/respond/RespondInputBoundary.java @@ -1,4 +1,4 @@ -package use_case.respond; +package usecases.respond; /** * Input boundary of respond use case. diff --git a/src/main/java/use_case/respond/RespondInputData.java b/src/main/java/usecases/respond/RespondInputData.java similarity index 91% rename from src/main/java/use_case/respond/RespondInputData.java rename to src/main/java/usecases/respond/RespondInputData.java index c3778799b..83770dcfe 100644 --- a/src/main/java/use_case/respond/RespondInputData.java +++ b/src/main/java/usecases/respond/RespondInputData.java @@ -1,4 +1,4 @@ -package use_case.respond; +package usecases.respond; /** * Input data form the view/player side like the choice they choose in term os 12345... diff --git a/src/main/java/use_case/respond/RespondInteractor.java b/src/main/java/usecases/respond/RespondInteractor.java similarity index 96% rename from src/main/java/use_case/respond/RespondInteractor.java rename to src/main/java/usecases/respond/RespondInteractor.java index 2ba6d325d..22136a7ba 100644 --- a/src/main/java/use_case/respond/RespondInteractor.java +++ b/src/main/java/usecases/respond/RespondInteractor.java @@ -1,10 +1,10 @@ -package use_case.respond; +package usecases.respond; -import entity.Entityconstants; -import entity.Event; -import entity.EventAmbush; -import entity.Inventory; -import entity.PlayerAttributes; +import entities.Entityconstants; +import entities.Event; +import entities.EventAmbush; +import entities.Inventory; +import entities.PlayerAttributes; import kotlin.Pair; /** diff --git a/src/main/java/use_case/respond/RespondOutputBoundary.java b/src/main/java/usecases/respond/RespondOutputBoundary.java similarity index 96% rename from src/main/java/use_case/respond/RespondOutputBoundary.java rename to src/main/java/usecases/respond/RespondOutputBoundary.java index ec24d08de..0f5241bd8 100644 --- a/src/main/java/use_case/respond/RespondOutputBoundary.java +++ b/src/main/java/usecases/respond/RespondOutputBoundary.java @@ -1,4 +1,4 @@ -package use_case.respond; +package usecases.respond; /** * Output boundary, responsible for passing output data to the controller. diff --git a/src/main/java/use_case/respond/RespondOutputData.java b/src/main/java/usecases/respond/RespondOutputData.java similarity index 97% rename from src/main/java/use_case/respond/RespondOutputData.java rename to src/main/java/usecases/respond/RespondOutputData.java index d7d4cd826..5424c9ac2 100644 --- a/src/main/java/use_case/respond/RespondOutputData.java +++ b/src/main/java/usecases/respond/RespondOutputData.java @@ -1,4 +1,4 @@ -package use_case.respond; +package usecases.respond; /** * Output data for the player's respond. diff --git a/src/test/java/use_case/NoteInteractorTest.java b/src/test/java/usecases/NoteInteractorTest.java similarity index 98% rename from src/test/java/use_case/NoteInteractorTest.java rename to src/test/java/usecases/NoteInteractorTest.java index e219e9652..53072147e 100644 --- a/src/test/java/use_case/NoteInteractorTest.java +++ b/src/test/java/usecases/NoteInteractorTest.java @@ -1,4 +1,4 @@ -package use_case; +package usecases; import org.junit.Test; From db9e8a1fa1f96fb95610d83d2e5cc98ac4368ab1 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sat, 23 Nov 2024 22:09:59 -0500 Subject: [PATCH 017/154] Update the entity, usecases, controllers and database for players login logic --- src/main/java/entities/Player.java | 58 +++++++++++++++++++ .../database/InMemoryPlayerRepository.java | 45 ++++++++++++++ src/main/java/frameworks/view/LoginView.java | 6 +- .../controllers/LoginController.java | 44 ++++++++++++++ .../gateways/PlayerRepository.java | 24 ++++++++ src/main/java/usecases/c.java | 4 -- .../java/usecases/login/LoginRequest.java | 39 +++++++++++++ .../java/usecases/login/LoginResponse.java | 52 +++++++++++++++++ .../java/usecases/login/LoginUseCase.java | 34 +++++++++++ 9 files changed, 299 insertions(+), 7 deletions(-) create mode 100644 src/main/java/entities/Player.java create mode 100644 src/main/java/frameworks/database/InMemoryPlayerRepository.java create mode 100644 src/main/java/interface_adapters/controllers/LoginController.java create mode 100644 src/main/java/interface_adapters/gateways/PlayerRepository.java delete mode 100644 src/main/java/usecases/c.java create mode 100644 src/main/java/usecases/login/LoginRequest.java create mode 100644 src/main/java/usecases/login/LoginResponse.java create mode 100644 src/main/java/usecases/login/LoginUseCase.java diff --git a/src/main/java/entities/Player.java b/src/main/java/entities/Player.java new file mode 100644 index 000000000..b66b661c2 --- /dev/null +++ b/src/main/java/entities/Player.java @@ -0,0 +1,58 @@ +package entities; + +/** + * Represents a player in the game. + * This entity contains information about the player, such as their ID, username, and password. + * The Player class encapsulates the player's identity and authentication logic. + */ +public class Player { + // Unique identifier for the player + private final String id; + // The player's username + private final String username; + // The player's password + private final String password; + + /** + * Constructs a new Player with the specified ID, username, and password. + * + * @param id A unique identifier for the player. + * This could be a database-generated ID. + * It uniquely distinguishes this player from all others in the system. + * @param username The username chosen by the player for logging into the game. + * @param password The player's password for authentication. + */ + public Player(String id, String username, String password) { + this.id = id; + this.username = username; + this.password = password; + } + + /** + * Gets the unique identifier for the player. + * + * @return The player's unique ID. + */ + public String getId() { + return id; + } + + /** + * Gets the username of the player. + * + * @return The player's username. + */ + public String getUsername() { + return username; + } + + /** + * Validates the player's password by comparing it with the provided input. + * + * @param inputPassword The password input provided for authentication. + * @return True if the input matches the player's password, otherwise false. + */ + public boolean validatePassword(String inputPassword) { + return this.password.equals(inputPassword); + } +} diff --git a/src/main/java/frameworks/database/InMemoryPlayerRepository.java b/src/main/java/frameworks/database/InMemoryPlayerRepository.java new file mode 100644 index 000000000..cf7ebc8c4 --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryPlayerRepository.java @@ -0,0 +1,45 @@ +package frameworks.database; + +import java.util.HashMap; +import java.util.Map; + +import entities.Player; +import interface_adapters.gateways.PlayerRepository; + +/** + * An in-memory implementation of the PlayerRepository interface. + * + * This class is used to store and retrieve Player objects in memory, primarily for testing + * and development purposes. It uses a HashMap to store Player data, where the key is the + * player's username and the value is the Player object. + */ +public class InMemoryPlayerRepository implements PlayerRepository { + private final Map players = new HashMap<>(); + + /** + * Constructs an InMemoryPlayerRepository with a predefined set of players. + * + * This constructor initializes the repository with some sample players for testing + * and demonstration purposes. Each player has a unique ID, username, and password. + */ + public InMemoryPlayerRepository() { + // todo + // Logic for storing the players information to the players MAP. + // players.put("user1", new Player("1", "user1", "password1")); + // players.put("user2", new Player("2", "user2", "password2")); + } + + /** + * Finds a Player by their username. + * + * This method retrieves the Player object from the in-memory store using the specified username. + * If no player with the given username exists, it returns null. + * + * @param username The username of the player to find. + * @return The Player object if found, or null if no player with the given username exists. + */ + @Override + public Player findByUsername(String username) { + return players.get(username); + } +} diff --git a/src/main/java/frameworks/view/LoginView.java b/src/main/java/frameworks/view/LoginView.java index 9a405c5c9..3822ea790 100644 --- a/src/main/java/frameworks/view/LoginView.java +++ b/src/main/java/frameworks/view/LoginView.java @@ -82,9 +82,9 @@ private void layout(int offsetX) { springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginBotton); } - // public static void main(String[] args) { - // new LoginView(); - // } + public static void main(String[] args) { + new LoginView(); + } public static String getUser() { return userText.getText(); diff --git a/src/main/java/interface_adapters/controllers/LoginController.java b/src/main/java/interface_adapters/controllers/LoginController.java new file mode 100644 index 000000000..ba1a3eca0 --- /dev/null +++ b/src/main/java/interface_adapters/controllers/LoginController.java @@ -0,0 +1,44 @@ +package interface_adapters.controllers; + +import usecases.login.LoginRequest; +import usecases.login.LoginResponse; +import usecases.login.LoginUseCase; + +/** + * The LoginController class is responsible for handling user input from the UI + * and invoking the LoginUseCase to process the login logic. + * It serves as the bridge between the user interface and the business logic. + */ +public class LoginController { + private final LoginUseCase useCase; + + /** + * Constructs a new LoginController with the specified LoginUseCase. + * + * @param useCase The use case instance responsible for processing login requests. + */ + public LoginController(LoginUseCase useCase) { + this.useCase = useCase; + } + + /** + * This method creates a LoginRequest object using the provided username and password, + * passes it to the LoginUseCase for processing, and handles the LoginResponse. + * If the login is successful, it prints a success message along with the player's ID. + * Otherwise, it prints an error message. + * + * @param username The username provided by the user. + * @param password The password provided by the user. + */ + public void handleLogin(String username, String password) { + final LoginRequest request = new LoginRequest(username, password); + final LoginResponse response = useCase.execute(request); + + if (response.isSuccess()) { + System.out.println(response.getMessage() + " Player ID: " + response.getPlayerId()); + } + else { + System.out.println(response.getMessage()); + } + } +} diff --git a/src/main/java/interface_adapters/gateways/PlayerRepository.java b/src/main/java/interface_adapters/gateways/PlayerRepository.java new file mode 100644 index 000000000..72c3fd101 --- /dev/null +++ b/src/main/java/interface_adapters/gateways/PlayerRepository.java @@ -0,0 +1,24 @@ +package interface_adapters.gateways; + +import entities.Player; + +/** + * The PlayerRepository interface defines the contract for accessing and managing + * player data in the underlying data source (e.g., database, in-memory store). + * + * This interface abstracts the storage details, enabling the use of different + * data source implementations without affecting the core business logic. + */ +public interface PlayerRepository { + + /** + * Finds and retrieves a player by their username. + * This method searches for a player in the data source using the given username + * and returns a Player object if a match is found. If no player is found, it may + * return null or throw an appropriate exception, depending on the implementation. + * + * @param username The username of the player to find. + * @return A Player object if the username exists in the data source, otherwise null. + */ + Player findByUsername(String username); +} diff --git a/src/main/java/usecases/c.java b/src/main/java/usecases/c.java deleted file mode 100644 index 69bf6b23e..000000000 --- a/src/main/java/usecases/c.java +++ /dev/null @@ -1,4 +0,0 @@ -package usecases; - -public class c { -} diff --git a/src/main/java/usecases/login/LoginRequest.java b/src/main/java/usecases/login/LoginRequest.java new file mode 100644 index 000000000..4a857dca7 --- /dev/null +++ b/src/main/java/usecases/login/LoginRequest.java @@ -0,0 +1,39 @@ +package usecases.login; + +/** + * Represents the request object for the login use case. + * Contains the username and password provided by the user. + */ +public class LoginRequest { + private final String username; + private final String password; + + /** + * Constructs a new LoginRequest with the given username and password. + * + * @param username The username provided by the user. + * @param password The password provided by the user. + */ + public LoginRequest(String username, String password) { + this.username = username; + this.password = password; + } + + /** + * Gets the username of the login request. + * + * @return The username. + */ + public String getUsername() { + return username; + } + + /** + * Gets the password of the login request. + * + * @return The password. + */ + public String getPassword() { + return password; + } +} diff --git a/src/main/java/usecases/login/LoginResponse.java b/src/main/java/usecases/login/LoginResponse.java new file mode 100644 index 000000000..212334865 --- /dev/null +++ b/src/main/java/usecases/login/LoginResponse.java @@ -0,0 +1,52 @@ +package usecases.login; + +/** + * Represents the response object for the login use case. + * Contains the result of the login attempt, including success status, a message, and the player ID. + */ +public class LoginResponse { + private final boolean success; + private final String message; + private final String playerId; + + /** + * Constructs a new LoginResponse with the given success status, message, and player ID. + * + * @param success Indicates whether the login was successful. + * @param message A message describing the result of the login attempt. + * @param playerId The unique ID of the player if login is successful. + */ + public LoginResponse(boolean success, String message, String playerId) { + this.success = success; + this.message = message; + this.playerId = playerId; + } + + /** + * Checks whether the login was successful. + * + * @return True if the login was successful, otherwise false. + */ + public boolean isSuccess() { + return success; + } + + /** + * Gets the message describing the login result. + * + * @return The message. + */ + public String getMessage() { + return message; + } + + /** + * Gets the player ID if the login is successful. + * + * @return The player ID, or null if login failed. + */ + public String getPlayerId() { + return playerId; + } +} + diff --git a/src/main/java/usecases/login/LoginUseCase.java b/src/main/java/usecases/login/LoginUseCase.java new file mode 100644 index 000000000..7f2856b28 --- /dev/null +++ b/src/main/java/usecases/login/LoginUseCase.java @@ -0,0 +1,34 @@ +package usecases.login; + +import entities.Player; +import interface_adapters.gateways.PlayerRepository; + +/** + * Handles the login logic. + * Validates the user's credentials and returns a response indicating success or failure. + */ +public class LoginUseCase { + private final PlayerRepository repository; + + /** + * Constructs a new LoginUseCase with the given player repository. + * + * @param repository The repository to access player data. + */ + public LoginUseCase(PlayerRepository repository) { + this.repository = repository; + } + + /** + * Executes the login use case with the given login request. + * @param request The login request containing the username and password. + * @return A LoginResponse indicating the result of the login attempt. + */ + public LoginResponse execute(LoginRequest request) { + final Player player = repository.findByUsername(request.getUsername()); + if (player != null && player.validatePassword(request.getPassword())) { + return new LoginResponse(true, "Login successful!", player.getId()); + } + return new LoginResponse(false, "Invalid username or password.", null); + } +} From a09e13cf42a512e219da62627001d1b9224b2364 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sun, 24 Nov 2024 21:41:20 -0500 Subject: [PATCH 018/154] Updated the ranking list, by calling ranking presenter, a list of sorted object is returned. --- src/main/java/entities/RankingEntry.java | 47 +++++++++++++++++++ .../database/InMemoryPlayerRepository.java | 11 +++++ .../database/InMemoryRankingRepository.java | 46 ++++++++++++++++++ .../frameworks/view/RankingViewModel.java | 43 +++++++++++++++++ .../controllers/RankingController.java | 42 +++++++++++++++++ .../gateways/PlayerRepository.java | 8 ++++ .../gateways/RankingRepository.java | 18 +++++++ .../presenters/RankingPresenter.java | 31 ++++++++++++ .../usecases/ranking/RankingComparator.java | 39 +++++++++++++++ .../java/usecases/ranking/RankingRequest.java | 28 +++++++++++ .../usecases/ranking/RankingResponse.java | 32 +++++++++++++ .../java/usecases/ranking/RankingUseCase.java | 41 ++++++++++++++++ 12 files changed, 386 insertions(+) create mode 100644 src/main/java/entities/RankingEntry.java create mode 100644 src/main/java/frameworks/database/InMemoryRankingRepository.java create mode 100644 src/main/java/frameworks/view/RankingViewModel.java create mode 100644 src/main/java/interface_adapters/controllers/RankingController.java create mode 100644 src/main/java/interface_adapters/gateways/RankingRepository.java create mode 100644 src/main/java/interface_adapters/presenters/RankingPresenter.java create mode 100644 src/main/java/usecases/ranking/RankingComparator.java create mode 100644 src/main/java/usecases/ranking/RankingRequest.java create mode 100644 src/main/java/usecases/ranking/RankingResponse.java create mode 100644 src/main/java/usecases/ranking/RankingUseCase.java diff --git a/src/main/java/entities/RankingEntry.java b/src/main/java/entities/RankingEntry.java new file mode 100644 index 000000000..39437adb6 --- /dev/null +++ b/src/main/java/entities/RankingEntry.java @@ -0,0 +1,47 @@ +package entities; + +/** + * Represents an entry in the ranking list. + * Contains the player's name, score, days survived, and whether they won. + */ +public class RankingEntry { + // Player's username + private final String name; + // Player's score + private final int score; + // Number of days the player survived + private final int daysSurvived; + // Whether the player won the game + private final boolean won; + + /** + * Constructs a new RankingEntry with the specified attributes. + * + * @param name The player's username. + * @param score The player's score. + * @param daysSurvived The number of days the player survived. + * @param won Whether the player won the game. + */ + public RankingEntry(String name, int score, int daysSurvived, boolean won) { + this.name = name; + this.score = score; + this.daysSurvived = daysSurvived; + this.won = won; + } + + public String getName() { + return name; + } + + public int getScore() { + return score; + } + + public int getDaysSurvived() { + return daysSurvived; + } + + public boolean isWon() { + return won; + } +} diff --git a/src/main/java/frameworks/database/InMemoryPlayerRepository.java b/src/main/java/frameworks/database/InMemoryPlayerRepository.java index cf7ebc8c4..fe57396c8 100644 --- a/src/main/java/frameworks/database/InMemoryPlayerRepository.java +++ b/src/main/java/frameworks/database/InMemoryPlayerRepository.java @@ -42,4 +42,15 @@ public InMemoryPlayerRepository() { public Player findByUsername(String username) { return players.get(username); } + + /** + * Checks if the given username already exists in the repository. + * + * @param username The username to check. + * @return True if the username exists, otherwise false. + */ + @Override + public boolean isUsernameDuplicate(String username) { + return players.containsKey(username); + } } diff --git a/src/main/java/frameworks/database/InMemoryRankingRepository.java b/src/main/java/frameworks/database/InMemoryRankingRepository.java new file mode 100644 index 000000000..962887024 --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryRankingRepository.java @@ -0,0 +1,46 @@ +package frameworks.database; + +import java.util.ArrayList; +import java.util.List; + +import entities.RankingEntry; +import interface_adapters.gateways.RankingRepository; + +/** + * An in-memory implementation of the RankingRepository interface. + * Stores and retrieves ranking entries in memory, primarily for testing purposes. + * + * ----------------------------Example for how to call------------------------------ + * InMemoryRankingRepository repository = new InMemoryRankingRepository(); + * RankingUseCase useCase = new RankingUseCase(repository); + * RankingController controller = new RankingController(useCase); + * + * // Display the top 3 players + * System.out.println("Top 3 Players:"); + * controller.handleRankingRequest(3); + */ +public class InMemoryRankingRepository implements RankingRepository { + private final List rankings = new ArrayList<>(); + + /** + * Constructs an InMemoryRankingRepository with a predefined set of ranking entries. + */ + public InMemoryRankingRepository() { + // todo + // rankings.add(new RankingEntry("player1", 100)); + // rankings.add(new RankingEntry("player2", 200)); + // rankings.add(new RankingEntry("player3", 150)); + // rankings.add(new RankingEntry("player4", 250)); + } + + /** + * Retrieves all ranking entries stored in memory. + * + * @return A list of all ranking entries. + */ + @Override + public List getAllRankings() { + // Return a copy to prevent modification + return new ArrayList<>(rankings); + } +} diff --git a/src/main/java/frameworks/view/RankingViewModel.java b/src/main/java/frameworks/view/RankingViewModel.java new file mode 100644 index 000000000..ab53fa788 --- /dev/null +++ b/src/main/java/frameworks/view/RankingViewModel.java @@ -0,0 +1,43 @@ +package frameworks.view; + +/** + * Represents a ViewModel for the ranking list. + * Used to pass ranking data from the application to the UI. + */ +public class RankingViewModel { + private final String name; + private final int score; + private final int daysSurvived; + private final boolean won; + + /** + * Constructs a new RankingViewModel with the specified attributes. + * + * @param name The player's name. + * @param score The player's score. + * @param daysSurvived The number of days the player survived. + * @param won Whether the player won. + */ + public RankingViewModel(String name, int score, int daysSurvived, boolean won) { + this.name = name; + this.score = score; + this.daysSurvived = daysSurvived; + this.won = won; + } + + public String getName() { + return name; + } + + public int getScore() { + return score; + } + + public int getDaysSurvived() { + return daysSurvived; + } + + public boolean isWon() { + return won; + } +} diff --git a/src/main/java/interface_adapters/controllers/RankingController.java b/src/main/java/interface_adapters/controllers/RankingController.java new file mode 100644 index 000000000..f617801d1 --- /dev/null +++ b/src/main/java/interface_adapters/controllers/RankingController.java @@ -0,0 +1,42 @@ +package interface_adapters.controllers; + +import java.util.List; + +import frameworks.view.RankingViewModel; +import interface_adapters.presenters.RankingPresenter; +import usecases.ranking.RankingRequest; +import usecases.ranking.RankingResponse; +import usecases.ranking.RankingUseCase; + +/** + * Handles user input for retrieving the ranking list. + * Passes the input to the RankingUseCase and processes the output through the RankingPresenter. + */ +public class RankingController { + private final RankingUseCase useCase; + private final RankingPresenter presenter; + + /** + * Constructs a new RankingController with the specified use case and presenter. + * + * @param useCase The use case to handle ranking logic. + * @param presenter The presenter to process the response for the UI layer. + */ + public RankingController(RankingUseCase useCase, RankingPresenter presenter) { + this.useCase = useCase; + this.presenter = presenter; + } + + /** + * Handles a ranking request and returns a list of ViewModel objects for the UI layer. + * + * @param topN The number of top players to retrieve. + * @return A list of RankingViewModel objects for the UI layer. + */ + public List handleRankingRequest(int topN) { + final RankingRequest request = new RankingRequest(topN); + final RankingResponse response = useCase.execute(request); + // Convert response to ViewModel + return presenter.present(response); + } +} diff --git a/src/main/java/interface_adapters/gateways/PlayerRepository.java b/src/main/java/interface_adapters/gateways/PlayerRepository.java index 72c3fd101..9a60b89a4 100644 --- a/src/main/java/interface_adapters/gateways/PlayerRepository.java +++ b/src/main/java/interface_adapters/gateways/PlayerRepository.java @@ -21,4 +21,12 @@ public interface PlayerRepository { * @return A Player object if the username exists in the data source, otherwise null. */ Player findByUsername(String username); + + /** + * Checks if the given username already exists in the data source. + * + * @param username The username to check. + * @return True if the username exists, otherwise false. + */ + boolean isUsernameDuplicate(String username); } diff --git a/src/main/java/interface_adapters/gateways/RankingRepository.java b/src/main/java/interface_adapters/gateways/RankingRepository.java new file mode 100644 index 000000000..d5b32fb74 --- /dev/null +++ b/src/main/java/interface_adapters/gateways/RankingRepository.java @@ -0,0 +1,18 @@ +package interface_adapters.gateways; + +import java.util.List; + +import entities.RankingEntry; + +/** + * Represents the interface for accessing ranking data. + * This interface defines the contract for retrieving the ranking list. + */ +public interface RankingRepository { + /** + * Retrieves all ranking entries from the data source. + * + * @return A list of all ranking entries. + */ + List getAllRankings(); +} diff --git a/src/main/java/interface_adapters/presenters/RankingPresenter.java b/src/main/java/interface_adapters/presenters/RankingPresenter.java new file mode 100644 index 000000000..d43df5bb8 --- /dev/null +++ b/src/main/java/interface_adapters/presenters/RankingPresenter.java @@ -0,0 +1,31 @@ +package interface_adapters.presenters; + +import java.util.List; +import java.util.stream.Collectors; + +import frameworks.view.RankingViewModel; +import usecases.ranking.RankingResponse; + +/** + * Converts the RankingResponse data into a format suitable for the UI layer. + */ +public class RankingPresenter { + + /** + * Converts the RankingResponse into a list of RankingViewModel objects. + * + * @param response The response from the RankingUseCase. + * @return A list of RankingViewModel objects for the UI layer. + */ + public List present(RankingResponse response) { + return response.getRankings().stream() + .map(entry -> { + return new RankingViewModel( + entry.getName(), + entry.getScore(), + entry.getDaysSurvived(), + entry.isWon()); + }) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/usecases/ranking/RankingComparator.java b/src/main/java/usecases/ranking/RankingComparator.java new file mode 100644 index 000000000..dcbb70022 --- /dev/null +++ b/src/main/java/usecases/ranking/RankingComparator.java @@ -0,0 +1,39 @@ +package usecases.ranking; + +import java.util.Comparator; + +import entities.RankingEntry; + +/** + * Comparator for sorting RankingEntry objects. + * + * Players who have won the game (won = true) are ranked first. + * Within the groups of winners and non-winners, players are ranked by their scores in descending order. + */ +public class RankingComparator implements Comparator { + + /** + * Compares two RankingEntry objects for ranking purposes. + * + * The comparison logic prioritizes players who have won the game (won = true). + * Within the same group (both won or both not won), players are sorted by their scores in descending order. + * + * @param a The first RankingEntry to compare. + * @param b The second RankingEntry to compare. + * @return A negative integer, zero, or a positive integer as the first entry + * is ranked higher, equally, or lower than the second entry. + */ + @Override + public int compare(RankingEntry a, RankingEntry b) { + // Step 1: Compare by "won" status (true > false) + if (a.isWon() && !b.isWon()) { + return -1; + } + else if (!a.isWon() && b.isWon()) { + return 1; + } + + // Step 2: Compare by score (descending order) + return Integer.compare(b.getScore(), a.getScore()); + } +} diff --git a/src/main/java/usecases/ranking/RankingRequest.java b/src/main/java/usecases/ranking/RankingRequest.java new file mode 100644 index 000000000..ba29a1d13 --- /dev/null +++ b/src/main/java/usecases/ranking/RankingRequest.java @@ -0,0 +1,28 @@ +package usecases.ranking; + +/** + * Represents a request to retrieve the ranking list. + * Contains the number of top players to retrieve. + */ +public class RankingRequest { + // The number of top players to retrieve + private final int topN; + + /** + * Constructs a new RankingRequest with the specified number of top players. + * + * @param topN The number of top players to retrieve. + */ + public RankingRequest(int topN) { + this.topN = topN; + } + + /** + * Gets the number of top players to retrieve. + * + * @return The number of top players. + */ + public int getTopN() { + return topN; + } +} diff --git a/src/main/java/usecases/ranking/RankingResponse.java b/src/main/java/usecases/ranking/RankingResponse.java new file mode 100644 index 000000000..ff87bb50b --- /dev/null +++ b/src/main/java/usecases/ranking/RankingResponse.java @@ -0,0 +1,32 @@ +package usecases.ranking; + +import java.util.List; + +import entities.RankingEntry; + +/** + * Represents the response for a ranking request. + * Contains a sorted list of top-ranking entries. + */ +public class RankingResponse { + // The list of ranking entries + private final List rankings; + + /** + * Constructs a new RankingResponse with the specified ranking list. + * + * @param rankings The sorted list of ranking entries. + */ + public RankingResponse(List rankings) { + this.rankings = rankings; + } + + /** + * Gets the sorted list of ranking entries. + * + * @return The ranking list. + */ + public List getRankings() { + return rankings; + } +} diff --git a/src/main/java/usecases/ranking/RankingUseCase.java b/src/main/java/usecases/ranking/RankingUseCase.java new file mode 100644 index 000000000..89462dddb --- /dev/null +++ b/src/main/java/usecases/ranking/RankingUseCase.java @@ -0,0 +1,41 @@ +package usecases.ranking; + +import java.util.List; + +import entities.RankingEntry; +import interface_adapters.gateways.RankingRepository; + +/** + * Handles the business logic for retrieving and sorting the ranking list. + * Retrieves the top N players from the repository, sorted by score in descending order. + */ +public class RankingUseCase { + // The repository to access ranking data + private final RankingRepository repository; + + /** + * Constructs a new RankingUseCase with the specified ranking repository. + * + * @param repository The repository to access ranking data. + */ + public RankingUseCase(RankingRepository repository) { + this.repository = repository; + } + + /** + * Executes the ranking request to retrieve the top N players. + * + * @param request The ranking request specifying the number of top players to retrieve. + * @return A RankingResponse containing the sorted list of top-ranking players. + */ + public RankingResponse execute(RankingRequest request) { + final List rankings = repository.getAllRankings(); + // Sort by score descending + rankings.sort(new RankingComparator()); + + // Return the top N players based on the request + final List topRankings = rankings.subList(0, Math.min(request.getTopN(), rankings.size())); + + return new RankingResponse(topRankings); + } +} From 2b2d19c8373e5475869ec49d947ea29c1e597389 Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Mon, 25 Nov 2024 19:56:28 -0500 Subject: [PATCH 019/154] Implement Broadcast use case for player actions --- .../BroadcastDataAccessInterface.java | 30 ++++++++++ .../broadcast/BroadcastInputBoundary.java | 13 ++++ .../broadcast/BroadcastInputData.java | 16 +++++ .../broadcast/BroadcastInteractor.java | 59 +++++++++++++++++++ .../broadcast/BroadcastOutputBoundary.java | 20 +++++++ .../broadcast/BroadcastOutputData.java | 34 +++++++++++ 6 files changed, 172 insertions(+) create mode 100644 src/main/java/usecases/broadcast/BroadcastDataAccessInterface.java create mode 100644 src/main/java/usecases/broadcast/BroadcastInputBoundary.java create mode 100644 src/main/java/usecases/broadcast/BroadcastInputData.java create mode 100644 src/main/java/usecases/broadcast/BroadcastInteractor.java create mode 100644 src/main/java/usecases/broadcast/BroadcastOutputBoundary.java create mode 100644 src/main/java/usecases/broadcast/BroadcastOutputData.java diff --git a/src/main/java/usecases/broadcast/BroadcastDataAccessInterface.java b/src/main/java/usecases/broadcast/BroadcastDataAccessInterface.java new file mode 100644 index 000000000..86ab67610 --- /dev/null +++ b/src/main/java/usecases/broadcast/BroadcastDataAccessInterface.java @@ -0,0 +1,30 @@ +package usecases.broadcast; + +import entities.Inventory; +import entities.PlayerAttributes; + +/** + * Data access interface for the broadcast use case. + */ +public interface BroadcastDataAccessInterface { + /** + * Gets the player's attributes. + * + * @return The player's attributes. + */ + PlayerAttributes getPlayerAttributes(); + + /** + * Gets the player's inventory. + * + * @return The player's inventory. + */ + Inventory getInventory(); + + /** + * Updates the player's inventory. + * + * @param resourceChange The change in resources. + */ + void updateInventory(int resourceChange); +} diff --git a/src/main/java/usecases/broadcast/BroadcastInputBoundary.java b/src/main/java/usecases/broadcast/BroadcastInputBoundary.java new file mode 100644 index 000000000..e606d9028 --- /dev/null +++ b/src/main/java/usecases/broadcast/BroadcastInputBoundary.java @@ -0,0 +1,13 @@ +package usecases.broadcast; + +/** + * Input boundary for the broadcast use case. + */ +public interface BroadcastInputBoundary { + /** + * Executes the broadcast action with the given input data. + * + * @param inputData The input data for the broadcast. + */ + void execute(BroadcastInputData inputData); +} diff --git a/src/main/java/usecases/broadcast/BroadcastInputData.java b/src/main/java/usecases/broadcast/BroadcastInputData.java new file mode 100644 index 000000000..e1b86cbfe --- /dev/null +++ b/src/main/java/usecases/broadcast/BroadcastInputData.java @@ -0,0 +1,16 @@ +package usecases.broadcast; + +/** + * Input data for the broadcast use case. + */ +public class BroadcastInputData { + private final String broadcastType; + + public BroadcastInputData(String broadcastType) { + this.broadcastType = broadcastType; + } + + public String getBroadcastType() { + return broadcastType; + } +} diff --git a/src/main/java/usecases/broadcast/BroadcastInteractor.java b/src/main/java/usecases/broadcast/BroadcastInteractor.java new file mode 100644 index 000000000..5f4248d57 --- /dev/null +++ b/src/main/java/usecases/broadcast/BroadcastInteractor.java @@ -0,0 +1,59 @@ +package usecases.broadcast; + +import entities.Inventory; +import entities.PlayerAttributes; + +import java.util.Random; + +/** + * Interactor for the broadcast use case. + */ +public class BroadcastInteractor implements usecases.broadcast.BroadcastInputBoundary { + private final usecases.broadcast.BroadcastDataAccessInterface dataAccessInterface; + private final usecases.broadcast.BroadcastOutputBoundary outputBoundary; + + public BroadcastInteractor(usecases.broadcast.BroadcastDataAccessInterface dataAccessInterface, + usecases.broadcast.BroadcastOutputBoundary outputBoundary) { + this.dataAccessInterface = dataAccessInterface; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(usecases.broadcast.BroadcastInputData inputData) { + PlayerAttributes attributes = dataAccessInterface.getPlayerAttributes(); + Inventory inventory = dataAccessInterface.getInventory(); + + // Check if the player has enough resources for a broadcast + int resourceCost = 5; + if (inventory.getWater() < resourceCost) { + outputBoundary.prepareFailureView("Not enough resources to broadcast."); + return; + } + + // Deduct the resources + dataAccessInterface.updateInventory(-resourceCost); + + // Simulate outcomes based on attributes + Random random = new Random(); + boolean success = random.nextDouble() < (0.5 + attributes.getSocial() * 0.05); + boolean attractedZombies = random.nextDouble() < (0.2 - attributes.getLuck() * 0.03); + + int survivorsFound = 0; + int resourcesFound = 0; + + String resultMessage = "Your broadcast did not produce any results."; + + if (success) { + survivorsFound = random.nextInt(3) + 1; + resourcesFound = random.nextInt(10) + 5; + resultMessage = "Your broadcast was successful!"; + } + + if (attractedZombies) { + resultMessage += " However, it attracted zombies!"; + } + + BroadcastOutputData outputData = new BroadcastOutputData(resultMessage, survivorsFound, resourcesFound, attractedZombies); + outputBoundary.prepareSuccessView(outputData); + } +} diff --git a/src/main/java/usecases/broadcast/BroadcastOutputBoundary.java b/src/main/java/usecases/broadcast/BroadcastOutputBoundary.java new file mode 100644 index 000000000..069575fe6 --- /dev/null +++ b/src/main/java/usecases/broadcast/BroadcastOutputBoundary.java @@ -0,0 +1,20 @@ +package usecases.broadcast; + +/** + * Output boundary for the broadcast use case. + */ +public interface BroadcastOutputBoundary { + /** + * Prepares the success view for a broadcast. + * + * @param outputData The output data for the broadcast. + */ + void prepareSuccessView(BroadcastOutputData outputData); + + /** + * Prepares the failure view for a broadcast. + * + * @param errorMessage The error message for the failure. + */ + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/broadcast/BroadcastOutputData.java b/src/main/java/usecases/broadcast/BroadcastOutputData.java new file mode 100644 index 000000000..809ded57b --- /dev/null +++ b/src/main/java/usecases/broadcast/BroadcastOutputData.java @@ -0,0 +1,34 @@ +package usecases.broadcast; + +/** + * Output data for the broadcast use case. + */ +public class BroadcastOutputData { + private final String resultMessage; + private final int survivorsFound; + private final int resourcesFound; + private final boolean attractedZombies; + + public BroadcastOutputData(String resultMessage, int survivorsFound, int resourcesFound, boolean attractedZombies) { + this.resultMessage = resultMessage; + this.survivorsFound = survivorsFound; + this.resourcesFound = resourcesFound; + this.attractedZombies = attractedZombies; + } + + public String getResultMessage() { + return resultMessage; + } + + public int getSurvivorsFound() { + return survivorsFound; + } + + public int getResourcesFound() { + return resourcesFound; + } + + public boolean isAttractedZombies() { + return attractedZombies; + } +} From 94fbcbb0333a03d996408f85086f8b19ed2da58a Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Tue, 26 Nov 2024 02:58:24 -0500 Subject: [PATCH 020/154] Update the new Login with the Signup version --- .../database/InMemoryPlayerRepository.java | 16 ++++++-- .../database/InMemoryRankingRepository.java | 7 ++-- .../controllers/LoginController.java | 16 ++------ .../controllers/SignupController.java | 34 ++++++++++++++++ .../gateways/PlayerRepository.java | 30 +++++++++----- .../java/usecases/login/LoginUseCase.java | 27 +++++++------ .../java/usecases/signup/SignupUseCase.java | 39 +++++++++++++++++++ 7 files changed, 129 insertions(+), 40 deletions(-) create mode 100644 src/main/java/interface_adapters/controllers/SignupController.java create mode 100644 src/main/java/usecases/signup/SignupUseCase.java diff --git a/src/main/java/frameworks/database/InMemoryPlayerRepository.java b/src/main/java/frameworks/database/InMemoryPlayerRepository.java index fe57396c8..c9cd48ae2 100644 --- a/src/main/java/frameworks/database/InMemoryPlayerRepository.java +++ b/src/main/java/frameworks/database/InMemoryPlayerRepository.java @@ -24,9 +24,9 @@ public class InMemoryPlayerRepository implements PlayerRepository { */ public InMemoryPlayerRepository() { // todo - // Logic for storing the players information to the players MAP. - // players.put("user1", new Player("1", "user1", "password1")); - // players.put("user2", new Player("2", "user2", "password2")); + // Database import + players.put("user1", new Player("1", "user1", "password1")); + players.put("user2", new Player("2", "user2", "password2")); } /** @@ -53,4 +53,14 @@ public Player findByUsername(String username) { public boolean isUsernameDuplicate(String username) { return players.containsKey(username); } + + /** + * Update the new player object in Hashmap players. + * + * @param player The object for Player. + */ + @Override + public void addPlayer(Player player) { + players.put(player.getUsername(), player); + } } diff --git a/src/main/java/frameworks/database/InMemoryRankingRepository.java b/src/main/java/frameworks/database/InMemoryRankingRepository.java index 962887024..f7e5e57af 100644 --- a/src/main/java/frameworks/database/InMemoryRankingRepository.java +++ b/src/main/java/frameworks/database/InMemoryRankingRepository.java @@ -27,10 +27,9 @@ public class InMemoryRankingRepository implements RankingRepository { */ public InMemoryRankingRepository() { // todo - // rankings.add(new RankingEntry("player1", 100)); - // rankings.add(new RankingEntry("player2", 200)); - // rankings.add(new RankingEntry("player3", 150)); - // rankings.add(new RankingEntry("player4", 250)); + // Database import + rankings.add(new RankingEntry("player1", 100, 40, false)); + rankings.add(new RankingEntry("player2", 200, 60,true)); } /** diff --git a/src/main/java/interface_adapters/controllers/LoginController.java b/src/main/java/interface_adapters/controllers/LoginController.java index ba1a3eca0..9ef145436 100644 --- a/src/main/java/interface_adapters/controllers/LoginController.java +++ b/src/main/java/interface_adapters/controllers/LoginController.java @@ -1,7 +1,5 @@ package interface_adapters.controllers; -import usecases.login.LoginRequest; -import usecases.login.LoginResponse; import usecases.login.LoginUseCase; /** @@ -29,16 +27,10 @@ public LoginController(LoginUseCase useCase) { * * @param username The username provided by the user. * @param password The password provided by the user. + * + * @return The response for the giver username and password. */ - public void handleLogin(String username, String password) { - final LoginRequest request = new LoginRequest(username, password); - final LoginResponse response = useCase.execute(request); - - if (response.isSuccess()) { - System.out.println(response.getMessage() + " Player ID: " + response.getPlayerId()); - } - else { - System.out.println(response.getMessage()); - } + public String handleLogin(String username, String password) { + return useCase.execute(username, password); } } diff --git a/src/main/java/interface_adapters/controllers/SignupController.java b/src/main/java/interface_adapters/controllers/SignupController.java new file mode 100644 index 000000000..668e482cf --- /dev/null +++ b/src/main/java/interface_adapters/controllers/SignupController.java @@ -0,0 +1,34 @@ +package interface_adapters.controllers; + +import usecases.signup.SignupUseCase; + +/** + * Handles user input for signing up a new player. + * + * The SignupController is responsible for receiving input data from the UI layer + * and passing this data to the SignupUseCase for processing. + */ +public class SignupController { + private final SignupUseCase useCase; + + /** + * Constructs a SignupController with the specified SignupUseCase. + * + * @param useCase The SignupUseCase that contains the business logic for signing up a new player. + */ + public SignupController(SignupUseCase useCase) { + this.useCase = useCase; + } + + /** + * Handles the signup request for a new player. + * + * @param username The desired username for the new player. + * @param password The desired password for the new player. + * @return A string message indicating the result of the signup attempt, such as + * success or failure with an explanation. + */ + public String handleSignup(String username, String password) { + return useCase.execute(username, password); + } +} diff --git a/src/main/java/interface_adapters/gateways/PlayerRepository.java b/src/main/java/interface_adapters/gateways/PlayerRepository.java index 9a60b89a4..b4bbb0df4 100644 --- a/src/main/java/interface_adapters/gateways/PlayerRepository.java +++ b/src/main/java/interface_adapters/gateways/PlayerRepository.java @@ -3,30 +3,40 @@ import entities.Player; /** - * The PlayerRepository interface defines the contract for accessing and managing - * player data in the underlying data source (e.g., database, in-memory store). - * - * This interface abstracts the storage details, enabling the use of different - * data source implementations without affecting the core business logic. + * Represents the interface for accessing and managing player data. */ public interface PlayerRepository { /** * Finds and retrieves a player by their username. - * This method searches for a player in the data source using the given username - * and returns a Player object if a match is found. If no player is found, it may - * return null or throw an appropriate exception, depending on the implementation. + * + * This method searches the data source for a player with the specified username. + * If a matching player is found, it returns the corresponding Player object. + * Otherwise, it returns null. * * @param username The username of the player to find. - * @return A Player object if the username exists in the data source, otherwise null. + * @return The Player object if the username exists in the data source, otherwise null. */ Player findByUsername(String username); /** * Checks if the given username already exists in the data source. * + * This method determines whether a player with the specified username is already + * stored in the data source. It helps ensure username uniqueness during signup. + * * @param username The username to check. - * @return True if the username exists, otherwise false. + * @return True if the username exists in the data source, otherwise false. */ boolean isUsernameDuplicate(String username); + + /** + * Adds a new player to the data source. + * + * This method saves the given Player object into the data source. It assumes + * that the username is unique and does not perform additional duplicate checks. + * + * @param player The Player object to add to the data source. + */ + void addPlayer(Player player); } diff --git a/src/main/java/usecases/login/LoginUseCase.java b/src/main/java/usecases/login/LoginUseCase.java index 7f2856b28..d01e0499b 100644 --- a/src/main/java/usecases/login/LoginUseCase.java +++ b/src/main/java/usecases/login/LoginUseCase.java @@ -4,14 +4,14 @@ import interface_adapters.gateways.PlayerRepository; /** - * Handles the login logic. - * Validates the user's credentials and returns a response indicating success or failure. + * Handles the logic for logging in a player. + * Validates credentials against the existing database. */ public class LoginUseCase { private final PlayerRepository repository; /** - * Constructs a new LoginUseCase with the given player repository. + * Constructs a LoginUseCase with the specified player repository. * * @param repository The repository to access player data. */ @@ -20,15 +20,20 @@ public LoginUseCase(PlayerRepository repository) { } /** - * Executes the login use case with the given login request. - * @param request The login request containing the username and password. - * @return A LoginResponse indicating the result of the login attempt. + * Executes the login logic for a player. + * + * @param username The username provided by the player. + * @param password The password provided by the player. + * @return A success message if login is successful, otherwise an error message. */ - public LoginResponse execute(LoginRequest request) { - final Player player = repository.findByUsername(request.getUsername()); - if (player != null && player.validatePassword(request.getPassword())) { - return new LoginResponse(true, "Login successful!", player.getId()); + public String execute(String username, String password) { + final Player player = repository.findByUsername(username); + if (player == null) { + return "Login failed: Username not found."; + } + if (!player.validatePassword(password)) { + return "Login failed: Incorrect password."; } - return new LoginResponse(false, "Invalid username or password.", null); + return "Login successful! Welcome back, " + username + "."; } } diff --git a/src/main/java/usecases/signup/SignupUseCase.java b/src/main/java/usecases/signup/SignupUseCase.java new file mode 100644 index 000000000..309904047 --- /dev/null +++ b/src/main/java/usecases/signup/SignupUseCase.java @@ -0,0 +1,39 @@ +package usecases.signup; + +import entities.Player; +import interface_adapters.gateways.PlayerRepository; + +/** + * Handles the logic for signing up a new player. + * Ensures usernames are unique and adds new players to the database. + */ +public class SignupUseCase { + private final PlayerRepository repository; + + /** + * Constructs a SignupUseCase with the specified player repository. + * + * @param repository The repository to access player data. + */ + public SignupUseCase(PlayerRepository repository) { + this.repository = repository; + } + + /** + * Executes the signup logic for a new player. + * + * @param username The desired username of the new player. + * @param password The desired password of the new player. + * @return A success message if signup is successful, otherwise an error message. + */ + public String execute(String username, String password) { + if (repository.isUsernameDuplicate(username)) { + return "Signup failed: Username '" + username + "' is already taken."; + } + // Generate a new unique ID (for simplicity, use current size + 1) + final String newId = String.valueOf(repository.hashCode() + 1); + final Player newPlayer = new Player(newId, username, password); + repository.addPlayer(newPlayer); + return "Signup successful! Welcome, " + username + "."; + } +} From f1d5420f9b84646e6ca24f9ee59653179cbb75cc Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Wed, 27 Nov 2024 01:19:43 -0500 Subject: [PATCH 021/154] Add entities: EventFlood and EventTraderEncounter --- src/main/java/entities/EventFlood.java | 82 +++++++++++++++++++ .../java/entities/EventTraderEncounter.java | 82 +++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 src/main/java/entities/EventFlood.java create mode 100644 src/main/java/entities/EventTraderEncounter.java diff --git a/src/main/java/entities/EventFlood.java b/src/main/java/entities/EventFlood.java new file mode 100644 index 000000000..5004ba02e --- /dev/null +++ b/src/main/java/entities/EventFlood.java @@ -0,0 +1,82 @@ +package entities; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * Event of a flood. This is a negative event that occurs in Plains, Woods, or Cities. + * The flood causes a loss of resources or requires immediate action to mitigate damages. + */ +public class EventFlood implements Event { + + private final Boolean isPositive; + private final ArrayList occuringlocation; + private final String description; + private final Map choices; + private double probability; + private final String evacuateOutcome; + private final String secureSuppliesOutcome; + private final String doNothingOutcome; + + public EventFlood() { + this.isPositive = false; + this.occuringlocation = new ArrayList<>(); + occuringlocation.add("Plain"); + occuringlocation.add("Wood"); + occuringlocation.add("City"); + + this.description = "Heavy rains have caused nearby rivers to overflow, threatening your group with a flood. " + + "You must act quickly to avoid losing supplies and people. What will you do?"; + this.choices = new HashMap<>(); + choices.put(Entityconstants.FIRSTCHOICE, "Evacuate to higher ground"); + choices.put(Entityconstants.SECONDCHOICE, "Secure supplies and hold position"); + choices.put(Entityconstants.THIRDCHOICE, "Do nothing and hope the flood subsides"); + + this.probability = Entityconstants.RAREEVENTBASEPROB; + this.evacuateOutcome = "You successfully evacuated, saving most of your group but losing some supplies."; + this.secureSuppliesOutcome = "You secured your supplies but lost time and some members to the flood."; + this.doNothingOutcome = "The flood devastated your group, causing heavy losses in supplies and morale."; + } + + @Override + public double getprobability() { + return this.probability; + } + + @Override + public void setprobability(double prob) { + this.probability = prob; + } + + @Override + public Map getchoices() { + return this.choices; + } + + @Override + public String getdescription() { + return this.description; + } + + @Override + public boolean getispositive() { + return isPositive; + } + + public ArrayList getOccuringlocation() { + return occuringlocation; + } + + public String getEvacuateOutcome() { + return evacuateOutcome; + } + + public String getSecureSuppliesOutcome() { + return secureSuppliesOutcome; + } + + public String getDoNothingOutcome() { + return doNothingOutcome; + } +} diff --git a/src/main/java/entities/EventTraderEncounter.java b/src/main/java/entities/EventTraderEncounter.java new file mode 100644 index 000000000..c0e471ae7 --- /dev/null +++ b/src/main/java/entities/EventTraderEncounter.java @@ -0,0 +1,82 @@ +package entities; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * Event of encountering a trader. This is a neutral event that can have positive or negative outcomes + * based on the player's choices. + */ +public class EventTraderEncounter implements Event { + + private final Boolean isPositive; + private final ArrayList occuringlocation; + private final String description; + private final Map choices; + private double probability; + private final String tradeOutcomeSuccess; + private final String tradeOutcomeScam; + private final String ignoreOutcome; + + public EventTraderEncounter() { + this.isPositive = true; // Initially positive as it provides opportunities, but risks exist + this.occuringlocation = new ArrayList<>(); + occuringlocation.add("Plain"); + occuringlocation.add("City"); + occuringlocation.add("Desert"); + + this.description = "You come across a wandering trader offering supplies in exchange for some of your " + + "resources. The trader seems trustworthy, but appearances can be deceiving. What will you do?"; + this.choices = new HashMap<>(); + choices.put(Entityconstants.FIRSTCHOICE, "Trade with the trader"); + choices.put(Entityconstants.SECONDCHOICE, "Refuse and move on"); + choices.put(Entityconstants.THIRDCHOICE, "Attempt to rob the trader"); + + this.probability = Entityconstants.COMMONEVENTBASEPROB; + this.tradeOutcomeSuccess = "The trade was successful! You gained valuable supplies."; + this.tradeOutcomeScam = "The trader scammed you, taking your resources and leaving you with nothing."; + this.ignoreOutcome = "You avoided the trader and continued your journey unscathed."; + } + + @Override + public double getprobability() { + return this.probability; + } + + @Override + public void setprobability(double prob) { + this.probability = prob; + } + + @Override + public Map getchoices() { + return this.choices; + } + + @Override + public String getdescription() { + return this.description; + } + + @Override + public boolean getispositive() { + return isPositive; + } + + public ArrayList getOccuringlocation() { + return occuringlocation; + } + + public String getTradeOutcomeSuccess() { + return tradeOutcomeSuccess; + } + + public String getTradeOutcomeScam() { + return tradeOutcomeScam; + } + + public String getIgnoreOutcome() { + return ignoreOutcome; + } +} From efc413d173b88c9d196cf2f1092a292852e50b7e Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Wed, 27 Nov 2024 01:57:24 -0500 Subject: [PATCH 022/154] Modified Entityconstants and RespondInteractor --- src/main/java/entities/Entityconstants.java | 60 +++++-- .../java/entities/EventTraderEncounter.java | 47 ++++-- .../usecases/respond/RespondInteractor.java | 155 +++++++++++------- 3 files changed, 167 insertions(+), 95 deletions(-) diff --git a/src/main/java/entities/Entityconstants.java b/src/main/java/entities/Entityconstants.java index 8281b9fcb..79a4d53dd 100644 --- a/src/main/java/entities/Entityconstants.java +++ b/src/main/java/entities/Entityconstants.java @@ -3,8 +3,7 @@ /** * Constants used in this program. * Notice, by changing these constant, we can alter game dramatically. - * this could be used to achieve game balance. - * as well as for difficulty setting implementation. + * This could be used to achieve game balance as well as for difficulty setting implementation. */ public class Entityconstants { public static final int STARTERFOOD = 100; @@ -19,52 +18,79 @@ public class Entityconstants { public static final double DEFAULTTHREAT = 1; public static final double MAXTEMPDIFF = 50; public static final double MAXTHREATDIFF = 0.5; - // map information and calculation scalar settings. + + // Map information and calculation scalar settings. public static final String ICELAND = "Iceland"; public static final String DESERT = "Desert"; public static final String FOREST = "Forest"; public static final String CITY = "City"; public static final String PLAIN = "Plain"; - // name we gonna use. + + // Name we gonna use. public static final int BIOMERADIUS = 16; - // how the radius is gonna be for each biome, used for map generation. public static final int FIRSTCHOICE = 1; public static final int SECONDCHOICE = 2; public static final int THIRDCHOICE = 3; public static final int FOURTHCHOICE = 4; - // how different choices match their represented int. + + // Base event probability (probability at default at start). public static final double COMMONEVENTBASEPROB = 0.1; public static final double RAREEVENTBASEPROB = 0.03; - // base event probability(probability at default at start) + + // Horde starter setting. public static final int STARTERHORDEMAGNITUDE = 300; public static final int STARTERHORDEDURATION = 10; - // horde starter setting, how in default it should start on + + // Player attribute impacts. public static final int MOBILIZATIONIMPACTSPEED = 10; - // how player attribute mobilization have impact on speed(how many box they move per move) + + // Directions. public static final String UP = "up"; public static final String DOWN = "down"; public static final String LEFT = "left"; public static final String RIGHT = "right"; - // name we use. + + // Firepower calculation settings. public static final int UNARMPEOPLEPOWER = 1; public static final int ARMEDPEOPLEPOWER = 5; - // firepower calculation setting. + + // Ambush constants. public static final int AMBUSHPOWER = 35; public static final int AMBUSHNEGOTIATE = 4; - // for event ambush, what's required firepower to fight back, and required social ability to negotiate etc. public static final int AMBUSHFIGHTSUCCESSRESOURCEFOOD = 15; public static final int AMBUSHFIGHTSUCCESSRESOURCEWATER = 15; public static final int AMBUSHFIGHTSUCCESSRESOURCEPEOPLE = 0; public static final int AMBUSHFIGHTSUCCESSRESOURCEWEAPON = 4; - // for event ambush, resource get for successful fight back. public static final int AMBUSHFAILRESOURCEFOOD = -30; public static final int AMBUSHFAILRESOURCEWATER = -30; public static final int AMBUSHFAILRESOURCEPEOPLE = -5; public static final int AMBUSHFAILRESOURCEWEAPON = -10; - // for event ambush, resource lost for failed. - public static final int ESCAPEMAXDISTANCE = 10; - // for any general escape choice, the distance move randomly at max. - public static final int LENGTHMESSAGECOMMA = 17; + // Flood constants. + public static final int FLOODRESOURCELOSS = -10; + public static final int FLOODSECURELOSS = -5; + public static final int FLOODDOINGNOTHINGLOSS = -20; + + // Blizzard constants. + public static final int BLIZZARDRESOURCELOSSFOOD = -15; + public static final int BLIZZARDRESOURCELOSSWATER = -15; + + // Add these constants under the event-specific section + // TraderEncounter thresholds + public static final int TRADERNEGOTIATE = 5; // Minimum social attribute for successful trading + public static final int TRADERROBBERYPOWER = 30; // Minimum firepower for successful robbery + + // TraderEncounter resource changes + public static final int TRADERTRADEGAINFOOD = 15; // Resources gained from successful trade + public static final int TRADERTRADEGAINWATER = 10; + public static final int TRADERTRADEFAILLOSSFOOD = -5; // Resources lost in trade scam + public static final int TRADERTRADEFAILLOSSWATER = -3; + + public static final int TRADERROBBERYGAINFOOD = 20; // Resources gained from successful robbery + public static final int TRADERROBBERYGAINSUPPLIES = 5; + public static final int TRADERROBBERYFAILLOSSFOOD = -10; // Resources lost in failed robbery + public static final int TRADERROBBERYFAILLOSSPEOPLE = -2; + + public static final int TRADERIGNORELOSS = 0; // No resource changes for ignoring } diff --git a/src/main/java/entities/EventTraderEncounter.java b/src/main/java/entities/EventTraderEncounter.java index c0e471ae7..3e6ceb48f 100644 --- a/src/main/java/entities/EventTraderEncounter.java +++ b/src/main/java/entities/EventTraderEncounter.java @@ -5,38 +5,43 @@ import java.util.Map; /** - * Event of encountering a trader. This is a neutral event that can have positive or negative outcomes - * based on the player's choices. + * Event of a trader encounter. The player can trade, ignore, or rob the trader, + * each leading to specific outcomes. This class is designed to store outcomes + * and allow interaction logic to remain in the use case layer. */ public class EventTraderEncounter implements Event { private final Boolean isPositive; - private final ArrayList occuringlocation; + private final ArrayList occuringLocation; private final String description; private final Map choices; private double probability; private final String tradeOutcomeSuccess; private final String tradeOutcomeScam; private final String ignoreOutcome; + private final String robOutcomeSuccess; + private final String robOutcomeFail; public EventTraderEncounter() { - this.isPositive = true; // Initially positive as it provides opportunities, but risks exist - this.occuringlocation = new ArrayList<>(); - occuringlocation.add("Plain"); - occuringlocation.add("City"); - occuringlocation.add("Desert"); - - this.description = "You come across a wandering trader offering supplies in exchange for some of your " - + "resources. The trader seems trustworthy, but appearances can be deceiving. What will you do?"; + this.isPositive = true; // Positive if trade succeeds, but actions can lead to negative results. + this.occuringLocation = new ArrayList<>(); + occuringLocation.add(Entityconstants.PLAIN); + occuringLocation.add(Entityconstants.CITY); + occuringLocation.add(Entityconstants.DESERT); + + this.description = "You encounter a wandering trader offering supplies in exchange for your resources. " + + "What will you do?"; this.choices = new HashMap<>(); choices.put(Entityconstants.FIRSTCHOICE, "Trade with the trader"); - choices.put(Entityconstants.SECONDCHOICE, "Refuse and move on"); + choices.put(Entityconstants.SECONDCHOICE, "Ignore the trader"); choices.put(Entityconstants.THIRDCHOICE, "Attempt to rob the trader"); - this.probability = Entityconstants.COMMONEVENTBASEPROB; - this.tradeOutcomeSuccess = "The trade was successful! You gained valuable supplies."; + this.probability = Entityconstants.RAREEVENTBASEPROB; + this.tradeOutcomeSuccess = "You traded successfully and gained valuable supplies."; this.tradeOutcomeScam = "The trader scammed you, taking your resources and leaving you with nothing."; - this.ignoreOutcome = "You avoided the trader and continued your journey unscathed."; + this.ignoreOutcome = "You ignored the trader and moved on."; + this.robOutcomeSuccess = "You successfully robbed the trader, taking their supplies."; + this.robOutcomeFail = "The robbery attempt failed, and you lost resources in the scuffle."; } @Override @@ -64,8 +69,8 @@ public boolean getispositive() { return isPositive; } - public ArrayList getOccuringlocation() { - return occuringlocation; + public ArrayList getOccuringLocation() { + return occuringLocation; } public String getTradeOutcomeSuccess() { @@ -79,4 +84,12 @@ public String getTradeOutcomeScam() { public String getIgnoreOutcome() { return ignoreOutcome; } + + public String getRobOutcomeSuccess() { + return robOutcomeSuccess; + } + + public String getRobOutcomeFail() { + return robOutcomeFail; + } } diff --git a/src/main/java/usecases/respond/RespondInteractor.java b/src/main/java/usecases/respond/RespondInteractor.java index 22136a7ba..b65d1bda5 100644 --- a/src/main/java/usecases/respond/RespondInteractor.java +++ b/src/main/java/usecases/respond/RespondInteractor.java @@ -3,9 +3,14 @@ import entities.Entityconstants; import entities.Event; import entities.EventAmbush; +import entities.EventBlizzard; +import entities.EventFlood; +import entities.EventTraderEncounter; import entities.Inventory; import entities.PlayerAttributes; import kotlin.Pair; +import java.util.Random; + /** * Interactor for the response use case, for the event, for the specific choice player provide. @@ -26,78 +31,106 @@ public void execute(RespondInputData inputdata) { final int choice = inputdata.getChoice(); final PlayerAttributes attributes = respondDataAccessObject.getPlayerAttributes(); final Inventory inventory = respondDataAccessObject.getInventory(); + if (event instanceof EventAmbush) { - final Pair info = - ambushevaluator(attributes, choice, inventory, event); - final boolean success = info.getSecond(); - if (success) { - respondOutputBoundary.prepareSuccessView(info.getFirst()); - } - else { - respondOutputBoundary.prepareFailureView("Invalid choice"); - } + final Pair info = ambushevaluator(attributes, choice, inventory, event); + processResult(info); + } else if (event instanceof EventFlood) { + final Pair info = floodevaluator(choice, inventory, event); + processResult(info); + } else if (event instanceof EventBlizzard) { + final Pair info = blizzardEvaluator(inventory, event); + processResult(info); + } else if (event instanceof EventTraderEncounter) { + final Pair info = traderEvaluator(attributes, choice, inventory, event); + processResult(info); + } + } + + private void processResult(Pair info) { + if (info.getSecond()) { + respondOutputBoundary.prepareSuccessView(info.getFirst()); + } else { + respondOutputBoundary.prepareFailureView("Invalid choice"); } } - private Pair ambushevaluator(PlayerAttributes attributes, - int choice, - Inventory inventory, - Event event) { - String message = ""; - int foodchange = 0; - int waterchange = 0; - int weaponchange = 0; - int peoplechange = 0; + private Pair floodevaluator(int choice, Inventory inventory, Event event) { + String message; + int foodChange = 0; boolean success = true; - final EventAmbush ambush = (EventAmbush) event; + + EventFlood flood = (EventFlood) event; if (choice == Entityconstants.FIRSTCHOICE) { - if (inventory.getfirepower() >= Entityconstants.AMBUSHPOWER) { - foodchange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; - waterchange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; - weaponchange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; - peoplechange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; - message = ambush.getFightoutcomesuccess(); - } - else { - foodchange = Entityconstants.AMBUSHFAILRESOURCEFOOD; - waterchange = Entityconstants.AMBUSHFAILRESOURCEWATER; - weaponchange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; - peoplechange = Entityconstants.AMBUSHFAILRESOURCEPEOPLE; - message = ambush.getFightoutcomefailed(); - } - } - else if (choice == Entityconstants.SECONDCHOICE) { - foodchange = Entityconstants.AMBUSHFAILRESOURCEFOOD; - waterchange = Entityconstants.AMBUSHFAILRESOURCEWATER; - weaponchange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; - message = ambush.getPayoutcome(); + foodChange = Entityconstants.FLOODRESOURCELOSS; + message = flood.getEvacuateOutcome(); + } else if (choice == Entityconstants.SECONDCHOICE) { + foodChange = Entityconstants.FLOODSECURELOSS; + message = flood.getSecureSuppliesOutcome(); + } else if (choice == Entityconstants.THIRDCHOICE) { + foodChange = Entityconstants.FLOODDOINGNOTHINGLOSS; + message = flood.getDoNothingOutcome(); + } else { + success = false; + message = "Invalid choice."; } - else if (choice == Entityconstants.THIRDCHOICE) { - if (attributes.getSocial() < Entityconstants.AMBUSHNEGOTIATE) { - foodchange = Entityconstants.AMBUSHFAILRESOURCEFOOD; - waterchange = Entityconstants.AMBUSHFAILRESOURCEWATER; - weaponchange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; - message = ambush.getNegotiatefailedoutcome(); + + inventory.changeFood(foodChange); + return new Pair<>(new RespondOutputData(message, foodChange, 0, 0, 0, ""), success); + } + + private Pair blizzardEvaluator(Inventory inventory, Event event) { + String message = ((EventBlizzard) event).getOutcome(); + inventory.changeFood(Entityconstants.BLIZZARDRESOURCELOSSFOOD); + inventory.changeWater(Entityconstants.BLIZZARDRESOURCELOSSWATER); + return new Pair<>(new RespondOutputData(message, -15, -15, 0, 0, ""), true); + } + + private Pair traderEvaluator(PlayerAttributes attributes, int choice, Inventory inventory, Event event) { + String message; + int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; + boolean success = true; + + EventTraderEncounter trader = (EventTraderEncounter) event; + if (choice == Entityconstants.FIRSTCHOICE) { + // Trading logic based on negotiation skill + if (attributes.getSocial() >= Entityconstants.TRADERNEGOTIATE) { + foodChange = Entityconstants.TRADERTRADEGAINFOOD; + waterChange = Entityconstants.TRADERTRADEGAINWATER; + message = trader.getTradeOutcomeSuccess(); + } else { + foodChange = Entityconstants.TRADERTRADEFAILLOSSFOOD; + waterChange = Entityconstants.TRADERTRADEFAILLOSSWATER; + message = trader.getTradeOutcomeScam(); } - else { - message = ambush.getNegotiatesuccessoutcome(); + } else if (choice == Entityconstants.SECONDCHOICE) { + // Ignore the trader, no resource changes + message = trader.getIgnoreOutcome(); + } else if (choice == Entityconstants.THIRDCHOICE) { + // Robbery logic based on firepower + if (inventory.getfirepower() >= Entityconstants.TRADERROBBERYPOWER) { + foodChange = Entityconstants.TRADERROBBERYGAINFOOD; + suppliesChange = Entityconstants.TRADERROBBERYGAINSUPPLIES; + message = trader.getRobOutcomeSuccess(); + } else { + foodChange = Entityconstants.TRADERROBBERYFAILLOSSFOOD; + peopleChange = Entityconstants.TRADERROBBERYFAILLOSSPEOPLE; + message = trader.getRobOutcomeFail(); } - } - else { + } else { + // Invalid choice handling success = false; + message = "Invalid choice."; } - final String inventorymessage = inventory.generateResourceChangeMessage( - foodchange, waterchange, weaponchange, peoplechange); - inventory.changeFood(foodchange); - inventory.changeWater(waterchange); - inventory.changeweapon(weaponchange); - inventory.changePeople(peoplechange); - return new Pair<>( - new RespondOutputData( - message, foodchange, waterchange, weaponchange, peoplechange, inventorymessage - ), - success - ); + // Apply changes to the inventory + inventory.changeFood(foodChange); + inventory.changeWater(waterChange); + inventory.changeweapon(suppliesChange); + inventory.changePeople(peopleChange); + + // Generate response + return new Pair<>(new RespondOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, ""), success); } + } From 8efe20f4a88abec7997a28b7b2afe09e9ce67fe3 Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Wed, 27 Nov 2024 02:15:47 -0500 Subject: [PATCH 023/154] adding the getPassword method --- data/players.json | 14 ++++++++++++++ data/rankings.json | 14 ++++++++++++++ src/main/java/entities/Player.java | 3 +++ .../java/frameworks/database/FileDatabase.java | 4 ++++ .../frameworks/database/JsonPlayerRepository.java | 4 ++++ .../frameworks/database/JsonRankingRepository.java | 4 ++++ 6 files changed, 43 insertions(+) create mode 100644 data/players.json create mode 100644 data/rankings.json create mode 100644 src/main/java/frameworks/database/FileDatabase.java create mode 100644 src/main/java/frameworks/database/JsonPlayerRepository.java create mode 100644 src/main/java/frameworks/database/JsonRankingRepository.java diff --git a/data/players.json b/data/players.json new file mode 100644 index 000000000..f10d68ca0 --- /dev/null +++ b/data/players.json @@ -0,0 +1,14 @@ +{ + "name": "data", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/Adidazdoge/NoteApplication.git" + }, + "private": true +} diff --git a/data/rankings.json b/data/rankings.json new file mode 100644 index 000000000..f10d68ca0 --- /dev/null +++ b/data/rankings.json @@ -0,0 +1,14 @@ +{ + "name": "data", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/Adidazdoge/NoteApplication.git" + }, + "private": true +} diff --git a/src/main/java/entities/Player.java b/src/main/java/entities/Player.java index b66b661c2..04fe62263 100644 --- a/src/main/java/entities/Player.java +++ b/src/main/java/entities/Player.java @@ -55,4 +55,7 @@ public String getUsername() { public boolean validatePassword(String inputPassword) { return this.password.equals(inputPassword); } + + public String getPassword() { + return password; } } diff --git a/src/main/java/frameworks/database/FileDatabase.java b/src/main/java/frameworks/database/FileDatabase.java new file mode 100644 index 000000000..0938786b5 --- /dev/null +++ b/src/main/java/frameworks/database/FileDatabase.java @@ -0,0 +1,4 @@ +package frameworks.database; + +public class FileDatabase { +} diff --git a/src/main/java/frameworks/database/JsonPlayerRepository.java b/src/main/java/frameworks/database/JsonPlayerRepository.java new file mode 100644 index 000000000..7ec3d8354 --- /dev/null +++ b/src/main/java/frameworks/database/JsonPlayerRepository.java @@ -0,0 +1,4 @@ +package frameworks.database; + +public class JsonPlayerRepository { +} diff --git a/src/main/java/frameworks/database/JsonRankingRepository.java b/src/main/java/frameworks/database/JsonRankingRepository.java new file mode 100644 index 000000000..5041a26e1 --- /dev/null +++ b/src/main/java/frameworks/database/JsonRankingRepository.java @@ -0,0 +1,4 @@ +package frameworks.database; + +public class JsonRankingRepository { +} From e477760f85dadf1cad5bd470123c09a3e2dad80f Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Wed, 27 Nov 2024 02:16:48 -0500 Subject: [PATCH 024/154] Add Maven configuration in pom.xml with dependencies for JSON processing and testing --- pom.xml | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 527f61e36..6f5d9ac71 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ okhttp 4.12.0 + junit junit @@ -28,9 +29,23 @@ test - - + + com.fasterxml.jackson.core + jackson-databind + 2.15.2 + + + com.fasterxml.jackson.core + jackson-core + 2.15.2 + + + com.fasterxml.jackson.core + jackson-annotations + 2.15.2 + + 11 @@ -38,4 +53,4 @@ UTF-8 - \ No newline at end of file + From face66155691b39694e3b89c59a179947fdd67cc Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Wed, 27 Nov 2024 02:18:54 -0500 Subject: [PATCH 025/154] Add initial players.json file for storing player data --- data/players.json | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/data/players.json b/data/players.json index f10d68ca0..869394386 100644 --- a/data/players.json +++ b/data/players.json @@ -1,14 +1,12 @@ -{ - "name": "data", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" +[ + { + "id": "1", + "username": "user1", + "password": "password1" }, - "repository": { - "type": "git", - "url": "https://github.com/Adidazdoge/NoteApplication.git" - }, - "private": true -} + { + "id": "2", + "username": "user2", + "password": "password2" + } +] From 29a033a2ae46aea9935b0d689e1b029a963ea244 Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Wed, 27 Nov 2024 02:19:49 -0500 Subject: [PATCH 026/154] Add initial rankings.json file for storing ranking data --- data/rankings.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/data/rankings.json b/data/rankings.json index f10d68ca0..bfe0b9545 100644 --- a/data/rankings.json +++ b/data/rankings.json @@ -1,14 +1,14 @@ -{ - "name": "data", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" +[ + { + "playerId": "1", + "score": 200, + "daysSurvived": 30, + "won": true }, - "repository": { - "type": "git", - "url": "https://github.com/Adidazdoge/NoteApplication.git" - }, - "private": true -} + { + "playerId": "2", + "score": 150, + "daysSurvived": 20, + "won": false + } +] From a80c5e85bc0622c644721fe41b40cfba549e2aaf Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Wed, 27 Nov 2024 02:21:24 -0500 Subject: [PATCH 027/154] Implement FileDatabase utility class for reading and writing JSON data --- .../frameworks/database/FileDatabase.java | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/main/java/frameworks/database/FileDatabase.java b/src/main/java/frameworks/database/FileDatabase.java index 0938786b5..3d5876161 100644 --- a/src/main/java/frameworks/database/FileDatabase.java +++ b/src/main/java/frameworks/database/FileDatabase.java @@ -1,4 +1,57 @@ package frameworks.database; -public class FileDatabase { +import java.io.File; +import java.io.IOException; +import java.util.List; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * A utility class for managing a file-based JSON database. + * This class allows reading and writing a list of data objects to a JSON file + * specified by the user. It uses Jackson for JSON serialization and deserialization. + * + * @param The type of the data objects that will be stored in the database. + */ +public class FileDatabase { + private final ObjectMapper objectMapper = new ObjectMapper(); + private final String filePath; + private final TypeReference> typeReference; + + /** + * Constructs a new FileDatabase instance. + * + * @param filePath The path to the JSON file that will be used for storage. + * @param typeReference A TypeReference to handle generic type information for deserialization. + */ + public FileDatabase(String filePath, TypeReference> typeReference) { + this.filePath = filePath; + this.typeReference = typeReference; + } + + /** + * Loads data from the JSON file. + * + * @return A list of data objects read from the file. If the file does not exist, + * an empty list is returned. + * @throws IOException If the file cannot be read or parsed. + */ + public List load() throws IOException { + File file = new File(filePath); + if (!file.exists()) { + return List.of(); + } + return objectMapper.readValue(file, typeReference); + } + + /** + * Saves data to the JSON file. + * + * @param data The list of data objects to save to the file. + * @throws IOException If the file cannot be written. + */ + public void save(List data) throws IOException { + objectMapper.writerWithDefaultPrettyPrinter().writeValue(new File(filePath), data); + } } From 7b84548a697cea0237a357f910d7d73948578dc8 Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Wed, 27 Nov 2024 02:21:59 -0500 Subject: [PATCH 028/154] Implement JsonPlayerRepository for managing player data using JSON files --- .../database/JsonPlayerRepository.java | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/main/java/frameworks/database/JsonPlayerRepository.java b/src/main/java/frameworks/database/JsonPlayerRepository.java index 7ec3d8354..35660540c 100644 --- a/src/main/java/frameworks/database/JsonPlayerRepository.java +++ b/src/main/java/frameworks/database/JsonPlayerRepository.java @@ -1,4 +1,45 @@ package frameworks.database; -public class JsonPlayerRepository { +import java.io.IOException; +import java.util.List; + +import com.fasterxml.jackson.core.type.TypeReference; +import entities.Player; +import interface_adapters.gateways.PlayerRepository; + +/** + * A JSON-based implementation of the PlayerRepository interface. + */ +public class JsonPlayerRepository implements PlayerRepository { + private final FileDatabase database; + private List players; + + public JsonPlayerRepository(String filePath) throws IOException { + this.database = new FileDatabase<>(filePath, new TypeReference>() {}); + this.players = database.load(); + } + + @Override + public Player findByUsername(String username) { + return players.stream() + .filter(player -> player.getUsername().equals(username)) + .findFirst() + .orElse(null); + } + + @Override + public boolean isUsernameDuplicate(String username) { + return findByUsername(username) != null; + } + + @Override + public void addPlayer(Player player) { + players.add(player); + try { + database.save(players); + } + catch (IOException ioException) { + ioException.printStackTrace(); + } + } } From f8eaf8d03531c906158f5c1912deb8c1d6eef0ba Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Wed, 27 Nov 2024 02:22:29 -0500 Subject: [PATCH 029/154] Implement JsonRankingRepository for managing ranking data using JSON files --- .../database/JsonRankingRepository.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/frameworks/database/JsonRankingRepository.java b/src/main/java/frameworks/database/JsonRankingRepository.java index 5041a26e1..153823fbc 100644 --- a/src/main/java/frameworks/database/JsonRankingRepository.java +++ b/src/main/java/frameworks/database/JsonRankingRepository.java @@ -1,4 +1,42 @@ package frameworks.database; -public class JsonRankingRepository { +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.core.type.TypeReference; +import entities.RankingEntry; +import interface_adapters.gateways.RankingRepository; + +/** + * A JSON-based implementation of the RankingRepository interface. + */ +public class JsonRankingRepository implements RankingRepository { + private final FileDatabase database; + private List rankings; + + public JsonRankingRepository(String filePath) throws IOException { + this.database = new FileDatabase<>(filePath, new TypeReference>() {}); + this.rankings = database.load(); + } + + @Override + public List getAllRankings() { + return new ArrayList<>(rankings); + } + /** + * Adds a new ranking entry to the repository and persists it to the database. + * + * @param rankingEntry The {@link RankingEntry} object to be added to the rankings list. + */ + + public void addRanking(RankingEntry rankingEntry) { + rankings.add(rankingEntry); + try { + database.save(rankings); + } + catch (IOException ioException) { + ioException.printStackTrace(); + } + } } From c2d81027a84559306aeda11305cec28f36cdb186 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Wed, 27 Nov 2024 17:16:51 -0500 Subject: [PATCH 030/154] Change the structure of the login/signup --- ...ityconstants.java => EntityConstants.java} | 4 +- src/main/java/entities/EventAmbush.java | 8 +-- src/main/java/entities/EventBlizzard.java | 2 +- .../java/entities/EventSurvivorJoins.java | 6 +- src/main/java/entities/Horde.java | 4 +- src/main/java/entities/Inventory.java | 14 ++--- src/main/java/entities/LocationCity.java | 20 +++---- src/main/java/entities/LocationDesert.java | 20 +++---- src/main/java/entities/LocationForest.java | 20 +++---- src/main/java/entities/LocationIceland.java | 20 +++---- src/main/java/entities/LocationPlain.java | 20 +++---- src/main/java/entities/MapFactory.java | 14 ++--- src/main/java/entities/PlayerAttributes.java | 2 +- src/main/java/entities/PlayerInfo.java | 54 ------------------ .../{Player.java => PlayerLogin.java} | 4 +- ...kingEntry.java => PlayerRankingEntry.java} | 4 +- .../database/InMemoryPlayerRepository.java | 16 +++--- .../database/InMemoryRankingRepository.java | 10 ++-- .../controllers/LoginController.java | 34 +++++------ .../controllers/RankingController.java | 44 +++++++-------- .../controllers/SignupController.java | 37 ++++++------ .../gateways/PlayerRepository.java | 8 +-- .../gateways/RankingRepository.java | 4 +- .../presenters/LoginPresenter.java | 42 ++++++++++++++ .../presenters/RankingPresenter.java | 56 +++++++++++++------ .../presenters/SignupPresenter.java | 42 ++++++++++++++ .../login/LoginDataAccessInterface.java | 24 ++++++++ .../usecases/login/LoginInputBoundary.java | 14 +++++ ...{LoginRequest.java => LoginInputData.java} | 16 +++--- .../java/usecases/login/LoginInteractor.java | 46 +++++++++++++++ .../usecases/login/LoginOutputBoundary.java | 21 +++++++ .../java/usecases/login/LoginOutputData.java | 41 ++++++++++++++ .../java/usecases/login/LoginResponse.java | 52 ----------------- .../java/usecases/login/LoginUseCase.java | 39 ------------- .../java/usecases/move/MoveInteractor.java | 20 +++---- .../usecases/ranking/RankingComparator.java | 39 ------------- .../ranking/RankingDataAccessInterface.java | 26 +++++++++ .../ranking/RankingInputBoundary.java | 14 +++++ ...kingRequest.java => RankingInputData.java} | 12 ++-- .../usecases/ranking/RankingInteractor.java | 56 +++++++++++++++++++ .../ranking/RankingOutputBoundary.java | 21 +++++++ .../usecases/ranking/RankingOutputData.java | 31 ++++++++++ .../usecases/ranking/RankingResponse.java | 32 ----------- .../java/usecases/ranking/RankingUseCase.java | 41 -------------- .../usecases/respond/RespondInteractor.java | 40 ++++++------- .../signup/SignupDataAccessInterface.java | 23 ++++++++ .../usecases/signup/SignupInputBoundary.java | 14 +++++ .../java/usecases/signup/SignupInputData.java | 40 +++++++++++++ .../usecases/signup/SignupInteractor.java | 52 +++++++++++++++++ .../usecases/signup/SignupOutputBoundary.java | 21 +++++++ .../usecases/signup/SignupOutputData.java | 41 ++++++++++++++ .../java/usecases/signup/SignupUseCase.java | 39 ------------- 52 files changed, 807 insertions(+), 517 deletions(-) rename src/main/java/entities/{Entityconstants.java => EntityConstants.java} (99%) delete mode 100644 src/main/java/entities/PlayerInfo.java rename src/main/java/entities/{Player.java => PlayerLogin.java} (94%) rename src/main/java/entities/{RankingEntry.java => PlayerRankingEntry.java} (89%) create mode 100644 src/main/java/interface_adapters/presenters/LoginPresenter.java create mode 100644 src/main/java/interface_adapters/presenters/SignupPresenter.java create mode 100644 src/main/java/usecases/login/LoginDataAccessInterface.java create mode 100644 src/main/java/usecases/login/LoginInputBoundary.java rename src/main/java/usecases/login/{LoginRequest.java => LoginInputData.java} (56%) create mode 100644 src/main/java/usecases/login/LoginInteractor.java create mode 100644 src/main/java/usecases/login/LoginOutputBoundary.java create mode 100644 src/main/java/usecases/login/LoginOutputData.java delete mode 100644 src/main/java/usecases/login/LoginResponse.java delete mode 100644 src/main/java/usecases/login/LoginUseCase.java delete mode 100644 src/main/java/usecases/ranking/RankingComparator.java create mode 100644 src/main/java/usecases/ranking/RankingDataAccessInterface.java create mode 100644 src/main/java/usecases/ranking/RankingInputBoundary.java rename src/main/java/usecases/ranking/{RankingRequest.java => RankingInputData.java} (51%) create mode 100644 src/main/java/usecases/ranking/RankingInteractor.java create mode 100644 src/main/java/usecases/ranking/RankingOutputBoundary.java create mode 100644 src/main/java/usecases/ranking/RankingOutputData.java delete mode 100644 src/main/java/usecases/ranking/RankingResponse.java delete mode 100644 src/main/java/usecases/ranking/RankingUseCase.java create mode 100644 src/main/java/usecases/signup/SignupDataAccessInterface.java create mode 100644 src/main/java/usecases/signup/SignupInputBoundary.java create mode 100644 src/main/java/usecases/signup/SignupInputData.java create mode 100644 src/main/java/usecases/signup/SignupInteractor.java create mode 100644 src/main/java/usecases/signup/SignupOutputBoundary.java create mode 100644 src/main/java/usecases/signup/SignupOutputData.java delete mode 100644 src/main/java/usecases/signup/SignupUseCase.java diff --git a/src/main/java/entities/Entityconstants.java b/src/main/java/entities/EntityConstants.java similarity index 99% rename from src/main/java/entities/Entityconstants.java rename to src/main/java/entities/EntityConstants.java index 8281b9fcb..f1f4429e1 100644 --- a/src/main/java/entities/Entityconstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -6,7 +6,7 @@ * this could be used to achieve game balance. * as well as for difficulty setting implementation. */ -public class Entityconstants { +public class EntityConstants { public static final int STARTERFOOD = 100; public static final int STARTERWATER = 100; public static final int STARTWEAPON = 5; @@ -65,6 +65,4 @@ public class Entityconstants { public static final int ESCAPEMAXDISTANCE = 10; // for any general escape choice, the distance move randomly at max. public static final int LENGTHMESSAGECOMMA = 17; - - } diff --git a/src/main/java/entities/EventAmbush.java b/src/main/java/entities/EventAmbush.java index 734a4e3b0..a2feb12d7 100644 --- a/src/main/java/entities/EventAmbush.java +++ b/src/main/java/entities/EventAmbush.java @@ -33,10 +33,10 @@ public EventAmbush() { this.description = "Your group is ambushed by a small band of desperate bandits demanding your " + "food supplies. Their ragged appearance suggests they're struggling to survive. What will you do?"; this.choices = new HashMap<>(); - choices.put(Entityconstants.FIRSTCHOICE, "Fight back"); - choices.put(Entityconstants.SECONDCHOICE, "Pay the bandits"); - choices.put(Entityconstants.THIRDCHOICE, "Negotiate"); - this.probability = Entityconstants.COMMONEVENTBASEPROB; + choices.put(EntityConstants.FIRSTCHOICE, "Fight back"); + choices.put(EntityConstants.SECONDCHOICE, "Pay the bandits"); + choices.put(EntityConstants.THIRDCHOICE, "Negotiate"); + this.probability = EntityConstants.COMMONEVENTBASEPROB; this.fightoutcomesuccess = "You successfully beat the bandits and secured their supplies."; this.fightoutcomefailed = "You fought hard but were overpowered, losing some supplies."; this.payoutcome = "You handed over some of your food to avoid conflict with the bandits."; diff --git a/src/main/java/entities/EventBlizzard.java b/src/main/java/entities/EventBlizzard.java index 649b4f12b..f4b30faa4 100644 --- a/src/main/java/entities/EventBlizzard.java +++ b/src/main/java/entities/EventBlizzard.java @@ -27,7 +27,7 @@ public EventBlizzard() { this.description = "A harsh blizzard strikes, blanketing the area in ice and snow. The biting cold " + "and lack of visibility make travel dangerous, and hunger begins to take its toll"; this.choices = new HashMap<>(); - this.probability = Entityconstants.COMMONEVENTBASEPROB; + this.probability = EntityConstants.COMMONEVENTBASEPROB; this.outcome = "Due to cold, your group had to consume more food"; } diff --git a/src/main/java/entities/EventSurvivorJoins.java b/src/main/java/entities/EventSurvivorJoins.java index 6487d7096..c0d0f5c9f 100644 --- a/src/main/java/entities/EventSurvivorJoins.java +++ b/src/main/java/entities/EventSurvivorJoins.java @@ -31,9 +31,9 @@ public EventSurvivorJoins() { this.description = "You encounter a small group of survivors who ask to join your group. They appear skilled " + "but wary. What will you do?"; this.choices = new HashMap<>(); - choices.put(Entityconstants.FIRSTCHOICE, "Accept them into the group"); - choices.put(Entityconstants.SECONDCHOICE, "Politely reject them"); - this.probability = Entityconstants.COMMONEVENTBASEPROB; + choices.put(EntityConstants.FIRSTCHOICE, "Accept them into the group"); + choices.put(EntityConstants.SECONDCHOICE, "Politely reject them"); + this.probability = EntityConstants.COMMONEVENTBASEPROB; this.acceptoutcome = "You've accept them into the group"; this.rejectoutcome = "You've reject them into the group"; this.roboutcomesuccess = "You've robbed the survivor, they dear not to fight back as your group overpowered" diff --git a/src/main/java/entities/Horde.java b/src/main/java/entities/Horde.java index 15b5808b3..682133fdf 100644 --- a/src/main/java/entities/Horde.java +++ b/src/main/java/entities/Horde.java @@ -9,8 +9,8 @@ public class Horde { private double duration; public Horde() { - this.magnitude = Entityconstants.STARTERHORDEMAGNITUDE; - this.duration = Entityconstants.STARTERHORDEDURATION; + this.magnitude = EntityConstants.STARTERHORDEMAGNITUDE; + this.duration = EntityConstants.STARTERHORDEDURATION; } public double getDuration() { diff --git a/src/main/java/entities/Inventory.java b/src/main/java/entities/Inventory.java index 0528fe6a5..54557eff5 100644 --- a/src/main/java/entities/Inventory.java +++ b/src/main/java/entities/Inventory.java @@ -11,10 +11,10 @@ public class Inventory { private int people; public Inventory() { - this.food = Entityconstants.STARTERFOOD; - this.water = Entityconstants.STARTERWATER; - this.weapon = Entityconstants.STARTWEAPON; - this.people = Entityconstants.STARTERPEOPLE; + this.food = EntityConstants.STARTERFOOD; + this.water = EntityConstants.STARTERWATER; + this.weapon = EntityConstants.STARTWEAPON; + this.people = EntityConstants.STARTERPEOPLE; } public int getFood() { @@ -76,8 +76,8 @@ public double getfirepower() { final int unarmedPeople = people - pairs; // Firepower: each pair contributes 5, and each unarmed person contributes 1 - return (pairs * Entityconstants.ARMEDPEOPLEPOWER) - + unarmedPeople * Entityconstants.UNARMPEOPLEPOWER; + return (pairs * EntityConstants.ARMEDPEOPLEPOWER) + + unarmedPeople * EntityConstants.UNARMPEOPLEPOWER; } /** @@ -114,7 +114,7 @@ private boolean appendChange(final StringBuilder message, final String resourceN boolean ans = false; if (change != 0) { - if (message.length() > Entityconstants.LENGTHMESSAGECOMMA) { + if (message.length() > EntityConstants.LENGTHMESSAGECOMMA) { message.append(", "); } if (change > 0) { diff --git a/src/main/java/entities/LocationCity.java b/src/main/java/entities/LocationCity.java index 8d4cc4b44..4d05d8e54 100644 --- a/src/main/java/entities/LocationCity.java +++ b/src/main/java/entities/LocationCity.java @@ -12,11 +12,11 @@ public class LocationCity implements Location { private double threat; public LocationCity(int dist) { - this.foodresource = Entityconstants.STARTERRESOURCESCALAR; - this.waterresource = Entityconstants.STARTERRESOURCESCALAR; + this.foodresource = EntityConstants.STARTERRESOURCESCALAR; + this.waterresource = EntityConstants.STARTERRESOURCESCALAR; this.weaponresource = getsetweaponresourceavailable(dist); this.peopleresource = getsetpeopleresourceavailable(dist); - this.temperature = Entityconstants.STARTERRESOURCESCALAR; + this.temperature = EntityConstants.STARTERRESOURCESCALAR; this.threat = getsetthreatlevel(dist); } @@ -32,7 +32,7 @@ public Double gettemperature() { @Override public Double getsetpeopleresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + return EntityConstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); } @Override @@ -62,7 +62,7 @@ public Double getwaterresourceavailable() { @Override public Double getsetweaponresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + return EntityConstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); } @Override @@ -72,20 +72,20 @@ public Double getweaponresourceavailable() { @Override public void decreaseresourceavailable() { - this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; - this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; - this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + this.foodresource = this.foodresource * EntityConstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * EntityConstants.RESOUCEDECREASERATIO; + this.weaponresource = this.weaponresource * EntityConstants.RESOUCEDECREASERATIO; } @Override public void decreaserepeopleavailable() { - this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * EntityConstants.RESOUCEDECREASERATIO; } @Override public Double getsetthreatlevel(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + return EntityConstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); } @Override diff --git a/src/main/java/entities/LocationDesert.java b/src/main/java/entities/LocationDesert.java index fe0f0aef2..d71c1e766 100644 --- a/src/main/java/entities/LocationDesert.java +++ b/src/main/java/entities/LocationDesert.java @@ -12,17 +12,17 @@ public class LocationDesert implements Location { private final double threat; public LocationDesert(int dist) { - this.foodresource = Entityconstants.STARTERRESOURCESCALAR; + this.foodresource = EntityConstants.STARTERRESOURCESCALAR; this.waterresource = getsetwaterresourceavailable(dist); - this.weaponresource = Entityconstants.STARTERRESOURCESCALAR; + this.weaponresource = EntityConstants.STARTERRESOURCESCALAR; this.peopleresource = getsetpeopleresourceavailable(dist); this.temperature = getsettemperature(dist); - this.threat = Entityconstants.STARTERRESOURCESCALAR; + this.threat = EntityConstants.STARTERRESOURCESCALAR; } @Override public Double getsettemperature(int dist) { - return Entityconstants.DEFAULTTEMP + (Entityconstants.MAXTEMPDIFF * (1 / (dist + 1))); + return EntityConstants.DEFAULTTEMP + (EntityConstants.MAXTEMPDIFF * (1 / (dist + 1))); } @Override @@ -32,7 +32,7 @@ public Double gettemperature() { @Override public Double getsetpeopleresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); + return EntityConstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); } @Override @@ -52,7 +52,7 @@ public Double getfoodresourceavailable() { @Override public Double getsetwaterresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); + return EntityConstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); } @Override @@ -72,14 +72,14 @@ public Double getweaponresourceavailable() { @Override public void decreaseresourceavailable() { - this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; - this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; - this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + this.foodresource = this.foodresource * EntityConstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * EntityConstants.RESOUCEDECREASERATIO; + this.weaponresource = this.weaponresource * EntityConstants.RESOUCEDECREASERATIO; } @Override public void decreaserepeopleavailable() { - this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * EntityConstants.RESOUCEDECREASERATIO; } @Override diff --git a/src/main/java/entities/LocationForest.java b/src/main/java/entities/LocationForest.java index add4c9ec2..e940de008 100644 --- a/src/main/java/entities/LocationForest.java +++ b/src/main/java/entities/LocationForest.java @@ -14,10 +14,10 @@ public class LocationForest implements Location { public LocationForest(int dist) { this.foodresource = getsetfoodresourceavailable(dist); this.waterresource = getsetwaterresourceavailable(dist); - this.weaponresource = Entityconstants.STARTERRESOURCESCALAR; - this.peopleresource = Entityconstants.STARTERRESOURCESCALAR; - this.temperature = Entityconstants.STARTERRESOURCESCALAR; - this.threat = Entityconstants.STARTERRESOURCESCALAR; + this.weaponresource = EntityConstants.STARTERRESOURCESCALAR; + this.peopleresource = EntityConstants.STARTERRESOURCESCALAR; + this.temperature = EntityConstants.STARTERRESOURCESCALAR; + this.threat = EntityConstants.STARTERRESOURCESCALAR; } @Override @@ -42,7 +42,7 @@ public Double getpeopleresourceavailable() { @Override public Double getsetfoodresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + return EntityConstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); } @Override @@ -52,7 +52,7 @@ public Double getfoodresourceavailable() { @Override public Double getsetwaterresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + return EntityConstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); } @Override @@ -72,14 +72,14 @@ public Double getweaponresourceavailable() { @Override public void decreaseresourceavailable() { - this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; - this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; - this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + this.foodresource = this.foodresource * EntityConstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * EntityConstants.RESOUCEDECREASERATIO; + this.weaponresource = this.weaponresource * EntityConstants.RESOUCEDECREASERATIO; } @Override public void decreaserepeopleavailable() { - this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * EntityConstants.RESOUCEDECREASERATIO; } @Override diff --git a/src/main/java/entities/LocationIceland.java b/src/main/java/entities/LocationIceland.java index 60ba2507d..78a37368a 100644 --- a/src/main/java/entities/LocationIceland.java +++ b/src/main/java/entities/LocationIceland.java @@ -12,9 +12,9 @@ public class LocationIceland implements Location { private final double threat; public LocationIceland(int dist) { - this.foodresource = Entityconstants.STARTERRESOURCESCALAR; + this.foodresource = EntityConstants.STARTERRESOURCESCALAR; this.waterresource = getsetwaterresourceavailable(dist); - this.weaponresource = Entityconstants.STARTERRESOURCESCALAR; + this.weaponresource = EntityConstants.STARTERRESOURCESCALAR; this.peopleresource = getsetpeopleresourceavailable(dist); this.temperature = getsettemperature(dist); this.threat = getsetthreatlevel(dist); @@ -22,7 +22,7 @@ public LocationIceland(int dist) { @Override public Double getsettemperature(int dist) { - return Entityconstants.DEFAULTTEMP - (Entityconstants.MAXTEMPDIFF * (1 / (dist + 1))); + return EntityConstants.DEFAULTTEMP - (EntityConstants.MAXTEMPDIFF * (1 / (dist + 1))); } @Override @@ -32,7 +32,7 @@ public Double gettemperature() { @Override public Double getsetpeopleresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); + return EntityConstants.STARTERRESOURCESCALAR - (1 / (dist + 1)); } @Override @@ -52,7 +52,7 @@ public Double getfoodresourceavailable() { @Override public Double getsetwaterresourceavailable(int dist) { - return Entityconstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); + return EntityConstants.STARTERRESOURCESCALAR + (1 / (dist + 1)); } @Override @@ -72,19 +72,19 @@ public Double getweaponresourceavailable() { @Override public void decreaseresourceavailable() { - this.foodresource = this.foodresource * Entityconstants.RESOUCEDECREASERATIO; - this.waterresource = this.waterresource * Entityconstants.RESOUCEDECREASERATIO; - this.weaponresource = this.weaponresource * Entityconstants.RESOUCEDECREASERATIO; + this.foodresource = this.foodresource * EntityConstants.RESOUCEDECREASERATIO; + this.waterresource = this.waterresource * EntityConstants.RESOUCEDECREASERATIO; + this.weaponresource = this.weaponresource * EntityConstants.RESOUCEDECREASERATIO; } @Override public void decreaserepeopleavailable() { - this.peopleresource = this.peopleresource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleresource = this.peopleresource * EntityConstants.RESOUCEDECREASERATIO; } @Override public Double getsetthreatlevel(int dist) { - return Entityconstants.STARTERRESOURCESCALAR - (Entityconstants.MAXTHREATDIFF / (dist + 1)); + return EntityConstants.STARTERRESOURCESCALAR - (EntityConstants.MAXTHREATDIFF / (dist + 1)); } @Override diff --git a/src/main/java/entities/LocationPlain.java b/src/main/java/entities/LocationPlain.java index 73569267f..408ff820c 100644 --- a/src/main/java/entities/LocationPlain.java +++ b/src/main/java/entities/LocationPlain.java @@ -12,12 +12,12 @@ public class LocationPlain implements Location { private final double threat; public LocationPlain() { - this.foodResource = Entityconstants.STARTERRESOURCESCALAR; - this.waterResource = Entityconstants.STARTERRESOURCESCALAR; - this.weaponResource = Entityconstants.STARTERRESOURCESCALAR; - this.peopleResource = Entityconstants.STARTERRESOURCESCALAR; - this.temperature = Entityconstants.DEFAULTTEMP; - this.threat = Entityconstants.DEFAULTTHREAT; + this.foodResource = EntityConstants.STARTERRESOURCESCALAR; + this.waterResource = EntityConstants.STARTERRESOURCESCALAR; + this.weaponResource = EntityConstants.STARTERRESOURCESCALAR; + this.peopleResource = EntityConstants.STARTERRESOURCESCALAR; + this.temperature = EntityConstants.DEFAULTTEMP; + this.threat = EntityConstants.DEFAULTTHREAT; } @Override @@ -72,14 +72,14 @@ public Double getweaponresourceavailable() { @Override public void decreaseresourceavailable() { - this.foodResource = this.foodResource * Entityconstants.RESOUCEDECREASERATIO; - this.waterResource = this.waterResource * Entityconstants.RESOUCEDECREASERATIO; - this.weaponResource = this.weaponResource * Entityconstants.RESOUCEDECREASERATIO; + this.foodResource = this.foodResource * EntityConstants.RESOUCEDECREASERATIO; + this.waterResource = this.waterResource * EntityConstants.RESOUCEDECREASERATIO; + this.weaponResource = this.weaponResource * EntityConstants.RESOUCEDECREASERATIO; } @Override public void decreaserepeopleavailable() { - this.peopleResource = this.peopleResource * Entityconstants.RESOUCEDECREASERATIO; + this.peopleResource = this.peopleResource * EntityConstants.RESOUCEDECREASERATIO; } @Override diff --git a/src/main/java/entities/MapFactory.java b/src/main/java/entities/MapFactory.java index bc496db65..546361bdb 100644 --- a/src/main/java/entities/MapFactory.java +++ b/src/main/java/entities/MapFactory.java @@ -34,7 +34,7 @@ public ArrayList>>> getCores( newCore = new AbstractMap.SimpleEntry<>(x, y); validCore = true; for (Map.Entry existingCore : coreCoordinates) { - if (calculateDistance(existingCore, newCore) < Entityconstants.CORERANGE) { + if (calculateDistance(existingCore, newCore) < EntityConstants.CORERANGE) { validCore = false; break; } @@ -98,7 +98,7 @@ private void updateGridWithEnvironment( ) { final String environmentType = environmentEntry.getKey(); final ArrayList> coordinates = environmentEntry.getValue(); - final int radius = Entityconstants.BIOMERADIUS; + final int radius = EntityConstants.BIOMERADIUS; for (Map.Entry coordinate : coordinates) { final int centerX = coordinate.getKey(); final int centerY = coordinate.getValue(); @@ -130,15 +130,15 @@ private void iterateGridWithinRadius( // Helper method to create a Location private Location createLocationByTypeAndDistance(String environmentType, int distance) { switch (environmentType) { - case Entityconstants.CITY: + case EntityConstants.CITY: return new LocationCity(distance); - case Entityconstants.FOREST: + case EntityConstants.FOREST: return new LocationForest(distance); - case Entityconstants.PLAIN: + case EntityConstants.PLAIN: return new LocationPlain(); - case Entityconstants.ICELAND: + case EntityConstants.ICELAND: return new LocationIceland(distance); - case Entityconstants.DESERT: + case EntityConstants.DESERT: return new LocationDesert(distance); default: return new LocationPlain(); diff --git a/src/main/java/entities/PlayerAttributes.java b/src/main/java/entities/PlayerAttributes.java index 959d2dd55..1c875c15a 100644 --- a/src/main/java/entities/PlayerAttributes.java +++ b/src/main/java/entities/PlayerAttributes.java @@ -26,7 +26,7 @@ public class PlayerAttributes { private int generalship; public PlayerAttributes() { - this.points = Entityconstants.STARTERATRIBUTEPOINT; + this.points = EntityConstants.STARTERATRIBUTEPOINT; this.social = 0; this.luck = 0; this.mobilization = 0; diff --git a/src/main/java/entities/PlayerInfo.java b/src/main/java/entities/PlayerInfo.java deleted file mode 100644 index c9216f7fe..000000000 --- a/src/main/java/entities/PlayerInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package entities; - -/** - * Player class of the program, could be used for scoreboard extension of the program, ranked by score & won. - * This classes should only be responsible for keeping and updating the data, not score calculation process. - * The class should only be updating any instance (player of it) once and which is after game ends, not termination! - * The getter might be called multiple time for score board representation. - */ -public class PlayerInfo { - private String name; - private int score; - private int daysSurvived; - private boolean won; - - public PlayerInfo(String name) { - this.name = name; - this.score = 0; - this.daysSurvived = 0; - this.won = false; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getScore() { - return score; - } - - public void setScore(int score) { - this.score = score; - } - - public int getDaysSurvived() { - return daysSurvived; - } - - public void setDaysSurvived(int daysSurvived) { - this.daysSurvived = daysSurvived; - } - - public boolean getWon() { - return won; - } - - public void setWon(boolean won) { - this.won = won; - } - -} diff --git a/src/main/java/entities/Player.java b/src/main/java/entities/PlayerLogin.java similarity index 94% rename from src/main/java/entities/Player.java rename to src/main/java/entities/PlayerLogin.java index b66b661c2..e41b65cff 100644 --- a/src/main/java/entities/Player.java +++ b/src/main/java/entities/PlayerLogin.java @@ -5,7 +5,7 @@ * This entity contains information about the player, such as their ID, username, and password. * The Player class encapsulates the player's identity and authentication logic. */ -public class Player { +public class PlayerLogin { // Unique identifier for the player private final String id; // The player's username @@ -22,7 +22,7 @@ public class Player { * @param username The username chosen by the player for logging into the game. * @param password The player's password for authentication. */ - public Player(String id, String username, String password) { + public PlayerLogin(String id, String username, String password) { this.id = id; this.username = username; this.password = password; diff --git a/src/main/java/entities/RankingEntry.java b/src/main/java/entities/PlayerRankingEntry.java similarity index 89% rename from src/main/java/entities/RankingEntry.java rename to src/main/java/entities/PlayerRankingEntry.java index 39437adb6..df72b29c5 100644 --- a/src/main/java/entities/RankingEntry.java +++ b/src/main/java/entities/PlayerRankingEntry.java @@ -4,7 +4,7 @@ * Represents an entry in the ranking list. * Contains the player's name, score, days survived, and whether they won. */ -public class RankingEntry { +public class PlayerRankingEntry { // Player's username private final String name; // Player's score @@ -22,7 +22,7 @@ public class RankingEntry { * @param daysSurvived The number of days the player survived. * @param won Whether the player won the game. */ - public RankingEntry(String name, int score, int daysSurvived, boolean won) { + public PlayerRankingEntry(String name, int score, int daysSurvived, boolean won) { this.name = name; this.score = score; this.daysSurvived = daysSurvived; diff --git a/src/main/java/frameworks/database/InMemoryPlayerRepository.java b/src/main/java/frameworks/database/InMemoryPlayerRepository.java index c9cd48ae2..e541680f8 100644 --- a/src/main/java/frameworks/database/InMemoryPlayerRepository.java +++ b/src/main/java/frameworks/database/InMemoryPlayerRepository.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.Map; -import entities.Player; +import entities.PlayerLogin; import interface_adapters.gateways.PlayerRepository; /** @@ -14,7 +14,7 @@ * player's username and the value is the Player object. */ public class InMemoryPlayerRepository implements PlayerRepository { - private final Map players = new HashMap<>(); + private final Map players = new HashMap<>(); /** * Constructs an InMemoryPlayerRepository with a predefined set of players. @@ -25,8 +25,8 @@ public class InMemoryPlayerRepository implements PlayerRepository { public InMemoryPlayerRepository() { // todo // Database import - players.put("user1", new Player("1", "user1", "password1")); - players.put("user2", new Player("2", "user2", "password2")); + players.put("user1", new PlayerLogin("1", "user1", "password1")); + players.put("user2", new PlayerLogin("2", "user2", "password2")); } /** @@ -39,7 +39,7 @@ public InMemoryPlayerRepository() { * @return The Player object if found, or null if no player with the given username exists. */ @Override - public Player findByUsername(String username) { + public PlayerLogin findByUsername(String username) { return players.get(username); } @@ -57,10 +57,10 @@ public boolean isUsernameDuplicate(String username) { /** * Update the new player object in Hashmap players. * - * @param player The object for Player. + * @param playerLogin The object for Player. */ @Override - public void addPlayer(Player player) { - players.put(player.getUsername(), player); + public void addPlayer(PlayerLogin playerLogin) { + players.put(playerLogin.getUsername(), playerLogin); } } diff --git a/src/main/java/frameworks/database/InMemoryRankingRepository.java b/src/main/java/frameworks/database/InMemoryRankingRepository.java index f7e5e57af..4b417a9a1 100644 --- a/src/main/java/frameworks/database/InMemoryRankingRepository.java +++ b/src/main/java/frameworks/database/InMemoryRankingRepository.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import entities.RankingEntry; +import entities.PlayerRankingEntry; import interface_adapters.gateways.RankingRepository; /** @@ -20,7 +20,7 @@ * controller.handleRankingRequest(3); */ public class InMemoryRankingRepository implements RankingRepository { - private final List rankings = new ArrayList<>(); + private final List rankings = new ArrayList<>(); /** * Constructs an InMemoryRankingRepository with a predefined set of ranking entries. @@ -28,8 +28,8 @@ public class InMemoryRankingRepository implements RankingRepository { public InMemoryRankingRepository() { // todo // Database import - rankings.add(new RankingEntry("player1", 100, 40, false)); - rankings.add(new RankingEntry("player2", 200, 60,true)); + rankings.add(new PlayerRankingEntry("player1", 100, 40, false)); + rankings.add(new PlayerRankingEntry("player2", 200, 60, true)); } /** @@ -38,7 +38,7 @@ public InMemoryRankingRepository() { * @return A list of all ranking entries. */ @Override - public List getAllRankings() { + public List getAllRankings() { // Return a copy to prevent modification return new ArrayList<>(rankings); } diff --git a/src/main/java/interface_adapters/controllers/LoginController.java b/src/main/java/interface_adapters/controllers/LoginController.java index 9ef145436..0718d275c 100644 --- a/src/main/java/interface_adapters/controllers/LoginController.java +++ b/src/main/java/interface_adapters/controllers/LoginController.java @@ -1,36 +1,38 @@ package interface_adapters.controllers; -import usecases.login.LoginUseCase; +import usecases.login.LoginInputBoundary; +import usecases.login.LoginInputData; /** * The LoginController class is responsible for handling user input from the UI - * and invoking the LoginUseCase to process the login logic. - * It serves as the bridge between the user interface and the business logic. + * and invoking the Login use case to process the login logic. + * It acts as the bridge between the user interface and the application's business logic. */ public class LoginController { - private final LoginUseCase useCase; + private final LoginInputBoundary loginUseCase; /** - * Constructs a new LoginController with the specified LoginUseCase. + * Constructs a new LoginController with the specified LoginInputBoundary. * - * @param useCase The use case instance responsible for processing login requests. + * @param loginUseCase The input boundary instance responsible for processing login requests. */ - public LoginController(LoginUseCase useCase) { - this.useCase = useCase; + public LoginController(LoginInputBoundary loginUseCase) { + this.loginUseCase = loginUseCase; } /** - * This method creates a LoginRequest object using the provided username and password, - * passes it to the LoginUseCase for processing, and handles the LoginResponse. - * If the login is successful, it prints a success message along with the player's ID. - * Otherwise, it prints an error message. + * Handles the login process by creating a LoginInputData object with the provided + * username and password, passing it to the Login use case, and returning the result. * * @param username The username provided by the user. * @param password The password provided by the user. - * - * @return The response for the giver username and password. */ - public String handleLogin(String username, String password) { - return useCase.execute(username, password); + public void handleLogin(String username, String password) { + // Create input data object for the use case + final LoginInputData inputData = new LoginInputData(username, password); + + // Invoke the use case with the input data + loginUseCase.execute(inputData); } } + diff --git a/src/main/java/interface_adapters/controllers/RankingController.java b/src/main/java/interface_adapters/controllers/RankingController.java index f617801d1..d7b5aca78 100644 --- a/src/main/java/interface_adapters/controllers/RankingController.java +++ b/src/main/java/interface_adapters/controllers/RankingController.java @@ -1,42 +1,36 @@ package interface_adapters.controllers; -import java.util.List; - -import frameworks.view.RankingViewModel; -import interface_adapters.presenters.RankingPresenter; -import usecases.ranking.RankingRequest; -import usecases.ranking.RankingResponse; -import usecases.ranking.RankingUseCase; +import usecases.ranking.RankingInputBoundary; +import usecases.ranking.RankingInputData; /** - * Handles user input for retrieving the ranking list. - * Passes the input to the RankingUseCase and processes the output through the RankingPresenter. + * The RankingController class is responsible for handling user input from the UI + * and invoking the Ranking use case to process the leaderboard retrieval logic. + * It acts as the bridge between the user interface and the application's business logic. */ public class RankingController { - private final RankingUseCase useCase; - private final RankingPresenter presenter; + private final RankingInputBoundary rankingUseCase; /** - * Constructs a new RankingController with the specified use case and presenter. + * Constructs a new RankingController with the specified RankingInputBoundary. * - * @param useCase The use case to handle ranking logic. - * @param presenter The presenter to process the response for the UI layer. + * @param rankingUseCase The input boundary instance responsible for processing ranking requests. */ - public RankingController(RankingUseCase useCase, RankingPresenter presenter) { - this.useCase = useCase; - this.presenter = presenter; + public RankingController(RankingInputBoundary rankingUseCase) { + this.rankingUseCase = rankingUseCase; } /** - * Handles a ranking request and returns a list of ViewModel objects for the UI layer. + * Handles the leaderboard retrieval process by creating a RankingInputData object + * with the specified number of top players to retrieve, and passing it to the Ranking use case. * - * @param topN The number of top players to retrieve. - * @return A list of RankingViewModel objects for the UI layer. + * @param topN The number of top players to retrieve from the leaderboard. */ - public List handleRankingRequest(int topN) { - final RankingRequest request = new RankingRequest(topN); - final RankingResponse response = useCase.execute(request); - // Convert response to ViewModel - return presenter.present(response); + public void handleRanking(int topN) { + // Create input data object for the use case + final RankingInputData inputData = new RankingInputData(topN); + + // Invoke the use case with the input data + rankingUseCase.execute(inputData); } } diff --git a/src/main/java/interface_adapters/controllers/SignupController.java b/src/main/java/interface_adapters/controllers/SignupController.java index 668e482cf..ca7be4dab 100644 --- a/src/main/java/interface_adapters/controllers/SignupController.java +++ b/src/main/java/interface_adapters/controllers/SignupController.java @@ -1,34 +1,37 @@ package interface_adapters.controllers; -import usecases.signup.SignupUseCase; +import usecases.signup.SignupInputBoundary; +import usecases.signup.SignupInputData; /** - * Handles user input for signing up a new player. - * - * The SignupController is responsible for receiving input data from the UI layer - * and passing this data to the SignupUseCase for processing. + * The SignupController class is responsible for handling user input from the UI + * and invoking the Signup use case to process the user registration logic. + * It acts as the bridge between the user interface and the application's business logic. */ public class SignupController { - private final SignupUseCase useCase; + private final SignupInputBoundary signupUseCase; /** - * Constructs a SignupController with the specified SignupUseCase. + * Constructs a new SignupController with the specified SignupInputBoundary. * - * @param useCase The SignupUseCase that contains the business logic for signing up a new player. + * @param signupUseCase The input boundary instance responsible for processing signup requests. */ - public SignupController(SignupUseCase useCase) { - this.useCase = useCase; + public SignupController(SignupInputBoundary signupUseCase) { + this.signupUseCase = signupUseCase; } /** - * Handles the signup request for a new player. + * Handles the signup process by creating a SignupInputData object with the provided + * username and password, passing it to the Signup use case. * - * @param username The desired username for the new player. - * @param password The desired password for the new player. - * @return A string message indicating the result of the signup attempt, such as - * success or failure with an explanation. + * @param username The username provided by the user. + * @param password The password provided by the user. */ - public String handleSignup(String username, String password) { - return useCase.execute(username, password); + public void handleSignup(String username, String password) { + // Create input data object for the use case + final SignupInputData inputData = new SignupInputData(username, password); + + // Invoke the use case with the input data + signupUseCase.execute(inputData); } } diff --git a/src/main/java/interface_adapters/gateways/PlayerRepository.java b/src/main/java/interface_adapters/gateways/PlayerRepository.java index b4bbb0df4..9df56ef01 100644 --- a/src/main/java/interface_adapters/gateways/PlayerRepository.java +++ b/src/main/java/interface_adapters/gateways/PlayerRepository.java @@ -1,6 +1,6 @@ package interface_adapters.gateways; -import entities.Player; +import entities.PlayerLogin; /** * Represents the interface for accessing and managing player data. @@ -17,7 +17,7 @@ public interface PlayerRepository { * @param username The username of the player to find. * @return The Player object if the username exists in the data source, otherwise null. */ - Player findByUsername(String username); + PlayerLogin findByUsername(String username); /** * Checks if the given username already exists in the data source. @@ -36,7 +36,7 @@ public interface PlayerRepository { * This method saves the given Player object into the data source. It assumes * that the username is unique and does not perform additional duplicate checks. * - * @param player The Player object to add to the data source. + * @param playerLogin The Player object to add to the data source. */ - void addPlayer(Player player); + void addPlayer(PlayerLogin playerLogin); } diff --git a/src/main/java/interface_adapters/gateways/RankingRepository.java b/src/main/java/interface_adapters/gateways/RankingRepository.java index d5b32fb74..d5c4738ad 100644 --- a/src/main/java/interface_adapters/gateways/RankingRepository.java +++ b/src/main/java/interface_adapters/gateways/RankingRepository.java @@ -2,7 +2,7 @@ import java.util.List; -import entities.RankingEntry; +import entities.PlayerRankingEntry; /** * Represents the interface for accessing ranking data. @@ -14,5 +14,5 @@ public interface RankingRepository { * * @return A list of all ranking entries. */ - List getAllRankings(); + List getAllRankings(); } diff --git a/src/main/java/interface_adapters/presenters/LoginPresenter.java b/src/main/java/interface_adapters/presenters/LoginPresenter.java new file mode 100644 index 000000000..a6e095a3a --- /dev/null +++ b/src/main/java/interface_adapters/presenters/LoginPresenter.java @@ -0,0 +1,42 @@ +package interface_adapters.presenters; + +import usecases.login.LoginOutputBoundary; +import usecases.login.LoginOutputData; + +/** + * The LoginPresenter class is responsible for formatting the output data + * from the Login use case into a format suitable for the user interface. + */ +public class LoginPresenter implements LoginOutputBoundary { + // Stores the formatted response message + private String responseMessage; + + /** + * Prepares the view for a successful login attempt. + * + * @param outputData The output data containing the success message. + */ + @Override + public void prepareSuccessView(LoginOutputData outputData) { + responseMessage = outputData.getMessage(); + } + + /** + * Prepares the view for a failed login attempt. + * + * @param outputData The output data containing the failure message. + */ + @Override + public void prepareFailureView(LoginOutputData outputData) { + responseMessage = outputData.getMessage(); + } + + /** + * Retrieves the formatted response message. + * + * @return A string representing the login response. + */ + public String getResponseMessage() { + return responseMessage; + } +} diff --git a/src/main/java/interface_adapters/presenters/RankingPresenter.java b/src/main/java/interface_adapters/presenters/RankingPresenter.java index d43df5bb8..4d2683627 100644 --- a/src/main/java/interface_adapters/presenters/RankingPresenter.java +++ b/src/main/java/interface_adapters/presenters/RankingPresenter.java @@ -1,31 +1,51 @@ package interface_adapters.presenters; import java.util.List; -import java.util.stream.Collectors; -import frameworks.view.RankingViewModel; -import usecases.ranking.RankingResponse; +import entities.PlayerRankingEntry; +import usecases.ranking.RankingOutputBoundary; +import usecases.ranking.RankingOutputData; /** - * Converts the RankingResponse data into a format suitable for the UI layer. + * The RankingPresenter class is responsible for formatting the output data + * from the Ranking use case into a format suitable for the user interface. + * It returns a sorted list of PlayerRankingEntry objects for further use by the UI. */ -public class RankingPresenter { +public class RankingPresenter implements RankingOutputBoundary { + // Stores the sorted leaderboard + private List sortedRankings; /** - * Converts the RankingResponse into a list of RankingViewModel objects. + * Prepares the view for a successful leaderboard retrieval. + * Stores the sorted PlayerRankingEntry objects for retrieval by the UI. * - * @param response The response from the RankingUseCase. - * @return A list of RankingViewModel objects for the UI layer. + * @param outputData The output data containing the leaderboard information. */ - public List present(RankingResponse response) { - return response.getRankings().stream() - .map(entry -> { - return new RankingViewModel( - entry.getName(), - entry.getScore(), - entry.getDaysSurvived(), - entry.isWon()); - }) - .collect(Collectors.toList()); + @Override + public void prepareSuccessView(RankingOutputData outputData) { + // Store the sorted list of PlayerRankingEntry objects + this.sortedRankings = outputData.getRankings(); + } + + /** + * Prepares the view for a failed leaderboard retrieval attempt. + * Clears the rankings list and logs an error. + * + * @param errorMessage The error message to display. + */ + @Override + public void prepareFailureView(String errorMessage) { + this.sortedRankings = List.of(); // Clear the rankings list on failure + System.err.println("Error retrieving rankings: " + errorMessage); + } + + /** + * Retrieves the sorted list of PlayerRankingEntry objects for display. + * + * @return A list of sorted PlayerRankingEntry objects or an empty list if retrieval failed. + */ + public List getSortedRankings() { + return sortedRankings; } } + diff --git a/src/main/java/interface_adapters/presenters/SignupPresenter.java b/src/main/java/interface_adapters/presenters/SignupPresenter.java new file mode 100644 index 000000000..5cda72125 --- /dev/null +++ b/src/main/java/interface_adapters/presenters/SignupPresenter.java @@ -0,0 +1,42 @@ +package interface_adapters.presenters; + +import usecases.signup.SignupOutputBoundary; +import usecases.signup.SignupOutputData; + +/** + * The SignupPresenter class is responsible for formatting the output data + * from the Signup use case into a format suitable for the user interface. + */ +public class SignupPresenter implements SignupOutputBoundary { + // Stores the formatted response message + private String responseMessage; + + /** + * Prepares the view for a successful signup attempt. + * + * @param outputData The output data containing the success message. + */ + @Override + public void prepareSuccessView(SignupOutputData outputData) { + responseMessage = outputData.getMessage(); + } + + /** + * Prepares the view for a failed signup attempt. + * + * @param outputData The error message to display. + */ + @Override + public void prepareFailureView(SignupOutputData outputData) { + responseMessage = outputData.getMessage(); + } + + /** + * Retrieves the formatted response message. + * + * @return A string representing the signup response. + */ + public String getResponseMessage() { + return responseMessage; + } +} diff --git a/src/main/java/usecases/login/LoginDataAccessInterface.java b/src/main/java/usecases/login/LoginDataAccessInterface.java new file mode 100644 index 000000000..05e783832 --- /dev/null +++ b/src/main/java/usecases/login/LoginDataAccessInterface.java @@ -0,0 +1,24 @@ +package usecases.login; + +/** + * Interface for accessing user data related to login. + * Defines methods for validating credentials and checking user existence. + */ +public interface LoginDataAccessInterface { + /** + * Validates the credentials of a user. + * + * @param username The username provided by the user. + * @param password The password provided by the user. + * @return True if the credentials are valid, otherwise false. + */ + boolean validateCredentials(String username, String password); + + /** + * Checks if a user with the specified username exists. + * + * @param username The username to check. + * @return True if the user exists, otherwise false. + */ + boolean doesUserExist(String username); +} diff --git a/src/main/java/usecases/login/LoginInputBoundary.java b/src/main/java/usecases/login/LoginInputBoundary.java new file mode 100644 index 000000000..fd6379b13 --- /dev/null +++ b/src/main/java/usecases/login/LoginInputBoundary.java @@ -0,0 +1,14 @@ +package usecases.login; + +/** + * Input boundary for the login use case. + * Defines the interface for initiating the login process. + */ +public interface LoginInputBoundary { + /** + * Processes a login request with the provided input data. + * + * @param inputData The data required for login, such as username and password. + */ + void execute(LoginInputData inputData); +} diff --git a/src/main/java/usecases/login/LoginRequest.java b/src/main/java/usecases/login/LoginInputData.java similarity index 56% rename from src/main/java/usecases/login/LoginRequest.java rename to src/main/java/usecases/login/LoginInputData.java index 4a857dca7..326fa71f8 100644 --- a/src/main/java/usecases/login/LoginRequest.java +++ b/src/main/java/usecases/login/LoginInputData.java @@ -1,37 +1,37 @@ package usecases.login; /** - * Represents the request object for the login use case. + * Data class for encapsulating input data for the login use case. * Contains the username and password provided by the user. */ -public class LoginRequest { +public class LoginInputData { private final String username; private final String password; /** - * Constructs a new LoginRequest with the given username and password. + * Constructs a new LoginInputData object with the specified username and password. * * @param username The username provided by the user. * @param password The password provided by the user. */ - public LoginRequest(String username, String password) { + public LoginInputData(String username, String password) { this.username = username; this.password = password; } /** - * Gets the username of the login request. + * Gets the username provided by the user. * - * @return The username. + * @return The username as a string. */ public String getUsername() { return username; } /** - * Gets the password of the login request. + * Gets the password provided by the user. * - * @return The password. + * @return The password as a string. */ public String getPassword() { return password; diff --git a/src/main/java/usecases/login/LoginInteractor.java b/src/main/java/usecases/login/LoginInteractor.java new file mode 100644 index 000000000..01748a637 --- /dev/null +++ b/src/main/java/usecases/login/LoginInteractor.java @@ -0,0 +1,46 @@ +package usecases.login; + +/** + * Use case interactor for login. + * Implements the core logic for processing login requests, + * including credential validation and user existence checks. + */ +public class LoginInteractor implements LoginInputBoundary { + private final LoginDataAccessInterface dataAccessInterface; + private final LoginOutputBoundary outputBoundary; + + /** + * Constructs a LoginInteractor with the specified data access interface and output boundary. + * + * @param dataAccessInterface The interface for accessing user data for login. + * @param outputBoundary The output boundary for presenting login results. + */ + public LoginInteractor(LoginDataAccessInterface dataAccessInterface, LoginOutputBoundary outputBoundary) { + this.dataAccessInterface = dataAccessInterface; + this.outputBoundary = outputBoundary; + } + + /** + * Executes the login use case. + * Validates the user's credentials and prepares the appropriate view (success or failure). + * + * @param inputData The input data containing the username and password. + */ + @Override + public void execute(LoginInputData inputData) { + final String username = inputData.getUsername(); + final String password = inputData.getPassword(); + + if (!dataAccessInterface.doesUserExist(username)) { + outputBoundary.prepareFailureView(new LoginOutputData(false, "User does not exist.")); + return; + } + + if (!dataAccessInterface.validateCredentials(username, password)) { + outputBoundary.prepareFailureView(new LoginOutputData(false, "Invalid credentials.")); + return; + } + + outputBoundary.prepareSuccessView(new LoginOutputData(true, "Login successful!")); + } +} diff --git a/src/main/java/usecases/login/LoginOutputBoundary.java b/src/main/java/usecases/login/LoginOutputBoundary.java new file mode 100644 index 000000000..76145723e --- /dev/null +++ b/src/main/java/usecases/login/LoginOutputBoundary.java @@ -0,0 +1,21 @@ +package usecases.login; + +/** + * Output boundary for the login use case. + * Defines methods for preparing success and failure views. + */ +public interface LoginOutputBoundary { + /** + * Prepares the view for a successful login. + * + * @param outputData The output data containing the success message. + */ + void prepareSuccessView(LoginOutputData outputData); + + /** + * Prepares the view for a failed login attempt. + * + * @param outputData The output data containing the success message. + */ + void prepareFailureView(LoginOutputData outputData); +} diff --git a/src/main/java/usecases/login/LoginOutputData.java b/src/main/java/usecases/login/LoginOutputData.java new file mode 100644 index 000000000..bb6a792c8 --- /dev/null +++ b/src/main/java/usecases/login/LoginOutputData.java @@ -0,0 +1,41 @@ +package usecases.login; + +/** + * Data class for encapsulating output data from the login use case. + * This class contains the result of the login operation, including a success indicator + * and a message detailing the outcome of the operation. + */ +public class LoginOutputData { + private final boolean loginSuccess; + private final String message; + + /** + * Constructs a new LoginOutputData object with the specified success indicator and message. + * + * @param loginSuccess A boolean indicating whether the login was successful. + * @param message A string message describing the result of the login operation. + * This can be a success message or an error message. + */ + public LoginOutputData(boolean loginSuccess, String message) { + this.loginSuccess = loginSuccess; + this.message = message; + } + + /** + * Indicates whether the login was successful. + * + * @return True if the login was successful, otherwise false. + */ + public boolean isLoginSuccess() { + return loginSuccess; + } + + /** + * Retrieves the message associated with the login operation. + * + * @return A string message representing the result of the login operation. + */ + public String getMessage() { + return message; + } +} diff --git a/src/main/java/usecases/login/LoginResponse.java b/src/main/java/usecases/login/LoginResponse.java deleted file mode 100644 index 212334865..000000000 --- a/src/main/java/usecases/login/LoginResponse.java +++ /dev/null @@ -1,52 +0,0 @@ -package usecases.login; - -/** - * Represents the response object for the login use case. - * Contains the result of the login attempt, including success status, a message, and the player ID. - */ -public class LoginResponse { - private final boolean success; - private final String message; - private final String playerId; - - /** - * Constructs a new LoginResponse with the given success status, message, and player ID. - * - * @param success Indicates whether the login was successful. - * @param message A message describing the result of the login attempt. - * @param playerId The unique ID of the player if login is successful. - */ - public LoginResponse(boolean success, String message, String playerId) { - this.success = success; - this.message = message; - this.playerId = playerId; - } - - /** - * Checks whether the login was successful. - * - * @return True if the login was successful, otherwise false. - */ - public boolean isSuccess() { - return success; - } - - /** - * Gets the message describing the login result. - * - * @return The message. - */ - public String getMessage() { - return message; - } - - /** - * Gets the player ID if the login is successful. - * - * @return The player ID, or null if login failed. - */ - public String getPlayerId() { - return playerId; - } -} - diff --git a/src/main/java/usecases/login/LoginUseCase.java b/src/main/java/usecases/login/LoginUseCase.java deleted file mode 100644 index d01e0499b..000000000 --- a/src/main/java/usecases/login/LoginUseCase.java +++ /dev/null @@ -1,39 +0,0 @@ -package usecases.login; - -import entities.Player; -import interface_adapters.gateways.PlayerRepository; - -/** - * Handles the logic for logging in a player. - * Validates credentials against the existing database. - */ -public class LoginUseCase { - private final PlayerRepository repository; - - /** - * Constructs a LoginUseCase with the specified player repository. - * - * @param repository The repository to access player data. - */ - public LoginUseCase(PlayerRepository repository) { - this.repository = repository; - } - - /** - * Executes the login logic for a player. - * - * @param username The username provided by the player. - * @param password The password provided by the player. - * @return A success message if login is successful, otherwise an error message. - */ - public String execute(String username, String password) { - final Player player = repository.findByUsername(username); - if (player == null) { - return "Login failed: Username not found."; - } - if (!player.validatePassword(password)) { - return "Login failed: Incorrect password."; - } - return "Login successful! Welcome back, " + username + "."; - } -} diff --git a/src/main/java/usecases/move/MoveInteractor.java b/src/main/java/usecases/move/MoveInteractor.java index d1deb589a..79423a7f9 100644 --- a/src/main/java/usecases/move/MoveInteractor.java +++ b/src/main/java/usecases/move/MoveInteractor.java @@ -1,6 +1,6 @@ package usecases.move; -import entities.Entityconstants; +import entities.EntityConstants; import entities.PlayerLocation; /** @@ -20,7 +20,7 @@ public void execute(MoveInputData moveInputData) { // Fetch necessary data final String direction = moveInputData.getDirection(); final int speed = 1 + (moveDataAccessObject.getPlayerAttributes().getMobilization() - / Entityconstants.MOBILIZATIONIMPACTSPEED); + / EntityConstants.MOBILIZATIONIMPACTSPEED); final PlayerLocation currentLocation = moveDataAccessObject.getPlayerLocation(); final int x = currentLocation.getXcoordinate(); final int y = currentLocation.getYcoordinate(); @@ -33,16 +33,16 @@ public void execute(MoveInputData moveInputData) { // Determine new coordinates based on the direction switch (direction) { - case Entityconstants.UP: + case EntityConstants.UP: newY = Math.max(0, y - speed); break; - case Entityconstants.DOWN: + case EntityConstants.DOWN: newY = Math.min(mapHeight - 1, y + speed); break; - case Entityconstants.LEFT: + case EntityConstants.LEFT: newX = Math.max(0, x - speed); break; - case Entityconstants.RIGHT: + case EntityConstants.RIGHT: newX = Math.min(mapWidth - 1, x + speed); break; default: @@ -75,16 +75,16 @@ public void execute(MoveInputData moveInputData) { private boolean isInvalidMove(String direction, int xcoor, int ycoor, int newX, int newY, int mapWidth, int mapHeight) { boolean ans = false; - if (direction.equals(Entityconstants.UP)) { + if (direction.equals(EntityConstants.UP)) { ans = ycoor == 0 || newY == ycoor; } - else if (direction.equals(Entityconstants.DOWN)) { + else if (direction.equals(EntityConstants.DOWN)) { ans = ycoor == mapHeight - 1 || newY == ycoor; } - else if (direction.equals(Entityconstants.LEFT)) { + else if (direction.equals(EntityConstants.LEFT)) { ans = xcoor == 0 || newX == xcoor; } - else if (direction.equals(Entityconstants.RIGHT)) { + else if (direction.equals(EntityConstants.RIGHT)) { ans = xcoor == mapWidth - 1 || newX == xcoor; } return ans; diff --git a/src/main/java/usecases/ranking/RankingComparator.java b/src/main/java/usecases/ranking/RankingComparator.java deleted file mode 100644 index dcbb70022..000000000 --- a/src/main/java/usecases/ranking/RankingComparator.java +++ /dev/null @@ -1,39 +0,0 @@ -package usecases.ranking; - -import java.util.Comparator; - -import entities.RankingEntry; - -/** - * Comparator for sorting RankingEntry objects. - * - * Players who have won the game (won = true) are ranked first. - * Within the groups of winners and non-winners, players are ranked by their scores in descending order. - */ -public class RankingComparator implements Comparator { - - /** - * Compares two RankingEntry objects for ranking purposes. - * - * The comparison logic prioritizes players who have won the game (won = true). - * Within the same group (both won or both not won), players are sorted by their scores in descending order. - * - * @param a The first RankingEntry to compare. - * @param b The second RankingEntry to compare. - * @return A negative integer, zero, or a positive integer as the first entry - * is ranked higher, equally, or lower than the second entry. - */ - @Override - public int compare(RankingEntry a, RankingEntry b) { - // Step 1: Compare by "won" status (true > false) - if (a.isWon() && !b.isWon()) { - return -1; - } - else if (!a.isWon() && b.isWon()) { - return 1; - } - - // Step 2: Compare by score (descending order) - return Integer.compare(b.getScore(), a.getScore()); - } -} diff --git a/src/main/java/usecases/ranking/RankingDataAccessInterface.java b/src/main/java/usecases/ranking/RankingDataAccessInterface.java new file mode 100644 index 000000000..776c5db2f --- /dev/null +++ b/src/main/java/usecases/ranking/RankingDataAccessInterface.java @@ -0,0 +1,26 @@ +package usecases.ranking; + +import java.util.List; + +import entities.PlayerRankingEntry; + +/** + * Interface for accessing ranking data. + * Defines methods for retrieving and updating player rankings. + */ +public interface RankingDataAccessInterface { + /** + * Retrieves the list of ranked players. + * + * @return A list of PlayerRankingEntry objects representing the leaderboard. + */ + List getLeaderboard(); + + /** + * Updates the score for a specific player. + * + * @param username The username of the player. + * @param score The new score to assign. + */ + void updateScore(String username, int score); +} diff --git a/src/main/java/usecases/ranking/RankingInputBoundary.java b/src/main/java/usecases/ranking/RankingInputBoundary.java new file mode 100644 index 000000000..6042bbd85 --- /dev/null +++ b/src/main/java/usecases/ranking/RankingInputBoundary.java @@ -0,0 +1,14 @@ +package usecases.ranking; + +/** + * Input boundary for the ranking use case. + * Defines the interface for retrieving and sorting the player leaderboard. + */ +public interface RankingInputBoundary { + /** + * Executes the ranking use case with the provided input data. + * + * @param inputData The input data containing the number of top players to retrieve. + */ + void execute(RankingInputData inputData); +} diff --git a/src/main/java/usecases/ranking/RankingRequest.java b/src/main/java/usecases/ranking/RankingInputData.java similarity index 51% rename from src/main/java/usecases/ranking/RankingRequest.java rename to src/main/java/usecases/ranking/RankingInputData.java index ba29a1d13..cd18b5033 100644 --- a/src/main/java/usecases/ranking/RankingRequest.java +++ b/src/main/java/usecases/ranking/RankingInputData.java @@ -1,24 +1,24 @@ package usecases.ranking; /** - * Represents a request to retrieve the ranking list. + * Data class for encapsulating input data for the ranking use case. * Contains the number of top players to retrieve. */ -public class RankingRequest { - // The number of top players to retrieve +public class RankingInputData { + // Number of top players to retrieve. private final int topN; /** - * Constructs a new RankingRequest with the specified number of top players. + * Constructs a new RankingInputData object with the specified number of top players. * * @param topN The number of top players to retrieve. */ - public RankingRequest(int topN) { + public RankingInputData(int topN) { this.topN = topN; } /** - * Gets the number of top players to retrieve. + * Retrieves the number of top players to retrieve. * * @return The number of top players. */ diff --git a/src/main/java/usecases/ranking/RankingInteractor.java b/src/main/java/usecases/ranking/RankingInteractor.java new file mode 100644 index 000000000..1ed093fa6 --- /dev/null +++ b/src/main/java/usecases/ranking/RankingInteractor.java @@ -0,0 +1,56 @@ +package usecases.ranking; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import entities.PlayerRankingEntry; + +/** + * Use case interactor for the ranking use case. + * Implements the core logic for sorting and presenting the player leaderboard. + */ +public class RankingInteractor implements RankingInputBoundary { + private final RankingDataAccessInterface dataAccessInterface; + private final RankingOutputBoundary outputBoundary; + + /** + * Constructs a RankingInteractor with the specified data access interface and output boundary. + * + * @param dataAccessInterface The interface for accessing ranking data. + * @param outputBoundary The output boundary for presenting the leaderboard results. + */ + public RankingInteractor(RankingDataAccessInterface dataAccessInterface, RankingOutputBoundary outputBoundary) { + this.dataAccessInterface = dataAccessInterface; + this.outputBoundary = outputBoundary; + } + + /** + * Executes the ranking use case. + * Retrieves the leaderboard data, sorts it based on the requirements, + * and prepares the appropriate view for the top N players. + * + * @param inputData The input data containing the number of top players to retrieve. + */ + @Override + public void execute(RankingInputData inputData) { + // Retrieve the unsorted list of players from the data access interface + final List rankings = dataAccessInterface.getLeaderboard(); + + if (rankings == null || rankings.isEmpty()) { + outputBoundary.prepareFailureView("No players found in the leaderboard."); + return; + } + + // Sort the players first by `won` (true > false), then by `score` in descending order + final List sortedRankings = rankings.stream() + .sorted(Comparator.comparing(PlayerRankingEntry::isWon).reversed() + .thenComparing(Comparator.comparing(PlayerRankingEntry::getScore).reversed())) + // Get only the top N players + .limit(inputData.getTopN()) + .collect(Collectors.toList()); + + // Prepare the sorted list as output data + outputBoundary.prepareSuccessView(new RankingOutputData(sortedRankings)); + } +} diff --git a/src/main/java/usecases/ranking/RankingOutputBoundary.java b/src/main/java/usecases/ranking/RankingOutputBoundary.java new file mode 100644 index 000000000..cc614f9fe --- /dev/null +++ b/src/main/java/usecases/ranking/RankingOutputBoundary.java @@ -0,0 +1,21 @@ +package usecases.ranking; + +/** + * Output boundary for the ranking use case. + * Defines methods for preparing success and failure views for leaderboard retrieval. + */ +public interface RankingOutputBoundary { + /** + * Prepares the view for successfully retrieved rankings. + * + * @param outputData The output data containing the leaderboard information. + */ + void prepareSuccessView(RankingOutputData outputData); + + /** + * Prepares the view for a failed ranking retrieval attempt. + * + * @param errorMessage The error message to display. + */ + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/ranking/RankingOutputData.java b/src/main/java/usecases/ranking/RankingOutputData.java new file mode 100644 index 000000000..ee11e34a7 --- /dev/null +++ b/src/main/java/usecases/ranking/RankingOutputData.java @@ -0,0 +1,31 @@ +package usecases.ranking; + +import java.util.List; + +import entities.PlayerRankingEntry; + +/** + * Data class for encapsulating output data from the ranking use case. + * Contains the list of ranked players and their respective details. + */ +public class RankingOutputData { + private final List rankings; + + /** + * Constructs a new RankingOutputData object with the specified rankings. + * + * @param rankings A list of PlayerRankingEntry objects representing the leaderboard. + */ + public RankingOutputData(List rankings) { + this.rankings = rankings; + } + + /** + * Retrieves the list of ranked players. + * + * @return A list of PlayerRankingEntry objects. + */ + public List getRankings() { + return rankings; + } +} diff --git a/src/main/java/usecases/ranking/RankingResponse.java b/src/main/java/usecases/ranking/RankingResponse.java deleted file mode 100644 index ff87bb50b..000000000 --- a/src/main/java/usecases/ranking/RankingResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package usecases.ranking; - -import java.util.List; - -import entities.RankingEntry; - -/** - * Represents the response for a ranking request. - * Contains a sorted list of top-ranking entries. - */ -public class RankingResponse { - // The list of ranking entries - private final List rankings; - - /** - * Constructs a new RankingResponse with the specified ranking list. - * - * @param rankings The sorted list of ranking entries. - */ - public RankingResponse(List rankings) { - this.rankings = rankings; - } - - /** - * Gets the sorted list of ranking entries. - * - * @return The ranking list. - */ - public List getRankings() { - return rankings; - } -} diff --git a/src/main/java/usecases/ranking/RankingUseCase.java b/src/main/java/usecases/ranking/RankingUseCase.java deleted file mode 100644 index 89462dddb..000000000 --- a/src/main/java/usecases/ranking/RankingUseCase.java +++ /dev/null @@ -1,41 +0,0 @@ -package usecases.ranking; - -import java.util.List; - -import entities.RankingEntry; -import interface_adapters.gateways.RankingRepository; - -/** - * Handles the business logic for retrieving and sorting the ranking list. - * Retrieves the top N players from the repository, sorted by score in descending order. - */ -public class RankingUseCase { - // The repository to access ranking data - private final RankingRepository repository; - - /** - * Constructs a new RankingUseCase with the specified ranking repository. - * - * @param repository The repository to access ranking data. - */ - public RankingUseCase(RankingRepository repository) { - this.repository = repository; - } - - /** - * Executes the ranking request to retrieve the top N players. - * - * @param request The ranking request specifying the number of top players to retrieve. - * @return A RankingResponse containing the sorted list of top-ranking players. - */ - public RankingResponse execute(RankingRequest request) { - final List rankings = repository.getAllRankings(); - // Sort by score descending - rankings.sort(new RankingComparator()); - - // Return the top N players based on the request - final List topRankings = rankings.subList(0, Math.min(request.getTopN(), rankings.size())); - - return new RankingResponse(topRankings); - } -} diff --git a/src/main/java/usecases/respond/RespondInteractor.java b/src/main/java/usecases/respond/RespondInteractor.java index 22136a7ba..355668706 100644 --- a/src/main/java/usecases/respond/RespondInteractor.java +++ b/src/main/java/usecases/respond/RespondInteractor.java @@ -1,6 +1,6 @@ package usecases.respond; -import entities.Entityconstants; +import entities.EntityConstants; import entities.Event; import entities.EventAmbush; import entities.Inventory; @@ -50,33 +50,33 @@ private Pair ambushevaluator(PlayerAttributes attrib int peoplechange = 0; boolean success = true; final EventAmbush ambush = (EventAmbush) event; - if (choice == Entityconstants.FIRSTCHOICE) { - if (inventory.getfirepower() >= Entityconstants.AMBUSHPOWER) { - foodchange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; - waterchange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; - weaponchange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; - peoplechange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; + if (choice == EntityConstants.FIRSTCHOICE) { + if (inventory.getfirepower() >= EntityConstants.AMBUSHPOWER) { + foodchange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; + waterchange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; + weaponchange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; + peoplechange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; message = ambush.getFightoutcomesuccess(); } else { - foodchange = Entityconstants.AMBUSHFAILRESOURCEFOOD; - waterchange = Entityconstants.AMBUSHFAILRESOURCEWATER; - weaponchange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; - peoplechange = Entityconstants.AMBUSHFAILRESOURCEPEOPLE; + foodchange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterchange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponchange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + peoplechange = EntityConstants.AMBUSHFAILRESOURCEPEOPLE; message = ambush.getFightoutcomefailed(); } } - else if (choice == Entityconstants.SECONDCHOICE) { - foodchange = Entityconstants.AMBUSHFAILRESOURCEFOOD; - waterchange = Entityconstants.AMBUSHFAILRESOURCEWATER; - weaponchange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; + else if (choice == EntityConstants.SECONDCHOICE) { + foodchange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterchange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponchange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; message = ambush.getPayoutcome(); } - else if (choice == Entityconstants.THIRDCHOICE) { - if (attributes.getSocial() < Entityconstants.AMBUSHNEGOTIATE) { - foodchange = Entityconstants.AMBUSHFAILRESOURCEFOOD; - waterchange = Entityconstants.AMBUSHFAILRESOURCEWATER; - weaponchange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; + else if (choice == EntityConstants.THIRDCHOICE) { + if (attributes.getSocial() < EntityConstants.AMBUSHNEGOTIATE) { + foodchange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterchange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponchange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; message = ambush.getNegotiatefailedoutcome(); } else { diff --git a/src/main/java/usecases/signup/SignupDataAccessInterface.java b/src/main/java/usecases/signup/SignupDataAccessInterface.java new file mode 100644 index 000000000..bbb486abd --- /dev/null +++ b/src/main/java/usecases/signup/SignupDataAccessInterface.java @@ -0,0 +1,23 @@ +package usecases.signup; + +/** + * Interface for accessing user data related to signup. + * Defines methods for checking username uniqueness and adding a new user. + */ +public interface SignupDataAccessInterface { + /** + * Checks if the specified username is already taken. + * + * @param username The username to check. + * @return True if the username is taken, otherwise false. + */ + boolean isUsernameTaken(String username); + + /** + * Adds a new user with the specified username and password. + * + * @param username The username for the new user. + * @param password The password for the new user. + */ + void addUser(String username, String password); +} diff --git a/src/main/java/usecases/signup/SignupInputBoundary.java b/src/main/java/usecases/signup/SignupInputBoundary.java new file mode 100644 index 000000000..f3456850d --- /dev/null +++ b/src/main/java/usecases/signup/SignupInputBoundary.java @@ -0,0 +1,14 @@ +package usecases.signup; + +/** + * Input boundary for the signup use case. + * Defines the interface for initiating the signup process. + */ +public interface SignupInputBoundary { + /** + * Executes the signup use case with the provided input data. + * + * @param inputData The input data containing the username and password for registration. + */ + void execute(SignupInputData inputData); +} diff --git a/src/main/java/usecases/signup/SignupInputData.java b/src/main/java/usecases/signup/SignupInputData.java new file mode 100644 index 000000000..6ebf34dde --- /dev/null +++ b/src/main/java/usecases/signup/SignupInputData.java @@ -0,0 +1,40 @@ +package usecases.signup; + +/** + * Data class for encapsulating input data for the signup use case. + * This class contains the information provided by the user for registration, + * such as their desired username and password. + */ +public class SignupInputData { + private final String username; + private final String password; + + /** + * Constructs a new SignupInputData object with the specified username and password. + * + * @param username The desired username for the new account. + * @param password The desired password for the new account. + */ + public SignupInputData(String username, String password) { + this.username = username; + this.password = password; + } + + /** + * Retrieves the desired username for the new account. + * + * @return A string representing the username. + */ + public String getUsername() { + return username; + } + + /** + * Retrieves the desired password for the new account. + * + * @return A string representing the password. + */ + public String getPassword() { + return password; + } +} diff --git a/src/main/java/usecases/signup/SignupInteractor.java b/src/main/java/usecases/signup/SignupInteractor.java new file mode 100644 index 000000000..730410a27 --- /dev/null +++ b/src/main/java/usecases/signup/SignupInteractor.java @@ -0,0 +1,52 @@ +package usecases.signup; + +/** + * Use case interactor for signup. + * Implements the core logic for processing user registration requests, + * including username uniqueness checks and user creation. + */ +public class SignupInteractor implements SignupInputBoundary { + private final SignupDataAccessInterface dataAccessInterface; + private final SignupOutputBoundary outputBoundary; + + /** + * Constructs a SignupInteractor with the specified data access interface and output boundary. + * + * @param dataAccessInterface The interface for accessing user data for signup. + * @param outputBoundary The output boundary for presenting signup results. + */ + public SignupInteractor(SignupDataAccessInterface dataAccessInterface, SignupOutputBoundary outputBoundary) { + this.dataAccessInterface = dataAccessInterface; + this.outputBoundary = outputBoundary; + } + + /** + * Executes the signup use case. + * Checks if the username is unique, creates a new user, and prepares the appropriate view. + * + * @param inputData The input data containing the username and password for registration. + */ + @Override + public void execute(SignupInputData inputData) { + final String username = inputData.getUsername(); + final String password = inputData.getPassword(); + + // Check if username is already taken + if (dataAccessInterface.isUsernameTaken(username)) { + outputBoundary.prepareFailureView(new SignupOutputData( + false, + "Signup failed: Username '" + username + "' is already taken." + )); + return; + } + + // Add the new user + dataAccessInterface.addUser(username, password); + + // Prepare success view + outputBoundary.prepareSuccessView(new SignupOutputData( + true, + "Signup successful! Welcome, " + username + "." + )); + } +} diff --git a/src/main/java/usecases/signup/SignupOutputBoundary.java b/src/main/java/usecases/signup/SignupOutputBoundary.java new file mode 100644 index 000000000..a4dfc3367 --- /dev/null +++ b/src/main/java/usecases/signup/SignupOutputBoundary.java @@ -0,0 +1,21 @@ +package usecases.signup; + +/** + * Output boundary for the signup use case. + * Defines methods for preparing success and failure views. + */ +public interface SignupOutputBoundary { + /** + * Prepares the view for a successful signup attempt. + * + * @param outputData The output data containing the success message. + */ + void prepareSuccessView(SignupOutputData outputData); + + /** + * Prepares the view for a failed signup attempt. + * + * @param outputData The output data containing the failure message. + */ + void prepareFailureView(SignupOutputData outputData); +} diff --git a/src/main/java/usecases/signup/SignupOutputData.java b/src/main/java/usecases/signup/SignupOutputData.java new file mode 100644 index 000000000..eecf3e0d2 --- /dev/null +++ b/src/main/java/usecases/signup/SignupOutputData.java @@ -0,0 +1,41 @@ +package usecases.signup; + +/** + * Data class for encapsulating output data from the signup use case. + * This class contains the result of the signup operation, including a success indicator + * and a message detailing the outcome of the operation. + */ +public class SignupOutputData { + private final boolean signupSuccess; + private final String message; + + /** + * Constructs a new SignupOutputData object with the specified success indicator and message. + * + * @param signupSuccess A boolean indicating whether the signup was successful. + * @param message A string message describing the result of the signup operation. + * This can be a success message or an error message. + */ + public SignupOutputData(boolean signupSuccess, String message) { + this.signupSuccess = signupSuccess; + this.message = message; + } + + /** + * Indicates whether the signup was successful. + * + * @return True if the signup was successful, otherwise false. + */ + public boolean isSignupSuccess() { + return signupSuccess; + } + + /** + * Retrieves the message associated with the signup operation. + * + * @return A string message representing the result of the signup operation. + */ + public String getMessage() { + return message; + } +} diff --git a/src/main/java/usecases/signup/SignupUseCase.java b/src/main/java/usecases/signup/SignupUseCase.java deleted file mode 100644 index 309904047..000000000 --- a/src/main/java/usecases/signup/SignupUseCase.java +++ /dev/null @@ -1,39 +0,0 @@ -package usecases.signup; - -import entities.Player; -import interface_adapters.gateways.PlayerRepository; - -/** - * Handles the logic for signing up a new player. - * Ensures usernames are unique and adds new players to the database. - */ -public class SignupUseCase { - private final PlayerRepository repository; - - /** - * Constructs a SignupUseCase with the specified player repository. - * - * @param repository The repository to access player data. - */ - public SignupUseCase(PlayerRepository repository) { - this.repository = repository; - } - - /** - * Executes the signup logic for a new player. - * - * @param username The desired username of the new player. - * @param password The desired password of the new player. - * @return A success message if signup is successful, otherwise an error message. - */ - public String execute(String username, String password) { - if (repository.isUsernameDuplicate(username)) { - return "Signup failed: Username '" + username + "' is already taken."; - } - // Generate a new unique ID (for simplicity, use current size + 1) - final String newId = String.valueOf(repository.hashCode() + 1); - final Player newPlayer = new Player(newId, username, password); - repository.addPlayer(newPlayer); - return "Signup successful! Welcome, " + username + "."; - } -} From 8b91a8aedd446ebd23bdd94a5e5f98c8b62e6ff1 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Wed, 27 Nov 2024 15:26:08 -0700 Subject: [PATCH 031/154] Newday usecase completed --- src/main/java/entities/Entityconstants.java | 16 +++ .../newday/NewdayDataAccessInterface.java | 67 ++++++++++++ .../usecases/newday/NewdayInputBoundary.java | 13 +++ .../java/usecases/newday/NewdayInputData.java | 8 ++ .../usecases/newday/NewdayInteractor.java | 103 ++++++++++++++++++ .../usecases/newday/NewdayOutputBoundary.java | 18 +++ .../usecases/newday/NewdayOutputData.java | 29 +++++ 7 files changed, 254 insertions(+) create mode 100644 src/main/java/usecases/newday/NewdayDataAccessInterface.java create mode 100644 src/main/java/usecases/newday/NewdayInputBoundary.java create mode 100644 src/main/java/usecases/newday/NewdayInputData.java create mode 100644 src/main/java/usecases/newday/NewdayInteractor.java create mode 100644 src/main/java/usecases/newday/NewdayOutputBoundary.java create mode 100644 src/main/java/usecases/newday/NewdayOutputData.java diff --git a/src/main/java/entities/Entityconstants.java b/src/main/java/entities/Entityconstants.java index 79a4d53dd..12b21605e 100644 --- a/src/main/java/entities/Entityconstants.java +++ b/src/main/java/entities/Entityconstants.java @@ -43,6 +43,19 @@ public class Entityconstants { // Player attribute impacts. public static final int MOBILIZATIONIMPACTSPEED = 10; + public static final double THRIFTIMPACTRESOURCELOSS = 0.03; + + // Newday resource loss module + public static final double PEOPLELOSSPERFOOD = 1; + public static final double PEOPLELOSSPERWATER = 1; + public static final double PEOPLEBASEDEATHRATE = 0.05; + + // Newday resource gain module + public static final double PEOPLEGAINPERFOOD = 0.9; + public static final double PEOPLEGAINPERWEAPON = 0.04; + public static final double PEOPLEGAINPERWATER = 0.9; + public static final double PEOPLEBASEJOINRATE = 0.04; + public static final double WEAPONBASELOSERATE = 0.04; // Directions. public static final String UP = "up"; @@ -92,5 +105,8 @@ public class Entityconstants { public static final int TRADERROBBERYFAILLOSSPEOPLE = -2; public static final int TRADERIGNORELOSS = 0; // No resource changes for ignoring + public static final int MAXNUMDAY = 60; + + public static final String NEWLINE = "\n"; } diff --git a/src/main/java/usecases/newday/NewdayDataAccessInterface.java b/src/main/java/usecases/newday/NewdayDataAccessInterface.java new file mode 100644 index 000000000..ae1076242 --- /dev/null +++ b/src/main/java/usecases/newday/NewdayDataAccessInterface.java @@ -0,0 +1,67 @@ +package usecases.newday; + +import entities.Inventory; +import entities.Location; +import entities.PlayerAttributes; +import entities.PlayerInfo; + +/** + * Newday data access, require player's info because we care and need to update days and score. + * Require inventory because this part is for updating recources, how many lose, how many found depended on people num. + * Require player attribute because thrift is scalar to resource lost (food and water) + */ +public interface NewdayDataAccessInterface { + /** + * Get the player info we needed, score and days. + * @return playerinfo datatype. + */ + PlayerInfo getPlauerinfo(); + + /** + * Get location of there player is at, because we need temperature to calculate resource loss as well. + * @return the player's current location, in order to get current temperature. + */ + Location getLocation(); + + /** + * Get the player inventory we need, food water, people, firearm etc. + * @return inventory. + */ + Inventory getInventory(); + + /** + * Set the number of days player survived to new value. (+1) + * @param days new days + */ + void getDaysSurvived(int days); + + /** + * The amount of food change during new day process. + * @param food food changed + */ + void changeFood(int food); + + /** + * The amount of water change during the new day process. + * @param water water changed + */ + void changeWater(int water); + + /** + * The amount of people change during the new day process. + * @param people people changed + */ + void changePeople(int people); + + /** + * The amount of weapon change during the new day process. + * @param weapon weapon changed + */ + void changeWeapon(int weapon); + + /** + * The player attribute, which thrift is what we care about. + * @return return player attribute. + */ + PlayerAttributes getPlayerAttributes(); +} diff --git a/src/main/java/usecases/newday/NewdayInputBoundary.java b/src/main/java/usecases/newday/NewdayInputBoundary.java new file mode 100644 index 000000000..7df9dba0b --- /dev/null +++ b/src/main/java/usecases/newday/NewdayInputBoundary.java @@ -0,0 +1,13 @@ +package usecases.newday; + +/** + * Input boundary of the newday, so interactor must have this execute method. + */ +public interface NewdayInputBoundary { + /** + * Execute the move for player based on given direction. + * @param inputdata execute, based on inputdata of player's input given. + * But actually, no inputdata is needed except for the fact player press the key for next day/ + */ + void execute(NewdayInputData inputdata); +} diff --git a/src/main/java/usecases/newday/NewdayInputData.java b/src/main/java/usecases/newday/NewdayInputData.java new file mode 100644 index 000000000..abd1c2ace --- /dev/null +++ b/src/main/java/usecases/newday/NewdayInputData.java @@ -0,0 +1,8 @@ +package usecases.newday; + +/** + * Input data from player ui side, which is nothing because we don't need anything to decide how everything is change + * form outside. + */ +public class NewdayInputData { +} diff --git a/src/main/java/usecases/newday/NewdayInteractor.java b/src/main/java/usecases/newday/NewdayInteractor.java new file mode 100644 index 000000000..da7a2c617 --- /dev/null +++ b/src/main/java/usecases/newday/NewdayInteractor.java @@ -0,0 +1,103 @@ +package usecases.newday; + +import entities.Entityconstants; + +/** + * Newday interactor, where logic happen. + */ +public class NewdayInteractor implements NewdayInputBoundary { + private final NewdayDataAccessInterface newdayDataAccessObject; + private final NewdayOutputBoundary newdayOutputBoundary; + + public NewdayInteractor(NewdayDataAccessInterface newdayDataAccessObject, + NewdayOutputBoundary newdayOutputBoundary) { + this.newdayDataAccessObject = newdayDataAccessObject; + this.newdayOutputBoundary = newdayOutputBoundary; + } + + @Override + public void execute(NewdayInputData inputdata) { + final int thrift = newdayDataAccessObject.getPlayerAttributes().getThrift(); + final int people = newdayDataAccessObject.getInventory().getPeople(); + final double temp = newdayDataAccessObject.getLocation().gettemperature(); + + // Message builder for day summary + final StringBuilder messageBuilder = new StringBuilder("Another day has passed. Here's what happened:\n"); + boolean success = true; + String failmessage = ""; + if (newdayDataAccessObject.getPlauerinfo().getDaysSurvived() >= Entityconstants.MAXNUMDAY) { + success = false; + } + // Process resource changes and build the message + if (success) { + decrementresource(messageBuilder, thrift, people, temp); + incrementresouce(messageBuilder, people); + final NewdayOutputData outputdata = new NewdayOutputData(messageBuilder.toString(), success, failmessage); + newdayOutputBoundary.prepareSuccessView(outputdata); + } + else { + failmessage = "Day exceeded failure."; + newdayOutputBoundary.prepareFailureView(failmessage); + } + } + + private void incrementresouce(StringBuilder messageBuilder, int people) { + // food gain + final double foodscalar = newdayDataAccessObject.getLocation().getfoodresourceavailable(); + final double foodgain = people * Entityconstants.PEOPLEGAINPERFOOD * foodscalar; + newdayDataAccessObject.changeFood((int) foodgain); + messageBuilder.append(" - Food gained: ").append((int) foodgain).append(Entityconstants.NEWLINE); + + // water gain + final double waterscalar = newdayDataAccessObject.getLocation().getwaterresourceavailable(); + final double watergain = people * Entityconstants.PEOPLEGAINPERWATER * waterscalar; + newdayDataAccessObject.changeWater((int) watergain); + messageBuilder.append(" - Water gained: ").append((int) watergain).append(Entityconstants.NEWLINE); + + // people gain + final double peoplegain = people * (Entityconstants.PEOPLEBASEJOINRATE + * newdayDataAccessObject.getLocation().getpeopleresourceavailable()); + newdayDataAccessObject.changePeople((int) peoplegain); + messageBuilder.append(" - New members joined: ").append((int) peoplegain).append(Entityconstants.NEWLINE); + + // weaponry gain + double weapongain = peoplegain + people * Entityconstants.PEOPLEGAINPERWEAPON; + weapongain = weapongain * newdayDataAccessObject.getLocation().getweaponresourceavailable(); + newdayDataAccessObject.changeWeapon((int) weapongain); + messageBuilder.append(" - Weaponry gained: ").append((int) weapongain).append(Entityconstants.NEWLINE); + } + + private void decrementresource(StringBuilder messageBuilder, int thrift, int people, double temp) { + // food loss + final double basetemp = Entityconstants.DEFAULTTEMP; + final double tempdiff = temp - basetemp; + double foodloss = people * Entityconstants.PEOPLELOSSPERFOOD; + if (tempdiff < 0) { + foodloss += Math.abs(tempdiff); + } + foodloss = foodloss * (1 - thrift * Entityconstants.THRIFTIMPACTRESOURCELOSS); + newdayDataAccessObject.changeFood((int) foodloss * -1); + messageBuilder.append(" - Food lost: ").append((int) foodloss).append(Entityconstants.NEWLINE); + + // water loss + double waterloss = people * Entityconstants.PEOPLELOSSPERWATER; + if (tempdiff > 0) { + waterloss += Math.abs(tempdiff); + } + waterloss = waterloss * (1 - thrift * Entityconstants.THRIFTIMPACTRESOURCELOSS); + newdayDataAccessObject.changeWater((int) waterloss * -1); + messageBuilder.append(" - Water lost: ").append((int) waterloss).append(Entityconstants.NEWLINE); + + // people loss + final double peopleloss = people * (Entityconstants.PEOPLEBASEDEATHRATE + * newdayDataAccessObject.getLocation().getthreatlevel()); + newdayDataAccessObject.changePeople((int) peopleloss * -1); + messageBuilder.append(" - People lost: ").append((int) peopleloss).append(Entityconstants.NEWLINE); + + // weaponry loss + final double weaponloss = peopleloss * (1 - thrift * Entityconstants.THRIFTIMPACTRESOURCELOSS); + newdayDataAccessObject.changeWeapon((int) weaponloss * -1); + messageBuilder.append(" - Weaponry lost: ").append((int) weaponloss).append(Entityconstants.NEWLINE); + } + +} diff --git a/src/main/java/usecases/newday/NewdayOutputBoundary.java b/src/main/java/usecases/newday/NewdayOutputBoundary.java new file mode 100644 index 000000000..59cb5564a --- /dev/null +++ b/src/main/java/usecases/newday/NewdayOutputBoundary.java @@ -0,0 +1,18 @@ +package usecases.newday; + +/** + * Output boundary for newday, either prepare a success use case view with message returned as output data, or failed. + */ +public interface NewdayOutputBoundary { + /** + * Outputs for a successful move. + * @param outputData the output for updating the view. + */ + void prepareSuccessView(NewdayOutputData outputData); + + /** + * If the usecase is invaild, example: 60 days this get called so intend to move to 61. + * @param errorMessage message of why is invaild, for the player. + */ + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/newday/NewdayOutputData.java b/src/main/java/usecases/newday/NewdayOutputData.java new file mode 100644 index 000000000..247fc08ee --- /dev/null +++ b/src/main/java/usecases/newday/NewdayOutputData.java @@ -0,0 +1,29 @@ +package usecases.newday; + +/** + * Output data of newday after is done, should return a message saying what happened, how many people gained, lose, etc. + * Or, was the usecase a success, would will for example if already 60 days and still called this use case to day 61. + */ +public class NewdayOutputData { + private String message; + private boolean success; + private String failmessage; + + public NewdayOutputData(String message, boolean success, String failmessage) { + this.message = message; + this.success = success; + this.failmessage = failmessage; + } + + public String getMessage() { + return message; + } + + public boolean isSuccess() { + return success; + } + + public String getFailmessage() { + return failmessage; + } +} From 149af3fab693bffb1b0dc548aaa55295629f999e Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Thu, 28 Nov 2024 11:52:13 -0700 Subject: [PATCH 032/154] Event interface refractor, Location tostring Override, Usecase EventDecide Implemented --- src/main/java/entities/Event.java | 7 +++ src/main/java/entities/EventAmbush.java | 11 ++--- src/main/java/entities/EventBlizzard.java | 3 +- src/main/java/entities/EventFlood.java | 15 ++++--- .../java/entities/EventSurvivorJoins.java | 7 +-- .../java/entities/EventTraderEncounter.java | 19 ++++---- src/main/java/entities/Location.java | 6 +++ src/main/java/entities/LocationCity.java | 5 +++ src/main/java/entities/LocationDesert.java | 5 +++ src/main/java/entities/LocationForest.java | 5 +++ src/main/java/entities/LocationIceland.java | 5 +++ src/main/java/entities/LocationPlain.java | 5 +++ .../DecideEventDataAccessInterface.java | 27 ++++++++++++ .../decideevent/DecideEventInputBoundary.java | 13 ++++++ .../decideevent/DecideEventInputData.java | 7 +++ .../decideevent/DecideEventInteractor.java | 44 +++++++++++++++++++ .../DecideEventOutputBoundary.java | 17 +++++++ .../decideevent/DecideEventOutputData.java | 21 +++++++++ 18 files changed, 197 insertions(+), 25 deletions(-) create mode 100644 src/main/java/usecases/decideevent/DecideEventDataAccessInterface.java create mode 100644 src/main/java/usecases/decideevent/DecideEventInputBoundary.java create mode 100644 src/main/java/usecases/decideevent/DecideEventInputData.java create mode 100644 src/main/java/usecases/decideevent/DecideEventInteractor.java create mode 100644 src/main/java/usecases/decideevent/DecideEventOutputBoundary.java create mode 100644 src/main/java/usecases/decideevent/DecideEventOutputData.java diff --git a/src/main/java/entities/Event.java b/src/main/java/entities/Event.java index ce444a410..96a7e8065 100644 --- a/src/main/java/entities/Event.java +++ b/src/main/java/entities/Event.java @@ -1,5 +1,6 @@ package entities; +import java.util.ArrayList; import java.util.Map; /** @@ -38,4 +39,10 @@ public interface Event { */ boolean getispositive(); + /** + * Return the only possible locations for this event to happen. + * @return return the occuring locations. + */ + ArrayList getOccuringlocation(); + } diff --git a/src/main/java/entities/EventAmbush.java b/src/main/java/entities/EventAmbush.java index a2feb12d7..c0cc88ee4 100644 --- a/src/main/java/entities/EventAmbush.java +++ b/src/main/java/entities/EventAmbush.java @@ -25,11 +25,11 @@ public class EventAmbush implements Event { public EventAmbush() { this.isPositive = false; this.occuringlocation = new ArrayList<>(); - occuringlocation.add("Plain"); - occuringlocation.add("Iceland"); - occuringlocation.add("Wood"); - occuringlocation.add("City"); - occuringlocation.add("Desert"); + occuringlocation.add(EntityConstants.PLAIN); + occuringlocation.add(EntityConstants.ICELAND); + occuringlocation.add(EntityConstants.DESERT); + occuringlocation.add(EntityConstants.CITY); + occuringlocation.add(EntityConstants.FOREST); this.description = "Your group is ambushed by a small band of desperate bandits demanding your " + "food supplies. Their ragged appearance suggests they're struggling to survive. What will you do?"; this.choices = new HashMap<>(); @@ -71,6 +71,7 @@ public boolean getispositive() { return isPositive; } + @Override public ArrayList getOccuringlocation() { return occuringlocation; } diff --git a/src/main/java/entities/EventBlizzard.java b/src/main/java/entities/EventBlizzard.java index f4b30faa4..877f760d2 100644 --- a/src/main/java/entities/EventBlizzard.java +++ b/src/main/java/entities/EventBlizzard.java @@ -22,7 +22,7 @@ public class EventBlizzard implements Event { public EventBlizzard() { this.isPositive = false; this.occuringlocation = new ArrayList<>(); - occuringlocation.add("Iceland"); + occuringlocation.add(EntityConstants.ICELAND); this.description = "A harsh blizzard strikes, blanketing the area in ice and snow. The biting cold " + "and lack of visibility make travel dangerous, and hunger begins to take its toll"; @@ -56,6 +56,7 @@ public boolean getispositive() { return isPositive; } + @Override public ArrayList getOccuringlocation() { return occuringlocation; } diff --git a/src/main/java/entities/EventFlood.java b/src/main/java/entities/EventFlood.java index 5004ba02e..87c9acc23 100644 --- a/src/main/java/entities/EventFlood.java +++ b/src/main/java/entities/EventFlood.java @@ -22,18 +22,18 @@ public class EventFlood implements Event { public EventFlood() { this.isPositive = false; this.occuringlocation = new ArrayList<>(); - occuringlocation.add("Plain"); - occuringlocation.add("Wood"); - occuringlocation.add("City"); + occuringlocation.add(EntityConstants.PLAIN); + occuringlocation.add(EntityConstants.FOREST); + occuringlocation.add(EntityConstants.CITY); this.description = "Heavy rains have caused nearby rivers to overflow, threatening your group with a flood. " + "You must act quickly to avoid losing supplies and people. What will you do?"; this.choices = new HashMap<>(); - choices.put(Entityconstants.FIRSTCHOICE, "Evacuate to higher ground"); - choices.put(Entityconstants.SECONDCHOICE, "Secure supplies and hold position"); - choices.put(Entityconstants.THIRDCHOICE, "Do nothing and hope the flood subsides"); + choices.put(EntityConstants.FIRSTCHOICE, "Evacuate to higher ground"); + choices.put(EntityConstants.SECONDCHOICE, "Secure supplies and hold position"); + choices.put(EntityConstants.THIRDCHOICE, "Do nothing and hope the flood subsides"); - this.probability = Entityconstants.RAREEVENTBASEPROB; + this.probability = EntityConstants.RAREEVENTBASEPROB; this.evacuateOutcome = "You successfully evacuated, saving most of your group but losing some supplies."; this.secureSuppliesOutcome = "You secured your supplies but lost time and some members to the flood."; this.doNothingOutcome = "The flood devastated your group, causing heavy losses in supplies and morale."; @@ -64,6 +64,7 @@ public boolean getispositive() { return isPositive; } + @Override public ArrayList getOccuringlocation() { return occuringlocation; } diff --git a/src/main/java/entities/EventSurvivorJoins.java b/src/main/java/entities/EventSurvivorJoins.java index c0d0f5c9f..899ec049a 100644 --- a/src/main/java/entities/EventSurvivorJoins.java +++ b/src/main/java/entities/EventSurvivorJoins.java @@ -25,9 +25,9 @@ public class EventSurvivorJoins implements Event { public EventSurvivorJoins() { this.isPositive = true; this.occuringlocation = new ArrayList<>(); - occuringlocation.add("Plain"); - occuringlocation.add("Wood"); - occuringlocation.add("City"); + occuringlocation.add(EntityConstants.PLAIN); + occuringlocation.add(EntityConstants.FOREST); + occuringlocation.add(EntityConstants.CITY); this.description = "You encounter a small group of survivors who ask to join your group. They appear skilled " + "but wary. What will you do?"; this.choices = new HashMap<>(); @@ -67,6 +67,7 @@ public boolean getispositive() { return isPositive; } + @Override public ArrayList getOccuringlocation() { return occuringlocation; } diff --git a/src/main/java/entities/EventTraderEncounter.java b/src/main/java/entities/EventTraderEncounter.java index 3e6ceb48f..c4a8c2a38 100644 --- a/src/main/java/entities/EventTraderEncounter.java +++ b/src/main/java/entities/EventTraderEncounter.java @@ -23,20 +23,20 @@ public class EventTraderEncounter implements Event { private final String robOutcomeFail; public EventTraderEncounter() { - this.isPositive = true; // Positive if trade succeeds, but actions can lead to negative results. + this.isPositive = true; this.occuringLocation = new ArrayList<>(); - occuringLocation.add(Entityconstants.PLAIN); - occuringLocation.add(Entityconstants.CITY); - occuringLocation.add(Entityconstants.DESERT); + occuringLocation.add(EntityConstants.PLAIN); + occuringLocation.add(EntityConstants.CITY); + occuringLocation.add(EntityConstants.DESERT); this.description = "You encounter a wandering trader offering supplies in exchange for your resources. " + "What will you do?"; this.choices = new HashMap<>(); - choices.put(Entityconstants.FIRSTCHOICE, "Trade with the trader"); - choices.put(Entityconstants.SECONDCHOICE, "Ignore the trader"); - choices.put(Entityconstants.THIRDCHOICE, "Attempt to rob the trader"); + choices.put(EntityConstants.FIRSTCHOICE, "Trade with the trader"); + choices.put(EntityConstants.SECONDCHOICE, "Ignore the trader"); + choices.put(EntityConstants.THIRDCHOICE, "Attempt to rob the trader"); - this.probability = Entityconstants.RAREEVENTBASEPROB; + this.probability = EntityConstants.RAREEVENTBASEPROB; this.tradeOutcomeSuccess = "You traded successfully and gained valuable supplies."; this.tradeOutcomeScam = "The trader scammed you, taking your resources and leaving you with nothing."; this.ignoreOutcome = "You ignored the trader and moved on."; @@ -69,7 +69,8 @@ public boolean getispositive() { return isPositive; } - public ArrayList getOccuringLocation() { + @Override + public ArrayList getOccuringlocation() { return occuringLocation; } diff --git a/src/main/java/entities/Location.java b/src/main/java/entities/Location.java index b511790ad..152d541da 100644 --- a/src/main/java/entities/Location.java +++ b/src/main/java/entities/Location.java @@ -107,4 +107,10 @@ public interface Location { * @return people threat scalar of that location. */ Double getthreatlevel(); + + /** + * String representing this place, Iceland, City etc. + * @return String representation. + */ + String toString(); } diff --git a/src/main/java/entities/LocationCity.java b/src/main/java/entities/LocationCity.java index 4d05d8e54..b4e8bafc2 100644 --- a/src/main/java/entities/LocationCity.java +++ b/src/main/java/entities/LocationCity.java @@ -92,4 +92,9 @@ public Double getsetthreatlevel(int dist) { public Double getthreatlevel() { return this.threat; } + + @Override + public String toString() { + return EntityConstants.CITY; + } } diff --git a/src/main/java/entities/LocationDesert.java b/src/main/java/entities/LocationDesert.java index d71c1e766..bc61a8b24 100644 --- a/src/main/java/entities/LocationDesert.java +++ b/src/main/java/entities/LocationDesert.java @@ -92,4 +92,9 @@ public Double getthreatlevel() { return this.threat; } + @Override + public String toString() { + return EntityConstants.DESERT; + } + } diff --git a/src/main/java/entities/LocationForest.java b/src/main/java/entities/LocationForest.java index e940de008..84d449358 100644 --- a/src/main/java/entities/LocationForest.java +++ b/src/main/java/entities/LocationForest.java @@ -91,4 +91,9 @@ public Double getsetthreatlevel(int dist) { public Double getthreatlevel() { return this.threat; } + + @Override + public String toString() { + return EntityConstants.FOREST; + } } diff --git a/src/main/java/entities/LocationIceland.java b/src/main/java/entities/LocationIceland.java index 78a37368a..8c7bb5cfe 100644 --- a/src/main/java/entities/LocationIceland.java +++ b/src/main/java/entities/LocationIceland.java @@ -92,4 +92,9 @@ public Double getthreatlevel() { return this.threat; } + @Override + public String toString() { + return EntityConstants.ICELAND; + } + } diff --git a/src/main/java/entities/LocationPlain.java b/src/main/java/entities/LocationPlain.java index 408ff820c..336ebd822 100644 --- a/src/main/java/entities/LocationPlain.java +++ b/src/main/java/entities/LocationPlain.java @@ -92,4 +92,9 @@ public Double getthreatlevel() { return this.threat; } + @Override + public String toString() { + return EntityConstants.PLAIN; + } + } diff --git a/src/main/java/usecases/decideevent/DecideEventDataAccessInterface.java b/src/main/java/usecases/decideevent/DecideEventDataAccessInterface.java new file mode 100644 index 000000000..48e544724 --- /dev/null +++ b/src/main/java/usecases/decideevent/DecideEventDataAccessInterface.java @@ -0,0 +1,27 @@ +package usecases.decideevent; + +import entities.Event; +import entities.Location; + +import java.util.ArrayList; + +/** + * Event deciding data access interface, which it need all lists of type event to get each probability of event, + * This usecase is responsible for deciding which event or events or no event happened on that day, and provide + * basic description of the event, as well as choices. consider this usecase as the before of respond usecase. + */ +public interface DecideEventDataAccessInterface { + + /** + * This method is responsible for get all event and their info. + * @return List of all events type data. + */ + ArrayList getEvents(); + + /** + * Get the player's current location, because certain event will only happen in certain location, Iceland + * blizzard etc. + * @return Location of the player. + */ + Location getLocation(); +} diff --git a/src/main/java/usecases/decideevent/DecideEventInputBoundary.java b/src/main/java/usecases/decideevent/DecideEventInputBoundary.java new file mode 100644 index 000000000..c1941c9f9 --- /dev/null +++ b/src/main/java/usecases/decideevent/DecideEventInputBoundary.java @@ -0,0 +1,13 @@ +package usecases.decideevent; + +/** + * Input boundary of decide event, will have execute based on input data provided, in this case, input data won't be + * necessary as this is system automatic processing to the next day. + */ +public interface DecideEventInputBoundary { + /** + * Execute the decide event, which takes list of event from DAO, and inputdata. + * @param inputdata inputdata type. + */ + void execute(DecideEventInputData inputdata); +} diff --git a/src/main/java/usecases/decideevent/DecideEventInputData.java b/src/main/java/usecases/decideevent/DecideEventInputData.java new file mode 100644 index 000000000..aa8d5d21d --- /dev/null +++ b/src/main/java/usecases/decideevent/DecideEventInputData.java @@ -0,0 +1,7 @@ +package usecases.decideevent; + +/** + * This input data is not necessary, we need nothing more than the fact that is after a new day. + */ +public class DecideEventInputData { +} diff --git a/src/main/java/usecases/decideevent/DecideEventInteractor.java b/src/main/java/usecases/decideevent/DecideEventInteractor.java new file mode 100644 index 000000000..3b69f484d --- /dev/null +++ b/src/main/java/usecases/decideevent/DecideEventInteractor.java @@ -0,0 +1,44 @@ +package usecases.decideevent; + +import java.util.ArrayList; + +import entities.Event; +import entities.Location; + +/** + * Event decider interactor, given list of events, process it, return list of events which will be carried out + * though the day. + */ +public class DecideEventInteractor implements DecideEventInputBoundary { + private DecideEventDataAccessInterface dataaccessobject; + private DecideEventOutputBoundary outputboundary; + + public DecideEventInteractor(DecideEventDataAccessInterface dataaccessobject, + DecideEventOutputBoundary outputboundary) { + this.dataaccessobject = dataaccessobject; + this.outputboundary = outputboundary; + } + + @Override + public void execute(DecideEventInputData inputdata) { + final ArrayList events = dataaccessobject.getEvents(); + final ArrayList decidedEvents = new ArrayList<>(); + final Location location = dataaccessobject.getLocation(); + final String locationName = location.toString(); + for (Event event : events) { + final ArrayList occuringlocations = event.getOccuringlocation(); + final double probability = event.getprobability(); + final double randomValue = Math.random(); + + if (randomValue < probability) { + if (occuringlocations.contains(locationName)) { + decidedEvents.add(event); + // will only add if probability hits, and is one of the possible location which player is at. + } + } + } + final DecideEventOutputData outputdata = new DecideEventOutputData(decidedEvents); + outputboundary.prepareSuccessView(outputdata); + } + +} \ No newline at end of file diff --git a/src/main/java/usecases/decideevent/DecideEventOutputBoundary.java b/src/main/java/usecases/decideevent/DecideEventOutputBoundary.java new file mode 100644 index 000000000..9fbec85af --- /dev/null +++ b/src/main/java/usecases/decideevent/DecideEventOutputBoundary.java @@ -0,0 +1,17 @@ +package usecases.decideevent; + +import usecases.move.MoveOutputData; + +public interface DecideEventOutputBoundary { + /** + * Outputs for a successful move. + * @param outputData the output for updating the view. + */ + void prepareSuccessView(DecideEventOutputData outputData); + + /** + * If the decide event is invaild, example: is on day 61? did player already lose? + * @param errorMessage message of why is invaild, for the player. + */ + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/decideevent/DecideEventOutputData.java b/src/main/java/usecases/decideevent/DecideEventOutputData.java new file mode 100644 index 000000000..d8c43157e --- /dev/null +++ b/src/main/java/usecases/decideevent/DecideEventOutputData.java @@ -0,0 +1,21 @@ +package usecases.decideevent; + +import java.util.ArrayList; + +import entities.Event; + +/** + * Return the list of event decided, and waiting to be carried out on the following day. + * Usually, is a empty list, but as we add more event, is expected to be more. + */ +public class DecideEventOutputData { + private ArrayList events; + + public DecideEventOutputData(ArrayList events) { + this.events = events; + } + + public ArrayList getEvents() { + return events; + } +} From b16c88f1e6b9287159c0b6f03c71f36ceacc297d Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Thu, 28 Nov 2024 12:46:42 -0700 Subject: [PATCH 033/154] EventInitialize usecase implemented --- .../DecideEventOutputBoundary.java | 6 ++-- .../EventInitializeDataAccessInterface.java | 16 +++++++++++ .../EventInitializeInputBoundary.java | 12 ++++++++ .../EventInitializeInputData.java | 7 +++++ .../EventInitializeInteractor.java | 26 +++++++++++++++++ .../EventInitializeOutputBoundary.java | 19 +++++++++++++ .../EventInitializeOutputData.java | 28 +++++++++++++++++++ 7 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 src/main/java/usecases/eventinitialize/EventInitializeDataAccessInterface.java create mode 100644 src/main/java/usecases/eventinitialize/EventInitializeInputBoundary.java create mode 100644 src/main/java/usecases/eventinitialize/EventInitializeInputData.java create mode 100644 src/main/java/usecases/eventinitialize/EventInitializeInteractor.java create mode 100644 src/main/java/usecases/eventinitialize/EventInitializeOutputBoundary.java create mode 100644 src/main/java/usecases/eventinitialize/EventInitializeOutputData.java diff --git a/src/main/java/usecases/decideevent/DecideEventOutputBoundary.java b/src/main/java/usecases/decideevent/DecideEventOutputBoundary.java index 9fbec85af..7391c6979 100644 --- a/src/main/java/usecases/decideevent/DecideEventOutputBoundary.java +++ b/src/main/java/usecases/decideevent/DecideEventOutputBoundary.java @@ -1,7 +1,9 @@ package usecases.decideevent; -import usecases.move.MoveOutputData; - +/** + * Deicde event, output boundary, though I can't really think of a way for it to fail, for people who are writing this, + * you can simply display "something went wrong" for fail view right now. + */ public interface DecideEventOutputBoundary { /** * Outputs for a successful move. diff --git a/src/main/java/usecases/eventinitialize/EventInitializeDataAccessInterface.java b/src/main/java/usecases/eventinitialize/EventInitializeDataAccessInterface.java new file mode 100644 index 000000000..c386066e5 --- /dev/null +++ b/src/main/java/usecases/eventinitialize/EventInitializeDataAccessInterface.java @@ -0,0 +1,16 @@ +package usecases.eventinitialize; + +import entities.Event; + +/** + * DAI of event initiaizer, assume this event is been chosen by event decider, this use case is for transform event + * to datatype which view needs, such as getting the choices, descriptions. + */ +public interface EventInitializeDataAccessInterface { + /** + * Get the event that's processing now. + * @return The event. + */ + Event getEvent(); + +} diff --git a/src/main/java/usecases/eventinitialize/EventInitializeInputBoundary.java b/src/main/java/usecases/eventinitialize/EventInitializeInputBoundary.java new file mode 100644 index 000000000..d4190625e --- /dev/null +++ b/src/main/java/usecases/eventinitialize/EventInitializeInputBoundary.java @@ -0,0 +1,12 @@ +package usecases.eventinitialize; + +/** + * Input boundary of event initializer, so interactor must have an execute method uses the inputdata. + */ +public interface EventInitializeInputBoundary { + /** + * An automatic usecase, no input from player side is needed. + * @param inputdata not really needed. + */ + void execute(EventInitializeInputData inputdata); +} diff --git a/src/main/java/usecases/eventinitialize/EventInitializeInputData.java b/src/main/java/usecases/eventinitialize/EventInitializeInputData.java new file mode 100644 index 000000000..6ab23f0c5 --- /dev/null +++ b/src/main/java/usecases/eventinitialize/EventInitializeInputData.java @@ -0,0 +1,7 @@ +package usecases.eventinitialize; + +/** + * Don't need any input data from player's side. this is automatic move. + */ +public class EventInitializeInputData { +} diff --git a/src/main/java/usecases/eventinitialize/EventInitializeInteractor.java b/src/main/java/usecases/eventinitialize/EventInitializeInteractor.java new file mode 100644 index 000000000..600e2c8b4 --- /dev/null +++ b/src/main/java/usecases/eventinitialize/EventInitializeInteractor.java @@ -0,0 +1,26 @@ +package usecases.eventinitialize; + +import java.util.Map; + +/** + * Interactor of event initialize, which tranform the given event to return output data type of description, + * and group of choices. + */ +public class EventInitializeInteractor implements EventInitializeInputBoundary { + private final EventInitializeDataAccessInterface dataAccessObject; + private final EventInitializeOutputBoundary outputBoundary; + + public EventInitializeInteractor(EventInitializeDataAccessInterface DataAccessObject, + EventInitializeOutputBoundary OutputBoundary) { + this.dataAccessObject = DataAccessObject; + this.outputBoundary = OutputBoundary; + } + + @Override + public void execute(EventInitializeInputData inputdata) { + final String description = dataAccessObject.getEvent().getdescription(); + final Map choices = dataAccessObject.getEvent().getchoices(); + final EventInitializeOutputData outputData = new EventInitializeOutputData(description, choices); + outputBoundary.prepareSuccessView(outputData); + } +} diff --git a/src/main/java/usecases/eventinitialize/EventInitializeOutputBoundary.java b/src/main/java/usecases/eventinitialize/EventInitializeOutputBoundary.java new file mode 100644 index 000000000..b6d9fd1dc --- /dev/null +++ b/src/main/java/usecases/eventinitialize/EventInitializeOutputBoundary.java @@ -0,0 +1,19 @@ +package usecases.eventinitialize; + +/** + * OutputBoundary of EventInitializer, it should display player with description, and group of choices button on the UI. + * Can't think of a way to fail, just write something went wrong in eventinitiallze if it happened. + */ +public interface EventInitializeOutputBoundary { + /** + * Outputs for a successful move. + * @param outputData the output for updating the view. + */ + void prepareSuccessView(EventInitializeOutputData outputData); + + /** + * If the use case is invaild. for example, no event was supposed to carry out but this got called. + * @param errorMessage message of why is invaild, for the player. + */ + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/eventinitialize/EventInitializeOutputData.java b/src/main/java/usecases/eventinitialize/EventInitializeOutputData.java new file mode 100644 index 000000000..f8f445058 --- /dev/null +++ b/src/main/java/usecases/eventinitialize/EventInitializeOutputData.java @@ -0,0 +1,28 @@ +package usecases.eventinitialize; + +import java.util.Map; + +/** + * The return data from interact, contain the description of the event, and choices. + */ +public class EventInitializeOutputData { + private String description; + private Map choices; + + EventInitializeOutputData(String description, Map choices) { + this.description = description; + this.choices = choices; + } + + private String getChoice(int key) { + return choices.get(key); + } + + private String getDescription() { + return description; + } + + private Map getChoices() { + return choices; + } +} From 1b3eb6b7f4bb9297ac9ab6c9a1c8a0678df9cdfd Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Thu, 28 Nov 2024 13:08:17 -0700 Subject: [PATCH 034/154] Usecase rename, reordering, minimap, placedescription usecase created (not implemented) --- .../controllers/LoginController.java | 4 ++-- .../controllers/RankingController.java | 4 ++-- .../controllers/SignupController.java | 4 ++-- .../presenters/LoginPresenter.java | 4 ++-- .../presenters/RankingPresenter.java | 4 ++-- .../presenters/SignupPresenter.java | 4 ++-- .../LoginDataAccessInterface.java | 2 +- .../LoginInputBoundary.java | 2 +- .../{login => accountlogin}/LoginInputData.java | 2 +- .../{login => accountlogin}/LoginInteractor.java | 2 +- .../LoginOutputBoundary.java | 2 +- .../{login => accountlogin}/LoginOutputData.java | 2 +- .../RankingDataAccessInterface.java | 2 +- .../RankingInputBoundary.java | 2 +- .../RankingInputData.java | 2 +- .../RankingInteractor.java | 2 +- .../RankingOutputBoundary.java | 2 +- .../RankingOutputData.java | 2 +- .../SignupDataAccessInterface.java | 2 +- .../SignupInputBoundary.java | 2 +- .../{signup => accountsignup}/SignupInputData.java | 2 +- .../SignupInteractor.java | 2 +- .../SignupOutputBoundary.java | 2 +- .../SignupOutputData.java | 2 +- .../BroadcastDataAccessInterface.java | 2 +- .../BroadcastInputBoundary.java | 2 +- .../BroadcastInputData.java | 2 +- .../BroadcastInteractor.java | 14 +++++++------- .../BroadcastOutputBoundary.java | 2 +- .../BroadcastOutputData.java | 2 +- .../GatherDataAccessInterface.java | 2 +- .../GatherInputBoundary.java | 2 +- .../{gather => dailygather}/GatherInputData.java | 2 +- .../{gather => dailygather}/GatherInteractor.java | 2 +- .../GatherOutputBoundary.java | 2 +- .../{gather => dailygather}/GatherOutputData.java | 2 +- .../MoveDataAccessInterface.java | 2 +- .../{move => dailymove}/MoveInputBoundary.java | 2 +- .../{move => dailymove}/MoveInputData.java | 2 +- .../{move => dailymove}/MoveInteractor.java | 2 +- .../{move => dailymove}/MoveOutputBoundary.java | 2 +- .../{move => dailymove}/MoveOutputData.java | 2 +- .../DecideEventDataAccessInterface.java | 2 +- .../DecideEventInputBoundary.java | 2 +- .../DecideEventInputData.java | 2 +- .../DecideEventInteractor.java | 2 +- .../DecideEventOutputBoundary.java | 2 +- .../DecideEventOutputData.java | 2 +- .../RespondDataAccessInterface.java | 2 +- .../RespondInputBoundary.java | 2 +- .../RespondInputData.java | 2 +- .../RespondInteractor.java | 3 +-- .../RespondOutputBoundary.java | 2 +- .../RespondOutputData.java | 2 +- .../gameminimap/MinimapDataAccessInterface.java | 4 ++++ .../usecases/gameminimap/MinimapInputBoundary.java | 4 ++++ .../usecases/gameminimap/MinimapInputData.java | 4 ++++ .../usecases/gameminimap/MinimapInteractor.java | 4 ++++ .../gameminimap/MinimapOutputBoundary.java | 4 ++++ .../usecases/gameminimap/MinimapOutputData.java | 4 ++++ .../NewdayDataAccessInterface.java | 2 +- .../NewdayInputBoundary.java | 2 +- .../{newday => gamenewday}/NewdayInputData.java | 2 +- .../{newday => gamenewday}/NewdayInteractor.java | 2 +- .../NewdayOutputBoundary.java | 2 +- .../{newday => gamenewday}/NewdayOutputData.java | 2 +- .../PlaceDescriptionDataAccessInterface.java | 4 ++++ .../PlaceDescriptionInputBoundary.java | 4 ++++ .../PlaceDescriptionInputData.java | 4 ++++ .../PlaceDescriptionInteractor.java | 4 ++++ .../PlaceDescriptionOutputBoundary.java | 4 ++++ .../PlaceDescriptionOutputData.java | 4 ++++ 72 files changed, 120 insertions(+), 73 deletions(-) rename src/main/java/usecases/{login => accountlogin}/LoginDataAccessInterface.java (95%) rename src/main/java/usecases/{login => accountlogin}/LoginInputBoundary.java (92%) rename src/main/java/usecases/{login => accountlogin}/LoginInputData.java (96%) rename src/main/java/usecases/{login => accountlogin}/LoginInteractor.java (98%) rename src/main/java/usecases/{login => accountlogin}/LoginOutputBoundary.java (94%) rename src/main/java/usecases/{login => accountlogin}/LoginOutputData.java (97%) rename src/main/java/usecases/{ranking => accountranking}/RankingDataAccessInterface.java (95%) rename src/main/java/usecases/{ranking => accountranking}/RankingInputBoundary.java (92%) rename src/main/java/usecases/{ranking => accountranking}/RankingInputData.java (95%) rename src/main/java/usecases/{ranking => accountranking}/RankingInteractor.java (98%) rename src/main/java/usecases/{ranking => accountranking}/RankingOutputBoundary.java (94%) rename src/main/java/usecases/{ranking => accountranking}/RankingOutputData.java (96%) rename src/main/java/usecases/{signup => accountsignup}/SignupDataAccessInterface.java (95%) rename src/main/java/usecases/{signup => accountsignup}/SignupInputBoundary.java (92%) rename src/main/java/usecases/{signup => accountsignup}/SignupInputData.java (97%) rename src/main/java/usecases/{signup => accountsignup}/SignupInteractor.java (98%) rename src/main/java/usecases/{signup => accountsignup}/SignupOutputBoundary.java (94%) rename src/main/java/usecases/{signup => accountsignup}/SignupOutputData.java (97%) rename src/main/java/usecases/{broadcast => dailybroadcast}/BroadcastDataAccessInterface.java (94%) rename src/main/java/usecases/{broadcast => dailybroadcast}/BroadcastInputBoundary.java (89%) rename src/main/java/usecases/{broadcast => dailybroadcast}/BroadcastInputData.java (90%) rename src/main/java/usecases/{broadcast => dailybroadcast}/BroadcastInteractor.java (74%) rename src/main/java/usecases/{broadcast => dailybroadcast}/BroadcastOutputBoundary.java (93%) rename src/main/java/usecases/{broadcast => dailybroadcast}/BroadcastOutputData.java (96%) rename src/main/java/usecases/{gather => dailygather}/GatherDataAccessInterface.java (97%) rename src/main/java/usecases/{gather => dailygather}/GatherInputBoundary.java (92%) rename src/main/java/usecases/{gather => dailygather}/GatherInputData.java (91%) rename src/main/java/usecases/{gather => dailygather}/GatherInteractor.java (98%) rename src/main/java/usecases/{gather => dailygather}/GatherOutputBoundary.java (95%) rename src/main/java/usecases/{gather => dailygather}/GatherOutputData.java (95%) rename src/main/java/usecases/{move => dailymove}/MoveDataAccessInterface.java (97%) rename src/main/java/usecases/{move => dailymove}/MoveInputBoundary.java (90%) rename src/main/java/usecases/{move => dailymove}/MoveInputData.java (90%) rename src/main/java/usecases/{move => dailymove}/MoveInteractor.java (99%) rename src/main/java/usecases/{move => dailymove}/MoveOutputBoundary.java (94%) rename src/main/java/usecases/{move => dailymove}/MoveOutputData.java (95%) rename src/main/java/usecases/{decideevent => eventdecide}/DecideEventDataAccessInterface.java (96%) rename src/main/java/usecases/{decideevent => eventdecide}/DecideEventInputBoundary.java (93%) rename src/main/java/usecases/{decideevent => eventdecide}/DecideEventInputData.java (82%) rename src/main/java/usecases/{decideevent => eventdecide}/DecideEventInteractor.java (98%) rename src/main/java/usecases/{decideevent => eventdecide}/DecideEventOutputBoundary.java (95%) rename src/main/java/usecases/{decideevent => eventdecide}/DecideEventOutputData.java (94%) rename src/main/java/usecases/{respond => eventrespond}/RespondDataAccessInterface.java (98%) rename src/main/java/usecases/{respond => eventrespond}/RespondInputBoundary.java (89%) rename src/main/java/usecases/{respond => eventrespond}/RespondInputData.java (90%) rename src/main/java/usecases/{respond => eventrespond}/RespondInteractor.java (99%) rename src/main/java/usecases/{respond => eventrespond}/RespondOutputBoundary.java (95%) rename src/main/java/usecases/{respond => eventrespond}/RespondOutputData.java (97%) create mode 100644 src/main/java/usecases/gameminimap/MinimapDataAccessInterface.java create mode 100644 src/main/java/usecases/gameminimap/MinimapInputBoundary.java create mode 100644 src/main/java/usecases/gameminimap/MinimapInputData.java create mode 100644 src/main/java/usecases/gameminimap/MinimapInteractor.java create mode 100644 src/main/java/usecases/gameminimap/MinimapOutputBoundary.java create mode 100644 src/main/java/usecases/gameminimap/MinimapOutputData.java rename src/main/java/usecases/{newday => gamenewday}/NewdayDataAccessInterface.java (98%) rename src/main/java/usecases/{newday => gamenewday}/NewdayInputBoundary.java (93%) rename src/main/java/usecases/{newday => gamenewday}/NewdayInputData.java (85%) rename src/main/java/usecases/{newday => gamenewday}/NewdayInteractor.java (99%) rename src/main/java/usecases/{newday => gamenewday}/NewdayOutputBoundary.java (95%) rename src/main/java/usecases/{newday => gamenewday}/NewdayOutputData.java (96%) create mode 100644 src/main/java/usecases/gameplacedescription/PlaceDescriptionDataAccessInterface.java create mode 100644 src/main/java/usecases/gameplacedescription/PlaceDescriptionInputBoundary.java create mode 100644 src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java create mode 100644 src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java create mode 100644 src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputBoundary.java create mode 100644 src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputData.java diff --git a/src/main/java/interface_adapters/controllers/LoginController.java b/src/main/java/interface_adapters/controllers/LoginController.java index 0718d275c..9323956aa 100644 --- a/src/main/java/interface_adapters/controllers/LoginController.java +++ b/src/main/java/interface_adapters/controllers/LoginController.java @@ -1,7 +1,7 @@ package interface_adapters.controllers; -import usecases.login.LoginInputBoundary; -import usecases.login.LoginInputData; +import usecases.accountlogin.LoginInputBoundary; +import usecases.accountlogin.LoginInputData; /** * The LoginController class is responsible for handling user input from the UI diff --git a/src/main/java/interface_adapters/controllers/RankingController.java b/src/main/java/interface_adapters/controllers/RankingController.java index d7b5aca78..ee0a822ca 100644 --- a/src/main/java/interface_adapters/controllers/RankingController.java +++ b/src/main/java/interface_adapters/controllers/RankingController.java @@ -1,7 +1,7 @@ package interface_adapters.controllers; -import usecases.ranking.RankingInputBoundary; -import usecases.ranking.RankingInputData; +import usecases.accountranking.RankingInputBoundary; +import usecases.accountranking.RankingInputData; /** * The RankingController class is responsible for handling user input from the UI diff --git a/src/main/java/interface_adapters/controllers/SignupController.java b/src/main/java/interface_adapters/controllers/SignupController.java index ca7be4dab..6cffc2870 100644 --- a/src/main/java/interface_adapters/controllers/SignupController.java +++ b/src/main/java/interface_adapters/controllers/SignupController.java @@ -1,7 +1,7 @@ package interface_adapters.controllers; -import usecases.signup.SignupInputBoundary; -import usecases.signup.SignupInputData; +import usecases.accountsignup.SignupInputBoundary; +import usecases.accountsignup.SignupInputData; /** * The SignupController class is responsible for handling user input from the UI diff --git a/src/main/java/interface_adapters/presenters/LoginPresenter.java b/src/main/java/interface_adapters/presenters/LoginPresenter.java index a6e095a3a..c4b0602e0 100644 --- a/src/main/java/interface_adapters/presenters/LoginPresenter.java +++ b/src/main/java/interface_adapters/presenters/LoginPresenter.java @@ -1,7 +1,7 @@ package interface_adapters.presenters; -import usecases.login.LoginOutputBoundary; -import usecases.login.LoginOutputData; +import usecases.accountlogin.LoginOutputBoundary; +import usecases.accountlogin.LoginOutputData; /** * The LoginPresenter class is responsible for formatting the output data diff --git a/src/main/java/interface_adapters/presenters/RankingPresenter.java b/src/main/java/interface_adapters/presenters/RankingPresenter.java index 4d2683627..212290c0a 100644 --- a/src/main/java/interface_adapters/presenters/RankingPresenter.java +++ b/src/main/java/interface_adapters/presenters/RankingPresenter.java @@ -3,8 +3,8 @@ import java.util.List; import entities.PlayerRankingEntry; -import usecases.ranking.RankingOutputBoundary; -import usecases.ranking.RankingOutputData; +import usecases.accountranking.RankingOutputBoundary; +import usecases.accountranking.RankingOutputData; /** * The RankingPresenter class is responsible for formatting the output data diff --git a/src/main/java/interface_adapters/presenters/SignupPresenter.java b/src/main/java/interface_adapters/presenters/SignupPresenter.java index 5cda72125..d109a2de2 100644 --- a/src/main/java/interface_adapters/presenters/SignupPresenter.java +++ b/src/main/java/interface_adapters/presenters/SignupPresenter.java @@ -1,7 +1,7 @@ package interface_adapters.presenters; -import usecases.signup.SignupOutputBoundary; -import usecases.signup.SignupOutputData; +import usecases.accountsignup.SignupOutputBoundary; +import usecases.accountsignup.SignupOutputData; /** * The SignupPresenter class is responsible for formatting the output data diff --git a/src/main/java/usecases/login/LoginDataAccessInterface.java b/src/main/java/usecases/accountlogin/LoginDataAccessInterface.java similarity index 95% rename from src/main/java/usecases/login/LoginDataAccessInterface.java rename to src/main/java/usecases/accountlogin/LoginDataAccessInterface.java index 05e783832..01952109f 100644 --- a/src/main/java/usecases/login/LoginDataAccessInterface.java +++ b/src/main/java/usecases/accountlogin/LoginDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.login; +package usecases.accountlogin; /** * Interface for accessing user data related to login. diff --git a/src/main/java/usecases/login/LoginInputBoundary.java b/src/main/java/usecases/accountlogin/LoginInputBoundary.java similarity index 92% rename from src/main/java/usecases/login/LoginInputBoundary.java rename to src/main/java/usecases/accountlogin/LoginInputBoundary.java index fd6379b13..c0b169a7c 100644 --- a/src/main/java/usecases/login/LoginInputBoundary.java +++ b/src/main/java/usecases/accountlogin/LoginInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.login; +package usecases.accountlogin; /** * Input boundary for the login use case. diff --git a/src/main/java/usecases/login/LoginInputData.java b/src/main/java/usecases/accountlogin/LoginInputData.java similarity index 96% rename from src/main/java/usecases/login/LoginInputData.java rename to src/main/java/usecases/accountlogin/LoginInputData.java index 326fa71f8..222b2a9ef 100644 --- a/src/main/java/usecases/login/LoginInputData.java +++ b/src/main/java/usecases/accountlogin/LoginInputData.java @@ -1,4 +1,4 @@ -package usecases.login; +package usecases.accountlogin; /** * Data class for encapsulating input data for the login use case. diff --git a/src/main/java/usecases/login/LoginInteractor.java b/src/main/java/usecases/accountlogin/LoginInteractor.java similarity index 98% rename from src/main/java/usecases/login/LoginInteractor.java rename to src/main/java/usecases/accountlogin/LoginInteractor.java index 01748a637..4ded0bd7e 100644 --- a/src/main/java/usecases/login/LoginInteractor.java +++ b/src/main/java/usecases/accountlogin/LoginInteractor.java @@ -1,4 +1,4 @@ -package usecases.login; +package usecases.accountlogin; /** * Use case interactor for login. diff --git a/src/main/java/usecases/login/LoginOutputBoundary.java b/src/main/java/usecases/accountlogin/LoginOutputBoundary.java similarity index 94% rename from src/main/java/usecases/login/LoginOutputBoundary.java rename to src/main/java/usecases/accountlogin/LoginOutputBoundary.java index 76145723e..668dfb147 100644 --- a/src/main/java/usecases/login/LoginOutputBoundary.java +++ b/src/main/java/usecases/accountlogin/LoginOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.login; +package usecases.accountlogin; /** * Output boundary for the login use case. diff --git a/src/main/java/usecases/login/LoginOutputData.java b/src/main/java/usecases/accountlogin/LoginOutputData.java similarity index 97% rename from src/main/java/usecases/login/LoginOutputData.java rename to src/main/java/usecases/accountlogin/LoginOutputData.java index bb6a792c8..d30b692d0 100644 --- a/src/main/java/usecases/login/LoginOutputData.java +++ b/src/main/java/usecases/accountlogin/LoginOutputData.java @@ -1,4 +1,4 @@ -package usecases.login; +package usecases.accountlogin; /** * Data class for encapsulating output data from the login use case. diff --git a/src/main/java/usecases/ranking/RankingDataAccessInterface.java b/src/main/java/usecases/accountranking/RankingDataAccessInterface.java similarity index 95% rename from src/main/java/usecases/ranking/RankingDataAccessInterface.java rename to src/main/java/usecases/accountranking/RankingDataAccessInterface.java index 776c5db2f..05e2b7cc6 100644 --- a/src/main/java/usecases/ranking/RankingDataAccessInterface.java +++ b/src/main/java/usecases/accountranking/RankingDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.ranking; +package usecases.accountranking; import java.util.List; diff --git a/src/main/java/usecases/ranking/RankingInputBoundary.java b/src/main/java/usecases/accountranking/RankingInputBoundary.java similarity index 92% rename from src/main/java/usecases/ranking/RankingInputBoundary.java rename to src/main/java/usecases/accountranking/RankingInputBoundary.java index 6042bbd85..f799107bf 100644 --- a/src/main/java/usecases/ranking/RankingInputBoundary.java +++ b/src/main/java/usecases/accountranking/RankingInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.ranking; +package usecases.accountranking; /** * Input boundary for the ranking use case. diff --git a/src/main/java/usecases/ranking/RankingInputData.java b/src/main/java/usecases/accountranking/RankingInputData.java similarity index 95% rename from src/main/java/usecases/ranking/RankingInputData.java rename to src/main/java/usecases/accountranking/RankingInputData.java index cd18b5033..6fb861d62 100644 --- a/src/main/java/usecases/ranking/RankingInputData.java +++ b/src/main/java/usecases/accountranking/RankingInputData.java @@ -1,4 +1,4 @@ -package usecases.ranking; +package usecases.accountranking; /** * Data class for encapsulating input data for the ranking use case. diff --git a/src/main/java/usecases/ranking/RankingInteractor.java b/src/main/java/usecases/accountranking/RankingInteractor.java similarity index 98% rename from src/main/java/usecases/ranking/RankingInteractor.java rename to src/main/java/usecases/accountranking/RankingInteractor.java index 1ed093fa6..783cba875 100644 --- a/src/main/java/usecases/ranking/RankingInteractor.java +++ b/src/main/java/usecases/accountranking/RankingInteractor.java @@ -1,4 +1,4 @@ -package usecases.ranking; +package usecases.accountranking; import java.util.Comparator; import java.util.List; diff --git a/src/main/java/usecases/ranking/RankingOutputBoundary.java b/src/main/java/usecases/accountranking/RankingOutputBoundary.java similarity index 94% rename from src/main/java/usecases/ranking/RankingOutputBoundary.java rename to src/main/java/usecases/accountranking/RankingOutputBoundary.java index cc614f9fe..ef2ce58d1 100644 --- a/src/main/java/usecases/ranking/RankingOutputBoundary.java +++ b/src/main/java/usecases/accountranking/RankingOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.ranking; +package usecases.accountranking; /** * Output boundary for the ranking use case. diff --git a/src/main/java/usecases/ranking/RankingOutputData.java b/src/main/java/usecases/accountranking/RankingOutputData.java similarity index 96% rename from src/main/java/usecases/ranking/RankingOutputData.java rename to src/main/java/usecases/accountranking/RankingOutputData.java index ee11e34a7..5b173847c 100644 --- a/src/main/java/usecases/ranking/RankingOutputData.java +++ b/src/main/java/usecases/accountranking/RankingOutputData.java @@ -1,4 +1,4 @@ -package usecases.ranking; +package usecases.accountranking; import java.util.List; diff --git a/src/main/java/usecases/signup/SignupDataAccessInterface.java b/src/main/java/usecases/accountsignup/SignupDataAccessInterface.java similarity index 95% rename from src/main/java/usecases/signup/SignupDataAccessInterface.java rename to src/main/java/usecases/accountsignup/SignupDataAccessInterface.java index bbb486abd..917ad5125 100644 --- a/src/main/java/usecases/signup/SignupDataAccessInterface.java +++ b/src/main/java/usecases/accountsignup/SignupDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.signup; +package usecases.accountsignup; /** * Interface for accessing user data related to signup. diff --git a/src/main/java/usecases/signup/SignupInputBoundary.java b/src/main/java/usecases/accountsignup/SignupInputBoundary.java similarity index 92% rename from src/main/java/usecases/signup/SignupInputBoundary.java rename to src/main/java/usecases/accountsignup/SignupInputBoundary.java index f3456850d..e115ccf47 100644 --- a/src/main/java/usecases/signup/SignupInputBoundary.java +++ b/src/main/java/usecases/accountsignup/SignupInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.signup; +package usecases.accountsignup; /** * Input boundary for the signup use case. diff --git a/src/main/java/usecases/signup/SignupInputData.java b/src/main/java/usecases/accountsignup/SignupInputData.java similarity index 97% rename from src/main/java/usecases/signup/SignupInputData.java rename to src/main/java/usecases/accountsignup/SignupInputData.java index 6ebf34dde..87f562e70 100644 --- a/src/main/java/usecases/signup/SignupInputData.java +++ b/src/main/java/usecases/accountsignup/SignupInputData.java @@ -1,4 +1,4 @@ -package usecases.signup; +package usecases.accountsignup; /** * Data class for encapsulating input data for the signup use case. diff --git a/src/main/java/usecases/signup/SignupInteractor.java b/src/main/java/usecases/accountsignup/SignupInteractor.java similarity index 98% rename from src/main/java/usecases/signup/SignupInteractor.java rename to src/main/java/usecases/accountsignup/SignupInteractor.java index 730410a27..170ed5eaa 100644 --- a/src/main/java/usecases/signup/SignupInteractor.java +++ b/src/main/java/usecases/accountsignup/SignupInteractor.java @@ -1,4 +1,4 @@ -package usecases.signup; +package usecases.accountsignup; /** * Use case interactor for signup. diff --git a/src/main/java/usecases/signup/SignupOutputBoundary.java b/src/main/java/usecases/accountsignup/SignupOutputBoundary.java similarity index 94% rename from src/main/java/usecases/signup/SignupOutputBoundary.java rename to src/main/java/usecases/accountsignup/SignupOutputBoundary.java index a4dfc3367..3517b04e9 100644 --- a/src/main/java/usecases/signup/SignupOutputBoundary.java +++ b/src/main/java/usecases/accountsignup/SignupOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.signup; +package usecases.accountsignup; /** * Output boundary for the signup use case. diff --git a/src/main/java/usecases/signup/SignupOutputData.java b/src/main/java/usecases/accountsignup/SignupOutputData.java similarity index 97% rename from src/main/java/usecases/signup/SignupOutputData.java rename to src/main/java/usecases/accountsignup/SignupOutputData.java index eecf3e0d2..324a5ff4d 100644 --- a/src/main/java/usecases/signup/SignupOutputData.java +++ b/src/main/java/usecases/accountsignup/SignupOutputData.java @@ -1,4 +1,4 @@ -package usecases.signup; +package usecases.accountsignup; /** * Data class for encapsulating output data from the signup use case. diff --git a/src/main/java/usecases/broadcast/BroadcastDataAccessInterface.java b/src/main/java/usecases/dailybroadcast/BroadcastDataAccessInterface.java similarity index 94% rename from src/main/java/usecases/broadcast/BroadcastDataAccessInterface.java rename to src/main/java/usecases/dailybroadcast/BroadcastDataAccessInterface.java index 86ab67610..4321aa7c7 100644 --- a/src/main/java/usecases/broadcast/BroadcastDataAccessInterface.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.broadcast; +package usecases.dailybroadcast; import entities.Inventory; import entities.PlayerAttributes; diff --git a/src/main/java/usecases/broadcast/BroadcastInputBoundary.java b/src/main/java/usecases/dailybroadcast/BroadcastInputBoundary.java similarity index 89% rename from src/main/java/usecases/broadcast/BroadcastInputBoundary.java rename to src/main/java/usecases/dailybroadcast/BroadcastInputBoundary.java index e606d9028..0f980f8cf 100644 --- a/src/main/java/usecases/broadcast/BroadcastInputBoundary.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.broadcast; +package usecases.dailybroadcast; /** * Input boundary for the broadcast use case. diff --git a/src/main/java/usecases/broadcast/BroadcastInputData.java b/src/main/java/usecases/dailybroadcast/BroadcastInputData.java similarity index 90% rename from src/main/java/usecases/broadcast/BroadcastInputData.java rename to src/main/java/usecases/dailybroadcast/BroadcastInputData.java index e1b86cbfe..ab760d835 100644 --- a/src/main/java/usecases/broadcast/BroadcastInputData.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastInputData.java @@ -1,4 +1,4 @@ -package usecases.broadcast; +package usecases.dailybroadcast; /** * Input data for the broadcast use case. diff --git a/src/main/java/usecases/broadcast/BroadcastInteractor.java b/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java similarity index 74% rename from src/main/java/usecases/broadcast/BroadcastInteractor.java rename to src/main/java/usecases/dailybroadcast/BroadcastInteractor.java index 5f4248d57..054067803 100644 --- a/src/main/java/usecases/broadcast/BroadcastInteractor.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java @@ -1,4 +1,4 @@ -package usecases.broadcast; +package usecases.dailybroadcast; import entities.Inventory; import entities.PlayerAttributes; @@ -8,18 +8,18 @@ /** * Interactor for the broadcast use case. */ -public class BroadcastInteractor implements usecases.broadcast.BroadcastInputBoundary { - private final usecases.broadcast.BroadcastDataAccessInterface dataAccessInterface; - private final usecases.broadcast.BroadcastOutputBoundary outputBoundary; +public class BroadcastInteractor implements usecases.dailybroadcast.BroadcastInputBoundary { + private final usecases.dailybroadcast.BroadcastDataAccessInterface dataAccessInterface; + private final usecases.dailybroadcast.BroadcastOutputBoundary outputBoundary; - public BroadcastInteractor(usecases.broadcast.BroadcastDataAccessInterface dataAccessInterface, - usecases.broadcast.BroadcastOutputBoundary outputBoundary) { + public BroadcastInteractor(usecases.dailybroadcast.BroadcastDataAccessInterface dataAccessInterface, + usecases.dailybroadcast.BroadcastOutputBoundary outputBoundary) { this.dataAccessInterface = dataAccessInterface; this.outputBoundary = outputBoundary; } @Override - public void execute(usecases.broadcast.BroadcastInputData inputData) { + public void execute(usecases.dailybroadcast.BroadcastInputData inputData) { PlayerAttributes attributes = dataAccessInterface.getPlayerAttributes(); Inventory inventory = dataAccessInterface.getInventory(); diff --git a/src/main/java/usecases/broadcast/BroadcastOutputBoundary.java b/src/main/java/usecases/dailybroadcast/BroadcastOutputBoundary.java similarity index 93% rename from src/main/java/usecases/broadcast/BroadcastOutputBoundary.java rename to src/main/java/usecases/dailybroadcast/BroadcastOutputBoundary.java index 069575fe6..e1ae6794a 100644 --- a/src/main/java/usecases/broadcast/BroadcastOutputBoundary.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.broadcast; +package usecases.dailybroadcast; /** * Output boundary for the broadcast use case. diff --git a/src/main/java/usecases/broadcast/BroadcastOutputData.java b/src/main/java/usecases/dailybroadcast/BroadcastOutputData.java similarity index 96% rename from src/main/java/usecases/broadcast/BroadcastOutputData.java rename to src/main/java/usecases/dailybroadcast/BroadcastOutputData.java index 809ded57b..e07c84343 100644 --- a/src/main/java/usecases/broadcast/BroadcastOutputData.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastOutputData.java @@ -1,4 +1,4 @@ -package usecases.broadcast; +package usecases.dailybroadcast; /** * Output data for the broadcast use case. diff --git a/src/main/java/usecases/gather/GatherDataAccessInterface.java b/src/main/java/usecases/dailygather/GatherDataAccessInterface.java similarity index 97% rename from src/main/java/usecases/gather/GatherDataAccessInterface.java rename to src/main/java/usecases/dailygather/GatherDataAccessInterface.java index 19519fadc..c40879b8d 100644 --- a/src/main/java/usecases/gather/GatherDataAccessInterface.java +++ b/src/main/java/usecases/dailygather/GatherDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.gather; +package usecases.dailygather; import entities.Inventory; import entities.Location; diff --git a/src/main/java/usecases/gather/GatherInputBoundary.java b/src/main/java/usecases/dailygather/GatherInputBoundary.java similarity index 92% rename from src/main/java/usecases/gather/GatherInputBoundary.java rename to src/main/java/usecases/dailygather/GatherInputBoundary.java index 7d4cdd802..9336f4c1c 100644 --- a/src/main/java/usecases/gather/GatherInputBoundary.java +++ b/src/main/java/usecases/dailygather/GatherInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.gather; +package usecases.dailygather; /** * Interface of input, which implemented by according interactor. diff --git a/src/main/java/usecases/gather/GatherInputData.java b/src/main/java/usecases/dailygather/GatherInputData.java similarity index 91% rename from src/main/java/usecases/gather/GatherInputData.java rename to src/main/java/usecases/dailygather/GatherInputData.java index 8b8abc82c..a4a0943a4 100644 --- a/src/main/java/usecases/gather/GatherInputData.java +++ b/src/main/java/usecases/dailygather/GatherInputData.java @@ -1,4 +1,4 @@ -package usecases.gather; +package usecases.dailygather; /** * Gather input data, which is for player's input, the fact that player clicked on gather. diff --git a/src/main/java/usecases/gather/GatherInteractor.java b/src/main/java/usecases/dailygather/GatherInteractor.java similarity index 98% rename from src/main/java/usecases/gather/GatherInteractor.java rename to src/main/java/usecases/dailygather/GatherInteractor.java index 1057e98bf..7194dbf1f 100644 --- a/src/main/java/usecases/gather/GatherInteractor.java +++ b/src/main/java/usecases/dailygather/GatherInteractor.java @@ -1,4 +1,4 @@ -package usecases.gather; +package usecases.dailygather; /** * Use case interactor for gather. diff --git a/src/main/java/usecases/gather/GatherOutputBoundary.java b/src/main/java/usecases/dailygather/GatherOutputBoundary.java similarity index 95% rename from src/main/java/usecases/gather/GatherOutputBoundary.java rename to src/main/java/usecases/dailygather/GatherOutputBoundary.java index b6411cbb9..497a5f274 100644 --- a/src/main/java/usecases/gather/GatherOutputBoundary.java +++ b/src/main/java/usecases/dailygather/GatherOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.gather; +package usecases.dailygather; /** * Output boundary for gather use case, responsible for providing the new view after the use case executed. diff --git a/src/main/java/usecases/gather/GatherOutputData.java b/src/main/java/usecases/dailygather/GatherOutputData.java similarity index 95% rename from src/main/java/usecases/gather/GatherOutputData.java rename to src/main/java/usecases/dailygather/GatherOutputData.java index 5ad02e9d9..6fa0ab24f 100644 --- a/src/main/java/usecases/gather/GatherOutputData.java +++ b/src/main/java/usecases/dailygather/GatherOutputData.java @@ -1,4 +1,4 @@ -package usecases.gather; +package usecases.dailygather; /** * Outputdata for the new view, notice the classes are already updated in execution of interactor, so this is just diff --git a/src/main/java/usecases/move/MoveDataAccessInterface.java b/src/main/java/usecases/dailymove/MoveDataAccessInterface.java similarity index 97% rename from src/main/java/usecases/move/MoveDataAccessInterface.java rename to src/main/java/usecases/dailymove/MoveDataAccessInterface.java index 1ae8f276c..f470779d9 100644 --- a/src/main/java/usecases/move/MoveDataAccessInterface.java +++ b/src/main/java/usecases/dailymove/MoveDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.move; +package usecases.dailymove; import entities.Maps; import entities.PlayerAttributes; diff --git a/src/main/java/usecases/move/MoveInputBoundary.java b/src/main/java/usecases/dailymove/MoveInputBoundary.java similarity index 90% rename from src/main/java/usecases/move/MoveInputBoundary.java rename to src/main/java/usecases/dailymove/MoveInputBoundary.java index 6a85b97b8..82eaf58fb 100644 --- a/src/main/java/usecases/move/MoveInputBoundary.java +++ b/src/main/java/usecases/dailymove/MoveInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.move; +package usecases.dailymove; /** * Input boundary of the use case move. diff --git a/src/main/java/usecases/move/MoveInputData.java b/src/main/java/usecases/dailymove/MoveInputData.java similarity index 90% rename from src/main/java/usecases/move/MoveInputData.java rename to src/main/java/usecases/dailymove/MoveInputData.java index 9b181d02c..4a40ff62d 100644 --- a/src/main/java/usecases/move/MoveInputData.java +++ b/src/main/java/usecases/dailymove/MoveInputData.java @@ -1,4 +1,4 @@ -package usecases.move; +package usecases.dailymove; /** diff --git a/src/main/java/usecases/move/MoveInteractor.java b/src/main/java/usecases/dailymove/MoveInteractor.java similarity index 99% rename from src/main/java/usecases/move/MoveInteractor.java rename to src/main/java/usecases/dailymove/MoveInteractor.java index 79423a7f9..13550274d 100644 --- a/src/main/java/usecases/move/MoveInteractor.java +++ b/src/main/java/usecases/dailymove/MoveInteractor.java @@ -1,4 +1,4 @@ -package usecases.move; +package usecases.dailymove; import entities.EntityConstants; import entities.PlayerLocation; diff --git a/src/main/java/usecases/move/MoveOutputBoundary.java b/src/main/java/usecases/dailymove/MoveOutputBoundary.java similarity index 94% rename from src/main/java/usecases/move/MoveOutputBoundary.java rename to src/main/java/usecases/dailymove/MoveOutputBoundary.java index e34c6ce6e..c53a85555 100644 --- a/src/main/java/usecases/move/MoveOutputBoundary.java +++ b/src/main/java/usecases/dailymove/MoveOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.move; +package usecases.dailymove; /** * Interface of output boundary. diff --git a/src/main/java/usecases/move/MoveOutputData.java b/src/main/java/usecases/dailymove/MoveOutputData.java similarity index 95% rename from src/main/java/usecases/move/MoveOutputData.java rename to src/main/java/usecases/dailymove/MoveOutputData.java index 9b480aa8b..5d75c2acc 100644 --- a/src/main/java/usecases/move/MoveOutputData.java +++ b/src/main/java/usecases/dailymove/MoveOutputData.java @@ -1,4 +1,4 @@ -package usecases.move; +package usecases.dailymove; public class MoveOutputData { diff --git a/src/main/java/usecases/decideevent/DecideEventDataAccessInterface.java b/src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java similarity index 96% rename from src/main/java/usecases/decideevent/DecideEventDataAccessInterface.java rename to src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java index 48e544724..ae44d0d57 100644 --- a/src/main/java/usecases/decideevent/DecideEventDataAccessInterface.java +++ b/src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.decideevent; +package usecases.eventdecide; import entities.Event; import entities.Location; diff --git a/src/main/java/usecases/decideevent/DecideEventInputBoundary.java b/src/main/java/usecases/eventdecide/DecideEventInputBoundary.java similarity index 93% rename from src/main/java/usecases/decideevent/DecideEventInputBoundary.java rename to src/main/java/usecases/eventdecide/DecideEventInputBoundary.java index c1941c9f9..e3693c7ac 100644 --- a/src/main/java/usecases/decideevent/DecideEventInputBoundary.java +++ b/src/main/java/usecases/eventdecide/DecideEventInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.decideevent; +package usecases.eventdecide; /** * Input boundary of decide event, will have execute based on input data provided, in this case, input data won't be diff --git a/src/main/java/usecases/decideevent/DecideEventInputData.java b/src/main/java/usecases/eventdecide/DecideEventInputData.java similarity index 82% rename from src/main/java/usecases/decideevent/DecideEventInputData.java rename to src/main/java/usecases/eventdecide/DecideEventInputData.java index aa8d5d21d..2a3593042 100644 --- a/src/main/java/usecases/decideevent/DecideEventInputData.java +++ b/src/main/java/usecases/eventdecide/DecideEventInputData.java @@ -1,4 +1,4 @@ -package usecases.decideevent; +package usecases.eventdecide; /** * This input data is not necessary, we need nothing more than the fact that is after a new day. diff --git a/src/main/java/usecases/decideevent/DecideEventInteractor.java b/src/main/java/usecases/eventdecide/DecideEventInteractor.java similarity index 98% rename from src/main/java/usecases/decideevent/DecideEventInteractor.java rename to src/main/java/usecases/eventdecide/DecideEventInteractor.java index 3b69f484d..049c4f875 100644 --- a/src/main/java/usecases/decideevent/DecideEventInteractor.java +++ b/src/main/java/usecases/eventdecide/DecideEventInteractor.java @@ -1,4 +1,4 @@ -package usecases.decideevent; +package usecases.eventdecide; import java.util.ArrayList; diff --git a/src/main/java/usecases/decideevent/DecideEventOutputBoundary.java b/src/main/java/usecases/eventdecide/DecideEventOutputBoundary.java similarity index 95% rename from src/main/java/usecases/decideevent/DecideEventOutputBoundary.java rename to src/main/java/usecases/eventdecide/DecideEventOutputBoundary.java index 7391c6979..9c2242f7c 100644 --- a/src/main/java/usecases/decideevent/DecideEventOutputBoundary.java +++ b/src/main/java/usecases/eventdecide/DecideEventOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.decideevent; +package usecases.eventdecide; /** * Deicde event, output boundary, though I can't really think of a way for it to fail, for people who are writing this, diff --git a/src/main/java/usecases/decideevent/DecideEventOutputData.java b/src/main/java/usecases/eventdecide/DecideEventOutputData.java similarity index 94% rename from src/main/java/usecases/decideevent/DecideEventOutputData.java rename to src/main/java/usecases/eventdecide/DecideEventOutputData.java index d8c43157e..def7014f3 100644 --- a/src/main/java/usecases/decideevent/DecideEventOutputData.java +++ b/src/main/java/usecases/eventdecide/DecideEventOutputData.java @@ -1,4 +1,4 @@ -package usecases.decideevent; +package usecases.eventdecide; import java.util.ArrayList; diff --git a/src/main/java/usecases/respond/RespondDataAccessInterface.java b/src/main/java/usecases/eventrespond/RespondDataAccessInterface.java similarity index 98% rename from src/main/java/usecases/respond/RespondDataAccessInterface.java rename to src/main/java/usecases/eventrespond/RespondDataAccessInterface.java index f99cce677..58c09710b 100644 --- a/src/main/java/usecases/respond/RespondDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/RespondDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.respond; +package usecases.eventrespond; import entities.Event; import entities.Inventory; diff --git a/src/main/java/usecases/respond/RespondInputBoundary.java b/src/main/java/usecases/eventrespond/RespondInputBoundary.java similarity index 89% rename from src/main/java/usecases/respond/RespondInputBoundary.java rename to src/main/java/usecases/eventrespond/RespondInputBoundary.java index 731efbac9..880f6b160 100644 --- a/src/main/java/usecases/respond/RespondInputBoundary.java +++ b/src/main/java/usecases/eventrespond/RespondInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.respond; +package usecases.eventrespond; /** * Input boundary of respond use case. diff --git a/src/main/java/usecases/respond/RespondInputData.java b/src/main/java/usecases/eventrespond/RespondInputData.java similarity index 90% rename from src/main/java/usecases/respond/RespondInputData.java rename to src/main/java/usecases/eventrespond/RespondInputData.java index 83770dcfe..cc0629f08 100644 --- a/src/main/java/usecases/respond/RespondInputData.java +++ b/src/main/java/usecases/eventrespond/RespondInputData.java @@ -1,4 +1,4 @@ -package usecases.respond; +package usecases.eventrespond; /** * Input data form the view/player side like the choice they choose in term os 12345... diff --git a/src/main/java/usecases/respond/RespondInteractor.java b/src/main/java/usecases/eventrespond/RespondInteractor.java similarity index 99% rename from src/main/java/usecases/respond/RespondInteractor.java rename to src/main/java/usecases/eventrespond/RespondInteractor.java index a74357728..7c51b4a8e 100644 --- a/src/main/java/usecases/respond/RespondInteractor.java +++ b/src/main/java/usecases/eventrespond/RespondInteractor.java @@ -1,4 +1,4 @@ -package usecases.respond; +package usecases.eventrespond; import entities.EntityConstants; import entities.Event; @@ -9,7 +9,6 @@ import entities.Inventory; import entities.PlayerAttributes; import kotlin.Pair; -import java.util.Random; /** diff --git a/src/main/java/usecases/respond/RespondOutputBoundary.java b/src/main/java/usecases/eventrespond/RespondOutputBoundary.java similarity index 95% rename from src/main/java/usecases/respond/RespondOutputBoundary.java rename to src/main/java/usecases/eventrespond/RespondOutputBoundary.java index 0f5241bd8..dc57afbfc 100644 --- a/src/main/java/usecases/respond/RespondOutputBoundary.java +++ b/src/main/java/usecases/eventrespond/RespondOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.respond; +package usecases.eventrespond; /** * Output boundary, responsible for passing output data to the controller. diff --git a/src/main/java/usecases/respond/RespondOutputData.java b/src/main/java/usecases/eventrespond/RespondOutputData.java similarity index 97% rename from src/main/java/usecases/respond/RespondOutputData.java rename to src/main/java/usecases/eventrespond/RespondOutputData.java index 5424c9ac2..732b685ea 100644 --- a/src/main/java/usecases/respond/RespondOutputData.java +++ b/src/main/java/usecases/eventrespond/RespondOutputData.java @@ -1,4 +1,4 @@ -package usecases.respond; +package usecases.eventrespond; /** * Output data for the player's respond. diff --git a/src/main/java/usecases/gameminimap/MinimapDataAccessInterface.java b/src/main/java/usecases/gameminimap/MinimapDataAccessInterface.java new file mode 100644 index 000000000..724dd37f4 --- /dev/null +++ b/src/main/java/usecases/gameminimap/MinimapDataAccessInterface.java @@ -0,0 +1,4 @@ +package usecases.gameminimap; + +public interface MinimapDataAccessInterface { +} diff --git a/src/main/java/usecases/gameminimap/MinimapInputBoundary.java b/src/main/java/usecases/gameminimap/MinimapInputBoundary.java new file mode 100644 index 000000000..4ee1458a2 --- /dev/null +++ b/src/main/java/usecases/gameminimap/MinimapInputBoundary.java @@ -0,0 +1,4 @@ +package usecases.gameminimap; + +public interface MinimapInputBoundary { +} diff --git a/src/main/java/usecases/gameminimap/MinimapInputData.java b/src/main/java/usecases/gameminimap/MinimapInputData.java new file mode 100644 index 000000000..4216bff1b --- /dev/null +++ b/src/main/java/usecases/gameminimap/MinimapInputData.java @@ -0,0 +1,4 @@ +package usecases.gameminimap; + +public class MinimapInputData { +} diff --git a/src/main/java/usecases/gameminimap/MinimapInteractor.java b/src/main/java/usecases/gameminimap/MinimapInteractor.java new file mode 100644 index 000000000..8dce5d9d4 --- /dev/null +++ b/src/main/java/usecases/gameminimap/MinimapInteractor.java @@ -0,0 +1,4 @@ +package usecases.gameminimap; + +public class MinimapInteractor { +} diff --git a/src/main/java/usecases/gameminimap/MinimapOutputBoundary.java b/src/main/java/usecases/gameminimap/MinimapOutputBoundary.java new file mode 100644 index 000000000..42bbc26e4 --- /dev/null +++ b/src/main/java/usecases/gameminimap/MinimapOutputBoundary.java @@ -0,0 +1,4 @@ +package usecases.gameminimap; + +public interface MinimapOutputBoundary { +} diff --git a/src/main/java/usecases/gameminimap/MinimapOutputData.java b/src/main/java/usecases/gameminimap/MinimapOutputData.java new file mode 100644 index 000000000..dbd0ddf18 --- /dev/null +++ b/src/main/java/usecases/gameminimap/MinimapOutputData.java @@ -0,0 +1,4 @@ +package usecases.gameminimap; + +public class MinimapOutputData { +} diff --git a/src/main/java/usecases/newday/NewdayDataAccessInterface.java b/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java similarity index 98% rename from src/main/java/usecases/newday/NewdayDataAccessInterface.java rename to src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java index 174088032..2e86a1b9f 100644 --- a/src/main/java/usecases/newday/NewdayDataAccessInterface.java +++ b/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.newday; +package usecases.gamenewday; import entities.Inventory; import entities.Location; diff --git a/src/main/java/usecases/newday/NewdayInputBoundary.java b/src/main/java/usecases/gamenewday/NewdayInputBoundary.java similarity index 93% rename from src/main/java/usecases/newday/NewdayInputBoundary.java rename to src/main/java/usecases/gamenewday/NewdayInputBoundary.java index 7df9dba0b..7dc39ace5 100644 --- a/src/main/java/usecases/newday/NewdayInputBoundary.java +++ b/src/main/java/usecases/gamenewday/NewdayInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.newday; +package usecases.gamenewday; /** * Input boundary of the newday, so interactor must have this execute method. diff --git a/src/main/java/usecases/newday/NewdayInputData.java b/src/main/java/usecases/gamenewday/NewdayInputData.java similarity index 85% rename from src/main/java/usecases/newday/NewdayInputData.java rename to src/main/java/usecases/gamenewday/NewdayInputData.java index abd1c2ace..5143ad4eb 100644 --- a/src/main/java/usecases/newday/NewdayInputData.java +++ b/src/main/java/usecases/gamenewday/NewdayInputData.java @@ -1,4 +1,4 @@ -package usecases.newday; +package usecases.gamenewday; /** * Input data from player ui side, which is nothing because we don't need anything to decide how everything is change diff --git a/src/main/java/usecases/newday/NewdayInteractor.java b/src/main/java/usecases/gamenewday/NewdayInteractor.java similarity index 99% rename from src/main/java/usecases/newday/NewdayInteractor.java rename to src/main/java/usecases/gamenewday/NewdayInteractor.java index eb298276d..256819f59 100644 --- a/src/main/java/usecases/newday/NewdayInteractor.java +++ b/src/main/java/usecases/gamenewday/NewdayInteractor.java @@ -1,4 +1,4 @@ -package usecases.newday; +package usecases.gamenewday; import entities.EntityConstants; diff --git a/src/main/java/usecases/newday/NewdayOutputBoundary.java b/src/main/java/usecases/gamenewday/NewdayOutputBoundary.java similarity index 95% rename from src/main/java/usecases/newday/NewdayOutputBoundary.java rename to src/main/java/usecases/gamenewday/NewdayOutputBoundary.java index 59cb5564a..cadba6996 100644 --- a/src/main/java/usecases/newday/NewdayOutputBoundary.java +++ b/src/main/java/usecases/gamenewday/NewdayOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.newday; +package usecases.gamenewday; /** * Output boundary for newday, either prepare a success use case view with message returned as output data, or failed. diff --git a/src/main/java/usecases/newday/NewdayOutputData.java b/src/main/java/usecases/gamenewday/NewdayOutputData.java similarity index 96% rename from src/main/java/usecases/newday/NewdayOutputData.java rename to src/main/java/usecases/gamenewday/NewdayOutputData.java index 247fc08ee..3792ce4f4 100644 --- a/src/main/java/usecases/newday/NewdayOutputData.java +++ b/src/main/java/usecases/gamenewday/NewdayOutputData.java @@ -1,4 +1,4 @@ -package usecases.newday; +package usecases.gamenewday; /** * Output data of newday after is done, should return a message saying what happened, how many people gained, lose, etc. diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionDataAccessInterface.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionDataAccessInterface.java new file mode 100644 index 000000000..014892afd --- /dev/null +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionDataAccessInterface.java @@ -0,0 +1,4 @@ +package usecases.gameplacedescription; + +public interface PlaceDescriptionDataAccessInterface { +} diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputBoundary.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputBoundary.java new file mode 100644 index 000000000..333e459bc --- /dev/null +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputBoundary.java @@ -0,0 +1,4 @@ +package usecases.gameplacedescription; + +public interface PlaceDescriptionInputBoundary { +} diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java new file mode 100644 index 000000000..8dc4f1c13 --- /dev/null +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java @@ -0,0 +1,4 @@ +package usecases.gameplacedescription; + +public class PlaceDescriptionInputData { +} diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java new file mode 100644 index 000000000..d662ecfdc --- /dev/null +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java @@ -0,0 +1,4 @@ +package usecases.gameplacedescription; + +public class PlaceDescriptionInteractor { +} diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputBoundary.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputBoundary.java new file mode 100644 index 000000000..494426943 --- /dev/null +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputBoundary.java @@ -0,0 +1,4 @@ +package usecases.gameplacedescription; + +public interface PlaceDescriptionOutputBoundary { +} diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputData.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputData.java new file mode 100644 index 000000000..62efaf292 --- /dev/null +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputData.java @@ -0,0 +1,4 @@ +package usecases.gameplacedescription; + +public class PlaceDescriptionOutputData { +} From ef56b574d0e458d503017435c20310465ae558fc Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Thu, 28 Nov 2024 16:46:38 -0500 Subject: [PATCH 035/154] rename PlayerRankingEntry --- .../frameworks/database/JsonRankingRepository.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/frameworks/database/JsonRankingRepository.java b/src/main/java/frameworks/database/JsonRankingRepository.java index 153823fbc..240614d6c 100644 --- a/src/main/java/frameworks/database/JsonRankingRepository.java +++ b/src/main/java/frameworks/database/JsonRankingRepository.java @@ -5,32 +5,32 @@ import java.util.List; import com.fasterxml.jackson.core.type.TypeReference; -import entities.RankingEntry; +import entities.PlayerRankingEntry; import interface_adapters.gateways.RankingRepository; /** * A JSON-based implementation of the RankingRepository interface. */ public class JsonRankingRepository implements RankingRepository { - private final FileDatabase database; - private List rankings; + private final FileDatabase database; + private List rankings; public JsonRankingRepository(String filePath) throws IOException { - this.database = new FileDatabase<>(filePath, new TypeReference>() {}); + this.database = new FileDatabase<>(filePath, new TypeReference>() {}); this.rankings = database.load(); } @Override - public List getAllRankings() { + public List getAllRankings() { return new ArrayList<>(rankings); } /** * Adds a new ranking entry to the repository and persists it to the database. * - * @param rankingEntry The {@link RankingEntry} object to be added to the rankings list. + * @param rankingEntry The {@link PlayerRankingEntry} object to be added to the rankings list. */ - public void addRanking(RankingEntry rankingEntry) { + public void addRanking(PlayerRankingEntry rankingEntry) { rankings.add(rankingEntry); try { database.save(rankings); From 060b6b692ad69b1edd632fce2fcab6fbd53ed547 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Thu, 28 Nov 2024 14:50:52 -0700 Subject: [PATCH 036/154] Location smart description implemented, usecase PlaceDescription implemented --- src/main/java/entities/EntityConstants.java | 8 +++++ src/main/java/entities/Location.java | 6 ++++ src/main/java/entities/LocationCity.java | 34 ++++++++++++++++++ src/main/java/entities/LocationDesert.java | 32 +++++++++++++++++ src/main/java/entities/LocationForest.java | 36 +++++++++++++++++++ src/main/java/entities/LocationIceland.java | 30 ++++++++++++++++ src/main/java/entities/LocationPlain.java | 5 +++ .../PlaceDescriptionDataAccessInterface.java | 11 ++++++ .../PlaceDescriptionInputBoundary.java | 8 +++++ .../PlaceDescriptionInputData.java | 4 +++ .../PlaceDescriptionInteractor.java | 22 +++++++++++- .../PlaceDescriptionOutputBoundary.java | 17 +++++++++ .../PlaceDescriptionOutputData.java | 12 +++++++ 13 files changed, 224 insertions(+), 1 deletion(-) diff --git a/src/main/java/entities/EntityConstants.java b/src/main/java/entities/EntityConstants.java index 979624532..2499fd673 100644 --- a/src/main/java/entities/EntityConstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -21,9 +21,17 @@ public class EntityConstants { // Map information and calculation scalar settings. public static final String ICELAND = "Iceland"; + public static final int ICELANDCOLD = 0; + public static final int ICELANDEXTREMECOLD = -20; public static final String DESERT = "Desert"; + public static final int DESERTHOTDEGREE = 35; + public static final int DESERTUNBAREABLEDEGREE = 65; public static final String FOREST = "Forest"; + public static final double FORESTRICH = 1.25; + public static final double FORESTEXTREMERICH = 1.75; public static final String CITY = "City"; + public static final double CITYDANGER = 1.25; + public static final double CITYEXTREMEDANGER = 1.75; public static final String PLAIN = "Plain"; // Name we gonna use. diff --git a/src/main/java/entities/Location.java b/src/main/java/entities/Location.java index 152d541da..f18a2e8a2 100644 --- a/src/main/java/entities/Location.java +++ b/src/main/java/entities/Location.java @@ -113,4 +113,10 @@ public interface Location { * @return String representation. */ String toString(); + + /** + * String for a description of the biome. + * @return brief description. + */ + String getDescription(); } diff --git a/src/main/java/entities/LocationCity.java b/src/main/java/entities/LocationCity.java index b4e8bafc2..0a43b32cf 100644 --- a/src/main/java/entities/LocationCity.java +++ b/src/main/java/entities/LocationCity.java @@ -97,4 +97,38 @@ public Double getthreatlevel() { public String toString() { return EntityConstants.CITY; } + + @Override + public String getDescription() { + final String baseDescription = + "The city is a graveyard of skyscrapers, their windows shattered and facades crumbling. " + + "The streets are littered with rusting cars and decaying bodies, " + + "and the distant sound of groaning " + + "echoes down the alleyways."; + + // Add threat-based phrasing + final String threatDescription; + if (this.threat <= EntityConstants.CITYDANGER) { + threatDescription = + "For now, the streets seem calm. Shadows shift in the distance, but it is quiet enough to risk " + + "searching for supplies. Your group moves cautiously, always watching for danger."; + } + else if (this.threat >= EntityConstants.CITYEXTREMEDANGER) { + threatDescription = + "The city is swarming with the infected. Groans and shuffling footsteps echo from every direction, " + + "and the danger is impossible to ignore. " + + "Every turn feels like an ambush waiting to happen, and your " + + "group knows it must escape quickly or risk being overwhelmed."; + } + else { + threatDescription = + "The city feels tense and unpredictable. While not overrun, signs of the infected are everywhere. " + + "Your group must tread carefully, " + + "as any sound or movement could draw unwanted attention."; + } + + // Combine base and dynamic threat descriptions + return baseDescription + " " + threatDescription; + } + } diff --git a/src/main/java/entities/LocationDesert.java b/src/main/java/entities/LocationDesert.java index bc61a8b24..ea643404f 100644 --- a/src/main/java/entities/LocationDesert.java +++ b/src/main/java/entities/LocationDesert.java @@ -97,4 +97,36 @@ public String toString() { return EntityConstants.DESERT; } + @Override + public String getDescription() { + final String baseDescription = + "The desert stretches endlessly, its golden dunes now marred by the occasional husk of a car " + + "or the skeletal remains of travelers who did not make it. The relentless sun beats down, " + + "offering no shelter from the horrors that might still wander here."; + + // Add temperature-based phrasing + final String temperatureDescription; + if (this.temperature <= EntityConstants.DESERTHOTDEGREE) { + temperatureDescription = + "Your group finds some relief near the desert's edge. The air is warm but bearable, and " + + "a faint breeze carries a hint of moisture, suggesting you are not yet in the heart of " + + "this wasteland."; + } + else if (this.temperature >= EntityConstants.DESERTUNBAREABLEDEGREE) { + temperatureDescription = + "Your group struggles under the merciless heat, the sun blazing down like an open furnace. " + + "The ground is too hot to touch, and every step feels like it could be your last. " + + "Supplies will not last long in this heat."; + } + else { + temperatureDescription = + "The heat is punishing, but not unbearable yet. The deeper your group ventures into this " + + "wasteland, the more the sun saps your strength and the threat of " + + "dehydration looms ever larger."; + } + + // Combine base and dynamic temperature descriptions + return baseDescription + " " + temperatureDescription; + } + } diff --git a/src/main/java/entities/LocationForest.java b/src/main/java/entities/LocationForest.java index 84d449358..1b7d478c5 100644 --- a/src/main/java/entities/LocationForest.java +++ b/src/main/java/entities/LocationForest.java @@ -96,4 +96,40 @@ public Double getthreatlevel() { public String toString() { return EntityConstants.FOREST; } + + @Override + public String getDescription() { + final String baseDescription = + "The forest feels alive yet foreboding, its towering trees " + + "stretching high above and casting long shadows. " + + "The air is rich with the scent of damp earth, and " + + "the undergrowth grows thick as your group ventures deeper."; + + // Determine resource-based phrasing + final String resourceDescription; + if (this.foodresource <= EntityConstants.FORESTRICH + && this.waterresource <= EntityConstants.FORESTEXTREMERICH) { + resourceDescription = + "At the forest's edge, food and water are scarce. The sparse undergrowth offers little sustenance, " + + "and your group must decide carefully whether to move deeper in search of resources."; + } + else if (this.foodresource >= EntityConstants.FORESTEXTREMERICH + && this.waterresource >= EntityConstants.FORESTEXTREMERICH) { + resourceDescription = + "Deep within the heart of the forest, resources are plentiful. " + + "Your group finds wild fruits, clear streams, " + + "and signs of abundant wildlife. Yet the dense trees " + + "and eerie quiet suggest danger might not be far away."; + } + else { + resourceDescription = + "The forest offers a mix of hope and caution. While food and water are becoming easier to find, " + + "the growing density of the undergrowth hints at " + + "the challenges and risks that lie ahead."; + } + + // Combine base and dynamic resource descriptions + return baseDescription + " " + resourceDescription; + } + } diff --git a/src/main/java/entities/LocationIceland.java b/src/main/java/entities/LocationIceland.java index 8c7bb5cfe..b252a5efd 100644 --- a/src/main/java/entities/LocationIceland.java +++ b/src/main/java/entities/LocationIceland.java @@ -97,4 +97,34 @@ public String toString() { return EntityConstants.ICELAND; } + @Override + public String getDescription() { + final String baseDescription = + "The icy tundra stretches endlessly, a barren landscape of snow and frost. " + + "Jagged ice formations rise like silent sentinels, " + + "and the wind howls across the open plains."; + + // Add temperature-based phrasing + final String temperatureDescription; + if (this.temperature >= EntityConstants.ICELANDCOLD) { + temperatureDescription = + "The cold is biting but manageable. Your group trudges carefully, keeping an eye out for shelter " + + "as frost begins to settle on your gear."; + } + else if (this.temperature <= EntityConstants.ICELANDEXTREMECOLD) { + temperatureDescription = + "The cold is deadly, cutting through even the thickest clothing. Frostbite threatens your group, " + + "and every breath feels like shards of ice tearing through your lungs."; + } + else { + temperatureDescription = + "The freezing air saps your strength as you march onward. " + + "The snow is deep, and every step feels heavier, " + + "but the group presses on, desperate to find refuge before the cold worsens."; + } + + // Combine base and dynamic temperature descriptions + return baseDescription + " " + temperatureDescription; + } + } diff --git a/src/main/java/entities/LocationPlain.java b/src/main/java/entities/LocationPlain.java index 336ebd822..4bde6dbc7 100644 --- a/src/main/java/entities/LocationPlain.java +++ b/src/main/java/entities/LocationPlain.java @@ -97,4 +97,9 @@ public String toString() { return EntityConstants.PLAIN; } + @Override + public String getDescription() { + return "The plains stretch endlessly in every direction, a sea of swaying grass under a pale, open sky. " + + "The emptiness is both calming and unsettling, offering little cover should danger arise."; + } } diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionDataAccessInterface.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionDataAccessInterface.java index 014892afd..5c28a240e 100644 --- a/src/main/java/usecases/gameplacedescription/PlaceDescriptionDataAccessInterface.java +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionDataAccessInterface.java @@ -1,4 +1,15 @@ package usecases.gameplacedescription; +import entities.Location; + +/** + * Require location info like temperature, threat level etc for more specific and smart description. + */ public interface PlaceDescriptionDataAccessInterface { + + /** + * The location of the player's current position. + * @return location. + */ + Location getLocation(); } diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputBoundary.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputBoundary.java index 333e459bc..dadbeb094 100644 --- a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputBoundary.java +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputBoundary.java @@ -1,4 +1,12 @@ package usecases.gameplacedescription; +/** + * Input boundary of place description, which a interactor should have execute method, providing input data. + */ public interface PlaceDescriptionInputBoundary { + /** + * Execute by retuning the description of the location. + * @param inputdata not really needed as this is automatic move. + */ + void execute(PlaceDescriptionInputData inputdata); } diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java index 8dc4f1c13..63857d984 100644 --- a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java @@ -1,4 +1,8 @@ package usecases.gameplacedescription; +/** + * We don't need anything from player's side, this is automatic move. + */ + public class PlaceDescriptionInputData { } diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java index d662ecfdc..e23e8aa02 100644 --- a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java @@ -1,4 +1,24 @@ package usecases.gameplacedescription; -public class PlaceDescriptionInteractor { +/** + * Place Description interactor, based on location information, generate the description for the player, + * which is for the view. + */ +public class PlaceDescriptionInteractor implements PlaceDescriptionInputBoundary { + private PlaceDescriptionDataAccessInterface dataAccess; + private PlaceDescriptionOutputBoundary outputBoundary; + + public PlaceDescriptionInteractor(PlaceDescriptionDataAccessInterface dataAccess, + PlaceDescriptionOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(PlaceDescriptionInputData inputdata) { + final String description = dataAccess.getLocation().getDescription(); + final PlaceDescriptionOutputData outputdata = new PlaceDescriptionOutputData(description); + outputBoundary.preparesuccessview(outputdata); + + } } diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputBoundary.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputBoundary.java index 494426943..994a44d1c 100644 --- a/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputBoundary.java +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputBoundary.java @@ -1,4 +1,21 @@ package usecases.gameplacedescription; +/** + * Output boundary of place description. success view will display the place description for the player, giving them + * basic information of the place, for example how dangerous it is? cold or warm? etc + */ public interface PlaceDescriptionOutputBoundary { + + /** + * Prepare the view if the usecase is a success, which display the description generated by interactor. + * @param data contain description required. + */ + void preparesuccessview(PlaceDescriptionOutputData data); + + /** + * Prepare fialure view, This shouldn't happen as long as player is inside the map grid, but player is always + * inside the grid if move usecase was correct. + * @param failmessage failmessage ? + */ + void preparefailureview(String failmessage); } diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputData.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputData.java index 62efaf292..bcb6e1ddb 100644 --- a/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputData.java +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionOutputData.java @@ -1,4 +1,16 @@ package usecases.gameplacedescription; +/** + * Output data for this usecase, which is just description. + */ public class PlaceDescriptionOutputData { + private String description; + + public PlaceDescriptionOutputData(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } } From 000e147c751312342eba77523a75a2a53aec571a Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Thu, 28 Nov 2024 15:24:04 -0700 Subject: [PATCH 037/154] Location description added, use case gameplacedescription implemented --- src/main/java/entities/EntityConstants.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/entities/EntityConstants.java b/src/main/java/entities/EntityConstants.java index 2499fd673..1ae3bec90 100644 --- a/src/main/java/entities/EntityConstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -119,6 +119,4 @@ public class EntityConstants { public static final int MAXNUMDAY = 60; public static final String NEWLINE = "\n"; - ->>>>>>> f2a2a8275faa0cc5e1e294e8fcb3832bbde8f194:src/main/java/entities/Entityconstants.java } From 761ac5c87f903634ec46ecaa9aeb109f62d7d749 Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Thu, 28 Nov 2024 17:54:02 -0500 Subject: [PATCH 038/154] implement JsonLoginDataAccess for account login data management --- .idea/inspectionProfiles/Project_Default.xml | 212 ++++++++++++++++++ .../database/JsonLoginDataAccess.java | 54 +++++ 2 files changed, 266 insertions(+) create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 src/main/java/frameworks/database/JsonLoginDataAccess.java diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..7d2f77bf9 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,212 @@ + + + + \ No newline at end of file diff --git a/src/main/java/frameworks/database/JsonLoginDataAccess.java b/src/main/java/frameworks/database/JsonLoginDataAccess.java new file mode 100644 index 000000000..70ef5ac56 --- /dev/null +++ b/src/main/java/frameworks/database/JsonLoginDataAccess.java @@ -0,0 +1,54 @@ +package frameworks.database; + +import java.io.IOException; +import java.util.List; + +import com.fasterxml.jackson.core.type.TypeReference; +import entities.Player; +import usecases.accountlogin.LoginDataAccessInterface; + +/** + * A JSON-based implementation of the LoginDataAccessInterface. + * This class provides methods to validate user credentials and check user existence. + */ +public class JsonLoginDataAccess implements LoginDataAccessInterface { + private final FileDatabase database; + private List players; + + /** + * Constructs a new JsonLoginDataAccess object with the specified file path. + * + * @param filePath The path to the JSON file containing player data. + * @throws IOException If there is an issue reading the JSON file. + */ + public JsonLoginDataAccess(String filePath) throws IOException { + this.database = new FileDatabase<>(filePath, new TypeReference>() {}); + this.players = database.load(); + } + + /** + * Validates the credentials of a user. + * + * @param username The username provided by the user. + * @param password The password provided by the user. + * @return True if the credentials are valid, otherwise false. + */ + @Override + public boolean validateCredentials(String username, String password) { + return players.stream() + .anyMatch(player -> player.getUsername().equals(username) + && player.validatePassword(password)); + } + + /** + * Checks if a user with the specified username exists. + * + * @param username The username to check. + * @return True if the user exists, otherwise false. + */ + @Override + public boolean doesUserExist(String username) { + return players.stream() + .anyMatch(player -> player.getUsername().equals(username)); + } +} From 3e1cfa47bb89f9cb4b0e195b0ace9a1a51363e75 Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Thu, 28 Nov 2024 18:07:29 -0500 Subject: [PATCH 039/154] Resolving formatting error --- .../database/JsonRankingDataAccess.java | 4 ++++ .../database/JsonRankingRepository.java | 15 ++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 src/main/java/frameworks/database/JsonRankingDataAccess.java diff --git a/src/main/java/frameworks/database/JsonRankingDataAccess.java b/src/main/java/frameworks/database/JsonRankingDataAccess.java new file mode 100644 index 000000000..077270ebc --- /dev/null +++ b/src/main/java/frameworks/database/JsonRankingDataAccess.java @@ -0,0 +1,4 @@ +package frameworks.database; + +public class JsonRankingDataAccess { +} diff --git a/src/main/java/frameworks/database/JsonRankingRepository.java b/src/main/java/frameworks/database/JsonRankingRepository.java index 153823fbc..0ec5113da 100644 --- a/src/main/java/frameworks/database/JsonRankingRepository.java +++ b/src/main/java/frameworks/database/JsonRankingRepository.java @@ -5,32 +5,33 @@ import java.util.List; import com.fasterxml.jackson.core.type.TypeReference; -import entities.RankingEntry; +import entities.PlayerRankingEntry; import interface_adapters.gateways.RankingRepository; /** * A JSON-based implementation of the RankingRepository interface. */ + public class JsonRankingRepository implements RankingRepository { - private final FileDatabase database; - private List rankings; + private final FileDatabase database; + private List rankings; public JsonRankingRepository(String filePath) throws IOException { - this.database = new FileDatabase<>(filePath, new TypeReference>() {}); + this.database = new FileDatabase<>(filePath, new TypeReference>() { }); this.rankings = database.load(); } @Override - public List getAllRankings() { + public List getAllRankings() { return new ArrayList<>(rankings); } /** * Adds a new ranking entry to the repository and persists it to the database. * - * @param rankingEntry The {@link RankingEntry} object to be added to the rankings list. + * @param rankingEntry The {@link PlayerRankingEntry} object to be added to the rankings list. */ - public void addRanking(RankingEntry rankingEntry) { + public void addRanking(PlayerRankingEntry rankingEntry) { rankings.add(rankingEntry); try { database.save(rankings); From 54a31a26a1298f72e067f47466326200aab11797 Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Thu, 28 Nov 2024 18:23:58 -0500 Subject: [PATCH 040/154] adding set methods --- src/main/java/entities/PlayerRankingEntry.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/entities/PlayerRankingEntry.java b/src/main/java/entities/PlayerRankingEntry.java index df72b29c5..f4e5806ea 100644 --- a/src/main/java/entities/PlayerRankingEntry.java +++ b/src/main/java/entities/PlayerRankingEntry.java @@ -8,11 +8,11 @@ public class PlayerRankingEntry { // Player's username private final String name; // Player's score - private final int score; + private int score; // Number of days the player survived - private final int daysSurvived; + private int daysSurvived; // Whether the player won the game - private final boolean won; + private boolean won; /** * Constructs a new RankingEntry with the specified attributes. @@ -44,4 +44,16 @@ public int getDaysSurvived() { public boolean isWon() { return won; } + + public void setScore(int score) { + this.score = score; + } + + public void setWon(boolean won) { + this.won = won; + } + + public void setDaysSurvived(int daysSurvived) { + this.daysSurvived = daysSurvived; + } } From e37a7cff9792f195cd6c19f0642bf8d2ce46d7c8 Mon Sep 17 00:00:00 2001 From: Michael Lin Date: Thu, 28 Nov 2024 18:25:00 -0500 Subject: [PATCH 041/154] Implement JsonRankingDataAccess --- .../database/JsonRankingDataAccess.java | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/src/main/java/frameworks/database/JsonRankingDataAccess.java b/src/main/java/frameworks/database/JsonRankingDataAccess.java index 077270ebc..5e392f70f 100644 --- a/src/main/java/frameworks/database/JsonRankingDataAccess.java +++ b/src/main/java/frameworks/database/JsonRankingDataAccess.java @@ -1,4 +1,70 @@ package frameworks.database; -public class JsonRankingDataAccess { +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.core.type.TypeReference; +import entities.PlayerRankingEntry; +import usecases.accountranking.RankingDataAccessInterface; + +/** + * A JSON-based implementation of the RankingDataAccessInterface. + * This class is responsible for retrieving and updating ranking data stored in a JSON file. + */ +public class JsonRankingDataAccess implements RankingDataAccessInterface { + private final FileDatabase database; + private List rankings; + + /** + * Constructs a new JsonRankingDataAccess with the specified JSON file path. + * + * @param filePath The path to the JSON file storing the rankings. + * @throws IOException If there is an error reading the JSON file. + */ + public JsonRankingDataAccess(String filePath) throws IOException { + this.database = new FileDatabase<>(filePath, new TypeReference>() {}); + this.rankings = database.load(); + } + + /** + * Retrieves the list of ranked players. + * + * @return A list of PlayerRankingEntry objects representing the leaderboard. + */ + @Override + public List getLeaderboard() { + return new ArrayList<>(rankings); + } + + /** + * Updates the score for a specific player in the leaderboard. + * + * @param username The username of the player. + * @param score The new score to assign. + */ + @Override + public void updateScore(String username, int score) { + boolean playerFound = false; + + for (PlayerRankingEntry entry : rankings) { + if (entry.getName().equals(username)) { + entry.setScore(score); + playerFound = true; + break; + } + } + + // If the player does not exist, add them to the rankings + if (!playerFound) { + rankings.add(new PlayerRankingEntry(username, score, 0, false)); + } + + try { + database.save(rankings); + } + catch (IOException ioException) { + ioException.printStackTrace(); + } + } } From 796ad4deb0b8077429245c1abf4c3c106e7df79d Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Thu, 28 Nov 2024 17:58:35 -0700 Subject: [PATCH 042/154] Minimap usecase implemented --- src/main/java/entities/EntityConstants.java | 17 ++++--- .../eventrespond/RespondInteractor.java | 3 -- .../MinimapDataAccessInterface.java | 18 ++++++++ .../gameminimap/MinimapInputBoundary.java | 10 ++++ .../gameminimap/MinimapInputData.java | 3 ++ .../gameminimap/MinimapInteractor.java | 46 ++++++++++++++++++- .../gameminimap/MinimapOutputBoundary.java | 9 ++++ .../gameminimap/MinimapOutputData.java | 14 ++++++ 8 files changed, 109 insertions(+), 11 deletions(-) diff --git a/src/main/java/entities/EntityConstants.java b/src/main/java/entities/EntityConstants.java index 1ae3bec90..5fca56b6c 100644 --- a/src/main/java/entities/EntityConstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -35,7 +35,10 @@ public class EntityConstants { public static final String PLAIN = "Plain"; // Name we gonna use. + public static final int MAPHEIGHT = 100; + public static final int MAPWIDTH = 100; public static final int BIOMERADIUS = 16; + public static final int MINIMAPRADIUS = 4; public static final int FIRSTCHOICE = 1; public static final int SECONDCHOICE = 2; public static final int THIRDCHOICE = 3; @@ -101,21 +104,21 @@ public class EntityConstants { // Add these constants under the event-specific section // TraderEncounter thresholds - public static final int TRADERNEGOTIATE = 5; // Minimum social attribute for successful trading - public static final int TRADERROBBERYPOWER = 30; // Minimum firepower for successful robbery + public static final int TRADERNEGOTIATE = 5; + public static final int TRADERROBBERYPOWER = 30; // TraderEncounter resource changes - public static final int TRADERTRADEGAINFOOD = 15; // Resources gained from successful trade + public static final int TRADERTRADEGAINFOOD = 15; public static final int TRADERTRADEGAINWATER = 10; - public static final int TRADERTRADEFAILLOSSFOOD = -5; // Resources lost in trade scam + public static final int TRADERTRADEFAILLOSSFOOD = -5; public static final int TRADERTRADEFAILLOSSWATER = -3; - public static final int TRADERROBBERYGAINFOOD = 20; // Resources gained from successful robbery + public static final int TRADERROBBERYGAINFOOD = 20; public static final int TRADERROBBERYGAINSUPPLIES = 5; - public static final int TRADERROBBERYFAILLOSSFOOD = -10; // Resources lost in failed robbery + public static final int TRADERROBBERYFAILLOSSFOOD = -10; public static final int TRADERROBBERYFAILLOSSPEOPLE = -2; - public static final int TRADERIGNORELOSS = 0; // No resource changes for ignoring + public static final int TRADERIGNORELOSS = 0; public static final int MAXNUMDAY = 60; public static final String NEWLINE = "\n"; diff --git a/src/main/java/usecases/eventrespond/RespondInteractor.java b/src/main/java/usecases/eventrespond/RespondInteractor.java index 7c51b4a8e..4eab910e6 100644 --- a/src/main/java/usecases/eventrespond/RespondInteractor.java +++ b/src/main/java/usecases/eventrespond/RespondInteractor.java @@ -58,7 +58,6 @@ private Pair floodevaluator(int choice, Inventory in String message; int foodChange = 0; boolean success = true; -<<<<<<< HEAD final EventAmbush ambush = (EventAmbush) event; if (choice == EntityConstants.FIRSTCHOICE) { if (inventory.getfirepower() >= EntityConstants.AMBUSHPOWER) { @@ -108,8 +107,6 @@ else if (choice == EntityConstants.THIRDCHOICE) { ), success ); -======= ->>>>>>> f2a2a8275faa0cc5e1e294e8fcb3832bbde8f194 EventFlood flood = (EventFlood) event; if (choice == Entityconstants.FIRSTCHOICE) { diff --git a/src/main/java/usecases/gameminimap/MinimapDataAccessInterface.java b/src/main/java/usecases/gameminimap/MinimapDataAccessInterface.java index 724dd37f4..e6662cf06 100644 --- a/src/main/java/usecases/gameminimap/MinimapDataAccessInterface.java +++ b/src/main/java/usecases/gameminimap/MinimapDataAccessInterface.java @@ -1,4 +1,22 @@ package usecases.gameminimap; +import entities.Maps; +import entities.PlayerLocation; + +/** + * To return the minimap (default) 9x9 , we need player's location, and whole map. + */ public interface MinimapDataAccessInterface { + + /** + * Get the current player location in player location data type(x and y all stored). + * @return Player's location. + */ + PlayerLocation getPlayerLocation(); + + /** + * Get the maps of the this game. + * @return Map of the current game. + */ + Maps getMaps(); } diff --git a/src/main/java/usecases/gameminimap/MinimapInputBoundary.java b/src/main/java/usecases/gameminimap/MinimapInputBoundary.java index 4ee1458a2..e5d3e413b 100644 --- a/src/main/java/usecases/gameminimap/MinimapInputBoundary.java +++ b/src/main/java/usecases/gameminimap/MinimapInputBoundary.java @@ -1,4 +1,14 @@ package usecases.gameminimap; +/** + * Providing inputdata, the interactor takes it and execute, though we don't need input from + * player's side as it is automatic move. + */ public interface MinimapInputBoundary { + + /** + * Execute the interactor, providing inputdata. + * @param inputdata inputdata type, we don't really need that. + */ + void execute(MinimapInputData inputdata); } diff --git a/src/main/java/usecases/gameminimap/MinimapInputData.java b/src/main/java/usecases/gameminimap/MinimapInputData.java index 4216bff1b..d761c570c 100644 --- a/src/main/java/usecases/gameminimap/MinimapInputData.java +++ b/src/main/java/usecases/gameminimap/MinimapInputData.java @@ -1,4 +1,7 @@ package usecases.gameminimap; +/** + * Since this is automatic move, no data from player's side is needed. + */ public class MinimapInputData { } diff --git a/src/main/java/usecases/gameminimap/MinimapInteractor.java b/src/main/java/usecases/gameminimap/MinimapInteractor.java index 8dce5d9d4..9e6fc837b 100644 --- a/src/main/java/usecases/gameminimap/MinimapInteractor.java +++ b/src/main/java/usecases/gameminimap/MinimapInteractor.java @@ -1,4 +1,48 @@ package usecases.gameminimap; -public class MinimapInteractor { +import java.util.ArrayList; + +import entities.EntityConstants; +import entities.Location; + +/** + * Minimap usecase interactor, given nothing from player's side, only data of player's location, and map. + * Return the list of list of char used for mini map view prepare. + */ +public class MinimapInteractor implements MinimapInputBoundary { + private MinimapDataAccessInterface dataaccess; + private MinimapOutputBoundary outputBoundary; + + public MinimapInteractor(MinimapDataAccessInterface dataaccess, MinimapOutputBoundary outputBoundary) { + this.dataaccess = dataaccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(MinimapInputData inputdata) { + final ArrayList> minimap = new ArrayList(); + final ArrayList> grids = dataaccess.getMaps().getGrid(); + final int xcoor = dataaccess.getPlayerLocation().getXcoordinate(); + final int minxcoor = xcoor - EntityConstants.MINIMAPRADIUS; + final int maxxcoor = xcoor + EntityConstants.MINIMAPRADIUS; + final int ycoor = dataaccess.getPlayerLocation().getYcoordinate(); + final int minycoor = ycoor - EntityConstants.MINIMAPRADIUS; + final int maxycoor = ycoor + EntityConstants.MINIMAPRADIUS; + for (int y = minycoor; y <= maxycoor; y++) { + final ArrayList row = new ArrayList(); + for (int x = minxcoor; x <= maxxcoor; x++) { + if (EntityConstants.MAPWIDTH >= x + 1 && EntityConstants.MAPHEIGHT <= y + 1) { + row.add(grids.get(y).get(x).toString().substring(0, 1)); + // get the first letter as representative of map grid. + } + else { + row.add(" "); + // empty representing outside of Map + } + } + minimap.add(row); + } + final MinimapOutputData outputData = new MinimapOutputData(minimap); + outputBoundary.preparesuccessview(outputData); + } } diff --git a/src/main/java/usecases/gameminimap/MinimapOutputBoundary.java b/src/main/java/usecases/gameminimap/MinimapOutputBoundary.java index 42bbc26e4..55b12d431 100644 --- a/src/main/java/usecases/gameminimap/MinimapOutputBoundary.java +++ b/src/main/java/usecases/gameminimap/MinimapOutputBoundary.java @@ -1,4 +1,13 @@ package usecases.gameminimap; +/** + * The output Boundary of minimap usecase, prepare successview. + */ public interface MinimapOutputBoundary { + + /** + * If the minimap usecase was a success, this should prepare the view on the minimap using the list of list of char. + * @param outputdata list of list of char representing each location type. + */ + void preparesuccessview(MinimapOutputData outputdata); } diff --git a/src/main/java/usecases/gameminimap/MinimapOutputData.java b/src/main/java/usecases/gameminimap/MinimapOutputData.java index dbd0ddf18..095602648 100644 --- a/src/main/java/usecases/gameminimap/MinimapOutputData.java +++ b/src/main/java/usecases/gameminimap/MinimapOutputData.java @@ -1,4 +1,18 @@ package usecases.gameminimap; +import java.util.ArrayList; + +/** + * Output data type of minimap, this is list of list of single letter string representation of location. + */ public class MinimapOutputData { + private ArrayList> minimap; + + public MinimapOutputData(ArrayList> minimap) { + this.minimap = minimap; + } + + public ArrayList> getMinimap() { + return minimap; + } } From 79edefc1310693907f2af2cd063d064e689c1a6f Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Thu, 28 Nov 2024 20:08:12 -0700 Subject: [PATCH 043/154] Point Allowcate Usecase Implemented --- src/main/java/entities/EntityConstants.java | 6 ++ .../AllowcateDataAccessInterface.java | 51 ++++++++++++ .../AllowcateInputBoundary.java | 14 ++++ .../startallowcate/AllowcateInputdata.java | 18 +++++ .../startallowcate/AllowcateInteractor.java | 80 +++++++++++++++++++ .../AllowcateOutputBoundary.java | 18 +++++ .../startallowcate/AllowcateOutputData.java | 46 +++++++++++ 7 files changed, 233 insertions(+) create mode 100644 src/main/java/usecases/startallowcate/AllowcateDataAccessInterface.java create mode 100644 src/main/java/usecases/startallowcate/AllowcateInputBoundary.java create mode 100644 src/main/java/usecases/startallowcate/AllowcateInputdata.java create mode 100644 src/main/java/usecases/startallowcate/AllowcateInteractor.java create mode 100644 src/main/java/usecases/startallowcate/AllowcateOutputBoundary.java create mode 100644 src/main/java/usecases/startallowcate/AllowcateOutputData.java diff --git a/src/main/java/entities/EntityConstants.java b/src/main/java/entities/EntityConstants.java index 5fca56b6c..17ca2926c 100644 --- a/src/main/java/entities/EntityConstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -35,6 +35,12 @@ public class EntityConstants { public static final String PLAIN = "Plain"; // Name we gonna use. + public static final String SOCIAL = "Social"; + public static final String LUCK = "Luck"; + public static final String MOBILIZATION = "Mobilization"; + public static final String THRIFT = "Thrift"; + public static final String GENERALSHIP = "GeneralShip"; + public static final int MAPHEIGHT = 100; public static final int MAPWIDTH = 100; public static final int BIOMERADIUS = 16; diff --git a/src/main/java/usecases/startallowcate/AllowcateDataAccessInterface.java b/src/main/java/usecases/startallowcate/AllowcateDataAccessInterface.java new file mode 100644 index 000000000..eb6f23bc7 --- /dev/null +++ b/src/main/java/usecases/startallowcate/AllowcateDataAccessInterface.java @@ -0,0 +1,51 @@ +package usecases.startallowcate; + +import entities.PlayerAttributes; + +/** + * Data access interface for allowcating attribute points, assume allowcate a point each time. + */ +public interface AllowcateDataAccessInterface { + + /** + * We need this to decrease point, and increase according attribute which player selected. + * @return current Playerattribute class type. + */ + PlayerAttributes getPlayerAttributes(); + + /** + * Set social to new social value. + * @param social new social attribute. + */ + void setSocial(int social); + + /** + * Set luck to new luck value. + * @param luck new luck attribute. + */ + void setLuck(int luck); + + /** + * Set thrift to new thrift value. + * @param thrift new thrift attribute. + */ + void setThrift(int thrift); + + /** + * Set mobilization to new mobilization value. + * @param mobilization new mobilization attribute. + */ + void setMobilization(int mobilization); + + /** + * Set generalship to new social value. + * @param generalship new generalship attribute. + */ + void setGeneralship(int generalship); + + /** + * Set point to new point value. + * @param point new point. + */ + void setPoint(int point); +} diff --git a/src/main/java/usecases/startallowcate/AllowcateInputBoundary.java b/src/main/java/usecases/startallowcate/AllowcateInputBoundary.java new file mode 100644 index 000000000..2a8cf7c37 --- /dev/null +++ b/src/main/java/usecases/startallowcate/AllowcateInputBoundary.java @@ -0,0 +1,14 @@ +package usecases.startallowcate; + +/** + * Input boundary of allowcate, interactor implement this and should have execute method. + */ +public interface AllowcateInputBoundary { + + /** + * Execute this, which decrement point and increment which point player chose. With output data being all newly + * update points and attributes. + * @param inputdata inputdata from player side, should + */ + void execute(AllowcateInputdata inputdata); +} diff --git a/src/main/java/usecases/startallowcate/AllowcateInputdata.java b/src/main/java/usecases/startallowcate/AllowcateInputdata.java new file mode 100644 index 000000000..fcb12b17a --- /dev/null +++ b/src/main/java/usecases/startallowcate/AllowcateInputdata.java @@ -0,0 +1,18 @@ +package usecases.startallowcate; + +/** + * Inputdata type, contain all we need to know from player's side, + * which is which attribute they choose by name in string. + * (all lowercase except first letter format as in entityconstant) + */ +public class AllowcateInputdata { + private String attribute; + + public AllowcateInputdata(String attribute) { + this.attribute = attribute; + } + + public String getAttribute() { + return attribute; + } +} diff --git a/src/main/java/usecases/startallowcate/AllowcateInteractor.java b/src/main/java/usecases/startallowcate/AllowcateInteractor.java new file mode 100644 index 000000000..85eb87591 --- /dev/null +++ b/src/main/java/usecases/startallowcate/AllowcateInteractor.java @@ -0,0 +1,80 @@ +package usecases.startallowcate; + +import entities.EntityConstants; + +/** + * Allowcate interactor, decrease point by one, add attribute select by one, if point was greater than 0. + * If points are less than 0, fail and return fail message. + */ +public class AllowcateInteractor implements AllowcateInputBoundary { + private AllowcateDataAccessInterface allowcateDataAccessInterface; + private AllowcateOutputBoundary allowcateOutputBoundary; + + public AllowcateInteractor(AllowcateDataAccessInterface allowcateDataAccessInterface, + AllowcateOutputBoundary allowcateOutputBoundary) { + + } + + @Override + public void execute(AllowcateInputdata inputdata) { + String failmessage = " "; + boolean failureOccurred = false; + + int points = allowcateDataAccessInterface.getPlayerAttributes().getPoints(); + int social = allowcateDataAccessInterface.getPlayerAttributes().getSocial(); + int luck = allowcateDataAccessInterface.getPlayerAttributes().getLuck(); + int mobilization = allowcateDataAccessInterface.getPlayerAttributes().getMobilization(); + int thrift = allowcateDataAccessInterface.getPlayerAttributes().getThrift(); + int generalship = allowcateDataAccessInterface.getPlayerAttributes().getGeneralship(); + + // Check if points are available + if (points <= 0) { + failmessage = "Not enough Attribute points."; + allowcateOutputBoundary.preparefailureview(failmessage); + failureOccurred = true; + } + else if (inputdata.getAttribute().equals(EntityConstants.SOCIAL)) { + points = points - 1; + social = social + 1; + } + else if (inputdata.getAttribute().equals(EntityConstants.LUCK)) { + points = points - 1; + luck = luck + 1; + } + else if (inputdata.getAttribute().equals(EntityConstants.MOBILIZATION)) { + points = points - 1; + mobilization = mobilization + 1; + } + else if (inputdata.getAttribute().equals(EntityConstants.THRIFT)) { + points = points - 1; + thrift = thrift + 1; + } + else if (inputdata.getAttribute().equals(EntityConstants.GENERALSHIP)) { + points = points - 1; + generalship = generalship + 1; + } + else { + // Invalid attribute + failmessage = "Invalid attribute chosen."; + allowcateOutputBoundary.preparefailureview(failmessage); + failureOccurred = true; + } + + // If no failure occurred, update attributes and prepare success view + if (!failureOccurred) { + successhelper(points, social, luck, mobilization, thrift, generalship); + } + } + + private void successhelper(int points, int social, int luck, int mobilization, int thrift, int generalship) { + allowcateDataAccessInterface.getPlayerAttributes().setPoints(points); + allowcateDataAccessInterface.getPlayerAttributes().setSocial(social); + allowcateDataAccessInterface.getPlayerAttributes().setLuck(luck); + allowcateDataAccessInterface.getPlayerAttributes().setMobilization(mobilization); + allowcateDataAccessInterface.getPlayerAttributes().setThrift(thrift); + allowcateDataAccessInterface.getPlayerAttributes().setGeneralship(generalship); + final AllowcateOutputData outputdata = new AllowcateOutputData(points, social, + luck, mobilization, thrift, generalship); + allowcateOutputBoundary.preparesuccessview(outputdata); + } +} diff --git a/src/main/java/usecases/startallowcate/AllowcateOutputBoundary.java b/src/main/java/usecases/startallowcate/AllowcateOutputBoundary.java new file mode 100644 index 000000000..5570dc6e2 --- /dev/null +++ b/src/main/java/usecases/startallowcate/AllowcateOutputBoundary.java @@ -0,0 +1,18 @@ +package usecases.startallowcate; + +/** + * Output boundary of allowcate, preparesuccessview here, newly updated attributes, or failed view with failed message. + */ +public interface AllowcateOutputBoundary { + /** + * If success, then use new updated attributes stored in outputdata to create new view for player. + * @param outputData all new updated attribute point. + */ + void preparesuccessview(AllowcateOutputData outputData); + + /** + * If failure, such as points is already zero, show player this is invaild move, or don't let them click at all. + * @param failmessage fail message. + */ + void preparefailureview(String failmessage); +} diff --git a/src/main/java/usecases/startallowcate/AllowcateOutputData.java b/src/main/java/usecases/startallowcate/AllowcateOutputData.java new file mode 100644 index 000000000..fba5fc78a --- /dev/null +++ b/src/main/java/usecases/startallowcate/AllowcateOutputData.java @@ -0,0 +1,46 @@ +package usecases.startallowcate; + +/** + * Outputdata type for the view side, which contain newly updated attributes and points left for them to update view. + */ +public class AllowcateOutputData { + private int point; + private int social; + private int luck; + private int mobilization; + private int thrift; + private int generalship; + + public AllowcateOutputData(int point, int social, int luck, int mobilization, int thrift, int generalship) { + this.point = point; + this.social = social; + this.luck = luck; + this.mobilization = mobilization; + this.thrift = thrift; + this.generalship = generalship; + } + + public int getPoint() { + return point; + } + + public int getSocial() { + return social; + } + + public int getLuck() { + return luck; + } + + public int getMobilization() { + return mobilization; + } + + public int getThrift() { + return thrift; + } + + public int getGeneralship() { + return generalship; + } +} From f35adcdb88ccb75c0e9e8c73272f2003821b1970 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Fri, 29 Nov 2024 15:08:57 -0700 Subject: [PATCH 044/154] Horde class description added, Event replace for Unit test --- src/main/java/entities/EntityConstants.java | 8 +- src/main/java/entities/Horde.java | 66 +++++++++ src/main/java/entities/PlayerInfo.java | 20 ++- .../HordeDataAccessInterface.java | 4 + .../endprocesshorde/HordeInputBoundary.java | 4 + .../endprocesshorde/HordeInputData.java | 4 + .../endprocesshorde/HordeInteractor.java | 4 + .../endprocesshorde/HordeOutputBoundary.java | 4 + .../endprocesshorde/HordeOutputData.java | 4 + .../eventrespond/RespondInteractor.java | 125 +++------------- .../gameminimap/MinimapInteractor.java | 2 +- .../gamenewday/NewdayDataAccessInterface.java | 8 +- .../usecases/gamenewday/NewdayInteractor.java | 12 +- .../startallowcate/AllowcateInteractor.java | 2 + .../java/app/MainNoteApplicationTest.java | 110 -------------- .../usecases/AllowcateInteractorTest.java | 134 ++++++++++++++++++ .../java/usecases/MinimapInteractorTest.java | 60 ++++++++ .../java/usecases/NoteInteractorTest.java | 45 ------ 18 files changed, 347 insertions(+), 269 deletions(-) create mode 100644 src/main/java/usecases/endprocesshorde/HordeDataAccessInterface.java create mode 100644 src/main/java/usecases/endprocesshorde/HordeInputBoundary.java create mode 100644 src/main/java/usecases/endprocesshorde/HordeInputData.java create mode 100644 src/main/java/usecases/endprocesshorde/HordeInteractor.java create mode 100644 src/main/java/usecases/endprocesshorde/HordeOutputBoundary.java create mode 100644 src/main/java/usecases/endprocesshorde/HordeOutputData.java delete mode 100644 src/test/java/app/MainNoteApplicationTest.java create mode 100644 src/test/java/usecases/AllowcateInteractorTest.java create mode 100644 src/test/java/usecases/MinimapInteractorTest.java delete mode 100644 src/test/java/usecases/NoteInteractorTest.java diff --git a/src/main/java/entities/EntityConstants.java b/src/main/java/entities/EntityConstants.java index 17ca2926c..1db1c1a02 100644 --- a/src/main/java/entities/EntityConstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -6,6 +6,7 @@ * This could be used to achieve game balance as well as for difficulty setting implementation. */ public class EntityConstants { + public static final int NEWDAYSCORE = 100; public static final int STARTERFOOD = 100; public static final int STARTERWATER = 100; public static final int STARTWEAPON = 5; @@ -55,8 +56,13 @@ public class EntityConstants { public static final double RAREEVENTBASEPROB = 0.03; // Horde starter setting. - public static final int STARTERHORDEMAGNITUDE = 300; + public static final int STARTERHORDEMAGNITUDE = 3000; + public static final int HORDEMAGNITUDELARGE = 4000; + public static final int HORDEMAGNITUDEEXTREME = 5000; public static final int STARTERHORDEDURATION = 10; + public static final int HORDEDURATIONLONG = 8; + public static final int HORDEDURATIONSHORT = 6; + public static final double TEMPIMPACTHORDE = 0.5; // Player attribute impacts. public static final int MOBILIZATIONIMPACTSPEED = 10; diff --git a/src/main/java/entities/Horde.java b/src/main/java/entities/Horde.java index 682133fdf..48f0cf8d3 100644 --- a/src/main/java/entities/Horde.java +++ b/src/main/java/entities/Horde.java @@ -6,7 +6,9 @@ */ public class Horde { private int magnitude; + // people and firepower requirement. private double duration; + // food and water requirement. public Horde() { this.magnitude = EntityConstants.STARTERHORDEMAGNITUDE; @@ -28,4 +30,68 @@ public int getMagnitude() { public void setMagnitude(int magnitude) { this.magnitude = magnitude; } + + /** + * Get the description for the horde, based on threatlevel and temperature of which player ended up on. + * @param threatLevel threat level, normal at 1, peak at 2 + * @param temperature temperature, normal at 25, max diff at 50 + * @return the description. + */ + public String getDescription(double threatLevel, double temperature) { + // Adjust magnitude based on threat level + this.magnitude = (int) (magnitude * threatLevel); + + // Adjust duration based on how far the temperature is from the ideal (25°C) + final double tempDifference = Math.abs(temperature - EntityConstants.DEFAULTTEMP); + this.duration = duration * (1 - ((EntityConstants.TEMPIMPACTHORDE * tempDifference) + / EntityConstants.MAXTEMPDIFF)); + + // Generate descriptions + final String magnitudeDescription; + if (this.magnitude < EntityConstants.HORDEMAGNITUDELARGE) { + magnitudeDescription = "around " + EntityConstants.HORDEMAGNITUDELARGE + + " zombies, scattered into smaller groups."; + } + else if (this.magnitude < EntityConstants.HORDEMAGNITUDEEXTREME) { + magnitudeDescription = "approximately " + EntityConstants.HORDEMAGNITUDEEXTREME + + " zombies, moving with relentless determination."; + } + else { + magnitudeDescription = "an overwhelming mass of about " + this.magnitude + + " zombies, consuming everything in their path."; + } + + final String durationHint; + if (temperature < EntityConstants.ICELANDEXTREMECOLD) { + durationHint = "The bitter cold seems to sap their endurance, they won't last long out here."; + } + else if (temperature < EntityConstants.ICELANDCOLD) { + durationHint = "The cool air keeps them moving steadily, but they may tire eventually."; + } + else if (temperature > EntityConstants.DESERTUNBAREABLEDEGREE) { + durationHint = "The searing heat is taking its toll, they wont hold out for long under these conditions."; + } + else if (temperature > EntityConstants.DESERTHOTDEGREE) { + durationHint = "The heat made them active, but not for too long they'll dehydrate."; + } + else { + durationHint = "The perfect temperature not only make your group comfortable," + + " but also made the horde lasting longer."; + } + + final String durationDescription; + if (this.duration >= EntityConstants.HORDEDURATIONLONG) { + durationDescription = "It lingers for days, taking advantage of the weather."; + } + else if (this.duration >= EntityConstants.HORDEDURATIONSHORT) { + durationDescription = "It stays for a few days, but conditions will soon force it to dissipate."; + } + else { + durationDescription = "It is fleeting, scattered quickly by the harsh environment."; + } + + // Combine descriptions + return "The horde consists of " + magnitudeDescription + " " + durationHint + " " + durationDescription; + } + } diff --git a/src/main/java/entities/PlayerInfo.java b/src/main/java/entities/PlayerInfo.java index d75cc93c7..3979ab20f 100644 --- a/src/main/java/entities/PlayerInfo.java +++ b/src/main/java/entities/PlayerInfo.java @@ -1,17 +1,17 @@ package entities; /** - * Playerinfo during the game + * Playerinfo during the game. */ public class PlayerInfo { // Player's username private final String name; // Player's score - private final int score; + private int score; // Number of days the player survived - private final int daysSurvived; + private int daysSurvived; // Whether the player won the game - private final boolean won; + private boolean won; /** * Constructs a new RankingEntry with the specified attributes. @@ -36,11 +36,23 @@ public int getScore() { return score; } + public void setScore(int score) { + this.score = score; + } + public int getDaysSurvived() { return daysSurvived; } + public void setDaysSurvived(int daysSurvived) { + this.daysSurvived = daysSurvived; + } + public boolean isWon() { return won; } + + public void setWon(boolean won) { + this.won = won; + } } diff --git a/src/main/java/usecases/endprocesshorde/HordeDataAccessInterface.java b/src/main/java/usecases/endprocesshorde/HordeDataAccessInterface.java new file mode 100644 index 000000000..a62b96956 --- /dev/null +++ b/src/main/java/usecases/endprocesshorde/HordeDataAccessInterface.java @@ -0,0 +1,4 @@ +package usecases.endprocesshorde; + +public interface HordeDataAccessInterface { +} diff --git a/src/main/java/usecases/endprocesshorde/HordeInputBoundary.java b/src/main/java/usecases/endprocesshorde/HordeInputBoundary.java new file mode 100644 index 000000000..6a51bcc8d --- /dev/null +++ b/src/main/java/usecases/endprocesshorde/HordeInputBoundary.java @@ -0,0 +1,4 @@ +package usecases.endprocesshorde; + +public interface HordeInputBoundary { +} diff --git a/src/main/java/usecases/endprocesshorde/HordeInputData.java b/src/main/java/usecases/endprocesshorde/HordeInputData.java new file mode 100644 index 000000000..ca502c25f --- /dev/null +++ b/src/main/java/usecases/endprocesshorde/HordeInputData.java @@ -0,0 +1,4 @@ +package usecases.endprocesshorde; + +public class HordeInputData { +} diff --git a/src/main/java/usecases/endprocesshorde/HordeInteractor.java b/src/main/java/usecases/endprocesshorde/HordeInteractor.java new file mode 100644 index 000000000..bc8df8891 --- /dev/null +++ b/src/main/java/usecases/endprocesshorde/HordeInteractor.java @@ -0,0 +1,4 @@ +package usecases.endprocesshorde; + +public class HordeInteractor { +} diff --git a/src/main/java/usecases/endprocesshorde/HordeOutputBoundary.java b/src/main/java/usecases/endprocesshorde/HordeOutputBoundary.java new file mode 100644 index 000000000..d61d53f13 --- /dev/null +++ b/src/main/java/usecases/endprocesshorde/HordeOutputBoundary.java @@ -0,0 +1,4 @@ +package usecases.endprocesshorde; + +public interface HordeOutputBoundary { +} diff --git a/src/main/java/usecases/endprocesshorde/HordeOutputData.java b/src/main/java/usecases/endprocesshorde/HordeOutputData.java new file mode 100644 index 000000000..e5677c965 --- /dev/null +++ b/src/main/java/usecases/endprocesshorde/HordeOutputData.java @@ -0,0 +1,4 @@ +package usecases.endprocesshorde; + +public class HordeOutputData { +} diff --git a/src/main/java/usecases/eventrespond/RespondInteractor.java b/src/main/java/usecases/eventrespond/RespondInteractor.java index 4eab910e6..11b159b97 100644 --- a/src/main/java/usecases/eventrespond/RespondInteractor.java +++ b/src/main/java/usecases/eventrespond/RespondInteractor.java @@ -1,15 +1,12 @@ -package usecases.eventrespond; +package use_case.respond; import entities.EntityConstants; import entities.Event; import entities.EventAmbush; -import entities.EventBlizzard; -import entities.EventFlood; -import entities.EventTraderEncounter; import entities.Inventory; import entities.PlayerAttributes; import kotlin.Pair; - +import usecases.eventrespond.*; /** * Interactor for the response use case, for the event, for the specific choice player provide. @@ -17,7 +14,6 @@ public class RespondInteractor implements RespondInputBoundary { private final RespondDataAccessInterface respondDataAccessObject; private final RespondOutputBoundary respondOutputBoundary; - public RespondInteractor(RespondDataAccessInterface respondDataAccessObject, RespondOutputBoundary respondOutputBoundary) { this.respondDataAccessObject = respondDataAccessObject; @@ -30,33 +26,27 @@ public void execute(RespondInputData inputdata) { final int choice = inputdata.getChoice(); final PlayerAttributes attributes = respondDataAccessObject.getPlayerAttributes(); final Inventory inventory = respondDataAccessObject.getInventory(); - if (event instanceof EventAmbush) { - final Pair info = ambushevaluator(attributes, choice, inventory, event); - processResult(info); - } else if (event instanceof EventFlood) { - final Pair info = floodevaluator(choice, inventory, event); - processResult(info); - } else if (event instanceof EventBlizzard) { - final Pair info = blizzardEvaluator(inventory, event); - processResult(info); - } else if (event instanceof EventTraderEncounter) { - final Pair info = traderEvaluator(attributes, choice, inventory, event); - processResult(info); - } - } - - private void processResult(Pair info) { - if (info.getSecond()) { - respondOutputBoundary.prepareSuccessView(info.getFirst()); - } else { - respondOutputBoundary.prepareFailureView("Invalid choice"); + final Pair info = + ambushevaluator(attributes, choice, inventory, event); + final boolean success = info.getSecond(); + if (success) { + respondOutputBoundary.prepareSuccessView(info.getFirst()); + } + else { + respondOutputBoundary.prepareFailureView("Invalid choice"); + } } } - - private Pair floodevaluator(int choice, Inventory inventory, Event event) { - String message; - int foodChange = 0; + private Pair ambushevaluator(PlayerAttributes attributes, + int choice, + Inventory inventory, + Event event) { + String message = ""; + int foodchange = 0; + int waterchange = 0; + int weaponchange = 0; + int peoplechange = 0; boolean success = true; final EventAmbush ambush = (EventAmbush) event; if (choice == EntityConstants.FIRSTCHOICE) { @@ -107,78 +97,5 @@ else if (choice == EntityConstants.THIRDCHOICE) { ), success ); - - EventFlood flood = (EventFlood) event; - if (choice == Entityconstants.FIRSTCHOICE) { - foodChange = Entityconstants.FLOODRESOURCELOSS; - message = flood.getEvacuateOutcome(); - } else if (choice == Entityconstants.SECONDCHOICE) { - foodChange = Entityconstants.FLOODSECURELOSS; - message = flood.getSecureSuppliesOutcome(); - } else if (choice == Entityconstants.THIRDCHOICE) { - foodChange = Entityconstants.FLOODDOINGNOTHINGLOSS; - message = flood.getDoNothingOutcome(); - } else { - success = false; - message = "Invalid choice."; - } - - inventory.changeFood(foodChange); - return new Pair<>(new RespondOutputData(message, foodChange, 0, 0, 0, ""), success); } - - private Pair blizzardEvaluator(Inventory inventory, Event event) { - String message = ((EventBlizzard) event).getOutcome(); - inventory.changeFood(Entityconstants.BLIZZARDRESOURCELOSSFOOD); - inventory.changeWater(Entityconstants.BLIZZARDRESOURCELOSSWATER); - return new Pair<>(new RespondOutputData(message, -15, -15, 0, 0, ""), true); - } - - private Pair traderEvaluator(PlayerAttributes attributes, int choice, Inventory inventory, Event event) { - String message; - int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; - boolean success = true; - - EventTraderEncounter trader = (EventTraderEncounter) event; - if (choice == Entityconstants.FIRSTCHOICE) { - // Trading logic based on negotiation skill - if (attributes.getSocial() >= Entityconstants.TRADERNEGOTIATE) { - foodChange = Entityconstants.TRADERTRADEGAINFOOD; - waterChange = Entityconstants.TRADERTRADEGAINWATER; - message = trader.getTradeOutcomeSuccess(); - } else { - foodChange = Entityconstants.TRADERTRADEFAILLOSSFOOD; - waterChange = Entityconstants.TRADERTRADEFAILLOSSWATER; - message = trader.getTradeOutcomeScam(); - } - } else if (choice == Entityconstants.SECONDCHOICE) { - // Ignore the trader, no resource changes - message = trader.getIgnoreOutcome(); - } else if (choice == Entityconstants.THIRDCHOICE) { - // Robbery logic based on firepower - if (inventory.getfirepower() >= Entityconstants.TRADERROBBERYPOWER) { - foodChange = Entityconstants.TRADERROBBERYGAINFOOD; - suppliesChange = Entityconstants.TRADERROBBERYGAINSUPPLIES; - message = trader.getRobOutcomeSuccess(); - } else { - foodChange = Entityconstants.TRADERROBBERYFAILLOSSFOOD; - peopleChange = Entityconstants.TRADERROBBERYFAILLOSSPEOPLE; - message = trader.getRobOutcomeFail(); - } - } else { - // Invalid choice handling - success = false; - message = "Invalid choice."; - } - - // Apply changes to the inventory - inventory.changeFood(foodChange); - inventory.changeWater(waterChange); - inventory.changeweapon(suppliesChange); - inventory.changePeople(peopleChange); - - // Generate response - return new Pair<>(new RespondOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, ""), success); - } - -} +} \ No newline at end of file diff --git a/src/main/java/usecases/gameminimap/MinimapInteractor.java b/src/main/java/usecases/gameminimap/MinimapInteractor.java index 9e6fc837b..892ed7e81 100644 --- a/src/main/java/usecases/gameminimap/MinimapInteractor.java +++ b/src/main/java/usecases/gameminimap/MinimapInteractor.java @@ -31,7 +31,7 @@ public void execute(MinimapInputData inputdata) { for (int y = minycoor; y <= maxycoor; y++) { final ArrayList row = new ArrayList(); for (int x = minxcoor; x <= maxxcoor; x++) { - if (EntityConstants.MAPWIDTH >= x + 1 && EntityConstants.MAPHEIGHT <= y + 1) { + if (EntityConstants.MAPWIDTH >= x + 1 && EntityConstants.MAPHEIGHT >= y + 1 && x >= 0 && y >= 0) { row.add(grids.get(y).get(x).toString().substring(0, 1)); // get the first letter as representative of map grid. } diff --git a/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java b/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java index 2e86a1b9f..6e1fb5b5c 100644 --- a/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java +++ b/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java @@ -33,7 +33,13 @@ public interface NewdayDataAccessInterface { * Set the number of days player survived to new value. (+1) * @param days new days */ - void getDaysSurvived(int days); + void setDaysSurvived(int days); + + /** + * Set the score to new value. + * @param score new score. + */ + void setScore(int score); /** * The amount of food change during new day process. diff --git a/src/main/java/usecases/gamenewday/NewdayInteractor.java b/src/main/java/usecases/gamenewday/NewdayInteractor.java index 256819f59..536887395 100644 --- a/src/main/java/usecases/gamenewday/NewdayInteractor.java +++ b/src/main/java/usecases/gamenewday/NewdayInteractor.java @@ -20,7 +20,7 @@ public void execute(NewdayInputData inputdata) { final int thrift = newdayDataAccessObject.getPlayerAttributes().getThrift(); final int people = newdayDataAccessObject.getInventory().getPeople(); final double temp = newdayDataAccessObject.getLocation().gettemperature(); - + int score = newdayDataAccessObject.getPlayerinfo().getScore(); // Message builder for day summary final StringBuilder messageBuilder = new StringBuilder("Another day has passed. Here's what happened:\n"); boolean success = true; @@ -31,7 +31,7 @@ public void execute(NewdayInputData inputdata) { // Process resource changes and build the message if (success) { decrementresource(messageBuilder, thrift, people, temp); - incrementresouce(messageBuilder, people); + incrementresouce(messageBuilder, people, score); final NewdayOutputData outputdata = new NewdayOutputData(messageBuilder.toString(), success, failmessage); newdayOutputBoundary.prepareSuccessView(outputdata); } @@ -41,11 +41,12 @@ public void execute(NewdayInputData inputdata) { } } - private void incrementresouce(StringBuilder messageBuilder, int people) { + private void incrementresouce(StringBuilder messageBuilder, int people, int score) { // food gain final double foodscalar = newdayDataAccessObject.getLocation().getfoodresourceavailable(); final double foodgain = people * EntityConstants.PEOPLEGAINPERFOOD * foodscalar; newdayDataAccessObject.changeFood((int) foodgain); + int newscore = score + (int) foodgain; messageBuilder.append(" - Food gained: ").append((int) foodgain).append(EntityConstants.NEWLINE); // water gain @@ -53,18 +54,23 @@ private void incrementresouce(StringBuilder messageBuilder, int people) { final double watergain = people * EntityConstants.PEOPLEGAINPERWATER * waterscalar; newdayDataAccessObject.changeWater((int) watergain); messageBuilder.append(" - Water gained: ").append((int) watergain).append(EntityConstants.NEWLINE); + newscore = newscore + (int) watergain; // people gain final double peoplegain = people * (EntityConstants.PEOPLEBASEJOINRATE * newdayDataAccessObject.getLocation().getpeopleresourceavailable()); newdayDataAccessObject.changePeople((int) peoplegain); messageBuilder.append(" - New members joined: ").append((int) peoplegain).append(EntityConstants.NEWLINE); + newscore = newscore + (int) peoplegain; // weaponry gain double weapongain = peoplegain + people * EntityConstants.PEOPLEGAINPERWEAPON; weapongain = weapongain * newdayDataAccessObject.getLocation().getweaponresourceavailable(); newdayDataAccessObject.changeWeapon((int) weapongain); messageBuilder.append(" - Weaponry gained: ").append((int) weapongain).append(EntityConstants.NEWLINE); + newscore = newscore + (int) weapongain; + newscore = newscore + EntityConstants.NEWDAYSCORE; + newdayDataAccessObject.setScore(newscore); } private void decrementresource(StringBuilder messageBuilder, int thrift, int people, double temp) { diff --git a/src/main/java/usecases/startallowcate/AllowcateInteractor.java b/src/main/java/usecases/startallowcate/AllowcateInteractor.java index 85eb87591..2314adc93 100644 --- a/src/main/java/usecases/startallowcate/AllowcateInteractor.java +++ b/src/main/java/usecases/startallowcate/AllowcateInteractor.java @@ -12,6 +12,8 @@ public class AllowcateInteractor implements AllowcateInputBoundary { public AllowcateInteractor(AllowcateDataAccessInterface allowcateDataAccessInterface, AllowcateOutputBoundary allowcateOutputBoundary) { + this.allowcateDataAccessInterface = allowcateDataAccessInterface; + this.allowcateOutputBoundary = allowcateOutputBoundary; } diff --git a/src/test/java/app/MainNoteApplicationTest.java b/src/test/java/app/MainNoteApplicationTest.java deleted file mode 100644 index 84b3393d8..000000000 --- a/src/test/java/app/MainNoteApplicationTest.java +++ /dev/null @@ -1,110 +0,0 @@ -package app; - -import org.junit.Before; -import org.junit.Test; - -import javax.swing.*; -import java.awt.*; - -import static java.lang.Thread.sleep; -import static org.junit.Assert.*; - -public class MainNoteApplicationTest { - - private JFrame app; - - @Before - public void setUp() { - - // create the data access and inject it into our builder! - final NoteDataAccessInterface noteDataAccess = new NoteDataAccessInterface() { - - private String note = "test"; - - @Override - public String saveNote(User user, String note) { - this.note = note; - return note; - } - - @Override - public String loadNote(User user) { - return note; - } - }; - - final NoteAppBuilder builder = new NoteAppBuilder(); - app = builder.addNoteDAO(noteDataAccess) - .addNoteView() - .addNoteUseCase().build(); - - app.setVisible(true); - - } - - /** - * This is an example of an end-to-end test with a mocked database. - *

The code creates the application and directly tests to see that the GUI - * is updated as expected when the buttons and UI elements are interacted with. - *

- * You can run the test to visually see what happens. - */ - @Test - public void testEndToEnd() { - - Component[] components = ((JPanel)app.getRootPane().getContentPane().getComponents()[0]).getComponents(); - JTextArea textArea = null; - for (Component component : components) { - if (component instanceof JTextArea) { - textArea = (JTextArea) component; - assertEquals("test", textArea.getText()); - - } - } - - textArea.setText("test test"); - - - JButton save = null; - JButton load = null; - for (Component component : components) { - if (component instanceof JPanel) { - for (Component c : ((JPanel) component).getComponents()) { - if (c instanceof JButton) { - if (save != null) { - load = (JButton) c; - } - else { - save = (JButton) c; - } - } - } - } - } - - save.doClick(); - assertEquals("test test", textArea.getText()); - textArea.setText(""); - - System.out.println("cleared text; about to refresh..."); - // pause execution for a bit so we can visually see the changes on the screen - try { - sleep(1500); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - - load.doClick(); - assertEquals("test test", textArea.getText()); - - System.out.println("after refresh!"); - - // pause execution for a bit so we can visually see the changes on the screen - try { - sleep(1500); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - - } -} \ No newline at end of file diff --git a/src/test/java/usecases/AllowcateInteractorTest.java b/src/test/java/usecases/AllowcateInteractorTest.java new file mode 100644 index 000000000..5ed8c0b93 --- /dev/null +++ b/src/test/java/usecases/AllowcateInteractorTest.java @@ -0,0 +1,134 @@ +package usecases; + +import entities.PlayerAttributes; +import org.junit.Test; +import usecases.startallowcate.*; + +import static org.junit.Assert.*; + +public class AllowcateInteractorTest { + + @Test + public void testExecuteSuccess() { + // Initialize PlayerAttributes + PlayerAttributes playerAttributes = new PlayerAttributes(); + + // Create mock DAO + AllowcateDataAccessInterface mockDAO = new AllowcateDataAccessInterface() { + @Override + public PlayerAttributes getPlayerAttributes() { + return playerAttributes; + } + + @Override + public void setSocial(int social) { + playerAttributes.setSocial(social); + } + + @Override + public void setLuck(int luck) { + playerAttributes.setLuck(luck); + } + + @Override + public void setThrift(int thrift) { + playerAttributes.setThrift(thrift); + } + + @Override + public void setMobilization(int mobilization) { + playerAttributes.setMobilization(mobilization); + } + + @Override + public void setGeneralship(int generalship) { + playerAttributes.setGeneralship(generalship); + } + + @Override + public void setPoint(int point) { + playerAttributes.setPoints(point); + } + }; + + // Create presenter + AllowcateOutputBoundary presenter = new AllowcateOutputBoundary() { + @Override + public void preparesuccessview(AllowcateOutputData outputData) { + assertEquals(1, (int) playerAttributes.getThrift()); + assertEquals(19, (int) outputData.getPoint()); + } + + @Override + public void preparefailureview(String failmessage) { + fail("Failure is not expected in this test."); + } + }; + + // Ensure mockDAO and presenter are not null + assertNotNull(mockDAO); + assertNotNull(presenter); + + // Create interactor and execute + AllowcateInteractor interactor = new AllowcateInteractor(mockDAO, presenter); + interactor.execute(new AllowcateInputdata("Thrift")); + } + + + @Test + public void testExecuteFailure() { + PlayerAttributes playerAttributes = new PlayerAttributes(); + playerAttributes.setPoints(0); + AllowcateInputdata inputdata = new AllowcateInputdata("Social"); + AllowcateOutputBoundary presenter = new AllowcateOutputBoundary() { + @Override + public void preparesuccessview(AllowcateOutputData outputData) { + } + + @Override + public void preparefailureview(String failmessage) { + assertEquals(failmessage, "Not enough Attribute points."); + } + }; + + AllowcateDataAccessInterface mockDAO = new AllowcateDataAccessInterface() { + @Override + public PlayerAttributes getPlayerAttributes() { + return playerAttributes; + } + + @Override + public void setSocial(int social) { + playerAttributes.setSocial(social); + } + + @Override + public void setLuck(int luck) { + playerAttributes.setLuck(luck); + } + + @Override + public void setThrift(int thrift) { + playerAttributes.setThrift(thrift); + } + + @Override + public void setMobilization(int mobilization) { + playerAttributes.setMobilization(mobilization); + } + + @Override + public void setGeneralship(int generalship) { + playerAttributes.setGeneralship(generalship); + } + + @Override + public void setPoint(int point) { + playerAttributes.setPoints(point); + } + }; + AllowcateInteractor interactor = new AllowcateInteractor(mockDAO, presenter); + interactor.execute(inputdata); + + } +} \ No newline at end of file diff --git a/src/test/java/usecases/MinimapInteractorTest.java b/src/test/java/usecases/MinimapInteractorTest.java new file mode 100644 index 000000000..020458b00 --- /dev/null +++ b/src/test/java/usecases/MinimapInteractorTest.java @@ -0,0 +1,60 @@ +package usecases; + +import entities.*; +import org.junit.Test; +import usecases.gameminimap.*; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; + +public class MinimapInteractorTest { + + @Test + public void testMinimapInteractorSuccess() { + ArrayList environments = new ArrayList<>(Arrays.asList("Iceland", "Desert", "Forest", "City", "Plain")); + MapFactory Mapfact =new MapFactory(); + ArrayList>>> cores = + Mapfact.getCores(100, 100, environments); + ArrayList> grids = Mapfact.getGrids(100, 100, cores); + Maps map = new Maps(grids); + MinimapDataAccessInterface MockDAO = new MinimapDataAccessInterface() { + @Override + public PlayerLocation getPlayerLocation() { + return new PlayerLocation(0,0); + } + + @Override + public Maps getMaps() { + return map; + } + }; + MinimapOutputBoundary mockPresenter = new MinimapOutputBoundary() { + @Override + public void preparesuccessview(MinimapOutputData outputdata) { + ArrayList> minimap = new ArrayList<>(); + for(int x = -4; x <= 4; x++) { + ArrayList row = new ArrayList<>(); + for(int y = -4; y <= 4; y++) { + if (EntityConstants.MAPWIDTH >= x + 1 && EntityConstants.MAPHEIGHT >= y + 1 && x >= 0 && y >= 0) { + row.add(grids.get(y).get(x).toString().substring(0, 1)); + // get the first letter as representative of map grid. + } + else { + row.add(" "); + // empty representing outside of Map + } + } + minimap.add(row); + } + System.out.println(minimap); + assertEquals(minimap, outputdata.getMinimap()); + } + + }; + MinimapInteractor MinimapInteractor = new MinimapInteractor(MockDAO, mockPresenter); + MinimapInteractor.execute(new MinimapInputData()); + } +} diff --git a/src/test/java/usecases/NoteInteractorTest.java b/src/test/java/usecases/NoteInteractorTest.java deleted file mode 100644 index 53072147e..000000000 --- a/src/test/java/usecases/NoteInteractorTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package usecases; - -import org.junit.Test; - -import static org.junit.Assert.*; - -public class NoteInteractorTest { - - @Test - public void testExecuteRefreshSuccess() { - - NoteDataAccessInterface noteDAO = new NoteDataAccessInterface() { - - - @Override - public String saveNote(User user, String note) { - return ""; - } - - - @Override - public String loadNote(User user) { - return "test"; - } - }; - - NoteOutputBoundary noteOB = new NoteOutputBoundary() { - @Override - public void prepareSuccessView(String message) { - assertEquals("test", message); - } - - @Override - public void prepareFailView(String errorMessage) { - fail(errorMessage); - } - }; - - NoteInteractor noteInteractor = new NoteInteractor(noteDAO, noteOB); - - noteInteractor.executeRefresh(); - - - } -} \ No newline at end of file From e91db88cbf86f203a19c09d19853dca7a0502acf Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Fri, 29 Nov 2024 17:12:54 -0700 Subject: [PATCH 045/154] Horde usecase implemented --- .../HordeDataAccessInterface.java | 38 ++++++++++++++ .../endprocesshorde/HordeInputBoundary.java | 9 ++++ .../endprocesshorde/HordeInputData.java | 4 ++ .../endprocesshorde/HordeInteractor.java | 50 ++++++++++++++++++- .../endprocesshorde/HordeOutputBoundary.java | 15 ++++++ .../endprocesshorde/HordeOutputData.java | 18 +++++++ 6 files changed, 133 insertions(+), 1 deletion(-) diff --git a/src/main/java/usecases/endprocesshorde/HordeDataAccessInterface.java b/src/main/java/usecases/endprocesshorde/HordeDataAccessInterface.java index a62b96956..31895e268 100644 --- a/src/main/java/usecases/endprocesshorde/HordeDataAccessInterface.java +++ b/src/main/java/usecases/endprocesshorde/HordeDataAccessInterface.java @@ -1,4 +1,42 @@ package usecases.endprocesshorde; +import entities.Horde; +import entities.Inventory; +import entities.PlayerAttributes; +import entities.PlayerInfo; + +/** + * Horde data access interface. Require the horde dataclass, player's location. Assume this is day 60, jumping to 61, + * this usecase will generate a description of outcome, jump to gameover page, displaying score. + */ public interface HordeDataAccessInterface { + /** + * Get inventory of player. + * @return inventory of player. + */ + Inventory getInventory(); + + /** + * Get horde info. + * @return get horde info. + */ + Horde getHorde(); + + /** + * Get player attribute we need generalship. + * @return attribute of player. + */ + PlayerAttributes getPlayerAttributes(); + + /** + * Set player won states to true. + * @param won winning status updated. + */ + void setWon(boolean won); + + /** + * Get player info because we need to show the score. + * @return Player info data type. + */ + PlayerInfo getPlayerInfo(); } diff --git a/src/main/java/usecases/endprocesshorde/HordeInputBoundary.java b/src/main/java/usecases/endprocesshorde/HordeInputBoundary.java index 6a51bcc8d..701a1d6cd 100644 --- a/src/main/java/usecases/endprocesshorde/HordeInputBoundary.java +++ b/src/main/java/usecases/endprocesshorde/HordeInputBoundary.java @@ -1,4 +1,13 @@ package usecases.endprocesshorde; +/** + * Interactor will have execute method, take in inputdata and run. + */ public interface HordeInputBoundary { + + /** + * Execute the main logic. + * @param inputData input data from player's side. + */ + void execute(HordeInputData inputData); } diff --git a/src/main/java/usecases/endprocesshorde/HordeInputData.java b/src/main/java/usecases/endprocesshorde/HordeInputData.java index ca502c25f..feeae8132 100644 --- a/src/main/java/usecases/endprocesshorde/HordeInputData.java +++ b/src/main/java/usecases/endprocesshorde/HordeInputData.java @@ -1,4 +1,8 @@ package usecases.endprocesshorde; +/** + * No need of inputdata as this is automatic move, this usecase is only called when day hits 60 and player clicked + * next day. + */ public class HordeInputData { } diff --git a/src/main/java/usecases/endprocesshorde/HordeInteractor.java b/src/main/java/usecases/endprocesshorde/HordeInteractor.java index bc8df8891..fccba7b75 100644 --- a/src/main/java/usecases/endprocesshorde/HordeInteractor.java +++ b/src/main/java/usecases/endprocesshorde/HordeInteractor.java @@ -1,4 +1,52 @@ package usecases.endprocesshorde; -public class HordeInteractor { +import entities.EntityConstants; + +/** + * Interactor of horde processing, main logic happening. + */ +public class HordeInteractor implements HordeInputBoundary { + private HordeDataAccessInterface dataaccess; + private HordeOutputBoundary outputboundary; + + public HordeInteractor(HordeDataAccessInterface dataaccess, HordeOutputBoundary outputboundary) { + this.dataaccess = dataaccess; + this.outputboundary = outputboundary; + } + + @Override + public void execute(HordeInputData inputData) { + String message = ""; + final int people = dataaccess.getInventory().getPeople(); + final int weapon = dataaccess.getInventory().getWeapon(); + final int generalship = dataaccess.getPlayerAttributes().getGeneralship(); + final int armed = Math.min(weapon, people); + final double generalshipBonus = 1 + (generalship * 0.05); + final double firepower = armed * EntityConstants.ARMEDPEOPLEPOWER * generalshipBonus; + final double resourcerequired = dataaccess.getHorde().getDuration() * dataaccess.getInventory().getPeople() + * (1 - EntityConstants.THRIFTIMPACTRESOURCELOSS * dataaccess.getPlayerAttributes().getThrift()); + + if (firepower < dataaccess.getHorde().getMagnitude()) { + message = "Your groups firepower wasnt enough to stop the horde. Despite your best efforts, the" + + "overwhelming number of zombies overran your defenses."; + } + else if (dataaccess.getInventory().getFood() < resourcerequired) { + message = "Your group ran out of food while holding off the horde. Starvation weakened your " + + "survivors, and the zombies overwhelmed them."; + } + else if (dataaccess.getInventory().getWater() < resourcerequired) { + message = "Your group ran out of water during the prolonged defense. Dehydration sapped their strength, " + + "leaving them defenseless against the horde."; + } + else { + dataaccess.setWon(true); + message = "Your group successfully defended against the horde! With well-armed fighters, " + + "strong leadership, and ample supplies, you emerged victorious and kept the group safe."; + } + + final int score = dataaccess.getPlayerInfo().getScore(); + final HordeOutputData outputdata = new HordeOutputData(score, message); + outputboundary.prepareSuccessView(outputdata); + } + } diff --git a/src/main/java/usecases/endprocesshorde/HordeOutputBoundary.java b/src/main/java/usecases/endprocesshorde/HordeOutputBoundary.java index d61d53f13..f8269d3c4 100644 --- a/src/main/java/usecases/endprocesshorde/HordeOutputBoundary.java +++ b/src/main/java/usecases/endprocesshorde/HordeOutputBoundary.java @@ -1,4 +1,19 @@ package usecases.endprocesshorde; +/** + * Prepare successview, on the game over page. + */ public interface HordeOutputBoundary { + + /** + * Prepare the success view with description of outcome and score player gained. + * @param outputData outputdata. + */ + void prepareSuccessView(HordeOutputData outputData); + + /** + * Prepare the failure view by the error message, not needed likely. + * @param errorMessage errormessage. + */ + void prepareFailureView(String errorMessage); } diff --git a/src/main/java/usecases/endprocesshorde/HordeOutputData.java b/src/main/java/usecases/endprocesshorde/HordeOutputData.java index e5677c965..46f436a90 100644 --- a/src/main/java/usecases/endprocesshorde/HordeOutputData.java +++ b/src/main/java/usecases/endprocesshorde/HordeOutputData.java @@ -1,4 +1,22 @@ package usecases.endprocesshorde; +/** + * Output data, consist of final outcome description, player's score. + */ public class HordeOutputData { + private int score; + private String description; + + public HordeOutputData(int score, String description) { + this.score = score; + this.description = description; + } + + public int getScore() { + return score; + } + + public String getDescription() { + return description; + } } From 0677bb31ab8c2afc6e5e81e8cc1106d868b6e6e5 Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Fri, 29 Nov 2024 20:40:22 -0500 Subject: [PATCH 046/154] Implement InMemoryBroadcastDataAccess --- .../database/InMemoryBroadcastDataAccess.java | 33 +++++++++++++++++++ .../controllers/BroadcastController.java | 4 +++ .../presenters/BroadcastPresenter.java | 4 +++ 3 files changed, 41 insertions(+) create mode 100644 src/main/java/frameworks/database/InMemoryBroadcastDataAccess.java create mode 100644 src/main/java/interface_adapters/controllers/BroadcastController.java create mode 100644 src/main/java/interface_adapters/presenters/BroadcastPresenter.java diff --git a/src/main/java/frameworks/database/InMemoryBroadcastDataAccess.java b/src/main/java/frameworks/database/InMemoryBroadcastDataAccess.java new file mode 100644 index 000000000..3513dd197 --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryBroadcastDataAccess.java @@ -0,0 +1,33 @@ +package frameworks.database; + +import entities.Inventory; +import entities.PlayerAttributes; +import usecases.dailybroadcast.BroadcastDataAccessInterface; + +/** + * An in-memory implementation of BroadcastDataAccessInterface for testing and development. + */ +public class InMemoryBroadcastDataAccess implements BroadcastDataAccessInterface { + private PlayerAttributes attributes; + private Inventory inventory; + + public InMemoryBroadcastDataAccess(PlayerAttributes attributes, Inventory inventory) { + this.attributes = attributes; + this.inventory = inventory; + } + + @Override + public PlayerAttributes getPlayerAttributes() { + return attributes; + } + + @Override + public Inventory getInventory() { + return inventory; + } + + @Override + public void updateInventory(int resourceChange) { + inventory.changeWater(resourceChange); + } +} diff --git a/src/main/java/interface_adapters/controllers/BroadcastController.java b/src/main/java/interface_adapters/controllers/BroadcastController.java new file mode 100644 index 000000000..9410e9030 --- /dev/null +++ b/src/main/java/interface_adapters/controllers/BroadcastController.java @@ -0,0 +1,4 @@ +package interface_adapters.controllers; + +public class BroadcastController { +} diff --git a/src/main/java/interface_adapters/presenters/BroadcastPresenter.java b/src/main/java/interface_adapters/presenters/BroadcastPresenter.java new file mode 100644 index 000000000..26272b2a8 --- /dev/null +++ b/src/main/java/interface_adapters/presenters/BroadcastPresenter.java @@ -0,0 +1,4 @@ +package interface_adapters.presenters; + +public class BroadcastPresenter { +} From 4fc3c92239cc732e4466d2b2926f4a0231a66055 Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Fri, 29 Nov 2024 20:42:02 -0500 Subject: [PATCH 047/154] Fix formatting errors --- .../java/usecases/dailybroadcast/BroadcastInteractor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java b/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java index 054067803..da0d89844 100644 --- a/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java @@ -1,10 +1,10 @@ package usecases.dailybroadcast; +import java.util.Random; + import entities.Inventory; import entities.PlayerAttributes; -import java.util.Random; - /** * Interactor for the broadcast use case. */ From d3751410df5d6431c7b128b4ef78fc2e02d85fb2 Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Fri, 29 Nov 2024 20:43:29 -0500 Subject: [PATCH 048/154] Implement interface_adapter for dailybroadcast --- .../controllers/BroadcastController.java | 27 +++++++++++++++ .../presenters/BroadcastPresenter.java | 33 ++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/main/java/interface_adapters/controllers/BroadcastController.java b/src/main/java/interface_adapters/controllers/BroadcastController.java index 9410e9030..a0029f07d 100644 --- a/src/main/java/interface_adapters/controllers/BroadcastController.java +++ b/src/main/java/interface_adapters/controllers/BroadcastController.java @@ -1,4 +1,31 @@ package interface_adapters.controllers; +import usecases.dailybroadcast.BroadcastInputBoundary; +import usecases.dailybroadcast.BroadcastInputData; + +/** + * The BroadcastController class is responsible for handling user input for broadcasts. + * It acts as a bridge between the UI and the broadcast use case. + */ public class BroadcastController { + private final BroadcastInputBoundary inputBoundary; + + /** + * Constructs a BroadcastController with the given input boundary. + * + * @param inputBoundary The use case input boundary for broadcasts. + */ + public BroadcastController(BroadcastInputBoundary inputBoundary) { + this.inputBoundary = inputBoundary; + } + + /** + * Handles the broadcast action by invoking the use case with the provided type. + * + * @param broadcastType The type of broadcast action (e.g., "SOS", "Resources"). + */ + public void handleBroadcast(String broadcastType) { + BroadcastInputData inputData = new BroadcastInputData(broadcastType); + inputBoundary.execute(inputData); + } } diff --git a/src/main/java/interface_adapters/presenters/BroadcastPresenter.java b/src/main/java/interface_adapters/presenters/BroadcastPresenter.java index 26272b2a8..e3ea78f34 100644 --- a/src/main/java/interface_adapters/presenters/BroadcastPresenter.java +++ b/src/main/java/interface_adapters/presenters/BroadcastPresenter.java @@ -1,4 +1,35 @@ package interface_adapters.presenters; -public class BroadcastPresenter { +import usecases.dailybroadcast.BroadcastOutputBoundary; +import usecases.dailybroadcast.BroadcastOutputData; + +/** + * The BroadcastPresenter class processes use case output for the broadcast + * and converts it into a format suitable for the UI. + */ +public class BroadcastPresenter implements BroadcastOutputBoundary { + /** + * Prepares the success view for the broadcast. + * + * @param outputData The output data from the broadcast use case. + */ + @Override + public void prepareSuccessView(BroadcastOutputData outputData) { + System.out.println("Broadcast Result: " + outputData.getResultMessage()); + System.out.println("Survivors Found: " + outputData.getSurvivorsFound()); + System.out.println("Resources Found: " + outputData.getResourcesFound()); + if (outputData.isAttractedZombies()) { + System.out.println("Warning: Zombies were attracted!"); + } + } + + /** + * Prepares the failure view for the broadcast. + * + * @param errorMessage The error message indicating why the broadcast failed. + */ + @Override + public void prepareFailureView(String errorMessage) { + System.out.println("Broadcast Failed: " + errorMessage); + } } From 5e1463f24f860d91ce20b9431eb82a00d990e141 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Fri, 29 Nov 2024 18:59:06 -0700 Subject: [PATCH 049/154] Minor bug fix for newday --- .../gamenewday/NewdayDataAccessInterface.java | 11 +++++++---- .../java/usecases/gamenewday/NewdayInteractor.java | 14 +++++++++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java b/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java index 6e1fb5b5c..b85d30931 100644 --- a/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java +++ b/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java @@ -1,9 +1,6 @@ package usecases.gamenewday; -import entities.Inventory; -import entities.Location; -import entities.PlayerAttributes; -import entities.PlayerInfo; +import entities.*; /** * Newday data access, require player's info because we care and need to update days and score. @@ -70,4 +67,10 @@ public interface NewdayDataAccessInterface { * @return return player attribute. */ PlayerAttributes getPlayerAttributes(); + + /** + * Get description of the horde on day 59 before update, so horde description appear on day 60. + * @return return the description of the horde. + */ + Horde getHorde(); } diff --git a/src/main/java/usecases/gamenewday/NewdayInteractor.java b/src/main/java/usecases/gamenewday/NewdayInteractor.java index 536887395..2b37b1738 100644 --- a/src/main/java/usecases/gamenewday/NewdayInteractor.java +++ b/src/main/java/usecases/gamenewday/NewdayInteractor.java @@ -20,7 +20,7 @@ public void execute(NewdayInputData inputdata) { final int thrift = newdayDataAccessObject.getPlayerAttributes().getThrift(); final int people = newdayDataAccessObject.getInventory().getPeople(); final double temp = newdayDataAccessObject.getLocation().gettemperature(); - int score = newdayDataAccessObject.getPlayerinfo().getScore(); + final int score = newdayDataAccessObject.getPlayerinfo().getScore(); // Message builder for day summary final StringBuilder messageBuilder = new StringBuilder("Another day has passed. Here's what happened:\n"); boolean success = true; @@ -29,12 +29,19 @@ public void execute(NewdayInputData inputdata) { success = false; } // Process resource changes and build the message - if (success) { + if (success && newdayDataAccessObject.getPlayerinfo().getDaysSurvived() < EntityConstants.MAXNUMDAY - 1) { decrementresource(messageBuilder, thrift, people, temp); incrementresouce(messageBuilder, people, score); final NewdayOutputData outputdata = new NewdayOutputData(messageBuilder.toString(), success, failmessage); newdayOutputBoundary.prepareSuccessView(outputdata); } + else if (success) { + final double temperature = newdayDataAccessObject.getLocation().gettemperature(); + final double threat = newdayDataAccessObject.getLocation().getthreatlevel(); + messageBuilder.append(newdayDataAccessObject.getHorde().getDescription(threat, temperature)); + final NewdayOutputData outputdata = new NewdayOutputData(messageBuilder.toString(), success, failmessage); + newdayOutputBoundary.prepareSuccessView(outputdata); + } else { failmessage = "Day exceeded failure."; newdayOutputBoundary.prepareFailureView(failmessage); @@ -46,7 +53,7 @@ private void incrementresouce(StringBuilder messageBuilder, int people, int scor final double foodscalar = newdayDataAccessObject.getLocation().getfoodresourceavailable(); final double foodgain = people * EntityConstants.PEOPLEGAINPERFOOD * foodscalar; newdayDataAccessObject.changeFood((int) foodgain); - int newscore = score + (int) foodgain; + messageBuilder.append(" - Food gained: ").append((int) foodgain).append(EntityConstants.NEWLINE); // water gain @@ -54,6 +61,7 @@ private void incrementresouce(StringBuilder messageBuilder, int people, int scor final double watergain = people * EntityConstants.PEOPLEGAINPERWATER * waterscalar; newdayDataAccessObject.changeWater((int) watergain); messageBuilder.append(" - Water gained: ").append((int) watergain).append(EntityConstants.NEWLINE); + int newscore = score + (int) foodgain; newscore = newscore + (int) watergain; // people gain From 37af8c99949e9fedddfcc565f3788daa03558fde Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Fri, 29 Nov 2024 21:52:34 -0500 Subject: [PATCH 050/154] RespondInteractor udpate & bugs fixed --- .../eventrespond/RespondInteractor.java | 197 ++++++++++++------ 1 file changed, 139 insertions(+), 58 deletions(-) diff --git a/src/main/java/usecases/eventrespond/RespondInteractor.java b/src/main/java/usecases/eventrespond/RespondInteractor.java index 11b159b97..11a9c0371 100644 --- a/src/main/java/usecases/eventrespond/RespondInteractor.java +++ b/src/main/java/usecases/eventrespond/RespondInteractor.java @@ -1,19 +1,24 @@ +package usecases.eventrespond; -package use_case.respond; -import entities.EntityConstants; +import entities.Entityconstants; import entities.Event; import entities.EventAmbush; +import entities.EventBlizzard; +import entities.EventFlood; +import entities.EventTraderEncounter; import entities.Inventory; import entities.PlayerAttributes; import kotlin.Pair; -import usecases.eventrespond.*; + +import java.util.Random; /** - * Interactor for the response use case, for the event, for the specific choice player provide. + * Interactor for the response use case, handling events based on player choices. */ public class RespondInteractor implements RespondInputBoundary { private final RespondDataAccessInterface respondDataAccessObject; private final RespondOutputBoundary respondOutputBoundary; + public RespondInteractor(RespondDataAccessInterface respondDataAccessObject, RespondOutputBoundary respondOutputBoundary) { this.respondDataAccessObject = respondDataAccessObject; @@ -26,76 +31,152 @@ public void execute(RespondInputData inputdata) { final int choice = inputdata.getChoice(); final PlayerAttributes attributes = respondDataAccessObject.getPlayerAttributes(); final Inventory inventory = respondDataAccessObject.getInventory(); + if (event instanceof EventAmbush) { - final Pair info = - ambushevaluator(attributes, choice, inventory, event); - final boolean success = info.getSecond(); - if (success) { - respondOutputBoundary.prepareSuccessView(info.getFirst()); - } - else { - respondOutputBoundary.prepareFailureView("Invalid choice"); - } + final Pair info = ambushEvaluator(attributes, choice, inventory, event); + processResult(info); + } else if (event instanceof EventFlood) { + final Pair info = floodEvaluator(choice, inventory, event); + processResult(info); + } else if (event instanceof EventBlizzard) { + final Pair info = blizzardEvaluator(inventory, event); + processResult(info); + } else if (event instanceof EventTraderEncounter) { + final Pair info = traderEvaluator(attributes, choice, inventory, event); + processResult(info); } } - private Pair ambushevaluator(PlayerAttributes attributes, + + private void processResult(Pair info) { + if (info.getSecond()) { + respondOutputBoundary.prepareSuccessView(info.getFirst()); + } else { + respondOutputBoundary.prepareFailureView("Invalid choice"); + } + } + + private Pair ambushEvaluator(PlayerAttributes attributes, int choice, Inventory inventory, Event event) { String message = ""; - int foodchange = 0; - int waterchange = 0; - int weaponchange = 0; - int peoplechange = 0; + int foodChange = 0; + int waterChange = 0; + int weaponChange = 0; + int peopleChange = 0; boolean success = true; final EventAmbush ambush = (EventAmbush) event; - if (choice == EntityConstants.FIRSTCHOICE) { - if (inventory.getfirepower() >= EntityConstants.AMBUSHPOWER) { - foodchange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; - waterchange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; - weaponchange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; - peoplechange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; + + if (choice == Entityconstants.FIRSTCHOICE) { + if (inventory.getfirepower() >= Entityconstants.AMBUSHPOWER) { + foodChange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; + waterChange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; + weaponChange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; + peopleChange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; message = ambush.getFightoutcomesuccess(); - } - else { - foodchange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterchange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponchange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - peoplechange = EntityConstants.AMBUSHFAILRESOURCEPEOPLE; + } else { + foodChange = Entityconstants.AMBUSHFAILRESOURCEFOOD; + waterChange = Entityconstants.AMBUSHFAILRESOURCEWATER; + weaponChange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; + peopleChange = Entityconstants.AMBUSHFAILRESOURCEPEOPLE; message = ambush.getFightoutcomefailed(); } - } - else if (choice == EntityConstants.SECONDCHOICE) { - foodchange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterchange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponchange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + } else if (choice == Entityconstants.SECONDCHOICE) { + foodChange = Entityconstants.AMBUSHFAILRESOURCEFOOD; + waterChange = Entityconstants.AMBUSHFAILRESOURCEWATER; + weaponChange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; message = ambush.getPayoutcome(); - } - else if (choice == EntityConstants.THIRDCHOICE) { - if (attributes.getSocial() < EntityConstants.AMBUSHNEGOTIATE) { - foodchange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterchange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponchange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - message = ambush.getNegotiatefailedoutcome(); - } - else { + } else if (choice == Entityconstants.THIRDCHOICE) { + if (attributes.getSocial() >= Entityconstants.AMBUSHNEGOTIATE) { message = ambush.getNegotiatesuccessoutcome(); + } else { + foodChange = Entityconstants.AMBUSHFAILRESOURCEFOOD; + waterChange = Entityconstants.AMBUSHFAILRESOURCEWATER; + weaponChange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; + message = ambush.getNegotiatefailedoutcome(); } + } else { + success = false; } - else { + + inventory.changeFood(foodChange); + inventory.changeWater(waterChange); + inventory.changeweapon(weaponChange); + inventory.changePeople(peopleChange); + + return new Pair<>(new RespondOutputData(message, foodChange, waterChange, weaponChange, peopleChange, ""), success); + } + + private Pair floodEvaluator(int choice, Inventory inventory, Event event) { + String message; + int foodChange = 0; + boolean success = true; + + EventFlood flood = (EventFlood) event; + if (choice == Entityconstants.FIRSTCHOICE) { + foodChange = Entityconstants.FLOODRESOURCELOSS; + message = flood.getEvacuateOutcome(); + } else if (choice == Entityconstants.SECONDCHOICE) { + foodChange = Entityconstants.FLOODSECURELOSS; + message = flood.getSecureSuppliesOutcome(); + } else if (choice == Entityconstants.THIRDCHOICE) { + foodChange = Entityconstants.FLOODDOINGNOTHINGLOSS; + message = flood.getDoNothingOutcome(); + } else { + success = false; + message = "Invalid choice."; + } + + inventory.changeFood(foodChange); + return new Pair<>(new RespondOutputData(message, foodChange, 0, 0, 0, ""), success); + } + + private Pair blizzardEvaluator(Inventory inventory, Event event) { + String message = ((EventBlizzard) event).getOutcome(); + inventory.changeFood(Entityconstants.BLIZZARDRESOURCELOSSFOOD); + inventory.changeWater(Entityconstants.BLIZZARDRESOURCELOSSWATER); + + return new Pair<>(new RespondOutputData(message, Entityconstants.BLIZZARDRESOURCELOSSFOOD, Entityconstants.BLIZZARDRESOURCELOSSWATER, 0, 0, ""), true); + } + + private Pair traderEvaluator(PlayerAttributes attributes, int choice, Inventory inventory, Event event) { + String message; + int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; + boolean success = true; + + EventTraderEncounter trader = (EventTraderEncounter) event; + if (choice == Entityconstants.FIRSTCHOICE) { + if (attributes.getSocial() >= Entityconstants.TRADERNEGOTIATE) { + foodChange = Entityconstants.TRADERTRADEGAINFOOD; + waterChange = Entityconstants.TRADERTRADEGAINWATER; + message = trader.getTradeOutcomeSuccess(); + } else { + foodChange = Entityconstants.TRADERTRADEFAILLOSSFOOD; + waterChange = Entityconstants.TRADERTRADEFAILLOSSWATER; + message = trader.getTradeOutcomeScam(); + } + } else if (choice == Entityconstants.SECONDCHOICE) { + message = trader.getIgnoreOutcome(); + } else if (choice == Entityconstants.THIRDCHOICE) { + if (inventory.getfirepower() >= Entityconstants.TRADERROBBERYPOWER) { + foodChange = Entityconstants.TRADERROBBERYGAINFOOD; + suppliesChange = Entityconstants.TRADERROBBERYGAINSUPPLIES; + message = trader.getRobOutcomeSuccess(); + } else { + foodChange = Entityconstants.TRADERROBBERYFAILLOSSFOOD; + peopleChange = Entityconstants.TRADERROBBERYFAILLOSSPEOPLE; + message = trader.getRobOutcomeFail(); + } + } else { success = false; + message = "Invalid choice."; } - final String inventorymessage = inventory.generateResourceChangeMessage( - foodchange, waterchange, weaponchange, peoplechange); - inventory.changeFood(foodchange); - inventory.changeWater(waterchange); - inventory.changeweapon(weaponchange); - inventory.changePeople(peoplechange); - return new Pair<>( - new RespondOutputData( - message, foodchange, waterchange, weaponchange, peoplechange, inventorymessage - ), - success - ); + + inventory.changeFood(foodChange); + inventory.changeWater(waterChange); + inventory.changeweapon(suppliesChange); + inventory.changePeople(peopleChange); + + return new Pair<>(new RespondOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, ""), success); } -} \ No newline at end of file +} From 3d3c95e8d9c665691f01a629c442828ff0c6e02e Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 30 Nov 2024 01:12:19 -0500 Subject: [PATCH 051/154] change view --- src/main/java/frameworks/view/EventView.java | 68 ++++++++++++ .../java/frameworks/view/GameOverView.java | 34 +++--- src/main/java/frameworks/view/GameView.java | 101 ++++++++++-------- src/main/java/frameworks/view/MainView.java | 59 +++++----- 4 files changed, 169 insertions(+), 93 deletions(-) create mode 100644 src/main/java/frameworks/view/EventView.java diff --git a/src/main/java/frameworks/view/EventView.java b/src/main/java/frameworks/view/EventView.java new file mode 100644 index 000000000..5c512078d --- /dev/null +++ b/src/main/java/frameworks/view/EventView.java @@ -0,0 +1,68 @@ +package frameworks.view; + +import javax.swing.*; +import java.awt.*; + +public class EventView extends JFrame { + public EventView() { + super("Event"); + + // 容器和布局 + final Container container = getContentPane(); + final SpringLayout layout = new SpringLayout(); + container.setLayout(layout); + + // 标题部分 + final JLabel eventLabel = new JLabel("Event:"); + eventLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); + container.add(eventLabel); + + // 描述区域 + final JTextArea descriptionArea = new JTextArea(); + descriptionArea.setEditable(false); + descriptionArea.setBackground(Color.LIGHT_GRAY); + descriptionArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + container.add(descriptionArea); + + // 选项按钮 + final JButton fightButton = new JButton("Fight"); + final JButton negotiateButton = new JButton("Negotiate"); + final JButton fleeButton = new JButton("Flee"); + final JButton backButton = new JButton("Back"); + container.add(fightButton); + container.add(negotiateButton); + container.add(fleeButton); + container.add(backButton); + + // 布局约束 + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, eventLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, eventLabel, Constants.TWENTY, SpringLayout.NORTH, container); + + layout.putConstraint(SpringLayout.WEST, descriptionArea, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.EAST, descriptionArea, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, descriptionArea, Constants.TWENTY, SpringLayout.SOUTH, eventLabel); + layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, container); + + layout.putConstraint(SpringLayout.WEST, fightButton, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, fightButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionArea); + + layout.putConstraint(SpringLayout.WEST, negotiateButton, Constants.TWENTY, SpringLayout.EAST, fightButton); + layout.putConstraint(SpringLayout.NORTH, negotiateButton, 0, SpringLayout.NORTH, fightButton); + + layout.putConstraint(SpringLayout.WEST, fleeButton, Constants.TWENTY, SpringLayout.EAST, negotiateButton); + layout.putConstraint(SpringLayout.NORTH, fleeButton, 0, SpringLayout.NORTH, fightButton); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, fightButton); + + // 窗口设置 + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + } + + public static void main(String[] args) { + new EventView(); + } +} diff --git a/src/main/java/frameworks/view/GameOverView.java b/src/main/java/frameworks/view/GameOverView.java index f6eaa2bb9..a34a7ad3c 100644 --- a/src/main/java/frameworks/view/GameOverView.java +++ b/src/main/java/frameworks/view/GameOverView.java @@ -12,36 +12,40 @@ public GameOverView() { container.setLayout(layout); final JLabel titleLabel = new JLabel("Game Over"); - titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.THIRTY)); + titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); container.add(titleLabel); final JLabel scoreLabel = new JLabel("Score: 0"); scoreLabel.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); container.add(scoreLabel); - final JButton rankingButton = new JButton("Ranking"); - rankingButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - container.add(rankingButton); + final JTextArea descriptionArea = new JTextArea(); + descriptionArea.setEditable(false); + descriptionArea.setBackground(Color.LIGHT_GRAY); + descriptionArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + container.add(descriptionArea); - final JButton startNewGameButton = new JButton("Start New Game"); - startNewGameButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - container.add(startNewGameButton); + final JButton mainMenuButton = new JButton("Main Menu"); + mainMenuButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + container.add(mainMenuButton); layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); layout.putConstraint(SpringLayout.NORTH, titleLabel, Constants.TWENTY, SpringLayout.NORTH, container); layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, scoreLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, scoreLabel, Constants.FORTY, SpringLayout.SOUTH, titleLabel); + layout.putConstraint(SpringLayout.NORTH, scoreLabel, Constants.TWENTY, SpringLayout.SOUTH, titleLabel); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, rankingButton, 0, - SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, rankingButton, Constants.FIFTY, SpringLayout.SOUTH, scoreLabel); + layout.putConstraint(SpringLayout.WEST, descriptionArea, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.EAST, descriptionArea, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, descriptionArea, Constants.TWENTY, SpringLayout.SOUTH, scoreLabel); + layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, + SpringLayout.SOUTH, container); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, startNewGameButton, 0, + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, mainMenuButton, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, startNewGameButton, Constants.THIRTY, SpringLayout.SOUTH, rankingButton); + layout.putConstraint(SpringLayout.NORTH, mainMenuButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionArea); - setSize(Constants.SIX_HUNDRED, Constants.SIX_HUNDRED); + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(true); @@ -50,4 +54,4 @@ public GameOverView() { public static void main(String[] args) { new GameOverView(); } -} \ No newline at end of file +} diff --git a/src/main/java/frameworks/view/GameView.java b/src/main/java/frameworks/view/GameView.java index d47967d29..f9df5e966 100644 --- a/src/main/java/frameworks/view/GameView.java +++ b/src/main/java/frameworks/view/GameView.java @@ -3,7 +3,7 @@ import javax.swing.*; import java.awt.*; -public class GameView extends JFrame{ +public class GameView extends JFrame { public GameView() { super("Game"); @@ -11,85 +11,94 @@ public GameView() { final SpringLayout layout = new SpringLayout(); container.setLayout(layout); - final JLabel titleLabel = new JLabel("Game"); - titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.THIRTY)); - container.add(titleLabel); + // 标题部分 + final JLabel dayLabel = new JLabel("Day: 50"); + dayLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); + container.add(dayLabel); - // get from output - final JLabel dayLabel = new JLabel("Day: 1"); + // 左侧资源部分 final JLabel foodLabel = new JLabel("Food: 50"); final JLabel waterLabel = new JLabel("Water: 30"); - container.add(dayLabel); + final JLabel peopleLabel = new JLabel("People: 20"); + final JLabel weaponLabel = new JLabel("Weapon: 15"); container.add(foodLabel); container.add(waterLabel); + container.add(peopleLabel); + container.add(weaponLabel); - final JLabel infoLabel = new JLabel("Information:"); - // information - final JTextArea infoArea = new JTextArea("System-generated information will appear here."); + // 小地图部分 + final JPanel mapPanel = new JPanel(); + mapPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + mapPanel.setPreferredSize(new Dimension(200, 200)); + container.add(mapPanel); + final JLabel mapLabel = new JLabel("Mini Map"); + mapPanel.add(mapLabel); + // 信息区域 + final JLabel infoLabel = new JLabel("Information:"); + final JTextArea infoArea = new JTextArea(); infoArea.setEditable(false); infoArea.setBackground(Color.LIGHT_GRAY); infoArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); container.add(infoLabel); container.add(infoArea); - final JButton action1 = new JButton("Action 1"); - final JButton action2 = new JButton("Action 2"); - final JButton action3 = new JButton("Action 3"); - final JButton action4 = new JButton("Action 4"); - container.add(action1); - container.add(action2); - container.add(action3); - container.add(action4); + // 动作按钮 + final JButton broadcastButton = new JButton("Broadcast"); + final JButton gatherButton = new JButton("Gather"); + final JButton moveButton = new JButton("Move"); + final JButton nextDayButton = new JButton("Next Day"); + container.add(broadcastButton); + container.add(gatherButton); + container.add(moveButton); + container.add(nextDayButton); + + // 布局部分 + layout.putConstraint(SpringLayout.WEST, dayLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, dayLabel, Constants.TWENTY, SpringLayout.NORTH, container); - final JPanel mapPanel = new JPanel(); - mapPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - mapPanel.setPreferredSize(new Dimension(Constants.ONE_HUNDRED, Constants.ONE_HUNDRED)); - container.add(mapPanel); - final JLabel mapLabel = new JLabel("Small Map"); - mapPanel.add(mapLabel); + layout.putConstraint(SpringLayout.WEST, foodLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, foodLabel, Constants.TWENTY, SpringLayout.SOUTH, dayLabel); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, titleLabel, Constants.TWENTY, SpringLayout.NORTH, container); + layout.putConstraint(SpringLayout.WEST, waterLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, waterLabel, Constants.TWENTY, SpringLayout.SOUTH, foodLabel); - layout.putConstraint(SpringLayout.WEST, dayLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, dayLabel, Constants.TWENTY, SpringLayout.SOUTH, titleLabel); + layout.putConstraint(SpringLayout.WEST, peopleLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, peopleLabel, Constants.TWENTY, SpringLayout.SOUTH, waterLabel); - layout.putConstraint(SpringLayout.WEST, foodLabel, Constants.TWENTY, SpringLayout.EAST, dayLabel); - layout.putConstraint(SpringLayout.NORTH, foodLabel, 0, SpringLayout.NORTH, dayLabel); + layout.putConstraint(SpringLayout.WEST, weaponLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, weaponLabel, Constants.TWENTY, SpringLayout.SOUTH, peopleLabel); - layout.putConstraint(SpringLayout.WEST, waterLabel, Constants.TWENTY, SpringLayout.EAST, foodLabel); - layout.putConstraint(SpringLayout.NORTH, waterLabel, 0, SpringLayout.NORTH, dayLabel); + layout.putConstraint(SpringLayout.EAST, mapPanel, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, mapPanel, Constants.TWENTY, SpringLayout.NORTH, container); layout.putConstraint(SpringLayout.WEST, infoLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, infoLabel, Constants.TWENTY, SpringLayout.SOUTH, dayLabel); + layout.putConstraint(SpringLayout.NORTH, infoLabel, Constants.TWENTY, SpringLayout.SOUTH, weaponLabel); layout.putConstraint(SpringLayout.WEST, infoArea, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.EAST, infoArea, -Constants.TWENTY, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, infoArea, Constants.TEN, SpringLayout.SOUTH, infoLabel); - layout.putConstraint(SpringLayout.SOUTH, infoArea, -Constants.TWO_HUNDRED, SpringLayout.SOUTH, container); + layout.putConstraint(SpringLayout.SOUTH, infoArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, container); - layout.putConstraint(SpringLayout.WEST, mapPanel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, mapPanel, Constants.TWENTY, SpringLayout.SOUTH, infoArea); + layout.putConstraint(SpringLayout.WEST, broadcastButton, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, broadcastButton, Constants.TWENTY, SpringLayout.SOUTH, infoArea); - layout.putConstraint(SpringLayout.WEST, action1, Constants.TWENTY, SpringLayout.EAST, mapPanel); - layout.putConstraint(SpringLayout.NORTH, action1, Constants.TWENTY, SpringLayout.SOUTH, infoArea); + layout.putConstraint(SpringLayout.WEST, gatherButton, Constants.TWENTY, SpringLayout.EAST, broadcastButton); + layout.putConstraint(SpringLayout.NORTH, gatherButton, 0, SpringLayout.NORTH, broadcastButton); - layout.putConstraint(SpringLayout.WEST, action2, 0, SpringLayout.WEST, action1); - layout.putConstraint(SpringLayout.NORTH, action2, Constants.TWENTY, SpringLayout.SOUTH, action1); + layout.putConstraint(SpringLayout.WEST, moveButton, Constants.TWENTY, SpringLayout.EAST, gatherButton); + layout.putConstraint(SpringLayout.NORTH, moveButton, 0, SpringLayout.NORTH, broadcastButton); - layout.putConstraint(SpringLayout.WEST, action3, 0, SpringLayout.WEST, action1); - layout.putConstraint(SpringLayout.NORTH, action3, Constants.TWENTY, SpringLayout.SOUTH, action2); - - layout.putConstraint(SpringLayout.WEST, action4, 0, SpringLayout.WEST, action1); - layout.putConstraint(SpringLayout.NORTH, action4, Constants.TWENTY, SpringLayout.SOUTH, action3); + layout.putConstraint(SpringLayout.EAST, nextDayButton, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, nextDayButton, 0, SpringLayout.NORTH, broadcastButton); // 窗口设置 - setSize(Constants.SIX_HUNDRED, Constants.EIGHT_HUNDRED); + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(true); } + public static void main(String[] args) { new GameView(); } diff --git a/src/main/java/frameworks/view/MainView.java b/src/main/java/frameworks/view/MainView.java index 8e1123e57..8c32f24f6 100644 --- a/src/main/java/frameworks/view/MainView.java +++ b/src/main/java/frameworks/view/MainView.java @@ -4,66 +4,61 @@ import java.awt.*; public class MainView extends JFrame { - private JButton startGame = new JButton("Start Game"); - private SpringLayout springLayout = new SpringLayout(); - private JButton skill = new JButton("Skill"); - private JButton info = new JButton("Information"); - private JButton rank = new JButton("Ranking"); + private JButton newGame = new JButton("New Game"); + private JButton ranking = new JButton("Ranking"); private JButton quit = new JButton("Quit"); + private JButton logout = new JButton("Logout"); + private SpringLayout springLayout = new SpringLayout(); private JPanel mainPanel = new JPanel(springLayout); - private JLabel titleLabel = new JLabel("Group project", JLabel.CENTER); + private JLabel titleLabel = new JLabel("60 Days to Survive", JLabel.CENTER); public MainView() { super("Main Menu"); final Container contentPane = getContentPane(); - titleLabel.setFont(new Font("Serif", Font.PLAIN, Constants.THIRTY)); + titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); contentPane.add(titleLabel, BorderLayout.NORTH); - final Font centerFont = new Font("8", Font.PLAIN, 20); - startGame.setFont(centerFont); - skill.setFont(centerFont); - info.setFont(centerFont); - rank.setFont(centerFont); - quit.setFont(centerFont); - mainPanel.add(startGame); - mainPanel.add(skill); - mainPanel.add(info); - mainPanel.add(rank); + + final Font buttonFont = new Font("Serif", Font.PLAIN, Constants.TWENTY); + newGame.setFont(buttonFont); + ranking.setFont(buttonFont); + quit.setFont(buttonFont); + logout.setFont(buttonFont); + + mainPanel.add(newGame); + mainPanel.add(ranking); mainPanel.add(quit); + mainPanel.add(logout); contentPane.add(mainPanel, BorderLayout.CENTER); + // Adjust constraints for title springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, mainPanel); - springLayout.putConstraint(SpringLayout.NORTH, titleLabel, 0, SpringLayout.NORTH, mainPanel); - - springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, startGame, 0, - SpringLayout.HORIZONTAL_CENTER, mainPanel); - springLayout.putConstraint(SpringLayout.NORTH, startGame, Constants.TWENTY, SpringLayout.SOUTH, titleLabel); - springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, skill, 0, + // Button placement + springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, newGame, 0, SpringLayout.HORIZONTAL_CENTER, mainPanel); - springLayout.putConstraint(SpringLayout.NORTH, skill, Constants.TWENTY, SpringLayout.SOUTH, startGame); + springLayout.putConstraint(SpringLayout.NORTH, newGame, Constants.FIFTY, SpringLayout.NORTH, mainPanel); - springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, info, 0, + springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, ranking, 0, SpringLayout.HORIZONTAL_CENTER, mainPanel); - springLayout.putConstraint(SpringLayout.NORTH, info, Constants.TWENTY, SpringLayout.SOUTH, skill); + springLayout.putConstraint(SpringLayout.NORTH, ranking, Constants.TWENTY, SpringLayout.SOUTH, newGame); - springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, rank, 0, + springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, quit, 0, SpringLayout.HORIZONTAL_CENTER, mainPanel); - springLayout.putConstraint(SpringLayout.NORTH, rank, Constants.TWENTY, SpringLayout.SOUTH, info); + springLayout.putConstraint(SpringLayout.NORTH, quit, Constants.TWENTY, SpringLayout.SOUTH, ranking); - springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, quit, 0, + springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, logout, 0, SpringLayout.HORIZONTAL_CENTER, mainPanel); - springLayout.putConstraint(SpringLayout.NORTH, quit, Constants.TWENTY, SpringLayout.SOUTH, rank); + springLayout.putConstraint(SpringLayout.NORTH, logout, Constants.TWENTY, SpringLayout.SOUTH, quit); setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(true); - } public static void main(String[] args) { new MainView(); } - } + From d596dbd2572fd3a3d7e2cab28d2422fd79196ef2 Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 30 Nov 2024 01:21:30 -0500 Subject: [PATCH 052/154] add idea file --- .idea/compiler.xml | 13 ++++ .idea/encodings.xml | 7 ++ .idea/misc.xml | 12 ++++ .idea/workspace.xml | 158 +++++++++++++++++++++++++++++++++++++++++++ note-application.iml | 6 ++ 5 files changed, 196 insertions(+) create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/workspace.xml create mode 100644 note-application.iml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 000000000..56784efc1 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 000000000..aa00ffab7 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..44185bb90 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 000000000..518b4ec33 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + { + "associatedIndex": 2 +} + + + + { + "keyToString": { + "Application.GameOverView.executor": "Run", + "Application.GameView.executor": "Run", + "Application.Login.executor": "Run", + "Application.LoginViewTest.executor": "Run", + "Application.Login_view.executor": "Run", + "Application.Main.executor": "Run", + "Application.MainNoteApplication.executor": "Run", + "Application.MainView.executor": "Run", + "Application.RankingView.executor": "Run", + "Application.SignUpView.executor": "Run", + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "git-widget-placeholder": "main", + "kotlin-language-version-configured": "true", + "last_opened_file_path": "D:/csc236" + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1731266409449 + + + + \ No newline at end of file diff --git a/note-application.iml b/note-application.iml new file mode 100644 index 000000000..9e3449c9d --- /dev/null +++ b/note-application.iml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file From f96640fec941cdda748290408081163431c7a8a6 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sat, 30 Nov 2024 01:59:11 -0500 Subject: [PATCH 053/154] Break Interactors into Individual Files --- src.zip | Bin 0 -> 112951 bytes .../eventrespond/RespondInteractor.java | 2 +- .../eventrespond/ambush/AmbushInteractor.java | 61 ++++++++++++++++++ .../eventrespond/flood/FloodInteractor.java | 38 +++++++++++ .../eventrespond/trader/TraderInteractor.java | 52 +++++++++++++++ 5 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 src.zip create mode 100644 src/main/java/usecases/eventrespond/ambush/AmbushInteractor.java create mode 100644 src/main/java/usecases/eventrespond/flood/FloodInteractor.java create mode 100644 src/main/java/usecases/eventrespond/trader/TraderInteractor.java diff --git a/src.zip b/src.zip new file mode 100644 index 0000000000000000000000000000000000000000..5b932f299ccde5704fa956de8f80a1b39d0733d9 GIT binary patch literal 112951 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�$hT~iCwKJY9AspAE~EmvEmUl)@#z~A-Od!r4# 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

y&JwGQAu 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 M#{6b;eDK%*0UZ?~*Z=?k literal 0 HcmV?d00001 diff --git a/src/main/java/usecases/eventrespond/RespondInteractor.java b/src/main/java/usecases/eventrespond/RespondInteractor.java index 11a9c0371..0f8888e1f 100644 --- a/src/main/java/usecases/eventrespond/RespondInteractor.java +++ b/src/main/java/usecases/eventrespond/RespondInteractor.java @@ -1,6 +1,6 @@ package usecases.eventrespond; -import entities.Entityconstants; +import entities.EntityConstants; import entities.Event; import entities.EventAmbush; import entities.EventBlizzard; diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushInteractor.java b/src/main/java/usecases/eventrespond/ambush/AmbushInteractor.java new file mode 100644 index 000000000..0edada4d1 --- /dev/null +++ b/src/main/java/usecases/eventrespond/ambush/AmbushInteractor.java @@ -0,0 +1,61 @@ +package usecases.eventrespond.ambush; + +import entities.EntityConstants; +import entities.EventAmbush; +import entities.Inventory; +import entities.PlayerAttributes; +import kotlin.Pair; +import usecases.eventrespond.RespondOutputData; + +/** + * Handles responses to the Ambush event. + */ +public class AmbushInteractor { + + public Pair evaluate(PlayerAttributes attributes, int choice, Inventory inventory, EventAmbush event) { + String message = ""; + int foodChange = 0, waterChange = 0, weaponChange = 0, peopleChange = 0; + boolean success = true; + + if (choice == EntityConstants.FIRSTCHOICE) { // Fight + if (inventory.getfirepower() >= EntityConstants.AMBUSHPOWER) { + foodChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; + peopleChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; + message = event.getFightoutcomesuccess(); + } else { + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + peopleChange = EntityConstants.AMBUSHFAILRESOURCEPEOPLE; + message = event.getFightoutcomefailed(); + } + } else if (choice == EntityConstants.SECONDCHOICE) { // Negotiate + if (attributes.getSocial() >= EntityConstants.AMBUSHNEGOTIATE) { + message = event.getNegotiatesuccessoutcome(); + } else { + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + message = event.getNegotiatefailedoutcome(); + } + } else if (choice == EntityConstants.THIRDCHOICE) { // Flee + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + peopleChange = -1; // Lose a group member while fleeing + message = "You fled from the ambush, losing supplies and a group member."; + } else { + success = false; + message = "Invalid choice."; + } + + inventory.changeFood(foodChange); + inventory.changeWater(waterChange); + inventory.changeweapon(weaponChange); + inventory.changePeople(peopleChange); + + return new Pair<>(new RespondOutputData(message, foodChange, waterChange, weaponChange, peopleChange, ""), success); + } +} diff --git a/src/main/java/usecases/eventrespond/flood/FloodInteractor.java b/src/main/java/usecases/eventrespond/flood/FloodInteractor.java new file mode 100644 index 000000000..588e4a77d --- /dev/null +++ b/src/main/java/usecases/eventrespond/flood/FloodInteractor.java @@ -0,0 +1,38 @@ +package usecases.eventrespond.flood; + +import entities.EntityConstants; +import entities.EventFlood; +import entities.Inventory; +import kotlin.Pair; +import usecases.eventrespond.RespondOutputData; + +/** + * Handles responses to the Flood event. + */ +public class FloodInteractor { + + public Pair evaluate(int choice, Inventory inventory, EventFlood event) { + String message = ""; + int foodChange = 0, waterChange = 0; + boolean success = true; + + if (choice == EntityConstants.FIRSTCHOICE) { // Fight (Evacuate) + foodChange = EntityConstants.FLOODRESOURCELOSS; + message = event.getEvacuateOutcome(); + } else if (choice == EntityConstants.SECONDCHOICE) { // Negotiate (Secure supplies) + foodChange = EntityConstants.FLOODSECURELOSS; + message = event.getSecureSuppliesOutcome(); + } else if (choice == EntityConstants.THIRDCHOICE) { // Flee (Do nothing) + foodChange = EntityConstants.FLOODDOINGNOTHINGLOSS; + message = event.getDoNothingOutcome(); + } else { + success = false; + message = "Invalid choice."; + } + + inventory.changeFood(foodChange); + inventory.changeWater(waterChange); + + return new Pair<>(new RespondOutputData(message, foodChange, waterChange, 0, 0, ""), success); + } +} diff --git a/src/main/java/usecases/eventrespond/trader/TraderInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderInteractor.java new file mode 100644 index 000000000..ab2b09463 --- /dev/null +++ b/src/main/java/usecases/eventrespond/trader/TraderInteractor.java @@ -0,0 +1,52 @@ +package usecases.eventrespond.trader; + +import entities.EntityConstants; +import entities.EventTraderEncounter; +import entities.Inventory; +import entities.PlayerAttributes; +import kotlin.Pair; +import usecases.eventrespond.RespondOutputData; + +/** + * Handles responses to the Trader encounter event. + */ +public class TraderInteractor { + + public Pair evaluate(PlayerAttributes attributes, int choice, Inventory inventory, EventTraderEncounter event) { + String message = ""; + int foodChange = 0, waterChange = 0, suppliesChange = 0; + boolean success = true; + + if (choice == EntityConstants.FIRSTCHOICE) { // Fight (rob) + if (inventory.getfirepower() >= EntityConstants.TRADERROBBERYPOWER) { + foodChange = EntityConstants.TRADERROBBERYGAINFOOD; + suppliesChange = EntityConstants.TRADERROBBERYGAINSUPPLIES; + message = event.getRobOutcomeSuccess(); + } else { + foodChange = EntityConstants.TRADERROBBERYFAILLOSSFOOD; + message = event.getRobOutcomeFail(); + } + } else if (choice == EntityConstants.SECONDCHOICE) { // Negotiate + if (attributes.getSocial() >= EntityConstants.TRADERNEGOTIATE) { + foodChange = EntityConstants.TRADERTRADEGAINFOOD; + waterChange = EntityConstants.TRADERTRADEGAINWATER; + message = event.getTradeOutcomeSuccess(); + } else { + foodChange = EntityConstants.TRADERTRADEFAILLOSSFOOD; + waterChange = EntityConstants.TRADERTRADEFAILLOSSWATER; + message = event.getTradeOutcomeScam(); + } + } else if (choice == EntityConstants.THIRDCHOICE) { // Flee + message = "You ignored the trader and moved on."; + } else { + success = false; + message = "Invalid choice."; + } + + inventory.changeFood(foodChange); + inventory.changeWater(waterChange); + inventory.changeweapon(suppliesChange); + + return new Pair<>(new RespondOutputData(message, foodChange, waterChange, suppliesChange, 0, ""), success); + } +} From c18bee89d6b9474616e6eac20df05806f4736a84 Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 30 Nov 2024 02:13:15 -0500 Subject: [PATCH 054/154] complete main menu --- .idea/misc.xml | 2 +- .idea/workspace.xml | 9 +++- src/main/java/frameworks/view/EventView.java | 6 --- src/main/java/frameworks/view/GameView.java | 8 ---- src/main/java/frameworks/view/MainView.java | 15 +++++++ .../interface_adapters/presenters/Login.java | 2 +- .../presenters/MainMenu.java | 41 ++++++++++++++++++- 7 files changed, 64 insertions(+), 19 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index c3b0dd376..23730d75c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,7 +8,7 @@ -<<<<<<< HEAD + ======= diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 518b4ec33..eeaa8358c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,7 +4,14 @@ - + + + + + + + + -<<<<<<< HEAD - -======= - ->>>>>>> 37af8c99949e9fedddfcc565f3788daa03558fde - \ No newline at end of file + + From e3581f60fb19f3e24c799e91071d99275b2c6151 Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 30 Nov 2024 13:17:27 -0500 Subject: [PATCH 058/154] add action listener to main view --- .idea/misc.xml | 21 +-- .idea/workspace.xml | 11 +- src/main/java/frameworks/view/MainView.java | 133 ++++++++++-------- .../presenters/MainMenu.java | 47 ------- 4 files changed, 81 insertions(+), 131 deletions(-) delete mode 100644 src/main/java/interface_adapters/presenters/MainMenu.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 85e8e3e50..e0844bc7b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,21 +1,6 @@ - - - + + -<<<<<<< HEAD - - -======= - ->>>>>>> 37af8c99949e9fedddfcc565f3788daa03558fde - -======= - - ->>>>>>> d2248e86581ec34124b8956172f4d2f1a1fb6b9d + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index eeaa8358c..2131f53ad 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,12 +5,10 @@ + - - - - + - + - + @@ -147,6 +145,7 @@ + diff --git a/src/main/java/frameworks/view/MainView.java b/src/main/java/frameworks/view/MainView.java index 826a780a7..a714cad28 100644 --- a/src/main/java/frameworks/view/MainView.java +++ b/src/main/java/frameworks/view/MainView.java @@ -4,76 +4,89 @@ import java.awt.*; public class MainView extends JFrame { - private JButton newGame = new JButton("New Game"); - private JButton ranking = new JButton("Ranking"); - private JButton quit = new JButton("Quit"); - private JButton logout = new JButton("Logout"); - private SpringLayout springLayout = new SpringLayout(); - private JPanel mainPanel = new JPanel(springLayout); - private JLabel titleLabel = new JLabel("60 Days to Survive", JLabel.CENTER); + private JButton newGameButton = new JButton("New Game"); + private JButton rankingButton = new JButton("Ranking"); + private JButton quitButton = new JButton("Quit"); + private JButton logoutButton = new JButton("Logout"); public MainView() { super("Main Menu"); - final Container contentPane = getContentPane(); + + // Set layout and container + final Container container = getContentPane(); + final SpringLayout layout = new SpringLayout(); + container.setLayout(layout); + + // Title + final JLabel titleLabel = new JLabel("Main Menu"); titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); - contentPane.add(titleLabel, BorderLayout.NORTH); - - final Font buttonFont = new Font("Serif", Font.PLAIN, Constants.TWENTY); - newGame.setFont(buttonFont); - ranking.setFont(buttonFont); - quit.setFont(buttonFont); - logout.setFont(buttonFont); - - mainPanel.add(newGame); - mainPanel.add(ranking); - mainPanel.add(quit); - mainPanel.add(logout); - contentPane.add(mainPanel, BorderLayout.CENTER); - - // Adjust constraints for title - springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, - SpringLayout.HORIZONTAL_CENTER, mainPanel); - - // Button placement - springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, newGame, 0, - SpringLayout.HORIZONTAL_CENTER, mainPanel); - springLayout.putConstraint(SpringLayout.NORTH, newGame, Constants.FIFTY, SpringLayout.NORTH, mainPanel); - - springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, ranking, 0, - SpringLayout.HORIZONTAL_CENTER, mainPanel); - springLayout.putConstraint(SpringLayout.NORTH, ranking, Constants.TWENTY, SpringLayout.SOUTH, newGame); - - springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, quit, 0, - SpringLayout.HORIZONTAL_CENTER, mainPanel); - springLayout.putConstraint(SpringLayout.NORTH, quit, Constants.TWENTY, SpringLayout.SOUTH, ranking); - - springLayout.putConstraint(SpringLayout.HORIZONTAL_CENTER, logout, 0, - SpringLayout.HORIZONTAL_CENTER, mainPanel); - springLayout.putConstraint(SpringLayout.NORTH, logout, Constants.TWENTY, SpringLayout.SOUTH, quit); - - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + container.add(titleLabel); + + // Set button fonts + newGameButton.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); + rankingButton.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); + quitButton.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); + logoutButton.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); + + // Add buttons to the container + container.add(newGameButton); + container.add(rankingButton); + container.add(quitButton); + container.add(logoutButton); + + // Layout constraints + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, titleLabel, Constants.TWENTY, SpringLayout.NORTH, container); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, newGameButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, newGameButton, Constants.FORTY, SpringLayout.SOUTH, titleLabel); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, rankingButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, rankingButton, Constants.TWENTY, SpringLayout.SOUTH, newGameButton); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, quitButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, quitButton, Constants.TWENTY, SpringLayout.SOUTH, rankingButton); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, logoutButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, logoutButton, Constants.TWENTY, SpringLayout.SOUTH, quitButton); + + // Add listeners for buttons + addListeners(); + + // Set window properties + setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(true); } - public static void main(String[] args) { - new MainView(); - } - public JButton getNewGameButton() { - return newGame; - } - - public JButton getRankingButton() { - return ranking; + // Add ActionListener to buttons + private void addListeners() { + // Switch to GameView when "New Game" is clicked + newGameButton.addActionListener(e -> { + dispose(); + new GameView(); + }); + + // Switch to RankView when "Ranking" is clicked + rankingButton.addActionListener(e -> { + dispose(); + new RankingView(); + }); + + // Exit the game when "Quit" is clicked + quitButton.addActionListener(e -> { + System.exit(0); + }); + + // Switch to LoginView when "Logout" is clicked + logoutButton.addActionListener(e -> { + dispose(); + new LoginView(); + }); } - public JButton getQuitButton() { - return quit; - } - - public JButton getLogoutButton() { - return logout; + public static void main(String[] args) { + new MainView(); } } - diff --git a/src/main/java/interface_adapters/presenters/MainMenu.java b/src/main/java/interface_adapters/presenters/MainMenu.java deleted file mode 100644 index 50f051c4c..000000000 --- a/src/main/java/interface_adapters/presenters/MainMenu.java +++ /dev/null @@ -1,47 +0,0 @@ -package interface_adapters.presenters; - -import frameworks.view.GameView; -import frameworks.view.MainView; -import frameworks.view.RankingView; -import frameworks.view.LoginView; - -/** - * Main menu presenter. - * Add liseners to main menu buttons - */ - -public class MainMenu { - private MainView mainView; - - public MainMenu() { - mainView = new MainView(); - addListeners(); - } - - @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) - private void addListeners() { - - mainView.getNewGameButton().addActionListener(e -> { - mainView.dispose(); - new GameView(); - }); - - mainView.getRankingButton().addActionListener(e -> { - mainView.dispose(); - new RankingView(); - }); - - mainView.getQuitButton().addActionListener(e -> { - System.exit(0); - }); - - mainView.getLogoutButton().addActionListener(e -> { - mainView.dispose(); - new LoginView(); - }); - } - - public static void main(String[] args) { - new MainMenu(); - } -} From 1a69f305ef20b42907de43a8b58d3b56b320e888 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sat, 30 Nov 2024 12:25:43 -0700 Subject: [PATCH 059/154] Interface adaptor gather usecase completed --- src/main/java/entities/EventBlizzard.java | 13 +++-- .../dailygather/DailyGatherController.java | 23 ++++++++ .../dailygather/DailyGatherInterface.java | 22 ++++++++ .../dailygather/DailyGatherPresentor.java | 22 ++++++++ .../dailygather/GatherInteractor.java | 7 ++- .../dailygather/GatherOutputData.java | 22 ++++++-- .../eventrespond/RespondInteractor.java | 52 +++++++++---------- 7 files changed, 124 insertions(+), 37 deletions(-) create mode 100644 src/main/java/interface_adapters/dailygather/DailyGatherController.java create mode 100644 src/main/java/interface_adapters/dailygather/DailyGatherInterface.java create mode 100644 src/main/java/interface_adapters/dailygather/DailyGatherPresentor.java diff --git a/src/main/java/entities/EventBlizzard.java b/src/main/java/entities/EventBlizzard.java index fe3d28925..14284f475 100644 --- a/src/main/java/entities/EventBlizzard.java +++ b/src/main/java/entities/EventBlizzard.java @@ -15,12 +15,12 @@ public class EventBlizzard implements Event { private final Map choices; private double probability; - private final String fightOutcome; // Try to "fight" the blizzard by securing shelter - private final String negotiateOutcome; // Attempt to negotiate (prepare supplies) - private final String fleeOutcome; // Do nothing and let the blizzard take its toll + private final String fightOutcome; + private final String negotiateOutcome; + private final String fleeOutcome; public EventBlizzard() { - this.isPositive = false; // Negative event + this.isPositive = false; this.occurringLocation = new ArrayList<>(); occurringLocation.add(EntityConstants.ICELAND); @@ -63,6 +63,11 @@ public boolean getispositive() { return isPositive; } + @Override + public ArrayList getOccuringlocation() { + return occurringLocation; + } + public ArrayList getOccurringLocation() { return occurringLocation; } diff --git a/src/main/java/interface_adapters/dailygather/DailyGatherController.java b/src/main/java/interface_adapters/dailygather/DailyGatherController.java new file mode 100644 index 000000000..a6016020a --- /dev/null +++ b/src/main/java/interface_adapters/dailygather/DailyGatherController.java @@ -0,0 +1,23 @@ +package interface_adapters.dailygather; + +import usecases.dailygather.GatherInputBoundary; +import usecases.dailygather.GatherInputData; + +/** + * Controller of gather usecase. + */ +public class DailyGatherController { + private GatherInputBoundary gatherUsecaseInteractor; + + DailyGatherController(GatherInputBoundary gatherUsecaseInteractor) { + this.gatherUsecaseInteractor = gatherUsecaseInteractor; + } + + /** + * Execute and call the interactor in gather. + */ + public void execute() { + final GatherInputData inputdata = new GatherInputData(); + gatherUsecaseInteractor.execute(inputdata); + } +} diff --git a/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java b/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java new file mode 100644 index 000000000..656b7507c --- /dev/null +++ b/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java @@ -0,0 +1,22 @@ +package interface_adapters.dailygather; + +/** + * Interface of daily gather, suppose to be implement by the view. + */ +public interface DailyGatherInterface { + + /** + * All the stuff we have to display and update at this point. Ne wmessage, and updated resource. + * @param message message for the gather. + * @param food new food. + * @param water new water amount. + * @param weapon new weapon amount. + */ + void updateUi(String message, int food, int water, int weapon); + + /** + * No need to update resource, or anything except the error message telling play why this is invaild move. + * @param message errormessage. + */ + void failure(String message); +} diff --git a/src/main/java/interface_adapters/dailygather/DailyGatherPresentor.java b/src/main/java/interface_adapters/dailygather/DailyGatherPresentor.java new file mode 100644 index 000000000..49896552c --- /dev/null +++ b/src/main/java/interface_adapters/dailygather/DailyGatherPresentor.java @@ -0,0 +1,22 @@ +package interface_adapters.dailygather; + +import usecases.dailygather.GatherOutputBoundary; +import usecases.dailygather.GatherOutputData; + +/** + * Daily gather usecase presentor. + */ +public class DailyGatherPresentor implements GatherOutputBoundary { + private DailyGatherInterface view; + + @Override + public void prepareSuccessView(GatherOutputData outputdata) { + view.updateUi(outputdata.getSuccessmessage(), + outputdata.getUpdatedfood(), outputdata.getUpdatedwater(), outputdata.getUpdatedweapon()); + } + + @Override + public void prepareFailureView(String errorMessage) { + view.failure(errorMessage); + } +} diff --git a/src/main/java/usecases/dailygather/GatherInteractor.java b/src/main/java/usecases/dailygather/GatherInteractor.java index 7194dbf1f..ba6735e9e 100644 --- a/src/main/java/usecases/dailygather/GatherInteractor.java +++ b/src/main/java/usecases/dailygather/GatherInteractor.java @@ -21,6 +21,9 @@ public void execute(GatherInputData inputdata) { final int foodgathered = (int) Math.round(foodscalar * Math.sqrt((double) people)); final int watergathered = (int) Math.round(waterscalar * Math.sqrt((double) people)); final int weapongathered = (int) Math.round(weaponscalar * Math.sqrt((double) people)); + final int updatedfood = dataAccessInterface.getInventory().getFood() + foodgathered; + final int updatedwater = dataAccessInterface.getInventory().getWater() + watergathered; + final int updatedweapon = dataAccessInterface.getInventory().getWeapon() + weapongathered; // not sure if this is a good way of calculation towards game balance, I'll need when game can fully run to // decide on the change. StringBuilder successoutputmessage = new StringBuilder("Your group found "); @@ -43,8 +46,8 @@ public void execute(GatherInputData inputdata) { dataAccessInterface.changewater(watergathered); dataAccessInterface.changeweapon(weapongathered); if (isvaildgather()) { - outputBoundary.prepareSuccessView(new GatherOutputData(successoutputmessage.toString(), - "Invalid Gather")); + outputBoundary.prepareSuccessView(new GatherOutputData( + successoutputmessage.toString(), updatedfood, updatedwater, updatedweapon)); } else { outputBoundary.prepareFailureView("Invalid Gather"); diff --git a/src/main/java/usecases/dailygather/GatherOutputData.java b/src/main/java/usecases/dailygather/GatherOutputData.java index 6fa0ab24f..3fe507836 100644 --- a/src/main/java/usecases/dailygather/GatherOutputData.java +++ b/src/main/java/usecases/dailygather/GatherOutputData.java @@ -7,18 +7,30 @@ */ public class GatherOutputData { private String successmessage; - private String errormessage; + private int updatedfood; + private int updatedwater; + private int updatedweapon; - public GatherOutputData(String successmessage, String errormessage) { + public GatherOutputData(String successmessage, int updatedfood, int updatedwater, int updatedweapon) { this.successmessage = successmessage; - this.errormessage = errormessage; + this.updatedfood = updatedfood; + this.updatedwater = updatedwater; + this.updatedweapon = updatedweapon; } public String getSuccessmessage() { return successmessage; } - public String getErrorMessage() { - return errormessage; + public int getUpdatedfood() { + return updatedfood; + } + + public int getUpdatedwater() { + return updatedwater; + } + + public int getUpdatedweapon() { + return updatedweapon; } } diff --git a/src/main/java/usecases/eventrespond/RespondInteractor.java b/src/main/java/usecases/eventrespond/RespondInteractor.java index 0f8888e1f..02ce0c245 100644 --- a/src/main/java/usecases/eventrespond/RespondInteractor.java +++ b/src/main/java/usecases/eventrespond/RespondInteractor.java @@ -67,32 +67,32 @@ private Pair ambushEvaluator(PlayerAttributes attrib boolean success = true; final EventAmbush ambush = (EventAmbush) event; - if (choice == Entityconstants.FIRSTCHOICE) { - if (inventory.getfirepower() >= Entityconstants.AMBUSHPOWER) { - foodChange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; - waterChange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; - weaponChange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; - peopleChange = Entityconstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; + if (choice == EntityConstants.FIRSTCHOICE) { + if (inventory.getfirepower() >= EntityConstants.AMBUSHPOWER) { + foodChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; + peopleChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; message = ambush.getFightoutcomesuccess(); } else { - foodChange = Entityconstants.AMBUSHFAILRESOURCEFOOD; - waterChange = Entityconstants.AMBUSHFAILRESOURCEWATER; - weaponChange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; - peopleChange = Entityconstants.AMBUSHFAILRESOURCEPEOPLE; + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + peopleChange = EntityConstants.AMBUSHFAILRESOURCEPEOPLE; message = ambush.getFightoutcomefailed(); } - } else if (choice == Entityconstants.SECONDCHOICE) { - foodChange = Entityconstants.AMBUSHFAILRESOURCEFOOD; - waterChange = Entityconstants.AMBUSHFAILRESOURCEWATER; - weaponChange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; + } else if (choice == EntityConstants.SECONDCHOICE) { + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; message = ambush.getPayoutcome(); - } else if (choice == Entityconstants.THIRDCHOICE) { - if (attributes.getSocial() >= Entityconstants.AMBUSHNEGOTIATE) { + } else if (choice == EntityConstants.THIRDCHOICE) { + if (attributes.getSocial() >= EntityConstants.AMBUSHNEGOTIATE) { message = ambush.getNegotiatesuccessoutcome(); } else { - foodChange = Entityconstants.AMBUSHFAILRESOURCEFOOD; - waterChange = Entityconstants.AMBUSHFAILRESOURCEWATER; - weaponChange = Entityconstants.AMBUSHFAILRESOURCEWEAPON; + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; message = ambush.getNegotiatefailedoutcome(); } } else { @@ -113,14 +113,14 @@ private Pair floodEvaluator(int choice, Inventory in boolean success = true; EventFlood flood = (EventFlood) event; - if (choice == Entityconstants.FIRSTCHOICE) { - foodChange = Entityconstants.FLOODRESOURCELOSS; + if (choice == EntityConstants.FIRSTCHOICE) { + foodChange = EntityConstants.FLOODRESOURCELOSS; message = flood.getEvacuateOutcome(); - } else if (choice == Entityconstants.SECONDCHOICE) { - foodChange = Entityconstants.FLOODSECURELOSS; + } else if (choice == EntityConstants.SECONDCHOICE) { + foodChange = EntityConstants.FLOODSECURELOSS; message = flood.getSecureSuppliesOutcome(); - } else if (choice == Entityconstants.THIRDCHOICE) { - foodChange = Entityconstants.FLOODDOINGNOTHINGLOSS; + } else if (choice == EntityConstants.THIRDCHOICE) { + foodChange = EntityConstants.FLOODDOINGNOTHINGLOSS; message = flood.getDoNothingOutcome(); } else { success = false; @@ -132,7 +132,7 @@ private Pair floodEvaluator(int choice, Inventory in } private Pair blizzardEvaluator(Inventory inventory, Event event) { - String message = ((EventBlizzard) event).getOutcome(); + String message = ((EventBlizzard) event).getOutcome inventory.changeFood(Entityconstants.BLIZZARDRESOURCELOSSFOOD); inventory.changeWater(Entityconstants.BLIZZARDRESOURCELOSSWATER); From c169bb8b78d270291f3515d419b92d1d6ed3d8a7 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sat, 30 Nov 2024 13:10:36 -0700 Subject: [PATCH 060/154] Interface adaptor Minimap, Move usecase completed --- .../dailygather/DailyGatherInterface.java | 4 +-- .../dailymove/DailyMoveController.java | 24 ++++++++++++++++++ .../dailymove/DailyMoveInterface.java | 21 ++++++++++++++++ .../dailymove/DailyMovePresentor.java | 25 +++++++++++++++++++ .../gameminimap/MinimapController.java | 24 ++++++++++++++++++ .../gameminimap/MinimapInterface.java | 15 +++++++++++ .../gameminimap/MinimapPresentor.java | 23 +++++++++++++++++ .../usecases/dailymove/MoveOutputData.java | 14 +++++++---- 8 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 src/main/java/interface_adapters/dailymove/DailyMoveController.java create mode 100644 src/main/java/interface_adapters/dailymove/DailyMoveInterface.java create mode 100644 src/main/java/interface_adapters/dailymove/DailyMovePresentor.java create mode 100644 src/main/java/interface_adapters/gameminimap/MinimapController.java create mode 100644 src/main/java/interface_adapters/gameminimap/MinimapInterface.java create mode 100644 src/main/java/interface_adapters/gameminimap/MinimapPresentor.java diff --git a/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java b/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java index 656b7507c..7da324bfb 100644 --- a/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java +++ b/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java @@ -12,11 +12,11 @@ public interface DailyGatherInterface { * @param water new water amount. * @param weapon new weapon amount. */ - void updateUi(String message, int food, int water, int weapon); + void updateUiGather(String message, int food, int water, int weapon); /** * No need to update resource, or anything except the error message telling play why this is invaild move. * @param message errormessage. */ - void failure(String message); + void failureGather(String message); } diff --git a/src/main/java/interface_adapters/dailymove/DailyMoveController.java b/src/main/java/interface_adapters/dailymove/DailyMoveController.java new file mode 100644 index 000000000..74b4ae46c --- /dev/null +++ b/src/main/java/interface_adapters/dailymove/DailyMoveController.java @@ -0,0 +1,24 @@ +package interface_adapters.dailymove; + +import usecases.dailymove.MoveInputBoundary; +import usecases.dailymove.MoveInputData; + +/** + * Move controller, used to make player input into inputdata type for move usecase. + */ +public class DailyMoveController { + private MoveInputBoundary moveInteractor; + + public DailyMoveController(MoveInputBoundary moveInteractor) { + this.moveInteractor = moveInteractor; + } + + /** + * Serve as execute the interactor by converting player input raw data to inputdata type. + * @param direction direction player inputed. + */ + public void execute(String direction) { + final MoveInputData inputdata = new MoveInputData(direction); + moveInteractor.execute(inputdata); + } +} diff --git a/src/main/java/interface_adapters/dailymove/DailyMoveInterface.java b/src/main/java/interface_adapters/dailymove/DailyMoveInterface.java new file mode 100644 index 000000000..1b4e44162 --- /dev/null +++ b/src/main/java/interface_adapters/dailymove/DailyMoveInterface.java @@ -0,0 +1,21 @@ +package interface_adapters.dailymove; + +import java.util.ArrayList; + +/** + * Move interface usecase for communicate with view in not direct or hard dependent way. + */ +public interface DailyMoveInterface { + + /** + * Update the minimap after move use case with the nested arraylist of single letter string. + * @param message description telling you moved. + */ + void updateUiMove(String message); + + /** + * Don;t update or change anything if usecase failed, display the error message to player only. + * @param errormessage Error message. + */ + void failureMove(String errormessage); +} diff --git a/src/main/java/interface_adapters/dailymove/DailyMovePresentor.java b/src/main/java/interface_adapters/dailymove/DailyMovePresentor.java new file mode 100644 index 000000000..83e88f14a --- /dev/null +++ b/src/main/java/interface_adapters/dailymove/DailyMovePresentor.java @@ -0,0 +1,25 @@ +package interface_adapters.dailymove; + +import usecases.dailymove.MoveOutputBoundary; +import usecases.dailymove.MoveOutputData; + +/** + * Presentor of move. + */ +public class DailyMovePresentor implements MoveOutputBoundary { + private DailyMoveInterface view; + + public DailyMovePresentor(DailyMoveInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(MoveOutputData outputData) { + view.updateUiMove(outputData.getmessage()); + } + + @Override + public void prepareFailureView(String errorMessage) { + view.updateUiMove(errorMessage); + } +} diff --git a/src/main/java/interface_adapters/gameminimap/MinimapController.java b/src/main/java/interface_adapters/gameminimap/MinimapController.java new file mode 100644 index 000000000..7685b04a8 --- /dev/null +++ b/src/main/java/interface_adapters/gameminimap/MinimapController.java @@ -0,0 +1,24 @@ +package interface_adapters.gameminimap; + +import usecases.gameminimap.MinimapInputBoundary; +import usecases.gameminimap.MinimapInputData; + +/** + * Controller for minimap update ui usecase. + */ +public class MinimapController { + private MinimapInputBoundary minimapInteractor; + + public MinimapController(MinimapInputBoundary minimapInteractor) { + this.minimapInteractor = minimapInteractor; + } + + /** + * Execute by taking info from player side, turn to inputdata type, and sent to execute. + */ + public void execute() { + final MinimapInputData inputdata = new MinimapInputData(); + minimapInteractor.execute(inputdata); + } + +} diff --git a/src/main/java/interface_adapters/gameminimap/MinimapInterface.java b/src/main/java/interface_adapters/gameminimap/MinimapInterface.java new file mode 100644 index 000000000..c2a1a0888 --- /dev/null +++ b/src/main/java/interface_adapters/gameminimap/MinimapInterface.java @@ -0,0 +1,15 @@ +package interface_adapters.gameminimap; + +import java.util.ArrayList; + +/** + * Interface for minimap, updateminimap ui. + */ +public interface MinimapInterface { + + /** + * Updata Minimap with nested list of single letter. + * @param grid representation of each loc form together to be minimap. + */ + void updateUiMinimap(ArrayList> grid); +} diff --git a/src/main/java/interface_adapters/gameminimap/MinimapPresentor.java b/src/main/java/interface_adapters/gameminimap/MinimapPresentor.java new file mode 100644 index 000000000..44091dc50 --- /dev/null +++ b/src/main/java/interface_adapters/gameminimap/MinimapPresentor.java @@ -0,0 +1,23 @@ +package interface_adapters.gameminimap; + +import java.util.ArrayList; + +import usecases.gameminimap.MinimapOutputBoundary; +import usecases.gameminimap.MinimapOutputData; + +/** + * Minimap presentor. + */ +public class MinimapPresentor implements MinimapOutputBoundary { + private MinimapInterface view; + + public MinimapPresentor(MinimapInterface view) { + this.view = view; + } + + @Override + public void preparesuccessview(MinimapOutputData outputdata) { + final ArrayList> grid = outputdata.getMinimap(); + view.updateUiMinimap(grid); + } +} diff --git a/src/main/java/usecases/dailymove/MoveOutputData.java b/src/main/java/usecases/dailymove/MoveOutputData.java index 5d75c2acc..350ddb427 100644 --- a/src/main/java/usecases/dailymove/MoveOutputData.java +++ b/src/main/java/usecases/dailymove/MoveOutputData.java @@ -5,13 +5,13 @@ public class MoveOutputData { private final int newx; private final int newy; private final boolean usecasesuccess; - private final String failmessage; + private final String message; - public MoveOutputData(int newx, int newy, boolean usecasesuccess, String failmessage) { + public MoveOutputData(int newx, int newy, boolean usecasesuccess, String message) { this.newx = newx; this.newy = newy; this.usecasesuccess = usecasesuccess; - this.failmessage = failmessage; + this.message = message; } public int getNewx() { @@ -26,7 +26,11 @@ public boolean isUsecasesuccess() { return usecasesuccess; } - public String getFailmessage() { - return failmessage; + /** + * Return the success message description to player. + * @return message + */ + public String getmessage() { + return message; } } From dea09b4c4b8177f448acf0e617205abfa68bc1fc Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sat, 30 Nov 2024 15:17:45 -0500 Subject: [PATCH 061/154] Rewrite Interactors & Structural Reconstruction & Add a controller --- .../controllers/EventResponseController.java | 48 +++++++++++ .../ambush/AmbushEventInteractor.java | 80 +++++++++++++++++++ .../eventrespond/ambush/AmbushInteractor.java | 61 -------------- .../blizzard/BlizzardEventInteractor.java | 58 ++++++++++++++ .../blizzard/BlizzardInteractor.java | 41 ---------- .../eventrespond/flood/FloodInteractor.java | 38 --------- .../shared/RespondDataAccessInterface.java | 77 ++++++++++++++++++ .../shared/RespondInputBoundary.java | 13 +++ .../eventrespond/shared/RespondInputData.java | 16 ++++ .../shared/RespondOutputBoundary.java | 20 +++++ .../shared/RespondOutputData.java | 50 ++++++++++++ .../trader/TraderEventInteractor.java | 71 ++++++++++++++++ .../eventrespond/trader/TraderInteractor.java | 52 ------------ 13 files changed, 433 insertions(+), 192 deletions(-) create mode 100644 src/main/java/interface_adapters/controllers/EventResponseController.java create mode 100644 src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java delete mode 100644 src/main/java/usecases/eventrespond/ambush/AmbushInteractor.java create mode 100644 src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java delete mode 100644 src/main/java/usecases/eventrespond/blizzard/BlizzardInteractor.java delete mode 100644 src/main/java/usecases/eventrespond/flood/FloodInteractor.java create mode 100644 src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java create mode 100644 src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/shared/RespondInputData.java create mode 100644 src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/shared/RespondOutputData.java create mode 100644 src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java delete mode 100644 src/main/java/usecases/eventrespond/trader/TraderInteractor.java diff --git a/src/main/java/interface_adapters/controllers/EventResponseController.java b/src/main/java/interface_adapters/controllers/EventResponseController.java new file mode 100644 index 000000000..4d24043da --- /dev/null +++ b/src/main/java/interface_adapters/controllers/EventResponseController.java @@ -0,0 +1,48 @@ +package interface_adapters.controllers; + +import entities.Event; +import entities.EventAmbush; +import entities.EventTraderEncounter; +import entities.EventBlizzard; +import usecases.eventrespond.RespondInputBoundary; +import usecases.eventrespond.RespondInputData; +import usecases.eventrespond.ambush.AmbushEventInteractor; +import usecases.eventrespond.trader.TraderEventInteractor; +import usecases.eventrespond.blizzard.BlizzardEventInteractor; +import usecases.eventrespond.RespondDataAccessInterface; +import usecases.eventrespond.RespondOutputBoundary; + +/** + * Controller for handling event responses and delegating to the correct interactor. + */ +public class EventResponseController { + private final RespondDataAccessInterface dataAccess; + private final RespondOutputBoundary outputBoundary; + + public EventResponseController(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; + this.outputBoundary = outputBoundary; + } + + /** + * Handles the response to a given event by selecting the appropriate interactor. + * @param inputData The player's input data (choice). + */ + public void handleResponse(RespondInputData inputData) { + Event event = dataAccess.getevent(); + + RespondInputBoundary interactor; + if (event instanceof EventAmbush) { + interactor = new AmbushEventInteractor(dataAccess, outputBoundary); + } else if (event instanceof EventTraderEncounter) { + interactor = new TraderEventInteractor(dataAccess, outputBoundary); + } else if (event instanceof EventBlizzard) { + interactor = new BlizzardEventInteractor(dataAccess, outputBoundary); + } else { + outputBoundary.prepareFailureView("Unknown event type."); + return; + } + + interactor.execute(inputData); + } +} diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java new file mode 100644 index 000000000..f02e632b9 --- /dev/null +++ b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java @@ -0,0 +1,80 @@ +package usecases.eventrespond.ambush; + +import entities.EntityConstants; +import entities.EventAmbush; +import usecases.eventrespond.*; + +/** + * Interactor for handling player responses to an Ambush event. + * Implements the RespondInputBoundary interface. + */ +public class AmbushEventInteractor implements RespondInputBoundary { + private final RespondDataAccessInterface dataAccess; + private final RespondOutputBoundary outputBoundary; + + public AmbushEventInteractor(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(RespondInputData inputData) { + EventAmbush ambushEvent = (EventAmbush) dataAccess.getevent(); + int choice = inputData.getChoice(); + + int foodChange = 0; + int waterChange = 0; + int weaponChange = 0; + int peopleChange = 0; + String message; + + if (choice == EntityConstants.FIRSTCHOICE) { + // Fight back + if (dataAccess.getInventory().getfirepower() >= EntityConstants.AMBUSHPOWER) { + foodChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; + peopleChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; + message = ambushEvent.getFightoutcomesuccess(); + } else { + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + peopleChange = EntityConstants.AMBUSHFAILRESOURCEPEOPLE; + message = ambushEvent.getFightoutcomefailed(); + } + } else if (choice == EntityConstants.SECONDCHOICE) { + // Pay the bandits + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + message = ambushEvent.getPayoutcome(); + } else if (choice == EntityConstants.THIRDCHOICE) { + // Negotiate + if (dataAccess.getPlayerAttributes().getSocial() >= EntityConstants.AMBUSHNEGOTIATE) { + message = ambushEvent.getNegotiatesuccessoutcome(); + } else { + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + message = ambushEvent.getNegotiatefailedoutcome(); + } + } else { + // Invalid choice + outputBoundary.prepareFailureView("Invalid choice provided."); + return; + } + + // Apply changes to inventory + dataAccess.changefood(foodChange); + dataAccess.changewater(waterChange); + dataAccess.changeweapon(weaponChange); + dataAccess.changepeople(peopleChange); + + // Prepare output + String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + + ", Weapons " + weaponChange + ", People " + peopleChange + "."; + RespondOutputData outputData = new RespondOutputData(message, foodChange, waterChange, weaponChange, peopleChange, inventoryMessage); + outputBoundary.prepareSuccessView(outputData); + } +} diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushInteractor.java b/src/main/java/usecases/eventrespond/ambush/AmbushInteractor.java deleted file mode 100644 index 0edada4d1..000000000 --- a/src/main/java/usecases/eventrespond/ambush/AmbushInteractor.java +++ /dev/null @@ -1,61 +0,0 @@ -package usecases.eventrespond.ambush; - -import entities.EntityConstants; -import entities.EventAmbush; -import entities.Inventory; -import entities.PlayerAttributes; -import kotlin.Pair; -import usecases.eventrespond.RespondOutputData; - -/** - * Handles responses to the Ambush event. - */ -public class AmbushInteractor { - - public Pair evaluate(PlayerAttributes attributes, int choice, Inventory inventory, EventAmbush event) { - String message = ""; - int foodChange = 0, waterChange = 0, weaponChange = 0, peopleChange = 0; - boolean success = true; - - if (choice == EntityConstants.FIRSTCHOICE) { // Fight - if (inventory.getfirepower() >= EntityConstants.AMBUSHPOWER) { - foodChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; - peopleChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; - message = event.getFightoutcomesuccess(); - } else { - foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - peopleChange = EntityConstants.AMBUSHFAILRESOURCEPEOPLE; - message = event.getFightoutcomefailed(); - } - } else if (choice == EntityConstants.SECONDCHOICE) { // Negotiate - if (attributes.getSocial() >= EntityConstants.AMBUSHNEGOTIATE) { - message = event.getNegotiatesuccessoutcome(); - } else { - foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - message = event.getNegotiatefailedoutcome(); - } - } else if (choice == EntityConstants.THIRDCHOICE) { // Flee - foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - peopleChange = -1; // Lose a group member while fleeing - message = "You fled from the ambush, losing supplies and a group member."; - } else { - success = false; - message = "Invalid choice."; - } - - inventory.changeFood(foodChange); - inventory.changeWater(waterChange); - inventory.changeweapon(weaponChange); - inventory.changePeople(peopleChange); - - return new Pair<>(new RespondOutputData(message, foodChange, waterChange, weaponChange, peopleChange, ""), success); - } -} diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java new file mode 100644 index 000000000..834c0a61d --- /dev/null +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java @@ -0,0 +1,58 @@ +package usecases.eventrespond.blizzard; + +import entities.EntityConstants; +import entities.EventBlizzard; +import usecases.eventrespond.*; + +/** + * Interactor for handling player responses to a Blizzard event. + * Implements the RespondInputBoundary interface. + */ +public class BlizzardEventInteractor implements RespondInputBoundary { + private final RespondDataAccessInterface dataAccess; + private final RespondOutputBoundary outputBoundary; + + public BlizzardEventInteractor(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(RespondInputData inputData) { + EventBlizzard blizzardEvent = (EventBlizzard) dataAccess.getevent(); + int choice = inputData.getChoice(); + + int foodChange = 0, waterChange = 0; + String message; + + if (choice == EntityConstants.FIRSTCHOICE) { + // Secure shelter + foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD / 2; + waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER / 2; + message = blizzardEvent.getFightOutcome(); + } else if (choice == EntityConstants.SECONDCHOICE) { + // Prepare supplies + foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD; + waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER; + message = blizzardEvent.getNegotiateOutcome(); + } else if (choice == EntityConstants.THIRDCHOICE) { + // Do nothing + foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD * 2; + waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER * 2; + message = blizzardEvent.getFleeOutcome(); + } else { + // Invalid choice + outputBoundary.prepareFailureView("Invalid choice provided. Please select a valid option."); + return; + } + + // Apply resource changes to the inventory + dataAccess.changefood(foodChange); + dataAccess.changewater(waterChange); + + // Prepare output + String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + "."; + RespondOutputData outputData = new RespondOutputData(message, foodChange, waterChange, 0, 0, inventoryMessage); + outputBoundary.prepareSuccessView(outputData); + } +} diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardInteractor.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardInteractor.java deleted file mode 100644 index 97bb04f1a..000000000 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardInteractor.java +++ /dev/null @@ -1,41 +0,0 @@ -package usecases.eventrespond.blizzard; - -import entities.EntityConstants; -import entities.EventBlizzard; -import entities.Inventory; -import kotlin.Pair; -import usecases.eventrespond.RespondOutputData; - -/** - * Handles responses to the Blizzard event. - */ -public class BlizzardInteractor { - - public Pair evaluate(int choice, Inventory inventory, EventBlizzard event) { - String message = ""; - int foodChange = 0, waterChange = 0; - boolean success = true; - - if (choice == EntityConstants.FIRSTCHOICE) { // Fight (Secure shelter) - foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD / 2; // Halve the resource loss - waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER / 2; - message = event.getFightOutcome(); - } else if (choice == EntityConstants.SECONDCHOICE) { // Negotiate (Prepare supplies) - foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD; // Normal resource loss - waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER; - message = event.getNegotiateOutcome(); - } else if (choice == EntityConstants.THIRDCHOICE) { // Flee (Do nothing) - foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD * 2; // Double the resource loss - waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER * 2; - message = event.getFleeOutcome(); - } else { - success = false; - message = "Invalid choice."; - } - - inventory.changeFood(foodChange); - inventory.changeWater(waterChange); - - return new Pair<>(new RespondOutputData(message, foodChange, waterChange, 0, 0, ""), success); - } -} diff --git a/src/main/java/usecases/eventrespond/flood/FloodInteractor.java b/src/main/java/usecases/eventrespond/flood/FloodInteractor.java deleted file mode 100644 index 588e4a77d..000000000 --- a/src/main/java/usecases/eventrespond/flood/FloodInteractor.java +++ /dev/null @@ -1,38 +0,0 @@ -package usecases.eventrespond.flood; - -import entities.EntityConstants; -import entities.EventFlood; -import entities.Inventory; -import kotlin.Pair; -import usecases.eventrespond.RespondOutputData; - -/** - * Handles responses to the Flood event. - */ -public class FloodInteractor { - - public Pair evaluate(int choice, Inventory inventory, EventFlood event) { - String message = ""; - int foodChange = 0, waterChange = 0; - boolean success = true; - - if (choice == EntityConstants.FIRSTCHOICE) { // Fight (Evacuate) - foodChange = EntityConstants.FLOODRESOURCELOSS; - message = event.getEvacuateOutcome(); - } else if (choice == EntityConstants.SECONDCHOICE) { // Negotiate (Secure supplies) - foodChange = EntityConstants.FLOODSECURELOSS; - message = event.getSecureSuppliesOutcome(); - } else if (choice == EntityConstants.THIRDCHOICE) { // Flee (Do nothing) - foodChange = EntityConstants.FLOODDOINGNOTHINGLOSS; - message = event.getDoNothingOutcome(); - } else { - success = false; - message = "Invalid choice."; - } - - inventory.changeFood(foodChange); - inventory.changeWater(waterChange); - - return new Pair<>(new RespondOutputData(message, foodChange, waterChange, 0, 0, ""), success); - } -} diff --git a/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java b/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java new file mode 100644 index 000000000..58c09710b --- /dev/null +++ b/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java @@ -0,0 +1,77 @@ +package usecases.eventrespond; + +import entities.Event; +import entities.Inventory; +import entities.PlayerAttributes; +import entities.PlayerLocation; + +/** + * DAO of respond, provide internal data as needed for interactor. + */ +public interface RespondDataAccessInterface { + + /** + * The event which we are working on to respond, assuming already happened. + * @return Event, contains description, choices, and such. + */ + Event getevent(); + + /** + * Return the player attributes as alot of event outcome are determine by competence and attribute of player. + * ex: low social attribute would cause more likely of failure for negotiate. + * @return return player attributes. + */ + PlayerAttributes getPlayerAttributes(); + + /** + * Return the player's inventory as alot of event outcome are determine by what player have currently. + * ex: low firepower(involves people and weapon) FightBack etc choices are likely to fail. + * @return return player inventory. + */ + Inventory getInventory(); + + /** + * Return the player location, for response like run away flee etc, we'll have to change it, thus we need it. + * @return player's current location. + */ + PlayerLocation getPlayerLocation(); + + /** + * How the amount of people changes after the event, for that choice player provide. call the change method in + * inventory. + * @param peoplechange change of people quantity. + */ + void changepeople(int peoplechange); + + /** + * How the amount of food changes after the event, for that choice player provide. call change method in inventory. + * @param foodchange change of people quantity. + */ + void changefood(int foodchange); + + /** + * How the amount of people changes after the event, for that choice player provide. call change method in inventory + * @param waterchange change of people quantity. + */ + void changewater(int waterchange); + + /** + * How the amount of weapon changes after the event, for that choice player provide. call change method in inventory + * @param weaponchange change of people quantity. + */ + void changeweapon(int weaponchange); + + /** + * If for an event's responds alter the location, call this method which calls player location setxcoordinate + * method. + * @param newx new x coordination of the player after the event. + */ + void setplayerxcoor(int newx); + + /** + * If for an event's responds alter the location, call this method which calls player location setycoordinate + * method. + * @param newy new y coordination of the player after the event. + */ + void setplayerycoor(int newy); +} diff --git a/src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java b/src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java new file mode 100644 index 000000000..880f6b160 --- /dev/null +++ b/src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java @@ -0,0 +1,13 @@ +package usecases.eventrespond; + +/** + * Input boundary of respond use case. + */ +public interface RespondInputBoundary { + + /** + * Execute method for respond. + * @param inputdata player's input, represented in input data. + */ + void execute(RespondInputData inputdata); +} diff --git a/src/main/java/usecases/eventrespond/shared/RespondInputData.java b/src/main/java/usecases/eventrespond/shared/RespondInputData.java new file mode 100644 index 000000000..cc0629f08 --- /dev/null +++ b/src/main/java/usecases/eventrespond/shared/RespondInputData.java @@ -0,0 +1,16 @@ +package usecases.eventrespond; + +/** + * Input data form the view/player side like the choice they choose in term os 12345... + */ +public class RespondInputData { + private int choice; + + public RespondInputData(int choice) { + this.choice = choice; + } + + public int getChoice() { + return choice; + } +} diff --git a/src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java b/src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java new file mode 100644 index 000000000..dc57afbfc --- /dev/null +++ b/src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java @@ -0,0 +1,20 @@ +package usecases.eventrespond; + +/** + * Output boundary, responsible for passing output data to the controller. + */ +public interface RespondOutputBoundary { + + /** + * Outputs for a successful respond. + * @param outputData the output for updating the view. + */ + void prepareSuccessView(RespondOutputData outputData); + + /** + * If the respond is invaild, example: only choices 1,2,3,4(represented in number internally) but somehow player + * input 5? though it shouldn't happen because at the end we provide player with only buttons. + * @param errorMessage message of why is invaild, for the player. + */ + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/eventrespond/shared/RespondOutputData.java b/src/main/java/usecases/eventrespond/shared/RespondOutputData.java new file mode 100644 index 000000000..732b685ea --- /dev/null +++ b/src/main/java/usecases/eventrespond/shared/RespondOutputData.java @@ -0,0 +1,50 @@ +package usecases.eventrespond; + +/** + * Output data for the player's respond. + */ +public class RespondOutputData { + private final String message; + private final int peoplechange; + private final int foodchange; + private final int waterchange; + private final int weaponchange; + private final String inventorymessage; + + public RespondOutputData(String message, + int foodchange, int waterchange, int weaponchange, int peoplechange, + String inventorymessage) { + this.message = message; + this.peoplechange = peoplechange; + this.foodchange = foodchange; + this.waterchange = waterchange; + this.weaponchange = weaponchange; + this.inventorymessage = inventorymessage; + + } + + public String getMessage() { + return message; + } + + public int getPeoplechange() { + return peoplechange; + } + + public int getFoodchange() { + return foodchange; + } + + public int getWaterchange() { + return waterchange; + } + + public int getWeaponchange() { + return weaponchange; + } + + public String getInventorymessage() { + return inventorymessage; + } + +} diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java new file mode 100644 index 000000000..8bc97b2ef --- /dev/null +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -0,0 +1,71 @@ +package usecases.eventrespond.trader; + +import entities.EntityConstants; +import entities.EventTraderEncounter; +import usecases.eventrespond.*; + +/** + * Interactor for handling player responses to a Trader Encounter event. + * Implements the RespondInputBoundary interface. + */ +public class TraderEventInteractor implements RespondInputBoundary { + private final RespondDataAccessInterface dataAccess; + private final RespondOutputBoundary outputBoundary; + + public TraderEventInteractor(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(RespondInputData inputData) { + EventTraderEncounter traderEvent = (EventTraderEncounter) dataAccess.getevent(); + int choice = inputData.getChoice(); + + int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; + String message; + + if (choice == EntityConstants.FIRSTCHOICE) { + // Trade with the trader + if (dataAccess.getPlayerAttributes().getSocial() >= EntityConstants.TRADERNEGOTIATE) { + foodChange = EntityConstants.TRADERTRADEGAINFOOD; + waterChange = EntityConstants.TRADERTRADEGAINWATER; + message = traderEvent.getTradeOutcomeSuccess(); + } else { + foodChange = EntityConstants.TRADERTRADEFAILLOSSFOOD; + waterChange = EntityConstants.TRADERTRADEFAILLOSSWATER; + message = traderEvent.getTradeOutcomeScam(); + } + } else if (choice == EntityConstants.SECONDCHOICE) { + // Ignore the trader + message = traderEvent.getIgnoreOutcome(); + } else if (choice == EntityConstants.THIRDCHOICE) { + // Rob the trader + if (dataAccess.getInventory().getfirepower() >= EntityConstants.TRADERROBBERYPOWER) { + foodChange = EntityConstants.TRADERROBBERYGAINFOOD; + suppliesChange = EntityConstants.TRADERROBBERYGAINSUPPLIES; + message = traderEvent.getRobOutcomeSuccess(); + } else { + foodChange = EntityConstants.TRADERROBBERYFAILLOSSFOOD; + peopleChange = EntityConstants.TRADERROBBERYFAILLOSSPEOPLE; + message = traderEvent.getRobOutcomeFail(); + } + } else { + // Invalid choice + outputBoundary.prepareFailureView("Invalid choice provided."); + return; + } + + // Apply changes to the inventory + dataAccess.changefood(foodChange); + dataAccess.changewater(waterChange); + dataAccess.changeweapon(suppliesChange); + dataAccess.changePeople(peopleChange); + + // Prepare output + String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + + ", Supplies " + suppliesChange + ", People " + peopleChange + "."; + RespondOutputData outputData = new RespondOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); + outputBoundary.prepareSuccessView(outputData); + } +} diff --git a/src/main/java/usecases/eventrespond/trader/TraderInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderInteractor.java deleted file mode 100644 index ab2b09463..000000000 --- a/src/main/java/usecases/eventrespond/trader/TraderInteractor.java +++ /dev/null @@ -1,52 +0,0 @@ -package usecases.eventrespond.trader; - -import entities.EntityConstants; -import entities.EventTraderEncounter; -import entities.Inventory; -import entities.PlayerAttributes; -import kotlin.Pair; -import usecases.eventrespond.RespondOutputData; - -/** - * Handles responses to the Trader encounter event. - */ -public class TraderInteractor { - - public Pair evaluate(PlayerAttributes attributes, int choice, Inventory inventory, EventTraderEncounter event) { - String message = ""; - int foodChange = 0, waterChange = 0, suppliesChange = 0; - boolean success = true; - - if (choice == EntityConstants.FIRSTCHOICE) { // Fight (rob) - if (inventory.getfirepower() >= EntityConstants.TRADERROBBERYPOWER) { - foodChange = EntityConstants.TRADERROBBERYGAINFOOD; - suppliesChange = EntityConstants.TRADERROBBERYGAINSUPPLIES; - message = event.getRobOutcomeSuccess(); - } else { - foodChange = EntityConstants.TRADERROBBERYFAILLOSSFOOD; - message = event.getRobOutcomeFail(); - } - } else if (choice == EntityConstants.SECONDCHOICE) { // Negotiate - if (attributes.getSocial() >= EntityConstants.TRADERNEGOTIATE) { - foodChange = EntityConstants.TRADERTRADEGAINFOOD; - waterChange = EntityConstants.TRADERTRADEGAINWATER; - message = event.getTradeOutcomeSuccess(); - } else { - foodChange = EntityConstants.TRADERTRADEFAILLOSSFOOD; - waterChange = EntityConstants.TRADERTRADEFAILLOSSWATER; - message = event.getTradeOutcomeScam(); - } - } else if (choice == EntityConstants.THIRDCHOICE) { // Flee - message = "You ignored the trader and moved on."; - } else { - success = false; - message = "Invalid choice."; - } - - inventory.changeFood(foodChange); - inventory.changeWater(waterChange); - inventory.changeweapon(suppliesChange); - - return new Pair<>(new RespondOutputData(message, foodChange, waterChange, suppliesChange, 0, ""), success); - } -} From 2f7584117452e71d3a46120de1331f151d8a96d8 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sat, 30 Nov 2024 15:23:50 -0500 Subject: [PATCH 062/154] Fixed Bug in TraderEvent --- .../java/usecases/eventrespond/trader/TraderEventInteractor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java index 8bc97b2ef..935ca92af 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -60,7 +60,6 @@ public void execute(RespondInputData inputData) { dataAccess.changefood(foodChange); dataAccess.changewater(waterChange); dataAccess.changeweapon(suppliesChange); - dataAccess.changePeople(peopleChange); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + From 555d0a80233c50917a927f389522af9b3cea44ec Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sat, 30 Nov 2024 15:27:34 -0500 Subject: [PATCH 063/154] Checkstyle Fixed and Unnecessary Files Removed --- .../RespondDataAccessInterface.java | 77 -------- .../eventrespond/RespondInputBoundary.java | 13 -- .../eventrespond/RespondInputData.java | 16 -- .../eventrespond/RespondInteractor.java | 182 ------------------ .../eventrespond/RespondOutputBoundary.java | 20 -- .../eventrespond/RespondOutputData.java | 50 ----- .../shared/RespondDataAccessInterface.java | 2 +- .../shared/RespondInputBoundary.java | 2 +- .../eventrespond/shared/RespondInputData.java | 2 +- .../shared/RespondOutputBoundary.java | 2 +- .../shared/RespondOutputData.java | 2 +- 11 files changed, 5 insertions(+), 363 deletions(-) delete mode 100644 src/main/java/usecases/eventrespond/RespondDataAccessInterface.java delete mode 100644 src/main/java/usecases/eventrespond/RespondInputBoundary.java delete mode 100644 src/main/java/usecases/eventrespond/RespondInputData.java delete mode 100644 src/main/java/usecases/eventrespond/RespondInteractor.java delete mode 100644 src/main/java/usecases/eventrespond/RespondOutputBoundary.java delete mode 100644 src/main/java/usecases/eventrespond/RespondOutputData.java diff --git a/src/main/java/usecases/eventrespond/RespondDataAccessInterface.java b/src/main/java/usecases/eventrespond/RespondDataAccessInterface.java deleted file mode 100644 index 58c09710b..000000000 --- a/src/main/java/usecases/eventrespond/RespondDataAccessInterface.java +++ /dev/null @@ -1,77 +0,0 @@ -package usecases.eventrespond; - -import entities.Event; -import entities.Inventory; -import entities.PlayerAttributes; -import entities.PlayerLocation; - -/** - * DAO of respond, provide internal data as needed for interactor. - */ -public interface RespondDataAccessInterface { - - /** - * The event which we are working on to respond, assuming already happened. - * @return Event, contains description, choices, and such. - */ - Event getevent(); - - /** - * Return the player attributes as alot of event outcome are determine by competence and attribute of player. - * ex: low social attribute would cause more likely of failure for negotiate. - * @return return player attributes. - */ - PlayerAttributes getPlayerAttributes(); - - /** - * Return the player's inventory as alot of event outcome are determine by what player have currently. - * ex: low firepower(involves people and weapon) FightBack etc choices are likely to fail. - * @return return player inventory. - */ - Inventory getInventory(); - - /** - * Return the player location, for response like run away flee etc, we'll have to change it, thus we need it. - * @return player's current location. - */ - PlayerLocation getPlayerLocation(); - - /** - * How the amount of people changes after the event, for that choice player provide. call the change method in - * inventory. - * @param peoplechange change of people quantity. - */ - void changepeople(int peoplechange); - - /** - * How the amount of food changes after the event, for that choice player provide. call change method in inventory. - * @param foodchange change of people quantity. - */ - void changefood(int foodchange); - - /** - * How the amount of people changes after the event, for that choice player provide. call change method in inventory - * @param waterchange change of people quantity. - */ - void changewater(int waterchange); - - /** - * How the amount of weapon changes after the event, for that choice player provide. call change method in inventory - * @param weaponchange change of people quantity. - */ - void changeweapon(int weaponchange); - - /** - * If for an event's responds alter the location, call this method which calls player location setxcoordinate - * method. - * @param newx new x coordination of the player after the event. - */ - void setplayerxcoor(int newx); - - /** - * If for an event's responds alter the location, call this method which calls player location setycoordinate - * method. - * @param newy new y coordination of the player after the event. - */ - void setplayerycoor(int newy); -} diff --git a/src/main/java/usecases/eventrespond/RespondInputBoundary.java b/src/main/java/usecases/eventrespond/RespondInputBoundary.java deleted file mode 100644 index 880f6b160..000000000 --- a/src/main/java/usecases/eventrespond/RespondInputBoundary.java +++ /dev/null @@ -1,13 +0,0 @@ -package usecases.eventrespond; - -/** - * Input boundary of respond use case. - */ -public interface RespondInputBoundary { - - /** - * Execute method for respond. - * @param inputdata player's input, represented in input data. - */ - void execute(RespondInputData inputdata); -} diff --git a/src/main/java/usecases/eventrespond/RespondInputData.java b/src/main/java/usecases/eventrespond/RespondInputData.java deleted file mode 100644 index cc0629f08..000000000 --- a/src/main/java/usecases/eventrespond/RespondInputData.java +++ /dev/null @@ -1,16 +0,0 @@ -package usecases.eventrespond; - -/** - * Input data form the view/player side like the choice they choose in term os 12345... - */ -public class RespondInputData { - private int choice; - - public RespondInputData(int choice) { - this.choice = choice; - } - - public int getChoice() { - return choice; - } -} diff --git a/src/main/java/usecases/eventrespond/RespondInteractor.java b/src/main/java/usecases/eventrespond/RespondInteractor.java deleted file mode 100644 index 02ce0c245..000000000 --- a/src/main/java/usecases/eventrespond/RespondInteractor.java +++ /dev/null @@ -1,182 +0,0 @@ -package usecases.eventrespond; - -import entities.EntityConstants; -import entities.Event; -import entities.EventAmbush; -import entities.EventBlizzard; -import entities.EventFlood; -import entities.EventTraderEncounter; -import entities.Inventory; -import entities.PlayerAttributes; -import kotlin.Pair; - -import java.util.Random; - -/** - * Interactor for the response use case, handling events based on player choices. - */ -public class RespondInteractor implements RespondInputBoundary { - private final RespondDataAccessInterface respondDataAccessObject; - private final RespondOutputBoundary respondOutputBoundary; - - public RespondInteractor(RespondDataAccessInterface respondDataAccessObject, - RespondOutputBoundary respondOutputBoundary) { - this.respondDataAccessObject = respondDataAccessObject; - this.respondOutputBoundary = respondOutputBoundary; - } - - @Override - public void execute(RespondInputData inputdata) { - final Event event = respondDataAccessObject.getevent(); - final int choice = inputdata.getChoice(); - final PlayerAttributes attributes = respondDataAccessObject.getPlayerAttributes(); - final Inventory inventory = respondDataAccessObject.getInventory(); - - if (event instanceof EventAmbush) { - final Pair info = ambushEvaluator(attributes, choice, inventory, event); - processResult(info); - } else if (event instanceof EventFlood) { - final Pair info = floodEvaluator(choice, inventory, event); - processResult(info); - } else if (event instanceof EventBlizzard) { - final Pair info = blizzardEvaluator(inventory, event); - processResult(info); - } else if (event instanceof EventTraderEncounter) { - final Pair info = traderEvaluator(attributes, choice, inventory, event); - processResult(info); - } - } - - private void processResult(Pair info) { - if (info.getSecond()) { - respondOutputBoundary.prepareSuccessView(info.getFirst()); - } else { - respondOutputBoundary.prepareFailureView("Invalid choice"); - } - } - - private Pair ambushEvaluator(PlayerAttributes attributes, - int choice, - Inventory inventory, - Event event) { - String message = ""; - int foodChange = 0; - int waterChange = 0; - int weaponChange = 0; - int peopleChange = 0; - boolean success = true; - final EventAmbush ambush = (EventAmbush) event; - - if (choice == EntityConstants.FIRSTCHOICE) { - if (inventory.getfirepower() >= EntityConstants.AMBUSHPOWER) { - foodChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; - peopleChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; - message = ambush.getFightoutcomesuccess(); - } else { - foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - peopleChange = EntityConstants.AMBUSHFAILRESOURCEPEOPLE; - message = ambush.getFightoutcomefailed(); - } - } else if (choice == EntityConstants.SECONDCHOICE) { - foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - message = ambush.getPayoutcome(); - } else if (choice == EntityConstants.THIRDCHOICE) { - if (attributes.getSocial() >= EntityConstants.AMBUSHNEGOTIATE) { - message = ambush.getNegotiatesuccessoutcome(); - } else { - foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - message = ambush.getNegotiatefailedoutcome(); - } - } else { - success = false; - } - - inventory.changeFood(foodChange); - inventory.changeWater(waterChange); - inventory.changeweapon(weaponChange); - inventory.changePeople(peopleChange); - - return new Pair<>(new RespondOutputData(message, foodChange, waterChange, weaponChange, peopleChange, ""), success); - } - - private Pair floodEvaluator(int choice, Inventory inventory, Event event) { - String message; - int foodChange = 0; - boolean success = true; - - EventFlood flood = (EventFlood) event; - if (choice == EntityConstants.FIRSTCHOICE) { - foodChange = EntityConstants.FLOODRESOURCELOSS; - message = flood.getEvacuateOutcome(); - } else if (choice == EntityConstants.SECONDCHOICE) { - foodChange = EntityConstants.FLOODSECURELOSS; - message = flood.getSecureSuppliesOutcome(); - } else if (choice == EntityConstants.THIRDCHOICE) { - foodChange = EntityConstants.FLOODDOINGNOTHINGLOSS; - message = flood.getDoNothingOutcome(); - } else { - success = false; - message = "Invalid choice."; - } - - inventory.changeFood(foodChange); - return new Pair<>(new RespondOutputData(message, foodChange, 0, 0, 0, ""), success); - } - - private Pair blizzardEvaluator(Inventory inventory, Event event) { - String message = ((EventBlizzard) event).getOutcome - inventory.changeFood(Entityconstants.BLIZZARDRESOURCELOSSFOOD); - inventory.changeWater(Entityconstants.BLIZZARDRESOURCELOSSWATER); - - return new Pair<>(new RespondOutputData(message, Entityconstants.BLIZZARDRESOURCELOSSFOOD, Entityconstants.BLIZZARDRESOURCELOSSWATER, 0, 0, ""), true); - } - - private Pair traderEvaluator(PlayerAttributes attributes, int choice, Inventory inventory, Event event) { - String message; - int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; - boolean success = true; - - EventTraderEncounter trader = (EventTraderEncounter) event; - if (choice == Entityconstants.FIRSTCHOICE) { - if (attributes.getSocial() >= Entityconstants.TRADERNEGOTIATE) { - foodChange = Entityconstants.TRADERTRADEGAINFOOD; - waterChange = Entityconstants.TRADERTRADEGAINWATER; - message = trader.getTradeOutcomeSuccess(); - } else { - foodChange = Entityconstants.TRADERTRADEFAILLOSSFOOD; - waterChange = Entityconstants.TRADERTRADEFAILLOSSWATER; - message = trader.getTradeOutcomeScam(); - } - } else if (choice == Entityconstants.SECONDCHOICE) { - message = trader.getIgnoreOutcome(); - } else if (choice == Entityconstants.THIRDCHOICE) { - if (inventory.getfirepower() >= Entityconstants.TRADERROBBERYPOWER) { - foodChange = Entityconstants.TRADERROBBERYGAINFOOD; - suppliesChange = Entityconstants.TRADERROBBERYGAINSUPPLIES; - message = trader.getRobOutcomeSuccess(); - } else { - foodChange = Entityconstants.TRADERROBBERYFAILLOSSFOOD; - peopleChange = Entityconstants.TRADERROBBERYFAILLOSSPEOPLE; - message = trader.getRobOutcomeFail(); - } - } else { - success = false; - message = "Invalid choice."; - } - - inventory.changeFood(foodChange); - inventory.changeWater(waterChange); - inventory.changeweapon(suppliesChange); - inventory.changePeople(peopleChange); - - return new Pair<>(new RespondOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, ""), success); - } -} diff --git a/src/main/java/usecases/eventrespond/RespondOutputBoundary.java b/src/main/java/usecases/eventrespond/RespondOutputBoundary.java deleted file mode 100644 index dc57afbfc..000000000 --- a/src/main/java/usecases/eventrespond/RespondOutputBoundary.java +++ /dev/null @@ -1,20 +0,0 @@ -package usecases.eventrespond; - -/** - * Output boundary, responsible for passing output data to the controller. - */ -public interface RespondOutputBoundary { - - /** - * Outputs for a successful respond. - * @param outputData the output for updating the view. - */ - void prepareSuccessView(RespondOutputData outputData); - - /** - * If the respond is invaild, example: only choices 1,2,3,4(represented in number internally) but somehow player - * input 5? though it shouldn't happen because at the end we provide player with only buttons. - * @param errorMessage message of why is invaild, for the player. - */ - void prepareFailureView(String errorMessage); -} diff --git a/src/main/java/usecases/eventrespond/RespondOutputData.java b/src/main/java/usecases/eventrespond/RespondOutputData.java deleted file mode 100644 index 732b685ea..000000000 --- a/src/main/java/usecases/eventrespond/RespondOutputData.java +++ /dev/null @@ -1,50 +0,0 @@ -package usecases.eventrespond; - -/** - * Output data for the player's respond. - */ -public class RespondOutputData { - private final String message; - private final int peoplechange; - private final int foodchange; - private final int waterchange; - private final int weaponchange; - private final String inventorymessage; - - public RespondOutputData(String message, - int foodchange, int waterchange, int weaponchange, int peoplechange, - String inventorymessage) { - this.message = message; - this.peoplechange = peoplechange; - this.foodchange = foodchange; - this.waterchange = waterchange; - this.weaponchange = weaponchange; - this.inventorymessage = inventorymessage; - - } - - public String getMessage() { - return message; - } - - public int getPeoplechange() { - return peoplechange; - } - - public int getFoodchange() { - return foodchange; - } - - public int getWaterchange() { - return waterchange; - } - - public int getWeaponchange() { - return weaponchange; - } - - public String getInventorymessage() { - return inventorymessage; - } - -} diff --git a/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java b/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java index 58c09710b..c25e84380 100644 --- a/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.eventrespond; +package usecases.eventrespond.shared; import entities.Event; import entities.Inventory; diff --git a/src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java b/src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java index 880f6b160..eecf95a41 100644 --- a/src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java +++ b/src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.eventrespond; +package usecases.eventrespond.shared; /** * Input boundary of respond use case. diff --git a/src/main/java/usecases/eventrespond/shared/RespondInputData.java b/src/main/java/usecases/eventrespond/shared/RespondInputData.java index cc0629f08..ab057369c 100644 --- a/src/main/java/usecases/eventrespond/shared/RespondInputData.java +++ b/src/main/java/usecases/eventrespond/shared/RespondInputData.java @@ -1,4 +1,4 @@ -package usecases.eventrespond; +package usecases.eventrespond.shared; /** * Input data form the view/player side like the choice they choose in term os 12345... diff --git a/src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java b/src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java index dc57afbfc..2a35473fa 100644 --- a/src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java +++ b/src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.eventrespond; +package usecases.eventrespond.shared; /** * Output boundary, responsible for passing output data to the controller. diff --git a/src/main/java/usecases/eventrespond/shared/RespondOutputData.java b/src/main/java/usecases/eventrespond/shared/RespondOutputData.java index 732b685ea..873fbf0da 100644 --- a/src/main/java/usecases/eventrespond/shared/RespondOutputData.java +++ b/src/main/java/usecases/eventrespond/shared/RespondOutputData.java @@ -1,4 +1,4 @@ -package usecases.eventrespond; +package usecases.eventrespond.shared; /** * Output data for the player's respond. From dfe8c83bf9dd5d03e467e187b45185d3f2ab686d Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sat, 30 Nov 2024 15:28:47 -0500 Subject: [PATCH 064/154] Import Fixed in Events --- .../usecases/eventrespond/ambush/AmbushEventInteractor.java | 2 +- .../usecases/eventrespond/blizzard/BlizzardEventInteractor.java | 2 +- .../usecases/eventrespond/trader/TraderEventInteractor.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java index f02e632b9..80456c03c 100644 --- a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java +++ b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java @@ -2,7 +2,7 @@ import entities.EntityConstants; import entities.EventAmbush; -import usecases.eventrespond.*; +import usecases.eventrespond.shared.*; /** * Interactor for handling player responses to an Ambush event. diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java index 834c0a61d..dae7874a3 100644 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java @@ -2,7 +2,7 @@ import entities.EntityConstants; import entities.EventBlizzard; -import usecases.eventrespond.*; +import usecases.eventrespond.shared.*; /** * Interactor for handling player responses to a Blizzard event. diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java index 935ca92af..ca2fff0df 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -2,7 +2,7 @@ import entities.EntityConstants; import entities.EventTraderEncounter; -import usecases.eventrespond.*; +import usecases.eventrespond.shared.*; /** * Interactor for handling player responses to a Trader Encounter event. From 8e80a48e4f13bd259811f53de44ba4b9494ed738 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sat, 30 Nov 2024 15:43:58 -0500 Subject: [PATCH 065/154] Implement Flood and Survivor Events --- src/main/java/entities/EntityConstants.java | 20 ++++-- .../controllers/EventResponseController.java | 6 +- .../flood/FloodEventInteractor.java | 60 +++++++++++++++++ .../survivor/SurvivorEventInteractor.java | 64 +++++++++++++++++++ 4 files changed, 141 insertions(+), 9 deletions(-) create mode 100644 src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java create mode 100644 src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java diff --git a/src/main/java/entities/EntityConstants.java b/src/main/java/entities/EntityConstants.java index 1db1c1a02..f4db74494 100644 --- a/src/main/java/entities/EntityConstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -105,10 +105,14 @@ public class EntityConstants { // for any general escape choice, the distance move randomly at max. public static final int LENGTHMESSAGECOMMA = 17; - // Flood constants. - public static final int FLOODRESOURCELOSS = -10; - public static final int FLOODSECURELOSS = -5; - public static final int FLOODDOINGNOTHINGLOSS = -20; + // Flood event constants + public static final int FLOODRESOURCELOSSFOOD = -10; + public static final int FLOODRESOURCELOSSSECURE = -15; + public static final int FLOODRESOURCELOSSHIGH = -20; + + public static final int FLOODPEOPLELOSSLOW = -1; + public static final int FLOODPEOPLELOSSMODERATE = -3; + public static final int FLOODPEOPLELOSSHIGH = -5; // Blizzard constants. public static final int BLIZZARDRESOURCELOSSFOOD = -15; @@ -133,5 +137,13 @@ public class EntityConstants { public static final int TRADERIGNORELOSS = 0; public static final int MAXNUMDAY = 60; + // Survivor constants + public static final int SURVIVORACCEPTPEOPLEGAIN = 5; + public static final int SURVIVORROBBERYPOWER = 20; + public static final int SURVIVORROBBERYGAINFOOD = 10; + public static final int SURVIVORROBBERYGAINSUPPLIES = 5; + public static final int SURVIVORROBBERYFAILLOSSFOOD = -10; + public static final int SURVIVORROBBERYFAILLOSSPEOPLE = -2; + public static final String NEWLINE = "\n"; } diff --git a/src/main/java/interface_adapters/controllers/EventResponseController.java b/src/main/java/interface_adapters/controllers/EventResponseController.java index 4d24043da..cc6b05dfa 100644 --- a/src/main/java/interface_adapters/controllers/EventResponseController.java +++ b/src/main/java/interface_adapters/controllers/EventResponseController.java @@ -4,14 +4,10 @@ import entities.EventAmbush; import entities.EventTraderEncounter; import entities.EventBlizzard; -import usecases.eventrespond.RespondInputBoundary; -import usecases.eventrespond.RespondInputData; import usecases.eventrespond.ambush.AmbushEventInteractor; import usecases.eventrespond.trader.TraderEventInteractor; import usecases.eventrespond.blizzard.BlizzardEventInteractor; -import usecases.eventrespond.RespondDataAccessInterface; -import usecases.eventrespond.RespondOutputBoundary; - +import usecases.eventrespond.shared.*; /** * Controller for handling event responses and delegating to the correct interactor. */ diff --git a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java new file mode 100644 index 000000000..4d92e68c1 --- /dev/null +++ b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java @@ -0,0 +1,60 @@ +package usecases.eventrespond.flood; + +import entities.EntityConstants; +import entities.EventFlood; +import usecases.eventrespond.shared.*; + +/** + * Interactor for handling player responses to a Flood event. + * Implements the RespondInputBoundary interface. + */ +public class FloodEventInteractor implements RespondInputBoundary { + private final RespondDataAccessInterface dataAccess; + private final RespondOutputBoundary outputBoundary; + + public FloodEventInteractor(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(RespondInputData inputData) { + EventFlood floodEvent = (EventFlood) dataAccess.getevent(); + int choice = inputData.getChoice(); + + int foodChange = 0, waterChange = 0, peopleChange = 0; + String message; + + switch (choice) { + case EntityConstants.FIRSTCHOICE: // Evacuate to higher ground + foodChange = EntityConstants.FLOODRESOURCELOSSFOOD; + peopleChange = EntityConstants.FLOODPEOPLELOSSLOW; + message = floodEvent.getEvacuateOutcome(); + break; + case EntityConstants.SECONDCHOICE: // Secure supplies and hold position + foodChange = EntityConstants.FLOODRESOURCELOSSSECURE; + peopleChange = EntityConstants.FLOODPEOPLELOSSMODERATE; + message = floodEvent.getSecureSuppliesOutcome(); + break; + case EntityConstants.THIRDCHOICE: // Do nothing + foodChange = EntityConstants.FLOODRESOURCELOSSHIGH; + peopleChange = EntityConstants.FLOODPEOPLELOSSHIGH; + message = floodEvent.getDoNothingOutcome(); + break; + default: // Invalid choice + outputBoundary.prepareFailureView("Invalid choice provided."); + return; + } + + // Apply changes to inventory + dataAccess.changefood(foodChange); + dataAccess.changewater(waterChange); + dataAccess.changepeople(peopleChange); + + // Prepare output + String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + + ", People " + peopleChange + "."; + RespondOutputData outputData = new RespondOutputData(message, foodChange, waterChange, 0, peopleChange, inventoryMessage); + outputBoundary.prepareSuccessView(outputData); + } +} diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java new file mode 100644 index 000000000..f5e6ba0ea --- /dev/null +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java @@ -0,0 +1,64 @@ +package usecases.eventrespond.survivor; + +import entities.EntityConstants; +import entities.EventSurvivorJoins; +import usecases.eventrespond.shared.*; + +/** + * Interactor for handling player responses to a Survivor Encounter event. + * Implements the RespondInputBoundary interface. + */ +public class SurvivorEventInteractor implements RespondInputBoundary { + private final RespondDataAccessInterface dataAccess; + private final RespondOutputBoundary outputBoundary; + + public SurvivorEventInteractor(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(RespondInputData inputData) { + EventSurvivorJoins survivorEvent = (EventSurvivorJoins) dataAccess.getevent(); + int choice = inputData.getChoice(); + + int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; + String message; + + switch (choice) { + case EntityConstants.FIRSTCHOICE: // Accept survivors + peopleChange = EntityConstants.SURVIVORACCEPTPEOPLEGAIN; + message = survivorEvent.getAcceptoutcome(); + break; + case EntityConstants.SECONDCHOICE: // Reject survivors + message = survivorEvent.getRejectoutcome(); + break; + case EntityConstants.THIRDCHOICE: // Attempt to rob survivors + if (dataAccess.getInventory().getfirepower() >= EntityConstants.SURVIVORROBBERYPOWER) { + foodChange = EntityConstants.SURVIVORROBBERYGAINFOOD; + suppliesChange = EntityConstants.SURVIVORROBBERYGAINSUPPLIES; + message = survivorEvent.getRoboutcomesuccess(); + } else { + foodChange = EntityConstants.SURVIVORROBBERYFAILLOSSFOOD; + peopleChange = EntityConstants.SURVIVORROBBERYFAILLOSSPEOPLE; + message = survivorEvent.getRoboutcomefail(); + } + break; + default: // Invalid choice + outputBoundary.prepareFailureView("Invalid choice provided."); + return; + } + + // Apply changes to inventory + dataAccess.changefood(foodChange); + dataAccess.changewater(waterChange); + dataAccess.changeweapon(suppliesChange); + dataAccess.changepeople(peopleChange); + + // Prepare output + String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + + ", Supplies " + suppliesChange + ", People " + peopleChange + "."; + RespondOutputData outputData = new RespondOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); + outputBoundary.prepareSuccessView(outputData); + } +} From ed7d6be8826ddd2be769fac4e1e2ea2b9f70ad7d Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sat, 30 Nov 2024 15:47:37 -0500 Subject: [PATCH 066/154] Update EventResponseController to include Five Events --- .../controllers/EventResponseController.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/interface_adapters/controllers/EventResponseController.java b/src/main/java/interface_adapters/controllers/EventResponseController.java index cc6b05dfa..4fa9cf0a2 100644 --- a/src/main/java/interface_adapters/controllers/EventResponseController.java +++ b/src/main/java/interface_adapters/controllers/EventResponseController.java @@ -4,9 +4,13 @@ import entities.EventAmbush; import entities.EventTraderEncounter; import entities.EventBlizzard; +import entities.EventSurvivorJoins; +import entities.EventFlood; import usecases.eventrespond.ambush.AmbushEventInteractor; -import usecases.eventrespond.trader.TraderEventInteractor; import usecases.eventrespond.blizzard.BlizzardEventInteractor; +import usecases.eventrespond.flood.FloodEventInteractor; +import usecases.eventrespond.survivor.SurvivorEventInteractor; +import usecases.eventrespond.trader.TraderEventInteractor; import usecases.eventrespond.shared.*; /** * Controller for handling event responses and delegating to the correct interactor. @@ -34,6 +38,10 @@ public void handleResponse(RespondInputData inputData) { interactor = new TraderEventInteractor(dataAccess, outputBoundary); } else if (event instanceof EventBlizzard) { interactor = new BlizzardEventInteractor(dataAccess, outputBoundary); + } else if (event instanceof EventFlood) { + interactor = new FloodEventInteractor(dataAccess, outputBoundary); + } else if (event instanceof EventSurvivorJoins) { + interactor = new SurvivorEventInteractor(dataAccess, outputBoundary); } else { outputBoundary.prepareFailureView("Unknown event type."); return; From b12217a6314f3c5ec0012b4a199bb0ea785e8548 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sat, 30 Nov 2024 15:53:27 -0500 Subject: [PATCH 067/154] Rewrite EventRespondController as Three Individual Files --- .../controllers/EventResponseController.java | 52 ------------------- .../eventrespond/EventResponseController.java | 24 +++++++++ .../eventrespond/EventResponseInterface.java | 19 +++++++ .../eventrespond/EventResponsePresenter.java | 26 ++++++++++ 4 files changed, 69 insertions(+), 52 deletions(-) delete mode 100644 src/main/java/interface_adapters/controllers/EventResponseController.java create mode 100644 src/main/java/interface_adapters/eventrespond/EventResponseController.java create mode 100644 src/main/java/interface_adapters/eventrespond/EventResponseInterface.java create mode 100644 src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java diff --git a/src/main/java/interface_adapters/controllers/EventResponseController.java b/src/main/java/interface_adapters/controllers/EventResponseController.java deleted file mode 100644 index 4fa9cf0a2..000000000 --- a/src/main/java/interface_adapters/controllers/EventResponseController.java +++ /dev/null @@ -1,52 +0,0 @@ -package interface_adapters.controllers; - -import entities.Event; -import entities.EventAmbush; -import entities.EventTraderEncounter; -import entities.EventBlizzard; -import entities.EventSurvivorJoins; -import entities.EventFlood; -import usecases.eventrespond.ambush.AmbushEventInteractor; -import usecases.eventrespond.blizzard.BlizzardEventInteractor; -import usecases.eventrespond.flood.FloodEventInteractor; -import usecases.eventrespond.survivor.SurvivorEventInteractor; -import usecases.eventrespond.trader.TraderEventInteractor; -import usecases.eventrespond.shared.*; -/** - * Controller for handling event responses and delegating to the correct interactor. - */ -public class EventResponseController { - private final RespondDataAccessInterface dataAccess; - private final RespondOutputBoundary outputBoundary; - - public EventResponseController(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { - this.dataAccess = dataAccess; - this.outputBoundary = outputBoundary; - } - - /** - * Handles the response to a given event by selecting the appropriate interactor. - * @param inputData The player's input data (choice). - */ - public void handleResponse(RespondInputData inputData) { - Event event = dataAccess.getevent(); - - RespondInputBoundary interactor; - if (event instanceof EventAmbush) { - interactor = new AmbushEventInteractor(dataAccess, outputBoundary); - } else if (event instanceof EventTraderEncounter) { - interactor = new TraderEventInteractor(dataAccess, outputBoundary); - } else if (event instanceof EventBlizzard) { - interactor = new BlizzardEventInteractor(dataAccess, outputBoundary); - } else if (event instanceof EventFlood) { - interactor = new FloodEventInteractor(dataAccess, outputBoundary); - } else if (event instanceof EventSurvivorJoins) { - interactor = new SurvivorEventInteractor(dataAccess, outputBoundary); - } else { - outputBoundary.prepareFailureView("Unknown event type."); - return; - } - - interactor.execute(inputData); - } -} diff --git a/src/main/java/interface_adapters/eventrespond/EventResponseController.java b/src/main/java/interface_adapters/eventrespond/EventResponseController.java new file mode 100644 index 000000000..0b2a2df49 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/EventResponseController.java @@ -0,0 +1,24 @@ +package interface_adapters.eventrespond; + +import usecases.eventrespond.shared.RespondInputBoundary; +import usecases.eventrespond.shared.RespondInputData; + +/** + * Controller for handling event responses and converting player input into input data for the use case. + */ +public class EventResponseController { + private final RespondInputBoundary interactor; + + public EventResponseController(RespondInputBoundary interactor) { + this.interactor = interactor; + } + + /** + * Execute the interactor by converting player input into input data. + * @param choice The player's choice for the event response. + */ + public void execute(int choice) { + final RespondInputData inputData = new RespondInputData(choice); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java b/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java new file mode 100644 index 000000000..2cda8b289 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java @@ -0,0 +1,19 @@ +package interface_adapters.eventrespond; + +/** + * Interface for communicating with the view in a decoupled manner for event response use case. + */ +public interface EventResponseInterface { + + /** + * Update the UI after a successful response to an event. + * @param message The success message to display. + */ + void updateUiResponse(String message); + + /** + * Display an error message if the event response fails. + * @param errorMessage The error message to display. + */ + void failureResponse(String errorMessage); +} diff --git a/src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java new file mode 100644 index 000000000..e246b362e --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java @@ -0,0 +1,26 @@ +package interface_adapters.eventrespond; + +import usecases.eventrespond.shared.RespondOutputBoundary; +import usecases.eventrespond.shared.RespondOutputData; + +/** + * Presenter for the event response use case. + * Implements the RespondOutputBoundary interface to handle the use case output. + */ +public class EventResponsePresenter implements RespondOutputBoundary { + private final EventResponseInterface view; + + public EventResponsePresenter(EventResponseInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(RespondOutputData outputData) { + view.updateUiResponse(outputData.getMessage()); + } + + @Override + public void prepareFailureView(String errorMessage) { + view.failureResponse(errorMessage); + } +} From 6a324556671df7b3c69d6947c9f83ac45ab0f101 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sat, 30 Nov 2024 16:32:47 -0500 Subject: [PATCH 068/154] Update the in memory data access files for each usecase --- .../database/InMemoryAllowcateDataAccess.java | 51 +++++++++++++ .../InMemoryDecideEventDataAccess.java | 31 ++++++++ .../InMemoryEventInitializeDataAccess.java | 23 ++++++ .../database/InMemoryGatherDataAccess.java | 50 ++++++++++++ .../database/InMemoryHordeDataAccess.java | 52 +++++++++++++ .../database/InMemoryMinimapDataAccess.java | 28 +++++++ .../database/InMemoryNewdayDataAccess.java | 76 +++++++++++++++++++ .../InMemoryPlaceDescriptionDataAccess.java | 20 +++++ .../database/InMemoryRespondDataAccess.java | 75 ++++++++++++++++++ .../database/JsonMoveDataAccess.java | 4 + 10 files changed, 410 insertions(+) create mode 100644 src/main/java/frameworks/database/InMemoryAllowcateDataAccess.java create mode 100644 src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java create mode 100644 src/main/java/frameworks/database/InMemoryEventInitializeDataAccess.java create mode 100644 src/main/java/frameworks/database/InMemoryGatherDataAccess.java create mode 100644 src/main/java/frameworks/database/InMemoryHordeDataAccess.java create mode 100644 src/main/java/frameworks/database/InMemoryMinimapDataAccess.java create mode 100644 src/main/java/frameworks/database/InMemoryNewdayDataAccess.java create mode 100644 src/main/java/frameworks/database/InMemoryPlaceDescriptionDataAccess.java create mode 100644 src/main/java/frameworks/database/InMemoryRespondDataAccess.java create mode 100644 src/main/java/frameworks/database/JsonMoveDataAccess.java diff --git a/src/main/java/frameworks/database/InMemoryAllowcateDataAccess.java b/src/main/java/frameworks/database/InMemoryAllowcateDataAccess.java new file mode 100644 index 000000000..a1e805acc --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryAllowcateDataAccess.java @@ -0,0 +1,51 @@ +package frameworks.database; + +import entities.PlayerAttributes; +import usecases.startallowcate.AllowcateDataAccessInterface; + +/** + * In-Memory implementation of AllowcateDataAccessInterface. + */ +public class InMemoryAllowcateDataAccess implements AllowcateDataAccessInterface { + private final PlayerAttributes playerAttributes; + + public InMemoryAllowcateDataAccess(PlayerAttributes playerAttributes) { + this.playerAttributes = playerAttributes; + } + + @Override + public PlayerAttributes getPlayerAttributes() { + return playerAttributes; + } + + @Override + public void setSocial(int social) { + playerAttributes.setSocial(social); + } + + @Override + public void setLuck(int luck) { + playerAttributes.setLuck(luck); + } + + @Override + public void setThrift(int thrift) { + playerAttributes.setThrift(thrift); + } + + @Override + public void setMobilization(int mobilization) { + playerAttributes.setMobilization(mobilization); + } + + @Override + public void setGeneralship(int generalship) { + playerAttributes.setGeneralship(generalship); + } + + @Override + public void setPoint(int point) { + playerAttributes.setPoints(point); + } +} + diff --git a/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java b/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java new file mode 100644 index 000000000..81beab291 --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java @@ -0,0 +1,31 @@ +package frameworks.database; + +import java.util.ArrayList; + +import entities.Event; +import entities.Location; +import usecases.eventdecide.DecideEventDataAccessInterface; + +/** + * In-Memory implementation of DecideEventDataAccessInterface. + */ +public class InMemoryDecideEventDataAccess implements DecideEventDataAccessInterface { + private final ArrayList events; + private final Location currentLocation; + + public InMemoryDecideEventDataAccess(ArrayList events, Location currentLocation) { + this.events = events; + this.currentLocation = currentLocation; + } + + @Override + public ArrayList getEvents() { + // Return a copy to ensure immutability + return new ArrayList<>(events); + } + + @Override + public Location getLocation() { + return currentLocation; + } +} diff --git a/src/main/java/frameworks/database/InMemoryEventInitializeDataAccess.java b/src/main/java/frameworks/database/InMemoryEventInitializeDataAccess.java new file mode 100644 index 000000000..2da428afe --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryEventInitializeDataAccess.java @@ -0,0 +1,23 @@ +package frameworks.database; + +import entities.Event; +import usecases.eventinitialize.EventInitializeDataAccessInterface; + +/** + * In-Memory implementation of EventInitializeDataAccessInterface. + */ +public class InMemoryEventInitializeDataAccess implements EventInitializeDataAccessInterface { + private final Event currentEvent; + + public InMemoryEventInitializeDataAccess(Event currentEvent) { + this.currentEvent = currentEvent; + } + + @Override + public Event getEvent() { + if (currentEvent == null) { + throw new IllegalStateException("No event is currently being processed."); + } + return currentEvent; + } +} diff --git a/src/main/java/frameworks/database/InMemoryGatherDataAccess.java b/src/main/java/frameworks/database/InMemoryGatherDataAccess.java new file mode 100644 index 000000000..61a1ccfba --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryGatherDataAccess.java @@ -0,0 +1,50 @@ +package frameworks.database; + +import entities.Inventory; +import entities.Location; +import usecases.dailygather.GatherDataAccessInterface; + +/** + * In-memory implementation of GatherDataAccessInterface. + */ +public class InMemoryGatherDataAccess implements GatherDataAccessInterface { + // Player's inventory + private final Inventory inventory; + // Player's current location + private Location location; + + public InMemoryGatherDataAccess(Inventory inventory, Location location) { + this.inventory = inventory; + this.location = location; + } + + @Override + public Inventory getInventory() { + return inventory; + } + + @Override + public Location getLocation() { + return location; + } + + @Override + public void decreaseResourceavailable() { + location.decreaseresourceavailable(); + } + + @Override + public void changefood(int foodgathered) { + inventory.changeFood(foodgathered); + } + + @Override + public void changewater(int watergathered) { + inventory.changeWater(watergathered); + } + + @Override + public void changeweapon(int weapongathered) { + inventory.changeweapon(weapongathered); + } +} diff --git a/src/main/java/frameworks/database/InMemoryHordeDataAccess.java b/src/main/java/frameworks/database/InMemoryHordeDataAccess.java new file mode 100644 index 000000000..f8240046d --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryHordeDataAccess.java @@ -0,0 +1,52 @@ +package frameworks.database; + +import entities.Horde; +import entities.Inventory; +import entities.PlayerAttributes; +import entities.PlayerInfo; +import usecases.endprocesshorde.HordeDataAccessInterface; + +/** + * In-Memory implementation of HordeDataAccessInterface. + */ +public class InMemoryHordeDataAccess implements HordeDataAccessInterface { + private final Inventory inventory; + private final Horde horde; + private final PlayerAttributes playerAttributes; + private final PlayerInfo playerInfo; + private boolean won; + + public InMemoryHordeDataAccess(Inventory inventory, Horde horde, + PlayerAttributes playerAttributes, PlayerInfo playerInfo) { + this.inventory = inventory; + this.horde = horde; + this.playerAttributes = playerAttributes; + this.playerInfo = playerInfo; + this.won = false; + } + + @Override + public Inventory getInventory() { + return inventory; + } + + @Override + public Horde getHorde() { + return horde; + } + + @Override + public PlayerAttributes getPlayerAttributes() { + return playerAttributes; + } + + @Override + public void setWon(boolean won) { + this.won = won; + } + + @Override + public PlayerInfo getPlayerInfo() { + return playerInfo; + } +} diff --git a/src/main/java/frameworks/database/InMemoryMinimapDataAccess.java b/src/main/java/frameworks/database/InMemoryMinimapDataAccess.java new file mode 100644 index 000000000..7aee72a8c --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryMinimapDataAccess.java @@ -0,0 +1,28 @@ +package frameworks.database; + +import entities.Maps; +import entities.PlayerLocation; +import usecases.gameminimap.MinimapDataAccessInterface; + +/** + * In-Memory implementation of MinimapDataAccessInterface. + */ +public class InMemoryMinimapDataAccess implements MinimapDataAccessInterface { + private final PlayerLocation playerLocation; + private final Maps gameMap; + + public InMemoryMinimapDataAccess(PlayerLocation playerLocation, Maps gameMap) { + this.playerLocation = playerLocation; + this.gameMap = gameMap; + } + + @Override + public PlayerLocation getPlayerLocation() { + return playerLocation; + } + + @Override + public Maps getMaps() { + return gameMap; + } +} diff --git a/src/main/java/frameworks/database/InMemoryNewdayDataAccess.java b/src/main/java/frameworks/database/InMemoryNewdayDataAccess.java new file mode 100644 index 000000000..ca1a34bae --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryNewdayDataAccess.java @@ -0,0 +1,76 @@ +package frameworks.database; + +import entities.*; +import usecases.gamenewday.NewdayDataAccessInterface; + +public class InMemoryNewdayDataAccess implements NewdayDataAccessInterface { + private final PlayerInfo playerInfo; + private final Inventory inventory; + private final Location location; + private final PlayerAttributes playerAttributes; + private final Horde horde; + + public InMemoryNewdayDataAccess(PlayerInfo playerInfo, Inventory inventory, Location location, + PlayerAttributes playerAttributes, Horde horde) { + this.playerInfo = playerInfo; + this.inventory = inventory; + this.location = location; + this.playerAttributes = playerAttributes; + this.horde = horde; + } + + @Override + public PlayerInfo getPlayerinfo() { + return playerInfo; + } + + @Override + public Location getLocation() { + return location; + } + + @Override + public Inventory getInventory() { + return inventory; + } + + @Override + public void setDaysSurvived(int days) { + playerInfo.setDaysSurvived(days); + } + + @Override + public void setScore(int score) { + playerInfo.setScore(score); + } + + @Override + public void changeFood(int food) { + inventory.changeFood(food); + } + + @Override + public void changeWater(int water) { + inventory.changeWater(water); + } + + @Override + public void changePeople(int people) { + inventory.changePeople(people); + } + + @Override + public void changeWeapon(int weapon) { + inventory.changeweapon(weapon); + } + + @Override + public PlayerAttributes getPlayerAttributes() { + return playerAttributes; + } + + @Override + public Horde getHorde() { + return horde; + } +} diff --git a/src/main/java/frameworks/database/InMemoryPlaceDescriptionDataAccess.java b/src/main/java/frameworks/database/InMemoryPlaceDescriptionDataAccess.java new file mode 100644 index 000000000..9069267da --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryPlaceDescriptionDataAccess.java @@ -0,0 +1,20 @@ +package frameworks.database; + +import entities.Location; +import usecases.gameplacedescription.PlaceDescriptionDataAccessInterface; + +/** + * In-Memory implementation of PlaceDescriptionDataAccessInterface. + */ +public class InMemoryPlaceDescriptionDataAccess implements PlaceDescriptionDataAccessInterface { + private final Location currentLocation; + + public InMemoryPlaceDescriptionDataAccess(Location currentLocation) { + this.currentLocation = currentLocation; + } + + @Override + public Location getLocation() { + return currentLocation; + } +} diff --git a/src/main/java/frameworks/database/InMemoryRespondDataAccess.java b/src/main/java/frameworks/database/InMemoryRespondDataAccess.java new file mode 100644 index 000000000..0104b05d7 --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryRespondDataAccess.java @@ -0,0 +1,75 @@ +package frameworks.database; + +import entities.Event; +import entities.Inventory; +import entities.PlayerAttributes; +import entities.PlayerLocation; +import usecases.eventrespond.shared.RespondDataAccessInterface; + +/** + * In-Memory implementation of RespondDataAccessInterface. + */ +public class InMemoryRespondDataAccess implements RespondDataAccessInterface { + private Event event; + private final Inventory inventory; + private final PlayerAttributes playerAttributes; + private final PlayerLocation playerLocation; + + public InMemoryRespondDataAccess(Event event, Inventory inventory, + PlayerAttributes playerAttributes, PlayerLocation playerLocation) { + this.event = event; + this.inventory = inventory; + this.playerAttributes = playerAttributes; + this.playerLocation = playerLocation; + } + + @Override + public Event getevent() { + return event; + } + + @Override + public PlayerAttributes getPlayerAttributes() { + return playerAttributes; + } + + @Override + public Inventory getInventory() { + return inventory; + } + + @Override + public PlayerLocation getPlayerLocation() { + return playerLocation; + } + + @Override + public void changepeople(int peoplechange) { + inventory.changePeople(peoplechange); + } + + @Override + public void changefood(int foodchange) { + inventory.changeFood(foodchange); + } + + @Override + public void changewater(int waterchange) { + inventory.changeWater(waterchange); + } + + @Override + public void changeweapon(int weaponchange) { + inventory.changeweapon(weaponchange); + } + + @Override + public void setplayerxcoor(int newx) { + playerLocation.setXcoordinate(newx); + } + + @Override + public void setplayerycoor(int newy) { + playerLocation.setYcoordinate(newy); + } +} diff --git a/src/main/java/frameworks/database/JsonMoveDataAccess.java b/src/main/java/frameworks/database/JsonMoveDataAccess.java new file mode 100644 index 000000000..8728b831e --- /dev/null +++ b/src/main/java/frameworks/database/JsonMoveDataAccess.java @@ -0,0 +1,4 @@ +package frameworks.database; + +public class JsonMoveDataAccess { +} From d9ab9a16e95eeb18be3603cdb75ed517167b68ba Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sat, 30 Nov 2024 14:53:28 -0700 Subject: [PATCH 069/154] Fetch usecase completed --- .../controllers/BroadcastController.java | 2 +- ...esentor.java => DailyGatherPresenter.java} | 6 ++-- ...Presentor.java => DailyMovePresenter.java} | 4 +-- .../fetchresource/FetchController.java | 23 +++++++++++++ .../fetchresource/FetchInterface.java | 16 +++++++++ .../fetchresource/FetchPresenter.java | 21 ++++++++++++ ...apPresentor.java => MinimapPresenter.java} | 4 +-- .../gamenewday/NewdayController.java | 23 +++++++++++++ .../gamenewday/NewdayInterface.java | 24 +++++++++++++ .../gamenewday/NewdayPresenter.java | 25 ++++++++++++++ .../FetchDataAccessInterface.java | 15 ++++++++ .../fetchresource/FetchInputBoundary.java | 13 +++++++ .../fetchresource/FetchInputData.java | 7 ++++ .../fetchresource/FetchInteractor.java | 23 +++++++++++++ .../fetchresource/FetchOutputBoundary.java | 13 +++++++ .../fetchresource/FetchOutputData.java | 34 +++++++++++++++++++ .../usecases/gamenewday/NewdayInteractor.java | 10 ++++-- .../usecases/gamenewday/NewdayOutputData.java | 27 ++++++++++++++- 18 files changed, 278 insertions(+), 12 deletions(-) rename src/main/java/interface_adapters/dailygather/{DailyGatherPresentor.java => DailyGatherPresenter.java} (75%) rename src/main/java/interface_adapters/dailymove/{DailyMovePresentor.java => DailyMovePresenter.java} (80%) create mode 100644 src/main/java/interface_adapters/fetchresource/FetchController.java create mode 100644 src/main/java/interface_adapters/fetchresource/FetchInterface.java create mode 100644 src/main/java/interface_adapters/fetchresource/FetchPresenter.java rename src/main/java/interface_adapters/gameminimap/{MinimapPresentor.java => MinimapPresenter.java} (80%) create mode 100644 src/main/java/interface_adapters/gamenewday/NewdayController.java create mode 100644 src/main/java/interface_adapters/gamenewday/NewdayInterface.java create mode 100644 src/main/java/interface_adapters/gamenewday/NewdayPresenter.java create mode 100644 src/main/java/usecases/fetchresource/FetchDataAccessInterface.java create mode 100644 src/main/java/usecases/fetchresource/FetchInputBoundary.java create mode 100644 src/main/java/usecases/fetchresource/FetchInputData.java create mode 100644 src/main/java/usecases/fetchresource/FetchInteractor.java create mode 100644 src/main/java/usecases/fetchresource/FetchOutputBoundary.java create mode 100644 src/main/java/usecases/fetchresource/FetchOutputData.java diff --git a/src/main/java/interface_adapters/controllers/BroadcastController.java b/src/main/java/interface_adapters/controllers/BroadcastController.java index a0029f07d..e62a2957c 100644 --- a/src/main/java/interface_adapters/controllers/BroadcastController.java +++ b/src/main/java/interface_adapters/controllers/BroadcastController.java @@ -25,7 +25,7 @@ public BroadcastController(BroadcastInputBoundary inputBoundary) { * @param broadcastType The type of broadcast action (e.g., "SOS", "Resources"). */ public void handleBroadcast(String broadcastType) { - BroadcastInputData inputData = new BroadcastInputData(broadcastType); + final BroadcastInputData inputData = new BroadcastInputData(broadcastType); inputBoundary.execute(inputData); } } diff --git a/src/main/java/interface_adapters/dailygather/DailyGatherPresentor.java b/src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java similarity index 75% rename from src/main/java/interface_adapters/dailygather/DailyGatherPresentor.java rename to src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java index 49896552c..90c368a8c 100644 --- a/src/main/java/interface_adapters/dailygather/DailyGatherPresentor.java +++ b/src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java @@ -6,17 +6,17 @@ /** * Daily gather usecase presentor. */ -public class DailyGatherPresentor implements GatherOutputBoundary { +public class DailyGatherPresenter implements GatherOutputBoundary { private DailyGatherInterface view; @Override public void prepareSuccessView(GatherOutputData outputdata) { - view.updateUi(outputdata.getSuccessmessage(), + view.updateUiGather(outputdata.getSuccessmessage(), outputdata.getUpdatedfood(), outputdata.getUpdatedwater(), outputdata.getUpdatedweapon()); } @Override public void prepareFailureView(String errorMessage) { - view.failure(errorMessage); + view.failureGather(errorMessage); } } diff --git a/src/main/java/interface_adapters/dailymove/DailyMovePresentor.java b/src/main/java/interface_adapters/dailymove/DailyMovePresenter.java similarity index 80% rename from src/main/java/interface_adapters/dailymove/DailyMovePresentor.java rename to src/main/java/interface_adapters/dailymove/DailyMovePresenter.java index 83e88f14a..f1756e74a 100644 --- a/src/main/java/interface_adapters/dailymove/DailyMovePresentor.java +++ b/src/main/java/interface_adapters/dailymove/DailyMovePresenter.java @@ -6,10 +6,10 @@ /** * Presentor of move. */ -public class DailyMovePresentor implements MoveOutputBoundary { +public class DailyMovePresenter implements MoveOutputBoundary { private DailyMoveInterface view; - public DailyMovePresentor(DailyMoveInterface view) { + public DailyMovePresenter(DailyMoveInterface view) { this.view = view; } diff --git a/src/main/java/interface_adapters/fetchresource/FetchController.java b/src/main/java/interface_adapters/fetchresource/FetchController.java new file mode 100644 index 000000000..6a8212ea0 --- /dev/null +++ b/src/main/java/interface_adapters/fetchresource/FetchController.java @@ -0,0 +1,23 @@ +package interface_adapters.fetchresource; + +import usecases.fetchresource.FetchInputBoundary; +import usecases.fetchresource.FetchInputData; + +/** + * Fetch controller. + */ +public class FetchController { + private FetchInputBoundary fetchInteractor; + + public FetchController(FetchInputBoundary fetchInteractor) { + this.fetchInteractor = fetchInteractor; + } + + /** + * Execute interactor. + */ + public void execute() { + final FetchInputData fetchInputData = new FetchInputData(); + fetchInteractor.execute(fetchInputData); + } +} diff --git a/src/main/java/interface_adapters/fetchresource/FetchInterface.java b/src/main/java/interface_adapters/fetchresource/FetchInterface.java new file mode 100644 index 000000000..449bfa169 --- /dev/null +++ b/src/main/java/interface_adapters/fetchresource/FetchInterface.java @@ -0,0 +1,16 @@ +package interface_adapters.fetchresource; + +/** + * Fetch interface. + */ +public interface FetchInterface { + + /** + * Update the resouce appearing on the UI. + * @param food food + * @param water water + * @param people people + * @param weapon weapon + */ + void updateUiResource(int food, int water, int people, int weapon); +} diff --git a/src/main/java/interface_adapters/fetchresource/FetchPresenter.java b/src/main/java/interface_adapters/fetchresource/FetchPresenter.java new file mode 100644 index 000000000..b842838ff --- /dev/null +++ b/src/main/java/interface_adapters/fetchresource/FetchPresenter.java @@ -0,0 +1,21 @@ +package interface_adapters.fetchresource; + +import usecases.fetchresource.FetchOutputBoundary; +import usecases.fetchresource.FetchOutputData; + +/** + * Fetch presenter. + */ +public class FetchPresenter implements FetchOutputBoundary { + private FetchInterface view; + + public FetchPresenter(FetchInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessview(FetchOutputData outputdata) { + view.updateUiResource(outputdata.getFood(), outputdata.getWater(), + outputdata.getPeople(), outputdata.getWeapon()); + } +} diff --git a/src/main/java/interface_adapters/gameminimap/MinimapPresentor.java b/src/main/java/interface_adapters/gameminimap/MinimapPresenter.java similarity index 80% rename from src/main/java/interface_adapters/gameminimap/MinimapPresentor.java rename to src/main/java/interface_adapters/gameminimap/MinimapPresenter.java index 44091dc50..d7ac817c3 100644 --- a/src/main/java/interface_adapters/gameminimap/MinimapPresentor.java +++ b/src/main/java/interface_adapters/gameminimap/MinimapPresenter.java @@ -8,10 +8,10 @@ /** * Minimap presentor. */ -public class MinimapPresentor implements MinimapOutputBoundary { +public class MinimapPresenter implements MinimapOutputBoundary { private MinimapInterface view; - public MinimapPresentor(MinimapInterface view) { + public MinimapPresenter(MinimapInterface view) { this.view = view; } diff --git a/src/main/java/interface_adapters/gamenewday/NewdayController.java b/src/main/java/interface_adapters/gamenewday/NewdayController.java new file mode 100644 index 000000000..ba0e27544 --- /dev/null +++ b/src/main/java/interface_adapters/gamenewday/NewdayController.java @@ -0,0 +1,23 @@ +package interface_adapters.gamenewday; + +import usecases.gamenewday.NewdayInputBoundary; +import usecases.gamenewday.NewdayInputData; + +/** + * New day usecase controller. + */ +public class NewdayController { + private NewdayInputBoundary newdayInteractor; + + public NewdayController(NewdayInputBoundary newdayInteractor) { + this.newdayInteractor = newdayInteractor; + } + + /** + * Execute the newday usecase. after player successfully pressed the button. + */ + public void execute() { + final NewdayInputData inputData = new NewdayInputData(); + newdayInteractor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/gamenewday/NewdayInterface.java b/src/main/java/interface_adapters/gamenewday/NewdayInterface.java new file mode 100644 index 000000000..33b56a4b5 --- /dev/null +++ b/src/main/java/interface_adapters/gamenewday/NewdayInterface.java @@ -0,0 +1,24 @@ +package interface_adapters.gamenewday; + +/** + * Interface, act as communication between new day adaptior and view. + */ +public interface NewdayInterface { + + /** + * Update the view by providing message to the textbox, update the 4 resource representation. + * @param message message for what happened in a new day. + * @param food update food change. + * @param water update water change. + * @param people update people change. + * @param weapon update weapon change. + */ + void updateUiNewday(String message, int food, int water, int people, int weapon); + + /** + * If usecase failed, for example is already day 60 and this button was click, show reason why, don't change + * anything else. + * @param message error message. + */ + void failureNewday(String message); +} diff --git a/src/main/java/interface_adapters/gamenewday/NewdayPresenter.java b/src/main/java/interface_adapters/gamenewday/NewdayPresenter.java new file mode 100644 index 000000000..b538a3117 --- /dev/null +++ b/src/main/java/interface_adapters/gamenewday/NewdayPresenter.java @@ -0,0 +1,25 @@ +package interface_adapters.gamenewday; + +import usecases.gamenewday.NewdayOutputBoundary; +import usecases.gamenewday.NewdayOutputData; + +/** + * Newday presentor, + */ +public class NewdayPresenter implements NewdayOutputBoundary { + private NewdayInterface view; + + public NewdayPresenter(NewdayInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(NewdayOutputData outputData) { + + } + + @Override + public void prepareFailureView(String errorMessage) { + + } +} diff --git a/src/main/java/usecases/fetchresource/FetchDataAccessInterface.java b/src/main/java/usecases/fetchresource/FetchDataAccessInterface.java new file mode 100644 index 000000000..0b02eeca8 --- /dev/null +++ b/src/main/java/usecases/fetchresource/FetchDataAccessInterface.java @@ -0,0 +1,15 @@ +package usecases.fetchresource; + +import entities.Inventory; + +/** + * Data access of fetch, get player inventory. + */ +public interface FetchDataAccessInterface { + + /** + * Get player's inventory. + * @return inventory + */ + Inventory getInventory(); +} diff --git a/src/main/java/usecases/fetchresource/FetchInputBoundary.java b/src/main/java/usecases/fetchresource/FetchInputBoundary.java new file mode 100644 index 000000000..c8553514b --- /dev/null +++ b/src/main/java/usecases/fetchresource/FetchInputBoundary.java @@ -0,0 +1,13 @@ +package usecases.fetchresource; + +/** + * Input boundary for fetch. + */ +public interface FetchInputBoundary { + + /** + * Get the input data and execute. + * @param inputData inputdata type from player side, no needed. + */ + void execute(FetchInputData inputData); +} diff --git a/src/main/java/usecases/fetchresource/FetchInputData.java b/src/main/java/usecases/fetchresource/FetchInputData.java new file mode 100644 index 000000000..5135be42f --- /dev/null +++ b/src/main/java/usecases/fetchresource/FetchInputData.java @@ -0,0 +1,7 @@ +package usecases.fetchresource; + +/** + * Auto matic move, nothing needed. + */ +public class FetchInputData { +} diff --git a/src/main/java/usecases/fetchresource/FetchInteractor.java b/src/main/java/usecases/fetchresource/FetchInteractor.java new file mode 100644 index 000000000..dac048e2e --- /dev/null +++ b/src/main/java/usecases/fetchresource/FetchInteractor.java @@ -0,0 +1,23 @@ +package usecases.fetchresource; + +/** + * Data access interactor for fetch, this is used to provide real time and updated resource player had to display. + * Will get called after any usecase that changed player's inventory. + */ +public class FetchInteractor implements FetchInputBoundary { + private FetchDataAccessInterface dataaccess; + private FetchOutputBoundary outputBoundary; + + public FetchInteractor(FetchDataAccessInterface dataaccess, FetchOutputBoundary outputBoundary) { + this.dataaccess = dataaccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(FetchInputData inputData) { + final FetchOutputData outputdata = new FetchOutputData(dataaccess.getInventory().getFood(), + dataaccess.getInventory().getWater(), dataaccess.getInventory().getPeople(), + dataaccess.getInventory().getWeapon()); + outputBoundary.prepareSuccessview(outputdata); + } +} diff --git a/src/main/java/usecases/fetchresource/FetchOutputBoundary.java b/src/main/java/usecases/fetchresource/FetchOutputBoundary.java new file mode 100644 index 000000000..eb21fdd2b --- /dev/null +++ b/src/main/java/usecases/fetchresource/FetchOutputBoundary.java @@ -0,0 +1,13 @@ +package usecases.fetchresource; + +/** + * Output boundary for fetch. + */ +public interface FetchOutputBoundary { + + /** + * Prepare success view given outputdata. + * @param outputdata outputdata, which are like food, water, people, weapon. + */ + void prepareSuccessview(FetchOutputData outputdata); +} diff --git a/src/main/java/usecases/fetchresource/FetchOutputData.java b/src/main/java/usecases/fetchresource/FetchOutputData.java new file mode 100644 index 000000000..28959fcff --- /dev/null +++ b/src/main/java/usecases/fetchresource/FetchOutputData.java @@ -0,0 +1,34 @@ +package usecases.fetchresource; + +/** + * Output datatype for fetch, which fethes all the thing in inventory. + */ +public class FetchOutputData { + private int food; + private int water; + private int people; + private int weapon; + + public FetchOutputData(int food, int water, int people, int weapon) { + this.food = food; + this.water = water; + this.people = people; + this.weapon = weapon; + } + + public int getFood() { + return food; + } + + public int getWater() { + return water; + } + + public int getPeople() { + return people; + } + + public int getWeapon() { + return weapon; + } +} diff --git a/src/main/java/usecases/gamenewday/NewdayInteractor.java b/src/main/java/usecases/gamenewday/NewdayInteractor.java index 2b37b1738..dd28e0439 100644 --- a/src/main/java/usecases/gamenewday/NewdayInteractor.java +++ b/src/main/java/usecases/gamenewday/NewdayInteractor.java @@ -21,6 +21,10 @@ public void execute(NewdayInputData inputdata) { final int people = newdayDataAccessObject.getInventory().getPeople(); final double temp = newdayDataAccessObject.getLocation().gettemperature(); final int score = newdayDataAccessObject.getPlayerinfo().getScore(); + int newfood = newdayDataAccessObject.getInventory().getFood(); + int newwater = newdayDataAccessObject.getInventory().getWater(); + int newpeople = newdayDataAccessObject.getInventory().getPeople(); + int newweapon = newdayDataAccessObject.getInventory().getWeapon(); // Message builder for day summary final StringBuilder messageBuilder = new StringBuilder("Another day has passed. Here's what happened:\n"); boolean success = true; @@ -30,8 +34,8 @@ public void execute(NewdayInputData inputdata) { } // Process resource changes and build the message if (success && newdayDataAccessObject.getPlayerinfo().getDaysSurvived() < EntityConstants.MAXNUMDAY - 1) { - decrementresource(messageBuilder, thrift, people, temp); incrementresouce(messageBuilder, people, score); + decrementresource(messageBuilder, thrift, people, temp); final NewdayOutputData outputdata = new NewdayOutputData(messageBuilder.toString(), success, failmessage); newdayOutputBoundary.prepareSuccessView(outputdata); } @@ -48,7 +52,7 @@ else if (success) { } } - private void incrementresouce(StringBuilder messageBuilder, int people, int score) { + private int[] incrementresouce(StringBuilder messageBuilder, int people, int score) { // food gain final double foodscalar = newdayDataAccessObject.getLocation().getfoodresourceavailable(); final double foodgain = people * EntityConstants.PEOPLEGAINPERFOOD * foodscalar; @@ -81,7 +85,7 @@ private void incrementresouce(StringBuilder messageBuilder, int people, int scor newdayDataAccessObject.setScore(newscore); } - private void decrementresource(StringBuilder messageBuilder, int thrift, int people, double temp) { + private int[] decrementresource(StringBuilder messageBuilder, int thrift, int people, double temp) { // food loss final double basetemp = EntityConstants.DEFAULTTEMP; final double tempdiff = temp - basetemp; diff --git a/src/main/java/usecases/gamenewday/NewdayOutputData.java b/src/main/java/usecases/gamenewday/NewdayOutputData.java index 3792ce4f4..b56aa522c 100644 --- a/src/main/java/usecases/gamenewday/NewdayOutputData.java +++ b/src/main/java/usecases/gamenewday/NewdayOutputData.java @@ -8,11 +8,20 @@ public class NewdayOutputData { private String message; private boolean success; private String failmessage; + private int food; + private int water; + private int people; + private int weapon; - public NewdayOutputData(String message, boolean success, String failmessage) { + public NewdayOutputData(String message, boolean success, String failmessage, + int food, int water, int people, int weapon) { this.message = message; this.success = success; this.failmessage = failmessage; + this.food = food; + this.water = water; + this.people = people; + this.weapon = weapon; } public String getMessage() { @@ -26,4 +35,20 @@ public boolean isSuccess() { public String getFailmessage() { return failmessage; } + + public int getFood() { + return food; + } + + public int getWater() { + return water; + } + + public int getPeople() { + return people; + } + + public int getWeapon() { + return weapon; + } } From fd42d4f9b03892304f87cebcda8ce9bde36fadd6 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sat, 30 Nov 2024 17:06:57 -0500 Subject: [PATCH 070/154] Update the data access for move logiv --- .../database/InMemoryMoveDataAccess.java | 52 +++++++++++++++++++ .../database/JsonMoveDataAccess.java | 4 -- 2 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 src/main/java/frameworks/database/InMemoryMoveDataAccess.java delete mode 100644 src/main/java/frameworks/database/JsonMoveDataAccess.java diff --git a/src/main/java/frameworks/database/InMemoryMoveDataAccess.java b/src/main/java/frameworks/database/InMemoryMoveDataAccess.java new file mode 100644 index 000000000..afd6ba500 --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryMoveDataAccess.java @@ -0,0 +1,52 @@ +package frameworks.database; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; + +import entities.*; +import entities.MapFactory; +import usecases.dailymove.MoveDataAccessInterface; + +/** + * In-Memory implementation of MoveDataAccessInterface. + */ +public class InMemoryMoveDataAccess implements MoveDataAccessInterface { + private PlayerAttributes playerAttributes; + private PlayerLocation playerLocation; + private Maps maps; + + /** + * Constructor to initialize with existing player data (e.g., loaded from a save). + * + * @param playerAttributes Existing player attributes. + * @param playerLocation Existing player location. + * @param maps Existing map data. + */ + public InMemoryMoveDataAccess(PlayerAttributes playerAttributes, PlayerLocation playerLocation, Maps maps) { + this.playerAttributes = playerAttributes; + this.playerLocation = playerLocation; + this.maps = maps; + } + + @Override + public PlayerAttributes getPlayerAttributes() { + return playerAttributes; + } + + @Override + public PlayerLocation getPlayerLocation() { + return playerLocation; + } + + @Override + public Maps getMaps() { + return maps; + } + + @Override + public void updatePlayerLocation(int newx, int newy) { + playerLocation.setXcoordinate(newx); + playerLocation.setYcoordinate(newy); + } +} diff --git a/src/main/java/frameworks/database/JsonMoveDataAccess.java b/src/main/java/frameworks/database/JsonMoveDataAccess.java deleted file mode 100644 index 8728b831e..000000000 --- a/src/main/java/frameworks/database/JsonMoveDataAccess.java +++ /dev/null @@ -1,4 +0,0 @@ -package frameworks.database; - -public class JsonMoveDataAccess { -} From c2900b5a806c1605367a214393fa478c9e6e13c1 Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 30 Nov 2024 17:42:44 -0500 Subject: [PATCH 071/154] add action listeners on buttons and connect each view --- .../interface_adapters/presenters/Login.java | 63 ---------------- .../interface_adapters/presenters/SignUp.java | 11 --- .../java/{frameworks => }/view/Constants.java | 2 +- .../java/{frameworks => }/view/EventView.java | 46 +++++++++--- .../{frameworks => }/view/GameOverView.java | 31 ++++++-- .../java/{frameworks => }/view/GameView.java | 75 ++++++++++++++++--- src/main/java/view/InformationView.java | 66 ++++++++++++++++ .../java/{frameworks => }/view/LoginView.java | 21 +++++- .../java/{frameworks => }/view/MainView.java | 5 +- .../{frameworks => }/view/RankingView.java | 55 +++++++++++--- .../view/RankingViewModel.java | 2 +- .../{frameworks => }/view/SignUpView.java | 56 +++++++++----- 12 files changed, 297 insertions(+), 136 deletions(-) delete mode 100644 src/main/java/interface_adapters/presenters/Login.java delete mode 100644 src/main/java/interface_adapters/presenters/SignUp.java rename src/main/java/{frameworks => }/view/Constants.java (96%) rename src/main/java/{frameworks => }/view/EventView.java (72%) rename src/main/java/{frameworks => }/view/GameOverView.java (79%) rename src/main/java/{frameworks => }/view/GameView.java (55%) create mode 100644 src/main/java/view/InformationView.java rename src/main/java/{frameworks => }/view/LoginView.java (90%) rename src/main/java/{frameworks => }/view/MainView.java (98%) rename src/main/java/{frameworks => }/view/RankingView.java (69%) rename src/main/java/{frameworks => }/view/RankingViewModel.java (97%) rename src/main/java/{frameworks => }/view/SignUpView.java (89%) diff --git a/src/main/java/interface_adapters/presenters/Login.java b/src/main/java/interface_adapters/presenters/Login.java deleted file mode 100644 index cd39a4f94..000000000 --- a/src/main/java/interface_adapters/presenters/Login.java +++ /dev/null @@ -1,63 +0,0 @@ -package interface_adapters.presenters; - -import frameworks.view.LoginView; -import frameworks.view.MainView; -import frameworks.view.SignUpView; - -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -public class Login implements ActionListener { - private LoginView loginView; - private MainView mainView = new MainView(); - private SignUpView signUpView = new SignUpView(); - - public Login(LoginView loginView) { - this.loginView = new LoginView(); - final JButton loginButton = LoginView.getLoginButton(); - final JButton registerButton = LoginView.getRegisterButton(); - loginButton.addActionListener(this); - registerButton.addActionListener(this); - mainView.dispose(); - signUpView.dispose(); - loginView.dispose(); - } - - @Override - public void actionPerformed(ActionEvent e) { - - final JButton source = (JButton) e.getSource(); - - if (source.getText().equals("log in")) { - final String username = loginView.getUser(); - final String password = new String(loginView.getPwd()); - // check username and password - if (isValidUser(username, password)) { - - JOptionPane.showMessageDialog(loginView, "Login successful! Welcome to the Main Menu."); - loginView.dispose(); - new MainMenu(); - } - else { - // If doesn't match - JOptionPane.showMessageDialog(loginView, "Invalid username or password. Please try again."); - } - - } - else if (source.getText().equals("sign up")) { - new SignUp(signUpView); - } - } - - private boolean isValidUser(String username, String password) { - // example - return "admin".equals(username) && "password123".equals(password); - } - - public static void main(String[] args) { - final LoginView loginView = new LoginView(); - new Login(loginView); - } -} - diff --git a/src/main/java/interface_adapters/presenters/SignUp.java b/src/main/java/interface_adapters/presenters/SignUp.java deleted file mode 100644 index ddb13afd7..000000000 --- a/src/main/java/interface_adapters/presenters/SignUp.java +++ /dev/null @@ -1,11 +0,0 @@ -package interface_adapters.presenters; - -import frameworks.view.SignUpView; - -public class SignUp { - private SignUpView signUpView; - - public SignUp(SignUpView signUpView) { - this.signUpView = signUpView; - } -} diff --git a/src/main/java/frameworks/view/Constants.java b/src/main/java/view/Constants.java similarity index 96% rename from src/main/java/frameworks/view/Constants.java rename to src/main/java/view/Constants.java index 898acd646..4e65763dd 100644 --- a/src/main/java/frameworks/view/Constants.java +++ b/src/main/java/view/Constants.java @@ -1,4 +1,4 @@ -package frameworks.view; +package view; /** * Constants used in this program. diff --git a/src/main/java/frameworks/view/EventView.java b/src/main/java/view/EventView.java similarity index 72% rename from src/main/java/frameworks/view/EventView.java rename to src/main/java/view/EventView.java index 9b69043d8..6248043f1 100644 --- a/src/main/java/frameworks/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -1,7 +1,11 @@ -package frameworks.view; +package view; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionListener; +/** + * Event view. + */ public class EventView extends JFrame { public EventView() { @@ -11,16 +15,19 @@ public EventView() { final SpringLayout layout = new SpringLayout(); container.setLayout(layout); + // Event Label final JLabel eventLabel = new JLabel("Event:"); eventLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); container.add(eventLabel); - final JTextArea descriptionArea = new JTextArea(); + // Description Area + final JTextArea descriptionArea = new JTextArea("Event description goes here..."); descriptionArea.setEditable(false); descriptionArea.setBackground(Color.LIGHT_GRAY); descriptionArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); container.add(descriptionArea); + // Buttons final JButton fightButton = new JButton("Fight"); final JButton negotiateButton = new JButton("Negotiate"); final JButton fleeButton = new JButton("Flee"); @@ -30,6 +37,33 @@ public EventView() { container.add(fleeButton); container.add(backButton); + // Layout Constraints + extracted(layout, eventLabel, container, descriptionArea, fightButton, negotiateButton, fleeButton); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, fightButton); + + // Add ActionListeners to Buttons + final ActionListener returnToGameViewListener = e -> { + dispose(); + new GameView(); + }; + + fightButton.addActionListener(returnToGameViewListener); + negotiateButton.addActionListener(returnToGameViewListener); + fleeButton.addActionListener(returnToGameViewListener); + backButton.addActionListener(returnToGameViewListener); + + // Window Settings + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + } + + private static void extracted(SpringLayout layout, JLabel eventLabel, Container container, + JTextArea descriptionArea, JButton fightButton, + JButton negotiateButton, JButton fleeButton) { layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, eventLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); layout.putConstraint(SpringLayout.NORTH, eventLabel, Constants.TWENTY, SpringLayout.NORTH, container); @@ -46,14 +80,6 @@ public EventView() { layout.putConstraint(SpringLayout.WEST, fleeButton, Constants.TWENTY, SpringLayout.EAST, negotiateButton); layout.putConstraint(SpringLayout.NORTH, fleeButton, 0, SpringLayout.NORTH, fightButton); - - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, fightButton); - - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); - setDefaultCloseOperation(EXIT_ON_CLOSE); - setResizable(false); - setVisible(true); } public static void main(String[] args) { diff --git a/src/main/java/frameworks/view/GameOverView.java b/src/main/java/view/GameOverView.java similarity index 79% rename from src/main/java/frameworks/view/GameOverView.java rename to src/main/java/view/GameOverView.java index a34a7ad3c..1d3351a9d 100644 --- a/src/main/java/frameworks/view/GameOverView.java +++ b/src/main/java/view/GameOverView.java @@ -1,8 +1,10 @@ -package frameworks.view; +package view; import javax.swing.*; import java.awt.*; - +/** + * Gameover view. + */ public class GameOverView extends JFrame { public GameOverView() { super("Game Over"); @@ -19,7 +21,7 @@ public GameOverView() { scoreLabel.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); container.add(scoreLabel); - final JTextArea descriptionArea = new JTextArea(); + final JTextArea descriptionArea = new JTextArea("Game description goes here..."); descriptionArea.setEditable(false); descriptionArea.setBackground(Color.LIGHT_GRAY); descriptionArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); @@ -29,6 +31,24 @@ public GameOverView() { mainMenuButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); container.add(mainMenuButton); + // Layout constraints + extracted(layout, titleLabel, container, scoreLabel, descriptionArea, mainMenuButton); + + // Add action listener to "Main Menu" button + mainMenuButton.addActionListener(e -> { + dispose(); + new MainView(); + }); + + // Window settings + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + } + + private static void extracted(SpringLayout layout, JLabel titleLabel, Container container, JLabel scoreLabel, + JTextArea descriptionArea, JButton mainMenuButton) { layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); layout.putConstraint(SpringLayout.NORTH, titleLabel, Constants.TWENTY, SpringLayout.NORTH, container); @@ -44,11 +64,6 @@ public GameOverView() { layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, mainMenuButton, 0, SpringLayout.HORIZONTAL_CENTER, container); layout.putConstraint(SpringLayout.NORTH, mainMenuButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionArea); - - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); - setDefaultCloseOperation(EXIT_ON_CLOSE); - setResizable(false); - setVisible(true); } public static void main(String[] args) { diff --git a/src/main/java/frameworks/view/GameView.java b/src/main/java/view/GameView.java similarity index 55% rename from src/main/java/frameworks/view/GameView.java rename to src/main/java/view/GameView.java index e2b142071..bcf918d56 100644 --- a/src/main/java/frameworks/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -1,15 +1,22 @@ -package frameworks.view; +package view; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionListener; +/** + * Game view. + */ public class GameView extends JFrame { + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings", + "checkstyle:ExecutableStatementCount", "checkstyle:JavaNCSS"}) public GameView() { super("Game"); final Container container = getContentPane(); final SpringLayout layout = new SpringLayout(); container.setLayout(layout); + final JLabel dayLabel = new JLabel("Day: 50"); dayLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); container.add(dayLabel); @@ -18,14 +25,16 @@ public GameView() { final JLabel waterLabel = new JLabel("Water: 30"); final JLabel peopleLabel = new JLabel("People: 20"); final JLabel weaponLabel = new JLabel("Weapon: 15"); + final JLabel actionAvailableLabel = new JLabel("Action Available: 3"); container.add(foodLabel); container.add(waterLabel); container.add(peopleLabel); container.add(weaponLabel); + container.add(actionAvailableLabel); final JPanel mapPanel = new JPanel(); mapPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - mapPanel.setPreferredSize(new Dimension(200, 200)); + mapPanel.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); container.add(mapPanel); final JLabel mapLabel = new JLabel("Mini Map"); mapPanel.add(mapLabel); @@ -40,12 +49,22 @@ public GameView() { final JButton broadcastButton = new JButton("Broadcast"); final JButton gatherButton = new JButton("Gather"); - final JButton moveButton = new JButton("Move"); + final JButton upButton = new JButton("Up"); + final JButton downButton = new JButton("Down"); + final JButton leftButton = new JButton("Left"); + final JButton rightButton = new JButton("Right"); + final JButton eventButton = new JButton("Event"); final JButton nextDayButton = new JButton("Next Day"); + final JButton infoButton = new JButton("information (only brief info)"); container.add(broadcastButton); container.add(gatherButton); - container.add(moveButton); + container.add(upButton); + container.add(downButton); + container.add(leftButton); + container.add(rightButton); + container.add(eventButton); container.add(nextDayButton); + container.add(infoButton); layout.putConstraint(SpringLayout.WEST, dayLabel, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.NORTH, dayLabel, Constants.TWENTY, SpringLayout.NORTH, container); @@ -62,14 +81,15 @@ public GameView() { layout.putConstraint(SpringLayout.WEST, weaponLabel, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.NORTH, weaponLabel, Constants.TWENTY, SpringLayout.SOUTH, peopleLabel); + layout.putConstraint(SpringLayout.WEST, actionAvailableLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, actionAvailableLabel, Constants.TWENTY, SpringLayout.SOUTH, weaponLabel); + layout.putConstraint(SpringLayout.EAST, mapPanel, -Constants.TWENTY, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, mapPanel, Constants.TWENTY, SpringLayout.NORTH, container); layout.putConstraint(SpringLayout.WEST, infoLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, infoLabel, Constants.TWENTY, SpringLayout.SOUTH, weaponLabel); + layout.putConstraint(SpringLayout.NORTH, infoLabel, Constants.TWENTY, SpringLayout.SOUTH, actionAvailableLabel); - layout.putConstraint(SpringLayout.WEST, infoArea, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.EAST, infoArea, -Constants.TWENTY, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, infoArea, Constants.TEN, SpringLayout.SOUTH, infoLabel); layout.putConstraint(SpringLayout.SOUTH, infoArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, container); @@ -79,12 +99,47 @@ public GameView() { layout.putConstraint(SpringLayout.WEST, gatherButton, Constants.TWENTY, SpringLayout.EAST, broadcastButton); layout.putConstraint(SpringLayout.NORTH, gatherButton, 0, SpringLayout.NORTH, broadcastButton); - layout.putConstraint(SpringLayout.WEST, moveButton, Constants.TWENTY, SpringLayout.EAST, gatherButton); - layout.putConstraint(SpringLayout.NORTH, moveButton, 0, SpringLayout.NORTH, broadcastButton); + layout.putConstraint(SpringLayout.WEST, eventButton, Constants.TWENTY, SpringLayout.EAST, gatherButton); + layout.putConstraint(SpringLayout.NORTH, eventButton, 0, SpringLayout.NORTH, gatherButton); - layout.putConstraint(SpringLayout.EAST, nextDayButton, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.WEST, nextDayButton, Constants.TWENTY, SpringLayout.EAST, eventButton); layout.putConstraint(SpringLayout.NORTH, nextDayButton, 0, SpringLayout.NORTH, broadcastButton); + layout.putConstraint(SpringLayout.NORTH, upButton, Constants.TWENTY, SpringLayout.SOUTH, broadcastButton); + layout.putConstraint(SpringLayout.WEST, upButton, Constants.TWENTY, SpringLayout.WEST, container); + + layout.putConstraint(SpringLayout.WEST, downButton, Constants.TWENTY, SpringLayout.EAST, upButton); + layout.putConstraint(SpringLayout.NORTH, downButton, 0, SpringLayout.NORTH, upButton); + + layout.putConstraint(SpringLayout.WEST, leftButton, Constants.TWENTY, SpringLayout.EAST, downButton); + layout.putConstraint(SpringLayout.NORTH, leftButton, 0, SpringLayout.NORTH, upButton); + + layout.putConstraint(SpringLayout.WEST, rightButton, Constants.TWENTY, SpringLayout.EAST, leftButton); + layout.putConstraint(SpringLayout.NORTH, rightButton, 0, SpringLayout.NORTH, upButton); + + layout.putConstraint(SpringLayout.WEST, infoButton, Constants.TWENTY, SpringLayout.EAST, rightButton); + layout.putConstraint(SpringLayout.NORTH, infoButton, 0, SpringLayout.NORTH, upButton); + + // Add ActionListeners to Buttons + final ActionListener openGameViewListener = e -> { + dispose(); + new GameView(); + }; + + final ActionListener openEventViewListener = e -> { + dispose(); + new EventView(); + }; + eventButton.addActionListener(openEventViewListener); + broadcastButton.addActionListener(openGameViewListener); + gatherButton.addActionListener(openGameViewListener); + nextDayButton.addActionListener(openGameViewListener); + upButton.addActionListener(openGameViewListener); + downButton.addActionListener(openGameViewListener); + leftButton.addActionListener(openGameViewListener); + rightButton.addActionListener(openGameViewListener); + + // Window settings setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); diff --git a/src/main/java/view/InformationView.java b/src/main/java/view/InformationView.java new file mode 100644 index 000000000..f48797b0c --- /dev/null +++ b/src/main/java/view/InformationView.java @@ -0,0 +1,66 @@ +package view; + +import javax.swing.*; +import java.awt.*; + +/** + * Information view. + */ +public class InformationView extends JFrame { + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) + public InformationView(String information) { + super("Information"); + + // Set up the container + final Container container = getContentPane(); + final SpringLayout layout = new SpringLayout(); + container.setLayout(layout); + + // Create JTextArea to display information + final JTextArea infoArea = new JTextArea(information); + infoArea.setEditable(false); + infoArea.setLineWrap(true); + infoArea.setWrapStyleWord(true); + infoArea.setBackground(Color.LIGHT_GRAY); + infoArea.setFont(new Font("Serif", Font.PLAIN, 16)); + infoArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + + // Add a scroll pane for JTextArea + final JScrollPane scrollPane = new JScrollPane(infoArea); + container.add(scrollPane); + + // Create the back button + final JButton backButton = new JButton("Back"); + backButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + container.add(backButton); + + // Layout constraints + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, scrollPane, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, scrollPane, Constants.TWENTY, SpringLayout.NORTH, container); + layout.putConstraint(SpringLayout.WEST, scrollPane, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.EAST, scrollPane, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.SOUTH, scrollPane, -Constants.SIXTY, SpringLayout.SOUTH, container); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, scrollPane); + + // Add action listener to the back button + backButton.addActionListener(e -> { + dispose(); + new GameView(); + }); + + // Set window properties + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + } + + public static void main(String[] args) { + // Sample information to display + final String sampleInformation = "This is the system-generated information. " + + "It can include logs, updates, or any other details about the backend process."; + new InformationView(sampleInformation); + } +} diff --git a/src/main/java/frameworks/view/LoginView.java b/src/main/java/view/LoginView.java similarity index 90% rename from src/main/java/frameworks/view/LoginView.java rename to src/main/java/view/LoginView.java index 3822ea790..bae0c348a 100644 --- a/src/main/java/frameworks/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -1,12 +1,12 @@ -package frameworks.view; +package view; import javax.swing.*; import java.awt.*; - +import java.awt.event.ActionListener; /** - * Constants used in this program. + * Login view. */ public class LoginView extends JFrame { private JLabel nameLabel = new JLabel("group project", JLabel.CENTER); @@ -52,6 +52,19 @@ public LoginView() { final int offsetX = childWidth.getValue() / 2; layout(offsetX); + final ActionListener openSignUpListener = e -> { + dispose(); + new SignUpView(); + }; + + final ActionListener openGameViewListener = e -> { + dispose(); + new GameView(); + }; + + loginBotton.addActionListener(openGameViewListener); + registerButton.addActionListener(openSignUpListener); + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); // setLocation(null); setDefaultCloseOperation(EXIT_ON_CLOSE); @@ -80,8 +93,10 @@ private void layout(int offsetX) { // set registerButton springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginBotton); springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginBotton); + } + public static void main(String[] args) { new LoginView(); } diff --git a/src/main/java/frameworks/view/MainView.java b/src/main/java/view/MainView.java similarity index 98% rename from src/main/java/frameworks/view/MainView.java rename to src/main/java/view/MainView.java index a714cad28..5c588ae75 100644 --- a/src/main/java/frameworks/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -1,7 +1,10 @@ -package frameworks.view; +package view; import javax.swing.*; import java.awt.*; +/** + * Main view. + */ public class MainView extends JFrame { private JButton newGameButton = new JButton("New Game"); diff --git a/src/main/java/frameworks/view/RankingView.java b/src/main/java/view/RankingView.java similarity index 69% rename from src/main/java/frameworks/view/RankingView.java rename to src/main/java/view/RankingView.java index 57395fb47..4cceac689 100644 --- a/src/main/java/frameworks/view/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -1,9 +1,16 @@ -package frameworks.view; +package view; + +import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +/** + * Ranking view. + */ public class RankingView extends JFrame { public RankingView() { super("Ranking"); @@ -14,7 +21,7 @@ public RankingView() { titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.THIRTY)); container.add(titleLabel, BorderLayout.NORTH); - // jtable example + // JTable example final String[] columnNames = {"Rank", "Player", "Score"}; final Object[][] data = new Object[Constants.ONE_HUNDRED][Constants.THREE]; for (int i = 0; i < Constants.ONE_HUNDRED; i++) { @@ -26,15 +33,11 @@ public RankingView() { data[i][2] = (int) (Math.random() * Constants.ONE_THOUSAND); } - final JTable rankingTable = new JTable(new DefaultTableModel(data, columnNames)); - rankingTable.setEnabled(false); - final JScrollPane scrollPane = new JScrollPane(rankingTable); - container.add(scrollPane, BorderLayout.CENTER); + extracted(data, columnNames, container); - final JPanel bottomPanel = new JPanel(); - bottomPanel.setLayout(new GridLayout(3, 1)); + final JPanel bottomPanel = getjPanel(); - // example rank + // Example rank final JLabel yourRankLabel = new JLabel("Your Rank: No. 10", JLabel.CENTER); yourRankLabel.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); bottomPanel.add(yourRankLabel); @@ -51,14 +54,44 @@ public RankingView() { container.add(bottomPanel, BorderLayout.SOUTH); - // 窗口设置 + // Add ActionListeners to buttons + mainButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + new MainView(); + } + }); + + quitButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + }); + + // Window settings setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(true); } + @NotNull + private static JPanel getjPanel() { + final JPanel bottomPanel = new JPanel(); + bottomPanel.setLayout(new GridLayout(3, 1)); + return bottomPanel; + } + + private static void extracted(Object[][] data, String[] columnNames, Container container) { + final JTable rankingTable = new JTable(new DefaultTableModel(data, columnNames)); + rankingTable.setEnabled(false); + final JScrollPane scrollPane = new JScrollPane(rankingTable); + container.add(scrollPane, BorderLayout.CENTER); + } + public static void main(String[] args) { new RankingView(); } -} \ No newline at end of file +} diff --git a/src/main/java/frameworks/view/RankingViewModel.java b/src/main/java/view/RankingViewModel.java similarity index 97% rename from src/main/java/frameworks/view/RankingViewModel.java rename to src/main/java/view/RankingViewModel.java index ab53fa788..c0769eaa7 100644 --- a/src/main/java/frameworks/view/RankingViewModel.java +++ b/src/main/java/view/RankingViewModel.java @@ -1,4 +1,4 @@ -package frameworks.view; +package view; /** * Represents a ViewModel for the ranking list. diff --git a/src/main/java/frameworks/view/SignUpView.java b/src/main/java/view/SignUpView.java similarity index 89% rename from src/main/java/frameworks/view/SignUpView.java rename to src/main/java/view/SignUpView.java index 352a0704c..e3878b7a5 100644 --- a/src/main/java/frameworks/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -1,10 +1,11 @@ -package frameworks.view; +package view; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionListener; /** - * Constants used in this program. + * Sign up view. */ public class SignUpView extends JFrame { private JLabel nameLabel = new JLabel("group project", JLabel.CENTER); @@ -36,14 +37,7 @@ public SignUpView() { againText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); // add components - centerPanel.add(userNameLabel); - centerPanel.add(userText); - centerPanel.add(passwordLabel); - centerPanel.add(passwordText); - centerPanel.add(loginBotton); - centerPanel.add(registerButton); - centerPanel.add(againLabel); - centerPanel.add(againText); + extracted(); contentPane.add(nameLabel, BorderLayout.NORTH); contentPane.add(centerPanel, BorderLayout.CENTER); @@ -55,6 +49,41 @@ public SignUpView() { final Spring childWidth = Spring.sum(Spring.sum(titleLabelWidth, titleTextWidth), spaceWidth); final int offsetX = childWidth.getValue() / 2; // set userNameLabel location + extracted(offsetX); + + final ActionListener openGameViewListener = e -> { + dispose(); + new GameView(); + }; + + final ActionListener openLoginListener = e -> { + dispose(); + new LoginView(); + }; + + loginBotton.addActionListener(openLoginListener); + registerButton.addActionListener(openGameViewListener); + + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + // setLocation(null); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + + } + + private void extracted() { + centerPanel.add(userNameLabel); + centerPanel.add(userText); + centerPanel.add(passwordLabel); + centerPanel.add(passwordText); + centerPanel.add(loginBotton); + centerPanel.add(registerButton); + centerPanel.add(againLabel); + centerPanel.add(againText); + } + + private void extracted(int offsetX) { springLayout.putConstraint(SpringLayout.WEST, userNameLabel, -offsetX, SpringLayout.HEIGHT, centerPanel); springLayout.putConstraint(SpringLayout.NORTH, userNameLabel, Constants.TWENTY, SpringLayout.NORTH, centerPanel); // set userText location @@ -78,13 +107,6 @@ public SignUpView() { // set againText location springLayout.putConstraint(SpringLayout.WEST, againText, Constants.TEN, SpringLayout.EAST, againLabel); springLayout.putConstraint(SpringLayout.NORTH, againText, 0, SpringLayout.NORTH, againLabel); - - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); - // setLocation(null); - setDefaultCloseOperation(EXIT_ON_CLOSE); - setResizable(false); - setVisible(true); - } public static void main(String[] args) { From 57cd1c0ab948757adbce2dfcb62bc1f91058e3c3 Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 30 Nov 2024 17:52:24 -0500 Subject: [PATCH 072/154] correct views checkstyle warnings --- src/main/java/view/EventView.java | 17 ++++++++++++----- src/main/java/view/GameOverView.java | 2 ++ src/main/java/view/GameView.java | 3 ++- src/main/java/view/InformationView.java | 2 +- src/main/java/view/LoginView.java | 7 ++++--- src/main/java/view/MainView.java | 17 ++++++++++++----- src/main/java/view/RankingView.java | 2 +- src/main/java/view/SignUpView.java | 7 +++++-- 8 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/main/java/view/EventView.java b/src/main/java/view/EventView.java index 6248043f1..97cf7e122 100644 --- a/src/main/java/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -8,6 +8,7 @@ */ public class EventView extends JFrame { + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public EventView() { super("Event"); @@ -49,10 +50,7 @@ public EventView() { new GameView(); }; - fightButton.addActionListener(returnToGameViewListener); - negotiateButton.addActionListener(returnToGameViewListener); - fleeButton.addActionListener(returnToGameViewListener); - backButton.addActionListener(returnToGameViewListener); + addListeners(fightButton, returnToGameViewListener, negotiateButton, fleeButton, backButton); // Window Settings setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); @@ -61,6 +59,14 @@ public EventView() { setVisible(true); } + private static void addListeners(JButton fightButton, ActionListener returnToGameViewListener, + JButton negotiateButton, JButton fleeButton, JButton backButton) { + fightButton.addActionListener(returnToGameViewListener); + negotiateButton.addActionListener(returnToGameViewListener); + fleeButton.addActionListener(returnToGameViewListener); + backButton.addActionListener(returnToGameViewListener); + } + private static void extracted(SpringLayout layout, JLabel eventLabel, Container container, JTextArea descriptionArea, JButton fightButton, JButton negotiateButton, JButton fleeButton) { @@ -70,7 +76,8 @@ private static void extracted(SpringLayout layout, JLabel eventLabel, Container layout.putConstraint(SpringLayout.WEST, descriptionArea, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.EAST, descriptionArea, -Constants.TWENTY, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, descriptionArea, Constants.TWENTY, SpringLayout.SOUTH, eventLabel); - layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, container); + layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, + container); layout.putConstraint(SpringLayout.WEST, fightButton, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.NORTH, fightButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionArea); diff --git a/src/main/java/view/GameOverView.java b/src/main/java/view/GameOverView.java index 1d3351a9d..0b5cb3ffa 100644 --- a/src/main/java/view/GameOverView.java +++ b/src/main/java/view/GameOverView.java @@ -5,7 +5,9 @@ /** * Gameover view. */ + public class GameOverView extends JFrame { + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public GameOverView() { super("Game Over"); diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index bcf918d56..dbcad68fc 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -82,7 +82,8 @@ public GameView() { layout.putConstraint(SpringLayout.NORTH, weaponLabel, Constants.TWENTY, SpringLayout.SOUTH, peopleLabel); layout.putConstraint(SpringLayout.WEST, actionAvailableLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, actionAvailableLabel, Constants.TWENTY, SpringLayout.SOUTH, weaponLabel); + layout.putConstraint(SpringLayout.NORTH, actionAvailableLabel, Constants.TWENTY, SpringLayout.SOUTH, + weaponLabel); layout.putConstraint(SpringLayout.EAST, mapPanel, -Constants.TWENTY, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, mapPanel, Constants.TWENTY, SpringLayout.NORTH, container); diff --git a/src/main/java/view/InformationView.java b/src/main/java/view/InformationView.java index f48797b0c..5436d09ec 100644 --- a/src/main/java/view/InformationView.java +++ b/src/main/java/view/InformationView.java @@ -22,7 +22,7 @@ public InformationView(String information) { infoArea.setLineWrap(true); infoArea.setWrapStyleWord(true); infoArea.setBackground(Color.LIGHT_GRAY); - infoArea.setFont(new Font("Serif", Font.PLAIN, 16)); + infoArea.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); infoArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // Add a scroll pane for JTextArea diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index bae0c348a..9e61a22e6 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -19,6 +19,8 @@ public class LoginView extends JFrame { private static JButton loginBotton = new JButton("log in"); private static JButton registerButton = new JButton("sign up"); + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings", + "checkstyle:ExecutableStatementCount"}) public LoginView() { super("Log in"); final Container contentPane = getContentPane(); @@ -97,11 +99,10 @@ private void layout(int offsetX) { } - public static void main(String[] args) { + public static void main(String[] args) { new LoginView(); } - - public static String getUser() { + public static String getUser() { return userText.getText(); } diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index 5c588ae75..5e6cff7a5 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -12,6 +12,7 @@ public class MainView extends JFrame { private JButton quitButton = new JButton("Quit"); private JButton logoutButton = new JButton("Logout"); + @SuppressWarnings({"checkstyle:MultipleStringLiterals", "checkstyle:SuppressWarnings"}) public MainView() { super("Main Menu"); @@ -38,19 +39,24 @@ public MainView() { container.add(logoutButton); // Layout constraints - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, + container); layout.putConstraint(SpringLayout.NORTH, titleLabel, Constants.TWENTY, SpringLayout.NORTH, container); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, newGameButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, newGameButton, 0, SpringLayout.HORIZONTAL_CENTER, + container); layout.putConstraint(SpringLayout.NORTH, newGameButton, Constants.FORTY, SpringLayout.SOUTH, titleLabel); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, rankingButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, rankingButton, 0, SpringLayout.HORIZONTAL_CENTER, + container); layout.putConstraint(SpringLayout.NORTH, rankingButton, Constants.TWENTY, SpringLayout.SOUTH, newGameButton); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, quitButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, quitButton, 0, SpringLayout.HORIZONTAL_CENTER, + container); layout.putConstraint(SpringLayout.NORTH, quitButton, Constants.TWENTY, SpringLayout.SOUTH, rankingButton); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, logoutButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, logoutButton, 0, SpringLayout.HORIZONTAL_CENTER, + container); layout.putConstraint(SpringLayout.NORTH, logoutButton, Constants.TWENTY, SpringLayout.SOUTH, quitButton); // Add listeners for buttons @@ -64,6 +70,7 @@ public MainView() { } // Add ActionListener to buttons + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) private void addListeners() { // Switch to GameView when "New Game" is clicked newGameButton.addActionListener(e -> { diff --git a/src/main/java/view/RankingView.java b/src/main/java/view/RankingView.java index 4cceac689..d76867625 100644 --- a/src/main/java/view/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -80,7 +80,7 @@ public void actionPerformed(ActionEvent e) { @NotNull private static JPanel getjPanel() { final JPanel bottomPanel = new JPanel(); - bottomPanel.setLayout(new GridLayout(3, 1)); + bottomPanel.setLayout(new GridLayout(Constants.THREE, 1)); return bottomPanel; } diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index e3878b7a5..736dd53d8 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -20,6 +20,7 @@ public class SignUpView extends JFrame { private JLabel againLabel = new JLabel("again"); private JTextField againText = new JTextField(); + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public SignUpView() { super("sign up"); final Container contentPane = getContentPane(); @@ -85,7 +86,8 @@ private void extracted() { private void extracted(int offsetX) { springLayout.putConstraint(SpringLayout.WEST, userNameLabel, -offsetX, SpringLayout.HEIGHT, centerPanel); - springLayout.putConstraint(SpringLayout.NORTH, userNameLabel, Constants.TWENTY, SpringLayout.NORTH, centerPanel); + springLayout.putConstraint(SpringLayout.NORTH, userNameLabel, Constants.TWENTY, SpringLayout.NORTH, + centerPanel); // set userText location springLayout.putConstraint(SpringLayout.WEST, userText, Constants.TEN, SpringLayout.EAST, userNameLabel); springLayout.putConstraint(SpringLayout.NORTH, userText, 0, SpringLayout.NORTH, userNameLabel); @@ -97,7 +99,8 @@ private void extracted(int offsetX) { springLayout.putConstraint(SpringLayout.NORTH, passwordText, 0, SpringLayout.NORTH, passwordLabel); // set loginButton location springLayout.putConstraint(SpringLayout.WEST, loginBotton, Constants.FIFTY, SpringLayout.WEST, passwordLabel); - springLayout.putConstraint(SpringLayout.NORTH, loginBotton, Constants.EIGHTY, SpringLayout.SOUTH, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, loginBotton, Constants.EIGHTY, SpringLayout.SOUTH, + passwordLabel); // set registerButton location springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginBotton); springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginBotton); From c61e50c74291ac11b671ffc8bd87b7473391ebae Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sat, 30 Nov 2024 16:14:42 -0700 Subject: [PATCH 073/154] Unnessary component deleted in usecase --- .../dailygather/DailyGatherInterface.java | 5 +--- .../dailygather/DailyGatherPresenter.java | 3 +- .../dailygather/GatherInteractor.java | 5 +--- .../dailygather/GatherOutputData.java | 21 ++------------ .../usecases/gamenewday/NewdayInteractor.java | 4 --- .../usecases/gamenewday/NewdayOutputData.java | 28 ++----------------- 6 files changed, 7 insertions(+), 59 deletions(-) diff --git a/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java b/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java index 7da324bfb..a90416611 100644 --- a/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java +++ b/src/main/java/interface_adapters/dailygather/DailyGatherInterface.java @@ -8,11 +8,8 @@ public interface DailyGatherInterface { /** * All the stuff we have to display and update at this point. Ne wmessage, and updated resource. * @param message message for the gather. - * @param food new food. - * @param water new water amount. - * @param weapon new weapon amount. */ - void updateUiGather(String message, int food, int water, int weapon); + void updateUiGather(String message); /** * No need to update resource, or anything except the error message telling play why this is invaild move. diff --git a/src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java b/src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java index 90c368a8c..8293d3a44 100644 --- a/src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java +++ b/src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java @@ -11,8 +11,7 @@ public class DailyGatherPresenter implements GatherOutputBoundary { @Override public void prepareSuccessView(GatherOutputData outputdata) { - view.updateUiGather(outputdata.getSuccessmessage(), - outputdata.getUpdatedfood(), outputdata.getUpdatedwater(), outputdata.getUpdatedweapon()); + view.updateUiGather(outputdata.getSuccessmessage()); } @Override diff --git a/src/main/java/usecases/dailygather/GatherInteractor.java b/src/main/java/usecases/dailygather/GatherInteractor.java index ba6735e9e..4ffc41f1b 100644 --- a/src/main/java/usecases/dailygather/GatherInteractor.java +++ b/src/main/java/usecases/dailygather/GatherInteractor.java @@ -21,9 +21,6 @@ public void execute(GatherInputData inputdata) { final int foodgathered = (int) Math.round(foodscalar * Math.sqrt((double) people)); final int watergathered = (int) Math.round(waterscalar * Math.sqrt((double) people)); final int weapongathered = (int) Math.round(weaponscalar * Math.sqrt((double) people)); - final int updatedfood = dataAccessInterface.getInventory().getFood() + foodgathered; - final int updatedwater = dataAccessInterface.getInventory().getWater() + watergathered; - final int updatedweapon = dataAccessInterface.getInventory().getWeapon() + weapongathered; // not sure if this is a good way of calculation towards game balance, I'll need when game can fully run to // decide on the change. StringBuilder successoutputmessage = new StringBuilder("Your group found "); @@ -47,7 +44,7 @@ public void execute(GatherInputData inputdata) { dataAccessInterface.changeweapon(weapongathered); if (isvaildgather()) { outputBoundary.prepareSuccessView(new GatherOutputData( - successoutputmessage.toString(), updatedfood, updatedwater, updatedweapon)); + successoutputmessage.toString())); } else { outputBoundary.prepareFailureView("Invalid Gather"); diff --git a/src/main/java/usecases/dailygather/GatherOutputData.java b/src/main/java/usecases/dailygather/GatherOutputData.java index 3fe507836..e37a685cb 100644 --- a/src/main/java/usecases/dailygather/GatherOutputData.java +++ b/src/main/java/usecases/dailygather/GatherOutputData.java @@ -7,30 +7,13 @@ */ public class GatherOutputData { private String successmessage; - private int updatedfood; - private int updatedwater; - private int updatedweapon; - public GatherOutputData(String successmessage, int updatedfood, int updatedwater, int updatedweapon) { + public GatherOutputData(String successmessage) { this.successmessage = successmessage; - this.updatedfood = updatedfood; - this.updatedwater = updatedwater; - this.updatedweapon = updatedweapon; + } public String getSuccessmessage() { return successmessage; } - - public int getUpdatedfood() { - return updatedfood; - } - - public int getUpdatedwater() { - return updatedwater; - } - - public int getUpdatedweapon() { - return updatedweapon; - } } diff --git a/src/main/java/usecases/gamenewday/NewdayInteractor.java b/src/main/java/usecases/gamenewday/NewdayInteractor.java index dd28e0439..204a4b808 100644 --- a/src/main/java/usecases/gamenewday/NewdayInteractor.java +++ b/src/main/java/usecases/gamenewday/NewdayInteractor.java @@ -21,10 +21,6 @@ public void execute(NewdayInputData inputdata) { final int people = newdayDataAccessObject.getInventory().getPeople(); final double temp = newdayDataAccessObject.getLocation().gettemperature(); final int score = newdayDataAccessObject.getPlayerinfo().getScore(); - int newfood = newdayDataAccessObject.getInventory().getFood(); - int newwater = newdayDataAccessObject.getInventory().getWater(); - int newpeople = newdayDataAccessObject.getInventory().getPeople(); - int newweapon = newdayDataAccessObject.getInventory().getWeapon(); // Message builder for day summary final StringBuilder messageBuilder = new StringBuilder("Another day has passed. Here's what happened:\n"); boolean success = true; diff --git a/src/main/java/usecases/gamenewday/NewdayOutputData.java b/src/main/java/usecases/gamenewday/NewdayOutputData.java index b56aa522c..9735a798a 100644 --- a/src/main/java/usecases/gamenewday/NewdayOutputData.java +++ b/src/main/java/usecases/gamenewday/NewdayOutputData.java @@ -8,20 +8,11 @@ public class NewdayOutputData { private String message; private boolean success; private String failmessage; - private int food; - private int water; - private int people; - private int weapon; - public NewdayOutputData(String message, boolean success, String failmessage, - int food, int water, int people, int weapon) { + public NewdayOutputData(String message, boolean success, String failmessage) { this.message = message; this.success = success; this.failmessage = failmessage; - this.food = food; - this.water = water; - this.people = people; - this.weapon = weapon; } public String getMessage() { @@ -35,20 +26,5 @@ public boolean isSuccess() { public String getFailmessage() { return failmessage; } - - public int getFood() { - return food; - } - - public int getWater() { - return water; - } - - public int getPeople() { - return people; - } - - public int getWeapon() { - return weapon; - } } + From c93fd4b0909ba5a5701618120f4aa16ab6a0508b Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sat, 30 Nov 2024 18:22:59 -0700 Subject: [PATCH 074/154] Entity Eventdecided added for each days unfinished events, EventDecide interface adaptor completed --- src/main/java/entities/EventAmbush.java | 8 +++++ src/main/java/entities/EventBlizzard.java | 8 +++++ src/main/java/entities/EventFlood.java | 8 +++++ .../java/entities/EventSurvivorJoins.java | 8 +++++ .../java/entities/EventTraderEncounter.java | 8 +++++ src/main/java/entities/EventsDecided.java | 22 ++++++++++++++ .../eventdecide/EventDecideController.java | 23 +++++++++++++++ .../eventdecide/EventDecideInterface.java | 21 ++++++++++++++ .../eventdecide/EventDecidePresenter.java | 28 ++++++++++++++++++ .../EventInitializerController.java | 23 +++++++++++++++ .../EventInitializerInterface.java | 22 ++++++++++++++ .../EventInitializerPresenter.java | 29 +++++++++++++++++++ .../PlaceDescriptionController.java | 23 +++++++++++++++ .../PlaceDescriptionInterface.java | 19 ++++++++++++ .../PlaceDescriptionPresenter.java | 22 ++++++++++++++ .../DecideEventDataAccessInterface.java | 6 ++++ .../eventdecide/DecideEventInteractor.java | 11 ++++--- .../DecideEventOutputBoundary.java | 2 +- .../eventdecide/DecideEventOutputData.java | 6 ++-- .../EventInitializeOutputData.java | 13 ++++++--- .../usecases/gamenewday/NewdayInteractor.java | 4 +-- 21 files changed, 300 insertions(+), 14 deletions(-) create mode 100644 src/main/java/entities/EventsDecided.java create mode 100644 src/main/java/interface_adapters/eventdecide/EventDecideController.java create mode 100644 src/main/java/interface_adapters/eventdecide/EventDecideInterface.java create mode 100644 src/main/java/interface_adapters/eventdecide/EventDecidePresenter.java create mode 100644 src/main/java/interface_adapters/eventinitializer/EventInitializerController.java create mode 100644 src/main/java/interface_adapters/eventinitializer/EventInitializerInterface.java create mode 100644 src/main/java/interface_adapters/eventinitializer/EventInitializerPresenter.java create mode 100644 src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionController.java create mode 100644 src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionInterface.java create mode 100644 src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionPresenter.java diff --git a/src/main/java/entities/EventAmbush.java b/src/main/java/entities/EventAmbush.java index c0cc88ee4..15f7b5f93 100644 --- a/src/main/java/entities/EventAmbush.java +++ b/src/main/java/entities/EventAmbush.java @@ -95,4 +95,12 @@ public String getNegotiatesuccessoutcome() { public String getNegotiatefailedoutcome() { return negotiatefailedoutcome; } + + /** + * Return the name of this event. + * @return the event name. + */ + public String toString() { + return "Ambush"; + } } diff --git a/src/main/java/entities/EventBlizzard.java b/src/main/java/entities/EventBlizzard.java index 14284f475..03a6a094e 100644 --- a/src/main/java/entities/EventBlizzard.java +++ b/src/main/java/entities/EventBlizzard.java @@ -83,4 +83,12 @@ public String getNegotiateOutcome() { public String getFleeOutcome() { return fleeOutcome; } + + /** + * Return the name of this event. + * @return the event name. + */ + public String toString() { + return "Blizzard"; + } } diff --git a/src/main/java/entities/EventFlood.java b/src/main/java/entities/EventFlood.java index 87c9acc23..021c5cc0f 100644 --- a/src/main/java/entities/EventFlood.java +++ b/src/main/java/entities/EventFlood.java @@ -80,4 +80,12 @@ public String getSecureSuppliesOutcome() { public String getDoNothingOutcome() { return doNothingOutcome; } + + /** + * Return the name of this event. + * @return the event name. + */ + public String toString() { + return "Flood"; + } } diff --git a/src/main/java/entities/EventSurvivorJoins.java b/src/main/java/entities/EventSurvivorJoins.java index 899ec049a..c0b322bf9 100644 --- a/src/main/java/entities/EventSurvivorJoins.java +++ b/src/main/java/entities/EventSurvivorJoins.java @@ -87,4 +87,12 @@ public String getRoboutcomesuccess() { public String getRoboutcomefail() { return roboutcomefail; } + + /** + * Return the name of this event. + * @return the event name. + */ + public String toString() { + return "SurvivorsJoins"; + } } diff --git a/src/main/java/entities/EventTraderEncounter.java b/src/main/java/entities/EventTraderEncounter.java index c4a8c2a38..f93fffef1 100644 --- a/src/main/java/entities/EventTraderEncounter.java +++ b/src/main/java/entities/EventTraderEncounter.java @@ -93,4 +93,12 @@ public String getRobOutcomeSuccess() { public String getRobOutcomeFail() { return robOutcomeFail; } + + /** + * Return the name of this event. + * @return the event name. + */ + public String toString() { + return "TradeEncounter"; + } } diff --git a/src/main/java/entities/EventsDecided.java b/src/main/java/entities/EventsDecided.java new file mode 100644 index 000000000..dca1cd6fe --- /dev/null +++ b/src/main/java/entities/EventsDecided.java @@ -0,0 +1,22 @@ +package entities; + +import java.util.ArrayList; + +/** + * Events that has been decided and not yet processed by player. + */ +public class EventsDecided { + private ArrayList events; + + public EventsDecided() { + events = new ArrayList<>(); + } + + public ArrayList getEvents() { + return events; + } + + public void setEvents(ArrayList events) { + this.events = events; + } +} diff --git a/src/main/java/interface_adapters/eventdecide/EventDecideController.java b/src/main/java/interface_adapters/eventdecide/EventDecideController.java new file mode 100644 index 000000000..45e1c826a --- /dev/null +++ b/src/main/java/interface_adapters/eventdecide/EventDecideController.java @@ -0,0 +1,23 @@ +package interface_adapters.eventdecide; + +import usecases.eventdecide.DecideEventInputBoundary; +import usecases.eventdecide.DecideEventInputData; + +/** + * Event deside controller + */ +public class EventDecideController { + private DecideEventInputBoundary interactor; + + public EventDecideController(DecideEventInputBoundary interactor) { + this.interactor = interactor; + } + + /** + * Execute. + */ + public void execute() { + final DecideEventInputData inputData = new DecideEventInputData(); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/eventdecide/EventDecideInterface.java b/src/main/java/interface_adapters/eventdecide/EventDecideInterface.java new file mode 100644 index 000000000..6cb6b6e2c --- /dev/null +++ b/src/main/java/interface_adapters/eventdecide/EventDecideInterface.java @@ -0,0 +1,21 @@ +package interface_adapters.eventdecide; + +import java.util.ArrayList; + +/** + * Interface of event decide. + */ +public interface EventDecideInterface { + + /** + * Update the UI event decide "Event happened today:", or not event at all. + * @param eventNames name of the events chose. + */ + void updateUiEventDecide(ArrayList eventNames); + + /** + * In case something went wrong. + * @param errorMessage error description. + */ + void failureEventDecide(String errorMessage); +} diff --git a/src/main/java/interface_adapters/eventdecide/EventDecidePresenter.java b/src/main/java/interface_adapters/eventdecide/EventDecidePresenter.java new file mode 100644 index 000000000..13089815f --- /dev/null +++ b/src/main/java/interface_adapters/eventdecide/EventDecidePresenter.java @@ -0,0 +1,28 @@ +package interface_adapters.eventdecide; + +import java.util.ArrayList; + +import usecases.eventdecide.DecideEventOutputBoundary; +import usecases.eventdecide.DecideEventOutputData; + +/** + * Event decider presenter. + */ +public class EventDecidePresenter implements DecideEventOutputBoundary { + private EventDecideInterface view; + + public EventDecidePresenter(EventDecideInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(DecideEventOutputData outputData) { + final ArrayList events = outputData.getEvents(); + view.updateUiEventDecide(events); + } + + @Override + public void prepareFailureView(String errorMessage) { + prepareFailureView(errorMessage); + } +} diff --git a/src/main/java/interface_adapters/eventinitializer/EventInitializerController.java b/src/main/java/interface_adapters/eventinitializer/EventInitializerController.java new file mode 100644 index 000000000..8c88b3512 --- /dev/null +++ b/src/main/java/interface_adapters/eventinitializer/EventInitializerController.java @@ -0,0 +1,23 @@ +package interface_adapters.eventinitializer; + +import usecases.eventinitialize.EventInitializeInputBoundary; +import usecases.eventinitialize.EventInitializeInputData; + +/** + * Event initializer controller. + */ +public class EventInitializerController { + private EventInitializeInputBoundary interactor; + + public EventInitializerController(EventInitializeInputBoundary interactor) { + this.interactor = interactor; + } + + /** + * Execute with input data provided, not needed. + */ + public void execute() { + final EventInitializeInputData inputData = new EventInitializeInputData(); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/eventinitializer/EventInitializerInterface.java b/src/main/java/interface_adapters/eventinitializer/EventInitializerInterface.java new file mode 100644 index 000000000..8b642e269 --- /dev/null +++ b/src/main/java/interface_adapters/eventinitializer/EventInitializerInterface.java @@ -0,0 +1,22 @@ +package interface_adapters.eventinitializer; + +/** + * Interface for presenter talking to view. + */ +public interface EventInitializerInterface { + + /** + * Update the event page by update the description, and options for the buttons. + * @param eventdescription Description of the event. + * @param option1 option 1 + * @param option2 option 2 + * @param option3 option 3 + */ + void updateUiEventInitializer(String eventdescription, String option1, String option2, String option3); + + /** + * Update the event page by saying no event at that day or something else is going on. + * @param failmessage fail message. + */ + void failureEventInitializer(String failmessage); +} diff --git a/src/main/java/interface_adapters/eventinitializer/EventInitializerPresenter.java b/src/main/java/interface_adapters/eventinitializer/EventInitializerPresenter.java new file mode 100644 index 000000000..12bc0a9f7 --- /dev/null +++ b/src/main/java/interface_adapters/eventinitializer/EventInitializerPresenter.java @@ -0,0 +1,29 @@ +package interface_adapters.eventinitializer; + +import usecases.eventinitialize.EventInitializeOutputBoundary; +import usecases.eventinitialize.EventInitializeOutputData; + +/** + * Event Initialize presenter. + */ +public class EventInitializerPresenter implements EventInitializeOutputBoundary { + private EventInitializerInterface view; + + public EventInitializerPresenter(EventInitializerInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(EventInitializeOutputData outputData) { + final String description = outputData.getDescription(); + final String choice1 = outputData.getChoice(1); + final String choice2 = outputData.getChoice(2); + final String choice3 = outputData.getChoice(3); + view.updateUiEventInitializer(description, choice1, choice2, choice3); + } + + @Override + public void prepareFailureView(String errorMessage) { + view.failureEventInitializer(errorMessage); + } +} diff --git a/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionController.java b/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionController.java new file mode 100644 index 000000000..c504b8be1 --- /dev/null +++ b/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionController.java @@ -0,0 +1,23 @@ +package interface_adapters.gameplacedescription; + +import usecases.gameplacedescription.PlaceDescriptionInputBoundary; +import usecases.gameplacedescription.PlaceDescriptionInputData; + +/** + * Place description usecase controller. + */ +public class PlaceDescriptionController { + private PlaceDescriptionInputBoundary interactor; + + public PlaceDescriptionController(PlaceDescriptionInputBoundary interactor) { + this.interactor = interactor; + } + + /** + * Automatic move, no player input needed. + */ + public void execute() { + final PlaceDescriptionInputData inputdata = new PlaceDescriptionInputData(); + interactor.execute(inputdata); + } +} diff --git a/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionInterface.java b/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionInterface.java new file mode 100644 index 000000000..e944bb715 --- /dev/null +++ b/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionInterface.java @@ -0,0 +1,19 @@ +package interface_adapters.gameplacedescription; + +/** + * Place description interface. + */ +public interface PlaceDescriptionInterface { + + /** + * If successful usecase, display the place description. + * @param placeDescription place description. + */ + void updateUiPlaceDescription(String placeDescription); + + /** + * If not successful, explain why location description generate was failed. + * @param failmessage fail reasoning. + */ + void failurePlaceDescription(String failmessage); +} diff --git a/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionPresenter.java b/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionPresenter.java new file mode 100644 index 000000000..522022987 --- /dev/null +++ b/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionPresenter.java @@ -0,0 +1,22 @@ +package interface_adapters.gameplacedescription; + +import usecases.gameplacedescription.PlaceDescriptionOutputBoundary; +import usecases.gameplacedescription.PlaceDescriptionOutputData; + +/** + * Presenter of place description. + */ +public class PlaceDescriptionPresenter implements PlaceDescriptionOutputBoundary { + private PlaceDescriptionInterface view; + + @Override + public void preparesuccessview(PlaceDescriptionOutputData data) { + final String description = data.getDescription(); + view.updateUiPlaceDescription(description); + } + + @Override + public void preparefailureview(String failmessage) { + view.failurePlaceDescription(failmessage); + } +} diff --git a/src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java b/src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java index ae44d0d57..0dc053288 100644 --- a/src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java +++ b/src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java @@ -18,6 +18,12 @@ public interface DecideEventDataAccessInterface { */ ArrayList getEvents(); + /** + * This method will set the decided events for that day. + * @param events events decided. + */ + void setEvents(ArrayList events); + /** * Get the player's current location, because certain event will only happen in certain location, Iceland * blizzard etc. diff --git a/src/main/java/usecases/eventdecide/DecideEventInteractor.java b/src/main/java/usecases/eventdecide/DecideEventInteractor.java index 049c4f875..f0a207e63 100644 --- a/src/main/java/usecases/eventdecide/DecideEventInteractor.java +++ b/src/main/java/usecases/eventdecide/DecideEventInteractor.java @@ -10,8 +10,8 @@ * though the day. */ public class DecideEventInteractor implements DecideEventInputBoundary { - private DecideEventDataAccessInterface dataaccessobject; - private DecideEventOutputBoundary outputboundary; + private final DecideEventDataAccessInterface dataaccessobject; + private final DecideEventOutputBoundary outputboundary; public DecideEventInteractor(DecideEventDataAccessInterface dataaccessobject, DecideEventOutputBoundary outputboundary) { @@ -25,6 +25,7 @@ public void execute(DecideEventInputData inputdata) { final ArrayList decidedEvents = new ArrayList<>(); final Location location = dataaccessobject.getLocation(); final String locationName = location.toString(); + final ArrayList decidedEventNames = new ArrayList<>(); for (Event event : events) { final ArrayList occuringlocations = event.getOccuringlocation(); final double probability = event.getprobability(); @@ -33,12 +34,14 @@ public void execute(DecideEventInputData inputdata) { if (randomValue < probability) { if (occuringlocations.contains(locationName)) { decidedEvents.add(event); + decidedEventNames.add(event.toString()); // will only add if probability hits, and is one of the possible location which player is at. } } } - final DecideEventOutputData outputdata = new DecideEventOutputData(decidedEvents); + dataaccessobject.setEvents(decidedEvents); + final DecideEventOutputData outputdata = new DecideEventOutputData(decidedEventNames); outputboundary.prepareSuccessView(outputdata); } -} \ No newline at end of file +} diff --git a/src/main/java/usecases/eventdecide/DecideEventOutputBoundary.java b/src/main/java/usecases/eventdecide/DecideEventOutputBoundary.java index 9c2242f7c..6c1b5e2a9 100644 --- a/src/main/java/usecases/eventdecide/DecideEventOutputBoundary.java +++ b/src/main/java/usecases/eventdecide/DecideEventOutputBoundary.java @@ -12,7 +12,7 @@ public interface DecideEventOutputBoundary { void prepareSuccessView(DecideEventOutputData outputData); /** - * If the decide event is invaild, example: is on day 61? did player already lose? + * If the decide event is invaild, example: is on day 61? did player already lose?. * @param errorMessage message of why is invaild, for the player. */ void prepareFailureView(String errorMessage); diff --git a/src/main/java/usecases/eventdecide/DecideEventOutputData.java b/src/main/java/usecases/eventdecide/DecideEventOutputData.java index def7014f3..086790089 100644 --- a/src/main/java/usecases/eventdecide/DecideEventOutputData.java +++ b/src/main/java/usecases/eventdecide/DecideEventOutputData.java @@ -9,13 +9,13 @@ * Usually, is a empty list, but as we add more event, is expected to be more. */ public class DecideEventOutputData { - private ArrayList events; + private ArrayList events; - public DecideEventOutputData(ArrayList events) { + public DecideEventOutputData(ArrayList events) { this.events = events; } - public ArrayList getEvents() { + public ArrayList getEvents() { return events; } } diff --git a/src/main/java/usecases/eventinitialize/EventInitializeOutputData.java b/src/main/java/usecases/eventinitialize/EventInitializeOutputData.java index f8f445058..9caec14ee 100644 --- a/src/main/java/usecases/eventinitialize/EventInitializeOutputData.java +++ b/src/main/java/usecases/eventinitialize/EventInitializeOutputData.java @@ -9,20 +9,25 @@ public class EventInitializeOutputData { private String description; private Map choices; - EventInitializeOutputData(String description, Map choices) { + public EventInitializeOutputData(String description, Map choices) { this.description = description; this.choices = choices; } - private String getChoice(int key) { + /** + * Get the choice for key input. + * @param key key, in number + * @return String of the choice representation. + */ + public String getChoice(int key) { return choices.get(key); } - private String getDescription() { + public String getDescription() { return description; } - private Map getChoices() { + public Map getChoices() { return choices; } } diff --git a/src/main/java/usecases/gamenewday/NewdayInteractor.java b/src/main/java/usecases/gamenewday/NewdayInteractor.java index 204a4b808..3e22d6a93 100644 --- a/src/main/java/usecases/gamenewday/NewdayInteractor.java +++ b/src/main/java/usecases/gamenewday/NewdayInteractor.java @@ -48,7 +48,7 @@ else if (success) { } } - private int[] incrementresouce(StringBuilder messageBuilder, int people, int score) { + private void incrementresouce(StringBuilder messageBuilder, int people, int score) { // food gain final double foodscalar = newdayDataAccessObject.getLocation().getfoodresourceavailable(); final double foodgain = people * EntityConstants.PEOPLEGAINPERFOOD * foodscalar; @@ -81,7 +81,7 @@ private int[] incrementresouce(StringBuilder messageBuilder, int people, int sco newdayDataAccessObject.setScore(newscore); } - private int[] decrementresource(StringBuilder messageBuilder, int thrift, int people, double temp) { + private void decrementresource(StringBuilder messageBuilder, int thrift, int people, double temp) { // food loss final double basetemp = EntityConstants.DEFAULTTEMP; final double tempdiff = temp - basetemp; From 59f41bacc8b566b8bf4694857ae6a82f1f8f6da8 Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 30 Nov 2024 20:23:38 -0500 Subject: [PATCH 075/154] change signup view --- src/main/java/view/SignUpView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index 736dd53d8..ec9d1cc47 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -20,7 +20,7 @@ public class SignUpView extends JFrame { private JLabel againLabel = new JLabel("again"); private JTextField againText = new JTextField(); - @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) + @Suppres sWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public SignUpView() { super("sign up"); final Container contentPane = getContentPane(); From 85dd82fafa764b2e846e7ec674f919d988c34d3e Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 30 Nov 2024 20:31:31 -0500 Subject: [PATCH 076/154] add Character Creation view --- src/main/java/view/CharacterCreationView.java | 183 ++++++++++++++++++ src/main/java/view/GameView.java | 80 +++++--- src/main/java/view/MainView.java | 2 +- 3 files changed, 232 insertions(+), 33 deletions(-) create mode 100644 src/main/java/view/CharacterCreationView.java diff --git a/src/main/java/view/CharacterCreationView.java b/src/main/java/view/CharacterCreationView.java new file mode 100644 index 000000000..f529d1da5 --- /dev/null +++ b/src/main/java/view/CharacterCreationView.java @@ -0,0 +1,183 @@ +package view; + +import javax.swing.*; +import java.awt.*; +/** + * Character creation view. + */ + +public class CharacterCreationView extends JFrame { + private int points = Constants.TWENTY; + private final JLabel pointsLabel; + private final JLabel socialLabel; + private final JLabel luckLabel; + private final JLabel mobilizationLabel; + private final JLabel thriftLabel; + private final JLabel generalshipLabel; + private int social = 0; + private int luck = 0; + private int mobilization = 0; + private int thrift = 0; + private int generalship = 0; + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings", + "checkstyle:ExecutableStatementCount"}) + public CharacterCreationView() { + super("Build Your Character"); + + // Set up container and layout + final Container container = getContentPane(); + final SpringLayout layout = new SpringLayout(); + container.setLayout(layout); + + // Points Label + pointsLabel = new JLabel("Points: " + points); + pointsLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); + container.add(pointsLabel); + + // Attribute Labels and Buttons + socialLabel = new JLabel("Social: " + social); + final JButton socialButton = createButton("Social"); + container.add(socialLabel); + container.add(socialButton); + + luckLabel = new JLabel("Luck: " + luck); + final JButton luckButton = createButton("Luck"); + container.add(luckLabel); + container.add(luckButton); + + mobilizationLabel = new JLabel("Mobilization: " + mobilization); + final JButton mobilizationButton = createButton("Mobilization"); + container.add(mobilizationLabel); + container.add(mobilizationButton); + + thriftLabel = new JLabel("Thrift: " + thrift); + final JButton thriftButton = createButton("Thrift"); + container.add(thriftLabel); + container.add(thriftButton); + + generalshipLabel = new JLabel("Generalship: " + generalship); + final JButton generalshipButton = createButton("Generalship"); + container.add(generalshipLabel); + container.add(generalshipButton); + + // Back and Start Game Buttons + final JButton backButton = new JButton("Back"); + final JButton startGameButton = new JButton("Start Game"); + container.add(backButton); + container.add(startGameButton); + + // Layout constraints + extracted(layout, container, socialButton, luckButton, mobilizationButton, + thriftButton, generalshipButton, backButton, startGameButton); + + // Button Action Listeners + addListeners(socialButton, luckButton, mobilizationButton, thriftButton, generalshipButton); + + backButton.addActionListener(e -> { + dispose(); + new MainView(); + }); + + startGameButton.addActionListener(e -> { + dispose(); + new GameView(); + }); + + // Window settings + setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + } + + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) + private void addListeners(JButton socialButton, JButton luckButton, JButton mobilizationButton, JButton thriftButton, JButton generalshipButton) { + socialButton.addActionListener(e -> updatePoints("Social")); + luckButton.addActionListener(e -> updatePoints("Luck")); + mobilizationButton.addActionListener(e -> updatePoints("Mobilization")); + thriftButton.addActionListener(e -> updatePoints("Thrift")); + generalshipButton.addActionListener(e -> updatePoints("Generalship")); + } + + private void extracted(SpringLayout layout, Container container, JButton socialButton, JButton luckButton, + JButton mobilizationButton, JButton thriftButton, JButton generalshipButton, + JButton backButton, JButton startGameButton) { + layout.putConstraint(SpringLayout.WEST, pointsLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, pointsLabel, Constants.TWENTY, SpringLayout.NORTH, container); + + layout.putConstraint(SpringLayout.WEST, socialLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, socialLabel, Constants.TWENTY, SpringLayout.SOUTH, pointsLabel); + layout.putConstraint(SpringLayout.WEST, socialButton, Constants.TWENTY, SpringLayout.EAST, socialLabel); + layout.putConstraint(SpringLayout.NORTH, socialButton, 0, SpringLayout.NORTH, socialLabel); + + layout.putConstraint(SpringLayout.WEST, luckLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, luckLabel, Constants.TWENTY, SpringLayout.SOUTH, socialLabel); + layout.putConstraint(SpringLayout.WEST, luckButton, Constants.TWENTY, SpringLayout.EAST, luckLabel); + layout.putConstraint(SpringLayout.NORTH, luckButton, 0, SpringLayout.NORTH, luckLabel); + + layout.putConstraint(SpringLayout.WEST, mobilizationLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, mobilizationLabel, Constants.TWENTY, SpringLayout.SOUTH, luckLabel); + layout.putConstraint(SpringLayout.WEST, mobilizationButton, Constants.TWENTY, SpringLayout.EAST, mobilizationLabel); + layout.putConstraint(SpringLayout.NORTH, mobilizationButton, 0, SpringLayout.NORTH, mobilizationLabel); + + layout.putConstraint(SpringLayout.WEST, thriftLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, thriftLabel, Constants.TWENTY, SpringLayout.SOUTH, mobilizationLabel); + layout.putConstraint(SpringLayout.WEST, thriftButton, Constants.TWENTY, SpringLayout.EAST, thriftLabel); + layout.putConstraint(SpringLayout.NORTH, thriftButton, 0, SpringLayout.NORTH, thriftLabel); + + layout.putConstraint(SpringLayout.WEST, generalshipLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, generalshipLabel, Constants.TWENTY, SpringLayout.SOUTH, thriftLabel); + layout.putConstraint(SpringLayout.WEST, generalshipButton, Constants.TWENTY, SpringLayout.EAST, generalshipLabel); + layout.putConstraint(SpringLayout.NORTH, generalshipButton, 0, SpringLayout.NORTH, generalshipLabel); + + layout.putConstraint(SpringLayout.WEST, backButton, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.SOUTH, backButton, -Constants.TWENTY, SpringLayout.SOUTH, container); + + layout.putConstraint(SpringLayout.EAST, startGameButton, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.SOUTH, startGameButton, -Constants.TWENTY, SpringLayout.SOUTH, container); + } + + private JButton createButton(String text) { + final JButton button = new JButton("+"); + button.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + button.setActionCommand(text); + return button; + } + + private void updatePoints(String attribute) { + if (points > 0) { + switch (attribute) { + case "Social": + social++; + socialLabel.setText("Social: " + social); + break; + case "Luck": + luck++; + luckLabel.setText("Luck: " + luck); + break; + case "Mobilization": + mobilization++; + mobilizationLabel.setText("Mobilization: " + mobilization); + break; + case "Thrift": + thrift++; + thriftLabel.setText("Thrift: " + thrift); + break; + case "Generalship": + generalship++; + generalshipLabel.setText("Generalship: " + generalship); + break; + } + points--; + pointsLabel.setText("Points: " + points); + } + else { + JOptionPane.showMessageDialog(this, "No points left!", "Warning", + JOptionPane.WARNING_MESSAGE); + } + } + + public static void main(String[] args) { + new CharacterCreationView(); + } +} diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index dbcad68fc..371f347e9 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -3,13 +3,13 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; -/** - * Game view. - */ public class GameView extends JFrame { - @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings", - "checkstyle:ExecutableStatementCount", "checkstyle:JavaNCSS"}) + private final JPanel mapPanel; + private final JTextArea infoBox; + private boolean isMapVisible = true; + + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public GameView() { super("Game"); @@ -32,12 +32,21 @@ public GameView() { container.add(weaponLabel); container.add(actionAvailableLabel); - final JPanel mapPanel = new JPanel(); + // MiniMap Panel + mapPanel = new JPanel(); mapPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); mapPanel.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); - container.add(mapPanel); final JLabel mapLabel = new JLabel("Mini Map"); mapPanel.add(mapLabel); + container.add(mapPanel); + + // InfoBox TextArea + infoBox = new JTextArea("Information Box"); + infoBox.setEditable(false); + infoBox.setBackground(Color.LIGHT_GRAY); + infoBox.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + infoBox.setVisible(false); + container.add(infoBox); final JLabel infoLabel = new JLabel("Information:"); final JTextArea infoArea = new JTextArea(); @@ -55,7 +64,7 @@ public GameView() { final JButton rightButton = new JButton("Right"); final JButton eventButton = new JButton("Event"); final JButton nextDayButton = new JButton("Next Day"); - final JButton infoButton = new JButton("information (only brief info)"); + final JButton infoButton = new JButton("log"); container.add(broadcastButton); container.add(gatherButton); container.add(upButton); @@ -66,6 +75,26 @@ public GameView() { container.add(nextDayButton); container.add(infoButton); + // Layout Constraints + extracted(layout, dayLabel, container, foodLabel, waterLabel, peopleLabel, weaponLabel, actionAvailableLabel, + infoLabel, infoArea, broadcastButton, gatherButton, eventButton, nextDayButton, upButton, downButton, + leftButton, rightButton, infoButton); + + // Add ActionListeners + infoButton.addActionListener(e -> toggleInfoBox()); + + // Window settings + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + setVisible(true); + } + + private void extracted(SpringLayout layout, JLabel dayLabel, Container container, JLabel foodLabel, + JLabel waterLabel, JLabel peopleLabel, JLabel weaponLabel, JLabel actionAvailableLabel, + JLabel infoLabel, JTextArea infoArea, JButton broadcastButton, JButton gatherButton, + JButton eventButton, JButton nextDayButton, JButton upButton, JButton downButton, + JButton leftButton, JButton rightButton, JButton infoButton) { layout.putConstraint(SpringLayout.WEST, dayLabel, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.NORTH, dayLabel, Constants.TWENTY, SpringLayout.NORTH, container); @@ -85,9 +114,15 @@ public GameView() { layout.putConstraint(SpringLayout.NORTH, actionAvailableLabel, Constants.TWENTY, SpringLayout.SOUTH, weaponLabel); + // MiniMap and InfoBox Layout layout.putConstraint(SpringLayout.EAST, mapPanel, -Constants.TWENTY, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, mapPanel, Constants.TWENTY, SpringLayout.NORTH, container); + layout.putConstraint(SpringLayout.EAST, infoBox, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, infoBox, Constants.TWENTY, SpringLayout.NORTH, container); + layout.putConstraint(SpringLayout.SOUTH, infoBox, 0, SpringLayout.SOUTH, mapPanel); + layout.putConstraint(SpringLayout.WEST, infoBox, 0, SpringLayout.WEST, mapPanel); + layout.putConstraint(SpringLayout.WEST, infoLabel, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.NORTH, infoLabel, Constants.TWENTY, SpringLayout.SOUTH, actionAvailableLabel); @@ -120,31 +155,12 @@ public GameView() { layout.putConstraint(SpringLayout.WEST, infoButton, Constants.TWENTY, SpringLayout.EAST, rightButton); layout.putConstraint(SpringLayout.NORTH, infoButton, 0, SpringLayout.NORTH, upButton); + } - // Add ActionListeners to Buttons - final ActionListener openGameViewListener = e -> { - dispose(); - new GameView(); - }; - - final ActionListener openEventViewListener = e -> { - dispose(); - new EventView(); - }; - eventButton.addActionListener(openEventViewListener); - broadcastButton.addActionListener(openGameViewListener); - gatherButton.addActionListener(openGameViewListener); - nextDayButton.addActionListener(openGameViewListener); - upButton.addActionListener(openGameViewListener); - downButton.addActionListener(openGameViewListener); - leftButton.addActionListener(openGameViewListener); - rightButton.addActionListener(openGameViewListener); - - // Window settings - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); - setDefaultCloseOperation(EXIT_ON_CLOSE); - setResizable(false); - setVisible(true); + private void toggleInfoBox() { + isMapVisible = !isMapVisible; + mapPanel.setVisible(isMapVisible); + infoBox.setVisible(!isMapVisible); } public static void main(String[] args) { diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index 5e6cff7a5..af1849d29 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -75,7 +75,7 @@ private void addListeners() { // Switch to GameView when "New Game" is clicked newGameButton.addActionListener(e -> { dispose(); - new GameView(); + new CharacterCreationView(); }); // Switch to RankView when "Ranking" is clicked From 45013cb54f5c7d9e893b9114378534a00e675f63 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sat, 30 Nov 2024 18:57:00 -0700 Subject: [PATCH 077/154] Horde process Interface adaptor completed --- .../endprocesshorde/HordeController.java | 23 ++++++++++++++++ .../endprocesshorde/HordeInterface.java | 20 ++++++++++++++ .../endprocesshorde/HordePresenter.java | 25 +++++++++++++++++ .../eventdecide/EventDecidePresenter.java | 4 +-- .../AllowcateController.java | 24 +++++++++++++++++ .../AllowcateInterface.java | 24 +++++++++++++++++ .../AllowcatePresenter.java | 27 +++++++++++++++++++ 7 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 src/main/java/interface_adapters/endprocesshorde/HordeController.java create mode 100644 src/main/java/interface_adapters/endprocesshorde/HordeInterface.java create mode 100644 src/main/java/interface_adapters/endprocesshorde/HordePresenter.java create mode 100644 src/main/java/interface_adapters/startallowcatepoint/AllowcateController.java create mode 100644 src/main/java/interface_adapters/startallowcatepoint/AllowcateInterface.java create mode 100644 src/main/java/interface_adapters/startallowcatepoint/AllowcatePresenter.java diff --git a/src/main/java/interface_adapters/endprocesshorde/HordeController.java b/src/main/java/interface_adapters/endprocesshorde/HordeController.java new file mode 100644 index 000000000..743ead908 --- /dev/null +++ b/src/main/java/interface_adapters/endprocesshorde/HordeController.java @@ -0,0 +1,23 @@ +package interface_adapters.endprocesshorde; + +import usecases.endprocesshorde.HordeInputBoundary; +import usecases.endprocesshorde.HordeInputData; + +/** + * Horde controller, for horde process use case. + */ +public class HordeController { + private final HordeInputBoundary interactor; + + public HordeController(HordeInputBoundary interactor) { + this.interactor = interactor; + } + + /** + * Execute this horde usecase. + */ + public void execute() { + final HordeInputData inputData = new HordeInputData(); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/endprocesshorde/HordeInterface.java b/src/main/java/interface_adapters/endprocesshorde/HordeInterface.java new file mode 100644 index 000000000..1a4f34016 --- /dev/null +++ b/src/main/java/interface_adapters/endprocesshorde/HordeInterface.java @@ -0,0 +1,20 @@ +package interface_adapters.endprocesshorde; + +/** + * Interface for horde process which is on the game over page. + */ +public interface HordeInterface { + + /** + * Update the ui with the info provided on the game over game as summary. + * @param message message of description to what happened. + * @param score score of player get at the end. + */ + void updateUiHorde(String message, int score); + + /** + * If the usecase was failed, explain why is it failed. + * @param failmessage fail message. + */ + void failureHorde(String failmessage); +} diff --git a/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java b/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java new file mode 100644 index 000000000..45aa3b47c --- /dev/null +++ b/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java @@ -0,0 +1,25 @@ +package interface_adapters.endprocesshorde; + +import usecases.endprocesshorde.HordeOutputBoundary; +import usecases.endprocesshorde.HordeOutputData; + +/** + * Horde presenter. + */ +public class HordePresenter implements HordeOutputBoundary { + private final HordeInterface view; + + public HordePresenter(HordeInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(HordeOutputData outputData) { + view.updateUiHorde(outputData.getDescription(), outputData.getScore()); + } + + @Override + public void prepareFailureView(String errorMessage) { + view.failureHorde(errorMessage); + } +} diff --git a/src/main/java/interface_adapters/eventdecide/EventDecidePresenter.java b/src/main/java/interface_adapters/eventdecide/EventDecidePresenter.java index 13089815f..eac334167 100644 --- a/src/main/java/interface_adapters/eventdecide/EventDecidePresenter.java +++ b/src/main/java/interface_adapters/eventdecide/EventDecidePresenter.java @@ -9,7 +9,7 @@ * Event decider presenter. */ public class EventDecidePresenter implements DecideEventOutputBoundary { - private EventDecideInterface view; + private final EventDecideInterface view; public EventDecidePresenter(EventDecideInterface view) { this.view = view; @@ -23,6 +23,6 @@ public void prepareSuccessView(DecideEventOutputData outputData) { @Override public void prepareFailureView(String errorMessage) { - prepareFailureView(errorMessage); + view.failureEventDecide(errorMessage); } } diff --git a/src/main/java/interface_adapters/startallowcatepoint/AllowcateController.java b/src/main/java/interface_adapters/startallowcatepoint/AllowcateController.java new file mode 100644 index 000000000..ba13a432b --- /dev/null +++ b/src/main/java/interface_adapters/startallowcatepoint/AllowcateController.java @@ -0,0 +1,24 @@ +package interface_adapters.startallowcatepoint; + +import usecases.startallowcate.AllowcateInputBoundary; +import usecases.startallowcate.AllowcateInputdata; + +/** + * Allowcate point controller. + */ +public class AllowcateController { + private final AllowcateInputBoundary interactor; + + public AllowcateController(AllowcateInputBoundary interactor) { + this.interactor = interactor; + } + + /** + * Execute based on player's selected attribute. + * @param attribute string fromat of which selected. + */ + public void execute(String attribute) { + final AllowcateInputdata inputdata = new AllowcateInputdata(attribute); + interactor.execute(inputdata); + } +} diff --git a/src/main/java/interface_adapters/startallowcatepoint/AllowcateInterface.java b/src/main/java/interface_adapters/startallowcatepoint/AllowcateInterface.java new file mode 100644 index 000000000..72a95b0de --- /dev/null +++ b/src/main/java/interface_adapters/startallowcatepoint/AllowcateInterface.java @@ -0,0 +1,24 @@ +package interface_adapters.startallowcatepoint; + +/** + * Interface of allowcate point. + */ +public interface AllowcateInterface { + + /** + * Update the ui after executed with the given info derived from outputdata. + * @param point new point + * @param social new social + * @param luck new luck + * @param mobilization new mobilization + * @param thrift new thrift + * @param generalship new generalship + */ + void updateUiAllowcate(int point, int social, int luck, int mobilization, int thrift, int generalship); + + /** + * Failure message if the usecase is failed. (insuffient skill point for example) + * @param message fail message + */ + void failureAllowcate(String message); +} diff --git a/src/main/java/interface_adapters/startallowcatepoint/AllowcatePresenter.java b/src/main/java/interface_adapters/startallowcatepoint/AllowcatePresenter.java new file mode 100644 index 000000000..671b38860 --- /dev/null +++ b/src/main/java/interface_adapters/startallowcatepoint/AllowcatePresenter.java @@ -0,0 +1,27 @@ +package interface_adapters.startallowcatepoint; + +import usecases.startallowcate.AllowcateOutputBoundary; +import usecases.startallowcate.AllowcateOutputData; + +/** + * Allowcate presenter. + */ +public class AllowcatePresenter implements AllowcateOutputBoundary { + private final AllowcateInterface view; + + public AllowcatePresenter(AllowcateInterface view) { + this.view = view; + } + + @Override + public void preparesuccessview(AllowcateOutputData outputData) { + view.updateUiAllowcate(outputData.getPoint(), + outputData.getSocial(), outputData.getLuck(), + outputData.getMobilization(), outputData.getThrift(), outputData.getGeneralship()); + } + + @Override + public void preparefailureview(String failmessage) { + view.failureAllowcate(failmessage); + } +} From c6f02b0e109eacae538b8290636e8e1da0eff73c Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sat, 30 Nov 2024 19:31:08 -0700 Subject: [PATCH 078/154] Entity classes Constructor overloading --- src/main/java/entities/EntityConstants.java | 2 ++ src/main/java/entities/Horde.java | 5 +++++ src/main/java/entities/Inventory.java | 17 +++++++++++++---- src/main/java/entities/PlayerAttributes.java | 10 ++++++++++ src/main/java/entities/PlayerInfo.java | 11 ++++++++--- src/main/java/entities/PlayerLocation.java | 5 +++++ .../database/InMemoryDecideEventDataAccess.java | 11 ++++++++++- src/main/java/view/GameView.java | 1 - src/main/java/view/SignUpView.java | 1 - 9 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/main/java/entities/EntityConstants.java b/src/main/java/entities/EntityConstants.java index f4db74494..47fcd2df5 100644 --- a/src/main/java/entities/EntityConstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -44,6 +44,8 @@ public class EntityConstants { public static final int MAPHEIGHT = 100; public static final int MAPWIDTH = 100; + public static final int SPAWNXCOOR = MAPWIDTH / 2; + public static final int SPAWNYCOOR = MAPHEIGHT / 2; public static final int BIOMERADIUS = 16; public static final int MINIMAPRADIUS = 4; public static final int FIRSTCHOICE = 1; diff --git a/src/main/java/entities/Horde.java b/src/main/java/entities/Horde.java index 48f0cf8d3..b6386b1cf 100644 --- a/src/main/java/entities/Horde.java +++ b/src/main/java/entities/Horde.java @@ -15,6 +15,11 @@ public Horde() { this.duration = EntityConstants.STARTERHORDEDURATION; } + public Horde(int magnitude, double duration) { + this.magnitude = magnitude; + this.duration = duration; + } + public double getDuration() { return duration; } diff --git a/src/main/java/entities/Inventory.java b/src/main/java/entities/Inventory.java index 54557eff5..f0626d0b1 100644 --- a/src/main/java/entities/Inventory.java +++ b/src/main/java/entities/Inventory.java @@ -10,11 +10,20 @@ public class Inventory { private int weapon; private int people; + // Default constructor (no parameters) public Inventory() { - this.food = EntityConstants.STARTERFOOD; - this.water = EntityConstants.STARTERWATER; - this.weapon = EntityConstants.STARTWEAPON; - this.people = EntityConstants.STARTERPEOPLE; + this(EntityConstants.STARTERFOOD, + EntityConstants.STARTERWATER, + EntityConstants.STARTWEAPON, + EntityConstants.STARTERPEOPLE); + } + + // Constructor with parameters + public Inventory(int food, int water, int weapon, int people) { + this.food = food; + this.water = water; + this.weapon = weapon; + this.people = people; } public int getFood() { diff --git a/src/main/java/entities/PlayerAttributes.java b/src/main/java/entities/PlayerAttributes.java index 1c875c15a..450832120 100644 --- a/src/main/java/entities/PlayerAttributes.java +++ b/src/main/java/entities/PlayerAttributes.java @@ -31,6 +31,16 @@ public PlayerAttributes() { this.luck = 0; this.mobilization = 0; this.thrift = 0; + this.generalship = 0; + } + + public PlayerAttributes(int points, int social, int luck, int mobilization, int thrift, int generalship) { + this.points = points; + this.social = social; + this.luck = luck; + this.mobilization = mobilization; + this.thrift = thrift; + this.generalship = generalship; } public int getPoints() { diff --git a/src/main/java/entities/PlayerInfo.java b/src/main/java/entities/PlayerInfo.java index 3979ab20f..4ef5faefe 100644 --- a/src/main/java/entities/PlayerInfo.java +++ b/src/main/java/entities/PlayerInfo.java @@ -17,10 +17,15 @@ public class PlayerInfo { * Constructs a new RankingEntry with the specified attributes. * * @param name The player's username. - * @param score The player's score. - * @param daysSurvived The number of days the player survived. - * @param won Whether the player won the game. */ + + public PlayerInfo(String name) { + this.name = name; + this.score = 0; + this.daysSurvived = 0; + this.won = false; + } + public PlayerInfo(String name, int score, int daysSurvived, boolean won) { this.name = name; this.score = score; diff --git a/src/main/java/entities/PlayerLocation.java b/src/main/java/entities/PlayerLocation.java index 0392469da..76b1cb67d 100644 --- a/src/main/java/entities/PlayerLocation.java +++ b/src/main/java/entities/PlayerLocation.java @@ -7,6 +7,11 @@ public class PlayerLocation { private int xcoordinate; private int ycoordinate; + public PlayerLocation() { + this.xcoordinate = EntityConstants.SPAWNXCOOR; + this.ycoordinate = EntityConstants.SPAWNYCOOR; + } + public PlayerLocation(int xcoordinate, int ycoordinate) { this.xcoordinate = xcoordinate; this.ycoordinate = ycoordinate; diff --git a/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java b/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java index 81beab291..e4a559164 100644 --- a/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import entities.Event; +import entities.EventsDecided; import entities.Location; import usecases.eventdecide.DecideEventDataAccessInterface; @@ -12,10 +13,13 @@ public class InMemoryDecideEventDataAccess implements DecideEventDataAccessInterface { private final ArrayList events; private final Location currentLocation; + private final EventsDecided currentEventsDecided; - public InMemoryDecideEventDataAccess(ArrayList events, Location currentLocation) { + public InMemoryDecideEventDataAccess(ArrayList events, + Location currentLocation, EventsDecided currentEventsDecided) { this.events = events; this.currentLocation = currentLocation; + this.currentEventsDecided = currentEventsDecided; } @Override @@ -24,6 +28,11 @@ public ArrayList getEvents() { return new ArrayList<>(events); } + @Override + public void setEvents(ArrayList events) { + currentEventsDecided.setEvents(events); + } + @Override public Location getLocation() { return currentLocation; diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 371f347e9..69dd27e7b 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -9,7 +9,6 @@ public class GameView extends JFrame { private final JTextArea infoBox; private boolean isMapVisible = true; - @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public GameView() { super("Game"); diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index ec9d1cc47..7947c1e06 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -20,7 +20,6 @@ public class SignUpView extends JFrame { private JLabel againLabel = new JLabel("again"); private JTextField againText = new JTextField(); - @Suppres sWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public SignUpView() { super("sign up"); final Container contentPane = getContentPane(); From 095f2447bfbb47e60be07448881a398c077c40d5 Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 30 Nov 2024 22:11:29 -0500 Subject: [PATCH 079/154] change main view --- src/main/java/view/CharacterCreationView.java | 1 + src/main/java/view/GameView.java | 42 ++++++++----------- src/main/java/view/SignUpView.java | 2 +- 3 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/main/java/view/CharacterCreationView.java b/src/main/java/view/CharacterCreationView.java index f529d1da5..4ed3e9a12 100644 --- a/src/main/java/view/CharacterCreationView.java +++ b/src/main/java/view/CharacterCreationView.java @@ -19,6 +19,7 @@ public class CharacterCreationView extends JFrame { private int mobilization = 0; private int thrift = 0; private int generalship = 0; + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings", "checkstyle:ExecutableStatementCount"}) public CharacterCreationView() { diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 371f347e9..1e0655c87 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -9,23 +9,28 @@ public class GameView extends JFrame { private final JTextArea infoBox; private boolean isMapVisible = true; - @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public GameView() { super("Game"); + final int day = 60; + final int food = 50; + final int water = 30; + final int people = 20; + final int weapon = 15; + final int action = 3; final Container container = getContentPane(); final SpringLayout layout = new SpringLayout(); container.setLayout(layout); - final JLabel dayLabel = new JLabel("Day: 50"); + final JLabel dayLabel = new JLabel("Day: " + day); dayLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); container.add(dayLabel); - final JLabel foodLabel = new JLabel("Food: 50"); - final JLabel waterLabel = new JLabel("Water: 30"); - final JLabel peopleLabel = new JLabel("People: 20"); - final JLabel weaponLabel = new JLabel("Weapon: 15"); - final JLabel actionAvailableLabel = new JLabel("Action Available: 3"); + final JLabel foodLabel = new JLabel("Food:" + food); + final JLabel waterLabel = new JLabel("Water: " + water); + final JLabel peopleLabel = new JLabel("People: " + people); + final JLabel weaponLabel = new JLabel("Weapon:" + weapon); + final JLabel actionAvailableLabel = new JLabel("Action Available:" + action); container.add(foodLabel); container.add(waterLabel); container.add(peopleLabel); @@ -48,14 +53,6 @@ public GameView() { infoBox.setVisible(false); container.add(infoBox); - final JLabel infoLabel = new JLabel("Information:"); - final JTextArea infoArea = new JTextArea(); - infoArea.setEditable(false); - infoArea.setBackground(Color.LIGHT_GRAY); - infoArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - container.add(infoLabel); - container.add(infoArea); - final JButton broadcastButton = new JButton("Broadcast"); final JButton gatherButton = new JButton("Gather"); final JButton upButton = new JButton("Up"); @@ -76,8 +73,8 @@ public GameView() { container.add(infoButton); // Layout Constraints - extracted(layout, dayLabel, container, foodLabel, waterLabel, peopleLabel, weaponLabel, actionAvailableLabel, - infoLabel, infoArea, broadcastButton, gatherButton, eventButton, nextDayButton, upButton, downButton, + extracted(layout, dayLabel, container, foodLabel, waterLabel, peopleLabel, weaponLabel, actionAvailableLabel + , broadcastButton, gatherButton, eventButton, nextDayButton, upButton, downButton, leftButton, rightButton, infoButton); // Add ActionListeners @@ -92,7 +89,7 @@ public GameView() { private void extracted(SpringLayout layout, JLabel dayLabel, Container container, JLabel foodLabel, JLabel waterLabel, JLabel peopleLabel, JLabel weaponLabel, JLabel actionAvailableLabel, - JLabel infoLabel, JTextArea infoArea, JButton broadcastButton, JButton gatherButton, + JButton broadcastButton, JButton gatherButton, JButton eventButton, JButton nextDayButton, JButton upButton, JButton downButton, JButton leftButton, JButton rightButton, JButton infoButton) { layout.putConstraint(SpringLayout.WEST, dayLabel, Constants.TWENTY, SpringLayout.WEST, container); @@ -123,14 +120,9 @@ private void extracted(SpringLayout layout, JLabel dayLabel, Container container layout.putConstraint(SpringLayout.SOUTH, infoBox, 0, SpringLayout.SOUTH, mapPanel); layout.putConstraint(SpringLayout.WEST, infoBox, 0, SpringLayout.WEST, mapPanel); - layout.putConstraint(SpringLayout.WEST, infoLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, infoLabel, Constants.TWENTY, SpringLayout.SOUTH, actionAvailableLabel); - - layout.putConstraint(SpringLayout.NORTH, infoArea, Constants.TEN, SpringLayout.SOUTH, infoLabel); - layout.putConstraint(SpringLayout.SOUTH, infoArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, container); - layout.putConstraint(SpringLayout.WEST, broadcastButton, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, broadcastButton, Constants.TWENTY, SpringLayout.SOUTH, infoArea); + layout.putConstraint(SpringLayout.NORTH, broadcastButton, Constants.TWENTY, SpringLayout.SOUTH, + actionAvailableLabel); layout.putConstraint(SpringLayout.WEST, gatherButton, Constants.TWENTY, SpringLayout.EAST, broadcastButton); layout.putConstraint(SpringLayout.NORTH, gatherButton, 0, SpringLayout.NORTH, broadcastButton); diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index ec9d1cc47..bbcd30975 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -20,7 +20,7 @@ public class SignUpView extends JFrame { private JLabel againLabel = new JLabel("again"); private JTextField againText = new JTextField(); - @Suppres sWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) + public SignUpView() { super("sign up"); final Container contentPane = getContentPane(); From 5e9b02cf8657c8ab1e59c867d5326b75bfb6d0fc Mon Sep 17 00:00:00 2001 From: yitong an Date: Sat, 30 Nov 2024 22:31:52 -0500 Subject: [PATCH 080/154] change minimap to Jtextarea --- src/main/java/view/GameView.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 1e0655c87..abf67b38d 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -3,9 +3,10 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; +import java.util.Map; public class GameView extends JFrame { - private final JPanel mapPanel; + private final JTextArea mapPanel; private final JTextArea infoBox; private boolean isMapVisible = true; @@ -38,11 +39,13 @@ public GameView() { container.add(actionAvailableLabel); // MiniMap Panel - mapPanel = new JPanel(); + mapPanel = new JTextArea("Mini Map\nabcdefghijklm\nnuvwxyz"); + mapPanel.setEditable(false); // Set to non-editable + mapPanel.setLineWrap(true); // Enable line wrap + mapPanel.setWrapStyleWord(true); // Wrap by words mapPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + mapPanel.setBackground(Color.LIGHT_GRAY); mapPanel.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); - final JLabel mapLabel = new JLabel("Mini Map"); - mapPanel.add(mapLabel); container.add(mapPanel); // InfoBox TextArea From efe2608b49c89a0276f6a0e9f2e2a4b40699f237 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sat, 30 Nov 2024 23:02:26 -0500 Subject: [PATCH 081/154] Updated EventResponseController based on Individual Events --- src.zip | Bin 112951 -> 0 bytes .../eventrespond/EventResponseController.java | 50 ++++++++++++++---- 2 files changed, 40 insertions(+), 10 deletions(-) delete mode 100644 src.zip diff --git a/src.zip b/src.zip deleted file mode 100644 index 5b932f299ccde5704fa956de8f80a1b39d0733d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112951 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�$hT~iCwKJY9AspAE~EmvEmUl)@#z~A-Od!r4# zZebYtBbpuS!;8*C^naeyE#T~8KVu*TW8%v~H(J)D>3ogMUY7(rsC&VHH~Q7PwznA@ zQAxjSX}?tUdDRemG#wsc*egZ(j=;2uxn9Y+gPo@+gAQ}BwjhW0cD4=I_6LLkcRQoh zrz5sHcaq)F96;$NXsE5!HV%B0MK(DTpP6>j$`%+BfoVEv3*%J|_bruW+U00C+7H3f zAeOY`a2CAK(SCPhET2&)a{+^xnNdlmuT{SSVhCxr5PKtODgb@3kO=v$FQ-}KrE=q)VJWv=d*6O0djgs+PKIFVdm~bVe z_yRGO&{Y4bGb1u}4g}^;S0 z&o@g913%QD7=9_~L8wk;pbqo0_mz-%4)h(Qa_qsPj48uyrArc-@Xtw{4gu9lYqft_ z`dpDDskQIO6cHz>N9VsdY;egi%D>EfWY8DDEDGww*T47U=WStRBU^kmDF#`ZX<93Id;OqcYv0>|v&I zCyeQYhj)(PASAEpQrzEZWyl5j7bmvc3_lyC$;UaGq#g&R`JA#&IepZYy^U-+`na0$ zLT+nu5m!ulkzF$2ET$K<-jeldOAAkhwgUiHD-;cM`JLy$0X?z;zN+wHISbW_~n!u{Y4OWQiiR@*<}B*QYQ7#W&zO!Nd}v24&e!4t-w2?Xmyy$IjCCT zP*ov559gja-_@+DaVzlb5?;0>C$x|p>fM(4qz?xe0=|P_Rw4yO(wgLHiZ>;M`1{Qw zM6MVUg_(2ZK5ZiB%T_F9!XM10d&>g15=c1zK3@aQ4A~9i)VQ@kv(a&++Z8+-)0ey%k^bo(9&NUXYJ$=|;8Bla=Uh1toeY zeJ|Vn!*ItiJ1>Zz9xa8~5BCszHWEUF4PynB!z-dZ&^ced_t?Hpa($xr6WB>?SVl45 z0d^5_8+QLMAf4g{t=$+REH*;9A>?J^U86$G+=r}Rjaf%9elv7h#w#rm6JpR#Hy-pS zTc7MY!nNjnY%lwak4}%AYE3f?9d`r$!Zqe6J;!1X2cCjkzY_Qm@R;S)lgd9YhxwN8iYw0b2~$5<$4}56#!O%B z3nYQ6wBb7whaQiUKtKWraS2s7MTmTMVnR=VU zDge8Gsu+KD-rwZ#Zxweq#Ysv0E)aY|cW`i_Z2jeAhZq*J!3T!fCbN9VnnFfIP$Beq zE**!_$&j4D@S|g*O~L<~8Xwv(4+pQA7Cyg?)TG}0MyO`l5@w-G;eyPy*ijaKsU$#i zQ;-x|-Ksm=fgg`=zXyWbZ+?T*PrWWXDefexz&Q{)5$yxi?r@_jDwj#qi5;g#mxmls z78ue5$YvaYAFPwqcmv-!!#8KjHb&E$EVVNf7>6;_8cr;Th_9DkNGx;}t&WK5EV?u` zaCo)fU@^wa&jr$cntVixGQpP}Dg<-yT@!5qsn`K?DgsaIGILYTOva>k z-XmKBwMzy;zYnuSkjzQ=jzfjtcbNH++b@WZ{7$K4f z9Q`~M6X5`rka0zns~TTWpbkHx#|1n38`t^0OPgUuV|2RIqtE@_9BstvPlGuu*ZSd> z7jmzO-EMjD`wc722^Uy|UwOa4UbU;CrmVLefc#gA-zHxWaLNJnm(SX_1o-bg*R-Nq z|J8Bm88|pigkA;B*xfTi5HK@YOd6`+R166Ci50uL)jE2OH>k8IVFqN%QuD{LXYcy% zWK^*6D;iN|2l!ue3sk6fF9uTE`ZHj)DRn3iLl7zuI~Mk*9}Hk;%rl-wAw_@>Kz;PP z({EOnpv-GR>GzP8 zDDGDbg4g^ATonnQsl$r@!i74!~A@xrgrkXXcuEBE;ZAUoy7#A_$(0DQE*9pY% zZEKwP;?WQrbbDyi8qIki5mc!Jmxco;{^J)kaDL9oG3)Jl(=4F0l%L#XXcd%u#&R>G znUYm8^B&7Dx6*3&-_LPedw;*hNHtIks{zox0`xX?zA!*Q0)Ox7{nM9md*W|zZ}8j= zW^DJ5R$*WCdRBsFp8Ehg z-?mr|d1pTS;>OUtWq8`6WR-<8a9^Q+(yol%ow2@m_0)J}8l4y0LToE+_hAuPjE~u% ziZT|9hL}5d)`Tv?t;@Qv#6h?k@2P7ZEQl2-M>qrw9MnNK3c4ciFkMwnoO}|>mb)^W zjBuGHog6aPp6TtDdl8!33j^I#>Nj3*N{`2Hn<7FnV4ndSH~o@;@c2g0)Rxh!1G`%9 zCm)RQPEB$3ruYJ#q>{pRk#$|y>rI`Ih zh8vuUJE5Aezu=rCkEtzOK(MPKI;)HoghRc8R6M|O$*?MzE6-WlOzJ`zx?q{VkouKX zZ6`_A_z;HYSP7kHWDyL;JS8Nd2~&2D4(1nTyKs^~^T2l;CmfyecckA5z6+UaW_o3f zg3POSVQ^Bw%awZ)@nQ}bO640W!!k0YO|LHx!cE=cYeES!skK_Yd z3AYxTWb-Hm^z6*r@KIF3|mBB3R@5uIC14_PFk{h^rwxWV+`Uw_t8UC`qWL& z@nbE4gAz%g^OM^x%oSa%%S&k6GWmJHCu?lN9DyPr#ff@))5??Xr+;~-JAP1(Bu&)(y1=h(iqpng4GpXa`*T0J)uhPisy z=!-Z(<%2qs9g@AMku({i<={V69|JzG&H%vH2Xru&%9wG=iKZ5Lavw z_u1%#-pxy-;lB4nh_<-ID$RnN5Q;EE$~`BTF3Jh*5QZRj`5Rt=;kml?k{MugGGH}Bo#Ry7DkN2nF3gs}#x4aK_#){$GT<-_`- zZA@2e*pXKo;uVtUGrZ>eB4Qq7A0N-!;wW+@a_g=~4p3q{LlN!F4(Kq<38^xZF7nfI z9*N`m16AwJo<3~ahflTA4lBec#6oR7I0STwc2tNb)In`N)+qVc>Y}@6wPuUm%)m5b zBB^>XwD1S%2aGK3qBioYD^07-ocNu*R3OQ338KPd!$KjP16%g<;?XdctKgET1~^%F zd|@)%J4ze*kXk_1pHdBqAOT_xrD@d*`5qW8)|lAPjcXz((RWDdm&(j|*t1(Iy?lb^ zos3e;jP>~U4C?BMaNPDWLnBS)q+C^UFDC`?Pg@zHfZ;lX#y>|CXD~XR>E3hVBGbo) zK9G~zcw|FI>Qjg++2DTW>}C;t|K6@D2WtZ;LP=4Z;QbyU?5>~tk0zyw$+ zWwyzC^CzL(uaHT-rgh*&VX;>TS~~lVunx+yy21<~!~IqL4Q$z;%r!}{xTfn{h~da` zT4n?7--Rg^4?9YTHusup5nj_AY;l}yW_5bb8UpS|(@Dt7VvBk$J=XVsSer_W16`6NvkXHTX=G^QK?#@hEwfe zRtoQw4T6nFUr0{XL*+}R`xG8d5^j6YgOt1or(4YDay-q3!LV5EQ$3m@Id#AygM^Jo zwfhru6y|C@$c|%jl8K+ZF_AL`iC~7)aJJ6iFIBO3BN9{;!f_N_I@D}))F^z&Bw4tb z4XRbXcDrN}O3c$(jg@80w7_eu?v)qXnRXI&ic@{Kb&z#$mmJJ~QY(_?tH9=T^8@=f zy*+%{R=7p3gysfpdEZ55Cr#r^&IVsXCHkp#6)n(1{yiN}s}`@AXK4%V^?h}t!C)qj zBwkkvkK?r4SYd<>;auwMsj6-mWJ0C!(=jvklp6Sk#mzYgwDuE@ox6587>l@$ctVJ+ zRHTUc9TjBH#qjfu)dohKq+`FoQ#)*oWrT^+UgeSVGUYYpR~58&R4w?e`YNgD?pwF%hx(&r?>7=_t8EYx&-IecQ3s{699$S0SLP1u8n~$3?r!yTWn{2X zC6M5m^)r{lMD``E7nXuOb#&tdvEBKm5eHX`O5839PFqUcDb^1{}ijjp`QKEc$>Auk_NIShLgX)A4 zhB%VkVu&u&`V-Fa^Rg81Yl^Y6VMNFy0xKp2sP9yt2X0|;9os~c*nufPnLD!V07 zoa4Ze&#f^w6JMTG7CT*$9Z@I9SZT|18AW#8-=}5}v#;pi_}xSV0pBVoX#AY49Y$^@ zv^C(G%PkIFuf>PM@IN`GK_QXcHZEK`H#6m_!LEE6A)Q|vZ+*$3|5r8sZOO#EJKzgn zzw+(xj{^9&f9MwZtMC6?Z)c;J(SMELdk$-*7F4Ky%^27S)mnZ6AG`W4c*!G;1j zF@G5F{RY_o^u^#LCjn@1M_N5bvr!oY^T4Y$%aMhFH=Kf%+zq9rlHkXQ514LMaXy)3 zabzXl`@xgSdmpbp5TmNFrPwgzV3U4GX_?66bs^U!9g(uKDkr+!dbBqEWjk%2WT3T8 zIk|v8)Fpa|Nf7c7i0ts4gONdf$~0xlI@K&}Fla{719 zo5Le6BZ%)(L`H0`f0q#P=BYzM02q12{%uxh096lvh#|be%3HqUA4dEZDE+H5eqRNN z+fh1|f&u#n_4UH2!5`w|cXjt((C?*8@j|fEr)gNf!P-d)}wPqf);c|%CNIOlgjUyni;+?@D^9CUoI zSCW``xbln9@SHUishSZ}a+0wempHA2Y^PoSq>N$R zAVdo-nHo9wSZK{Sv%hq!Nw2^+`O%+TNm3grE_qsagS-jFOrE9#y^G)Ivy-`OKk!Nj6=?<>!DzEi}&}+Dh^!~88+s3d7|fVG*Q~8G!5+#YF#bclvbf@$*>%& zO?9V}24D9(Wz}qQ-*%MOlzlkifIq1|8(i+Td9|pr*bS6J08x4snzzNN4ZLFobS0;816h@3t~1M6uuVMFR+>c#-+mq5-nB3^;KtM$46jBv{cq_w*}a} z)Hh&4l-Y6j_>eg4m%evB9Qaoh5cICRIuUuD7~R{nWwTq2$GDERDm0k>A}nB>#(tO3 z7(E;d%+xdJ782B+CnF`%V6kJOyi!Nl0ktvmOf2}{e|o|xoRyg#+q;F}5(+8?K9#4O zvPnJfWea2QWFvb@yEhx(#+x+xUk59Ujy(yjJOR z5Mxo0WPZU!X#5Kg+5|ThU&tA{zyLgn6v^5xcjB%X-h*^`r_4-`&4h12^Z!ZqO*&v%D?J@j6cz) zYyhBs1@vvGm;YQTtY=^VSi0e8X=4Hy;P!j-=3n@Re=!O$GH&X%yIp7W$l=TU2E|^q|a*@`X#b1bWwYV zIdd_8>a^!tb56{dQPGCMT@dL9MuIyHayh;7N9&dT@v#6tDna{@_1UzQ=>h-r9M^s2 z@vI|5pF<$G=%hOI>Qj&y2d6H3^-0qgxR6zZyA{LnE7uBvMI$XZ2A6kQh5gV*U(Q~t zy-DyN8R@PMcwM&+qzLdv_F*U=P0v@#$h;@whRvER7XjjOp|mjw;?i>r+G#kfxLzlyt zlHNKi@F=Eai7y=(w-F6iTg^@sSrm!aH@OnYgA!0&HSEM~&)&T_u28IxEtx zMlBC!N4G-vrPKzd#=eH-mZfSLHiID&si`+s$I{{r*G|DL2ukdxX7xdF1oPIx-7aYlM( zULjS=zRDZoGB`Yk5yZkrrGL8TY#hz$r#+M%Gd6{_-n#G$ueCK-H33jM%GE5I z!!ICv2jm_sxNwRBs2vc5n$abJof0tKht`nmj{;K%jEM5Ie_ub&eg|dlv>>87lP+X3JqV0~V ziNkd4W>`Z8V=5QRol5Gx{?$g+9z#3Sox$x~d>h4eO7>_+!?%g8-}zQ52aior0Hv?w zy-n)_p!f9;FXn%z^{>3;zhJXMaoPMGBa+v8mF(4Y1LH9wLlBD@Ob|az$&X4?6RX&U z`q_SI%IDj0(WNx{7+!GiYG>o|FB~Q_wwD8JU2Wjqv-Er|`BnLl%d`}F5fbXgtQb|_LFovESVUmxRw$;W^uRsd=w@WdRVwD* zkb0p(h?f(&eY`wH4cmq1EI}vlfK}&TbV1L}k2mh_+2zVj$BXS`#TwrL6Oj!A zIj$%#ZB1(?%?F-eNvG;$LQBUEGA|OW^SMIW8Evt9F4bGN(c2-)BSByGBi!^s%-WR} z^M`H1SH5$PqiIgI)os3>qN;DuoLlSK31cLwfRtii{QMKP1-1e=In2?*jiMtw)57)= zVJX1?{yg(WH-bj5_&|FUWuCo0;}#YhiSs0f#;zzc!^{dxHrdOz2DnN3_Ri3bqsGWJ z^%wK1f_^e3b<(=#WE;f?RX_K96AGJQ$sotWhz9yN*7fZT9oZPo912hul(aT}+Nt`c z<7)Gez69sXerjuS|A7N6+qL57vtPhBhkSv-Yn)n$b=LeZ&1s1+)dIcVrD>xF6H^l^ zQ6}jcKT=o-Z@RJQlCO;-DVir0ewLl&+|MF90P5msaBd+gYE)YD(jzHKL zOx9ocw52~H5RRw`TN$w7h-PDHGPfRZf%CaIBQ8f^R_uOP zd!CRsM=^{aWKK0zIFls)1(pVm2a`pWH=BLPi28EY=IH!_K{yEc6eKxm8V*6V50`T) z#B-}}&AOM#VF>O|Hq039sJ2(<4{1UioX;L+FL4^SqU0mWSf47Bad9AaD6G&PmHp!r zLn3JRki$OX#vMQ1iVPh@NO?VX>|}r%DD6OOnOLDFVU*drKwCA{r3kv?hrO3|Yx2qd zLrftsWtL-4!vkEJ!02LT<4ur^4socPP$p@~$6G zy=I>#c$~s?5WGfskcxCSNl8FfJ>6{(>9!lywRQZ-toNC%_&n2_TT(?BE-JLDw76rz z#B63h9WuhXsYshKYWS32kxNvwG%uC&YBz?`_*gX2(I6TTg!)`(Ygl7mw`0Blt`a1a znbB?REI^&UUZA(H*6XI(KLp_ZU7h~PoBxaJ)h^dA4Mv1?<`zcj6ut^s&A6v;lsk<5 zz>%^_d>~n!3nWGUeO`s#wPku3i10CnsG5a1^dxr5R3!(BCQUnO zw=`hxmH7wNK{S&YFvRzhGv_V8g8k%Yzsvy1BzBmFk?NJ@F7)rUvF2?f9DH5&>w)(y z_(Vv|h3Plv7pv_tXqv%}d3NSaEwZS-pLXPRId>vgTbNm!(ErC) z-+#bDWZZugQ*-pw5QX0WSt6A#5FrVjkl*At94*YbYAO<)Mfso<&`@nk8JawwgzXA(o)t*Hu@O<^g186~_; z(IaU8^W)rB7g~&jnWVT}gs*gO$N(7``@4H{rzBZaM0_>S`05x#4;{P|c{~K!MTB2AOAt`|wV6l`tXy8cT(z7g z+QF6N`6+~_`MTo3g_eWEDA4mH6!XtKcr-xSMbdx6==9VEb`6+II8 z`q4!R(VMN#hUa&Ab-s?ycU1txuROlZa0TG>4?_Uome4=cDg6b>TG9VKsr$H_hc_u# zG`LcTo>#*0eIGJ-syz-`y9enam7jeqkoWV8x1dKiDxdn$7QaOFoIMN`79CGI!T_9> zNw)tjQhZN}3&Jh}D(t}*-T6ch3J9+$e6y?1NmLhnVr2D-G69NQ6}uq*{((ZHolx5m zE+{F`c*8>!m9Fq)g?2YL-TMaN<-Apq`^&tUBkG0zP4u;5E+H=owm;n0iLBq`t_mC$@tw>1N@V z%@%h~?)%>{cD`yxZf`rbV}NFSMfYvoaR6g_|F&fPO?N+0`CMk10qJS2vu8`ePxd|o zp+2$(8X6d+(W~F7vLe{Pq)|Z`{`q!w@oq66C0wyY>TE4z-NVIfxSv@Ev{FB9M16~eaEiaZovqhq@4X|drkOduf^eGpVdC?1&Bf-$mcJWpb)18 z$*OnKmv{>gs=rV)7W5_`f4L4sExJHP+#ASyRHqXzzvKLIHn#JvscYfV4G1l?U#ptK`xY(16%03ubUjSoPM!aSF27nh7ra&ctlp!Vr-~V z<)y0p%xwR~q1C|01g>g&g!Z;eS>9n5%zHD_2L&V@)|HyhcX!((ycen|@qC`iKTGsI zDa8B3kH(n7dH9K4+IM|&+WG5XRGQHIl_Wbkcmo2TfF7-`XzS+ErF#3_W8 zY*!D$|Ev~GRP_xoB`IjLM6_^i0jir91X_-7C?fAAPrRxG&J@wl>mdFZ_o8sPqm`Q9 zKyYyN?y#29ZycdD``a?{wq-uIP)8)L?H#1xZZ}?P7M2s@n)t$;o)<((O+16p0VD~2 z-6YJ%p6+w;C3aYHctvj0V%^Ar(P>wZzzqX^=L-g0i<2M(Hch$}V>vb<6|o%tLn_k*r?Q==`Bev=Yx0;& z#Vm}0aFm)+Gg9A&M^fJlN{*|9W13{J9tU4WaoPNI_#QMow^7A;7zc>vI}W2uw45;S zNKoF~FTFRO*1{-QCpCL&dwa3iaZ<_vvaNXA}|s;)CUT0QB-!h zT{HHQCpd7LIyLP}#DLa1TlgM6B}3C)0CAFD@zp*iQ??jE2Cw3U+?)`SoOj<4$)G0k z)*ctU?L5VrGR&rt1TWpcl4g%&^_U5Dle&;}8>gsf`ibS^H=3n^EiNhE#!1K8aEy~x z^hp>*L7`63k97WuKACKTJMl7LQV zB~OSeboKH=5$zsL%ohe2qiQK|Z3{;#!o0n?zqNQomLC9pF+z=h)^PH78s3zVfuE+!}Jk>YisxKE#Ko?UQD zQ5(Vh$pbSz1H~7+!Gs;A3%#gdRyjw3qg)5fp<2pVmxAv&zhwJkY>NbAZk--@#6x2u z1N;eJlr;YdTw91mHAg-Ti2#q&l<7leiIgTc07}(_o{Uy50 zf})>|HiNv1&=05?=<6|hsOq&LBi9I&EU}`rQp16(I&Mv6_A{7ovd8ZRrr7AnV zk+`e*(N#p8O@2IOhb}~5fae*?vYPxC*Q95Rs@+P3Lv2J%G271!nQo8~yrweQUHEmS$vz{B|ysT4~+`H7Ypgz+vphr z)_ptD^Z)0c{-!;xP+E=x?34A{r!M3IPlC5p;gZWg11#~HaV~q`V7@NNA3fI5-R;oy0aPvdTA0anJSkK=^JoOzNgUYnBnt$coaS&<6#lj;D! zg)54;@%yA@bMU~;Acdp$Ayc|p?>Y7Rglg_mY6CPKb^p}b!CpPYAX|DkDhxTC@&glA zC?lsq7~G1O_k-;-bg1}z2@DmR_gFi?va?`Kii%lB=x4KERwBnx1;J5nG&(x2tEO)_t<<6z?k zxb#|n6)^jrnuXCYR@N&ouE2nKr#N(TLnKh(8qpE*WruM?CSoXqzAQOyPz>sk{fCBG z3!dtS(-ShyJTo$I|I)!LL%H_t6B1eM6D0AFODtGd zvWGI=&1r>|#;{L~|5zX;Al?kJJiN#Qbo<=Cb>|n&vjw}&MrRYCq3>xLvv*NQBk@v_ z%4?rB#h1KJn)B}1sLO98q#?W}^o}>Om3|iYex0KKLA=k=5nPQ#DeeaSbLbP1NU&EH zBKFU0-R}XksoF1w{u}nZwc0G)bJ=S{%_(2=&8QC-wVfUD5ph*m-Dc10t1a@IO}<4P z1&$Y^w8eAgm)U@=C~6>dhCQMd;M}@;?+=@+V>J>}6weZT0K@;#_pX8Fpt=6RPZjO` zE~cQ6scqX~mb=ey0jvCqV>1g7u2(U7Tfl?>;`fJy!(R*7-(4SJ^j`z(dx#B95huZw z7^)qB+3c2~L`zvH6+>F%^YfuD^wqq*pFzWzox!|GJ`+a*O47f)vycs1REkJUXWp=# z@pqZTsv=#&RyXLr2BXG?M?x3MmSFw0mkUO5I@Cx3bp%Hym%)t)kux2wii_ZavNrY0 zKx8vv%2uILCQVu@-=8Na?x5Or-Q=4!Z}>d;LNIrF&lKd#L>9QwQM??AX=v?TRHkK_ zi$)E($M1)hynszj9l+s##p!JXl>jGy$Swa7!T;~Kv{fWvc<}2+R_=b9L~z`$uSC|G z$KXLsyao!X&gT4ZE=@v;vd`8`=bbikYt^JsnI!I4Zjs`MiN`fjYy<%mwUWFLCI+Aa zkr9(W5xx@tk}ZKR$rPzYVpUWZi@|9RzJizXQ#kqr)~8x@HUt*QRJ_?E{pF^t4Iydk z7g&emOYW+&*{5TLuL?XmUYox-W53#cVA0UnvJX8=G8Vy2Uv!S#f_~NL>+P_X`2e_H zL3tZ45Wsc(Lp|4D!SxSfM~SgDuW7}gTdqKnubXGUsP1c$f*^8!rV6OLpKL$?1Z$vPybO~eHL7gc9TkH%E{U86gnj*|7RsE=C8 zPHyPoCybEA%e_EN4Yc6g5^TfJ z`!13bliT|0@}k0km`f4)*6_CpNL4$)*%KD;GC>$dv4T5|40^NNi*)tUjNQ$Vt`>e= zN6%M+*_-WR7NfZH+H8ULMXz{5`L^Ui7HYY7W60>f$b> zF()nWmQh6%6C;cbDM($aG|30V4Nu`@WL|u37d-VukWz3Aw@QVqyv@(6BiCyc%r($p zU=|<`{dvRvZ0+%PBpD30ov_YTkXK82W`x-$u?&Oe-?3n?33pfdxw=;Y!e;S}rW+L6 z%LrU{3|D+(jB|9oX4GBXi0-zT>sr;PIOs}rzk=pUmN*1VfrYqO`A>@;DnHnjKOxF+ zGr_Yq*Bg;(d=Znc?09h0GUl?M(KG_5IbJNioR8;71kw|(5nM^qGvqv)gBN(+|-t9*8u}gG{_TZdBV@1`HAHYn+Mrr z)|F-(E2)b&DTR{X*Rx`WdIycWtJ*UmG1-G=`qhyYD=UcEu1SkieFr7?%OREwBUlg$ z+LfV3J4h4^BYC&Cq)gYK4lNt><0Bf_ZJ^ndZJoGl8P$dY*q%af9eHr3_+d|i5Mclb zSl}e-lY)KS`zq{U;)NbU#;rRG2}8n|P>cJ{)ah)4<1pMMv?ySr_}l6aE{a0^S)bHu`MxWAaSPNF&+ujqpjt?Q zE338=e6q?EB|6n&?s_r5kLS|5wM}NvH9T#5W{%2+^W%4O%LNMV-0R$yy5L!_l6mEV zew3R>*Q1%QVp)Ph;Mm}&5~(fLZ*t0K6-v3n^z>-epBjK3C~~V=KV2WE?wj(Kh8%)V zX&P=t$M+E(z_%cT z8#rcZ51a2GR@g&g#%4lP&3x!8xl4kIs~iQz9X%@LE~AsyZS1^J&utUCJC*v~Hc~ve zOLg#kijvHSYcI;Fn>W~ITAfqdbw}fSc2B=)huXV6YVU60=_S9=F*K$BdbIPTvQ%A^ z+F9eqO-8cHaw^#eZd_$kHTI65s!C*%d#*ax5)_b-`@x%!Ps1pcVKZ+1(Dcj4r z<`#<&zHR+vY;HLBZgHWEB|;%q5U37P(8{X22qp*D%3EPxx!#WKqE>BG5+7yhB+Z#x zt6-1O%St+WHU*kUX$}AD2grr(?E9*f)#C%y%+1vjSu`(^3Z-XdXLV48ofzJHmJJd0 z7Hl( z{jqKP-2+lS9?_pDx1D`>Or+;LYq!)FmU{zIqxNj@G;-e9xENDwN%4s^Ai9J(V6$zFz$p`fckG`Cc5hgLSuMHwRDbe}EsF;k5_+0(zGszM5;W3V_VAUe$LdRA$n|mV} zrvxPDEJbop7IQwY8cHR#71!I(%kyBSX?*j(sMx!Kxk8tUEw`Mk)(SJj?;IEJy54QU zty*7jcQ)@og^K39-o%+7AHrg|?2k+zIa zi-oCH4C8#x&$>m0+~-+JV49E-u56x2ua^tVb#}Bh9eP7!k)PB&qCv97Fh3okW@bKl za^G}8r8xIo{)xlBx!1TaipZu;-xDJG*B*q8Ete1vI> zbp%&lKwA(kd(W=E`jaiS=WnHpz2e=af3z#ZHuHJP?v{u4!f|z!Gc_z>B%imxxJ;vO zS^Q&AoJ{BqeblgoFdv)WIHhbM|rm}V-emBoOoee(q$e!n&&tyj%Pq^HR4)qC*Vdf5lp6|yE zqnN0DsmfA9&(GGfbDd6g4zX$ya@)`lDk&q?a6aR6p+Mel&w~~ew~rju5)#OpCXSZA z=~v;9b92Kv>Q?7aZU>ii(@#h-gmYK!OFhvU~doD^x%8?mzQ+fEOIYbu&ZN?hD;@um_l5WOsU}s|1eF^M+l(73rg+WFc7z>%d9|>E!J&7^wvDrM z=z3Y}tCLB(n~(P$KKS28hbpG<@#`8*{bEL!ztSh>Nz!D$-Fu;>$@c7t7<+Z1xcRdg z6&uo3SQw6;>F~<;-vNQ= zmyw?Yp1zpO6k(v4V7nGhWI#MY^M$hb(YuQ9D*?1)^p+|{1@2)FZbT2zek|Ee!VnkD0Mdgju;%OTgLOXZVO%CsZa_>=5dhZ<|ql4UVWe2qfy~`>G8vot(V^`GQ z7h_~w#Y`RCZB$jdQL4xj|IEJode6=$UzMM)NC{DYIKvc28W#5cQ2p+v!*?QdbhUaX z_$)e$H9Lg^xTbc>o!e^CN-u=eG0SKQHoxZ+w9l(5qVGeWSiHdj$=6=7Ir*vI%FcP{ zjM`HYIxO6{@%VlD(WH$vd$^ zG}C92lEd$B7A2?eY*jAvO|N@4q!@0l&Sza77M>y@Q`T!}BHpfU>EXljl1uQAk-@+x zx!qX~ua!QDBy$(Y5GX2g_Zzjn?U;>!IF|i7<=f)952;5w-hBik9f;GF*}e=uS!Egp z4ck~PA~uRq0x2}5^vn^NeJoOOgmpwLlvm8Zv|U5WG!@#P3L$p(v=7~y(xp43*1UI9 zzN5gwmdZ=pZUwPjeh@oRIc}}o?M}o9HX3cQp!W~7)}18GiEG=OAAEWHe%H`RqWl&) zPSHzuT%?5NytqgnZT{pY&RC|5qM zFfCqBfy21hy{o6lLSK4@*Lw5C0S*uT&mF$w@1FRkl>~Sl6`PTpw5eN6lO_g2=Enf> z5WOoCZwEe6!b3aihc-Sq*_)YLT3EW8yVy9n**H4zszd)F{pUZ>jW^MBP3}?UP^n6K z^m~{%_kl6|XFEJq=Fb+~z8Tiw_P~d4zT}Q+V2114Yu@}@rfA3|O`B>ei_3Qu6A5Zp zzA@k|w0odPqnFMcbcS;K25#zL*Fj0!+LU1;rh;a{%35|O0hK^8E7Ja_nRyIuL3K{@ zjQtk$HI@WNX{1FQN4Yl0jTZ{uO_~%UEBbN0+0#w@XlondGqqSbk^9aQoeemIm|B^`H1Me+jvS(i9%v|(iTrsq?3{R&TP#of&Ojk@ zM#ia=yydJ5T;RY{u;eKd9C+Gzb#Vu*0L@Eo(fvutoMHC=zU|WqXHPlLF-W}SkR+Ek zpG7QQeW* zQ)esjS^S?M?-^vb?-n-R9X#v#Hs4@KiSNk_v2qP>DT`B2%OpBAY*I(`STsgN_{dzCHvLoa%U4|ByBY0C)Bx~Z?#C|jz6vQHja_nK7Q=H^j-O5 z8dt(N4P@daS)IGIuC~qPFbf$sg^E7r^pqF+&=dc~a$zEUNAhjFrUMjy0vh@akQ|PbAHh< zW2*|H-vZ_#j#p-%2lQ}iII_Q5u>uY8?wU$b;3mV)LFxiReT^A>t487%$+0~IG$j|} z$D;E)FI!i3=3U!-4S2p>z3$W!E+sBn2} zl9Vdn?6AQ9Nc@9|LI}T+9oQ>#;Ax}{;#?&Di@Y8kdH(N8fsM5br`SK5z1vZe$<)p* zYHG1@n56C`8+H59xNowzPTeo3tni!s+Snf%LZGicOv9CVaH{E?SfbFO z*ofvPEyfwInSyiQ^G}`mD9V*BsL{GPIhcS%kayo+$1>wuo;QKM^x{1H*`s)gxa*Lt&dxh%^vP92${?Se$Jlv2v2$mSa2vfh}C;5&i^skz3*K;(|Bjelri78|v zafDKUG{^ab7$tYnCA;sRyGAsh?d6r?{@&U2pS}HaeUs_&9XX?gT4wAg>;?@kd|TL3 zr&*IbatO+DS|vCV&H?Ly>|kXJNd%v+awsuI;eVAiVQ38Gbc~YiVpl9GvyX~Df`acV zB}e$M%elhW=I7gNQ=>UK`bJ{KoR7rFGV8mwW@|EkS7f`fyCq(jQSOR}GP2#Nsqx%! zWlH=|iE3)aJqmX7n0Mq=G%n>r;U*QE4DY<6-7v^6*QCdK;o?DhU46RwXAdo&)wPF- zFiYztIs4xxRq0euH$OMU9dG9HE#1{7F@fmtkGn#Lqf4%Op3}ejN{2DIOuizlrg-*Q z&2)4JZK}9RTIN*snHd&!+CBi$PY(|@QuJeo-{wK(mOnS07<1o$e%_sW{61UkaCBgS@&s9Eb!!3 ze#OhyH0amN)a0HbCGKj=5MpLhy}|v%_{pW9I00?p@)16MvTUxoH1f0jH5rmxLifQD zw;_TI>BaemVPP>-wlbz0ccl_ubtNsjo3ZDf=JvajWP-CNIq9!G^v#?r;=L}}n@U?= zNW59xOZm2UC)*G!F{6IHevj1%`A&+Pqqonyltl5HG74G=#Ls$P{fsxN9V$-ZOL{Zu z%th7L$9MIH2AU{NvLu#NI%M4BjYvHZ>${5}V^H6HW~8P4xcvU8Bh6l(e)ZiH&zW40 zOSk-JJ!U+)2YJ`NR>iv|=vKC{)$0qDY`j#&HLnsYCOstXct_fB2lWZ|96ESvoI7+j zoQ3SDmH&1_;7+Wd94!Xs|ZK0Ty6_e&_^;OBdyjHTT* zRz`_G{Lk+Fl(~7Mo0(jWVXoy)?&;cdQw;`B{u^v};u7^M*p|(BdwZ3pxs5uV#+Y*8 zJ7!bG6T6JE8EoDm^WvxSr9ujMlNlT4$7<7!D#Xik4^P_tthkUl4Tbgr2ZKmmneHc` z9<$2Pax2ljX6Av0^oz0O;A{@EkkKkW$&T)yDU@{Vgpl7pvX=CL#do#0I+>Ip3bN6dnH&Wg|5=a|MTykuH zKsSOI;S*uO;v-z4GEn$BpAA7(Rd2B8{>Pe~oNc`d&5QxNn?&*5XdB+l?Hq2pGVRkkODHm;lI!=A3m%wBdo5+~9;wipE2gWC?LNN+ctVZLudIWC`5 z9HSL9h)6?*UtqgyH`U^uwuJj($?b}q+S~X=(ZZz($s7ceRGPZu&+FvqL#_6WN z;LqZD*~crq*T*aRA@b_o9occl>6_T9M~p|rM)752cMU&2IH)p^eB$soaHS5Zpvj2F zU`oJZVYRrWeh$c)Jd@FlpzuQ+#D>wYt-)ZS3seP7U_q57$?qiT-MuFG3-|RMF3adD zRt*Ku)$^3}S01%6I2gsOI+|0@;pJ3ll1V>5#jRziex;slgrUE{`7M>@t<%FuqfO^k z!VUMche;6Wno=>6P%9vHNsP7ba9{ku-FaX6-V0s+vC?P8`zQElYiL8#f>`MKb_&rq zF~%wcA)XmX>6tSfC4bi3;`WtRqxr*d9$o(}vMT|VQ8o-4L_PMY2y)ap zpZEKdrcwv?k@|>Gq&Q3DEA^Q3ue4dWRz)mwL0)ckXgJX|lzo zFJ14n(~)li=jp|yTe!-ks<-UtaPs~zxs78x=L?-U$^Y4?S&1^-c{SwpV3)P`UTL~C z2gAvZL|bKI)=SM-PJN2n=@W4f;XM9HUMsn~n*B^zgPQ!%<7PHn55@E*r4s>&Zr#a{ z4@}|haXE3PO@_mNKuI25_2rAVfU7`Gv9h}y0#)c$4rE@*UC<5b(YcG(i>Rw$tKB5E z>s#5a-hs`EMg<8>S&A>po|uMI-Z3|r_7XWhH^OLseM4K;)aLTB?@{7eDPAn{vDC6* zg53QV`ZIWizE)?6GH#*S*~7oM*Us(tUb~IZUb{D9uQqxTmTjXBCL^OSuIJ)C!6--F z&vT>DIgxy~E?JJj!bh=<<(|{TV6WX9<#W(pJG?iA`Ya_eh{nQ+j~t`-E??U4rf-~# zb11%~G5AP@mCUXG-Fjv%7$!-cIAnTy>sj)g1 zJ34KJOWqbW{3(QfEj_Yt<27JK50J9X0{6HFOB9; zIv$yNB}Yck>DdLa_inCb@QI)@NKk(CG>J7J#A{GT^gr$oR@}X#=slp+sTH9pTvx!NwMvd<3nft9j#11R?eS77 z`@!`6tpu}b`BNqN4G(>PRI?RDytOM1W4uz7(o{-5UMetsx6aJst#g_C^tIipJ~v$| zZb|fA61iFBRMIx&S!j0J?VdTJbeKkO;qkr_lPCgjmIZzF8M0hOzij`-*>5C~C^xj# z4l<#Yjms36-YRPp&>I(4#k)JPkD%gRu}lOKUkIVpdW_JraK6*o0_&edc&Nnoocwq#+*6a~nof4P zXsYlH4q+Xs_eb64Z=LlUvhODwGo0kVPp18jo96IoRl8j@GS;LAN9viJQa%?Ua+3&2 zo+_!@p5W`xc|>(T$1UT<43mL>ANh1?W*KkSl}G%HSH}b?+$T$v&&`iHOy=kEXt&4? zJSLq=89$X;%~6`xknoKN^76*5Cz7CROdz^fR)irq%v%HxZ6$9dMW87

y&JwGQAu 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 M#{6b;eDK%*0UZ?~*Z=?k diff --git a/src/main/java/interface_adapters/eventrespond/EventResponseController.java b/src/main/java/interface_adapters/eventrespond/EventResponseController.java index 0b2a2df49..fd6341e13 100644 --- a/src/main/java/interface_adapters/eventrespond/EventResponseController.java +++ b/src/main/java/interface_adapters/eventrespond/EventResponseController.java @@ -1,24 +1,54 @@ package interface_adapters.eventrespond; -import usecases.eventrespond.shared.RespondInputBoundary; -import usecases.eventrespond.shared.RespondInputData; +import entities.Event; +import entities.EventAmbush; +import entities.EventFlood; +import entities.EventBlizzard; +import entities.EventTraderEncounter; +import entities.EventSurvivorJoins; +import usecases.eventrespond.shared.*; +import usecases.eventrespond.ambush.AmbushEventInteractor; +import usecases.eventrespond.flood.FloodEventInteractor; +import usecases.eventrespond.blizzard.BlizzardEventInteractor; +import usecases.eventrespond.trader.TraderEventInteractor; +import usecases.eventrespond.survivor.SurvivorEventInteractor; /** - * Controller for handling event responses and converting player input into input data for the use case. + * Controller for handling event responses using a single adapter. + * Determines the correct interactor based on the event type. */ public class EventResponseController { - private final RespondInputBoundary interactor; + private final RespondDataAccessInterface dataAccess; + private final RespondOutputBoundary outputBoundary; - public EventResponseController(RespondInputBoundary interactor) { - this.interactor = interactor; + public EventResponseController(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; + this.outputBoundary = outputBoundary; } /** - * Execute the interactor by converting player input into input data. - * @param choice The player's choice for the event response. + * Handles the response to a given event by selecting the appropriate interactor. + * @param inputData The player's input data (choice). */ - public void execute(int choice) { - final RespondInputData inputData = new RespondInputData(choice); + public void execute(RespondInputData inputData) { + Event event = dataAccess.getevent(); + + RespondInputBoundary interactor; + if (event instanceof EventAmbush) { + interactor = new AmbushEventInteractor(dataAccess, outputBoundary); + } else if (event instanceof EventFlood) { + interactor = new FloodEventInteractor(dataAccess, outputBoundary); + } else if (event instanceof EventBlizzard) { + interactor = new BlizzardEventInteractor(dataAccess, outputBoundary); + } else if (event instanceof EventTraderEncounter) { + interactor = new TraderEventInteractor(dataAccess, outputBoundary); + } else if (event instanceof EventSurvivorJoins) { + interactor = new SurvivorEventInteractor(dataAccess, outputBoundary); + } else { + outputBoundary.prepareFailureView("Unknown event type."); + return; + } + interactor.execute(inputData); } } From 37282167ee88a04f39523aa7e6d774f1af7f4f34 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sat, 30 Nov 2024 23:22:47 -0500 Subject: [PATCH 082/154] Update the InMemoryUnifiedDataAccess --- .../InMemoryDecideEventDataAccess.java | 5 + .../database/InMemoryFetchDataAccess.java | 25 ++ .../database/InMemoryGatherDataAccess.java | 6 +- .../database/InMemoryNewdayDataAccess.java | 2 +- .../database/InMemoryPlayerRepository.java | 66 ------ .../database/InMemoryRankingRepository.java | 45 ---- .../database/InMemoryRespondDataAccess.java | 10 +- .../database/InMemoryUnifiedDataAccess.java | 220 ++++++++++++++++++ .../GatherDataAccessInterface.java | 6 +- .../dailygather/GatherInteractor.java | 6 +- .../ambush/AmbushEventInteractor.java | 10 +- .../blizzard/BlizzardEventInteractor.java | 6 +- .../flood/FloodEventInteractor.java | 8 +- .../shared/RespondDataAccessInterface.java | 10 +- .../survivor/SurvivorEventInteractor.java | 10 +- .../trader/TraderEventInteractor.java | 8 +- .../gamenewday/NewdayDataAccessInterface.java | 2 +- .../usecases/gamenewday/NewdayInteractor.java | 6 +- src/main/java/view/SignUpView.java | 2 +- 19 files changed, 296 insertions(+), 157 deletions(-) create mode 100644 src/main/java/frameworks/database/InMemoryFetchDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryPlayerRepository.java delete mode 100644 src/main/java/frameworks/database/InMemoryRankingRepository.java create mode 100644 src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java diff --git a/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java b/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java index 81beab291..5ffd527d3 100644 --- a/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java @@ -24,6 +24,11 @@ public ArrayList getEvents() { return new ArrayList<>(events); } + @Override + public void setEvents(ArrayList events) { + + } + @Override public Location getLocation() { return currentLocation; diff --git a/src/main/java/frameworks/database/InMemoryFetchDataAccess.java b/src/main/java/frameworks/database/InMemoryFetchDataAccess.java new file mode 100644 index 000000000..93fd2167f --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryFetchDataAccess.java @@ -0,0 +1,25 @@ +package frameworks.database; + +import entities.Inventory; +import usecases.fetchresource.FetchDataAccessInterface; + +/** + * In-Memory implementation of FetchDataAccessInterface. + */ +public class InMemoryFetchDataAccess implements FetchDataAccessInterface { + private final Inventory inventory; + + /** + * Constructor to initialize with an existing inventory. + * + * @param inventory Player's inventory object. + */ + public InMemoryFetchDataAccess(Inventory inventory) { + this.inventory = inventory; + } + + @Override + public Inventory getInventory() { + return inventory; + } +} diff --git a/src/main/java/frameworks/database/InMemoryGatherDataAccess.java b/src/main/java/frameworks/database/InMemoryGatherDataAccess.java index 61a1ccfba..1df1fa30d 100644 --- a/src/main/java/frameworks/database/InMemoryGatherDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryGatherDataAccess.java @@ -34,17 +34,17 @@ public void decreaseResourceavailable() { } @Override - public void changefood(int foodgathered) { + public void changeFood(int foodgathered) { inventory.changeFood(foodgathered); } @Override - public void changewater(int watergathered) { + public void changeWater(int watergathered) { inventory.changeWater(watergathered); } @Override - public void changeweapon(int weapongathered) { + public void changeWeapon(int weapongathered) { inventory.changeweapon(weapongathered); } } diff --git a/src/main/java/frameworks/database/InMemoryNewdayDataAccess.java b/src/main/java/frameworks/database/InMemoryNewdayDataAccess.java index ca1a34bae..a900245d7 100644 --- a/src/main/java/frameworks/database/InMemoryNewdayDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryNewdayDataAccess.java @@ -20,7 +20,7 @@ public InMemoryNewdayDataAccess(PlayerInfo playerInfo, Inventory inventory, Loca } @Override - public PlayerInfo getPlayerinfo() { + public PlayerInfo getPlayerInfo() { return playerInfo; } diff --git a/src/main/java/frameworks/database/InMemoryPlayerRepository.java b/src/main/java/frameworks/database/InMemoryPlayerRepository.java deleted file mode 100644 index c9cd48ae2..000000000 --- a/src/main/java/frameworks/database/InMemoryPlayerRepository.java +++ /dev/null @@ -1,66 +0,0 @@ -package frameworks.database; - -import java.util.HashMap; -import java.util.Map; - -import entities.Player; -import interface_adapters.gateways.PlayerRepository; - -/** - * An in-memory implementation of the PlayerRepository interface. - * - * This class is used to store and retrieve Player objects in memory, primarily for testing - * and development purposes. It uses a HashMap to store Player data, where the key is the - * player's username and the value is the Player object. - */ -public class InMemoryPlayerRepository implements PlayerRepository { - private final Map players = new HashMap<>(); - - /** - * Constructs an InMemoryPlayerRepository with a predefined set of players. - * - * This constructor initializes the repository with some sample players for testing - * and demonstration purposes. Each player has a unique ID, username, and password. - */ - public InMemoryPlayerRepository() { - // todo - // Database import - players.put("user1", new Player("1", "user1", "password1")); - players.put("user2", new Player("2", "user2", "password2")); - } - - /** - * Finds a Player by their username. - * - * This method retrieves the Player object from the in-memory store using the specified username. - * If no player with the given username exists, it returns null. - * - * @param username The username of the player to find. - * @return The Player object if found, or null if no player with the given username exists. - */ - @Override - public Player findByUsername(String username) { - return players.get(username); - } - - /** - * Checks if the given username already exists in the repository. - * - * @param username The username to check. - * @return True if the username exists, otherwise false. - */ - @Override - public boolean isUsernameDuplicate(String username) { - return players.containsKey(username); - } - - /** - * Update the new player object in Hashmap players. - * - * @param player The object for Player. - */ - @Override - public void addPlayer(Player player) { - players.put(player.getUsername(), player); - } -} diff --git a/src/main/java/frameworks/database/InMemoryRankingRepository.java b/src/main/java/frameworks/database/InMemoryRankingRepository.java deleted file mode 100644 index 4b417a9a1..000000000 --- a/src/main/java/frameworks/database/InMemoryRankingRepository.java +++ /dev/null @@ -1,45 +0,0 @@ -package frameworks.database; - -import java.util.ArrayList; -import java.util.List; - -import entities.PlayerRankingEntry; -import interface_adapters.gateways.RankingRepository; - -/** - * An in-memory implementation of the RankingRepository interface. - * Stores and retrieves ranking entries in memory, primarily for testing purposes. - * - * ----------------------------Example for how to call------------------------------ - * InMemoryRankingRepository repository = new InMemoryRankingRepository(); - * RankingUseCase useCase = new RankingUseCase(repository); - * RankingController controller = new RankingController(useCase); - * - * // Display the top 3 players - * System.out.println("Top 3 Players:"); - * controller.handleRankingRequest(3); - */ -public class InMemoryRankingRepository implements RankingRepository { - private final List rankings = new ArrayList<>(); - - /** - * Constructs an InMemoryRankingRepository with a predefined set of ranking entries. - */ - public InMemoryRankingRepository() { - // todo - // Database import - rankings.add(new PlayerRankingEntry("player1", 100, 40, false)); - rankings.add(new PlayerRankingEntry("player2", 200, 60, true)); - } - - /** - * Retrieves all ranking entries stored in memory. - * - * @return A list of all ranking entries. - */ - @Override - public List getAllRankings() { - // Return a copy to prevent modification - return new ArrayList<>(rankings); - } -} diff --git a/src/main/java/frameworks/database/InMemoryRespondDataAccess.java b/src/main/java/frameworks/database/InMemoryRespondDataAccess.java index 0104b05d7..fc95b5f09 100644 --- a/src/main/java/frameworks/database/InMemoryRespondDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryRespondDataAccess.java @@ -24,7 +24,7 @@ public InMemoryRespondDataAccess(Event event, Inventory inventory, } @Override - public Event getevent() { + public Event getEvent() { return event; } @@ -44,22 +44,22 @@ public PlayerLocation getPlayerLocation() { } @Override - public void changepeople(int peoplechange) { + public void changePeople(int peoplechange) { inventory.changePeople(peoplechange); } @Override - public void changefood(int foodchange) { + public void changeFood(int foodchange) { inventory.changeFood(foodchange); } @Override - public void changewater(int waterchange) { + public void changeWater(int waterchange) { inventory.changeWater(waterchange); } @Override - public void changeweapon(int weaponchange) { + public void changeWeapon(int weaponchange) { inventory.changeweapon(weaponchange); } diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java new file mode 100644 index 000000000..212f5b0bb --- /dev/null +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -0,0 +1,220 @@ +package frameworks.database; + +import java.util.ArrayList; + +import entities.*; +import usecases.dailybroadcast.BroadcastDataAccessInterface; +import usecases.dailygather.GatherDataAccessInterface; +import usecases.dailymove.MoveDataAccessInterface; +import usecases.endprocesshorde.HordeDataAccessInterface; +import usecases.eventdecide.DecideEventDataAccessInterface; +import usecases.eventinitialize.EventInitializeDataAccessInterface; +import usecases.eventrespond.shared.RespondDataAccessInterface; +import usecases.fetchresource.FetchDataAccessInterface; +import usecases.gameminimap.MinimapDataAccessInterface; +import usecases.gamenewday.NewdayDataAccessInterface; +import usecases.gameplacedescription.PlaceDescriptionDataAccessInterface; +import usecases.startallowcate.AllowcateDataAccessInterface; + +/** + * Unified In-Memory Data Access Layer for managing all game data. + */ +public class InMemoryUnifiedDataAccess implements + AllowcateDataAccessInterface, + BroadcastDataAccessInterface, + DecideEventDataAccessInterface, + EventInitializeDataAccessInterface, + FetchDataAccessInterface, + GatherDataAccessInterface, + HordeDataAccessInterface, + MinimapDataAccessInterface, + MoveDataAccessInterface, + NewdayDataAccessInterface, + PlaceDescriptionDataAccessInterface, + RespondDataAccessInterface { + // Shared game data + private PlayerAttributes playerAttributes; + private Inventory inventory; + private ArrayList events; + private Location currentLocation; + private Event currentEvent; + private Horde horde; + private PlayerInfo playerInfo; + private boolean won; + private PlayerLocation playerLocation; + private Maps gameMap; + + // Constructor to initialize shared objects + public InMemoryUnifiedDataAccess(PlayerAttributes playerAttributes, Inventory inventory, + ArrayList events, Location currentLocation, Event currentEvent, + Horde horde, PlayerInfo playerInfo, boolean won, + PlayerLocation playerLocation, Maps gameMap) { + this.playerAttributes = playerAttributes; + this.inventory = inventory; + this.events = events; + this.currentLocation = currentLocation; + this.currentEvent = currentEvent; + this.horde = horde; + this.playerInfo = playerInfo; + this.won = false; + this.playerLocation = playerLocation; + this.gameMap = gameMap; + } + + // Implementation of AllowcateDataAccessInterface + @Override + public PlayerAttributes getPlayerAttributes() { + return playerAttributes; + } + + @Override + public void setSocial(int social) { + playerAttributes.setSocial(social); + } + + @Override + public void setLuck(int luck) { + playerAttributes.setLuck(luck); + } + + @Override + public void setThrift(int thrift) { + playerAttributes.setThrift(thrift); + } + + @Override + public void setMobilization(int mobilization) { + playerAttributes.setMobilization(mobilization); + } + + @Override + public void setGeneralship(int generalship) { + playerAttributes.setGeneralship(generalship); + } + + @Override + public void setPoint(int point) { + playerAttributes.setPoints(point); + } + + // Implement of the BroadcastDataAccessInterface + @Override + public Inventory getInventory() { + return inventory; + } + + @Override + public void updateInventory(int resourceChange) { + inventory.changeWater(resourceChange); + } + + // Implement of the DecideEventDataAccessInterface + @Override + public ArrayList getEvents() { + // Return a copy to ensure immutability + return new ArrayList<>(events); + } + + @Override + public void setEvents(ArrayList events) { + this.events = new ArrayList<>(events); + } + + @Override + public Location getLocation() { + return currentLocation; + } + + // Implement of the EventInitiallizeInterface + @Override + public Event getEvent() { + return currentEvent; + } + + // Implement of the FetchDataAccessInterface + + // Implement of the GatherInterface + @Override + public void decreaseResourceavailable() { + currentLocation.decreaseresourceavailable(); + } + + @Override + public void changeFood(int foodgathered) { + inventory.changeFood(foodgathered); + } + + @Override + public void changeWater(int watergathered) { + inventory.changeWater(watergathered); + } + + @Override + public void changeWeapon(int weapongathered) { + inventory.changeweapon(weapongathered); + } + + // Implement of the HordeInterface + @Override + public Horde getHorde() { + return horde; + } + + @Override + public void setWon(boolean won) { + this.won = won; + } + + @Override + public PlayerInfo getPlayerInfo() { + return playerInfo; + } + + // Implement of the MinimapInterface + + @Override + public PlayerLocation getPlayerLocation() { + return playerLocation; + } + + @Override + public Maps getMaps() { + return gameMap; + } + + // Implement of the MoveInterface + @Override + public void updatePlayerLocation(int newx, int newy) { + playerLocation.setXcoordinate(newx); + playerLocation.setYcoordinate(newy); + } + + // Implement of the NewdayInterface + @Override + public void setDaysSurvived(int days) { + playerInfo.setDaysSurvived(days); + } + + @Override + public void setScore(int score) { + playerInfo.setScore(score); + } + + @Override + public void changePeople(int people) { + inventory.changePeople(people); + } + + // Implement of the PlaceDescriptionInterface + + // Implement of the RespondInterface + @Override + public void setplayerxcoor(int newx) { + playerLocation.setXcoordinate(newx); + } + + @Override + public void setplayerycoor(int newy) { + playerLocation.setYcoordinate(newy); + } +} diff --git a/src/main/java/usecases/dailygather/GatherDataAccessInterface.java b/src/main/java/usecases/dailygather/GatherDataAccessInterface.java index c40879b8d..62b50fde0 100644 --- a/src/main/java/usecases/dailygather/GatherDataAccessInterface.java +++ b/src/main/java/usecases/dailygather/GatherDataAccessInterface.java @@ -28,17 +28,17 @@ public interface GatherDataAccessInterface { * Change player's inventory food by the amount they gathered after successful gather use case. * @param foodgathered foodgathered for this gather. */ - void changefood(int foodgathered); + void changeFood(int foodgathered); /** * Change player's inventory water. * @param watergathered water found in this gather. */ - void changewater(int watergathered); + void changeWater(int watergathered); /** * Change player's inventory weapon. * @param weapongathered weapons found in this gather, in this location, by the player. */ - void changeweapon(int weapongathered); + void changeWeapon(int weapongathered); } diff --git a/src/main/java/usecases/dailygather/GatherInteractor.java b/src/main/java/usecases/dailygather/GatherInteractor.java index 4ffc41f1b..f4459a042 100644 --- a/src/main/java/usecases/dailygather/GatherInteractor.java +++ b/src/main/java/usecases/dailygather/GatherInteractor.java @@ -39,9 +39,9 @@ public void execute(GatherInputData inputdata) { else { successoutputmessage.append("."); } - dataAccessInterface.changefood(foodgathered); - dataAccessInterface.changewater(watergathered); - dataAccessInterface.changeweapon(weapongathered); + dataAccessInterface.changeFood(foodgathered); + dataAccessInterface.changeWater(watergathered); + dataAccessInterface.changeWeapon(weapongathered); if (isvaildgather()) { outputBoundary.prepareSuccessView(new GatherOutputData( successoutputmessage.toString())); diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java index 80456c03c..ee398ead1 100644 --- a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java +++ b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java @@ -19,7 +19,7 @@ public AmbushEventInteractor(RespondDataAccessInterface dataAccess, RespondOutpu @Override public void execute(RespondInputData inputData) { - EventAmbush ambushEvent = (EventAmbush) dataAccess.getevent(); + EventAmbush ambushEvent = (EventAmbush) dataAccess.getEvent(); int choice = inputData.getChoice(); int foodChange = 0; @@ -66,10 +66,10 @@ public void execute(RespondInputData inputData) { } // Apply changes to inventory - dataAccess.changefood(foodChange); - dataAccess.changewater(waterChange); - dataAccess.changeweapon(weaponChange); - dataAccess.changepeople(peopleChange); + dataAccess.changeFood(foodChange); + dataAccess.changeWater(waterChange); + dataAccess.changeWeapon(weaponChange); + dataAccess.changePeople(peopleChange); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java index dae7874a3..cb9b6bf29 100644 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java @@ -19,7 +19,7 @@ public BlizzardEventInteractor(RespondDataAccessInterface dataAccess, RespondOut @Override public void execute(RespondInputData inputData) { - EventBlizzard blizzardEvent = (EventBlizzard) dataAccess.getevent(); + EventBlizzard blizzardEvent = (EventBlizzard) dataAccess.getEvent(); int choice = inputData.getChoice(); int foodChange = 0, waterChange = 0; @@ -47,8 +47,8 @@ public void execute(RespondInputData inputData) { } // Apply resource changes to the inventory - dataAccess.changefood(foodChange); - dataAccess.changewater(waterChange); + dataAccess.changeFood(foodChange); + dataAccess.changeWater(waterChange); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + "."; diff --git a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java index 4d92e68c1..c7f4e1817 100644 --- a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java +++ b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java @@ -19,7 +19,7 @@ public FloodEventInteractor(RespondDataAccessInterface dataAccess, RespondOutput @Override public void execute(RespondInputData inputData) { - EventFlood floodEvent = (EventFlood) dataAccess.getevent(); + EventFlood floodEvent = (EventFlood) dataAccess.getEvent(); int choice = inputData.getChoice(); int foodChange = 0, waterChange = 0, peopleChange = 0; @@ -47,9 +47,9 @@ public void execute(RespondInputData inputData) { } // Apply changes to inventory - dataAccess.changefood(foodChange); - dataAccess.changewater(waterChange); - dataAccess.changepeople(peopleChange); + dataAccess.changeFood(foodChange); + dataAccess.changeWater(waterChange); + dataAccess.changePeople(peopleChange); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + diff --git a/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java b/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java index c25e84380..3df491e1b 100644 --- a/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java @@ -14,7 +14,7 @@ public interface RespondDataAccessInterface { * The event which we are working on to respond, assuming already happened. * @return Event, contains description, choices, and such. */ - Event getevent(); + Event getEvent(); /** * Return the player attributes as alot of event outcome are determine by competence and attribute of player. @@ -41,25 +41,25 @@ public interface RespondDataAccessInterface { * inventory. * @param peoplechange change of people quantity. */ - void changepeople(int peoplechange); + void changePeople(int peoplechange); /** * How the amount of food changes after the event, for that choice player provide. call change method in inventory. * @param foodchange change of people quantity. */ - void changefood(int foodchange); + void changeFood(int foodchange); /** * How the amount of people changes after the event, for that choice player provide. call change method in inventory * @param waterchange change of people quantity. */ - void changewater(int waterchange); + void changeWater(int waterchange); /** * How the amount of weapon changes after the event, for that choice player provide. call change method in inventory * @param weaponchange change of people quantity. */ - void changeweapon(int weaponchange); + void changeWeapon(int weaponchange); /** * If for an event's responds alter the location, call this method which calls player location setxcoordinate diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java index f5e6ba0ea..fbb6fc37c 100644 --- a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java @@ -19,7 +19,7 @@ public SurvivorEventInteractor(RespondDataAccessInterface dataAccess, RespondOut @Override public void execute(RespondInputData inputData) { - EventSurvivorJoins survivorEvent = (EventSurvivorJoins) dataAccess.getevent(); + EventSurvivorJoins survivorEvent = (EventSurvivorJoins) dataAccess.getEvent(); int choice = inputData.getChoice(); int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; @@ -50,10 +50,10 @@ public void execute(RespondInputData inputData) { } // Apply changes to inventory - dataAccess.changefood(foodChange); - dataAccess.changewater(waterChange); - dataAccess.changeweapon(suppliesChange); - dataAccess.changepeople(peopleChange); + dataAccess.changeFood(foodChange); + dataAccess.changeWater(waterChange); + dataAccess.changeWeapon(suppliesChange); + dataAccess.changePeople(peopleChange); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java index ca2fff0df..cc66d2d7c 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -19,7 +19,7 @@ public TraderEventInteractor(RespondDataAccessInterface dataAccess, RespondOutpu @Override public void execute(RespondInputData inputData) { - EventTraderEncounter traderEvent = (EventTraderEncounter) dataAccess.getevent(); + EventTraderEncounter traderEvent = (EventTraderEncounter) dataAccess.getEvent(); int choice = inputData.getChoice(); int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; @@ -57,9 +57,9 @@ public void execute(RespondInputData inputData) { } // Apply changes to the inventory - dataAccess.changefood(foodChange); - dataAccess.changewater(waterChange); - dataAccess.changeweapon(suppliesChange); + dataAccess.changeFood(foodChange); + dataAccess.changeWater(waterChange); + dataAccess.changeWeapon(suppliesChange); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + diff --git a/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java b/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java index b85d30931..5afae896f 100644 --- a/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java +++ b/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java @@ -12,7 +12,7 @@ public interface NewdayDataAccessInterface { * Get the player info we needed, score and days. * @return playerinfo datatype. */ - PlayerInfo getPlayerinfo(); + PlayerInfo getPlayerInfo(); /** * Get location of there player is at, because we need temperature to calculate resource loss as well. diff --git a/src/main/java/usecases/gamenewday/NewdayInteractor.java b/src/main/java/usecases/gamenewday/NewdayInteractor.java index 3e22d6a93..fbbef23d1 100644 --- a/src/main/java/usecases/gamenewday/NewdayInteractor.java +++ b/src/main/java/usecases/gamenewday/NewdayInteractor.java @@ -20,16 +20,16 @@ public void execute(NewdayInputData inputdata) { final int thrift = newdayDataAccessObject.getPlayerAttributes().getThrift(); final int people = newdayDataAccessObject.getInventory().getPeople(); final double temp = newdayDataAccessObject.getLocation().gettemperature(); - final int score = newdayDataAccessObject.getPlayerinfo().getScore(); + final int score = newdayDataAccessObject.getPlayerInfo().getScore(); // Message builder for day summary final StringBuilder messageBuilder = new StringBuilder("Another day has passed. Here's what happened:\n"); boolean success = true; String failmessage = ""; - if (newdayDataAccessObject.getPlayerinfo().getDaysSurvived() >= EntityConstants.MAXNUMDAY) { + if (newdayDataAccessObject.getPlayerInfo().getDaysSurvived() >= EntityConstants.MAXNUMDAY) { success = false; } // Process resource changes and build the message - if (success && newdayDataAccessObject.getPlayerinfo().getDaysSurvived() < EntityConstants.MAXNUMDAY - 1) { + if (success && newdayDataAccessObject.getPlayerInfo().getDaysSurvived() < EntityConstants.MAXNUMDAY - 1) { incrementresouce(messageBuilder, people, score); decrementresource(messageBuilder, thrift, people, temp); final NewdayOutputData outputdata = new NewdayOutputData(messageBuilder.toString(), success, failmessage); diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index ec9d1cc47..bbcd30975 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -20,7 +20,7 @@ public class SignUpView extends JFrame { private JLabel againLabel = new JLabel("again"); private JTextField againText = new JTextField(); - @Suppres sWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) + public SignUpView() { super("sign up"); final Container contentPane = getContentPane(); From 81575c79f150eb766be8728f3d4f462554258773 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sun, 1 Dec 2024 00:24:04 -0500 Subject: [PATCH 083/154] Manage the presenter/controller, and add the interface logic --- .../BroadcastController.java | 2 +- .../broadcast/BroadcastInterface.java | 22 +++++++ .../BroadcastPresenter.java | 22 ++++--- .../LoginController.java | 2 +- .../login/LoginInterface.java | 15 +++++ .../{presenters => login}/LoginPresenter.java | 26 +++----- .../presenters/RankingPresenter.java | 51 -------------- .../presenters/SignupPresenter.java | 42 ------------ .../RankingController.java | 2 +- .../rankinglist/RankingInterface.java | 28 ++++++++ .../rankinglist/RankingPresenter.java | 66 +++++++++++++++++++ .../SignupController.java | 2 +- .../signup/SignupInterface.java | 22 +++++++ .../signup/SignupPresenter.java | 42 ++++++++++++ 14 files changed, 221 insertions(+), 123 deletions(-) rename src/main/java/interface_adapters/{controllers => broadcast}/BroadcastController.java (96%) create mode 100644 src/main/java/interface_adapters/broadcast/BroadcastInterface.java rename src/main/java/interface_adapters/{presenters => broadcast}/BroadcastPresenter.java (62%) rename src/main/java/interface_adapters/{controllers => login}/LoginController.java (97%) create mode 100644 src/main/java/interface_adapters/login/LoginInterface.java rename src/main/java/interface_adapters/{presenters => login}/LoginPresenter.java (52%) delete mode 100644 src/main/java/interface_adapters/presenters/RankingPresenter.java delete mode 100644 src/main/java/interface_adapters/presenters/SignupPresenter.java rename src/main/java/interface_adapters/{controllers => rankinglist}/RankingController.java (97%) create mode 100644 src/main/java/interface_adapters/rankinglist/RankingInterface.java create mode 100644 src/main/java/interface_adapters/rankinglist/RankingPresenter.java rename src/main/java/interface_adapters/{controllers => signup}/SignupController.java (97%) create mode 100644 src/main/java/interface_adapters/signup/SignupInterface.java create mode 100644 src/main/java/interface_adapters/signup/SignupPresenter.java diff --git a/src/main/java/interface_adapters/controllers/BroadcastController.java b/src/main/java/interface_adapters/broadcast/BroadcastController.java similarity index 96% rename from src/main/java/interface_adapters/controllers/BroadcastController.java rename to src/main/java/interface_adapters/broadcast/BroadcastController.java index e62a2957c..09491dad7 100644 --- a/src/main/java/interface_adapters/controllers/BroadcastController.java +++ b/src/main/java/interface_adapters/broadcast/BroadcastController.java @@ -1,4 +1,4 @@ -package interface_adapters.controllers; +package interface_adapters.broadcast; import usecases.dailybroadcast.BroadcastInputBoundary; import usecases.dailybroadcast.BroadcastInputData; diff --git a/src/main/java/interface_adapters/broadcast/BroadcastInterface.java b/src/main/java/interface_adapters/broadcast/BroadcastInterface.java new file mode 100644 index 000000000..e87f29b93 --- /dev/null +++ b/src/main/java/interface_adapters/broadcast/BroadcastInterface.java @@ -0,0 +1,22 @@ +package interface_adapters.broadcast; +/** + * Interface for broadcast view, ensures the UI adheres to this contract. + */ +public interface BroadcastInterface { + /** + * Updates the UI with the successful broadcast result. + * + * @param message The result message of the broadcast. + * @param survivorsFound The number of survivors found (if any). + * @param resourcesFound The resources found (if any). + * @param attractedZombies True if zombies were attracted by the broadcast. + */ + void updateUiBroadcast(String message, int survivorsFound, int resourcesFound, boolean attractedZombies); + + /** + * Updates the UI with the error message in case of failure. + * + * @param errorMessage The error message indicating the failure reason. + */ + void failureBroadcast(String errorMessage); +} diff --git a/src/main/java/interface_adapters/presenters/BroadcastPresenter.java b/src/main/java/interface_adapters/broadcast/BroadcastPresenter.java similarity index 62% rename from src/main/java/interface_adapters/presenters/BroadcastPresenter.java rename to src/main/java/interface_adapters/broadcast/BroadcastPresenter.java index e3ea78f34..869fbaa67 100644 --- a/src/main/java/interface_adapters/presenters/BroadcastPresenter.java +++ b/src/main/java/interface_adapters/broadcast/BroadcastPresenter.java @@ -1,4 +1,4 @@ -package interface_adapters.presenters; +package interface_adapters.broadcast; import usecases.dailybroadcast.BroadcastOutputBoundary; import usecases.dailybroadcast.BroadcastOutputData; @@ -8,6 +8,12 @@ * and converts it into a format suitable for the UI. */ public class BroadcastPresenter implements BroadcastOutputBoundary { + private final BroadcastInterface view; + + public BroadcastPresenter(BroadcastInterface view) { + this.view = view; + } + /** * Prepares the success view for the broadcast. * @@ -15,12 +21,12 @@ public class BroadcastPresenter implements BroadcastOutputBoundary { */ @Override public void prepareSuccessView(BroadcastOutputData outputData) { - System.out.println("Broadcast Result: " + outputData.getResultMessage()); - System.out.println("Survivors Found: " + outputData.getSurvivorsFound()); - System.out.println("Resources Found: " + outputData.getResourcesFound()); - if (outputData.isAttractedZombies()) { - System.out.println("Warning: Zombies were attracted!"); - } + view.updateUiBroadcast( + outputData.getResultMessage(), + outputData.getSurvivorsFound(), + outputData.getResourcesFound(), + outputData.isAttractedZombies() + ); } /** @@ -30,6 +36,6 @@ public void prepareSuccessView(BroadcastOutputData outputData) { */ @Override public void prepareFailureView(String errorMessage) { - System.out.println("Broadcast Failed: " + errorMessage); + view.failureBroadcast(errorMessage); } } diff --git a/src/main/java/interface_adapters/controllers/LoginController.java b/src/main/java/interface_adapters/login/LoginController.java similarity index 97% rename from src/main/java/interface_adapters/controllers/LoginController.java rename to src/main/java/interface_adapters/login/LoginController.java index 9323956aa..e10b1d2a5 100644 --- a/src/main/java/interface_adapters/controllers/LoginController.java +++ b/src/main/java/interface_adapters/login/LoginController.java @@ -1,4 +1,4 @@ -package interface_adapters.controllers; +package interface_adapters.login; import usecases.accountlogin.LoginInputBoundary; import usecases.accountlogin.LoginInputData; diff --git a/src/main/java/interface_adapters/login/LoginInterface.java b/src/main/java/interface_adapters/login/LoginInterface.java new file mode 100644 index 000000000..332196d3d --- /dev/null +++ b/src/main/java/interface_adapters/login/LoginInterface.java @@ -0,0 +1,15 @@ +package interface_adapters.login; + +/** + * The LoginInterface defines the methods required for presenting the result of a login attempt. + */ +public interface LoginInterface { + + /** + * Displays the result of the login attempt. + * + * @param message A string containing the result message of the login attempt. + * This could indicate a successful login or describe the reason for a login failure. + */ + void displayLoginResult(String message); +} diff --git a/src/main/java/interface_adapters/presenters/LoginPresenter.java b/src/main/java/interface_adapters/login/LoginPresenter.java similarity index 52% rename from src/main/java/interface_adapters/presenters/LoginPresenter.java rename to src/main/java/interface_adapters/login/LoginPresenter.java index c4b0602e0..94bcd89cf 100644 --- a/src/main/java/interface_adapters/presenters/LoginPresenter.java +++ b/src/main/java/interface_adapters/login/LoginPresenter.java @@ -1,4 +1,4 @@ -package interface_adapters.presenters; +package interface_adapters.login; import usecases.accountlogin.LoginOutputBoundary; import usecases.accountlogin.LoginOutputData; @@ -8,35 +8,25 @@ * from the Login use case into a format suitable for the user interface. */ public class LoginPresenter implements LoginOutputBoundary { - // Stores the formatted response message - private String responseMessage; + private final LoginInterface view; + + public LoginPresenter(LoginInterface view) { + this.view = view; + } /** * Prepares the view for a successful login attempt. - * - * @param outputData The output data containing the success message. */ @Override public void prepareSuccessView(LoginOutputData outputData) { - responseMessage = outputData.getMessage(); + view.displayLoginResult(outputData.getMessage()); } /** * Prepares the view for a failed login attempt. - * - * @param outputData The output data containing the failure message. */ @Override public void prepareFailureView(LoginOutputData outputData) { - responseMessage = outputData.getMessage(); - } - - /** - * Retrieves the formatted response message. - * - * @return A string representing the login response. - */ - public String getResponseMessage() { - return responseMessage; + view.displayLoginResult(outputData.getMessage()); } } diff --git a/src/main/java/interface_adapters/presenters/RankingPresenter.java b/src/main/java/interface_adapters/presenters/RankingPresenter.java deleted file mode 100644 index 212290c0a..000000000 --- a/src/main/java/interface_adapters/presenters/RankingPresenter.java +++ /dev/null @@ -1,51 +0,0 @@ -package interface_adapters.presenters; - -import java.util.List; - -import entities.PlayerRankingEntry; -import usecases.accountranking.RankingOutputBoundary; -import usecases.accountranking.RankingOutputData; - -/** - * The RankingPresenter class is responsible for formatting the output data - * from the Ranking use case into a format suitable for the user interface. - * It returns a sorted list of PlayerRankingEntry objects for further use by the UI. - */ -public class RankingPresenter implements RankingOutputBoundary { - // Stores the sorted leaderboard - private List sortedRankings; - - /** - * Prepares the view for a successful leaderboard retrieval. - * Stores the sorted PlayerRankingEntry objects for retrieval by the UI. - * - * @param outputData The output data containing the leaderboard information. - */ - @Override - public void prepareSuccessView(RankingOutputData outputData) { - // Store the sorted list of PlayerRankingEntry objects - this.sortedRankings = outputData.getRankings(); - } - - /** - * Prepares the view for a failed leaderboard retrieval attempt. - * Clears the rankings list and logs an error. - * - * @param errorMessage The error message to display. - */ - @Override - public void prepareFailureView(String errorMessage) { - this.sortedRankings = List.of(); // Clear the rankings list on failure - System.err.println("Error retrieving rankings: " + errorMessage); - } - - /** - * Retrieves the sorted list of PlayerRankingEntry objects for display. - * - * @return A list of sorted PlayerRankingEntry objects or an empty list if retrieval failed. - */ - public List getSortedRankings() { - return sortedRankings; - } -} - diff --git a/src/main/java/interface_adapters/presenters/SignupPresenter.java b/src/main/java/interface_adapters/presenters/SignupPresenter.java deleted file mode 100644 index d109a2de2..000000000 --- a/src/main/java/interface_adapters/presenters/SignupPresenter.java +++ /dev/null @@ -1,42 +0,0 @@ -package interface_adapters.presenters; - -import usecases.accountsignup.SignupOutputBoundary; -import usecases.accountsignup.SignupOutputData; - -/** - * The SignupPresenter class is responsible for formatting the output data - * from the Signup use case into a format suitable for the user interface. - */ -public class SignupPresenter implements SignupOutputBoundary { - // Stores the formatted response message - private String responseMessage; - - /** - * Prepares the view for a successful signup attempt. - * - * @param outputData The output data containing the success message. - */ - @Override - public void prepareSuccessView(SignupOutputData outputData) { - responseMessage = outputData.getMessage(); - } - - /** - * Prepares the view for a failed signup attempt. - * - * @param outputData The error message to display. - */ - @Override - public void prepareFailureView(SignupOutputData outputData) { - responseMessage = outputData.getMessage(); - } - - /** - * Retrieves the formatted response message. - * - * @return A string representing the signup response. - */ - public String getResponseMessage() { - return responseMessage; - } -} diff --git a/src/main/java/interface_adapters/controllers/RankingController.java b/src/main/java/interface_adapters/rankinglist/RankingController.java similarity index 97% rename from src/main/java/interface_adapters/controllers/RankingController.java rename to src/main/java/interface_adapters/rankinglist/RankingController.java index ee0a822ca..21737aaa7 100644 --- a/src/main/java/interface_adapters/controllers/RankingController.java +++ b/src/main/java/interface_adapters/rankinglist/RankingController.java @@ -1,4 +1,4 @@ -package interface_adapters.controllers; +package interface_adapters.rankinglist; import usecases.accountranking.RankingInputBoundary; import usecases.accountranking.RankingInputData; diff --git a/src/main/java/interface_adapters/rankinglist/RankingInterface.java b/src/main/java/interface_adapters/rankinglist/RankingInterface.java new file mode 100644 index 000000000..e5f0c08cc --- /dev/null +++ b/src/main/java/interface_adapters/rankinglist/RankingInterface.java @@ -0,0 +1,28 @@ +package interface_adapters.rankinglist; + +import java.util.List; + +/** + * The RankingInterface defines the methods that a view should implement + * to display the leaderboard and handle any errors. + */ +public interface RankingInterface { + + /** + * Updates the UI with the sorted leaderboard entries as separate data points. + * + * @param playerNames A list of player names. + * @param scores A list of player scores. + * @param daysSurvived A list of the days survived by each player. + * @param statuses A list of statuses indicating if each player won or lost. + */ + void displayRankings(List playerNames, List scores, + List daysSurvived, List statuses); + + /** + * Displays an error message in case of a failure in leaderboard retrieval. + * + * @param errorMessage The error message to display. + */ + void displayError(String errorMessage); +} diff --git a/src/main/java/interface_adapters/rankinglist/RankingPresenter.java b/src/main/java/interface_adapters/rankinglist/RankingPresenter.java new file mode 100644 index 000000000..6bd9ae4c3 --- /dev/null +++ b/src/main/java/interface_adapters/rankinglist/RankingPresenter.java @@ -0,0 +1,66 @@ +package interface_adapters.rankinglist; + +import java.util.List; +import java.util.stream.Collectors; + +import entities.PlayerRankingEntry; +import usecases.accountranking.RankingOutputBoundary; +import usecases.accountranking.RankingOutputData; + +/** + * The RankingPresenter class is responsible for converting the output data + * from the Ranking use case into a format suitable for the user interface. + * It interacts with the view via the RankingInterface. + */ +public class RankingPresenter implements RankingOutputBoundary { + // The view that will display the ranking information + private final RankingInterface view; + + /** + * Constructs a new RankingPresenter with the specified view. + * + * @param view The view that will display the leaderboard and errors. + */ + public RankingPresenter(RankingInterface view) { + this.view = view; + } + + /** + * Prepares the view for a successful leaderboard retrieval. + * Separates PlayerRankingEntry objects into individual data lists. + * + * @param outputData The output data containing the sorted leaderboard information. + */ + @Override + public void prepareSuccessView(RankingOutputData outputData) { + // Extract individual components of PlayerRankingEntry + final List playerNames = outputData.getRankings().stream() + .map(PlayerRankingEntry::getName) + .collect(Collectors.toList()); + final List scores = outputData.getRankings().stream() + .map(PlayerRankingEntry::getScore) + .collect(Collectors.toList()); + final List daysSurvived = outputData.getRankings().stream() + .map(PlayerRankingEntry::getDaysSurvived) + .collect(Collectors.toList()); + final List statuses = outputData.getRankings().stream() + .map(entry -> entry.isWon() ? "Won" : "Lost") + .collect(Collectors.toList()); + + // Update the view with separate lists + view.displayRankings(playerNames, scores, daysSurvived, statuses); + } + + /** + * Prepares the view for a failed leaderboard retrieval attempt. + * Notifies the view of the error. + * + * @param errorMessage The error message indicating why the retrieval failed. + */ + @Override + public void prepareFailureView(String errorMessage) { + // Notify the view of the failure + view.displayError(errorMessage); + } +} + diff --git a/src/main/java/interface_adapters/controllers/SignupController.java b/src/main/java/interface_adapters/signup/SignupController.java similarity index 97% rename from src/main/java/interface_adapters/controllers/SignupController.java rename to src/main/java/interface_adapters/signup/SignupController.java index 6cffc2870..5bbf7c0cc 100644 --- a/src/main/java/interface_adapters/controllers/SignupController.java +++ b/src/main/java/interface_adapters/signup/SignupController.java @@ -1,4 +1,4 @@ -package interface_adapters.controllers; +package interface_adapters.signup; import usecases.accountsignup.SignupInputBoundary; import usecases.accountsignup.SignupInputData; diff --git a/src/main/java/interface_adapters/signup/SignupInterface.java b/src/main/java/interface_adapters/signup/SignupInterface.java new file mode 100644 index 000000000..5a049bedb --- /dev/null +++ b/src/main/java/interface_adapters/signup/SignupInterface.java @@ -0,0 +1,22 @@ +package interface_adapters.signup; + +/** + * The SignupInterface defines methods that the UI must implement + * to display the results of a signup operation or handle errors. + */ +public interface SignupInterface { + + /** + * Updates the UI to display the result of a successful signup. + * + * @param message The success message to display. + */ + void displaySignupResult(String message); + + /** + * Updates the UI to display an error message if the signup operation fails. + * + * @param errorMessage The error message to display. + */ + void displaySignupError(String errorMessage); +} diff --git a/src/main/java/interface_adapters/signup/SignupPresenter.java b/src/main/java/interface_adapters/signup/SignupPresenter.java new file mode 100644 index 000000000..a8ba7dda5 --- /dev/null +++ b/src/main/java/interface_adapters/signup/SignupPresenter.java @@ -0,0 +1,42 @@ +package interface_adapters.signup; + +import usecases.accountsignup.SignupOutputBoundary; +import usecases.accountsignup.SignupOutputData; + +/** + * The SignupPresenter class processes use case output for the signup operation + * and converts it into a format suitable for the UI via the SignupInterface. + */ +public class SignupPresenter implements SignupOutputBoundary { + // The UI interface to interact with + private final SignupInterface view; + + /** + * Constructs a new SignupPresenter with the specified SignupInterface. + * + * @param view The UI interface for displaying signup results. + */ + public SignupPresenter(SignupInterface view) { + this.view = view; + } + + /** + * Prepares the UI for a successful signup attempt. + * + * @param outputData The output data containing the success message. + */ + @Override + public void prepareSuccessView(SignupOutputData outputData) { + view.displaySignupResult(outputData.getMessage()); + } + + /** + * Prepares the UI for a failed signup attempt. + * + * @param outputData The output data containing the failure message. + */ + @Override + public void prepareFailureView(SignupOutputData outputData) { + view.displaySignupError(outputData.getMessage()); + } +} From 8b25637ab1b0dbafdf061e1a927369104257c8b4 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sun, 1 Dec 2024 04:20:18 -0500 Subject: [PATCH 084/154] Update Eventview --- .../eventrespond/EventResponseInterface.java | 10 ++- src/main/java/view/EventView.java | 63 ++++++++++--------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java b/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java index 2cda8b289..b55b7249b 100644 --- a/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java +++ b/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java @@ -6,8 +6,14 @@ public interface EventResponseInterface { /** - * Update the UI after a successful response to an event. - * @param message The success message to display. + * Update the event description in the UI. + * @param description The event description to display. + */ + void updateEventDescription(String description); + + /** + * Update the UI with the success message from the interactor. + * @param message The success message. */ void updateUiResponse(String message); diff --git a/src/main/java/view/EventView.java b/src/main/java/view/EventView.java index 97cf7e122..cf00256eb 100644 --- a/src/main/java/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -3,14 +3,20 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; +import interface_adapters.eventrespond.EventResponseController; +import interface_adapters.eventrespond.EventResponseInterface; + /** * Event view. */ -public class EventView extends JFrame { - @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) - public EventView() { +public class EventView extends JFrame implements EventResponseInterface { + private final JTextArea descriptionArea; + private final EventResponseController controller; + + public EventView(EventResponseController controller) { super("Event"); + this.controller = controller; final Container container = getContentPane(); final SpringLayout layout = new SpringLayout(); @@ -22,7 +28,7 @@ public EventView() { container.add(eventLabel); // Description Area - final JTextArea descriptionArea = new JTextArea("Event description goes here..."); + descriptionArea = new JTextArea("Event description goes here..."); descriptionArea.setEditable(false); descriptionArea.setBackground(Color.LIGHT_GRAY); descriptionArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); @@ -39,18 +45,13 @@ public EventView() { container.add(backButton); // Layout Constraints - extracted(layout, eventLabel, container, descriptionArea, fightButton, negotiateButton, fleeButton); - - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, fightButton); + layoutComponents(layout, container, eventLabel, descriptionArea, fightButton, negotiateButton, fleeButton, backButton); // Add ActionListeners to Buttons - final ActionListener returnToGameViewListener = e -> { - dispose(); - new GameView(); - }; - - addListeners(fightButton, returnToGameViewListener, negotiateButton, fleeButton, backButton); + fightButton.addActionListener(e -> controller.execute(1)); // Choice 1 + negotiateButton.addActionListener(e -> controller.execute(2)); // Choice 2 + fleeButton.addActionListener(e -> controller.execute(3)); // Choice 3 + backButton.addActionListener(e -> dispose()); // Window Settings setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); @@ -59,25 +60,15 @@ public EventView() { setVisible(true); } - private static void addListeners(JButton fightButton, ActionListener returnToGameViewListener, - JButton negotiateButton, JButton fleeButton, JButton backButton) { - fightButton.addActionListener(returnToGameViewListener); - negotiateButton.addActionListener(returnToGameViewListener); - fleeButton.addActionListener(returnToGameViewListener); - backButton.addActionListener(returnToGameViewListener); - } - - private static void extracted(SpringLayout layout, JLabel eventLabel, Container container, - JTextArea descriptionArea, JButton fightButton, - JButton negotiateButton, JButton fleeButton) { + private void layoutComponents(SpringLayout layout, Container container, JLabel eventLabel, JTextArea descriptionArea, + JButton fightButton, JButton negotiateButton, JButton fleeButton, JButton backButton) { layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, eventLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); layout.putConstraint(SpringLayout.NORTH, eventLabel, Constants.TWENTY, SpringLayout.NORTH, container); layout.putConstraint(SpringLayout.WEST, descriptionArea, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.EAST, descriptionArea, -Constants.TWENTY, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, descriptionArea, Constants.TWENTY, SpringLayout.SOUTH, eventLabel); - layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, - container); + layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, container); layout.putConstraint(SpringLayout.WEST, fightButton, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.NORTH, fightButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionArea); @@ -87,9 +78,23 @@ private static void extracted(SpringLayout layout, JLabel eventLabel, Container layout.putConstraint(SpringLayout.WEST, fleeButton, Constants.TWENTY, SpringLayout.EAST, negotiateButton); layout.putConstraint(SpringLayout.NORTH, fleeButton, 0, SpringLayout.NORTH, fightButton); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, fightButton); + } + + @Override + public void updateEventDescription(String description) { + descriptionArea.setText(description); + } + + @Override + public void updateUiResponse(String message) { + JOptionPane.showMessageDialog(this, "Success: " + message); } - public static void main(String[] args) { - new EventView(); + @Override + public void failureResponse(String errorMessage) { + JOptionPane.showMessageDialog(this, "Error: " + errorMessage); } } From fd40ca2452c7a145c19f4920d32676c0ea0dfe43 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 1 Dec 2024 09:48:39 -0700 Subject: [PATCH 085/154] Unnessary data access object deleted --- .../database/InMemoryAllowcateDataAccess.java | 51 ------------- .../database/InMemoryBroadcastDataAccess.java | 33 -------- .../InMemoryDecideEventDataAccess.java | 40 ---------- .../InMemoryEventInitializeDataAccess.java | 23 ------ .../database/InMemoryFetchDataAccess.java | 25 ------ .../database/InMemoryGatherDataAccess.java | 50 ------------ .../database/InMemoryHordeDataAccess.java | 52 ------------- .../database/InMemoryMinimapDataAccess.java | 28 ------- .../database/InMemoryMoveDataAccess.java | 52 ------------- .../database/InMemoryNewdayDataAccess.java | 76 ------------------- .../InMemoryPlaceDescriptionDataAccess.java | 20 ----- .../database/InMemoryRespondDataAccess.java | 75 ------------------ .../eventrespond/EventResponseController.java | 14 ++-- src/main/java/view/EventView.java | 2 +- 14 files changed, 7 insertions(+), 534 deletions(-) delete mode 100644 src/main/java/frameworks/database/InMemoryAllowcateDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryBroadcastDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryEventInitializeDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryFetchDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryGatherDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryHordeDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryMinimapDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryMoveDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryNewdayDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryPlaceDescriptionDataAccess.java delete mode 100644 src/main/java/frameworks/database/InMemoryRespondDataAccess.java diff --git a/src/main/java/frameworks/database/InMemoryAllowcateDataAccess.java b/src/main/java/frameworks/database/InMemoryAllowcateDataAccess.java deleted file mode 100644 index a1e805acc..000000000 --- a/src/main/java/frameworks/database/InMemoryAllowcateDataAccess.java +++ /dev/null @@ -1,51 +0,0 @@ -package frameworks.database; - -import entities.PlayerAttributes; -import usecases.startallowcate.AllowcateDataAccessInterface; - -/** - * In-Memory implementation of AllowcateDataAccessInterface. - */ -public class InMemoryAllowcateDataAccess implements AllowcateDataAccessInterface { - private final PlayerAttributes playerAttributes; - - public InMemoryAllowcateDataAccess(PlayerAttributes playerAttributes) { - this.playerAttributes = playerAttributes; - } - - @Override - public PlayerAttributes getPlayerAttributes() { - return playerAttributes; - } - - @Override - public void setSocial(int social) { - playerAttributes.setSocial(social); - } - - @Override - public void setLuck(int luck) { - playerAttributes.setLuck(luck); - } - - @Override - public void setThrift(int thrift) { - playerAttributes.setThrift(thrift); - } - - @Override - public void setMobilization(int mobilization) { - playerAttributes.setMobilization(mobilization); - } - - @Override - public void setGeneralship(int generalship) { - playerAttributes.setGeneralship(generalship); - } - - @Override - public void setPoint(int point) { - playerAttributes.setPoints(point); - } -} - diff --git a/src/main/java/frameworks/database/InMemoryBroadcastDataAccess.java b/src/main/java/frameworks/database/InMemoryBroadcastDataAccess.java deleted file mode 100644 index 3513dd197..000000000 --- a/src/main/java/frameworks/database/InMemoryBroadcastDataAccess.java +++ /dev/null @@ -1,33 +0,0 @@ -package frameworks.database; - -import entities.Inventory; -import entities.PlayerAttributes; -import usecases.dailybroadcast.BroadcastDataAccessInterface; - -/** - * An in-memory implementation of BroadcastDataAccessInterface for testing and development. - */ -public class InMemoryBroadcastDataAccess implements BroadcastDataAccessInterface { - private PlayerAttributes attributes; - private Inventory inventory; - - public InMemoryBroadcastDataAccess(PlayerAttributes attributes, Inventory inventory) { - this.attributes = attributes; - this.inventory = inventory; - } - - @Override - public PlayerAttributes getPlayerAttributes() { - return attributes; - } - - @Override - public Inventory getInventory() { - return inventory; - } - - @Override - public void updateInventory(int resourceChange) { - inventory.changeWater(resourceChange); - } -} diff --git a/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java b/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java deleted file mode 100644 index e4a559164..000000000 --- a/src/main/java/frameworks/database/InMemoryDecideEventDataAccess.java +++ /dev/null @@ -1,40 +0,0 @@ -package frameworks.database; - -import java.util.ArrayList; - -import entities.Event; -import entities.EventsDecided; -import entities.Location; -import usecases.eventdecide.DecideEventDataAccessInterface; - -/** - * In-Memory implementation of DecideEventDataAccessInterface. - */ -public class InMemoryDecideEventDataAccess implements DecideEventDataAccessInterface { - private final ArrayList events; - private final Location currentLocation; - private final EventsDecided currentEventsDecided; - - public InMemoryDecideEventDataAccess(ArrayList events, - Location currentLocation, EventsDecided currentEventsDecided) { - this.events = events; - this.currentLocation = currentLocation; - this.currentEventsDecided = currentEventsDecided; - } - - @Override - public ArrayList getEvents() { - // Return a copy to ensure immutability - return new ArrayList<>(events); - } - - @Override - public void setEvents(ArrayList events) { - currentEventsDecided.setEvents(events); - } - - @Override - public Location getLocation() { - return currentLocation; - } -} diff --git a/src/main/java/frameworks/database/InMemoryEventInitializeDataAccess.java b/src/main/java/frameworks/database/InMemoryEventInitializeDataAccess.java deleted file mode 100644 index 2da428afe..000000000 --- a/src/main/java/frameworks/database/InMemoryEventInitializeDataAccess.java +++ /dev/null @@ -1,23 +0,0 @@ -package frameworks.database; - -import entities.Event; -import usecases.eventinitialize.EventInitializeDataAccessInterface; - -/** - * In-Memory implementation of EventInitializeDataAccessInterface. - */ -public class InMemoryEventInitializeDataAccess implements EventInitializeDataAccessInterface { - private final Event currentEvent; - - public InMemoryEventInitializeDataAccess(Event currentEvent) { - this.currentEvent = currentEvent; - } - - @Override - public Event getEvent() { - if (currentEvent == null) { - throw new IllegalStateException("No event is currently being processed."); - } - return currentEvent; - } -} diff --git a/src/main/java/frameworks/database/InMemoryFetchDataAccess.java b/src/main/java/frameworks/database/InMemoryFetchDataAccess.java deleted file mode 100644 index 93fd2167f..000000000 --- a/src/main/java/frameworks/database/InMemoryFetchDataAccess.java +++ /dev/null @@ -1,25 +0,0 @@ -package frameworks.database; - -import entities.Inventory; -import usecases.fetchresource.FetchDataAccessInterface; - -/** - * In-Memory implementation of FetchDataAccessInterface. - */ -public class InMemoryFetchDataAccess implements FetchDataAccessInterface { - private final Inventory inventory; - - /** - * Constructor to initialize with an existing inventory. - * - * @param inventory Player's inventory object. - */ - public InMemoryFetchDataAccess(Inventory inventory) { - this.inventory = inventory; - } - - @Override - public Inventory getInventory() { - return inventory; - } -} diff --git a/src/main/java/frameworks/database/InMemoryGatherDataAccess.java b/src/main/java/frameworks/database/InMemoryGatherDataAccess.java deleted file mode 100644 index 1df1fa30d..000000000 --- a/src/main/java/frameworks/database/InMemoryGatherDataAccess.java +++ /dev/null @@ -1,50 +0,0 @@ -package frameworks.database; - -import entities.Inventory; -import entities.Location; -import usecases.dailygather.GatherDataAccessInterface; - -/** - * In-memory implementation of GatherDataAccessInterface. - */ -public class InMemoryGatherDataAccess implements GatherDataAccessInterface { - // Player's inventory - private final Inventory inventory; - // Player's current location - private Location location; - - public InMemoryGatherDataAccess(Inventory inventory, Location location) { - this.inventory = inventory; - this.location = location; - } - - @Override - public Inventory getInventory() { - return inventory; - } - - @Override - public Location getLocation() { - return location; - } - - @Override - public void decreaseResourceavailable() { - location.decreaseresourceavailable(); - } - - @Override - public void changeFood(int foodgathered) { - inventory.changeFood(foodgathered); - } - - @Override - public void changeWater(int watergathered) { - inventory.changeWater(watergathered); - } - - @Override - public void changeWeapon(int weapongathered) { - inventory.changeweapon(weapongathered); - } -} diff --git a/src/main/java/frameworks/database/InMemoryHordeDataAccess.java b/src/main/java/frameworks/database/InMemoryHordeDataAccess.java deleted file mode 100644 index f8240046d..000000000 --- a/src/main/java/frameworks/database/InMemoryHordeDataAccess.java +++ /dev/null @@ -1,52 +0,0 @@ -package frameworks.database; - -import entities.Horde; -import entities.Inventory; -import entities.PlayerAttributes; -import entities.PlayerInfo; -import usecases.endprocesshorde.HordeDataAccessInterface; - -/** - * In-Memory implementation of HordeDataAccessInterface. - */ -public class InMemoryHordeDataAccess implements HordeDataAccessInterface { - private final Inventory inventory; - private final Horde horde; - private final PlayerAttributes playerAttributes; - private final PlayerInfo playerInfo; - private boolean won; - - public InMemoryHordeDataAccess(Inventory inventory, Horde horde, - PlayerAttributes playerAttributes, PlayerInfo playerInfo) { - this.inventory = inventory; - this.horde = horde; - this.playerAttributes = playerAttributes; - this.playerInfo = playerInfo; - this.won = false; - } - - @Override - public Inventory getInventory() { - return inventory; - } - - @Override - public Horde getHorde() { - return horde; - } - - @Override - public PlayerAttributes getPlayerAttributes() { - return playerAttributes; - } - - @Override - public void setWon(boolean won) { - this.won = won; - } - - @Override - public PlayerInfo getPlayerInfo() { - return playerInfo; - } -} diff --git a/src/main/java/frameworks/database/InMemoryMinimapDataAccess.java b/src/main/java/frameworks/database/InMemoryMinimapDataAccess.java deleted file mode 100644 index 7aee72a8c..000000000 --- a/src/main/java/frameworks/database/InMemoryMinimapDataAccess.java +++ /dev/null @@ -1,28 +0,0 @@ -package frameworks.database; - -import entities.Maps; -import entities.PlayerLocation; -import usecases.gameminimap.MinimapDataAccessInterface; - -/** - * In-Memory implementation of MinimapDataAccessInterface. - */ -public class InMemoryMinimapDataAccess implements MinimapDataAccessInterface { - private final PlayerLocation playerLocation; - private final Maps gameMap; - - public InMemoryMinimapDataAccess(PlayerLocation playerLocation, Maps gameMap) { - this.playerLocation = playerLocation; - this.gameMap = gameMap; - } - - @Override - public PlayerLocation getPlayerLocation() { - return playerLocation; - } - - @Override - public Maps getMaps() { - return gameMap; - } -} diff --git a/src/main/java/frameworks/database/InMemoryMoveDataAccess.java b/src/main/java/frameworks/database/InMemoryMoveDataAccess.java deleted file mode 100644 index afd6ba500..000000000 --- a/src/main/java/frameworks/database/InMemoryMoveDataAccess.java +++ /dev/null @@ -1,52 +0,0 @@ -package frameworks.database; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Map; - -import entities.*; -import entities.MapFactory; -import usecases.dailymove.MoveDataAccessInterface; - -/** - * In-Memory implementation of MoveDataAccessInterface. - */ -public class InMemoryMoveDataAccess implements MoveDataAccessInterface { - private PlayerAttributes playerAttributes; - private PlayerLocation playerLocation; - private Maps maps; - - /** - * Constructor to initialize with existing player data (e.g., loaded from a save). - * - * @param playerAttributes Existing player attributes. - * @param playerLocation Existing player location. - * @param maps Existing map data. - */ - public InMemoryMoveDataAccess(PlayerAttributes playerAttributes, PlayerLocation playerLocation, Maps maps) { - this.playerAttributes = playerAttributes; - this.playerLocation = playerLocation; - this.maps = maps; - } - - @Override - public PlayerAttributes getPlayerAttributes() { - return playerAttributes; - } - - @Override - public PlayerLocation getPlayerLocation() { - return playerLocation; - } - - @Override - public Maps getMaps() { - return maps; - } - - @Override - public void updatePlayerLocation(int newx, int newy) { - playerLocation.setXcoordinate(newx); - playerLocation.setYcoordinate(newy); - } -} diff --git a/src/main/java/frameworks/database/InMemoryNewdayDataAccess.java b/src/main/java/frameworks/database/InMemoryNewdayDataAccess.java deleted file mode 100644 index a900245d7..000000000 --- a/src/main/java/frameworks/database/InMemoryNewdayDataAccess.java +++ /dev/null @@ -1,76 +0,0 @@ -package frameworks.database; - -import entities.*; -import usecases.gamenewday.NewdayDataAccessInterface; - -public class InMemoryNewdayDataAccess implements NewdayDataAccessInterface { - private final PlayerInfo playerInfo; - private final Inventory inventory; - private final Location location; - private final PlayerAttributes playerAttributes; - private final Horde horde; - - public InMemoryNewdayDataAccess(PlayerInfo playerInfo, Inventory inventory, Location location, - PlayerAttributes playerAttributes, Horde horde) { - this.playerInfo = playerInfo; - this.inventory = inventory; - this.location = location; - this.playerAttributes = playerAttributes; - this.horde = horde; - } - - @Override - public PlayerInfo getPlayerInfo() { - return playerInfo; - } - - @Override - public Location getLocation() { - return location; - } - - @Override - public Inventory getInventory() { - return inventory; - } - - @Override - public void setDaysSurvived(int days) { - playerInfo.setDaysSurvived(days); - } - - @Override - public void setScore(int score) { - playerInfo.setScore(score); - } - - @Override - public void changeFood(int food) { - inventory.changeFood(food); - } - - @Override - public void changeWater(int water) { - inventory.changeWater(water); - } - - @Override - public void changePeople(int people) { - inventory.changePeople(people); - } - - @Override - public void changeWeapon(int weapon) { - inventory.changeweapon(weapon); - } - - @Override - public PlayerAttributes getPlayerAttributes() { - return playerAttributes; - } - - @Override - public Horde getHorde() { - return horde; - } -} diff --git a/src/main/java/frameworks/database/InMemoryPlaceDescriptionDataAccess.java b/src/main/java/frameworks/database/InMemoryPlaceDescriptionDataAccess.java deleted file mode 100644 index 9069267da..000000000 --- a/src/main/java/frameworks/database/InMemoryPlaceDescriptionDataAccess.java +++ /dev/null @@ -1,20 +0,0 @@ -package frameworks.database; - -import entities.Location; -import usecases.gameplacedescription.PlaceDescriptionDataAccessInterface; - -/** - * In-Memory implementation of PlaceDescriptionDataAccessInterface. - */ -public class InMemoryPlaceDescriptionDataAccess implements PlaceDescriptionDataAccessInterface { - private final Location currentLocation; - - public InMemoryPlaceDescriptionDataAccess(Location currentLocation) { - this.currentLocation = currentLocation; - } - - @Override - public Location getLocation() { - return currentLocation; - } -} diff --git a/src/main/java/frameworks/database/InMemoryRespondDataAccess.java b/src/main/java/frameworks/database/InMemoryRespondDataAccess.java deleted file mode 100644 index fc95b5f09..000000000 --- a/src/main/java/frameworks/database/InMemoryRespondDataAccess.java +++ /dev/null @@ -1,75 +0,0 @@ -package frameworks.database; - -import entities.Event; -import entities.Inventory; -import entities.PlayerAttributes; -import entities.PlayerLocation; -import usecases.eventrespond.shared.RespondDataAccessInterface; - -/** - * In-Memory implementation of RespondDataAccessInterface. - */ -public class InMemoryRespondDataAccess implements RespondDataAccessInterface { - private Event event; - private final Inventory inventory; - private final PlayerAttributes playerAttributes; - private final PlayerLocation playerLocation; - - public InMemoryRespondDataAccess(Event event, Inventory inventory, - PlayerAttributes playerAttributes, PlayerLocation playerLocation) { - this.event = event; - this.inventory = inventory; - this.playerAttributes = playerAttributes; - this.playerLocation = playerLocation; - } - - @Override - public Event getEvent() { - return event; - } - - @Override - public PlayerAttributes getPlayerAttributes() { - return playerAttributes; - } - - @Override - public Inventory getInventory() { - return inventory; - } - - @Override - public PlayerLocation getPlayerLocation() { - return playerLocation; - } - - @Override - public void changePeople(int peoplechange) { - inventory.changePeople(peoplechange); - } - - @Override - public void changeFood(int foodchange) { - inventory.changeFood(foodchange); - } - - @Override - public void changeWater(int waterchange) { - inventory.changeWater(waterchange); - } - - @Override - public void changeWeapon(int weaponchange) { - inventory.changeweapon(weaponchange); - } - - @Override - public void setplayerxcoor(int newx) { - playerLocation.setXcoordinate(newx); - } - - @Override - public void setplayerycoor(int newy) { - playerLocation.setYcoordinate(newy); - } -} diff --git a/src/main/java/interface_adapters/eventrespond/EventResponseController.java b/src/main/java/interface_adapters/eventrespond/EventResponseController.java index fd6341e13..8006b5fba 100644 --- a/src/main/java/interface_adapters/eventrespond/EventResponseController.java +++ b/src/main/java/interface_adapters/eventrespond/EventResponseController.java @@ -18,19 +18,17 @@ * Determines the correct interactor based on the event type. */ public class EventResponseController { - private final RespondDataAccessInterface dataAccess; - private final RespondOutputBoundary outputBoundary; + private final RespondInputBoundary interactor; - public EventResponseController(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { - this.dataAccess = dataAccess; - this.outputBoundary = outputBoundary; + public EventResponseController(RespondInputBoundary interactor) { + this.interactor = interactor; } /** * Handles the response to a given event by selecting the appropriate interactor. - * @param inputData The player's input data (choice). + * @param choice The player's input data (choice). */ - public void execute(RespondInputData inputData) { + public void execute(int choice) { Event event = dataAccess.getevent(); RespondInputBoundary interactor; @@ -48,7 +46,7 @@ public void execute(RespondInputData inputData) { outputBoundary.prepareFailureView("Unknown event type."); return; } - + RespondInputData inputData = new RespondInputData(choice); interactor.execute(inputData); } } diff --git a/src/main/java/view/EventView.java b/src/main/java/view/EventView.java index cf00256eb..b0d5d69e8 100644 --- a/src/main/java/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -7,7 +7,7 @@ import interface_adapters.eventrespond.EventResponseInterface; /** - * Event view. +// * Event view. */ public class EventView extends JFrame implements EventResponseInterface { From 10fffe1edd9ae98ab183636f6a438d9918f2ec51 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 1 Dec 2024 10:57:38 -0700 Subject: [PATCH 086/154] Application initialized completed, minor usecase and database bug fix --- src/main/java/app/GameMainApplication.java | 50 +++++++++++++++ .../database/InMemoryUnifiedDataAccess.java | 48 +++++++------- .../eventrespond/EventResponseController.java | 36 +++++------ .../AllowcateController.java | 12 +++- .../shared/RespondDataAccessInterface.java | 14 ---- .../startallowcate/AllowcateInputdata.java | 40 ++++++++++-- .../startallowcate/AllowcateInteractor.java | 64 ++++--------------- 7 files changed, 148 insertions(+), 116 deletions(-) create mode 100644 src/main/java/app/GameMainApplication.java diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java new file mode 100644 index 000000000..75d5a1b19 --- /dev/null +++ b/src/main/java/app/GameMainApplication.java @@ -0,0 +1,50 @@ +package app; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; + +import entities.*; +import frameworks.database.InMemoryUnifiedDataAccess; +import view.MainView; + +/** + * Main of the game applicaition, initialize inmemory database for the game. + */ +public class GameMainApplication { + + /** + * Main of the game loop. + * @param args args + */ + public static void main(String[] args) { + // initialized map + final ArrayList environments = new ArrayList<>(Arrays.asList(EntityConstants.PLAIN, + EntityConstants.CITY, EntityConstants.FOREST, EntityConstants.DESERT, EntityConstants.ICELAND)); + final MapFactory mapfact = new MapFactory(); + final ArrayList>>> cores = + mapfact.getCores(EntityConstants.MAPWIDTH, EntityConstants.MAPHEIGHT, environments); + final ArrayList> grids = mapfact.getGrids(EntityConstants.MAPWIDTH, + EntityConstants.MAPHEIGHT, cores); + final Maps gameMap = new Maps(grids); + // initialize player and their info. + final PlayerAttributes playerAttributes = new PlayerAttributes(); + final PlayerInfo playerInfo = new PlayerInfo("Currentplayer"); + final PlayerLocation playerLocation = new PlayerLocation(); + final Inventory playerInventory = new Inventory(); + final Location currentlocation = grids.get(playerLocation.getYcoordinate()) + .get(playerLocation.getXcoordinate()); + // initialize events and horde + final EventAmbush ambush = new EventAmbush(); + final EventFlood flood = new EventFlood(); + final EventBlizzard blizzard = new EventBlizzard(); + final EventSurvivorJoins survivor = new EventSurvivorJoins(); + final EventTraderEncounter traderEncounter = new EventTraderEncounter(); + final Horde horde = new Horde(); + // initialize ingame in memory database/dataaccess. + final InMemoryUnifiedDataAccess gamedatabase = + new InMemoryUnifiedDataAccess(playerAttributes, playerInventory, new ArrayList<>(), currentlocation, + horde, playerInfo, playerLocation, gameMap, ambush, blizzard, flood, survivor, traderEncounter); + new MainView(); + } +} diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index 212f5b0bb..303b34da3 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -37,28 +37,36 @@ public class InMemoryUnifiedDataAccess implements private Inventory inventory; private ArrayList events; private Location currentLocation; - private Event currentEvent; private Horde horde; private PlayerInfo playerInfo; - private boolean won; private PlayerLocation playerLocation; private Maps gameMap; + private EventAmbush ambush; + private EventBlizzard blizzard; + private EventFlood flood; + private EventSurvivorJoins survivorJoins; + private EventTraderEncounter traderEncounter; // Constructor to initialize shared objects public InMemoryUnifiedDataAccess(PlayerAttributes playerAttributes, Inventory inventory, - ArrayList events, Location currentLocation, Event currentEvent, - Horde horde, PlayerInfo playerInfo, boolean won, - PlayerLocation playerLocation, Maps gameMap) { + ArrayList events, Location currentLocation, + Horde horde, PlayerInfo playerInfo, + PlayerLocation playerLocation, Maps gameMap, EventAmbush ambush, + EventBlizzard blizzard, EventFlood flood, EventSurvivorJoins survivorJoins, + EventTraderEncounter traderEncounter) { this.playerAttributes = playerAttributes; this.inventory = inventory; this.events = events; this.currentLocation = currentLocation; - this.currentEvent = currentEvent; this.horde = horde; this.playerInfo = playerInfo; - this.won = false; this.playerLocation = playerLocation; this.gameMap = gameMap; + this.ambush = ambush; + this.blizzard = blizzard; + this.flood = flood; + this.survivorJoins = survivorJoins; + this.traderEncounter = traderEncounter; } // Implementation of AllowcateDataAccessInterface @@ -112,7 +120,13 @@ public void updateInventory(int resourceChange) { @Override public ArrayList getEvents() { // Return a copy to ensure immutability - return new ArrayList<>(events); + final ArrayList allevents = new ArrayList(); + allevents.add(ambush); + allevents.add(blizzard); + allevents.add(flood); + allevents.add(survivorJoins); + allevents.add(traderEncounter); + return allevents; } @Override @@ -128,7 +142,7 @@ public Location getLocation() { // Implement of the EventInitiallizeInterface @Override public Event getEvent() { - return currentEvent; + return events.get(0); } // Implement of the FetchDataAccessInterface @@ -162,7 +176,7 @@ public Horde getHorde() { @Override public void setWon(boolean won) { - this.won = won; + this.playerInfo.setWon(won); } @Override @@ -187,6 +201,7 @@ public Maps getMaps() { public void updatePlayerLocation(int newx, int newy) { playerLocation.setXcoordinate(newx); playerLocation.setYcoordinate(newy); + currentLocation = gameMap.getGrid().get(newy).get(newx); } // Implement of the NewdayInterface @@ -204,17 +219,4 @@ public void setScore(int score) { public void changePeople(int people) { inventory.changePeople(people); } - - // Implement of the PlaceDescriptionInterface - - // Implement of the RespondInterface - @Override - public void setplayerxcoor(int newx) { - playerLocation.setXcoordinate(newx); - } - - @Override - public void setplayerycoor(int newy) { - playerLocation.setYcoordinate(newy); - } } diff --git a/src/main/java/interface_adapters/eventrespond/EventResponseController.java b/src/main/java/interface_adapters/eventrespond/EventResponseController.java index 8006b5fba..96991231e 100644 --- a/src/main/java/interface_adapters/eventrespond/EventResponseController.java +++ b/src/main/java/interface_adapters/eventrespond/EventResponseController.java @@ -29,24 +29,24 @@ public EventResponseController(RespondInputBoundary interactor) { * @param choice The player's input data (choice). */ public void execute(int choice) { - Event event = dataAccess.getevent(); + //Event event = dataAccess.getevent(); - RespondInputBoundary interactor; - if (event instanceof EventAmbush) { - interactor = new AmbushEventInteractor(dataAccess, outputBoundary); - } else if (event instanceof EventFlood) { - interactor = new FloodEventInteractor(dataAccess, outputBoundary); - } else if (event instanceof EventBlizzard) { - interactor = new BlizzardEventInteractor(dataAccess, outputBoundary); - } else if (event instanceof EventTraderEncounter) { - interactor = new TraderEventInteractor(dataAccess, outputBoundary); - } else if (event instanceof EventSurvivorJoins) { - interactor = new SurvivorEventInteractor(dataAccess, outputBoundary); - } else { - outputBoundary.prepareFailureView("Unknown event type."); - return; - } - RespondInputData inputData = new RespondInputData(choice); - interactor.execute(inputData); + //RespondInputBoundary interactor; + //if (event instanceof EventAmbush) { + // interactor = new AmbushEventInteractor(dataAccess, outputBoundary); + //} else if (event instanceof EventFlood) { + // interactor = new FloodEventInteractor(dataAccess, outputBoundary); + //} else if (event instanceof EventBlizzard) { + // interactor = new BlizzardEventInteractor(dataAccess, outputBoundary); + //} else if (event instanceof EventTraderEncounter) { + // interactor = new TraderEventInteractor(dataAccess, outputBoundary); + //} else if (event instanceof EventSurvivorJoins) { + // interactor = new SurvivorEventInteractor(dataAccess, outputBoundary); + //} else { + // outputBoundary.prepareFailureView("Unknown event type."); + // return; + //} + //RespondInputData inputData = new RespondInputData(choice); + //interactor.execute(inputData); } } diff --git a/src/main/java/interface_adapters/startallowcatepoint/AllowcateController.java b/src/main/java/interface_adapters/startallowcatepoint/AllowcateController.java index ba13a432b..9e18a3658 100644 --- a/src/main/java/interface_adapters/startallowcatepoint/AllowcateController.java +++ b/src/main/java/interface_adapters/startallowcatepoint/AllowcateController.java @@ -15,10 +15,16 @@ public AllowcateController(AllowcateInputBoundary interactor) { /** * Execute based on player's selected attribute. - * @param attribute string fromat of which selected. + * @param generalship generalship player choosed. + * @param mobilization mobilization player choosed. + * @param thrift thrfit player choosed. + * @param luck luck. + * @param social social. + * @param point point. */ - public void execute(String attribute) { - final AllowcateInputdata inputdata = new AllowcateInputdata(attribute); + public void execute(int point, int social, int luck, int thrift, int mobilization, int generalship) { + final AllowcateInputdata inputdata = new AllowcateInputdata(point, social, + luck, thrift, mobilization, generalship); interactor.execute(inputdata); } } diff --git a/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java b/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java index 3df491e1b..9d28f163d 100644 --- a/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java @@ -60,18 +60,4 @@ public interface RespondDataAccessInterface { * @param weaponchange change of people quantity. */ void changeWeapon(int weaponchange); - - /** - * If for an event's responds alter the location, call this method which calls player location setxcoordinate - * method. - * @param newx new x coordination of the player after the event. - */ - void setplayerxcoor(int newx); - - /** - * If for an event's responds alter the location, call this method which calls player location setycoordinate - * method. - * @param newy new y coordination of the player after the event. - */ - void setplayerycoor(int newy); } diff --git a/src/main/java/usecases/startallowcate/AllowcateInputdata.java b/src/main/java/usecases/startallowcate/AllowcateInputdata.java index fcb12b17a..be878ebac 100644 --- a/src/main/java/usecases/startallowcate/AllowcateInputdata.java +++ b/src/main/java/usecases/startallowcate/AllowcateInputdata.java @@ -6,13 +6,43 @@ * (all lowercase except first letter format as in entityconstant) */ public class AllowcateInputdata { - private String attribute; + private int point; + private int social; + private int luck; + private int thrift; + private int mobilization; + private int generalship; - public AllowcateInputdata(String attribute) { - this.attribute = attribute; + public AllowcateInputdata(int point, int social, int luck, int thrift, int mobilization, int generalship) { + this.point = point; + this.social = social; + this.luck = luck; + this.thrift = thrift; + this.mobilization = mobilization; + this.generalship = generalship; } - public String getAttribute() { - return attribute; + public int getPoint() { + return point; + } + + public int getSocial() { + return social; + } + + public int getLuck() { + return luck; + } + + public int getThrift() { + return thrift; + } + + public int getMobilization() { + return mobilization; + } + + public int getGeneralship() { + return generalship; } } diff --git a/src/main/java/usecases/startallowcate/AllowcateInteractor.java b/src/main/java/usecases/startallowcate/AllowcateInteractor.java index 2314adc93..a7e75b608 100644 --- a/src/main/java/usecases/startallowcate/AllowcateInteractor.java +++ b/src/main/java/usecases/startallowcate/AllowcateInteractor.java @@ -1,7 +1,5 @@ package usecases.startallowcate; -import entities.EntityConstants; - /** * Allowcate interactor, decrease point by one, add attribute select by one, if point was greater than 0. * If points are less than 0, fail and return fail message. @@ -20,63 +18,23 @@ public AllowcateInteractor(AllowcateDataAccessInterface allowcateDataAccessInter @Override public void execute(AllowcateInputdata inputdata) { String failmessage = " "; - boolean failureOccurred = false; - - int points = allowcateDataAccessInterface.getPlayerAttributes().getPoints(); - int social = allowcateDataAccessInterface.getPlayerAttributes().getSocial(); - int luck = allowcateDataAccessInterface.getPlayerAttributes().getLuck(); - int mobilization = allowcateDataAccessInterface.getPlayerAttributes().getMobilization(); - int thrift = allowcateDataAccessInterface.getPlayerAttributes().getThrift(); - int generalship = allowcateDataAccessInterface.getPlayerAttributes().getGeneralship(); // Check if points are available - if (points <= 0) { + if (inputdata.getPoint() < 0) { failmessage = "Not enough Attribute points."; allowcateOutputBoundary.preparefailureview(failmessage); - failureOccurred = true; - } - else if (inputdata.getAttribute().equals(EntityConstants.SOCIAL)) { - points = points - 1; - social = social + 1; - } - else if (inputdata.getAttribute().equals(EntityConstants.LUCK)) { - points = points - 1; - luck = luck + 1; - } - else if (inputdata.getAttribute().equals(EntityConstants.MOBILIZATION)) { - points = points - 1; - mobilization = mobilization + 1; - } - else if (inputdata.getAttribute().equals(EntityConstants.THRIFT)) { - points = points - 1; - thrift = thrift + 1; - } - else if (inputdata.getAttribute().equals(EntityConstants.GENERALSHIP)) { - points = points - 1; - generalship = generalship + 1; } else { - // Invalid attribute - failmessage = "Invalid attribute chosen."; - allowcateOutputBoundary.preparefailureview(failmessage); - failureOccurred = true; - } - - // If no failure occurred, update attributes and prepare success view - if (!failureOccurred) { - successhelper(points, social, luck, mobilization, thrift, generalship); + allowcateDataAccessInterface.setPoint(inputdata.getPoint()); + allowcateDataAccessInterface.setSocial(inputdata.getSocial()); + allowcateDataAccessInterface.setLuck(inputdata.getLuck()); + allowcateDataAccessInterface.setMobilization(inputdata.getMobilization()); + allowcateDataAccessInterface.setThrift(inputdata.getThrift()); + allowcateDataAccessInterface.setGeneralship(inputdata.getGeneralship()); + final AllowcateOutputData outputData = new AllowcateOutputData(inputdata.getPoint(), inputdata.getSocial(), + inputdata.getLuck(), inputdata.getMobilization(), inputdata.getThrift(), + inputdata.getGeneralship()); + allowcateOutputBoundary.preparesuccessview(outputData); } } - - private void successhelper(int points, int social, int luck, int mobilization, int thrift, int generalship) { - allowcateDataAccessInterface.getPlayerAttributes().setPoints(points); - allowcateDataAccessInterface.getPlayerAttributes().setSocial(social); - allowcateDataAccessInterface.getPlayerAttributes().setLuck(luck); - allowcateDataAccessInterface.getPlayerAttributes().setMobilization(mobilization); - allowcateDataAccessInterface.getPlayerAttributes().setThrift(thrift); - allowcateDataAccessInterface.getPlayerAttributes().setGeneralship(generalship); - final AllowcateOutputData outputdata = new AllowcateOutputData(points, social, - luck, mobilization, thrift, generalship); - allowcateOutputBoundary.preparesuccessview(outputdata); - } } From c51c309ae337f3d6466d5e8146d08767cb5b6c01 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 1 Dec 2024 15:50:43 -0700 Subject: [PATCH 087/154] game main application update, Navigation manager added. --- src/main/java/app/GameMainApplication.java | 28 ++++++- .../database/InMemoryUnifiedDataAccess.java | 4 +- .../interface_adapters/NavigationManager.java | 78 +++++++++++++++++++ .../NevagateAllowcateController.java | 17 ++++ .../NevagateAllowcateInterface.java | 7 ++ .../NevagateAllowcatePresenter.java | 22 ++++++ .../NevagateAllowcateDataAccessInterface.java | 7 ++ .../NevagateAllowcateInputBoundary.java | 14 ++++ .../NevagateAllowcateInputdata.java | 7 ++ .../NevagateAllowcateInteractor.java | 22 ++++++ .../NevagateAllowcateOutputBoundary.java | 18 +++++ .../NevagateAllowcateOutputdata.java | 7 ++ src/main/java/view/CharacterCreationView.java | 75 ++++++++++++------ src/main/java/view/EventView.java | 71 +++++++++-------- src/main/java/view/GameOverView.java | 11 ++- src/main/java/view/GameView.java | 12 ++- src/main/java/view/InformationView.java | 10 +++ src/main/java/view/LoginView.java | 4 + src/main/java/view/MainView.java | 37 ++++++--- src/main/java/view/RankingView.java | 5 ++ src/main/java/view/SignUpView.java | 5 ++ 21 files changed, 387 insertions(+), 74 deletions(-) create mode 100644 src/main/java/interface_adapters/NavigationManager.java create mode 100644 src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcateController.java create mode 100644 src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcateInterface.java create mode 100644 src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcatePresenter.java create mode 100644 src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateDataAccessInterface.java create mode 100644 src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInputBoundary.java create mode 100644 src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInputdata.java create mode 100644 src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInteractor.java create mode 100644 src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateOutputBoundary.java create mode 100644 src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateOutputdata.java diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 75d5a1b19..e73c63d9b 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -6,7 +6,12 @@ import entities.*; import frameworks.database.InMemoryUnifiedDataAccess; -import view.MainView; +import interface_adapters.NavigationManager; +import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; +import interface_adapters.nevagateallowcatepage.NevagateAllowcatePresenter; +import interface_adapters.startallowcatepoint.AllowcatePresenter; +import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; +import view.*; /** * Main of the game applicaition, initialize inmemory database for the game. @@ -45,6 +50,25 @@ public static void main(String[] args) { final InMemoryUnifiedDataAccess gamedatabase = new InMemoryUnifiedDataAccess(playerAttributes, playerInventory, new ArrayList<>(), currentlocation, horde, playerInfo, playerLocation, gameMap, ambush, blizzard, flood, survivor, traderEncounter); - new MainView(); + // initialize each gameing view. + final MainView mainView = new MainView(); + final CharacterCreationView attributeview = new CharacterCreationView(); + final GameView gameView = new GameView(); + final EventView eventView = new EventView(); + final GameOverView gameOverView = new GameOverView(); + final InformationView informationView = new InformationView("Daily log"); + // initialize nevagation manager + final NavigationManager navigationManager = + new NavigationManager(mainView, attributeview, gameView, eventView, informationView, gameOverView); + // initialize each usecase. + // Nevagate to allowcate page usecase. + final NevagateAllowcatePresenter nevagateallowcatepresener = new NevagateAllowcatePresenter(navigationManager); + final NevagateAllowcateInteractor nevagateAllowcateInteractor = + new NevagateAllowcateInteractor(gamedatabase, nevagateallowcatepresener); + final NevagateAllowcateController nevagateAllowcateController = + new NevagateAllowcateController(nevagateAllowcateInteractor); + mainView.setNevagateAllowcateController(nevagateAllowcateController); + mainView.render(); + } } diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index 303b34da3..1da354a7c 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -14,6 +14,7 @@ import usecases.gameminimap.MinimapDataAccessInterface; import usecases.gamenewday.NewdayDataAccessInterface; import usecases.gameplacedescription.PlaceDescriptionDataAccessInterface; +import usecases.nevagateAllowcatePage.NevagateAllowcateDataAccessInterface; import usecases.startallowcate.AllowcateDataAccessInterface; /** @@ -31,7 +32,8 @@ public class InMemoryUnifiedDataAccess implements MoveDataAccessInterface, NewdayDataAccessInterface, PlaceDescriptionDataAccessInterface, - RespondDataAccessInterface { + RespondDataAccessInterface, + NevagateAllowcateDataAccessInterface { // Shared game data private PlayerAttributes playerAttributes; private Inventory inventory; diff --git a/src/main/java/interface_adapters/NavigationManager.java b/src/main/java/interface_adapters/NavigationManager.java new file mode 100644 index 000000000..1fce6dfae --- /dev/null +++ b/src/main/java/interface_adapters/NavigationManager.java @@ -0,0 +1,78 @@ +package interface_adapters; + +import view.*; + +public class NavigationManager { + private final MainView mainView; + private final CharacterCreationView characterCreationView; + private final GameView gameView; + private final EventView eventView; + private final InformationView informationView; + private final GameOverView gameOverView; + + public NavigationManager(MainView mainView, + CharacterCreationView characterCreationView, GameView gameView, EventView eventView, + InformationView informationView, GameOverView gameOverView) { + this.mainView = mainView; + this.characterCreationView = characterCreationView; + this.gameView = gameView; + this.eventView = eventView; + this.informationView = informationView; + this.gameOverView = gameOverView; + } + + public void showMainView() { + mainView.render(); + characterCreationView.disrender(); + gameView.disrender(); + eventView.disrender(); + informationView.disrender(); + gameOverView.disrender(); + } + + public void showCharacterCreationView() { + mainView.disrender(); + characterCreationView.render(); + gameView.disrender(); + eventView.disrender(); + informationView.disrender(); + gameOverView.disrender(); + } + + public void showEventView() { + mainView.disrender(); + characterCreationView.disrender(); + gameView.disrender(); + eventView.render(); + informationView.disrender(); + gameOverView.disrender(); + } + + public void showGameView() { + mainView.disrender(); + characterCreationView.disrender(); + gameView.render(); + eventView.disrender(); + informationView.disrender(); + gameOverView.disrender(); + } + + public void showInformationView() { + mainView.disrender(); + characterCreationView.disrender(); + gameView.disrender(); + eventView.disrender(); + informationView.render(); + gameOverView.disrender(); + } + + public void showGameOverView() { + mainView.disrender(); + characterCreationView.disrender(); + gameView.disrender(); + eventView.disrender(); + informationView.disrender(); + gameOverView.render(); + } + +} diff --git a/src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcateController.java b/src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcateController.java new file mode 100644 index 000000000..2462e443e --- /dev/null +++ b/src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcateController.java @@ -0,0 +1,17 @@ +package interface_adapters.nevagateallowcatepage; + +import usecases.nevagateAllowcatePage.NevagateAllowcateInputBoundary; +import usecases.nevagateAllowcatePage.NevagateAllowcateInputdata; + +public class NevagateAllowcateController { + private final NevagateAllowcateInputBoundary interactor; + + public NevagateAllowcateController(NevagateAllowcateInputBoundary interactor) { + this.interactor = interactor; + } + + public void execute() { + final NevagateAllowcateInputdata inputdata = new NevagateAllowcateInputdata(); + interactor.execute(inputdata); + } +} diff --git a/src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcateInterface.java b/src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcateInterface.java new file mode 100644 index 000000000..6e8428136 --- /dev/null +++ b/src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcateInterface.java @@ -0,0 +1,7 @@ +package interface_adapters.nevagateallowcatepage; + +/** + * Nothing to show to player, Nevagate logic is concluded in Navigation managet. + */ +public interface NevagateAllowcateInterface { +} diff --git a/src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcatePresenter.java b/src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcatePresenter.java new file mode 100644 index 000000000..2d67c92cf --- /dev/null +++ b/src/main/java/interface_adapters/nevagateallowcatepage/NevagateAllowcatePresenter.java @@ -0,0 +1,22 @@ +package interface_adapters.nevagateallowcatepage; + +import interface_adapters.NavigationManager; +import usecases.nevagateAllowcatePage.NevagateAllowcateOutputBoundary; + +public class NevagateAllowcatePresenter implements NevagateAllowcateOutputBoundary { + private final NavigationManager navigationManager; + + public NevagateAllowcatePresenter(NavigationManager navigationManager) { + this.navigationManager = navigationManager; + } + + @Override + public void nevagateAllowcatePage() { + navigationManager.showCharacterCreationView(); + } + + @Override + public void nevagateAllowcateFail(String errormessage) { + // will not fail because this don't have any restriction. + } +} diff --git a/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateDataAccessInterface.java b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateDataAccessInterface.java new file mode 100644 index 000000000..a3355e566 --- /dev/null +++ b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateDataAccessInterface.java @@ -0,0 +1,7 @@ +package usecases.nevagateAllowcatePage; + +/** + * Go to allowcate page use case data access, not data required. + */ +public interface NevagateAllowcateDataAccessInterface { +} diff --git a/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInputBoundary.java b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInputBoundary.java new file mode 100644 index 000000000..8dd93cf26 --- /dev/null +++ b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInputBoundary.java @@ -0,0 +1,14 @@ +package usecases.nevagateAllowcatePage; + +/** + * Input boundary for nevagate to allowcare page usecase. + */ +public interface NevagateAllowcateInputBoundary { + + /** + * Execute, which checks can use go to next page or not, is yes call next page in presentor, is not only display + * error message. + * @param inputdata inputdatatype, not needed. + */ + void execute(NevagateAllowcateInputdata inputdata); +} diff --git a/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInputdata.java b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInputdata.java new file mode 100644 index 000000000..b699a22c7 --- /dev/null +++ b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInputdata.java @@ -0,0 +1,7 @@ +package usecases.nevagateAllowcatePage; + +/** + * Not needed. + */ +public class NevagateAllowcateInputdata { +} diff --git a/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInteractor.java b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInteractor.java new file mode 100644 index 000000000..b8f3a6890 --- /dev/null +++ b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateInteractor.java @@ -0,0 +1,22 @@ +package usecases.nevagateAllowcatePage; + +/** + * Interactor for nevagate, cehck if player is able to go to next page. + */ +public class NevagateAllowcateInteractor implements NevagateAllowcateInputBoundary { + private final NevagateAllowcateDataAccessInterface dataAccess; + private final NevagateAllowcateOutputBoundary outputBoundary; + + public NevagateAllowcateInteractor(NevagateAllowcateDataAccessInterface dataAccess, + NevagateAllowcateOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(NevagateAllowcateInputdata inputdata) { + // player should be able to go as long as they clicked the new game, so nothing is stopping them. + outputBoundary.nevagateAllowcatePage(); + // go to allowcate page. + } +} diff --git a/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateOutputBoundary.java b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateOutputBoundary.java new file mode 100644 index 000000000..b27ccfad5 --- /dev/null +++ b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateOutputBoundary.java @@ -0,0 +1,18 @@ +package usecases.nevagateAllowcatePage; + +/** + * Output boundary, should be able to go to allowcate point page or, it not able restrict player. + */ +public interface NevagateAllowcateOutputBoundary { + + /** + * If player is able to go. + */ + void nevagateAllowcatePage(); + + /** + * If player is restricted. + * @param errormessage error message. + */ + void nevagateAllowcateFail(String errormessage); +} diff --git a/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateOutputdata.java b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateOutputdata.java new file mode 100644 index 000000000..1014d1cab --- /dev/null +++ b/src/main/java/usecases/nevagateAllowcatePage/NevagateAllowcateOutputdata.java @@ -0,0 +1,7 @@ +package usecases.nevagateAllowcatePage; + +/** + * Outputdata for presentation, not needed. + */ +public class NevagateAllowcateOutputdata { +} diff --git a/src/main/java/view/CharacterCreationView.java b/src/main/java/view/CharacterCreationView.java index 4ed3e9a12..f9d9cbbd3 100644 --- a/src/main/java/view/CharacterCreationView.java +++ b/src/main/java/view/CharacterCreationView.java @@ -1,12 +1,20 @@ package view; +import interface_adapters.startallowcatepoint.AllowcateController; +import interface_adapters.startallowcatepoint.AllowcateInterface; + import javax.swing.*; import java.awt.*; /** * Character creation view. */ -public class CharacterCreationView extends JFrame { +public class CharacterCreationView extends JFrame implements AllowcateInterface { + public static final String textSocial = "Social"; + public static final String textLuck = "Luck"; + public static final String textThrift = "Thrift"; + public static final String textMobilization = "Mobilization"; + public static final String textGeneralship = "Generalship"; private int points = Constants.TWENTY; private final JLabel pointsLabel; private final JLabel socialLabel; @@ -14,11 +22,11 @@ public class CharacterCreationView extends JFrame { private final JLabel mobilizationLabel; private final JLabel thriftLabel; private final JLabel generalshipLabel; - private int social = 0; - private int luck = 0; - private int mobilization = 0; - private int thrift = 0; - private int generalship = 0; + private int social; + private int luck; + private int mobilization; + private int thrift; + private int generalship; @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings", "checkstyle:ExecutableStatementCount"}) @@ -37,27 +45,27 @@ public CharacterCreationView() { // Attribute Labels and Buttons socialLabel = new JLabel("Social: " + social); - final JButton socialButton = createButton("Social"); + final JButton socialButton = createButton(textSocial); container.add(socialLabel); container.add(socialButton); luckLabel = new JLabel("Luck: " + luck); - final JButton luckButton = createButton("Luck"); + final JButton luckButton = createButton(textLuck); container.add(luckLabel); container.add(luckButton); mobilizationLabel = new JLabel("Mobilization: " + mobilization); - final JButton mobilizationButton = createButton("Mobilization"); + final JButton mobilizationButton = createButton(textMobilization); container.add(mobilizationLabel); container.add(mobilizationButton); thriftLabel = new JLabel("Thrift: " + thrift); - final JButton thriftButton = createButton("Thrift"); + final JButton thriftButton = createButton(textThrift); container.add(thriftLabel); container.add(thriftButton); generalshipLabel = new JLabel("Generalship: " + generalship); - final JButton generalshipButton = createButton("Generalship"); + final JButton generalshipButton = createButton(textGeneralship); container.add(generalshipLabel); container.add(generalshipButton); @@ -75,29 +83,28 @@ public CharacterCreationView() { addListeners(socialButton, luckButton, mobilizationButton, thriftButton, generalshipButton); backButton.addActionListener(e -> { - dispose(); - new MainView(); + }); startGameButton.addActionListener(e -> { - dispose(); - new GameView(); + }); // Window settings setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); - setVisible(true); + setVisible(false); } @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) - private void addListeners(JButton socialButton, JButton luckButton, JButton mobilizationButton, JButton thriftButton, JButton generalshipButton) { - socialButton.addActionListener(e -> updatePoints("Social")); - luckButton.addActionListener(e -> updatePoints("Luck")); - mobilizationButton.addActionListener(e -> updatePoints("Mobilization")); - thriftButton.addActionListener(e -> updatePoints("Thrift")); - generalshipButton.addActionListener(e -> updatePoints("Generalship")); + private void addListeners(JButton socialButton, JButton luckButton, JButton mobilizationButton, + JButton thriftButton, JButton generalshipButton) { + socialButton.addActionListener(e -> updatePoints(textSocial)); + luckButton.addActionListener(e -> updatePoints(textLuck)); + mobilizationButton.addActionListener(e -> updatePoints(textMobilization)); + thriftButton.addActionListener(e -> updatePoints(textThrift)); + generalshipButton.addActionListener(e -> updatePoints(textGeneralship)); } private void extracted(SpringLayout layout, Container container, JButton socialButton, JButton luckButton, @@ -178,7 +185,27 @@ private void updatePoints(String attribute) { } } - public static void main(String[] args) { - new CharacterCreationView(); + // public static void main(String[] args) { + // new CharacterCreationView(); + // } + public void render() { + setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); + setVisible(true); + } + + public void disrender() { + setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + setVisible(false); + } + + @Override + public void updateUiAllowcate(int newpoint, int newsocial, + int newluck, int newmobilization, int newthrift, int newgeneralship) { + // Since this view already captured the update component logic, we won't use it here. + } + + @Override + public void failureAllowcate(String message) { + // also got covered. } } diff --git a/src/main/java/view/EventView.java b/src/main/java/view/EventView.java index b0d5d69e8..7c3f9c0e8 100644 --- a/src/main/java/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -3,20 +3,14 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; -import interface_adapters.eventrespond.EventResponseController; -import interface_adapters.eventrespond.EventResponseInterface; - /** -// * Event view. + * Event view. */ -public class EventView extends JFrame implements EventResponseInterface { - private final JTextArea descriptionArea; - private final EventResponseController controller; - - public EventView(EventResponseController controller) { +public class EventView extends JFrame { + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) + public EventView() { super("Event"); - this.controller = controller; final Container container = getContentPane(); final SpringLayout layout = new SpringLayout(); @@ -28,7 +22,7 @@ public EventView(EventResponseController controller) { container.add(eventLabel); // Description Area - descriptionArea = new JTextArea("Event description goes here..."); + final JTextArea descriptionArea = new JTextArea("Event description goes here..."); descriptionArea.setEditable(false); descriptionArea.setBackground(Color.LIGHT_GRAY); descriptionArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); @@ -45,30 +39,45 @@ public EventView(EventResponseController controller) { container.add(backButton); // Layout Constraints - layoutComponents(layout, container, eventLabel, descriptionArea, fightButton, negotiateButton, fleeButton, backButton); + extracted(layout, eventLabel, container, descriptionArea, fightButton, negotiateButton, fleeButton); + + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, fightButton); // Add ActionListeners to Buttons - fightButton.addActionListener(e -> controller.execute(1)); // Choice 1 - negotiateButton.addActionListener(e -> controller.execute(2)); // Choice 2 - fleeButton.addActionListener(e -> controller.execute(3)); // Choice 3 - backButton.addActionListener(e -> dispose()); + final ActionListener returnToGameViewListener = e -> { + dispose(); + new GameView(); + }; + + addListeners(fightButton, returnToGameViewListener, negotiateButton, fleeButton, backButton); // Window Settings setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); - setVisible(true); + setVisible(false); } - private void layoutComponents(SpringLayout layout, Container container, JLabel eventLabel, JTextArea descriptionArea, - JButton fightButton, JButton negotiateButton, JButton fleeButton, JButton backButton) { + private static void addListeners(JButton fightButton, ActionListener returnToGameViewListener, + JButton negotiateButton, JButton fleeButton, JButton backButton) { + fightButton.addActionListener(returnToGameViewListener); + negotiateButton.addActionListener(returnToGameViewListener); + fleeButton.addActionListener(returnToGameViewListener); + backButton.addActionListener(returnToGameViewListener); + } + + private static void extracted(SpringLayout layout, JLabel eventLabel, Container container, + JTextArea descriptionArea, JButton fightButton, + JButton negotiateButton, JButton fleeButton) { layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, eventLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); layout.putConstraint(SpringLayout.NORTH, eventLabel, Constants.TWENTY, SpringLayout.NORTH, container); layout.putConstraint(SpringLayout.WEST, descriptionArea, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.EAST, descriptionArea, -Constants.TWENTY, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, descriptionArea, Constants.TWENTY, SpringLayout.SOUTH, eventLabel); - layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, container); + layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, + container); layout.putConstraint(SpringLayout.WEST, fightButton, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.NORTH, fightButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionArea); @@ -78,23 +87,19 @@ private void layoutComponents(SpringLayout layout, Container container, JLabel e layout.putConstraint(SpringLayout.WEST, fleeButton, Constants.TWENTY, SpringLayout.EAST, negotiateButton); layout.putConstraint(SpringLayout.NORTH, fleeButton, 0, SpringLayout.NORTH, fightButton); - - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, fightButton); } - @Override - public void updateEventDescription(String description) { - descriptionArea.setText(description); + public void render() { + setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + setVisible(true); } - @Override - public void updateUiResponse(String message) { - JOptionPane.showMessageDialog(this, "Success: " + message); + public void disrender() { + setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + setVisible(false); } - @Override - public void failureResponse(String errorMessage) { - JOptionPane.showMessageDialog(this, "Error: " + errorMessage); + public static void main(String[] args) { + new EventView(); } -} +} \ No newline at end of file diff --git a/src/main/java/view/GameOverView.java b/src/main/java/view/GameOverView.java index 0b5cb3ffa..223a023e1 100644 --- a/src/main/java/view/GameOverView.java +++ b/src/main/java/view/GameOverView.java @@ -46,7 +46,7 @@ public GameOverView() { setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); - setVisible(true); + setVisible(false); } private static void extracted(SpringLayout layout, JLabel titleLabel, Container container, JLabel scoreLabel, @@ -67,6 +67,15 @@ private static void extracted(SpringLayout layout, JLabel titleLabel, Container SpringLayout.HORIZONTAL_CENTER, container); layout.putConstraint(SpringLayout.NORTH, mainMenuButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionArea); } + public void render() { + setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); + setVisible(true); + } + + public void disrender() { + setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + setVisible(false); + } public static void main(String[] args) { new GameOverView(); diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index abf67b38d..e436ca263 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -87,7 +87,7 @@ public GameView() { setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); - setVisible(true); + setVisible(false); } private void extracted(SpringLayout layout, JLabel dayLabel, Container container, JLabel foodLabel, @@ -158,6 +158,16 @@ private void toggleInfoBox() { infoBox.setVisible(!isMapVisible); } + public void render() { + setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); + setVisible(true); + } + + public void disrender() { + setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + setVisible(false); + } + public static void main(String[] args) { new GameView(); } diff --git a/src/main/java/view/InformationView.java b/src/main/java/view/InformationView.java index 5436d09ec..890a5fb4b 100644 --- a/src/main/java/view/InformationView.java +++ b/src/main/java/view/InformationView.java @@ -54,9 +54,19 @@ public InformationView(String information) { setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); + setVisible(false); + } + + public void render() { + setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); setVisible(true); } + public void disrender() { + setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + setVisible(false); + } + public static void main(String[] args) { // Sample information to display final String sampleInformation = "This is the system-generated information. " diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index 9e61a22e6..f1680c366 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -98,6 +98,10 @@ private void layout(int offsetX) { } + public void render() { + setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); + setVisible(true); + } public static void main(String[] args) { new LoginView(); diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index af1849d29..b42d66512 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -1,5 +1,8 @@ package view; +import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; +import interface_adapters.startallowcatepoint.AllowcateController; + import javax.swing.*; import java.awt.*; /** @@ -11,11 +14,11 @@ public class MainView extends JFrame { private JButton rankingButton = new JButton("Ranking"); private JButton quitButton = new JButton("Quit"); private JButton logoutButton = new JButton("Logout"); + private NevagateAllowcateController nevagateAllowcateController; @SuppressWarnings({"checkstyle:MultipleStringLiterals", "checkstyle:SuppressWarnings"}) public MainView() { super("Main Menu"); - // Set layout and container final Container container = getContentPane(); final SpringLayout layout = new SpringLayout(); @@ -62,11 +65,13 @@ public MainView() { // Add listeners for buttons addListeners(); - // Set window properties - setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + // Set window properties (moved to render()) setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); - setVisible(true); + } + + public void setNevagateAllowcateController(NevagateAllowcateController nevagateAllowcateController) { + this.nevagateAllowcateController = nevagateAllowcateController; } // Add ActionListener to buttons @@ -74,14 +79,12 @@ public MainView() { private void addListeners() { // Switch to GameView when "New Game" is clicked newGameButton.addActionListener(e -> { - dispose(); - new CharacterCreationView(); + nevagateAllowcateController.execute(); }); // Switch to RankView when "Ranking" is clicked rankingButton.addActionListener(e -> { - dispose(); - new RankingView(); + }); // Exit the game when "Quit" is clicked @@ -91,12 +94,22 @@ private void addListeners() { // Switch to LoginView when "Logout" is clicked logoutButton.addActionListener(e -> { - dispose(); - new LoginView(); + }); } - public static void main(String[] args) { - new MainView(); + // Add render method + public void render() { + setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + setVisible(true); } + + public void disrender() { + setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + setVisible(false); + } + + // public static void main(String[] args) { + // new MainView().render(); // Call render() to display the view + // } } diff --git a/src/main/java/view/RankingView.java b/src/main/java/view/RankingView.java index d76867625..8274927cf 100644 --- a/src/main/java/view/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -91,6 +91,11 @@ private static void extracted(Object[][] data, String[] columnNames, Container c container.add(scrollPane, BorderLayout.CENTER); } + public void render() { + setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); + setVisible(true); + } + public static void main(String[] args) { new RankingView(); } diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index 7947c1e06..6e7a22aca 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -111,6 +111,11 @@ private void extracted(int offsetX) { springLayout.putConstraint(SpringLayout.NORTH, againText, 0, SpringLayout.NORTH, againLabel); } + public void render() { + setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); + setVisible(true); + } + public static void main(String[] args) { new SignUpView(); } From df17d5b1648ff9753cdf072f60a184f4feffdeb2 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 1 Dec 2024 16:26:42 -0700 Subject: [PATCH 088/154] Further implmentation of game application --- src/main/java/app/GameMainApplication.java | 7 ++++ .../AllowcateInterface.java | 12 ------ .../AllowcatePresenter.java | 11 +++--- .../NevagateStartGameDataAccessInterface.java | 7 ++++ .../NevagateStartGameInputBoundary.java | 8 ++++ .../NevagateStartGameInputdata.java | 7 ++++ .../NevagateStartGameInteractor.java | 4 ++ .../NevagateStartGameOutputBoundary.java | 4 ++ .../NevagateStartGameOutputdata.java | 4 ++ .../startallowcate/AllowcateInteractor.java | 16 ++++---- .../AllowcateOutputBoundary.java | 2 +- .../startallowcate/AllowcateOutputData.java | 38 ------------------- src/main/java/view/CharacterCreationView.java | 21 ++++++---- 13 files changed, 70 insertions(+), 71 deletions(-) create mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameDataAccessInterface.java create mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameInputBoundary.java create mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameInputdata.java create mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameInteractor.java create mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputBoundary.java create mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputdata.java diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index e73c63d9b..c5cc2b5a0 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -9,8 +9,10 @@ import interface_adapters.NavigationManager; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; import interface_adapters.nevagateallowcatepage.NevagateAllowcatePresenter; +import interface_adapters.startallowcatepoint.AllowcateController; import interface_adapters.startallowcatepoint.AllowcatePresenter; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; +import usecases.startallowcate.AllowcateInteractor; import view.*; /** @@ -69,6 +71,11 @@ public static void main(String[] args) { new NevagateAllowcateController(nevagateAllowcateInteractor); mainView.setNevagateAllowcateController(nevagateAllowcateController); mainView.render(); + // Allowcate points ussecase. + final AllowcatePresenter allowcatePresenter = new AllowcatePresenter(attributeview, navigationManager); + final AllowcateInteractor allowcateInteractor = new AllowcateInteractor(gamedatabase, allowcatePresenter); + final AllowcateController allowcateController = new AllowcateController(allowcateInteractor); + attributeview.setAllowcateController(allowcateController); } } diff --git a/src/main/java/interface_adapters/startallowcatepoint/AllowcateInterface.java b/src/main/java/interface_adapters/startallowcatepoint/AllowcateInterface.java index 72a95b0de..6a92d9c85 100644 --- a/src/main/java/interface_adapters/startallowcatepoint/AllowcateInterface.java +++ b/src/main/java/interface_adapters/startallowcatepoint/AllowcateInterface.java @@ -4,18 +4,6 @@ * Interface of allowcate point. */ public interface AllowcateInterface { - - /** - * Update the ui after executed with the given info derived from outputdata. - * @param point new point - * @param social new social - * @param luck new luck - * @param mobilization new mobilization - * @param thrift new thrift - * @param generalship new generalship - */ - void updateUiAllowcate(int point, int social, int luck, int mobilization, int thrift, int generalship); - /** * Failure message if the usecase is failed. (insuffient skill point for example) * @param message fail message diff --git a/src/main/java/interface_adapters/startallowcatepoint/AllowcatePresenter.java b/src/main/java/interface_adapters/startallowcatepoint/AllowcatePresenter.java index 671b38860..b5984e042 100644 --- a/src/main/java/interface_adapters/startallowcatepoint/AllowcatePresenter.java +++ b/src/main/java/interface_adapters/startallowcatepoint/AllowcatePresenter.java @@ -1,5 +1,6 @@ package interface_adapters.startallowcatepoint; +import interface_adapters.NavigationManager; import usecases.startallowcate.AllowcateOutputBoundary; import usecases.startallowcate.AllowcateOutputData; @@ -7,17 +8,17 @@ * Allowcate presenter. */ public class AllowcatePresenter implements AllowcateOutputBoundary { + private final NavigationManager navigationManager; private final AllowcateInterface view; - public AllowcatePresenter(AllowcateInterface view) { + public AllowcatePresenter(AllowcateInterface view, NavigationManager navigationManager) { this.view = view; + this.navigationManager = navigationManager; } @Override - public void preparesuccessview(AllowcateOutputData outputData) { - view.updateUiAllowcate(outputData.getPoint(), - outputData.getSocial(), outputData.getLuck(), - outputData.getMobilization(), outputData.getThrift(), outputData.getGeneralship()); + public void NevagateStartGame(AllowcateOutputData outputData) { + navigationManager.showGameView(); } @Override diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameDataAccessInterface.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameDataAccessInterface.java new file mode 100644 index 000000000..ef003017d --- /dev/null +++ b/src/main/java/usecases/nevagatestartgame/NevagateStartGameDataAccessInterface.java @@ -0,0 +1,7 @@ +package usecases.nevagatestartgame; + +/** + * Not needed, we don't need info from database. + */ +public interface NevagateStartGameDataAccessInterface { +} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputBoundary.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputBoundary.java new file mode 100644 index 000000000..e7e58ea4b --- /dev/null +++ b/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.nevagatestartgame; + +/** + * Execute method is gurenteed. + */ +public interface NevagateStartGameInputBoundary { + void execute(NevagateStartGameInputdata InputData); +} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputdata.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputdata.java new file mode 100644 index 000000000..6da166804 --- /dev/null +++ b/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputdata.java @@ -0,0 +1,7 @@ +package usecases.nevagatestartgame; + +/** + * Input from player side. + */ +public class NevagateStartGameInputdata { +} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameInteractor.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameInteractor.java new file mode 100644 index 000000000..3c078d689 --- /dev/null +++ b/src/main/java/usecases/nevagatestartgame/NevagateStartGameInteractor.java @@ -0,0 +1,4 @@ +package usecases.nevagatestartgame; + +public class NevagateStartGameInteractor { +} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputBoundary.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputBoundary.java new file mode 100644 index 000000000..1ea22a4b5 --- /dev/null +++ b/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputBoundary.java @@ -0,0 +1,4 @@ +package usecases.nevagatestartgame; + +public interface NevagateStartGameOutputBoundary { +} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputdata.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputdata.java new file mode 100644 index 000000000..3e6b99559 --- /dev/null +++ b/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputdata.java @@ -0,0 +1,4 @@ +package usecases.nevagatestartgame; + +public class NevagateStartGameOutputdata { +} diff --git a/src/main/java/usecases/startallowcate/AllowcateInteractor.java b/src/main/java/usecases/startallowcate/AllowcateInteractor.java index a7e75b608..02e983930 100644 --- a/src/main/java/usecases/startallowcate/AllowcateInteractor.java +++ b/src/main/java/usecases/startallowcate/AllowcateInteractor.java @@ -20,21 +20,23 @@ public void execute(AllowcateInputdata inputdata) { String failmessage = " "; // Check if points are available - if (inputdata.getPoint() < 0) { - failmessage = "Not enough Attribute points."; + if (inputdata.getPoint() > 0) { + failmessage = "Not all attribute points used!"; allowcateOutputBoundary.preparefailureview(failmessage); } - else { + else if (inputdata.getPoint() == 0) { allowcateDataAccessInterface.setPoint(inputdata.getPoint()); allowcateDataAccessInterface.setSocial(inputdata.getSocial()); allowcateDataAccessInterface.setLuck(inputdata.getLuck()); allowcateDataAccessInterface.setMobilization(inputdata.getMobilization()); allowcateDataAccessInterface.setThrift(inputdata.getThrift()); allowcateDataAccessInterface.setGeneralship(inputdata.getGeneralship()); - final AllowcateOutputData outputData = new AllowcateOutputData(inputdata.getPoint(), inputdata.getSocial(), - inputdata.getLuck(), inputdata.getMobilization(), inputdata.getThrift(), - inputdata.getGeneralship()); - allowcateOutputBoundary.preparesuccessview(outputData); + final AllowcateOutputData outputData = new AllowcateOutputData(); + allowcateOutputBoundary.NevagateStartGame(outputData); + } + else { + failmessage = "Insufficient points!"; + allowcateOutputBoundary.preparefailureview(failmessage); } } } diff --git a/src/main/java/usecases/startallowcate/AllowcateOutputBoundary.java b/src/main/java/usecases/startallowcate/AllowcateOutputBoundary.java index 5570dc6e2..b4b5654ef 100644 --- a/src/main/java/usecases/startallowcate/AllowcateOutputBoundary.java +++ b/src/main/java/usecases/startallowcate/AllowcateOutputBoundary.java @@ -8,7 +8,7 @@ public interface AllowcateOutputBoundary { * If success, then use new updated attributes stored in outputdata to create new view for player. * @param outputData all new updated attribute point. */ - void preparesuccessview(AllowcateOutputData outputData); + void NevagateStartGame(AllowcateOutputData outputData); /** * If failure, such as points is already zero, show player this is invaild move, or don't let them click at all. diff --git a/src/main/java/usecases/startallowcate/AllowcateOutputData.java b/src/main/java/usecases/startallowcate/AllowcateOutputData.java index fba5fc78a..5f86f69f7 100644 --- a/src/main/java/usecases/startallowcate/AllowcateOutputData.java +++ b/src/main/java/usecases/startallowcate/AllowcateOutputData.java @@ -4,43 +4,5 @@ * Outputdata type for the view side, which contain newly updated attributes and points left for them to update view. */ public class AllowcateOutputData { - private int point; - private int social; - private int luck; - private int mobilization; - private int thrift; - private int generalship; - public AllowcateOutputData(int point, int social, int luck, int mobilization, int thrift, int generalship) { - this.point = point; - this.social = social; - this.luck = luck; - this.mobilization = mobilization; - this.thrift = thrift; - this.generalship = generalship; - } - - public int getPoint() { - return point; - } - - public int getSocial() { - return social; - } - - public int getLuck() { - return luck; - } - - public int getMobilization() { - return mobilization; - } - - public int getThrift() { - return thrift; - } - - public int getGeneralship() { - return generalship; - } } diff --git a/src/main/java/view/CharacterCreationView.java b/src/main/java/view/CharacterCreationView.java index f9d9cbbd3..8884f0b8e 100644 --- a/src/main/java/view/CharacterCreationView.java +++ b/src/main/java/view/CharacterCreationView.java @@ -27,6 +27,7 @@ public class CharacterCreationView extends JFrame implements AllowcateInterface private int mobilization; private int thrift; private int generalship; + private AllowcateController allowcateController; @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings", "checkstyle:ExecutableStatementCount"}) @@ -87,7 +88,7 @@ public CharacterCreationView() { }); startGameButton.addActionListener(e -> { - + allowcateController.execute(points, social, luck, mobilization, thrift, generalship); }); // Window settings @@ -97,6 +98,10 @@ public CharacterCreationView() { setVisible(false); } + public void setAllowcateController(AllowcateController allowcateController) { + this.allowcateController = allowcateController; + } + @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) private void addListeners(JButton socialButton, JButton luckButton, JButton mobilizationButton, JButton thriftButton, JButton generalshipButton) { @@ -198,14 +203,14 @@ public void disrender() { setVisible(false); } - @Override - public void updateUiAllowcate(int newpoint, int newsocial, - int newluck, int newmobilization, int newthrift, int newgeneralship) { - // Since this view already captured the update component logic, we won't use it here. - } - @Override public void failureAllowcate(String message) { - // also got covered. + // Display the failure message in a dialog box + JOptionPane.showMessageDialog( + this, + message, + "Allocation Failed", + JOptionPane.ERROR_MESSAGE + ); } } From 78c84c49f0149a1337a3a1a5ab84d40fb6c963f1 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 1 Dec 2024 17:02:15 -0700 Subject: [PATCH 089/154] Navigate Main usecase completed --- .../NevagateMainController.java | 20 +++++++++++++++++++ .../NevagateMainInterface.java | 7 +++++++ .../NevagateMainPresenter.java | 17 ++++++++++++++++ .../NevagateMainDataAccessInterface.java | 7 +++++++ .../NevagateMainInputBoundary.java | 8 ++++++++ .../nevagatemain/NevagateMainInputdata.java | 7 +++++++ .../nevagatemain/NevagateMainInteractor.java | 20 +++++++++++++++++++ .../NevagateMainOutputBoundary.java | 9 +++++++++ .../nevagatemain/NevagateMainOutputdata.java | 7 +++++++ 9 files changed, 102 insertions(+) create mode 100644 src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java create mode 100644 src/main/java/interface_adapters/nevagatemainview/NevagateMainInterface.java create mode 100644 src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java create mode 100644 src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java create mode 100644 src/main/java/usecases/nevagatemain/NevagateMainInputBoundary.java create mode 100644 src/main/java/usecases/nevagatemain/NevagateMainInputdata.java create mode 100644 src/main/java/usecases/nevagatemain/NevagateMainInteractor.java create mode 100644 src/main/java/usecases/nevagatemain/NevagateMainOutputBoundary.java create mode 100644 src/main/java/usecases/nevagatemain/NevagateMainOutputdata.java diff --git a/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java b/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java new file mode 100644 index 000000000..811d72c2a --- /dev/null +++ b/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java @@ -0,0 +1,20 @@ +package interface_adapters.nevagatemainview; + +import usecases.nevagatemain.NevagateMainInputBoundary; +import usecases.nevagatemain.NevagateMainInputdata; + +/** + * Controller for navigating to new page. + */ +public class NevagateMainController { + private final NevagateMainInputBoundary interacter; + + public NevagateMainController(NevagateMainInputBoundary interacter) { + this.interacter = interacter; + } + + public void execute() { + final NevagateMainInputdata inputdata = new NevagateMainInputdata(); + interacter.execute(inputdata); + } +} diff --git a/src/main/java/interface_adapters/nevagatemainview/NevagateMainInterface.java b/src/main/java/interface_adapters/nevagatemainview/NevagateMainInterface.java new file mode 100644 index 000000000..90540ed64 --- /dev/null +++ b/src/main/java/interface_adapters/nevagatemainview/NevagateMainInterface.java @@ -0,0 +1,7 @@ +package interface_adapters.nevagatemainview; + +/** + * Not needed. + */ +public interface NevagateMainInterface { +} diff --git a/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java b/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java new file mode 100644 index 000000000..50a36446a --- /dev/null +++ b/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java @@ -0,0 +1,17 @@ +package interface_adapters.nevagatemainview; + +import interface_adapters.NavigationManager; +import usecases.nevagatemain.NevagateMainOutputBoundary; + +public class NevagateMainPresenter implements NevagateMainOutputBoundary { + private NavigationManager navigationManager; + + public NevagateMainPresenter(NavigationManager navigationManager) { + this.navigationManager = navigationManager; + } + + @Override + public void prepareMainView() { + navigationManager.showMainView(); + } +} diff --git a/src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java b/src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java new file mode 100644 index 000000000..6da6f455f --- /dev/null +++ b/src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java @@ -0,0 +1,7 @@ +package usecases.nevagatemain; + +/** + * Not needed, this is when player click back. + */ +public interface NevagateMainDataAccessInterface { +} diff --git a/src/main/java/usecases/nevagatemain/NevagateMainInputBoundary.java b/src/main/java/usecases/nevagatemain/NevagateMainInputBoundary.java new file mode 100644 index 000000000..f5f2c7392 --- /dev/null +++ b/src/main/java/usecases/nevagatemain/NevagateMainInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.nevagatemain; + +/** + * Execute method. + */ +public interface NevagateMainInputBoundary { + public void execute(NevagateMainInputdata inputdata); +} diff --git a/src/main/java/usecases/nevagatemain/NevagateMainInputdata.java b/src/main/java/usecases/nevagatemain/NevagateMainInputdata.java new file mode 100644 index 000000000..91abeabdb --- /dev/null +++ b/src/main/java/usecases/nevagatemain/NevagateMainInputdata.java @@ -0,0 +1,7 @@ +package usecases.nevagatemain; + +/** + * Not needed, no restriction to go back. + */ +public class NevagateMainInputdata { +} diff --git a/src/main/java/usecases/nevagatemain/NevagateMainInteractor.java b/src/main/java/usecases/nevagatemain/NevagateMainInteractor.java new file mode 100644 index 000000000..c65ac745a --- /dev/null +++ b/src/main/java/usecases/nevagatemain/NevagateMainInteractor.java @@ -0,0 +1,20 @@ +package usecases.nevagatemain; + +/** + * Nevagate interactor. + */ +public class NevagateMainInteractor implements NevagateMainInputBoundary { + private final NevagateMainDataAccessInterface dataaccess; + private final NevagateMainOutputBoundary outputboundary; + + public NevagateMainInteractor(NevagateMainDataAccessInterface dataaccess, + NevagateMainOutputBoundary outputboundary) { + this.dataaccess = dataaccess; + this.outputboundary = outputboundary; + } + + @Override + public void execute(NevagateMainInputdata inputdata) { + outputboundary.prepareMainView(); + } +} diff --git a/src/main/java/usecases/nevagatemain/NevagateMainOutputBoundary.java b/src/main/java/usecases/nevagatemain/NevagateMainOutputBoundary.java new file mode 100644 index 000000000..e73e844e3 --- /dev/null +++ b/src/main/java/usecases/nevagatemain/NevagateMainOutputBoundary.java @@ -0,0 +1,9 @@ +package usecases.nevagatemain; + +/** + * OutputBOundary, should be able to have method go back to main page. + */ +public interface NevagateMainOutputBoundary { + + void prepareMainView(); +} diff --git a/src/main/java/usecases/nevagatemain/NevagateMainOutputdata.java b/src/main/java/usecases/nevagatemain/NevagateMainOutputdata.java new file mode 100644 index 000000000..941fa83c6 --- /dev/null +++ b/src/main/java/usecases/nevagatemain/NevagateMainOutputdata.java @@ -0,0 +1,7 @@ +package usecases.nevagatemain; + +/** + * No output data is needed to go back. + */ +public class NevagateMainOutputdata { +} From 44012f0744d037f0c000155a477b33de5181015b Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sun, 1 Dec 2024 19:03:43 -0500 Subject: [PATCH 090/154] EventControllers Updated based on CA --- .../eventrespond/EventResponseController.java | 42 ++--------- .../eventrespond/EventResponseInterface.java | 14 ++-- .../eventrespond/EventResponsePresenter.java | 3 +- .../ambush/AmbushResponseController.java | 24 +++++++ .../ambush/AmbushResponseInterface.java | 10 +++ .../ambush/AmbushResponsePresenter.java | 25 +++++++ .../blizzard/BlizzardResponseController.java | 24 +++++++ .../blizzard/BlizzardResponseInterface.java | 10 +++ .../blizzard/BlizzardResponsePresenter.java | 25 +++++++ .../flood/FloodResponseController.java | 24 +++++++ .../flood/FloodResponseInterface.java | 10 +++ .../flood/FloodResponsePresenter.java | 25 +++++++ .../survivor/SurvivorResponseController.java | 24 +++++++ .../survivor/SurvivorResponseInterface.java | 10 +++ .../survivor/SurvivorResponsePresenter.java | 25 +++++++ .../trader/TraderResponseController.java | 24 +++++++ .../trader/TraderResponseInterface.java | 10 +++ .../trader/TraderResponsePresenter.java | 25 +++++++ src/main/java/view/EventView.java | 71 ++++++++++--------- 19 files changed, 344 insertions(+), 81 deletions(-) create mode 100644 src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseController.java create mode 100644 src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseInterface.java create mode 100644 src/main/java/interface_adapters/eventrespond/ambush/AmbushResponsePresenter.java create mode 100644 src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseController.java create mode 100644 src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseInterface.java create mode 100644 src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponsePresenter.java create mode 100644 src/main/java/interface_adapters/eventrespond/flood/FloodResponseController.java create mode 100644 src/main/java/interface_adapters/eventrespond/flood/FloodResponseInterface.java create mode 100644 src/main/java/interface_adapters/eventrespond/flood/FloodResponsePresenter.java create mode 100644 src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseController.java create mode 100644 src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseInterface.java create mode 100644 src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponsePresenter.java create mode 100644 src/main/java/interface_adapters/eventrespond/trader/TraderResponseController.java create mode 100644 src/main/java/interface_adapters/eventrespond/trader/TraderResponseInterface.java create mode 100644 src/main/java/interface_adapters/eventrespond/trader/TraderResponsePresenter.java diff --git a/src/main/java/interface_adapters/eventrespond/EventResponseController.java b/src/main/java/interface_adapters/eventrespond/EventResponseController.java index 96991231e..9a751a474 100644 --- a/src/main/java/interface_adapters/eventrespond/EventResponseController.java +++ b/src/main/java/interface_adapters/eventrespond/EventResponseController.java @@ -1,21 +1,10 @@ package interface_adapters.eventrespond; -import entities.Event; -import entities.EventAmbush; -import entities.EventFlood; -import entities.EventBlizzard; -import entities.EventTraderEncounter; -import entities.EventSurvivorJoins; -import usecases.eventrespond.shared.*; -import usecases.eventrespond.ambush.AmbushEventInteractor; -import usecases.eventrespond.flood.FloodEventInteractor; -import usecases.eventrespond.blizzard.BlizzardEventInteractor; -import usecases.eventrespond.trader.TraderEventInteractor; -import usecases.eventrespond.survivor.SurvivorEventInteractor; +import usecases.eventrespond.shared.RespondInputBoundary; +import usecases.eventrespond.shared.RespondInputData; /** - * Controller for handling event responses using a single adapter. - * Determines the correct interactor based on the event type. + * Controller for handling event responses and delegating to the correct interactor. */ public class EventResponseController { private final RespondInputBoundary interactor; @@ -25,28 +14,11 @@ public EventResponseController(RespondInputBoundary interactor) { } /** - * Handles the response to a given event by selecting the appropriate interactor. - * @param choice The player's input data (choice). + * Execute the interactor by converting player input into input data. + * @param choice The player's choice for the event response. */ public void execute(int choice) { - //Event event = dataAccess.getevent(); - - //RespondInputBoundary interactor; - //if (event instanceof EventAmbush) { - // interactor = new AmbushEventInteractor(dataAccess, outputBoundary); - //} else if (event instanceof EventFlood) { - // interactor = new FloodEventInteractor(dataAccess, outputBoundary); - //} else if (event instanceof EventBlizzard) { - // interactor = new BlizzardEventInteractor(dataAccess, outputBoundary); - //} else if (event instanceof EventTraderEncounter) { - // interactor = new TraderEventInteractor(dataAccess, outputBoundary); - //} else if (event instanceof EventSurvivorJoins) { - // interactor = new SurvivorEventInteractor(dataAccess, outputBoundary); - //} else { - // outputBoundary.prepareFailureView("Unknown event type."); - // return; - //} - //RespondInputData inputData = new RespondInputData(choice); - //interactor.execute(inputData); + RespondInputData inputData = new RespondInputData(choice); + interactor.execute(inputData); } } diff --git a/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java b/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java index b55b7249b..0364bcaa5 100644 --- a/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java +++ b/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java @@ -1,24 +1,18 @@ package interface_adapters.eventrespond; /** - * Interface for communicating with the view in a decoupled manner for event response use case. + * Interface for updating the event response UI. */ public interface EventResponseInterface { /** - * Update the event description in the UI. - * @param description The event description to display. - */ - void updateEventDescription(String description); - - /** - * Update the UI with the success message from the interactor. - * @param message The success message. + * Update the UI with the result of a successful event response. + * @param message The success message to display. */ void updateUiResponse(String message); /** - * Display an error message if the event response fails. + * Update the UI with an error message if the response fails. * @param errorMessage The error message to display. */ void failureResponse(String errorMessage); diff --git a/src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java index e246b362e..ae0e681f5 100644 --- a/src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java +++ b/src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java @@ -4,8 +4,7 @@ import usecases.eventrespond.shared.RespondOutputData; /** - * Presenter for the event response use case. - * Implements the RespondOutputBoundary interface to handle the use case output. + * Presenter for handling event response outputs. */ public class EventResponsePresenter implements RespondOutputBoundary { private final EventResponseInterface view; diff --git a/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseController.java b/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseController.java new file mode 100644 index 000000000..06af1fdda --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseController.java @@ -0,0 +1,24 @@ +package interface_adapters.eventrespond.ambush; + +import usecases.eventrespond.ambush.AmbushEventInteractor; +import usecases.eventrespond.shared.RespondInputData; + +/** + * Controller for handling responses to an Ambush event. + */ +public class AmbushResponseController { + private final AmbushEventInteractor interactor; + + public AmbushResponseController(AmbushEventInteractor interactor) { + this.interactor = interactor; + } + + /** + * Execute the interactor by converting the player’s input into input data. + * @param choice The player's choice for the event. + */ + public void execute(int choice) { + RespondInputData inputData = new RespondInputData(choice); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseInterface.java b/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseInterface.java new file mode 100644 index 000000000..90abfb937 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseInterface.java @@ -0,0 +1,10 @@ +package interface_adapters.eventrespond.ambush; + +/** + * Interface for updating the UI for an Ambush event. + */ +public interface AmbushResponseInterface { + void updateUiResponse(String message); + + void failureResponse(String errorMessage); +} diff --git a/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponsePresenter.java new file mode 100644 index 000000000..c453881c9 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponsePresenter.java @@ -0,0 +1,25 @@ +package interface_adapters.eventrespond.ambush; + +import usecases.eventrespond.shared.RespondOutputBoundary; +import usecases.eventrespond.shared.RespondOutputData; + +/** + * Presenter for handling the response output of an Ambush event. + */ +public class AmbushResponsePresenter implements RespondOutputBoundary { + private final AmbushResponseInterface view; + + public AmbushResponsePresenter(AmbushResponseInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(RespondOutputData outputData) { + view.updateUiResponse(outputData.getMessage()); + } + + @Override + public void prepareFailureView(String errorMessage) { + view.failureResponse(errorMessage); + } +} diff --git a/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseController.java b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseController.java new file mode 100644 index 000000000..fb0b3e3b9 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseController.java @@ -0,0 +1,24 @@ +package interface_adapters.eventrespond.blizzard; + +import usecases.eventrespond.blizzard.BlizzardEventInteractor; +import usecases.eventrespond.shared.RespondInputData; + +/** + * Controller for handling responses to a Blizzard event. + */ +public class BlizzardResponseController { + private final BlizzardEventInteractor interactor; + + public BlizzardResponseController(BlizzardEventInteractor interactor) { + this.interactor = interactor; + } + + /** + * Execute the interactor by converting the player’s input into input data. + * @param choice The player's choice for the event. + */ + public void execute(int choice) { + RespondInputData inputData = new RespondInputData(choice); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseInterface.java b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseInterface.java new file mode 100644 index 000000000..f10424101 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseInterface.java @@ -0,0 +1,10 @@ +package interface_adapters.eventrespond.blizzard; + +/** + * Interface for updating the UI for a Blizzard event. + */ +public interface BlizzardResponseInterface { + void updateUiResponse(String message); + + void failureResponse(String errorMessage); +} diff --git a/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponsePresenter.java new file mode 100644 index 000000000..1ab54a9aa --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponsePresenter.java @@ -0,0 +1,25 @@ +package interface_adapters.eventrespond.blizzard; + +import usecases.eventrespond.shared.RespondOutputBoundary; +import usecases.eventrespond.shared.RespondOutputData; + +/** + * Presenter for handling the response output of a Blizzard event. + */ +public class BlizzardResponsePresenter implements RespondOutputBoundary { + private final BlizzardResponseInterface view; + + public BlizzardResponsePresenter(BlizzardResponseInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(RespondOutputData outputData) { + view.updateUiResponse(outputData.getMessage()); + } + + @Override + public void prepareFailureView(String errorMessage) { + view.failureResponse(errorMessage); + } +} diff --git a/src/main/java/interface_adapters/eventrespond/flood/FloodResponseController.java b/src/main/java/interface_adapters/eventrespond/flood/FloodResponseController.java new file mode 100644 index 000000000..d5fdd8da0 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/flood/FloodResponseController.java @@ -0,0 +1,24 @@ +package interface_adapters.eventrespond.flood; + +import usecases.eventrespond.flood.FloodEventInteractor; +import usecases.eventrespond.shared.RespondInputData; + +/** + * Controller for handling responses to a Flood event. + */ +public class FloodResponseController { + private final FloodEventInteractor interactor; + + public FloodResponseController(FloodEventInteractor interactor) { + this.interactor = interactor; + } + + /** + * Execute the interactor by converting the player’s input into input data. + * @param choice The player's choice for the event. + */ + public void execute(int choice) { + RespondInputData inputData = new RespondInputData(choice); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/eventrespond/flood/FloodResponseInterface.java b/src/main/java/interface_adapters/eventrespond/flood/FloodResponseInterface.java new file mode 100644 index 000000000..aaf439e20 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/flood/FloodResponseInterface.java @@ -0,0 +1,10 @@ +package interface_adapters.eventrespond.flood; + +/** + * Interface for updating the UI for a Flood event. + */ +public interface FloodResponseInterface { + void updateUiResponse(String message); + + void failureResponse(String errorMessage); +} diff --git a/src/main/java/interface_adapters/eventrespond/flood/FloodResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/flood/FloodResponsePresenter.java new file mode 100644 index 000000000..b683b2d6f --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/flood/FloodResponsePresenter.java @@ -0,0 +1,25 @@ +package interface_adapters.eventrespond.flood; + +import usecases.eventrespond.shared.RespondOutputBoundary; +import usecases.eventrespond.shared.RespondOutputData; + +/** + * Presenter for handling the response output of a Flood event. + */ +public class FloodResponsePresenter implements RespondOutputBoundary { + private final FloodResponseInterface view; + + public FloodResponsePresenter(FloodResponseInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(RespondOutputData outputData) { + view.updateUiResponse(outputData.getMessage()); + } + + @Override + public void prepareFailureView(String errorMessage) { + view.failureResponse(errorMessage); + } +} diff --git a/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseController.java b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseController.java new file mode 100644 index 000000000..ce6a8eec1 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseController.java @@ -0,0 +1,24 @@ +package interface_adapters.eventrespond.survivor; + +import usecases.eventrespond.survivor.SurvivorEventInteractor; +import usecases.eventrespond.shared.RespondInputData; + +/** + * Controller for handling responses to a Survivor event. + */ +public class SurvivorResponseController { + private final SurvivorEventInteractor interactor; + + public SurvivorResponseController(SurvivorEventInteractor interactor) { + this.interactor = interactor; + } + + /** + * Execute the interactor by converting the player’s input into input data. + * @param choice The player's choice for the event. + */ + public void execute(int choice) { + RespondInputData inputData = new RespondInputData(choice); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseInterface.java b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseInterface.java new file mode 100644 index 000000000..280bda429 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseInterface.java @@ -0,0 +1,10 @@ +package interface_adapters.eventrespond.survivor; + +/** + * Interface for updating the UI for a Survivor event. + */ +public interface SurvivorResponseInterface { + void updateUiResponse(String message); + + void failureResponse(String errorMessage); +} diff --git a/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponsePresenter.java new file mode 100644 index 000000000..b8a0c948a --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponsePresenter.java @@ -0,0 +1,25 @@ +package interface_adapters.eventrespond.survivor; + +import usecases.eventrespond.shared.RespondOutputBoundary; +import usecases.eventrespond.shared.RespondOutputData; + +/** + * Presenter for handling the response output of a Survivor event. + */ +public class SurvivorResponsePresenter implements RespondOutputBoundary { + private final SurvivorResponseInterface view; + + public SurvivorResponsePresenter(SurvivorResponseInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(RespondOutputData outputData) { + view.updateUiResponse(outputData.getMessage()); + } + + @Override + public void prepareFailureView(String errorMessage) { + view.failureResponse(errorMessage); + } +} diff --git a/src/main/java/interface_adapters/eventrespond/trader/TraderResponseController.java b/src/main/java/interface_adapters/eventrespond/trader/TraderResponseController.java new file mode 100644 index 000000000..2e67fd1ca --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/trader/TraderResponseController.java @@ -0,0 +1,24 @@ +package interface_adapters.eventrespond.trader; + +import usecases.eventrespond.trader.TraderEventInteractor; +import usecases.eventrespond.shared.RespondInputData; + +/** + * Controller for handling responses to a Trader event. + */ +public class TraderResponseController { + private final TraderEventInteractor interactor; + + public TraderResponseController(TraderEventInteractor interactor) { + this.interactor = interactor; + } + + /** + * Execute the interactor by converting the player’s input into input data. + * @param choice The player's choice for the event. + */ + public void execute(int choice) { + RespondInputData inputData = new RespondInputData(choice); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/eventrespond/trader/TraderResponseInterface.java b/src/main/java/interface_adapters/eventrespond/trader/TraderResponseInterface.java new file mode 100644 index 000000000..061de30ed --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/trader/TraderResponseInterface.java @@ -0,0 +1,10 @@ +package interface_adapters.eventrespond.trader; + +/** + * Interface for updating the UI for a Trader event. + */ +public interface TraderResponseInterface { + void updateUiResponse(String message); + + void failureResponse(String errorMessage); +} diff --git a/src/main/java/interface_adapters/eventrespond/trader/TraderResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/trader/TraderResponsePresenter.java new file mode 100644 index 000000000..45a1b8260 --- /dev/null +++ b/src/main/java/interface_adapters/eventrespond/trader/TraderResponsePresenter.java @@ -0,0 +1,25 @@ +package interface_adapters.eventrespond.trader; + +import usecases.eventrespond.shared.RespondOutputBoundary; +import usecases.eventrespond.shared.RespondOutputData; + +/** + * Presenter for handling the response output of a Trader event. + */ +public class TraderResponsePresenter implements RespondOutputBoundary { + private final TraderResponseInterface view; + + public TraderResponsePresenter(TraderResponseInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(RespondOutputData outputData) { + view.updateUiResponse(outputData.getMessage()); + } + + @Override + public void prepareFailureView(String errorMessage) { + view.failureResponse(errorMessage); + } +} diff --git a/src/main/java/view/EventView.java b/src/main/java/view/EventView.java index b0d5d69e8..b96fe693b 100644 --- a/src/main/java/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -1,22 +1,27 @@ package view; +import interface_adapters.eventrespond.EventResponseController; +import interface_adapters.eventrespond.EventResponseInterface; +import interface_adapters.eventrespond.EventResponsePresenter; +import usecases.eventrespond.shared.RespondDataAccessInterface; +import usecases.eventrespond.shared.RespondInputData; + import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; -import interface_adapters.eventrespond.EventResponseController; -import interface_adapters.eventrespond.EventResponseInterface; /** -// * Event view. + * Event view. */ - public class EventView extends JFrame implements EventResponseInterface { - private final JTextArea descriptionArea; private final EventResponseController controller; - public EventView(EventResponseController controller) { + public EventView(RespondDataAccessInterface dataAccess) { super("Event"); - this.controller = controller; + + // Set up the presenter and controller + EventResponsePresenter presenter = new EventResponsePresenter(this); + // this.controller = new EventResponseController(dataAccess, presenter); final Container container = getContentPane(); final SpringLayout layout = new SpringLayout(); @@ -24,11 +29,11 @@ public EventView(EventResponseController controller) { // Event Label final JLabel eventLabel = new JLabel("Event:"); - eventLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); + eventLabel.setFont(new Font("Serif", Font.BOLD, 20)); container.add(eventLabel); // Description Area - descriptionArea = new JTextArea("Event description goes here..."); + final JTextArea descriptionArea = new JTextArea("Event description goes here..."); descriptionArea.setEditable(false); descriptionArea.setBackground(Color.LIGHT_GRAY); descriptionArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); @@ -45,56 +50,54 @@ public EventView(EventResponseController controller) { container.add(backButton); // Layout Constraints - layoutComponents(layout, container, eventLabel, descriptionArea, fightButton, negotiateButton, fleeButton, backButton); + setupLayout(layout, eventLabel, container, descriptionArea, fightButton, negotiateButton, fleeButton, backButton); // Add ActionListeners to Buttons - fightButton.addActionListener(e -> controller.execute(1)); // Choice 1 - negotiateButton.addActionListener(e -> controller.execute(2)); // Choice 2 - fleeButton.addActionListener(e -> controller.execute(3)); // Choice 3 - backButton.addActionListener(e -> dispose()); + // fightButton.addActionListener(e -> controller.execute(1)); + // negotiateButton.addActionListener(e -> controller.execute(2)); + // fleeButton.addActionListener(e -> controller.execute(3)); + backButton.addActionListener(e -> { + dispose(); + new GameView(); + }); // Window Settings - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setSize(600, 400); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(true); } - private void layoutComponents(SpringLayout layout, Container container, JLabel eventLabel, JTextArea descriptionArea, - JButton fightButton, JButton negotiateButton, JButton fleeButton, JButton backButton) { + private void setupLayout(SpringLayout layout, JLabel eventLabel, Container container, + JTextArea descriptionArea, JButton fightButton, JButton negotiateButton, JButton fleeButton, JButton backButton) { layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, eventLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, eventLabel, Constants.TWENTY, SpringLayout.NORTH, container); + layout.putConstraint(SpringLayout.NORTH, eventLabel, 20, SpringLayout.NORTH, container); - layout.putConstraint(SpringLayout.WEST, descriptionArea, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.EAST, descriptionArea, -Constants.TWENTY, SpringLayout.EAST, container); - layout.putConstraint(SpringLayout.NORTH, descriptionArea, Constants.TWENTY, SpringLayout.SOUTH, eventLabel); - layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, container); + layout.putConstraint(SpringLayout.WEST, descriptionArea, 20, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.EAST, descriptionArea, -20, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, descriptionArea, 20, SpringLayout.SOUTH, eventLabel); + layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -100, SpringLayout.SOUTH, container); - layout.putConstraint(SpringLayout.WEST, fightButton, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, fightButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionArea); + layout.putConstraint(SpringLayout.WEST, fightButton, 20, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, fightButton, 20, SpringLayout.SOUTH, descriptionArea); - layout.putConstraint(SpringLayout.WEST, negotiateButton, Constants.TWENTY, SpringLayout.EAST, fightButton); + layout.putConstraint(SpringLayout.WEST, negotiateButton, 20, SpringLayout.EAST, fightButton); layout.putConstraint(SpringLayout.NORTH, negotiateButton, 0, SpringLayout.NORTH, fightButton); - layout.putConstraint(SpringLayout.WEST, fleeButton, Constants.TWENTY, SpringLayout.EAST, negotiateButton); + layout.putConstraint(SpringLayout.WEST, fleeButton, 20, SpringLayout.EAST, negotiateButton); layout.putConstraint(SpringLayout.NORTH, fleeButton, 0, SpringLayout.NORTH, fightButton); layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, fightButton); - } - - @Override - public void updateEventDescription(String description) { - descriptionArea.setText(description); + layout.putConstraint(SpringLayout.NORTH, backButton, 20, SpringLayout.SOUTH, fightButton); } @Override public void updateUiResponse(String message) { - JOptionPane.showMessageDialog(this, "Success: " + message); + JOptionPane.showMessageDialog(this, "Success: " + message, "Event Response", JOptionPane.INFORMATION_MESSAGE); } @Override public void failureResponse(String errorMessage) { - JOptionPane.showMessageDialog(this, "Error: " + errorMessage); + JOptionPane.showMessageDialog(this, "Error: " + errorMessage, "Event Response", JOptionPane.ERROR_MESSAGE); } } From 8a7a71d0a439cbd28823a6f45098d579c084cd5b Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sun, 1 Dec 2024 20:03:02 -0500 Subject: [PATCH 091/154] Add the application for ranking, signup and login --- src/main/java/app/LoginApplication.java | 39 ++++++++ src/main/java/app/RankingApplication.java | 43 +++++++++ src/main/java/app/SignupApplication.java | 44 +++++++++ .../database/JsonPlayerRepository.java | 45 ---------- .../database/JsonSignupDataAccess.java | 90 +++++++++++++++++++ .../accountlogin/LoginInteractor.java | 12 +-- 6 files changed, 222 insertions(+), 51 deletions(-) create mode 100644 src/main/java/app/LoginApplication.java create mode 100644 src/main/java/app/RankingApplication.java create mode 100644 src/main/java/app/SignupApplication.java delete mode 100644 src/main/java/frameworks/database/JsonPlayerRepository.java create mode 100644 src/main/java/frameworks/database/JsonSignupDataAccess.java diff --git a/src/main/java/app/LoginApplication.java b/src/main/java/app/LoginApplication.java new file mode 100644 index 000000000..c081bfe9b --- /dev/null +++ b/src/main/java/app/LoginApplication.java @@ -0,0 +1,39 @@ +package app; + +import java.io.IOException; + +import frameworks.database.JsonLoginDataAccess; +import interface_adapters.login.LoginController; +import interface_adapters.login.LoginInterface; +import interface_adapters.login.LoginPresenter; +import usecases.accountlogin.LoginInputBoundary; +import usecases.accountlogin.LoginInteractor; +import usecases.accountlogin.LoginOutputBoundary; + +/** + * The LoginApplication class initializes and connects all components + * for the login feature, including the interactor, controller, presenter, + * and navigation manager. + */ +public class LoginApplication { + private static String filePath; + + /** + * Sets up the Login feature and returns the configured LoginController. + * + * @param loginView The LoginInterface implementation for displaying login results. + * @return A configured LoginController instance. + * @throws IOException If there is an issue reading the JSON file. + */ + public static LoginController initializeLogin(LoginInterface loginView) + throws IOException { + final JsonLoginDataAccess loginDataAccess = new JsonLoginDataAccess(filePath); + + final LoginPresenter loginPresenter = new LoginPresenter(loginView); + + final LoginOutputBoundary outputBoundary = loginPresenter; + final LoginInputBoundary loginInteractor = new LoginInteractor(loginDataAccess, outputBoundary); + + return new LoginController(loginInteractor); + } +} diff --git a/src/main/java/app/RankingApplication.java b/src/main/java/app/RankingApplication.java new file mode 100644 index 000000000..c364155b9 --- /dev/null +++ b/src/main/java/app/RankingApplication.java @@ -0,0 +1,43 @@ +package app; + +import java.io.IOException; + +import frameworks.database.JsonRankingDataAccess; +import interface_adapters.rankinglist.RankingController; +import interface_adapters.rankinglist.RankingInterface; +import interface_adapters.rankinglist.RankingPresenter; +import usecases.accountranking.RankingInputBoundary; +import usecases.accountranking.RankingInteractor; +import usecases.accountranking.RankingOutputBoundary; + +/** + * Application class for Ranking Use Case. + * Responsible for assembling and initializing the components for the ranking feature. + */ +public class RankingApplication { + private static String filePath; + + /** + * Initializes and assembles the components for the Ranking use case. + * + * @param rankingView The interface representing the view layer of the ranking feature. + * @return A RankingController instance that is connected to the use case. + * @throws IOException if there is an issue accessing ranking data files. + */ + public static RankingController initializeRanking(RankingInterface rankingView) throws IOException { + // Data access layer + final JsonRankingDataAccess rankingDataAccess = new JsonRankingDataAccess(filePath); + + // Presenter + final RankingPresenter rankingPresenter = new RankingPresenter(rankingView); + + // Output boundary is the presenter + final RankingOutputBoundary outputBoundary = rankingPresenter; + + // Use case interactor + final RankingInputBoundary rankingInteractor = new RankingInteractor(rankingDataAccess, outputBoundary); + + // Controller + return new RankingController(rankingInteractor); + } +} diff --git a/src/main/java/app/SignupApplication.java b/src/main/java/app/SignupApplication.java new file mode 100644 index 000000000..1ee460222 --- /dev/null +++ b/src/main/java/app/SignupApplication.java @@ -0,0 +1,44 @@ +package app; + + +import java.io.IOException; + +import frameworks.database.JsonSignupDataAccess; +import interface_adapters.signup.SignupController; +import interface_adapters.signup.SignupInterface; +import interface_adapters.signup.SignupPresenter; +import usecases.accountsignup.SignupInputBoundary; +import usecases.accountsignup.SignupInteractor; +import usecases.accountsignup.SignupOutputBoundary; + +/** + * Application class for Signup Use Case. + * Responsible for assembling and initializing the components for the signup feature. + */ +public class SignupApplication { + private static String filePath; + + /** + * Initializes and assembles the components for the Signup use case. + * + * @param signupView The interface representing the view layer of the signup feature. + * @return A SignupController instance that is connected to the use case. + * @throws IOException if there is an issue accessing signup data files. + */ + public static SignupController initializeSignup(SignupInterface signupView) throws IOException { + // Data access layer + final JsonSignupDataAccess signupDataAccess = new JsonSignupDataAccess(filePath); + + // Presenter + final SignupPresenter signupPresenter = new SignupPresenter(signupView); + + // Output boundary is the presenter + final SignupOutputBoundary outputBoundary = signupPresenter; + + // Use case interactor + final SignupInputBoundary signupInteractor = new SignupInteractor(signupDataAccess, outputBoundary); + + // Controller + return new SignupController(signupInteractor); + } +} diff --git a/src/main/java/frameworks/database/JsonPlayerRepository.java b/src/main/java/frameworks/database/JsonPlayerRepository.java deleted file mode 100644 index 35660540c..000000000 --- a/src/main/java/frameworks/database/JsonPlayerRepository.java +++ /dev/null @@ -1,45 +0,0 @@ -package frameworks.database; - -import java.io.IOException; -import java.util.List; - -import com.fasterxml.jackson.core.type.TypeReference; -import entities.Player; -import interface_adapters.gateways.PlayerRepository; - -/** - * A JSON-based implementation of the PlayerRepository interface. - */ -public class JsonPlayerRepository implements PlayerRepository { - private final FileDatabase database; - private List players; - - public JsonPlayerRepository(String filePath) throws IOException { - this.database = new FileDatabase<>(filePath, new TypeReference>() {}); - this.players = database.load(); - } - - @Override - public Player findByUsername(String username) { - return players.stream() - .filter(player -> player.getUsername().equals(username)) - .findFirst() - .orElse(null); - } - - @Override - public boolean isUsernameDuplicate(String username) { - return findByUsername(username) != null; - } - - @Override - public void addPlayer(Player player) { - players.add(player); - try { - database.save(players); - } - catch (IOException ioException) { - ioException.printStackTrace(); - } - } -} diff --git a/src/main/java/frameworks/database/JsonSignupDataAccess.java b/src/main/java/frameworks/database/JsonSignupDataAccess.java new file mode 100644 index 000000000..458577c5e --- /dev/null +++ b/src/main/java/frameworks/database/JsonSignupDataAccess.java @@ -0,0 +1,90 @@ +package frameworks.database; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.List; + +import com.fasterxml.jackson.core.type.TypeReference; +import entities.Player; +import usecases.accountsignup.SignupDataAccessInterface; + +/** + * A JSON-based implementation of the PlayerRepository interface. + */ +public class JsonSignupDataAccess implements SignupDataAccessInterface { + private final FileDatabase database; + private List players; + + public JsonSignupDataAccess(String filePath) throws IOException { + this.database = new FileDatabase<>(filePath, new TypeReference>() {}); + this.players = database.load(); + } + + /** + * Finds a player by their username. + * + * @param username The username to search for. + * @return The Player object if found, or null if no player with the given username exists. + */ + public Player findByUsername(String username) { + return players.stream() + .filter(player -> player.getUsername().equals(username)) + .findFirst() + .orElse(null); + } + + @Override + public boolean isUsernameTaken(String username) { + return findByUsername(username) != null; + } + + /** + * Generates a unique player ID based on the provided username and password. + * + * This method combines the username and password into a single string and applies + * the SHA-256 hashing algorithm to generate a unique, fixed-length player ID. + * + * @param username The player's username. + * @param password The player's password. + * @return A unique player ID as a hexadecimal string. + * @throws RuntimeException If the SHA-256 hashing algorithm is not available. + */ + public static String generatePlayerID(String username, String password) { + try { + // Combine username and password + final String input = username + ":" + password; + + // Create SHA-256 hash + final MessageDigest digest = MessageDigest.getInstance("SHA-256"); + final byte[] hashBytes = digest.digest(input.getBytes(StandardCharsets.UTF_8)); + + // Convert byte array to hexadecimal string + final StringBuilder hexString = new StringBuilder(); + for (byte b : hashBytes) { + final String hex = Integer.toHexString(255 & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + // Return hashed ID + return hexString.toString(); + } + catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Error generating player ID: " + e.getMessage(), e); + } + } + + @Override + public void addUser(String username, String password) { + players.add(new Player(generatePlayerID(username, password), username, password)); + try { + database.save(players); + } + catch (IOException ioException) { + ioException.printStackTrace(); + } + } +} diff --git a/src/main/java/usecases/accountlogin/LoginInteractor.java b/src/main/java/usecases/accountlogin/LoginInteractor.java index 4ded0bd7e..b09d11aa2 100644 --- a/src/main/java/usecases/accountlogin/LoginInteractor.java +++ b/src/main/java/usecases/accountlogin/LoginInteractor.java @@ -6,17 +6,17 @@ * including credential validation and user existence checks. */ public class LoginInteractor implements LoginInputBoundary { - private final LoginDataAccessInterface dataAccessInterface; + private final LoginDataAccessInterface dataAccess; private final LoginOutputBoundary outputBoundary; /** * Constructs a LoginInteractor with the specified data access interface and output boundary. * - * @param dataAccessInterface The interface for accessing user data for login. + * @param dataAccess The interface for accessing user data for login. * @param outputBoundary The output boundary for presenting login results. */ - public LoginInteractor(LoginDataAccessInterface dataAccessInterface, LoginOutputBoundary outputBoundary) { - this.dataAccessInterface = dataAccessInterface; + public LoginInteractor(LoginDataAccessInterface dataAccess, LoginOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; } @@ -31,12 +31,12 @@ public void execute(LoginInputData inputData) { final String username = inputData.getUsername(); final String password = inputData.getPassword(); - if (!dataAccessInterface.doesUserExist(username)) { + if (!dataAccess.doesUserExist(username)) { outputBoundary.prepareFailureView(new LoginOutputData(false, "User does not exist.")); return; } - if (!dataAccessInterface.validateCredentials(username, password)) { + if (!dataAccess.validateCredentials(username, password)) { outputBoundary.prepareFailureView(new LoginOutputData(false, "Invalid credentials.")); return; } From be9d0fee0ef859f911e1c087192dc1655df026e0 Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Sun, 1 Dec 2024 21:06:30 -0500 Subject: [PATCH 092/154] Add update function --- .../database/JsonRankingDataAccess.java | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/main/java/frameworks/database/JsonRankingDataAccess.java b/src/main/java/frameworks/database/JsonRankingDataAccess.java index 5e392f70f..1de976a7b 100644 --- a/src/main/java/frameworks/database/JsonRankingDataAccess.java +++ b/src/main/java/frameworks/database/JsonRankingDataAccess.java @@ -45,26 +45,57 @@ public List getLeaderboard() { */ @Override public void updateScore(String username, int score) { + for (PlayerRankingEntry entry : rankings) { + if (entry.getName().equals(username)) { + entry.setScore(score); + saveRankings(); + return; + } + } + + // If the player does not exist, add them to the rankings + rankings.add(new PlayerRankingEntry(username, score, 0, false)); + saveRankings(); + } + + /** + * Updates the full ranking entry for a player or adds a new entry if the player does not exist. + * + * @param username The username of the player. + * @param score The player's final score. + * @param daysSurvived The number of days survived by the player. + * @param won Whether the player won the game. + */ + @Override + public void updateRankingData(String username, int score, int daysSurvived, boolean won) { boolean playerFound = false; for (PlayerRankingEntry entry : rankings) { if (entry.getName().equals(username)) { entry.setScore(score); + entry.setDaysSurvived(daysSurvived); + entry.setWon(won); playerFound = true; break; } } - // If the player does not exist, add them to the rankings if (!playerFound) { - rankings.add(new PlayerRankingEntry(username, score, 0, false)); + rankings.add(new PlayerRankingEntry(username, score, daysSurvived, won)); } + saveRankings(); + } + + /** + * Saves the updated rankings to the JSON file. + */ + private void saveRankings() { try { database.save(rankings); } - catch (IOException ioException) { - ioException.printStackTrace(); + catch (IOException e) { + e.printStackTrace(); } } } From 7f5d34235e7733f31a85aba6718f9c4d5e1c2b70 Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Sun, 1 Dec 2024 21:07:15 -0500 Subject: [PATCH 093/154] Add update function --- .../accountranking/RankingDataAccessInterface.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/usecases/accountranking/RankingDataAccessInterface.java b/src/main/java/usecases/accountranking/RankingDataAccessInterface.java index 05e2b7cc6..100acc2b6 100644 --- a/src/main/java/usecases/accountranking/RankingDataAccessInterface.java +++ b/src/main/java/usecases/accountranking/RankingDataAccessInterface.java @@ -23,4 +23,16 @@ public interface RankingDataAccessInterface { * @param score The new score to assign. */ void updateScore(String username, int score); + + /** + * Updates the ranking data for a specific player. + * If the player already exists in the ranking, their data is updated. + * If not, a new entry is created for the player. + * + * @param username The username of the player. + * @param score The final score of the player. + * @param daysSurvived The number of days the player survived in the game. + * @param won Whether the player won the game. + */ + void updateRankingData(String username, int score, int daysSurvived, boolean won); } From 298b4cef783f03e46ac107cfc28de57e290ad5dd Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Sun, 1 Dec 2024 21:10:41 -0500 Subject: [PATCH 094/154] add endGame function --- src/main/java/app/GameMainApplication.java | 25 +++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index c5cc2b5a0..2576cc7e2 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -1,5 +1,6 @@ package app; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Map; @@ -13,13 +14,33 @@ import interface_adapters.startallowcatepoint.AllowcatePresenter; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; import usecases.startallowcate.AllowcateInteractor; +import frameworks.database.JsonRankingDataAccess; import view.*; /** * Main of the game applicaition, initialize inmemory database for the game. */ public class GameMainApplication { - + /** + * Ends the game by updating the ranking data for the player. + * This method writes the player's final game data to the JSON file. + * + * @param filePath The path to the JSON file storing ranking data. + * @param username The username of the player. + * @param score The final score of the player. + * @param daysSurvived The number of days the player survived. + * @param won Whether the player won the game. + */ + public static void endGame(String filePath, String username, int score, int daysSurvived, boolean won) { + try { + final JsonRankingDataAccess rankingDataAccess = new JsonRankingDataAccess(filePath); + rankingDataAccess.updateRankingData(username, score, daysSurvived, won); + // System.out.println("Game results saved to ranking.json!"); + } + catch (IOException e) { + System.err.println("Failed to update ranking data: " + e.getMessage()); + } + } /** * Main of the game loop. * @param args args @@ -77,5 +98,7 @@ public static void main(String[] args) { final AllowcateController allowcateController = new AllowcateController(allowcateInteractor); attributeview.setAllowcateController(allowcateController); + // Example of how to use the endGame method + // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); } } From 9a452b183d42e39bc2132dbf9837b7dfbb45291b Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sun, 1 Dec 2024 22:40:29 -0500 Subject: [PATCH 095/154] Connect everything to the login view --- src/main/java/view/LoginView.java | 143 +++++++++++++++++------------- 1 file changed, 79 insertions(+), 64 deletions(-) diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index f1680c366..c22e9e566 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -1,46 +1,55 @@ package view; +import app.LoginApplication; +import interface_adapters.login.LoginController; +import interface_adapters.login.LoginInterface; + import javax.swing.*; import java.awt.*; -import java.awt.event.ActionListener; - +import java.io.IOException; /** - * Login view. + * LoginView handles the UI for user login and integrates with the LoginApplication. */ -public class LoginView extends JFrame { - private JLabel nameLabel = new JLabel("group project", JLabel.CENTER); - private SpringLayout springLayout = new SpringLayout(); - private JPanel centerPanel = new JPanel(springLayout); - private JLabel userNameLabel = new JLabel("username"); - private static JTextField userText = new JTextField(); - private JLabel passwordLabel = new JLabel("password"); - private static JPasswordField passwordText = new JPasswordField(); - private static JButton loginBotton = new JButton("log in"); - private static JButton registerButton = new JButton("sign up"); - - @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings", - "checkstyle:ExecutableStatementCount"}) - public LoginView() { - super("Log in"); +public class LoginView extends JFrame implements LoginInterface { + private final JLabel nameLabel = new JLabel("Group Project", JLabel.CENTER); + private final SpringLayout springLayout = new SpringLayout(); + private final JPanel centerPanel = new JPanel(springLayout); + private final JLabel userNameLabel = new JLabel("Username:"); + private final JTextField userText = new JTextField(); + private final JLabel passwordLabel = new JLabel("Password:"); + private final JPasswordField passwordText = new JPasswordField(); + private final JButton loginButton = new JButton("Log In"); + private final JButton registerButton = new JButton("Sign Up"); + + private final LoginController loginController; + + /** + * Constructs the LoginView with the provided LoginController. + * + * @throws IOException If there is an error initializing the login application. + */ + public LoginView() throws IOException { + super("Login"); + + // Initialize the controller via the LoginApplication + this.loginController = LoginApplication.initializeLogin(this); + final Container contentPane = getContentPane(); - // set size - final Font nameFont = new Font("12", Font.PLAIN, Constants.FORTY); - nameLabel.setFont(nameFont); - final Font centerFont = new Font("8", Font.PLAIN, 20); - userNameLabel.setFont(centerFont); - passwordLabel.setFont(centerFont); - registerButton.setFont(centerFont); - loginBotton.setFont(centerFont); + nameLabel.setFont(new Font("Arial", Font.PLAIN, Constants.FORTY)); + userNameLabel.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + passwordLabel.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + loginButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + registerButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + userText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); passwordText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); - // add components centerPanel.add(userNameLabel); centerPanel.add(userText); centerPanel.add(passwordLabel); centerPanel.add(passwordText); - centerPanel.add(loginBotton); + centerPanel.add(loginButton); centerPanel.add(registerButton); contentPane.add(nameLabel, BorderLayout.NORTH); @@ -54,25 +63,27 @@ public LoginView() { final int offsetX = childWidth.getValue() / 2; layout(offsetX); - final ActionListener openSignUpListener = e -> { - dispose(); - new SignUpView(); - }; + loginButton.addActionListener(e -> { + final String username = userText.getText(); + final String password = new String(passwordText.getPassword()); + loginController.handleLogin(username, password); + }); - final ActionListener openGameViewListener = e -> { + registerButton.addActionListener(e -> { dispose(); - new GameView(); - }; - - loginBotton.addActionListener(openGameViewListener); - registerButton.addActionListener(openSignUpListener); + try { + // Navigate to the sign-up page + new SignUpView(); + } + catch (IOException ex) { + throw new RuntimeException(ex); + } + }); setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); - // setLocation(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(true); - } private void layout(int offsetX) { @@ -89,36 +100,40 @@ private void layout(int offsetX) { springLayout.putConstraint(SpringLayout.WEST, passwordText, Constants.TEN, SpringLayout.EAST, passwordLabel); springLayout.putConstraint(SpringLayout.NORTH, passwordText, 0, SpringLayout.NORTH, passwordLabel); // set loginButton location - springLayout.putConstraint(SpringLayout.WEST, loginBotton, Constants.FIFTY, SpringLayout.WEST, passwordLabel); - springLayout.putConstraint(SpringLayout.NORTH, loginBotton, Constants.TWENTY, + springLayout.putConstraint(SpringLayout.WEST, loginButton, Constants.FIFTY, SpringLayout.WEST, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, loginButton, Constants.TWENTY, SpringLayout.SOUTH, passwordLabel); // set registerButton - springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginBotton); - springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginBotton); + springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginButton); + springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginButton); } - public void render() { - setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); - setVisible(true); + /** + * Displays the result of a login attempt. + * + * @param message A message indicating the result of the login attempt. + */ + @Override + public void displayLoginResult(String message) { + JOptionPane.showMessageDialog(this, message, "Login Result", JOptionPane.INFORMATION_MESSAGE); + + if ("Login successful!".equals(message)) { + // Close login window + dispose(); + // Navigate to the game view + new GameView(); + } } public static void main(String[] args) { - new LoginView(); - } - public static String getUser() { - return userText.getText(); - } - - public static String getPwd() { - return passwordText.getText(); - } - - public static JButton getLoginButton() { - return loginBotton; - } - - public static JButton getRegisterButton() { - return registerButton; + try { + new LoginView(); + } + catch (IOException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(null, "Error initializing the login system.", + "Error", JOptionPane.ERROR_MESSAGE); + } } -} \ No newline at end of file +} From b7a27fbdca80d414bba3295f84d85b6d11437b8b Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sun, 1 Dec 2024 23:09:20 -0500 Subject: [PATCH 096/154] Connect everything to the signup view --- src/main/java/view/SignUpView.java | 143 +++++++++++++++++++---------- 1 file changed, 95 insertions(+), 48 deletions(-) diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index 6e7a22aca..6dec8e37a 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -1,37 +1,50 @@ package view; +import app.SignupApplication; +import interface_adapters.signup.SignupController; +import interface_adapters.signup.SignupInterface; + import javax.swing.*; import java.awt.*; -import java.awt.event.ActionListener; +import java.io.IOException; /** - * Sign up view. + * SignUpView handles the UI for user registration and integrates with the SignupApplication. */ -public class SignUpView extends JFrame { - private JLabel nameLabel = new JLabel("group project", JLabel.CENTER); - private SpringLayout springLayout = new SpringLayout(); - private JPanel centerPanel = new JPanel(springLayout); - private JLabel userNameLabel = new JLabel("username"); - private JTextField userText = new JTextField(); - private JLabel passwordLabel = new JLabel("password"); - private JPasswordField passwordText = new JPasswordField(); - private JButton loginBotton = new JButton("log in"); - private JButton registerButton = new JButton("sign up"); - private JLabel againLabel = new JLabel("again"); - private JTextField againText = new JTextField(); - - public SignUpView() { - super("sign up"); +public class SignUpView extends JFrame implements SignupInterface { + private final JLabel nameLabel = new JLabel("Group Project", JLabel.CENTER); + private final SpringLayout springLayout = new SpringLayout(); + private final JPanel centerPanel = new JPanel(springLayout); + private final JLabel userNameLabel = new JLabel("Username:"); + private final JTextField userText = new JTextField(); + private final JLabel passwordLabel = new JLabel("Password:"); + private final JPasswordField passwordText = new JPasswordField(); + private final JLabel againLabel = new JLabel("Confirm Password:"); + private final JPasswordField againText = new JPasswordField(); + private final JButton registerButton = new JButton("Sign Up"); + private final JButton loginButton = new JButton("Back to Login"); + + private final SignupController signupController; + + /** + * Constructs the SignUpView with the provided SignupController. + * + * @throws IOException If there is an error initializing the signup application. + */ + public SignUpView() throws IOException { + super("Sign Up"); + + // Initialize the controller via SignupApplication + this.signupController = SignupApplication.initializeSignup(this); + final Container contentPane = getContentPane(); - // set size - final Font nameFont = new Font("12", Font.PLAIN, 40); - nameLabel.setFont(nameFont); - final Font centerFont = new Font("8", Font.PLAIN, 20); - userNameLabel.setFont(centerFont); - passwordLabel.setFont(centerFont); - againLabel.setFont(centerFont); - registerButton.setFont(centerFont); - loginBotton.setFont(centerFont); + nameLabel.setFont(new Font("Arial", Font.PLAIN, Constants.FORTY)); + userNameLabel.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + passwordLabel.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + againLabel.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + registerButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + loginButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + userText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); passwordText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); againText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); @@ -51,25 +64,23 @@ public SignUpView() { // set userNameLabel location extracted(offsetX); - final ActionListener openGameViewListener = e -> { + registerButton.addActionListener(e -> handleSignup()); + loginButton.addActionListener(e -> { dispose(); - new GameView(); - }; - - final ActionListener openLoginListener = e -> { - dispose(); - new LoginView(); - }; - - loginBotton.addActionListener(openLoginListener); - registerButton.addActionListener(openGameViewListener); + try { + new LoginView(); + } + catch (IOException ex) { + JOptionPane.showMessageDialog(this, "Error navigating to LoginView.", + "Error", JOptionPane.ERROR_MESSAGE); + } + }); setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); // setLocation(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(true); - } private void extracted() { @@ -77,7 +88,7 @@ private void extracted() { centerPanel.add(userText); centerPanel.add(passwordLabel); centerPanel.add(passwordText); - centerPanel.add(loginBotton); + centerPanel.add(loginButton); centerPanel.add(registerButton); centerPanel.add(againLabel); centerPanel.add(againText); @@ -97,12 +108,12 @@ private void extracted(int offsetX) { springLayout.putConstraint(SpringLayout.WEST, passwordText, Constants.TEN, SpringLayout.EAST, passwordLabel); springLayout.putConstraint(SpringLayout.NORTH, passwordText, 0, SpringLayout.NORTH, passwordLabel); // set loginButton location - springLayout.putConstraint(SpringLayout.WEST, loginBotton, Constants.FIFTY, SpringLayout.WEST, passwordLabel); - springLayout.putConstraint(SpringLayout.NORTH, loginBotton, Constants.EIGHTY, SpringLayout.SOUTH, + springLayout.putConstraint(SpringLayout.WEST, loginButton, Constants.FIFTY, SpringLayout.WEST, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, loginButton, Constants.EIGHTY, SpringLayout.SOUTH, passwordLabel); // set registerButton location - springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginBotton); - springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginBotton); + springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginButton); + springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginButton); // set againLabel location springLayout.putConstraint(SpringLayout.EAST, againLabel, 0, SpringLayout.EAST, passwordLabel); springLayout.putConstraint(SpringLayout.NORTH, againLabel, Constants.TEN, SpringLayout.SOUTH, passwordLabel); @@ -111,13 +122,49 @@ private void extracted(int offsetX) { springLayout.putConstraint(SpringLayout.NORTH, againText, 0, SpringLayout.NORTH, againLabel); } - public void render() { - setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); - setVisible(true); + private void handleSignup() { + final String username = userText.getText(); + final String password = new String(passwordText.getPassword()); + final String confirmPassword = new String(againText.getPassword()); + + if (!password.equals(confirmPassword)) { + JOptionPane.showMessageDialog(this, "Passwords do not match.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + + signupController.handleSignup(username, password); } - public static void main(String[] args) { - new SignUpView(); + /** + * Displays the result of the signup process. + * + * @param message A message indicating the result of the signup process. + */ + @Override + public void displaySignupResult(String message) { + JOptionPane.showMessageDialog(this, message, "Signup Result", JOptionPane.INFORMATION_MESSAGE); + + if ("Signup successful!".equals(message)) { + // Close signup view + dispose(); + try { + // Navigate to login page + new LoginView(); + } + catch (IOException e) { + JOptionPane.showMessageDialog(this, "Error navigating to LoginView.", + "Error", JOptionPane.ERROR_MESSAGE); + } + } } + public static void main(String[] args) { + try { + new SignUpView(); + } + catch (IOException e) { + JOptionPane.showMessageDialog(null, "Error initializing signup system.", + "Error", JOptionPane.ERROR_MESSAGE); + } + } } From 2f3334471ec4f6facc4b12920bf59cdbebf119f3 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sun, 1 Dec 2024 23:10:30 -0500 Subject: [PATCH 097/154] Add the application to the signup/login/ranking to initialize --- src/main/java/app/LoginApplication.java | 2 +- src/main/java/app/RankingApplication.java | 2 +- src/main/java/app/SignupApplication.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/app/LoginApplication.java b/src/main/java/app/LoginApplication.java index c081bfe9b..4849e175d 100644 --- a/src/main/java/app/LoginApplication.java +++ b/src/main/java/app/LoginApplication.java @@ -16,7 +16,7 @@ * and navigation manager. */ public class LoginApplication { - private static String filePath; + private static String filePath = "PlayerFile"; /** * Sets up the Login feature and returns the configured LoginController. diff --git a/src/main/java/app/RankingApplication.java b/src/main/java/app/RankingApplication.java index c364155b9..b8321d63b 100644 --- a/src/main/java/app/RankingApplication.java +++ b/src/main/java/app/RankingApplication.java @@ -15,7 +15,7 @@ * Responsible for assembling and initializing the components for the ranking feature. */ public class RankingApplication { - private static String filePath; + private static String filePath = "RankingFile"; /** * Initializes and assembles the components for the Ranking use case. diff --git a/src/main/java/app/SignupApplication.java b/src/main/java/app/SignupApplication.java index 1ee460222..5f8412991 100644 --- a/src/main/java/app/SignupApplication.java +++ b/src/main/java/app/SignupApplication.java @@ -16,7 +16,7 @@ * Responsible for assembling and initializing the components for the signup feature. */ public class SignupApplication { - private static String filePath; + private static String filePath = "PlayerFile"; /** * Initializes and assembles the components for the Signup use case. From 4ca2753f91ac0dc02352f8f8ab5b7c06f1b0bfa8 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sun, 1 Dec 2024 23:11:48 -0500 Subject: [PATCH 098/154] Fix the small errors when connecting the login and signup view --- src/main/java/entities/Player.java | 8 ++++++- .../database/JsonSignupDataAccess.java | 23 +++++++++++++++---- .../signup/SignupInterface.java | 7 ------ .../signup/SignupPresenter.java | 2 +- .../accountsignup/SignupInteractor.java | 7 ++---- 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/main/java/entities/Player.java b/src/main/java/entities/Player.java index 04fe62263..af9722069 100644 --- a/src/main/java/entities/Player.java +++ b/src/main/java/entities/Player.java @@ -1,5 +1,8 @@ package entities; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + /** * Represents a player in the game. * This entity contains information about the player, such as their ID, username, and password. @@ -22,7 +25,10 @@ public class Player { * @param username The username chosen by the player for logging into the game. * @param password The player's password for authentication. */ - public Player(String id, String username, String password) { + @JsonCreator + public Player(@JsonProperty("id") String id, + @JsonProperty("username") String username, + @JsonProperty("password") String password) { this.id = id; this.username = username; this.password = password; diff --git a/src/main/java/frameworks/database/JsonSignupDataAccess.java b/src/main/java/frameworks/database/JsonSignupDataAccess.java index 458577c5e..e8adaf644 100644 --- a/src/main/java/frameworks/database/JsonSignupDataAccess.java +++ b/src/main/java/frameworks/database/JsonSignupDataAccess.java @@ -4,6 +4,7 @@ import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.core.type.TypeReference; @@ -17,9 +18,17 @@ public class JsonSignupDataAccess implements SignupDataAccessInterface { private final FileDatabase database; private List players; + /** + * Constructs a JsonSignupDataAccess instance and loads the players from the specified file. + * + * @param filePath The file path for the player database. + * @throws IOException If an I/O error occurs while loading the file. + */ public JsonSignupDataAccess(String filePath) throws IOException { this.database = new FileDatabase<>(filePath, new TypeReference>() {}); - this.players = database.load(); + // Ensure players is mutable + this.players = new ArrayList<>(database.load()); + System.out.println("Loaded players: " + players); } /** @@ -37,7 +46,8 @@ public Player findByUsername(String username) { @Override public boolean isUsernameTaken(String username) { - return findByUsername(username) != null; + final Player found = findByUsername(username); + return found != null; } /** @@ -79,12 +89,17 @@ public static String generatePlayerID(String username, String password) { @Override public void addUser(String username, String password) { + if (isUsernameTaken(username)) { + throw new IllegalArgumentException("The username is already taken."); + } + players.add(new Player(generatePlayerID(username, password), username, password)); + try { database.save(players); - } - catch (IOException ioException) { + } catch (IOException ioException) { ioException.printStackTrace(); } } + } diff --git a/src/main/java/interface_adapters/signup/SignupInterface.java b/src/main/java/interface_adapters/signup/SignupInterface.java index 5a049bedb..1a30e548d 100644 --- a/src/main/java/interface_adapters/signup/SignupInterface.java +++ b/src/main/java/interface_adapters/signup/SignupInterface.java @@ -12,11 +12,4 @@ public interface SignupInterface { * @param message The success message to display. */ void displaySignupResult(String message); - - /** - * Updates the UI to display an error message if the signup operation fails. - * - * @param errorMessage The error message to display. - */ - void displaySignupError(String errorMessage); } diff --git a/src/main/java/interface_adapters/signup/SignupPresenter.java b/src/main/java/interface_adapters/signup/SignupPresenter.java index a8ba7dda5..fbcbd3c67 100644 --- a/src/main/java/interface_adapters/signup/SignupPresenter.java +++ b/src/main/java/interface_adapters/signup/SignupPresenter.java @@ -37,6 +37,6 @@ public void prepareSuccessView(SignupOutputData outputData) { */ @Override public void prepareFailureView(SignupOutputData outputData) { - view.displaySignupError(outputData.getMessage()); + view.displaySignupResult(outputData.getMessage()); } } diff --git a/src/main/java/usecases/accountsignup/SignupInteractor.java b/src/main/java/usecases/accountsignup/SignupInteractor.java index 170ed5eaa..1e6515f4c 100644 --- a/src/main/java/usecases/accountsignup/SignupInteractor.java +++ b/src/main/java/usecases/accountsignup/SignupInteractor.java @@ -31,22 +31,19 @@ public void execute(SignupInputData inputData) { final String username = inputData.getUsername(); final String password = inputData.getPassword(); - // Check if username is already taken if (dataAccessInterface.isUsernameTaken(username)) { outputBoundary.prepareFailureView(new SignupOutputData( false, - "Signup failed: Username '" + username + "' is already taken." + "Signup failed. The username is already taken!" )); return; } - // Add the new user dataAccessInterface.addUser(username, password); - // Prepare success view outputBoundary.prepareSuccessView(new SignupOutputData( true, - "Signup successful! Welcome, " + username + "." + "Signup successful!" )); } } From ab35b7e3f2cbeddd5a1d6b803e17f2b2135fcabb Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sun, 1 Dec 2024 23:16:09 -0500 Subject: [PATCH 099/154] Events Usecases --- .../ambush/AmbushDataAccessInterface.java | 19 ++++++ .../ambush/AmbushEventInteractor.java | 18 +++--- .../ambush/AmbushInputBoundary.java | 8 +++ .../eventrespond/ambush/AmbushInputData.java | 16 +++++ .../ambush/AmbushOutputBoundary.java | 11 ++++ .../eventrespond/ambush/AmbushOutputData.java | 46 ++++++++++++++ .../blizzard/BlizzardDataAccessInterface.java | 17 +++++ .../blizzard/BlizzardEventInteractor.java | 18 +++--- .../blizzard/BlizzardInputBoundary.java | 8 +++ .../blizzard/BlizzardInputData.java | 16 +++++ .../blizzard/BlizzardOutputBoundary.java | 11 ++++ .../blizzard/BlizzardOutputData.java | 46 ++++++++++++++ .../flood/FloodDataAccessInterface.java | 18 ++++++ .../flood/FloodEventInteractor.java | 18 +++--- .../flood/FloodInputBoundary.java | 8 +++ .../eventrespond/flood/FloodInputData.java | 16 +++++ .../flood/FloodOutputBoundary.java | 11 ++++ .../eventrespond/flood/FloodOutputData.java | 46 ++++++++++++++ .../shared/RespondDataAccessInterface.java | 63 ------------------- .../shared/RespondInputBoundary.java | 13 ---- .../eventrespond/shared/RespondInputData.java | 16 ----- .../shared/RespondOutputBoundary.java | 20 ------ .../shared/RespondOutputData.java | 50 --------------- .../survivor/SurvivorDataAccessInterface.java | 19 ++++++ .../survivor/SurvivorEventInteractor.java | 18 +++--- .../survivor/SurvivorInputBoundary.java | 8 +++ .../survivor/SurvivorInputData.java | 16 +++++ .../survivor/SurvivorOutputBoundary.java | 11 ++++ .../survivor/SurvivorOutputData.java | 46 ++++++++++++++ .../trader/TraderDataAccessInterface.java | 19 ++++++ .../trader/TraderEventInteractor.java | 19 +++--- .../trader/TraderInputBoundary.java | 8 +++ .../eventrespond/trader/TraderInputData.java | 16 +++++ .../trader/TraderOutputBoundary.java | 11 ++++ .../eventrespond/trader/TraderOutputData.java | 46 ++++++++++++++ 35 files changed, 548 insertions(+), 202 deletions(-) create mode 100644 src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java create mode 100644 src/main/java/usecases/eventrespond/ambush/AmbushInputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/ambush/AmbushInputData.java create mode 100644 src/main/java/usecases/eventrespond/ambush/AmbushOutputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/ambush/AmbushOutputData.java create mode 100644 src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java create mode 100644 src/main/java/usecases/eventrespond/blizzard/BlizzardInputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/blizzard/BlizzardInputData.java create mode 100644 src/main/java/usecases/eventrespond/blizzard/BlizzardOutputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/blizzard/BlizzardOutputData.java create mode 100644 src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java create mode 100644 src/main/java/usecases/eventrespond/flood/FloodInputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/flood/FloodInputData.java create mode 100644 src/main/java/usecases/eventrespond/flood/FloodOutputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/flood/FloodOutputData.java delete mode 100644 src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java delete mode 100644 src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java delete mode 100644 src/main/java/usecases/eventrespond/shared/RespondInputData.java delete mode 100644 src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java delete mode 100644 src/main/java/usecases/eventrespond/shared/RespondOutputData.java create mode 100644 src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java create mode 100644 src/main/java/usecases/eventrespond/survivor/SurvivorInputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/survivor/SurvivorInputData.java create mode 100644 src/main/java/usecases/eventrespond/survivor/SurvivorOutputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/survivor/SurvivorOutputData.java create mode 100644 src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java create mode 100644 src/main/java/usecases/eventrespond/trader/TraderInputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/trader/TraderInputData.java create mode 100644 src/main/java/usecases/eventrespond/trader/TraderOutputBoundary.java create mode 100644 src/main/java/usecases/eventrespond/trader/TraderOutputData.java diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java b/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java new file mode 100644 index 000000000..9fec20c6e --- /dev/null +++ b/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java @@ -0,0 +1,19 @@ +package usecases.eventrespond.ambush; + +import entities.Event; +import entities.Inventory; +import entities.PlayerAttributes; + +/** + * Interface for data access in the Ambush event. + */ +public interface AmbushDataAccessInterface { + Event getEvent(); + Inventory getInventory(); + PlayerAttributes getPlayerAttributes(); + + void changeFood(int amount); + void changeWater(int amount); + void changeWeapon(int amount); + void changePeople(int amount); +} diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java index ee398ead1..e2abf89ef 100644 --- a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java +++ b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java @@ -2,23 +2,25 @@ import entities.EntityConstants; import entities.EventAmbush; -import usecases.eventrespond.shared.*; +import usecases.eventrespond.ambush.AmbushInputData; +import usecases.eventrespond.ambush.AmbushOutputBoundary; +import usecases.eventrespond.ambush.AmbushDataAccessInterface; /** * Interactor for handling player responses to an Ambush event. - * Implements the RespondInputBoundary interface. + * Implements the AmbushInputBoundary interface. */ -public class AmbushEventInteractor implements RespondInputBoundary { - private final RespondDataAccessInterface dataAccess; - private final RespondOutputBoundary outputBoundary; +public class AmbushEventInteractor implements AmbushInputBoundary { + private final AmbushDataAccessInterface dataAccess; + private final AmbushOutputBoundary outputBoundary; - public AmbushEventInteractor(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + public AmbushEventInteractor(AmbushDataAccessInterface dataAccess, AmbushOutputBoundary outputBoundary) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; } @Override - public void execute(RespondInputData inputData) { + public void execute(AmbushInputData inputData) { EventAmbush ambushEvent = (EventAmbush) dataAccess.getEvent(); int choice = inputData.getChoice(); @@ -74,7 +76,7 @@ public void execute(RespondInputData inputData) { // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + ", Weapons " + weaponChange + ", People " + peopleChange + "."; - RespondOutputData outputData = new RespondOutputData(message, foodChange, waterChange, weaponChange, peopleChange, inventoryMessage); + AmbushOutputData outputData = new AmbushOutputData(message, foodChange, waterChange, weaponChange, peopleChange, inventoryMessage); outputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushInputBoundary.java b/src/main/java/usecases/eventrespond/ambush/AmbushInputBoundary.java new file mode 100644 index 000000000..4b3d499df --- /dev/null +++ b/src/main/java/usecases/eventrespond/ambush/AmbushInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.eventrespond.ambush; + +/** + * Input boundary for handling Ambush event responses. + */ +public interface AmbushInputBoundary { + void execute(AmbushInputData inputData); +} diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushInputData.java b/src/main/java/usecases/eventrespond/ambush/AmbushInputData.java new file mode 100644 index 000000000..6d021c3c8 --- /dev/null +++ b/src/main/java/usecases/eventrespond/ambush/AmbushInputData.java @@ -0,0 +1,16 @@ +package usecases.eventrespond.ambush; + +/** + * Input data for the Ambush event, representing the player's choice. + */ +public class AmbushInputData { + private final int choice; + + public AmbushInputData(int choice) { + this.choice = choice; + } + + public int getChoice() { + return choice; + } +} diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushOutputBoundary.java b/src/main/java/usecases/eventrespond/ambush/AmbushOutputBoundary.java new file mode 100644 index 000000000..91efeba9d --- /dev/null +++ b/src/main/java/usecases/eventrespond/ambush/AmbushOutputBoundary.java @@ -0,0 +1,11 @@ +package usecases.eventrespond.ambush; + +import usecases.eventrespond.ambush.AmbushOutputData; + +/** + * Output boundary for handling Ambush event results. + */ +public interface AmbushOutputBoundary { + void prepareSuccessView(AmbushOutputData outputData); + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushOutputData.java b/src/main/java/usecases/eventrespond/ambush/AmbushOutputData.java new file mode 100644 index 000000000..5257b23fd --- /dev/null +++ b/src/main/java/usecases/eventrespond/ambush/AmbushOutputData.java @@ -0,0 +1,46 @@ +package usecases.eventrespond.ambush; + +/** + * Output data for the Ambush event, representing the outcome and resource changes. + */ +public class AmbushOutputData { + private final String message; + private final int foodChange; + private final int waterChange; + private final int weaponChange; + private final int peopleChange; + private final String inventoryMessage; + + public AmbushOutputData(String message, int foodChange, int waterChange, int weaponChange, int peopleChange, String inventoryMessage) { + this.message = message; + this.foodChange = foodChange; + this.waterChange = waterChange; + this.weaponChange = weaponChange; + this.peopleChange = peopleChange; + this.inventoryMessage = inventoryMessage; + } + + public String getMessage() { + return message; + } + + public int getFoodChange() { + return foodChange; + } + + public int getWaterChange() { + return waterChange; + } + + public int getWeaponChange() { + return weaponChange; + } + + public int getPeopleChange() { + return peopleChange; + } + + public String getInventoryMessage() { + return inventoryMessage; + } +} diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java new file mode 100644 index 000000000..5e5fe9bab --- /dev/null +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java @@ -0,0 +1,17 @@ +package usecases.eventrespond.blizzard; + +import entities.Event; +import entities.Inventory; +import entities.PlayerAttributes; + +/** + * Interface for data access in the Blizzard event. + */ +public interface BlizzardDataAccessInterface { + Event getEvent(); + Inventory getInventory(); + PlayerAttributes getPlayerAttributes(); + + void changeFood(int amount); + void changeWater(int amount); +} diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java index cb9b6bf29..ccd959756 100644 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java @@ -2,23 +2,25 @@ import entities.EntityConstants; import entities.EventBlizzard; -import usecases.eventrespond.shared.*; +import usecases.eventrespond.blizzard.BlizzardInputData; +import usecases.eventrespond.blizzard.BlizzardOutputBoundary; +import usecases.eventrespond.blizzard.BlizzardDataAccessInterface; /** * Interactor for handling player responses to a Blizzard event. - * Implements the RespondInputBoundary interface. + * Implements the BlizzardInputBoundary interface. */ -public class BlizzardEventInteractor implements RespondInputBoundary { - private final RespondDataAccessInterface dataAccess; - private final RespondOutputBoundary outputBoundary; +public class BlizzardEventInteractor implements BlizzardInputBoundary { + private final BlizzardDataAccessInterface dataAccess; + private final BlizzardOutputBoundary outputBoundary; - public BlizzardEventInteractor(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + public BlizzardEventInteractor(BlizzardDataAccessInterface dataAccess, BlizzardOutputBoundary outputBoundary) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; } @Override - public void execute(RespondInputData inputData) { + public void execute(BlizzardInputData inputData) { EventBlizzard blizzardEvent = (EventBlizzard) dataAccess.getEvent(); int choice = inputData.getChoice(); @@ -52,7 +54,7 @@ public void execute(RespondInputData inputData) { // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + "."; - RespondOutputData outputData = new RespondOutputData(message, foodChange, waterChange, 0, 0, inventoryMessage); + BlizzardOutputData outputData = new BlizzardOutputData(message, foodChange, waterChange, 0, 0, inventoryMessage); outputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardInputBoundary.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardInputBoundary.java new file mode 100644 index 000000000..61e91a8c9 --- /dev/null +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.eventrespond.blizzard; + +/** + * Input boundary for handling Blizzard event responses. + */ +public interface BlizzardInputBoundary { + void execute(BlizzardInputData inputData); +} diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardInputData.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardInputData.java new file mode 100644 index 000000000..c4d0b0f58 --- /dev/null +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardInputData.java @@ -0,0 +1,16 @@ +package usecases.eventrespond.blizzard; + +/** + * Input data for the Blizzard event, representing the player's choice. + */ +public class BlizzardInputData { + private final int choice; + + public BlizzardInputData(int choice) { + this.choice = choice; + } + + public int getChoice() { + return choice; + } +} diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardOutputBoundary.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardOutputBoundary.java new file mode 100644 index 000000000..3caa42aa2 --- /dev/null +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardOutputBoundary.java @@ -0,0 +1,11 @@ +package usecases.eventrespond.blizzard; + +import usecases.eventrespond.blizzard.BlizzardOutputData; + +/** + * Output boundary for handling Blizzard event results. + */ +public interface BlizzardOutputBoundary { + void prepareSuccessView(BlizzardOutputData outputData); + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardOutputData.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardOutputData.java new file mode 100644 index 000000000..b9fce8123 --- /dev/null +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardOutputData.java @@ -0,0 +1,46 @@ +package usecases.eventrespond.blizzard; + +/** + * Output data for the Blizzard event, representing the outcome and resource changes. + */ +public class BlizzardOutputData { + private final String message; + private final int foodChange; + private final int waterChange; + private final int weaponChange; + private final int peopleChange; + private final String inventoryMessage; + + public BlizzardOutputData(String message, int foodChange, int waterChange, int weaponChange, int peopleChange, String inventoryMessage) { + this.message = message; + this.foodChange = foodChange; + this.waterChange = waterChange; + this.weaponChange = weaponChange; + this.peopleChange = peopleChange; + this.inventoryMessage = inventoryMessage; + } + + public String getMessage() { + return message; + } + + public int getFoodChange() { + return foodChange; + } + + public int getWaterChange() { + return waterChange; + } + + public int getWeaponChange() { + return weaponChange; + } + + public int getPeopleChange() { + return peopleChange; + } + + public String getInventoryMessage() { + return inventoryMessage; + } +} diff --git a/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java b/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java new file mode 100644 index 000000000..b71a98f7c --- /dev/null +++ b/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java @@ -0,0 +1,18 @@ +package usecases.eventrespond.flood; + +import entities.Event; +import entities.Inventory; +import entities.PlayerAttributes; + +/** + * Interface for data access in the Flood event. + */ +public interface FloodDataAccessInterface { + Event getEvent(); + Inventory getInventory(); + PlayerAttributes getPlayerAttributes(); + + void changeFood(int amount); + void changeWater(int amount); + void changePeople(int amount); +} diff --git a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java index c7f4e1817..743690849 100644 --- a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java +++ b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java @@ -2,23 +2,25 @@ import entities.EntityConstants; import entities.EventFlood; -import usecases.eventrespond.shared.*; +import usecases.eventrespond.flood.FloodInputData; +import usecases.eventrespond.flood.FloodOutputBoundary; +import usecases.eventrespond.flood.FloodDataAccessInterface; /** * Interactor for handling player responses to a Flood event. - * Implements the RespondInputBoundary interface. + * Implements the FloodInputBoundary interface. */ -public class FloodEventInteractor implements RespondInputBoundary { - private final RespondDataAccessInterface dataAccess; - private final RespondOutputBoundary outputBoundary; +public class FloodEventInteractor implements FloodInputBoundary { + private final FloodDataAccessInterface dataAccess; + private final FloodOutputBoundary outputBoundary; - public FloodEventInteractor(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + public FloodEventInteractor(FloodDataAccessInterface dataAccess, FloodOutputBoundary outputBoundary) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; } @Override - public void execute(RespondInputData inputData) { + public void execute(FloodInputData inputData) { EventFlood floodEvent = (EventFlood) dataAccess.getEvent(); int choice = inputData.getChoice(); @@ -54,7 +56,7 @@ public void execute(RespondInputData inputData) { // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + ", People " + peopleChange + "."; - RespondOutputData outputData = new RespondOutputData(message, foodChange, waterChange, 0, peopleChange, inventoryMessage); + FloodOutputData outputData = new FloodOutputData(message, foodChange, waterChange, 0, peopleChange, inventoryMessage); outputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/usecases/eventrespond/flood/FloodInputBoundary.java b/src/main/java/usecases/eventrespond/flood/FloodInputBoundary.java new file mode 100644 index 000000000..b38d18e8d --- /dev/null +++ b/src/main/java/usecases/eventrespond/flood/FloodInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.eventrespond.flood; + +/** + * Input boundary for handling Flood event responses. + */ +public interface FloodInputBoundary { + void execute(FloodInputData inputData); +} diff --git a/src/main/java/usecases/eventrespond/flood/FloodInputData.java b/src/main/java/usecases/eventrespond/flood/FloodInputData.java new file mode 100644 index 000000000..8177fa256 --- /dev/null +++ b/src/main/java/usecases/eventrespond/flood/FloodInputData.java @@ -0,0 +1,16 @@ +package usecases.eventrespond.flood; + +/** + * Input data for the Flood event, representing the player's choice. + */ +public class FloodInputData { + private final int choice; + + public FloodInputData(int choice) { + this.choice = choice; + } + + public int getChoice() { + return choice; + } +} diff --git a/src/main/java/usecases/eventrespond/flood/FloodOutputBoundary.java b/src/main/java/usecases/eventrespond/flood/FloodOutputBoundary.java new file mode 100644 index 000000000..91e421120 --- /dev/null +++ b/src/main/java/usecases/eventrespond/flood/FloodOutputBoundary.java @@ -0,0 +1,11 @@ +package usecases.eventrespond.flood; + +import usecases.eventrespond.flood.FloodOutputData; + +/** + * Output boundary for handling Flood event results. + */ +public interface FloodOutputBoundary { + void prepareSuccessView(FloodOutputData outputData); + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/eventrespond/flood/FloodOutputData.java b/src/main/java/usecases/eventrespond/flood/FloodOutputData.java new file mode 100644 index 000000000..ab8525e91 --- /dev/null +++ b/src/main/java/usecases/eventrespond/flood/FloodOutputData.java @@ -0,0 +1,46 @@ +package usecases.eventrespond.flood; + +/** + * Output data for the Flood event, representing the outcome and resource changes. + */ +public class FloodOutputData { + private final String message; + private final int foodChange; + private final int waterChange; + private final int weaponChange; + private final int peopleChange; + private final String inventoryMessage; + + public FloodOutputData(String message, int foodChange, int waterChange, int weaponChange, int peopleChange, String inventoryMessage) { + this.message = message; + this.foodChange = foodChange; + this.waterChange = waterChange; + this.weaponChange = weaponChange; + this.peopleChange = peopleChange; + this.inventoryMessage = inventoryMessage; + } + + public String getMessage() { + return message; + } + + public int getFoodChange() { + return foodChange; + } + + public int getWaterChange() { + return waterChange; + } + + public int getWeaponChange() { + return weaponChange; + } + + public int getPeopleChange() { + return peopleChange; + } + + public String getInventoryMessage() { + return inventoryMessage; + } +} diff --git a/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java b/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java deleted file mode 100644 index 9d28f163d..000000000 --- a/src/main/java/usecases/eventrespond/shared/RespondDataAccessInterface.java +++ /dev/null @@ -1,63 +0,0 @@ -package usecases.eventrespond.shared; - -import entities.Event; -import entities.Inventory; -import entities.PlayerAttributes; -import entities.PlayerLocation; - -/** - * DAO of respond, provide internal data as needed for interactor. - */ -public interface RespondDataAccessInterface { - - /** - * The event which we are working on to respond, assuming already happened. - * @return Event, contains description, choices, and such. - */ - Event getEvent(); - - /** - * Return the player attributes as alot of event outcome are determine by competence and attribute of player. - * ex: low social attribute would cause more likely of failure for negotiate. - * @return return player attributes. - */ - PlayerAttributes getPlayerAttributes(); - - /** - * Return the player's inventory as alot of event outcome are determine by what player have currently. - * ex: low firepower(involves people and weapon) FightBack etc choices are likely to fail. - * @return return player inventory. - */ - Inventory getInventory(); - - /** - * Return the player location, for response like run away flee etc, we'll have to change it, thus we need it. - * @return player's current location. - */ - PlayerLocation getPlayerLocation(); - - /** - * How the amount of people changes after the event, for that choice player provide. call the change method in - * inventory. - * @param peoplechange change of people quantity. - */ - void changePeople(int peoplechange); - - /** - * How the amount of food changes after the event, for that choice player provide. call change method in inventory. - * @param foodchange change of people quantity. - */ - void changeFood(int foodchange); - - /** - * How the amount of people changes after the event, for that choice player provide. call change method in inventory - * @param waterchange change of people quantity. - */ - void changeWater(int waterchange); - - /** - * How the amount of weapon changes after the event, for that choice player provide. call change method in inventory - * @param weaponchange change of people quantity. - */ - void changeWeapon(int weaponchange); -} diff --git a/src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java b/src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java deleted file mode 100644 index eecf95a41..000000000 --- a/src/main/java/usecases/eventrespond/shared/RespondInputBoundary.java +++ /dev/null @@ -1,13 +0,0 @@ -package usecases.eventrespond.shared; - -/** - * Input boundary of respond use case. - */ -public interface RespondInputBoundary { - - /** - * Execute method for respond. - * @param inputdata player's input, represented in input data. - */ - void execute(RespondInputData inputdata); -} diff --git a/src/main/java/usecases/eventrespond/shared/RespondInputData.java b/src/main/java/usecases/eventrespond/shared/RespondInputData.java deleted file mode 100644 index ab057369c..000000000 --- a/src/main/java/usecases/eventrespond/shared/RespondInputData.java +++ /dev/null @@ -1,16 +0,0 @@ -package usecases.eventrespond.shared; - -/** - * Input data form the view/player side like the choice they choose in term os 12345... - */ -public class RespondInputData { - private int choice; - - public RespondInputData(int choice) { - this.choice = choice; - } - - public int getChoice() { - return choice; - } -} diff --git a/src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java b/src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java deleted file mode 100644 index 2a35473fa..000000000 --- a/src/main/java/usecases/eventrespond/shared/RespondOutputBoundary.java +++ /dev/null @@ -1,20 +0,0 @@ -package usecases.eventrespond.shared; - -/** - * Output boundary, responsible for passing output data to the controller. - */ -public interface RespondOutputBoundary { - - /** - * Outputs for a successful respond. - * @param outputData the output for updating the view. - */ - void prepareSuccessView(RespondOutputData outputData); - - /** - * If the respond is invaild, example: only choices 1,2,3,4(represented in number internally) but somehow player - * input 5? though it shouldn't happen because at the end we provide player with only buttons. - * @param errorMessage message of why is invaild, for the player. - */ - void prepareFailureView(String errorMessage); -} diff --git a/src/main/java/usecases/eventrespond/shared/RespondOutputData.java b/src/main/java/usecases/eventrespond/shared/RespondOutputData.java deleted file mode 100644 index 873fbf0da..000000000 --- a/src/main/java/usecases/eventrespond/shared/RespondOutputData.java +++ /dev/null @@ -1,50 +0,0 @@ -package usecases.eventrespond.shared; - -/** - * Output data for the player's respond. - */ -public class RespondOutputData { - private final String message; - private final int peoplechange; - private final int foodchange; - private final int waterchange; - private final int weaponchange; - private final String inventorymessage; - - public RespondOutputData(String message, - int foodchange, int waterchange, int weaponchange, int peoplechange, - String inventorymessage) { - this.message = message; - this.peoplechange = peoplechange; - this.foodchange = foodchange; - this.waterchange = waterchange; - this.weaponchange = weaponchange; - this.inventorymessage = inventorymessage; - - } - - public String getMessage() { - return message; - } - - public int getPeoplechange() { - return peoplechange; - } - - public int getFoodchange() { - return foodchange; - } - - public int getWaterchange() { - return waterchange; - } - - public int getWeaponchange() { - return weaponchange; - } - - public String getInventorymessage() { - return inventorymessage; - } - -} diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java b/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java new file mode 100644 index 000000000..887605746 --- /dev/null +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java @@ -0,0 +1,19 @@ +package usecases.eventrespond.survivor; + +import entities.Event; +import entities.Inventory; +import entities.PlayerAttributes; + +/** + * Interface for data access in the Survivor event. + */ +public interface SurvivorDataAccessInterface { + Event getEvent(); + Inventory getInventory(); + PlayerAttributes getPlayerAttributes(); + + void changeFood(int amount); + void changeWater(int amount); + void changeWeapon(int amount); + void changePeople(int amount); +} diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java index fbb6fc37c..57030fe4a 100644 --- a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java @@ -2,23 +2,25 @@ import entities.EntityConstants; import entities.EventSurvivorJoins; -import usecases.eventrespond.shared.*; +import usecases.eventrespond.survivor.SurvivorInputData; +import usecases.eventrespond.survivor.SurvivorOutputBoundary; +import usecases.eventrespond.survivor.SurvivorDataAccessInterface; /** * Interactor for handling player responses to a Survivor Encounter event. - * Implements the RespondInputBoundary interface. + * Implements the SurvivorInputBoundary interface. */ -public class SurvivorEventInteractor implements RespondInputBoundary { - private final RespondDataAccessInterface dataAccess; - private final RespondOutputBoundary outputBoundary; +public class SurvivorEventInteractor implements SurvivorInputBoundary { + private final SurvivorDataAccessInterface dataAccess; + private final SurvivorOutputBoundary outputBoundary; - public SurvivorEventInteractor(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + public SurvivorEventInteractor(SurvivorDataAccessInterface dataAccess, SurvivorOutputBoundary outputBoundary) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; } @Override - public void execute(RespondInputData inputData) { + public void execute(SurvivorInputData inputData) { EventSurvivorJoins survivorEvent = (EventSurvivorJoins) dataAccess.getEvent(); int choice = inputData.getChoice(); @@ -58,7 +60,7 @@ public void execute(RespondInputData inputData) { // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + ", Supplies " + suppliesChange + ", People " + peopleChange + "."; - RespondOutputData outputData = new RespondOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); + SurvivorOutputData outputData = new SurvivorOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); outputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorInputBoundary.java b/src/main/java/usecases/eventrespond/survivor/SurvivorInputBoundary.java new file mode 100644 index 000000000..657b9f8de --- /dev/null +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.eventrespond.survivor; + +/** + * Input boundary for handling Survivor event responses. + */ +public interface SurvivorInputBoundary { + void execute(SurvivorInputData inputData); +} diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorInputData.java b/src/main/java/usecases/eventrespond/survivor/SurvivorInputData.java new file mode 100644 index 000000000..22d0e9570 --- /dev/null +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorInputData.java @@ -0,0 +1,16 @@ +package usecases.eventrespond.survivor; + +/** + * Input data for the Survivor event, representing the player's choice. + */ +public class SurvivorInputData { + private final int choice; + + public SurvivorInputData(int choice) { + this.choice = choice; + } + + public int getChoice() { + return choice; + } +} diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorOutputBoundary.java b/src/main/java/usecases/eventrespond/survivor/SurvivorOutputBoundary.java new file mode 100644 index 000000000..bf19df957 --- /dev/null +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorOutputBoundary.java @@ -0,0 +1,11 @@ +package usecases.eventrespond.survivor; + +import usecases.eventrespond.survivor.SurvivorOutputData; + +/** + * Output boundary for handling Survivor event results. + */ +public interface SurvivorOutputBoundary { + void prepareSuccessView(SurvivorOutputData outputData); + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorOutputData.java b/src/main/java/usecases/eventrespond/survivor/SurvivorOutputData.java new file mode 100644 index 000000000..35a8a0b82 --- /dev/null +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorOutputData.java @@ -0,0 +1,46 @@ +package usecases.eventrespond.survivor; + +/** + * Output data for the Survivor event, representing the outcome and resource changes. + */ +public class SurvivorOutputData { + private final String message; + private final int foodChange; + private final int waterChange; + private final int suppliesChange; + private final int peopleChange; + private final String inventoryMessage; + + public SurvivorOutputData(String message, int foodChange, int waterChange, int suppliesChange, int peopleChange, String inventoryMessage) { + this.message = message; + this.foodChange = foodChange; + this.waterChange = waterChange; + this.suppliesChange = suppliesChange; + this.peopleChange = peopleChange; + this.inventoryMessage = inventoryMessage; + } + + public String getMessage() { + return message; + } + + public int getFoodChange() { + return foodChange; + } + + public int getWaterChange() { + return waterChange; + } + + public int getSuppliesChange() { + return suppliesChange; + } + + public int getPeopleChange() { + return peopleChange; + } + + public String getInventoryMessage() { + return inventoryMessage; + } +} diff --git a/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java b/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java new file mode 100644 index 000000000..4e2d0f099 --- /dev/null +++ b/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java @@ -0,0 +1,19 @@ +package usecases.eventrespond.trader; + +import entities.Event; +import entities.Inventory; +import entities.PlayerAttributes; + +/** + * Interface for data access in the Trader event. + */ +public interface TraderDataAccessInterface { + Event getEvent(); + Inventory getInventory(); + PlayerAttributes getPlayerAttributes(); + + void changeFood(int amount); + void changeWater(int amount); + void changeWeapon(int amount); + void changePeople(int amount); +} diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java index cc66d2d7c..1a89dd35e 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -2,23 +2,25 @@ import entities.EntityConstants; import entities.EventTraderEncounter; -import usecases.eventrespond.shared.*; +import usecases.eventrespond.trader.TraderInputData; +import usecases.eventrespond.trader.TraderOutputBoundary; +import usecases.eventrespond.trader.TraderDataAccessInterface; /** * Interactor for handling player responses to a Trader Encounter event. - * Implements the RespondInputBoundary interface. + * Implements the TraderInputBoundary interface. */ -public class TraderEventInteractor implements RespondInputBoundary { - private final RespondDataAccessInterface dataAccess; - private final RespondOutputBoundary outputBoundary; +public class TraderEventInteractor implements TraderInputBoundary { + private final TraderDataAccessInterface dataAccess; + private final TraderOutputBoundary outputBoundary; - public TraderEventInteractor(RespondDataAccessInterface dataAccess, RespondOutputBoundary outputBoundary) { + public TraderEventInteractor(TraderDataAccessInterface dataAccess, TraderOutputBoundary outputBoundary) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; } @Override - public void execute(RespondInputData inputData) { + public void execute(TraderInputData inputData) { EventTraderEncounter traderEvent = (EventTraderEncounter) dataAccess.getEvent(); int choice = inputData.getChoice(); @@ -60,11 +62,12 @@ public void execute(RespondInputData inputData) { dataAccess.changeFood(foodChange); dataAccess.changeWater(waterChange); dataAccess.changeWeapon(suppliesChange); + dataAccess.changePeople(peopleChange); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + ", Supplies " + suppliesChange + ", People " + peopleChange + "."; - RespondOutputData outputData = new RespondOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); + TraderOutputData outputData = new TraderOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); outputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/usecases/eventrespond/trader/TraderInputBoundary.java b/src/main/java/usecases/eventrespond/trader/TraderInputBoundary.java new file mode 100644 index 000000000..10d7642be --- /dev/null +++ b/src/main/java/usecases/eventrespond/trader/TraderInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.eventrespond.trader; + +/** + * Input boundary for handling Trader event responses. + */ +public interface TraderInputBoundary { + void execute(TraderInputData inputData); +} diff --git a/src/main/java/usecases/eventrespond/trader/TraderInputData.java b/src/main/java/usecases/eventrespond/trader/TraderInputData.java new file mode 100644 index 000000000..65adfb71d --- /dev/null +++ b/src/main/java/usecases/eventrespond/trader/TraderInputData.java @@ -0,0 +1,16 @@ +package usecases.eventrespond.trader; + +/** + * Input data for the Trader event, representing the player's choice. + */ +public class TraderInputData { + private final int choice; + + public TraderInputData(int choice) { + this.choice = choice; + } + + public int getChoice() { + return choice; + } +} diff --git a/src/main/java/usecases/eventrespond/trader/TraderOutputBoundary.java b/src/main/java/usecases/eventrespond/trader/TraderOutputBoundary.java new file mode 100644 index 000000000..92a17e6e6 --- /dev/null +++ b/src/main/java/usecases/eventrespond/trader/TraderOutputBoundary.java @@ -0,0 +1,11 @@ +package usecases.eventrespond.trader; + +import usecases.eventrespond.trader.TraderOutputData; + +/** + * Output boundary for handling Trader event results. + */ +public interface TraderOutputBoundary { + void prepareSuccessView(TraderOutputData outputData); + void prepareFailureView(String errorMessage); +} diff --git a/src/main/java/usecases/eventrespond/trader/TraderOutputData.java b/src/main/java/usecases/eventrespond/trader/TraderOutputData.java new file mode 100644 index 000000000..296efc0a0 --- /dev/null +++ b/src/main/java/usecases/eventrespond/trader/TraderOutputData.java @@ -0,0 +1,46 @@ +package usecases.eventrespond.trader; + +/** + * Output data for the Trader event, representing the outcome and resource changes. + */ +public class TraderOutputData { + private final String message; + private final int foodChange; + private final int waterChange; + private final int suppliesChange; + private final int peopleChange; + private final String inventoryMessage; + + public TraderOutputData(String message, int foodChange, int waterChange, int suppliesChange, int peopleChange, String inventoryMessage) { + this.message = message; + this.foodChange = foodChange; + this.waterChange = waterChange; + this.suppliesChange = suppliesChange; + this.peopleChange = peopleChange; + this.inventoryMessage = inventoryMessage; + } + + public String getMessage() { + return message; + } + + public int getFoodChange() { + return foodChange; + } + + public int getWaterChange() { + return waterChange; + } + + public int getSuppliesChange() { + return suppliesChange; + } + + public int getPeopleChange() { + return peopleChange; + } + + public String getInventoryMessage() { + return inventoryMessage; + } +} From 083aba9d7ca354b6f0285946908f99a85ba5a7bb Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Sun, 1 Dec 2024 23:21:20 -0500 Subject: [PATCH 100/154] Complete the login and signup connection --- src/main/java/view/LoginView.java | 3 ++- src/main/java/view/MainView.java | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index c22e9e566..9ddd03b1f 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -122,7 +122,8 @@ public void displayLoginResult(String message) { // Close login window dispose(); // Navigate to the game view - new GameView(); + MainView mainView = new MainView(); + mainView.render(); } } diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index b42d66512..7e80c6977 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -109,7 +109,8 @@ public void disrender() { setVisible(false); } - // public static void main(String[] args) { - // new MainView().render(); // Call render() to display the view - // } + public static void main(String[] args) { + // Call render() to display the view + new MainView().render(); + } } From 73800c0e812105adc50debe93e9eae4a55abc729 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Sun, 1 Dec 2024 23:39:00 -0500 Subject: [PATCH 101/154] eventrespond updated --- .../eventrespond/EventResponseController.java | 24 ------------------ .../eventrespond/EventResponseInterface.java | 19 -------------- .../eventrespond/EventResponsePresenter.java | 25 ------------------- .../ambush/AmbushResponseController.java | 4 +-- .../ambush/AmbushResponsePresenter.java | 13 +++++----- .../blizzard/BlizzardResponseController.java | 4 +-- .../blizzard/BlizzardResponseInterface.java | 4 +-- .../blizzard/BlizzardResponsePresenter.java | 13 +++++----- .../flood/FloodResponseController.java | 4 +-- .../flood/FloodResponseInterface.java | 4 +-- .../flood/FloodResponsePresenter.java | 13 +++++----- .../survivor/SurvivorResponseController.java | 4 +-- .../survivor/SurvivorResponseInterface.java | 4 +-- .../survivor/SurvivorResponsePresenter.java | 11 ++++---- .../trader/TraderResponseController.java | 4 +-- .../trader/TraderResponseInterface.java | 4 +-- .../trader/TraderResponsePresenter.java | 11 ++++---- 17 files changed, 51 insertions(+), 114 deletions(-) delete mode 100644 src/main/java/interface_adapters/eventrespond/EventResponseController.java delete mode 100644 src/main/java/interface_adapters/eventrespond/EventResponseInterface.java delete mode 100644 src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java diff --git a/src/main/java/interface_adapters/eventrespond/EventResponseController.java b/src/main/java/interface_adapters/eventrespond/EventResponseController.java deleted file mode 100644 index 9a751a474..000000000 --- a/src/main/java/interface_adapters/eventrespond/EventResponseController.java +++ /dev/null @@ -1,24 +0,0 @@ -package interface_adapters.eventrespond; - -import usecases.eventrespond.shared.RespondInputBoundary; -import usecases.eventrespond.shared.RespondInputData; - -/** - * Controller for handling event responses and delegating to the correct interactor. - */ -public class EventResponseController { - private final RespondInputBoundary interactor; - - public EventResponseController(RespondInputBoundary interactor) { - this.interactor = interactor; - } - - /** - * Execute the interactor by converting player input into input data. - * @param choice The player's choice for the event response. - */ - public void execute(int choice) { - RespondInputData inputData = new RespondInputData(choice); - interactor.execute(inputData); - } -} diff --git a/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java b/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java deleted file mode 100644 index 0364bcaa5..000000000 --- a/src/main/java/interface_adapters/eventrespond/EventResponseInterface.java +++ /dev/null @@ -1,19 +0,0 @@ -package interface_adapters.eventrespond; - -/** - * Interface for updating the event response UI. - */ -public interface EventResponseInterface { - - /** - * Update the UI with the result of a successful event response. - * @param message The success message to display. - */ - void updateUiResponse(String message); - - /** - * Update the UI with an error message if the response fails. - * @param errorMessage The error message to display. - */ - void failureResponse(String errorMessage); -} diff --git a/src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java deleted file mode 100644 index ae0e681f5..000000000 --- a/src/main/java/interface_adapters/eventrespond/EventResponsePresenter.java +++ /dev/null @@ -1,25 +0,0 @@ -package interface_adapters.eventrespond; - -import usecases.eventrespond.shared.RespondOutputBoundary; -import usecases.eventrespond.shared.RespondOutputData; - -/** - * Presenter for handling event response outputs. - */ -public class EventResponsePresenter implements RespondOutputBoundary { - private final EventResponseInterface view; - - public EventResponsePresenter(EventResponseInterface view) { - this.view = view; - } - - @Override - public void prepareSuccessView(RespondOutputData outputData) { - view.updateUiResponse(outputData.getMessage()); - } - - @Override - public void prepareFailureView(String errorMessage) { - view.failureResponse(errorMessage); - } -} diff --git a/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseController.java b/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseController.java index 06af1fdda..35cc4532f 100644 --- a/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseController.java +++ b/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponseController.java @@ -1,7 +1,7 @@ package interface_adapters.eventrespond.ambush; import usecases.eventrespond.ambush.AmbushEventInteractor; -import usecases.eventrespond.shared.RespondInputData; +import usecases.eventrespond.ambush.AmbushInputData; /** * Controller for handling responses to an Ambush event. @@ -18,7 +18,7 @@ public AmbushResponseController(AmbushEventInteractor interactor) { * @param choice The player's choice for the event. */ public void execute(int choice) { - RespondInputData inputData = new RespondInputData(choice); + AmbushInputData inputData = new AmbushInputData(choice); // Using AmbushInputData now interactor.execute(inputData); } } diff --git a/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponsePresenter.java index c453881c9..c9efde63b 100644 --- a/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponsePresenter.java +++ b/src/main/java/interface_adapters/eventrespond/ambush/AmbushResponsePresenter.java @@ -1,12 +1,12 @@ package interface_adapters.eventrespond.ambush; -import usecases.eventrespond.shared.RespondOutputBoundary; -import usecases.eventrespond.shared.RespondOutputData; +import usecases.eventrespond.ambush.AmbushOutputBoundary; +import usecases.eventrespond.ambush.AmbushOutputData; /** * Presenter for handling the response output of an Ambush event. */ -public class AmbushResponsePresenter implements RespondOutputBoundary { +public class AmbushResponsePresenter implements AmbushOutputBoundary { private final AmbushResponseInterface view; public AmbushResponsePresenter(AmbushResponseInterface view) { @@ -14,12 +14,13 @@ public AmbushResponsePresenter(AmbushResponseInterface view) { } @Override - public void prepareSuccessView(RespondOutputData outputData) { - view.updateUiResponse(outputData.getMessage()); + public void prepareSuccessView(AmbushOutputData outputData) { + // Pass the message and relevant details to the view + view.updateUiResponse(outputData.getMessage()); // Updated method based on new event-specific data } @Override public void prepareFailureView(String errorMessage) { - view.failureResponse(errorMessage); + view.failureResponse(errorMessage); // Handle failure case } } diff --git a/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseController.java b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseController.java index fb0b3e3b9..90a3f448b 100644 --- a/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseController.java +++ b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseController.java @@ -1,7 +1,7 @@ package interface_adapters.eventrespond.blizzard; import usecases.eventrespond.blizzard.BlizzardEventInteractor; -import usecases.eventrespond.shared.RespondInputData; +import usecases.eventrespond.blizzard.BlizzardInputData; /** * Controller for handling responses to a Blizzard event. @@ -18,7 +18,7 @@ public BlizzardResponseController(BlizzardEventInteractor interactor) { * @param choice The player's choice for the event. */ public void execute(int choice) { - RespondInputData inputData = new RespondInputData(choice); + BlizzardInputData inputData = new BlizzardInputData(choice); // Using BlizzardInputData now interactor.execute(inputData); } } diff --git a/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseInterface.java b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseInterface.java index f10424101..c100ab32f 100644 --- a/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseInterface.java +++ b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponseInterface.java @@ -4,7 +4,7 @@ * Interface for updating the UI for a Blizzard event. */ public interface BlizzardResponseInterface { - void updateUiResponse(String message); + void updateUiResponse(String message); // Message to update UI with - void failureResponse(String errorMessage); + void failureResponse(String errorMessage); // Handle failure cases } diff --git a/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponsePresenter.java index 1ab54a9aa..0e5032816 100644 --- a/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponsePresenter.java +++ b/src/main/java/interface_adapters/eventrespond/blizzard/BlizzardResponsePresenter.java @@ -1,12 +1,12 @@ package interface_adapters.eventrespond.blizzard; -import usecases.eventrespond.shared.RespondOutputBoundary; -import usecases.eventrespond.shared.RespondOutputData; +import usecases.eventrespond.blizzard.BlizzardOutputBoundary; +import usecases.eventrespond.blizzard.BlizzardOutputData; /** * Presenter for handling the response output of a Blizzard event. */ -public class BlizzardResponsePresenter implements RespondOutputBoundary { +public class BlizzardResponsePresenter implements BlizzardOutputBoundary { private final BlizzardResponseInterface view; public BlizzardResponsePresenter(BlizzardResponseInterface view) { @@ -14,12 +14,13 @@ public BlizzardResponsePresenter(BlizzardResponseInterface view) { } @Override - public void prepareSuccessView(RespondOutputData outputData) { - view.updateUiResponse(outputData.getMessage()); + public void prepareSuccessView(BlizzardOutputData outputData) { + // Pass the message and relevant details to the view + view.updateUiResponse(outputData.getMessage()); // Updated method based on new event-specific data } @Override public void prepareFailureView(String errorMessage) { - view.failureResponse(errorMessage); + view.failureResponse(errorMessage); // Handle failure case } } diff --git a/src/main/java/interface_adapters/eventrespond/flood/FloodResponseController.java b/src/main/java/interface_adapters/eventrespond/flood/FloodResponseController.java index d5fdd8da0..98a7e35f4 100644 --- a/src/main/java/interface_adapters/eventrespond/flood/FloodResponseController.java +++ b/src/main/java/interface_adapters/eventrespond/flood/FloodResponseController.java @@ -1,7 +1,7 @@ package interface_adapters.eventrespond.flood; import usecases.eventrespond.flood.FloodEventInteractor; -import usecases.eventrespond.shared.RespondInputData; +import usecases.eventrespond.flood.FloodInputData; /** * Controller for handling responses to a Flood event. @@ -18,7 +18,7 @@ public FloodResponseController(FloodEventInteractor interactor) { * @param choice The player's choice for the event. */ public void execute(int choice) { - RespondInputData inputData = new RespondInputData(choice); + FloodInputData inputData = new FloodInputData(choice); // Using FloodInputData now interactor.execute(inputData); } } diff --git a/src/main/java/interface_adapters/eventrespond/flood/FloodResponseInterface.java b/src/main/java/interface_adapters/eventrespond/flood/FloodResponseInterface.java index aaf439e20..db99b6dcb 100644 --- a/src/main/java/interface_adapters/eventrespond/flood/FloodResponseInterface.java +++ b/src/main/java/interface_adapters/eventrespond/flood/FloodResponseInterface.java @@ -4,7 +4,7 @@ * Interface for updating the UI for a Flood event. */ public interface FloodResponseInterface { - void updateUiResponse(String message); + void updateUiResponse(String message); // Update the UI with the event's message - void failureResponse(String errorMessage); + void failureResponse(String errorMessage); // Handle failure response } diff --git a/src/main/java/interface_adapters/eventrespond/flood/FloodResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/flood/FloodResponsePresenter.java index b683b2d6f..2bb02ea8d 100644 --- a/src/main/java/interface_adapters/eventrespond/flood/FloodResponsePresenter.java +++ b/src/main/java/interface_adapters/eventrespond/flood/FloodResponsePresenter.java @@ -1,12 +1,12 @@ package interface_adapters.eventrespond.flood; -import usecases.eventrespond.shared.RespondOutputBoundary; -import usecases.eventrespond.shared.RespondOutputData; +import usecases.eventrespond.flood.FloodOutputBoundary; +import usecases.eventrespond.flood.FloodOutputData; /** * Presenter for handling the response output of a Flood event. */ -public class FloodResponsePresenter implements RespondOutputBoundary { +public class FloodResponsePresenter implements FloodOutputBoundary { private final FloodResponseInterface view; public FloodResponsePresenter(FloodResponseInterface view) { @@ -14,12 +14,13 @@ public FloodResponsePresenter(FloodResponseInterface view) { } @Override - public void prepareSuccessView(RespondOutputData outputData) { - view.updateUiResponse(outputData.getMessage()); + public void prepareSuccessView(FloodOutputData outputData) { + // Update the UI with the message from FloodOutputData + view.updateUiResponse(outputData.getMessage()); // Updated to FloodOutputData's message } @Override public void prepareFailureView(String errorMessage) { - view.failureResponse(errorMessage); + view.failureResponse(errorMessage); // Handle failure case } } diff --git a/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseController.java b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseController.java index ce6a8eec1..718bb5719 100644 --- a/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseController.java +++ b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseController.java @@ -1,7 +1,7 @@ package interface_adapters.eventrespond.survivor; import usecases.eventrespond.survivor.SurvivorEventInteractor; -import usecases.eventrespond.shared.RespondInputData; +import usecases.eventrespond.survivor.SurvivorInputData; /** * Controller for handling responses to a Survivor event. @@ -18,7 +18,7 @@ public SurvivorResponseController(SurvivorEventInteractor interactor) { * @param choice The player's choice for the event. */ public void execute(int choice) { - RespondInputData inputData = new RespondInputData(choice); + SurvivorInputData inputData = new SurvivorInputData(choice); // Use SurvivorInputData interactor.execute(inputData); } } diff --git a/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseInterface.java b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseInterface.java index 280bda429..8dc949027 100644 --- a/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseInterface.java +++ b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponseInterface.java @@ -4,7 +4,7 @@ * Interface for updating the UI for a Survivor event. */ public interface SurvivorResponseInterface { - void updateUiResponse(String message); + void updateUiResponse(String message); // Update the UI with the event's message - void failureResponse(String errorMessage); + void failureResponse(String errorMessage); // Handle failure response } diff --git a/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponsePresenter.java index b8a0c948a..deb326548 100644 --- a/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponsePresenter.java +++ b/src/main/java/interface_adapters/eventrespond/survivor/SurvivorResponsePresenter.java @@ -1,12 +1,12 @@ package interface_adapters.eventrespond.survivor; -import usecases.eventrespond.shared.RespondOutputBoundary; -import usecases.eventrespond.shared.RespondOutputData; +import usecases.eventrespond.survivor.SurvivorOutputBoundary; +import usecases.eventrespond.survivor.SurvivorOutputData; /** * Presenter for handling the response output of a Survivor event. */ -public class SurvivorResponsePresenter implements RespondOutputBoundary { +public class SurvivorResponsePresenter implements SurvivorOutputBoundary { private final SurvivorResponseInterface view; public SurvivorResponsePresenter(SurvivorResponseInterface view) { @@ -14,12 +14,13 @@ public SurvivorResponsePresenter(SurvivorResponseInterface view) { } @Override - public void prepareSuccessView(RespondOutputData outputData) { + public void prepareSuccessView(SurvivorOutputData outputData) { + // Update the UI with the message from SurvivorOutputData view.updateUiResponse(outputData.getMessage()); } @Override public void prepareFailureView(String errorMessage) { - view.failureResponse(errorMessage); + view.failureResponse(errorMessage); // Handle failure case } } diff --git a/src/main/java/interface_adapters/eventrespond/trader/TraderResponseController.java b/src/main/java/interface_adapters/eventrespond/trader/TraderResponseController.java index 2e67fd1ca..2e9aabe24 100644 --- a/src/main/java/interface_adapters/eventrespond/trader/TraderResponseController.java +++ b/src/main/java/interface_adapters/eventrespond/trader/TraderResponseController.java @@ -1,7 +1,7 @@ package interface_adapters.eventrespond.trader; import usecases.eventrespond.trader.TraderEventInteractor; -import usecases.eventrespond.shared.RespondInputData; +import usecases.eventrespond.trader.TraderInputData; /** * Controller for handling responses to a Trader event. @@ -18,7 +18,7 @@ public TraderResponseController(TraderEventInteractor interactor) { * @param choice The player's choice for the event. */ public void execute(int choice) { - RespondInputData inputData = new RespondInputData(choice); + TraderInputData inputData = new TraderInputData(choice); // Use TraderInputData interactor.execute(inputData); } } diff --git a/src/main/java/interface_adapters/eventrespond/trader/TraderResponseInterface.java b/src/main/java/interface_adapters/eventrespond/trader/TraderResponseInterface.java index 061de30ed..ace9f58e9 100644 --- a/src/main/java/interface_adapters/eventrespond/trader/TraderResponseInterface.java +++ b/src/main/java/interface_adapters/eventrespond/trader/TraderResponseInterface.java @@ -4,7 +4,7 @@ * Interface for updating the UI for a Trader event. */ public interface TraderResponseInterface { - void updateUiResponse(String message); + void updateUiResponse(String message); // Update the UI with the event's message - void failureResponse(String errorMessage); + void failureResponse(String errorMessage); // Handle failure response } diff --git a/src/main/java/interface_adapters/eventrespond/trader/TraderResponsePresenter.java b/src/main/java/interface_adapters/eventrespond/trader/TraderResponsePresenter.java index 45a1b8260..d4eb34051 100644 --- a/src/main/java/interface_adapters/eventrespond/trader/TraderResponsePresenter.java +++ b/src/main/java/interface_adapters/eventrespond/trader/TraderResponsePresenter.java @@ -1,12 +1,12 @@ package interface_adapters.eventrespond.trader; -import usecases.eventrespond.shared.RespondOutputBoundary; -import usecases.eventrespond.shared.RespondOutputData; +import usecases.eventrespond.trader.TraderOutputBoundary; +import usecases.eventrespond.trader.TraderOutputData; /** * Presenter for handling the response output of a Trader event. */ -public class TraderResponsePresenter implements RespondOutputBoundary { +public class TraderResponsePresenter implements TraderOutputBoundary { private final TraderResponseInterface view; public TraderResponsePresenter(TraderResponseInterface view) { @@ -14,12 +14,13 @@ public TraderResponsePresenter(TraderResponseInterface view) { } @Override - public void prepareSuccessView(RespondOutputData outputData) { + public void prepareSuccessView(TraderOutputData outputData) { + // Update the UI with the message from TraderOutputData view.updateUiResponse(outputData.getMessage()); } @Override public void prepareFailureView(String errorMessage) { - view.failureResponse(errorMessage); + view.failureResponse(errorMessage); // Handle failure case } } From 92153d9e6d09ab438545cc22d8cf9f84a9f04b8b Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 1 Dec 2024 21:53:28 -0700 Subject: [PATCH 102/154] Actionpoint logic implemented --- src/main/java/entities/EntityConstants.java | 3 ++ src/main/java/entities/PlayerInfo.java | 13 ++++- .../database/InMemoryUnifiedDataAccess.java | 29 ++++++++--- .../broadcast/BroadcastController.java | 6 +-- .../broadcast/BroadcastInterface.java | 6 +-- .../broadcast/BroadcastPresenter.java | 5 +- .../BroadcastDataAccessInterface.java | 23 ++++++++- .../dailybroadcast/BroadcastInputData.java | 8 --- .../dailybroadcast/BroadcastInteractor.java | 51 ++++++------------- .../dailybroadcast/BroadcastOutputData.java | 21 +------- .../GatherDataAccessInterface.java | 12 +++++ .../dailygather/GatherInteractor.java | 18 ++++--- .../dailymove/MoveDataAccessInterface.java | 12 +++++ .../usecases/dailymove/MoveInteractor.java | 8 ++- src/main/java/view/EventView.java | 6 --- 15 files changed, 121 insertions(+), 100 deletions(-) diff --git a/src/main/java/entities/EntityConstants.java b/src/main/java/entities/EntityConstants.java index 47fcd2df5..6de7f3d92 100644 --- a/src/main/java/entities/EntityConstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -11,6 +11,9 @@ public class EntityConstants { public static final int STARTERWATER = 100; public static final int STARTWEAPON = 5; public static final int STARTERPEOPLE = 10; + public static final int STARTERACTIONPOINT = 3; + public static final int BROADCASTGAIN = 7; + public static final double SOCIALIMPACTBROADCAST = 0.05; public static final int STARTERATRIBUTEPOINT = 20; public static final double STARTERRESOURCESCALAR = 1; public static final double RESOUCEDECREASERATIO = 0.7; diff --git a/src/main/java/entities/PlayerInfo.java b/src/main/java/entities/PlayerInfo.java index 4ef5faefe..fac30bf0f 100644 --- a/src/main/java/entities/PlayerInfo.java +++ b/src/main/java/entities/PlayerInfo.java @@ -12,6 +12,7 @@ public class PlayerInfo { private int daysSurvived; // Whether the player won the game private boolean won; + private int actionPoint; /** * Constructs a new RankingEntry with the specified attributes. @@ -24,13 +25,15 @@ public PlayerInfo(String name) { this.score = 0; this.daysSurvived = 0; this.won = false; + this.actionPoint = EntityConstants.STARTERACTIONPOINT; } - public PlayerInfo(String name, int score, int daysSurvived, boolean won) { + public PlayerInfo(String name, int score, int daysSurvived, boolean won, int actionPoint) { this.name = name; this.score = score; this.daysSurvived = daysSurvived; this.won = won; + this.actionPoint = actionPoint; } public String getName() { @@ -60,4 +63,12 @@ public boolean isWon() { public void setWon(boolean won) { this.won = won; } + + public int getActionPoint() { + return actionPoint; + } + + public void setActionPoint(int actionPoint) { + this.actionPoint = actionPoint; + } } diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index 1da354a7c..bbac6faf7 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -9,7 +9,11 @@ import usecases.endprocesshorde.HordeDataAccessInterface; import usecases.eventdecide.DecideEventDataAccessInterface; import usecases.eventinitialize.EventInitializeDataAccessInterface; -import usecases.eventrespond.shared.RespondDataAccessInterface; +import usecases.eventrespond.ambush.AmbushDataAccessInterface; +import usecases.eventrespond.blizzard.BlizzardDataAccessInterface; +import usecases.eventrespond.flood.FloodDataAccessInterface; +import usecases.eventrespond.survivor.SurvivorDataAccessInterface; +import usecases.eventrespond.trader.TraderDataAccessInterface; import usecases.fetchresource.FetchDataAccessInterface; import usecases.gameminimap.MinimapDataAccessInterface; import usecases.gamenewday.NewdayDataAccessInterface; @@ -32,8 +36,12 @@ public class InMemoryUnifiedDataAccess implements MoveDataAccessInterface, NewdayDataAccessInterface, PlaceDescriptionDataAccessInterface, - RespondDataAccessInterface, - NevagateAllowcateDataAccessInterface { + NevagateAllowcateDataAccessInterface, + FloodDataAccessInterface, + SurvivorDataAccessInterface, + TraderDataAccessInterface, + BlizzardDataAccessInterface, + AmbushDataAccessInterface { // Shared game data private PlayerAttributes playerAttributes; private Inventory inventory; @@ -113,11 +121,6 @@ public Inventory getInventory() { return inventory; } - @Override - public void updateInventory(int resourceChange) { - inventory.changeWater(resourceChange); - } - // Implement of the DecideEventDataAccessInterface @Override public ArrayList getEvents() { @@ -141,6 +144,16 @@ public Location getLocation() { return currentLocation; } + @Override + public int getActionPoint() { + return playerInfo.getActionPoint(); + } + + @Override + public void setActionPoint(int actionPoint) { + playerInfo.setActionPoint(actionPoint); + } + // Implement of the EventInitiallizeInterface @Override public Event getEvent() { diff --git a/src/main/java/interface_adapters/broadcast/BroadcastController.java b/src/main/java/interface_adapters/broadcast/BroadcastController.java index 09491dad7..de2de6d0a 100644 --- a/src/main/java/interface_adapters/broadcast/BroadcastController.java +++ b/src/main/java/interface_adapters/broadcast/BroadcastController.java @@ -21,11 +21,9 @@ public BroadcastController(BroadcastInputBoundary inputBoundary) { /** * Handles the broadcast action by invoking the use case with the provided type. - * - * @param broadcastType The type of broadcast action (e.g., "SOS", "Resources"). */ - public void handleBroadcast(String broadcastType) { - final BroadcastInputData inputData = new BroadcastInputData(broadcastType); + public void execute() { + final BroadcastInputData inputData = new BroadcastInputData(); inputBoundary.execute(inputData); } } diff --git a/src/main/java/interface_adapters/broadcast/BroadcastInterface.java b/src/main/java/interface_adapters/broadcast/BroadcastInterface.java index e87f29b93..101da970a 100644 --- a/src/main/java/interface_adapters/broadcast/BroadcastInterface.java +++ b/src/main/java/interface_adapters/broadcast/BroadcastInterface.java @@ -1,4 +1,5 @@ package interface_adapters.broadcast; + /** * Interface for broadcast view, ensures the UI adheres to this contract. */ @@ -7,11 +8,8 @@ public interface BroadcastInterface { * Updates the UI with the successful broadcast result. * * @param message The result message of the broadcast. - * @param survivorsFound The number of survivors found (if any). - * @param resourcesFound The resources found (if any). - * @param attractedZombies True if zombies were attracted by the broadcast. */ - void updateUiBroadcast(String message, int survivorsFound, int resourcesFound, boolean attractedZombies); + void updateUiBroadcast(String message); /** * Updates the UI with the error message in case of failure. diff --git a/src/main/java/interface_adapters/broadcast/BroadcastPresenter.java b/src/main/java/interface_adapters/broadcast/BroadcastPresenter.java index 869fbaa67..374738e76 100644 --- a/src/main/java/interface_adapters/broadcast/BroadcastPresenter.java +++ b/src/main/java/interface_adapters/broadcast/BroadcastPresenter.java @@ -22,10 +22,7 @@ public BroadcastPresenter(BroadcastInterface view) { @Override public void prepareSuccessView(BroadcastOutputData outputData) { view.updateUiBroadcast( - outputData.getResultMessage(), - outputData.getSurvivorsFound(), - outputData.getResourcesFound(), - outputData.isAttractedZombies() + outputData.getResultMessage() ); } diff --git a/src/main/java/usecases/dailybroadcast/BroadcastDataAccessInterface.java b/src/main/java/usecases/dailybroadcast/BroadcastDataAccessInterface.java index 4321aa7c7..745f6be2d 100644 --- a/src/main/java/usecases/dailybroadcast/BroadcastDataAccessInterface.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastDataAccessInterface.java @@ -1,6 +1,7 @@ package usecases.dailybroadcast; import entities.Inventory; +import entities.Location; import entities.PlayerAttributes; /** @@ -24,7 +25,25 @@ public interface BroadcastDataAccessInterface { /** * Updates the player's inventory. * - * @param resourceChange The change in resources. + * @param peopleChange The change in resources. */ - void updateInventory(int resourceChange); + void changePeople(int peopleChange); + + /** + * Get player's current location. + * @return location. + */ + Location getLocation(); + + /** + * Get player's action point left. + * @return action point. + */ + int getActionPoint(); + + /** + * Set player's action point. + * @param actionPoint action point. + */ + void setActionPoint(int actionPoint); } diff --git a/src/main/java/usecases/dailybroadcast/BroadcastInputData.java b/src/main/java/usecases/dailybroadcast/BroadcastInputData.java index ab760d835..9e7d316e1 100644 --- a/src/main/java/usecases/dailybroadcast/BroadcastInputData.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastInputData.java @@ -4,13 +4,5 @@ * Input data for the broadcast use case. */ public class BroadcastInputData { - private final String broadcastType; - public BroadcastInputData(String broadcastType) { - this.broadcastType = broadcastType; - } - - public String getBroadcastType() { - return broadcastType; - } } diff --git a/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java b/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java index da0d89844..11eb7b046 100644 --- a/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java @@ -1,8 +1,7 @@ package usecases.dailybroadcast; -import java.util.Random; - -import entities.Inventory; +import entities.EntityConstants; +import entities.Location; import entities.PlayerAttributes; /** @@ -20,40 +19,20 @@ public BroadcastInteractor(usecases.dailybroadcast.BroadcastDataAccessInterface @Override public void execute(usecases.dailybroadcast.BroadcastInputData inputData) { - PlayerAttributes attributes = dataAccessInterface.getPlayerAttributes(); - Inventory inventory = dataAccessInterface.getInventory(); - - // Check if the player has enough resources for a broadcast - int resourceCost = 5; - if (inventory.getWater() < resourceCost) { - outputBoundary.prepareFailureView("Not enough resources to broadcast."); - return; - } - - // Deduct the resources - dataAccessInterface.updateInventory(-resourceCost); - - // Simulate outcomes based on attributes - Random random = new Random(); - boolean success = random.nextDouble() < (0.5 + attributes.getSocial() * 0.05); - boolean attractedZombies = random.nextDouble() < (0.2 - attributes.getLuck() * 0.03); - - int survivorsFound = 0; - int resourcesFound = 0; - - String resultMessage = "Your broadcast did not produce any results."; - - if (success) { - survivorsFound = random.nextInt(3) + 1; - resourcesFound = random.nextInt(10) + 5; - resultMessage = "Your broadcast was successful!"; - } - - if (attractedZombies) { - resultMessage += " However, it attracted zombies!"; + final PlayerAttributes attributes = dataAccessInterface.getPlayerAttributes(); + final int actionpoint = dataAccessInterface.getActionPoint(); + final Location location = dataAccessInterface.getLocation(); + + if (actionpoint > 0) { + final int peoplegain = (int) Math.round(EntityConstants.BROADCASTGAIN + * (1 + attributes.getSocial() * EntityConstants.SOCIALIMPACTBROADCAST) + * location.getpeopleresourceavailable()); + final String successmessage = "Though Broadcast, " + peoplegain + " decided to join your group!"; + dataAccessInterface.setActionPoint(actionpoint - 1); + dataAccessInterface.changePeople(peoplegain); + final BroadcastOutputData outputData = new BroadcastOutputData(successmessage); + outputBoundary.prepareSuccessView(outputData); } - BroadcastOutputData outputData = new BroadcastOutputData(resultMessage, survivorsFound, resourcesFound, attractedZombies); - outputBoundary.prepareSuccessView(outputData); } } diff --git a/src/main/java/usecases/dailybroadcast/BroadcastOutputData.java b/src/main/java/usecases/dailybroadcast/BroadcastOutputData.java index e07c84343..412315f79 100644 --- a/src/main/java/usecases/dailybroadcast/BroadcastOutputData.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastOutputData.java @@ -5,30 +5,13 @@ */ public class BroadcastOutputData { private final String resultMessage; - private final int survivorsFound; - private final int resourcesFound; - private final boolean attractedZombies; - public BroadcastOutputData(String resultMessage, int survivorsFound, int resourcesFound, boolean attractedZombies) { + public BroadcastOutputData(String resultMessage) { this.resultMessage = resultMessage; - this.survivorsFound = survivorsFound; - this.resourcesFound = resourcesFound; - this.attractedZombies = attractedZombies; + } public String getResultMessage() { return resultMessage; } - - public int getSurvivorsFound() { - return survivorsFound; - } - - public int getResourcesFound() { - return resourcesFound; - } - - public boolean isAttractedZombies() { - return attractedZombies; - } } diff --git a/src/main/java/usecases/dailygather/GatherDataAccessInterface.java b/src/main/java/usecases/dailygather/GatherDataAccessInterface.java index 62b50fde0..75d761ac3 100644 --- a/src/main/java/usecases/dailygather/GatherDataAccessInterface.java +++ b/src/main/java/usecases/dailygather/GatherDataAccessInterface.java @@ -41,4 +41,16 @@ public interface GatherDataAccessInterface { * @param weapongathered weapons found in this gather, in this location, by the player. */ void changeWeapon(int weapongathered); + + /** + * Get action point. + * @return actionpoint. + */ + int getActionPoint(); + + /** + * Set action point ot new value. + * @param actionPoint new action point. + */ + void setActionPoint(int actionPoint); } diff --git a/src/main/java/usecases/dailygather/GatherInteractor.java b/src/main/java/usecases/dailygather/GatherInteractor.java index f4459a042..6b58ef8fe 100644 --- a/src/main/java/usecases/dailygather/GatherInteractor.java +++ b/src/main/java/usecases/dailygather/GatherInteractor.java @@ -17,6 +17,7 @@ public void execute(GatherInputData inputdata) { final double foodscalar = dataAccessInterface.getLocation().getfoodresourceavailable(); final double waterscalar = dataAccessInterface.getLocation().getwaterresourceavailable(); final double weaponscalar = dataAccessInterface.getLocation().getweaponresourceavailable(); + final int actionpoint = dataAccessInterface.getActionPoint(); final int people = dataAccessInterface.getInventory().getPeople(); final int foodgathered = (int) Math.round(foodscalar * Math.sqrt((double) people)); final int watergathered = (int) Math.round(waterscalar * Math.sqrt((double) people)); @@ -39,23 +40,26 @@ public void execute(GatherInputData inputdata) { else { successoutputmessage.append("."); } - dataAccessInterface.changeFood(foodgathered); - dataAccessInterface.changeWater(watergathered); - dataAccessInterface.changeWeapon(weapongathered); - if (isvaildgather()) { + + if (isvaildgather(actionpoint)) { + dataAccessInterface.changeFood(foodgathered); + dataAccessInterface.changeWater(watergathered); + dataAccessInterface.changeWeapon(weapongathered); + dataAccessInterface.setActionPoint(actionpoint - 1); outputBoundary.prepareSuccessView(new GatherOutputData( successoutputmessage.toString())); } else { - outputBoundary.prepareFailureView("Invalid Gather"); + outputBoundary.prepareFailureView("Can not gather! your people are tired!"); } } /** * Helper function to determine validity of this gather, right now I can't think of a way of failing. + * @param actionpoint player have. * @return vaild gather or not. */ - public boolean isvaildgather() { - return true; + public boolean isvaildgather(int actionpoint) { + return actionpoint > 0; } } diff --git a/src/main/java/usecases/dailymove/MoveDataAccessInterface.java b/src/main/java/usecases/dailymove/MoveDataAccessInterface.java index f470779d9..53f48e74e 100644 --- a/src/main/java/usecases/dailymove/MoveDataAccessInterface.java +++ b/src/main/java/usecases/dailymove/MoveDataAccessInterface.java @@ -34,4 +34,16 @@ public interface MoveDataAccessInterface { * @param newy newy of player */ void updatePlayerLocation(int newx, int newy); + + /** + * Get action point they have. + * @return action point. + */ + int getActionPoint(); + + /** + * Setter for updated action point. + * @param point action point. + */ + void setActionPoint(int point); } diff --git a/src/main/java/usecases/dailymove/MoveInteractor.java b/src/main/java/usecases/dailymove/MoveInteractor.java index 13550274d..6c4ae592d 100644 --- a/src/main/java/usecases/dailymove/MoveInteractor.java +++ b/src/main/java/usecases/dailymove/MoveInteractor.java @@ -26,6 +26,7 @@ public void execute(MoveInputData moveInputData) { final int y = currentLocation.getYcoordinate(); final int mapWidth = moveDataAccessObject.getMaps().getGrid().size(); final int mapHeight = moveDataAccessObject.getMaps().getGrid().get(1).size(); + final int actionpoint = moveDataAccessObject.getActionPoint(); // Variables for new coordinates int newX = x; @@ -54,11 +55,16 @@ public void execute(MoveInputData moveInputData) { moveOutputBoundary.prepareFailureView( "You can't move further in the " + direction + " direction; you're at the edge."); } - else { + else if (actionpoint > 0) { moveDataAccessObject.updatePlayerLocation(newX, newY); + moveDataAccessObject.setActionPoint(actionpoint - 1); final String successMessage = "You moved to position (" + newX + ", " + newY + ")."; moveOutputBoundary.prepareSuccessView(new MoveOutputData(newX, newY, true, successMessage)); } + else { + final String failmessage = "You can't move, your group is too tired!"; + moveOutputBoundary.prepareFailureView(failmessage); + } } /** diff --git a/src/main/java/view/EventView.java b/src/main/java/view/EventView.java index 0805f9851..38d82f569 100644 --- a/src/main/java/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -1,11 +1,5 @@ package view; -import interface_adapters.eventrespond.EventResponseController; -import interface_adapters.eventrespond.EventResponseInterface; -import interface_adapters.eventrespond.EventResponsePresenter; -import usecases.eventrespond.shared.RespondDataAccessInterface; -import usecases.eventrespond.shared.RespondInputData; - import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; From 4d315a0b473ebf14056a9a249f1b062960bf8ad5 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 1 Dec 2024 22:11:43 -0700 Subject: [PATCH 103/154] Back button connected --- src/main/java/app/GameMainApplication.java | 12 ++++++++++-- .../database/InMemoryUnifiedDataAccess.java | 4 +++- src/main/java/view/CharacterCreationView.java | 10 +++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 2576cc7e2..457d1e8e5 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -10,9 +10,13 @@ import interface_adapters.NavigationManager; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; import interface_adapters.nevagateallowcatepage.NevagateAllowcatePresenter; +import interface_adapters.nevagatemainview.NevagateMainController; +import interface_adapters.nevagatemainview.NevagateMainInterface; +import interface_adapters.nevagatemainview.NevagateMainPresenter; import interface_adapters.startallowcatepoint.AllowcateController; import interface_adapters.startallowcatepoint.AllowcatePresenter; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; +import usecases.nevagatemain.NevagateMainInteractor; import usecases.startallowcate.AllowcateInteractor; import frameworks.database.JsonRankingDataAccess; import view.*; @@ -96,8 +100,12 @@ public static void main(String[] args) { final AllowcatePresenter allowcatePresenter = new AllowcatePresenter(attributeview, navigationManager); final AllowcateInteractor allowcateInteractor = new AllowcateInteractor(gamedatabase, allowcatePresenter); final AllowcateController allowcateController = new AllowcateController(allowcateInteractor); - attributeview.setAllowcateController(allowcateController); - + // Nevagate Mian usecase. + final NevagateMainPresenter nevagateMainPresenter = new NevagateMainPresenter(navigationManager); + final NevagateMainInteractor nevagateMainInteractor = + new NevagateMainInteractor(gamedatabase, nevagateMainPresenter); + final NevagateMainController nevagateMainController = new NevagateMainController(nevagateMainInteractor); + attributeview.setAllowcateController(allowcateController, nevagateMainController); // Example of how to use the endGame method // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); } diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index bbac6faf7..33b9fdaa4 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -19,6 +19,7 @@ import usecases.gamenewday.NewdayDataAccessInterface; import usecases.gameplacedescription.PlaceDescriptionDataAccessInterface; import usecases.nevagateAllowcatePage.NevagateAllowcateDataAccessInterface; +import usecases.nevagatemain.NevagateMainDataAccessInterface; import usecases.startallowcate.AllowcateDataAccessInterface; /** @@ -41,7 +42,8 @@ public class InMemoryUnifiedDataAccess implements SurvivorDataAccessInterface, TraderDataAccessInterface, BlizzardDataAccessInterface, - AmbushDataAccessInterface { + AmbushDataAccessInterface, + NevagateMainDataAccessInterface { // Shared game data private PlayerAttributes playerAttributes; private Inventory inventory; diff --git a/src/main/java/view/CharacterCreationView.java b/src/main/java/view/CharacterCreationView.java index 8884f0b8e..15af809ac 100644 --- a/src/main/java/view/CharacterCreationView.java +++ b/src/main/java/view/CharacterCreationView.java @@ -1,5 +1,6 @@ package view; +import interface_adapters.nevagatemainview.NevagateMainController; import interface_adapters.startallowcatepoint.AllowcateController; import interface_adapters.startallowcatepoint.AllowcateInterface; @@ -28,6 +29,7 @@ public class CharacterCreationView extends JFrame implements AllowcateInterface private int thrift; private int generalship; private AllowcateController allowcateController; + private NevagateMainController nevagateMainController; @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings", "checkstyle:ExecutableStatementCount"}) @@ -84,7 +86,7 @@ public CharacterCreationView() { addListeners(socialButton, luckButton, mobilizationButton, thriftButton, generalshipButton); backButton.addActionListener(e -> { - + nevagateMainController.execute(); }); startGameButton.addActionListener(e -> { @@ -98,8 +100,10 @@ public CharacterCreationView() { setVisible(false); } - public void setAllowcateController(AllowcateController allowcateController) { - this.allowcateController = allowcateController; + public void setAllowcateController(AllowcateController AllowcateController, + NevagateMainController NevagateMainController) { + this.allowcateController = AllowcateController; + this.nevagateMainController = NevagateMainController; } @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) From e44bd5b798a9fc308f21b9170f1c93199b181785 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 1 Dec 2024 23:21:11 -0700 Subject: [PATCH 104/154] Fireproperty added for change in Game page --- src/main/java/app/GameMainApplication.java | 11 +- src/main/java/view/GameView.java | 294 ++++++++++++++------- 2 files changed, 209 insertions(+), 96 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 457d1e8e5..efecf7bd8 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -8,6 +8,8 @@ import entities.*; import frameworks.database.InMemoryUnifiedDataAccess; import interface_adapters.NavigationManager; +import interface_adapters.fetchresource.FetchController; +import interface_adapters.fetchresource.FetchPresenter; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; import interface_adapters.nevagateallowcatepage.NevagateAllowcatePresenter; import interface_adapters.nevagatemainview.NevagateMainController; @@ -15,6 +17,7 @@ import interface_adapters.nevagatemainview.NevagateMainPresenter; import interface_adapters.startallowcatepoint.AllowcateController; import interface_adapters.startallowcatepoint.AllowcatePresenter; +import usecases.fetchresource.FetchInteractor; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; import usecases.nevagatemain.NevagateMainInteractor; import usecases.startallowcate.AllowcateInteractor; @@ -100,11 +103,17 @@ public static void main(String[] args) { final AllowcatePresenter allowcatePresenter = new AllowcatePresenter(attributeview, navigationManager); final AllowcateInteractor allowcateInteractor = new AllowcateInteractor(gamedatabase, allowcatePresenter); final AllowcateController allowcateController = new AllowcateController(allowcateInteractor); - // Nevagate Mian usecase. + // Nevagate Main usecase. final NevagateMainPresenter nevagateMainPresenter = new NevagateMainPresenter(navigationManager); final NevagateMainInteractor nevagateMainInteractor = new NevagateMainInteractor(gamedatabase, nevagateMainPresenter); final NevagateMainController nevagateMainController = new NevagateMainController(nevagateMainInteractor); + // Fetch Usecase + final FetchPresenter fetchPresenter = new FetchPresenter(gameView); + final FetchInteractor fetchInteractor = new FetchInteractor(gamedatabase, fetchPresenter); + final FetchController fetchController = new FetchController(fetchInteractor); + + gameView.setFetchController(fetchController); attributeview.setAllowcateController(allowcateController, nevagateMainController); // Example of how to use the endGame method // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index e436ca263..07afe496b 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -1,37 +1,58 @@ package view; +import interface_adapters.fetchresource.FetchController; +import interface_adapters.fetchresource.FetchInterface; + import javax.swing.*; import java.awt.*; -import java.awt.event.ActionListener; -import java.util.Map; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + +public class GameView extends JFrame implements PropertyChangeListener, FetchInterface { + private int day; + private int food; + private int water; + private int people; + private int weapon; + private int action; + + private final JLabel dayLabel; + private final JLabel foodLabel; + private final JLabel waterLabel; + private final JLabel peopleLabel; + private final JLabel weaponLabel; + private final JLabel actionAvailableLabel; -public class GameView extends JFrame { private final JTextArea mapPanel; private final JTextArea infoBox; private boolean isMapVisible = true; + private FetchController fetchController; + + private final PropertyChangeSupport propertyChangeSupport; + public GameView() { super("Game"); - final int day = 60; - final int food = 50; - final int water = 30; - final int people = 20; - final int weapon = 15; - final int action = 3; - - final Container container = getContentPane(); - final SpringLayout layout = new SpringLayout(); + + // Initialize PropertyChangeSupport + this.propertyChangeSupport = new PropertyChangeSupport(this); + + // Initialize UI components + Container container = getContentPane(); + SpringLayout layout = new SpringLayout(); container.setLayout(layout); - final JLabel dayLabel = new JLabel("Day: " + day); - dayLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); - container.add(dayLabel); + // Initialize labels for resources + dayLabel = new JLabel("Day: " + day); + dayLabel.setFont(new Font("Serif", Font.BOLD, 20)); + foodLabel = new JLabel("Food: " + food); + waterLabel = new JLabel("Water: " + water); + peopleLabel = new JLabel("People: " + people); + weaponLabel = new JLabel("Weapon: " + weapon); + actionAvailableLabel = new JLabel("Action Available: " + action); - final JLabel foodLabel = new JLabel("Food:" + food); - final JLabel waterLabel = new JLabel("Water: " + water); - final JLabel peopleLabel = new JLabel("People: " + people); - final JLabel weaponLabel = new JLabel("Weapon:" + weapon); - final JLabel actionAvailableLabel = new JLabel("Action Available:" + action); + container.add(dayLabel); container.add(foodLabel); container.add(waterLabel); container.add(peopleLabel); @@ -40,12 +61,12 @@ public GameView() { // MiniMap Panel mapPanel = new JTextArea("Mini Map\nabcdefghijklm\nnuvwxyz"); - mapPanel.setEditable(false); // Set to non-editable - mapPanel.setLineWrap(true); // Enable line wrap - mapPanel.setWrapStyleWord(true); // Wrap by words + mapPanel.setEditable(false); + mapPanel.setLineWrap(true); + mapPanel.setWrapStyleWord(true); mapPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); mapPanel.setBackground(Color.LIGHT_GRAY); - mapPanel.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); + mapPanel.setPreferredSize(new Dimension(200, 200)); container.add(mapPanel); // InfoBox TextArea @@ -56,15 +77,17 @@ public GameView() { infoBox.setVisible(false); container.add(infoBox); - final JButton broadcastButton = new JButton("Broadcast"); - final JButton gatherButton = new JButton("Gather"); - final JButton upButton = new JButton("Up"); - final JButton downButton = new JButton("Down"); - final JButton leftButton = new JButton("Left"); - final JButton rightButton = new JButton("Right"); - final JButton eventButton = new JButton("Event"); - final JButton nextDayButton = new JButton("Next Day"); - final JButton infoButton = new JButton("log"); + // Buttons + JButton broadcastButton = new JButton("Broadcast"); + JButton gatherButton = new JButton("Gather"); + JButton upButton = new JButton("Up"); + JButton downButton = new JButton("Down"); + JButton leftButton = new JButton("Left"); + JButton rightButton = new JButton("Right"); + JButton eventButton = new JButton("Event"); + JButton nextDayButton = new JButton("Next Day"); + JButton infoButton = new JButton("Log"); + container.add(broadcastButton); container.add(gatherButton); container.add(upButton); @@ -75,100 +98,181 @@ public GameView() { container.add(nextDayButton); container.add(infoButton); - // Layout Constraints - extracted(layout, dayLabel, container, foodLabel, waterLabel, peopleLabel, weaponLabel, actionAvailableLabel - , broadcastButton, gatherButton, eventButton, nextDayButton, upButton, downButton, - leftButton, rightButton, infoButton); - // Add ActionListeners infoButton.addActionListener(e -> toggleInfoBox()); + nextDayButton.addActionListener(e -> { + if (fetchController != null) { + fetchController.execute(); + } + }); - // Window settings - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + // Layout Constraints + applyLayoutConstraints(layout, container, dayLabel, foodLabel, waterLabel, peopleLabel, weaponLabel, + actionAvailableLabel, mapPanel, infoBox, broadcastButton, gatherButton, upButton, downButton, + leftButton, rightButton, eventButton, nextDayButton, infoButton); + + // Set frame properties + setSize(600, 400); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); + + // Register this as a listener for property changes + propertyChangeSupport.addPropertyChangeListener(this); + } + + public void setFetchController(FetchController fetchController) { + this.fetchController = fetchController; + } + + public void render() { + fetchController.execute(); + setVisible(true); + } + + public void disrender() { setVisible(false); } - private void extracted(SpringLayout layout, JLabel dayLabel, Container container, JLabel foodLabel, - JLabel waterLabel, JLabel peopleLabel, JLabel weaponLabel, JLabel actionAvailableLabel, - JButton broadcastButton, JButton gatherButton, - JButton eventButton, JButton nextDayButton, JButton upButton, JButton downButton, - JButton leftButton, JButton rightButton, JButton infoButton) { - layout.putConstraint(SpringLayout.WEST, dayLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, dayLabel, Constants.TWENTY, SpringLayout.NORTH, container); + private void toggleInfoBox() { + isMapVisible = !isMapVisible; + mapPanel.setVisible(isMapVisible); + infoBox.setVisible(!isMapVisible); + } - layout.putConstraint(SpringLayout.WEST, foodLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, foodLabel, Constants.TWENTY, SpringLayout.SOUTH, dayLabel); + public void setDay(int day) { + int oldDay = this.day; + this.day = day; + propertyChangeSupport.firePropertyChange("day", oldDay, day); + } - layout.putConstraint(SpringLayout.WEST, waterLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, waterLabel, Constants.TWENTY, SpringLayout.SOUTH, foodLabel); + public void setFood(int food) { + int oldFood = this.food; + this.food = food; + propertyChangeSupport.firePropertyChange("food", oldFood, food); + } - layout.putConstraint(SpringLayout.WEST, peopleLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, peopleLabel, Constants.TWENTY, SpringLayout.SOUTH, waterLabel); + public void setWater(int water) { + int oldWater = this.water; + this.water = water; + propertyChangeSupport.firePropertyChange("water", oldWater, water); + } - layout.putConstraint(SpringLayout.WEST, weaponLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, weaponLabel, Constants.TWENTY, SpringLayout.SOUTH, peopleLabel); + public void setPeople(int people) { + int oldPeople = this.people; + this.people = people; + propertyChangeSupport.firePropertyChange("people", oldPeople, people); + } - layout.putConstraint(SpringLayout.WEST, actionAvailableLabel, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, actionAvailableLabel, Constants.TWENTY, SpringLayout.SOUTH, - weaponLabel); + public void setWeapon(int weapon) { + int oldWeapon = this.weapon; + this.weapon = weapon; + propertyChangeSupport.firePropertyChange("weapon", oldWeapon, weapon); + } - // MiniMap and InfoBox Layout - layout.putConstraint(SpringLayout.EAST, mapPanel, -Constants.TWENTY, SpringLayout.EAST, container); - layout.putConstraint(SpringLayout.NORTH, mapPanel, Constants.TWENTY, SpringLayout.NORTH, container); + public void setAction(int action) { + int oldAction = this.action; + this.action = action; + propertyChangeSupport.firePropertyChange("action", oldAction, action); + } - layout.putConstraint(SpringLayout.EAST, infoBox, -Constants.TWENTY, SpringLayout.EAST, container); - layout.putConstraint(SpringLayout.NORTH, infoBox, Constants.TWENTY, SpringLayout.NORTH, container); - layout.putConstraint(SpringLayout.SOUTH, infoBox, 0, SpringLayout.SOUTH, mapPanel); - layout.putConstraint(SpringLayout.WEST, infoBox, 0, SpringLayout.WEST, mapPanel); + private void applyLayoutConstraints(SpringLayout layout, Container container, JLabel dayLabel, + JLabel foodLabel, JLabel waterLabel, JLabel peopleLabel, + JLabel weaponLabel, JLabel actionAvailableLabel, JTextArea mapPanel, + JTextArea infoBox, JButton broadcastButton, JButton gatherButton, + JButton upButton, JButton downButton, JButton leftButton, + JButton rightButton, JButton eventButton, JButton nextDayButton, + JButton infoButton) { + // Position resource labels + layout.putConstraint(SpringLayout.WEST, dayLabel, 20, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, dayLabel, 20, SpringLayout.NORTH, container); - layout.putConstraint(SpringLayout.WEST, broadcastButton, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, broadcastButton, Constants.TWENTY, SpringLayout.SOUTH, - actionAvailableLabel); + layout.putConstraint(SpringLayout.WEST, foodLabel, 20, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, foodLabel, 20, SpringLayout.SOUTH, dayLabel); - layout.putConstraint(SpringLayout.WEST, gatherButton, Constants.TWENTY, SpringLayout.EAST, broadcastButton); - layout.putConstraint(SpringLayout.NORTH, gatherButton, 0, SpringLayout.NORTH, broadcastButton); + layout.putConstraint(SpringLayout.WEST, waterLabel, 20, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, waterLabel, 20, SpringLayout.SOUTH, foodLabel); - layout.putConstraint(SpringLayout.WEST, eventButton, Constants.TWENTY, SpringLayout.EAST, gatherButton); - layout.putConstraint(SpringLayout.NORTH, eventButton, 0, SpringLayout.NORTH, gatherButton); + layout.putConstraint(SpringLayout.WEST, peopleLabel, 20, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, peopleLabel, 20, SpringLayout.SOUTH, waterLabel); - layout.putConstraint(SpringLayout.WEST, nextDayButton, Constants.TWENTY, SpringLayout.EAST, eventButton); - layout.putConstraint(SpringLayout.NORTH, nextDayButton, 0, SpringLayout.NORTH, broadcastButton); + layout.putConstraint(SpringLayout.WEST, weaponLabel, 20, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, weaponLabel, 20, SpringLayout.SOUTH, peopleLabel); - layout.putConstraint(SpringLayout.NORTH, upButton, Constants.TWENTY, SpringLayout.SOUTH, broadcastButton); - layout.putConstraint(SpringLayout.WEST, upButton, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.WEST, actionAvailableLabel, 20, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, actionAvailableLabel, 20, SpringLayout.SOUTH, weaponLabel); - layout.putConstraint(SpringLayout.WEST, downButton, Constants.TWENTY, SpringLayout.EAST, upButton); + // Position minimap + layout.putConstraint(SpringLayout.EAST, mapPanel, -20, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, mapPanel, 20, SpringLayout.NORTH, container); + + // Position info box + layout.putConstraint(SpringLayout.EAST, infoBox, -20, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, infoBox, 20, SpringLayout.NORTH, container); + + // Position buttons + layout.putConstraint(SpringLayout.WEST, broadcastButton, 20, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, broadcastButton, 20, SpringLayout.SOUTH, actionAvailableLabel); + + layout.putConstraint(SpringLayout.WEST, gatherButton, 20, SpringLayout.EAST, broadcastButton); + layout.putConstraint(SpringLayout.NORTH, gatherButton, 0, SpringLayout.NORTH, broadcastButton); + + layout.putConstraint(SpringLayout.WEST, upButton, 20, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, upButton, 20, SpringLayout.SOUTH, broadcastButton); + + layout.putConstraint(SpringLayout.WEST, downButton, 20, SpringLayout.EAST, upButton); layout.putConstraint(SpringLayout.NORTH, downButton, 0, SpringLayout.NORTH, upButton); - layout.putConstraint(SpringLayout.WEST, leftButton, Constants.TWENTY, SpringLayout.EAST, downButton); + layout.putConstraint(SpringLayout.WEST, leftButton, 20, SpringLayout.EAST, downButton); layout.putConstraint(SpringLayout.NORTH, leftButton, 0, SpringLayout.NORTH, upButton); - layout.putConstraint(SpringLayout.WEST, rightButton, Constants.TWENTY, SpringLayout.EAST, leftButton); + layout.putConstraint(SpringLayout.WEST, rightButton, 20, SpringLayout.EAST, leftButton); layout.putConstraint(SpringLayout.NORTH, rightButton, 0, SpringLayout.NORTH, upButton); - layout.putConstraint(SpringLayout.WEST, infoButton, Constants.TWENTY, SpringLayout.EAST, rightButton); - layout.putConstraint(SpringLayout.NORTH, infoButton, 0, SpringLayout.NORTH, upButton); - } + layout.putConstraint(SpringLayout.WEST, eventButton, 20, SpringLayout.EAST, gatherButton); + layout.putConstraint(SpringLayout.NORTH, eventButton, 0, SpringLayout.NORTH, broadcastButton); - private void toggleInfoBox() { - isMapVisible = !isMapVisible; - mapPanel.setVisible(isMapVisible); - infoBox.setVisible(!isMapVisible); - } + layout.putConstraint(SpringLayout.WEST, nextDayButton, 20, SpringLayout.EAST, eventButton); + layout.putConstraint(SpringLayout.NORTH, nextDayButton, 0, SpringLayout.NORTH, broadcastButton); - public void render() { - setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); - setVisible(true); + layout.putConstraint(SpringLayout.WEST, infoButton, 20, SpringLayout.EAST, rightButton); + layout.putConstraint(SpringLayout.NORTH, infoButton, 0, SpringLayout.NORTH, upButton); } - public void disrender() { - setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); - setVisible(false); + @Override + public void propertyChange(PropertyChangeEvent evt) { + String propertyName = evt.getPropertyName(); + + switch (propertyName) { + case "day": + dayLabel.setText("Day: " + evt.getNewValue()); + break; + case "food": + foodLabel.setText("Food: " + evt.getNewValue()); + break; + case "water": + waterLabel.setText("Water: " + evt.getNewValue()); + break; + case "people": + peopleLabel.setText("People: " + evt.getNewValue()); + break; + case "weapon": + weaponLabel.setText("Weapon: " + evt.getNewValue()); + break; + case "action": + actionAvailableLabel.setText("Action Available: " + evt.getNewValue()); + break; + default: + // Handle unknown properties if needed + break; + } } - public static void main(String[] args) { - new GameView(); + @Override + public void updateUiResource(int food, int water, int people, int weapon) { + setFood(food); + setWater(water); + setPeople(people); + setWeapon(weapon); } + } From 1b73e215df21bcf7eb69dad6a026b2b50f1c8604 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 1 Dec 2024 23:31:04 -0700 Subject: [PATCH 105/154] Game page able to update --- src/main/java/entities/PlayerInfo.java | 2 +- .../fetchresource/FetchInterface.java | 4 +++- .../fetchresource/FetchPresenter.java | 2 +- .../fetchresource/FetchDataAccessInterface.java | 9 ++++++++- .../usecases/fetchresource/FetchInteractor.java | 3 ++- .../usecases/fetchresource/FetchOutputData.java | 14 +++++++++++++- src/main/java/view/GameView.java | 4 +++- 7 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/entities/PlayerInfo.java b/src/main/java/entities/PlayerInfo.java index fac30bf0f..5d159e743 100644 --- a/src/main/java/entities/PlayerInfo.java +++ b/src/main/java/entities/PlayerInfo.java @@ -23,7 +23,7 @@ public class PlayerInfo { public PlayerInfo(String name) { this.name = name; this.score = 0; - this.daysSurvived = 0; + this.daysSurvived = 1; this.won = false; this.actionPoint = EntityConstants.STARTERACTIONPOINT; } diff --git a/src/main/java/interface_adapters/fetchresource/FetchInterface.java b/src/main/java/interface_adapters/fetchresource/FetchInterface.java index 449bfa169..a200b7932 100644 --- a/src/main/java/interface_adapters/fetchresource/FetchInterface.java +++ b/src/main/java/interface_adapters/fetchresource/FetchInterface.java @@ -11,6 +11,8 @@ public interface FetchInterface { * @param water water * @param people people * @param weapon weapon + * @param actionpoint actionpoint left. + * @param day day. */ - void updateUiResource(int food, int water, int people, int weapon); + void updateUiResource(int food, int water, int people, int weapon, int day, int actionpoint); } diff --git a/src/main/java/interface_adapters/fetchresource/FetchPresenter.java b/src/main/java/interface_adapters/fetchresource/FetchPresenter.java index b842838ff..bd7bb7c6a 100644 --- a/src/main/java/interface_adapters/fetchresource/FetchPresenter.java +++ b/src/main/java/interface_adapters/fetchresource/FetchPresenter.java @@ -16,6 +16,6 @@ public FetchPresenter(FetchInterface view) { @Override public void prepareSuccessview(FetchOutputData outputdata) { view.updateUiResource(outputdata.getFood(), outputdata.getWater(), - outputdata.getPeople(), outputdata.getWeapon()); + outputdata.getPeople(), outputdata.getWeapon(), outputdata.getDay(), outputdata.getActionpoint()); } } diff --git a/src/main/java/usecases/fetchresource/FetchDataAccessInterface.java b/src/main/java/usecases/fetchresource/FetchDataAccessInterface.java index 0b02eeca8..9b6a8c762 100644 --- a/src/main/java/usecases/fetchresource/FetchDataAccessInterface.java +++ b/src/main/java/usecases/fetchresource/FetchDataAccessInterface.java @@ -1,9 +1,10 @@ package usecases.fetchresource; import entities.Inventory; +import entities.PlayerInfo; /** - * Data access of fetch, get player inventory. + * Data access of fetch, get player inventory, as well as num of day and action points left. */ public interface FetchDataAccessInterface { @@ -12,4 +13,10 @@ public interface FetchDataAccessInterface { * @return inventory */ Inventory getInventory(); + + /** + * Get player info, we need action point, and days. + * @return player info. + */ + PlayerInfo getPlayerInfo(); } diff --git a/src/main/java/usecases/fetchresource/FetchInteractor.java b/src/main/java/usecases/fetchresource/FetchInteractor.java index dac048e2e..b91248a4b 100644 --- a/src/main/java/usecases/fetchresource/FetchInteractor.java +++ b/src/main/java/usecases/fetchresource/FetchInteractor.java @@ -17,7 +17,8 @@ public FetchInteractor(FetchDataAccessInterface dataaccess, FetchOutputBoundary public void execute(FetchInputData inputData) { final FetchOutputData outputdata = new FetchOutputData(dataaccess.getInventory().getFood(), dataaccess.getInventory().getWater(), dataaccess.getInventory().getPeople(), - dataaccess.getInventory().getWeapon()); + dataaccess.getInventory().getWeapon(), dataaccess.getPlayerInfo().getDaysSurvived(), + dataaccess.getPlayerInfo().getActionPoint()); outputBoundary.prepareSuccessview(outputdata); } } diff --git a/src/main/java/usecases/fetchresource/FetchOutputData.java b/src/main/java/usecases/fetchresource/FetchOutputData.java index 28959fcff..881225b2f 100644 --- a/src/main/java/usecases/fetchresource/FetchOutputData.java +++ b/src/main/java/usecases/fetchresource/FetchOutputData.java @@ -8,12 +8,16 @@ public class FetchOutputData { private int water; private int people; private int weapon; + private int day; + private int actionpoint; - public FetchOutputData(int food, int water, int people, int weapon) { + public FetchOutputData(int food, int water, int people, int weapon, int day, int actionpoint) { this.food = food; this.water = water; this.people = people; this.weapon = weapon; + this.day = day; + this.actionpoint = actionpoint; } public int getFood() { @@ -31,4 +35,12 @@ public int getPeople() { public int getWeapon() { return weapon; } + + public int getDay() { + return day; + } + + public int getActionpoint() { + return actionpoint; + } } diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 07afe496b..e08d130cc 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -268,11 +268,13 @@ public void propertyChange(PropertyChangeEvent evt) { } @Override - public void updateUiResource(int food, int water, int people, int weapon) { + public void updateUiResource(int food, int water, int people, int weapon, int day, int actionpoint) { setFood(food); setWater(water); setPeople(people); setWeapon(weapon); + setDay(day); + setAction(actionpoint); } } From 43e8b6ca6938f0e9a8ef8d865e7b4a83f4704b22 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Sun, 1 Dec 2024 23:47:04 -0700 Subject: [PATCH 106/154] Broadcast gameview completed --- src/main/java/app/GameMainApplication.java | 10 ++++++-- src/main/java/view/GameView.java | 30 ++++++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index efecf7bd8..ebfbbaf5f 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -8,6 +8,8 @@ import entities.*; import frameworks.database.InMemoryUnifiedDataAccess; import interface_adapters.NavigationManager; +import interface_adapters.broadcast.BroadcastController; +import interface_adapters.broadcast.BroadcastPresenter; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchPresenter; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; @@ -17,6 +19,7 @@ import interface_adapters.nevagatemainview.NevagateMainPresenter; import interface_adapters.startallowcatepoint.AllowcateController; import interface_adapters.startallowcatepoint.AllowcatePresenter; +import usecases.dailybroadcast.BroadcastInteractor; import usecases.fetchresource.FetchInteractor; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; import usecases.nevagatemain.NevagateMainInteractor; @@ -112,8 +115,11 @@ public static void main(String[] args) { final FetchPresenter fetchPresenter = new FetchPresenter(gameView); final FetchInteractor fetchInteractor = new FetchInteractor(gamedatabase, fetchPresenter); final FetchController fetchController = new FetchController(fetchInteractor); - - gameView.setFetchController(fetchController); + // Broadcast Usecase + final BroadcastPresenter broadcastPresenter = new BroadcastPresenter(gameView); + final BroadcastInteractor broadcastInteractor = new BroadcastInteractor(gamedatabase, broadcastPresenter); + final BroadcastController broadcastController = new BroadcastController(broadcastInteractor); + gameView.setFetchController(fetchController, broadcastController); attributeview.setAllowcateController(allowcateController, nevagateMainController); // Example of how to use the endGame method // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index e08d130cc..fd7a3fc5b 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -1,5 +1,7 @@ package view; +import interface_adapters.broadcast.BroadcastController; +import interface_adapters.broadcast.BroadcastInterface; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchInterface; @@ -9,7 +11,7 @@ import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; -public class GameView extends JFrame implements PropertyChangeListener, FetchInterface { +public class GameView extends JFrame implements PropertyChangeListener, FetchInterface, BroadcastInterface { private int day; private int food; private int water; @@ -29,6 +31,7 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInt private boolean isMapVisible = true; private FetchController fetchController; + private BroadcastController broadcastController; private final PropertyChangeSupport propertyChangeSupport; @@ -98,6 +101,11 @@ public GameView() { container.add(nextDayButton); container.add(infoButton); + broadcastButton.addActionListener(e -> { + broadcastController.execute(); + fetchController.execute(); + }); + // Add ActionListeners infoButton.addActionListener(e -> toggleInfoBox()); nextDayButton.addActionListener(e -> { @@ -120,8 +128,9 @@ public GameView() { propertyChangeSupport.addPropertyChangeListener(this); } - public void setFetchController(FetchController fetchController) { + public void setFetchController(FetchController fetchController, BroadcastController broadcastController) { this.fetchController = fetchController; + this.broadcastController = broadcastController; } public void render() { @@ -277,4 +286,21 @@ public void updateUiResource(int food, int water, int people, int weapon, int da setAction(actionpoint); } + @Override + public void updateUiBroadcast(String message) { + if (infoBox != null) { + infoBox.append(message + "\n"); + infoBox.setCaretPosition(infoBox.getDocument().getLength()); + } + } + + @Override + public void failureBroadcast(String errorMessage) { + JOptionPane.showMessageDialog( + this, + errorMessage, + "Error", + JOptionPane.ERROR_MESSAGE + ); + } } From 2ee7c1782840a4273cc5b2cd590ab8583446fccf Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Mon, 2 Dec 2024 01:48:31 -0500 Subject: [PATCH 107/154] chacratercreation usecases update --- .../CharacterCreationDataAccessInterface.java | 8 ++++ .../CharacterCreationInputBoundary.java | 8 ++++ .../CharacterCreationInputData.java | 41 +++++++++++++++++++ .../CharacterCreationInteractor.java | 25 +++++++++++ .../CharacterCreationOutputBoundary.java | 8 ++++ .../CharacterCreationOutputData.java | 16 ++++++++ 6 files changed, 106 insertions(+) create mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationDataAccessInterface.java create mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationInputBoundary.java create mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationInputData.java create mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationInteractor.java create mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputBoundary.java create mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputData.java diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationDataAccessInterface.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationDataAccessInterface.java new file mode 100644 index 000000000..be4d56f93 --- /dev/null +++ b/src/main/java/usecases/navigatecharactercreation/CharacterCreationDataAccessInterface.java @@ -0,0 +1,8 @@ +package usecases.charactercreation; + +/** + * Data access interface for character creation. + */ +public interface CharacterCreationDataAccessInterface { + void saveCharacterData(int social, int luck, int mobilization, int thrift, int generalship); +} diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputBoundary.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputBoundary.java new file mode 100644 index 000000000..7af51afe2 --- /dev/null +++ b/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.navigatecharactercreation; + +/** + * Input boundary for character creation. + */ +public interface CharacterCreationInputBoundary { + void execute(CharacterCreationInputData inputData); +} diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputData.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputData.java new file mode 100644 index 000000000..e235f967e --- /dev/null +++ b/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputData.java @@ -0,0 +1,41 @@ +package usecases.navigatecharactercreation; + +/** + * Input data for character creation. + */ +public class CharacterCreationInputData { + private int social; + private int luck; + private int mobilization; + private int thrift; + private int generalship; + + public CharacterCreationInputData(int social, int luck, int mobilization, int thrift, int generalship) { + this.social = social; + this.luck = luck; + this.mobilization = mobilization; + this.thrift = thrift; + this.generalship = generalship; + } + + // Getter methods + public int getSocial() { + return social; + } + + public int getLuck() { + return luck; + } + + public int getMobilization() { + return mobilization; + } + + public int getThrift() { + return thrift; + } + + public int getGeneralship() { + return generalship; + } +} diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationInteractor.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationInteractor.java new file mode 100644 index 000000000..aa0e83b87 --- /dev/null +++ b/src/main/java/usecases/navigatecharactercreation/CharacterCreationInteractor.java @@ -0,0 +1,25 @@ +package usecases.navigatecharactercreation; + +/** + * Character creation interactor. + */ +public class CharacterCreationInteractor implements CharacterCreationInputBoundary { + private final CharacterCreationDataAccessInterface dataAccess; + private final CharacterCreationOutputBoundary outputBoundary; + + public CharacterCreationInteractor(CharacterCreationDataAccessInterface dataAccess, + CharacterCreationOutputBoundary outputBoundary) { + this.dataAccess = dataAccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(CharacterCreationInputData inputData) { + // Business logic to save character data + dataAccess.saveCharacterData(inputData.getSocial(), inputData.getLuck(), + inputData.getMobilization(), inputData.getThrift(), inputData.getGeneralship()); + + // Notify presenter to update the view + outputBoundary.prepareCharacterCreationView("Character creation successful!"); + } +} diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputBoundary.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputBoundary.java new file mode 100644 index 000000000..621d45c11 --- /dev/null +++ b/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputBoundary.java @@ -0,0 +1,8 @@ +package usecases.navigatecharactercreation; + +/** + * Output boundary for character creation. + */ +public interface CharacterCreationOutputBoundary { + void prepareCharacterCreationView(String message); +} diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputData.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputData.java new file mode 100644 index 000000000..73fccf577 --- /dev/null +++ b/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputData.java @@ -0,0 +1,16 @@ +package usecases.navigatecharactercreation; + +/** + * Output data for character creation. + */ +public class CharacterCreationOutputData { + private final String message; + + public CharacterCreationOutputData(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} From f510e38156222e988d8232160bad53d0c604377f Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Mon, 2 Dec 2024 02:05:16 -0500 Subject: [PATCH 108/154] update navigatecharactercreation adaptors --- .../NavigateCharacterCreationController.java | 24 +++++++++++++++++++ .../NavigateCharacterCreationInterface.java | 10 ++++++++ .../NavigateCharacterCreationPresenter.java | 23 ++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationController.java create mode 100644 src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationInterface.java create mode 100644 src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationPresenter.java diff --git a/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationController.java b/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationController.java new file mode 100644 index 000000000..dae2451ec --- /dev/null +++ b/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationController.java @@ -0,0 +1,24 @@ +package interface_adapters.navigatecharactercreationview; + +import usecases.navigatecharactercreation.CharacterCreationInputBoundary; +import usecases.navigatecharactercreation.CharacterCreationInputData; + +/** + * Controller for handling responses to character creation. + */ +public class NavigateCharacterCreationController { + private final CharacterCreationInputBoundary interactor; + + public NavigateCharacterCreationController(CharacterCreationInputBoundary interactor) { + this.interactor = interactor; + } + + /** + * Execute the interactor by converting the player’s input into input data. + * @param choice The player's choice for the event. + */ + public void execute(int social, int luck, int mobilization, int thrift, int generalship) { + CharacterCreationInputData inputData = new CharacterCreationInputData(social, luck, mobilization, thrift, generalship); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationInterface.java b/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationInterface.java new file mode 100644 index 000000000..c41c5e768 --- /dev/null +++ b/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationInterface.java @@ -0,0 +1,10 @@ +package interface_adapters.navigatecharactercreationview; + +/** + * Interface for updating the UI for character creation. + */ +public interface NavigateCharacterCreationInterface { + void updateUiResponse(String message); + + void failureResponse(String errorMessage); +} diff --git a/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationPresenter.java b/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationPresenter.java new file mode 100644 index 000000000..f657c15d1 --- /dev/null +++ b/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationPresenter.java @@ -0,0 +1,23 @@ +package interface_adapters.navigatecharactercreationview; + +import usecases.navigatecharactercreation.NavigateCharacterCreationOutputBoundary; +import usecases.navigatecharactercreation.NavigateCharacterCreationOutputData; + +/** + * Presenter for handling the response output of character creation. + */ +public class NavigateCharacterCreationPresenter implements NavigateCharacterCreationOutputBoundary { + private final NavigateCharacterCreationInterface view; + + public NavigateCharacterCreationPresenter(NavigateCharacterCreationInterface view) { + this.view = view; + } + + @Override + public void prepareSuccessView(NavigateCharacterCreationOutputData outputData) { + view.updateUiResponse(outputData.getMessage()); + } + + public void prepareFailureView(String errorMessage) { + } +} From 8fd55b5e4232066ebc301060fa39bfa75b8f6178 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Mon, 2 Dec 2024 02:28:36 -0700 Subject: [PATCH 109/154] GameView mostly done --- src/main/java/app/GameMainApplication.java | 31 +++- .../dailygather/DailyGatherController.java | 2 +- .../dailygather/DailyGatherPresenter.java | 4 + .../dailymove/DailyMovePresenter.java | 2 +- .../PlaceDescriptionPresenter.java | 4 + .../NavigateCharacterCreationController.java | 24 ---- .../NavigateCharacterCreationInterface.java | 10 -- .../NavigateCharacterCreationPresenter.java | 23 --- .../NevagateEventDataAccessInterface.java | 4 + .../NevagateEventInputBoundary.java | 4 + .../NevagateEventInputdata.java | 4 + .../NevagateEventInteractor.java | 4 + .../NevagateEventOutputBoundary.java | 4 + .../NevagateEventOutputdata.java | 4 + .../dailybroadcast/BroadcastInteractor.java | 4 + .../usecases/dailymove/MoveInteractor.java | 8 +- .../CharacterCreationDataAccessInterface.java | 8 -- .../CharacterCreationInputBoundary.java | 8 -- .../CharacterCreationInputData.java | 41 ------ .../CharacterCreationInteractor.java | 25 ---- .../CharacterCreationOutputBoundary.java | 8 -- .../CharacterCreationOutputData.java | 16 --- src/main/java/view/CharacterCreationView.java | 2 +- src/main/java/view/GameView.java | 132 ++++++++++++++++-- 24 files changed, 191 insertions(+), 185 deletions(-) delete mode 100644 src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationController.java delete mode 100644 src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationInterface.java delete mode 100644 src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationPresenter.java create mode 100644 src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java create mode 100644 src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java create mode 100644 src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java create mode 100644 src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java create mode 100644 src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java create mode 100644 src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java delete mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationDataAccessInterface.java delete mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationInputBoundary.java delete mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationInputData.java delete mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationInteractor.java delete mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputBoundary.java delete mode 100644 src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputData.java diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index ebfbbaf5f..2b11c4e83 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -10,17 +10,25 @@ import interface_adapters.NavigationManager; import interface_adapters.broadcast.BroadcastController; import interface_adapters.broadcast.BroadcastPresenter; +import interface_adapters.dailygather.DailyGatherController; +import interface_adapters.dailygather.DailyGatherPresenter; +import interface_adapters.dailymove.DailyMoveController; +import interface_adapters.dailymove.DailyMovePresenter; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchPresenter; +import interface_adapters.gameplacedescription.PlaceDescriptionController; +import interface_adapters.gameplacedescription.PlaceDescriptionPresenter; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; import interface_adapters.nevagateallowcatepage.NevagateAllowcatePresenter; import interface_adapters.nevagatemainview.NevagateMainController; -import interface_adapters.nevagatemainview.NevagateMainInterface; import interface_adapters.nevagatemainview.NevagateMainPresenter; import interface_adapters.startallowcatepoint.AllowcateController; import interface_adapters.startallowcatepoint.AllowcatePresenter; import usecases.dailybroadcast.BroadcastInteractor; +import usecases.dailygather.GatherInteractor; +import usecases.dailymove.MoveInteractor; import usecases.fetchresource.FetchInteractor; +import usecases.gameplacedescription.PlaceDescriptionInteractor; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; import usecases.nevagatemain.NevagateMainInteractor; import usecases.startallowcate.AllowcateInteractor; @@ -119,9 +127,26 @@ public static void main(String[] args) { final BroadcastPresenter broadcastPresenter = new BroadcastPresenter(gameView); final BroadcastInteractor broadcastInteractor = new BroadcastInteractor(gamedatabase, broadcastPresenter); final BroadcastController broadcastController = new BroadcastController(broadcastInteractor); - gameView.setFetchController(fetchController, broadcastController); - attributeview.setAllowcateController(allowcateController, nevagateMainController); + // Place description usecase + final PlaceDescriptionPresenter placeDescriptionPresenter = new PlaceDescriptionPresenter(gameView); + final PlaceDescriptionInteractor placeDescriptionInteractor = + new PlaceDescriptionInteractor(gamedatabase, placeDescriptionPresenter); + final PlaceDescriptionController placeDescriptionController = + new PlaceDescriptionController(placeDescriptionInteractor); + + // gather description usecase + final DailyGatherPresenter dailyGatherPresenter = new DailyGatherPresenter(gameView); + final GatherInteractor gatherInteractor = new GatherInteractor(gamedatabase, dailyGatherPresenter); + final DailyGatherController dailyGatherController = new DailyGatherController(gatherInteractor); + + // Move usecase. + final DailyMovePresenter dailyMovePresenter = new DailyMovePresenter(gameView); + final MoveInteractor moveInteractor = new MoveInteractor(gamedatabase, dailyMovePresenter); + final DailyMoveController dailyMoveController = new DailyMoveController(moveInteractor); // Example of how to use the endGame method // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); + gameView.setController(fetchController, broadcastController, + placeDescriptionController, dailyGatherController, dailyMoveController); + attributeview.setAllowcateController(allowcateController, nevagateMainController); } } diff --git a/src/main/java/interface_adapters/dailygather/DailyGatherController.java b/src/main/java/interface_adapters/dailygather/DailyGatherController.java index a6016020a..2ee19e071 100644 --- a/src/main/java/interface_adapters/dailygather/DailyGatherController.java +++ b/src/main/java/interface_adapters/dailygather/DailyGatherController.java @@ -9,7 +9,7 @@ public class DailyGatherController { private GatherInputBoundary gatherUsecaseInteractor; - DailyGatherController(GatherInputBoundary gatherUsecaseInteractor) { + public DailyGatherController(GatherInputBoundary gatherUsecaseInteractor) { this.gatherUsecaseInteractor = gatherUsecaseInteractor; } diff --git a/src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java b/src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java index 8293d3a44..116903371 100644 --- a/src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java +++ b/src/main/java/interface_adapters/dailygather/DailyGatherPresenter.java @@ -9,6 +9,10 @@ public class DailyGatherPresenter implements GatherOutputBoundary { private DailyGatherInterface view; + public DailyGatherPresenter(DailyGatherInterface view) { + this.view = view; + } + @Override public void prepareSuccessView(GatherOutputData outputdata) { view.updateUiGather(outputdata.getSuccessmessage()); diff --git a/src/main/java/interface_adapters/dailymove/DailyMovePresenter.java b/src/main/java/interface_adapters/dailymove/DailyMovePresenter.java index f1756e74a..09f6d0cca 100644 --- a/src/main/java/interface_adapters/dailymove/DailyMovePresenter.java +++ b/src/main/java/interface_adapters/dailymove/DailyMovePresenter.java @@ -20,6 +20,6 @@ public void prepareSuccessView(MoveOutputData outputData) { @Override public void prepareFailureView(String errorMessage) { - view.updateUiMove(errorMessage); + view.failureMove(errorMessage); } } diff --git a/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionPresenter.java b/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionPresenter.java index 522022987..55d3eef23 100644 --- a/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionPresenter.java +++ b/src/main/java/interface_adapters/gameplacedescription/PlaceDescriptionPresenter.java @@ -9,6 +9,10 @@ public class PlaceDescriptionPresenter implements PlaceDescriptionOutputBoundary { private PlaceDescriptionInterface view; + public PlaceDescriptionPresenter(PlaceDescriptionInterface view) { + this.view = view; + } + @Override public void preparesuccessview(PlaceDescriptionOutputData data) { final String description = data.getDescription(); diff --git a/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationController.java b/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationController.java deleted file mode 100644 index dae2451ec..000000000 --- a/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationController.java +++ /dev/null @@ -1,24 +0,0 @@ -package interface_adapters.navigatecharactercreationview; - -import usecases.navigatecharactercreation.CharacterCreationInputBoundary; -import usecases.navigatecharactercreation.CharacterCreationInputData; - -/** - * Controller for handling responses to character creation. - */ -public class NavigateCharacterCreationController { - private final CharacterCreationInputBoundary interactor; - - public NavigateCharacterCreationController(CharacterCreationInputBoundary interactor) { - this.interactor = interactor; - } - - /** - * Execute the interactor by converting the player’s input into input data. - * @param choice The player's choice for the event. - */ - public void execute(int social, int luck, int mobilization, int thrift, int generalship) { - CharacterCreationInputData inputData = new CharacterCreationInputData(social, luck, mobilization, thrift, generalship); - interactor.execute(inputData); - } -} diff --git a/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationInterface.java b/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationInterface.java deleted file mode 100644 index c41c5e768..000000000 --- a/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationInterface.java +++ /dev/null @@ -1,10 +0,0 @@ -package interface_adapters.navigatecharactercreationview; - -/** - * Interface for updating the UI for character creation. - */ -public interface NavigateCharacterCreationInterface { - void updateUiResponse(String message); - - void failureResponse(String errorMessage); -} diff --git a/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationPresenter.java b/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationPresenter.java deleted file mode 100644 index f657c15d1..000000000 --- a/src/main/java/interface_adapters/navigatecharactercreationview/NavigateCharacterCreationPresenter.java +++ /dev/null @@ -1,23 +0,0 @@ -package interface_adapters.navigatecharactercreationview; - -import usecases.navigatecharactercreation.NavigateCharacterCreationOutputBoundary; -import usecases.navigatecharactercreation.NavigateCharacterCreationOutputData; - -/** - * Presenter for handling the response output of character creation. - */ -public class NavigateCharacterCreationPresenter implements NavigateCharacterCreationOutputBoundary { - private final NavigateCharacterCreationInterface view; - - public NavigateCharacterCreationPresenter(NavigateCharacterCreationInterface view) { - this.view = view; - } - - @Override - public void prepareSuccessView(NavigateCharacterCreationOutputData outputData) { - view.updateUiResponse(outputData.getMessage()); - } - - public void prepareFailureView(String errorMessage) { - } -} diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java b/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java new file mode 100644 index 000000000..b91cd55de --- /dev/null +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java @@ -0,0 +1,4 @@ +package usecases.NevagateEventPage; + +public interface NevagateEventDataAccessInterface { +} diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java b/src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java new file mode 100644 index 000000000..8f8b4104c --- /dev/null +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java @@ -0,0 +1,4 @@ +package usecases.NevagateEventPage; + +public interface NevagateEventInputBoundary { +} diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java b/src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java new file mode 100644 index 000000000..cc70e1d56 --- /dev/null +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java @@ -0,0 +1,4 @@ +package usecases.NevagateEventPage; + +public class NevagateEventInputdata { +} diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java b/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java new file mode 100644 index 000000000..539cdc351 --- /dev/null +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java @@ -0,0 +1,4 @@ +package usecases.NevagateEventPage; + +public class NevagateEventInteractor { +} diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java b/src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java new file mode 100644 index 000000000..768179eb0 --- /dev/null +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java @@ -0,0 +1,4 @@ +package usecases.NevagateEventPage; + +public interface NevagateEventOutputBoundary { +} diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java b/src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java new file mode 100644 index 000000000..d66128b8a --- /dev/null +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java @@ -0,0 +1,4 @@ +package usecases.NevagateEventPage; + +public class NevagateEventOutputdata { +} diff --git a/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java b/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java index 11eb7b046..d899157f6 100644 --- a/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java +++ b/src/main/java/usecases/dailybroadcast/BroadcastInteractor.java @@ -33,6 +33,10 @@ public void execute(usecases.dailybroadcast.BroadcastInputData inputData) { final BroadcastOutputData outputData = new BroadcastOutputData(successmessage); outputBoundary.prepareSuccessView(outputData); } + else { + final String failmessage = "Cannot move, your people are tired!"; + outputBoundary.prepareFailureView(failmessage); + } } } diff --git a/src/main/java/usecases/dailymove/MoveInteractor.java b/src/main/java/usecases/dailymove/MoveInteractor.java index 6c4ae592d..ff3c6a7e4 100644 --- a/src/main/java/usecases/dailymove/MoveInteractor.java +++ b/src/main/java/usecases/dailymove/MoveInteractor.java @@ -82,16 +82,16 @@ private boolean isInvalidMove(String direction, int xcoor, int ycoor, int newX, int newY, int mapWidth, int mapHeight) { boolean ans = false; if (direction.equals(EntityConstants.UP)) { - ans = ycoor == 0 || newY == ycoor; + ans = newY == ycoor; } else if (direction.equals(EntityConstants.DOWN)) { - ans = ycoor == mapHeight - 1 || newY == ycoor; + ans = newY == ycoor; } else if (direction.equals(EntityConstants.LEFT)) { - ans = xcoor == 0 || newX == xcoor; + ans = newX == xcoor; } else if (direction.equals(EntityConstants.RIGHT)) { - ans = xcoor == mapWidth - 1 || newX == xcoor; + ans = newX == xcoor; } return ans; } diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationDataAccessInterface.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationDataAccessInterface.java deleted file mode 100644 index be4d56f93..000000000 --- a/src/main/java/usecases/navigatecharactercreation/CharacterCreationDataAccessInterface.java +++ /dev/null @@ -1,8 +0,0 @@ -package usecases.charactercreation; - -/** - * Data access interface for character creation. - */ -public interface CharacterCreationDataAccessInterface { - void saveCharacterData(int social, int luck, int mobilization, int thrift, int generalship); -} diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputBoundary.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputBoundary.java deleted file mode 100644 index 7af51afe2..000000000 --- a/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputBoundary.java +++ /dev/null @@ -1,8 +0,0 @@ -package usecases.navigatecharactercreation; - -/** - * Input boundary for character creation. - */ -public interface CharacterCreationInputBoundary { - void execute(CharacterCreationInputData inputData); -} diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputData.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputData.java deleted file mode 100644 index e235f967e..000000000 --- a/src/main/java/usecases/navigatecharactercreation/CharacterCreationInputData.java +++ /dev/null @@ -1,41 +0,0 @@ -package usecases.navigatecharactercreation; - -/** - * Input data for character creation. - */ -public class CharacterCreationInputData { - private int social; - private int luck; - private int mobilization; - private int thrift; - private int generalship; - - public CharacterCreationInputData(int social, int luck, int mobilization, int thrift, int generalship) { - this.social = social; - this.luck = luck; - this.mobilization = mobilization; - this.thrift = thrift; - this.generalship = generalship; - } - - // Getter methods - public int getSocial() { - return social; - } - - public int getLuck() { - return luck; - } - - public int getMobilization() { - return mobilization; - } - - public int getThrift() { - return thrift; - } - - public int getGeneralship() { - return generalship; - } -} diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationInteractor.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationInteractor.java deleted file mode 100644 index aa0e83b87..000000000 --- a/src/main/java/usecases/navigatecharactercreation/CharacterCreationInteractor.java +++ /dev/null @@ -1,25 +0,0 @@ -package usecases.navigatecharactercreation; - -/** - * Character creation interactor. - */ -public class CharacterCreationInteractor implements CharacterCreationInputBoundary { - private final CharacterCreationDataAccessInterface dataAccess; - private final CharacterCreationOutputBoundary outputBoundary; - - public CharacterCreationInteractor(CharacterCreationDataAccessInterface dataAccess, - CharacterCreationOutputBoundary outputBoundary) { - this.dataAccess = dataAccess; - this.outputBoundary = outputBoundary; - } - - @Override - public void execute(CharacterCreationInputData inputData) { - // Business logic to save character data - dataAccess.saveCharacterData(inputData.getSocial(), inputData.getLuck(), - inputData.getMobilization(), inputData.getThrift(), inputData.getGeneralship()); - - // Notify presenter to update the view - outputBoundary.prepareCharacterCreationView("Character creation successful!"); - } -} diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputBoundary.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputBoundary.java deleted file mode 100644 index 621d45c11..000000000 --- a/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputBoundary.java +++ /dev/null @@ -1,8 +0,0 @@ -package usecases.navigatecharactercreation; - -/** - * Output boundary for character creation. - */ -public interface CharacterCreationOutputBoundary { - void prepareCharacterCreationView(String message); -} diff --git a/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputData.java b/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputData.java deleted file mode 100644 index 73fccf577..000000000 --- a/src/main/java/usecases/navigatecharactercreation/CharacterCreationOutputData.java +++ /dev/null @@ -1,16 +0,0 @@ -package usecases.navigatecharactercreation; - -/** - * Output data for character creation. - */ -public class CharacterCreationOutputData { - private final String message; - - public CharacterCreationOutputData(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } -} diff --git a/src/main/java/view/CharacterCreationView.java b/src/main/java/view/CharacterCreationView.java index 15af809ac..5cb34c788 100644 --- a/src/main/java/view/CharacterCreationView.java +++ b/src/main/java/view/CharacterCreationView.java @@ -90,7 +90,7 @@ public CharacterCreationView() { }); startGameButton.addActionListener(e -> { - allowcateController.execute(points, social, luck, mobilization, thrift, generalship); + allowcateController.execute(points, social, luck, thrift, mobilization, generalship); }); // Window settings diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index fd7a3fc5b..f0ea28222 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -2,8 +2,14 @@ import interface_adapters.broadcast.BroadcastController; import interface_adapters.broadcast.BroadcastInterface; +import interface_adapters.dailygather.DailyGatherController; +import interface_adapters.dailygather.DailyGatherInterface; +import interface_adapters.dailymove.DailyMoveController; +import interface_adapters.dailymove.DailyMoveInterface; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchInterface; +import interface_adapters.gameplacedescription.PlaceDescriptionController; +import interface_adapters.gameplacedescription.PlaceDescriptionInterface; import javax.swing.*; import java.awt.*; @@ -11,7 +17,8 @@ import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; -public class GameView extends JFrame implements PropertyChangeListener, FetchInterface, BroadcastInterface { +public class GameView extends JFrame implements PropertyChangeListener, FetchInterface, BroadcastInterface, + PlaceDescriptionInterface, DailyGatherInterface, DailyMoveInterface { private int day; private int food; private int water; @@ -27,11 +34,14 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInt private final JLabel actionAvailableLabel; private final JTextArea mapPanel; - private final JTextArea infoBox; + private final JTextArea infoBox = new JTextArea(); private boolean isMapVisible = true; private FetchController fetchController; private BroadcastController broadcastController; + private PlaceDescriptionController placeDescriptionController; + private DailyGatherController dailyGatherController; + private DailyMoveController dailyMoveController; private final PropertyChangeSupport propertyChangeSupport; @@ -72,13 +82,24 @@ public GameView() { mapPanel.setPreferredSize(new Dimension(200, 200)); container.add(mapPanel); - // InfoBox TextArea - infoBox = new JTextArea("Information Box"); - infoBox.setEditable(false); - infoBox.setBackground(Color.LIGHT_GRAY); - infoBox.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - infoBox.setVisible(false); - container.add(infoBox); + // Wrap infoBox in a JScrollPane (top-left position, smaller width) + JScrollPane infoScrollPane = new JScrollPane(infoBox); + infoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + infoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + infoScrollPane.setPreferredSize(new Dimension(200, 200)); // Adjusted smaller width and fixed height + container.add(infoScrollPane); + infoBox.setLineWrap(true); + infoBox.setWrapStyleWord(true); + infoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + infoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + + +// Update Layout Constraints for infoScrollPane (top-left, same as minimap) + layout.putConstraint(SpringLayout.EAST, infoScrollPane, -20, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, infoScrollPane, 20, SpringLayout.NORTH, container); + + + // Buttons JButton broadcastButton = new JButton("Broadcast"); @@ -106,6 +127,33 @@ public GameView() { fetchController.execute(); }); + gatherButton.addActionListener(e -> { + dailyGatherController.execute(); + fetchController.execute(); + }); + + upButton.addActionListener(e -> { + dailyMoveController.execute("up"); + fetchController.execute(); + }); + + downButton.addActionListener(e -> { + dailyMoveController.execute("down"); + fetchController.execute(); + }); + + leftButton.addActionListener(e -> { + dailyMoveController.execute("left"); + fetchController.execute(); + }); + + rightButton.addActionListener(e -> { + dailyMoveController.execute("right"); + fetchController.execute(); + }); + + + // Add ActionListeners infoButton.addActionListener(e -> toggleInfoBox()); nextDayButton.addActionListener(e -> { @@ -128,12 +176,18 @@ public GameView() { propertyChangeSupport.addPropertyChangeListener(this); } - public void setFetchController(FetchController fetchController, BroadcastController broadcastController) { + public void setController(FetchController fetchController, BroadcastController broadcastController, + PlaceDescriptionController placeDescriptionController, + DailyGatherController dailyGatherController, DailyMoveController dailyMoveController) { this.fetchController = fetchController; this.broadcastController = broadcastController; + this.placeDescriptionController = placeDescriptionController; + this.dailyGatherController = dailyGatherController; + this.dailyMoveController = dailyMoveController; } public void render() { + placeDescriptionController.execute(); fetchController.execute(); setVisible(true); } @@ -215,7 +269,7 @@ private void applyLayoutConstraints(SpringLayout layout, Container container, JL layout.putConstraint(SpringLayout.NORTH, mapPanel, 20, SpringLayout.NORTH, container); // Position info box - layout.putConstraint(SpringLayout.EAST, infoBox, -20, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.EAST, infoBox, 20, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, infoBox, 20, SpringLayout.NORTH, container); // Position buttons @@ -299,7 +353,61 @@ public void failureBroadcast(String errorMessage) { JOptionPane.showMessageDialog( this, errorMessage, - "Error", + "Unable to Broadcast", + JOptionPane.ERROR_MESSAGE + ); + } + + @Override + public void updateUiGather(String message) { + if (infoBox != null) { + infoBox.append(message + "\n"); + infoBox.setCaretPosition(infoBox.getDocument().getLength()); + } + } + + @Override + public void failureGather(String message) { + JOptionPane.showMessageDialog( + this, + message, + "Unable to Gather", + JOptionPane.ERROR_MESSAGE + ); + } + + @Override + public void updateUiMove(String message) { + if (infoBox != null) { + infoBox.append(message + "\n"); + infoBox.setCaretPosition(infoBox.getDocument().getLength()); + } + } + + @Override + public void failureMove(String errormessage) { + JOptionPane.showMessageDialog( + this, + errormessage, + "Unable to Move", + JOptionPane.ERROR_MESSAGE + ); + } + + @Override + public void updateUiPlaceDescription(String placeDescription) { + if (infoBox != null) { + infoBox.append(placeDescription + "\n"); + infoBox.setCaretPosition(infoBox.getDocument().getLength()); + } + } + + @Override + public void failurePlaceDescription(String failmessage) { + JOptionPane.showMessageDialog( + this, + failmessage, + "Unable to Get Place Description", JOptionPane.ERROR_MESSAGE ); } From cb9c347e29237fc80dc1aa515fa409dfc2d432f4 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Mon, 2 Dec 2024 02:54:05 -0700 Subject: [PATCH 110/154] Nevagate Event completed --- .../NevagateEventController.java | 20 +++++++++++++++ .../nevagateevent/NevagateEventInterface.java | 8 ++++++ .../nevagateevent/NevagateEventPresenter.java | 25 +++++++++++++++++++ .../NevagateMainPresenter.java | 1 + .../NevagateEventDataAccessInterface.java | 12 +++++++++ .../NevagateEventInputBoundary.java | 4 +++ .../NevagateEventInputdata.java | 3 +++ .../NevagateEventInteractor.java | 20 ++++++++++++++- .../NevagateEventOutputBoundary.java | 6 +++++ .../NevagateEventOutputdata.java | 3 +++ .../NevagateMainDataAccessInterface.java | 2 +- 11 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 src/main/java/interface_adapters/nevagateevent/NevagateEventController.java create mode 100644 src/main/java/interface_adapters/nevagateevent/NevagateEventInterface.java create mode 100644 src/main/java/interface_adapters/nevagateevent/NevagateEventPresenter.java diff --git a/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java b/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java new file mode 100644 index 000000000..6ff9a51c6 --- /dev/null +++ b/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java @@ -0,0 +1,20 @@ +package interface_adapters.nevagateevent; + +import usecases.NevagateEventPage.NevagateEventInputdata; +import usecases.NevagateEventPage.NevagateEventInteractor; + +/** + * Controller. + */ +public class NevagateEventController { + private final NevagateEventInteractor interactor; + + public NevagateEventController(NevagateEventInteractor interactor) { + this.interactor = interactor; + } + + public void execute() { + final NevagateEventInputdata inputdata = new NevagateEventInputdata(); + interactor.execute(inputdata); + } +} diff --git a/src/main/java/interface_adapters/nevagateevent/NevagateEventInterface.java b/src/main/java/interface_adapters/nevagateevent/NevagateEventInterface.java new file mode 100644 index 000000000..b9d02facf --- /dev/null +++ b/src/main/java/interface_adapters/nevagateevent/NevagateEventInterface.java @@ -0,0 +1,8 @@ +package interface_adapters.nevagateevent; + +/** + * Not needed. + */ +public interface NevagateEventInterface { + void failureNevagateEvent(String message); +} diff --git a/src/main/java/interface_adapters/nevagateevent/NevagateEventPresenter.java b/src/main/java/interface_adapters/nevagateevent/NevagateEventPresenter.java new file mode 100644 index 000000000..c1446142a --- /dev/null +++ b/src/main/java/interface_adapters/nevagateevent/NevagateEventPresenter.java @@ -0,0 +1,25 @@ +package interface_adapters.nevagateevent; + +import interface_adapters.NavigationManager; +import usecases.NevagateEventPage.NevagateEventOutputBoundary; +import usecases.NevagateEventPage.NevagateEventOutputdata; + +public class NevagateEventPresenter implements NevagateEventOutputBoundary { + private final NavigationManager navigationManager; + private final NevagateEventInterface view; + + public NevagateEventPresenter(NavigationManager navigationManager, NevagateEventInterface view) { + this.navigationManager = navigationManager; + this.view = view; + } + + @Override + public void nevagateEventPage(NevagateEventOutputdata outputdata) { + navigationManager.showEventView(); + } + + @Override + public void nevagateEventFailed(String failmessage) { + view.failureNevagateEvent(failmessage); + } +} diff --git a/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java b/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java index 50a36446a..9701a6d72 100644 --- a/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java +++ b/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java @@ -1,6 +1,7 @@ package interface_adapters.nevagatemainview; import interface_adapters.NavigationManager; +import interface_adapters.nevagateevent.NevagateEventInterface; import usecases.nevagatemain.NevagateMainOutputBoundary; public class NevagateMainPresenter implements NevagateMainOutputBoundary { diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java b/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java index b91cd55de..0505ff1bc 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java @@ -1,4 +1,16 @@ package usecases.NevagateEventPage; +import entities.Event; + +import java.util.ArrayList; + +/** + * Not needed. + */ public interface NevagateEventDataAccessInterface { + /** + * Get all events decided for that day. + * @return events. + */ + ArrayList getEvents(); } diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java b/src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java index 8f8b4104c..4493ef7fe 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java @@ -1,4 +1,8 @@ package usecases.NevagateEventPage; +/** + * Execute method. + */ public interface NevagateEventInputBoundary { + public void execute(NevagateEventInputdata inputData); } diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java b/src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java index cc70e1d56..49020b811 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java @@ -1,4 +1,7 @@ package usecases.NevagateEventPage; +/** + * not needed. + */ public class NevagateEventInputdata { } diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java b/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java index 539cdc351..f8606d7ad 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java @@ -1,4 +1,22 @@ package usecases.NevagateEventPage; -public class NevagateEventInteractor { +import entities.Event; +import java.util.ArrayList; + +/** + * Interactor, determine if player is able to press and go to event. + * Only able to go when there is event. eventdecided is not empty. + */ +public class NevagateEventInteractor implements NevagateEventInputBoundary { + private NevagateEventDataAccessInterface dataaccess; + private NevagateEventOutputBoundary EventOutputBoundary; + + @Override + public void execute(NevagateEventInputdata inputdata) { + final ArrayList events = dataaccess.getEvents(); + if (events.size() > 0) { + final NevagateEventOutputdata nevagateEventOutputdata = new NevagateEventOutputdata(); + EventOutputBoundary.nevagateEventPage(nevagateEventOutputdata); + } + } } diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java b/src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java index 768179eb0..0a3bf42c3 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java @@ -1,4 +1,10 @@ package usecases.NevagateEventPage; +/** + * Navigate or navigate failed. + */ public interface NevagateEventOutputBoundary { + void nevagateEventPage(NevagateEventOutputdata outputdata); + + void nevagateEventFailed(String failmessage); } diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java b/src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java index d66128b8a..6e40d7f40 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java @@ -1,4 +1,7 @@ package usecases.NevagateEventPage; +/** + * Outputdata. + */ public class NevagateEventOutputdata { } diff --git a/src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java b/src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java index 6da6f455f..3ca3ff25d 100644 --- a/src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java +++ b/src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java @@ -1,7 +1,7 @@ package usecases.nevagatemain; /** - * Not needed, this is when player click back. + * Data access, need decided events. */ public interface NevagateMainDataAccessInterface { } From c05b1fe3303f1de1eb946668b10c35c6e0e1e6a6 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Mon, 2 Dec 2024 09:14:19 -0700 Subject: [PATCH 111/154] Event decide and initialize logic adapted --- src/main/java/app/GameMainApplication.java | 33 +++++++++- .../database/InMemoryUnifiedDataAccess.java | 21 ++++--- .../NevagateEventDataAccessInterface.java | 2 +- .../NevagateEventInteractor.java | 11 +++- .../DecideEventDataAccessInterface.java | 4 +- .../eventdecide/DecideEventInteractor.java | 4 +- src/main/java/view/EventView.java | 14 ++++- src/main/java/view/GameView.java | 60 ++++++++++++++++++- 8 files changed, 132 insertions(+), 17 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 2b11c4e83..4e2a176ac 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -14,19 +14,28 @@ import interface_adapters.dailygather.DailyGatherPresenter; import interface_adapters.dailymove.DailyMoveController; import interface_adapters.dailymove.DailyMovePresenter; +import interface_adapters.eventdecide.EventDecideController; +import interface_adapters.eventdecide.EventDecidePresenter; +import interface_adapters.eventinitializer.EventInitializerController; +import interface_adapters.eventinitializer.EventInitializerPresenter; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchPresenter; import interface_adapters.gameplacedescription.PlaceDescriptionController; import interface_adapters.gameplacedescription.PlaceDescriptionPresenter; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; import interface_adapters.nevagateallowcatepage.NevagateAllowcatePresenter; +import interface_adapters.nevagateevent.NevagateEventController; +import interface_adapters.nevagateevent.NevagateEventPresenter; import interface_adapters.nevagatemainview.NevagateMainController; import interface_adapters.nevagatemainview.NevagateMainPresenter; import interface_adapters.startallowcatepoint.AllowcateController; import interface_adapters.startallowcatepoint.AllowcatePresenter; +import usecases.NevagateEventPage.NevagateEventInteractor; import usecases.dailybroadcast.BroadcastInteractor; import usecases.dailygather.GatherInteractor; import usecases.dailymove.MoveInteractor; +import usecases.eventdecide.DecideEventInteractor; +import usecases.eventinitialize.EventInitializeInteractor; import usecases.fetchresource.FetchInteractor; import usecases.gameplacedescription.PlaceDescriptionInteractor; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; @@ -143,10 +152,32 @@ public static void main(String[] args) { final DailyMovePresenter dailyMovePresenter = new DailyMovePresenter(gameView); final MoveInteractor moveInteractor = new MoveInteractor(gamedatabase, dailyMovePresenter); final DailyMoveController dailyMoveController = new DailyMoveController(moveInteractor); + + // Nevagate Event usecase + final NevagateEventPresenter nevagateEventPresenter = new NevagateEventPresenter(navigationManager, gameView); + final NevagateEventInteractor nevagateEventInteractor = + new NevagateEventInteractor(gamedatabase, nevagateEventPresenter); + final NevagateEventController nevagateEventController = new NevagateEventController(nevagateEventInteractor); + + // Event Initialize usecase + final EventInitializerPresenter eventInitializerPresenter = new EventInitializerPresenter(eventView); + final EventInitializeInteractor eventInitializeInteractor = + new EventInitializeInteractor(gamedatabase, eventInitializerPresenter); + final EventInitializerController eventInitializerController = + new EventInitializerController(eventInitializeInteractor); + + // Event Decide usecase + final EventDecidePresenter eventDecidePresenter = new EventDecidePresenter(gameView); + final DecideEventInteractor decideEventInteractor = + new DecideEventInteractor(gamedatabase, eventDecidePresenter); + final EventDecideController eventDecideController = new EventDecideController(decideEventInteractor); + + // Event respond usecase // Example of how to use the endGame method // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); gameView.setController(fetchController, broadcastController, - placeDescriptionController, dailyGatherController, dailyMoveController); + placeDescriptionController, dailyGatherController, dailyMoveController, + nevagateEventController, eventDecideController); attributeview.setAllowcateController(allowcateController, nevagateMainController); } } diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index 33b9fdaa4..0a8a01200 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import entities.*; +import usecases.NevagateEventPage.NevagateEventDataAccessInterface; import usecases.dailybroadcast.BroadcastDataAccessInterface; import usecases.dailygather.GatherDataAccessInterface; import usecases.dailymove.MoveDataAccessInterface; @@ -43,11 +44,12 @@ public class InMemoryUnifiedDataAccess implements TraderDataAccessInterface, BlizzardDataAccessInterface, AmbushDataAccessInterface, - NevagateMainDataAccessInterface { + NevagateMainDataAccessInterface, + NevagateEventDataAccessInterface { // Shared game data private PlayerAttributes playerAttributes; private Inventory inventory; - private ArrayList events; + private ArrayList unprocessedevents; private Location currentLocation; private Horde horde; private PlayerInfo playerInfo; @@ -68,7 +70,7 @@ public InMemoryUnifiedDataAccess(PlayerAttributes playerAttributes, Inventory in EventTraderEncounter traderEncounter) { this.playerAttributes = playerAttributes; this.inventory = inventory; - this.events = events; + this.unprocessedevents = events; this.currentLocation = currentLocation; this.horde = horde; this.playerInfo = playerInfo; @@ -125,7 +127,7 @@ public Inventory getInventory() { // Implement of the DecideEventDataAccessInterface @Override - public ArrayList getEvents() { + public ArrayList getALLEvents() { // Return a copy to ensure immutability final ArrayList allevents = new ArrayList(); allevents.add(ambush); @@ -137,8 +139,8 @@ public ArrayList getEvents() { } @Override - public void setEvents(ArrayList events) { - this.events = new ArrayList<>(events); + public void setDecidedEvents(ArrayList decidedevents) { + this.unprocessedevents = new ArrayList<>(decidedevents); } @Override @@ -159,7 +161,7 @@ public void setActionPoint(int actionPoint) { // Implement of the EventInitiallizeInterface @Override public Event getEvent() { - return events.get(0); + return unprocessedevents.get(0); } // Implement of the FetchDataAccessInterface @@ -236,4 +238,9 @@ public void setScore(int score) { public void changePeople(int people) { inventory.changePeople(people); } + + @Override + public ArrayList getDecidedEvents() { + return this.unprocessedevents; + } } diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java b/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java index 0505ff1bc..178b10c1e 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java @@ -12,5 +12,5 @@ public interface NevagateEventDataAccessInterface { * Get all events decided for that day. * @return events. */ - ArrayList getEvents(); + ArrayList getDecidedEvents(); } diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java b/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java index f8606d7ad..450ce6937 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java +++ b/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java @@ -11,12 +11,21 @@ public class NevagateEventInteractor implements NevagateEventInputBoundary { private NevagateEventDataAccessInterface dataaccess; private NevagateEventOutputBoundary EventOutputBoundary; + public NevagateEventInteractor(NevagateEventDataAccessInterface dataaccess, + NevagateEventOutputBoundary EventOutputBoundary) { + this.dataaccess = dataaccess; + this.EventOutputBoundary = EventOutputBoundary; + } + @Override public void execute(NevagateEventInputdata inputdata) { - final ArrayList events = dataaccess.getEvents(); + final ArrayList events = dataaccess.getDecidedEvents(); if (events.size() > 0) { final NevagateEventOutputdata nevagateEventOutputdata = new NevagateEventOutputdata(); EventOutputBoundary.nevagateEventPage(nevagateEventOutputdata); } + else { + EventOutputBoundary.nevagateEventFailed("Peaceful day, no event happened."); + } } } diff --git a/src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java b/src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java index 0dc053288..67cfe5cfd 100644 --- a/src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java +++ b/src/main/java/usecases/eventdecide/DecideEventDataAccessInterface.java @@ -16,13 +16,13 @@ public interface DecideEventDataAccessInterface { * This method is responsible for get all event and their info. * @return List of all events type data. */ - ArrayList getEvents(); + ArrayList getALLEvents(); /** * This method will set the decided events for that day. * @param events events decided. */ - void setEvents(ArrayList events); + void setDecidedEvents(ArrayList events); /** * Get the player's current location, because certain event will only happen in certain location, Iceland diff --git a/src/main/java/usecases/eventdecide/DecideEventInteractor.java b/src/main/java/usecases/eventdecide/DecideEventInteractor.java index f0a207e63..d147695e0 100644 --- a/src/main/java/usecases/eventdecide/DecideEventInteractor.java +++ b/src/main/java/usecases/eventdecide/DecideEventInteractor.java @@ -21,7 +21,7 @@ public DecideEventInteractor(DecideEventDataAccessInterface dataaccessobject, @Override public void execute(DecideEventInputData inputdata) { - final ArrayList events = dataaccessobject.getEvents(); + final ArrayList events = dataaccessobject.getALLEvents(); final ArrayList decidedEvents = new ArrayList<>(); final Location location = dataaccessobject.getLocation(); final String locationName = location.toString(); @@ -39,7 +39,7 @@ public void execute(DecideEventInputData inputdata) { } } } - dataaccessobject.setEvents(decidedEvents); + dataaccessobject.setDecidedEvents(decidedEvents); final DecideEventOutputData outputdata = new DecideEventOutputData(decidedEventNames); outputboundary.prepareSuccessView(outputdata); } diff --git a/src/main/java/view/EventView.java b/src/main/java/view/EventView.java index 38d82f569..ae6887336 100644 --- a/src/main/java/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -1,5 +1,7 @@ package view; +import interface_adapters.eventinitializer.EventInitializerInterface; + import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; @@ -7,7 +9,7 @@ * Event view. */ -public class EventView extends JFrame { +public class EventView extends JFrame implements EventInitializerInterface { @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public EventView() { super("Event"); @@ -102,4 +104,14 @@ public void disrender() { public static void main(String[] args) { new EventView(); } + + @Override + public void updateUiEventInitializer(String eventdescription, String option1, String option2, String option3) { + + } + + @Override + public void failureEventInitializer(String failmessage) { + + } } \ No newline at end of file diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index f0ea28222..c28f89f8d 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -6,19 +6,25 @@ import interface_adapters.dailygather.DailyGatherInterface; import interface_adapters.dailymove.DailyMoveController; import interface_adapters.dailymove.DailyMoveInterface; +import interface_adapters.eventdecide.EventDecideController; +import interface_adapters.eventdecide.EventDecideInterface; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchInterface; import interface_adapters.gameplacedescription.PlaceDescriptionController; import interface_adapters.gameplacedescription.PlaceDescriptionInterface; +import interface_adapters.nevagateevent.NevagateEventController; +import interface_adapters.nevagateevent.NevagateEventInterface; import javax.swing.*; import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; +import java.util.ArrayList; public class GameView extends JFrame implements PropertyChangeListener, FetchInterface, BroadcastInterface, - PlaceDescriptionInterface, DailyGatherInterface, DailyMoveInterface { + PlaceDescriptionInterface, DailyGatherInterface, DailyMoveInterface, + EventDecideInterface, NevagateEventInterface { private int day; private int food; private int water; @@ -42,6 +48,8 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInt private PlaceDescriptionController placeDescriptionController; private DailyGatherController dailyGatherController; private DailyMoveController dailyMoveController; + private EventDecideController eventDecideController; + private NevagateEventController nevagateEventController; private final PropertyChangeSupport propertyChangeSupport; @@ -152,7 +160,13 @@ public GameView() { fetchController.execute(); }); + eventButton.addActionListener(e -> { + nevagateEventController.execute(); + }); + nextDayButton.addActionListener(e -> { + eventDecideController.execute(); + }); // Add ActionListeners infoButton.addActionListener(e -> toggleInfoBox()); @@ -178,12 +192,16 @@ public GameView() { public void setController(FetchController fetchController, BroadcastController broadcastController, PlaceDescriptionController placeDescriptionController, - DailyGatherController dailyGatherController, DailyMoveController dailyMoveController) { + DailyGatherController dailyGatherController, DailyMoveController dailyMoveController, + NevagateEventController nevagateEventController, + EventDecideController eventDecideController) { this.fetchController = fetchController; this.broadcastController = broadcastController; this.placeDescriptionController = placeDescriptionController; this.dailyGatherController = dailyGatherController; this.dailyMoveController = dailyMoveController; + this.nevagateEventController = nevagateEventController; + this.eventDecideController = eventDecideController; } public void render() { @@ -411,4 +429,42 @@ public void failurePlaceDescription(String failmessage) { JOptionPane.ERROR_MESSAGE ); } + + @Override + public void updateUiEventDecide(ArrayList eventNames) { + if (infoBox != null) { + if (eventNames.isEmpty()) { + // No events + infoBox.append("No events happened today.\n"); + } + else { + // Display the events + infoBox.append("Today's events:\n"); + for (String event : eventNames) { + infoBox.append("- " + event + "\n"); + } + } + infoBox.setCaretPosition(infoBox.getDocument().getLength()); + } + } + + @Override + public void failureEventDecide(String errorMessage) { + JOptionPane.showMessageDialog( + this, + errorMessage, + "Unable to decide event.", + JOptionPane.ERROR_MESSAGE + ); + } + + @Override + public void failureNevagateEvent(String message) { + JOptionPane.showMessageDialog( + this, + message, + "Unable to go to event page!", + JOptionPane.ERROR_MESSAGE + ); + } } From 1eeee30764e55e2f0f944ab5cb06d7007d7ad9c2 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Mon, 2 Dec 2024 12:54:40 -0700 Subject: [PATCH 112/154] ALL EVENT LOGIC ADAPTED --- src/main/java/app/GameMainApplication.java | 71 ++++++ src/main/java/entities/EntityConstants.java | 4 +- src/main/java/entities/EventFlood.java | 6 +- .../java/entities/EventSurvivorJoins.java | 5 +- .../java/entities/EventTraderEncounter.java | 6 +- .../database/InMemoryUnifiedDataAccess.java | 12 +- .../java/interface_adapters/EventManager.java | 58 +++++ .../FetchEventController.java | 16 ++ .../FetchEventInterface.java | 8 + .../FetchEventPresenter.java | 17 ++ .../NevagateEventController.java | 5 +- .../nevagategame/NevagateGameController.java | 17 ++ .../nevagategame/NevagateGameInterface.java | 7 + .../nevagategame/NevagateGamePresenter.java | 18 ++ .../ambush/AmbushDataAccessInterface.java | 1 + .../ambush/AmbushEventInteractor.java | 1 + .../blizzard/BlizzardDataAccessInterface.java | 1 + .../blizzard/BlizzardEventInteractor.java | 1 + .../flood/FloodDataAccessInterface.java | 1 + .../flood/FloodEventInteractor.java | 1 + .../survivor/SurvivorDataAccessInterface.java | 1 + .../survivor/SurvivorEventInteractor.java | 1 + .../trader/TraderDataAccessInterface.java | 1 + .../trader/TraderEventInteractor.java | 1 + .../CurrentEventDataAccessInterface.java | 10 + .../CurrentEventInputBoundary.java | 8 + .../CurrentEventInputData.java | 7 + .../CurrentEventInteractor.java | 23 ++ .../CurrentEventOutputBoundary.java | 10 + .../CurrentEventOutputData.java | 18 ++ .../NevagateGameDataAccessInterface.java | 7 + .../NevagateGameInputBoundary.java | 8 + .../nevagategame/NevagateGameInputdata.java | 7 + .../nevagategame/NevagateGameInteractor.java | 18 ++ .../NevagateGameOutputBoundary.java | 8 + .../nevagategame/NevagateGameOutputdata.java | 7 + .../NevagateStartGameDataAccessInterface.java | 7 - .../NevagateStartGameInputBoundary.java | 8 - .../NevagateStartGameInputdata.java | 7 - .../NevagateStartGameInteractor.java | 4 - .../NevagateStartGameOutputBoundary.java | 4 - .../NevagateStartGameOutputdata.java | 4 - src/main/java/view/EventView.java | 225 +++++++++++++----- 43 files changed, 545 insertions(+), 105 deletions(-) create mode 100644 src/main/java/interface_adapters/EventManager.java create mode 100644 src/main/java/interface_adapters/fetchcurrentevent/FetchEventController.java create mode 100644 src/main/java/interface_adapters/fetchcurrentevent/FetchEventInterface.java create mode 100644 src/main/java/interface_adapters/fetchcurrentevent/FetchEventPresenter.java create mode 100644 src/main/java/interface_adapters/nevagategame/NevagateGameController.java create mode 100644 src/main/java/interface_adapters/nevagategame/NevagateGameInterface.java create mode 100644 src/main/java/interface_adapters/nevagategame/NevagateGamePresenter.java create mode 100644 src/main/java/usecases/fetchcurrentevent/CurrentEventDataAccessInterface.java create mode 100644 src/main/java/usecases/fetchcurrentevent/CurrentEventInputBoundary.java create mode 100644 src/main/java/usecases/fetchcurrentevent/CurrentEventInputData.java create mode 100644 src/main/java/usecases/fetchcurrentevent/CurrentEventInteractor.java create mode 100644 src/main/java/usecases/fetchcurrentevent/CurrentEventOutputBoundary.java create mode 100644 src/main/java/usecases/fetchcurrentevent/CurrentEventOutputData.java create mode 100644 src/main/java/usecases/nevagategame/NevagateGameDataAccessInterface.java create mode 100644 src/main/java/usecases/nevagategame/NevagateGameInputBoundary.java create mode 100644 src/main/java/usecases/nevagategame/NevagateGameInputdata.java create mode 100644 src/main/java/usecases/nevagategame/NevagateGameInteractor.java create mode 100644 src/main/java/usecases/nevagategame/NevagateGameOutputBoundary.java create mode 100644 src/main/java/usecases/nevagategame/NevagateGameOutputdata.java delete mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameDataAccessInterface.java delete mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameInputBoundary.java delete mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameInputdata.java delete mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameInteractor.java delete mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputBoundary.java delete mode 100644 src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputdata.java diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 4e2a176ac..60029b907 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -7,6 +7,7 @@ import entities.*; import frameworks.database.InMemoryUnifiedDataAccess; +import interface_adapters.EventManager; import interface_adapters.NavigationManager; import interface_adapters.broadcast.BroadcastController; import interface_adapters.broadcast.BroadcastPresenter; @@ -18,6 +19,18 @@ import interface_adapters.eventdecide.EventDecidePresenter; import interface_adapters.eventinitializer.EventInitializerController; import interface_adapters.eventinitializer.EventInitializerPresenter; +import interface_adapters.eventrespond.ambush.AmbushResponseController; +import interface_adapters.eventrespond.ambush.AmbushResponsePresenter; +import interface_adapters.eventrespond.blizzard.BlizzardResponseController; +import interface_adapters.eventrespond.blizzard.BlizzardResponsePresenter; +import interface_adapters.eventrespond.flood.FloodResponseController; +import interface_adapters.eventrespond.flood.FloodResponsePresenter; +import interface_adapters.eventrespond.survivor.SurvivorResponseController; +import interface_adapters.eventrespond.survivor.SurvivorResponsePresenter; +import interface_adapters.eventrespond.trader.TraderResponseController; +import interface_adapters.eventrespond.trader.TraderResponsePresenter; +import interface_adapters.fetchcurrentevent.FetchEventController; +import interface_adapters.fetchcurrentevent.FetchEventPresenter; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchPresenter; import interface_adapters.gameplacedescription.PlaceDescriptionController; @@ -26,6 +39,8 @@ import interface_adapters.nevagateallowcatepage.NevagateAllowcatePresenter; import interface_adapters.nevagateevent.NevagateEventController; import interface_adapters.nevagateevent.NevagateEventPresenter; +import interface_adapters.nevagategame.NevagateGameController; +import interface_adapters.nevagategame.NevagateGamePresenter; import interface_adapters.nevagatemainview.NevagateMainController; import interface_adapters.nevagatemainview.NevagateMainPresenter; import interface_adapters.startallowcatepoint.AllowcateController; @@ -36,9 +51,16 @@ import usecases.dailymove.MoveInteractor; import usecases.eventdecide.DecideEventInteractor; import usecases.eventinitialize.EventInitializeInteractor; +import usecases.eventrespond.ambush.AmbushEventInteractor; +import usecases.eventrespond.blizzard.BlizzardEventInteractor; +import usecases.eventrespond.flood.FloodEventInteractor; +import usecases.eventrespond.survivor.SurvivorEventInteractor; +import usecases.eventrespond.trader.TraderEventInteractor; +import usecases.fetchcurrentevent.CurrentEventInteractor; import usecases.fetchresource.FetchInteractor; import usecases.gameplacedescription.PlaceDescriptionInteractor; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; +import usecases.nevagategame.NevagateGameInteractor; import usecases.nevagatemain.NevagateMainInteractor; import usecases.startallowcate.AllowcateInteractor; import frameworks.database.JsonRankingDataAccess; @@ -172,6 +194,53 @@ public static void main(String[] args) { new DecideEventInteractor(gamedatabase, eventDecidePresenter); final EventDecideController eventDecideController = new EventDecideController(decideEventInteractor); + // Event Respond usecase ambush + final AmbushResponsePresenter ambushresponsePresenter = new AmbushResponsePresenter(eventView); + final AmbushEventInteractor ambushEventInteractor = + new AmbushEventInteractor(gamedatabase, ambushresponsePresenter); + final AmbushResponseController ambushResponseController = new AmbushResponseController(ambushEventInteractor); + + // Event Respond usecase blizzard + final BlizzardResponsePresenter blizzardResponsePresenter = new BlizzardResponsePresenter(eventView); + final BlizzardEventInteractor blizzardEventInteractor = + new BlizzardEventInteractor(gamedatabase, blizzardResponsePresenter); + final BlizzardResponseController blizzardResponseController = + new BlizzardResponseController(blizzardEventInteractor); + + // Event Respond usecase flood + final FloodResponsePresenter floodResponsePresenter = new FloodResponsePresenter(eventView); + final FloodEventInteractor floodEventInteractor = + new FloodEventInteractor(gamedatabase, floodResponsePresenter); + final FloodResponseController floodResponseController = new FloodResponseController(floodEventInteractor); + + // Event Respond usecase survivor + final SurvivorResponsePresenter survivorResponsePresenter = new SurvivorResponsePresenter(eventView); + final SurvivorEventInteractor survivorEventInteractor = + new SurvivorEventInteractor(gamedatabase, survivorResponsePresenter); + final SurvivorResponseController survivorResponseController = + new SurvivorResponseController(survivorEventInteractor); + + // Event Respond usecase trader + final TraderResponsePresenter traderResponsePresenter = new TraderResponsePresenter(eventView); + final TraderEventInteractor traderEventInteractor = + new TraderEventInteractor(gamedatabase, traderResponsePresenter); + final TraderResponseController traderResponseController = new TraderResponseController(traderEventInteractor); + + // Initialize Event manager + final EventManager eventManager = new EventManager(ambushResponseController, blizzardResponseController, + floodResponseController, survivorResponseController, traderResponseController); + + // Fetch Event usecase + final FetchEventPresenter fetchEventPresenter = new FetchEventPresenter(eventView); + final CurrentEventInteractor currentEventInteractor = + new CurrentEventInteractor(gamedatabase, fetchEventPresenter); + final FetchEventController fetchEventController = new FetchEventController(currentEventInteractor); + + // Nevagate Game usecase + final NevagateGamePresenter nevagateGamePresenter = new NevagateGamePresenter(navigationManager); + final NevagateGameInteractor nevagateGameInteractor = + new NevagateGameInteractor(gamedatabase, nevagateGamePresenter); + final NevagateGameController nevagateGameController = new NevagateGameController(nevagateGameInteractor); // Event respond usecase // Example of how to use the endGame method // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); @@ -179,5 +248,7 @@ public static void main(String[] args) { placeDescriptionController, dailyGatherController, dailyMoveController, nevagateEventController, eventDecideController); attributeview.setAllowcateController(allowcateController, nevagateMainController); + eventView.setController(eventInitializerController, fetchEventController, nevagateGameController); + eventView.setManager(eventManager); } } diff --git a/src/main/java/entities/EntityConstants.java b/src/main/java/entities/EntityConstants.java index 6de7f3d92..7a3dff02a 100644 --- a/src/main/java/entities/EntityConstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -57,8 +57,8 @@ public class EntityConstants { public static final int FOURTHCHOICE = 4; // Base event probability (probability at default at start). - public static final double COMMONEVENTBASEPROB = 0.1; - public static final double RAREEVENTBASEPROB = 0.03; + public static final double COMMONEVENTBASEPROB = 1; + public static final double RAREEVENTBASEPROB = 1; // Horde starter setting. public static final int STARTERHORDEMAGNITUDE = 3000; diff --git a/src/main/java/entities/EventFlood.java b/src/main/java/entities/EventFlood.java index 021c5cc0f..51d133fa0 100644 --- a/src/main/java/entities/EventFlood.java +++ b/src/main/java/entities/EventFlood.java @@ -29,9 +29,9 @@ public EventFlood() { this.description = "Heavy rains have caused nearby rivers to overflow, threatening your group with a flood. " + "You must act quickly to avoid losing supplies and people. What will you do?"; this.choices = new HashMap<>(); - choices.put(EntityConstants.FIRSTCHOICE, "Evacuate to higher ground"); - choices.put(EntityConstants.SECONDCHOICE, "Secure supplies and hold position"); - choices.put(EntityConstants.THIRDCHOICE, "Do nothing and hope the flood subsides"); + choices.put(EntityConstants.FIRSTCHOICE, "Evacuate"); + choices.put(EntityConstants.SECONDCHOICE, "Secure supplies"); + choices.put(EntityConstants.THIRDCHOICE, "hope subsides"); this.probability = EntityConstants.RAREEVENTBASEPROB; this.evacuateOutcome = "You successfully evacuated, saving most of your group but losing some supplies."; diff --git a/src/main/java/entities/EventSurvivorJoins.java b/src/main/java/entities/EventSurvivorJoins.java index c0b322bf9..cb92e8f15 100644 --- a/src/main/java/entities/EventSurvivorJoins.java +++ b/src/main/java/entities/EventSurvivorJoins.java @@ -31,8 +31,9 @@ public EventSurvivorJoins() { this.description = "You encounter a small group of survivors who ask to join your group. They appear skilled " + "but wary. What will you do?"; this.choices = new HashMap<>(); - choices.put(EntityConstants.FIRSTCHOICE, "Accept them into the group"); - choices.put(EntityConstants.SECONDCHOICE, "Politely reject them"); + choices.put(EntityConstants.FIRSTCHOICE, "Accept them"); + choices.put(EntityConstants.SECONDCHOICE, "reject them"); + choices.put(EntityConstants.THIRDCHOICE, "rob them..?"); this.probability = EntityConstants.COMMONEVENTBASEPROB; this.acceptoutcome = "You've accept them into the group"; this.rejectoutcome = "You've reject them into the group"; diff --git a/src/main/java/entities/EventTraderEncounter.java b/src/main/java/entities/EventTraderEncounter.java index f93fffef1..ecdd00bb7 100644 --- a/src/main/java/entities/EventTraderEncounter.java +++ b/src/main/java/entities/EventTraderEncounter.java @@ -32,9 +32,9 @@ public EventTraderEncounter() { this.description = "You encounter a wandering trader offering supplies in exchange for your resources. " + "What will you do?"; this.choices = new HashMap<>(); - choices.put(EntityConstants.FIRSTCHOICE, "Trade with the trader"); - choices.put(EntityConstants.SECONDCHOICE, "Ignore the trader"); - choices.put(EntityConstants.THIRDCHOICE, "Attempt to rob the trader"); + choices.put(EntityConstants.FIRSTCHOICE, "Trade"); + choices.put(EntityConstants.SECONDCHOICE, "Ignore"); + choices.put(EntityConstants.THIRDCHOICE, "rob"); this.probability = EntityConstants.RAREEVENTBASEPROB; this.tradeOutcomeSuccess = "You traded successfully and gained valuable supplies."; diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index 0a8a01200..38dd8d7a9 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import entities.*; +import interface_adapters.nevagategame.NevagateGameInterface; import usecases.NevagateEventPage.NevagateEventDataAccessInterface; import usecases.dailybroadcast.BroadcastDataAccessInterface; import usecases.dailygather.GatherDataAccessInterface; @@ -15,11 +16,13 @@ import usecases.eventrespond.flood.FloodDataAccessInterface; import usecases.eventrespond.survivor.SurvivorDataAccessInterface; import usecases.eventrespond.trader.TraderDataAccessInterface; +import usecases.fetchcurrentevent.CurrentEventDataAccessInterface; import usecases.fetchresource.FetchDataAccessInterface; import usecases.gameminimap.MinimapDataAccessInterface; import usecases.gamenewday.NewdayDataAccessInterface; import usecases.gameplacedescription.PlaceDescriptionDataAccessInterface; import usecases.nevagateAllowcatePage.NevagateAllowcateDataAccessInterface; +import usecases.nevagategame.NevagateGameDataAccessInterface; import usecases.nevagatemain.NevagateMainDataAccessInterface; import usecases.startallowcate.AllowcateDataAccessInterface; @@ -45,7 +48,9 @@ public class InMemoryUnifiedDataAccess implements BlizzardDataAccessInterface, AmbushDataAccessInterface, NevagateMainDataAccessInterface, - NevagateEventDataAccessInterface { + NevagateEventDataAccessInterface, + CurrentEventDataAccessInterface, + NevagateGameDataAccessInterface { // Shared game data private PlayerAttributes playerAttributes; private Inventory inventory; @@ -164,6 +169,11 @@ public Event getEvent() { return unprocessedevents.get(0); } + @Override + public void removeEvent() { + this.unprocessedevents.remove(0); + } + // Implement of the FetchDataAccessInterface // Implement of the GatherInterface diff --git a/src/main/java/interface_adapters/EventManager.java b/src/main/java/interface_adapters/EventManager.java new file mode 100644 index 000000000..7f82489e4 --- /dev/null +++ b/src/main/java/interface_adapters/EventManager.java @@ -0,0 +1,58 @@ +package interface_adapters; + +import interface_adapters.eventrespond.ambush.AmbushResponseController; +import interface_adapters.eventrespond.blizzard.BlizzardResponseController; +import interface_adapters.eventrespond.flood.FloodResponseController; +import interface_adapters.eventrespond.survivor.SurvivorResponseController; +import interface_adapters.eventrespond.trader.TraderResponseController; + +public class EventManager { + private String ActiveEvent; + private final AmbushResponseController ambushResponseController; + private final BlizzardResponseController blizzardResponseController; + private final FloodResponseController floodResponseController; + private final SurvivorResponseController survivorResponseController; + private final TraderResponseController traderResponseController; + + public EventManager(AmbushResponseController ambushResponseController, + BlizzardResponseController blizzardResponseController, + FloodResponseController floodResponseController, + SurvivorResponseController survivorResponseController, + TraderResponseController traderResponseController) { + this.ActiveEvent = ""; + this.ambushResponseController = ambushResponseController; + this.blizzardResponseController = blizzardResponseController; + this.floodResponseController = floodResponseController; + this.survivorResponseController = survivorResponseController; + this.traderResponseController = traderResponseController; + } + public void setActiveEvent(String activeEvent) { + this.ActiveEvent = activeEvent; + } + + public void execute(int choice) { + if (ActiveEvent.equals("Ambush")) { + System.out.println("processing ambush"); + ambushResponseController.execute(choice); + } + else if (ActiveEvent.equals("Blizzard")) { + System.out.println("processing blizzard"); + blizzardResponseController.execute(choice); + } + else if (ActiveEvent.equals("Flood")) { + System.out.println("Processing flood"); + floodResponseController.execute(choice); + } + else if (ActiveEvent.equals("SurvivorsJoins")) { + System.out.println("processing survivor"); + survivorResponseController.execute(choice); + } + else if (ActiveEvent.equals("TradeEncounter")) { + System.out.println("processing trader"); + traderResponseController.execute(choice); + } + else { + System.out.println("Unknown event: " + ActiveEvent); + } + } +} diff --git a/src/main/java/interface_adapters/fetchcurrentevent/FetchEventController.java b/src/main/java/interface_adapters/fetchcurrentevent/FetchEventController.java new file mode 100644 index 000000000..d51904dab --- /dev/null +++ b/src/main/java/interface_adapters/fetchcurrentevent/FetchEventController.java @@ -0,0 +1,16 @@ +package interface_adapters.fetchcurrentevent; + +import usecases.fetchcurrentevent.CurrentEventInputBoundary; +import usecases.fetchcurrentevent.CurrentEventInputData; + +public class FetchEventController { + private CurrentEventInputBoundary interactor; + + public FetchEventController(CurrentEventInputBoundary interactor) { + this.interactor = interactor; + } + + public void execute() { + interactor.execute(new CurrentEventInputData()); + } +} diff --git a/src/main/java/interface_adapters/fetchcurrentevent/FetchEventInterface.java b/src/main/java/interface_adapters/fetchcurrentevent/FetchEventInterface.java new file mode 100644 index 000000000..91c11fd87 --- /dev/null +++ b/src/main/java/interface_adapters/fetchcurrentevent/FetchEventInterface.java @@ -0,0 +1,8 @@ +package interface_adapters.fetchcurrentevent; + +/** + * No need to update, just fetch the event. + */ +public interface FetchEventInterface { + void setEventName(String event); +} diff --git a/src/main/java/interface_adapters/fetchcurrentevent/FetchEventPresenter.java b/src/main/java/interface_adapters/fetchcurrentevent/FetchEventPresenter.java new file mode 100644 index 000000000..58b25bb3b --- /dev/null +++ b/src/main/java/interface_adapters/fetchcurrentevent/FetchEventPresenter.java @@ -0,0 +1,17 @@ +package interface_adapters.fetchcurrentevent; + +import usecases.fetchcurrentevent.CurrentEventOutputBoundary; +import usecases.fetchcurrentevent.CurrentEventOutputData; + +public class FetchEventPresenter implements CurrentEventOutputBoundary { + private FetchEventInterface view; + + public FetchEventPresenter(FetchEventInterface view) { + this.view = view; + } + + @Override + public void presentcurrentEvent(CurrentEventOutputData currentEventOutputData) { + view.setEventName(currentEventOutputData.getCurrentEvent().toString()); + } +} diff --git a/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java b/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java index 6ff9a51c6..4f75906a2 100644 --- a/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java +++ b/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java @@ -1,5 +1,6 @@ package interface_adapters.nevagateevent; +import usecases.NevagateEventPage.NevagateEventInputBoundary; import usecases.NevagateEventPage.NevagateEventInputdata; import usecases.NevagateEventPage.NevagateEventInteractor; @@ -7,9 +8,9 @@ * Controller. */ public class NevagateEventController { - private final NevagateEventInteractor interactor; + private final NevagateEventInputBoundary interactor; - public NevagateEventController(NevagateEventInteractor interactor) { + public NevagateEventController(NevagateEventInputBoundary interactor) { this.interactor = interactor; } diff --git a/src/main/java/interface_adapters/nevagategame/NevagateGameController.java b/src/main/java/interface_adapters/nevagategame/NevagateGameController.java new file mode 100644 index 000000000..22ba63c3d --- /dev/null +++ b/src/main/java/interface_adapters/nevagategame/NevagateGameController.java @@ -0,0 +1,17 @@ +package interface_adapters.nevagategame; + +import usecases.nevagategame.NevagateGameInputBoundary; +import usecases.nevagategame.NevagateGameInputdata; + +public class NevagateGameController { + private final NevagateGameInputBoundary interactor; + + public NevagateGameController(NevagateGameInputBoundary interactor) { + this.interactor = interactor; + } + + public void execute() { + final NevagateGameInputdata inputdata = new NevagateGameInputdata(); + interactor.execute(inputdata); + } +} \ No newline at end of file diff --git a/src/main/java/interface_adapters/nevagategame/NevagateGameInterface.java b/src/main/java/interface_adapters/nevagategame/NevagateGameInterface.java new file mode 100644 index 000000000..434025b16 --- /dev/null +++ b/src/main/java/interface_adapters/nevagategame/NevagateGameInterface.java @@ -0,0 +1,7 @@ +package interface_adapters.nevagategame; + +/** + * Nothing stopping player from going back. + */ +public interface NevagateGameInterface { +} diff --git a/src/main/java/interface_adapters/nevagategame/NevagateGamePresenter.java b/src/main/java/interface_adapters/nevagategame/NevagateGamePresenter.java new file mode 100644 index 000000000..c6c2c9508 --- /dev/null +++ b/src/main/java/interface_adapters/nevagategame/NevagateGamePresenter.java @@ -0,0 +1,18 @@ +package interface_adapters.nevagategame; + +import interface_adapters.NavigationManager; +import usecases.nevagategame.NevagateGameOutputBoundary; +import usecases.nevagategame.NevagateGameOutputdata; + +public class NevagateGamePresenter implements NevagateGameOutputBoundary { + private NavigationManager navigationManager; + + public NevagateGamePresenter(NavigationManager navigationManager) { + this.navigationManager = navigationManager; + } + + @Override + public void prepareGamePage(NevagateGameOutputdata outputdata) { + navigationManager.showGameView(); + } +} diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java b/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java index 9fec20c6e..bbfe9bd55 100644 --- a/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java @@ -9,6 +9,7 @@ */ public interface AmbushDataAccessInterface { Event getEvent(); + void removeEvent(); Inventory getInventory(); PlayerAttributes getPlayerAttributes(); diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java index e2abf89ef..0dab653c1 100644 --- a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java +++ b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java @@ -72,6 +72,7 @@ public void execute(AmbushInputData inputData) { dataAccess.changeWater(waterChange); dataAccess.changeWeapon(weaponChange); dataAccess.changePeople(peopleChange); + dataAccess.removeEvent(); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java index 5e5fe9bab..251d3d08f 100644 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java @@ -9,6 +9,7 @@ */ public interface BlizzardDataAccessInterface { Event getEvent(); + void removeEvent(); Inventory getInventory(); PlayerAttributes getPlayerAttributes(); diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java index ccd959756..0b16dc4a5 100644 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java @@ -51,6 +51,7 @@ public void execute(BlizzardInputData inputData) { // Apply resource changes to the inventory dataAccess.changeFood(foodChange); dataAccess.changeWater(waterChange); + dataAccess.removeEvent(); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + "."; diff --git a/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java b/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java index b71a98f7c..3233ca2e6 100644 --- a/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java @@ -9,6 +9,7 @@ */ public interface FloodDataAccessInterface { Event getEvent(); + void removeEvent(); Inventory getInventory(); PlayerAttributes getPlayerAttributes(); diff --git a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java index 743690849..a2c3094ef 100644 --- a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java +++ b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java @@ -52,6 +52,7 @@ public void execute(FloodInputData inputData) { dataAccess.changeFood(foodChange); dataAccess.changeWater(waterChange); dataAccess.changePeople(peopleChange); + dataAccess.removeEvent(); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java b/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java index 887605746..37a4d87bc 100644 --- a/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java @@ -9,6 +9,7 @@ */ public interface SurvivorDataAccessInterface { Event getEvent(); + void removeEvent(); Inventory getInventory(); PlayerAttributes getPlayerAttributes(); diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java index 57030fe4a..ac00e0c49 100644 --- a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java @@ -56,6 +56,7 @@ public void execute(SurvivorInputData inputData) { dataAccess.changeWater(waterChange); dataAccess.changeWeapon(suppliesChange); dataAccess.changePeople(peopleChange); + dataAccess.removeEvent(); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + diff --git a/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java b/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java index 4e2d0f099..257d0879e 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java @@ -9,6 +9,7 @@ */ public interface TraderDataAccessInterface { Event getEvent(); + void removeEvent(); Inventory getInventory(); PlayerAttributes getPlayerAttributes(); diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java index 1a89dd35e..8cf773221 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -63,6 +63,7 @@ public void execute(TraderInputData inputData) { dataAccess.changeWater(waterChange); dataAccess.changeWeapon(suppliesChange); dataAccess.changePeople(peopleChange); + dataAccess.removeEvent(); // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + diff --git a/src/main/java/usecases/fetchcurrentevent/CurrentEventDataAccessInterface.java b/src/main/java/usecases/fetchcurrentevent/CurrentEventDataAccessInterface.java new file mode 100644 index 000000000..634706da8 --- /dev/null +++ b/src/main/java/usecases/fetchcurrentevent/CurrentEventDataAccessInterface.java @@ -0,0 +1,10 @@ +package usecases.fetchcurrentevent; + +import entities.Event; + +/** + * Current event data access. + */ +public interface CurrentEventDataAccessInterface { + Event getEvent(); +} diff --git a/src/main/java/usecases/fetchcurrentevent/CurrentEventInputBoundary.java b/src/main/java/usecases/fetchcurrentevent/CurrentEventInputBoundary.java new file mode 100644 index 000000000..8c54ae57c --- /dev/null +++ b/src/main/java/usecases/fetchcurrentevent/CurrentEventInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.fetchcurrentevent; + +/** + * Execute. + */ +public interface CurrentEventInputBoundary { + void execute(CurrentEventInputData inputData); +} diff --git a/src/main/java/usecases/fetchcurrentevent/CurrentEventInputData.java b/src/main/java/usecases/fetchcurrentevent/CurrentEventInputData.java new file mode 100644 index 000000000..bc83f21fe --- /dev/null +++ b/src/main/java/usecases/fetchcurrentevent/CurrentEventInputData.java @@ -0,0 +1,7 @@ +package usecases.fetchcurrentevent; + +/** + * Inputdata not needed. + */ +public class CurrentEventInputData { +} diff --git a/src/main/java/usecases/fetchcurrentevent/CurrentEventInteractor.java b/src/main/java/usecases/fetchcurrentevent/CurrentEventInteractor.java new file mode 100644 index 000000000..fa9c05137 --- /dev/null +++ b/src/main/java/usecases/fetchcurrentevent/CurrentEventInteractor.java @@ -0,0 +1,23 @@ +package usecases.fetchcurrentevent; + +import entities.Event; + +/** + * Current event interactor. + */ +public class CurrentEventInteractor implements CurrentEventInputBoundary { + private CurrentEventDataAccessInterface dataaccess; + private CurrentEventOutputBoundary outputBoundary; + + public CurrentEventInteractor(CurrentEventDataAccessInterface dataaccess, + CurrentEventOutputBoundary outputBoundary) { + this.dataaccess = dataaccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(CurrentEventInputData inputData) { + final Event event = dataaccess.getEvent(); + outputBoundary.presentcurrentEvent(new CurrentEventOutputData(event)); + } +} diff --git a/src/main/java/usecases/fetchcurrentevent/CurrentEventOutputBoundary.java b/src/main/java/usecases/fetchcurrentevent/CurrentEventOutputBoundary.java new file mode 100644 index 000000000..f4623596a --- /dev/null +++ b/src/main/java/usecases/fetchcurrentevent/CurrentEventOutputBoundary.java @@ -0,0 +1,10 @@ +package usecases.fetchcurrentevent; + +import entities.Event; + +/** + * Not needed as this is simply just passing the current event. + */ +public interface CurrentEventOutputBoundary { + void presentcurrentEvent(CurrentEventOutputData currentEventOutputData); +} diff --git a/src/main/java/usecases/fetchcurrentevent/CurrentEventOutputData.java b/src/main/java/usecases/fetchcurrentevent/CurrentEventOutputData.java new file mode 100644 index 000000000..062031951 --- /dev/null +++ b/src/main/java/usecases/fetchcurrentevent/CurrentEventOutputData.java @@ -0,0 +1,18 @@ +package usecases.fetchcurrentevent; + +import entities.Event; + +/** + * Not needed, nothing to present to UI. + */ +public class CurrentEventOutputData { + private Event currentEvent; + + public CurrentEventOutputData(Event currentEvent) { + this.currentEvent = currentEvent; + } + + public Event getCurrentEvent() { + return currentEvent; + } +} diff --git a/src/main/java/usecases/nevagategame/NevagateGameDataAccessInterface.java b/src/main/java/usecases/nevagategame/NevagateGameDataAccessInterface.java new file mode 100644 index 000000000..cec4d6266 --- /dev/null +++ b/src/main/java/usecases/nevagategame/NevagateGameDataAccessInterface.java @@ -0,0 +1,7 @@ +package usecases.nevagategame; + +/** + * Not needed, we don't need info from database. + */ +public interface NevagateGameDataAccessInterface { +} diff --git a/src/main/java/usecases/nevagategame/NevagateGameInputBoundary.java b/src/main/java/usecases/nevagategame/NevagateGameInputBoundary.java new file mode 100644 index 000000000..3f3f6ccd3 --- /dev/null +++ b/src/main/java/usecases/nevagategame/NevagateGameInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.nevagategame; + +/** + * Execute method is gurenteed. + */ +public interface NevagateGameInputBoundary { + void execute(NevagateGameInputdata InputData); +} diff --git a/src/main/java/usecases/nevagategame/NevagateGameInputdata.java b/src/main/java/usecases/nevagategame/NevagateGameInputdata.java new file mode 100644 index 000000000..f2eba0183 --- /dev/null +++ b/src/main/java/usecases/nevagategame/NevagateGameInputdata.java @@ -0,0 +1,7 @@ +package usecases.nevagategame; + +/** + * Input from player side. + */ +public class NevagateGameInputdata { +} diff --git a/src/main/java/usecases/nevagategame/NevagateGameInteractor.java b/src/main/java/usecases/nevagategame/NevagateGameInteractor.java new file mode 100644 index 000000000..1370cab14 --- /dev/null +++ b/src/main/java/usecases/nevagategame/NevagateGameInteractor.java @@ -0,0 +1,18 @@ +package usecases.nevagategame; + +public class NevagateGameInteractor implements NevagateGameInputBoundary{ + private NevagateGameDataAccessInterface dataaccess; + private NevagateGameOutputBoundary outputboundary; + + public NevagateGameInteractor(NevagateGameDataAccessInterface dataaccess, + NevagateGameOutputBoundary outputboundary) { + this.dataaccess = dataaccess; + this.outputboundary = outputboundary; + } + + @Override + public void execute(NevagateGameInputdata InputData) { + final NevagateGameOutputdata outputdata = new NevagateGameOutputdata(); + outputboundary.prepareGamePage(outputdata); + } +} diff --git a/src/main/java/usecases/nevagategame/NevagateGameOutputBoundary.java b/src/main/java/usecases/nevagategame/NevagateGameOutputBoundary.java new file mode 100644 index 000000000..c0d2b6263 --- /dev/null +++ b/src/main/java/usecases/nevagategame/NevagateGameOutputBoundary.java @@ -0,0 +1,8 @@ +package usecases.nevagategame; + +/** + * Contain method to jumo to game main page. + */ +public interface NevagateGameOutputBoundary { + void prepareGamePage(NevagateGameOutputdata outputdata); +} diff --git a/src/main/java/usecases/nevagategame/NevagateGameOutputdata.java b/src/main/java/usecases/nevagategame/NevagateGameOutputdata.java new file mode 100644 index 000000000..31bc253ca --- /dev/null +++ b/src/main/java/usecases/nevagategame/NevagateGameOutputdata.java @@ -0,0 +1,7 @@ +package usecases.nevagategame; + +/** + * Not needed. + */ +public class NevagateGameOutputdata { +} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameDataAccessInterface.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameDataAccessInterface.java deleted file mode 100644 index ef003017d..000000000 --- a/src/main/java/usecases/nevagatestartgame/NevagateStartGameDataAccessInterface.java +++ /dev/null @@ -1,7 +0,0 @@ -package usecases.nevagatestartgame; - -/** - * Not needed, we don't need info from database. - */ -public interface NevagateStartGameDataAccessInterface { -} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputBoundary.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputBoundary.java deleted file mode 100644 index e7e58ea4b..000000000 --- a/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputBoundary.java +++ /dev/null @@ -1,8 +0,0 @@ -package usecases.nevagatestartgame; - -/** - * Execute method is gurenteed. - */ -public interface NevagateStartGameInputBoundary { - void execute(NevagateStartGameInputdata InputData); -} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputdata.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputdata.java deleted file mode 100644 index 6da166804..000000000 --- a/src/main/java/usecases/nevagatestartgame/NevagateStartGameInputdata.java +++ /dev/null @@ -1,7 +0,0 @@ -package usecases.nevagatestartgame; - -/** - * Input from player side. - */ -public class NevagateStartGameInputdata { -} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameInteractor.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameInteractor.java deleted file mode 100644 index 3c078d689..000000000 --- a/src/main/java/usecases/nevagatestartgame/NevagateStartGameInteractor.java +++ /dev/null @@ -1,4 +0,0 @@ -package usecases.nevagatestartgame; - -public class NevagateStartGameInteractor { -} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputBoundary.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputBoundary.java deleted file mode 100644 index 1ea22a4b5..000000000 --- a/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputBoundary.java +++ /dev/null @@ -1,4 +0,0 @@ -package usecases.nevagatestartgame; - -public interface NevagateStartGameOutputBoundary { -} diff --git a/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputdata.java b/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputdata.java deleted file mode 100644 index 3e6b99559..000000000 --- a/src/main/java/usecases/nevagatestartgame/NevagateStartGameOutputdata.java +++ /dev/null @@ -1,4 +0,0 @@ -package usecases.nevagatestartgame; - -public class NevagateStartGameOutputdata { -} diff --git a/src/main/java/view/EventView.java b/src/main/java/view/EventView.java index ae6887336..f106a3baa 100644 --- a/src/main/java/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -1,97 +1,180 @@ package view; +import entities.Event; +import interface_adapters.EventManager; +import interface_adapters.eventinitializer.EventInitializerController; import interface_adapters.eventinitializer.EventInitializerInterface; +import interface_adapters.eventrespond.ambush.AmbushResponseInterface; +import interface_adapters.eventrespond.blizzard.BlizzardResponseInterface; +import interface_adapters.eventrespond.flood.FloodResponseInterface; +import interface_adapters.eventrespond.survivor.SurvivorResponseInterface; +import interface_adapters.eventrespond.trader.TraderResponseInterface; +import interface_adapters.fetchcurrentevent.FetchEventController; +import interface_adapters.fetchcurrentevent.FetchEventInterface; +import interface_adapters.nevagategame.NevagateGameController; +import interface_adapters.nevagategame.NevagateGameInterface; +import interface_adapters.nevagatemainview.NevagateMainController; import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; + /** * Event view. */ +public class EventView extends JFrame implements EventInitializerInterface, + AmbushResponseInterface, BlizzardResponseInterface, TraderResponseInterface, + FloodResponseInterface, SurvivorResponseInterface, FetchEventInterface, NevagateGameInterface { + + // UI components as instance variables + private final JLabel eventLabel; + private final JTextArea descriptionArea; + private final JScrollPane descriptionScrollPane; + private final JButton fightButton; + private final JButton negotiateButton; + private final JButton fleeButton; + private final JButton backButton; + private final SpringLayout layout; + + private EventInitializerController eventInitializerController; + private EventManager eventManager; + private FetchEventController fetchEventController; + private NevagateGameController nevagateGameController; + + public void setController(EventInitializerController eventInitializerController, + FetchEventController fetchEventController, + NevagateGameController nevagateGameController) { + this.eventInitializerController = eventInitializerController; + this.fetchEventController = fetchEventController; + this.nevagateGameController = nevagateGameController; + } + + public void setManager(EventManager eventManager) { + this.eventManager = eventManager; + } -public class EventView extends JFrame implements EventInitializerInterface { - @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public EventView() { super("Event"); - final Container container = getContentPane(); - final SpringLayout layout = new SpringLayout(); + // Initialize the container and layout + Container container = getContentPane(); + layout = new SpringLayout(); container.setLayout(layout); - // Event Label - final JLabel eventLabel = new JLabel("Event:"); + // Initialize UI components + eventLabel = new JLabel("Event:"); eventLabel.setFont(new Font("Serif", Font.BOLD, 20)); - container.add(eventLabel); - // Description Area - final JTextArea descriptionArea = new JTextArea("Event description goes here..."); + // Initialize the description area + descriptionArea = new JTextArea("Event description goes here..."); descriptionArea.setEditable(false); descriptionArea.setBackground(Color.LIGHT_GRAY); descriptionArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - container.add(descriptionArea); + descriptionArea.setLineWrap(true); + descriptionArea.setWrapStyleWord(true); + + // Wrap the description area in a scroll pane + descriptionScrollPane = new JScrollPane(descriptionArea); // Now it's an instance variable + descriptionScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + descriptionScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + descriptionScrollPane.setPreferredSize(new Dimension(400, 100)); // Buttons - final JButton fightButton = new JButton("Fight"); - final JButton negotiateButton = new JButton("Negotiate"); - final JButton fleeButton = new JButton("Flee"); - final JButton backButton = new JButton("Back"); + fightButton = new JButton("Fight"); + negotiateButton = new JButton("Negotiate"); + fleeButton = new JButton("Flee"); + backButton = new JButton("Back"); + + // Add components to container + container.add(eventLabel); + container.add(descriptionScrollPane); // Add the scroll pane, not just the text area container.add(fightButton); container.add(negotiateButton); container.add(fleeButton); container.add(backButton); - // Layout Constraints - extracted(layout, eventLabel, container, descriptionArea, fightButton, negotiateButton, fleeButton); - - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, fightButton); - - // Add ActionListeners to Buttons - final ActionListener returnToGameViewListener = e -> { - dispose(); - new GameView(); - }; - - addListeners(fightButton, returnToGameViewListener, negotiateButton, fleeButton, backButton); - - // Window Settings + // Call applyLayoutConstraints to position components + applyLayoutConstraints(container); + + // Add button listeners + fightButton.addActionListener(e -> { + fetchEventController.execute(); + // also reset event manager event string. + eventManager.execute(1); + }); + + negotiateButton.addActionListener(e -> { + fetchEventController.execute(); + // also reset event manager event string. + eventManager.execute(2); + }); + + fleeButton.addActionListener(e -> { + fetchEventController.execute(); + // also reset event manager event string. + eventManager.execute(3); + }); + + backButton.addActionListener(e -> { + nevagateGameController.execute(); + }); + + // Window settings setSize(600, 400); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(false); } - private static void addListeners(JButton fightButton, ActionListener returnToGameViewListener, - JButton negotiateButton, JButton fleeButton, JButton backButton) { - fightButton.addActionListener(returnToGameViewListener); - negotiateButton.addActionListener(returnToGameViewListener); - fleeButton.addActionListener(returnToGameViewListener); - backButton.addActionListener(returnToGameViewListener); - } - - private static void extracted(SpringLayout layout, JLabel eventLabel, Container container, - JTextArea descriptionArea, JButton fightButton, - JButton negotiateButton, JButton fleeButton) { + /** + * Applies layout constraints to the UI components. + * + * @param container The parent container. + */ + private void applyLayoutConstraints(Container container) { + // Event Label Constraints layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, eventLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, eventLabel, 20, SpringLayout.NORTH, container); - - layout.putConstraint(SpringLayout.WEST, descriptionArea, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.EAST, descriptionArea, -Constants.TWENTY, SpringLayout.EAST, container); - layout.putConstraint(SpringLayout.NORTH, descriptionArea, Constants.TWENTY, SpringLayout.SOUTH, eventLabel); - layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, - container); - - layout.putConstraint(SpringLayout.WEST, fightButton, 20, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, fightButton, 20, SpringLayout.SOUTH, descriptionArea); - - layout.putConstraint(SpringLayout.WEST, negotiateButton, 20, SpringLayout.EAST, fightButton); + layout.putConstraint(SpringLayout.NORTH, eventLabel, Constants.TWENTY, SpringLayout.NORTH, container); + + // Description Scroll Pane Constraints + layout.putConstraint(SpringLayout.WEST, descriptionScrollPane, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.EAST, descriptionScrollPane, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, descriptionScrollPane, Constants.TWENTY, + SpringLayout.SOUTH, eventLabel); + layout.putConstraint(SpringLayout.SOUTH, descriptionScrollPane, -Constants.ONE_HUNDRED, + SpringLayout.SOUTH, container); + + // Fight Button Constraints + layout.putConstraint(SpringLayout.WEST, fightButton, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, fightButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionScrollPane); + + // Negotiate Button Constraints + layout.putConstraint(SpringLayout.WEST, negotiateButton, Constants.TWENTY, SpringLayout.EAST, fightButton); layout.putConstraint(SpringLayout.NORTH, negotiateButton, 0, SpringLayout.NORTH, fightButton); - layout.putConstraint(SpringLayout.WEST, fleeButton, 20, SpringLayout.EAST, negotiateButton); + // Flee Button Constraints + layout.putConstraint(SpringLayout.WEST, fleeButton, Constants.TWENTY, SpringLayout.EAST, negotiateButton); layout.putConstraint(SpringLayout.NORTH, fleeButton, 0, SpringLayout.NORTH, fightButton); + + // Back Button Constraints + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, backButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.NORTH, backButton, Constants.TWENTY, SpringLayout.SOUTH, fightButton); + } + + /** + * Adds default action listeners to buttons. + * + * @param returnToGameViewListener The listener to return to the GameView. + */ + private void addListeners(ActionListener returnToGameViewListener) { + fightButton.addActionListener(returnToGameViewListener); + negotiateButton.addActionListener(returnToGameViewListener); + fleeButton.addActionListener(returnToGameViewListener); + backButton.addActionListener(returnToGameViewListener); } public void render() { + eventInitializerController.execute(); setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); setVisible(true); } @@ -101,17 +184,43 @@ public void disrender() { setVisible(false); } - public static void main(String[] args) { - new EventView(); + @Override + public void updateUiEventInitializer(String eventdescription, String option1, String option2, String option3) { + descriptionArea.setText(eventdescription); + fightButton.setText(option1); + negotiateButton.setText(option2); + fleeButton.setText(option3); } @Override - public void updateUiEventInitializer(String eventdescription, String option1, String option2, String option3) { + public void failureEventInitializer(String failmessage) { + JOptionPane.showMessageDialog(this, failmessage, "Error", JOptionPane.ERROR_MESSAGE); + } + @Override + public void updateUiResponse(String message) { + JOptionPane.showMessageDialog( + this, + message, + "Notification", + JOptionPane.INFORMATION_MESSAGE + ); + nevagateGameController.execute(); + // return to game. } @Override - public void failureEventInitializer(String failmessage) { + public void failureResponse(String errorMessage) { + JOptionPane.showMessageDialog( + this, + errorMessage, + "Invaild choice", + JOptionPane.ERROR_MESSAGE + ); + } + @Override + public void setEventName(String event) { + eventManager.setActiveEvent(event); } -} \ No newline at end of file +} From c79e9e35abcb9178a3580fcaa0005a73e3c8aa48 Mon Sep 17 00:00:00 2001 From: yitong an Date: Mon, 2 Dec 2024 15:18:37 -0500 Subject: [PATCH 113/154] correct some checkstyle bugs in game view --- ...ackson_core_jackson_annotations_2_15_2.xml | 14 ++ ...erxml_jackson_core_jackson_core_2_15_2.xml | 14 ++ ...l_jackson_core_jackson_databind_2_15_2.xml | 14 ++ ...en__com_squareup_okhttp3_okhttp_4_12_0.xml | 14 ++ .../Maven__com_squareup_okio_okio_3_6_0.xml | 14 ++ ...aven__com_squareup_okio_okio_jvm_3_6_0.xml | 14 ++ .idea/libraries/Maven__junit_junit_4_13_1.xml | 14 ++ .../Maven__org_hamcrest_hamcrest_core_1_3.xml | 14 ++ .../Maven__org_jetbrains_annotations_13_0.xml | 14 ++ ..._jetbrains_kotlin_kotlin_stdlib_1_8_21.xml | 14 ++ ...ins_kotlin_kotlin_stdlib_common_1_9_10.xml | 14 ++ ...rains_kotlin_kotlin_stdlib_jdk7_1_8_21.xml | 14 ++ ...rains_kotlin_kotlin_stdlib_jdk8_1_8_21.xml | 14 ++ .../Maven__org_json_json_20240303.xml | 14 ++ .idea/modules.xml | 8 + src/main/java/view/GameView.java | 153 +++++++++++------- 16 files changed, 300 insertions(+), 57 deletions(-) create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_2.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_2.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_2.xml create mode 100644 .idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_12_0.xml create mode 100644 .idea/libraries/Maven__com_squareup_okio_okio_3_6_0.xml create mode 100644 .idea/libraries/Maven__com_squareup_okio_okio_jvm_3_6_0.xml create mode 100644 .idea/libraries/Maven__junit_junit_4_13_1.xml create mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml create mode 100644 .idea/libraries/Maven__org_jetbrains_annotations_13_0.xml create mode 100644 .idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_8_21.xml create mode 100644 .idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_9_10.xml create mode 100644 .idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_8_21.xml create mode 100644 .idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_8_21.xml create mode 100644 .idea/libraries/Maven__org_json_json_20240303.xml create mode 100644 .idea/modules.xml diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_2.xml new file mode 100644 index 000000000..676abb4ea --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_2.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_2.xml new file mode 100644 index 000000000..178e531a8 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_2.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_2.xml new file mode 100644 index 000000000..ee0f17f03 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_2.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_12_0.xml b/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_12_0.xml new file mode 100644 index 000000000..ab1a3a401 --- /dev/null +++ b/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_12_0.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_squareup_okio_okio_3_6_0.xml b/.idea/libraries/Maven__com_squareup_okio_okio_3_6_0.xml new file mode 100644 index 000000000..97d8325d3 --- /dev/null +++ b/.idea/libraries/Maven__com_squareup_okio_okio_3_6_0.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_squareup_okio_okio_jvm_3_6_0.xml b/.idea/libraries/Maven__com_squareup_okio_okio_jvm_3_6_0.xml new file mode 100644 index 000000000..3a6faa34f --- /dev/null +++ b/.idea/libraries/Maven__com_squareup_okio_okio_jvm_3_6_0.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_13_1.xml b/.idea/libraries/Maven__junit_junit_4_13_1.xml new file mode 100644 index 000000000..343c5289e --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_13_1.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 000000000..56c47f46d --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_annotations_13_0.xml b/.idea/libraries/Maven__org_jetbrains_annotations_13_0.xml new file mode 100644 index 000000000..316d4ac35 --- /dev/null +++ b/.idea/libraries/Maven__org_jetbrains_annotations_13_0.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_8_21.xml b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_8_21.xml new file mode 100644 index 000000000..59e1eabed --- /dev/null +++ b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_8_21.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_9_10.xml b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_9_10.xml new file mode 100644 index 000000000..1e61ead42 --- /dev/null +++ b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_9_10.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_8_21.xml b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_8_21.xml new file mode 100644 index 000000000..16c9ff26e --- /dev/null +++ b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_8_21.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_8_21.xml b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_8_21.xml new file mode 100644 index 000000000..325b0d3ef --- /dev/null +++ b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_8_21.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_json_json_20240303.xml b/.idea/libraries/Maven__org_json_json_20240303.xml new file mode 100644 index 000000000..4e3a16337 --- /dev/null +++ b/.idea/libraries/Maven__org_json_json_20240303.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..30f9213f3 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index c28f89f8d..97a5e2026 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -60,13 +60,13 @@ public GameView() { this.propertyChangeSupport = new PropertyChangeSupport(this); // Initialize UI components - Container container = getContentPane(); - SpringLayout layout = new SpringLayout(); + final Container container = getContentPane(); + final SpringLayout layout = new SpringLayout(); container.setLayout(layout); // Initialize labels for resources dayLabel = new JLabel("Day: " + day); - dayLabel.setFont(new Font("Serif", Font.BOLD, 20)); + dayLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); foodLabel = new JLabel("Food: " + food); waterLabel = new JLabel("Water: " + water); peopleLabel = new JLabel("People: " + people); @@ -87,38 +87,35 @@ public GameView() { mapPanel.setWrapStyleWord(true); mapPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); mapPanel.setBackground(Color.LIGHT_GRAY); - mapPanel.setPreferredSize(new Dimension(200, 200)); + mapPanel.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); container.add(mapPanel); // Wrap infoBox in a JScrollPane (top-left position, smaller width) - JScrollPane infoScrollPane = new JScrollPane(infoBox); + final JScrollPane infoScrollPane = new JScrollPane(infoBox); infoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); infoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - infoScrollPane.setPreferredSize(new Dimension(200, 200)); // Adjusted smaller width and fixed height + // Adjusted smaller width and fixed height + infoScrollPane.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); container.add(infoScrollPane); infoBox.setLineWrap(true); infoBox.setWrapStyleWord(true); infoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); infoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - -// Update Layout Constraints for infoScrollPane (top-left, same as minimap) - layout.putConstraint(SpringLayout.EAST, infoScrollPane, -20, SpringLayout.EAST, container); - layout.putConstraint(SpringLayout.NORTH, infoScrollPane, 20, SpringLayout.NORTH, container); - - - + // Update Layout Constraints for infoScrollPane (top-left, same as minimap) + layout.putConstraint(SpringLayout.EAST, infoScrollPane, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, infoScrollPane, Constants.TWENTY, SpringLayout.NORTH, container); // Buttons - JButton broadcastButton = new JButton("Broadcast"); - JButton gatherButton = new JButton("Gather"); - JButton upButton = new JButton("Up"); - JButton downButton = new JButton("Down"); - JButton leftButton = new JButton("Left"); - JButton rightButton = new JButton("Right"); - JButton eventButton = new JButton("Event"); - JButton nextDayButton = new JButton("Next Day"); - JButton infoButton = new JButton("Log"); + final JButton broadcastButton = new JButton("Broadcast"); + final JButton gatherButton = new JButton("Gather"); + final JButton upButton = new JButton("Up"); + final JButton downButton = new JButton("Down"); + final JButton leftButton = new JButton("Left"); + final JButton rightButton = new JButton("Right"); + final JButton eventButton = new JButton("Event"); + final JButton nextDayButton = new JButton("Next Day"); + final JButton infoButton = new JButton("Log"); container.add(broadcastButton); container.add(gatherButton); @@ -182,7 +179,7 @@ public GameView() { leftButton, rightButton, eventButton, nextDayButton, infoButton); // Set frame properties - setSize(600, 400); + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); @@ -204,54 +201,94 @@ public void setController(FetchController fetchController, BroadcastController b this.eventDecideController = eventDecideController; } + /** + * Renders the UI by executing controllers and making the panel visible. + */ public void render() { placeDescriptionController.execute(); fetchController.execute(); setVisible(true); } + /** + * Hides the UI by making the panel invisible. + */ public void disrender() { setVisible(false); } + /** + * Toggles the visibility of the map and information box. + * If the map is currently visible, it hides the map and shows the info box, and vice versa. + */ private void toggleInfoBox() { isMapVisible = !isMapVisible; mapPanel.setVisible(isMapVisible); infoBox.setVisible(!isMapVisible); } + /** + * Sets the current day and notifies listeners of the property change. + * + * @param day the new day value + */ public void setDay(int day) { - int oldDay = this.day; + final int oldDay = this.day; this.day = day; propertyChangeSupport.firePropertyChange("day", oldDay, day); } + /** + * Sets the current food level and notifies listeners of the property change. + * + * @param food the new food value + */ public void setFood(int food) { - int oldFood = this.food; + final int oldFood = this.food; this.food = food; propertyChangeSupport.firePropertyChange("food", oldFood, food); } + /** + * Sets the current water level and notifies listeners of the property change. + * + * @param water the new water value + */ public void setWater(int water) { - int oldWater = this.water; + final int oldWater = this.water; this.water = water; propertyChangeSupport.firePropertyChange("water", oldWater, water); } + /** + * Sets the current population count and notifies listeners of the property change. + * + * @param people the new people count + */ public void setPeople(int people) { - int oldPeople = this.people; + final int oldPeople = this.people; this.people = people; propertyChangeSupport.firePropertyChange("people", oldPeople, people); } + /** + * Sets the current weapon count and notifies listeners of the property change. + * + * @param weapon the new weapon value + */ public void setWeapon(int weapon) { - int oldWeapon = this.weapon; + final int oldWeapon = this.weapon; this.weapon = weapon; propertyChangeSupport.firePropertyChange("weapon", oldWeapon, weapon); } + /** + * Sets the current action count and notifies listeners of the property change. + * + * @param action the new action value + */ public void setAction(int action) { - int oldAction = this.action; + final int oldAction = this.action; this.action = action; propertyChangeSupport.firePropertyChange("action", oldAction, action); } @@ -264,64 +301,66 @@ private void applyLayoutConstraints(SpringLayout layout, Container container, JL JButton rightButton, JButton eventButton, JButton nextDayButton, JButton infoButton) { // Position resource labels - layout.putConstraint(SpringLayout.WEST, dayLabel, 20, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, dayLabel, 20, SpringLayout.NORTH, container); + layout.putConstraint(SpringLayout.WEST, dayLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, dayLabel, Constants.TWENTY, SpringLayout.NORTH, container); - layout.putConstraint(SpringLayout.WEST, foodLabel, 20, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, foodLabel, 20, SpringLayout.SOUTH, dayLabel); + layout.putConstraint(SpringLayout.WEST, foodLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, foodLabel, Constants.TWENTY, SpringLayout.SOUTH, dayLabel); - layout.putConstraint(SpringLayout.WEST, waterLabel, 20, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, waterLabel, 20, SpringLayout.SOUTH, foodLabel); + layout.putConstraint(SpringLayout.WEST, waterLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, waterLabel, Constants.TWENTY, SpringLayout.SOUTH, foodLabel); - layout.putConstraint(SpringLayout.WEST, peopleLabel, 20, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, peopleLabel, 20, SpringLayout.SOUTH, waterLabel); + layout.putConstraint(SpringLayout.WEST, peopleLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, peopleLabel, Constants.TWENTY, SpringLayout.SOUTH, waterLabel); - layout.putConstraint(SpringLayout.WEST, weaponLabel, 20, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, weaponLabel, 20, SpringLayout.SOUTH, peopleLabel); + layout.putConstraint(SpringLayout.WEST, weaponLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, weaponLabel, Constants.TWENTY, SpringLayout.SOUTH, peopleLabel); - layout.putConstraint(SpringLayout.WEST, actionAvailableLabel, 20, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, actionAvailableLabel, 20, SpringLayout.SOUTH, weaponLabel); + layout.putConstraint(SpringLayout.WEST, actionAvailableLabel, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, actionAvailableLabel, Constants.TWENTY, SpringLayout.SOUTH, + weaponLabel); // Position minimap - layout.putConstraint(SpringLayout.EAST, mapPanel, -20, SpringLayout.EAST, container); - layout.putConstraint(SpringLayout.NORTH, mapPanel, 20, SpringLayout.NORTH, container); + layout.putConstraint(SpringLayout.EAST, mapPanel, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, mapPanel, Constants.TWENTY, SpringLayout.NORTH, container); // Position info box - layout.putConstraint(SpringLayout.EAST, infoBox, 20, SpringLayout.EAST, container); - layout.putConstraint(SpringLayout.NORTH, infoBox, 20, SpringLayout.NORTH, container); + layout.putConstraint(SpringLayout.EAST, infoBox, Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, infoBox, Constants.TWENTY, SpringLayout.NORTH, container); // Position buttons - layout.putConstraint(SpringLayout.WEST, broadcastButton, 20, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, broadcastButton, 20, SpringLayout.SOUTH, actionAvailableLabel); + layout.putConstraint(SpringLayout.WEST, broadcastButton, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, broadcastButton, Constants.TWENTY, SpringLayout.SOUTH, + actionAvailableLabel); - layout.putConstraint(SpringLayout.WEST, gatherButton, 20, SpringLayout.EAST, broadcastButton); + layout.putConstraint(SpringLayout.WEST, gatherButton, Constants.TWENTY, SpringLayout.EAST, broadcastButton); layout.putConstraint(SpringLayout.NORTH, gatherButton, 0, SpringLayout.NORTH, broadcastButton); - layout.putConstraint(SpringLayout.WEST, upButton, 20, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, upButton, 20, SpringLayout.SOUTH, broadcastButton); + layout.putConstraint(SpringLayout.WEST, upButton, Constants.TWENTY, SpringLayout.WEST, container); + layout.putConstraint(SpringLayout.NORTH, upButton, Constants.TWENTY, SpringLayout.SOUTH, broadcastButton); - layout.putConstraint(SpringLayout.WEST, downButton, 20, SpringLayout.EAST, upButton); + layout.putConstraint(SpringLayout.WEST, downButton, Constants.TWENTY, SpringLayout.EAST, upButton); layout.putConstraint(SpringLayout.NORTH, downButton, 0, SpringLayout.NORTH, upButton); - layout.putConstraint(SpringLayout.WEST, leftButton, 20, SpringLayout.EAST, downButton); + layout.putConstraint(SpringLayout.WEST, leftButton, Constants.TWENTY, SpringLayout.EAST, downButton); layout.putConstraint(SpringLayout.NORTH, leftButton, 0, SpringLayout.NORTH, upButton); - layout.putConstraint(SpringLayout.WEST, rightButton, 20, SpringLayout.EAST, leftButton); + layout.putConstraint(SpringLayout.WEST, rightButton, Constants.TWENTY, SpringLayout.EAST, leftButton); layout.putConstraint(SpringLayout.NORTH, rightButton, 0, SpringLayout.NORTH, upButton); - layout.putConstraint(SpringLayout.WEST, eventButton, 20, SpringLayout.EAST, gatherButton); + layout.putConstraint(SpringLayout.WEST, eventButton, Constants.TWENTY, SpringLayout.EAST, gatherButton); layout.putConstraint(SpringLayout.NORTH, eventButton, 0, SpringLayout.NORTH, broadcastButton); - layout.putConstraint(SpringLayout.WEST, nextDayButton, 20, SpringLayout.EAST, eventButton); + layout.putConstraint(SpringLayout.WEST, nextDayButton, Constants.TWENTY, SpringLayout.EAST, eventButton); layout.putConstraint(SpringLayout.NORTH, nextDayButton, 0, SpringLayout.NORTH, broadcastButton); - layout.putConstraint(SpringLayout.WEST, infoButton, 20, SpringLayout.EAST, rightButton); + layout.putConstraint(SpringLayout.WEST, infoButton, Constants.TWENTY, SpringLayout.EAST, rightButton); layout.putConstraint(SpringLayout.NORTH, infoButton, 0, SpringLayout.NORTH, upButton); } @Override public void propertyChange(PropertyChangeEvent evt) { - String propertyName = evt.getPropertyName(); + final String propertyName = evt.getPropertyName(); switch (propertyName) { case "day": From adf7dc5c64512e7c6b95ad6ccf901c33d09a76a7 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Mon, 2 Dec 2024 13:56:38 -0700 Subject: [PATCH 114/154] Newday Logic applied --- src/main/java/app/GameMainApplication.java | 10 +- src/main/java/entities/EntityConstants.java | 8 +- .../database/InMemoryUnifiedDataAccess.java | 5 + .../gamenewday/NewdayInterface.java | 7 +- .../gamenewday/NewdayPresenter.java | 4 +- .../gamenewday/NewdayDataAccessInterface.java | 14 ++ .../usecases/gamenewday/NewdayInteractor.java | 160 ++++++++++-------- src/main/java/view/GameView.java | 42 ++++- 8 files changed, 160 insertions(+), 90 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 60029b907..604256f47 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -33,6 +33,8 @@ import interface_adapters.fetchcurrentevent.FetchEventPresenter; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchPresenter; +import interface_adapters.gamenewday.NewdayController; +import interface_adapters.gamenewday.NewdayPresenter; import interface_adapters.gameplacedescription.PlaceDescriptionController; import interface_adapters.gameplacedescription.PlaceDescriptionPresenter; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; @@ -58,6 +60,7 @@ import usecases.eventrespond.trader.TraderEventInteractor; import usecases.fetchcurrentevent.CurrentEventInteractor; import usecases.fetchresource.FetchInteractor; +import usecases.gamenewday.NewdayInteractor; import usecases.gameplacedescription.PlaceDescriptionInteractor; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; import usecases.nevagategame.NevagateGameInteractor; @@ -241,12 +244,17 @@ public static void main(String[] args) { final NevagateGameInteractor nevagateGameInteractor = new NevagateGameInteractor(gamedatabase, nevagateGamePresenter); final NevagateGameController nevagateGameController = new NevagateGameController(nevagateGameInteractor); + + // Newday Game usecase + final NewdayPresenter newdayPresenter = new NewdayPresenter(gameView); + final NewdayInteractor newdayInteractor = new NewdayInteractor(gamedatabase, newdayPresenter); + final NewdayController newdayController = new NewdayController(newdayInteractor); // Event respond usecase // Example of how to use the endGame method // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); gameView.setController(fetchController, broadcastController, placeDescriptionController, dailyGatherController, dailyMoveController, - nevagateEventController, eventDecideController); + nevagateEventController, eventDecideController, newdayController); attributeview.setAllowcateController(allowcateController, nevagateMainController); eventView.setController(eventInitializerController, fetchEventController, nevagateGameController); eventView.setManager(eventManager); diff --git a/src/main/java/entities/EntityConstants.java b/src/main/java/entities/EntityConstants.java index 7a3dff02a..866da2ac7 100644 --- a/src/main/java/entities/EntityConstants.java +++ b/src/main/java/entities/EntityConstants.java @@ -57,8 +57,8 @@ public class EntityConstants { public static final int FOURTHCHOICE = 4; // Base event probability (probability at default at start). - public static final double COMMONEVENTBASEPROB = 1; - public static final double RAREEVENTBASEPROB = 1; + public static final double COMMONEVENTBASEPROB = 0.1; + public static final double RAREEVENTBASEPROB = 0.05; // Horde starter setting. public static final int STARTERHORDEMAGNITUDE = 3000; @@ -79,9 +79,9 @@ public class EntityConstants { public static final double PEOPLEBASEDEATHRATE = 0.05; // Newday resource gain module - public static final double PEOPLEGAINPERFOOD = 0.9; + public static final double PEOPLEGAINPERFOOD = 0.4; public static final double PEOPLEGAINPERWEAPON = 0.04; - public static final double PEOPLEGAINPERWATER = 0.9; + public static final double PEOPLEGAINPERWATER = 0.4; public static final double PEOPLEBASEJOINRATE = 0.04; public static final double WEAPONBASELOSERATE = 0.04; diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index 38dd8d7a9..f911e15f2 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -148,6 +148,11 @@ public void setDecidedEvents(ArrayList decidedevents) { this.unprocessedevents = new ArrayList<>(decidedevents); } + @Override + public ArrayList getUnprocessedEvents() { + return unprocessedevents; + } + @Override public Location getLocation() { return currentLocation; diff --git a/src/main/java/interface_adapters/gamenewday/NewdayInterface.java b/src/main/java/interface_adapters/gamenewday/NewdayInterface.java index 33b56a4b5..79a87fb08 100644 --- a/src/main/java/interface_adapters/gamenewday/NewdayInterface.java +++ b/src/main/java/interface_adapters/gamenewday/NewdayInterface.java @@ -8,12 +8,9 @@ public interface NewdayInterface { /** * Update the view by providing message to the textbox, update the 4 resource representation. * @param message message for what happened in a new day. - * @param food update food change. - * @param water update water change. - * @param people update people change. - * @param weapon update weapon change. + */ - void updateUiNewday(String message, int food, int water, int people, int weapon); + void updateUiNewday(String message); /** * If usecase failed, for example is already day 60 and this button was click, show reason why, don't change diff --git a/src/main/java/interface_adapters/gamenewday/NewdayPresenter.java b/src/main/java/interface_adapters/gamenewday/NewdayPresenter.java index b538a3117..9b196afe4 100644 --- a/src/main/java/interface_adapters/gamenewday/NewdayPresenter.java +++ b/src/main/java/interface_adapters/gamenewday/NewdayPresenter.java @@ -15,11 +15,11 @@ public NewdayPresenter(NewdayInterface view) { @Override public void prepareSuccessView(NewdayOutputData outputData) { - + view.updateUiNewday(outputData.getMessage()); } @Override public void prepareFailureView(String errorMessage) { - + view.failureNewday(errorMessage); } } diff --git a/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java b/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java index 5afae896f..85c5e82ae 100644 --- a/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java +++ b/src/main/java/usecases/gamenewday/NewdayDataAccessInterface.java @@ -2,6 +2,8 @@ import entities.*; +import java.util.ArrayList; + /** * Newday data access, require player's info because we care and need to update days and score. * Require inventory because this part is for updating recources, how many lose, how many found depended on people num. @@ -73,4 +75,16 @@ public interface NewdayDataAccessInterface { * @return return the description of the horde. */ Horde getHorde(); + + /** + * Reset to 3 action point. + * @param actionPoints action points. + */ + void setActionPoint(int actionPoints); + + /** + * Get unprocessed events to see if player is capable of skipping. + * @return unprocessed events. + */ + ArrayList getUnprocessedEvents(); } diff --git a/src/main/java/usecases/gamenewday/NewdayInteractor.java b/src/main/java/usecases/gamenewday/NewdayInteractor.java index fbbef23d1..97009a8b9 100644 --- a/src/main/java/usecases/gamenewday/NewdayInteractor.java +++ b/src/main/java/usecases/gamenewday/NewdayInteractor.java @@ -21,97 +21,117 @@ public void execute(NewdayInputData inputdata) { final int people = newdayDataAccessObject.getInventory().getPeople(); final double temp = newdayDataAccessObject.getLocation().gettemperature(); final int score = newdayDataAccessObject.getPlayerInfo().getScore(); + // Message builder for day summary final StringBuilder messageBuilder = new StringBuilder("Another day has passed. Here's what happened:\n"); boolean success = true; - String failmessage = ""; - if (newdayDataAccessObject.getPlayerInfo().getDaysSurvived() >= EntityConstants.MAXNUMDAY) { + String failMessage = ""; + + // 1. Fail if there are unfinished events + if (!newdayDataAccessObject.getUnprocessedEvents().isEmpty()) { success = false; + failMessage = "There are unfinished events. You must address them before starting a new day."; } - // Process resource changes and build the message - if (success && newdayDataAccessObject.getPlayerInfo().getDaysSurvived() < EntityConstants.MAXNUMDAY - 1) { - incrementresouce(messageBuilder, people, score); - decrementresource(messageBuilder, thrift, people, temp); - final NewdayOutputData outputdata = new NewdayOutputData(messageBuilder.toString(), success, failmessage); - newdayOutputBoundary.prepareSuccessView(outputdata); + // 2. Fail if the maximum day has been reached or exceeded + else if (newdayDataAccessObject.getPlayerInfo().getDaysSurvived() >= EntityConstants.MAXNUMDAY) { + success = false; + failMessage = "You have reached the maximum number of days. The game is over."; } - else if (success) { - final double temperature = newdayDataAccessObject.getLocation().gettemperature(); - final double threat = newdayDataAccessObject.getLocation().getthreatlevel(); - messageBuilder.append(newdayDataAccessObject.getHorde().getDescription(threat, temperature)); - final NewdayOutputData outputdata = new NewdayOutputData(messageBuilder.toString(), success, failmessage); - newdayOutputBoundary.prepareSuccessView(outputdata); + + if (success) { + // 3. If days survived is less than 59, apply resource gain/loss logic + if (newdayDataAccessObject.getPlayerInfo().getDaysSurvived() < EntityConstants.MAXNUMDAY - 1) { + applyResourceChanges(messageBuilder, thrift, people, temp, score); + } + // 4. If it's day 59, display the horde description logic + else { + final double temperature = newdayDataAccessObject.getLocation().gettemperature(); + final double threat = newdayDataAccessObject.getLocation().getthreatlevel(); + messageBuilder.append(newdayDataAccessObject.getHorde().getDescription(threat, temperature)); + } + + // Update state and prepare success output + final NewdayOutputData outputData = new NewdayOutputData(messageBuilder.toString(), true, ""); + newdayOutputBoundary.prepareSuccessView(outputData); + + // Update player state for the new day + newdayDataAccessObject.setActionPoint(EntityConstants.STARTERACTIONPOINT); + newdayDataAccessObject.setDaysSurvived(newdayDataAccessObject.getPlayerInfo().getDaysSurvived() + 1); } else { - failmessage = "Day exceeded failure."; - newdayOutputBoundary.prepareFailureView(failmessage); + // Prepare failure output + newdayOutputBoundary.prepareFailureView(failMessage); } } - private void incrementresouce(StringBuilder messageBuilder, int people, int score) { - // food gain - final double foodscalar = newdayDataAccessObject.getLocation().getfoodresourceavailable(); - final double foodgain = people * EntityConstants.PEOPLEGAINPERFOOD * foodscalar; - newdayDataAccessObject.changeFood((int) foodgain); + private void applyResourceChanges(StringBuilder messageBuilder, int thrift, int people, double temp, int score) { + incrementResources(messageBuilder, people, score); + decrementResources(messageBuilder, thrift, people, temp); + } - messageBuilder.append(" - Food gained: ").append((int) foodgain).append(EntityConstants.NEWLINE); + private void incrementResources(StringBuilder messageBuilder, int people, int score) { + // Food gain + final double foodScalar = newdayDataAccessObject.getLocation().getfoodresourceavailable(); + final double foodGain = people * EntityConstants.PEOPLEGAINPERFOOD * foodScalar; + newdayDataAccessObject.changeFood((int) foodGain); + messageBuilder.append(" - Food gained: ").append((int) foodGain).append(EntityConstants.NEWLINE); - // water gain - final double waterscalar = newdayDataAccessObject.getLocation().getwaterresourceavailable(); - final double watergain = people * EntityConstants.PEOPLEGAINPERWATER * waterscalar; - newdayDataAccessObject.changeWater((int) watergain); - messageBuilder.append(" - Water gained: ").append((int) watergain).append(EntityConstants.NEWLINE); - int newscore = score + (int) foodgain; - newscore = newscore + (int) watergain; + // Water gain + final double waterScalar = newdayDataAccessObject.getLocation().getwaterresourceavailable(); + final double waterGain = people * EntityConstants.PEOPLEGAINPERWATER * waterScalar; + newdayDataAccessObject.changeWater((int) waterGain); + messageBuilder.append(" - Water gained: ").append((int) waterGain).append(EntityConstants.NEWLINE); - // people gain - final double peoplegain = people * (EntityConstants.PEOPLEBASEJOINRATE + int newScore = score + (int) foodGain + (int) waterGain; + + // People gain + final double peopleGain = people * (EntityConstants.PEOPLEBASEJOINRATE * newdayDataAccessObject.getLocation().getpeopleresourceavailable()); - newdayDataAccessObject.changePeople((int) peoplegain); - messageBuilder.append(" - New members joined: ").append((int) peoplegain).append(EntityConstants.NEWLINE); - newscore = newscore + (int) peoplegain; - - // weaponry gain - double weapongain = peoplegain + people * EntityConstants.PEOPLEGAINPERWEAPON; - weapongain = weapongain * newdayDataAccessObject.getLocation().getweaponresourceavailable(); - newdayDataAccessObject.changeWeapon((int) weapongain); - messageBuilder.append(" - Weaponry gained: ").append((int) weapongain).append(EntityConstants.NEWLINE); - newscore = newscore + (int) weapongain; - newscore = newscore + EntityConstants.NEWDAYSCORE; - newdayDataAccessObject.setScore(newscore); + newdayDataAccessObject.changePeople((int) peopleGain); + messageBuilder.append(" - New members joined: ").append((int) peopleGain).append(EntityConstants.NEWLINE); + newScore += (int) peopleGain; + + // Weaponry gain + double weaponGain = peopleGain + people * EntityConstants.PEOPLEGAINPERWEAPON; + weaponGain = weaponGain * newdayDataAccessObject.getLocation().getweaponresourceavailable(); + newdayDataAccessObject.changeWeapon((int) weaponGain); + messageBuilder.append(" - Weaponry gained: ").append((int) weaponGain).append(EntityConstants.NEWLINE); + + newScore += (int) weaponGain + EntityConstants.NEWDAYSCORE; + + newdayDataAccessObject.setScore(newScore); } - private void decrementresource(StringBuilder messageBuilder, int thrift, int people, double temp) { - // food loss - final double basetemp = EntityConstants.DEFAULTTEMP; - final double tempdiff = temp - basetemp; - double foodloss = people * EntityConstants.PEOPLELOSSPERFOOD; - if (tempdiff < 0) { - foodloss += Math.abs(tempdiff); + private void decrementResources(StringBuilder messageBuilder, int thrift, int people, double temp) { + // Food loss + final double baseTemp = EntityConstants.DEFAULTTEMP; + final double tempDiff = temp - baseTemp; + double foodLoss = people * EntityConstants.PEOPLELOSSPERFOOD; + if (tempDiff < 0) { + foodLoss += Math.abs(tempDiff); } - foodloss = foodloss * (1 - thrift * EntityConstants.THRIFTIMPACTRESOURCELOSS); - newdayDataAccessObject.changeFood((int) foodloss * -1); - messageBuilder.append(" - Food lost: ").append((int) foodloss).append(EntityConstants.NEWLINE); - - // water loss - double waterloss = people * EntityConstants.PEOPLELOSSPERWATER; - if (tempdiff > 0) { - waterloss += Math.abs(tempdiff); + foodLoss = foodLoss * (1 - thrift * EntityConstants.THRIFTIMPACTRESOURCELOSS); + newdayDataAccessObject.changeFood((int) foodLoss * -1); + messageBuilder.append(" - Food lost: ").append((int) foodLoss).append(EntityConstants.NEWLINE); + + // Water loss + double waterLoss = people * EntityConstants.PEOPLELOSSPERWATER; + if (tempDiff > 0) { + waterLoss += Math.abs(tempDiff); } - waterloss = waterloss * (1 - thrift * EntityConstants.THRIFTIMPACTRESOURCELOSS); - newdayDataAccessObject.changeWater((int) waterloss * -1); - messageBuilder.append(" - Water lost: ").append((int) waterloss).append(EntityConstants.NEWLINE); + waterLoss = waterLoss * (1 - thrift * EntityConstants.THRIFTIMPACTRESOURCELOSS); + newdayDataAccessObject.changeWater((int) waterLoss * -1); + messageBuilder.append(" - Water lost: ").append((int) waterLoss).append(EntityConstants.NEWLINE); - // people loss - final double peopleloss = people * (EntityConstants.PEOPLEBASEDEATHRATE + // People loss + final double peopleLoss = people * (EntityConstants.PEOPLEBASEDEATHRATE * newdayDataAccessObject.getLocation().getthreatlevel()); - newdayDataAccessObject.changePeople((int) peopleloss * -1); - messageBuilder.append(" - People lost: ").append((int) peopleloss).append(EntityConstants.NEWLINE); + newdayDataAccessObject.changePeople((int) peopleLoss * -1); + messageBuilder.append(" - People lost: ").append((int) peopleLoss).append(EntityConstants.NEWLINE); - // weaponry loss - final double weaponloss = peopleloss * (1 - thrift * EntityConstants.THRIFTIMPACTRESOURCELOSS); - newdayDataAccessObject.changeWeapon((int) weaponloss * -1); - messageBuilder.append(" - Weaponry lost: ").append((int) weaponloss).append(EntityConstants.NEWLINE); + // Weaponry loss + final double weaponLoss = peopleLoss * (1 - thrift * EntityConstants.THRIFTIMPACTRESOURCELOSS); + newdayDataAccessObject.changeWeapon((int) weaponLoss * -1); + messageBuilder.append(" - Weaponry lost: ").append((int) weaponLoss).append(EntityConstants.NEWLINE); } - } diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index c28f89f8d..7e2e68f62 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -10,6 +10,8 @@ import interface_adapters.eventdecide.EventDecideInterface; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchInterface; +import interface_adapters.gamenewday.NewdayController; +import interface_adapters.gamenewday.NewdayInterface; import interface_adapters.gameplacedescription.PlaceDescriptionController; import interface_adapters.gameplacedescription.PlaceDescriptionInterface; import interface_adapters.nevagateevent.NevagateEventController; @@ -24,7 +26,7 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInterface, BroadcastInterface, PlaceDescriptionInterface, DailyGatherInterface, DailyMoveInterface, - EventDecideInterface, NevagateEventInterface { + EventDecideInterface, NevagateEventInterface, NewdayInterface { private int day; private int food; private int water; @@ -50,6 +52,7 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInt private DailyMoveController dailyMoveController; private EventDecideController eventDecideController; private NevagateEventController nevagateEventController; + private NewdayController newdayController; private final PropertyChangeSupport propertyChangeSupport; @@ -165,7 +168,8 @@ public GameView() { }); nextDayButton.addActionListener(e -> { - eventDecideController.execute(); + newdayController.execute(); + fetchController.execute(); }); // Add ActionListeners @@ -194,7 +198,7 @@ public void setController(FetchController fetchController, BroadcastController b PlaceDescriptionController placeDescriptionController, DailyGatherController dailyGatherController, DailyMoveController dailyMoveController, NevagateEventController nevagateEventController, - EventDecideController eventDecideController) { + EventDecideController eventDecideController, NewdayController newdayController) { this.fetchController = fetchController; this.broadcastController = broadcastController; this.placeDescriptionController = placeDescriptionController; @@ -202,6 +206,7 @@ public void setController(FetchController fetchController, BroadcastController b this.dailyMoveController = dailyMoveController; this.nevagateEventController = nevagateEventController; this.eventDecideController = eventDecideController; + this.newdayController = newdayController; } public void render() { @@ -361,7 +366,7 @@ public void updateUiResource(int food, int water, int people, int weapon, int da @Override public void updateUiBroadcast(String message) { if (infoBox != null) { - infoBox.append(message + "\n"); + infoBox.append(message + "\n\n"); infoBox.setCaretPosition(infoBox.getDocument().getLength()); } } @@ -379,7 +384,7 @@ public void failureBroadcast(String errorMessage) { @Override public void updateUiGather(String message) { if (infoBox != null) { - infoBox.append(message + "\n"); + infoBox.append(message + "\n\n"); infoBox.setCaretPosition(infoBox.getDocument().getLength()); } } @@ -397,7 +402,7 @@ public void failureGather(String message) { @Override public void updateUiMove(String message) { if (infoBox != null) { - infoBox.append(message + "\n"); + infoBox.append(message + "\n\n"); infoBox.setCaretPosition(infoBox.getDocument().getLength()); } } @@ -415,7 +420,7 @@ public void failureMove(String errormessage) { @Override public void updateUiPlaceDescription(String placeDescription) { if (infoBox != null) { - infoBox.append(placeDescription + "\n"); + infoBox.append(placeDescription + "\n\n"); infoBox.setCaretPosition(infoBox.getDocument().getLength()); } } @@ -435,7 +440,7 @@ public void updateUiEventDecide(ArrayList eventNames) { if (infoBox != null) { if (eventNames.isEmpty()) { // No events - infoBox.append("No events happened today.\n"); + infoBox.append("No events happened today.\n\n"); } else { // Display the events @@ -467,4 +472,25 @@ public void failureNevagateEvent(String message) { JOptionPane.ERROR_MESSAGE ); } + + @Override + public void updateUiNewday(String message) { + // only message is needed. + if (infoBox != null) { + infoBox.append(message + "\n\n"); + System.out.println("newday message prointed"); + infoBox.setCaretPosition(infoBox.getDocument().getLength()); + } + eventDecideController.execute(); + } + + @Override + public void failureNewday(String message) { + JOptionPane.showMessageDialog( + this, + message, + "Unable to go to next day!", + JOptionPane.ERROR_MESSAGE + ); + } } From 12ab0a37a10f97faf51a84858cb437e4b9cfa9d4 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Mon, 2 Dec 2024 14:29:16 -0700 Subject: [PATCH 115/154] Minimap completed --- src/main/java/app/GameMainApplication.java | 10 ++++- src/main/java/view/GameView.java | 49 +++++++++++++++++++++- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 604256f47..8c1f103c5 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -33,6 +33,8 @@ import interface_adapters.fetchcurrentevent.FetchEventPresenter; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchPresenter; +import interface_adapters.gameminimap.MinimapController; +import interface_adapters.gameminimap.MinimapPresenter; import interface_adapters.gamenewday.NewdayController; import interface_adapters.gamenewday.NewdayPresenter; import interface_adapters.gameplacedescription.PlaceDescriptionController; @@ -60,6 +62,7 @@ import usecases.eventrespond.trader.TraderEventInteractor; import usecases.fetchcurrentevent.CurrentEventInteractor; import usecases.fetchresource.FetchInteractor; +import usecases.gameminimap.MinimapInteractor; import usecases.gamenewday.NewdayInteractor; import usecases.gameplacedescription.PlaceDescriptionInteractor; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; @@ -249,12 +252,17 @@ public static void main(String[] args) { final NewdayPresenter newdayPresenter = new NewdayPresenter(gameView); final NewdayInteractor newdayInteractor = new NewdayInteractor(gamedatabase, newdayPresenter); final NewdayController newdayController = new NewdayController(newdayInteractor); + + // Minimap update usecase + final MinimapPresenter minimapPresenter = new MinimapPresenter(gameView); + final MinimapInteractor minimapInteractor = new MinimapInteractor(gamedatabase, minimapPresenter); + final MinimapController minimapController = new MinimapController(minimapInteractor); // Event respond usecase // Example of how to use the endGame method // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); gameView.setController(fetchController, broadcastController, placeDescriptionController, dailyGatherController, dailyMoveController, - nevagateEventController, eventDecideController, newdayController); + nevagateEventController, eventDecideController, newdayController, minimapController); attributeview.setAllowcateController(allowcateController, nevagateMainController); eventView.setController(eventInitializerController, fetchEventController, nevagateGameController); eventView.setManager(eventManager); diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 7e2e68f62..bed3a0f8f 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -10,6 +10,8 @@ import interface_adapters.eventdecide.EventDecideInterface; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchInterface; +import interface_adapters.gameminimap.MinimapController; +import interface_adapters.gameminimap.MinimapInterface; import interface_adapters.gamenewday.NewdayController; import interface_adapters.gamenewday.NewdayInterface; import interface_adapters.gameplacedescription.PlaceDescriptionController; @@ -26,7 +28,7 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInterface, BroadcastInterface, PlaceDescriptionInterface, DailyGatherInterface, DailyMoveInterface, - EventDecideInterface, NevagateEventInterface, NewdayInterface { + EventDecideInterface, NevagateEventInterface, NewdayInterface, MinimapInterface { private int day; private int food; private int water; @@ -53,6 +55,7 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInt private EventDecideController eventDecideController; private NevagateEventController nevagateEventController; private NewdayController newdayController; + private MinimapController minimapController; private final PropertyChangeSupport propertyChangeSupport; @@ -146,21 +149,25 @@ public GameView() { upButton.addActionListener(e -> { dailyMoveController.execute("up"); fetchController.execute(); + minimapController.execute(); }); downButton.addActionListener(e -> { dailyMoveController.execute("down"); fetchController.execute(); + minimapController.execute(); }); leftButton.addActionListener(e -> { dailyMoveController.execute("left"); fetchController.execute(); + minimapController.execute(); }); rightButton.addActionListener(e -> { dailyMoveController.execute("right"); fetchController.execute(); + minimapController.execute(); }); eventButton.addActionListener(e -> { @@ -198,7 +205,8 @@ public void setController(FetchController fetchController, BroadcastController b PlaceDescriptionController placeDescriptionController, DailyGatherController dailyGatherController, DailyMoveController dailyMoveController, NevagateEventController nevagateEventController, - EventDecideController eventDecideController, NewdayController newdayController) { + EventDecideController eventDecideController, NewdayController newdayController, + MinimapController minimapController) { this.fetchController = fetchController; this.broadcastController = broadcastController; this.placeDescriptionController = placeDescriptionController; @@ -207,11 +215,13 @@ public void setController(FetchController fetchController, BroadcastController b this.nevagateEventController = nevagateEventController; this.eventDecideController = eventDecideController; this.newdayController = newdayController; + this.minimapController = minimapController; } public void render() { placeDescriptionController.execute(); fetchController.execute(); + minimapController.execute(); setVisible(true); } @@ -324,6 +334,41 @@ private void applyLayoutConstraints(SpringLayout layout, Container container, JL layout.putConstraint(SpringLayout.NORTH, infoButton, 0, SpringLayout.NORTH, upButton); } + @Override + public void updateUiMinimap(ArrayList> grid) { + // Validate input + if (grid == null || grid.isEmpty() || grid.get(0).isEmpty()) { + mapPanel.setText("Invalid map data."); + return; + } + + final int rows = grid.size(); + final int cols = grid.get(0).size(); + + // Find the center and set a marker (e.g., @) for the player's position + final int centerRow = rows / 2; + final int centerCol = cols / 2; + + StringBuilder mapBuilder = new StringBuilder(); + + for (int r = 0; r < rows; r++) { + for (int c = 0; c < cols; c++) { + if (r == centerRow && c == centerCol) { + mapBuilder.append("@ "); + } else { + mapBuilder.append(grid.get(r).get(c)).append(" "); + } + } + mapBuilder.append("\n"); + } + + // Set text to mapPanel with fixed font and centered scroll + mapPanel.setFont(new Font("Monospaced", Font.PLAIN, 12)); + mapPanel.setText(mapBuilder.toString()); + mapPanel.setCaretPosition(0); + } + + @Override public void propertyChange(PropertyChangeEvent evt) { String propertyName = evt.getPropertyName(); From d156f30497a73c4b1cedb7ef6ff981c09dafcb06 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Mon, 2 Dec 2024 17:29:21 -0500 Subject: [PATCH 116/154] Update the ranking connection to the ranking view --- src/main/java/view/LoginView.java | 3 +- src/main/java/view/MainView.java | 14 ++- src/main/java/view/RankingView.java | 156 ++++++++++++++++------------ src/main/java/view/SignUpView.java | 1 + 4 files changed, 103 insertions(+), 71 deletions(-) diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index 9ddd03b1f..b10721710 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -83,6 +83,7 @@ public LoginView() throws IOException { setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); + setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); setVisible(true); } @@ -122,7 +123,7 @@ public void displayLoginResult(String message) { // Close login window dispose(); // Navigate to the game view - MainView mainView = new MainView(); + final MainView mainView = new MainView(); mainView.render(); } } diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index 7e80c6977..498bfa16f 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -1,10 +1,15 @@ package view; +import app.RankingApplication; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; -import interface_adapters.startallowcatepoint.AllowcateController; +import interface_adapters.rankinglist.RankingInterface; +import interface_adapters.rankinglist.RankingController; import javax.swing.*; import java.awt.*; +import java.io.IOException; +import java.util.List; + /** * Main view. */ @@ -18,7 +23,6 @@ public class MainView extends JFrame { @SuppressWarnings({"checkstyle:MultipleStringLiterals", "checkstyle:SuppressWarnings"}) public MainView() { - super("Main Menu"); // Set layout and container final Container container = getContentPane(); final SpringLayout layout = new SpringLayout(); @@ -68,6 +72,7 @@ public MainView() { // Set window properties (moved to render()) setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); + setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); } public void setNevagateAllowcateController(NevagateAllowcateController nevagateAllowcateController) { @@ -84,7 +89,10 @@ private void addListeners() { // Switch to RankView when "Ranking" is clicked rankingButton.addActionListener(e -> { - + // Close MainView + dispose(); + final RankingView rankingView = new RankingView(); + rankingView.render(); }); // Exit the game when "Quit" is clicked diff --git a/src/main/java/view/RankingView.java b/src/main/java/view/RankingView.java index 8274927cf..8b52cb6b0 100644 --- a/src/main/java/view/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -1,98 +1,120 @@ package view; -import org.jetbrains.annotations.NotNull; +import app.LoginApplication; +import app.RankingApplication; +import interface_adapters.rankinglist.RankingController; +import interface_adapters.rankinglist.RankingInterface; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.io.IOException; +import java.util.List; /** - * Ranking view. + * Ranking view class that implements RankingInterface to display the leaderboard. */ -public class RankingView extends JFrame { +public class RankingView extends JFrame implements RankingInterface { + private final JTable rankingTable; + private final DefaultTableModel tableModel; + private final JLabel errorLabel; + private final RankingController rankingController; + /** + * Constructs the RankingView and sets up the UI components. + * @throws RuntimeException If there is an error initializing the signup application. + */ public RankingView() { - super("Ranking"); - final Container container = getContentPane(); - container.setLayout(new BorderLayout()); + super("Leaderboard"); - final JLabel titleLabel = new JLabel("Ranking", JLabel.CENTER); - titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.THIRTY)); - container.add(titleLabel, BorderLayout.NORTH); - - // JTable example - final String[] columnNames = {"Rank", "Player", "Score"}; - final Object[][] data = new Object[Constants.ONE_HUNDRED][Constants.THREE]; - for (int i = 0; i < Constants.ONE_HUNDRED; i++) { - // Rank - data[i][0] = "No." + (i + 1); - // Player name (example) - data[i][1] = "Player" + (i + 1); - // Random score - data[i][2] = (int) (Math.random() * Constants.ONE_THOUSAND); + try { + this.rankingController = RankingApplication.initializeRanking(this); + } + catch (IOException e) { + throw new RuntimeException(e); } - extracted(data, columnNames, container); - - final JPanel bottomPanel = getjPanel(); - - // Example rank - final JLabel yourRankLabel = new JLabel("Your Rank: No. 10", JLabel.CENTER); - yourRankLabel.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); - bottomPanel.add(yourRankLabel); - - final JPanel buttonPanel = new JPanel(); - buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER, Constants.TWENTY, Constants.TEN)); - - final JButton mainButton = new JButton("Main"); - final JButton quitButton = new JButton("Quit"); - buttonPanel.add(mainButton); - buttonPanel.add(quitButton); + // Main container layout + final Container container = getContentPane(); + container.setLayout(new BorderLayout()); - bottomPanel.add(buttonPanel); + // Title + final JLabel titleLabel = new JLabel("Leaderboard", JLabel.CENTER); + titleLabel.setFont(new Font("Serif", Font.BOLD, 24)); + container.add(titleLabel, BorderLayout.NORTH); - container.add(bottomPanel, BorderLayout.SOUTH); + // Table to display rankings + final String[] columnNames = {"Rank", "Player Name", "Score", "Days Survived", "Status"}; + tableModel = new DefaultTableModel(columnNames, 0); + rankingTable = new JTable(tableModel); + // Make table non-editable + rankingTable.setEnabled(false); + container.add(new JScrollPane(rankingTable), BorderLayout.CENTER); - // Add ActionListeners to buttons - mainButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - dispose(); - new MainView(); - } - }); + // Error label + errorLabel = new JLabel("", JLabel.CENTER); + errorLabel.setForeground(Color.RED); + errorLabel.setFont(new Font("Serif", Font.ITALIC, 16)); + container.add(errorLabel, BorderLayout.SOUTH); - quitButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - System.exit(0); - } - }); + // Fetch and display rankings via the controller + rankingController.handleRanking(Constants.TEN); // Window settings - setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); - setVisible(true); + setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); } - @NotNull - private static JPanel getjPanel() { - final JPanel bottomPanel = new JPanel(); - bottomPanel.setLayout(new GridLayout(Constants.THREE, 1)); - return bottomPanel; + /** + * Displays the leaderboard in the UI. + * + * @param playerNames A list of player names. + * @param scores A list of player scores. + * @param daysSurvived A list of days survived by each player. + * @param statuses A list of statuses indicating if each player won or lost. + */ + @Override + public void displayRankings(List playerNames, List scores, + List daysSurvived, List statuses) { + // Clear any existing rows in the table + tableModel.setRowCount(0); + + // Populate the table with new data + for (int i = 0; i < playerNames.size(); i++) { + tableModel.addRow(new Object[]{ + // Rank + i + 1, + // Player Name + playerNames.get(i), + // Score + scores.get(i), + // Days Survived + daysSurvived.get(i), + // Status (Won/Lost) + statuses.get(i), + }); + } + + // Clear the error message + errorLabel.setText(""); } - private static void extracted(Object[][] data, String[] columnNames, Container container) { - final JTable rankingTable = new JTable(new DefaultTableModel(data, columnNames)); - rankingTable.setEnabled(false); - final JScrollPane scrollPane = new JScrollPane(rankingTable); - container.add(scrollPane, BorderLayout.CENTER); + /** + * Displays an error message in the UI. + * + * @param errorMessage The error message to display. + */ + @Override + public void displayError(String errorMessage) { + JOptionPane.showMessageDialog(this, errorMessage, + "Error", JOptionPane.ERROR_MESSAGE); } + /** + * Renders the ranking view window. + */ public void render() { - setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); setVisible(true); } diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index 6dec8e37a..350a87bd1 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -80,6 +80,7 @@ public SignUpView() throws IOException { // setLocation(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); + setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); setVisible(true); } From dd6b46b944252db35eeaf61ab356f3aaa3057a9c Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Mon, 2 Dec 2024 15:57:14 -0700 Subject: [PATCH 117/154] Lose detect and result, partially finished --- src/main/java/app/GameMainApplication.java | 33 ++++++++++++- .../database/InMemoryUnifiedDataAccess.java | 6 ++- .../gamelosedetecter/LoseController.java | 17 +++++++ .../gamelosedetecter/LoseInterface.java | 6 +++ .../gamelosedetecter/LosePresenter.java | 17 +++++++ .../NevagateGameOverController.java | 23 +++++++++ .../NevagateGameOverInterface.java | 7 +++ .../NevagateGameOverPresenter.java | 21 +++++++++ .../LoseDataAccessInterface.java | 11 +++++ .../gamelosedetecter/LoseInputBoundary.java | 8 ++++ .../gamelosedetecter/LoseInputData.java | 7 +++ .../gamelosedetecter/LoseInteractor.java | 47 +++++++++++++++++++ .../gamelosedetecter/LoseOutputBoundary.java | 8 ++++ .../gamelosedetecter/LoseOutputData.java | 16 +++++++ .../NevagateGameOverDataAccessInterface.java | 7 +++ .../NevagateGameOverInputBoundary.java | 8 ++++ .../NevagateGameOverInputdata.java | 7 +++ .../NevagateGameOverInteractor.java | 21 +++++++++ .../NevagateGameOverOutputBoundary.java | 5 ++ .../NevagateGameOverOutputdata.java | 7 +++ src/main/java/view/GameView.java | 42 +++++++++++++++-- 21 files changed, 317 insertions(+), 7 deletions(-) create mode 100644 src/main/java/interface_adapters/gamelosedetecter/LoseController.java create mode 100644 src/main/java/interface_adapters/gamelosedetecter/LoseInterface.java create mode 100644 src/main/java/interface_adapters/gamelosedetecter/LosePresenter.java create mode 100644 src/main/java/interface_adapters/nevagategameover/NevagateGameOverController.java create mode 100644 src/main/java/interface_adapters/nevagategameover/NevagateGameOverInterface.java create mode 100644 src/main/java/interface_adapters/nevagategameover/NevagateGameOverPresenter.java create mode 100644 src/main/java/usecases/gamelosedetecter/LoseDataAccessInterface.java create mode 100644 src/main/java/usecases/gamelosedetecter/LoseInputBoundary.java create mode 100644 src/main/java/usecases/gamelosedetecter/LoseInputData.java create mode 100644 src/main/java/usecases/gamelosedetecter/LoseInteractor.java create mode 100644 src/main/java/usecases/gamelosedetecter/LoseOutputBoundary.java create mode 100644 src/main/java/usecases/gamelosedetecter/LoseOutputData.java create mode 100644 src/main/java/usecases/nevagategameover/NevagateGameOverDataAccessInterface.java create mode 100644 src/main/java/usecases/nevagategameover/NevagateGameOverInputBoundary.java create mode 100644 src/main/java/usecases/nevagategameover/NevagateGameOverInputdata.java create mode 100644 src/main/java/usecases/nevagategameover/NevagateGameOverInteractor.java create mode 100644 src/main/java/usecases/nevagategameover/NevagateGameOverOutputBoundary.java create mode 100644 src/main/java/usecases/nevagategameover/NevagateGameOverOutputdata.java diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 8c1f103c5..8b473ff07 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -15,6 +15,8 @@ import interface_adapters.dailygather.DailyGatherPresenter; import interface_adapters.dailymove.DailyMoveController; import interface_adapters.dailymove.DailyMovePresenter; +import interface_adapters.endprocesshorde.HordeController; +import interface_adapters.endprocesshorde.HordePresenter; import interface_adapters.eventdecide.EventDecideController; import interface_adapters.eventdecide.EventDecidePresenter; import interface_adapters.eventinitializer.EventInitializerController; @@ -33,6 +35,8 @@ import interface_adapters.fetchcurrentevent.FetchEventPresenter; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchPresenter; +import interface_adapters.gamelosedetecter.LoseController; +import interface_adapters.gamelosedetecter.LosePresenter; import interface_adapters.gameminimap.MinimapController; import interface_adapters.gameminimap.MinimapPresenter; import interface_adapters.gamenewday.NewdayController; @@ -45,6 +49,8 @@ import interface_adapters.nevagateevent.NevagateEventPresenter; import interface_adapters.nevagategame.NevagateGameController; import interface_adapters.nevagategame.NevagateGamePresenter; +import interface_adapters.nevagategameover.NevagateGameOverController; +import interface_adapters.nevagategameover.NevagateGameOverPresenter; import interface_adapters.nevagatemainview.NevagateMainController; import interface_adapters.nevagatemainview.NevagateMainPresenter; import interface_adapters.startallowcatepoint.AllowcateController; @@ -53,6 +59,7 @@ import usecases.dailybroadcast.BroadcastInteractor; import usecases.dailygather.GatherInteractor; import usecases.dailymove.MoveInteractor; +import usecases.endprocesshorde.HordeInteractor; import usecases.eventdecide.DecideEventInteractor; import usecases.eventinitialize.EventInitializeInteractor; import usecases.eventrespond.ambush.AmbushEventInteractor; @@ -62,11 +69,13 @@ import usecases.eventrespond.trader.TraderEventInteractor; import usecases.fetchcurrentevent.CurrentEventInteractor; import usecases.fetchresource.FetchInteractor; +import usecases.gamelosedetecter.LoseInteractor; import usecases.gameminimap.MinimapInteractor; import usecases.gamenewday.NewdayInteractor; import usecases.gameplacedescription.PlaceDescriptionInteractor; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; import usecases.nevagategame.NevagateGameInteractor; +import usecases.nevagategameover.NevagateGameOverInteractor; import usecases.nevagatemain.NevagateMainInteractor; import usecases.startallowcate.AllowcateInteractor; import frameworks.database.JsonRankingDataAccess; @@ -257,12 +266,32 @@ public static void main(String[] args) { final MinimapPresenter minimapPresenter = new MinimapPresenter(gameView); final MinimapInteractor minimapInteractor = new MinimapInteractor(gamedatabase, minimapPresenter); final MinimapController minimapController = new MinimapController(minimapInteractor); - // Event respond usecase + + // Lose detect usecase + final LosePresenter losePresenter = new LosePresenter(gameView); + final LoseInteractor loseInteractor = new LoseInteractor(gamedatabase, losePresenter); + final LoseController loseController = new LoseController(loseInteractor); + + // End process horde usecase + final HordePresenter hordePresenter = new HordePresenter(gameView); + final HordeInteractor hordeInteractor = new HordeInteractor(gamedatabase, hordePresenter); + final HordeController hordeController = new HordeController(hordeInteractor); + + // Navigate Game Over view usecase + final NevagateGameOverPresenter nevagateGameOverPresenter = + new NevagateGameOverPresenter(navigationManager); + final NevagateGameOverInteractor nevagateGameOverInteractor = + new NevagateGameOverInteractor(gamedatabase, nevagateGameOverPresenter); + final NevagateGameOverController nevagateGameOverController = + new NevagateGameOverController(nevagateGameOverInteractor); + + // Example of how to use the endGame method // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); gameView.setController(fetchController, broadcastController, placeDescriptionController, dailyGatherController, dailyMoveController, - nevagateEventController, eventDecideController, newdayController, minimapController); + nevagateEventController, eventDecideController, newdayController, minimapController, loseController, + hordeController, nevagateGameOverController); attributeview.setAllowcateController(allowcateController, nevagateMainController); eventView.setController(eventInitializerController, fetchEventController, nevagateGameController); eventView.setManager(eventManager); diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index f911e15f2..99a8187ed 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -18,11 +18,13 @@ import usecases.eventrespond.trader.TraderDataAccessInterface; import usecases.fetchcurrentevent.CurrentEventDataAccessInterface; import usecases.fetchresource.FetchDataAccessInterface; +import usecases.gamelosedetecter.LoseDataAccessInterface; import usecases.gameminimap.MinimapDataAccessInterface; import usecases.gamenewday.NewdayDataAccessInterface; import usecases.gameplacedescription.PlaceDescriptionDataAccessInterface; import usecases.nevagateAllowcatePage.NevagateAllowcateDataAccessInterface; import usecases.nevagategame.NevagateGameDataAccessInterface; +import usecases.nevagategameover.NevagateGameOverDataAccessInterface; import usecases.nevagatemain.NevagateMainDataAccessInterface; import usecases.startallowcate.AllowcateDataAccessInterface; @@ -50,7 +52,9 @@ public class InMemoryUnifiedDataAccess implements NevagateMainDataAccessInterface, NevagateEventDataAccessInterface, CurrentEventDataAccessInterface, - NevagateGameDataAccessInterface { + NevagateGameDataAccessInterface, + LoseDataAccessInterface, + NevagateGameOverDataAccessInterface { // Shared game data private PlayerAttributes playerAttributes; private Inventory inventory; diff --git a/src/main/java/interface_adapters/gamelosedetecter/LoseController.java b/src/main/java/interface_adapters/gamelosedetecter/LoseController.java new file mode 100644 index 000000000..5d7d60843 --- /dev/null +++ b/src/main/java/interface_adapters/gamelosedetecter/LoseController.java @@ -0,0 +1,17 @@ +package interface_adapters.gamelosedetecter; + +import usecases.gamelosedetecter.LoseInputBoundary; +import usecases.gamelosedetecter.LoseInputData; + +public class LoseController { + private LoseInputBoundary interactor; + + public LoseController(LoseInputBoundary interactor) { + this.interactor = interactor; + } + + public void execute() { + final LoseInputData inputData = new LoseInputData(); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/gamelosedetecter/LoseInterface.java b/src/main/java/interface_adapters/gamelosedetecter/LoseInterface.java new file mode 100644 index 000000000..d813f8a23 --- /dev/null +++ b/src/main/java/interface_adapters/gamelosedetecter/LoseInterface.java @@ -0,0 +1,6 @@ +package interface_adapters.gamelosedetecter; + +public interface LoseInterface { + + void prepareGameOverEarly(String message); +} diff --git a/src/main/java/interface_adapters/gamelosedetecter/LosePresenter.java b/src/main/java/interface_adapters/gamelosedetecter/LosePresenter.java new file mode 100644 index 000000000..7f7defd12 --- /dev/null +++ b/src/main/java/interface_adapters/gamelosedetecter/LosePresenter.java @@ -0,0 +1,17 @@ +package interface_adapters.gamelosedetecter; + +import usecases.gamelosedetecter.LoseOutputBoundary; +import usecases.gamelosedetecter.LoseOutputData; + +public class LosePresenter implements LoseOutputBoundary { + private LoseInterface view; + + public LosePresenter(LoseInterface view) { + this.view = view; + } + + @Override + public void preapareGameoverEarly(LoseOutputData loseOutputData) { + view.prepareGameOverEarly(loseOutputData.getLosedescription()); + } +} diff --git a/src/main/java/interface_adapters/nevagategameover/NevagateGameOverController.java b/src/main/java/interface_adapters/nevagategameover/NevagateGameOverController.java new file mode 100644 index 000000000..68a508303 --- /dev/null +++ b/src/main/java/interface_adapters/nevagategameover/NevagateGameOverController.java @@ -0,0 +1,23 @@ +package interface_adapters.nevagategameover; + +import usecases.nevagategameover.NevagateGameOverInputBoundary; +import usecases.nevagategameover.NevagateGameOverInputdata; + +/** + * Controller for navigate. + */ +public class NevagateGameOverController { + private final NevagateGameOverInputBoundary interactor; + + public NevagateGameOverController(NevagateGameOverInputBoundary interactor) { + this.interactor = interactor; + } + + /** + * Execute this. + */ + public void execute() { + final NevagateGameOverInputdata inputdata = new NevagateGameOverInputdata(); + interactor.execute(inputdata); + } +} diff --git a/src/main/java/interface_adapters/nevagategameover/NevagateGameOverInterface.java b/src/main/java/interface_adapters/nevagategameover/NevagateGameOverInterface.java new file mode 100644 index 000000000..fad7a8c7b --- /dev/null +++ b/src/main/java/interface_adapters/nevagategameover/NevagateGameOverInterface.java @@ -0,0 +1,7 @@ +package interface_adapters.nevagategameover; + +/** + * Not needed. + */ +public interface NevagateGameOverInterface { +} diff --git a/src/main/java/interface_adapters/nevagategameover/NevagateGameOverPresenter.java b/src/main/java/interface_adapters/nevagategameover/NevagateGameOverPresenter.java new file mode 100644 index 000000000..513b14a64 --- /dev/null +++ b/src/main/java/interface_adapters/nevagategameover/NevagateGameOverPresenter.java @@ -0,0 +1,21 @@ +package interface_adapters.nevagategameover; + +import interface_adapters.NavigationManager; +import usecases.nevagategameover.NevagateGameOverOutputBoundary; +import usecases.nevagategameover.NevagateGameOverOutputdata; + +/** + * Nevagate game over view presenter. + */ +public class NevagateGameOverPresenter implements NevagateGameOverOutputBoundary { + private NavigationManager navigationManager; + + public NevagateGameOverPresenter(NavigationManager navigationManager) { + this.navigationManager = navigationManager; + } + + @Override + public void prepareGameOver(NevagateGameOverOutputdata outputdata) { + navigationManager.showGameOverView(); + } +} diff --git a/src/main/java/usecases/gamelosedetecter/LoseDataAccessInterface.java b/src/main/java/usecases/gamelosedetecter/LoseDataAccessInterface.java new file mode 100644 index 000000000..fef2dd75e --- /dev/null +++ b/src/main/java/usecases/gamelosedetecter/LoseDataAccessInterface.java @@ -0,0 +1,11 @@ +package usecases.gamelosedetecter; + +import entities.Inventory; + +/** + * Use player's inventory to decide if they lose, if any is 0. + */ +public interface LoseDataAccessInterface { + Inventory getInventory(); + +} diff --git a/src/main/java/usecases/gamelosedetecter/LoseInputBoundary.java b/src/main/java/usecases/gamelosedetecter/LoseInputBoundary.java new file mode 100644 index 000000000..501bea3bb --- /dev/null +++ b/src/main/java/usecases/gamelosedetecter/LoseInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.gamelosedetecter; + +/** + * Input boundary, execute. + */ +public interface LoseInputBoundary { + void execute(LoseInputData inputData); +} diff --git a/src/main/java/usecases/gamelosedetecter/LoseInputData.java b/src/main/java/usecases/gamelosedetecter/LoseInputData.java new file mode 100644 index 000000000..c1ea62ac7 --- /dev/null +++ b/src/main/java/usecases/gamelosedetecter/LoseInputData.java @@ -0,0 +1,7 @@ +package usecases.gamelosedetecter; + +/** + * Not needed. + */ +public class LoseInputData { +} diff --git a/src/main/java/usecases/gamelosedetecter/LoseInteractor.java b/src/main/java/usecases/gamelosedetecter/LoseInteractor.java new file mode 100644 index 000000000..a9099246b --- /dev/null +++ b/src/main/java/usecases/gamelosedetecter/LoseInteractor.java @@ -0,0 +1,47 @@ +package usecases.gamelosedetecter; + +import entities.Inventory; + +/** + * Interface for lose check. + */ +public class LoseInteractor implements LoseInputBoundary { + private LoseDataAccessInterface dataaccess; + private LoseOutputBoundary outputBoundary; + + public LoseInteractor(LoseDataAccessInterface dataaccess, LoseOutputBoundary outputBoundary) { + this.dataaccess = dataaccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(LoseInputData inputData) { + String loseMessage = ""; + final Inventory inventory = dataaccess.getInventory(); + final int food = inventory.getFood(); + final int water = inventory.getWater(); + final int weapon = inventory.getWeapon(); + final int people = inventory.getPeople(); + + if (food <= 0) { + loseMessage = "Without food, morale crumbled. The group dispersed, unable to survive together any longer."; + } + else if (water <= 0) { + loseMessage = "With no water to sustain them, the group suffered dehydration. One by one, they perished."; + } + else if (people <= 0) { + loseMessage = "Everyone in your group has perished. There is no one left to continue the journey."; + } + else if (weapon <= 0) { + loseMessage = "Defenseless and exposed, your group was overtaken by a hostile faction. " + + "They took everything by force."; + } + + if (!loseMessage.isEmpty()) { + // Call output boundary with the failure message + final LoseOutputData outputData = new LoseOutputData(loseMessage); + outputBoundary.preapareGameoverEarly(outputData); + } + // do nothing if player is not losing. + } +} diff --git a/src/main/java/usecases/gamelosedetecter/LoseOutputBoundary.java b/src/main/java/usecases/gamelosedetecter/LoseOutputBoundary.java new file mode 100644 index 000000000..b95efa084 --- /dev/null +++ b/src/main/java/usecases/gamelosedetecter/LoseOutputBoundary.java @@ -0,0 +1,8 @@ +package usecases.gamelosedetecter; + +/** + * Output Boundary. + */ +public interface LoseOutputBoundary { + void preapareGameoverEarly(LoseOutputData loseOutputData); +} diff --git a/src/main/java/usecases/gamelosedetecter/LoseOutputData.java b/src/main/java/usecases/gamelosedetecter/LoseOutputData.java new file mode 100644 index 000000000..9a0a1aff5 --- /dev/null +++ b/src/main/java/usecases/gamelosedetecter/LoseOutputData.java @@ -0,0 +1,16 @@ +package usecases.gamelosedetecter; + +/** + * Display brief description, how and why you lose. + */ +public class LoseOutputData { + private String losedescription; + + public LoseOutputData(String losedescription) { + this.losedescription = losedescription; + } + + public String getLosedescription() { + return losedescription; + } +} diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverDataAccessInterface.java b/src/main/java/usecases/nevagategameover/NevagateGameOverDataAccessInterface.java new file mode 100644 index 000000000..9fee198b6 --- /dev/null +++ b/src/main/java/usecases/nevagategameover/NevagateGameOverDataAccessInterface.java @@ -0,0 +1,7 @@ +package usecases.nevagategameover; + +/** + * Not needed. + */ +public interface NevagateGameOverDataAccessInterface { +} diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverInputBoundary.java b/src/main/java/usecases/nevagategameover/NevagateGameOverInputBoundary.java new file mode 100644 index 000000000..ac5ed8ef4 --- /dev/null +++ b/src/main/java/usecases/nevagategameover/NevagateGameOverInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.nevagategameover; + +/** + * Execute. + */ +public interface NevagateGameOverInputBoundary { + void execute(NevagateGameOverInputdata inputdata); +} diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverInputdata.java b/src/main/java/usecases/nevagategameover/NevagateGameOverInputdata.java new file mode 100644 index 000000000..fcc0f017b --- /dev/null +++ b/src/main/java/usecases/nevagategameover/NevagateGameOverInputdata.java @@ -0,0 +1,7 @@ +package usecases.nevagategameover; + +/** + * Not needed. + */ +public class NevagateGameOverInputdata { +} diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverInteractor.java b/src/main/java/usecases/nevagategameover/NevagateGameOverInteractor.java new file mode 100644 index 000000000..afcdfd3e1 --- /dev/null +++ b/src/main/java/usecases/nevagategameover/NevagateGameOverInteractor.java @@ -0,0 +1,21 @@ +package usecases.nevagategameover; + +/** + * Interactor, only for navigating to the desired page. + */ +public class NevagateGameOverInteractor implements NevagateGameOverInputBoundary { + private NevagateGameOverDataAccessInterface dataaccess; + private NevagateGameOverOutputBoundary outputBoundary; + + public NevagateGameOverInteractor(NevagateGameOverDataAccessInterface dataaccess, + NevagateGameOverOutputBoundary outputBoundary) { + this.dataaccess = dataaccess; + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(NevagateGameOverInputdata inputdata) { + final NevagateGameOverOutputdata outputdata = new NevagateGameOverOutputdata(); + outputBoundary.prepareGameOver(outputdata); + } +} diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverOutputBoundary.java b/src/main/java/usecases/nevagategameover/NevagateGameOverOutputBoundary.java new file mode 100644 index 000000000..6fccd5ed9 --- /dev/null +++ b/src/main/java/usecases/nevagategameover/NevagateGameOverOutputBoundary.java @@ -0,0 +1,5 @@ +package usecases.nevagategameover; + +public interface NevagateGameOverOutputBoundary { + void prepareGameOver(NevagateGameOverOutputdata outputdata); +} diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverOutputdata.java b/src/main/java/usecases/nevagategameover/NevagateGameOverOutputdata.java new file mode 100644 index 000000000..4d59e8193 --- /dev/null +++ b/src/main/java/usecases/nevagategameover/NevagateGameOverOutputdata.java @@ -0,0 +1,7 @@ +package usecases.nevagategameover; + +/** + * Not needed. + */ +public class NevagateGameOverOutputdata { +} diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index bed3a0f8f..9062bbe0e 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -6,10 +6,14 @@ import interface_adapters.dailygather.DailyGatherInterface; import interface_adapters.dailymove.DailyMoveController; import interface_adapters.dailymove.DailyMoveInterface; +import interface_adapters.endprocesshorde.HordeController; +import interface_adapters.endprocesshorde.HordeInterface; import interface_adapters.eventdecide.EventDecideController; import interface_adapters.eventdecide.EventDecideInterface; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchInterface; +import interface_adapters.gamelosedetecter.LoseController; +import interface_adapters.gamelosedetecter.LoseInterface; import interface_adapters.gameminimap.MinimapController; import interface_adapters.gameminimap.MinimapInterface; import interface_adapters.gamenewday.NewdayController; @@ -18,6 +22,9 @@ import interface_adapters.gameplacedescription.PlaceDescriptionInterface; import interface_adapters.nevagateevent.NevagateEventController; import interface_adapters.nevagateevent.NevagateEventInterface; +import interface_adapters.nevagategame.NevagateGameController; +import interface_adapters.nevagategameover.NevagateGameOverController; +import interface_adapters.nevagategameover.NevagateGameOverInterface; import javax.swing.*; import java.awt.*; @@ -28,7 +35,8 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInterface, BroadcastInterface, PlaceDescriptionInterface, DailyGatherInterface, DailyMoveInterface, - EventDecideInterface, NevagateEventInterface, NewdayInterface, MinimapInterface { + EventDecideInterface, NevagateEventInterface, NewdayInterface, MinimapInterface, LoseInterface, HordeInterface, + NevagateGameOverInterface { private int day; private int food; private int water; @@ -56,6 +64,9 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInt private NevagateEventController nevagateEventController; private NewdayController newdayController; private MinimapController minimapController; + private LoseController loseController; + private HordeController hordeController; + private NevagateGameOverController nevagateGameOverController; private final PropertyChangeSupport propertyChangeSupport; @@ -100,7 +111,7 @@ public GameView() { JScrollPane infoScrollPane = new JScrollPane(infoBox); infoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); infoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - infoScrollPane.setPreferredSize(new Dimension(200, 200)); // Adjusted smaller width and fixed height + infoScrollPane.setPreferredSize(new Dimension(200, 200)); container.add(infoScrollPane); infoBox.setLineWrap(true); infoBox.setWrapStyleWord(true); @@ -206,7 +217,9 @@ public void setController(FetchController fetchController, BroadcastController b DailyGatherController dailyGatherController, DailyMoveController dailyMoveController, NevagateEventController nevagateEventController, EventDecideController eventDecideController, NewdayController newdayController, - MinimapController minimapController) { + MinimapController minimapController, + LoseController loseController, HordeController hordeController, + NevagateGameOverController nevagateGameOverController) { this.fetchController = fetchController; this.broadcastController = broadcastController; this.placeDescriptionController = placeDescriptionController; @@ -216,12 +229,16 @@ public void setController(FetchController fetchController, BroadcastController b this.eventDecideController = eventDecideController; this.newdayController = newdayController; this.minimapController = minimapController; + this.loseController = loseController; + this.hordeController = hordeController; + this.nevagateGameOverController = nevagateGameOverController; } public void render() { placeDescriptionController.execute(); fetchController.execute(); minimapController.execute(); + loseController.execute(); setVisible(true); } @@ -368,7 +385,6 @@ public void updateUiMinimap(ArrayList> grid) { mapPanel.setCaretPosition(0); } - @Override public void propertyChange(PropertyChangeEvent evt) { String propertyName = evt.getPropertyName(); @@ -400,6 +416,8 @@ public void propertyChange(PropertyChangeEvent evt) { @Override public void updateUiResource(int food, int water, int people, int weapon, int day, int actionpoint) { + loseController.execute(); + // check if player lose on update. setFood(food); setWater(water); setPeople(people); @@ -538,4 +556,20 @@ public void failureNewday(String message) { JOptionPane.ERROR_MESSAGE ); } + + @Override + public void updateUiHorde(String message, int score) { + // navigate to game over and display this. + + } + + @Override + public void failureHorde(String failmessage) { + + } + + @Override + public void prepareGameOverEarly(String message) { + // also navigate to game over and display this. + } } From ee87292d0c7cd25495b870f5b3743c24fe731715 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Mon, 2 Dec 2024 18:14:57 -0700 Subject: [PATCH 118/154] Basic game finished --- src/main/java/app/GameMainApplication.java | 5 +- .../HordeInterfaceNavigate.java | 7 ++ .../endprocesshorde/HordePresenter.java | 14 ++-- .../gamelosedetecter/LoseInterface.java | 2 +- .../LoseInterfaceNavigate.java | 7 ++ .../gamelosedetecter/LosePresenter.java | 12 +++- .../LoseDataAccessInterface.java | 3 + .../gamelosedetecter/LoseInteractor.java | 3 +- .../gamelosedetecter/LoseOutputData.java | 8 ++- src/main/java/view/GameOverView.java | 67 ++++++++++++++++--- src/main/java/view/GameView.java | 20 +++--- 11 files changed, 117 insertions(+), 31 deletions(-) create mode 100644 src/main/java/interface_adapters/endprocesshorde/HordeInterfaceNavigate.java create mode 100644 src/main/java/interface_adapters/gamelosedetecter/LoseInterfaceNavigate.java diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 8b473ff07..e74560b5c 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -268,12 +268,12 @@ public static void main(String[] args) { final MinimapController minimapController = new MinimapController(minimapInteractor); // Lose detect usecase - final LosePresenter losePresenter = new LosePresenter(gameView); + final LosePresenter losePresenter = new LosePresenter(gameOverView, navigationManager, gameView); final LoseInteractor loseInteractor = new LoseInteractor(gamedatabase, losePresenter); final LoseController loseController = new LoseController(loseInteractor); // End process horde usecase - final HordePresenter hordePresenter = new HordePresenter(gameView); + final HordePresenter hordePresenter = new HordePresenter(gameOverView, navigationManager, gameView); final HordeInteractor hordeInteractor = new HordeInteractor(gamedatabase, hordePresenter); final HordeController hordeController = new HordeController(hordeInteractor); @@ -295,5 +295,6 @@ public static void main(String[] args) { attributeview.setAllowcateController(allowcateController, nevagateMainController); eventView.setController(eventInitializerController, fetchEventController, nevagateGameController); eventView.setManager(eventManager); + gameOverView.setController(nevagateMainController); } } diff --git a/src/main/java/interface_adapters/endprocesshorde/HordeInterfaceNavigate.java b/src/main/java/interface_adapters/endprocesshorde/HordeInterfaceNavigate.java new file mode 100644 index 000000000..63f1bed32 --- /dev/null +++ b/src/main/java/interface_adapters/endprocesshorde/HordeInterfaceNavigate.java @@ -0,0 +1,7 @@ +package interface_adapters.endprocesshorde; + +import interface_adapters.NavigationManager; + +public interface HordeInterfaceNavigate { + void NavigateHordeGameOver(NavigationManager manager); +} diff --git a/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java b/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java index 45aa3b47c..3c6e0c40c 100644 --- a/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java +++ b/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java @@ -1,5 +1,6 @@ package interface_adapters.endprocesshorde; +import interface_adapters.NavigationManager; import usecases.endprocesshorde.HordeOutputBoundary; import usecases.endprocesshorde.HordeOutputData; @@ -7,19 +8,24 @@ * Horde presenter. */ public class HordePresenter implements HordeOutputBoundary { - private final HordeInterface view; + private final HordeInterface newview; + private final NavigationManager navigationManager; + private final HordeInterfaceNavigate view; - public HordePresenter(HordeInterface view) { + public HordePresenter(HordeInterface newview, NavigationManager navigationManager, HordeInterfaceNavigate view) { + this.newview = newview; + this.navigationManager = navigationManager; this.view = view; } @Override public void prepareSuccessView(HordeOutputData outputData) { - view.updateUiHorde(outputData.getDescription(), outputData.getScore()); + view.NavigateHordeGameOver(navigationManager); + newview.updateUiHorde(outputData.getDescription(), outputData.getScore()); } @Override public void prepareFailureView(String errorMessage) { - view.failureHorde(errorMessage); + newview.failureHorde(errorMessage); } } diff --git a/src/main/java/interface_adapters/gamelosedetecter/LoseInterface.java b/src/main/java/interface_adapters/gamelosedetecter/LoseInterface.java index d813f8a23..6995b3762 100644 --- a/src/main/java/interface_adapters/gamelosedetecter/LoseInterface.java +++ b/src/main/java/interface_adapters/gamelosedetecter/LoseInterface.java @@ -2,5 +2,5 @@ public interface LoseInterface { - void prepareGameOverEarly(String message); + void prepareGameOverEarly(String message, int score); } diff --git a/src/main/java/interface_adapters/gamelosedetecter/LoseInterfaceNavigate.java b/src/main/java/interface_adapters/gamelosedetecter/LoseInterfaceNavigate.java new file mode 100644 index 000000000..32b4f7c54 --- /dev/null +++ b/src/main/java/interface_adapters/gamelosedetecter/LoseInterfaceNavigate.java @@ -0,0 +1,7 @@ +package interface_adapters.gamelosedetecter; + +import interface_adapters.NavigationManager; + +public interface LoseInterfaceNavigate { + void navigateGameOver(NavigationManager navigationManager); +} diff --git a/src/main/java/interface_adapters/gamelosedetecter/LosePresenter.java b/src/main/java/interface_adapters/gamelosedetecter/LosePresenter.java index 7f7defd12..2a9a31b79 100644 --- a/src/main/java/interface_adapters/gamelosedetecter/LosePresenter.java +++ b/src/main/java/interface_adapters/gamelosedetecter/LosePresenter.java @@ -1,17 +1,23 @@ package interface_adapters.gamelosedetecter; +import interface_adapters.NavigationManager; import usecases.gamelosedetecter.LoseOutputBoundary; import usecases.gamelosedetecter.LoseOutputData; public class LosePresenter implements LoseOutputBoundary { - private LoseInterface view; + private NavigationManager navigationManager; + private LoseInterface newview; + private LoseInterfaceNavigate view; - public LosePresenter(LoseInterface view) { + public LosePresenter(LoseInterface newview, NavigationManager navigationManager, LoseInterfaceNavigate view) { + this.newview = newview; + this.navigationManager = navigationManager; this.view = view; } @Override public void preapareGameoverEarly(LoseOutputData loseOutputData) { - view.prepareGameOverEarly(loseOutputData.getLosedescription()); + view.navigateGameOver(navigationManager); + newview.prepareGameOverEarly(loseOutputData.getLosedescription(), loseOutputData.getScore()); } } diff --git a/src/main/java/usecases/gamelosedetecter/LoseDataAccessInterface.java b/src/main/java/usecases/gamelosedetecter/LoseDataAccessInterface.java index fef2dd75e..84057eb36 100644 --- a/src/main/java/usecases/gamelosedetecter/LoseDataAccessInterface.java +++ b/src/main/java/usecases/gamelosedetecter/LoseDataAccessInterface.java @@ -1,6 +1,7 @@ package usecases.gamelosedetecter; import entities.Inventory; +import entities.PlayerInfo; /** * Use player's inventory to decide if they lose, if any is 0. @@ -8,4 +9,6 @@ public interface LoseDataAccessInterface { Inventory getInventory(); + PlayerInfo getPlayerInfo(); + } diff --git a/src/main/java/usecases/gamelosedetecter/LoseInteractor.java b/src/main/java/usecases/gamelosedetecter/LoseInteractor.java index a9099246b..53a780c27 100644 --- a/src/main/java/usecases/gamelosedetecter/LoseInteractor.java +++ b/src/main/java/usecases/gamelosedetecter/LoseInteractor.java @@ -39,7 +39,8 @@ else if (weapon <= 0) { if (!loseMessage.isEmpty()) { // Call output boundary with the failure message - final LoseOutputData outputData = new LoseOutputData(loseMessage); + final int score = dataaccess.getPlayerInfo().getScore(); + final LoseOutputData outputData = new LoseOutputData(loseMessage, score); outputBoundary.preapareGameoverEarly(outputData); } // do nothing if player is not losing. diff --git a/src/main/java/usecases/gamelosedetecter/LoseOutputData.java b/src/main/java/usecases/gamelosedetecter/LoseOutputData.java index 9a0a1aff5..ded427406 100644 --- a/src/main/java/usecases/gamelosedetecter/LoseOutputData.java +++ b/src/main/java/usecases/gamelosedetecter/LoseOutputData.java @@ -5,12 +5,18 @@ */ public class LoseOutputData { private String losedescription; + private int score; - public LoseOutputData(String losedescription) { + public LoseOutputData(String losedescription, int score) { this.losedescription = losedescription; + this.score = score; } public String getLosedescription() { return losedescription; } + + public int getScore() { + return score; + } } diff --git a/src/main/java/view/GameOverView.java b/src/main/java/view/GameOverView.java index 223a023e1..2adb3f561 100644 --- a/src/main/java/view/GameOverView.java +++ b/src/main/java/view/GameOverView.java @@ -1,12 +1,26 @@ package view; +import app.GameMainApplication; +import interface_adapters.endprocesshorde.HordeInterface; +import interface_adapters.gamelosedetecter.LoseInterface; +import interface_adapters.nevagatemainview.NevagateMainController; +import interface_adapters.nevagatemainview.NevagateMainInterface; + import javax.swing.*; import java.awt.*; + /** * Gameover view. */ +public class GameOverView extends JFrame implements LoseInterface, HordeInterface, NevagateMainInterface { + private final JLabel scoreLabel; // Make it an instance variable + private final JTextArea descriptionArea; // Make it an instance variable + private NevagateMainController nevagateMainController; + + public void setController(NevagateMainController nevagateMainController) { + this.nevagateMainController = nevagateMainController; + } -public class GameOverView extends JFrame { @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public GameOverView() { super("Game Over"); @@ -15,20 +29,26 @@ public GameOverView() { final SpringLayout layout = new SpringLayout(); container.setLayout(layout); + // Title label final JLabel titleLabel = new JLabel("Game Over"); titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); container.add(titleLabel); - final JLabel scoreLabel = new JLabel("Score: 0"); + // Score label + scoreLabel = new JLabel("Score: 0"); // Initialize with a default value scoreLabel.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); container.add(scoreLabel); - final JTextArea descriptionArea = new JTextArea("Game description goes here..."); + // Description area + descriptionArea = new JTextArea("Game description goes here..."); descriptionArea.setEditable(false); descriptionArea.setBackground(Color.LIGHT_GRAY); descriptionArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + descriptionArea.setLineWrap(true); + descriptionArea.setWrapStyleWord(true); // Ensure long text wraps container.add(descriptionArea); + // Main menu button final JButton mainMenuButton = new JButton("Main Menu"); mainMenuButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); container.add(mainMenuButton); @@ -39,7 +59,9 @@ public GameOverView() { // Add action listener to "Main Menu" button mainMenuButton.addActionListener(e -> { dispose(); - new MainView(); + // Call the main method to restart the application + final String[] args = {}; + GameMainApplication.main(args); }); // Window settings @@ -60,13 +82,12 @@ private static void extracted(SpringLayout layout, JLabel titleLabel, Container layout.putConstraint(SpringLayout.WEST, descriptionArea, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.EAST, descriptionArea, -Constants.TWENTY, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, descriptionArea, Constants.TWENTY, SpringLayout.SOUTH, scoreLabel); - layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, - SpringLayout.SOUTH, container); + layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, container); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, mainMenuButton, 0, - SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, mainMenuButton, 0, SpringLayout.HORIZONTAL_CENTER, container); layout.putConstraint(SpringLayout.NORTH, mainMenuButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionArea); } + public void render() { setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); setVisible(true); @@ -80,4 +101,34 @@ public void disrender() { public static void main(String[] args) { new GameOverView(); } + + @Override + public void prepareGameOverEarly(String message, int score) { + // Update the score label with the given score + scoreLabel.setText("Score: " + score); + + // Update the description area with the provided message + descriptionArea.setText(message); + + // Ensure the user can see the new content + descriptionArea.setCaretPosition(0); + + } + + @Override + public void updateUiHorde(String message, int score) { + scoreLabel.setText("Score: " + score); + + // Update the description area with the provided message + descriptionArea.setText(message); + + // Ensure the user can see the new content + descriptionArea.setCaretPosition(0); + + } + + @Override + public void failureHorde(String failmessage) { + + } } diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 9062bbe0e..1ac1d5c5c 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -1,5 +1,6 @@ package view; +import interface_adapters.NavigationManager; import interface_adapters.broadcast.BroadcastController; import interface_adapters.broadcast.BroadcastInterface; import interface_adapters.dailygather.DailyGatherController; @@ -8,12 +9,14 @@ import interface_adapters.dailymove.DailyMoveInterface; import interface_adapters.endprocesshorde.HordeController; import interface_adapters.endprocesshorde.HordeInterface; +import interface_adapters.endprocesshorde.HordeInterfaceNavigate; import interface_adapters.eventdecide.EventDecideController; import interface_adapters.eventdecide.EventDecideInterface; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchInterface; import interface_adapters.gamelosedetecter.LoseController; import interface_adapters.gamelosedetecter.LoseInterface; +import interface_adapters.gamelosedetecter.LoseInterfaceNavigate; import interface_adapters.gameminimap.MinimapController; import interface_adapters.gameminimap.MinimapInterface; import interface_adapters.gamenewday.NewdayController; @@ -35,7 +38,8 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInterface, BroadcastInterface, PlaceDescriptionInterface, DailyGatherInterface, DailyMoveInterface, - EventDecideInterface, NevagateEventInterface, NewdayInterface, MinimapInterface, LoseInterface, HordeInterface, + EventDecideInterface, NevagateEventInterface, NewdayInterface, MinimapInterface, + LoseInterfaceNavigate, HordeInterfaceNavigate, NevagateGameOverInterface { private int day; private int food; @@ -558,18 +562,12 @@ public void failureNewday(String message) { } @Override - public void updateUiHorde(String message, int score) { - // navigate to game over and display this. - - } - - @Override - public void failureHorde(String failmessage) { - + public void navigateGameOver(NavigationManager navigationManager) { + navigationManager.showGameOverView(); } @Override - public void prepareGameOverEarly(String message) { - // also navigate to game over and display this. + public void NavigateHordeGameOver(NavigationManager manager) { + manager.showGameOverView(); } } From a9b305d6b6d0ec21289be47be19c6e2be3d54808 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Mon, 2 Dec 2024 21:09:28 -0500 Subject: [PATCH 119/154] Login Logout logic connection --- src/main/java/view/LoginView.java | 20 +++++++++----------- src/main/java/view/MainView.java | 10 +++++++++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index b10721710..a62f3a6ca 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -80,11 +80,9 @@ public LoginView() throws IOException { } }); - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); - setVisible(true); } private void layout(int offsetX) { @@ -128,14 +126,14 @@ public void displayLoginResult(String message) { } } - public static void main(String[] args) { - try { - new LoginView(); - } - catch (IOException e) { - e.printStackTrace(); - JOptionPane.showMessageDialog(null, "Error initializing the login system.", - "Error", JOptionPane.ERROR_MESSAGE); - } + // Add render method + public void render() { + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setVisible(true); + } + + public static void main(String[] args) throws IOException { + final LoginView loginView = new LoginView(); + loginView.render(); } } diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index 498bfa16f..5f247bb6d 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -102,7 +102,15 @@ private void addListeners() { // Switch to LoginView when "Logout" is clicked logoutButton.addActionListener(e -> { - + dispose(); + final LoginView loginView; + try { + loginView = new LoginView(); + } + catch (IOException ex) { + throw new RuntimeException(ex); + } + loginView.render(); }); } From 83c4d391260eddcc93a1ac75f1dee9fc8ae8d419 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Mon, 2 Dec 2024 22:52:23 -0500 Subject: [PATCH 120/154] Enhanced UI design and refined signup requirements --- .../accountsignup/SignupInteractor.java | 37 ++++++++++ src/main/java/view/Constants.java | 2 + src/main/java/view/LoginView.java | 34 +++++---- src/main/java/view/RankingView.java | 16 ++--- src/main/java/view/SignUpView.java | 70 +++++++++++-------- 5 files changed, 108 insertions(+), 51 deletions(-) diff --git a/src/main/java/usecases/accountsignup/SignupInteractor.java b/src/main/java/usecases/accountsignup/SignupInteractor.java index 1e6515f4c..77d7a9c2c 100644 --- a/src/main/java/usecases/accountsignup/SignupInteractor.java +++ b/src/main/java/usecases/accountsignup/SignupInteractor.java @@ -31,6 +31,19 @@ public void execute(SignupInputData inputData) { final String username = inputData.getUsername(); final String password = inputData.getPassword(); + // Validate username and password format + if (!isValidUsername(username)) { + outputBoundary.prepareFailureView(new SignupOutputData(false, + "Signup failed. Username must be 5-15 characters, containing only letters and digits.")); + return; + } + + if (!isValidPassword(password)) { + outputBoundary.prepareFailureView(new SignupOutputData(false, + "Signup failed. Password must be 8-20 characters, containing at least one letter and one digit.")); + return; + } + if (dataAccessInterface.isUsernameTaken(username)) { outputBoundary.prepareFailureView(new SignupOutputData( false, @@ -46,4 +59,28 @@ public void execute(SignupInputData inputData) { "Signup successful!" )); } + + /** + * Validates the username format. + * + * @param username The username to validate. + * - Must be 5-15 characters long. + * - Can only contain letters and digits (a-z, A-Z, 0-9). + * @return `true` if the username is valid, otherwise `false`. + */ + private boolean isValidUsername(String username) { + return username.matches("[a-zA-Z0-9]{5,15}"); + } + + /** + * Validates the password format. + * + * @param password The password to validate. + * - Must be 8-20 characters long. + * - Must contain at least one letter and one digit. + * @return `true` if the password is valid, otherwise `false`. + */ + private boolean isValidPassword(String password) { + return password.matches("^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,20}$"); + } } diff --git a/src/main/java/view/Constants.java b/src/main/java/view/Constants.java index 4e65763dd..0baf16c6a 100644 --- a/src/main/java/view/Constants.java +++ b/src/main/java/view/Constants.java @@ -6,6 +6,7 @@ public class Constants { public static final int THIRTY = 30; public static final int TWENTY = 20; + public static final int FIFTEEN = 15; public static final int TWO_HUNDRED = 200; public static final int FORTY = 40; public static final int TEN = 10; @@ -17,6 +18,7 @@ public class Constants { public static final int EIGHT_HUNDRED = 800; public static final int ONE_HUNDRED = 100; public static final int THREE = 3; + public static final int FIVE = 5; public static final int ONE_THOUSAND = 1000; } diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index a62f3a6ca..ece31bf33 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -12,15 +12,15 @@ * LoginView handles the UI for user login and integrates with the LoginApplication. */ public class LoginView extends JFrame implements LoginInterface { - private final JLabel nameLabel = new JLabel("Group Project", JLabel.CENTER); + private final JLabel nameLabel = new JLabel("60 Days to Survive", JLabel.CENTER); private final SpringLayout springLayout = new SpringLayout(); private final JPanel centerPanel = new JPanel(springLayout); private final JLabel userNameLabel = new JLabel("Username:"); private final JTextField userText = new JTextField(); private final JLabel passwordLabel = new JLabel("Password:"); private final JPasswordField passwordText = new JPasswordField(); - private final JButton loginButton = new JButton("Log In"); - private final JButton registerButton = new JButton("Sign Up"); + private final JButton loginButton = new JButton("Log in"); + private final JButton registerButton = new JButton("Sign up"); private final LoginController loginController; @@ -36,11 +36,15 @@ public LoginView() throws IOException { this.loginController = LoginApplication.initializeLogin(this); final Container contentPane = getContentPane(); - nameLabel.setFont(new Font("Arial", Font.PLAIN, Constants.FORTY)); - userNameLabel.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - passwordLabel.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + nameLabel.setFont(new Font("Impact", Font.BOLD, Constants.FIFTY)); + userNameLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); + passwordLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); loginButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + loginButton.setBackground(new Color(139, 69, 19)); + loginButton.setForeground(Color.WHITE); registerButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + registerButton.setBackground(Color.WHITE); + registerButton.setForeground(new Color(139, 69, 19)); userText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); passwordText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); @@ -60,7 +64,7 @@ public LoginView() throws IOException { final Spring titleTextWidth = Spring.width(userText); final Spring spaceWidth = Spring.constant(20); final Spring childWidth = Spring.sum(Spring.sum(titleLabelWidth, titleTextWidth), spaceWidth); - final int offsetX = childWidth.getValue() / 2; + final int offsetX = (childWidth.getValue() + 40) / 2; layout(offsetX); loginButton.addActionListener(e -> { @@ -73,7 +77,8 @@ public LoginView() throws IOException { dispose(); try { // Navigate to the sign-up page - new SignUpView(); + final SignUpView signUpView = new SignUpView(); + signUpView.render(); } catch (IOException ex) { throw new RuntimeException(ex); @@ -86,24 +91,25 @@ public LoginView() throws IOException { } private void layout(int offsetX) { + // set userLable location springLayout.putConstraint(SpringLayout.WEST, userNameLabel, -offsetX, SpringLayout.HEIGHT, centerPanel); - springLayout.putConstraint(SpringLayout.NORTH, userNameLabel, Constants.TWENTY, SpringLayout.NORTH, + springLayout.putConstraint(SpringLayout.NORTH, userNameLabel, Constants.SIXTY, SpringLayout.NORTH, centerPanel); // set userText location springLayout.putConstraint(SpringLayout.WEST, userText, Constants.TEN, SpringLayout.EAST, userNameLabel); - springLayout.putConstraint(SpringLayout.NORTH, userText, 0, SpringLayout.NORTH, userNameLabel); + springLayout.putConstraint(SpringLayout.NORTH, userText, -Constants.FIVE, SpringLayout.NORTH, userNameLabel); // set passwordLabel location springLayout.putConstraint(SpringLayout.EAST, passwordLabel, 0, SpringLayout.EAST, userNameLabel); - springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, Constants.TEN, SpringLayout.SOUTH, userNameLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, Constants.TWENTY, SpringLayout.SOUTH, userNameLabel); // set passwordText location springLayout.putConstraint(SpringLayout.WEST, passwordText, Constants.TEN, SpringLayout.EAST, passwordLabel); - springLayout.putConstraint(SpringLayout.NORTH, passwordText, 0, SpringLayout.NORTH, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordText, -Constants.FIVE, SpringLayout.NORTH, passwordLabel); // set loginButton location springLayout.putConstraint(SpringLayout.WEST, loginButton, Constants.FIFTY, SpringLayout.WEST, passwordLabel); - springLayout.putConstraint(SpringLayout.NORTH, loginButton, Constants.TWENTY, + springLayout.putConstraint(SpringLayout.NORTH, loginButton, Constants.FORTY, SpringLayout.SOUTH, passwordLabel); // set registerButton - springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginButton); + springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.FIFTY, SpringLayout.EAST, loginButton); springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginButton); } diff --git a/src/main/java/view/RankingView.java b/src/main/java/view/RankingView.java index 8b52cb6b0..219f90c40 100644 --- a/src/main/java/view/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -17,7 +17,7 @@ public class RankingView extends JFrame implements RankingInterface { private final JTable rankingTable; private final DefaultTableModel tableModel; - private final JLabel errorLabel; + private final JButton backButton; private final RankingController rankingController; /** * Constructs the RankingView and sets up the UI components. @@ -51,10 +51,10 @@ public RankingView() { container.add(new JScrollPane(rankingTable), BorderLayout.CENTER); // Error label - errorLabel = new JLabel("", JLabel.CENTER); - errorLabel.setForeground(Color.RED); - errorLabel.setFont(new Font("Serif", Font.ITALIC, 16)); - container.add(errorLabel, BorderLayout.SOUTH); + backButton = new JButton("Back to Main Memu"); + backButton.setForeground(Color.BLACK); + backButton.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); + container.add(backButton, BorderLayout.SOUTH); // Fetch and display rankings via the controller rankingController.handleRanking(Constants.TEN); @@ -95,9 +95,6 @@ public void displayRankings(List playerNames, List scores, statuses.get(i), }); } - - // Clear the error message - errorLabel.setText(""); } /** @@ -119,6 +116,7 @@ public void render() { } public static void main(String[] args) { - new RankingView(); + final RankingView rankingView = new RankingView(); + rankingView.render(); } } diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index 350a87bd1..a8dd4e79b 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -12,7 +12,7 @@ * SignUpView handles the UI for user registration and integrates with the SignupApplication. */ public class SignUpView extends JFrame implements SignupInterface { - private final JLabel nameLabel = new JLabel("Group Project", JLabel.CENTER); + private final JLabel nameLabel = new JLabel("60 Days to Survive", JLabel.CENTER); private final SpringLayout springLayout = new SpringLayout(); private final JPanel centerPanel = new JPanel(springLayout); private final JLabel userNameLabel = new JLabel("Username:"); @@ -21,8 +21,8 @@ public class SignUpView extends JFrame implements SignupInterface { private final JPasswordField passwordText = new JPasswordField(); private final JLabel againLabel = new JLabel("Confirm Password:"); private final JPasswordField againText = new JPasswordField(); - private final JButton registerButton = new JButton("Sign Up"); - private final JButton loginButton = new JButton("Back to Login"); + private final JButton registerButton = new JButton("Sign up"); + private final JButton loginButton = new JButton("Back to login"); private final SignupController signupController; @@ -38,12 +38,16 @@ public SignUpView() throws IOException { this.signupController = SignupApplication.initializeSignup(this); final Container contentPane = getContentPane(); - nameLabel.setFont(new Font("Arial", Font.PLAIN, Constants.FORTY)); - userNameLabel.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - passwordLabel.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - againLabel.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + nameLabel.setFont(new Font("Impact", Font.BOLD, Constants.FIFTY)); + userNameLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); + passwordLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); + againLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); registerButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + registerButton.setBackground(Color.WHITE); + registerButton.setForeground(new Color(139, 69, 19)); loginButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + loginButton.setBackground(new Color(139, 69, 19)); + loginButton.setForeground(Color.WHITE); userText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); passwordText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); @@ -60,7 +64,7 @@ public SignUpView() throws IOException { final Spring titleTextWidth = Spring.width(userText); final Spring spaceWidth = Spring.constant(20); final Spring childWidth = Spring.sum(Spring.sum(titleLabelWidth, titleTextWidth), spaceWidth); - final int offsetX = childWidth.getValue() / 2; + final int offsetX = (childWidth.getValue() + 40) / 2; // set userNameLabel location extracted(offsetX); @@ -68,7 +72,8 @@ public SignUpView() throws IOException { loginButton.addActionListener(e -> { dispose(); try { - new LoginView(); + final LoginView loginView = new LoginView(); + loginView.render(); } catch (IOException ex) { JOptionPane.showMessageDialog(this, "Error navigating to LoginView.", @@ -81,7 +86,6 @@ public SignUpView() throws IOException { setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); - setVisible(true); } private void extracted() { @@ -97,30 +101,30 @@ private void extracted() { private void extracted(int offsetX) { springLayout.putConstraint(SpringLayout.WEST, userNameLabel, -offsetX, SpringLayout.HEIGHT, centerPanel); - springLayout.putConstraint(SpringLayout.NORTH, userNameLabel, Constants.TWENTY, SpringLayout.NORTH, + springLayout.putConstraint(SpringLayout.NORTH, userNameLabel, Constants.FIFTY, SpringLayout.NORTH, centerPanel); // set userText location springLayout.putConstraint(SpringLayout.WEST, userText, Constants.TEN, SpringLayout.EAST, userNameLabel); - springLayout.putConstraint(SpringLayout.NORTH, userText, 0, SpringLayout.NORTH, userNameLabel); + springLayout.putConstraint(SpringLayout.NORTH, userText, -Constants.FIVE, SpringLayout.NORTH, userNameLabel); // set passwordLabel location springLayout.putConstraint(SpringLayout.EAST, passwordLabel, 0, SpringLayout.EAST, userNameLabel); - springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, Constants.TEN, SpringLayout.SOUTH, userNameLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, Constants.TWENTY, SpringLayout.SOUTH, userNameLabel); // set passwordText location springLayout.putConstraint(SpringLayout.WEST, passwordText, Constants.TEN, SpringLayout.EAST, passwordLabel); - springLayout.putConstraint(SpringLayout.NORTH, passwordText, 0, SpringLayout.NORTH, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordText, -Constants.FIVE, SpringLayout.NORTH, passwordLabel); // set loginButton location - springLayout.putConstraint(SpringLayout.WEST, loginButton, Constants.FIFTY, SpringLayout.WEST, passwordLabel); + springLayout.putConstraint(SpringLayout.WEST, loginButton, Constants.TEN, SpringLayout.WEST, passwordLabel); springLayout.putConstraint(SpringLayout.NORTH, loginButton, Constants.EIGHTY, SpringLayout.SOUTH, passwordLabel); // set registerButton location - springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.SIXTY, SpringLayout.EAST, loginButton); - springLayout.putConstraint(SpringLayout.NORTH, registerButton, 0, SpringLayout.NORTH, loginButton); + springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.FORTY, SpringLayout.EAST, loginButton); + springLayout.putConstraint(SpringLayout.NORTH, registerButton, -Constants.FIVE, SpringLayout.NORTH, loginButton); // set againLabel location springLayout.putConstraint(SpringLayout.EAST, againLabel, 0, SpringLayout.EAST, passwordLabel); - springLayout.putConstraint(SpringLayout.NORTH, againLabel, Constants.TEN, SpringLayout.SOUTH, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, againLabel, Constants.TWENTY, SpringLayout.SOUTH, passwordLabel); // set againText location springLayout.putConstraint(SpringLayout.WEST, againText, Constants.TEN, SpringLayout.EAST, againLabel); - springLayout.putConstraint(SpringLayout.NORTH, againText, 0, SpringLayout.NORTH, againLabel); + springLayout.putConstraint(SpringLayout.NORTH, againText, -Constants.FIVE, SpringLayout.NORTH, againLabel); } private void handleSignup() { @@ -130,6 +134,8 @@ private void handleSignup() { if (!password.equals(confirmPassword)) { JOptionPane.showMessageDialog(this, "Passwords do not match.", "Error", JOptionPane.ERROR_MESSAGE); + passwordText.setText(""); + againText.setText(""); return; } @@ -150,22 +156,30 @@ public void displaySignupResult(String message) { dispose(); try { // Navigate to login page - new LoginView(); + final LoginView loginView = new LoginView(); + loginView.render(); } catch (IOException e) { + userText.setText(""); + passwordText.setText(""); + againText.setText(""); JOptionPane.showMessageDialog(this, "Error navigating to LoginView.", "Error", JOptionPane.ERROR_MESSAGE); } } + userText.setText(""); + passwordText.setText(""); + againText.setText(""); } - public static void main(String[] args) { - try { - new SignUpView(); - } - catch (IOException e) { - JOptionPane.showMessageDialog(null, "Error initializing signup system.", - "Error", JOptionPane.ERROR_MESSAGE); - } + // Add render method + public void render() { + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setVisible(true); + } + + public static void main(String[] args) throws IOException { + final SignUpView signUpView = new SignUpView(); + signUpView.render(); } } From 5293e40279abc4d0c53a86560c2e59dc658fe269 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Mon, 2 Dec 2024 23:23:50 -0500 Subject: [PATCH 121/154] UI detail update --- src/main/java/view/Constants.java | 5 ++++ src/main/java/view/GameView.java | 4 --- src/main/java/view/LoginView.java | 5 ++-- src/main/java/view/MainView.java | 46 +++++++++++++++++++---------- src/main/java/view/RankingView.java | 11 ++++--- src/main/java/view/SignUpView.java | 4 +-- 6 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/main/java/view/Constants.java b/src/main/java/view/Constants.java index 0baf16c6a..574ef6eb5 100644 --- a/src/main/java/view/Constants.java +++ b/src/main/java/view/Constants.java @@ -1,5 +1,7 @@ package view; +import java.awt.*; + /** * Constants used in this program. */ @@ -7,7 +9,9 @@ public class Constants { public static final int THIRTY = 30; public static final int TWENTY = 20; public static final int FIFTEEN = 15; + public static final int TWENTYFIVE = 25; public static final int TWO_HUNDRED = 200; + public static final int THREE_HUNDRED = 300; public static final int FORTY = 40; public static final int TEN = 10; public static final int FIFTY = 50; @@ -20,5 +24,6 @@ public class Constants { public static final int THREE = 3; public static final int FIVE = 5; public static final int ONE_THOUSAND = 1000; + public static final Color THEME_COLOR = new Color(139, 69, 19); } diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 49b26a64b..5ab07c608 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -115,12 +115,8 @@ public GameView() { final JScrollPane infoScrollPane = new JScrollPane(infoBox); infoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); infoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); -<<<<<<< HEAD // Adjusted smaller width and fixed height infoScrollPane.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); -======= - infoScrollPane.setPreferredSize(new Dimension(200, 200)); ->>>>>>> a9b305d6b6d0ec21289be47be19c6e2be3d54808 container.add(infoScrollPane); infoBox.setLineWrap(true); infoBox.setWrapStyleWord(true); diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index ece31bf33..795ae32bc 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -23,7 +23,6 @@ public class LoginView extends JFrame implements LoginInterface { private final JButton registerButton = new JButton("Sign up"); private final LoginController loginController; - /** * Constructs the LoginView with the provided LoginController. * @@ -40,11 +39,11 @@ public LoginView() throws IOException { userNameLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); passwordLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); loginButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - loginButton.setBackground(new Color(139, 69, 19)); + loginButton.setBackground(Constants.THEME_COLOR); loginButton.setForeground(Color.WHITE); registerButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); registerButton.setBackground(Color.WHITE); - registerButton.setForeground(new Color(139, 69, 19)); + registerButton.setForeground(Constants.THEME_COLOR); userText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); passwordText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index 5f247bb6d..917248a3c 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -16,12 +16,11 @@ public class MainView extends JFrame { private JButton newGameButton = new JButton("New Game"); - private JButton rankingButton = new JButton("Ranking"); + private JButton rankingButton = new JButton("Ranking List"); private JButton quitButton = new JButton("Quit"); - private JButton logoutButton = new JButton("Logout"); + private JButton logoutButton = new JButton("Log Out"); private NevagateAllowcateController nevagateAllowcateController; - @SuppressWarnings({"checkstyle:MultipleStringLiterals", "checkstyle:SuppressWarnings"}) public MainView() { // Set layout and container final Container container = getContentPane(); @@ -30,14 +29,29 @@ public MainView() { // Title final JLabel titleLabel = new JLabel("Main Menu"); - titleLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); + titleLabel.setFont(new Font("Arial", Font.BOLD, Constants.THIRTY)); container.add(titleLabel); // Set button fonts - newGameButton.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); - rankingButton.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); - quitButton.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); - logoutButton.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); + newGameButton.setFont(new Font("Arial", Font.BOLD, Constants.TWENTY)); + rankingButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + quitButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + logoutButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + + newGameButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FIFTY)); + rankingButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FIFTY)); + quitButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FORTY)); + logoutButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FIFTY)); + + newGameButton.setBackground(Constants.THEME_COLOR); + rankingButton.setBackground(Color.WHITE); + quitButton.setBackground(Color.WHITE); + logoutButton.setBackground(Color.WHITE); + + newGameButton.setForeground(Color.WHITE); + rankingButton.setForeground(Constants.THEME_COLOR); + quitButton.setForeground(Constants.THEME_COLOR); + logoutButton.setForeground(Constants.THEME_COLOR); // Add buttons to the container container.add(newGameButton); @@ -48,7 +62,7 @@ public MainView() { // Layout constraints layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, titleLabel, Constants.TWENTY, SpringLayout.NORTH, container); + layout.putConstraint(SpringLayout.NORTH, titleLabel, Constants.THIRTY, SpringLayout.NORTH, container); layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, newGameButton, 0, SpringLayout.HORIZONTAL_CENTER, container); @@ -56,15 +70,15 @@ public MainView() { layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, rankingButton, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, rankingButton, Constants.TWENTY, SpringLayout.SOUTH, newGameButton); + layout.putConstraint(SpringLayout.NORTH, rankingButton, Constants.TEN, SpringLayout.SOUTH, newGameButton); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, quitButton, 0, SpringLayout.HORIZONTAL_CENTER, + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, logoutButton, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, quitButton, Constants.TWENTY, SpringLayout.SOUTH, rankingButton); + layout.putConstraint(SpringLayout.NORTH, logoutButton, Constants.TEN, SpringLayout.SOUTH, rankingButton); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, logoutButton, 0, SpringLayout.HORIZONTAL_CENTER, + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, quitButton, 0, SpringLayout.HORIZONTAL_CENTER, container); - layout.putConstraint(SpringLayout.NORTH, logoutButton, Constants.TWENTY, SpringLayout.SOUTH, quitButton); + layout.putConstraint(SpringLayout.NORTH, quitButton, Constants.TEN, SpringLayout.SOUTH, logoutButton); // Add listeners for buttons addListeners(); @@ -116,12 +130,12 @@ private void addListeners() { // Add render method public void render() { - setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setVisible(true); } public void disrender() { - setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setVisible(false); } diff --git a/src/main/java/view/RankingView.java b/src/main/java/view/RankingView.java index 219f90c40..04f0b2361 100644 --- a/src/main/java/view/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -8,6 +8,7 @@ import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; +import java.awt.event.ActionListener; import java.io.IOException; import java.util.List; @@ -19,6 +20,7 @@ public class RankingView extends JFrame implements RankingInterface { private final DefaultTableModel tableModel; private final JButton backButton; private final RankingController rankingController; + /** * Constructs the RankingView and sets up the UI components. * @throws RuntimeException If there is an error initializing the signup application. @@ -38,8 +40,8 @@ public RankingView() { container.setLayout(new BorderLayout()); // Title - final JLabel titleLabel = new JLabel("Leaderboard", JLabel.CENTER); - titleLabel.setFont(new Font("Serif", Font.BOLD, 24)); + final JLabel titleLabel = new JLabel("Ranking List", JLabel.CENTER); + titleLabel.setFont(new Font("Arial", Font.BOLD, Constants.TWENTYFIVE)); container.add(titleLabel, BorderLayout.NORTH); // Table to display rankings @@ -52,8 +54,9 @@ public RankingView() { // Error label backButton = new JButton("Back to Main Memu"); - backButton.setForeground(Color.BLACK); - backButton.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); + backButton.setBackground(Color.WHITE); + backButton.setForeground(Constants.THEME_COLOR); + backButton.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); container.add(backButton, BorderLayout.SOUTH); // Fetch and display rankings via the controller diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index a8dd4e79b..889d8575a 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -44,9 +44,9 @@ public SignUpView() throws IOException { againLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); registerButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); registerButton.setBackground(Color.WHITE); - registerButton.setForeground(new Color(139, 69, 19)); + registerButton.setForeground(Constants.THEME_COLOR); loginButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - loginButton.setBackground(new Color(139, 69, 19)); + loginButton.setBackground(Constants.THEME_COLOR); loginButton.setForeground(Color.WHITE); userText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); From 0ee576b9fc63ef34f5242ef95aa90ce337c1c245 Mon Sep 17 00:00:00 2001 From: yitong an Date: Mon, 2 Dec 2024 23:42:52 -0500 Subject: [PATCH 122/154] correct character creation view checkstyle bugs --- src/main/java/view/CharacterCreationView.java | 69 ++++++++++++------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/src/main/java/view/CharacterCreationView.java b/src/main/java/view/CharacterCreationView.java index 5cb34c788..7c2d963bf 100644 --- a/src/main/java/view/CharacterCreationView.java +++ b/src/main/java/view/CharacterCreationView.java @@ -1,21 +1,28 @@ package view; +import java.awt.Container; +import java.awt.Font; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.SpringLayout; + import interface_adapters.nevagatemainview.NevagateMainController; import interface_adapters.startallowcatepoint.AllowcateController; import interface_adapters.startallowcatepoint.AllowcateInterface; -import javax.swing.*; -import java.awt.*; /** * Character creation view. */ public class CharacterCreationView extends JFrame implements AllowcateInterface { - public static final String textSocial = "Social"; - public static final String textLuck = "Luck"; - public static final String textThrift = "Thrift"; - public static final String textMobilization = "Mobilization"; - public static final String textGeneralship = "Generalship"; + public static final String TEXT_SOCIAL = "Social"; + public static final String TEXT_LUCK = "Luck"; + public static final String TEXT_THRIFT = "Thrift"; + public static final String TEXT_MOBILIZATION = "Mobilization"; + public static final String TEXT_GENERALSHIP = "Generalship"; private int points = Constants.TWENTY; private final JLabel pointsLabel; private final JLabel socialLabel; @@ -32,7 +39,7 @@ public class CharacterCreationView extends JFrame implements AllowcateInterface private NevagateMainController nevagateMainController; @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings", - "checkstyle:ExecutableStatementCount"}) + "checkstyle:ExecutableStatementCount"}) public CharacterCreationView() { super("Build Your Character"); @@ -48,27 +55,27 @@ public CharacterCreationView() { // Attribute Labels and Buttons socialLabel = new JLabel("Social: " + social); - final JButton socialButton = createButton(textSocial); + final JButton socialButton = createButton(TEXT_SOCIAL); container.add(socialLabel); container.add(socialButton); luckLabel = new JLabel("Luck: " + luck); - final JButton luckButton = createButton(textLuck); + final JButton luckButton = createButton(TEXT_LUCK); container.add(luckLabel); container.add(luckButton); mobilizationLabel = new JLabel("Mobilization: " + mobilization); - final JButton mobilizationButton = createButton(textMobilization); + final JButton mobilizationButton = createButton(TEXT_MOBILIZATION); container.add(mobilizationLabel); container.add(mobilizationButton); thriftLabel = new JLabel("Thrift: " + thrift); - final JButton thriftButton = createButton(textThrift); + final JButton thriftButton = createButton(TEXT_THRIFT); container.add(thriftLabel); container.add(thriftButton); generalshipLabel = new JLabel("Generalship: " + generalship); - final JButton generalshipButton = createButton(textGeneralship); + final JButton generalshipButton = createButton(TEXT_GENERALSHIP); container.add(generalshipLabel); container.add(generalshipButton); @@ -100,6 +107,12 @@ public CharacterCreationView() { setVisible(false); } + /** + * Sets the AllowcateController and NevagateMainController for this instance. + * + * @param AllowcateController the instance of {@code AllowcateController} to set + * @param NevagateMainController the instance of {@code NevagateMainController} to set + */ public void setAllowcateController(AllowcateController AllowcateController, NevagateMainController NevagateMainController) { this.allowcateController = AllowcateController; @@ -109,11 +122,11 @@ public void setAllowcateController(AllowcateController AllowcateController, @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) private void addListeners(JButton socialButton, JButton luckButton, JButton mobilizationButton, JButton thriftButton, JButton generalshipButton) { - socialButton.addActionListener(e -> updatePoints(textSocial)); - luckButton.addActionListener(e -> updatePoints(textLuck)); - mobilizationButton.addActionListener(e -> updatePoints(textMobilization)); - thriftButton.addActionListener(e -> updatePoints(textThrift)); - generalshipButton.addActionListener(e -> updatePoints(textGeneralship)); + socialButton.addActionListener(e -> updatePoints(TEXT_SOCIAL)); + luckButton.addActionListener(e -> updatePoints(TEXT_LUCK)); + mobilizationButton.addActionListener(e -> updatePoints(TEXT_MOBILIZATION)); + thriftButton.addActionListener(e -> updatePoints(TEXT_THRIFT)); + generalshipButton.addActionListener(e -> updatePoints(TEXT_GENERALSHIP)); } private void extracted(SpringLayout layout, Container container, JButton socialButton, JButton luckButton, @@ -134,7 +147,8 @@ private void extracted(SpringLayout layout, Container container, JButton socialB layout.putConstraint(SpringLayout.WEST, mobilizationLabel, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.NORTH, mobilizationLabel, Constants.TWENTY, SpringLayout.SOUTH, luckLabel); - layout.putConstraint(SpringLayout.WEST, mobilizationButton, Constants.TWENTY, SpringLayout.EAST, mobilizationLabel); + layout.putConstraint(SpringLayout.WEST, mobilizationButton, Constants.TWENTY, SpringLayout.EAST, + mobilizationLabel); layout.putConstraint(SpringLayout.NORTH, mobilizationButton, 0, SpringLayout.NORTH, mobilizationLabel); layout.putConstraint(SpringLayout.WEST, thriftLabel, Constants.TWENTY, SpringLayout.WEST, container); @@ -144,7 +158,8 @@ private void extracted(SpringLayout layout, Container container, JButton socialB layout.putConstraint(SpringLayout.WEST, generalshipLabel, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.NORTH, generalshipLabel, Constants.TWENTY, SpringLayout.SOUTH, thriftLabel); - layout.putConstraint(SpringLayout.WEST, generalshipButton, Constants.TWENTY, SpringLayout.EAST, generalshipLabel); + layout.putConstraint(SpringLayout.WEST, generalshipButton, Constants.TWENTY, SpringLayout.EAST, + generalshipLabel); layout.putConstraint(SpringLayout.NORTH, generalshipButton, 0, SpringLayout.NORTH, generalshipLabel); layout.putConstraint(SpringLayout.WEST, backButton, Constants.TWENTY, SpringLayout.WEST, container); @@ -184,6 +199,9 @@ private void updatePoints(String attribute) { generalship++; generalshipLabel.setText("Generalship: " + generalship); break; + default: + // No action needed + break; } points--; pointsLabel.setText("Points: " + points); @@ -194,14 +212,19 @@ private void updatePoints(String attribute) { } } - // public static void main(String[] args) { - // new CharacterCreationView(); - // } + /** + * Renders the component by setting its size and making it visible. + * The size is set to 400x600 pixels. + */ public void render() { setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); setVisible(true); } + /** + * Disables the rendering of the component by changing its size and making it invisible. + * The size is set to 400x400 pixels. + */ public void disrender() { setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); setVisible(false); From 14da182e853eb35473167b4865f47ed292b60744 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Tue, 3 Dec 2024 00:32:12 -0500 Subject: [PATCH 123/154] Update the function and UI to ranking view --- src/main/java/view/Constants.java | 1 + src/main/java/view/LoginView.java | 5 ++--- src/main/java/view/MainView.java | 2 +- src/main/java/view/RankingView.java | 20 +++++++++++++++++--- src/main/java/view/SignUpView.java | 3 +-- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/main/java/view/Constants.java b/src/main/java/view/Constants.java index 574ef6eb5..ad4e60bdb 100644 --- a/src/main/java/view/Constants.java +++ b/src/main/java/view/Constants.java @@ -12,6 +12,7 @@ public class Constants { public static final int TWENTYFIVE = 25; public static final int TWO_HUNDRED = 200; public static final int THREE_HUNDRED = 300; + public static final int FIVE_HUNDRED = 500; public static final int FORTY = 40; public static final int TEN = 10; public static final int FIFTY = 50; diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index 795ae32bc..ce443937f 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -83,10 +83,10 @@ public LoginView() throws IOException { throw new RuntimeException(ex); } }); - + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); - setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); + setLocation(Constants.FIVE_HUNDRED, Constants.THREE_HUNDRED); } private void layout(int offsetX) { @@ -133,7 +133,6 @@ public void displayLoginResult(String message) { // Add render method public void render() { - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setVisible(true); } diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index 917248a3c..2e7669d7c 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -86,7 +86,7 @@ public MainView() { // Set window properties (moved to render()) setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); - setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); + setLocation(Constants.FIVE_HUNDRED, Constants.THREE_HUNDRED); } public void setNevagateAllowcateController(NevagateAllowcateController nevagateAllowcateController) { diff --git a/src/main/java/view/RankingView.java b/src/main/java/view/RankingView.java index 04f0b2361..a5f332b9f 100644 --- a/src/main/java/view/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -41,7 +41,7 @@ public RankingView() { // Title final JLabel titleLabel = new JLabel("Ranking List", JLabel.CENTER); - titleLabel.setFont(new Font("Arial", Font.BOLD, Constants.TWENTYFIVE)); + titleLabel.setFont(new Font("Arial", Font.BOLD, Constants.THIRTY)); container.add(titleLabel, BorderLayout.NORTH); // Table to display rankings @@ -50,25 +50,39 @@ public RankingView() { rankingTable = new JTable(tableModel); // Make table non-editable rankingTable.setEnabled(false); + rankingTable.setFont(new Font("Arial", Font.PLAIN, Constants.FIFTEEN)); + rankingTable.getTableHeader().setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); + rankingTable.setRowHeight(Constants.TWENTYFIVE); container.add(new JScrollPane(rankingTable), BorderLayout.CENTER); // Error label backButton = new JButton("Back to Main Memu"); backButton.setBackground(Color.WHITE); backButton.setForeground(Constants.THEME_COLOR); - backButton.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); + backButton.setFont(new Font("Arial", Font.BOLD, Constants.TWENTY)); container.add(backButton, BorderLayout.SOUTH); + // Add ActionListener to navigate back to the main menu + backButton.addActionListener(e -> { + // Dispose the current view + dispose(); + + // Open the MainView + final MainView mainView = new MainView(); + mainView.render(); + }); + // Fetch and display rankings via the controller rankingController.handleRanking(Constants.TEN); // Window settings - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setSize(Constants.EIGHT_HUNDRED, Constants.SIX_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); } + /** * Displays the leaderboard in the UI. * diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index 889d8575a..8775ec6d0 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -85,7 +85,7 @@ public SignUpView() throws IOException { // setLocation(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); - setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); + setLocation(Constants.FIVE_HUNDRED, Constants.THREE_HUNDRED); } private void extracted() { @@ -174,7 +174,6 @@ public void displaySignupResult(String message) { // Add render method public void render() { - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setVisible(true); } From 119e54ddd50e97ed0fdb2b865cdaa53f7f4f3400 Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Tue, 3 Dec 2024 01:56:04 -0500 Subject: [PATCH 124/154] rewrite README.md --- README.md | 208 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 134 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index 349bfe65c..a9d13ee60 100644 --- a/README.md +++ b/README.md @@ -1,76 +1,136 @@ -## Group members && GitHub id - -Yitong An - vinkoos -Haoze Li - FlashYDirOX -Ze Kun Song - UTSGJohnsonSong -Owen Hexiang Wang- Adidazdoge -Xiaoshu Lin - Michael-lin6677 - -## Software Specification -The game is a 60-day simulation in which the player acts as a group leader navigating -the challenges of a zombie apocalypse. Players allocate a set number of initial points -across resources (e.g., people, weaponry, food, luck) before the first day. These choices -impact the group's survival strategies and outcomes. Each day, the program provides a -brief description of the group's current location and what has transpired, such as how -many people survived or died, the quantity of resources found, or any weaponry acquired. - - -### User Stories and Functional Requirements - -**1. Allocation of Remaining Points** - Yitong An -- **Feature**: Points Allocation System -- **As a player**: - - I want to allocate my remaining points to my Team, Weapons, Food, and Luck, - - so I can strengthen specific areas and increase my chances of survival. -- **Requirements**: - - Players can see how many points are available to allocate. - - Players can distribute points to Team, Weapons, Food, or Luck as they choose. - - Allocated points are applied immediately and affect the player’s stats. - -**2. Status Check** - Haoze Li -- **Feature**: Status Update Interface -- **As a player**: - - I want to get updates on the current status so I can make informed decisions. -- **Requirements**: - - Players can view: - - **Weather**: Information on current weather conditions. - - **Environment**: Description of surroundings, including potential threats - - or opportunities. - - **Location**: The current position on the map. - - **Date**: In-game date to help track progression. - - **Backpack**: Inventory overview, showing items and supplies. - - **Body State**: Health and energy status of team members. - -**3. Decision-Making Actions** - Ze Kun Song -- **Feature**: Action Menu -- **As a player**: - - I want to make strategic decisions like moving, gathering, defending, - - or broadcasting to improve my team’s survival. -- **Requirements**: - - **Move**: Enables relocation to a new area on the map. - - **Gather**: Allows collection of resources from the current environment. - - **Defend**: Option to set up defenses against threats. - - **Broadcast**: Sends out signals or attempts to locate survivors and information. - - Actions have context-dependent outcomes, with feedback influenced by - - the environment or events. - -**4. Interaction with Random Events** - Owen Hexiang Wang -- **Feature**: Random Events Engine -- **As a player**: - - I want to interact with unexpected events to experience realistic challenges and - - surprises. -- **Requirements**: - - Random events are triggered based on factors like location, weather, - - and player actions. - - Events impact resources, health, or the environment, requiring adaptive strategies. - -**5. Game Exit** - Xiaoshu Lin -- **Feature**: Exit Game -- **As a player**: - - I want the option to end or save my game to resume later. -- **Requirements**: - - Players can choose to end or save their progress. - - When ending, the game provides a summary of progress, achievements, and challenges - - faced. +# **60 Days to Survive** +## **Table of Contents** +- [Project Overview](#project-overview) +- [Features](#features) +- [Installation Instructions](#installation-instructions) +- [Usage Guide](#usage-guide) +- [Contribution Guidelines](#contribution-guidelines) +- [Authors](#authors) +- [License](#license) +- [Feedback](#feedback) + +--- + +## **Project Overview** +**60 Days to Survive** is a text-based strategy game set in a post-apocalyptic zombie world. Players must manage resources, handle daily random events, and survive for 60 days. This project is built using **Clean Architecture (CA)** for modularity, maintainability, and ease of future enhancements. + +**Why This Project?** +- Provides an engaging and challenging survival experience. +- Demonstrates the practical application of Clean Architecture. +- Aims to create a modular game that is easy to extend and maintain. + +--- + +## **Features** +1. **Resource Management**: + - Players must manage resources like food, water, weapons, and action points. + - Resource availability influences survival outcomes. + +2. **Random Events**: + - Handle events such as ambushes, blizzards, and encounters with traders. + - Each event has choices, risks, and rewards. + +3. **Map Navigation**: + - Players can move around the map to explore different terrains and gather resources. + +4. **Daily Updates**: + - Each day introduces new challenges, including resource depletion and potential encounters. + +5. **Leaderboard**: + - Track your performance and compare with other players. + +--- + +## **Installation Instructions** +### **Environment Requirements** +- **JDK**: Java 11 or higher. +- **IDE**: IntelliJ IDEA or any Java-compatible IDE. +- **Dependencies**: + - **Jackson**: For JSON data manipulation. + +### **Setup Steps** +1. Clone the repository: + ```bash + git clone https://github.com/Adidazdoge/NoteApplication.git +2. Import the project into your IDE and configure the JDK. +3. Install dependencies via your IDE's package manager. +4. Run the main application: + src/app/GameMainApplication.java +## **Usage Guide** +1. Login or Register: + - Use the login interface to sign in or create a new account. +2. Main Menu Options: + - New Game: Start a new survival challenge. + - Leaderboard: View rankings of players. + - Quit: Exit the game. +3. Gameplay: + - Daily Actions: + - Manage resources. + - Move around the map. + - Handle random events. + - Survive 60 Days: + - Balance risks and resources to outlast the apocalypse. +### **Contribution Guidelines** +We welcome contributions to improve 60 Days to Survive. Here’s how you can contribute: +**Steps to Contribute** +1. Fork the repository: + ```bash + git fork https://github.com/Adidazdoge/NoteApplication.git +2. Create a new branch: + ```bash + git checkout -b feature/your-feature +3. Commit your changes: + ```bash + git commit -m "Add your feature" +4. Push your branch: + ```bash + git push origin feature/your-feature +5. Create a Pull Request and await review. +**Contribution Guidelines** + - Provide clear commit messages. + - Follow the project's coding standards. + - Ensure all tests pass before submitting your changes. + - Include documentation for any new features. +### **Authors** + - Yitong An - vinkoos + - Haoze Li - FlashYDirOX + - Ze Kun Song - UTSGJohnsonSong + - Owen Hexiang Wang- Adidazdoge + - Xiaoshu Lin - Michael-lin6677 +### **License** + This project is licensed under the CC0 1.0 Universal license. See the LICENSE file for details. +## **Feedback** +We value your feedback and encourage you to share your thoughts to help us improve the game! Here's how you can give feedback: + +1. **Email Us**: + If you have suggestions, feature requests, or bug reports, please email [dooolly647@gmail.com]. + +### Feedback Guidelines +- Ensure your feedback is clear, concise, and respectful. +- Use the following template when reporting issues: + ```plaintext + **Subject: Feedback/Issue Report - 60 Days to Survive** + + **Description:** + Provide a clear and concise description of the issue or suggestion. + + **Steps to Reproduce (if applicable):** + 1. Step one + 2. Step two + 3. Step three + + **Expected Behavior (if applicable):** + Describe what you expected to happen. + + **Actual Behavior (if applicable):** + Describe what actually happened. + + **Environment:** + - OS: (e.g., Windows 10, macOS Monterey) + - Java Version: (e.g., Java 11) + - IDE: (e.g., IntelliJ IDEA 2022) + + **Additional Notes:** + Add any other relevant information or context here. From 0b7fe7126d1bec1f782a231c3fd10dc9f178e7ef Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Tue, 3 Dec 2024 02:09:20 -0500 Subject: [PATCH 125/154] Implement accessibility-report.md --- accessibility-report.md | 43 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 accessibility-report.md diff --git a/accessibility-report.md b/accessibility-report.md new file mode 100644 index 000000000..3c8b0705d --- /dev/null +++ b/accessibility-report.md @@ -0,0 +1,43 @@ +# **Project Accessibility Report** + +## **Principles of Universal Design** + +### 1. **Equitable Use** +- **Adherence**: The program provides the same gameplay experience for all users without discrimination. Every player, regardless of skill level, can engage with the game equally. +- **Future Improvements**: Implement features like adjustable difficulty levels to further cater to a wider range of user abilities. + +### 2. **Flexibility in Use** +- **Adherence**: The game allows players to make strategic decisions, providing multiple ways to survive (e.g., resource management, map navigation, or focusing on event handling). +- **Future Improvements**: Introduce settings to customize gameplay, such as enabling or disabling certain types of events. + +### 3. **Simple and Intuitive Use** +- **Adherence**: The game uses straightforward text-based commands, making it accessible even for users with minimal technical experience. +- **Future Improvements**: Provide an in-game tutorial or tooltips to explain mechanics to new players. + +### 4. **Perceptible Information** +- **Adherence**: Information about resources, events, and player status is clearly displayed in the UI. +- **Future Improvements**: Add audio cues for key actions to support users with visual impairments. + +### 5. **Tolerance for Error** +- **Adherence**: Players can retry actions or adapt their strategy based on outcomes without immediate penalties. +- **Future Improvements**: Introduce a save-and-load system to allow players to recover from critical mistakes. + +### 6. **Low Physical Effort** +- **Adherence**: The program requires minimal input, as most actions are performed through simple text commands or button presses. +- **Future Improvements**: Add voice recognition features for hands-free gameplay. + +### 7. **Size and Space for Approach and Use** +- **Adherence**: The text-based interface works well on various screen sizes and resolutions. +- **Future Improvements**: Develop mobile-friendly versions or adaptive layouts for different screen dimensions. + +--- + +## **Target Market** +If marketed, **60 Days to Survive** would appeal to fans of text-based strategy games, particularly those who enjoy post-apocalyptic survival scenarios. The game is suitable for players seeking a challenging, story-driven experience with resource management and decision-making elements. It would also attract hobbyists interested in games designed with Clean Architecture, as well as students learning about modular software design. + +In addition, the game could target casual gamers who prefer low-intensity, text-based gameplay that doesn't require high-end hardware. By maintaining simplicity in its user interface and gameplay, the game can cater to a diverse audience, including those new to the strategy or survival genres. + +--- + +## **Potential Demographic Barriers** +The program might be less accessible to players with certain disabilities, such as visual impairments, due to its reliance on a text-based interface. Future updates could incorporate accessibility features like text-to-speech or screen reader support to mitigate this issue. Additionally, the game’s English-only interface might limit access for non-English speakers. From 84beef3dc885d19dd105bb4c82924df305547f48 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 02:16:30 -0500 Subject: [PATCH 126/154] add external api chatgpt:w --- .../database/InMemoryUnifiedDataAccess.java | 20 ++- .../chatgpt/ChatGptResponseParser.java | 36 ++++++ .../java/usecases/chatgpt/ChatGptService.java | 75 +++++++++++ .../ambush/AmbushDataAccessInterface.java | 14 ++- .../ambush/AmbushEventInteractor.java | 118 ++++++++++-------- 5 files changed, 203 insertions(+), 60 deletions(-) create mode 100644 src/main/java/usecases/chatgpt/ChatGptResponseParser.java create mode 100644 src/main/java/usecases/chatgpt/ChatGptService.java diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index 99a8187ed..f81cbd418 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -1,6 +1,8 @@ package frameworks.database; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import entities.*; import interface_adapters.nevagategame.NevagateGameInterface; @@ -92,12 +94,24 @@ public InMemoryUnifiedDataAccess(PlayerAttributes playerAttributes, Inventory in this.traderEncounter = traderEncounter; } - // Implementation of AllowcateDataAccessInterface - @Override - public PlayerAttributes getPlayerAttributes() { + public PlayerAttributes getPlayerAttributesAsObject() { return playerAttributes; } + /** + * Returns player attributes as a map. + */ + @Override + public Map getPlayerAttributes() { + Map attributesMap = new HashMap<>(); + attributesMap.put("Social", playerAttributes.getSocial()); + attributesMap.put("Luck", playerAttributes.getLuck()); + attributesMap.put("Mobilization", playerAttributes.getMobilization()); + attributesMap.put("Thrift", playerAttributes.getThrift()); + attributesMap.put("Generalship", playerAttributes.getGeneralship()); + return attributesMap; + } + @Override public void setSocial(int social) { playerAttributes.setSocial(social); diff --git a/src/main/java/usecases/chatgpt/ChatGptResponseParser.java b/src/main/java/usecases/chatgpt/ChatGptResponseParser.java new file mode 100644 index 000000000..48542043d --- /dev/null +++ b/src/main/java/usecases/chatgpt/ChatGptResponseParser.java @@ -0,0 +1,36 @@ +package usecases.chatgpt; + +/** + * Utility class to parse ChatGPT responses. + */ +public class ChatGptResponseParser { + + /** + * Parses the choice (1, 2, or 3) from the ChatGPT response. + * + * @param chatResponse The response from ChatGPT. + * @return The parsed choice as an integer. + * @throws IllegalArgumentException If the choice cannot be parsed. + */ + public int parseChoice(String chatResponse) { + try { + return Integer.parseInt(chatResponse.split("\\.")[0].trim()); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid ChatGPT response format: " + chatResponse); + } + } + + /** + * Parses the descriptive paragraph from the ChatGPT response. + * + * @param chatResponse The response from ChatGPT. + * @return The parsed description as a string. + */ + public String parseDescription(String chatResponse) { + int colonIndex = chatResponse.indexOf(":"); + if (colonIndex == -1 || colonIndex + 1 >= chatResponse.length()) { + throw new IllegalArgumentException("Invalid ChatGPT response format: " + chatResponse); + } + return chatResponse.substring(colonIndex + 1).trim(); + } +} \ No newline at end of file diff --git a/src/main/java/usecases/chatgpt/ChatGptService.java b/src/main/java/usecases/chatgpt/ChatGptService.java new file mode 100644 index 000000000..028c16430 --- /dev/null +++ b/src/main/java/usecases/chatgpt/ChatGptService.java @@ -0,0 +1,75 @@ +package usecases.chatgpt; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Map; + +/** + * Service to integrate ChatGPT API. + */ +public class ChatGptService { + private static final String API_URL = "https://api.openai.com/v1/completions"; + private static final String API_KEY = ""; + + /** + * Sends a request to ChatGPT with the event description, player attributes, and choices. + * @param eventDescription Description of the event. + * @param playerAttributes Player's attributes as key-value pairs. + * @param choices Event choices. + * @return The response from ChatGPT. + * @throws Exception If an error occurs during the API call. + */ + public String getResponse(String eventDescription, Map playerAttributes, Map choices) throws Exception { + URL url = new URL(API_URL); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Authorization", "Bearer " + API_KEY); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setDoOutput(true); + + // Build the prompt for ChatGPT + String prompt = generatePrompt(eventDescription, playerAttributes, choices); + + // Construct the request payload + ObjectMapper objectMapper = new ObjectMapper(); + String requestBody = objectMapper.writeValueAsString(Map.of( + "model", "gpt-3.5-turbo", + "prompt", prompt, + "max_tokens", 150, + "temperature", 0.7 + )); + + // Send the request + try (OutputStream os = connection.getOutputStream()) { + os.write(requestBody.getBytes()); + os.flush(); + } + + // Read the response + if (connection.getResponseCode() == 200) { + return new String(connection.getInputStream().readAllBytes()); + } else { + throw new RuntimeException("Failed to call ChatGPT API: HTTP " + connection.getResponseCode()); + } + } + + /** + * Generates the prompt for ChatGPT. + * @param eventDescription Description of the event. + * @param playerAttributes Player's attributes. + * @param choices Event choices. + * @return The formatted prompt. + */ + private String generatePrompt(String eventDescription, Map playerAttributes, Map choices) { + StringBuilder prompt = new StringBuilder(); + prompt.append("Event Description: ").append(eventDescription).append("\n"); + prompt.append("Player Attributes: ").append(playerAttributes).append("\n"); + prompt.append("Choices:\n"); + choices.forEach((key, value) -> prompt.append(key).append(". ").append(value).append("\n")); + prompt.append("Choose the best option and provide a short paragraph explaining the result."); + return prompt.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java b/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java index bbfe9bd55..2b1e13466 100644 --- a/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java @@ -2,7 +2,8 @@ import entities.Event; import entities.Inventory; -import entities.PlayerAttributes; + +import java.util.Map; /** * Interface for data access in the Ambush event. @@ -11,10 +12,17 @@ public interface AmbushDataAccessInterface { Event getEvent(); void removeEvent(); Inventory getInventory(); - PlayerAttributes getPlayerAttributes(); + + /** + * Returns player attributes as a map. + * Key: Attribute name (e.g., "Social"). + * Value: Attribute value. + * @return Map of player attributes. + */ + Map getPlayerAttributes(); void changeFood(int amount); void changeWater(int amount); void changeWeapon(int amount); void changePeople(int amount); -} +} \ No newline at end of file diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java index 0dab653c1..df9138a5d 100644 --- a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java +++ b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java @@ -2,82 +2,92 @@ import entities.EntityConstants; import entities.EventAmbush; -import usecases.eventrespond.ambush.AmbushInputData; -import usecases.eventrespond.ambush.AmbushOutputBoundary; -import usecases.eventrespond.ambush.AmbushDataAccessInterface; +import usecases.chatgpt.ChatGptService; +import usecases.chatgpt.ChatGptResponseParser; + +import java.util.Map; /** * Interactor for handling player responses to an Ambush event. - * Implements the AmbushInputBoundary interface. + * Delegates response generation to ChatGPT and applies game logic based on the response. */ public class AmbushEventInteractor implements AmbushInputBoundary { private final AmbushDataAccessInterface dataAccess; private final AmbushOutputBoundary outputBoundary; + private final ChatGptService chatGptService; + private final ChatGptResponseParser responseParser; - public AmbushEventInteractor(AmbushDataAccessInterface dataAccess, AmbushOutputBoundary outputBoundary) { + public AmbushEventInteractor(AmbushDataAccessInterface dataAccess, + AmbushOutputBoundary outputBoundary, + ChatGptService chatGptService, + ChatGptResponseParser responseParser) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; + this.chatGptService = chatGptService; + this.responseParser = responseParser; } @Override public void execute(AmbushInputData inputData) { EventAmbush ambushEvent = (EventAmbush) dataAccess.getEvent(); - int choice = inputData.getChoice(); + Map playerAttributes = dataAccess.getPlayerAttributes(); + Map choices = ambushEvent.getchoices(); - int foodChange = 0; - int waterChange = 0; - int weaponChange = 0; - int peopleChange = 0; - String message; + try { + // Call ChatGPT to generate a response + String chatResponse = chatGptService.getResponse(ambushEvent.getdescription(), playerAttributes, choices); - if (choice == EntityConstants.FIRSTCHOICE) { - // Fight back - if (dataAccess.getInventory().getfirepower() >= EntityConstants.AMBUSHPOWER) { - foodChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; - peopleChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; - message = ambushEvent.getFightoutcomesuccess(); - } else { + // Parse the ChatGPT response + int chosenOption = responseParser.parseChoice(chatResponse); + String eventDescription = responseParser.parseDescription(chatResponse); + + // Handle game logic based on the chosen option + int foodChange = 0, waterChange = 0, weaponChange = 0, peopleChange = 0; + + if (chosenOption == EntityConstants.FIRSTCHOICE) { + // Fight back + if (dataAccess.getInventory().getfirepower() >= EntityConstants.AMBUSHPOWER) { + foodChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWEAPON; + peopleChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEPEOPLE; + } else { + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + peopleChange = EntityConstants.AMBUSHFAILRESOURCEPEOPLE; + } + } else if (chosenOption == EntityConstants.SECONDCHOICE) { + // Pay the bandits foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - peopleChange = EntityConstants.AMBUSHFAILRESOURCEPEOPLE; - message = ambushEvent.getFightoutcomefailed(); - } - } else if (choice == EntityConstants.SECONDCHOICE) { - // Pay the bandits - foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - message = ambushEvent.getPayoutcome(); - } else if (choice == EntityConstants.THIRDCHOICE) { - // Negotiate - if (dataAccess.getPlayerAttributes().getSocial() >= EntityConstants.AMBUSHNEGOTIATE) { - message = ambushEvent.getNegotiatesuccessoutcome(); + } else if (chosenOption == EntityConstants.THIRDCHOICE) { + // Negotiate + if (playerAttributes.getOrDefault("Social", 0) >= EntityConstants.AMBUSHNEGOTIATE) { + // Successful negotiation + } else { + foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; + waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; + weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; + } } else { - foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; - waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; - weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - message = ambushEvent.getNegotiatefailedoutcome(); + throw new IllegalArgumentException("Invalid choice from ChatGPT: " + chosenOption); } - } else { - // Invalid choice - outputBoundary.prepareFailureView("Invalid choice provided."); - return; - } - // Apply changes to inventory - dataAccess.changeFood(foodChange); - dataAccess.changeWater(waterChange); - dataAccess.changeWeapon(weaponChange); - dataAccess.changePeople(peopleChange); - dataAccess.removeEvent(); + // Apply inventory changes + dataAccess.changeFood(foodChange); + dataAccess.changeWater(waterChange); + dataAccess.changeWeapon(weaponChange); + dataAccess.changePeople(peopleChange); + dataAccess.removeEvent(); - // Prepare output - String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + - ", Weapons " + weaponChange + ", People " + peopleChange + "."; - AmbushOutputData outputData = new AmbushOutputData(message, foodChange, waterChange, weaponChange, peopleChange, inventoryMessage); - outputBoundary.prepareSuccessView(outputData); + // Prepare output + AmbushOutputData outputData = new AmbushOutputData(eventDescription, foodChange, waterChange, weaponChange, peopleChange, "Resources updated."); + outputBoundary.prepareSuccessView(outputData); + + } catch (Exception e) { + outputBoundary.prepareFailureView("Failed to process ChatGPT response: " + e.getMessage()); + } } -} +} \ No newline at end of file From f1fe2e933eb1204853ce456fe14b03862b3bfa60 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 02:54:20 -0500 Subject: [PATCH 127/154] add chatgpt api response for two events --- .../blizzard/BlizzardDataAccessInterface.java | 14 ++- .../blizzard/BlizzardEventInteractor.java | 94 +++++++++++-------- 2 files changed, 66 insertions(+), 42 deletions(-) diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java index 251d3d08f..bb607789d 100644 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java @@ -2,7 +2,8 @@ import entities.Event; import entities.Inventory; -import entities.PlayerAttributes; + +import java.util.Map; /** * Interface for data access in the Blizzard event. @@ -11,8 +12,15 @@ public interface BlizzardDataAccessInterface { Event getEvent(); void removeEvent(); Inventory getInventory(); - PlayerAttributes getPlayerAttributes(); + + /** + * Returns player attributes as a map. + * Key: Attribute name (e.g., "Social"). + * Value: Attribute value. + * @return Map of player attributes. + */ + Map getPlayerAttributes(); void changeFood(int amount); void changeWater(int amount); -} +} \ No newline at end of file diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java index 0b16dc4a5..6fe45faa2 100644 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java @@ -2,60 +2,76 @@ import entities.EntityConstants; import entities.EventBlizzard; -import usecases.eventrespond.blizzard.BlizzardInputData; -import usecases.eventrespond.blizzard.BlizzardOutputBoundary; -import usecases.eventrespond.blizzard.BlizzardDataAccessInterface; +import usecases.chatgpt.ChatGptService; +import usecases.chatgpt.ChatGptResponseParser; + +import java.util.Map; /** * Interactor for handling player responses to a Blizzard event. - * Implements the BlizzardInputBoundary interface. + * Delegates response generation to ChatGPT and applies game logic based on the response. */ public class BlizzardEventInteractor implements BlizzardInputBoundary { private final BlizzardDataAccessInterface dataAccess; private final BlizzardOutputBoundary outputBoundary; + private final ChatGptService chatGptService; + private final ChatGptResponseParser responseParser; - public BlizzardEventInteractor(BlizzardDataAccessInterface dataAccess, BlizzardOutputBoundary outputBoundary) { + public BlizzardEventInteractor(BlizzardDataAccessInterface dataAccess, + BlizzardOutputBoundary outputBoundary, + ChatGptService chatGptService, + ChatGptResponseParser responseParser) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; + this.chatGptService = chatGptService; + this.responseParser = responseParser; } @Override public void execute(BlizzardInputData inputData) { EventBlizzard blizzardEvent = (EventBlizzard) dataAccess.getEvent(); - int choice = inputData.getChoice(); - - int foodChange = 0, waterChange = 0; - String message; - - if (choice == EntityConstants.FIRSTCHOICE) { - // Secure shelter - foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD / 2; - waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER / 2; - message = blizzardEvent.getFightOutcome(); - } else if (choice == EntityConstants.SECONDCHOICE) { - // Prepare supplies - foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD; - waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER; - message = blizzardEvent.getNegotiateOutcome(); - } else if (choice == EntityConstants.THIRDCHOICE) { - // Do nothing - foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD * 2; - waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER * 2; - message = blizzardEvent.getFleeOutcome(); - } else { - // Invalid choice - outputBoundary.prepareFailureView("Invalid choice provided. Please select a valid option."); - return; - } + Map playerAttributes = dataAccess.getPlayerAttributes(); + Map choices = blizzardEvent.getchoices(); + + try { + // Call ChatGPT to generate a response + String chatResponse = chatGptService.getResponse(blizzardEvent.getdescription(), playerAttributes, choices); + + // Parse the ChatGPT response + int chosenOption = responseParser.parseChoice(chatResponse); + String eventDescription = responseParser.parseDescription(chatResponse); - // Apply resource changes to the inventory - dataAccess.changeFood(foodChange); - dataAccess.changeWater(waterChange); - dataAccess.removeEvent(); + // Handle game logic based on the chosen option + int foodChange = 0, waterChange = 0; - // Prepare output - String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + "."; - BlizzardOutputData outputData = new BlizzardOutputData(message, foodChange, waterChange, 0, 0, inventoryMessage); - outputBoundary.prepareSuccessView(outputData); + if (chosenOption == EntityConstants.FIRSTCHOICE) { + // Secure shelter + foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD / 2; + waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER / 2; + } else if (chosenOption == EntityConstants.SECONDCHOICE) { + // Prepare supplies + foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD; + waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER; + } else if (chosenOption == EntityConstants.THIRDCHOICE) { + // Do nothing + foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD * 2; + waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER * 2; + } else { + throw new IllegalArgumentException("Invalid choice from ChatGPT: " + chosenOption); + } + + // Apply inventory changes + dataAccess.changeFood(foodChange); + dataAccess.changeWater(waterChange); + dataAccess.removeEvent(); + + // Prepare output + String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + "."; + BlizzardOutputData outputData = new BlizzardOutputData(eventDescription, foodChange, waterChange, 0, 0, inventoryMessage); + outputBoundary.prepareSuccessView(outputData); + + } catch (Exception e) { + outputBoundary.prepareFailureView("Failed to process ChatGPT response: " + e.getMessage()); + } } -} +} \ No newline at end of file From 1b396532dbd5d60ecc14cc8b36bfe7ba48f16f77 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 03:56:19 -0500 Subject: [PATCH 128/154] add chatgpt api response for flood event --- .../flood/FloodDataAccessInterface.java | 14 +++- .../flood/FloodEventInteractor.java | 78 +++++++++++-------- 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java b/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java index 3233ca2e6..cf6237449 100644 --- a/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java @@ -2,7 +2,8 @@ import entities.Event; import entities.Inventory; -import entities.PlayerAttributes; + +import java.util.Map; /** * Interface for data access in the Flood event. @@ -11,9 +12,16 @@ public interface FloodDataAccessInterface { Event getEvent(); void removeEvent(); Inventory getInventory(); - PlayerAttributes getPlayerAttributes(); + + /** + * Returns player attributes as a map. + * Key: Attribute name (e.g., "Social"). + * Value: Attribute value. + * @return Map of player attributes. + */ + Map getPlayerAttributes(); void changeFood(int amount); void changeWater(int amount); void changePeople(int amount); -} +} \ No newline at end of file diff --git a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java index a2c3094ef..ef419b619 100644 --- a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java +++ b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java @@ -2,62 +2,78 @@ import entities.EntityConstants; import entities.EventFlood; -import usecases.eventrespond.flood.FloodInputData; -import usecases.eventrespond.flood.FloodOutputBoundary; -import usecases.eventrespond.flood.FloodDataAccessInterface; +import usecases.chatgpt.ChatGptService; +import usecases.chatgpt.ChatGptResponseParser; + +import java.util.Map; /** * Interactor for handling player responses to a Flood event. - * Implements the FloodInputBoundary interface. + * Delegates response generation to ChatGPT and applies game logic based on the response. */ public class FloodEventInteractor implements FloodInputBoundary { private final FloodDataAccessInterface dataAccess; private final FloodOutputBoundary outputBoundary; + private final ChatGptService chatGptService; + private final ChatGptResponseParser responseParser; - public FloodEventInteractor(FloodDataAccessInterface dataAccess, FloodOutputBoundary outputBoundary) { + public FloodEventInteractor(FloodDataAccessInterface dataAccess, + FloodOutputBoundary outputBoundary, + ChatGptService chatGptService, + ChatGptResponseParser responseParser) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; + this.chatGptService = chatGptService; + this.responseParser = responseParser; } @Override public void execute(FloodInputData inputData) { EventFlood floodEvent = (EventFlood) dataAccess.getEvent(); - int choice = inputData.getChoice(); + Map playerAttributes = dataAccess.getPlayerAttributes(); + Map choices = floodEvent.getchoices(); + + try { + // Call ChatGPT to generate a response + String chatResponse = chatGptService.getResponse(floodEvent.getdescription(), playerAttributes, choices); + + // Parse the ChatGPT response + int chosenOption = responseParser.parseChoice(chatResponse); + String eventDescription = responseParser.parseDescription(chatResponse); - int foodChange = 0, waterChange = 0, peopleChange = 0; - String message; + // Handle game logic based on the chosen option + int foodChange = 0, waterChange = 0, peopleChange = 0; - switch (choice) { - case EntityConstants.FIRSTCHOICE: // Evacuate to higher ground + if (chosenOption == EntityConstants.FIRSTCHOICE) { + // Evacuate to higher ground foodChange = EntityConstants.FLOODRESOURCELOSSFOOD; peopleChange = EntityConstants.FLOODPEOPLELOSSLOW; - message = floodEvent.getEvacuateOutcome(); - break; - case EntityConstants.SECONDCHOICE: // Secure supplies and hold position + } else if (chosenOption == EntityConstants.SECONDCHOICE) { + // Secure supplies and hold position foodChange = EntityConstants.FLOODRESOURCELOSSSECURE; peopleChange = EntityConstants.FLOODPEOPLELOSSMODERATE; - message = floodEvent.getSecureSuppliesOutcome(); - break; - case EntityConstants.THIRDCHOICE: // Do nothing + } else if (chosenOption == EntityConstants.THIRDCHOICE) { + // Do nothing foodChange = EntityConstants.FLOODRESOURCELOSSHIGH; peopleChange = EntityConstants.FLOODPEOPLELOSSHIGH; - message = floodEvent.getDoNothingOutcome(); - break; - default: // Invalid choice - outputBoundary.prepareFailureView("Invalid choice provided."); - return; - } + } else { + throw new IllegalArgumentException("Invalid choice from ChatGPT: " + chosenOption); + } - // Apply changes to inventory - dataAccess.changeFood(foodChange); - dataAccess.changeWater(waterChange); - dataAccess.changePeople(peopleChange); - dataAccess.removeEvent(); + // Apply inventory changes + dataAccess.changeFood(foodChange); + dataAccess.changeWater(waterChange); + dataAccess.changePeople(peopleChange); + dataAccess.removeEvent(); - // Prepare output + // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + ", People " + peopleChange + "."; - FloodOutputData outputData = new FloodOutputData(message, foodChange, waterChange, 0, peopleChange, inventoryMessage); - outputBoundary.prepareSuccessView(outputData); + FloodOutputData outputData = new FloodOutputData(eventDescription, foodChange, waterChange, 0, peopleChange, inventoryMessage); + outputBoundary.prepareSuccessView(outputData); + + } catch (Exception e) { + outputBoundary.prepareFailureView("Failed to process ChatGPT response: " + e.getMessage()); + } } -} +} \ No newline at end of file From 37e4027d87fac148ec58b5c3b68cb51bf317030c Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Tue, 3 Dec 2024 04:46:08 -0500 Subject: [PATCH 129/154] Convert the page transfer to CA Logic --- src/main/java/app/GameMainApplication.java | 23 +++-- src/main/java/app/JsonApplication.java | 91 +++++++++++++++++++ src/main/java/app/LoginApplication.java | 39 -------- src/main/java/app/SignupApplication.java | 44 --------- .../database/InMemoryUnifiedDataAccess.java | 9 +- .../NavigationManagerJson.java | 45 +++++++++ .../login/LoginPresenter.java | 14 ++- .../NevagateRankingController.java | 31 +++++++ .../NevagateRankingPresenter.java | 33 +++++++ .../NevagateSignupController.java | 31 +++++++ .../NevagateSignupPresenter.java | 33 +++++++ .../NevagateEventController.java | 5 +- .../nevagateevent/NevagateEventPresenter.java | 4 +- .../nevagategame/NevagateGameController.java | 4 +- .../nevagategame/NevagateGamePresenter.java | 4 +- .../NevagateGameOverController.java | 4 +- .../NevagateGameOverPresenter.java | 4 +- .../NevagateLoginController.java | 23 +++++ .../NevagateLoginInterface.java | 13 +++ .../NevagateLoginPresenter.java | 22 +++++ .../NevagateMainController.java | 4 +- .../NevagateMainPresenter.java | 3 +- .../NevagateEventDataAccessInterface.java | 2 +- .../NevagateEventInputBoundary.java | 2 +- .../NevagateEventInputdata.java | 2 +- .../NevagateEventInteractor.java | 2 +- .../NevagateEventOutputBoundary.java | 2 +- .../NevagateEventOutputdata.java | 2 +- .../NevagateGameDataAccessInterface.java | 2 +- .../NevagateGameInputBoundary.java | 2 +- .../NevagateGameInputdata.java | 2 +- .../NevagateGameInteractor.java | 2 +- .../NevagateGameOutputBoundary.java | 2 +- .../NevagateGameOutputdata.java | 2 +- .../NevagateGameOverDataAccessInterface.java | 2 +- .../NevagateGameOverInputBoundary.java | 2 +- .../NevagateGameOverInputdata.java | 2 +- .../NevagateGameOverInteractor.java | 2 +- .../NevagateGameOverOutputBoundary.java | 2 +- .../NevagateGameOverOutputdata.java | 2 +- .../NevagateLoginDataAccessInterface.java | 8 ++ .../NevagateLoginInputBoundary.java | 14 +++ .../nevagateLogin/NevagateLoginInputData.java | 7 ++ .../NevagateLoginInteractor.java | 19 ++++ .../NevagateLoginOutputBoundary.java | 14 +++ .../NevagateLoginOutputData.java | 16 ++++ .../NevagateMainDataAccessInterface.java | 2 +- .../NevagateMainInputBoundary.java | 2 +- .../NevagateMainInputdata.java | 2 +- .../NevagateMainInteractor.java | 2 +- .../NevagateMainOutputBoundary.java | 2 +- .../NevagateMainOutputdata.java | 2 +- .../NevagateRankingDataAccessInterface.java | 7 ++ .../NevagateRankingInputBoundary.java | 14 +++ .../NevagateRankingInputData.java | 26 ++++++ .../NevagateRankingInteractor.java | 30 ++++++ .../NevagateRankingOutputBoundary.java | 14 +++ .../NevagateRankingOutputData.java | 27 ++++++ .../NevagateSignupDataAccessInterface.java | 7 ++ .../NevagateSignupInputBoundary.java | 13 +++ .../NevagateSignupInputData.java | 27 ++++++ .../NevagateSignupInteractor.java | 30 ++++++ .../NevagateSignupOutputBoundary.java | 14 +++ .../NevagateSignupOutputData.java | 28 ++++++ src/main/java/view/GameView.java | 5 +- src/main/java/view/LoginView.java | 67 +++++++++----- src/main/java/view/MainView.java | 62 +++++++++---- src/main/java/view/RankingView.java | 65 ++++++++----- src/main/java/view/SignUpView.java | 62 +++++++++---- 69 files changed, 884 insertions(+), 223 deletions(-) create mode 100644 src/main/java/app/JsonApplication.java delete mode 100644 src/main/java/app/LoginApplication.java delete mode 100644 src/main/java/app/SignupApplication.java create mode 100644 src/main/java/interface_adapters/NavigationManagerJson.java create mode 100644 src/main/java/interface_adapters/nevagateRanking/NevagateRankingController.java create mode 100644 src/main/java/interface_adapters/nevagateRanking/NevagateRankingPresenter.java create mode 100644 src/main/java/interface_adapters/nevagateSignup/NevagateSignupController.java create mode 100644 src/main/java/interface_adapters/nevagateSignup/NevagateSignupPresenter.java create mode 100644 src/main/java/interface_adapters/nevagateloginview/NevagateLoginController.java create mode 100644 src/main/java/interface_adapters/nevagateloginview/NevagateLoginInterface.java create mode 100644 src/main/java/interface_adapters/nevagateloginview/NevagateLoginPresenter.java rename src/main/java/usecases/{NevagateEventPage => nevagateEventPage}/NevagateEventDataAccessInterface.java (87%) rename src/main/java/usecases/{NevagateEventPage => nevagateEventPage}/NevagateEventInputBoundary.java (78%) rename src/main/java/usecases/{NevagateEventPage => nevagateEventPage}/NevagateEventInputdata.java (64%) rename src/main/java/usecases/{NevagateEventPage => nevagateEventPage}/NevagateEventInteractor.java (96%) rename src/main/java/usecases/{NevagateEventPage => nevagateEventPage}/NevagateEventOutputBoundary.java (85%) rename src/main/java/usecases/{NevagateEventPage => nevagateEventPage}/NevagateEventOutputdata.java (64%) rename src/main/java/usecases/{nevagategame => nevagateGame}/NevagateGameDataAccessInterface.java (78%) rename src/main/java/usecases/{nevagategame => nevagateGame}/NevagateGameInputBoundary.java (81%) rename src/main/java/usecases/{nevagategame => nevagateGame}/NevagateGameInputdata.java (70%) rename src/main/java/usecases/{nevagategame => nevagateGame}/NevagateGameInteractor.java (95%) rename src/main/java/usecases/{nevagategame => nevagateGame}/NevagateGameOutputBoundary.java (84%) rename src/main/java/usecases/{nevagategame => nevagateGame}/NevagateGameOutputdata.java (67%) rename src/main/java/usecases/{nevagategameover => nevagateGameover}/NevagateGameOverDataAccessInterface.java (69%) rename src/main/java/usecases/{nevagategameover => nevagateGameover}/NevagateGameOverInputBoundary.java (78%) rename src/main/java/usecases/{nevagategameover => nevagateGameover}/NevagateGameOverInputdata.java (65%) rename src/main/java/usecases/{nevagategameover => nevagateGameover}/NevagateGameOverInteractor.java (95%) rename src/main/java/usecases/{nevagategameover => nevagateGameover}/NevagateGameOverOutputBoundary.java (77%) rename src/main/java/usecases/{nevagategameover => nevagateGameover}/NevagateGameOverOutputdata.java (66%) create mode 100644 src/main/java/usecases/nevagateLogin/NevagateLoginDataAccessInterface.java create mode 100644 src/main/java/usecases/nevagateLogin/NevagateLoginInputBoundary.java create mode 100644 src/main/java/usecases/nevagateLogin/NevagateLoginInputData.java create mode 100644 src/main/java/usecases/nevagateLogin/NevagateLoginInteractor.java create mode 100644 src/main/java/usecases/nevagateLogin/NevagateLoginOutputBoundary.java create mode 100644 src/main/java/usecases/nevagateLogin/NevagateLoginOutputData.java rename src/main/java/usecases/{nevagatemain => nevagateMain}/NevagateMainDataAccessInterface.java (76%) rename src/main/java/usecases/{nevagatemain => nevagateMain}/NevagateMainInputBoundary.java (81%) rename src/main/java/usecases/{nevagatemain => nevagateMain}/NevagateMainInputdata.java (74%) rename src/main/java/usecases/{nevagatemain => nevagateMain}/NevagateMainInteractor.java (95%) rename src/main/java/usecases/{nevagatemain => nevagateMain}/NevagateMainOutputBoundary.java (83%) rename src/main/java/usecases/{nevagatemain => nevagateMain}/NevagateMainOutputdata.java (74%) create mode 100644 src/main/java/usecases/nevagateRanking/NevagateRankingDataAccessInterface.java create mode 100644 src/main/java/usecases/nevagateRanking/NevagateRankingInputBoundary.java create mode 100644 src/main/java/usecases/nevagateRanking/NevagateRankingInputData.java create mode 100644 src/main/java/usecases/nevagateRanking/NevagateRankingInteractor.java create mode 100644 src/main/java/usecases/nevagateRanking/NevagateRankingOutputBoundary.java create mode 100644 src/main/java/usecases/nevagateRanking/NevagateRankingOutputData.java create mode 100644 src/main/java/usecases/nevagateSignup/NevagateSignupDataAccessInterface.java create mode 100644 src/main/java/usecases/nevagateSignup/NevagateSignupInputBoundary.java create mode 100644 src/main/java/usecases/nevagateSignup/NevagateSignupInputData.java create mode 100644 src/main/java/usecases/nevagateSignup/NevagateSignupInteractor.java create mode 100644 src/main/java/usecases/nevagateSignup/NevagateSignupOutputBoundary.java create mode 100644 src/main/java/usecases/nevagateSignup/NevagateSignupOutputData.java diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index e74560b5c..e7e225be8 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -55,7 +55,7 @@ import interface_adapters.nevagatemainview.NevagateMainPresenter; import interface_adapters.startallowcatepoint.AllowcateController; import interface_adapters.startallowcatepoint.AllowcatePresenter; -import usecases.NevagateEventPage.NevagateEventInteractor; +import usecases.nevagateEventPage.NevagateEventInteractor; import usecases.dailybroadcast.BroadcastInteractor; import usecases.dailygather.GatherInteractor; import usecases.dailymove.MoveInteractor; @@ -74,9 +74,9 @@ import usecases.gamenewday.NewdayInteractor; import usecases.gameplacedescription.PlaceDescriptionInteractor; import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; -import usecases.nevagategame.NevagateGameInteractor; -import usecases.nevagategameover.NevagateGameOverInteractor; -import usecases.nevagatemain.NevagateMainInteractor; +import usecases.nevagateGame.NevagateGameInteractor; +import usecases.nevagateGameover.NevagateGameOverInteractor; +import usecases.nevagateMain.NevagateMainInteractor; import usecases.startallowcate.AllowcateInteractor; import frameworks.database.JsonRankingDataAccess; import view.*; @@ -105,6 +105,7 @@ public static void endGame(String filePath, String username, int score, int days System.err.println("Failed to update ranking data: " + e.getMessage()); } } + /** * Main of the game loop. * @param args args @@ -149,12 +150,16 @@ public static void main(String[] args) { new NavigationManager(mainView, attributeview, gameView, eventView, informationView, gameOverView); // initialize each usecase. // Nevagate to allowcate page usecase. - final NevagateAllowcatePresenter nevagateallowcatepresener = new NevagateAllowcatePresenter(navigationManager); - final NevagateAllowcateInteractor nevagateAllowcateInteractor = - new NevagateAllowcateInteractor(gamedatabase, nevagateallowcatepresener); - final NevagateAllowcateController nevagateAllowcateController = - new NevagateAllowcateController(nevagateAllowcateInteractor); + final NevagateAllowcatePresenter nevagateAllowcatePresenter = new NevagateAllowcatePresenter(navigationManager); + final NevagateAllowcateInteractor nevagateAllowcateInteractor = new NevagateAllowcateInteractor( + gamedatabase, nevagateAllowcatePresenter); + final NevagateAllowcateController nevagateAllowcateController = new NevagateAllowcateController( + nevagateAllowcateInteractor); + + System.out.println("Starting JsonApplication initialization..."); mainView.setNevagateAllowcateController(nevagateAllowcateController); + System.out.println("NevagateAllowcateController is set successfully!"); + mainView.render(); // Allowcate points ussecase. final AllowcatePresenter allowcatePresenter = new AllowcatePresenter(attributeview, navigationManager); diff --git a/src/main/java/app/JsonApplication.java b/src/main/java/app/JsonApplication.java new file mode 100644 index 000000000..64989f217 --- /dev/null +++ b/src/main/java/app/JsonApplication.java @@ -0,0 +1,91 @@ +package app; + +import java.io.IOException; + +import frameworks.database.JsonLoginDataAccess; +import frameworks.database.JsonSignupDataAccess; +import frameworks.database.JsonRankingDataAccess; +import interface_adapters.NavigationManagerJson; +import interface_adapters.login.LoginController; +import interface_adapters.login.LoginPresenter; +import interface_adapters.rankinglist.RankingController; +import interface_adapters.rankinglist.RankingPresenter; +import interface_adapters.signup.SignupController; +import interface_adapters.signup.SignupPresenter; +import usecases.accountlogin.LoginInteractor; +import usecases.accountsignup.SignupInteractor; +import usecases.accountranking.RankingInteractor; +import view.LoginView; +import view.MainView; +import view.RankingView; +import view.SignUpView; + +public class JsonApplication { + private final NavigationManagerJson navigationManagerJson; + private final LoginController loginController; + private final SignupController signupController; + private final RankingController rankingController; + + /** + * Initializes the integrated application. + * + * @param loginFilePath Path to the login JSON file. + * @param signupFilePath Path to the signup JSON file. + * @param rankingFilePath Path to the ranking JSON file. + * @throws IOException If there is an issue accessing the JSON files. + */ + public JsonApplication(String loginFilePath, String signupFilePath, String rankingFilePath) throws IOException { + // Initialize Views + final LoginView loginView = new LoginView(); + final SignUpView signUpView = new SignUpView(); + final RankingView rankingView = new RankingView(); + final MainView mainView = new MainView(); + + // Navigation Manager + navigationManagerJson = new NavigationManagerJson(loginView, signUpView, mainView, rankingView); + + // Login Initialization + final JsonLoginDataAccess loginDataAccess = new JsonLoginDataAccess(loginFilePath); + final LoginPresenter loginPresenter = new LoginPresenter(loginView, navigationManagerJson); + final LoginInteractor loginInteractor = new LoginInteractor(loginDataAccess, loginPresenter); + loginController = new LoginController(loginInteractor); + loginView.setLoginController(loginController); + + // Signup Initialization + final JsonSignupDataAccess signupDataAccess = new JsonSignupDataAccess(signupFilePath); + final SignupPresenter signupPresenter = new SignupPresenter(signUpView); + final SignupInteractor signupInteractor = new SignupInteractor(signupDataAccess, signupPresenter); + signupController = new SignupController(signupInteractor); + signUpView.setSignupController(signupController); + + // Ranking Initialization + final JsonRankingDataAccess rankingDataAccess = new JsonRankingDataAccess(rankingFilePath); + final RankingPresenter rankingPresenter = new RankingPresenter(rankingView); + final RankingInteractor rankingInteractor = new RankingInteractor(rankingDataAccess, rankingPresenter); + rankingController = new RankingController(rankingInteractor); + rankingView.setRankingController(rankingController); + + // Link navigation manager to login view + loginView.setNavigationManager(navigationManagerJson); + signUpView.setNavigationManager(navigationManagerJson); + rankingView.setNavigationManager(navigationManagerJson); + mainView.setNavigationManager(navigationManagerJson); + + // Start login view + loginView.render(); + } + + /** + * Entry point to initialize the application. + * + * @param args Command-line arguments. + */ + public static void main(String[] args) { + try { + new JsonApplication("PlayerFile", "PlayerFile", "RankingFile"); + } + catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/app/LoginApplication.java b/src/main/java/app/LoginApplication.java deleted file mode 100644 index 4849e175d..000000000 --- a/src/main/java/app/LoginApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -package app; - -import java.io.IOException; - -import frameworks.database.JsonLoginDataAccess; -import interface_adapters.login.LoginController; -import interface_adapters.login.LoginInterface; -import interface_adapters.login.LoginPresenter; -import usecases.accountlogin.LoginInputBoundary; -import usecases.accountlogin.LoginInteractor; -import usecases.accountlogin.LoginOutputBoundary; - -/** - * The LoginApplication class initializes and connects all components - * for the login feature, including the interactor, controller, presenter, - * and navigation manager. - */ -public class LoginApplication { - private static String filePath = "PlayerFile"; - - /** - * Sets up the Login feature and returns the configured LoginController. - * - * @param loginView The LoginInterface implementation for displaying login results. - * @return A configured LoginController instance. - * @throws IOException If there is an issue reading the JSON file. - */ - public static LoginController initializeLogin(LoginInterface loginView) - throws IOException { - final JsonLoginDataAccess loginDataAccess = new JsonLoginDataAccess(filePath); - - final LoginPresenter loginPresenter = new LoginPresenter(loginView); - - final LoginOutputBoundary outputBoundary = loginPresenter; - final LoginInputBoundary loginInteractor = new LoginInteractor(loginDataAccess, outputBoundary); - - return new LoginController(loginInteractor); - } -} diff --git a/src/main/java/app/SignupApplication.java b/src/main/java/app/SignupApplication.java deleted file mode 100644 index 5f8412991..000000000 --- a/src/main/java/app/SignupApplication.java +++ /dev/null @@ -1,44 +0,0 @@ -package app; - - -import java.io.IOException; - -import frameworks.database.JsonSignupDataAccess; -import interface_adapters.signup.SignupController; -import interface_adapters.signup.SignupInterface; -import interface_adapters.signup.SignupPresenter; -import usecases.accountsignup.SignupInputBoundary; -import usecases.accountsignup.SignupInteractor; -import usecases.accountsignup.SignupOutputBoundary; - -/** - * Application class for Signup Use Case. - * Responsible for assembling and initializing the components for the signup feature. - */ -public class SignupApplication { - private static String filePath = "PlayerFile"; - - /** - * Initializes and assembles the components for the Signup use case. - * - * @param signupView The interface representing the view layer of the signup feature. - * @return A SignupController instance that is connected to the use case. - * @throws IOException if there is an issue accessing signup data files. - */ - public static SignupController initializeSignup(SignupInterface signupView) throws IOException { - // Data access layer - final JsonSignupDataAccess signupDataAccess = new JsonSignupDataAccess(filePath); - - // Presenter - final SignupPresenter signupPresenter = new SignupPresenter(signupView); - - // Output boundary is the presenter - final SignupOutputBoundary outputBoundary = signupPresenter; - - // Use case interactor - final SignupInputBoundary signupInteractor = new SignupInteractor(signupDataAccess, outputBoundary); - - // Controller - return new SignupController(signupInteractor); - } -} diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index 99a8187ed..dbc800ee5 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -3,8 +3,7 @@ import java.util.ArrayList; import entities.*; -import interface_adapters.nevagategame.NevagateGameInterface; -import usecases.NevagateEventPage.NevagateEventDataAccessInterface; +import usecases.nevagateEventPage.NevagateEventDataAccessInterface; import usecases.dailybroadcast.BroadcastDataAccessInterface; import usecases.dailygather.GatherDataAccessInterface; import usecases.dailymove.MoveDataAccessInterface; @@ -23,9 +22,9 @@ import usecases.gamenewday.NewdayDataAccessInterface; import usecases.gameplacedescription.PlaceDescriptionDataAccessInterface; import usecases.nevagateAllowcatePage.NevagateAllowcateDataAccessInterface; -import usecases.nevagategame.NevagateGameDataAccessInterface; -import usecases.nevagategameover.NevagateGameOverDataAccessInterface; -import usecases.nevagatemain.NevagateMainDataAccessInterface; +import usecases.nevagateGame.NevagateGameDataAccessInterface; +import usecases.nevagateGameover.NevagateGameOverDataAccessInterface; +import usecases.nevagateMain.NevagateMainDataAccessInterface; import usecases.startallowcate.AllowcateDataAccessInterface; /** diff --git a/src/main/java/interface_adapters/NavigationManagerJson.java b/src/main/java/interface_adapters/NavigationManagerJson.java new file mode 100644 index 000000000..eaab3fa27 --- /dev/null +++ b/src/main/java/interface_adapters/NavigationManagerJson.java @@ -0,0 +1,45 @@ +package interface_adapters; + +import view.*; + +public class NavigationManagerJson { + private final LoginView loginView; + private final SignUpView signUpView; + private final RankingView rankingView; + private final MainView mainView; + + public NavigationManagerJson(LoginView loginView, SignUpView signUpView, MainView mainView, RankingView rankingView) { + this.loginView = loginView; + this.signUpView = signUpView; + this.mainView = mainView; + this.rankingView = rankingView; + } + + public void showLoginView() { + loginView.render(); + signUpView.disrender(); + mainView.disrender(); + rankingView.disrender(); + } + + public void showSignUpView() { + loginView.disrender(); + signUpView.render(); + mainView.disrender(); + rankingView.disrender(); + } + + public void showMainView() { + loginView.disrender(); + signUpView.disrender(); + mainView.render(); + rankingView.disrender(); + } + + public void showRankingView() { + loginView.disrender(); + signUpView.disrender(); + mainView.disrender(); + rankingView.render(); + } +} diff --git a/src/main/java/interface_adapters/login/LoginPresenter.java b/src/main/java/interface_adapters/login/LoginPresenter.java index 94bcd89cf..b14ac105e 100644 --- a/src/main/java/interface_adapters/login/LoginPresenter.java +++ b/src/main/java/interface_adapters/login/LoginPresenter.java @@ -1,5 +1,6 @@ package interface_adapters.login; +import interface_adapters.NavigationManagerJson; import usecases.accountlogin.LoginOutputBoundary; import usecases.accountlogin.LoginOutputData; @@ -9,9 +10,17 @@ */ public class LoginPresenter implements LoginOutputBoundary { private final LoginInterface view; + private final NavigationManagerJson navigationManager; - public LoginPresenter(LoginInterface view) { + /** + * Constructs a LoginPresenter with the specified view and navigation manager. + * + * @param view The view interface for displaying login results. + * @param navigationManager The navigation manager for handling navigation logic. + */ + public LoginPresenter(LoginInterface view, NavigationManagerJson navigationManager) { this.view = view; + this.navigationManager = navigationManager; } /** @@ -20,6 +29,9 @@ public LoginPresenter(LoginInterface view) { @Override public void prepareSuccessView(LoginOutputData outputData) { view.displayLoginResult(outputData.getMessage()); + if (outputData.isLoginSuccess()) { + navigationManager.showMainView(); + } } /** diff --git a/src/main/java/interface_adapters/nevagateRanking/NevagateRankingController.java b/src/main/java/interface_adapters/nevagateRanking/NevagateRankingController.java new file mode 100644 index 000000000..5f57f4ed9 --- /dev/null +++ b/src/main/java/interface_adapters/nevagateRanking/NevagateRankingController.java @@ -0,0 +1,31 @@ +package interface_adapters.nevagateRanking; + +import usecases.nevagateRanking.NevagateRankingInputBoundary; +import usecases.nevagateRanking.NevagateRankingInputData; + +/** + * Controller for the NavigateRanking use case. + * Acts as a bridge between the user interface and the interactor. + */ +public class NevagateRankingController { + private final NevagateRankingInputBoundary interactor; + + /** + * Constructs a NevagateRankingController instance. + * + * @param interactor The interactor responsible for processing the navigation logic. + */ + public NevagateRankingController(NevagateRankingInputBoundary interactor) { + this.interactor = interactor; + } + + /** + * Triggers the navigation to the ranking page by passing input data to the interactor. + * + * @param context A string representing the navigation context (e.g., "Navigate to Ranking"). + */ + public void navigateToRanking(String context) { + final NevagateRankingInputData inputData = new NevagateRankingInputData(context); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/nevagateRanking/NevagateRankingPresenter.java b/src/main/java/interface_adapters/nevagateRanking/NevagateRankingPresenter.java new file mode 100644 index 000000000..4d3a6994d --- /dev/null +++ b/src/main/java/interface_adapters/nevagateRanking/NevagateRankingPresenter.java @@ -0,0 +1,33 @@ +package interface_adapters.nevagateRanking; + +import interface_adapters.NavigationManagerJson; +import usecases.nevagateRanking.NevagateRankingOutputBoundary; +import usecases.nevagateRanking.NevagateRankingOutputData; + +/** + * Presenter for the NavigateRanking use case. + * Handles the navigation logic and delegates view updates to the NavigationManager. + */ +public class NevagateRankingPresenter implements NevagateRankingOutputBoundary { + private final NavigationManagerJson navigationManager; + + /** + * Constructs a NevagateRankingPresenter instance. + * + * @param navigationManager The navigation manager responsible for view transitions. + */ + public NevagateRankingPresenter(NavigationManagerJson navigationManager) { + this.navigationManager = navigationManager; + } + + /** + * Presents the navigation results by invoking the appropriate view transition. + * + * @param outputData The output data containing the navigation result message. + */ + @Override + public void present(NevagateRankingOutputData outputData) { + // Navigate to the Ranking view + navigationManager.showRankingView(); + } +} diff --git a/src/main/java/interface_adapters/nevagateSignup/NevagateSignupController.java b/src/main/java/interface_adapters/nevagateSignup/NevagateSignupController.java new file mode 100644 index 000000000..a122f9c56 --- /dev/null +++ b/src/main/java/interface_adapters/nevagateSignup/NevagateSignupController.java @@ -0,0 +1,31 @@ +package interface_adapters.nevagateSignup; + +import usecases.nevagateSignup.NevagateSignupInputBoundary; +import usecases.nevagateSignup.NevagateSignupInputData; + +/** + * Controller for the NavigateSignup use case. + * Acts as a bridge between the user interface and the interactor. + */ +public class NevagateSignupController { + private final NevagateSignupInputBoundary interactor; + + /** + * Constructs a NevagateSignupController instance. + * + * @param interactor The interactor responsible for processing the navigation logic. + */ + public NevagateSignupController(NevagateSignupInputBoundary interactor) { + this.interactor = interactor; + } + + /** + * Triggers the navigation to the signup page by passing input data to the interactor. + * + * @param context A string representing the navigation context (e.g., "Navigate to Signup"). + */ + public void navigateToSignup(String context) { + NevagateSignupInputData inputData = new NevagateSignupInputData(context); + interactor.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/nevagateSignup/NevagateSignupPresenter.java b/src/main/java/interface_adapters/nevagateSignup/NevagateSignupPresenter.java new file mode 100644 index 000000000..a1babe3c2 --- /dev/null +++ b/src/main/java/interface_adapters/nevagateSignup/NevagateSignupPresenter.java @@ -0,0 +1,33 @@ +package interface_adapters.nevagateSignup; + +import usecases.nevagateSignup.NevagateSignupOutputBoundary; +import usecases.nevagateSignup.NevagateSignupOutputData; +import interface_adapters.NavigationManagerJson; + +/** + * Presenter for the NavigateSignup use case. + * Handles the navigation logic and delegates view updates to the NavigationManager. + */ +public class NevagateSignupPresenter implements NevagateSignupOutputBoundary { + private final NavigationManagerJson navigationManager; + + /** + * Constructs a NevagateSignupPresenter instance. + * + * @param navigationManager The navigation manager responsible for view transitions. + */ + public NevagateSignupPresenter(NavigationManagerJson navigationManager) { + this.navigationManager = navigationManager; + } + + /** + * Presents the navigation results by invoking the appropriate view transition. + * + * @param outputData The output data containing the navigation result message. + */ + @Override + public void present(NevagateSignupOutputData outputData) { + // Navigate to the Signup view + navigationManager.showSignUpView(); + } +} diff --git a/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java b/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java index 4f75906a2..d18f14cf6 100644 --- a/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java +++ b/src/main/java/interface_adapters/nevagateevent/NevagateEventController.java @@ -1,8 +1,7 @@ package interface_adapters.nevagateevent; -import usecases.NevagateEventPage.NevagateEventInputBoundary; -import usecases.NevagateEventPage.NevagateEventInputdata; -import usecases.NevagateEventPage.NevagateEventInteractor; +import usecases.nevagateEventPage.NevagateEventInputBoundary; +import usecases.nevagateEventPage.NevagateEventInputdata; /** * Controller. diff --git a/src/main/java/interface_adapters/nevagateevent/NevagateEventPresenter.java b/src/main/java/interface_adapters/nevagateevent/NevagateEventPresenter.java index c1446142a..211331461 100644 --- a/src/main/java/interface_adapters/nevagateevent/NevagateEventPresenter.java +++ b/src/main/java/interface_adapters/nevagateevent/NevagateEventPresenter.java @@ -1,8 +1,8 @@ package interface_adapters.nevagateevent; import interface_adapters.NavigationManager; -import usecases.NevagateEventPage.NevagateEventOutputBoundary; -import usecases.NevagateEventPage.NevagateEventOutputdata; +import usecases.nevagateEventPage.NevagateEventOutputBoundary; +import usecases.nevagateEventPage.NevagateEventOutputdata; public class NevagateEventPresenter implements NevagateEventOutputBoundary { private final NavigationManager navigationManager; diff --git a/src/main/java/interface_adapters/nevagategame/NevagateGameController.java b/src/main/java/interface_adapters/nevagategame/NevagateGameController.java index 22ba63c3d..1eb6a7b34 100644 --- a/src/main/java/interface_adapters/nevagategame/NevagateGameController.java +++ b/src/main/java/interface_adapters/nevagategame/NevagateGameController.java @@ -1,7 +1,7 @@ package interface_adapters.nevagategame; -import usecases.nevagategame.NevagateGameInputBoundary; -import usecases.nevagategame.NevagateGameInputdata; +import usecases.nevagateGame.NevagateGameInputBoundary; +import usecases.nevagateGame.NevagateGameInputdata; public class NevagateGameController { private final NevagateGameInputBoundary interactor; diff --git a/src/main/java/interface_adapters/nevagategame/NevagateGamePresenter.java b/src/main/java/interface_adapters/nevagategame/NevagateGamePresenter.java index c6c2c9508..a6fb2bf4d 100644 --- a/src/main/java/interface_adapters/nevagategame/NevagateGamePresenter.java +++ b/src/main/java/interface_adapters/nevagategame/NevagateGamePresenter.java @@ -1,8 +1,8 @@ package interface_adapters.nevagategame; import interface_adapters.NavigationManager; -import usecases.nevagategame.NevagateGameOutputBoundary; -import usecases.nevagategame.NevagateGameOutputdata; +import usecases.nevagateGame.NevagateGameOutputBoundary; +import usecases.nevagateGame.NevagateGameOutputdata; public class NevagateGamePresenter implements NevagateGameOutputBoundary { private NavigationManager navigationManager; diff --git a/src/main/java/interface_adapters/nevagategameover/NevagateGameOverController.java b/src/main/java/interface_adapters/nevagategameover/NevagateGameOverController.java index 68a508303..785ac0245 100644 --- a/src/main/java/interface_adapters/nevagategameover/NevagateGameOverController.java +++ b/src/main/java/interface_adapters/nevagategameover/NevagateGameOverController.java @@ -1,7 +1,7 @@ package interface_adapters.nevagategameover; -import usecases.nevagategameover.NevagateGameOverInputBoundary; -import usecases.nevagategameover.NevagateGameOverInputdata; +import usecases.nevagateGameover.NevagateGameOverInputBoundary; +import usecases.nevagateGameover.NevagateGameOverInputdata; /** * Controller for navigate. diff --git a/src/main/java/interface_adapters/nevagategameover/NevagateGameOverPresenter.java b/src/main/java/interface_adapters/nevagategameover/NevagateGameOverPresenter.java index 513b14a64..eb8aa1446 100644 --- a/src/main/java/interface_adapters/nevagategameover/NevagateGameOverPresenter.java +++ b/src/main/java/interface_adapters/nevagategameover/NevagateGameOverPresenter.java @@ -1,8 +1,8 @@ package interface_adapters.nevagategameover; import interface_adapters.NavigationManager; -import usecases.nevagategameover.NevagateGameOverOutputBoundary; -import usecases.nevagategameover.NevagateGameOverOutputdata; +import usecases.nevagateGameover.NevagateGameOverOutputBoundary; +import usecases.nevagateGameover.NevagateGameOverOutputdata; /** * Nevagate game over view presenter. diff --git a/src/main/java/interface_adapters/nevagateloginview/NevagateLoginController.java b/src/main/java/interface_adapters/nevagateloginview/NevagateLoginController.java new file mode 100644 index 000000000..29e1db0a5 --- /dev/null +++ b/src/main/java/interface_adapters/nevagateloginview/NevagateLoginController.java @@ -0,0 +1,23 @@ +package interface_adapters.nevagateloginview; + +import usecases.nevagateLogin.NevagateLoginInputBoundary; +import usecases.nevagateLogin.NevagateLoginInputData; + +/** + * Controller for navigating to the Login page. + */ +public class NevagateLoginController { + private final NevagateLoginInputBoundary inputBoundary; + + public NevagateLoginController(NevagateLoginInputBoundary inputBoundary) { + this.inputBoundary = inputBoundary; + } + + /** + * Triggers navigation to the Login page. + */ + public void navigateToLogin() { + final NevagateLoginInputData inputData = new NevagateLoginInputData(); + inputBoundary.execute(inputData); + } +} diff --git a/src/main/java/interface_adapters/nevagateloginview/NevagateLoginInterface.java b/src/main/java/interface_adapters/nevagateloginview/NevagateLoginInterface.java new file mode 100644 index 000000000..2fd320fc3 --- /dev/null +++ b/src/main/java/interface_adapters/nevagateloginview/NevagateLoginInterface.java @@ -0,0 +1,13 @@ +package interface_adapters.nevagateloginview; + +/** + * Interface for handling the Login page navigation logic. + */ +public interface NevagateLoginInterface { + /** + * Handles the navigation result and updates the UI. + * + * @param message A message indicating the result of the navigation. + */ + void onNavigate(String message); +} diff --git a/src/main/java/interface_adapters/nevagateloginview/NevagateLoginPresenter.java b/src/main/java/interface_adapters/nevagateloginview/NevagateLoginPresenter.java new file mode 100644 index 000000000..e0eec12fb --- /dev/null +++ b/src/main/java/interface_adapters/nevagateloginview/NevagateLoginPresenter.java @@ -0,0 +1,22 @@ +package interface_adapters.nevagateloginview; + +import interface_adapters.NavigationManagerJson; +import usecases.nevagateLogin.NevagateLoginOutputBoundary; +import usecases.nevagateLogin.NevagateLoginOutputData; + +/** + * Presenter for navigating to the Login page. + */ +public class NevagateLoginPresenter implements NevagateLoginOutputBoundary { + private final NavigationManagerJson navigationManager; + + public NevagateLoginPresenter(NavigationManagerJson navigationManager) { + this.navigationManager = navigationManager; + } + + @Override + public void prepareSuccessView(NevagateLoginOutputData outputData) { + // Trigger navigation via NavigationManager + navigationManager.showLoginView(); + } +} diff --git a/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java b/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java index 811d72c2a..ed7743982 100644 --- a/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java +++ b/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java @@ -1,7 +1,7 @@ package interface_adapters.nevagatemainview; -import usecases.nevagatemain.NevagateMainInputBoundary; -import usecases.nevagatemain.NevagateMainInputdata; +import usecases.nevagateMain.NevagateMainInputBoundary; +import usecases.nevagateMain.NevagateMainInputdata; /** * Controller for navigating to new page. diff --git a/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java b/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java index 9701a6d72..3b225009e 100644 --- a/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java +++ b/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java @@ -1,8 +1,7 @@ package interface_adapters.nevagatemainview; import interface_adapters.NavigationManager; -import interface_adapters.nevagateevent.NevagateEventInterface; -import usecases.nevagatemain.NevagateMainOutputBoundary; +import usecases.nevagateMain.NevagateMainOutputBoundary; public class NevagateMainPresenter implements NevagateMainOutputBoundary { private NavigationManager navigationManager; diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java b/src/main/java/usecases/nevagateEventPage/NevagateEventDataAccessInterface.java similarity index 87% rename from src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java rename to src/main/java/usecases/nevagateEventPage/NevagateEventDataAccessInterface.java index 178b10c1e..40cdc197d 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventDataAccessInterface.java +++ b/src/main/java/usecases/nevagateEventPage/NevagateEventDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.NevagateEventPage; +package usecases.nevagateEventPage; import entities.Event; diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java b/src/main/java/usecases/nevagateEventPage/NevagateEventInputBoundary.java similarity index 78% rename from src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java rename to src/main/java/usecases/nevagateEventPage/NevagateEventInputBoundary.java index 4493ef7fe..eb8dc9164 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventInputBoundary.java +++ b/src/main/java/usecases/nevagateEventPage/NevagateEventInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.NevagateEventPage; +package usecases.nevagateEventPage; /** * Execute method. diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java b/src/main/java/usecases/nevagateEventPage/NevagateEventInputdata.java similarity index 64% rename from src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java rename to src/main/java/usecases/nevagateEventPage/NevagateEventInputdata.java index 49020b811..fbbf65ccb 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventInputdata.java +++ b/src/main/java/usecases/nevagateEventPage/NevagateEventInputdata.java @@ -1,4 +1,4 @@ -package usecases.NevagateEventPage; +package usecases.nevagateEventPage; /** * not needed. diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java b/src/main/java/usecases/nevagateEventPage/NevagateEventInteractor.java similarity index 96% rename from src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java rename to src/main/java/usecases/nevagateEventPage/NevagateEventInteractor.java index 450ce6937..947b44113 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventInteractor.java +++ b/src/main/java/usecases/nevagateEventPage/NevagateEventInteractor.java @@ -1,4 +1,4 @@ -package usecases.NevagateEventPage; +package usecases.nevagateEventPage; import entities.Event; import java.util.ArrayList; diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java b/src/main/java/usecases/nevagateEventPage/NevagateEventOutputBoundary.java similarity index 85% rename from src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java rename to src/main/java/usecases/nevagateEventPage/NevagateEventOutputBoundary.java index 0a3bf42c3..f1cf5cc9a 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventOutputBoundary.java +++ b/src/main/java/usecases/nevagateEventPage/NevagateEventOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.NevagateEventPage; +package usecases.nevagateEventPage; /** * Navigate or navigate failed. diff --git a/src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java b/src/main/java/usecases/nevagateEventPage/NevagateEventOutputdata.java similarity index 64% rename from src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java rename to src/main/java/usecases/nevagateEventPage/NevagateEventOutputdata.java index 6e40d7f40..5bc9e58f9 100644 --- a/src/main/java/usecases/NevagateEventPage/NevagateEventOutputdata.java +++ b/src/main/java/usecases/nevagateEventPage/NevagateEventOutputdata.java @@ -1,4 +1,4 @@ -package usecases.NevagateEventPage; +package usecases.nevagateEventPage; /** * Outputdata. diff --git a/src/main/java/usecases/nevagategame/NevagateGameDataAccessInterface.java b/src/main/java/usecases/nevagateGame/NevagateGameDataAccessInterface.java similarity index 78% rename from src/main/java/usecases/nevagategame/NevagateGameDataAccessInterface.java rename to src/main/java/usecases/nevagateGame/NevagateGameDataAccessInterface.java index cec4d6266..33edfdfaa 100644 --- a/src/main/java/usecases/nevagategame/NevagateGameDataAccessInterface.java +++ b/src/main/java/usecases/nevagateGame/NevagateGameDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.nevagategame; +package usecases.nevagateGame; /** * Not needed, we don't need info from database. diff --git a/src/main/java/usecases/nevagategame/NevagateGameInputBoundary.java b/src/main/java/usecases/nevagateGame/NevagateGameInputBoundary.java similarity index 81% rename from src/main/java/usecases/nevagategame/NevagateGameInputBoundary.java rename to src/main/java/usecases/nevagateGame/NevagateGameInputBoundary.java index 3f3f6ccd3..31e52c8b9 100644 --- a/src/main/java/usecases/nevagategame/NevagateGameInputBoundary.java +++ b/src/main/java/usecases/nevagateGame/NevagateGameInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.nevagategame; +package usecases.nevagateGame; /** * Execute method is gurenteed. diff --git a/src/main/java/usecases/nevagategame/NevagateGameInputdata.java b/src/main/java/usecases/nevagateGame/NevagateGameInputdata.java similarity index 70% rename from src/main/java/usecases/nevagategame/NevagateGameInputdata.java rename to src/main/java/usecases/nevagateGame/NevagateGameInputdata.java index f2eba0183..d15dccf80 100644 --- a/src/main/java/usecases/nevagategame/NevagateGameInputdata.java +++ b/src/main/java/usecases/nevagateGame/NevagateGameInputdata.java @@ -1,4 +1,4 @@ -package usecases.nevagategame; +package usecases.nevagateGame; /** * Input from player side. diff --git a/src/main/java/usecases/nevagategame/NevagateGameInteractor.java b/src/main/java/usecases/nevagateGame/NevagateGameInteractor.java similarity index 95% rename from src/main/java/usecases/nevagategame/NevagateGameInteractor.java rename to src/main/java/usecases/nevagateGame/NevagateGameInteractor.java index 1370cab14..b1948e52a 100644 --- a/src/main/java/usecases/nevagategame/NevagateGameInteractor.java +++ b/src/main/java/usecases/nevagateGame/NevagateGameInteractor.java @@ -1,4 +1,4 @@ -package usecases.nevagategame; +package usecases.nevagateGame; public class NevagateGameInteractor implements NevagateGameInputBoundary{ private NevagateGameDataAccessInterface dataaccess; diff --git a/src/main/java/usecases/nevagategame/NevagateGameOutputBoundary.java b/src/main/java/usecases/nevagateGame/NevagateGameOutputBoundary.java similarity index 84% rename from src/main/java/usecases/nevagategame/NevagateGameOutputBoundary.java rename to src/main/java/usecases/nevagateGame/NevagateGameOutputBoundary.java index c0d2b6263..2efdbb611 100644 --- a/src/main/java/usecases/nevagategame/NevagateGameOutputBoundary.java +++ b/src/main/java/usecases/nevagateGame/NevagateGameOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.nevagategame; +package usecases.nevagateGame; /** * Contain method to jumo to game main page. diff --git a/src/main/java/usecases/nevagategame/NevagateGameOutputdata.java b/src/main/java/usecases/nevagateGame/NevagateGameOutputdata.java similarity index 67% rename from src/main/java/usecases/nevagategame/NevagateGameOutputdata.java rename to src/main/java/usecases/nevagateGame/NevagateGameOutputdata.java index 31bc253ca..ef939d669 100644 --- a/src/main/java/usecases/nevagategame/NevagateGameOutputdata.java +++ b/src/main/java/usecases/nevagateGame/NevagateGameOutputdata.java @@ -1,4 +1,4 @@ -package usecases.nevagategame; +package usecases.nevagateGame; /** * Not needed. diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverDataAccessInterface.java b/src/main/java/usecases/nevagateGameover/NevagateGameOverDataAccessInterface.java similarity index 69% rename from src/main/java/usecases/nevagategameover/NevagateGameOverDataAccessInterface.java rename to src/main/java/usecases/nevagateGameover/NevagateGameOverDataAccessInterface.java index 9fee198b6..78ee03824 100644 --- a/src/main/java/usecases/nevagategameover/NevagateGameOverDataAccessInterface.java +++ b/src/main/java/usecases/nevagateGameover/NevagateGameOverDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.nevagategameover; +package usecases.nevagateGameover; /** * Not needed. diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverInputBoundary.java b/src/main/java/usecases/nevagateGameover/NevagateGameOverInputBoundary.java similarity index 78% rename from src/main/java/usecases/nevagategameover/NevagateGameOverInputBoundary.java rename to src/main/java/usecases/nevagateGameover/NevagateGameOverInputBoundary.java index ac5ed8ef4..6b5e82df9 100644 --- a/src/main/java/usecases/nevagategameover/NevagateGameOverInputBoundary.java +++ b/src/main/java/usecases/nevagateGameover/NevagateGameOverInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.nevagategameover; +package usecases.nevagateGameover; /** * Execute. diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverInputdata.java b/src/main/java/usecases/nevagateGameover/NevagateGameOverInputdata.java similarity index 65% rename from src/main/java/usecases/nevagategameover/NevagateGameOverInputdata.java rename to src/main/java/usecases/nevagateGameover/NevagateGameOverInputdata.java index fcc0f017b..5e11fff36 100644 --- a/src/main/java/usecases/nevagategameover/NevagateGameOverInputdata.java +++ b/src/main/java/usecases/nevagateGameover/NevagateGameOverInputdata.java @@ -1,4 +1,4 @@ -package usecases.nevagategameover; +package usecases.nevagateGameover; /** * Not needed. diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverInteractor.java b/src/main/java/usecases/nevagateGameover/NevagateGameOverInteractor.java similarity index 95% rename from src/main/java/usecases/nevagategameover/NevagateGameOverInteractor.java rename to src/main/java/usecases/nevagateGameover/NevagateGameOverInteractor.java index afcdfd3e1..1cf0d6749 100644 --- a/src/main/java/usecases/nevagategameover/NevagateGameOverInteractor.java +++ b/src/main/java/usecases/nevagateGameover/NevagateGameOverInteractor.java @@ -1,4 +1,4 @@ -package usecases.nevagategameover; +package usecases.nevagateGameover; /** * Interactor, only for navigating to the desired page. diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverOutputBoundary.java b/src/main/java/usecases/nevagateGameover/NevagateGameOverOutputBoundary.java similarity index 77% rename from src/main/java/usecases/nevagategameover/NevagateGameOverOutputBoundary.java rename to src/main/java/usecases/nevagateGameover/NevagateGameOverOutputBoundary.java index 6fccd5ed9..d2f4c694b 100644 --- a/src/main/java/usecases/nevagategameover/NevagateGameOverOutputBoundary.java +++ b/src/main/java/usecases/nevagateGameover/NevagateGameOverOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.nevagategameover; +package usecases.nevagateGameover; public interface NevagateGameOverOutputBoundary { void prepareGameOver(NevagateGameOverOutputdata outputdata); diff --git a/src/main/java/usecases/nevagategameover/NevagateGameOverOutputdata.java b/src/main/java/usecases/nevagateGameover/NevagateGameOverOutputdata.java similarity index 66% rename from src/main/java/usecases/nevagategameover/NevagateGameOverOutputdata.java rename to src/main/java/usecases/nevagateGameover/NevagateGameOverOutputdata.java index 4d59e8193..d1138ac7c 100644 --- a/src/main/java/usecases/nevagategameover/NevagateGameOverOutputdata.java +++ b/src/main/java/usecases/nevagateGameover/NevagateGameOverOutputdata.java @@ -1,4 +1,4 @@ -package usecases.nevagategameover; +package usecases.nevagateGameover; /** * Not needed. diff --git a/src/main/java/usecases/nevagateLogin/NevagateLoginDataAccessInterface.java b/src/main/java/usecases/nevagateLogin/NevagateLoginDataAccessInterface.java new file mode 100644 index 000000000..bfcd01140 --- /dev/null +++ b/src/main/java/usecases/nevagateLogin/NevagateLoginDataAccessInterface.java @@ -0,0 +1,8 @@ +package usecases.nevagateLogin; + +/** + * Data Access Interface for navigating to the Login page. + * Define any data-related dependencies required for navigation. + */ +public interface NevagateLoginDataAccessInterface { +} diff --git a/src/main/java/usecases/nevagateLogin/NevagateLoginInputBoundary.java b/src/main/java/usecases/nevagateLogin/NevagateLoginInputBoundary.java new file mode 100644 index 000000000..ebc8ba7a3 --- /dev/null +++ b/src/main/java/usecases/nevagateLogin/NevagateLoginInputBoundary.java @@ -0,0 +1,14 @@ +package usecases.nevagateLogin; + +/** + * Input Boundary for navigating to the Login page. + * Acts as the entry point for the use case. + */ +public interface NevagateLoginInputBoundary { + /** + * Executes the navigation to the Login page with the provided input data. + * + * @param inputData The input data required for navigation. + */ + void execute(NevagateLoginInputData inputData); +} diff --git a/src/main/java/usecases/nevagateLogin/NevagateLoginInputData.java b/src/main/java/usecases/nevagateLogin/NevagateLoginInputData.java new file mode 100644 index 000000000..b70386a0d --- /dev/null +++ b/src/main/java/usecases/nevagateLogin/NevagateLoginInputData.java @@ -0,0 +1,7 @@ +package usecases.nevagateLogin; + +/** + * Input Data for the NevagateLogin use case. + */ +public class NevagateLoginInputData { +} diff --git a/src/main/java/usecases/nevagateLogin/NevagateLoginInteractor.java b/src/main/java/usecases/nevagateLogin/NevagateLoginInteractor.java new file mode 100644 index 000000000..c9288461d --- /dev/null +++ b/src/main/java/usecases/nevagateLogin/NevagateLoginInteractor.java @@ -0,0 +1,19 @@ +package usecases.nevagateLogin; + +/** + * Interactor for navigating to the Login page. + * Contains the core business logic for navigation. + */ +public class NevagateLoginInteractor implements NevagateLoginInputBoundary { + private final NevagateLoginOutputBoundary outputBoundary; + + public NevagateLoginInteractor(NevagateLoginOutputBoundary outputBoundary) { + this.outputBoundary = outputBoundary; + } + + @Override + public void execute(NevagateLoginInputData inputData) { + // Perform any necessary logic here (e.g., logging, validation). + outputBoundary.prepareSuccessView(new NevagateLoginOutputData("Navigating to Login Page...")); + } +} diff --git a/src/main/java/usecases/nevagateLogin/NevagateLoginOutputBoundary.java b/src/main/java/usecases/nevagateLogin/NevagateLoginOutputBoundary.java new file mode 100644 index 000000000..f468cdda3 --- /dev/null +++ b/src/main/java/usecases/nevagateLogin/NevagateLoginOutputBoundary.java @@ -0,0 +1,14 @@ +package usecases.nevagateLogin; + +/** + * Output Boundary for navigating to the Login page. + * Handles presentation logic for the use case. + */ +public interface NevagateLoginOutputBoundary { + /** + * Prepares the view for successful navigation. + * + * @param outputData The output data for navigation. + */ + void prepareSuccessView(NevagateLoginOutputData outputData); +} diff --git a/src/main/java/usecases/nevagateLogin/NevagateLoginOutputData.java b/src/main/java/usecases/nevagateLogin/NevagateLoginOutputData.java new file mode 100644 index 000000000..81ccce647 --- /dev/null +++ b/src/main/java/usecases/nevagateLogin/NevagateLoginOutputData.java @@ -0,0 +1,16 @@ +package usecases.nevagateLogin; + +/** + * Output Data for the NevagateLogin use case. + */ +public class NevagateLoginOutputData { + private final String message; + + public NevagateLoginOutputData(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java b/src/main/java/usecases/nevagateMain/NevagateMainDataAccessInterface.java similarity index 76% rename from src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java rename to src/main/java/usecases/nevagateMain/NevagateMainDataAccessInterface.java index 3ca3ff25d..d5af9f6fd 100644 --- a/src/main/java/usecases/nevagatemain/NevagateMainDataAccessInterface.java +++ b/src/main/java/usecases/nevagateMain/NevagateMainDataAccessInterface.java @@ -1,4 +1,4 @@ -package usecases.nevagatemain; +package usecases.nevagateMain; /** * Data access, need decided events. diff --git a/src/main/java/usecases/nevagatemain/NevagateMainInputBoundary.java b/src/main/java/usecases/nevagateMain/NevagateMainInputBoundary.java similarity index 81% rename from src/main/java/usecases/nevagatemain/NevagateMainInputBoundary.java rename to src/main/java/usecases/nevagateMain/NevagateMainInputBoundary.java index f5f2c7392..24ea73819 100644 --- a/src/main/java/usecases/nevagatemain/NevagateMainInputBoundary.java +++ b/src/main/java/usecases/nevagateMain/NevagateMainInputBoundary.java @@ -1,4 +1,4 @@ -package usecases.nevagatemain; +package usecases.nevagateMain; /** * Execute method. diff --git a/src/main/java/usecases/nevagatemain/NevagateMainInputdata.java b/src/main/java/usecases/nevagateMain/NevagateMainInputdata.java similarity index 74% rename from src/main/java/usecases/nevagatemain/NevagateMainInputdata.java rename to src/main/java/usecases/nevagateMain/NevagateMainInputdata.java index 91abeabdb..2c8938d2e 100644 --- a/src/main/java/usecases/nevagatemain/NevagateMainInputdata.java +++ b/src/main/java/usecases/nevagateMain/NevagateMainInputdata.java @@ -1,4 +1,4 @@ -package usecases.nevagatemain; +package usecases.nevagateMain; /** * Not needed, no restriction to go back. diff --git a/src/main/java/usecases/nevagatemain/NevagateMainInteractor.java b/src/main/java/usecases/nevagateMain/NevagateMainInteractor.java similarity index 95% rename from src/main/java/usecases/nevagatemain/NevagateMainInteractor.java rename to src/main/java/usecases/nevagateMain/NevagateMainInteractor.java index c65ac745a..0ac09a7be 100644 --- a/src/main/java/usecases/nevagatemain/NevagateMainInteractor.java +++ b/src/main/java/usecases/nevagateMain/NevagateMainInteractor.java @@ -1,4 +1,4 @@ -package usecases.nevagatemain; +package usecases.nevagateMain; /** * Nevagate interactor. diff --git a/src/main/java/usecases/nevagatemain/NevagateMainOutputBoundary.java b/src/main/java/usecases/nevagateMain/NevagateMainOutputBoundary.java similarity index 83% rename from src/main/java/usecases/nevagatemain/NevagateMainOutputBoundary.java rename to src/main/java/usecases/nevagateMain/NevagateMainOutputBoundary.java index e73e844e3..5c74dfa46 100644 --- a/src/main/java/usecases/nevagatemain/NevagateMainOutputBoundary.java +++ b/src/main/java/usecases/nevagateMain/NevagateMainOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.nevagatemain; +package usecases.nevagateMain; /** * OutputBOundary, should be able to have method go back to main page. diff --git a/src/main/java/usecases/nevagatemain/NevagateMainOutputdata.java b/src/main/java/usecases/nevagateMain/NevagateMainOutputdata.java similarity index 74% rename from src/main/java/usecases/nevagatemain/NevagateMainOutputdata.java rename to src/main/java/usecases/nevagateMain/NevagateMainOutputdata.java index 941fa83c6..6736b7cbc 100644 --- a/src/main/java/usecases/nevagatemain/NevagateMainOutputdata.java +++ b/src/main/java/usecases/nevagateMain/NevagateMainOutputdata.java @@ -1,4 +1,4 @@ -package usecases.nevagatemain; +package usecases.nevagateMain; /** * No output data is needed to go back. diff --git a/src/main/java/usecases/nevagateRanking/NevagateRankingDataAccessInterface.java b/src/main/java/usecases/nevagateRanking/NevagateRankingDataAccessInterface.java new file mode 100644 index 000000000..fb525c37a --- /dev/null +++ b/src/main/java/usecases/nevagateRanking/NevagateRankingDataAccessInterface.java @@ -0,0 +1,7 @@ +package usecases.nevagateRanking; + +/** + * Interface for data access logic related to navigating to the ranking page. + */ +public interface NevagateRankingDataAccessInterface { +} diff --git a/src/main/java/usecases/nevagateRanking/NevagateRankingInputBoundary.java b/src/main/java/usecases/nevagateRanking/NevagateRankingInputBoundary.java new file mode 100644 index 000000000..ee4cdc253 --- /dev/null +++ b/src/main/java/usecases/nevagateRanking/NevagateRankingInputBoundary.java @@ -0,0 +1,14 @@ +package usecases.nevagateRanking; + +/** + * The input boundary interface for the NavigateRanking use case. + * Acts as an entry point for triggering the navigation logic to the ranking page. + */ +public interface NevagateRankingInputBoundary { + /** + * Executes the navigation to the ranking page. + * + * @param inputData The data required for navigation, such as context information. + */ + void execute(NevagateRankingInputData inputData); +} diff --git a/src/main/java/usecases/nevagateRanking/NevagateRankingInputData.java b/src/main/java/usecases/nevagateRanking/NevagateRankingInputData.java new file mode 100644 index 000000000..f3fc12da7 --- /dev/null +++ b/src/main/java/usecases/nevagateRanking/NevagateRankingInputData.java @@ -0,0 +1,26 @@ +package usecases.nevagateRanking; + +/** + * Input data class for the NavigateRanking use case. + */ +public class NevagateRankingInputData { + private final String context; + + /** + * Constructs a NevagateRankingInputData instance. + * + * @param context A string representing the navigation context (e.g., "Navigate to Ranking"). + */ + public NevagateRankingInputData(String context) { + this.context = context; + } + + /** + * Gets the navigation context. + * + * @return A string representing the context. + */ + public String getContext() { + return context; + } +} diff --git a/src/main/java/usecases/nevagateRanking/NevagateRankingInteractor.java b/src/main/java/usecases/nevagateRanking/NevagateRankingInteractor.java new file mode 100644 index 000000000..38d6bf06a --- /dev/null +++ b/src/main/java/usecases/nevagateRanking/NevagateRankingInteractor.java @@ -0,0 +1,30 @@ +package usecases.nevagateRanking; + +/** + * The interactor for the NavigateRanking use case. + * Implements the business logic for navigating to the ranking page. + */ +public class NevagateRankingInteractor implements NevagateRankingInputBoundary { + private final NevagateRankingOutputBoundary outputBoundary; + + /** + * Constructs a NevagateRankingInteractor instance. + * + * @param outputBoundary The output boundary for presenting the navigation results. + */ + public NevagateRankingInteractor(NevagateRankingOutputBoundary outputBoundary) { + this.outputBoundary = outputBoundary; + } + + /** + * Executes the navigation to the ranking page by invoking the output boundary. + * + * @param inputData The input data containing navigation context information. + */ + @Override + public void execute(NevagateRankingInputData inputData) { + // Prepare output data + final NevagateRankingOutputData outputData = new NevagateRankingOutputData("Navigating to Ranking"); + outputBoundary.present(outputData); + } +} diff --git a/src/main/java/usecases/nevagateRanking/NevagateRankingOutputBoundary.java b/src/main/java/usecases/nevagateRanking/NevagateRankingOutputBoundary.java new file mode 100644 index 000000000..9fc8da7b4 --- /dev/null +++ b/src/main/java/usecases/nevagateRanking/NevagateRankingOutputBoundary.java @@ -0,0 +1,14 @@ +package usecases.nevagateRanking; + +/** + * The output boundary interface for the NavigateRanking use case. + * Defines the contract for presenting the results of the navigation process. + */ +public interface NevagateRankingOutputBoundary { + /** + * Presents the output data for the navigation logic. + * + * @param outputData The output data containing navigation results. + */ + void present(NevagateRankingOutputData outputData); +} diff --git a/src/main/java/usecases/nevagateRanking/NevagateRankingOutputData.java b/src/main/java/usecases/nevagateRanking/NevagateRankingOutputData.java new file mode 100644 index 000000000..b121628bb --- /dev/null +++ b/src/main/java/usecases/nevagateRanking/NevagateRankingOutputData.java @@ -0,0 +1,27 @@ +package usecases.nevagateRanking; + +/** + * Output data class for the NavigateRanking use case. + * Encapsulates the results of the navigation process. + */ +public class NevagateRankingOutputData { + private final String message; + + /** + * Constructs a NevagateRankingOutputData instance. + * + * @param message A message indicating the navigation result. + */ + public NevagateRankingOutputData(String message) { + this.message = message; + } + + /** + * Gets the navigation result message. + * + * @return A string containing the result message. + */ + public String getMessage() { + return message; + } +} diff --git a/src/main/java/usecases/nevagateSignup/NevagateSignupDataAccessInterface.java b/src/main/java/usecases/nevagateSignup/NevagateSignupDataAccessInterface.java new file mode 100644 index 000000000..ae8dd743e --- /dev/null +++ b/src/main/java/usecases/nevagateSignup/NevagateSignupDataAccessInterface.java @@ -0,0 +1,7 @@ +package usecases.nevagateSignup; + +/** + * Interface for data access logic related to navigating to the signup page. + */ +public interface NevagateSignupDataAccessInterface { +} \ No newline at end of file diff --git a/src/main/java/usecases/nevagateSignup/NevagateSignupInputBoundary.java b/src/main/java/usecases/nevagateSignup/NevagateSignupInputBoundary.java new file mode 100644 index 000000000..93b8a1661 --- /dev/null +++ b/src/main/java/usecases/nevagateSignup/NevagateSignupInputBoundary.java @@ -0,0 +1,13 @@ +package usecases.nevagateSignup; + +/** + * The input boundary interface for the NavigateSignup use case. + */ +public interface NevagateSignupInputBoundary { + /** + * Executes the navigation to the signup page. + * + * @param inputData The data required for navigation, e.g., user context. + */ + void execute(NevagateSignupInputData inputData); +} diff --git a/src/main/java/usecases/nevagateSignup/NevagateSignupInputData.java b/src/main/java/usecases/nevagateSignup/NevagateSignupInputData.java new file mode 100644 index 000000000..7677a3dbf --- /dev/null +++ b/src/main/java/usecases/nevagateSignup/NevagateSignupInputData.java @@ -0,0 +1,27 @@ +package usecases.nevagateSignup; + +/** + * Input data class for the NavigateSignup use case. + * Encapsulates the necessary information to trigger the navigation logic. + */ +public class NevagateSignupInputData { + private final String context; + + /** + * Constructs a NevagateSignupInputData instance. + * + * @param context A string representing the navigation context (e.g., "Navigate to Signup"). + */ + public NevagateSignupInputData(String context) { + this.context = context; + } + + /** + * Gets the navigation context. + * + * @return A string representing the context. + */ + public String getContext() { + return context; + } +} diff --git a/src/main/java/usecases/nevagateSignup/NevagateSignupInteractor.java b/src/main/java/usecases/nevagateSignup/NevagateSignupInteractor.java new file mode 100644 index 000000000..c45a25edb --- /dev/null +++ b/src/main/java/usecases/nevagateSignup/NevagateSignupInteractor.java @@ -0,0 +1,30 @@ +package usecases.nevagateSignup; + +/** + * The interactor for the NavigateSignup use case. + * Implements the business logic for navigating to the signup page. + */ +public class NevagateSignupInteractor implements NevagateSignupInputBoundary { + private final NevagateSignupOutputBoundary outputBoundary; + + /** + * Constructs a NevagateSignupInteractor instance. + * + * @param outputBoundary The output boundary for presenting the navigation results. + */ + public NevagateSignupInteractor(NevagateSignupOutputBoundary outputBoundary) { + this.outputBoundary = outputBoundary; + } + + /** + * Executes the navigation to the signup page by invoking the output boundary. + * + * @param inputData The input data containing navigation context information. + */ + @Override + public void execute(NevagateSignupInputData inputData) { + // Prepare output data + NevagateSignupOutputData outputData = new NevagateSignupOutputData("Navigating to Signup"); + outputBoundary.present(outputData); + } +} diff --git a/src/main/java/usecases/nevagateSignup/NevagateSignupOutputBoundary.java b/src/main/java/usecases/nevagateSignup/NevagateSignupOutputBoundary.java new file mode 100644 index 000000000..62d839a62 --- /dev/null +++ b/src/main/java/usecases/nevagateSignup/NevagateSignupOutputBoundary.java @@ -0,0 +1,14 @@ +package usecases.nevagateSignup; + +/** + * The output boundary interface for the NavigateSignup use case. + * Defines the contract for presenting the results of the navigation process. + */ +public interface NevagateSignupOutputBoundary { + /** + * Presents the output data for the navigation logic. + * + * @param outputData The output data containing navigation results. + */ + void present(NevagateSignupOutputData outputData); +} diff --git a/src/main/java/usecases/nevagateSignup/NevagateSignupOutputData.java b/src/main/java/usecases/nevagateSignup/NevagateSignupOutputData.java new file mode 100644 index 000000000..c4dabe776 --- /dev/null +++ b/src/main/java/usecases/nevagateSignup/NevagateSignupOutputData.java @@ -0,0 +1,28 @@ +package usecases.nevagateSignup; + + +/** + * Output data class for the NavigateSignup use case. + * Encapsulates the results of the navigation process. + */ +public class NevagateSignupOutputData { + private final String message; + + /** + * Constructs a NevagateSignupOutputData instance. + * + * @param message A message indicating the navigation result. + */ + public NevagateSignupOutputData(String message) { + this.message = message; + } + + /** + * Gets the navigation result message. + * + * @return A string containing the result message. + */ + public String getMessage() { + return message; + } +} diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 5ab07c608..e2c5fcf36 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -409,13 +409,14 @@ public void updateUiMinimap(ArrayList> grid) { final int centerRow = rows / 2; final int centerCol = cols / 2; - StringBuilder mapBuilder = new StringBuilder(); + final StringBuilder mapBuilder = new StringBuilder(); for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { if (r == centerRow && c == centerCol) { mapBuilder.append("@ "); - } else { + } + else { mapBuilder.append(grid.get(r).get(c)).append(" "); } } diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index ce443937f..d4ca8c1f2 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -1,6 +1,7 @@ package view; -import app.LoginApplication; +import app.JsonApplication; +import interface_adapters.NavigationManagerJson; import interface_adapters.login.LoginController; import interface_adapters.login.LoginInterface; @@ -22,7 +23,9 @@ public class LoginView extends JFrame implements LoginInterface { private final JButton loginButton = new JButton("Log in"); private final JButton registerButton = new JButton("Sign up"); - private final LoginController loginController; + private LoginController loginController; + private NavigationManagerJson navigationManager; + /** * Constructs the LoginView with the provided LoginController. * @@ -31,9 +34,6 @@ public class LoginView extends JFrame implements LoginInterface { public LoginView() throws IOException { super("Login"); - // Initialize the controller via the LoginApplication - this.loginController = LoginApplication.initializeLogin(this); - final Container contentPane = getContentPane(); nameLabel.setFont(new Font("Impact", Font.BOLD, Constants.FIFTY)); userNameLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); @@ -69,18 +69,15 @@ public LoginView() throws IOException { loginButton.addActionListener(e -> { final String username = userText.getText(); final String password = new String(passwordText.getPassword()); + userText.setText(""); + passwordText.setText(""); loginController.handleLogin(username, password); }); registerButton.addActionListener(e -> { - dispose(); - try { - // Navigate to the sign-up page - final SignUpView signUpView = new SignUpView(); - signUpView.render(); - } - catch (IOException ex) { - throw new RuntimeException(ex); + if (navigationManager != null) { + // Navigate to SignUpView + navigationManager.showSignUpView(); } }); setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); @@ -113,6 +110,24 @@ private void layout(int offsetX) { } + /** + * Sets the LoginController for this view. + * + * @param loginController The LoginController instance. + */ + public void setLoginController(LoginController loginController) { + this.loginController = loginController; + } + + /** + * Sets the NavigationManager for this view. + * + * @param navigationManager The NavigationManager instance. + */ + public void setNavigationManager(NavigationManagerJson navigationManager) { + this.navigationManager = navigationManager; + } + /** * Displays the result of a login attempt. * @@ -123,21 +138,31 @@ public void displayLoginResult(String message) { JOptionPane.showMessageDialog(this, message, "Login Result", JOptionPane.INFORMATION_MESSAGE); if ("Login successful!".equals(message)) { - // Close login window - dispose(); - // Navigate to the game view - final MainView mainView = new MainView(); - mainView.render(); + if (navigationManager != null) { + navigationManager.showMainView(); + } + else { + JOptionPane.showMessageDialog(this, + "Cannot navigate to Main View.", + "Error", JOptionPane.ERROR_MESSAGE); + } } } - // Add render method public void render() { setVisible(true); } + public void disrender() { + setVisible(false); + } + public static void main(String[] args) throws IOException { - final LoginView loginView = new LoginView(); - loginView.render(); + try { + new JsonApplication("PlayerFile", "PlayerFile", "RankingFile"); + } + catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index 2e7669d7c..23bc86435 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -1,6 +1,8 @@ package view; +import app.JsonApplication; import app.RankingApplication; +import interface_adapters.NavigationManagerJson; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; import interface_adapters.rankinglist.RankingInterface; import interface_adapters.rankinglist.RankingController; @@ -19,7 +21,9 @@ public class MainView extends JFrame { private JButton rankingButton = new JButton("Ranking List"); private JButton quitButton = new JButton("Quit"); private JButton logoutButton = new JButton("Log Out"); + private NevagateAllowcateController nevagateAllowcateController; + private NavigationManagerJson navigationManager; public MainView() { // Set layout and container @@ -84,29 +88,39 @@ public MainView() { addListeners(); // Set window properties (moved to render()) + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setLocation(Constants.FIVE_HUNDRED, Constants.THREE_HUNDRED); } public void setNevagateAllowcateController(NevagateAllowcateController nevagateAllowcateController) { + System.out.println("MainView instance in setNevagateAllowcateController: " + System.identityHashCode(this)); this.nevagateAllowcateController = nevagateAllowcateController; } // Add ActionListener to buttons - @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) private void addListeners() { // Switch to GameView when "New Game" is clicked newGameButton.addActionListener(e -> { - nevagateAllowcateController.execute(); + if (nevagateAllowcateController != null) { + nevagateAllowcateController.execute(); + } + else { + JOptionPane.showMessageDialog(this, "Navigation controller not initialized.", + "Error", JOptionPane.ERROR_MESSAGE); + } }); // Switch to RankView when "Ranking" is clicked rankingButton.addActionListener(e -> { - // Close MainView - dispose(); - final RankingView rankingView = new RankingView(); - rankingView.render(); + if (navigationManager != null) { + navigationManager.showRankingView(); + } else { + JOptionPane.showMessageDialog(this, + "Navigation Manager is not initialized. Cannot navigate to Ranking View.", + "Error", JOptionPane.ERROR_MESSAGE); + } }); // Exit the game when "Quit" is clicked @@ -116,31 +130,41 @@ private void addListeners() { // Switch to LoginView when "Logout" is clicked logoutButton.addActionListener(e -> { - dispose(); - final LoginView loginView; - try { - loginView = new LoginView(); + if (navigationManager != null) { + navigationManager.showLoginView(); } - catch (IOException ex) { - throw new RuntimeException(ex); + else { + JOptionPane.showMessageDialog(this, + "Error navigating to LoginView.", + "Error", JOptionPane.ERROR_MESSAGE); } - loginView.render(); }); } + /** + * Sets the NavigationManager for this view. + * + * @param navigationManager The NavigationManager instance. + */ + public void setNavigationManager(NavigationManagerJson navigationManager) { + this.navigationManager = navigationManager; + } + // Add render method public void render() { - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setVisible(true); } public void disrender() { - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setVisible(false); } - public static void main(String[] args) { - // Call render() to display the view - new MainView().render(); - } + public static void main(String[] args) { + try { + new JsonApplication("PlayerFile", "PlayerFile", "RankingFile"); + } + catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/view/RankingView.java b/src/main/java/view/RankingView.java index a5f332b9f..dd56ffc70 100644 --- a/src/main/java/view/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -1,14 +1,13 @@ package view; -import app.LoginApplication; -import app.RankingApplication; +import app.JsonApplication; +import interface_adapters.NavigationManagerJson; import interface_adapters.rankinglist.RankingController; import interface_adapters.rankinglist.RankingInterface; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; -import java.awt.event.ActionListener; import java.io.IOException; import java.util.List; @@ -19,7 +18,9 @@ public class RankingView extends JFrame implements RankingInterface { private final JTable rankingTable; private final DefaultTableModel tableModel; private final JButton backButton; - private final RankingController rankingController; + + private RankingController rankingController; + private NavigationManagerJson navigationManager; /** * Constructs the RankingView and sets up the UI components. @@ -28,13 +29,6 @@ public class RankingView extends JFrame implements RankingInterface { public RankingView() { super("Leaderboard"); - try { - this.rankingController = RankingApplication.initializeRanking(this); - } - catch (IOException e) { - throw new RuntimeException(e); - } - // Main container layout final Container container = getContentPane(); container.setLayout(new BorderLayout()); @@ -64,17 +58,15 @@ public RankingView() { // Add ActionListener to navigate back to the main menu backButton.addActionListener(e -> { - // Dispose the current view - dispose(); - - // Open the MainView - final MainView mainView = new MainView(); - mainView.render(); + if (navigationManager != null) { + navigationManager.showMainView(); + } + else { + JOptionPane.showMessageDialog(this, "Navigation Manager not initialized.", + "Error", JOptionPane.ERROR_MESSAGE); + } }); - // Fetch and display rankings via the controller - rankingController.handleRanking(Constants.TEN); - // Window settings setSize(Constants.EIGHT_HUNDRED, Constants.SIX_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); @@ -82,6 +74,23 @@ public RankingView() { setLocation(Constants.FOUR_HUNDRED, Constants.TWO_HUNDRED); } + /** + * Sets the LoginController for this view. + * + * @param rankingController The LoginController instance. + */ + public void setRankingController(RankingController rankingController) { + this.rankingController = rankingController; + } + + /** + * Sets the NavigationManager for this view. + * + * @param navigationManager The NavigationManager instance. + */ + public void setNavigationManager(NavigationManagerJson navigationManager) { + this.navigationManager = navigationManager; + } /** * Displays the leaderboard in the UI. @@ -130,10 +139,22 @@ public void displayError(String errorMessage) { */ public void render() { setVisible(true); + if (rankingController != null) { + // Fetch rankings after the controller is set + rankingController.handleRanking(Constants.TEN); + } + } + + public void disrender() { + setVisible(false); } public static void main(String[] args) { - final RankingView rankingView = new RankingView(); - rankingView.render(); + try { + new JsonApplication("PlayerFile", "PlayerFile", "RankingFile"); + } + catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index 8775ec6d0..1cbde1cf4 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -1,6 +1,7 @@ package view; -import app.SignupApplication; +import app.JsonApplication; +import interface_adapters.NavigationManagerJson; import interface_adapters.signup.SignupController; import interface_adapters.signup.SignupInterface; @@ -24,7 +25,8 @@ public class SignUpView extends JFrame implements SignupInterface { private final JButton registerButton = new JButton("Sign up"); private final JButton loginButton = new JButton("Back to login"); - private final SignupController signupController; + private SignupController signupController; + private NavigationManagerJson navigationManager; /** * Constructs the SignUpView with the provided SignupController. @@ -34,9 +36,6 @@ public class SignUpView extends JFrame implements SignupInterface { public SignUpView() throws IOException { super("Sign Up"); - // Initialize the controller via SignupApplication - this.signupController = SignupApplication.initializeSignup(this); - final Container contentPane = getContentPane(); nameLabel.setFont(new Font("Impact", Font.BOLD, Constants.FIFTY)); userNameLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); @@ -69,15 +68,15 @@ public SignUpView() throws IOException { extracted(offsetX); registerButton.addActionListener(e -> handleSignup()); + loginButton.addActionListener(e -> { - dispose(); try { - final LoginView loginView = new LoginView(); - loginView.render(); + navigationManager.showLoginView(); } - catch (IOException ex) { + catch (Exception ex) { JOptionPane.showMessageDialog(this, "Error navigating to LoginView.", "Error", JOptionPane.ERROR_MESSAGE); + ex.printStackTrace(); } }); @@ -142,6 +141,24 @@ private void handleSignup() { signupController.handleSignup(username, password); } + /** + * Sets the LoginController for this view. + * + * @param signupController The LoginController instance. + */ + public void setSignupController(SignupController signupController) { + this.signupController = signupController; + } + + /** + * Sets the NavigationManager for this view. + * + * @param navigationManager The NavigationManager instance. + */ + public void setNavigationManager(NavigationManagerJson navigationManager) { + this.navigationManager = navigationManager; + } + /** * Displays the result of the signup process. * @@ -152,18 +169,15 @@ public void displaySignupResult(String message) { JOptionPane.showMessageDialog(this, message, "Signup Result", JOptionPane.INFORMATION_MESSAGE); if ("Signup successful!".equals(message)) { - // Close signup view - dispose(); - try { - // Navigate to login page - final LoginView loginView = new LoginView(); - loginView.render(); + if (navigationManager != null) { + navigationManager.showLoginView(); } - catch (IOException e) { + else { userText.setText(""); passwordText.setText(""); againText.setText(""); - JOptionPane.showMessageDialog(this, "Error navigating to LoginView.", + JOptionPane.showMessageDialog(this, + "Error navigating to LoginView.", "Error", JOptionPane.ERROR_MESSAGE); } } @@ -177,8 +191,16 @@ public void render() { setVisible(true); } - public static void main(String[] args) throws IOException { - final SignUpView signUpView = new SignUpView(); - signUpView.render(); + public void disrender() { + setVisible(false); + } + + public static void main(String[] args) { + try { + new JsonApplication("PlayerFile", "PlayerFile", "RankingFile"); + } + catch (IOException e) { + e.printStackTrace(); + } } } From 0fc82a272bcd0334ee9f32ae09e5e320c47f6f35 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Tue, 3 Dec 2024 05:39:31 -0500 Subject: [PATCH 130/154] Error fix for unified data access --- src/main/java/app/GameMainApplication.java | 6 ++---- .../java/frameworks/database/InMemoryUnifiedDataAccess.java | 6 +++--- .../eventrespond/ambush/AmbushDataAccessInterface.java | 2 +- .../usecases/eventrespond/ambush/AmbushEventInteractor.java | 2 +- .../eventrespond/blizzard/BlizzardDataAccessInterface.java | 2 +- .../eventrespond/blizzard/BlizzardEventInteractor.java | 2 +- .../eventrespond/flood/FloodDataAccessInterface.java | 2 +- .../usecases/eventrespond/flood/FloodEventInteractor.java | 2 +- 8 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index e7e225be8..ca6212efe 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -79,6 +79,8 @@ import usecases.nevagateMain.NevagateMainInteractor; import usecases.startallowcate.AllowcateInteractor; import frameworks.database.JsonRankingDataAccess; +import usecases.chatgpt.ChatGptService; +import usecases.chatgpt.ChatGptResponseParser; import view.*; /** @@ -156,10 +158,6 @@ public static void main(String[] args) { final NevagateAllowcateController nevagateAllowcateController = new NevagateAllowcateController( nevagateAllowcateInteractor); - System.out.println("Starting JsonApplication initialization..."); - mainView.setNevagateAllowcateController(nevagateAllowcateController); - System.out.println("NevagateAllowcateController is set successfully!"); - mainView.render(); // Allowcate points ussecase. final AllowcatePresenter allowcatePresenter = new AllowcatePresenter(attributeview, navigationManager); diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index 1f83baf00..4660b6994 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -93,7 +93,7 @@ public InMemoryUnifiedDataAccess(PlayerAttributes playerAttributes, Inventory in this.traderEncounter = traderEncounter; } - public PlayerAttributes getPlayerAttributesAsObject() { + public PlayerAttributes getPlayerAttributes() { return playerAttributes; } @@ -101,8 +101,8 @@ public PlayerAttributes getPlayerAttributesAsObject() { * Returns player attributes as a map. */ @Override - public Map getPlayerAttributes() { - Map attributesMap = new HashMap<>(); + public Map getPlayerAttributesAsMap() { + final Map attributesMap = new HashMap<>(); attributesMap.put("Social", playerAttributes.getSocial()); attributesMap.put("Luck", playerAttributes.getLuck()); attributesMap.put("Mobilization", playerAttributes.getMobilization()); diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java b/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java index 2b1e13466..f6ee52682 100644 --- a/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/ambush/AmbushDataAccessInterface.java @@ -19,7 +19,7 @@ public interface AmbushDataAccessInterface { * Value: Attribute value. * @return Map of player attributes. */ - Map getPlayerAttributes(); + Map getPlayerAttributesAsMap(); void changeFood(int amount); void changeWater(int amount); diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java index df9138a5d..a9c737fca 100644 --- a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java +++ b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java @@ -30,7 +30,7 @@ public AmbushEventInteractor(AmbushDataAccessInterface dataAccess, @Override public void execute(AmbushInputData inputData) { EventAmbush ambushEvent = (EventAmbush) dataAccess.getEvent(); - Map playerAttributes = dataAccess.getPlayerAttributes(); + Map playerAttributes = dataAccess.getPlayerAttributesAsMap(); Map choices = ambushEvent.getchoices(); try { diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java index bb607789d..7433b5e95 100644 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardDataAccessInterface.java @@ -19,7 +19,7 @@ public interface BlizzardDataAccessInterface { * Value: Attribute value. * @return Map of player attributes. */ - Map getPlayerAttributes(); + Map getPlayerAttributesAsMap(); void changeFood(int amount); void changeWater(int amount); diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java index 6fe45faa2..c70456419 100644 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java @@ -30,7 +30,7 @@ public BlizzardEventInteractor(BlizzardDataAccessInterface dataAccess, @Override public void execute(BlizzardInputData inputData) { EventBlizzard blizzardEvent = (EventBlizzard) dataAccess.getEvent(); - Map playerAttributes = dataAccess.getPlayerAttributes(); + Map playerAttributes = dataAccess.getPlayerAttributesAsMap(); Map choices = blizzardEvent.getchoices(); try { diff --git a/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java b/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java index cf6237449..8ca7892a6 100644 --- a/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/flood/FloodDataAccessInterface.java @@ -19,7 +19,7 @@ public interface FloodDataAccessInterface { * Value: Attribute value. * @return Map of player attributes. */ - Map getPlayerAttributes(); + Map getPlayerAttributesAsMap(); void changeFood(int amount); void changeWater(int amount); diff --git a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java index ef419b619..728d25b68 100644 --- a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java +++ b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java @@ -30,7 +30,7 @@ public FloodEventInteractor(FloodDataAccessInterface dataAccess, @Override public void execute(FloodInputData inputData) { EventFlood floodEvent = (EventFlood) dataAccess.getEvent(); - Map playerAttributes = dataAccess.getPlayerAttributes(); + Map playerAttributes = dataAccess.getPlayerAttributesAsMap(); Map choices = floodEvent.getchoices(); try { From 4714852ec98978f175f3d04233b3eb2652a868e6 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 05:50:41 -0500 Subject: [PATCH 131/154] fix gamemainapplication api usage and implement survivor and trader event --- src/main/java/app/GameMainApplication.java | 3 + .../survivor/SurvivorDataAccessInterface.java | 17 ++- .../survivor/SurvivorEventInteractor.java | 85 ++++++++------ .../trader/TraderDataAccessInterface.java | 23 +++- .../trader/TraderEventInteractor.java | 111 ++++++++++-------- 5 files changed, 147 insertions(+), 92 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index ca6212efe..c7a228816 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -158,6 +158,9 @@ public static void main(String[] args) { final NevagateAllowcateController nevagateAllowcateController = new NevagateAllowcateController( nevagateAllowcateInteractor); + final ChatGptService chatGptService = new ChatGptService(); + final ChatGptResponseParser responseParser = new ChatGptResponseParser(); + mainView.render(); // Allowcate points ussecase. final AllowcatePresenter allowcatePresenter = new AllowcatePresenter(attributeview, navigationManager); diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java b/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java index 37a4d87bc..3c58e9b8d 100644 --- a/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java @@ -2,19 +2,26 @@ import entities.Event; import entities.Inventory; -import entities.PlayerAttributes; + +import java.util.Map; /** - * Interface for data access in the Survivor event. + * Interface for data access in the Survivor Encounter event. */ public interface SurvivorDataAccessInterface { Event getEvent(); void removeEvent(); Inventory getInventory(); - PlayerAttributes getPlayerAttributes(); + + /** + * Returns player attributes as a map. + * Key: Attribute name (e.g., "Social"). + * Value: Attribute value. + * @return Map of player attributes. + */ + Map getPlayerAttributes(); void changeFood(int amount); - void changeWater(int amount); void changeWeapon(int amount); void changePeople(int amount); -} +} \ No newline at end of file diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java index ac00e0c49..e8e31572c 100644 --- a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java @@ -2,66 +2,81 @@ import entities.EntityConstants; import entities.EventSurvivorJoins; -import usecases.eventrespond.survivor.SurvivorInputData; -import usecases.eventrespond.survivor.SurvivorOutputBoundary; -import usecases.eventrespond.survivor.SurvivorDataAccessInterface; +import usecases.chatgpt.ChatGptService; +import usecases.chatgpt.ChatGptResponseParser; + +import java.util.Map; /** * Interactor for handling player responses to a Survivor Encounter event. - * Implements the SurvivorInputBoundary interface. + * Delegates response generation to ChatGPT and applies game logic based on the response. */ public class SurvivorEventInteractor implements SurvivorInputBoundary { private final SurvivorDataAccessInterface dataAccess; private final SurvivorOutputBoundary outputBoundary; + private final ChatGptService chatGptService; + private final ChatGptResponseParser responseParser; - public SurvivorEventInteractor(SurvivorDataAccessInterface dataAccess, SurvivorOutputBoundary outputBoundary) { + public SurvivorEventInteractor(SurvivorDataAccessInterface dataAccess, + SurvivorOutputBoundary outputBoundary, + ChatGptService chatGptService, + ChatGptResponseParser responseParser) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; + this.chatGptService = chatGptService; + this.responseParser = responseParser; } @Override public void execute(SurvivorInputData inputData) { EventSurvivorJoins survivorEvent = (EventSurvivorJoins) dataAccess.getEvent(); - int choice = inputData.getChoice(); + Map playerAttributes = dataAccess.getPlayerAttributes(); + Map choices = survivorEvent.getchoices(); + + try { + // Call ChatGPT to generate a response + String chatResponse = chatGptService.getResponse(survivorEvent.getdescription(), playerAttributes, choices); + + // Parse the ChatGPT response + int chosenOption = responseParser.parseChoice(chatResponse); + String eventDescription = responseParser.parseDescription(chatResponse); - int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; - String message; + // Handle game logic based on the chosen option + int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; - switch (choice) { - case EntityConstants.FIRSTCHOICE: // Accept survivors + if (chosenOption == EntityConstants.FIRSTCHOICE) { + // Accept survivors peopleChange = EntityConstants.SURVIVORACCEPTPEOPLEGAIN; - message = survivorEvent.getAcceptoutcome(); - break; - case EntityConstants.SECONDCHOICE: // Reject survivors - message = survivorEvent.getRejectoutcome(); - break; - case EntityConstants.THIRDCHOICE: // Attempt to rob survivors + } else if (chosenOption == EntityConstants.SECONDCHOICE) { + // Politely reject survivors + // No resource changes + } else if (chosenOption == EntityConstants.THIRDCHOICE) { + // Attempt to rob survivors if (dataAccess.getInventory().getfirepower() >= EntityConstants.SURVIVORROBBERYPOWER) { foodChange = EntityConstants.SURVIVORROBBERYGAINFOOD; suppliesChange = EntityConstants.SURVIVORROBBERYGAINSUPPLIES; - message = survivorEvent.getRoboutcomesuccess(); } else { foodChange = EntityConstants.SURVIVORROBBERYFAILLOSSFOOD; peopleChange = EntityConstants.SURVIVORROBBERYFAILLOSSPEOPLE; - message = survivorEvent.getRoboutcomefail(); } - break; - default: // Invalid choice - outputBoundary.prepareFailureView("Invalid choice provided."); - return; - } + } else { + throw new IllegalArgumentException("Invalid choice from ChatGPT: " + chosenOption); + } + + // Apply inventory changes + dataAccess.changeFood(foodChange); + dataAccess.changeWeapon(suppliesChange); + dataAccess.changePeople(peopleChange); + dataAccess.removeEvent(); - // Apply changes to inventory - dataAccess.changeFood(foodChange); - dataAccess.changeWater(waterChange); - dataAccess.changeWeapon(suppliesChange); - dataAccess.changePeople(peopleChange); - dataAccess.removeEvent(); + // Prepare output + String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + + ", Supplies " + suppliesChange + ", People " + peopleChange + "."; + SurvivorOutputData outputData = new SurvivorOutputData(eventDescription, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); + outputBoundary.prepareSuccessView(outputData); - // Prepare output - String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + - ", Supplies " + suppliesChange + ", People " + peopleChange + "."; - SurvivorOutputData outputData = new SurvivorOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); - outputBoundary.prepareSuccessView(outputData); + } catch (Exception e) { + outputBoundary.prepareFailureView("Failed to process ChatGPT response: " + e.getMessage()); + } } -} +} \ No newline at end of file diff --git a/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java b/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java index 257d0879e..0a817fb40 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java @@ -2,19 +2,34 @@ import entities.Event; import entities.Inventory; -import entities.PlayerAttributes; + +import java.util.Map; /** - * Interface for data access in the Trader event. + * Interface for data access in the Trader Encounter event. */ public interface TraderDataAccessInterface { Event getEvent(); void removeEvent(); Inventory getInventory(); - PlayerAttributes getPlayerAttributes(); + + /** + * Returns player attributes as a map. + * Key: Attribute name (e.g., "Social"). + * Value: Attribute value. + * @return Map of player attributes. + */ + Map getPlayerAttributes(); + + /** + * Returns player attributes as an object. + * This is used when specific attribute methods are needed. + * @return PlayerAttributes object. + */ + PlayerAttributes getPlayerAttributesAsObject(); void changeFood(int amount); void changeWater(int amount); void changeWeapon(int amount); void changePeople(int amount); -} +} \ No newline at end of file diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java index 8cf773221..1bf3f116a 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -2,73 +2,88 @@ import entities.EntityConstants; import entities.EventTraderEncounter; -import usecases.eventrespond.trader.TraderInputData; -import usecases.eventrespond.trader.TraderOutputBoundary; -import usecases.eventrespond.trader.TraderDataAccessInterface; +import usecases.chatgpt.ChatGptService; +import usecases.chatgpt.ChatGptResponseParser; + +import java.util.Map; /** * Interactor for handling player responses to a Trader Encounter event. - * Implements the TraderInputBoundary interface. + * Delegates response generation to ChatGPT and applies game logic based on the response. */ public class TraderEventInteractor implements TraderInputBoundary { private final TraderDataAccessInterface dataAccess; private final TraderOutputBoundary outputBoundary; + private final ChatGptService chatGptService; + private final ChatGptResponseParser responseParser; - public TraderEventInteractor(TraderDataAccessInterface dataAccess, TraderOutputBoundary outputBoundary) { + public TraderEventInteractor(TraderDataAccessInterface dataAccess, + TraderOutputBoundary outputBoundary, + ChatGptService chatGptService, + ChatGptResponseParser responseParser) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; + this.chatGptService = chatGptService; + this.responseParser = responseParser; } @Override public void execute(TraderInputData inputData) { EventTraderEncounter traderEvent = (EventTraderEncounter) dataAccess.getEvent(); - int choice = inputData.getChoice(); + Map playerAttributes = dataAccess.getPlayerAttributes(); + Map choices = traderEvent.getchoices(); - int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; - String message; + try { + // Call ChatGPT to generate a response + String chatResponse = chatGptService.getResponse(traderEvent.getdescription(), playerAttributes, choices); - if (choice == EntityConstants.FIRSTCHOICE) { - // Trade with the trader - if (dataAccess.getPlayerAttributes().getSocial() >= EntityConstants.TRADERNEGOTIATE) { - foodChange = EntityConstants.TRADERTRADEGAINFOOD; - waterChange = EntityConstants.TRADERTRADEGAINWATER; - message = traderEvent.getTradeOutcomeSuccess(); - } else { - foodChange = EntityConstants.TRADERTRADEFAILLOSSFOOD; - waterChange = EntityConstants.TRADERTRADEFAILLOSSWATER; - message = traderEvent.getTradeOutcomeScam(); - } - } else if (choice == EntityConstants.SECONDCHOICE) { - // Ignore the trader - message = traderEvent.getIgnoreOutcome(); - } else if (choice == EntityConstants.THIRDCHOICE) { - // Rob the trader - if (dataAccess.getInventory().getfirepower() >= EntityConstants.TRADERROBBERYPOWER) { - foodChange = EntityConstants.TRADERROBBERYGAINFOOD; - suppliesChange = EntityConstants.TRADERROBBERYGAINSUPPLIES; - message = traderEvent.getRobOutcomeSuccess(); + // Parse the ChatGPT response + int chosenOption = responseParser.parseChoice(chatResponse); + String eventDescription = responseParser.parseDescription(chatResponse); + + // Handle game logic based on the chosen option + int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; + + if (chosenOption == EntityConstants.FIRSTCHOICE) { + // Trade with the trader + if (dataAccess.getPlayerAttributesAsObject().getSocial() >= EntityConstants.TRADERNEGOTIATE) { + foodChange = EntityConstants.TRADERTRADEGAINFOOD; + waterChange = EntityConstants.TRADERTRADEGAINWATER; + } else { + foodChange = EntityConstants.TRADERTRADEFAILLOSSFOOD; + waterChange = EntityConstants.TRADERTRADEFAILLOSSWATER; + } + } else if (chosenOption == EntityConstants.SECONDCHOICE) { + // Ignore the trader + // No changes to resources + } else if (chosenOption == EntityConstants.THIRDCHOICE) { + // Rob the trader + if (dataAccess.getInventory().getfirepower() >= EntityConstants.TRADERROBBERYPOWER) { + foodChange = EntityConstants.TRADERROBBERYGAINFOOD; + suppliesChange = EntityConstants.TRADERROBBERYGAINSUPPLIES; + } else { + foodChange = EntityConstants.TRADERROBBERYFAILLOSSFOOD; + peopleChange = EntityConstants.TRADERROBBERYFAILLOSSPEOPLE; + } } else { - foodChange = EntityConstants.TRADERROBBERYFAILLOSSFOOD; - peopleChange = EntityConstants.TRADERROBBERYFAILLOSSPEOPLE; - message = traderEvent.getRobOutcomeFail(); + throw new IllegalArgumentException("Invalid choice from ChatGPT: " + chosenOption); } - } else { - // Invalid choice - outputBoundary.prepareFailureView("Invalid choice provided."); - return; - } - // Apply changes to the inventory - dataAccess.changeFood(foodChange); - dataAccess.changeWater(waterChange); - dataAccess.changeWeapon(suppliesChange); - dataAccess.changePeople(peopleChange); - dataAccess.removeEvent(); + // Apply inventory changes + dataAccess.changeFood(foodChange); + dataAccess.changeWater(waterChange); + dataAccess.changeWeapon(suppliesChange); + dataAccess.changePeople(peopleChange); + dataAccess.removeEvent(); - // Prepare output - String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + - ", Supplies " + suppliesChange + ", People " + peopleChange + "."; - TraderOutputData outputData = new TraderOutputData(message, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); - outputBoundary.prepareSuccessView(outputData); + // Prepare output + String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + + ", Supplies " + suppliesChange + ", People " + peopleChange + "."; + TraderOutputData outputData = new TraderOutputData(eventDescription, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); + outputBoundary.prepareSuccessView(outputData); + + } catch (Exception e) { + outputBoundary.prepareFailureView("Failed to process ChatGPT response: " + e.getMessage()); + } } -} +} \ No newline at end of file From 15d425f17442d5987c038c1112198b5fb6167d6f Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Tue, 3 Dec 2024 05:54:27 -0500 Subject: [PATCH 132/154] Add comments to different views --- src/main/java/view/CharacterCreationView.java | 30 +++++++++++++++++-- src/main/java/view/Constants.java | 29 ++++++++++-------- src/main/java/view/EventView.java | 27 +++++++++++++---- src/main/java/view/GameOverView.java | 23 ++++++++++---- 4 files changed, 84 insertions(+), 25 deletions(-) diff --git a/src/main/java/view/CharacterCreationView.java b/src/main/java/view/CharacterCreationView.java index 7c2d963bf..0deeb376e 100644 --- a/src/main/java/view/CharacterCreationView.java +++ b/src/main/java/view/CharacterCreationView.java @@ -14,9 +14,10 @@ import interface_adapters.startallowcatepoint.AllowcateInterface; /** - * Character creation view. + * Character creation view that allows players to allocate points to various attributes + * such as Social, Luck, Mobilization, Thrift, and Generalship. + * This view also provides navigation to the main menu and starting the game. */ - public class CharacterCreationView extends JFrame implements AllowcateInterface { public static final String TEXT_SOCIAL = "Social"; public static final String TEXT_LUCK = "Luck"; @@ -119,6 +120,15 @@ public void setAllowcateController(AllowcateController AllowcateController, this.nevagateMainController = NevagateMainController; } + /** + * Adds action listeners to the buttons for allocating points to attributes. + * + * @param socialButton Button to increase Social attribute. + * @param luckButton Button to increase Luck attribute. + * @param mobilizationButton Button to increase Mobilization attribute. + * @param thriftButton Button to increase Thrift attribute. + * @param generalshipButton Button to increase Generalship attribute. + */ @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) private void addListeners(JButton socialButton, JButton luckButton, JButton mobilizationButton, JButton thriftButton, JButton generalshipButton) { @@ -169,6 +179,12 @@ private void extracted(SpringLayout layout, Container container, JButton socialB layout.putConstraint(SpringLayout.SOUTH, startGameButton, -Constants.TWENTY, SpringLayout.SOUTH, container); } + /** + * Creates a button with a given label and font style. + * + * @param text The text to display on the button. + * @return A new JButton instance. + */ private JButton createButton(String text) { final JButton button = new JButton("+"); button.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); @@ -176,6 +192,11 @@ private JButton createButton(String text) { return button; } + /** + * Updates the points allocation for a specific attribute. + * + * @param attribute The name of the attribute to update. + */ private void updatePoints(String attribute) { if (points > 0) { switch (attribute) { @@ -230,6 +251,11 @@ public void disrender() { setVisible(false); } + /** + * Displays a failure message when allocation fails. + * + * @param message The error message to display. + */ @Override public void failureAllowcate(String message) { // Display the failure message in a dialog box diff --git a/src/main/java/view/Constants.java b/src/main/java/view/Constants.java index ad4e60bdb..74c9cfa7d 100644 --- a/src/main/java/view/Constants.java +++ b/src/main/java/view/Constants.java @@ -3,28 +3,31 @@ import java.awt.*; /** - * Constants used in this program. + * A utility class containing constants used throughout the program. + * These constants represent various numerical values and a theme color + * for consistent usage across different components. */ public class Constants { - public static final int THIRTY = 30; - public static final int TWENTY = 20; + public static final int THREE = 3; + public static final int FIVE = 5; + public static final int TEN = 10; public static final int FIFTEEN = 15; + public static final int TWENTY = 20; public static final int TWENTYFIVE = 25; - public static final int TWO_HUNDRED = 200; - public static final int THREE_HUNDRED = 300; - public static final int FIVE_HUNDRED = 500; + public static final int THIRTY = 30; public static final int FORTY = 40; - public static final int TEN = 10; public static final int FIFTY = 50; public static final int SIXTY = 60; - public static final int SIX_HUNDRED = 600; - public static final int FOUR_HUNDRED = 400; public static final int EIGHTY = 80; - public static final int EIGHT_HUNDRED = 800; public static final int ONE_HUNDRED = 100; - public static final int THREE = 3; - public static final int FIVE = 5; + public static final int TWO_HUNDRED = 200; + public static final int THREE_HUNDRED = 300; + public static final int FOUR_HUNDRED = 400; + public static final int FIVE_HUNDRED = 500; + public static final int SIX_HUNDRED = 600; + public static final int EIGHT_HUNDRED = 800; public static final int ONE_THOUSAND = 1000; - public static final Color THEME_COLOR = new Color(139, 69, 19); + /** Theme color used throughout the program. */ + public static final Color THEME_COLOR = new Color(140, 70, 20); } diff --git a/src/main/java/view/EventView.java b/src/main/java/view/EventView.java index f106a3baa..fe341dba3 100644 --- a/src/main/java/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -20,7 +20,7 @@ import java.awt.event.ActionListener; /** - * Event view. + * Represents the view for displaying and interacting with events in the game. */ public class EventView extends JFrame implements EventInitializerInterface, AmbushResponseInterface, BlizzardResponseInterface, TraderResponseInterface, @@ -41,6 +41,13 @@ public class EventView extends JFrame implements EventInitializerInterface, private FetchEventController fetchEventController; private NevagateGameController nevagateGameController; + /** + * Sets the controllers required for handling events and navigation. + * + * @param eventInitializerController Controller for event initialization. + * @param fetchEventController Controller for fetching event details. + * @param nevagateGameController Controller for game navigation. + */ public void setController(EventInitializerController eventInitializerController, FetchEventController fetchEventController, NevagateGameController nevagateGameController) { @@ -49,15 +56,23 @@ public void setController(EventInitializerController eventInitializerController, this.nevagateGameController = nevagateGameController; } + /** + * Sets the event manager responsible for handling event-related data. + * + * @param eventManager The event manager instance. + */ public void setManager(EventManager eventManager) { this.eventManager = eventManager; } + /** + * Constructs the EventView UI and initializes components. + */ public EventView() { super("Event"); // Initialize the container and layout - Container container = getContentPane(); + final Container container = getContentPane(); layout = new SpringLayout(); container.setLayout(layout); @@ -74,10 +89,11 @@ public EventView() { descriptionArea.setWrapStyleWord(true); // Wrap the description area in a scroll pane - descriptionScrollPane = new JScrollPane(descriptionArea); // Now it's an instance variable + // Now it's an instance variable + descriptionScrollPane = new JScrollPane(descriptionArea); descriptionScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); descriptionScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - descriptionScrollPane.setPreferredSize(new Dimension(400, 100)); + descriptionScrollPane.setPreferredSize(new Dimension(Constants.FOUR_HUNDRED, Constants.ONE_HUNDRED)); // Buttons fightButton = new JButton("Fight"); @@ -87,7 +103,8 @@ public EventView() { // Add components to container container.add(eventLabel); - container.add(descriptionScrollPane); // Add the scroll pane, not just the text area + // Add the scroll pane, not just the text area + container.add(descriptionScrollPane); container.add(fightButton); container.add(negotiateButton); container.add(fleeButton); diff --git a/src/main/java/view/GameOverView.java b/src/main/java/view/GameOverView.java index 2adb3f561..d3e6cd7a5 100644 --- a/src/main/java/view/GameOverView.java +++ b/src/main/java/view/GameOverView.java @@ -10,17 +10,28 @@ import java.awt.*; /** - * Gameover view. + * Represents the "Game Over" view in the application. + * Provides UI components for displaying the game result and returning to the main menu. */ public class GameOverView extends JFrame implements LoseInterface, HordeInterface, NevagateMainInterface { - private final JLabel scoreLabel; // Make it an instance variable - private final JTextArea descriptionArea; // Make it an instance variable + // Make it an instance variable + private final JLabel scoreLabel; + // Make it an instance variable + private final JTextArea descriptionArea; private NevagateMainController nevagateMainController; + /** + * Sets the navigation controller for this view. + * + * @param nevagateMainController The navigation controller instance. + */ public void setController(NevagateMainController nevagateMainController) { this.nevagateMainController = nevagateMainController; } + /** + * Constructs the GameOverView UI and initializes all components. + */ @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public GameOverView() { super("Game Over"); @@ -35,7 +46,8 @@ public GameOverView() { container.add(titleLabel); // Score label - scoreLabel = new JLabel("Score: 0"); // Initialize with a default value + // Initialize with a default value + scoreLabel = new JLabel("Score: 0"); scoreLabel.setFont(new Font("Serif", Font.PLAIN, Constants.TWENTY)); container.add(scoreLabel); @@ -45,7 +57,8 @@ public GameOverView() { descriptionArea.setBackground(Color.LIGHT_GRAY); descriptionArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); descriptionArea.setLineWrap(true); - descriptionArea.setWrapStyleWord(true); // Ensure long text wraps + // Ensure long text wraps + descriptionArea.setWrapStyleWord(true); container.add(descriptionArea); // Main menu button From 8b2a51899d89a524113334fd052ef16a994ea4ac Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Tue, 3 Dec 2024 06:04:25 -0500 Subject: [PATCH 133/154] Error fix --- .../eventrespond/survivor/SurvivorDataAccessInterface.java | 2 +- .../eventrespond/survivor/SurvivorEventInteractor.java | 2 +- .../eventrespond/trader/TraderDataAccessInterface.java | 5 +++-- .../usecases/eventrespond/trader/TraderEventInteractor.java | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java b/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java index 3c58e9b8d..c0fd3f8c1 100644 --- a/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorDataAccessInterface.java @@ -19,7 +19,7 @@ public interface SurvivorDataAccessInterface { * Value: Attribute value. * @return Map of player attributes. */ - Map getPlayerAttributes(); + Map getPlayerAttributesAsMap(); void changeFood(int amount); void changeWeapon(int amount); diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java index e8e31572c..28ad74bef 100644 --- a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java @@ -30,7 +30,7 @@ public SurvivorEventInteractor(SurvivorDataAccessInterface dataAccess, @Override public void execute(SurvivorInputData inputData) { EventSurvivorJoins survivorEvent = (EventSurvivorJoins) dataAccess.getEvent(); - Map playerAttributes = dataAccess.getPlayerAttributes(); + Map playerAttributes = dataAccess.getPlayerAttributesAsMap(); Map choices = survivorEvent.getchoices(); try { diff --git a/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java b/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java index 0a817fb40..9058cf05c 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java +++ b/src/main/java/usecases/eventrespond/trader/TraderDataAccessInterface.java @@ -2,6 +2,7 @@ import entities.Event; import entities.Inventory; +import entities.PlayerAttributes; import java.util.Map; @@ -19,14 +20,14 @@ public interface TraderDataAccessInterface { * Value: Attribute value. * @return Map of player attributes. */ - Map getPlayerAttributes(); + Map getPlayerAttributesAsMap(); /** * Returns player attributes as an object. * This is used when specific attribute methods are needed. * @return PlayerAttributes object. */ - PlayerAttributes getPlayerAttributesAsObject(); + PlayerAttributes getPlayerAttributes(); void changeFood(int amount); void changeWater(int amount); diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java index 1bf3f116a..71b3787aa 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -30,7 +30,7 @@ public TraderEventInteractor(TraderDataAccessInterface dataAccess, @Override public void execute(TraderInputData inputData) { EventTraderEncounter traderEvent = (EventTraderEncounter) dataAccess.getEvent(); - Map playerAttributes = dataAccess.getPlayerAttributes(); + Map playerAttributes = dataAccess.getPlayerAttributesAsMap(); Map choices = traderEvent.getchoices(); try { From e00792eabfd6d94a4637e3b85077ce69457cd85c Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 06:08:12 -0500 Subject: [PATCH 134/154] fix bug for gamemainapplication --- src/main/java/app/GameMainApplication.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index c7a228816..8d8d240ce 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -218,33 +218,33 @@ public static void main(String[] args) { // Event Respond usecase ambush final AmbushResponsePresenter ambushresponsePresenter = new AmbushResponsePresenter(eventView); final AmbushEventInteractor ambushEventInteractor = - new AmbushEventInteractor(gamedatabase, ambushresponsePresenter); + new AmbushEventInteractor(gamedatabase, ambushresponsePresenter, chatGptService, responseParser); final AmbushResponseController ambushResponseController = new AmbushResponseController(ambushEventInteractor); // Event Respond usecase blizzard final BlizzardResponsePresenter blizzardResponsePresenter = new BlizzardResponsePresenter(eventView); final BlizzardEventInteractor blizzardEventInteractor = - new BlizzardEventInteractor(gamedatabase, blizzardResponsePresenter); + new BlizzardEventInteractor(gamedatabase, blizzardResponsePresenter, chatGptService, responseParser); final BlizzardResponseController blizzardResponseController = new BlizzardResponseController(blizzardEventInteractor); // Event Respond usecase flood final FloodResponsePresenter floodResponsePresenter = new FloodResponsePresenter(eventView); final FloodEventInteractor floodEventInteractor = - new FloodEventInteractor(gamedatabase, floodResponsePresenter); + new FloodEventInteractor(gamedatabase, floodResponsePresenter, chatGptService, responseParser); final FloodResponseController floodResponseController = new FloodResponseController(floodEventInteractor); // Event Respond usecase survivor final SurvivorResponsePresenter survivorResponsePresenter = new SurvivorResponsePresenter(eventView); final SurvivorEventInteractor survivorEventInteractor = - new SurvivorEventInteractor(gamedatabase, survivorResponsePresenter); + new SurvivorEventInteractor(gamedatabase, survivorResponsePresenter, chatGptService, responseParser); final SurvivorResponseController survivorResponseController = new SurvivorResponseController(survivorEventInteractor); // Event Respond usecase trader final TraderResponsePresenter traderResponsePresenter = new TraderResponsePresenter(eventView); final TraderEventInteractor traderEventInteractor = - new TraderEventInteractor(gamedatabase, traderResponsePresenter); + new TraderEventInteractor(gamedatabase, traderResponsePresenter, chatGptService, responseParser); final TraderResponseController traderResponseController = new TraderResponseController(traderEventInteractor); // Initialize Event manager From babe9b1f835da8eb0b14c5d81fff2ea77f85d8fc Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 06:10:18 -0500 Subject: [PATCH 135/154] fix trader event method inconsistence --- .../usecases/eventrespond/trader/TraderEventInteractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java index 71b3787aa..11cb15119 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -46,7 +46,7 @@ public void execute(TraderInputData inputData) { if (chosenOption == EntityConstants.FIRSTCHOICE) { // Trade with the trader - if (dataAccess.getPlayerAttributesAsObject().getSocial() >= EntityConstants.TRADERNEGOTIATE) { + if (dataAccess.getPlayerAttributes().getSocial() >= EntityConstants.TRADERNEGOTIATE) { foodChange = EntityConstants.TRADERTRADEGAINFOOD; waterChange = EntityConstants.TRADERTRADEGAINWATER; } else { From 4ade6b36fa96fa368f37a7ee3db0dad6cc0e7f63 Mon Sep 17 00:00:00 2001 From: UTSGJohnsonSong Date: Tue, 3 Dec 2024 06:37:04 -0500 Subject: [PATCH 136/154] Reload Logic Update --- .../database/JsonLoginDataAccess.java | 17 +++++++++++++++++ .../accountlogin/LoginDataAccessInterface.java | 2 ++ .../usecases/accountlogin/LoginInteractor.java | 2 ++ .../trader/TraderEventInteractor.java | 2 +- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/frameworks/database/JsonLoginDataAccess.java b/src/main/java/frameworks/database/JsonLoginDataAccess.java index 70ef5ac56..6053de398 100644 --- a/src/main/java/frameworks/database/JsonLoginDataAccess.java +++ b/src/main/java/frameworks/database/JsonLoginDataAccess.java @@ -51,4 +51,21 @@ public boolean doesUserExist(String username) { return players.stream() .anyMatch(player -> player.getUsername().equals(username)); } + + /** + * Reloads the player data from the JSON file. + * This ensures that any updates to the file are reflected in the players list. + */ + @Override + public void reloadData() { + try { + this.players = database.load(); + System.out.println("Data successfully reloaded. Current players: " + players); + } + catch (IOException e) { + System.err.println("Error reloading data: " + e.getMessage()); + throw new RuntimeException("Unable to reload player data.", e); + } + } + } diff --git a/src/main/java/usecases/accountlogin/LoginDataAccessInterface.java b/src/main/java/usecases/accountlogin/LoginDataAccessInterface.java index 01952109f..6a1e44331 100644 --- a/src/main/java/usecases/accountlogin/LoginDataAccessInterface.java +++ b/src/main/java/usecases/accountlogin/LoginDataAccessInterface.java @@ -21,4 +21,6 @@ public interface LoginDataAccessInterface { * @return True if the user exists, otherwise false. */ boolean doesUserExist(String username); + + void reloadData(); } diff --git a/src/main/java/usecases/accountlogin/LoginInteractor.java b/src/main/java/usecases/accountlogin/LoginInteractor.java index b09d11aa2..0cf7c8463 100644 --- a/src/main/java/usecases/accountlogin/LoginInteractor.java +++ b/src/main/java/usecases/accountlogin/LoginInteractor.java @@ -28,6 +28,8 @@ public LoginInteractor(LoginDataAccessInterface dataAccess, LoginOutputBoundary */ @Override public void execute(LoginInputData inputData) { + dataAccess.reloadData(); + final String username = inputData.getUsername(); final String password = inputData.getPassword(); diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java index 71b3787aa..11cb15119 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -46,7 +46,7 @@ public void execute(TraderInputData inputData) { if (chosenOption == EntityConstants.FIRSTCHOICE) { // Trade with the trader - if (dataAccess.getPlayerAttributesAsObject().getSocial() >= EntityConstants.TRADERNEGOTIATE) { + if (dataAccess.getPlayerAttributes().getSocial() >= EntityConstants.TRADERNEGOTIATE) { foodChange = EntityConstants.TRADERTRADEGAINFOOD; waterChange = EntityConstants.TRADERTRADEGAINWATER; } else { From 2a57e3ffa95ac888958c4fd0c6c97e5145128ff2 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Tue, 3 Dec 2024 05:28:10 -0700 Subject: [PATCH 137/154] Login and game system connect partially --- src/main/java/app/GameMainApplication.java | 4 ++-- src/main/java/interface_adapters/NavigationManager.java | 1 + src/main/java/view/MainView.java | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 8d8d240ce..5221d9d68 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -160,8 +160,6 @@ public static void main(String[] args) { final ChatGptService chatGptService = new ChatGptService(); final ChatGptResponseParser responseParser = new ChatGptResponseParser(); - - mainView.render(); // Allowcate points ussecase. final AllowcatePresenter allowcatePresenter = new AllowcatePresenter(attributeview, navigationManager); final AllowcateInteractor allowcateInteractor = new AllowcateInteractor(gamedatabase, allowcatePresenter); @@ -294,6 +292,7 @@ public static void main(String[] args) { // Example of how to use the endGame method // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); + attributeview.render(); gameView.setController(fetchController, broadcastController, placeDescriptionController, dailyGatherController, dailyMoveController, nevagateEventController, eventDecideController, newdayController, minimapController, loseController, @@ -302,5 +301,6 @@ public static void main(String[] args) { eventView.setController(eventInitializerController, fetchEventController, nevagateGameController); eventView.setManager(eventManager); gameOverView.setController(nevagateMainController); + mainView.setNevagateAllowcateController(nevagateAllowcateController); } } diff --git a/src/main/java/interface_adapters/NavigationManager.java b/src/main/java/interface_adapters/NavigationManager.java index 1fce6dfae..202755d9e 100644 --- a/src/main/java/interface_adapters/NavigationManager.java +++ b/src/main/java/interface_adapters/NavigationManager.java @@ -37,6 +37,7 @@ public void showCharacterCreationView() { eventView.disrender(); informationView.disrender(); gameOverView.disrender(); + System.out.println("Attribute view created"); } public void showEventView() { diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index 23bc86435..d7fc97ac5 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -1,5 +1,6 @@ package view; +import app.GameMainApplication; import app.JsonApplication; import app.RankingApplication; import interface_adapters.NavigationManagerJson; @@ -103,6 +104,9 @@ public void setNevagateAllowcateController(NevagateAllowcateController nevagateA private void addListeners() { // Switch to GameView when "New Game" is clicked newGameButton.addActionListener(e -> { + dispose(); + final String[] args = {}; + GameMainApplication.main(args); if (nevagateAllowcateController != null) { nevagateAllowcateController.execute(); } From 0e67b498fc5c8ad5be1288091dee6e406c3a611a Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 07:46:41 -0500 Subject: [PATCH 138/154] change chatgpt response model --- pom.xml | 10 +++++++ .../java/usecases/chatgpt/ChatGptService.java | 29 +++++++++++++++---- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 6f5d9ac71..42e4b8306 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,16 @@ jackson-annotations 2.15.2 + + com.squareup.okhttp3 + okhttp + 4.10.0 + + + com.google.code.gson + gson + 2.8.9 + diff --git a/src/main/java/usecases/chatgpt/ChatGptService.java b/src/main/java/usecases/chatgpt/ChatGptService.java index 028c16430..c8b1e4c81 100644 --- a/src/main/java/usecases/chatgpt/ChatGptService.java +++ b/src/main/java/usecases/chatgpt/ChatGptService.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.BufferedReader; +import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; @@ -36,8 +38,8 @@ public String getResponse(String eventDescription, Map playerAt // Construct the request payload ObjectMapper objectMapper = new ObjectMapper(); String requestBody = objectMapper.writeValueAsString(Map.of( - "model", "gpt-3.5-turbo", - "prompt", prompt, + "model", "gpt-4-turbo", // Updated to use GPT-4 Turbo + "messages", new Object[] { Map.of("role", "user", "content", prompt) }, "max_tokens", 150, "temperature", 0.7 )); @@ -48,11 +50,26 @@ public String getResponse(String eventDescription, Map playerAt os.flush(); } - // Read the response - if (connection.getResponseCode() == 200) { - return new String(connection.getInputStream().readAllBytes()); + // Read and process the response + int responseCode = connection.getResponseCode(); + if (responseCode == 200) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + return response.toString(); + } } else { - throw new RuntimeException("Failed to call ChatGPT API: HTTP " + connection.getResponseCode()); + try (BufferedReader errorReader = new BufferedReader(new InputStreamReader(connection.getErrorStream()))) { + StringBuilder errorResponse = new StringBuilder(); + String line; + while ((line = errorReader.readLine()) != null) { + errorResponse.append(line); + } + throw new RuntimeException("ChatGPT API Error: " + responseCode + " - " + errorResponse); + } } } From ce9ecacf6d3e30ca5a4bd9030f584c6831e2fd68 Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Tue, 3 Dec 2024 06:42:39 -0700 Subject: [PATCH 139/154] Game and Login system connected --- ...ackson_core_jackson_annotations_2_15_2.xml | 14 - ...erxml_jackson_core_jackson_core_2_15_2.xml | 14 - ...l_jackson_core_jackson_databind_2_15_2.xml | 14 - ...en__com_squareup_okhttp3_okhttp_4_12_0.xml | 14 - .../Maven__com_squareup_okio_okio_3_6_0.xml | 14 - ...aven__com_squareup_okio_okio_jvm_3_6_0.xml | 14 - .idea/libraries/Maven__junit_junit_4_13_1.xml | 14 - .../Maven__org_hamcrest_hamcrest_core_1_3.xml | 14 - .../Maven__org_jetbrains_annotations_13_0.xml | 14 - ..._jetbrains_kotlin_kotlin_stdlib_1_8_21.xml | 14 - ...ins_kotlin_kotlin_stdlib_common_1_9_10.xml | 14 - ...rains_kotlin_kotlin_stdlib_jdk7_1_8_21.xml | 14 - ...rains_kotlin_kotlin_stdlib_jdk8_1_8_21.xml | 14 - .../Maven__org_json_json_20240303.xml | 14 - .idea/modules.xml | 8 - src/main/java/app/JsonApplication.java | 292 +++++++++++++++++- src/main/java/app/RestartGameController.java | 14 + src/main/java/view/GameOverView.java | 18 +- src/main/java/view/MainView.java | 10 +- 19 files changed, 320 insertions(+), 218 deletions(-) delete mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_2.xml delete mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_2.xml delete mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_2.xml delete mode 100644 .idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_12_0.xml delete mode 100644 .idea/libraries/Maven__com_squareup_okio_okio_3_6_0.xml delete mode 100644 .idea/libraries/Maven__com_squareup_okio_okio_jvm_3_6_0.xml delete mode 100644 .idea/libraries/Maven__junit_junit_4_13_1.xml delete mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml delete mode 100644 .idea/libraries/Maven__org_jetbrains_annotations_13_0.xml delete mode 100644 .idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_8_21.xml delete mode 100644 .idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_9_10.xml delete mode 100644 .idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_8_21.xml delete mode 100644 .idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_8_21.xml delete mode 100644 .idea/libraries/Maven__org_json_json_20240303.xml delete mode 100644 .idea/modules.xml create mode 100644 src/main/java/app/RestartGameController.java diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_2.xml deleted file mode 100644 index 676abb4ea..000000000 --- a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_15_2.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_2.xml deleted file mode 100644 index 178e531a8..000000000 --- a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_15_2.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_2.xml deleted file mode 100644 index ee0f17f03..000000000 --- a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_15_2.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_12_0.xml b/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_12_0.xml deleted file mode 100644 index ab1a3a401..000000000 --- a/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_12_0.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_squareup_okio_okio_3_6_0.xml b/.idea/libraries/Maven__com_squareup_okio_okio_3_6_0.xml deleted file mode 100644 index 97d8325d3..000000000 --- a/.idea/libraries/Maven__com_squareup_okio_okio_3_6_0.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_squareup_okio_okio_jvm_3_6_0.xml b/.idea/libraries/Maven__com_squareup_okio_okio_jvm_3_6_0.xml deleted file mode 100644 index 3a6faa34f..000000000 --- a/.idea/libraries/Maven__com_squareup_okio_okio_jvm_3_6_0.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_13_1.xml b/.idea/libraries/Maven__junit_junit_4_13_1.xml deleted file mode 100644 index 343c5289e..000000000 --- a/.idea/libraries/Maven__junit_junit_4_13_1.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml deleted file mode 100644 index 56c47f46d..000000000 --- a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_annotations_13_0.xml b/.idea/libraries/Maven__org_jetbrains_annotations_13_0.xml deleted file mode 100644 index 316d4ac35..000000000 --- a/.idea/libraries/Maven__org_jetbrains_annotations_13_0.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_8_21.xml b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_8_21.xml deleted file mode 100644 index 59e1eabed..000000000 --- a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_8_21.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_9_10.xml b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_9_10.xml deleted file mode 100644 index 1e61ead42..000000000 --- a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_9_10.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_8_21.xml b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_8_21.xml deleted file mode 100644 index 16c9ff26e..000000000 --- a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_8_21.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_8_21.xml b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_8_21.xml deleted file mode 100644 index 325b0d3ef..000000000 --- a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_8_21.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_json_json_20240303.xml b/.idea/libraries/Maven__org_json_json_20240303.xml deleted file mode 100644 index 4e3a16337..000000000 --- a/.idea/libraries/Maven__org_json_json_20240303.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 30f9213f3..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/main/java/app/JsonApplication.java b/src/main/java/app/JsonApplication.java index 64989f217..0e2f23b1b 100644 --- a/src/main/java/app/JsonApplication.java +++ b/src/main/java/app/JsonApplication.java @@ -1,30 +1,110 @@ package app; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; +import entities.*; +import frameworks.database.InMemoryUnifiedDataAccess; import frameworks.database.JsonLoginDataAccess; import frameworks.database.JsonSignupDataAccess; import frameworks.database.JsonRankingDataAccess; +import interface_adapters.EventManager; +import interface_adapters.NavigationManager; import interface_adapters.NavigationManagerJson; +import interface_adapters.broadcast.BroadcastController; +import interface_adapters.broadcast.BroadcastPresenter; +import interface_adapters.dailygather.DailyGatherController; +import interface_adapters.dailygather.DailyGatherPresenter; +import interface_adapters.dailymove.DailyMoveController; +import interface_adapters.dailymove.DailyMovePresenter; +import interface_adapters.endprocesshorde.HordeController; +import interface_adapters.endprocesshorde.HordePresenter; +import interface_adapters.eventdecide.EventDecideController; +import interface_adapters.eventdecide.EventDecidePresenter; +import interface_adapters.eventinitializer.EventInitializerController; +import interface_adapters.eventinitializer.EventInitializerPresenter; +import interface_adapters.eventrespond.ambush.AmbushResponseController; +import interface_adapters.eventrespond.ambush.AmbushResponsePresenter; +import interface_adapters.eventrespond.blizzard.BlizzardResponseController; +import interface_adapters.eventrespond.blizzard.BlizzardResponsePresenter; +import interface_adapters.eventrespond.flood.FloodResponseController; +import interface_adapters.eventrespond.flood.FloodResponsePresenter; +import interface_adapters.eventrespond.survivor.SurvivorResponseController; +import interface_adapters.eventrespond.survivor.SurvivorResponsePresenter; +import interface_adapters.eventrespond.trader.TraderResponseController; +import interface_adapters.eventrespond.trader.TraderResponsePresenter; +import interface_adapters.fetchcurrentevent.FetchEventController; +import interface_adapters.fetchcurrentevent.FetchEventPresenter; +import interface_adapters.fetchresource.FetchController; +import interface_adapters.fetchresource.FetchPresenter; +import interface_adapters.gamelosedetecter.LoseController; +import interface_adapters.gamelosedetecter.LosePresenter; +import interface_adapters.gameminimap.MinimapController; +import interface_adapters.gameminimap.MinimapPresenter; +import interface_adapters.gamenewday.NewdayController; +import interface_adapters.gamenewday.NewdayPresenter; +import interface_adapters.gameplacedescription.PlaceDescriptionController; +import interface_adapters.gameplacedescription.PlaceDescriptionPresenter; import interface_adapters.login.LoginController; import interface_adapters.login.LoginPresenter; +import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; +import interface_adapters.nevagateallowcatepage.NevagateAllowcatePresenter; +import interface_adapters.nevagateevent.NevagateEventController; +import interface_adapters.nevagateevent.NevagateEventPresenter; +import interface_adapters.nevagategame.NevagateGameController; +import interface_adapters.nevagategame.NevagateGamePresenter; +import interface_adapters.nevagategameover.NevagateGameOverController; +import interface_adapters.nevagategameover.NevagateGameOverPresenter; +import interface_adapters.nevagatemainview.NevagateMainController; +import interface_adapters.nevagatemainview.NevagateMainPresenter; import interface_adapters.rankinglist.RankingController; import interface_adapters.rankinglist.RankingPresenter; import interface_adapters.signup.SignupController; import interface_adapters.signup.SignupPresenter; +import interface_adapters.startallowcatepoint.AllowcateController; +import interface_adapters.startallowcatepoint.AllowcatePresenter; import usecases.accountlogin.LoginInteractor; import usecases.accountsignup.SignupInteractor; import usecases.accountranking.RankingInteractor; -import view.LoginView; -import view.MainView; -import view.RankingView; -import view.SignUpView; +import usecases.chatgpt.ChatGptResponseParser; +import usecases.chatgpt.ChatGptService; +import usecases.dailybroadcast.BroadcastInteractor; +import usecases.dailygather.GatherInteractor; +import usecases.dailymove.MoveInteractor; +import usecases.endprocesshorde.HordeInteractor; +import usecases.eventdecide.DecideEventInteractor; +import usecases.eventinitialize.EventInitializeInteractor; +import usecases.eventrespond.ambush.AmbushEventInteractor; +import usecases.eventrespond.blizzard.BlizzardEventInteractor; +import usecases.eventrespond.flood.FloodEventInteractor; +import usecases.eventrespond.survivor.SurvivorEventInteractor; +import usecases.eventrespond.trader.TraderEventInteractor; +import usecases.fetchcurrentevent.CurrentEventInteractor; +import usecases.fetchresource.FetchInteractor; +import usecases.gamelosedetecter.LoseInteractor; +import usecases.gameminimap.MinimapInteractor; +import usecases.gamenewday.NewdayInteractor; +import usecases.gameplacedescription.PlaceDescriptionInteractor; +import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; +import usecases.nevagateEventPage.NevagateEventInteractor; +import usecases.nevagateGame.NevagateGameInteractor; +import usecases.nevagateGameover.NevagateGameOverInteractor; +import usecases.nevagateMain.NevagateMainInteractor; +import usecases.startallowcate.AllowcateInteractor; +import view.*; public class JsonApplication { private final NavigationManagerJson navigationManagerJson; private final LoginController loginController; private final SignupController signupController; private final RankingController rankingController; + private final LoginView loginView; + private final SignUpView signUpView; + private final RankingView rankingView; + private final MainView mainView; + private final RestartGameController restartGameController = new RestartGameController(this); /** * Initializes the integrated application. @@ -36,10 +116,10 @@ public class JsonApplication { */ public JsonApplication(String loginFilePath, String signupFilePath, String rankingFilePath) throws IOException { // Initialize Views - final LoginView loginView = new LoginView(); - final SignUpView signUpView = new SignUpView(); - final RankingView rankingView = new RankingView(); - final MainView mainView = new MainView(); + this.loginView = new LoginView(); + this.signUpView = new SignUpView(); + this.rankingView = new RankingView(); + this.mainView = new MainView(); // Navigation Manager navigationManagerJson = new NavigationManagerJson(loginView, signUpView, mainView, rankingView); @@ -70,10 +150,206 @@ public JsonApplication(String loginFilePath, String signupFilePath, String ranki signUpView.setNavigationManager(navigationManagerJson); rankingView.setNavigationManager(navigationManagerJson); mainView.setNavigationManager(navigationManagerJson); + mainView.setRestartGameController(this.restartGameController); // Start login view loginView.render(); } + public void startnewgame() { + gameApplication(mainView, navigationManagerJson); + } + + private void gameApplication(MainView mainView, NavigationManagerJson navigationManagerJson) { + // initialized map + final ArrayList environments = new ArrayList<>(Arrays.asList(EntityConstants.PLAIN, + EntityConstants.CITY, EntityConstants.FOREST, EntityConstants.DESERT, EntityConstants.ICELAND)); + final MapFactory mapfact = new MapFactory(); + final ArrayList>>> cores = + mapfact.getCores(EntityConstants.MAPWIDTH, EntityConstants.MAPHEIGHT, environments); + final ArrayList> grids = mapfact.getGrids(EntityConstants.MAPWIDTH, + EntityConstants.MAPHEIGHT, cores); + final Maps gameMap = new Maps(grids); + // initialize player and their info. + final PlayerAttributes playerAttributes = new PlayerAttributes(); + final PlayerInfo playerInfo = new PlayerInfo("Currentplayer"); + final PlayerLocation playerLocation = new PlayerLocation(); + final Inventory playerInventory = new Inventory(); + final Location currentlocation = grids.get(playerLocation.getYcoordinate()) + .get(playerLocation.getXcoordinate()); + // initialize events and horde + final EventAmbush ambush = new EventAmbush(); + final EventFlood flood = new EventFlood(); + final EventBlizzard blizzard = new EventBlizzard(); + final EventSurvivorJoins survivor = new EventSurvivorJoins(); + final EventTraderEncounter traderEncounter = new EventTraderEncounter(); + final Horde horde = new Horde(); + // initialize ingame in memory database/dataaccess. + final InMemoryUnifiedDataAccess gamedatabase = + new InMemoryUnifiedDataAccess(playerAttributes, playerInventory, new ArrayList<>(), currentlocation, + horde, playerInfo, playerLocation, gameMap, ambush, blizzard, flood, survivor, traderEncounter); + // initialize each gameing view. + final CharacterCreationView attributeview = new CharacterCreationView(); + final GameView gameView = new GameView(); + final EventView eventView = new EventView(); + final GameOverView gameOverView = new GameOverView(); + final InformationView informationView = new InformationView("Daily log"); + // initialize nevagation manager + final NavigationManager navigationManager = + new NavigationManager(mainView, attributeview, gameView, eventView, informationView, gameOverView); + // initialize each usecase. + // Nevagate to allowcate page usecase. + final NevagateAllowcatePresenter nevagateAllowcatePresenter = new NevagateAllowcatePresenter(navigationManager); + final NevagateAllowcateInteractor nevagateAllowcateInteractor = new NevagateAllowcateInteractor( + gamedatabase, nevagateAllowcatePresenter); + final NevagateAllowcateController nevagateAllowcateController = new NevagateAllowcateController( + nevagateAllowcateInteractor); + + final ChatGptService chatGptService = new ChatGptService(); + final ChatGptResponseParser responseParser = new ChatGptResponseParser(); + // Allowcate points ussecase. + final AllowcatePresenter allowcatePresenter = new AllowcatePresenter(attributeview, navigationManager); + final AllowcateInteractor allowcateInteractor = new AllowcateInteractor(gamedatabase, allowcatePresenter); + final AllowcateController allowcateController = new AllowcateController(allowcateInteractor); + // Nevagate Main usecase. + final NevagateMainPresenter nevagateMainPresenter = new NevagateMainPresenter(navigationManager); + final NevagateMainInteractor nevagateMainInteractor = + new NevagateMainInteractor(gamedatabase, nevagateMainPresenter); + final NevagateMainController nevagateMainController = new NevagateMainController(nevagateMainInteractor); + // Fetch Usecase + final FetchPresenter fetchPresenter = new FetchPresenter(gameView); + final FetchInteractor fetchInteractor = new FetchInteractor(gamedatabase, fetchPresenter); + final FetchController fetchController = new FetchController(fetchInteractor); + // Broadcast Usecase + final BroadcastPresenter broadcastPresenter = new BroadcastPresenter(gameView); + final BroadcastInteractor broadcastInteractor = new BroadcastInteractor(gamedatabase, broadcastPresenter); + final BroadcastController broadcastController = new BroadcastController(broadcastInteractor); + // Place description usecase + final PlaceDescriptionPresenter placeDescriptionPresenter = new PlaceDescriptionPresenter(gameView); + final PlaceDescriptionInteractor placeDescriptionInteractor = + new PlaceDescriptionInteractor(gamedatabase, placeDescriptionPresenter); + final PlaceDescriptionController placeDescriptionController = + new PlaceDescriptionController(placeDescriptionInteractor); + + // gather description usecase + final DailyGatherPresenter dailyGatherPresenter = new DailyGatherPresenter(gameView); + final GatherInteractor gatherInteractor = new GatherInteractor(gamedatabase, dailyGatherPresenter); + final DailyGatherController dailyGatherController = new DailyGatherController(gatherInteractor); + + // Move usecase. + final DailyMovePresenter dailyMovePresenter = new DailyMovePresenter(gameView); + final MoveInteractor moveInteractor = new MoveInteractor(gamedatabase, dailyMovePresenter); + final DailyMoveController dailyMoveController = new DailyMoveController(moveInteractor); + + // Nevagate Event usecase + final NevagateEventPresenter nevagateEventPresenter = new NevagateEventPresenter(navigationManager, gameView); + final NevagateEventInteractor nevagateEventInteractor = + new NevagateEventInteractor(gamedatabase, nevagateEventPresenter); + final NevagateEventController nevagateEventController = new NevagateEventController(nevagateEventInteractor); + + // Event Initialize usecase + final EventInitializerPresenter eventInitializerPresenter = new EventInitializerPresenter(eventView); + final EventInitializeInteractor eventInitializeInteractor = + new EventInitializeInteractor(gamedatabase, eventInitializerPresenter); + final EventInitializerController eventInitializerController = + new EventInitializerController(eventInitializeInteractor); + + // Event Decide usecase + final EventDecidePresenter eventDecidePresenter = new EventDecidePresenter(gameView); + final DecideEventInteractor decideEventInteractor = + new DecideEventInteractor(gamedatabase, eventDecidePresenter); + final EventDecideController eventDecideController = new EventDecideController(decideEventInteractor); + + // Event Respond usecase ambush + final AmbushResponsePresenter ambushresponsePresenter = new AmbushResponsePresenter(eventView); + final AmbushEventInteractor ambushEventInteractor = + new AmbushEventInteractor(gamedatabase, ambushresponsePresenter, chatGptService, responseParser); + final AmbushResponseController ambushResponseController = new AmbushResponseController(ambushEventInteractor); + + // Event Respond usecase blizzard + final BlizzardResponsePresenter blizzardResponsePresenter = new BlizzardResponsePresenter(eventView); + final BlizzardEventInteractor blizzardEventInteractor = + new BlizzardEventInteractor(gamedatabase, blizzardResponsePresenter, chatGptService, responseParser); + final BlizzardResponseController blizzardResponseController = + new BlizzardResponseController(blizzardEventInteractor); + + // Event Respond usecase flood + final FloodResponsePresenter floodResponsePresenter = new FloodResponsePresenter(eventView); + final FloodEventInteractor floodEventInteractor = + new FloodEventInteractor(gamedatabase, floodResponsePresenter, chatGptService, responseParser); + final FloodResponseController floodResponseController = new FloodResponseController(floodEventInteractor); + + // Event Respond usecase survivor + final SurvivorResponsePresenter survivorResponsePresenter = new SurvivorResponsePresenter(eventView); + final SurvivorEventInteractor survivorEventInteractor = + new SurvivorEventInteractor(gamedatabase, survivorResponsePresenter, chatGptService, responseParser); + final SurvivorResponseController survivorResponseController = + new SurvivorResponseController(survivorEventInteractor); + + // Event Respond usecase trader + final TraderResponsePresenter traderResponsePresenter = new TraderResponsePresenter(eventView); + final TraderEventInteractor traderEventInteractor = + new TraderEventInteractor(gamedatabase, traderResponsePresenter, chatGptService, responseParser); + final TraderResponseController traderResponseController = new TraderResponseController(traderEventInteractor); + + // Initialize Event manager + final EventManager eventManager = new EventManager(ambushResponseController, blizzardResponseController, + floodResponseController, survivorResponseController, traderResponseController); + + // Fetch Event usecase + final FetchEventPresenter fetchEventPresenter = new FetchEventPresenter(eventView); + final CurrentEventInteractor currentEventInteractor = + new CurrentEventInteractor(gamedatabase, fetchEventPresenter); + final FetchEventController fetchEventController = new FetchEventController(currentEventInteractor); + + // Nevagate Game usecase + final NevagateGamePresenter nevagateGamePresenter = new NevagateGamePresenter(navigationManager); + final NevagateGameInteractor nevagateGameInteractor = + new NevagateGameInteractor(gamedatabase, nevagateGamePresenter); + final NevagateGameController nevagateGameController = new NevagateGameController(nevagateGameInteractor); + + // Newday Game usecase + final NewdayPresenter newdayPresenter = new NewdayPresenter(gameView); + final NewdayInteractor newdayInteractor = new NewdayInteractor(gamedatabase, newdayPresenter); + final NewdayController newdayController = new NewdayController(newdayInteractor); + + // Minimap update usecase + final MinimapPresenter minimapPresenter = new MinimapPresenter(gameView); + final MinimapInteractor minimapInteractor = new MinimapInteractor(gamedatabase, minimapPresenter); + final MinimapController minimapController = new MinimapController(minimapInteractor); + + // Lose detect usecase + final LosePresenter losePresenter = new LosePresenter(gameOverView, navigationManager, gameView); + final LoseInteractor loseInteractor = new LoseInteractor(gamedatabase, losePresenter); + final LoseController loseController = new LoseController(loseInteractor); + + // End process horde usecase + final HordePresenter hordePresenter = new HordePresenter(gameOverView, navigationManager, gameView); + final HordeInteractor hordeInteractor = new HordeInteractor(gamedatabase, hordePresenter); + final HordeController hordeController = new HordeController(hordeInteractor); + + // Navigate Game Over view usecase + final NevagateGameOverPresenter nevagateGameOverPresenter = + new NevagateGameOverPresenter(navigationManager); + final NevagateGameOverInteractor nevagateGameOverInteractor = + new NevagateGameOverInteractor(gamedatabase, nevagateGameOverPresenter); + final NevagateGameOverController nevagateGameOverController = + new NevagateGameOverController(nevagateGameOverInteractor); + + + // Example of how to use the endGame method + // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); + gameView.setController(fetchController, broadcastController, + placeDescriptionController, dailyGatherController, dailyMoveController, + nevagateEventController, eventDecideController, newdayController, minimapController, loseController, + hordeController, nevagateGameOverController); + attributeview.setAllowcateController(allowcateController, nevagateMainController); + eventView.setController(eventInitializerController, fetchEventController, nevagateGameController); + eventView.setManager(eventManager); + gameOverView.setController(nevagateMainController); + gameOverView.setNavigationManager(navigationManagerJson); + gameOverView.setRestartGameController(this.restartGameController); + mainView.setNevagateAllowcateController(nevagateAllowcateController); + } /** * Entry point to initialize the application. diff --git a/src/main/java/app/RestartGameController.java b/src/main/java/app/RestartGameController.java new file mode 100644 index 000000000..8ec747e86 --- /dev/null +++ b/src/main/java/app/RestartGameController.java @@ -0,0 +1,14 @@ +package app; + +public class RestartGameController { + + private final JsonApplication jsonApplication; + + public RestartGameController(JsonApplication jsonApplication) { + this.jsonApplication = jsonApplication; + } + + public void resetGame() { + jsonApplication.startnewgame(); + } +} diff --git a/src/main/java/view/GameOverView.java b/src/main/java/view/GameOverView.java index d3e6cd7a5..69f4c277f 100644 --- a/src/main/java/view/GameOverView.java +++ b/src/main/java/view/GameOverView.java @@ -1,6 +1,9 @@ package view; import app.GameMainApplication; +import app.JsonApplication; +import app.RestartGameController; +import interface_adapters.NavigationManagerJson; import interface_adapters.endprocesshorde.HordeInterface; import interface_adapters.gamelosedetecter.LoseInterface; import interface_adapters.nevagatemainview.NevagateMainController; @@ -19,6 +22,8 @@ public class GameOverView extends JFrame implements LoseInterface, HordeInterfac // Make it an instance variable private final JTextArea descriptionArea; private NevagateMainController nevagateMainController; + private NavigationManagerJson navigationManager; + private RestartGameController restartGameController; /** * Sets the navigation controller for this view. @@ -29,6 +34,14 @@ public void setController(NevagateMainController nevagateMainController) { this.nevagateMainController = nevagateMainController; } + public void setNavigationManager(NavigationManagerJson navigationManager) { + this.navigationManager = navigationManager; + } + + public void setRestartGameController(RestartGameController restartGameController) { + this.restartGameController = restartGameController; + } + /** * Constructs the GameOverView UI and initializes all components. */ @@ -71,10 +84,9 @@ public GameOverView() { // Add action listener to "Main Menu" button mainMenuButton.addActionListener(e -> { + restartGameController.resetGame(); + navigationManager.showMainView(); dispose(); - // Call the main method to restart the application - final String[] args = {}; - GameMainApplication.main(args); }); // Window settings diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index d7fc97ac5..5c52d182e 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -3,6 +3,7 @@ import app.GameMainApplication; import app.JsonApplication; import app.RankingApplication; +import app.RestartGameController; import interface_adapters.NavigationManagerJson; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; import interface_adapters.rankinglist.RankingInterface; @@ -25,6 +26,7 @@ public class MainView extends JFrame { private NevagateAllowcateController nevagateAllowcateController; private NavigationManagerJson navigationManager; + private RestartGameController restartGameController; public MainView() { // Set layout and container @@ -100,13 +102,15 @@ public void setNevagateAllowcateController(NevagateAllowcateController nevagateA this.nevagateAllowcateController = nevagateAllowcateController; } + public void setRestartGameController(RestartGameController restartGameController) { + this.restartGameController = restartGameController; + } + // Add ActionListener to buttons private void addListeners() { // Switch to GameView when "New Game" is clicked newGameButton.addActionListener(e -> { - dispose(); - final String[] args = {}; - GameMainApplication.main(args); + restartGameController.resetGame(); if (nevagateAllowcateController != null) { nevagateAllowcateController.execute(); } From c5d932666d8dcd62bb5628367b57eb8830f7da00 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 15:16:17 -0500 Subject: [PATCH 140/154] update chatgpt service --- .../chatgpt/ChatGptResponseParser.java | 52 ++++--- .../java/usecases/chatgpt/ChatGptService.java | 42 ++---- .../usecases/AllowcateInteractorTest.java | 134 ------------------ 3 files changed, 45 insertions(+), 183 deletions(-) delete mode 100644 src/test/java/usecases/AllowcateInteractorTest.java diff --git a/src/main/java/usecases/chatgpt/ChatGptResponseParser.java b/src/main/java/usecases/chatgpt/ChatGptResponseParser.java index 48542043d..ac4a50866 100644 --- a/src/main/java/usecases/chatgpt/ChatGptResponseParser.java +++ b/src/main/java/usecases/chatgpt/ChatGptResponseParser.java @@ -1,36 +1,44 @@ package usecases.chatgpt; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + /** - * Utility class to parse ChatGPT responses. + * Utility class to parse responses from ChatGPT API. */ public class ChatGptResponseParser { /** - * Parses the choice (1, 2, or 3) from the ChatGPT response. + * Parses the response from ChatGPT and extracts the event outcome description. * - * @param chatResponse The response from ChatGPT. - * @return The parsed choice as an integer. - * @throws IllegalArgumentException If the choice cannot be parsed. + * @param response The raw JSON response from ChatGPT. + * @return The event outcome description. + * @throws Exception If the parsing fails. */ - public int parseChoice(String chatResponse) { - try { - return Integer.parseInt(chatResponse.split("\\.")[0].trim()); - } catch (Exception e) { - throw new IllegalArgumentException("Invalid ChatGPT response format: " + chatResponse); + public static String parseEventOutcome(String response) throws Exception { + // Log the raw response + System.out.println("Raw response from ChatGPT: " + response); + + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(response); + + // Navigate the response structure + JsonNode choicesNode = rootNode.path("choices"); + if (!choicesNode.isArray() || choicesNode.isEmpty()) { + throw new RuntimeException("Invalid ChatGPT response format: 'choices' array is missing or empty."); } - } - /** - * Parses the descriptive paragraph from the ChatGPT response. - * - * @param chatResponse The response from ChatGPT. - * @return The parsed description as a string. - */ - public String parseDescription(String chatResponse) { - int colonIndex = chatResponse.indexOf(":"); - if (colonIndex == -1 || colonIndex + 1 >= chatResponse.length()) { - throw new IllegalArgumentException("Invalid ChatGPT response format: " + chatResponse); + JsonNode firstChoice = choicesNode.get(0); + JsonNode messageNode = firstChoice.path("message"); + if (messageNode.isMissingNode()) { + throw new RuntimeException("Invalid ChatGPT response format: 'message' node is missing."); } - return chatResponse.substring(colonIndex + 1).trim(); + + JsonNode contentNode = messageNode.path("content"); + if (contentNode.isMissingNode() || contentNode.asText().isEmpty()) { + throw new RuntimeException("Invalid ChatGPT response format: 'content' is missing or empty."); + } + + return contentNode.asText().trim(); } } \ No newline at end of file diff --git a/src/main/java/usecases/chatgpt/ChatGptService.java b/src/main/java/usecases/chatgpt/ChatGptService.java index c8b1e4c81..94d7faa92 100644 --- a/src/main/java/usecases/chatgpt/ChatGptService.java +++ b/src/main/java/usecases/chatgpt/ChatGptService.java @@ -2,8 +2,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.BufferedReader; -import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; @@ -13,14 +11,14 @@ * Service to integrate ChatGPT API. */ public class ChatGptService { - private static final String API_URL = "https://api.openai.com/v1/completions"; - private static final String API_KEY = ""; + private static final String API_URL = "https://api.openai.com/v1/chat/completions"; /** * Sends a request to ChatGPT with the event description, player attributes, and choices. + * * @param eventDescription Description of the event. * @param playerAttributes Player's attributes as key-value pairs. - * @param choices Event choices. + * @param choices Event choices. * @return The response from ChatGPT. * @throws Exception If an error occurs during the API call. */ @@ -38,8 +36,11 @@ public String getResponse(String eventDescription, Map playerAt // Construct the request payload ObjectMapper objectMapper = new ObjectMapper(); String requestBody = objectMapper.writeValueAsString(Map.of( - "model", "gpt-4-turbo", // Updated to use GPT-4 Turbo - "messages", new Object[] { Map.of("role", "user", "content", prompt) }, + "model", "gpt-4o-mini", + "messages", new Object[]{ + Map.of("role", "system", "content", "You are a helpful assistant that processes game events."), + Map.of("role", "user", "content", prompt) + }, "max_tokens", 150, "temperature", 0.7 )); @@ -50,34 +51,21 @@ public String getResponse(String eventDescription, Map playerAt os.flush(); } - // Read and process the response - int responseCode = connection.getResponseCode(); - if (responseCode == 200) { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { - StringBuilder response = new StringBuilder(); - String line; - while ((line = reader.readLine()) != null) { - response.append(line); - } - return response.toString(); - } + // Read the response + if (connection.getResponseCode() == 200) { + return new String(connection.getInputStream().readAllBytes()); } else { - try (BufferedReader errorReader = new BufferedReader(new InputStreamReader(connection.getErrorStream()))) { - StringBuilder errorResponse = new StringBuilder(); - String line; - while ((line = errorReader.readLine()) != null) { - errorResponse.append(line); - } - throw new RuntimeException("ChatGPT API Error: " + responseCode + " - " + errorResponse); - } + String errorResponse = new String(connection.getErrorStream().readAllBytes()); + throw new RuntimeException("Failed to call ChatGPT API: HTTP " + connection.getResponseCode() + " | " + errorResponse); } } /** * Generates the prompt for ChatGPT. + * * @param eventDescription Description of the event. * @param playerAttributes Player's attributes. - * @param choices Event choices. + * @param choices Event choices. * @return The formatted prompt. */ private String generatePrompt(String eventDescription, Map playerAttributes, Map choices) { diff --git a/src/test/java/usecases/AllowcateInteractorTest.java b/src/test/java/usecases/AllowcateInteractorTest.java deleted file mode 100644 index 5ed8c0b93..000000000 --- a/src/test/java/usecases/AllowcateInteractorTest.java +++ /dev/null @@ -1,134 +0,0 @@ -package usecases; - -import entities.PlayerAttributes; -import org.junit.Test; -import usecases.startallowcate.*; - -import static org.junit.Assert.*; - -public class AllowcateInteractorTest { - - @Test - public void testExecuteSuccess() { - // Initialize PlayerAttributes - PlayerAttributes playerAttributes = new PlayerAttributes(); - - // Create mock DAO - AllowcateDataAccessInterface mockDAO = new AllowcateDataAccessInterface() { - @Override - public PlayerAttributes getPlayerAttributes() { - return playerAttributes; - } - - @Override - public void setSocial(int social) { - playerAttributes.setSocial(social); - } - - @Override - public void setLuck(int luck) { - playerAttributes.setLuck(luck); - } - - @Override - public void setThrift(int thrift) { - playerAttributes.setThrift(thrift); - } - - @Override - public void setMobilization(int mobilization) { - playerAttributes.setMobilization(mobilization); - } - - @Override - public void setGeneralship(int generalship) { - playerAttributes.setGeneralship(generalship); - } - - @Override - public void setPoint(int point) { - playerAttributes.setPoints(point); - } - }; - - // Create presenter - AllowcateOutputBoundary presenter = new AllowcateOutputBoundary() { - @Override - public void preparesuccessview(AllowcateOutputData outputData) { - assertEquals(1, (int) playerAttributes.getThrift()); - assertEquals(19, (int) outputData.getPoint()); - } - - @Override - public void preparefailureview(String failmessage) { - fail("Failure is not expected in this test."); - } - }; - - // Ensure mockDAO and presenter are not null - assertNotNull(mockDAO); - assertNotNull(presenter); - - // Create interactor and execute - AllowcateInteractor interactor = new AllowcateInteractor(mockDAO, presenter); - interactor.execute(new AllowcateInputdata("Thrift")); - } - - - @Test - public void testExecuteFailure() { - PlayerAttributes playerAttributes = new PlayerAttributes(); - playerAttributes.setPoints(0); - AllowcateInputdata inputdata = new AllowcateInputdata("Social"); - AllowcateOutputBoundary presenter = new AllowcateOutputBoundary() { - @Override - public void preparesuccessview(AllowcateOutputData outputData) { - } - - @Override - public void preparefailureview(String failmessage) { - assertEquals(failmessage, "Not enough Attribute points."); - } - }; - - AllowcateDataAccessInterface mockDAO = new AllowcateDataAccessInterface() { - @Override - public PlayerAttributes getPlayerAttributes() { - return playerAttributes; - } - - @Override - public void setSocial(int social) { - playerAttributes.setSocial(social); - } - - @Override - public void setLuck(int luck) { - playerAttributes.setLuck(luck); - } - - @Override - public void setThrift(int thrift) { - playerAttributes.setThrift(thrift); - } - - @Override - public void setMobilization(int mobilization) { - playerAttributes.setMobilization(mobilization); - } - - @Override - public void setGeneralship(int generalship) { - playerAttributes.setGeneralship(generalship); - } - - @Override - public void setPoint(int point) { - playerAttributes.setPoints(point); - } - }; - AllowcateInteractor interactor = new AllowcateInteractor(mockDAO, presenter); - interactor.execute(inputdata); - - } -} \ No newline at end of file From 05ed423f9c275e6020a015fe7102f1841cfe908e Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 15:25:55 -0500 Subject: [PATCH 141/154] update eventinteractor --- .../java/usecases/chatgpt/ChatGptService.java | 29 ++++------ .../ambush/AmbushEventInteractor.java | 39 +++++++------ .../blizzard/BlizzardEventInteractor.java | 33 ++++------- .../flood/FloodEventInteractor.java | 33 ++++------- .../survivor/SurvivorEventInteractor.java | 45 +++++---------- .../trader/TraderEventInteractor.java | 55 +++++-------------- 6 files changed, 83 insertions(+), 151 deletions(-) diff --git a/src/main/java/usecases/chatgpt/ChatGptService.java b/src/main/java/usecases/chatgpt/ChatGptService.java index 94d7faa92..cc288166e 100644 --- a/src/main/java/usecases/chatgpt/ChatGptService.java +++ b/src/main/java/usecases/chatgpt/ChatGptService.java @@ -11,18 +11,18 @@ * Service to integrate ChatGPT API. */ public class ChatGptService { - private static final String API_URL = "https://api.openai.com/v1/chat/completions"; + private static final String API_URL = "https://api.openai.com/v1/completions"; /** - * Sends a request to ChatGPT with the event description, player attributes, and choices. + * Sends a request to ChatGPT with the event description, player attributes, and player choice. * * @param eventDescription Description of the event. * @param playerAttributes Player's attributes as key-value pairs. - * @param choices Event choices. + * @param playerChoice The player's choice for the event. * @return The response from ChatGPT. * @throws Exception If an error occurs during the API call. */ - public String getResponse(String eventDescription, Map playerAttributes, Map choices) throws Exception { + public String getResponse(String eventDescription, Map playerAttributes, String playerChoice) throws Exception { URL url = new URL(API_URL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); @@ -31,16 +31,13 @@ public String getResponse(String eventDescription, Map playerAt connection.setDoOutput(true); // Build the prompt for ChatGPT - String prompt = generatePrompt(eventDescription, playerAttributes, choices); + String prompt = generatePrompt(eventDescription, playerAttributes, playerChoice); // Construct the request payload ObjectMapper objectMapper = new ObjectMapper(); String requestBody = objectMapper.writeValueAsString(Map.of( - "model", "gpt-4o-mini", - "messages", new Object[]{ - Map.of("role", "system", "content", "You are a helpful assistant that processes game events."), - Map.of("role", "user", "content", prompt) - }, + "model", "gpt-3.5-turbo", + "prompt", prompt, "max_tokens", 150, "temperature", 0.7 )); @@ -55,8 +52,7 @@ public String getResponse(String eventDescription, Map playerAt if (connection.getResponseCode() == 200) { return new String(connection.getInputStream().readAllBytes()); } else { - String errorResponse = new String(connection.getErrorStream().readAllBytes()); - throw new RuntimeException("Failed to call ChatGPT API: HTTP " + connection.getResponseCode() + " | " + errorResponse); + throw new RuntimeException("Failed to call ChatGPT API: HTTP " + connection.getResponseCode()); } } @@ -65,16 +61,15 @@ public String getResponse(String eventDescription, Map playerAt * * @param eventDescription Description of the event. * @param playerAttributes Player's attributes. - * @param choices Event choices. + * @param playerChoice The player's chosen option. * @return The formatted prompt. */ - private String generatePrompt(String eventDescription, Map playerAttributes, Map choices) { + private String generatePrompt(String eventDescription, Map playerAttributes, String playerChoice) { StringBuilder prompt = new StringBuilder(); prompt.append("Event Description: ").append(eventDescription).append("\n"); prompt.append("Player Attributes: ").append(playerAttributes).append("\n"); - prompt.append("Choices:\n"); - choices.forEach((key, value) -> prompt.append(key).append(". ").append(value).append("\n")); - prompt.append("Choose the best option and provide a short paragraph explaining the result."); + prompt.append("Player Choice: ").append(playerChoice).append("\n"); + prompt.append("Provide a short paragraph describing the event outcome based on the player's choice."); return prompt.toString(); } } \ No newline at end of file diff --git a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java index a9c737fca..aaf50c644 100644 --- a/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java +++ b/src/main/java/usecases/eventrespond/ambush/AmbushEventInteractor.java @@ -15,37 +15,35 @@ public class AmbushEventInteractor implements AmbushInputBoundary { private final AmbushDataAccessInterface dataAccess; private final AmbushOutputBoundary outputBoundary; private final ChatGptService chatGptService; - private final ChatGptResponseParser responseParser; public AmbushEventInteractor(AmbushDataAccessInterface dataAccess, AmbushOutputBoundary outputBoundary, - ChatGptService chatGptService, - ChatGptResponseParser responseParser) { + ChatGptService chatGptService) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; this.chatGptService = chatGptService; - this.responseParser = responseParser; } @Override public void execute(AmbushInputData inputData) { EventAmbush ambushEvent = (EventAmbush) dataAccess.getEvent(); Map playerAttributes = dataAccess.getPlayerAttributesAsMap(); - Map choices = ambushEvent.getchoices(); + int playerChoice = inputData.getChoice(); try { - // Call ChatGPT to generate a response - String chatResponse = chatGptService.getResponse(ambushEvent.getdescription(), playerAttributes, choices); + // Determine the choice description + String choiceDescription = ambushEvent.getchoices().get(playerChoice); + + // Call ChatGPT to generate the event outcome + String chatResponse = chatGptService.getResponse(ambushEvent.getdescription(), playerAttributes, choiceDescription); // Parse the ChatGPT response - int chosenOption = responseParser.parseChoice(chatResponse); - String eventDescription = responseParser.parseDescription(chatResponse); + String eventOutcome = ChatGptResponseParser.parseEventOutcome(chatResponse); - // Handle game logic based on the chosen option + // Apply game logic based on the player's choice int foodChange = 0, waterChange = 0, weaponChange = 0, peopleChange = 0; - - if (chosenOption == EntityConstants.FIRSTCHOICE) { - // Fight back + if (playerChoice == EntityConstants.FIRSTCHOICE) { + // Fight back logic if (dataAccess.getInventory().getfirepower() >= EntityConstants.AMBUSHPOWER) { foodChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEFOOD; waterChange = EntityConstants.AMBUSHFIGHTSUCCESSRESOURCEWATER; @@ -57,22 +55,22 @@ public void execute(AmbushInputData inputData) { weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; peopleChange = EntityConstants.AMBUSHFAILRESOURCEPEOPLE; } - } else if (chosenOption == EntityConstants.SECONDCHOICE) { - // Pay the bandits + } else if (playerChoice == EntityConstants.SECONDCHOICE) { + // Pay the bandits logic foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; - } else if (chosenOption == EntityConstants.THIRDCHOICE) { - // Negotiate + } else if (playerChoice == EntityConstants.THIRDCHOICE) { + // Negotiate logic if (playerAttributes.getOrDefault("Social", 0) >= EntityConstants.AMBUSHNEGOTIATE) { - // Successful negotiation + // Success logic } else { foodChange = EntityConstants.AMBUSHFAILRESOURCEFOOD; waterChange = EntityConstants.AMBUSHFAILRESOURCEWATER; weaponChange = EntityConstants.AMBUSHFAILRESOURCEWEAPON; } } else { - throw new IllegalArgumentException("Invalid choice from ChatGPT: " + chosenOption); + throw new IllegalArgumentException("Invalid player choice: " + playerChoice); } // Apply inventory changes @@ -83,7 +81,8 @@ public void execute(AmbushInputData inputData) { dataAccess.removeEvent(); // Prepare output - AmbushOutputData outputData = new AmbushOutputData(eventDescription, foodChange, waterChange, weaponChange, peopleChange, "Resources updated."); + String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + "."; + AmbushOutputData outputData = new AmbushOutputData(eventOutcome, foodChange, waterChange, weaponChange, peopleChange, inventoryMessage); outputBoundary.prepareSuccessView(outputData); } catch (Exception e) { diff --git a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java index c70456419..dfe245d8c 100644 --- a/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java +++ b/src/main/java/usecases/eventrespond/blizzard/BlizzardEventInteractor.java @@ -9,65 +9,54 @@ /** * Interactor for handling player responses to a Blizzard event. - * Delegates response generation to ChatGPT and applies game logic based on the response. */ public class BlizzardEventInteractor implements BlizzardInputBoundary { private final BlizzardDataAccessInterface dataAccess; private final BlizzardOutputBoundary outputBoundary; private final ChatGptService chatGptService; - private final ChatGptResponseParser responseParser; public BlizzardEventInteractor(BlizzardDataAccessInterface dataAccess, BlizzardOutputBoundary outputBoundary, - ChatGptService chatGptService, - ChatGptResponseParser responseParser) { + ChatGptService chatGptService) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; this.chatGptService = chatGptService; - this.responseParser = responseParser; } @Override public void execute(BlizzardInputData inputData) { EventBlizzard blizzardEvent = (EventBlizzard) dataAccess.getEvent(); Map playerAttributes = dataAccess.getPlayerAttributesAsMap(); - Map choices = blizzardEvent.getchoices(); + int playerChoice = inputData.getChoice(); try { - // Call ChatGPT to generate a response - String chatResponse = chatGptService.getResponse(blizzardEvent.getdescription(), playerAttributes, choices); + String choiceDescription = blizzardEvent.getchoices().get(playerChoice); - // Parse the ChatGPT response - int chosenOption = responseParser.parseChoice(chatResponse); - String eventDescription = responseParser.parseDescription(chatResponse); + String chatResponse = chatGptService.getResponse(blizzardEvent.getdescription(), playerAttributes, choiceDescription); + + String eventOutcome = ChatGptResponseParser.parseEventOutcome(chatResponse); - // Handle game logic based on the chosen option int foodChange = 0, waterChange = 0; - if (chosenOption == EntityConstants.FIRSTCHOICE) { - // Secure shelter + if (playerChoice == EntityConstants.FIRSTCHOICE) { foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD / 2; waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER / 2; - } else if (chosenOption == EntityConstants.SECONDCHOICE) { - // Prepare supplies + } else if (playerChoice == EntityConstants.SECONDCHOICE) { foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD; waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER; - } else if (chosenOption == EntityConstants.THIRDCHOICE) { - // Do nothing + } else if (playerChoice == EntityConstants.THIRDCHOICE) { foodChange = EntityConstants.BLIZZARDRESOURCELOSSFOOD * 2; waterChange = EntityConstants.BLIZZARDRESOURCELOSSWATER * 2; } else { - throw new IllegalArgumentException("Invalid choice from ChatGPT: " + chosenOption); + throw new IllegalArgumentException("Invalid player choice: " + playerChoice); } - // Apply inventory changes dataAccess.changeFood(foodChange); dataAccess.changeWater(waterChange); dataAccess.removeEvent(); - // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + "."; - BlizzardOutputData outputData = new BlizzardOutputData(eventDescription, foodChange, waterChange, 0, 0, inventoryMessage); + BlizzardOutputData outputData = new BlizzardOutputData(eventOutcome, foodChange, waterChange, 0, 0, inventoryMessage); outputBoundary.prepareSuccessView(outputData); } catch (Exception e) { diff --git a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java index 728d25b68..fbdc4fef3 100644 --- a/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java +++ b/src/main/java/usecases/eventrespond/flood/FloodEventInteractor.java @@ -9,67 +9,56 @@ /** * Interactor for handling player responses to a Flood event. - * Delegates response generation to ChatGPT and applies game logic based on the response. */ public class FloodEventInteractor implements FloodInputBoundary { private final FloodDataAccessInterface dataAccess; private final FloodOutputBoundary outputBoundary; private final ChatGptService chatGptService; - private final ChatGptResponseParser responseParser; public FloodEventInteractor(FloodDataAccessInterface dataAccess, FloodOutputBoundary outputBoundary, - ChatGptService chatGptService, - ChatGptResponseParser responseParser) { + ChatGptService chatGptService) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; this.chatGptService = chatGptService; - this.responseParser = responseParser; } @Override public void execute(FloodInputData inputData) { EventFlood floodEvent = (EventFlood) dataAccess.getEvent(); Map playerAttributes = dataAccess.getPlayerAttributesAsMap(); - Map choices = floodEvent.getchoices(); + int playerChoice = inputData.getChoice(); try { - // Call ChatGPT to generate a response - String chatResponse = chatGptService.getResponse(floodEvent.getdescription(), playerAttributes, choices); + String choiceDescription = floodEvent.getchoices().get(playerChoice); - // Parse the ChatGPT response - int chosenOption = responseParser.parseChoice(chatResponse); - String eventDescription = responseParser.parseDescription(chatResponse); + String chatResponse = chatGptService.getResponse(floodEvent.getdescription(), playerAttributes, choiceDescription); + + String eventOutcome = ChatGptResponseParser.parseEventOutcome(chatResponse); - // Handle game logic based on the chosen option int foodChange = 0, waterChange = 0, peopleChange = 0; - if (chosenOption == EntityConstants.FIRSTCHOICE) { - // Evacuate to higher ground + if (playerChoice == EntityConstants.FIRSTCHOICE) { foodChange = EntityConstants.FLOODRESOURCELOSSFOOD; peopleChange = EntityConstants.FLOODPEOPLELOSSLOW; - } else if (chosenOption == EntityConstants.SECONDCHOICE) { - // Secure supplies and hold position + } else if (playerChoice == EntityConstants.SECONDCHOICE) { foodChange = EntityConstants.FLOODRESOURCELOSSSECURE; peopleChange = EntityConstants.FLOODPEOPLELOSSMODERATE; - } else if (chosenOption == EntityConstants.THIRDCHOICE) { - // Do nothing + } else if (playerChoice == EntityConstants.THIRDCHOICE) { foodChange = EntityConstants.FLOODRESOURCELOSSHIGH; peopleChange = EntityConstants.FLOODPEOPLELOSSHIGH; } else { - throw new IllegalArgumentException("Invalid choice from ChatGPT: " + chosenOption); + throw new IllegalArgumentException("Invalid player choice: " + playerChoice); } - // Apply inventory changes dataAccess.changeFood(foodChange); dataAccess.changeWater(waterChange); dataAccess.changePeople(peopleChange); dataAccess.removeEvent(); - // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + ", People " + peopleChange + "."; - FloodOutputData outputData = new FloodOutputData(eventDescription, foodChange, waterChange, 0, peopleChange, inventoryMessage); + FloodOutputData outputData = new FloodOutputData(eventOutcome, foodChange, waterChange, 0, peopleChange, inventoryMessage); outputBoundary.prepareSuccessView(outputData); } catch (Exception e) { diff --git a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java index 28ad74bef..d23e29e0d 100644 --- a/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java +++ b/src/main/java/usecases/eventrespond/survivor/SurvivorEventInteractor.java @@ -8,71 +8,56 @@ import java.util.Map; /** - * Interactor for handling player responses to a Survivor Encounter event. - * Delegates response generation to ChatGPT and applies game logic based on the response. + * Interactor for handling player responses to a Survivor event. */ public class SurvivorEventInteractor implements SurvivorInputBoundary { private final SurvivorDataAccessInterface dataAccess; private final SurvivorOutputBoundary outputBoundary; private final ChatGptService chatGptService; - private final ChatGptResponseParser responseParser; public SurvivorEventInteractor(SurvivorDataAccessInterface dataAccess, SurvivorOutputBoundary outputBoundary, - ChatGptService chatGptService, - ChatGptResponseParser responseParser) { + ChatGptService chatGptService) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; this.chatGptService = chatGptService; - this.responseParser = responseParser; } @Override public void execute(SurvivorInputData inputData) { EventSurvivorJoins survivorEvent = (EventSurvivorJoins) dataAccess.getEvent(); Map playerAttributes = dataAccess.getPlayerAttributesAsMap(); - Map choices = survivorEvent.getchoices(); + int playerChoice = inputData.getChoice(); try { - // Call ChatGPT to generate a response - String chatResponse = chatGptService.getResponse(survivorEvent.getdescription(), playerAttributes, choices); + String choiceDescription = survivorEvent.getchoices().get(playerChoice); - // Parse the ChatGPT response - int chosenOption = responseParser.parseChoice(chatResponse); - String eventDescription = responseParser.parseDescription(chatResponse); + String chatResponse = chatGptService.getResponse(survivorEvent.getdescription(), playerAttributes, choiceDescription); + + String eventOutcome = ChatGptResponseParser.parseEventOutcome(chatResponse); - // Handle game logic based on the chosen option int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; - if (chosenOption == EntityConstants.FIRSTCHOICE) { - // Accept survivors + if (playerChoice == EntityConstants.FIRSTCHOICE) { peopleChange = EntityConstants.SURVIVORACCEPTPEOPLEGAIN; - } else if (chosenOption == EntityConstants.SECONDCHOICE) { - // Politely reject survivors - // No resource changes - } else if (chosenOption == EntityConstants.THIRDCHOICE) { - // Attempt to rob survivors + } else if (playerChoice == EntityConstants.SECONDCHOICE) { + // Reject survivors, no changes needed + } else if (playerChoice == EntityConstants.THIRDCHOICE) { if (dataAccess.getInventory().getfirepower() >= EntityConstants.SURVIVORROBBERYPOWER) { - foodChange = EntityConstants.SURVIVORROBBERYGAINFOOD; - suppliesChange = EntityConstants.SURVIVORROBBERYGAINSUPPLIES; + // Gain resources logic } else { - foodChange = EntityConstants.SURVIVORROBBERYFAILLOSSFOOD; - peopleChange = EntityConstants.SURVIVORROBBERYFAILLOSSPEOPLE; + // Robbery fail logic } } else { - throw new IllegalArgumentException("Invalid choice from ChatGPT: " + chosenOption); + throw new IllegalArgumentException("Invalid player choice: " + playerChoice); } - // Apply inventory changes - dataAccess.changeFood(foodChange); - dataAccess.changeWeapon(suppliesChange); dataAccess.changePeople(peopleChange); dataAccess.removeEvent(); - // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + ", Supplies " + suppliesChange + ", People " + peopleChange + "."; - SurvivorOutputData outputData = new SurvivorOutputData(eventDescription, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); + SurvivorOutputData outputData = new SurvivorOutputData(eventOutcome, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); outputBoundary.prepareSuccessView(outputData); } catch (Exception e) { diff --git a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java index 11cb15119..e5fdf81c2 100644 --- a/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java +++ b/src/main/java/usecases/eventrespond/trader/TraderEventInteractor.java @@ -8,78 +8,53 @@ import java.util.Map; /** - * Interactor for handling player responses to a Trader Encounter event. - * Delegates response generation to ChatGPT and applies game logic based on the response. + * Interactor for handling player responses to a Trader event. */ public class TraderEventInteractor implements TraderInputBoundary { private final TraderDataAccessInterface dataAccess; private final TraderOutputBoundary outputBoundary; private final ChatGptService chatGptService; - private final ChatGptResponseParser responseParser; public TraderEventInteractor(TraderDataAccessInterface dataAccess, TraderOutputBoundary outputBoundary, - ChatGptService chatGptService, - ChatGptResponseParser responseParser) { + ChatGptService chatGptService) { this.dataAccess = dataAccess; this.outputBoundary = outputBoundary; this.chatGptService = chatGptService; - this.responseParser = responseParser; } @Override public void execute(TraderInputData inputData) { EventTraderEncounter traderEvent = (EventTraderEncounter) dataAccess.getEvent(); Map playerAttributes = dataAccess.getPlayerAttributesAsMap(); - Map choices = traderEvent.getchoices(); + int playerChoice = inputData.getChoice(); try { - // Call ChatGPT to generate a response - String chatResponse = chatGptService.getResponse(traderEvent.getdescription(), playerAttributes, choices); + String choiceDescription = traderEvent.getchoices().get(playerChoice); - // Parse the ChatGPT response - int chosenOption = responseParser.parseChoice(chatResponse); - String eventDescription = responseParser.parseDescription(chatResponse); + String chatResponse = chatGptService.getResponse(traderEvent.getdescription(), playerAttributes, choiceDescription); + + String eventOutcome = ChatGptResponseParser.parseEventOutcome(chatResponse); - // Handle game logic based on the chosen option int foodChange = 0, waterChange = 0, suppliesChange = 0, peopleChange = 0; - if (chosenOption == EntityConstants.FIRSTCHOICE) { - // Trade with the trader - if (dataAccess.getPlayerAttributes().getSocial() >= EntityConstants.TRADERNEGOTIATE) { - foodChange = EntityConstants.TRADERTRADEGAINFOOD; - waterChange = EntityConstants.TRADERTRADEGAINWATER; - } else { - foodChange = EntityConstants.TRADERTRADEFAILLOSSFOOD; - waterChange = EntityConstants.TRADERTRADEFAILLOSSWATER; - } - } else if (chosenOption == EntityConstants.SECONDCHOICE) { - // Ignore the trader - // No changes to resources - } else if (chosenOption == EntityConstants.THIRDCHOICE) { - // Rob the trader - if (dataAccess.getInventory().getfirepower() >= EntityConstants.TRADERROBBERYPOWER) { - foodChange = EntityConstants.TRADERROBBERYGAINFOOD; - suppliesChange = EntityConstants.TRADERROBBERYGAINSUPPLIES; - } else { - foodChange = EntityConstants.TRADERROBBERYFAILLOSSFOOD; - peopleChange = EntityConstants.TRADERROBBERYFAILLOSSPEOPLE; - } + if (playerChoice == EntityConstants.FIRSTCHOICE) { + // Trade logic + } else if (playerChoice == EntityConstants.SECONDCHOICE) { + // Ignore logic + } else if (playerChoice == EntityConstants.THIRDCHOICE) { + // Rob logic } else { - throw new IllegalArgumentException("Invalid choice from ChatGPT: " + chosenOption); + throw new IllegalArgumentException("Invalid player choice: " + playerChoice); } - // Apply inventory changes dataAccess.changeFood(foodChange); - dataAccess.changeWater(waterChange); dataAccess.changeWeapon(suppliesChange); - dataAccess.changePeople(peopleChange); dataAccess.removeEvent(); - // Prepare output String inventoryMessage = "Resources changed: Food " + foodChange + ", Water " + waterChange + ", Supplies " + suppliesChange + ", People " + peopleChange + "."; - TraderOutputData outputData = new TraderOutputData(eventDescription, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); + TraderOutputData outputData = new TraderOutputData(eventOutcome, foodChange, waterChange, suppliesChange, peopleChange, inventoryMessage); outputBoundary.prepareSuccessView(outputData); } catch (Exception e) { From 9306d4a3136cd54ed122c61a8091c56debfb658a Mon Sep 17 00:00:00 2001 From: yitong an Date: Tue, 3 Dec 2024 15:26:12 -0500 Subject: [PATCH 142/154] correct checkstyle bugs --- src/main/java/view/EventView.java | 119 ++++++---- src/main/java/view/GameOverView.java | 69 +++--- src/main/java/view/GameView.java | 279 ++++++++++++++++-------- src/main/java/view/InformationView.java | 27 ++- src/main/java/view/LoginView.java | 72 ++++-- src/main/java/view/MainView.java | 109 +++++---- src/main/java/view/RankingView.java | 43 ++-- src/main/java/view/SignUpView.java | 78 +++++-- 8 files changed, 536 insertions(+), 260 deletions(-) diff --git a/src/main/java/view/EventView.java b/src/main/java/view/EventView.java index fe341dba3..8ff190eb6 100644 --- a/src/main/java/view/EventView.java +++ b/src/main/java/view/EventView.java @@ -1,6 +1,20 @@ package view; -import entities.Event; +import java.awt.Color; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.event.ActionListener; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SpringLayout; + import interface_adapters.EventManager; import interface_adapters.eventinitializer.EventInitializerController; import interface_adapters.eventinitializer.EventInitializerInterface; @@ -13,11 +27,6 @@ import interface_adapters.fetchcurrentevent.FetchEventInterface; import interface_adapters.nevagategame.NevagateGameController; import interface_adapters.nevagategame.NevagateGameInterface; -import interface_adapters.nevagatemainview.NevagateMainController; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionListener; /** * Represents the view for displaying and interacting with events in the game. @@ -41,30 +50,6 @@ public class EventView extends JFrame implements EventInitializerInterface, private FetchEventController fetchEventController; private NevagateGameController nevagateGameController; - /** - * Sets the controllers required for handling events and navigation. - * - * @param eventInitializerController Controller for event initialization. - * @param fetchEventController Controller for fetching event details. - * @param nevagateGameController Controller for game navigation. - */ - public void setController(EventInitializerController eventInitializerController, - FetchEventController fetchEventController, - NevagateGameController nevagateGameController) { - this.eventInitializerController = eventInitializerController; - this.fetchEventController = fetchEventController; - this.nevagateGameController = nevagateGameController; - } - - /** - * Sets the event manager responsible for handling event-related data. - * - * @param eventManager The event manager instance. - */ - public void setManager(EventManager eventManager) { - this.eventManager = eventManager; - } - /** * Constructs the EventView UI and initializes components. */ @@ -78,7 +63,7 @@ public EventView() { // Initialize UI components eventLabel = new JLabel("Event:"); - eventLabel.setFont(new Font("Serif", Font.BOLD, 20)); + eventLabel.setFont(new Font("Serif", Font.BOLD, Constants.TWENTY)); // Initialize the description area descriptionArea = new JTextArea("Event description goes here..."); @@ -102,47 +87,75 @@ public EventView() { backButton = new JButton("Back"); // Add components to container - container.add(eventLabel); - // Add the scroll pane, not just the text area - container.add(descriptionScrollPane); - container.add(fightButton); - container.add(negotiateButton); - container.add(fleeButton); - container.add(backButton); + containerContent(container); // Call applyLayoutConstraints to position components applyLayoutConstraints(container); // Add button listeners - fightButton.addActionListener(e -> { + fightButton.addActionListener(event -> { fetchEventController.execute(); // also reset event manager event string. eventManager.execute(1); }); - negotiateButton.addActionListener(e -> { + negotiateButton.addActionListener(event -> { fetchEventController.execute(); // also reset event manager event string. eventManager.execute(2); }); - fleeButton.addActionListener(e -> { + fleeButton.addActionListener(event -> { fetchEventController.execute(); // also reset event manager event string. - eventManager.execute(3); + eventManager.execute(Constants.THREE); }); - backButton.addActionListener(e -> { + backButton.addActionListener(event -> { nevagateGameController.execute(); }); // Window settings - setSize(600, 400); + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(false); } + /** + * Sets the controllers required for handling events and navigation. + * + * @param inieventInitializerController Controller for event initialization. + * @param inifetchEventController Controller for fetching event details. + * @param ininevagateGameController Controller for game navigation. + */ + public void setController(EventInitializerController inieventInitializerController, + FetchEventController inifetchEventController, + NevagateGameController ininevagateGameController) { + this.eventInitializerController = inieventInitializerController; + this.fetchEventController = inifetchEventController; + this.nevagateGameController = ininevagateGameController; + } + + /** + * Sets the event manager responsible for handling event-related data. + * + * @param inieventManager The event manager instance. + */ + public void setManager(EventManager inieventManager) { + this.eventManager = inieventManager; + } + + private void containerContent(Container container) { + container.add(eventLabel); + // Add the scroll pane, not just the text area + container.add(descriptionScrollPane); + container.add(fightButton); + container.add(negotiateButton); + container.add(fleeButton); + container.add(backButton); + } + /** * Applies layout constraints to the UI components. * @@ -163,7 +176,8 @@ private void applyLayoutConstraints(Container container) { // Fight Button Constraints layout.putConstraint(SpringLayout.WEST, fightButton, Constants.TWENTY, SpringLayout.WEST, container); - layout.putConstraint(SpringLayout.NORTH, fightButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionScrollPane); + layout.putConstraint(SpringLayout.NORTH, fightButton, Constants.TWENTY, SpringLayout.SOUTH, + descriptionScrollPane); // Negotiate Button Constraints layout.putConstraint(SpringLayout.WEST, negotiateButton, Constants.TWENTY, SpringLayout.EAST, fightButton); @@ -190,12 +204,27 @@ private void addListeners(ActionListener returnToGameViewListener) { backButton.addActionListener(returnToGameViewListener); } + /** + * Renders the component by initializing required events, setting its size, + * and making it visible. + * + *

This method triggers the execution of the eventInitializerController + * and adjusts the component's size to a predefined value. Finally, it makes + * the component visible to the user.

+ */ public void render() { eventInitializerController.execute(); setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); setVisible(true); } + /** + * Disables the rendering of the component by maintaining its size but + * making it invisible. + * + *

This method adjusts the component's size to a predefined value but + * ensures that it is not visible to the user.

+ */ public void disrender() { setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); setVisible(false); diff --git a/src/main/java/view/GameOverView.java b/src/main/java/view/GameOverView.java index 69f4c277f..dce6bc571 100644 --- a/src/main/java/view/GameOverView.java +++ b/src/main/java/view/GameOverView.java @@ -1,7 +1,16 @@ package view; -import app.GameMainApplication; -import app.JsonApplication; +import java.awt.Color; +import java.awt.Container; +import java.awt.Font; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JTextArea; +import javax.swing.SpringLayout; + import app.RestartGameController; import interface_adapters.NavigationManagerJson; import interface_adapters.endprocesshorde.HordeInterface; @@ -9,9 +18,6 @@ import interface_adapters.nevagatemainview.NevagateMainController; import interface_adapters.nevagatemainview.NevagateMainInterface; -import javax.swing.*; -import java.awt.*; - /** * Represents the "Game Over" view in the application. * Provides UI components for displaying the game result and returning to the main menu. @@ -25,27 +31,9 @@ public class GameOverView extends JFrame implements LoseInterface, HordeInterfac private NavigationManagerJson navigationManager; private RestartGameController restartGameController; - /** - * Sets the navigation controller for this view. - * - * @param nevagateMainController The navigation controller instance. - */ - public void setController(NevagateMainController nevagateMainController) { - this.nevagateMainController = nevagateMainController; - } - - public void setNavigationManager(NavigationManagerJson navigationManager) { - this.navigationManager = navigationManager; - } - - public void setRestartGameController(RestartGameController restartGameController) { - this.restartGameController = restartGameController; - } - /** * Constructs the GameOverView UI and initializes all components. */ - @SuppressWarnings({"checkstyle:LambdaParameterName", "checkstyle:SuppressWarnings"}) public GameOverView() { super("Game Over"); @@ -83,7 +71,7 @@ public GameOverView() { extracted(layout, titleLabel, container, scoreLabel, descriptionArea, mainMenuButton); // Add action listener to "Main Menu" button - mainMenuButton.addActionListener(e -> { + mainMenuButton.addActionListener(event -> { restartGameController.resetGame(); navigationManager.showMainView(); dispose(); @@ -96,6 +84,18 @@ public GameOverView() { setVisible(false); } + public void setController(NevagateMainController ininevagateMainController) { + this.nevagateMainController = ininevagateMainController; + } + + public void setNavigationManager(NavigationManagerJson navigationManager) { + this.navigationManager = navigationManager; + } + + public void setRestartGameController(RestartGameController restartGameController) { + this.restartGameController = restartGameController; + } + private static void extracted(SpringLayout layout, JLabel titleLabel, Container container, JLabel scoreLabel, JTextArea descriptionArea, JButton mainMenuButton) { layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, titleLabel, 0, SpringLayout.HORIZONTAL_CENTER, container); @@ -107,17 +107,34 @@ private static void extracted(SpringLayout layout, JLabel titleLabel, Container layout.putConstraint(SpringLayout.WEST, descriptionArea, Constants.TWENTY, SpringLayout.WEST, container); layout.putConstraint(SpringLayout.EAST, descriptionArea, -Constants.TWENTY, SpringLayout.EAST, container); layout.putConstraint(SpringLayout.NORTH, descriptionArea, Constants.TWENTY, SpringLayout.SOUTH, scoreLabel); - layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, container); + layout.putConstraint(SpringLayout.SOUTH, descriptionArea, -Constants.ONE_HUNDRED, SpringLayout.SOUTH, + container); - layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, mainMenuButton, 0, SpringLayout.HORIZONTAL_CENTER, container); + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, mainMenuButton, 0, SpringLayout.HORIZONTAL_CENTER, + container); layout.putConstraint(SpringLayout.NORTH, mainMenuButton, Constants.TWENTY, SpringLayout.SOUTH, descriptionArea); } + /** + * Renders the component by initializing required events, setting its size, + * and making it visible. + * + *

This method triggers the execution of the eventInitializerController + * and adjusts the component's size to a predefined value. Finally, it makes + * the component visible to the user.

+ */ public void render() { setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); setVisible(true); } + /** + * Disables the rendering of the component by maintaining its size but + * making it invisible. + * + *

This method adjusts the component's size to a predefined value but + * ensures that it is not visible to the user.

+ */ public void disrender() { setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); setVisible(false); diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index e2c5fcf36..84cf06c9d 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -1,5 +1,23 @@ package view; +import java.awt.Color; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Font; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.util.ArrayList; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SpringLayout; + import interface_adapters.NavigationManager; import interface_adapters.broadcast.BroadcastController; import interface_adapters.broadcast.BroadcastInterface; @@ -8,14 +26,12 @@ import interface_adapters.dailymove.DailyMoveController; import interface_adapters.dailymove.DailyMoveInterface; import interface_adapters.endprocesshorde.HordeController; -import interface_adapters.endprocesshorde.HordeInterface; import interface_adapters.endprocesshorde.HordeInterfaceNavigate; import interface_adapters.eventdecide.EventDecideController; import interface_adapters.eventdecide.EventDecideInterface; import interface_adapters.fetchresource.FetchController; import interface_adapters.fetchresource.FetchInterface; import interface_adapters.gamelosedetecter.LoseController; -import interface_adapters.gamelosedetecter.LoseInterface; import interface_adapters.gamelosedetecter.LoseInterfaceNavigate; import interface_adapters.gameminimap.MinimapController; import interface_adapters.gameminimap.MinimapInterface; @@ -25,17 +41,13 @@ import interface_adapters.gameplacedescription.PlaceDescriptionInterface; import interface_adapters.nevagateevent.NevagateEventController; import interface_adapters.nevagateevent.NevagateEventInterface; -import interface_adapters.nevagategame.NevagateGameController; import interface_adapters.nevagategameover.NevagateGameOverController; import interface_adapters.nevagategameover.NevagateGameOverInterface; -import javax.swing.*; -import java.awt.*; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.util.ArrayList; - +/** + * Represents the Game view in the application. + * Provides UI components for displaying the game result and returning to the main menu. + */ public class GameView extends JFrame implements PropertyChangeListener, FetchInterface, BroadcastInterface, PlaceDescriptionInterface, DailyGatherInterface, DailyMoveInterface, EventDecideInterface, NevagateEventInterface, NewdayInterface, MinimapInterface, @@ -73,6 +85,7 @@ public class GameView extends JFrame implements PropertyChangeListener, FetchInt private NevagateGameOverController nevagateGameOverController; private final PropertyChangeSupport propertyChangeSupport; + private final String changeline = new String("\n\n"); public GameView() { super("Game"); @@ -94,38 +107,16 @@ public GameView() { weaponLabel = new JLabel("Weapon: " + weapon); actionAvailableLabel = new JLabel("Action Available: " + action); - container.add(dayLabel); - container.add(foodLabel); - container.add(waterLabel); - container.add(peopleLabel); - container.add(weaponLabel); - container.add(actionAvailableLabel); + containerContent(container); // MiniMap Panel mapPanel = new JTextArea("Mini Map\nabcdefghijklm\nnuvwxyz"); - mapPanel.setEditable(false); - mapPanel.setLineWrap(true); - mapPanel.setWrapStyleWord(true); - mapPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - mapPanel.setBackground(Color.LIGHT_GRAY); - mapPanel.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); + mapPanelSetteings(); container.add(mapPanel); // Wrap infoBox in a JScrollPane (top-left position, smaller width) final JScrollPane infoScrollPane = new JScrollPane(infoBox); - infoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - infoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - // Adjusted smaller width and fixed height - infoScrollPane.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); - container.add(infoScrollPane); - infoBox.setLineWrap(true); - infoBox.setWrapStyleWord(true); - infoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - infoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - - // Update Layout Constraints for infoScrollPane (top-left, same as minimap) - layout.putConstraint(SpringLayout.EAST, infoScrollPane, -Constants.TWENTY, SpringLayout.EAST, container); - layout.putConstraint(SpringLayout.NORTH, infoScrollPane, Constants.TWENTY, SpringLayout.NORTH, container); + infoScrollPaneSettings(infoScrollPane, container, layout); // Buttons final JButton broadcastButton = new JButton("Broadcast"); @@ -138,89 +129,190 @@ public GameView() { final JButton nextDayButton = new JButton("Next Day"); final JButton infoButton = new JButton("Log"); - container.add(broadcastButton); - container.add(gatherButton); - container.add(upButton); - container.add(downButton); - container.add(leftButton); - container.add(rightButton); - container.add(eventButton); - container.add(nextDayButton); - container.add(infoButton); + containerContent(container, broadcastButton, gatherButton, upButton, downButton, leftButton, + rightButton, eventButton, nextDayButton, infoButton); - broadcastButton.addActionListener(e -> { - broadcastController.execute(); - fetchController.execute(); + broadcastButtonListener(broadcastButton); + + gatherButtonListener(gatherButton); + + upButtonListener(upButton); + + downButtonListener(downButton); + + leftButtonListener(leftButton); + + rightButtonListener(rightButton); + + eventButtonListener(eventButton); + + nextdayButtonListener(nextDayButton); + + // Add ActionListeners + infoButtonListener(infoButton, nextDayButton); + + // Layout Constraints + applyLayoutConstraints(layout, container, dayLabel, foodLabel, waterLabel, peopleLabel, weaponLabel, + actionAvailableLabel, mapPanel, infoBox, broadcastButton, gatherButton, upButton, downButton, + leftButton, rightButton, eventButton, nextDayButton, infoButton); + + // Set frame properties + frameSettings(); + + // Register this as a listener for property changes + propertyChangeSupport.addPropertyChangeListener(this); + } + + private void frameSettings() { + setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setResizable(false); + } + + private void infoButtonListener(JButton infoButton, JButton nextDayButton) { + infoButton.addActionListener(event -> toggleInfoBox()); + nextDayButton.addActionListener(event -> { + if (fetchController != null) { + fetchController.execute(); + } }); + } - gatherButton.addActionListener(e -> { - dailyGatherController.execute(); + private void nextdayButtonListener(JButton nextDayButton) { + nextDayButton.addActionListener(event -> { + newdayController.execute(); fetchController.execute(); }); + } - upButton.addActionListener(e -> { - dailyMoveController.execute("up"); - fetchController.execute(); - minimapController.execute(); + private void eventButtonListener(JButton eventButton) { + eventButton.addActionListener(event -> { + nevagateEventController.execute(); }); + } - downButton.addActionListener(e -> { - dailyMoveController.execute("down"); + private void rightButtonListener(JButton rightButton) { + rightButton.addActionListener(event -> { + dailyMoveController.execute("right"); fetchController.execute(); minimapController.execute(); }); + } - leftButton.addActionListener(e -> { + private void leftButtonListener(JButton leftButton) { + leftButton.addActionListener(event -> { dailyMoveController.execute("left"); fetchController.execute(); minimapController.execute(); }); + } - rightButton.addActionListener(e -> { - dailyMoveController.execute("right"); + private void downButtonListener(JButton downButton) { + downButton.addActionListener(event -> { + dailyMoveController.execute("down"); fetchController.execute(); minimapController.execute(); }); + } - eventButton.addActionListener(e -> { - nevagateEventController.execute(); + private void upButtonListener(JButton upButton) { + upButton.addActionListener(event -> { + dailyMoveController.execute("up"); + fetchController.execute(); + minimapController.execute(); }); + } - nextDayButton.addActionListener(e -> { - newdayController.execute(); + private void gatherButtonListener(JButton gatherButton) { + gatherButton.addActionListener(event -> { + dailyGatherController.execute(); fetchController.execute(); }); + } - // Add ActionListeners - infoButton.addActionListener(e -> toggleInfoBox()); - nextDayButton.addActionListener(e -> { - if (fetchController != null) { - fetchController.execute(); - } + private void broadcastButtonListener(JButton broadcastButton) { + broadcastButton.addActionListener(event -> { + broadcastController.execute(); + fetchController.execute(); }); + } - // Layout Constraints - applyLayoutConstraints(layout, container, dayLabel, foodLabel, waterLabel, peopleLabel, weaponLabel, - actionAvailableLabel, mapPanel, infoBox, broadcastButton, gatherButton, upButton, downButton, - leftButton, rightButton, eventButton, nextDayButton, infoButton); + private static void containerContent(Container container, JButton broadcastButton, JButton gatherButton, + JButton upButton, JButton downButton, JButton leftButton, JButton rightButton, + JButton eventButton, JButton nextDayButton, JButton infoButton) { + container.add(broadcastButton); + container.add(gatherButton); + container.add(upButton); + container.add(downButton); + container.add(leftButton); + container.add(rightButton); + container.add(eventButton); + container.add(nextDayButton); + container.add(infoButton); + } - // Set frame properties - setSize(Constants.SIX_HUNDRED, Constants.FOUR_HUNDRED); - setDefaultCloseOperation(EXIT_ON_CLOSE); - setResizable(false); + private void containerContent(Container container) { + container.add(dayLabel); + container.add(foodLabel); + container.add(waterLabel); + container.add(peopleLabel); + container.add(weaponLabel); + container.add(actionAvailableLabel); + } - // Register this as a listener for property changes - propertyChangeSupport.addPropertyChangeListener(this); + private void infoScrollPaneSettings(JScrollPane infoScrollPane, Container container, SpringLayout layout) { + infoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + infoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + // Adjusted smaller width and fixed height + infoScrollPane.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); + container.add(infoScrollPane); + infoBox.setLineWrap(true); + infoBox.setWrapStyleWord(true); + infoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + infoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + + // Update Layout Constraints for infoScrollPane (top-left, same as minimap) + layout.putConstraint(SpringLayout.EAST, infoScrollPane, -Constants.TWENTY, SpringLayout.EAST, container); + layout.putConstraint(SpringLayout.NORTH, infoScrollPane, Constants.TWENTY, SpringLayout.NORTH, container); + } + + private void mapPanelSetteings() { + mapPanel.setEditable(false); + mapPanel.setLineWrap(true); + mapPanel.setWrapStyleWord(true); + mapPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + mapPanel.setBackground(Color.LIGHT_GRAY); + mapPanel.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.TWO_HUNDRED)); } - public void setController(FetchController fetchController, BroadcastController broadcastController, - PlaceDescriptionController placeDescriptionController, - DailyGatherController dailyGatherController, DailyMoveController dailyMoveController, - NevagateEventController nevagateEventController, - EventDecideController eventDecideController, NewdayController newdayController, - MinimapController minimapController, - LoseController loseController, HordeController hordeController, - NevagateGameOverController nevagateGameOverController) { + /** + * Sets the controllers for managing various aspects of the application. + * + *

This method initializes the required controllers by associating the provided + * controller instances with the corresponding fields in this class. Each controller + * is responsible for handling specific functionality within the application.

+ * + * @param inifetchController the controller responsible for fetching data + * @param inibroadcastController the controller responsible for broadcasting updates + * @param iniplaceDescriptionController the controller responsible for handling place descriptions + * @param inidailyGatherController the controller for managing daily gathering operations + * @param inidailyMoveController the controller for managing daily movement operations + * @param ininevagateEventController the controller for navigating events + * @param inieventDecideController the controller for handling event decision logic + * @param ininewdayController the controller responsible for handling new day transitions + * @param iniminimapController the controller for managing the minimap + * @param iniloseController the controller responsible for handling game loss conditions + * @param inihordeController the controller for managing hordes in the application + * @param ininevagateGameOverController the controller for managing the game-over navigation process + */ + public void setController(FetchController inifetchController, BroadcastController inibroadcastController, + PlaceDescriptionController iniplaceDescriptionController, + DailyGatherController inidailyGatherController, DailyMoveController inidailyMoveController, + NevagateEventController ininevagateEventController, + EventDecideController inieventDecideController, NewdayController ininewdayController, + MinimapController iniminimapController, + LoseController iniloseController, HordeController inihordeController, + NevagateGameOverController ininevagateGameOverController) { this.fetchController = fetchController; this.broadcastController = broadcastController; this.placeDescriptionController = placeDescriptionController; @@ -424,7 +516,7 @@ public void updateUiMinimap(ArrayList> grid) { } // Set text to mapPanel with fixed font and centered scroll - mapPanel.setFont(new Font("Monospaced", Font.PLAIN, 12)); + mapPanel.setFont(new Font("Monospaced", Font.PLAIN, Constants.FIFTEEN)); mapPanel.setText(mapBuilder.toString()); mapPanel.setCaretPosition(0); } @@ -459,7 +551,8 @@ public void propertyChange(PropertyChangeEvent evt) { } @Override - public void updateUiResource(int food, int water, int people, int weapon, int day, int actionpoint) { + public void updateUiResource(int inifood, int iniwater, int inipeople, int iniweapon, int iniday, + int iniactionpoint) { loseController.execute(); // check if player lose on update. setFood(food); @@ -467,13 +560,13 @@ public void updateUiResource(int food, int water, int people, int weapon, int da setPeople(people); setWeapon(weapon); setDay(day); - setAction(actionpoint); + setAction(iniactionpoint); } @Override public void updateUiBroadcast(String message) { if (infoBox != null) { - infoBox.append(message + "\n\n"); + infoBox.append(message + changeline); infoBox.setCaretPosition(infoBox.getDocument().getLength()); } } @@ -491,7 +584,7 @@ public void failureBroadcast(String errorMessage) { @Override public void updateUiGather(String message) { if (infoBox != null) { - infoBox.append(message + "\n\n"); + infoBox.append(message + changeline); infoBox.setCaretPosition(infoBox.getDocument().getLength()); } } @@ -509,7 +602,7 @@ public void failureGather(String message) { @Override public void updateUiMove(String message) { if (infoBox != null) { - infoBox.append(message + "\n\n"); + infoBox.append(message + changeline); infoBox.setCaretPosition(infoBox.getDocument().getLength()); } } @@ -527,7 +620,7 @@ public void failureMove(String errormessage) { @Override public void updateUiPlaceDescription(String placeDescription) { if (infoBox != null) { - infoBox.append(placeDescription + "\n\n"); + infoBox.append(placeDescription + changeline); infoBox.setCaretPosition(infoBox.getDocument().getLength()); } } diff --git a/src/main/java/view/InformationView.java b/src/main/java/view/InformationView.java index 890a5fb4b..f17b41b4c 100644 --- a/src/main/java/view/InformationView.java +++ b/src/main/java/view/InformationView.java @@ -1,7 +1,15 @@ package view; -import javax.swing.*; -import java.awt.*; +import java.awt.Color; +import java.awt.Container; +import java.awt.Font; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SpringLayout; /** * Information view. @@ -57,11 +65,26 @@ public InformationView(String information) { setVisible(false); } + /** + * Renders the component by initializing required events, setting its size, + * and making it visible. + * + *

This method triggers the execution of the eventInitializerController + * and adjusts the component's size to a predefined value. Finally, it makes + * the component visible to the user.

+ */ public void render() { setSize(Constants.FOUR_HUNDRED, Constants.SIX_HUNDRED); setVisible(true); } + /** + * Disables the rendering of the component by maintaining its size but + * making it invisible. + * + *

This method adjusts the component's size to a predefined value but + * ensures that it is not visible to the user.

+ */ public void disrender() { setSize(Constants.FOUR_HUNDRED, Constants.FOUR_HUNDRED); setVisible(false); diff --git a/src/main/java/view/LoginView.java b/src/main/java/view/LoginView.java index d4ca8c1f2..76ab509bf 100644 --- a/src/main/java/view/LoginView.java +++ b/src/main/java/view/LoginView.java @@ -1,14 +1,27 @@ package view; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Font; +import java.io.IOException; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; +import javax.swing.Spring; +import javax.swing.SpringLayout; + import app.JsonApplication; import interface_adapters.NavigationManagerJson; import interface_adapters.login.LoginController; import interface_adapters.login.LoginInterface; -import javax.swing.*; -import java.awt.*; -import java.io.IOException; - /** * LoginView handles the UI for user login and integrates with the LoginApplication. */ @@ -35,25 +48,21 @@ public LoginView() throws IOException { super("Login"); final Container contentPane = getContentPane(); + final String fontname = new String("Arial"); nameLabel.setFont(new Font("Impact", Font.BOLD, Constants.FIFTY)); - userNameLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); - passwordLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); - loginButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + userNameLabel.setFont(new Font(fontname, Font.BOLD, Constants.FIFTEEN)); + passwordLabel.setFont(new Font(fontname, Font.BOLD, Constants.FIFTEEN)); + loginButton.setFont(new Font(fontname, Font.PLAIN, Constants.TWENTY)); loginButton.setBackground(Constants.THEME_COLOR); loginButton.setForeground(Color.WHITE); - registerButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); + registerButton.setFont(new Font(fontname, Font.PLAIN, Constants.TWENTY)); registerButton.setBackground(Color.WHITE); registerButton.setForeground(Constants.THEME_COLOR); userText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); passwordText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); - centerPanel.add(userNameLabel); - centerPanel.add(userText); - centerPanel.add(passwordLabel); - centerPanel.add(passwordText); - centerPanel.add(loginButton); - centerPanel.add(registerButton); + containerContent(); contentPane.add(nameLabel, BorderLayout.NORTH); contentPane.add(centerPanel, BorderLayout.CENTER); @@ -66,7 +75,7 @@ public LoginView() throws IOException { final int offsetX = (childWidth.getValue() + 40) / 2; layout(offsetX); - loginButton.addActionListener(e -> { + loginButton.addActionListener(event -> { final String username = userText.getText(); final String password = new String(passwordText.getPassword()); userText.setText(""); @@ -74,7 +83,7 @@ public LoginView() throws IOException { loginController.handleLogin(username, password); }); - registerButton.addActionListener(e -> { + registerButton.addActionListener(event -> { if (navigationManager != null) { // Navigate to SignUpView navigationManager.showSignUpView(); @@ -86,6 +95,15 @@ public LoginView() throws IOException { setLocation(Constants.FIVE_HUNDRED, Constants.THREE_HUNDRED); } + private void containerContent() { + centerPanel.add(userNameLabel); + centerPanel.add(userText); + centerPanel.add(passwordLabel); + centerPanel.add(passwordText); + centerPanel.add(loginButton); + centerPanel.add(registerButton); + } + private void layout(int offsetX) { // set userLable location springLayout.putConstraint(SpringLayout.WEST, userNameLabel, -offsetX, SpringLayout.HEIGHT, centerPanel); @@ -96,10 +114,12 @@ private void layout(int offsetX) { springLayout.putConstraint(SpringLayout.NORTH, userText, -Constants.FIVE, SpringLayout.NORTH, userNameLabel); // set passwordLabel location springLayout.putConstraint(SpringLayout.EAST, passwordLabel, 0, SpringLayout.EAST, userNameLabel); - springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, Constants.TWENTY, SpringLayout.SOUTH, userNameLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, Constants.TWENTY, SpringLayout.SOUTH, + userNameLabel); // set passwordText location springLayout.putConstraint(SpringLayout.WEST, passwordText, Constants.TEN, SpringLayout.EAST, passwordLabel); - springLayout.putConstraint(SpringLayout.NORTH, passwordText, -Constants.FIVE, SpringLayout.NORTH, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordText, -Constants.FIVE, SpringLayout.NORTH, + passwordLabel); // set loginButton location springLayout.putConstraint(SpringLayout.WEST, loginButton, Constants.FIFTY, SpringLayout.WEST, passwordLabel); springLayout.putConstraint(SpringLayout.NORTH, loginButton, Constants.FORTY, @@ -149,10 +169,22 @@ public void displayLoginResult(String message) { } } + /** + * Renders the component by making it visible to the user. + * + *

This method sets the visibility of the component to {@code true}, + * ensuring it is displayed on the screen.

+ */ public void render() { setVisible(true); } + /** + * Hides the component by making it invisible to the user. + * + *

This method sets the visibility of the component to {@code false}, + * ensuring it is not displayed on the screen.

+ */ public void disrender() { setVisible(false); } @@ -161,8 +193,8 @@ public static void main(String[] args) throws IOException { try { new JsonApplication("PlayerFile", "PlayerFile", "RankingFile"); } - catch (IOException e) { - e.printStackTrace(); + catch (IOException event) { + event.printStackTrace(); } } } diff --git a/src/main/java/view/MainView.java b/src/main/java/view/MainView.java index 5c52d182e..854bb22ea 100644 --- a/src/main/java/view/MainView.java +++ b/src/main/java/view/MainView.java @@ -1,18 +1,21 @@ package view; -import app.GameMainApplication; +import java.awt.Color; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Font; +import java.io.IOException; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.SpringLayout; + import app.JsonApplication; -import app.RankingApplication; import app.RestartGameController; import interface_adapters.NavigationManagerJson; import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; -import interface_adapters.rankinglist.RankingInterface; -import interface_adapters.rankinglist.RankingController; - -import javax.swing.*; -import java.awt.*; -import java.io.IOException; -import java.util.List; /** * Main view. @@ -36,29 +39,12 @@ public MainView() { // Title final JLabel titleLabel = new JLabel("Main Menu"); - titleLabel.setFont(new Font("Arial", Font.BOLD, Constants.THIRTY)); + final String fontname = new String("Arial"); + titleLabel.setFont(new Font(fontname, Font.BOLD, Constants.THIRTY)); container.add(titleLabel); // Set button fonts - newGameButton.setFont(new Font("Arial", Font.BOLD, Constants.TWENTY)); - rankingButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - quitButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - logoutButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - - newGameButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FIFTY)); - rankingButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FIFTY)); - quitButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FORTY)); - logoutButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FIFTY)); - - newGameButton.setBackground(Constants.THEME_COLOR); - rankingButton.setBackground(Color.WHITE); - quitButton.setBackground(Color.WHITE); - logoutButton.setBackground(Color.WHITE); - - newGameButton.setForeground(Color.WHITE); - rankingButton.setForeground(Constants.THEME_COLOR); - quitButton.setForeground(Constants.THEME_COLOR); - logoutButton.setForeground(Constants.THEME_COLOR); + buttonSetting(fontname); // Add buttons to the container container.add(newGameButton); @@ -97,6 +83,37 @@ public MainView() { setLocation(Constants.FIVE_HUNDRED, Constants.THREE_HUNDRED); } + private void buttonSetting(String fontname) { + newGameButton.setFont(new Font(fontname, Font.BOLD, Constants.TWENTY)); + rankingButton.setFont(new Font(fontname, Font.PLAIN, Constants.TWENTY)); + quitButton.setFont(new Font(fontname, Font.PLAIN, Constants.TWENTY)); + logoutButton.setFont(new Font(fontname, Font.PLAIN, Constants.TWENTY)); + + newGameButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FIFTY)); + rankingButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FIFTY)); + quitButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FORTY)); + logoutButton.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.FIFTY)); + + newGameButton.setBackground(Constants.THEME_COLOR); + rankingButton.setBackground(Color.WHITE); + quitButton.setBackground(Color.WHITE); + logoutButton.setBackground(Color.WHITE); + + newGameButton.setForeground(Color.WHITE); + rankingButton.setForeground(Constants.THEME_COLOR); + quitButton.setForeground(Constants.THEME_COLOR); + logoutButton.setForeground(Constants.THEME_COLOR); + } + + /** + * Sets the {@code NevigateAllowcateController} for this instance. + * + *

This method associates a {@code NevigateAllowcateController} with the current + * instance of the {@code MainView} and logs the instance's identity hash code for + * debugging purposes.

+ * + * @param nevagateAllowcateController the {@code NevigateAllowcateController} to be set + */ public void setNevagateAllowcateController(NevagateAllowcateController nevagateAllowcateController) { System.out.println("MainView instance in setNevagateAllowcateController: " + System.identityHashCode(this)); this.nevagateAllowcateController = nevagateAllowcateController; @@ -109,42 +126,44 @@ public void setRestartGameController(RestartGameController restartGameController // Add ActionListener to buttons private void addListeners() { // Switch to GameView when "New Game" is clicked - newGameButton.addActionListener(e -> { + final String error = new String("Error"); + newGameButton.addActionListener(event -> { restartGameController.resetGame(); if (nevagateAllowcateController != null) { nevagateAllowcateController.execute(); } else { JOptionPane.showMessageDialog(this, "Navigation controller not initialized.", - "Error", JOptionPane.ERROR_MESSAGE); + error, JOptionPane.ERROR_MESSAGE); } }); // Switch to RankView when "Ranking" is clicked - rankingButton.addActionListener(e -> { + rankingButton.addActionListener(event -> { if (navigationManager != null) { navigationManager.showRankingView(); - } else { + } + else { JOptionPane.showMessageDialog(this, "Navigation Manager is not initialized. Cannot navigate to Ranking View.", - "Error", JOptionPane.ERROR_MESSAGE); + error, JOptionPane.ERROR_MESSAGE); } }); // Exit the game when "Quit" is clicked - quitButton.addActionListener(e -> { + quitButton.addActionListener(event -> { System.exit(0); }); // Switch to LoginView when "Logout" is clicked - logoutButton.addActionListener(e -> { + logoutButton.addActionListener(event -> { if (navigationManager != null) { navigationManager.showLoginView(); } else { JOptionPane.showMessageDialog(this, "Error navigating to LoginView.", - "Error", JOptionPane.ERROR_MESSAGE); + error, JOptionPane.ERROR_MESSAGE); } }); } @@ -159,10 +178,22 @@ public void setNavigationManager(NavigationManagerJson navigationManager) { } // Add render method + /** + * Renders the component by making it visible to the user. + * + *

This method sets the visibility of the component to {@code true}, + * ensuring it is displayed on the screen.

+ */ public void render() { setVisible(true); } + /** + * Hides the component by making it invisible to the user. + * + *

This method sets the visibility of the component to {@code false}, + * ensuring it is not displayed on the screen.

+ */ public void disrender() { setVisible(false); } @@ -171,8 +202,8 @@ public static void main(String[] args) { try { new JsonApplication("PlayerFile", "PlayerFile", "RankingFile"); } - catch (IOException e) { - e.printStackTrace(); + catch (IOException event) { + event.printStackTrace(); } } } diff --git a/src/main/java/view/RankingView.java b/src/main/java/view/RankingView.java index dd56ffc70..518df0efe 100644 --- a/src/main/java/view/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -1,16 +1,25 @@ package view; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Container; +import java.awt.Font; +import java.io.IOException; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; + import app.JsonApplication; import interface_adapters.NavigationManagerJson; import interface_adapters.rankinglist.RankingController; import interface_adapters.rankinglist.RankingInterface; -import javax.swing.*; -import javax.swing.table.DefaultTableModel; -import java.awt.*; -import java.io.IOException; -import java.util.List; - /** * Ranking view class that implements RankingInterface to display the leaderboard. */ @@ -32,10 +41,11 @@ public RankingView() { // Main container layout final Container container = getContentPane(); container.setLayout(new BorderLayout()); + final String fontname = new String("Arial"); // Title final JLabel titleLabel = new JLabel("Ranking List", JLabel.CENTER); - titleLabel.setFont(new Font("Arial", Font.BOLD, Constants.THIRTY)); + titleLabel.setFont(new Font(fontname, Font.BOLD, Constants.THIRTY)); container.add(titleLabel, BorderLayout.NORTH); // Table to display rankings @@ -44,8 +54,8 @@ public RankingView() { rankingTable = new JTable(tableModel); // Make table non-editable rankingTable.setEnabled(false); - rankingTable.setFont(new Font("Arial", Font.PLAIN, Constants.FIFTEEN)); - rankingTable.getTableHeader().setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); + rankingTable.setFont(new Font(fontname, Font.PLAIN, Constants.FIFTEEN)); + rankingTable.getTableHeader().setFont(new Font(fontname, Font.BOLD, Constants.FIFTEEN)); rankingTable.setRowHeight(Constants.TWENTYFIVE); container.add(new JScrollPane(rankingTable), BorderLayout.CENTER); @@ -53,11 +63,11 @@ public RankingView() { backButton = new JButton("Back to Main Memu"); backButton.setBackground(Color.WHITE); backButton.setForeground(Constants.THEME_COLOR); - backButton.setFont(new Font("Arial", Font.BOLD, Constants.TWENTY)); + backButton.setFont(new Font(fontname, Font.BOLD, Constants.TWENTY)); container.add(backButton, BorderLayout.SOUTH); // Add ActionListener to navigate back to the main menu - backButton.addActionListener(e -> { + backButton.addActionListener(event -> { if (navigationManager != null) { navigationManager.showMainView(); } @@ -145,16 +155,23 @@ public void render() { } } + /** + * Hides the component by making it invisible to the user. + * + *

This method sets the visibility of the component to {@code false}, + * ensuring it is not displayed on the screen.

+ */ public void disrender() { setVisible(false); } + public static void main(String[] args) { try { new JsonApplication("PlayerFile", "PlayerFile", "RankingFile"); } - catch (IOException e) { - e.printStackTrace(); + catch (IOException event) { + event.printStackTrace(); } } } diff --git a/src/main/java/view/SignUpView.java b/src/main/java/view/SignUpView.java index 1cbde1cf4..45cef7a8b 100644 --- a/src/main/java/view/SignUpView.java +++ b/src/main/java/view/SignUpView.java @@ -1,14 +1,27 @@ package view; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Font; +import java.io.IOException; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; +import javax.swing.Spring; +import javax.swing.SpringLayout; + import app.JsonApplication; import interface_adapters.NavigationManagerJson; import interface_adapters.signup.SignupController; import interface_adapters.signup.SignupInterface; -import javax.swing.*; -import java.awt.*; -import java.io.IOException; - /** * SignUpView handles the UI for user registration and integrates with the SignupApplication. */ @@ -37,16 +50,9 @@ public SignUpView() throws IOException { super("Sign Up"); final Container contentPane = getContentPane(); - nameLabel.setFont(new Font("Impact", Font.BOLD, Constants.FIFTY)); - userNameLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); - passwordLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); - againLabel.setFont(new Font("Arial", Font.BOLD, Constants.FIFTEEN)); - registerButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - registerButton.setBackground(Color.WHITE); - registerButton.setForeground(Constants.THEME_COLOR); - loginButton.setFont(new Font("Arial", Font.PLAIN, Constants.TWENTY)); - loginButton.setBackground(Constants.THEME_COLOR); - loginButton.setForeground(Color.WHITE); + final String fontname = new String("Arial"); + final String error = new String("error"); + setFont(fontname); userText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); passwordText.setPreferredSize(new Dimension(Constants.TWO_HUNDRED, Constants.THIRTY)); @@ -67,15 +73,15 @@ public SignUpView() throws IOException { // set userNameLabel location extracted(offsetX); - registerButton.addActionListener(e -> handleSignup()); + registerButton.addActionListener(event -> handleSignup()); - loginButton.addActionListener(e -> { + loginButton.addActionListener(event -> { try { navigationManager.showLoginView(); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Error navigating to LoginView.", - "Error", JOptionPane.ERROR_MESSAGE); + error, JOptionPane.ERROR_MESSAGE); ex.printStackTrace(); } }); @@ -87,6 +93,19 @@ public SignUpView() throws IOException { setLocation(Constants.FIVE_HUNDRED, Constants.THREE_HUNDRED); } + private void setFont(String fontname) { + nameLabel.setFont(new Font("Impact", Font.BOLD, Constants.FIFTY)); + userNameLabel.setFont(new Font(fontname, Font.BOLD, Constants.FIFTEEN)); + passwordLabel.setFont(new Font(fontname, Font.BOLD, Constants.FIFTEEN)); + againLabel.setFont(new Font(fontname, Font.BOLD, Constants.FIFTEEN)); + registerButton.setFont(new Font(fontname, Font.PLAIN, Constants.TWENTY)); + registerButton.setBackground(Color.WHITE); + registerButton.setForeground(Constants.THEME_COLOR); + loginButton.setFont(new Font(fontname, Font.PLAIN, Constants.TWENTY)); + loginButton.setBackground(Constants.THEME_COLOR); + loginButton.setForeground(Color.WHITE); + } + private void extracted() { centerPanel.add(userNameLabel); centerPanel.add(userText); @@ -107,17 +126,20 @@ private void extracted(int offsetX) { springLayout.putConstraint(SpringLayout.NORTH, userText, -Constants.FIVE, SpringLayout.NORTH, userNameLabel); // set passwordLabel location springLayout.putConstraint(SpringLayout.EAST, passwordLabel, 0, SpringLayout.EAST, userNameLabel); - springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, Constants.TWENTY, SpringLayout.SOUTH, userNameLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordLabel, Constants.TWENTY, SpringLayout.SOUTH, + userNameLabel); // set passwordText location springLayout.putConstraint(SpringLayout.WEST, passwordText, Constants.TEN, SpringLayout.EAST, passwordLabel); - springLayout.putConstraint(SpringLayout.NORTH, passwordText, -Constants.FIVE, SpringLayout.NORTH, passwordLabel); + springLayout.putConstraint(SpringLayout.NORTH, passwordText, -Constants.FIVE, SpringLayout.NORTH, + passwordLabel); // set loginButton location springLayout.putConstraint(SpringLayout.WEST, loginButton, Constants.TEN, SpringLayout.WEST, passwordLabel); springLayout.putConstraint(SpringLayout.NORTH, loginButton, Constants.EIGHTY, SpringLayout.SOUTH, passwordLabel); // set registerButton location springLayout.putConstraint(SpringLayout.WEST, registerButton, Constants.FORTY, SpringLayout.EAST, loginButton); - springLayout.putConstraint(SpringLayout.NORTH, registerButton, -Constants.FIVE, SpringLayout.NORTH, loginButton); + springLayout.putConstraint(SpringLayout.NORTH, registerButton, -Constants.FIVE, SpringLayout.NORTH, + loginButton); // set againLabel location springLayout.putConstraint(SpringLayout.EAST, againLabel, 0, SpringLayout.EAST, passwordLabel); springLayout.putConstraint(SpringLayout.NORTH, againLabel, Constants.TWENTY, SpringLayout.SOUTH, passwordLabel); @@ -187,10 +209,22 @@ public void displaySignupResult(String message) { } // Add render method + /** + * Renders the component by making it visible to the user. + * + *

This method sets the visibility of the component to {@code true}, + * ensuring it is displayed on the screen.

+ */ public void render() { setVisible(true); } + /** + * Hides the component by making it invisible to the user. + * + *

This method sets the visibility of the component to {@code false}, + * ensuring it is not displayed on the screen.

+ */ public void disrender() { setVisible(false); } @@ -199,8 +233,8 @@ public static void main(String[] args) { try { new JsonApplication("PlayerFile", "PlayerFile", "RankingFile"); } - catch (IOException e) { - e.printStackTrace(); + catch (IOException event) { + event.printStackTrace(); } } } From 8afe59d85dd16b95d63595b4e71248523c8125c3 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 16:10:04 -0500 Subject: [PATCH 143/154] fix bug for chatgptservice --- src/main/java/app/GameMainApplication.java | 10 +++++----- src/main/java/app/JsonApplication.java | 10 +++++----- .../java/usecases/chatgpt/ChatGptService.java | 17 +++++++++++------ 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index 5221d9d68..e3397c380 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -216,33 +216,33 @@ public static void main(String[] args) { // Event Respond usecase ambush final AmbushResponsePresenter ambushresponsePresenter = new AmbushResponsePresenter(eventView); final AmbushEventInteractor ambushEventInteractor = - new AmbushEventInteractor(gamedatabase, ambushresponsePresenter, chatGptService, responseParser); + new AmbushEventInteractor(gamedatabase, ambushresponsePresenter, chatGptService); final AmbushResponseController ambushResponseController = new AmbushResponseController(ambushEventInteractor); // Event Respond usecase blizzard final BlizzardResponsePresenter blizzardResponsePresenter = new BlizzardResponsePresenter(eventView); final BlizzardEventInteractor blizzardEventInteractor = - new BlizzardEventInteractor(gamedatabase, blizzardResponsePresenter, chatGptService, responseParser); + new BlizzardEventInteractor(gamedatabase, blizzardResponsePresenter, chatGptService); final BlizzardResponseController blizzardResponseController = new BlizzardResponseController(blizzardEventInteractor); // Event Respond usecase flood final FloodResponsePresenter floodResponsePresenter = new FloodResponsePresenter(eventView); final FloodEventInteractor floodEventInteractor = - new FloodEventInteractor(gamedatabase, floodResponsePresenter, chatGptService, responseParser); + new FloodEventInteractor(gamedatabase, floodResponsePresenter, chatGptService); final FloodResponseController floodResponseController = new FloodResponseController(floodEventInteractor); // Event Respond usecase survivor final SurvivorResponsePresenter survivorResponsePresenter = new SurvivorResponsePresenter(eventView); final SurvivorEventInteractor survivorEventInteractor = - new SurvivorEventInteractor(gamedatabase, survivorResponsePresenter, chatGptService, responseParser); + new SurvivorEventInteractor(gamedatabase, survivorResponsePresenter, chatGptService); final SurvivorResponseController survivorResponseController = new SurvivorResponseController(survivorEventInteractor); // Event Respond usecase trader final TraderResponsePresenter traderResponsePresenter = new TraderResponsePresenter(eventView); final TraderEventInteractor traderEventInteractor = - new TraderEventInteractor(gamedatabase, traderResponsePresenter, chatGptService, responseParser); + new TraderEventInteractor(gamedatabase, traderResponsePresenter, chatGptService); final TraderResponseController traderResponseController = new TraderResponseController(traderEventInteractor); // Initialize Event manager diff --git a/src/main/java/app/JsonApplication.java b/src/main/java/app/JsonApplication.java index 0e2f23b1b..ea634b30d 100644 --- a/src/main/java/app/JsonApplication.java +++ b/src/main/java/app/JsonApplication.java @@ -262,33 +262,33 @@ private void gameApplication(MainView mainView, NavigationManagerJson navigation // Event Respond usecase ambush final AmbushResponsePresenter ambushresponsePresenter = new AmbushResponsePresenter(eventView); final AmbushEventInteractor ambushEventInteractor = - new AmbushEventInteractor(gamedatabase, ambushresponsePresenter, chatGptService, responseParser); + new AmbushEventInteractor(gamedatabase, ambushresponsePresenter, chatGptService); final AmbushResponseController ambushResponseController = new AmbushResponseController(ambushEventInteractor); // Event Respond usecase blizzard final BlizzardResponsePresenter blizzardResponsePresenter = new BlizzardResponsePresenter(eventView); final BlizzardEventInteractor blizzardEventInteractor = - new BlizzardEventInteractor(gamedatabase, blizzardResponsePresenter, chatGptService, responseParser); + new BlizzardEventInteractor(gamedatabase, blizzardResponsePresenter, chatGptService); final BlizzardResponseController blizzardResponseController = new BlizzardResponseController(blizzardEventInteractor); // Event Respond usecase flood final FloodResponsePresenter floodResponsePresenter = new FloodResponsePresenter(eventView); final FloodEventInteractor floodEventInteractor = - new FloodEventInteractor(gamedatabase, floodResponsePresenter, chatGptService, responseParser); + new FloodEventInteractor(gamedatabase, floodResponsePresenter, chatGptService); final FloodResponseController floodResponseController = new FloodResponseController(floodEventInteractor); // Event Respond usecase survivor final SurvivorResponsePresenter survivorResponsePresenter = new SurvivorResponsePresenter(eventView); final SurvivorEventInteractor survivorEventInteractor = - new SurvivorEventInteractor(gamedatabase, survivorResponsePresenter, chatGptService, responseParser); + new SurvivorEventInteractor(gamedatabase, survivorResponsePresenter, chatGptService); final SurvivorResponseController survivorResponseController = new SurvivorResponseController(survivorEventInteractor); // Event Respond usecase trader final TraderResponsePresenter traderResponsePresenter = new TraderResponsePresenter(eventView); final TraderEventInteractor traderEventInteractor = - new TraderEventInteractor(gamedatabase, traderResponsePresenter, chatGptService, responseParser); + new TraderEventInteractor(gamedatabase, traderResponsePresenter, chatGptService); final TraderResponseController traderResponseController = new TraderResponseController(traderEventInteractor); // Initialize Event manager diff --git a/src/main/java/usecases/chatgpt/ChatGptService.java b/src/main/java/usecases/chatgpt/ChatGptService.java index cc288166e..fe764a285 100644 --- a/src/main/java/usecases/chatgpt/ChatGptService.java +++ b/src/main/java/usecases/chatgpt/ChatGptService.java @@ -11,7 +11,7 @@ * Service to integrate ChatGPT API. */ public class ChatGptService { - private static final String API_URL = "https://api.openai.com/v1/completions"; + private static final String API_URL = "https://api.openai.com/v1/chat/completions"; /** * Sends a request to ChatGPT with the event description, player attributes, and player choice. @@ -31,17 +31,19 @@ public String getResponse(String eventDescription, Map playerAt connection.setDoOutput(true); // Build the prompt for ChatGPT - String prompt = generatePrompt(eventDescription, playerAttributes, playerChoice); - - // Construct the request payload ObjectMapper objectMapper = new ObjectMapper(); String requestBody = objectMapper.writeValueAsString(Map.of( - "model", "gpt-3.5-turbo", - "prompt", prompt, + "model", "gpt-4", + "messages", new Object[]{ + Map.of("role", "system", "content", "You are an AI that helps resolve events in a survival game."), + Map.of("role", "user", "content", generatePrompt(eventDescription, playerAttributes, playerChoice)) + }, "max_tokens", 150, "temperature", 0.7 )); + System.out.println("Request Body: " + requestBody); + // Send the request try (OutputStream os = connection.getOutputStream()) { os.write(requestBody.getBytes()); @@ -52,6 +54,9 @@ public String getResponse(String eventDescription, Map playerAt if (connection.getResponseCode() == 200) { return new String(connection.getInputStream().readAllBytes()); } else { + // Log the error response + String errorResponse = new String(connection.getErrorStream().readAllBytes()); + System.err.println("ChatGPT API Error: HTTP " + connection.getResponseCode() + " - " + errorResponse); throw new RuntimeException("Failed to call ChatGPT API: HTTP " + connection.getResponseCode()); } } From 609b4183dd9b9ba53b964a5678b3a5fe12ef88a1 Mon Sep 17 00:00:00 2001 From: yitong an Date: Tue, 3 Dec 2024 19:20:02 -0500 Subject: [PATCH 144/154] Game view debug --- src/main/java/view/GameView.java | 34 ++++++++++++++--------------- src/main/java/view/RankingView.java | 1 - 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 84cf06c9d..920f8613f 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -313,18 +313,18 @@ public void setController(FetchController inifetchController, BroadcastControlle MinimapController iniminimapController, LoseController iniloseController, HordeController inihordeController, NevagateGameOverController ininevagateGameOverController) { - this.fetchController = fetchController; - this.broadcastController = broadcastController; - this.placeDescriptionController = placeDescriptionController; - this.dailyGatherController = dailyGatherController; - this.dailyMoveController = dailyMoveController; - this.nevagateEventController = nevagateEventController; - this.eventDecideController = eventDecideController; - this.newdayController = newdayController; - this.minimapController = minimapController; - this.loseController = loseController; - this.hordeController = hordeController; - this.nevagateGameOverController = nevagateGameOverController; + this.fetchController = inifetchController; + this.broadcastController = inibroadcastController; + this.placeDescriptionController = iniplaceDescriptionController; + this.dailyGatherController = inidailyGatherController; + this.dailyMoveController = inidailyMoveController; + this.nevagateEventController = ininevagateEventController; + this.eventDecideController = inieventDecideController; + this.newdayController = ininewdayController; + this.minimapController = iniminimapController; + this.loseController = iniloseController; + this.hordeController = inihordeController; + this.nevagateGameOverController = ininevagateGameOverController; } /** @@ -555,11 +555,11 @@ public void updateUiResource(int inifood, int iniwater, int inipeople, int iniwe int iniactionpoint) { loseController.execute(); // check if player lose on update. - setFood(food); - setWater(water); - setPeople(people); - setWeapon(weapon); - setDay(day); + setFood(inifood); + setWater(iniwater); + setPeople(inipeople); + setWeapon(iniweapon); + setDay(iniday); setAction(iniactionpoint); } diff --git a/src/main/java/view/RankingView.java b/src/main/java/view/RankingView.java index 518df0efe..250d7b504 100644 --- a/src/main/java/view/RankingView.java +++ b/src/main/java/view/RankingView.java @@ -165,7 +165,6 @@ public void disrender() { setVisible(false); } - public static void main(String[] args) { try { new JsonApplication("PlayerFile", "PlayerFile", "RankingFile"); From a9d34fec2b5022686c825f13a1dbd5f95cf21a21 Mon Sep 17 00:00:00 2001 From: yitong an Date: Tue, 3 Dec 2024 21:05:04 -0500 Subject: [PATCH 145/154] restructure HordeInteractor --- .../endprocesshorde/HordeInteractor.java | 42 ++++++++++++------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/main/java/usecases/endprocesshorde/HordeInteractor.java b/src/main/java/usecases/endprocesshorde/HordeInteractor.java index fccba7b75..6a6760f68 100644 --- a/src/main/java/usecases/endprocesshorde/HordeInteractor.java +++ b/src/main/java/usecases/endprocesshorde/HordeInteractor.java @@ -1,52 +1,64 @@ package usecases.endprocesshorde; import entities.EntityConstants; +import entities.Inventory; +import entities.PlayerAttributes; /** * Interactor of horde processing, main logic happening. */ public class HordeInteractor implements HordeInputBoundary { - private HordeDataAccessInterface dataaccess; - private HordeOutputBoundary outputboundary; + private HordeDataAccessInterface dataAccess; + private HordeOutputBoundary outputBoundary; public HordeInteractor(HordeDataAccessInterface dataaccess, HordeOutputBoundary outputboundary) { - this.dataaccess = dataaccess; - this.outputboundary = outputboundary; + this.dataAccess = dataaccess; + this.outputBoundary = outputboundary; } @Override public void execute(HordeInputData inputData) { String message = ""; - final int people = dataaccess.getInventory().getPeople(); - final int weapon = dataaccess.getInventory().getWeapon(); - final int generalship = dataaccess.getPlayerAttributes().getGeneralship(); + final Inventory peopleInventory = dataAccess.getInventory(); + final int people = peopleInventory.getPeople(); + final Inventory weaponInventory = dataAccess.getInventory(); + final int weapon = weaponInventory.getWeapon(); + final PlayerAttributes playerAttributes = dataAccess.getPlayerAttributes(); + final int generalship = playerAttributes.getGeneralship(); + final int armed = Math.min(weapon, people); final double generalshipBonus = 1 + (generalship * 0.05); final double firepower = armed * EntityConstants.ARMEDPEOPLEPOWER * generalshipBonus; - final double resourcerequired = dataaccess.getHorde().getDuration() * dataaccess.getInventory().getPeople() - * (1 - EntityConstants.THRIFTIMPACTRESOURCELOSS * dataaccess.getPlayerAttributes().getThrift()); + final double duration = dataAccess.getHorde().getDuration(); + final double peopleAmmount = dataAccess.getInventory().getPeople(); + final double thrift = dataAccess.getPlayerAttributes().getThrift(); + final double resourcerequired = duration * peopleAmmount + * (1 - EntityConstants.THRIFTIMPACTRESOURCELOSS * thrift); + final int hordeMagnitude = dataAccess.getHorde().getMagnitude(); + final int food = dataAccess.getInventory().getFood(); + final int water = dataAccess.getInventory().getWater(); - if (firepower < dataaccess.getHorde().getMagnitude()) { + if (firepower < hordeMagnitude) { message = "Your groups firepower wasnt enough to stop the horde. Despite your best efforts, the" + "overwhelming number of zombies overran your defenses."; } - else if (dataaccess.getInventory().getFood() < resourcerequired) { + else if (food < resourcerequired) { message = "Your group ran out of food while holding off the horde. Starvation weakened your " + "survivors, and the zombies overwhelmed them."; } - else if (dataaccess.getInventory().getWater() < resourcerequired) { + else if (water < resourcerequired) { message = "Your group ran out of water during the prolonged defense. Dehydration sapped their strength, " + "leaving them defenseless against the horde."; } else { - dataaccess.setWon(true); + dataAccess.setWon(true); message = "Your group successfully defended against the horde! With well-armed fighters, " + "strong leadership, and ample supplies, you emerged victorious and kept the group safe."; } - final int score = dataaccess.getPlayerInfo().getScore(); + final int score = dataAccess.getPlayerInfo().getScore(); final HordeOutputData outputdata = new HordeOutputData(score, message); - outputboundary.prepareSuccessView(outputdata); + outputBoundary.prepareSuccessView(outputdata); } } From cb9334de9782e96bb0c026510396c60a19a5b306 Mon Sep 17 00:00:00 2001 From: yitong an Date: Tue, 3 Dec 2024 21:08:33 -0500 Subject: [PATCH 146/154] change HordeOutputData --- .../endprocesshorde/HordeOutputData.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/usecases/endprocesshorde/HordeOutputData.java b/src/main/java/usecases/endprocesshorde/HordeOutputData.java index 46f436a90..f7fbd7126 100644 --- a/src/main/java/usecases/endprocesshorde/HordeOutputData.java +++ b/src/main/java/usecases/endprocesshorde/HordeOutputData.java @@ -4,19 +4,21 @@ * Output data, consist of final outcome description, player's score. */ public class HordeOutputData { - private int score; - private String description; + private int points; + private String introduction; - public HordeOutputData(int score, String description) { - this.score = score; - this.description = description; + public HordeOutputData(int Score, String Description) { + this.points = Score; + this.introduction = Description; } public int getScore() { - return score; + + return points; } public String getDescription() { - return description; + + return introduction; } } From 4080c36dff91b501a62f7f180770229b36771eb4 Mon Sep 17 00:00:00 2001 From: yitong an Date: Tue, 3 Dec 2024 21:16:39 -0500 Subject: [PATCH 147/154] change HordeOutputData method --- .../interface_adapters/endprocesshorde/HordePresenter.java | 2 +- src/main/java/usecases/endprocesshorde/HordeOutputData.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java b/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java index 3c6e0c40c..f0f684425 100644 --- a/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java +++ b/src/main/java/interface_adapters/endprocesshorde/HordePresenter.java @@ -21,7 +21,7 @@ public HordePresenter(HordeInterface newview, NavigationManager navigationManage @Override public void prepareSuccessView(HordeOutputData outputData) { view.NavigateHordeGameOver(navigationManager); - newview.updateUiHorde(outputData.getDescription(), outputData.getScore()); + newview.updateUiHorde(outputData.getIntroduction(), outputData.getPoints()); } @Override diff --git a/src/main/java/usecases/endprocesshorde/HordeOutputData.java b/src/main/java/usecases/endprocesshorde/HordeOutputData.java index f7fbd7126..99f0dbeea 100644 --- a/src/main/java/usecases/endprocesshorde/HordeOutputData.java +++ b/src/main/java/usecases/endprocesshorde/HordeOutputData.java @@ -12,12 +12,12 @@ public HordeOutputData(int Score, String Description) { this.introduction = Description; } - public int getScore() { + public int getPoints() { return points; } - public String getDescription() { + public String getIntroduction() { return introduction; } From c835431df57f25ae3418aa8521ec3d9c5b493f02 Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Tue, 3 Dec 2024 21:37:22 -0500 Subject: [PATCH 148/154] fixing error --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a9d13ee60..93156e076 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ 2. Import the project into your IDE and configure the JDK. 3. Install dependencies via your IDE's package manager. 4. Run the main application: - src/app/GameMainApplication.java + src/app/JsonApplication.java ## **Usage Guide** 1. Login or Register: - Use the login interface to sign in or create a new account. From b758d77ae4f32d95916b1b41a5d0cb3af874c630 Mon Sep 17 00:00:00 2001 From: yitong an Date: Tue, 3 Dec 2024 21:39:20 -0500 Subject: [PATCH 149/154] change Navigate main structure --- src/main/java/app/GameMainApplication.java | 6 +++--- src/main/java/app/JsonApplication.java | 6 +++--- .../database/InMemoryUnifiedDataAccess.java | 4 ++-- .../NevagateMainController.java | 11 +++++----- .../NevagateMainPresenter.java | 2 +- .../NavigateMainDataAccessInterface.java | 7 +++++++ .../NavigateMainInputBoundary.java | 8 ++++++++ .../navigateMain/NavigateMainInputData.java | 9 +++++++++ .../navigateMain/NavigateMainInteractor.java | 20 +++++++++++++++++++ .../navigateMain/NavigateMainOutputdata.java | 7 +++++++ .../NevagateMainOutputBoundary.java | 2 +- .../NevagateMainDataAccessInterface.java | 7 ------- .../NevagateMainInputBoundary.java | 8 -------- .../nevagateMain/NevagateMainInputdata.java | 7 ------- .../nevagateMain/NevagateMainInteractor.java | 20 ------------------- .../nevagateMain/NevagateMainOutputdata.java | 7 ------- 16 files changed, 67 insertions(+), 64 deletions(-) create mode 100644 src/main/java/usecases/navigateMain/NavigateMainDataAccessInterface.java create mode 100644 src/main/java/usecases/navigateMain/NavigateMainInputBoundary.java create mode 100644 src/main/java/usecases/navigateMain/NavigateMainInputData.java create mode 100644 src/main/java/usecases/navigateMain/NavigateMainInteractor.java create mode 100644 src/main/java/usecases/navigateMain/NavigateMainOutputdata.java rename src/main/java/usecases/{nevagateMain => navigateMain}/NevagateMainOutputBoundary.java (83%) delete mode 100644 src/main/java/usecases/nevagateMain/NevagateMainDataAccessInterface.java delete mode 100644 src/main/java/usecases/nevagateMain/NevagateMainInputBoundary.java delete mode 100644 src/main/java/usecases/nevagateMain/NevagateMainInputdata.java delete mode 100644 src/main/java/usecases/nevagateMain/NevagateMainInteractor.java delete mode 100644 src/main/java/usecases/nevagateMain/NevagateMainOutputdata.java diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java index e3397c380..ab8be7890 100644 --- a/src/main/java/app/GameMainApplication.java +++ b/src/main/java/app/GameMainApplication.java @@ -76,7 +76,7 @@ import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; import usecases.nevagateGame.NevagateGameInteractor; import usecases.nevagateGameover.NevagateGameOverInteractor; -import usecases.nevagateMain.NevagateMainInteractor; +import usecases.navigateMain.NavigateMainInteractor; import usecases.startallowcate.AllowcateInteractor; import frameworks.database.JsonRankingDataAccess; import usecases.chatgpt.ChatGptService; @@ -166,8 +166,8 @@ public static void main(String[] args) { final AllowcateController allowcateController = new AllowcateController(allowcateInteractor); // Nevagate Main usecase. final NevagateMainPresenter nevagateMainPresenter = new NevagateMainPresenter(navigationManager); - final NevagateMainInteractor nevagateMainInteractor = - new NevagateMainInteractor(gamedatabase, nevagateMainPresenter); + final NavigateMainInteractor nevagateMainInteractor = + new NavigateMainInteractor(gamedatabase, nevagateMainPresenter); final NevagateMainController nevagateMainController = new NevagateMainController(nevagateMainInteractor); // Fetch Usecase final FetchPresenter fetchPresenter = new FetchPresenter(gameView); diff --git a/src/main/java/app/JsonApplication.java b/src/main/java/app/JsonApplication.java index ea634b30d..20793d42e 100644 --- a/src/main/java/app/JsonApplication.java +++ b/src/main/java/app/JsonApplication.java @@ -91,7 +91,7 @@ import usecases.nevagateEventPage.NevagateEventInteractor; import usecases.nevagateGame.NevagateGameInteractor; import usecases.nevagateGameover.NevagateGameOverInteractor; -import usecases.nevagateMain.NevagateMainInteractor; +import usecases.navigateMain.NavigateMainInteractor; import usecases.startallowcate.AllowcateInteractor; import view.*; @@ -212,8 +212,8 @@ private void gameApplication(MainView mainView, NavigationManagerJson navigation final AllowcateController allowcateController = new AllowcateController(allowcateInteractor); // Nevagate Main usecase. final NevagateMainPresenter nevagateMainPresenter = new NevagateMainPresenter(navigationManager); - final NevagateMainInteractor nevagateMainInteractor = - new NevagateMainInteractor(gamedatabase, nevagateMainPresenter); + final NavigateMainInteractor nevagateMainInteractor = + new NavigateMainInteractor(gamedatabase, nevagateMainPresenter); final NevagateMainController nevagateMainController = new NevagateMainController(nevagateMainInteractor); // Fetch Usecase final FetchPresenter fetchPresenter = new FetchPresenter(gameView); diff --git a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java index 4660b6994..f14bb6731 100644 --- a/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java +++ b/src/main/java/frameworks/database/InMemoryUnifiedDataAccess.java @@ -26,7 +26,7 @@ import usecases.nevagateAllowcatePage.NevagateAllowcateDataAccessInterface; import usecases.nevagateGame.NevagateGameDataAccessInterface; import usecases.nevagateGameover.NevagateGameOverDataAccessInterface; -import usecases.nevagateMain.NevagateMainDataAccessInterface; +import usecases.navigateMain.NavigateMainDataAccessInterface; import usecases.startallowcate.AllowcateDataAccessInterface; /** @@ -50,7 +50,7 @@ public class InMemoryUnifiedDataAccess implements TraderDataAccessInterface, BlizzardDataAccessInterface, AmbushDataAccessInterface, - NevagateMainDataAccessInterface, + NavigateMainDataAccessInterface, NevagateEventDataAccessInterface, CurrentEventDataAccessInterface, NevagateGameDataAccessInterface, diff --git a/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java b/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java index ed7743982..1e01be8eb 100644 --- a/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java +++ b/src/main/java/interface_adapters/nevagatemainview/NevagateMainController.java @@ -1,20 +1,21 @@ package interface_adapters.nevagatemainview; -import usecases.nevagateMain.NevagateMainInputBoundary; -import usecases.nevagateMain.NevagateMainInputdata; +import usecases.navigateMain.NavigateMainInputBoundary; +import usecases.navigateMain.NavigateMainInputData; +import usecases.navigateMain.NavigateMainInputData; /** * Controller for navigating to new page. */ public class NevagateMainController { - private final NevagateMainInputBoundary interacter; + private final NavigateMainInputBoundary interacter; - public NevagateMainController(NevagateMainInputBoundary interacter) { + public NevagateMainController(NavigateMainInputBoundary interacter) { this.interacter = interacter; } public void execute() { - final NevagateMainInputdata inputdata = new NevagateMainInputdata(); + final NavigateMainInputData inputdata = new NavigateMainInputData(); interacter.execute(inputdata); } } diff --git a/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java b/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java index 3b225009e..fb8f133bb 100644 --- a/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java +++ b/src/main/java/interface_adapters/nevagatemainview/NevagateMainPresenter.java @@ -1,7 +1,7 @@ package interface_adapters.nevagatemainview; import interface_adapters.NavigationManager; -import usecases.nevagateMain.NevagateMainOutputBoundary; +import usecases.navigateMain.NevagateMainOutputBoundary; public class NevagateMainPresenter implements NevagateMainOutputBoundary { private NavigationManager navigationManager; diff --git a/src/main/java/usecases/navigateMain/NavigateMainDataAccessInterface.java b/src/main/java/usecases/navigateMain/NavigateMainDataAccessInterface.java new file mode 100644 index 000000000..aa027eecf --- /dev/null +++ b/src/main/java/usecases/navigateMain/NavigateMainDataAccessInterface.java @@ -0,0 +1,7 @@ +package usecases.navigateMain; + +/** + * Data access, need decided events. + */ +public interface NavigateMainDataAccessInterface { +} diff --git a/src/main/java/usecases/navigateMain/NavigateMainInputBoundary.java b/src/main/java/usecases/navigateMain/NavigateMainInputBoundary.java new file mode 100644 index 000000000..ca3cd09f4 --- /dev/null +++ b/src/main/java/usecases/navigateMain/NavigateMainInputBoundary.java @@ -0,0 +1,8 @@ +package usecases.navigateMain; + +/** + * Execute method. + */ +public interface NavigateMainInputBoundary { + public void execute(NavigateMainInputData inputdata); +} diff --git a/src/main/java/usecases/navigateMain/NavigateMainInputData.java b/src/main/java/usecases/navigateMain/NavigateMainInputData.java new file mode 100644 index 000000000..5f2675bcf --- /dev/null +++ b/src/main/java/usecases/navigateMain/NavigateMainInputData.java @@ -0,0 +1,9 @@ +package usecases.navigateMain; + +/** + * Not needed, no restriction to go back. + */ +// public class NavigateMainInputdata { +// } +public class NavigateMainInputData { +} \ No newline at end of file diff --git a/src/main/java/usecases/navigateMain/NavigateMainInteractor.java b/src/main/java/usecases/navigateMain/NavigateMainInteractor.java new file mode 100644 index 000000000..d2f13c5d0 --- /dev/null +++ b/src/main/java/usecases/navigateMain/NavigateMainInteractor.java @@ -0,0 +1,20 @@ +package usecases.navigateMain; + +/** + * Nevagate interactor. + */ +public class NavigateMainInteractor implements NavigateMainInputBoundary { + private final NavigateMainDataAccessInterface dataAccess; + private final NevagateMainOutputBoundary outputBoundary; + + public NavigateMainInteractor(NavigateMainDataAccessInterface dataaccess, + NevagateMainOutputBoundary outputboundary) { + this.dataAccess = dataaccess; + this.outputBoundary = outputboundary; + } + + @Override + public void execute(NavigateMainInputData inputdata) { + outputBoundary.prepareMainView(); + } +} diff --git a/src/main/java/usecases/navigateMain/NavigateMainOutputdata.java b/src/main/java/usecases/navigateMain/NavigateMainOutputdata.java new file mode 100644 index 000000000..e2959f53c --- /dev/null +++ b/src/main/java/usecases/navigateMain/NavigateMainOutputdata.java @@ -0,0 +1,7 @@ +package usecases.navigateMain; + +/** + * No output data is needed to go back. + */ +public class NavigateMainOutputdata { +} diff --git a/src/main/java/usecases/nevagateMain/NevagateMainOutputBoundary.java b/src/main/java/usecases/navigateMain/NevagateMainOutputBoundary.java similarity index 83% rename from src/main/java/usecases/nevagateMain/NevagateMainOutputBoundary.java rename to src/main/java/usecases/navigateMain/NevagateMainOutputBoundary.java index 5c74dfa46..765455b55 100644 --- a/src/main/java/usecases/nevagateMain/NevagateMainOutputBoundary.java +++ b/src/main/java/usecases/navigateMain/NevagateMainOutputBoundary.java @@ -1,4 +1,4 @@ -package usecases.nevagateMain; +package usecases.navigateMain; /** * OutputBOundary, should be able to have method go back to main page. diff --git a/src/main/java/usecases/nevagateMain/NevagateMainDataAccessInterface.java b/src/main/java/usecases/nevagateMain/NevagateMainDataAccessInterface.java deleted file mode 100644 index d5af9f6fd..000000000 --- a/src/main/java/usecases/nevagateMain/NevagateMainDataAccessInterface.java +++ /dev/null @@ -1,7 +0,0 @@ -package usecases.nevagateMain; - -/** - * Data access, need decided events. - */ -public interface NevagateMainDataAccessInterface { -} diff --git a/src/main/java/usecases/nevagateMain/NevagateMainInputBoundary.java b/src/main/java/usecases/nevagateMain/NevagateMainInputBoundary.java deleted file mode 100644 index 24ea73819..000000000 --- a/src/main/java/usecases/nevagateMain/NevagateMainInputBoundary.java +++ /dev/null @@ -1,8 +0,0 @@ -package usecases.nevagateMain; - -/** - * Execute method. - */ -public interface NevagateMainInputBoundary { - public void execute(NevagateMainInputdata inputdata); -} diff --git a/src/main/java/usecases/nevagateMain/NevagateMainInputdata.java b/src/main/java/usecases/nevagateMain/NevagateMainInputdata.java deleted file mode 100644 index 2c8938d2e..000000000 --- a/src/main/java/usecases/nevagateMain/NevagateMainInputdata.java +++ /dev/null @@ -1,7 +0,0 @@ -package usecases.nevagateMain; - -/** - * Not needed, no restriction to go back. - */ -public class NevagateMainInputdata { -} diff --git a/src/main/java/usecases/nevagateMain/NevagateMainInteractor.java b/src/main/java/usecases/nevagateMain/NevagateMainInteractor.java deleted file mode 100644 index 0ac09a7be..000000000 --- a/src/main/java/usecases/nevagateMain/NevagateMainInteractor.java +++ /dev/null @@ -1,20 +0,0 @@ -package usecases.nevagateMain; - -/** - * Nevagate interactor. - */ -public class NevagateMainInteractor implements NevagateMainInputBoundary { - private final NevagateMainDataAccessInterface dataaccess; - private final NevagateMainOutputBoundary outputboundary; - - public NevagateMainInteractor(NevagateMainDataAccessInterface dataaccess, - NevagateMainOutputBoundary outputboundary) { - this.dataaccess = dataaccess; - this.outputboundary = outputboundary; - } - - @Override - public void execute(NevagateMainInputdata inputdata) { - outputboundary.prepareMainView(); - } -} diff --git a/src/main/java/usecases/nevagateMain/NevagateMainOutputdata.java b/src/main/java/usecases/nevagateMain/NevagateMainOutputdata.java deleted file mode 100644 index 6736b7cbc..000000000 --- a/src/main/java/usecases/nevagateMain/NevagateMainOutputdata.java +++ /dev/null @@ -1,7 +0,0 @@ -package usecases.nevagateMain; - -/** - * No output data is needed to go back. - */ -public class NevagateMainOutputdata { -} From f43ae3a6bb00f9a3bab011c66814da83f62a5672 Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Tue, 3 Dec 2024 21:41:36 -0500 Subject: [PATCH 150/154] Fixing JsonRankingDataAccess --- .../database/JsonRankingDataAccess.java | 48 ++++++------------- 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/src/main/java/frameworks/database/JsonRankingDataAccess.java b/src/main/java/frameworks/database/JsonRankingDataAccess.java index 1de976a7b..dcc1ec459 100644 --- a/src/main/java/frameworks/database/JsonRankingDataAccess.java +++ b/src/main/java/frameworks/database/JsonRankingDataAccess.java @@ -16,56 +16,35 @@ public class JsonRankingDataAccess implements RankingDataAccessInterface { private final FileDatabase database; private List rankings; - /** - * Constructs a new JsonRankingDataAccess with the specified JSON file path. - * - * @param filePath The path to the JSON file storing the rankings. - * @throws IOException If there is an error reading the JSON file. - */ public JsonRankingDataAccess(String filePath) throws IOException { this.database = new FileDatabase<>(filePath, new TypeReference>() {}); - this.rankings = database.load(); + this.rankings = new ArrayList<>(database.load()); } - /** - * Retrieves the list of ranked players. - * - * @return A list of PlayerRankingEntry objects representing the leaderboard. - */ @Override public List getLeaderboard() { return new ArrayList<>(rankings); } - /** - * Updates the score for a specific player in the leaderboard. - * - * @param username The username of the player. - * @param score The new score to assign. - */ @Override public void updateScore(String username, int score) { + boolean playerFound = false; + for (PlayerRankingEntry entry : rankings) { if (entry.getName().equals(username)) { entry.setScore(score); - saveRankings(); - return; + playerFound = true; + break; } } - // If the player does not exist, add them to the rankings - rankings.add(new PlayerRankingEntry(username, score, 0, false)); + if (!playerFound) { + rankings.add(new PlayerRankingEntry(username, score, 0, false)); + } + saveRankings(); } - /** - * Updates the full ranking entry for a player or adds a new entry if the player does not exist. - * - * @param username The username of the player. - * @param score The player's final score. - * @param daysSurvived The number of days survived by the player. - * @param won Whether the player won the game. - */ @Override public void updateRankingData(String username, int score, int daysSurvived, boolean won) { boolean playerFound = false; @@ -87,15 +66,18 @@ public void updateRankingData(String username, int score, int daysSurvived, bool saveRankings(); } - /** - * Saves the updated rankings to the JSON file. - */ private void saveRankings() { try { database.save(rankings); + reloadData(); } catch (IOException e) { e.printStackTrace(); } } + + @Override + public void reloadData() throws IOException { + this.rankings = new ArrayList<>(database.load()); + } } From cd80b48592956d4e619fd39e00c1c612a891573b Mon Sep 17 00:00:00 2001 From: yitong an Date: Tue, 3 Dec 2024 21:54:38 -0500 Subject: [PATCH 151/154] change description structure --- .../PlaceDescriptionInputData.java | 4 ---- .../PlaceDescriptionInteractor.java | 15 +++++++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java index 63857d984..8dc4f1c13 100644 --- a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInputData.java @@ -1,8 +1,4 @@ package usecases.gameplacedescription; -/** - * We don't need anything from player's side, this is automatic move. - */ - public class PlaceDescriptionInputData { } diff --git a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java index e23e8aa02..a085c9d2e 100644 --- a/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java +++ b/src/main/java/usecases/gameplacedescription/PlaceDescriptionInteractor.java @@ -1,5 +1,7 @@ package usecases.gameplacedescription; +import entities.Location; + /** * Place Description interactor, based on location information, generate the description for the player, * which is for the view. @@ -8,15 +10,16 @@ public class PlaceDescriptionInteractor implements PlaceDescriptionInputBoundary private PlaceDescriptionDataAccessInterface dataAccess; private PlaceDescriptionOutputBoundary outputBoundary; - public PlaceDescriptionInteractor(PlaceDescriptionDataAccessInterface dataAccess, - PlaceDescriptionOutputBoundary outputBoundary) { - this.dataAccess = dataAccess; - this.outputBoundary = outputBoundary; + public PlaceDescriptionInteractor(PlaceDescriptionDataAccessInterface dataaccess, + PlaceDescriptionOutputBoundary outputboundary) { + this.dataAccess = dataaccess; + this.outputBoundary = outputboundary; } @Override - public void execute(PlaceDescriptionInputData inputdata) { - final String description = dataAccess.getLocation().getDescription(); + public void execute(PlaceDescriptionInputData Inputdata) { + final Location location = dataAccess.getLocation(); + final String description = location.getDescription(); final PlaceDescriptionOutputData outputdata = new PlaceDescriptionOutputData(description); outputBoundary.preparesuccessview(outputdata); From 8fafbab6e4a1ea09717a975c78f25d6a9e7f2bec Mon Sep 17 00:00:00 2001 From: Michael-lin6677 Date: Tue, 3 Dec 2024 22:52:27 -0500 Subject: [PATCH 152/154] add reloadData method --- .../usecases/accountranking/RankingDataAccessInterface.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/usecases/accountranking/RankingDataAccessInterface.java b/src/main/java/usecases/accountranking/RankingDataAccessInterface.java index 100acc2b6..2ae149aac 100644 --- a/src/main/java/usecases/accountranking/RankingDataAccessInterface.java +++ b/src/main/java/usecases/accountranking/RankingDataAccessInterface.java @@ -1,5 +1,6 @@ package usecases.accountranking; +import java.io.IOException; import java.util.List; import entities.PlayerRankingEntry; @@ -35,4 +36,6 @@ public interface RankingDataAccessInterface { * @param won Whether the player won the game. */ void updateRankingData(String username, int score, int daysSurvived, boolean won); + + void reloadData() throws IOException; } From 06c1aa240215ed67ab65a9174c8cfd80a69f51f2 Mon Sep 17 00:00:00 2001 From: FlashYDirOX Date: Tue, 3 Dec 2024 23:46:06 -0500 Subject: [PATCH 153/154] remove gameapplication and reconstruct chatparser --- src/main/java/app/GameMainApplication.java | 306 ------------------ .../chatgpt/ChatGptResponseParser.java | 32 +- .../java/usecases/chatgpt/ChatGptService.java | 1 + 3 files changed, 29 insertions(+), 310 deletions(-) delete mode 100644 src/main/java/app/GameMainApplication.java diff --git a/src/main/java/app/GameMainApplication.java b/src/main/java/app/GameMainApplication.java deleted file mode 100644 index ab8be7890..000000000 --- a/src/main/java/app/GameMainApplication.java +++ /dev/null @@ -1,306 +0,0 @@ -package app; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Map; - -import entities.*; -import frameworks.database.InMemoryUnifiedDataAccess; -import interface_adapters.EventManager; -import interface_adapters.NavigationManager; -import interface_adapters.broadcast.BroadcastController; -import interface_adapters.broadcast.BroadcastPresenter; -import interface_adapters.dailygather.DailyGatherController; -import interface_adapters.dailygather.DailyGatherPresenter; -import interface_adapters.dailymove.DailyMoveController; -import interface_adapters.dailymove.DailyMovePresenter; -import interface_adapters.endprocesshorde.HordeController; -import interface_adapters.endprocesshorde.HordePresenter; -import interface_adapters.eventdecide.EventDecideController; -import interface_adapters.eventdecide.EventDecidePresenter; -import interface_adapters.eventinitializer.EventInitializerController; -import interface_adapters.eventinitializer.EventInitializerPresenter; -import interface_adapters.eventrespond.ambush.AmbushResponseController; -import interface_adapters.eventrespond.ambush.AmbushResponsePresenter; -import interface_adapters.eventrespond.blizzard.BlizzardResponseController; -import interface_adapters.eventrespond.blizzard.BlizzardResponsePresenter; -import interface_adapters.eventrespond.flood.FloodResponseController; -import interface_adapters.eventrespond.flood.FloodResponsePresenter; -import interface_adapters.eventrespond.survivor.SurvivorResponseController; -import interface_adapters.eventrespond.survivor.SurvivorResponsePresenter; -import interface_adapters.eventrespond.trader.TraderResponseController; -import interface_adapters.eventrespond.trader.TraderResponsePresenter; -import interface_adapters.fetchcurrentevent.FetchEventController; -import interface_adapters.fetchcurrentevent.FetchEventPresenter; -import interface_adapters.fetchresource.FetchController; -import interface_adapters.fetchresource.FetchPresenter; -import interface_adapters.gamelosedetecter.LoseController; -import interface_adapters.gamelosedetecter.LosePresenter; -import interface_adapters.gameminimap.MinimapController; -import interface_adapters.gameminimap.MinimapPresenter; -import interface_adapters.gamenewday.NewdayController; -import interface_adapters.gamenewday.NewdayPresenter; -import interface_adapters.gameplacedescription.PlaceDescriptionController; -import interface_adapters.gameplacedescription.PlaceDescriptionPresenter; -import interface_adapters.nevagateallowcatepage.NevagateAllowcateController; -import interface_adapters.nevagateallowcatepage.NevagateAllowcatePresenter; -import interface_adapters.nevagateevent.NevagateEventController; -import interface_adapters.nevagateevent.NevagateEventPresenter; -import interface_adapters.nevagategame.NevagateGameController; -import interface_adapters.nevagategame.NevagateGamePresenter; -import interface_adapters.nevagategameover.NevagateGameOverController; -import interface_adapters.nevagategameover.NevagateGameOverPresenter; -import interface_adapters.nevagatemainview.NevagateMainController; -import interface_adapters.nevagatemainview.NevagateMainPresenter; -import interface_adapters.startallowcatepoint.AllowcateController; -import interface_adapters.startallowcatepoint.AllowcatePresenter; -import usecases.nevagateEventPage.NevagateEventInteractor; -import usecases.dailybroadcast.BroadcastInteractor; -import usecases.dailygather.GatherInteractor; -import usecases.dailymove.MoveInteractor; -import usecases.endprocesshorde.HordeInteractor; -import usecases.eventdecide.DecideEventInteractor; -import usecases.eventinitialize.EventInitializeInteractor; -import usecases.eventrespond.ambush.AmbushEventInteractor; -import usecases.eventrespond.blizzard.BlizzardEventInteractor; -import usecases.eventrespond.flood.FloodEventInteractor; -import usecases.eventrespond.survivor.SurvivorEventInteractor; -import usecases.eventrespond.trader.TraderEventInteractor; -import usecases.fetchcurrentevent.CurrentEventInteractor; -import usecases.fetchresource.FetchInteractor; -import usecases.gamelosedetecter.LoseInteractor; -import usecases.gameminimap.MinimapInteractor; -import usecases.gamenewday.NewdayInteractor; -import usecases.gameplacedescription.PlaceDescriptionInteractor; -import usecases.nevagateAllowcatePage.NevagateAllowcateInteractor; -import usecases.nevagateGame.NevagateGameInteractor; -import usecases.nevagateGameover.NevagateGameOverInteractor; -import usecases.navigateMain.NavigateMainInteractor; -import usecases.startallowcate.AllowcateInteractor; -import frameworks.database.JsonRankingDataAccess; -import usecases.chatgpt.ChatGptService; -import usecases.chatgpt.ChatGptResponseParser; -import view.*; - -/** - * Main of the game applicaition, initialize inmemory database for the game. - */ -public class GameMainApplication { - /** - * Ends the game by updating the ranking data for the player. - * This method writes the player's final game data to the JSON file. - * - * @param filePath The path to the JSON file storing ranking data. - * @param username The username of the player. - * @param score The final score of the player. - * @param daysSurvived The number of days the player survived. - * @param won Whether the player won the game. - */ - public static void endGame(String filePath, String username, int score, int daysSurvived, boolean won) { - try { - final JsonRankingDataAccess rankingDataAccess = new JsonRankingDataAccess(filePath); - rankingDataAccess.updateRankingData(username, score, daysSurvived, won); - // System.out.println("Game results saved to ranking.json!"); - } - catch (IOException e) { - System.err.println("Failed to update ranking data: " + e.getMessage()); - } - } - - /** - * Main of the game loop. - * @param args args - */ - public static void main(String[] args) { - // initialized map - final ArrayList environments = new ArrayList<>(Arrays.asList(EntityConstants.PLAIN, - EntityConstants.CITY, EntityConstants.FOREST, EntityConstants.DESERT, EntityConstants.ICELAND)); - final MapFactory mapfact = new MapFactory(); - final ArrayList>>> cores = - mapfact.getCores(EntityConstants.MAPWIDTH, EntityConstants.MAPHEIGHT, environments); - final ArrayList> grids = mapfact.getGrids(EntityConstants.MAPWIDTH, - EntityConstants.MAPHEIGHT, cores); - final Maps gameMap = new Maps(grids); - // initialize player and their info. - final PlayerAttributes playerAttributes = new PlayerAttributes(); - final PlayerInfo playerInfo = new PlayerInfo("Currentplayer"); - final PlayerLocation playerLocation = new PlayerLocation(); - final Inventory playerInventory = new Inventory(); - final Location currentlocation = grids.get(playerLocation.getYcoordinate()) - .get(playerLocation.getXcoordinate()); - // initialize events and horde - final EventAmbush ambush = new EventAmbush(); - final EventFlood flood = new EventFlood(); - final EventBlizzard blizzard = new EventBlizzard(); - final EventSurvivorJoins survivor = new EventSurvivorJoins(); - final EventTraderEncounter traderEncounter = new EventTraderEncounter(); - final Horde horde = new Horde(); - // initialize ingame in memory database/dataaccess. - final InMemoryUnifiedDataAccess gamedatabase = - new InMemoryUnifiedDataAccess(playerAttributes, playerInventory, new ArrayList<>(), currentlocation, - horde, playerInfo, playerLocation, gameMap, ambush, blizzard, flood, survivor, traderEncounter); - // initialize each gameing view. - final MainView mainView = new MainView(); - final CharacterCreationView attributeview = new CharacterCreationView(); - final GameView gameView = new GameView(); - final EventView eventView = new EventView(); - final GameOverView gameOverView = new GameOverView(); - final InformationView informationView = new InformationView("Daily log"); - // initialize nevagation manager - final NavigationManager navigationManager = - new NavigationManager(mainView, attributeview, gameView, eventView, informationView, gameOverView); - // initialize each usecase. - // Nevagate to allowcate page usecase. - final NevagateAllowcatePresenter nevagateAllowcatePresenter = new NevagateAllowcatePresenter(navigationManager); - final NevagateAllowcateInteractor nevagateAllowcateInteractor = new NevagateAllowcateInteractor( - gamedatabase, nevagateAllowcatePresenter); - final NevagateAllowcateController nevagateAllowcateController = new NevagateAllowcateController( - nevagateAllowcateInteractor); - - final ChatGptService chatGptService = new ChatGptService(); - final ChatGptResponseParser responseParser = new ChatGptResponseParser(); - // Allowcate points ussecase. - final AllowcatePresenter allowcatePresenter = new AllowcatePresenter(attributeview, navigationManager); - final AllowcateInteractor allowcateInteractor = new AllowcateInteractor(gamedatabase, allowcatePresenter); - final AllowcateController allowcateController = new AllowcateController(allowcateInteractor); - // Nevagate Main usecase. - final NevagateMainPresenter nevagateMainPresenter = new NevagateMainPresenter(navigationManager); - final NavigateMainInteractor nevagateMainInteractor = - new NavigateMainInteractor(gamedatabase, nevagateMainPresenter); - final NevagateMainController nevagateMainController = new NevagateMainController(nevagateMainInteractor); - // Fetch Usecase - final FetchPresenter fetchPresenter = new FetchPresenter(gameView); - final FetchInteractor fetchInteractor = new FetchInteractor(gamedatabase, fetchPresenter); - final FetchController fetchController = new FetchController(fetchInteractor); - // Broadcast Usecase - final BroadcastPresenter broadcastPresenter = new BroadcastPresenter(gameView); - final BroadcastInteractor broadcastInteractor = new BroadcastInteractor(gamedatabase, broadcastPresenter); - final BroadcastController broadcastController = new BroadcastController(broadcastInteractor); - // Place description usecase - final PlaceDescriptionPresenter placeDescriptionPresenter = new PlaceDescriptionPresenter(gameView); - final PlaceDescriptionInteractor placeDescriptionInteractor = - new PlaceDescriptionInteractor(gamedatabase, placeDescriptionPresenter); - final PlaceDescriptionController placeDescriptionController = - new PlaceDescriptionController(placeDescriptionInteractor); - - // gather description usecase - final DailyGatherPresenter dailyGatherPresenter = new DailyGatherPresenter(gameView); - final GatherInteractor gatherInteractor = new GatherInteractor(gamedatabase, dailyGatherPresenter); - final DailyGatherController dailyGatherController = new DailyGatherController(gatherInteractor); - - // Move usecase. - final DailyMovePresenter dailyMovePresenter = new DailyMovePresenter(gameView); - final MoveInteractor moveInteractor = new MoveInteractor(gamedatabase, dailyMovePresenter); - final DailyMoveController dailyMoveController = new DailyMoveController(moveInteractor); - - // Nevagate Event usecase - final NevagateEventPresenter nevagateEventPresenter = new NevagateEventPresenter(navigationManager, gameView); - final NevagateEventInteractor nevagateEventInteractor = - new NevagateEventInteractor(gamedatabase, nevagateEventPresenter); - final NevagateEventController nevagateEventController = new NevagateEventController(nevagateEventInteractor); - - // Event Initialize usecase - final EventInitializerPresenter eventInitializerPresenter = new EventInitializerPresenter(eventView); - final EventInitializeInteractor eventInitializeInteractor = - new EventInitializeInteractor(gamedatabase, eventInitializerPresenter); - final EventInitializerController eventInitializerController = - new EventInitializerController(eventInitializeInteractor); - - // Event Decide usecase - final EventDecidePresenter eventDecidePresenter = new EventDecidePresenter(gameView); - final DecideEventInteractor decideEventInteractor = - new DecideEventInteractor(gamedatabase, eventDecidePresenter); - final EventDecideController eventDecideController = new EventDecideController(decideEventInteractor); - - // Event Respond usecase ambush - final AmbushResponsePresenter ambushresponsePresenter = new AmbushResponsePresenter(eventView); - final AmbushEventInteractor ambushEventInteractor = - new AmbushEventInteractor(gamedatabase, ambushresponsePresenter, chatGptService); - final AmbushResponseController ambushResponseController = new AmbushResponseController(ambushEventInteractor); - - // Event Respond usecase blizzard - final BlizzardResponsePresenter blizzardResponsePresenter = new BlizzardResponsePresenter(eventView); - final BlizzardEventInteractor blizzardEventInteractor = - new BlizzardEventInteractor(gamedatabase, blizzardResponsePresenter, chatGptService); - final BlizzardResponseController blizzardResponseController = - new BlizzardResponseController(blizzardEventInteractor); - - // Event Respond usecase flood - final FloodResponsePresenter floodResponsePresenter = new FloodResponsePresenter(eventView); - final FloodEventInteractor floodEventInteractor = - new FloodEventInteractor(gamedatabase, floodResponsePresenter, chatGptService); - final FloodResponseController floodResponseController = new FloodResponseController(floodEventInteractor); - - // Event Respond usecase survivor - final SurvivorResponsePresenter survivorResponsePresenter = new SurvivorResponsePresenter(eventView); - final SurvivorEventInteractor survivorEventInteractor = - new SurvivorEventInteractor(gamedatabase, survivorResponsePresenter, chatGptService); - final SurvivorResponseController survivorResponseController = - new SurvivorResponseController(survivorEventInteractor); - - // Event Respond usecase trader - final TraderResponsePresenter traderResponsePresenter = new TraderResponsePresenter(eventView); - final TraderEventInteractor traderEventInteractor = - new TraderEventInteractor(gamedatabase, traderResponsePresenter, chatGptService); - final TraderResponseController traderResponseController = new TraderResponseController(traderEventInteractor); - - // Initialize Event manager - final EventManager eventManager = new EventManager(ambushResponseController, blizzardResponseController, - floodResponseController, survivorResponseController, traderResponseController); - - // Fetch Event usecase - final FetchEventPresenter fetchEventPresenter = new FetchEventPresenter(eventView); - final CurrentEventInteractor currentEventInteractor = - new CurrentEventInteractor(gamedatabase, fetchEventPresenter); - final FetchEventController fetchEventController = new FetchEventController(currentEventInteractor); - - // Nevagate Game usecase - final NevagateGamePresenter nevagateGamePresenter = new NevagateGamePresenter(navigationManager); - final NevagateGameInteractor nevagateGameInteractor = - new NevagateGameInteractor(gamedatabase, nevagateGamePresenter); - final NevagateGameController nevagateGameController = new NevagateGameController(nevagateGameInteractor); - - // Newday Game usecase - final NewdayPresenter newdayPresenter = new NewdayPresenter(gameView); - final NewdayInteractor newdayInteractor = new NewdayInteractor(gamedatabase, newdayPresenter); - final NewdayController newdayController = new NewdayController(newdayInteractor); - - // Minimap update usecase - final MinimapPresenter minimapPresenter = new MinimapPresenter(gameView); - final MinimapInteractor minimapInteractor = new MinimapInteractor(gamedatabase, minimapPresenter); - final MinimapController minimapController = new MinimapController(minimapInteractor); - - // Lose detect usecase - final LosePresenter losePresenter = new LosePresenter(gameOverView, navigationManager, gameView); - final LoseInteractor loseInteractor = new LoseInteractor(gamedatabase, losePresenter); - final LoseController loseController = new LoseController(loseInteractor); - - // End process horde usecase - final HordePresenter hordePresenter = new HordePresenter(gameOverView, navigationManager, gameView); - final HordeInteractor hordeInteractor = new HordeInteractor(gamedatabase, hordePresenter); - final HordeController hordeController = new HordeController(hordeInteractor); - - // Navigate Game Over view usecase - final NevagateGameOverPresenter nevagateGameOverPresenter = - new NevagateGameOverPresenter(navigationManager); - final NevagateGameOverInteractor nevagateGameOverInteractor = - new NevagateGameOverInteractor(gamedatabase, nevagateGameOverPresenter); - final NevagateGameOverController nevagateGameOverController = - new NevagateGameOverController(nevagateGameOverInteractor); - - - // Example of how to use the endGame method - // endGame("path/to/rankings.json", "Player1", score, daysSurvived, won); - attributeview.render(); - gameView.setController(fetchController, broadcastController, - placeDescriptionController, dailyGatherController, dailyMoveController, - nevagateEventController, eventDecideController, newdayController, minimapController, loseController, - hordeController, nevagateGameOverController); - attributeview.setAllowcateController(allowcateController, nevagateMainController); - eventView.setController(eventInitializerController, fetchEventController, nevagateGameController); - eventView.setManager(eventManager); - gameOverView.setController(nevagateMainController); - mainView.setNevagateAllowcateController(nevagateAllowcateController); - } -} diff --git a/src/main/java/usecases/chatgpt/ChatGptResponseParser.java b/src/main/java/usecases/chatgpt/ChatGptResponseParser.java index ac4a50866..1280aade7 100644 --- a/src/main/java/usecases/chatgpt/ChatGptResponseParser.java +++ b/src/main/java/usecases/chatgpt/ChatGptResponseParser.java @@ -8,11 +8,12 @@ */ public class ChatGptResponseParser { + private static final int LINE_LENGTH = 50; // Adjust this value based on screen width + /** - * Parses the response from ChatGPT and extracts the event outcome description. - * + * Parses the response from ChatGPT and extracts the message content. * @param response The raw JSON response from ChatGPT. - * @return The event outcome description. + * @return The formatted assistant's response content. * @throws Exception If the parsing fails. */ public static String parseEventOutcome(String response) throws Exception { @@ -39,6 +40,29 @@ public static String parseEventOutcome(String response) throws Exception { throw new RuntimeException("Invalid ChatGPT response format: 'content' is missing or empty."); } - return contentNode.asText().trim(); + // Format the content to ensure it fits on the screen + return formatResponse(contentNode.asText()); + } + + /** + * Formats a long response into shorter lines with proper line breaks. + * @param responseContent The original response content. + * @return The formatted response with added line breaks. + */ + private static String formatResponse(String responseContent) { + StringBuilder formattedResponse = new StringBuilder(); + String[] words = responseContent.split(" "); + int currentLineLength = 0; + + for (String word : words) { + if (currentLineLength + word.length() + 1 > LINE_LENGTH) { + formattedResponse.append("\n"); // Add a new line + currentLineLength = 0; + } + formattedResponse.append(word).append(" "); + currentLineLength += word.length() + 1; + } + + return formattedResponse.toString().trim(); } } \ No newline at end of file diff --git a/src/main/java/usecases/chatgpt/ChatGptService.java b/src/main/java/usecases/chatgpt/ChatGptService.java index fe764a285..a96c19c28 100644 --- a/src/main/java/usecases/chatgpt/ChatGptService.java +++ b/src/main/java/usecases/chatgpt/ChatGptService.java @@ -12,6 +12,7 @@ */ public class ChatGptService { private static final String API_URL = "https://api.openai.com/v1/chat/completions"; + private static final String API_KEY = ""; /** * Sends a request to ChatGPT with the event description, player attributes, and player choice. From 4917e1d59cd4f5ae75f623c859f301febdbdc4ed Mon Sep 17 00:00:00 2001 From: Adidazdoge Date: Tue, 3 Dec 2024 21:52:55 -0700 Subject: [PATCH 154/154] Minimap Font change --- src/main/java/usecases/chatgpt/ChatGptService.java | 1 + src/main/java/view/Constants.java | 1 + src/main/java/view/GameView.java | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/usecases/chatgpt/ChatGptService.java b/src/main/java/usecases/chatgpt/ChatGptService.java index a96c19c28..06235d80e 100644 --- a/src/main/java/usecases/chatgpt/ChatGptService.java +++ b/src/main/java/usecases/chatgpt/ChatGptService.java @@ -13,6 +13,7 @@ public class ChatGptService { private static final String API_URL = "https://api.openai.com/v1/chat/completions"; private static final String API_KEY = ""; + // enter the application key above to process. /** * Sends a request to ChatGPT with the event description, player attributes, and player choice. diff --git a/src/main/java/view/Constants.java b/src/main/java/view/Constants.java index 74c9cfa7d..ea7bcf812 100644 --- a/src/main/java/view/Constants.java +++ b/src/main/java/view/Constants.java @@ -8,6 +8,7 @@ * for consistent usage across different components. */ public class Constants { + public static final int MINIMAPSIZE = 12; public static final int THREE = 3; public static final int FIVE = 5; public static final int TEN = 10; diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 920f8613f..daf965923 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -516,7 +516,7 @@ public void updateUiMinimap(ArrayList> grid) { } // Set text to mapPanel with fixed font and centered scroll - mapPanel.setFont(new Font("Monospaced", Font.PLAIN, Constants.FIFTEEN)); + mapPanel.setFont(new Font("Monospaced", Font.PLAIN, Constants.MINIMAPSIZE)); mapPanel.setText(mapBuilder.toString()); mapPanel.setCaretPosition(0); }