From 02683303dd0d77014b2aa5e4d4d6fcf92451e17f Mon Sep 17 00:00:00 2001 From: Brett Laptop Date: Tue, 4 Apr 2023 15:58:32 -0400 Subject: [PATCH] Assign4 setup, fix package name issue --- Assignment 2/src/ca/cosc3p91/a2/Main.java | 6 +- .../src/ca/cosc3p91/a2/game/GameEngine.java | 12 +- Assignment 2/src/ca/cosc3p91/a2/game/Map.java | 4 +- .../ca/cosc3p91/a2/gameobjects/Archer.java | 2 +- .../cosc3p91/a2/gameobjects/ArcherTower.java | 2 +- .../ca/cosc3p91/a2/gameobjects/Building.java | 2 +- .../ca/cosc3p91/a2/gameobjects/Cannon.java | 2 +- .../cosc3p91/a2/gameobjects/CasaDeNarino.java | 2 +- .../ca/cosc3p91/a2/gameobjects/Catapult.java | 2 +- .../ca/cosc3p91/a2/gameobjects/Collector.java | 2 +- .../a2/gameobjects/DefenseBuilding.java | 2 +- .../cosc3p91/a2/gameobjects/DefenseStage.java | 4 +- .../a2/gameobjects/DefenseStages.java | 4 +- .../src/ca/cosc3p91/a2/gameobjects/Farm.java | 2 +- .../ca/cosc3p91/a2/gameobjects/Infantry.java | 2 +- .../cosc3p91/a2/gameobjects/Inhabitant.java | 4 +- .../ca/cosc3p91/a2/gameobjects/IronMine.java | 2 +- .../ca/cosc3p91/a2/gameobjects/Knight.java | 2 +- .../cosc3p91/a2/gameobjects/LumberMine.java | 2 +- .../a2/gameobjects/ResourceBuilding.java | 4 +- .../a2/gameobjects/ResourceStage.java | 4 +- .../a2/gameobjects/ResourceStages.java | 4 +- .../cosc3p91/a2/gameobjects/SaulGoodMine.java | 2 +- .../ca/cosc3p91/a2/gameobjects/Soldier.java | 2 +- .../src/ca/cosc3p91/a2/gameobjects/Stage.java | 4 +- .../src/ca/cosc3p91/a2/gameobjects/Tile.java | 2 +- .../a2/gameobjects/VillageHallStages.java | 4 +- .../cosc3p91/a2/gameobjects/VillageStage.java | 4 +- .../ca/cosc3p91/a2/gameobjects/Worker.java | 2 +- .../src/ca/cosc3p91/a2/player/Player.java | 2 +- .../cosc3p91/a2/userinterface/GuiManager.java | 2 +- .../src/ca/cosc3p91/a2/util/Print.java | 2 +- .../src/ca/cosc3p91/a2/util/Time.java | 2 +- .../src/ca/cosc3p91/a2/util/Util.java | 2 +- Assignment 3/src/ca/cosc3p91/a3/Main.java | 4 +- .../src/ca/cosc3p91/a3/game/GameEngine.java | 14 +- Assignment 3/src/ca/cosc3p91/a3/game/Map.java | 4 +- .../ca/cosc3p91/a3/gameobjects/Archer.java | 2 +- .../cosc3p91/a3/gameobjects/ArcherTower.java | 2 +- .../ca/cosc3p91/a3/gameobjects/Building.java | 2 +- .../ca/cosc3p91/a3/gameobjects/Cannon.java | 2 +- .../cosc3p91/a3/gameobjects/CasaDeNarino.java | 2 +- .../ca/cosc3p91/a3/gameobjects/Catapult.java | 2 +- .../ca/cosc3p91/a3/gameobjects/Collector.java | 2 +- .../a3/gameobjects/DefenseBuilding.java | 2 +- .../cosc3p91/a3/gameobjects/DefenseStage.java | 4 +- .../a3/gameobjects/DefenseStages.java | 4 +- .../src/ca/cosc3p91/a3/gameobjects/Farm.java | 2 +- .../ca/cosc3p91/a3/gameobjects/Infantry.java | 2 +- .../cosc3p91/a3/gameobjects/Inhabitant.java | 2 +- .../ca/cosc3p91/a3/gameobjects/IronMine.java | 2 +- .../ca/cosc3p91/a3/gameobjects/Knight.java | 2 +- .../cosc3p91/a3/gameobjects/LumberMine.java | 2 +- .../a3/gameobjects/ResourceBuilding.java | 4 +- .../a3/gameobjects/ResourceStage.java | 4 +- .../a3/gameobjects/ResourceStages.java | 4 +- .../cosc3p91/a3/gameobjects/SaulGoodMine.java | 2 +- .../ca/cosc3p91/a3/gameobjects/Soldier.java | 2 +- .../src/ca/cosc3p91/a3/gameobjects/Stage.java | 4 +- .../src/ca/cosc3p91/a3/gameobjects/Tile.java | 2 +- .../a3/gameobjects/VillageHallStages.java | 4 +- .../cosc3p91/a3/gameobjects/VillageStage.java | 4 +- .../ca/cosc3p91/a3/gameobjects/Worker.java | 2 +- .../gameobjects/factory/BuildingFactory.java | 6 +- .../factory/InhabitantFactory.java | 6 +- .../src/ca/cosc3p91/a3/player/Player.java | 2 +- .../a3/userinterface/GameDisplay.java | 10 +- .../ca/cosc3p91/a3/util/ChallengeAdapter.java | 6 +- .../src/ca/cosc3p91/a3/util/Print.java | 2 +- .../src/ca/cosc3p91/a3/util/Time.java | 2 +- .../src/ca/cosc3p91/a3/util/Util.java | 2 +- Assignment 4/assignment3_instructions.pdf | Bin 0 -> 55962 bytes .../src/ChallengeDecision/Arbitrer.java | 84 ++++++ .../ChallengeDecision/ChallengeAttack.java | 104 +++++++ .../ChallengeDecision/ChallengeDefense.java | 68 +++++ .../ChallengeDecision/ChallengeEntity.java | 27 ++ .../ChallengeDecision/ChallengeEntitySet.java | 56 ++++ .../ChallengeDecision/ChallengeResource.java | 75 +++++ .../ChallengeDecision/ChallengeResult.java | 43 +++ .../src/ChallengeDecision/FightResult.java | 28 ++ Assignment 4/src/ca/cosc3p91/a4/Main.java | 11 + .../src/ca/cosc3p91/a4/game/GameEngine.java | 265 ++++++++++++++++++ Assignment 4/src/ca/cosc3p91/a4/game/Map.java | 142 ++++++++++ .../ca/cosc3p91/a4/gameobjects/Archer.java | 38 +++ .../cosc3p91/a4/gameobjects/ArcherTower.java | 14 + .../ca/cosc3p91/a4/gameobjects/Building.java | 73 +++++ .../ca/cosc3p91/a4/gameobjects/Cannon.java | 14 + .../cosc3p91/a4/gameobjects/CasaDeNarino.java | 79 ++++++ .../ca/cosc3p91/a4/gameobjects/Catapult.java | 37 +++ .../ca/cosc3p91/a4/gameobjects/Collector.java | 43 +++ .../a4/gameobjects/DefenseBuilding.java | 22 ++ .../cosc3p91/a4/gameobjects/DefenseStage.java | 26 ++ .../a4/gameobjects/DefenseStages.java | 46 +++ .../src/ca/cosc3p91/a4/gameobjects/Farm.java | 28 ++ .../ca/cosc3p91/a4/gameobjects/Infantry.java | 43 +++ .../cosc3p91/a4/gameobjects/Inhabitant.java | 17 ++ .../ca/cosc3p91/a4/gameobjects/IronMine.java | 25 ++ .../ca/cosc3p91/a4/gameobjects/Knight.java | 37 +++ .../cosc3p91/a4/gameobjects/LumberMine.java | 25 ++ .../a4/gameobjects/ResourceBuilding.java | 42 +++ .../a4/gameobjects/ResourceStage.java | 19 ++ .../a4/gameobjects/ResourceStages.java | 65 +++++ .../cosc3p91/a4/gameobjects/SaulGoodMine.java | 25 ++ .../ca/cosc3p91/a4/gameobjects/Soldier.java | 37 +++ .../src/ca/cosc3p91/a4/gameobjects/Stage.java | 47 ++++ .../src/ca/cosc3p91/a4/gameobjects/Tile.java | 9 + .../a4/gameobjects/VillageHallStages.java | 30 ++ .../cosc3p91/a4/gameobjects/VillageStage.java | 33 +++ .../ca/cosc3p91/a4/gameobjects/Worker.java | 43 +++ .../gameobjects/factory/BuildingFactory.java | 25 ++ .../factory/InhabitantFactory.java | 27 ++ .../src/ca/cosc3p91/a4/player/Player.java | 6 + .../a4/userinterface/GameDisplay.java | 90 ++++++ .../ca/cosc3p91/a4/util/ChallengeAdapter.java | 143 ++++++++++ .../src/ca/cosc3p91/a4/util/PacketTable.java | 7 + .../src/ca/cosc3p91/a4/util/Print.java | 249 ++++++++++++++++ .../src/ca/cosc3p91/a4/util/Server.java | 11 + .../src/ca/cosc3p91/a4/util/Time.java | 50 ++++ .../src/ca/cosc3p91/a4/util/Util.java | 22 ++ Assignment 4/suggestedSolutionA1.png | Bin 0 -> 82400 bytes untitled104.iml | 2 +- 121 files changed, 2565 insertions(+), 115 deletions(-) create mode 100644 Assignment 4/assignment3_instructions.pdf create mode 100644 Assignment 4/src/ChallengeDecision/Arbitrer.java create mode 100644 Assignment 4/src/ChallengeDecision/ChallengeAttack.java create mode 100644 Assignment 4/src/ChallengeDecision/ChallengeDefense.java create mode 100644 Assignment 4/src/ChallengeDecision/ChallengeEntity.java create mode 100644 Assignment 4/src/ChallengeDecision/ChallengeEntitySet.java create mode 100644 Assignment 4/src/ChallengeDecision/ChallengeResource.java create mode 100644 Assignment 4/src/ChallengeDecision/ChallengeResult.java create mode 100644 Assignment 4/src/ChallengeDecision/FightResult.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/Main.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/game/GameEngine.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/game/Map.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Archer.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/ArcherTower.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Building.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Cannon.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/CasaDeNarino.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Catapult.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Collector.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseBuilding.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseStage.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseStages.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Farm.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Infantry.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Inhabitant.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/IronMine.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Knight.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/LumberMine.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceBuilding.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceStage.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceStages.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/SaulGoodMine.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Soldier.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Stage.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Tile.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/VillageHallStages.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/VillageStage.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/Worker.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/factory/BuildingFactory.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/gameobjects/factory/InhabitantFactory.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/player/Player.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/userinterface/GameDisplay.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/util/ChallengeAdapter.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/util/PacketTable.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/util/Print.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/util/Server.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/util/Time.java create mode 100644 Assignment 4/src/ca/cosc3p91/a4/util/Util.java create mode 100644 Assignment 4/suggestedSolutionA1.png diff --git a/Assignment 2/src/ca/cosc3p91/a2/Main.java b/Assignment 2/src/ca/cosc3p91/a2/Main.java index 0e78c10..9553242 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/Main.java +++ b/Assignment 2/src/ca/cosc3p91/a2/Main.java @@ -1,7 +1,7 @@ -package ca.cosc3p91.a3; +package ca.cosc3p91.a4; -import ca.cosc3p91.a3.game.GameEngine; -import ca.cosc3p91.a3.gameobjects.Stage; +import ca.cosc3p91.a4.game.GameEngine; +import ca.cosc3p91.a4.gameobjects.Stage; public class Main { diff --git a/Assignment 2/src/ca/cosc3p91/a2/game/GameEngine.java b/Assignment 2/src/ca/cosc3p91/a2/game/GameEngine.java index b1430cd..0d8bed4 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/game/GameEngine.java +++ b/Assignment 2/src/ca/cosc3p91/a2/game/GameEngine.java @@ -1,10 +1,10 @@ -package ca.cosc3p91.a3.game; +package ca.cosc3p91.a4.game; -import ca.cosc3p91.a3.gameobjects.*; -import ca.cosc3p91.a3.player.*; -import ca.cosc3p91.a3.util.Print; -import ca.cosc3p91.a3.util.Time; -import ca.cosc3p91.a3.util.Util; +import ca.cosc3p91.a4.gameobjects.*; +import ca.cosc3p91.a4.player.*; +import ca.cosc3p91.a4.util.Print; +import ca.cosc3p91.a4.util.Time; +import ca.cosc3p91.a4.util.Util; import java.io.BufferedReader; import java.io.IOException; diff --git a/Assignment 2/src/ca/cosc3p91/a2/game/Map.java b/Assignment 2/src/ca/cosc3p91/a2/game/Map.java index 529676b..cc9497e 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/game/Map.java +++ b/Assignment 2/src/ca/cosc3p91/a2/game/Map.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.game; +package ca.cosc3p91.a4.game; -import ca.cosc3p91.a3.gameobjects.*; +import ca.cosc3p91.a4.gameobjects.*; import java.util.ArrayList; import java.util.List; diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Archer.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Archer.java index dd5e141..1c2a5c6 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Archer.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Archer.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Archer extends Infantry { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ArcherTower.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ArcherTower.java index 6b4a97f..b166412 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ArcherTower.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ArcherTower.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class ArcherTower extends DefenseBuilding { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Building.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Building.java index ae6de98..f8ff980 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Building.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Building.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; import java.util.ArrayList; diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Cannon.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Cannon.java index e925b2f..98dcb0b 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Cannon.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Cannon.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Cannon extends DefenseBuilding { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/CasaDeNarino.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/CasaDeNarino.java index cc5dc95..c359934 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/CasaDeNarino.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/CasaDeNarino.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class CasaDeNarino extends Building { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Catapult.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Catapult.java index b54dbc0..1976916 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Catapult.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Catapult.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Catapult extends Infantry { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Collector.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Collector.java index 6e206d0..a9ace15 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Collector.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Collector.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Collector implements Inhabitant { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseBuilding.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseBuilding.java index 5fddb8d..bf1096c 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseBuilding.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseBuilding.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public abstract class DefenseBuilding extends Building { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseStage.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseStage.java index edcab79..661b4bb 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseStage.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseStage.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; class DefenseStage extends Stage { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseStages.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseStages.java index 9d7c4e3..235e2ac 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseStages.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/DefenseStages.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public class DefenseStages { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Farm.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Farm.java index 0e7b613..2072a62 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Farm.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Farm.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Farm extends ResourceBuilding { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Infantry.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Infantry.java index 64b4468..7d4cadd 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Infantry.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Infantry.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public abstract class Infantry implements Inhabitant { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Inhabitant.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Inhabitant.java index 2003cbd..af2895d 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Inhabitant.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Inhabitant.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.game.Map; +import ca.cosc3p91.a4.game.Map; public interface Inhabitant { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/IronMine.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/IronMine.java index e505e45..3537145 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/IronMine.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/IronMine.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class IronMine extends ResourceBuilding { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Knight.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Knight.java index a01768a..3a7d4e4 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Knight.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Knight.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Knight extends Infantry { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/LumberMine.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/LumberMine.java index 523f538..464cb2c 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/LumberMine.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/LumberMine.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class LumberMine extends ResourceBuilding { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceBuilding.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceBuilding.java index 7c68ca3..6f1b9da 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceBuilding.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceBuilding.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public abstract class ResourceBuilding extends Building { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceStage.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceStage.java index a361086..db02f18 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceStage.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceStage.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public class ResourceStage extends Stage { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceStages.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceStages.java index fea808d..8e33d1e 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceStages.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/ResourceStages.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public class ResourceStages { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/SaulGoodMine.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/SaulGoodMine.java index 5e06583..9bf821b 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/SaulGoodMine.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/SaulGoodMine.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class SaulGoodMine extends ResourceBuilding { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Soldier.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Soldier.java index 94520a0..eb997bd 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Soldier.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Soldier.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Soldier extends Infantry { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Stage.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Stage.java index 5d60966..17a6966 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Stage.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Stage.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; import java.util.HashMap; diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Tile.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Tile.java index 2449e5c..ee11ed2 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Tile.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Tile.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; import java.util.List; diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/VillageHallStages.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/VillageHallStages.java index 775bf05..dfd3eab 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/VillageHallStages.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/VillageHallStages.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public class VillageHallStages { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/VillageStage.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/VillageStage.java index 87eaec6..248d612 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/VillageStage.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/VillageStage.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public class VillageStage extends Stage { diff --git a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Worker.java b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Worker.java index 8a14141..4230bcb 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Worker.java +++ b/Assignment 2/src/ca/cosc3p91/a2/gameobjects/Worker.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Worker implements Inhabitant { diff --git a/Assignment 2/src/ca/cosc3p91/a2/player/Player.java b/Assignment 2/src/ca/cosc3p91/a2/player/Player.java index af70351..3b16dfc 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/player/Player.java +++ b/Assignment 2/src/ca/cosc3p91/a2/player/Player.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.player; +package ca.cosc3p91.a4.player; public class Player { diff --git a/Assignment 2/src/ca/cosc3p91/a2/userinterface/GuiManager.java b/Assignment 2/src/ca/cosc3p91/a2/userinterface/GuiManager.java index 65f61ca..0db0e33 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/userinterface/GuiManager.java +++ b/Assignment 2/src/ca/cosc3p91/a2/userinterface/GuiManager.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.userinterface; +package ca.cosc3p91.a4.userinterface; public class GuiManager { } \ No newline at end of file diff --git a/Assignment 2/src/ca/cosc3p91/a2/util/Print.java b/Assignment 2/src/ca/cosc3p91/a2/util/Print.java index 538a566..4211364 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/util/Print.java +++ b/Assignment 2/src/ca/cosc3p91/a2/util/Print.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.util; +package ca.cosc3p91.a4.util; import java.util.ArrayList; import java.util.Arrays; diff --git a/Assignment 2/src/ca/cosc3p91/a2/util/Time.java b/Assignment 2/src/ca/cosc3p91/a2/util/Time.java index 254411a..e9a56f1 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/util/Time.java +++ b/Assignment 2/src/ca/cosc3p91/a2/util/Time.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.util; +package ca.cosc3p91.a4.util; public class Time { diff --git a/Assignment 2/src/ca/cosc3p91/a2/util/Util.java b/Assignment 2/src/ca/cosc3p91/a2/util/Util.java index f9efe4b..78d27a5 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/util/Util.java +++ b/Assignment 2/src/ca/cosc3p91/a2/util/Util.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.util; +package ca.cosc3p91.a4.util; import java.util.Random; diff --git a/Assignment 3/src/ca/cosc3p91/a3/Main.java b/Assignment 3/src/ca/cosc3p91/a3/Main.java index 13cdbc0..e06aa2f 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/Main.java +++ b/Assignment 3/src/ca/cosc3p91/a3/Main.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3; +package ca.cosc3p91.a4; -import ca.cosc3p91.a3.game.GameEngine; +import ca.cosc3p91.a4.game.GameEngine; public class Main { diff --git a/Assignment 3/src/ca/cosc3p91/a3/game/GameEngine.java b/Assignment 3/src/ca/cosc3p91/a3/game/GameEngine.java index b378419..fba0bc3 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/game/GameEngine.java +++ b/Assignment 3/src/ca/cosc3p91/a3/game/GameEngine.java @@ -1,11 +1,11 @@ -package ca.cosc3p91.a3.game; +package ca.cosc3p91.a4.game; -import ca.cosc3p91.a3.gameobjects.*; -import ca.cosc3p91.a3.gameobjects.factory.BuildingFactory; -import ca.cosc3p91.a3.gameobjects.factory.InhabitantFactory; -import ca.cosc3p91.a3.player.*; -import ca.cosc3p91.a3.userinterface.GameDisplay; -import ca.cosc3p91.a3.util.ChallengeAdapter; +import ca.cosc3p91.a4.gameobjects.*; +import ca.cosc3p91.a4.gameobjects.factory.BuildingFactory; +import ca.cosc3p91.a4.gameobjects.factory.InhabitantFactory; +import ca.cosc3p91.a4.player.*; +import ca.cosc3p91.a4.userinterface.GameDisplay; +import ca.cosc3p91.a4.util.ChallengeAdapter; import java.beans.XMLEncoder; import java.io.BufferedOutputStream; diff --git a/Assignment 3/src/ca/cosc3p91/a3/game/Map.java b/Assignment 3/src/ca/cosc3p91/a3/game/Map.java index 529676b..cc9497e 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/game/Map.java +++ b/Assignment 3/src/ca/cosc3p91/a3/game/Map.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.game; +package ca.cosc3p91.a4.game; -import ca.cosc3p91.a3.gameobjects.*; +import ca.cosc3p91.a4.gameobjects.*; import java.util.ArrayList; import java.util.List; diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Archer.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Archer.java index dd5e141..1c2a5c6 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Archer.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Archer.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Archer extends Infantry { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ArcherTower.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ArcherTower.java index 6b4a97f..b166412 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ArcherTower.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ArcherTower.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class ArcherTower extends DefenseBuilding { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Building.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Building.java index e9d93b9..c6e4019 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Building.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Building.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; import java.io.Serializable; import java.util.ArrayList; diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Cannon.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Cannon.java index e925b2f..98dcb0b 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Cannon.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Cannon.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Cannon extends DefenseBuilding { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/CasaDeNarino.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/CasaDeNarino.java index cc5dc95..c359934 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/CasaDeNarino.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/CasaDeNarino.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class CasaDeNarino extends Building { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Catapult.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Catapult.java index b54dbc0..1976916 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Catapult.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Catapult.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Catapult extends Infantry { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Collector.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Collector.java index 6e206d0..a9ace15 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Collector.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Collector.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Collector implements Inhabitant { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseBuilding.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseBuilding.java index 0df9819..e7f9a6a 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseBuilding.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseBuilding.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public abstract class DefenseBuilding extends Building { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseStage.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseStage.java index edcab79..661b4bb 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseStage.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseStage.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; class DefenseStage extends Stage { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseStages.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseStages.java index 9d7c4e3..235e2ac 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseStages.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/DefenseStages.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public class DefenseStages { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Farm.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Farm.java index 16ccc5d..7c236a3 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Farm.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Farm.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Farm extends ResourceBuilding { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Infantry.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Infantry.java index 64b4468..7d4cadd 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Infantry.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Infantry.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public abstract class Infantry implements Inhabitant { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Inhabitant.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Inhabitant.java index e30118f..95f51ab 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Inhabitant.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Inhabitant.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; import java.io.Serializable; diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/IronMine.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/IronMine.java index fad54f3..3e88b06 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/IronMine.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/IronMine.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class IronMine extends ResourceBuilding { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Knight.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Knight.java index a01768a..3a7d4e4 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Knight.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Knight.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Knight extends Infantry { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/LumberMine.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/LumberMine.java index 71d89d8..412aba5 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/LumberMine.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/LumberMine.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class LumberMine extends ResourceBuilding { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceBuilding.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceBuilding.java index 9301cf9..37680f4 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceBuilding.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceBuilding.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public abstract class ResourceBuilding extends Building { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceStage.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceStage.java index a361086..db02f18 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceStage.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceStage.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public class ResourceStage extends Stage { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceStages.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceStages.java index fea808d..8e33d1e 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceStages.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/ResourceStages.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public class ResourceStages { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/SaulGoodMine.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/SaulGoodMine.java index 0834003..a7c8d1d 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/SaulGoodMine.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/SaulGoodMine.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class SaulGoodMine extends ResourceBuilding { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Soldier.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Soldier.java index 94520a0..eb997bd 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Soldier.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Soldier.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Soldier extends Infantry { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Stage.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Stage.java index d5d2a05..b554e9c 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Stage.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Stage.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; import java.io.Serializable; diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Tile.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Tile.java index 20ede00..e4078e9 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Tile.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Tile.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Tile { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/VillageHallStages.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/VillageHallStages.java index 775bf05..dfd3eab 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/VillageHallStages.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/VillageHallStages.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public class VillageHallStages { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/VillageStage.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/VillageStage.java index 87eaec6..248d612 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/VillageStage.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/VillageStage.java @@ -1,6 +1,6 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; -import ca.cosc3p91.a3.util.Time; +import ca.cosc3p91.a4.util.Time; public class VillageStage extends Stage { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Worker.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Worker.java index 8a14141..4230bcb 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Worker.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/Worker.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.gameobjects; +package ca.cosc3p91.a4.gameobjects; public class Worker implements Inhabitant { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/factory/BuildingFactory.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/factory/BuildingFactory.java index bc8bdfb..1fc283d 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/factory/BuildingFactory.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/factory/BuildingFactory.java @@ -1,7 +1,7 @@ -package ca.cosc3p91.a3.gameobjects.factory; +package ca.cosc3p91.a4.gameobjects.factory; -import ca.cosc3p91.a3.gameobjects.*; -import ca.cosc3p91.a3.util.Util; +import ca.cosc3p91.a4.gameobjects.*; +import ca.cosc3p91.a4.util.Util; public class BuildingFactory { public Building getBuilding(String buildingName) { diff --git a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/factory/InhabitantFactory.java b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/factory/InhabitantFactory.java index b984154..6b4aacc 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/gameobjects/factory/InhabitantFactory.java +++ b/Assignment 3/src/ca/cosc3p91/a3/gameobjects/factory/InhabitantFactory.java @@ -1,7 +1,7 @@ -package ca.cosc3p91.a3.gameobjects.factory; +package ca.cosc3p91.a4.gameobjects.factory; -import ca.cosc3p91.a3.gameobjects.*; -import ca.cosc3p91.a3.util.Util; +import ca.cosc3p91.a4.gameobjects.*; +import ca.cosc3p91.a4.util.Util; public class InhabitantFactory { public Inhabitant getInhabitant(String inhabitantName) { diff --git a/Assignment 3/src/ca/cosc3p91/a3/player/Player.java b/Assignment 3/src/ca/cosc3p91/a3/player/Player.java index af70351..3b16dfc 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/player/Player.java +++ b/Assignment 3/src/ca/cosc3p91/a3/player/Player.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.player; +package ca.cosc3p91.a4.player; public class Player { diff --git a/Assignment 3/src/ca/cosc3p91/a3/userinterface/GameDisplay.java b/Assignment 3/src/ca/cosc3p91/a3/userinterface/GameDisplay.java index 7a60d00..19e06fd 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/userinterface/GameDisplay.java +++ b/Assignment 3/src/ca/cosc3p91/a3/userinterface/GameDisplay.java @@ -1,9 +1,9 @@ -package ca.cosc3p91.a3.userinterface; +package ca.cosc3p91.a4.userinterface; -import ca.cosc3p91.a3.game.Map; -import ca.cosc3p91.a3.gameobjects.Building; -import ca.cosc3p91.a3.gameobjects.Inhabitant; -import ca.cosc3p91.a3.util.Print; +import ca.cosc3p91.a4.game.Map; +import ca.cosc3p91.a4.gameobjects.Building; +import ca.cosc3p91.a4.gameobjects.Inhabitant; +import ca.cosc3p91.a4.util.Print; import java.io.BufferedReader; import java.io.IOException; diff --git a/Assignment 3/src/ca/cosc3p91/a3/util/ChallengeAdapter.java b/Assignment 3/src/ca/cosc3p91/a3/util/ChallengeAdapter.java index 76d3269..d1c47bf 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/util/ChallengeAdapter.java +++ b/Assignment 3/src/ca/cosc3p91/a3/util/ChallengeAdapter.java @@ -1,8 +1,8 @@ -package ca.cosc3p91.a3.util; +package ca.cosc3p91.a4.util; import ChallengeDecision.*; -import ca.cosc3p91.a3.game.Map; -import ca.cosc3p91.a3.gameobjects.*; +import ca.cosc3p91.a4.game.Map; +import ca.cosc3p91.a4.gameobjects.*; import java.util.ArrayList; import java.util.List; diff --git a/Assignment 3/src/ca/cosc3p91/a3/util/Print.java b/Assignment 3/src/ca/cosc3p91/a3/util/Print.java index 538a566..4211364 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/util/Print.java +++ b/Assignment 3/src/ca/cosc3p91/a3/util/Print.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.util; +package ca.cosc3p91.a4.util; import java.util.ArrayList; import java.util.Arrays; diff --git a/Assignment 3/src/ca/cosc3p91/a3/util/Time.java b/Assignment 3/src/ca/cosc3p91/a3/util/Time.java index 6f5ee06..04fb156 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/util/Time.java +++ b/Assignment 3/src/ca/cosc3p91/a3/util/Time.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.util; +package ca.cosc3p91.a4.util; import java.io.Serializable; diff --git a/Assignment 3/src/ca/cosc3p91/a3/util/Util.java b/Assignment 3/src/ca/cosc3p91/a3/util/Util.java index 634092d..140545c 100644 --- a/Assignment 3/src/ca/cosc3p91/a3/util/Util.java +++ b/Assignment 3/src/ca/cosc3p91/a3/util/Util.java @@ -1,4 +1,4 @@ -package ca.cosc3p91.a3.util; +package ca.cosc3p91.a4.util; import java.util.Random; diff --git a/Assignment 4/assignment3_instructions.pdf b/Assignment 4/assignment3_instructions.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ceffc60ab979ffe9385b628b3be36495f6eff87 GIT binary patch literal 55962 zcma&tQ*$m{v@Pmn#T;l>E^RN#n7y&pL*csNGSB@CE&8Iby-=~)nM%J%NM&a}C)6=KVzuS!OPdNVm#Qphzf4AeO z4Zn&QXrbzJ`u@E1)K)}hJv~%Z#p)RZ9RUVqE9%lD&*SO$_YPZ=->PX9)W17V68*pD z;{q&M$Wz(h%g{D{6zliW=LK`^3A3Q=XY(Whcb~`G9_LRh?5kDRu4!Ck$u0oK_i`4E zF~Bz&WQuUXp4k#}*!>B+KodY#v!J~SHg5|2&<@EoN7%2YAIoIQ)Ps=izGy~uLvA9S zs5VOmkxEjn+(kQ+mW?JhiqR~eP+eVp8p0^9uV?Y`DcqT^hEf+Uzx}6?shu%jpzorv zKdH(Rg#UwmxtiRzi%zV@6x~X-YuaR5-08A@n)+=fJmucuP!XIe zXG$6*4^Z7Qr*m6Qvnltsr0(DP=+^eHMX~UMx_9L9%P;KM@0P22%5y9mr#G~tW3|@M z%1m+BuoPVbRnfJMrOKC?f%*GfkBSjc>=;lM&Ecm2{?_IslF7Mc zxV{?*r?~BfKzY&s+xguCiBsJ7?ZqS=W66Rok&?Hp=ijfHCmIV?@csVOFx>z*&eeCw zNtSzUPQ=k#+%wm*7*rfO&56-G%XLV6#6Wm!%PoozgEEzPsiK>eh_@Gx`0aHQGs*_J z@m}Fw`Ph}IBCKVG;ag5^wM|2Ym1G^6qD*<&qTDJ=78oxfp*ra7=ROLJU`*bhh z0xDaK8P2Q~>m^pvE6Gno6P-yiP4GTV;xceSQFpds!WXK>U^{gvdCH)TjofCCYUoa_ zmev})45aemVX#ZU;Wtux*hIi?+Z&m+Ic4G;__axCAZUgur!5y1vH=c5#W;o+jvPXfxm*b`Y=aIvSbWGXr%6W2%8duC za1FSx%DT)+v1f4OM4=^Fs}*D?M`YnG zJ=QV%%g&r4t|1rdDZ(N6iK(OETuQs@YH_G!*9}jlL&EBu;k`3>HaJEV@@3hO{u#0r z2JxEf8s{{CdlsfkPj4JtU(X3=zi+tfbhk%J<+<7W^%sDXj75Uv#rS-itL_*3y|l;F z;0w0XbVNuS_>z;DUe9M+L}xpM+b_2O(_M>>gX)&)NchTr`X{vm+wMj?(X6Q0y@1!P z8ZdF~LS&{ff`=8Zi@Apb8L!v+X^{u;o+o4^NvfMt>cPJqq2sb5&uvQ%$lFsV221fg z0)c61R(}5Ws#4fLDJYk1&`BUd2lkJ`MYqy`Z?o7G0<#nWS=9x9>`+qz7h*YAkw<~N zgJ!a#h8RmBU#?OvRqCI$r?9uT%`cMnZKW={L;1^jS1j1&#r?^c~TqTuJ*Q~Fkc0grckj2r# z*Nh=mji*%s!;m0?k&bQcY|%w@n>U*-H4HyO#%hCjx6J7 z7j!TX2lopa@r`i6kTMATSm*7u`D(#w*@Eh(k9KlKm1Qjv3CC!0H_}cv9`r<}*125G z@#g%Kchi{FSXU!;6jli@$KtvN9zNyLEYVtnqnrdzFV`-y-91xPuY%4h&e&ku*cI4| zlF4!kG;*ykKbyau$=5RK)~^Bbygg9_&$Az-n!V~&l*d8_QircyIEcA=Qpj)4b@R>; zErVkxmg=Z`bpOw$nYK3dMpR3>K+JH$fXzxGn}w(yG2Jq&6B=(1nqc|D(Vw2{?2yVu z7tqdSH0=aEl=bUr+%N`tOg?nz`A=rJl7x0&CBS=}kugqWotB~cYX=^9Pk7!i<20!E zvvq3vJ6G2OWs42$JNIQMWjIi19WMeDmlG2a0(?YrJWTCzvB`0Jyk7YDhx3)3zj-{G zgy2!Ba?jptR)Vr@#VB>~1ht_gm>3vbUUKJg65R8{^oj}coX$G}zNEG)5Wwp(rLGUy z-FL3443oLSp%;UC&%EAoYei;a=2ke?{E1ru?uC3^_k+pK(#;8XB^^&$b)pbCU|04) z_hEF%TGLVh!n#A7f{;m+Z3+UWv&(|ux+;l_A7oKyH-XUI&6}5!wa5Kg;J?6Ul>0fNZz->MU?aEe{1iR%~|A^ z;~Df;UgsM8<~I|2!C0nmiugnJHruDEcbtf`DT^Dv&i)d82m-S6@I|dc1!1BU-*e+V z-~Nv^+rkHfe8ZuTtHjnrThgQ|BAtyT&e6F&{+_ zwpQ}q!xik`V;CAh?my3VV+AoU7Z-P3260s?h$++=_{pVlI_aI^YA`?egeI{WFxvwh_|gvw-UjC64?2@ zg=@gJ5oo}odkK<|-?%5$;qzL~4NQ|l%_~-@yg7eJWACkXL0ba5vl2F$NHnJRs33)e z476r+duVzMM(~ziRgv#`tR2@?tQ%IPx3U>3;U4Tm@r|D)wl}{oyd~g)z41iLOc%eL+B(H{;cyDM@+i5-=KZPYv>>N1l6wA z6SmEX)~q-MZ7mp<*2B|QPtSRz4uAT*iN6L4Q-zcSI{_K%H-e#eE;nr+1Dfbe^s#sB z)CwHb{d*UGnGd9QV)742QM?WU8U%}%g-l~S@sP0&pHBthtmcJ_wTvQ@oSm^rl!_V{MRC59Ocla1I7{b0tAP|?B zUxg!1b5W+N9MZVrT=cvVT$GmhHGKofTL4nOA{P`P7UW-h?;{OX9W2uWa z4>y<|V5rx9G<9uA^h@@1W-;RDKm0rc#$0MSRRim9UB+muC{f%8@{@iKzB_^e*mT67 zO|9Mb>=|(kH%VW>##N!&c05(lrMks!S5H3x%BB%S1`Vq8!jsdl$9aZB|E}%+ zzF+^(YmS1-OVK(EyHDPtIK(w5qd(tu`?qg1_51hN6`BGD9W}|$cyvc{fCjsj*#-jk zvmo_`gq6SEd4vJG_1agrb`v3>upht|+zo{II4g}pK4)z+H5|nLW(Svbqj{JhK0X5l z-Fkfd9d2qiQ?VA|CikaOGuL*{bt4t*Kxa5$##lB+wGs0g`ZhWmQf+YyS;=clXef4Y zA+2@f_Vg;0hXsy%doa3Er<+Gvoz&{(S)-T`vN8=IwDw{$h2Ny=tn4R=Xp$E%z9dgI zXt_;5dS!a84;eK~F)`roCAhT-mf3M;Ys19u`C1JC)#?ULmMIM_!oe=l`4a9beNE?db+PDr=g9I=Fsgn zcO09;56Sx>4X0@r^D3qH)V!^X3oe4J)YSMKuN^D{QLUNyeUY;gqkQ_6>G(>Xpx6qO z{VJH^ESC(#aw1K^tM%X}NIFjPpX5r~<%&MY9+DNI{r+{!rr1YG2Mn-sKcX&I_S;#i z!S2RV{Yq5qBZ&Q0hQ<-s1#u;7({GJ-@h$QBjF{KUgObjZo`?GQ|UmlDvFMME`#j8qmZ0yx|o344Etu2?F9S^Vi zCTxM;H=V%TWw0}No??82$bFcYIzZecqWQnXR=Y0Jnf3B)s? z`)Y46j7I*d!ns<7(SHknVQUr}yf&H>$ej$N#_w97D~Z%xMQEdJVnRlTUsK+N8k5bv z)Y+OskY8hkx_4Ql%8VTeRvVt0^@v~)^6pn$;59JAOzJfLm7X-@>Zr(MpP^WEMJLQBC)Z@I>VvN~VtSu7v3-Vbn2%?j+u}i?Rz^zO zv<0_xr%1S!krsH_gNY^mwfz*LlT^)My~Oj3pZ8tP-6K$u;Uq7uo*EU+QN^rhu5umu(6beV<9GeS(9 z$%sY>g_Tq&f)PiHYO96G`*9Lg0$vZBf*@ei%+LAk+B|WZnuK{DabPx{QACq-i&vY? zu*4P{AeWnwl*Oz3^I;NW>(kRWFMHsjHSxF2dBBD?GL>XK(zP$~z~mIfQ!ghcAn8k& zHD))2&|49`ms1m)LOAQ~10kbzq-iCuy~9=YK6|kpNqzC&K>36--cQ;fK35Yo_??xt zN5!fKuC=etS1_U~3T`exSlLQy778mIT0Q@)Y!=@m3$tv5RJ3X;#6~U3-ATo@C{^fH z^S|+YNrjJ9VvS7vQ)+6kq;}mgT`LKc$N5uU*q6;PZFkB^e|~P@->efD`-H0E%0qn5IDX4*lqM4by6(#(k9T?jO?c{X9k z(H)Kj#7`q;aWn7Wsw%3!tld;DQ4@CLaLEvN)?-JSpb^G_guq(+)~=HuVo@$QGEgxv z-@h}#b>@@;QUcvg>hOsn$2NVZ$=1Hu_ODj_%et#lvtt<_qVGekP#KMU?orLlP66C=gK17zvho zZNhymNIg=BN6y2~FPS(gN?ss>p&jEH+7oGlq|MP1V=j7Asn}AD`lAKW<70ShT#KX~ z%IE!}s*ualjLK&|c4`!(nJ`3A&jw_kVguK`E8C*0JnJ6N+BNghsCh16NpHfUK(KL% zik`>Y$f9Upq~b#_9K#+G(Zt#~lMuhf5Iu>sqH(zN5SIpepjXlMr=2a)@}X$4WHeY5 z-Q0*=qjVd7E+Om^qu7}c;Y<<}8#{6g2ku*}-|TQuzF4xk)1m8XN8J*Jzc#8yUC6U; z{cdRFokf{uHF|e@Jy%e>q05Hssdp{JY~KboDIT0Y`~|;#B{`&&u76;n7#9H>{9Aw4 zDrta%QM$>TSoaCyJmW*S{SI24JPc0;x-Bw>JUm_frfe64z&HXAJvmoD#~;n}I?q8g z(lwclIJYhO$Tr5j$mrlSago37HoD$|ORNUyu4V(Wb0;h?9Gs|t?p`#0Rjy8;2ka=G zYy4hMQ{C^Wz!rCI4_^hSL=$8y7GUH4{ds|{J3gCG&(Ug=<>|S2qSAdla%6Woc-LxC zDnnG!VBytGX(Z59C}wfCO(pg0EjJ;}uy--%R(rTP7v&@M1%D)%K;|2P(c*6ezP@V1 zU)z=RQiuq#*`K#a>kRvLyA4WVyu6%|Y8x5T@`NH($P$L1k?7<1=fFDcDgpWl7Pnj_2~0H*#y=av8H9-J&~RG6*RVgw+={-2PnJ=S7U3G^#VMr!KpRjRBu{(Xc&{k zp|RN9;3>YtNr_^M*!VyOV1c{&v>JgP$sNsQf-w{QemZRD=1y=!4^b zr4LRvj{m8TI^4;4+K$`&h6{qs<~K0R86rVjLJp97^bh8FK ze2!f;WHF^3soC54oSvwcf*!B5e;6I}zoicSWd#CT^9~n0zhCzP_Wj@04$An8+HPM? z{k>8?mWRs@PM~BC0)78p=|hzXe*Znrv#K98U6#Nw0b7RzBZ`+5+`k<2@2M(&R>|z& zT~hS(ZCk7lB$f5@l&aw6G6`!cQEa>nUL`#2;ro^CgR4{8_@5Shi}rW4L6T#SWkJ)L zECp3q5YNXkCp5doJ5ZwL(hc#sdVWSlII!O?PXXFj?b`m>XbDAGt`3a*GLu|sqrYVm zQT+K34ou)!N1TnR*BQdGPZ{%qwMJ9KN`?z-_JRdMhl*T0{bttGnY*U@Akob79L62v z!FQbI3fW1;RKyPjHqE8sw`CRpZaTocJbXX>`tmj$9-Z1`2#B@S% zlr@-~l3o&qT!t)oT(qk&IY|eXG-c{9FcaU;Fso8ov!yke2~>|)MYON$1}J0FR6vVp zoWgfV1sonsAz-PJ1|!#})92=;$D_0Bj4?nM7}_J?uVtc2dY&FkL$5<1EG=ntA3GEp z-#{ruh>q5YhKbpQiN%L~{gF|#>c*hTRCp2fQi-47fa}drkB#=~%tV_FL_7K0A)NUX zH&AnbFWKbBv75CwHMz7AFNo6Ok8e>{O~6ime?lOj?<6D48LB=^mo&qtpFdh z7NKn9iMby~-S`YG%qsVgLcL$V!>6e_76J9N;QYZT62Dpug(*R%-Zo`;cVaX$;A`9> z3j~fu2Va0$>hK8#$orc*lP=#7|-^oHlzmD==F88U@b4LjsdyR+5c$>MS2NO z=`uRy%RQlj?42)t_8{wErq_xn>3iJ)j^SgiaD zPm+DWx=}3W%Bp3KVCyI(w7$1s*tPIX*IgEi`?AH z*{V`PU9?Z3-p~^D6Mv<3x0woer*be!4(|Nt_Mu1}?hSpVD8%Z+QqF`)kqx9_qm2{#`!F*+8rAP z2(#l(O>ap|hEx&gF`idL$yY6vBh!7e$`E}kHSaIcg6__`$qh7BB#jyuR4pNYQu z1uzng34T}!*5q6vLrd$5CQ&LEl2tuJGwoWIiSRzviSZQGvW*y z9KwIZ5z_?;yD1%>p6AJbRNo#F&3CxiM^Nbf8S^Mo?Kl3sFZ$vgW9MX|+P_!qYCw5n z5arl(1cHWcpea1Twv5bfl8JUWNzv79|D_0Pk2XrQuhnr;eGjX~tLl-USv;P}Ufc`>{y(>3?3o zQ5RcrbA~%^KX(XHyNsX4jVr2Q*Ms%>OiyT!ACSdbkH|NLaKr9P6zB)N1+8LAX{3#K zz+b@E>2DJn0MG=pe`<@6D}fj3>bMt6a5S2oR!F<3p0=nqxf`b7ePN-noM4U(qE>g>CMh3Y9k@2(BFg_|b ztip{MtzV(Qu%)BFmG+VW(`$4WOMFTJLa!FIT6N~hpY?@M1a})-eTi9Wi^$YvyFL5Pb`LTt`0Gj`VFxd@**!3! z1OoE;*|ZWiXzPMc?apTlxGY~FVd%R{o1C?aYSh^74di``qA{?1_mC~-Qn#mQX1!ya zE=J_z*KukBujne?ScK3=Hj0zMDi?ATnfHoDzUYR&F{)590L5-UGUh+72WN2?;b9kS zh}9)dRaIOC=e-)5Q*h8X4lpf@ZdYFs6%`|8FQF}3;gKIWSRtb`pPH|i)=?**lBw1_ z_mBI_I&=DX*ZM+)gjRS{e92m(Lxx1Wv4k74TuYk&EqHooquRxalKzrBrvAsaF*^m~ zb+Y702CuC&WO~^i=86N3g;v9oFDstY%yG46c%&?=etlyvoK*_sxS$h!@s9|=$`P45 zxG|An>mH_R1>T2fa|O%-q!psF{(Fp?&cBMEspoQ5#p931b?2sJ2InMl$m?db4Ixyn z|Cm814e+Ep2jA(1cMOisXchn;cEgx-90`xl(k@wB_(>7i*4q5_w%&ZL`7@=Z(3V%3 zklj0=|9l9#w${lsE_vxROxwqoY5E0Itp%yGIijiWzr0D11%E5Rayc-jCA+d&mq{so z?a=>oHJLVrXUQ7WR9rWg_RrY@G}{;9l?Qg=jk%2gRH?N3bNC#t(pOf$crmkL95>3B zt*om)r~~{eGH%;sxZ6hsCW_muV|A8kuQ#5vMxVcC1t8k_FqQ^nP?_i7X^eC4$9Amd zz2)i@uT!da^eg4I3VDAmnDhXXE=3z(uoBF+UZXy5u0)l1dOwynMH>tLBcYLc#-AmP_NU{HB@lIrL{(xQ=t=TY>s zuWIQQ*7_!sFmQvxv8mi~gsW;__4lP0@MT|x7X+WY`~!M|&aGP>bkJdu>NA&~Jgnbt zZ@l9qg{DzB#nX0qG`~xTcqGVIMa*pzB>pP~a|3Yqpe7nUPFjWZsVjUr%=IZmI~iuz zLRpq5h0@NbYl1ArgUWYbWPi0WuC%l*))k;K^*B*MVYu{AUXVsGJ zI&=WWw3pO|=XbWXcq_oO&^>GekSQru2I_QdK@VrlpK{*OSyGEa=v{6K@O8)^MtA zd`oDLDYSQgT=AT}>6bAt+rufdhkZ^K%s<@k8mxVK4>0RqQ-ggGeLL0|U#K=KlQtTHa0!J5LxuVC_F%~Wa^ z=B-Cs^i*bVsT>nSkDrN0&1=$MtJl)j!`v`sl4EVQbqzeBYr}OJ*3Ij@3Csj{Vwkvv z(X8r}ejBbev^mejE70LCpP1#Pa3pj}why{EiM?F}3-dHTYikF#I)yuneenkK%(n;X zAyu48-pRi~j60BIGkT* z>hn>k-Z9|;%=t`fg`Fq|KW9smgU6oG(_O6>5>DtT@8;|lVs5~C6-GS9ah>ynEMKGr zIvvb~9>#9HoYi`L-boRsz@*OCcO;W1k4im2M4wZh5-HgvTnz{T4YUew20qvlIk4ND zg$OmgOim>OE|ZmXml!uitIj$2&ObSOcQrFBV-zGyZFE;R&Q6uF!)DIDoFkT{^r3U1 zs_7oI7{VD9TZOsojXlODy{H%!jXBDGJNDTy_PR!ST@~zl$O{NNv)3esm8mgq5&Hj} zgM;mP>TAo)`?U^hzT$P+0iEnM2oA@$vr; zb9~^;{5fVG5#onGxj%Ja4*Xv^&+I?W<9UO1y%s9K@vIX0c<8+WOAJ@JC##u!U@U3( zumx7tVgDkBff>@%gCI&|x8U~IrlecmG`H#qVl;0^@?M)H=yJQ9i%9Mszq*@rXivC^&ZpcCRtsl=k5&Kzzl=L|AMkAMF6I`ONXl4})af^C0> z#sv2l5@L`%eeM5)h$!p&`Tw(;nel(e>i=)3cgs5+f7==N zA%HL7cVypSljZwMKtSLBYq!s`_jWHQgTR0xN9FQVt%eTk=jr(P-a(ox;9s!vUfwVM zIYVB5!@EX}p8uCypVIx|_j1LKrHjc-+<8C2Lk%7?>eUI$4&U$`-9KBV0_n{U`)3`M zFD<_}ChK?b$417QznngrX+)Rr>mT7N_>n0N0o|e-XZZZX53Ckrh9dsENm<3L6*P9cHj`}2ODA?8A&@&heMM9j|rj>muVw!f-( z&vXa$Ua%=zI3IE+I`b;g=P4S(`8W;y&>Vlij)SfA+jfih4fO3clw~4k&GnAabwtB1EG-lpqW0uVc>I9$8W$YkRvq4atBLTp~)=h z2cwTrP6QCo`w~*|`wVF?M~tbNRfC+0gxGE$PFz&a3#V$7{Fuw?I$!yC+oYtU;bvK( z31|V6hpc(qSlzI2Dj6)DM2aufUt!@iHjxU&|;dq*c9~-Ra8LOXA}-_2=JWBGc`yt~-Js2HN^;7x1Z z*B{6Q7qY@C?oK*5UNIxXQhdw6@-KQ`V{}`tUPz&#T$1n4ziKqn|C=kE@own}ykX}4 z@~G+g%tXRC)EK_S4$GzZt=iS}XS-8e`?L^Xl7MV(w=~1C?8&{3)8gVW1D4kF8Jk`CQc_Y~) zXVPEwz2O9|P@_BxklrqKR<7OI77QERnaLjc98o!c`hM#^6MwrTwG+=WH**;+weU^sRfr7n|6|n7nIqD5qiRlQzK*;pa?_t}2Ji0v? zHK@e#pgG$`do7Q~EP4S~TyAljfIW);ASEV9f?KxBEe=H+)A!Z_4NQsb^p65_iU zI?>^2Rh%x>N6WBCf~-jzINAHls$mw~tS-CZ^9fpIl^Pr-Wib>@dkC8-)4o!r3V@O45_wT zxm+_P0IOXza}sd&p2|MDPN)EHhMlsj<^_0vXGl8Ot4&=tR%b>jmBWZ2QlUzUp@K=G z`%ztBy6Nb7B@NNsau`@%A}z+zC=N%|kPjC(qUhcwNle?@4DnV*BB(H?CYVTu4I3qv z(xRdqK(v&X@)f`wcxIbuvoj!G7_);NC0Ak$=(0|<9O78rc<(JP-P=6myLkH+p2&zh z!9px90K`t(h((QNUk?_ozV0yEeXl!^ZaNUg+OGkjuRJIUrkbz$T7}RiRtfH)MJ470 z(-mE)UGxr8Gb^s3pSo2w5#cnRAHDcev3bBnuEln0)RRhR9;k1(E0|3))a%d^eHLkD zbY}44@ERZF`Y#sDS3^Qr7=($@Sf|6-Q0%3N(S|db(u^4`EU+&N`WoU9kxxr>n9%z+ ziRPHV4K~n>T5)+#?+b`C0bFkyPpM<)On>u1FT1r{W^Tv5al^uGESA>L^y9p`RUvc zR`D%?Jh3DokU4tunFi!nF_7)cfMU(OZl!RSPO`}yA~;W^81v3`(7C;ibMij~U1c$h z9?`U9%@(FIS(`(Yo%lkt8!YL)9~%kr6lv(7Up*?_SO{|E75^z&@B0U@f>2=U3|jqO zNDCCRYB^_(wvUslp%6p|$5w}$F8xZI1N>Z@bzM%Z^VHpvp6E~0&h*7s&<2DQhoz-5 zdhafqXvyS^Lvc zD!ZJAQF#=iZ&*U@6(pJF*M4{2Gmr&AZsWT~Uj%T2TBQ?y9%xBTzFwO1h7)|Y9v{aQ zwwO)#?d?X)cY-|CwCSD(u}wpn+#*8NrFs}_(NtvwWdNd`CVI3!E3`P%Ml>yE)m@N% zSznQ3 zQ2b4NgdW6zi7HNCs@ah42TTa<Fp7>F3z(vgyS=@Zj}UF zM2`)+_(JT1DjHDWU z4Jt_mvmdb(QIJ2j>f4l|KE_MsJ&Y@=bTn-TnLV*QRRiFH>}BMNWTx|;2<4B9PMVM`dqnPOkOVi$BId}5a9g)rpwAAp&*=q2hyHxqXIdLf(|#Q zke0_ftXWwv76y+cRWz{Oj2UgDi-Bjki)(T2REB6L(_RzrYg8n05Lam3(XOpOb5#7h z_+hB_ndC9Vz3bkJu%MB%6O6*?+FY8Y{^n1}wIE3h;dx<$7SxsBqj?xd;wk;PsC^Cc4L%aXGS${dK} z9?1o_1yLooOJpKT-)bs87c(?0YIDS=zarioui;%p@EHFRD)F$TCpMikbvQqrfrRgW z^jvWG%aE%(9b>UB@q0d}>~U|VpF=vRSx|KE`CNx~Qe?_{xc5wd$!l`4fn*X0{JI z3=Jpv+6HBjs{_LsKOOV$p#5}Ar2Ii?I9qnZVcvj81BXFm?44EOAO!!4svVfY2VTvt zTaq7sOu+p?W|7)W=6GN7!vxc&uO3RtRx_qh5>d`CN9z1hUwC2j+Ozw*oL68lEi!Gu zQX+Bb3Uv5Q!nVz-7xc$1lUluF!KnImPj0;XsKECABa#JDU$wmn^rD@{a@7QikCy4x z30to(l7zv!h3ntsw8cmB$E`|YRb!I{WwzV|)8V4+wEB=mIMmcyvY2HM4xEJF-jqUP zytP0r&?*1}#41DTjlS-|CX%9e3HqM;IrGgvWs>2eajtktu~+UW)$$S4s35)oGHD$I za4}vx|F?v=&7YWdrn5vff5*C}HOqC0X5$$FjmE^Vs;%l&8DX;!8TvG6$V{jPKvkkL z&CKnVN0)|yasHn2b>Ar@FbqwIJ1zCO*oika#n8ZaZSdae`t{kdNWpa6mshzmH1B`0 z|L^ISRIY>S{~~AB|CO8>Ia&W_AbqPd9Z%B*w|h==1);mxEgiTR156HL${~0kOuJ*p zQ$tJs+aDxpFZzjt~*{nH9o(| z{W}5zybS*R<>O5J{@B(`9SP1s9SLbtk@Zy;-JAlf2B(w5t( z&SZNy(@$|08Oh|ZV@5Jyubd_qL87sp0g&dppj9CVdkRHA#Py5rwV#oOvM)hnm$=#H|@tx7NRrxM)PcT^vrDS{7vW@yU})KCXG=t)e=J)WCt^(5-YwWtp#orouxEu^3N4^0)%fl4AMLB$$0s*u95iT#5igLMCpb$m5aWmb5EW(yT&!Esys>)#YUB5F zrVVnP%7BiCUAARje23{{n$Ry<$YG?=d-a@!GDy$-2BSF&nG!k;?;^bR`&K5NX!o5f zNFF^pZy&eb+$^MTXR-^r`bOBHac=8C4=|<8FSH^!HkR+;8e83}%Y|4b-FG&0?v&D# zDnHMVA{W_oCcN7K_QcGR7xkgoG%;CyssS-!npv3!f#|W9JEsQ!1_b69a!aL`X>p)Q zG)AnT13?}lZ1trnuc9WdIDQ)?=$J74a%_%m=2Vnb;q}?6Hw^SkIKtd?p;9Ns+d(67 zSH~jJ)(KMFd>F0SIwoG3V07@`F(r`B&NWD7=PItvLXEuXM7mAvlDCNDR%3z>3yPMc zW7V57#pkJstN_w=t$DVUMBnDM(-VgmFs{zG+=zddmOJXf=agg@FJ^34t^ygZ3sl5+gS5 zkSI;*fdc!`4rkq%(q;-@_ST6Gd*>K_Y@Kk=pWk(*8q%rFwE2;FIGiaTf`K^djH^IJ zbH?{ev43fu*k-?WlTV{E&*tE!a@R z?kp0Uo*Zx_@|mv$Ad*um6wg$gkA{O@t2`vY`8I(^bC-?_L%M8ebzOrJr=e7Ri{?Aj zY4VL$H_p#4=%n^?>P8`G^oDcEDvyP6q?gE?@{cb z>|qr{Qi$lC1el{u7e4+?;u-eRi9@(}UPQPZzo~dIfZlPLXT=nir-~afEPpoWNRBsm znE0Z0A^)Ow*aE=u-6A8vP|pTBfZ)+sw)qINQ{gmR`);2ueNcwM=^K0mIz(m ztlbKs@zQ=!eoqR?x*N_B*~NG^FUpmeAO=+~RX@!uXq7AxZ-7=XU0ek7XbgfPF;Av? zi`u1>t46pe)SqhX>se=L?569tAfU)- zWo``d+trfIq1GzMe=yr5@@xjmNn7`d&WbuWM!!}x6!$YrqE`5nQ;P&>e{w6OA->NswdRE^}b=+mO_Y~d~Lamz}`R`9b5qUiVw5Hjlm8DB_N02Py z)s~n^MIEwMjj5?&e9U$gN%q7+{so(nF1X|8CwP{coWSCyT6$4!JncSc8FiEpe?7}1 z^BihEAY8&lq#QbEjaE=?x19b_?Ax1}h*u4Gj)Vj1Z}7;Tlwc4&5Yb@NUBrS9cj?E# zkZ_`MIepmq>3Dc3ly1=|kw=l5dA?DY^Be{*Tvq&~9So6dkC>U7tN*~GP}+*F^a&Q! z!b$n17~gYtOXQ118p9FjW-oX zJ4#|tt-bWkW)|odSS!WuCzu3jUafetEPaX_(n;jY1bdF+_jT1Z8W)sB@M6xnnzwEZKR;i<0R?`1odTJ&F6xQ7-3b#wp3uIhkC9obS6PL|{-^WVHQ}5| z%%d=P?mEz^R#m!S=A0}<;7m};NUk4@J~E=4chV;o)@pMpky_kBkCKek6@Xb_b5BsX zJ;S_%N-|aaU1sd0X&`8JYjS$wEXUO2p39CTMu?*JbvT`w$k$)$Xvrh90AE@uZ{n8F zal=OpmCycWL0pmE#WF`niq1JAe=yThtozq@+(_gMJ>y^MrdbkdJ2eY-Vav5epg z0_S11(meEY9NQr;`f|HZ_CPqmzkOA;?>Bh&=;C_xhg40-6717bF=5{sPj8v$@1y89 zY;sv0GS!cX7{U3OIsj(z6tsz6*PmiP$nf~zOD}9LBEk-WUpb50d0(e9uD+*O;X(c< z{nvvP5AgRA&s5YIKAz#E#suff@(El1sE<#l*r##brUQpMdslA8&H0hr(|xDs+mAx` z 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 Wr!Umrfe-`&J&_~?0#$S%g#Q5lOPxIc literal 0 HcmV?d00001 diff --git a/Assignment 4/src/ChallengeDecision/Arbitrer.java b/Assignment 4/src/ChallengeDecision/Arbitrer.java new file mode 100644 index 0000000..91c265a --- /dev/null +++ b/Assignment 4/src/ChallengeDecision/Arbitrer.java @@ -0,0 +1,84 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package ChallengeDecision; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +/** + * + * @author robson + */ +public class Arbitrer { + + public static ChallengeResult challengeDecide( ChallengeEntitySet challenger, ChallengeEntitySet challengee ) { + ChallengeResult challengeResult = new ChallengeResult( false ); + int i = 0, j = 0, challengerSize, challengeeSize; + FightResult fr; + ChallengeEntity tempCE; + Boolean challengerTurn = true; + double challengerPower = 0; + List> resultingResources = new ArrayList<>(); + + challengerSize = challenger.getEntityAttackList().size(); + challengeeSize = challengee.getEntityDefenseList().size(); + + for ( ChallengeAttack ce : challenger.getEntityAttackList() ) + challengerPower += ce.getProperty().doubleValue(); + + if ( challengerSize > 0 ) { + tempCE = challenger.getEntityAttackList().get( i++ ); + + while ( i < challengerSize && j < challengeeSize ) { + if ( challengerTurn ) { //tempCE is the challenger + fr = tempCE.fight( challengee.entityDefenseList.get( j ) ); + challengerTurn = fr.getResult(); + tempCE = fr.getChallengeEntity(); + if ( challengerTurn ) + j++; + else i++; + } else { //tempCE is the challengee + fr = challenger.getEntityAttackList().get( i ).fight( tempCE ); + challengerTurn = fr.getResult(); + tempCE = fr.getChallengeEntity(); + if ( challengerTurn ) + j++; + else i++; + } + } + + // check what is remaining + + if ( i < challengerSize ) { // 1 - there are still reamaining challengers + double sum = 0; + double proportion; + + while ( i < challengerSize ) { + sum += challenger.getEntityAttackList().get( i++ ).getProperty().doubleValue(); + } + + proportion = sum / challengerPower; + + challengee.getEntityResourceList().forEach((ce) -> { + resultingResources.add( new ChallengeResource( ce.getProperty().doubleValue() * ( proportion * getLootChance() ) ) ); + }); + + challengeResult = new ChallengeResult( true, resultingResources ); + } else if ( j < challengerSize ) { // 2 - there are still reamaining challengees + // no resources got back from attack + challengeResult = new ChallengeResult( false ); + } + + } + + return challengeResult; + } + + private static double getLootChance() { + return ( ThreadLocalRandom.current().nextInt(1, 10 ) + 10 ) / 20.0; + } +} diff --git a/Assignment 4/src/ChallengeDecision/ChallengeAttack.java b/Assignment 4/src/ChallengeDecision/ChallengeAttack.java new file mode 100644 index 0000000..53c22c0 --- /dev/null +++ b/Assignment 4/src/ChallengeDecision/ChallengeAttack.java @@ -0,0 +1,104 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package ChallengeDecision; + +import java.util.concurrent.ThreadLocalRandom; + +/** + * + * @author robson + * @param + */ +public class ChallengeAttack extends ChallengeEntity { + T attack; + V hit; + + public ChallengeAttack( T attack, V hit ) { + this.attack = attack; + this.hit = hit; + } + + public ChallengeAttack( T attack ) { + this.attack = attack; + } + + @Override + public T getProperty() { + return this.attack; + } + + @Override + public void setProperty( T attack ) { + this.attack = attack; + } + + @Override + public V getHitPoints() { + return hit; + } + + @Override + public void setHitPoints( V value ) { + hit = value; + } + + + @Override + public int compare( ChallengeEntity ce ) { + double result; + result = this.attack.doubleValue() - ce.getProperty().doubleValue(); + + if ( result == 0 ) + return 0; + else if ( result > 0 ) + return 1; + else return -1; + } + + @Override + public double checkDifference( ChallengeEntity ce ) { + return this.attack.doubleValue() - ce.getProperty().doubleValue(); + } + + public FightResult fight( ChallengeEntity ce ) { + Boolean fightOutcome = false; + ChallengeEntity re; + + double result; + result = ( attack.doubleValue() + hit.doubleValue() ) - ( ce.getProperty().doubleValue() + ce.getHitPoints().doubleValue() ); + + if ( result > 0 ) { + if ( result / ( attack.doubleValue() + hit.doubleValue() ) > 0.2 ) { // it won by a large difference + fightOutcome = ThreadLocalRandom.current().nextInt(1, 100) > 10; //attack success + if ( fightOutcome ) { //attack success -> attacker remains + re = new ChallengeAttack<>( attack.doubleValue() ); + re.setHitPoints( ce.getHitPoints().doubleValue() * 0.75 ); + } else { //attack fail -> defense remains + re = new ChallengeDefense<>( ce.getProperty().doubleValue() ); + re.setHitPoints( ce.getHitPoints().doubleValue() * 0.3 ); + } + } else { // it won by a small difference + fightOutcome = ThreadLocalRandom.current().nextInt(1, 100) > 50; //attack success + if ( fightOutcome ) { //attack success -> attacker remains + re = new ChallengeAttack<>( attack.doubleValue() ); + re.setHitPoints( ce.getHitPoints().doubleValue() * 0.5 ); + } else { //attack fail -> defense remains + re = new ChallengeDefense<>( ce.getProperty().doubleValue() ); + re.setHitPoints( ce.getHitPoints().doubleValue() * 0.5 ); + } + } + } else { // attack fail + re = new ChallengeDefense<>( ce.getProperty().doubleValue() ); + if ( ( result * -1 ) / ( ce.getProperty().doubleValue() + ce.getHitPoints().doubleValue() ) > 0.5 ) { // it defended by a large difference -> it keeps 80% of health + re.setHitPoints( ce.getHitPoints().doubleValue() * 0.75 ); + } else { // it defended by a small difference -> it keeps 505 of health + re.setHitPoints( ce.getHitPoints().doubleValue() * 0.5 ); + } + } + + return new FightResult( fightOutcome, re ); + } +} diff --git a/Assignment 4/src/ChallengeDecision/ChallengeDefense.java b/Assignment 4/src/ChallengeDecision/ChallengeDefense.java new file mode 100644 index 0000000..bc02c6a --- /dev/null +++ b/Assignment 4/src/ChallengeDecision/ChallengeDefense.java @@ -0,0 +1,68 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package ChallengeDecision; + +/** + * + * @author robson + * @param + */ +public class ChallengeDefense extends ChallengeEntity { + T defense; + V hit; + + public ChallengeDefense( T defense ) { + this.defense = defense; + } + + public ChallengeDefense( T defense, V hit ) { + this.defense = defense; + this.hit = hit; + } + + @Override + public T getProperty() { + return this.defense; + } + + @Override + public void setProperty( T defense ) { + this.defense = defense; + } + + @Override + public V getHitPoints() { + return hit; + } + + @Override + public void setHitPoints( V value ) { + hit = value; + } + + @Override + public int compare( ChallengeEntity ce ) { + double result; + result = this.defense.doubleValue() - ce.getProperty().doubleValue(); + + if ( result == 0 ) + return 0; + else if ( result > 0 ) + return 1; + else return -1; + } + + @Override + public double checkDifference( ChallengeEntity ce ) { + return this.defense.doubleValue() - ce.getProperty().doubleValue(); + } + + @Override + public FightResult fight(ChallengeEntity ce) { + return new FightResult( false, new ChallengeDefense( 0 ) ); + } + +} diff --git a/Assignment 4/src/ChallengeDecision/ChallengeEntity.java b/Assignment 4/src/ChallengeDecision/ChallengeEntity.java new file mode 100644 index 0000000..16d3b41 --- /dev/null +++ b/Assignment 4/src/ChallengeDecision/ChallengeEntity.java @@ -0,0 +1,27 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package ChallengeDecision; + +/** + * + * @author robson + */ +public abstract class ChallengeEntity { + + public abstract T getProperty(); + + public abstract void setProperty( T property ); + + public abstract V getHitPoints(); + + public abstract void setHitPoints( V value ); + + public abstract int compare( ChallengeEntity ce ); + + public abstract FightResult fight( ChallengeEntity ce ); + + public abstract double checkDifference( ChallengeEntity ce ); +} diff --git a/Assignment 4/src/ChallengeDecision/ChallengeEntitySet.java b/Assignment 4/src/ChallengeDecision/ChallengeEntitySet.java new file mode 100644 index 0000000..9752248 --- /dev/null +++ b/Assignment 4/src/ChallengeDecision/ChallengeEntitySet.java @@ -0,0 +1,56 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package ChallengeDecision; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author robson + */ +public class ChallengeEntitySet { + List> entityAttackList; + List> entityDefenseList; + List> entityResourceList; + + public ChallengeEntitySet( List> entityAttackList, List> entityDefenseList, List> entityResourceList ) { + this.entityAttackList = entityAttackList; + this.entityDefenseList = entityDefenseList; + this.entityResourceList = entityResourceList; + } + + public ChallengeEntitySet() { + entityAttackList = new ArrayList(); + entityDefenseList = new ArrayList(); + entityResourceList = new ArrayList(); + } + + public void setEntityAttackList( List> entityAttackList ) { + this.entityAttackList = entityAttackList; + + } + + public void setEntityDefenseList( List> entityDefenseList ) { + this.entityDefenseList = entityDefenseList; + } + + public void setEntityResourceList( List> entityResourceList ) { + this.entityResourceList = entityResourceList; + } + + public List> getEntityAttackList(){ + return this.entityAttackList; + } + + public List> getEntityDefenseList(){ + return this.entityDefenseList; + } + + public List> getEntityResourceList(){ + return this.entityResourceList; + } +} diff --git a/Assignment 4/src/ChallengeDecision/ChallengeResource.java b/Assignment 4/src/ChallengeDecision/ChallengeResource.java new file mode 100644 index 0000000..9556efc --- /dev/null +++ b/Assignment 4/src/ChallengeDecision/ChallengeResource.java @@ -0,0 +1,75 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package ChallengeDecision; + +/** + * + * @author robson + * @param + */ +public class ChallengeResource extends ChallengeEntity { + T resource; + V hit; + + public ChallengeResource() { + } + + public ChallengeResource( T resource ) { + this.resource = resource; + } + + public ChallengeResource( T resource, V hit ) { + this.resource = resource; + this.hit = hit; + } + + @Override + public T getProperty() { + return this.resource; + } + + @Override + public void setProperty( T resource ) { + this.resource = resource; + } + + @Override + public V getHitPoints() { + return hit; + } + + @Override + public void setHitPoints( V value ) { + hit = value; + } + + + @Override + public int compare( ChallengeEntity ce ) { + double result; + result = this.resource.doubleValue() - ce.getProperty().doubleValue(); + + if ( result == 0 ) + return 0; + else if ( result > 0 ) + return 1; + else return -1; + } + + @Override + public double checkDifference( ChallengeEntity ce ) { + return this.resource.doubleValue() - ce.getProperty().doubleValue(); + } + + @Override + public FightResult fight(ChallengeEntity ce) { + return new FightResult( false, new ChallengeDefense( 0 ) ); + } + + public void print() { + System.out.println( "Resource: " + resource + " / Hit: " + hit ); + } +} diff --git a/Assignment 4/src/ChallengeDecision/ChallengeResult.java b/Assignment 4/src/ChallengeDecision/ChallengeResult.java new file mode 100644 index 0000000..1c7b7ff --- /dev/null +++ b/Assignment 4/src/ChallengeDecision/ChallengeResult.java @@ -0,0 +1,43 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package ChallengeDecision; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author robson + */ +public class ChallengeResult { + Boolean challengeWon; + List> loot; + + public ChallengeResult( Boolean won, List> loot ) { + challengeWon = won; + this.loot = loot; + } + + public ChallengeResult( Boolean won ) { + challengeWon = won; + loot = new ArrayList<>(); + } + + public Boolean getChallengeWon() { + return challengeWon; + } + + public List> getLoot() { + return loot; + } + + public void print() { + System.out.println( "Result: " + challengeWon ); + for ( ChallengeResource e : loot ) { + e.print(); + } + } +} diff --git a/Assignment 4/src/ChallengeDecision/FightResult.java b/Assignment 4/src/ChallengeDecision/FightResult.java new file mode 100644 index 0000000..0ea9187 --- /dev/null +++ b/Assignment 4/src/ChallengeDecision/FightResult.java @@ -0,0 +1,28 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package ChallengeDecision; + +/** + * + * @author robson + */ +class FightResult { + Boolean result; + ChallengeEntity ce; + + public FightResult( Boolean result, ChallengeEntity ce ) { + this.result = result; + this.ce = ce; + } + + public Boolean getResult() { + return this.result; + } + + public ChallengeEntity getChallengeEntity() { + return ce; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/Main.java b/Assignment 4/src/ca/cosc3p91/a4/Main.java new file mode 100644 index 0000000..e06aa2f --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/Main.java @@ -0,0 +1,11 @@ +package ca.cosc3p91.a4; + +import ca.cosc3p91.a4.game.GameEngine; + +public class Main { + + public static void main(String[] args) { + new GameEngine().run(); + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/game/GameEngine.java b/Assignment 4/src/ca/cosc3p91/a4/game/GameEngine.java new file mode 100644 index 0000000..fba0bc3 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/game/GameEngine.java @@ -0,0 +1,265 @@ +package ca.cosc3p91.a4.game; + +import ca.cosc3p91.a4.gameobjects.*; +import ca.cosc3p91.a4.gameobjects.factory.BuildingFactory; +import ca.cosc3p91.a4.gameobjects.factory.InhabitantFactory; +import ca.cosc3p91.a4.player.*; +import ca.cosc3p91.a4.userinterface.GameDisplay; +import ca.cosc3p91.a4.util.ChallengeAdapter; + +import java.beans.XMLEncoder; +import java.io.BufferedOutputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Random; + +public class GameEngine implements Runnable { + + public static final double GOLD_FACTOR = 5; + public static final double IRON_FACTOR = 1; + public static final double WOOD_FACTOR = 0.1; + + private Player player; + boolean running = true; + + private float pillageFactor = 0.5f; + + private int currentTime; + + private final Random random = new Random(System.nanoTime()); + + public Map map; + public GameDisplay view; + + public GameEngine() { + player = new Player(); + map = generateInitialMap(); + } + + public void attackVillage(Map map) { +// int defenseiveCounter = 1; +// int inhabCounter = 0; +// for (Building b : map.contains) +// if (b instanceof DefenseBuilding) +// defenseiveCounter++; +// for (Inhabitant i : map.inhabitants) +// if (i instanceof Infantry) +// inhabCounter++; +// pillageFactor = (float) inhabCounter / (float) defenseiveCounter; +// if (pillageFactor < 0) +// pillageFactor = 0; +// if (pillageFactor > 1) +// pillageFactor = 1; +// this.map.getTownHall().addWood((int) (map.getTownHall().getCurrentWood() * pillageFactor)); +// this.map.getTownHall().addIron((int) (map.getTownHall().getCurrentIron() * pillageFactor)); +// this.map.getTownHall().addGold((int) (map.getTownHall().getCurrentGold() * pillageFactor)); + ChallengeAdapter adapter = new ChallengeAdapter(this.map); + adapter.attack(map); + } + + private Map generateInitialMap(){ + return new Map(new CasaDeNarino(1, VillageHallStages.villageStages[0]), 30); + } + + public Map generateMap() { + Map initialMap = generateInitialMap(); + + CasaDeNarino hall = initialMap.getTownHall(); + + // generate a similar town hall + int levelChange = random.nextInt(2) - 1; + int nextLevel = this.map.getTownHall().getLevel() + levelChange; + // only need to change if the new village level is higher than initial + if (nextLevel > 0) + hall.upgrade(VillageHallStages.villageStages[nextLevel]); + + hall.addWood(this.map.getTownHall().getCurrentWood() + random.nextInt(500) - 150); + hall.addIron(this.map.getTownHall().getCurrentIron() + random.nextInt(500) - 150); + hall.addGold(this.map.getTownHall().getCurrentGold() + random.nextInt(500) - 150); + + int buildingCount = this.map.contains.size(); + + int saulGoodMines = 0; + int ironMines = 0; + int woodMines = 0; + int archerTowers = 0; + int cannons = 0; + + // count buildings in our map + for (Building b : this.map.contains){ + if (b instanceof SaulGoodMine) + saulGoodMines++; + else if (b instanceof IronMine) + ironMines++; + else if (b instanceof LumberMine) + woodMines++; + else if (b instanceof ArcherTower) + archerTowers++; + else if (b instanceof Cannon) + cannons++; + } + + // variate + saulGoodMines += random.nextInt();; + ironMines += random.nextInt(); + woodMines += random.nextInt(); + archerTowers += random.nextInt(); + cannons += random.nextInt(); + + // generate a map with a similar number of buildings + for (int i = 0; i < Math.max(buildingCount + random.nextInt(5) - 2, 1); i++) { + int selection = random.nextInt(5); + // select a random building. Doing it this way because if we build based on buildings we have + // then the maps will be VERY boring as they would be all the same + switch (selection) { + case 0: + initialMap.contains.add(new LumberMine(ResourceStages.woodStages[random.nextInt(ResourceStages.woodStages.length)])); + break; + case 1: + if (ironMines > 0) + initialMap.contains.add(new IronMine(ResourceStages.ironStages[random.nextInt(ResourceStages.ironStages.length)])); + break; + case 2: + if (saulGoodMines > 0) + initialMap.contains.add(new SaulGoodMine(ResourceStages.goldStages[random.nextInt(ResourceStages.goldStages.length)])); + break; + case 3: + initialMap.contains.add(new ArcherTower()); + break; + case 4: + initialMap.contains.add(new Cannon()); + break; + default: + break; + } + } + + return initialMap; + } + + public int getScore(Map map) { + CasaDeNarino hall = map.getTownHall(); + int score = (int)(hall.getCurrentGold() * GOLD_FACTOR + hall.getCurrentIron() * IRON_FACTOR + hall.getCurrentWood() * WOOD_FACTOR); + score += map.contains.size(); + score += map.inhabitants.size(); + return score; + } + + @Override + public void run() { + String in; + + view = new GameDisplay(); + view.printVillageState(this.map,"Current Village State"); + view.printGameMenu(); + + Map exploringMap = null; + boolean deleteMyHeart = true; + while (running) { + for (Building b : this.map.contains){ + if ((b instanceof ResourceBuilding)) { + ((ResourceBuilding) b).update(this.map.getTownHall()); + } + } + try { + if ((in = view.nextInput()) != null) { + String[] args = in.split(" "); + + view.printLastInput(); + // reset the map if they aren't exploring + if (in.charAt(0) != '4') + deleteMyHeart = true; + switch (in.charAt(0)) { + case '1': + if (args.length < 2) { + System.err.println("Args must include type!"); + } else { + BuildingFactory bfactory = new BuildingFactory(); + Building type = bfactory.getBuilding(args[1]); + if (type == null) + System.err.println("Args are not a valid building!"); + else if (this.map.build(new Tile(), type) ) { + System.out.println(type.getClass().getSimpleName()+" successfully built\n"); + } else + System.out.println("Missing resources to build "+type.getClass().getSimpleName()); + } + break; + case '2': + if (args.length < 2) { + System.err.println("Args must include type!"); + } else { + InhabitantFactory ifactory = new InhabitantFactory(); + Inhabitant type = ifactory.getInhabitant(args[1]); + if (type == null) + System.err.println("Args are not a valid inhabitant!"); + else if (this.map.train(type) ) { + System.out.println("successfully trained a(n) "+type.getClass().getSimpleName()); + } else System.out.println("Missing gold to train "+type.getClass().getSimpleName()); + } + break; + case '3': + if (args.length < 2) { + System.err.println("Args must include type!"); + } else { + int unitIndex = Integer.parseInt(args[1].substring(1)); + + if (unitIndex < 0) { + System.err.println("Invalid Index"); + break; + } + + if (args[1].contains("i") && (unitIndex < map.inhabitants.size()) ) { + if ( map.upgradeInhabitant(unitIndex) ) { + System.out.println("successfully upgraded a(n) "+map.inhabitants.get(unitIndex).getClass().getSimpleName()); + } else System.out.println("Missing Resources to upgrade "+map.inhabitants.get(unitIndex).getClass().getSimpleName()); + } else if (args[1].contains("b") && (unitIndex < map.contains.size()) ) { + if ( map.upgradeBuilding(unitIndex) ) { + System.out.println("successfully upgraded a(n) "+map.contains.get(unitIndex).getClass().getSimpleName()); + } else System.out.println("Missing Resources to upgrade "+map.contains.get(unitIndex).getClass().getSimpleName()); + } else { + System.err.println("Args are not a valid unit!"); + } + } + break; + case '4': + deleteMyHeart = false; + exploringMap = generateMap(); + view.printVillageState(exploringMap,"Other Village"); + break; + case '7': + if (exploringMap != null) + attackVillage(exploringMap); + else + System.out.println("Error: Explored map is null. Have you explored last command?"); + break; + case '5': + view.printVillageState(this.map,"Home Village"); + break; + case '6': + System.exit(0); + break; + default: + break; + } + view.printGameMenu(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + if (deleteMyHeart) + exploringMap = null; + } + save("test.xml", this.map); + } + + public void save(String file, Map map){ + try (XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(Files.newOutputStream(Paths.get(file))))) { + map.contains.forEach(encoder::writeObject); + map.inhabitants.forEach(encoder::writeObject); + System.out.println("Wrote map"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/game/Map.java b/Assignment 4/src/ca/cosc3p91/a4/game/Map.java new file mode 100644 index 0000000..cc9497e --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/game/Map.java @@ -0,0 +1,142 @@ +package ca.cosc3p91.a4.game; + +import ca.cosc3p91.a4.gameobjects.*; + +import java.util.ArrayList; +import java.util.List; + +public class Map { + + static int MAXSIZE = 50; + + private CasaDeNarino townHall; + + private int guardTime; + + public List contains; + + public List inhabitants; + + public Map(CasaDeNarino casaDeNarino, int gTime) { + contains = new ArrayList<>(); + inhabitants = new ArrayList<>(); + this.townHall = casaDeNarino; + this.contains.add(casaDeNarino); + this.inhabitants.add(new Worker()); this.inhabitants.add(new Worker()); + this.inhabitants.add(new Collector()); + this.guardTime = gTime; + } + + public void move(Infantry i, Tile t) { + + } + + public void inRange(Infantry i, Building b) { + + } + + public boolean build(Tile t, Building b) { + int goldCost = b.getStage().getCost(SaulGoodMine.resource); + int ironCost = b.getStage().getCost(IronMine.resource); + int woodCost = b.getStage().getCost(LumberMine.resource); + CasaDeNarino hall = getTownHall(); + if (hall.getCurrentGold() >= goldCost && hall.getCurrentIron() >= ironCost && hall.getCurrentWood() >= woodCost) { + if(!hall.addGold(-goldCost)) + throw new RuntimeException("Unable to subtract gold despite valid check!"); + if(!hall.addIron(-ironCost)) + throw new RuntimeException("Unable to subtract iron despite valid check!"); + if(!hall.addWood(-woodCost)) + throw new RuntimeException("Unable to subtract wood despite valid check!"); + contains.add(b); + return true; + } else + return false; + } + + public boolean upgradeBuilding(int buildingIndex) { + + if (buildingIndex >= contains.size()) return false; + + Building b = contains.get(buildingIndex); + + int currentLevel = b.getLevel(); + CasaDeNarino hall = getTownHall(); + + if (currentLevel >= 2) return false; + else if (b instanceof Farm) return true; + + int goldCost = b.getUpgradeStage().getCost(SaulGoodMine.resource); + int ironCost = b.getUpgradeStage().getCost(IronMine.resource); + int woodCost = b.getUpgradeStage().getCost(LumberMine.resource); + + if (hall.getCurrentGold() >= goldCost && hall.getCurrentIron() >= ironCost && hall.getCurrentWood() >= woodCost) { + + if (b instanceof DefenseBuilding) { + ((DefenseBuilding) b).upgrade( + (b instanceof ArcherTower) ? (DefenseStages.archerTowerStages[currentLevel + 1]) : + (DefenseStages.cannonStages[currentLevel + 1]) + ); + } else if (b instanceof ResourceBuilding) { + ((ResourceBuilding) b).upgrade( + (b instanceof IronMine) ? (ResourceStages.ironStages[currentLevel + 1]) : + (b instanceof SaulGoodMine) ? (ResourceStages.goldStages[currentLevel + 1]) : + (ResourceStages.woodStages[currentLevel + 1]) + ); + } else { + b.upgrade(VillageHallStages.villageStages[currentLevel + 1]); + } + } else return false; + + return true; + } + + public boolean upgradeInhabitant(int inhabitantIndex) { + + if (inhabitantIndex >= inhabitants.size()) return false; + + Inhabitant i = inhabitants.get(inhabitantIndex); + + int currentLevel = i.getLevel(); + CasaDeNarino hall = getTownHall(); + + if (currentLevel >= 2 || hall.getCurrentGold() < 5) return false; + + i.setLevel(++currentLevel); + hall.addGold(-5); + + if (i instanceof Infantry) { + ((Infantry) i).setHealth(((Infantry) i).getHealth() + 1); + ((Infantry) i).setDamage(((Infantry) i).getDamage() + 1); + ((Infantry) i).setRange(((Infantry) i).getRange() + 1); + } else if (i instanceof Collector) { + ((Collector) i).setCollectionRate(((Collector) i).getCollectionRate() + 1); + } + + return true; + } + + public boolean train(Inhabitant i) { + CasaDeNarino hall = getTownHall(); + int goldCost = i.getCost(); + + if (hall.getCurrentGold() >= goldCost) { + if(!hall.addGold(-goldCost)) + throw new RuntimeException("Unable to subtract gold despite valid check!"); + inhabitants.add(i); + return true; + } else return false; + } + + public int getGuardTime() { + return guardTime; + } + + public void setGuardTime(int gTime) { + this.guardTime = gTime; + } + + public CasaDeNarino getTownHall(){ + return townHall; + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Archer.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Archer.java new file mode 100644 index 0000000..1c2a5c6 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Archer.java @@ -0,0 +1,38 @@ +package ca.cosc3p91.a4.gameobjects; + +public class Archer extends Infantry { + + static int cost = 4; + + private int lvl = 0; + + public Archer() { + super(90, 2, 10); + } + + @Override + public void move(Tile t) { + + } + + @Override + public void getPosition() { + + } + + @Override + public int getLevel() { + return lvl; + } + + @Override + public int getCost() { + return cost; + } + + @Override + public void setLevel(int level) { + lvl = level; + } + +} \ No newline at end of file diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ArcherTower.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ArcherTower.java new file mode 100644 index 0000000..b166412 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ArcherTower.java @@ -0,0 +1,14 @@ +package ca.cosc3p91.a4.gameobjects; + +public class ArcherTower extends DefenseBuilding { + + public ArcherTower() { + setLevel(1); + upgrade(DefenseStages.archerTowerStages[0]); + } + + @Override + public Stage getUpgradeStage() { + return DefenseStages.archerTowerStages[getLevel()+1]; + } +} \ No newline at end of file diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Building.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Building.java new file mode 100644 index 0000000..c6e4019 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Building.java @@ -0,0 +1,73 @@ +package ca.cosc3p91.a4.gameobjects; + +import java.io.Serializable; +import java.util.ArrayList; + +public abstract class Building implements Serializable { + + // members + private int level; + private int health; + + private Stage stage; + + private int goldCost; + private int ironCost; + private int woodCost; + + private int buildTime; + + public ArrayList tiles = new ArrayList<>(); + public ArrayList inhabitants = new ArrayList<>(); + + // functions + + public int getLevel() { + return level; + } + + public int getHealth() { + return health; + } + + public int getCost(String type) { + return (type.equals("gold")) ? (goldCost) : + (type.equals("iron")) ? (ironCost) : woodCost; + } + + public Stage getStage() { + return stage; + } + + public abstract Stage getUpgradeStage(); + + public void setLevel(int level) { + this.level = level; + } + + public void setHealth(int health) { + this.health = health; + } + + public void setStage(Stage stage) { + this.stage = stage; + } + + public void addInhabitant(Inhabitant newMember) { + inhabitants.add(newMember); + // newMember.setBuilding(this); + } + + public void upgrade(Stage stage) { + this.stage = stage; + this.health += stage.dHealth; + // evil hack + String name = stage.getClass().getSimpleName(); + this.level = Integer.parseInt(name.charAt(name.length()-1) + "") - 1; + // interact with the timer regarding Upgrade time + } + + public int getBuildTime() { + return buildTime; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Cannon.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Cannon.java new file mode 100644 index 0000000..98dcb0b --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Cannon.java @@ -0,0 +1,14 @@ +package ca.cosc3p91.a4.gameobjects; + +public class Cannon extends DefenseBuilding { + + public Cannon() { + setLevel(1); + upgrade(DefenseStages.cannonStages[0]); + } + + @Override + public Stage getUpgradeStage() { + return DefenseStages.cannonStages[getLevel()+1]; + } +} \ No newline at end of file diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/CasaDeNarino.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/CasaDeNarino.java new file mode 100644 index 0000000..c359934 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/CasaDeNarino.java @@ -0,0 +1,79 @@ +package ca.cosc3p91.a4.gameobjects; + +public class CasaDeNarino extends Building { + + private int goldCapacity = 0; + private int ironCapacity = 0; + private int woodCapacity = 0; + + private int currentGold = 0; + private int currentIron = 0; + private int currentWood = 50; + + public CasaDeNarino(int lvl, VillageStage baseStage) { + setLevel(lvl); + upgrade(baseStage); + } + + @Override + public Stage getUpgradeStage() { + return VillageHallStages.villageStages[getLevel()+1]; + } + + public void upgrade(VillageStage stage) { + super.upgrade(stage); + this.goldCapacity += stage.getGoldCapacityIncrease(); + this.ironCapacity += stage.getIronCapacityIncrease(); + this.woodCapacity += stage.getWoodCapacityIncrease(); + } + + + public int getGoldCapacity() { + return goldCapacity; + } + + public int getIronCapacity() { + return ironCapacity; + } + + public int getWoodCapacity() { + return woodCapacity; + } + + public int getCurrentGold() { + return currentGold; + } + + public int getCurrentIron() { + return currentIron; + } + + public int getCurrentWood() {return currentWood;} + + public boolean addGold(int amount) { + int newGold = this.currentGold + amount; + if (newGold <= goldCapacity && this.currentGold + amount >= 0){ + this.currentGold += amount; + return true; + } + return false; + } + + public boolean addIron(int amount) { + int newIron = this.currentIron + amount; + if (newIron <= ironCapacity && newIron >= 0) { + this.currentIron += amount; + return true; + } + return false; + } + + public boolean addWood(int amount) { + int newWood = this.currentWood + amount; + if (newWood <= woodCapacity && newWood >= 0) { + this.currentWood += amount; + return true; + } + return false; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Catapult.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Catapult.java new file mode 100644 index 0000000..1976916 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Catapult.java @@ -0,0 +1,37 @@ +package ca.cosc3p91.a4.gameobjects; + +public class Catapult extends Infantry { + + static int cost = 6; + + private int lvl = 0; + + public Catapult() { + super(80, 12, 12); + } + + @Override + public void move(Tile t) { + + } + + @Override + public void getPosition() { + + } + + @Override + public int getLevel() { + return lvl; + } + + @Override + public int getCost() { + return cost; + } + + @Override + public void setLevel(int level) { + lvl = level; + } +} \ No newline at end of file diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Collector.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Collector.java new file mode 100644 index 0000000..a9ace15 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Collector.java @@ -0,0 +1,43 @@ +package ca.cosc3p91.a4.gameobjects; + +public class Collector implements Inhabitant { + + private int averageCollectionRate; + + static int cost = 2; + + private int lvl = 0; + + public int getCollectionRate() { + return averageCollectionRate; + } + + public void setCollectionRate(int rate) { + averageCollectionRate = rate; + } + + @Override + public void move(Tile t) { + + } + + @Override + public void getPosition() { + + } + + @Override + public int getLevel() { + return lvl; + } + + @Override + public int getCost() { + return cost; + } + + @Override + public void setLevel(int level) { + lvl = level; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseBuilding.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseBuilding.java new file mode 100644 index 0000000..e7f9a6a --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseBuilding.java @@ -0,0 +1,22 @@ +package ca.cosc3p91.a4.gameobjects; + +public abstract class DefenseBuilding extends Building { + + private int damage = 0; + private int range = 0; + + public void upgrade(DefenseStage stage) { + super.upgrade(stage); + this.damage += stage.getDamageChange(); + this.range += stage.getRangeChange(); + } + + public void attack(Infantry attacker) { + + } + + public int getDamage(){ + return damage; + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseStage.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseStage.java new file mode 100644 index 0000000..661b4bb --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseStage.java @@ -0,0 +1,26 @@ +package ca.cosc3p91.a4.gameobjects; + +import ca.cosc3p91.a4.util.Time; + +class DefenseStage extends Stage { + + protected int dDamage; + + protected int dRange; + + public DefenseStage(int dHealth, int goldCost, int requiredVillageLevel, Time upgradeTime, int ironCost, int woodCost, + int damageIncrease, int rangeIncrease) { + super(dHealth, goldCost, requiredVillageLevel, upgradeTime, ironCost, woodCost); + this.dDamage = damageIncrease; + this.dRange = rangeIncrease; + } + + public int getDamageChange() { + return dDamage; + } + + public int getRangeChange() { + return dRange; + } + +} \ No newline at end of file diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseStages.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseStages.java new file mode 100644 index 0000000..235e2ac --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/DefenseStages.java @@ -0,0 +1,46 @@ +package ca.cosc3p91.a4.gameobjects; + +import ca.cosc3p91.a4.util.Time; + +public class DefenseStages { + + public static class ArcherTowerStage1 extends DefenseStage { + public ArcherTowerStage1() { + super(100, 0, 0, new Time().offsetMinutes(1), 25, 75, 4,6); + } + } + + public static class ArcherTowerStage2 extends DefenseStage { + public ArcherTowerStage2() { + super(150, 50, 1, new Time().offsetMinutes(15), 25, 200, 8,8); + } + } + + public static class ArcherTowerStage3 extends DefenseStage { + public ArcherTowerStage3() { + super(200, 100, 2, new Time().offsetHours(1), 50, 300, 12,12); + } + } + + public static class CannonStage1 extends DefenseStage { + public CannonStage1() { + super(125, 0, 0, new Time().offsetMinutes(2), 100, 25, 8,4); + } + } + + public static class CannonStage2 extends DefenseStage { + public CannonStage2() { + super(175, 50, 1, new Time().offsetMinutes(20), 125, 25, 12,6); + } + } + + public static class CannonStage3 extends DefenseStage { + public CannonStage3() { + super(225, 100, 2, new Time().offsetHours(1), 200, 50, 14,8); + } + } + + public static DefenseStage[] archerTowerStages = {new DefenseStages.ArcherTowerStage1(), new DefenseStages.ArcherTowerStage2(), new DefenseStages.ArcherTowerStage3()}; + public static DefenseStage[] cannonStages = {new DefenseStages.CannonStage1(), new DefenseStages.CannonStage2(), new DefenseStages.CannonStage3()}; + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Farm.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Farm.java new file mode 100644 index 0000000..7c236a3 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Farm.java @@ -0,0 +1,28 @@ +package ca.cosc3p91.a4.gameobjects; + +public class Farm extends ResourceBuilding { + + public Farm(int lvl, ResourceStage baseStage) { + setLevel(lvl); + upgrade(baseStage); + } + + public int getPopulationContribution() { + return getHarvestRate(); + } + + @Override + protected ResourceHarvestHandler getHarvestHandler() { + return hall -> {}; + } + + @Override + public String getResource() { + return "UNUSED"; + } + + @Override + public Stage getUpgradeStage() { + return ResourceStages.goldStages[getLevel()+1]; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Infantry.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Infantry.java new file mode 100644 index 0000000..7d4cadd --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Infantry.java @@ -0,0 +1,43 @@ +package ca.cosc3p91.a4.gameobjects; + +public abstract class Infantry implements Inhabitant { + + private int health; + + private int damage; + + private int range; + + public Infantry(int hitPoints, int damage, int range) { + this.health = hitPoints; + this.damage = damage; + this.range = range; + } + + public void attack(Building b) { + } + + public int getHealth() { + return health; + } + + public int getDamage() { + return damage; + } + + public int getRange() { + return range; + } + + public void setHealth(int health) { + this.health = health; + } + + public void setDamage(int damage) { + this.damage = damage; + } + + public void setRange(int range) { + this.range = range; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Inhabitant.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Inhabitant.java new file mode 100644 index 0000000..95f51ab --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Inhabitant.java @@ -0,0 +1,17 @@ +package ca.cosc3p91.a4.gameobjects; + +import java.io.Serializable; + +public interface Inhabitant extends Serializable { + + int lvl = 0; + + void move(Tile t); + + void getPosition(); + + int getLevel(); + void setLevel(int level); + int getCost(); + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/IronMine.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/IronMine.java new file mode 100644 index 0000000..3e88b06 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/IronMine.java @@ -0,0 +1,25 @@ +package ca.cosc3p91.a4.gameobjects; + +public class IronMine extends ResourceBuilding { + + public static String resource = "iron"; + + public IronMine(ResourceStage baseStage) { + upgrade(baseStage); + } + + @Override + protected ResourceHarvestHandler getHarvestHandler() { + return hall -> hall.addIron(getHarvestRate()); + } + + @Override + public String getResource() { + return resource; + } + + @Override + public Stage getUpgradeStage() { + return ResourceStages.ironStages[getLevel()+1]; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Knight.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Knight.java new file mode 100644 index 0000000..3a7d4e4 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Knight.java @@ -0,0 +1,37 @@ +package ca.cosc3p91.a4.gameobjects; + +public class Knight extends Infantry { + + static int cost = 6; + + private int lvl = 0; + + public Knight() { + super(150, 6, 6); + } + + @Override + public void move(Tile t) { + + } + + @Override + public void getPosition() { + + } + + @Override + public int getLevel() { + return lvl; + } + + @Override + public int getCost() { + return cost; + } + + @Override + public void setLevel(int level) { + lvl = level; + } +} \ No newline at end of file diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/LumberMine.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/LumberMine.java new file mode 100644 index 0000000..412aba5 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/LumberMine.java @@ -0,0 +1,25 @@ +package ca.cosc3p91.a4.gameobjects; + +public class LumberMine extends ResourceBuilding { + + public static String resource = "wood"; + + public LumberMine(ResourceStage baseStage) { + upgrade(baseStage); + } + + @Override + protected ResourceHarvestHandler getHarvestHandler() { + return hall -> hall.addWood(getHarvestRate()); + } + + @Override + public String getResource() { + return resource; + } + + @Override + public Stage getUpgradeStage() { + return ResourceStages.woodStages[getLevel()+1]; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceBuilding.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceBuilding.java new file mode 100644 index 0000000..37680f4 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceBuilding.java @@ -0,0 +1,42 @@ +package ca.cosc3p91.a4.gameobjects; + +import ca.cosc3p91.a4.util.Time; + +public abstract class ResourceBuilding extends Building { + + protected interface ResourceHarvestHandler { + void harvest(CasaDeNarino hall); + } + + public static String resource; + + private final Time harvestMinTime = new Time().offsetSeconds(10); + + private int harvest_rate; + private Time nextHarvestTime; + + public ResourceBuilding() { + nextHarvestTime = Time.getTime().offsetTime(harvestMinTime); + } + + public void upgrade(ResourceStage stage) { + super.upgrade(stage); + this.harvest_rate += stage.getHarvestRateIncrease(); + } + + public void update(CasaDeNarino hall){ + if (nextHarvestTime.occurred()){ + getHarvestHandler().harvest(hall); + nextHarvestTime = Time.getTime().offsetTime(harvestMinTime); + } + } + + protected abstract ResourceHarvestHandler getHarvestHandler(); + + public int getHarvestRate(){ + return harvest_rate; + } + + public abstract String getResource(); + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceStage.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceStage.java new file mode 100644 index 0000000..db02f18 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceStage.java @@ -0,0 +1,19 @@ +package ca.cosc3p91.a4.gameobjects; + +import ca.cosc3p91.a4.util.Time; + +public class ResourceStage extends Stage { + + protected int harvestRateIncrease; + + public ResourceStage(int dHealth, int goldCost, int requiredVillageLevel, Time upgradeTime, int ironCost, int woodCost, + int harvestRateIncr) { + super(dHealth, goldCost, requiredVillageLevel, upgradeTime, ironCost, woodCost); + this.harvestRateIncrease = harvestRateIncr; + } + + public int getHarvestRateIncrease() { + return harvestRateIncrease; + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceStages.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceStages.java new file mode 100644 index 0000000..8e33d1e --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/ResourceStages.java @@ -0,0 +1,65 @@ +package ca.cosc3p91.a4.gameobjects; + +import ca.cosc3p91.a4.util.Time; + +public class ResourceStages { + + public static class GoldStage1 extends ResourceStage { + public GoldStage1() { + super(100, 0, 0, new Time().offsetMinutes(1), 25, 250, 25); + } + } + + public static class GoldStage2 extends ResourceStage { + public GoldStage2() { + super(100, 100, 1, new Time().offsetMinutes(15), 25, 275, 35); + } + } + + public static class GoldStage3 extends ResourceStage { + public GoldStage3() { + super(100, 150, 2, new Time().offsetHours(1), 50, 325, 50); + } + } + + public static class IronStage1 extends ResourceStage { + public IronStage1() { + super(100, 0, 0, new Time().offsetMinutes(1), 0, 125, 25); + } + } + + public static class IronStage2 extends ResourceStage { + public IronStage2() { + super(100, 15, 1, new Time().offsetMinutes(15), 25, 155, 35); + } + } + + public static class IronStage3 extends ResourceStage { + public IronStage3() { + super(100, 50, 2, new Time().offsetHours(1), 50, 250, 50); + } + } + + public static class WoodStage1 extends ResourceStage { + public WoodStage1() { + super(100, 0, 0, new Time().offsetMinutes(1), 0, 50, 25); + } + } + + public static class WoodStage2 extends ResourceStage { + public WoodStage2() { + super(100, 5, 1, new Time().offsetMinutes(15), 5, 75, 35); + } + } + + public static class WoodStage3 extends ResourceStage { + public WoodStage3() { + super(100, 10, 2, new Time().offsetHours(1), 25, 100, 50); + } + } + + public static ResourceStage[] goldStages = {new GoldStage1(), new GoldStage2(), new GoldStage3()}; + public static ResourceStage[] ironStages = {new IronStage1(), new IronStage2(), new IronStage3()}; + public static ResourceStage[] woodStages = {new WoodStage1(), new WoodStage2(), new WoodStage3()}; + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/SaulGoodMine.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/SaulGoodMine.java new file mode 100644 index 0000000..a7c8d1d --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/SaulGoodMine.java @@ -0,0 +1,25 @@ +package ca.cosc3p91.a4.gameobjects; + +public class SaulGoodMine extends ResourceBuilding { + + public static String resource = "gold"; + + public SaulGoodMine(ResourceStage baseStage) { + upgrade(baseStage); + } + + @Override + protected ResourceHarvestHandler getHarvestHandler() { + return hall -> hall.addGold(getHarvestRate()); + } + + @Override + public String getResource() { + return resource; + } + + @Override + public Stage getUpgradeStage() { + return ResourceStages.goldStages[getLevel()+1]; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Soldier.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Soldier.java new file mode 100644 index 0000000..eb997bd --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Soldier.java @@ -0,0 +1,37 @@ +package ca.cosc3p91.a4.gameobjects; + +public class Soldier extends Infantry { + + static int cost = 4; + + int lvl = 0; + + public Soldier() { + super(100, 4, 4); + } + + @Override + public void move(Tile t) { + + } + + @Override + public void getPosition() { + + } + + @Override + public int getLevel() { + return lvl; + } + + @Override + public int getCost() { + return cost; + } + + @Override + public void setLevel(int level) { + lvl = level; + } +} \ No newline at end of file diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Stage.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Stage.java new file mode 100644 index 0000000..b554e9c --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Stage.java @@ -0,0 +1,47 @@ +package ca.cosc3p91.a4.gameobjects; + +import ca.cosc3p91.a4.util.Time; + +import java.io.Serializable; + +public abstract class Stage implements Serializable { + + protected int dHealth; + + protected int goldCost; + + protected int requiredVillageLevel; + + protected Time upgradeTime; + + protected int ironCost; + + protected int woodCost; + + public Stage(int dHealth, int goldCost, int requiredVillageLevel, Time upgradeTime, int ironCost, int woodCost) { + this.dHealth = dHealth; + this.goldCost = goldCost; + this.requiredVillageLevel = requiredVillageLevel; + this.upgradeTime = upgradeTime; + this.ironCost = ironCost; + this.woodCost = woodCost; + } + + public int getHealthChange() { + return dHealth; + } + + public int getCost(String type) { + return (type.equals("gold")) ? (goldCost) : + (type.equals("iron")) ? (ironCost) : woodCost; + } + + public int getRequiredVillageLevel() { + return requiredVillageLevel; + } + + public Time getUpgradeTime() { + return upgradeTime; + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Tile.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Tile.java new file mode 100644 index 0000000..e4078e9 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Tile.java @@ -0,0 +1,9 @@ +package ca.cosc3p91.a4.gameobjects; + +public class Tile { + + public int x; + + public int y; + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/VillageHallStages.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/VillageHallStages.java new file mode 100644 index 0000000..dfd3eab --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/VillageHallStages.java @@ -0,0 +1,30 @@ +package ca.cosc3p91.a4.gameobjects; + +import ca.cosc3p91.a4.util.Time; + +public class VillageHallStages { + + public static class VillageStage1 extends VillageStage { + public VillageStage1() { + super(100, 0, 0, new Time(), 0, + 0, 1000, 2500, 5000); + } + } + + public static class VillageStage2 extends VillageStage { + public VillageStage2() { + super(550, 1000, 0, new Time().offsetHours(2), 2500, + 5000, 2500, 5000, 10000); + } + } + + public static class VillageStage3 extends VillageStage { + public VillageStage3() { + super(550, 2500, 0, new Time().offsetHours(2), 5000, + 10000, 5000, 7500, 15000); + } + } + + public static VillageStage[] villageStages = {new VillageStage1(), new VillageStage2(), new VillageStage3()}; + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/VillageStage.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/VillageStage.java new file mode 100644 index 0000000..248d612 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/VillageStage.java @@ -0,0 +1,33 @@ +package ca.cosc3p91.a4.gameobjects; + +import ca.cosc3p91.a4.util.Time; + +public class VillageStage extends Stage { + + protected int goldCapacityIncrease; + + protected int ironCapacityIncrease; + + protected int woodCapacityIncrease; + + public VillageStage(int dHealth, int goldCost, int requiredVillageLevel, Time upgradeTime, int ironCost, int woodCost, + int goldCapIncrease, int ironCapIncrease, int woodCapIncrease) { + super(dHealth, goldCost, requiredVillageLevel, upgradeTime, ironCost, woodCost); + this.goldCapacityIncrease = goldCapIncrease; + this.ironCapacityIncrease = ironCapIncrease; + this.woodCapacityIncrease = woodCapIncrease; + } + + public int getGoldCapacityIncrease() { + return goldCapacityIncrease; + } + + public int getIronCapacityIncrease() { + return ironCapacityIncrease; + } + + public int getWoodCapacityIncrease() { + return woodCapacityIncrease; + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Worker.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Worker.java new file mode 100644 index 0000000..4230bcb --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/Worker.java @@ -0,0 +1,43 @@ +package ca.cosc3p91.a4.gameobjects; + +public class Worker implements Inhabitant { + + private boolean currentlyBuilding; + + static int cost = 2; + + private int lvl = 0; + + public void set_IsBuilding(boolean state) { + currentlyBuilding = state; + } + + public boolean isCurrentlyBuilding() { + return currentlyBuilding; + } + + @Override + public void move(Tile t) { + + } + + @Override + public void getPosition() { + + } + + @Override + public int getLevel() { + return lvl; + } + + @Override + public int getCost() { + return cost; + } + + @Override + public void setLevel(int level) { + lvl = level; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/factory/BuildingFactory.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/factory/BuildingFactory.java new file mode 100644 index 0000000..1fc283d --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/factory/BuildingFactory.java @@ -0,0 +1,25 @@ +package ca.cosc3p91.a4.gameobjects.factory; + +import ca.cosc3p91.a4.gameobjects.*; +import ca.cosc3p91.a4.util.Util; + +public class BuildingFactory { + public Building getBuilding(String buildingName) { + buildingName = buildingName.toLowerCase(); + char c = Util.getFirstChar(buildingName); + + if (buildingName.contains("gold") || buildingName.contains("good") || c == 'g') { + return new SaulGoodMine(ResourceStages.goldStages[0]); + } else if (buildingName.contains("iron") || c == 'i') { + return new IronMine(ResourceStages.ironStages[0]); + } else if (buildingName.contains("wood") || buildingName.contains("lumber") || c == 'w' || c == 'l') { + return new LumberMine(ResourceStages.woodStages[0]); + } else if (buildingName.contains("archer") || c == 'a') { + return new ArcherTower(); + } else if (buildingName.contains("can") || c == 'c') { + return new Cannon(); + } + + return null; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/gameobjects/factory/InhabitantFactory.java b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/factory/InhabitantFactory.java new file mode 100644 index 0000000..6b4aacc --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/gameobjects/factory/InhabitantFactory.java @@ -0,0 +1,27 @@ +package ca.cosc3p91.a4.gameobjects.factory; + +import ca.cosc3p91.a4.gameobjects.*; +import ca.cosc3p91.a4.util.Util; + +public class InhabitantFactory { + public Inhabitant getInhabitant(String inhabitantName) { + inhabitantName = inhabitantName.toLowerCase(); + char c = Util.getFirstChar(inhabitantName); + + if (inhabitantName.contains("soldier") || c == 's') { + return new Soldier(); + } else if (inhabitantName.contains("knight") || c == 'k') { + return new Knight(); + } else if (inhabitantName.contains("work") || c == 'w') { + return new Worker(); + } else if (inhabitantName.contains("collect") || c == 'c') { + return new Collector(); + } else if (inhabitantName.contains("cat")) { + return new Catapult(); + } else if (inhabitantName.contains("arch") || c == 'a') { + return new Archer(); + } + + return null; + } +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/player/Player.java b/Assignment 4/src/ca/cosc3p91/a4/player/Player.java new file mode 100644 index 0000000..3b16dfc --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/player/Player.java @@ -0,0 +1,6 @@ +package ca.cosc3p91.a4.player; + +public class Player { + + +} \ No newline at end of file diff --git a/Assignment 4/src/ca/cosc3p91/a4/userinterface/GameDisplay.java b/Assignment 4/src/ca/cosc3p91/a4/userinterface/GameDisplay.java new file mode 100644 index 0000000..19e06fd --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/userinterface/GameDisplay.java @@ -0,0 +1,90 @@ +package ca.cosc3p91.a4.userinterface; + +import ca.cosc3p91.a4.game.Map; +import ca.cosc3p91.a4.gameobjects.Building; +import ca.cosc3p91.a4.gameobjects.Inhabitant; +import ca.cosc3p91.a4.util.Print; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Scanner; + +public class GameDisplay { + private BufferedReader reader; + private Scanner scanner; + private String input; + + public GameDisplay() { + reader = new BufferedReader(new InputStreamReader(System.in)); + scanner = new Scanner(reader); + } + + public String nextInput() throws IOException { + if (reader.ready()) { + return (input = scanner.nextLine()); + } else return null; + } + + public void printLastInput() { + System.out.println("\nYour Input: "); + System.out.println("\t->" + input + '\n'); + } + + public void printVillageState(Map map, String displayName) { + Print resourcesPrinter = new Print(displayName, 2); + + resourcesPrinter.addColumn(new Print.Column("Resource Type")); + resourcesPrinter.addColumn(new Print.Column("Max")); + resourcesPrinter.addColumn(new Print.Column("Amount")); + + resourcesPrinter.addRow(new Print.Row( + "Wood", + Integer.toString(map.getTownHall().getWoodCapacity()), + Integer.toString(map.getTownHall().getCurrentWood()))); + + resourcesPrinter.addRow(new Print.Row( + "Iron", + Integer.toString(map.getTownHall().getIronCapacity()), + Integer.toString(map.getTownHall().getCurrentIron()))); + + resourcesPrinter.addRow(new Print.Row( + "Gold", + Integer.toString(map.getTownHall().getGoldCapacity()), + Integer.toString(map.getTownHall().getCurrentGold()))); + + Print.print(resourcesPrinter.createTable(true, false, true)); + + Print buildingPrinter = new Print("Village Buildings", 2, resourcesPrinter.getWidth()); + buildingPrinter.addColumn(new Print.Column("Name")); + buildingPrinter.addColumn(new Print.Column("Level")); + buildingPrinter.addColumn(new Print.Column("Health")); + + for (Building b : map.contains) + buildingPrinter.addRow(new Print.Row(b.getClass().getSimpleName(), + Integer.toString(b.getLevel() + 1), + Integer.toString(b.getHealth()))); + + Print.print(buildingPrinter.createTable(true, false, true)); + + Print inhabs = new Print("Village Inhabitants", 2, buildingPrinter.getWidth()); + inhabs.addColumn(new Print.Column("Name")); + inhabs.addColumn(new Print.Column("Level")); + + for (Inhabitant i : map.inhabitants) + inhabs.addRow(new Print.Row(i.getClass().getSimpleName(), Integer.toString(i.getLevel() + 1))); + + Print.print(inhabs.createTable(true, true, true)); + } + + public void printGameMenu() { + System.out.println("\n~ Player Options:\n" + + "1. Build {command: '1 '}\n" + + "2. Train inhabitants {command: '2 '}\n"+ + "3. Upgrade {command: '3 i'} / {command: '3 b'}\n"+ + "4. Explore\n"+ + "5. Print Village Stats\n"+ + "6. Quit\n" + + "7. Attack last explored\n"); + } +} \ No newline at end of file diff --git a/Assignment 4/src/ca/cosc3p91/a4/util/ChallengeAdapter.java b/Assignment 4/src/ca/cosc3p91/a4/util/ChallengeAdapter.java new file mode 100644 index 0000000..d1c47bf --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/util/ChallengeAdapter.java @@ -0,0 +1,143 @@ +package ca.cosc3p91.a4.util; + +import ChallengeDecision.*; +import ca.cosc3p91.a4.game.Map; +import ca.cosc3p91.a4.gameobjects.*; + +import java.util.ArrayList; +import java.util.List; + +public class ChallengeAdapter { + + private static class MapChallengeConverter { + private final Map map; + public MapChallengeConverter(Map map){ + this.map = map; + } + + public List> getAttackers(){ + List> entityAttackList = new ArrayList<>(); + + map.inhabitants.stream() + .filter(i -> i instanceof Infantry) + .map(i -> (Infantry) i) + .forEach(i -> { + entityAttackList.add(new ChallengeAttack<>((double) i.getDamage(), (double) i.getHealth())); + }); + + return entityAttackList; + } + + public List> getDefenders(){ + List> entityDefenseList = new ArrayList<>(); + + map.contains.stream() + .filter(b -> b instanceof DefenseBuilding) + .map(b -> (DefenseBuilding) b) + .forEach(d -> { + entityDefenseList.add(new ChallengeDefense<>((double) d.getDamage(), (double) d.getHealth())); + }); + + return entityDefenseList; + } + + public List> getResources(String type){ + List> entityResourceList = new ArrayList<>(); + + CasaDeNarino th = map.getTownHall(); + + int resourceCount; + int thResourceCount = + type.equals(SaulGoodMine.resource) ? th.getCurrentGold() + : type.equals(IronMine.resource) + ? th.getCurrentIron() : th.getCurrentWood(); + + resourceCount = (int) map.contains.stream() + .filter(b -> b instanceof ResourceBuilding).map(b -> (ResourceBuilding) b) + .filter(r -> r.getResource().equals(type)) + .count(); + + map.contains.stream() + .filter(b -> b instanceof ResourceBuilding) + .map(b -> (ResourceBuilding) b) + .filter(r -> r.getResource().equals(type)) + .forEach((r) -> { + entityResourceList.add( + new ChallengeResource<>( + (double) thResourceCount / (double) resourceCount, + (double) r.getHealth()) + ); + }); + + return entityResourceList; + } + } + + private final Map map; + + public ChallengeAdapter(Map map){ + this.map = map; + } + + public void attack(Map enemy){ + MapChallengeConverter enemyMap = new MapChallengeConverter(enemy); + MapChallengeConverter ourMap = new MapChallengeConverter(this.map); + + List> ourAttackers = ourMap.getAttackers(); + // not needed + List> ourDefenders = ourMap.getDefenders(); + + ChallengeEntitySet ourSet = new ChallengeEntitySet<>(); + ourSet.setEntityAttackList(ourAttackers); + ourSet.setEntityDefenseList(ourDefenders); + + List> enemyDefenders = enemyMap.getDefenders(); + + List> enemyGold = enemyMap.getResources(SaulGoodMine.resource); + List> enemyIron = enemyMap.getResources(IronMine.resource); + List> enemyWood = enemyMap.getResources(LumberMine.resource); + + // split is required because challengeResource lacks any resource specifier + ChallengeEntitySet enemyGoldSet = new ChallengeEntitySet<>(); + ChallengeEntitySet enemyIronSet = new ChallengeEntitySet<>(); + ChallengeEntitySet enemyWoodSet = new ChallengeEntitySet<>(); + + enemyGoldSet.setEntityDefenseList(enemyDefenders); + enemyIronSet.setEntityDefenseList(enemyDefenders); + enemyWoodSet.setEntityDefenseList(enemyDefenders); + + enemyGoldSet.setEntityResourceList(enemyGold); + enemyIronSet.setEntityResourceList(enemyIron); + enemyWoodSet.setEntityResourceList(enemyWood); + + ChallengeResult goldResults = Arbitrer.challengeDecide(ourSet, enemyGoldSet); + ChallengeResult ironResults = Arbitrer.challengeDecide(ourSet, enemyIronSet); + ChallengeResult woodResults = Arbitrer.challengeDecide(ourSet, enemyWoodSet); + + // if any fail to attack we need to pretend like it was one big attack that failed + if (!goldResults.getChallengeWon() || !ironResults.getChallengeWon() || !woodResults.getChallengeWon()) + return; + + System.out.println("We won gold: "); + goldResults.print(); + System.out.println("We won iron: "); + ironResults.print(); + System.out.println("We won wood: "); + woodResults.print(); + + CasaDeNarino th = map.getTownHall(); + + goldResults.getLoot().forEach(r -> { + th.addGold((int)r.getProperty().doubleValue()); + }); + + ironResults.getLoot().forEach(r -> { + th.addIron((int)r.getProperty().doubleValue()); + }); + + woodResults.getLoot().forEach(r -> { + th.addWood((int)r.getProperty().doubleValue()); + }); + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/util/PacketTable.java b/Assignment 4/src/ca/cosc3p91/a4/util/PacketTable.java new file mode 100644 index 0000000..6a77770 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/util/PacketTable.java @@ -0,0 +1,7 @@ +package ca.cosc3p91.a4.util; + +public class PacketTable { + + + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/util/Print.java b/Assignment 4/src/ca/cosc3p91/a4/util/Print.java new file mode 100644 index 0000000..4211364 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/util/Print.java @@ -0,0 +1,249 @@ +package ca.cosc3p91.a4.util; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Ported from blt::TableFormatter (C++) + * https://github.com/Tri11Paragon/BLT/ + */ +public class Print { + + public static class Row { + private final ArrayList values; + + public Row(ArrayList row) { + this.values = row; + } + + public Row() { + this.values = new ArrayList<>(); + } + + public Row(String... values){ + this(); + this.values.addAll(Arrays.asList(values)); + } + + public void add(String value) { + values.add(value); + } + } + + public static class Column { + private String columnName; + private long maxColumnLength = 0; + + public Column(String columnName) { + this.columnName = columnName; + } + } + + private final ArrayList rows = new ArrayList<>(); + private final ArrayList columns = new ArrayList<>(); + + private final String tableName; + private final int columnPadding; + private int width; + private final int targetWidth; + + public Print(String tableName, int columnPadding, int targetWidth) { + this.tableName = tableName; + this.columnPadding = columnPadding; + this.targetWidth = targetWidth; + } + + public Print(String tableName, int columnPadding){this(tableName, columnPadding, -1);} + + public Print(String tableName){this(tableName, 2);} + + public Print() { + this(""); + } + + private String createPadding(int amount) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < amount; i++) { + builder.append(' '); + } + return builder.toString(); + } + + private String generateTopSelector(long size) { + long sizeOfName = tableName.isEmpty() ? 0 : tableName.length() + 4; + long sizeNameRemoved = size - sizeOfName; + + StringBuilder halfWidthLeftSeparator = new StringBuilder(); + StringBuilder halfWidthRightSeparator = new StringBuilder(); + + long sizeNameFloor = (long) Math.floor((double) sizeNameRemoved / 2.0); + long sizeNameCeil = (long) Math.ceil((double) sizeNameRemoved / 2.0); + + halfWidthLeftSeparator.append('+'); + + for (int i = 0; i < sizeNameFloor - 1; i++) + halfWidthLeftSeparator.append('-'); + for (int i = 0; i < sizeNameCeil - 1; i++) + halfWidthRightSeparator.append('-'); + + halfWidthRightSeparator.append('+'); + + StringBuilder separator = new StringBuilder(); + separator.append(halfWidthLeftSeparator.toString()); + if (sizeOfName != 0) { + separator.append("{ "); + separator.append(tableName); + separator.append(" }"); + } + separator.append(halfWidthRightSeparator); + return separator.toString(); + } + + private String generateColumnHeader() { + updateColumnLengths(); + StringBuilder header = new StringBuilder(); + header.append('|'); + + for (int i = 0; i < columns.size(); i++) { + Column column = columns.get(i); + double columnPaddingLength = ((int) (column.maxColumnLength) - (int) (column.columnName.length())) / 2.0; + header.append(createPadding((int) (columnPadding + (int) Math.floor(columnPaddingLength)))); + + header.append(column.columnName); + + header.append(createPadding((int) (columnPadding + (int) Math.ceil(columnPaddingLength)))); + if (i < columns.size() - 1) + header.append('|'); + } + header.append('|'); + + return header.toString(); + } + + private String generateSeparator(long size) { + int nextIndex = 0; + int currentColumnIndex = 0; + StringBuilder wholeWidthSeparator = new StringBuilder(); + for (int i = 0; i < size; i++) { + if (i == nextIndex) { + //System.out.println(currentColumnIndex + " " + nextIndex + " " + size); + int currentColumnSize = (int) (columns.get(currentColumnIndex++).maxColumnLength + columnPadding * 2); + nextIndex += currentColumnSize + 1; + wholeWidthSeparator.append('+'); + } else + wholeWidthSeparator.append('-'); + } + wholeWidthSeparator.append('+'); + return wholeWidthSeparator.toString(); + } + + private void updateColumnLengths() { + for (int i = 0; i < columns.size(); i++) { + Column column = columns.get(i); + column.maxColumnLength = column.columnName.length(); + for (Row row : rows) { + column.maxColumnLength = Math.max(column.maxColumnLength, row.values.get(i).length()); + } + } + } + + public long columnSize(Column column) { + return column.columnName.length() + columnPadding * 2L; + } + + public Print addColumn(Column column) { + columns.add(column); + return this; + } + + public Print addRow(Row row) { + if (row.values.size() > columns.size()) + throw new RuntimeException("Unable to create row with more values than columns!"); + if (row.values.size() < columns.size()) + for (int i = row.values.size(); i < columns.size(); i++) + row.values.add(""); + rows.add(row); + return this; + } + + public Print addRow(ArrayList row) { + return addRow(new Row(row)); + } + + public ArrayList createTable(boolean top, boolean bottom, boolean separators) { + String header = generateColumnHeader(); + String topSeparator = generateTopSelector(header.length()); + String lineSeparator = generateSeparator(header.length() - 1); + + if (targetWidth > 0) { + int diff = targetWidth - header.length(); + + if (diff > 0) { + + int left = (int) Math.floor(diff / 2.0); + int right = (int) Math.ceil(diff / 2.0); + + int leftleft = (int) Math.floor(left / 2.0); + int leftright = (int) Math.ceil(left / 2.0); + + int rightleft = (int) Math.floor(right / 2.0); + int rightright = (int) Math.ceil(right / 2.0); + + columns.get(0).columnName = createPadding(leftleft) + columns.get(0).columnName + createPadding(leftright); + columns.get(columns.size() - 1).columnName = createPadding(rightleft) + columns.get(columns.size() - 1).columnName + createPadding(rightright); + + header = generateColumnHeader(); + topSeparator = generateTopSelector(header.length()); + lineSeparator = generateSeparator(header.length() - 1); + } + } + + width = header.length(); + + ArrayList lines = new ArrayList<>(); + + if (top) + lines.add(topSeparator); + + lines.add(header); + lines.add(lineSeparator); + + for (Row row : rows) { + StringBuilder rowLine = new StringBuilder(); + rowLine.append('|'); + for (int i = 0; i < row.values.size(); i++) { + String value = row.values.get(i); + Column column = columns.get(i); + int spaceLeft = (int) (column.maxColumnLength - value.length()); + rowLine.append(createPadding((int) Math.floor(spaceLeft / 2.0) + columnPadding)); + rowLine.append(value); + rowLine.append(createPadding((int) Math.ceil(spaceLeft / 2.0) + columnPadding)); + rowLine.append('|'); + } + lines.add(rowLine.toString()); + } + + if (bottom) + lines.add(lineSeparator); + + return lines; + } + + public ArrayList createBox() { + return new ArrayList<>(); + } + + public ArrayList createTable() { + return createTable(true, true, true); + } + + public int getWidth(){ + return width; + } + + public static void print(ArrayList lines) { + for (String line : lines) + System.out.println(line); + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/util/Server.java b/Assignment 4/src/ca/cosc3p91/a4/util/Server.java new file mode 100644 index 0000000..cbe4286 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/util/Server.java @@ -0,0 +1,11 @@ +package ca.cosc3p91.a4.util; + +public class Server { + + public static final int SERVER_PORT = 42069; + + public Server() { + + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/util/Time.java b/Assignment 4/src/ca/cosc3p91/a4/util/Time.java new file mode 100644 index 0000000..04fb156 --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/util/Time.java @@ -0,0 +1,50 @@ +package ca.cosc3p91.a4.util; + +import java.io.Serializable; + +public class Time implements Serializable { + + private long timeSeconds; + + public Time() { + this.timeSeconds = 0; + } + + protected Time(long timeSeconds) { + this.timeSeconds = timeSeconds; + } + + public Time offsetSeconds(long seconds) { + this.timeSeconds += seconds; + return this; + } + + public Time offsetMinutes(long minutes) { + return offsetSeconds(minutes * 60); + } + + public Time offsetHours(long hours) { + return offsetMinutes(hours * 60); + } + + public Time offsetDays(long days) { + return offsetHours(days * 24); + } + + public Time offsetTime(Time time) { + return offsetSeconds(time.timeSeconds); + } + + public long get() { + return timeSeconds; + } + + public boolean occurred() { + return getTime().timeSeconds >= timeSeconds; + } + + public static Time getTime() { + return new Time(System.currentTimeMillis() / 1000); + } + +} diff --git a/Assignment 4/src/ca/cosc3p91/a4/util/Util.java b/Assignment 4/src/ca/cosc3p91/a4/util/Util.java new file mode 100644 index 0000000..140545c --- /dev/null +++ b/Assignment 4/src/ca/cosc3p91/a4/util/Util.java @@ -0,0 +1,22 @@ +package ca.cosc3p91.a4.util; + +import java.util.Random; + +public class Util { + + public static int randomInt(int min, int max, Random random) { + return random.nextInt(max - min) + min; + } + + public static int clamp(int min, int max, int i){ + return Math.min(Math.max(i, min), max); + } + + public static char getFirstChar(String str){ + char c = ' '; + if (str.trim().length() == 1) + c = str.charAt(0); + return c; + } + +} diff --git a/Assignment 4/suggestedSolutionA1.png b/Assignment 4/suggestedSolutionA1.png new file mode 100644 index 0000000000000000000000000000000000000000..f656bf47f439fd7779f5a49e51834b6a8aaa107d GIT binary patch literal 82400 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�Uix;)GOP|MXF`N9_mffRU)d3I+PcT%KJF=O!sbF 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 literal 0 HcmV?d00001 diff --git a/untitled104.iml b/untitled104.iml index af7f350..9613e44 100644 --- a/untitled104.iml +++ b/untitled104.iml @@ -3,7 +3,7 @@ - +