Coverage Summary for Class: GameManager (com.mygdx.game.Managers)
Class |
Class, %
|
Method, %
|
Line, %
|
GameManager |
100%
(1/1)
|
89.5%
(17/19)
|
96.9%
(93/96)
|
1 package com.mygdx.game.Managers;
2
3 import com.badlogic.gdx.Gdx;
4 import com.badlogic.gdx.math.Vector2;
5 import com.badlogic.gdx.utils.JsonReader;
6 import com.badlogic.gdx.utils.JsonValue;
7 import com.mygdx.game.AI.TileMapGraph;
8 import com.mygdx.game.Components.Transform;
9 import com.mygdx.game.Entitys.*;
10 import com.mygdx.game.Faction;
11 import com.mygdx.game.PowerUps.PowerUp;
12 import com.mygdx.utils.Utilities;
13
14 import java.util.ArrayList;
15 import java.util.Objects;
16 import java.util.Random;
17
18 /**
19 * Responsible for creating most entity's associated with the game. Also, the cached chest and cannonballs
20 */
21 public final class GameManager {
22 private static ArrayList<Faction> factions;
23 private static ArrayList<Ship> ships;
24 private static ArrayList<College> colleges;
25
26 private static final int cacheSize = 20;
27 private static ArrayList<CannonBall> ballCache;
28 private static int currentElement;
29
30 private static JsonValue settings;
31
32 /**
33 * facilitates creation of the game
34 * @param difficulty contains the ENUM for the difficulty that has been selected
35 */
36 public static void Initialize(GameDifficulty difficulty) {
37 currentElement = 0;
38 // start of change for assessment 2, adds functionality for changing difficulty
39
40 changeDifficulty(difficulty.toString());
41 // end of change
42
43 factions = new ArrayList<>();
44 ships = new ArrayList<>();
45 ballCache = new ArrayList<>(cacheSize);
46 colleges = new ArrayList<>();
47
48 for (int i = 0; i < cacheSize; i++) {
49 ballCache.add(new CannonBall());
50 }
51
52 for (JsonValue v : settings.get("factions")) {
53 String name = v.getString("name");
54 String col = v.getString("colour");
55 Vector2 pos = new Vector2(v.get("position").getFloat("x"), v.get("position").getFloat("y"));
56 pos = Utilities.tilesToDistance(pos);
57 Vector2 spawn = new Vector2(v.get("shipSpawn").getFloat("x"), v.get("shipSpawn").getFloat("y"));
58 spawn = Utilities.tilesToDistance(spawn);
59 factions.add(new Faction(name, col, pos, spawn, factions.size() + 1));
60 }
61 }
62
63 /**
64 * Added for assessment 2
65 * loads the part of the json file for the chosen difficulty and overwrites the settings values with these values
66 * @param difficulty the chosen difficulty as a string
67 */
68 public static void changeDifficulty(String difficulty){
69 JsonValue settingsAll = new JsonReader(). //change for assessment 2 for multiple difficulties
70 parse(Gdx.files.internal("GameSettings.json"));
71 settings = settingsAll.get("Regular");
72
73 if (!Objects.equals(difficulty, "Regular")) {
74 JsonValue editSet = settingsAll.get(difficulty);
75 for (JsonValue x : editSet) {
76 for (JsonValue value : x) {
77 System.out.println(value);
78 settings.get(x.name).get(value.name).set(value.asDouble(), null);
79 }
80 }
81 }
82 }
83
84 /**
85 * called every frame checks id the quests are completed
86 */
87 public static void update() {
88 QuestManager.checkCompleted();
89 }
90
91 /**
92 * Player is always in ships at index 0
93 *
94 * @return the ship
95 */
96 public static Player getPlayer() {
97 return (Player) ships.get(0);
98 }
99
100 /**
101 * Get an NPCShip in the current game
102 * @param id the ship's ID
103 * @return the NPCShip instance
104 */
105 public static NPCShip getNPCShip(int id) {
106
107 return (NPCShip) ships.get(id);
108 }
109
110 /**
111 * Creates the game with player maps, NPCs, colleges
112 * // Change for Assessment 2 Start //
113 * Only creates world map if mapId is non-negative
114 * For test purposes
115 * // Change for Assessment 2 End //
116 * @param mapId the resource id of the tilemap
117 */
118 public static void SpawnGame(int mapId) {
119
120 if (mapId >= 0) CreateWorldMap(mapId);
121 CreatePlayer();
122 final int cnt = settings.get("factionDefaults").getInt("shipCount");
123 for (int i = 0; i < factions.size(); i++) {
124 CreateCollege(i + 1);
125 for (int j = 0; j < cnt; j++) {
126 // prevents halifax from having ship count + player
127 if (i == 0 && j > cnt - 2) {
128 break;
129 }
130 NPCShip s = CreateNPCShip(i + 1);
131 s.getComponent(Transform.class).setPosition(getFaction(i + 1).getSpawnPos());
132 }
133 }
134 QuestManager.Initialize(); // added for assessment 2 to stop tryInit being used (testing)
135 QuestManager.createRandomQuests(); // ""
136
137 // Assessment 2 change: spawns in powerups based on settings
138 for (JsonValue powData : settings.get("powerups")) {
139 String texName = powData.getString("sprite");
140 int cooldown = powData.getInt("spawnCooldown");
141 PowerUp pow = new PowerUp(powData);
142 for (JsonValue pos : powData.get("positions")) {
143 Vector2 position = new Vector2(pos.getFloat(0), pos.getFloat(1));
144 new PowerUpPickup(pow, texName, Utilities.tilesToDistance(position), cooldown);
145 }
146 }
147
148 // Assessment 2 change: spawns in obstacles based on settings
149 JsonValue obstaclesData = settings.get("obstacles");
150 JsonValue types = obstaclesData.get("types");
151
152 for (JsonValue pos : obstaclesData.get("positions")) {
153 Vector2 position = new Vector2(pos.getFloat(0), pos.getFloat(1));
154 JsonValue obstacle = types.get(new Random().nextInt(types.size));
155
156 if (Objects.equals(obstacle.getString("name"), "storm")) {
157 new Weather(
158 obstacle.getFloat("damage"),
159 obstacle.getFloat("rate", -1)
160 ).getComponent(Transform.class).setPosition(Utilities.tilesToDistance(position));
161 } else {
162 new Obstacle(
163 obstacle.getString("name"),
164 obstacle.getBoolean("trigger"),
165 obstacle.getFloat("damage"),
166 obstacle.getFloat("rate", -1),
167 obstacle.getInt("limit", -1)
168 ).getComponent(Transform.class).setPosition(Utilities.tilesToDistance(position));
169 }
170 }
171 }
172
173 /**
174 * Creates player that belongs the faction with id 1
175 */
176 public static void CreatePlayer() {
177 Player p = new Player();
178 p.setFaction(1);
179 ships.add(p);
180 }
181
182 /**
183 * Creates an NPC ship with the given faction
184 *
185 * @param factionId desired faction
186 * @return the created ship
187 */
188 public static NPCShip CreateNPCShip(int factionId) {
189 NPCShip e = new NPCShip();
190 e.setFaction(factionId);
191 ships.add(e);
192 return e;
193 }
194
195 /**
196 * Creates the world map
197 *
198 * @param mapId resource id
199 */
200 public static void CreateWorldMap(int mapId) {
201 WorldMap map = new WorldMap(mapId);
202 new TileMapGraph(map.getTileMap());
203 }
204
205 /**
206 * Creates the college with it's building for the desired college
207 *
208 * @param factionId desired faction
209 */
210 public static void CreateCollege(int factionId) {
211 College c = new College(factionId);
212 colleges.add(c);
213 }
214
215
216 public static Faction getFaction(int factionId) {
217 return factions.get(factionId - 1);
218 }
219
220 /**
221 * Gets the setting object from the GameSetting.json
222 * @return the JSON representation fo settings
223 */
224 public static JsonValue getSettings() {
225 return settings;
226 }
227
228 public static College getCollege(int factionId) {
229 return colleges.get(factionId - 1);
230 }
231
232 /**
233 * Added for Assessment 2
234 * @return Returns the next cannonball that would be fired from the cache
235 */
236 public static CannonBall getCurrentCannon() {
237 return ballCache.get(currentElement);
238 }
239
240 /**
241 * Utilises the cached cannonballs to fire one
242 * Changed for Assessment 2, separated incrementer for visual clarity and parameterised startPos
243 * @param p parent
244 * @param pos position projectile is spawned at
245 * @param dir shoot direction
246 */
247 public static void shoot(Entity p, Vector2 pos, Vector2 dir) { // Changed for Assessment 2, type switched from Ship to Entity
248 ballCache.get(currentElement).fire(p,pos, dir);
249 currentElement++;
250 currentElement %= cacheSize;
251 }
252
253 public static ArrayList<Ship> getShips(){
254 return ships;
255 }
256 public static ArrayList<College> getColleges(){
257 return colleges;
258 }
259
260 public static void dispose(){
261 currentElement = 0;
262
263 factions = new ArrayList<>();
264 ships = new ArrayList<>();
265 ballCache = new ArrayList<>(cacheSize);
266 colleges = new ArrayList<>();
267 }
268
269 //public static QueueFIFO<Vector2> getPath(Vector2 loc, Vector2 dst) {
270 // return mapGraph.findOptimisedPath(loc, dst);
271 //}
272 }