Coverage Summary for Class: QuestManager (com.mygdx.game.Managers)

Class Class, % Method, % Line, %
QuestManager 100% (1/1) 81.8% (9/11) 83.3% (50/60)


1 package com.mygdx.game.Managers; 2  3 import com.badlogic.gdx.math.Vector2; 4 import com.mygdx.game.Entitys.Chest; 5 import com.mygdx.game.Entitys.College; 6 import com.mygdx.game.Entitys.Player; 7 import com.mygdx.game.Quests.KillQuest; 8 import com.mygdx.game.Quests.LocateQuest; 9 import com.mygdx.game.Quests.Quest; 10 import com.mygdx.utils.Utilities; 11  12 import java.util.ArrayList; 13 import java.util.Objects; 14 import java.util.Random; 15  16 import static com.mygdx.utils.Constants.TILE_SIZE; 17  18 /** 19  * Creates the quests and manages their completion and order 20  */ 21 public class QuestManager { 22  private static ArrayList<Quest> allQuests; 23  private static Chest chest; 24  25  public static void Initialize() { 26  //boolean initialized = true; 27  allQuests = new ArrayList<>(); 28  chest = new Chest(); 29  30  } 31  32  /** 33  * Creates a random kill quest on a random college 34  * 35  * @param exclude the id of factions to not kill 36  * @return the id of the faction targeted 37  */ 38  private static int rndKillQuest(ArrayList<Integer> exclude) { 39  int id; 40  College enemy; 41  int i = 0; 42  do { 43  id = new Random().nextInt(4) + 2; 44  enemy = GameManager.getCollege(id); 45  i++; 46  } 47  while (Utilities.contains(exclude, id) && i < 5); 48  if (i == 5) { 49  return 0; 50  } 51  addQuest(new KillQuest(enemy)); 52  return id; 53  } 54  55  /** 56  * Creates locate quest for a random position sourced from game settings 57  */ 58  private static void rndLocateQuest() { 59  final ArrayList<Float> locations = new ArrayList<>(); 60  for (float f : GameManager.getSettings().get("quests").get("locations").asFloatArray()) { 61  locations.add(f); 62  } 63  // in game settings the positions are stored as ints with y following x it doesn't wrap 64  // eg. a, b, c, d 65  // v1: (a, b) v2: (c, d) 66  int choice = -1; 67  float x = Utilities.randomChoice(locations); 68  float y; 69  if (choice == locations.size() - 1) { 70  y = x; 71  x = locations.get(choice - 1); 72  } else { 73  y = locations.get(choice + 1); 74  } 75  x *= TILE_SIZE; 76  y *= TILE_SIZE; 77  addQuest(new LocateQuest(new Vector2(x, y), 1 * TILE_SIZE)); 78  } 79  80  /** 81  * 50/50 chance of kill quest or locate quest 82  * @param exclude list of factions to exclude from killing 83  */ 84  private static void rndQuest(ArrayList<Integer> exclude) { 85  if (new Random().nextFloat() > 0.5) { 86  rndLocateQuest(); 87  } else { 88  exclude.add(rndKillQuest(exclude)); 89  } 90  } 91  92  /** 93  * Creates the quest line with the final quest being to kill a college 94  * Changed from private to public in assessment 2 to allow the separation between initialize and creating quests for testing. 95  */ 96  public static void createRandomQuests() { //Assessment 2 change, see javadoc 97  // the last quest added is the final quest 98  int primaryEnemyId = new Random().nextInt(4) + 2; 99  ArrayList<Integer> exclude = new ArrayList<>(); 100  exclude.add(primaryEnemyId); 101  for (int i = 0; i < GameManager.getSettings().get("quests").getInt("count"); i++) { 102  rndQuest(exclude); 103  } 104  College enemy = GameManager.getCollege(primaryEnemyId); 105  addQuest(new KillQuest(enemy)); 106  } 107  108  public static void addQuest(Quest q) { 109  // tryInit(); removed for assessment 2 110  allQuests.add(q); 111  } 112  113  /** 114  * Checks quests for completion and gives rewards, teleports the chest when appropriate. 115  * Stops checking the quest after the first no completed quest (prevents quests being completed in any order) 116  */ 117  public static void checkCompleted() { 118  // tryInit(); removed for assessment 2 119  Player p = GameManager.getPlayer(); 120  for (Quest q : allQuests) { 121  if (q.isCompleted()) { 122  continue; 123  } 124  boolean completed = q.checkCompleted(p); 125  if (completed) { 126  p.plunder(q.getPlunderReward()); 127  p.points(q.getPointReward()); 128  } else if (q instanceof LocateQuest) { 129  chest.setPosition(((LocateQuest) q).getLocation()); 130  break; 131  } else { 132  chest.setPosition(new Vector2(-1000, -1000)); 133  break; 134  } 135  } 136  } 137  138  /** 139  * Returns the next un-completed quest 140  * @return the quest null if no un-completed quests found 141  */ 142  public static Quest currentQuest() { 143  // tryInit(); 144  for (Quest q : allQuests) { 145  if (!q.isCompleted()) { 146  return q; 147  } 148  } 149  return null; 150  } 151  152  /** 153  * added for assessment 2 154  * sets the current quest to the one that corresponds to a given name. 155  * @param current string containing the name of the quest to be set as current 156  */ 157  public static void setCurrentQuest(String current) { 158  // tryInit(); 159  for (Quest q : allQuests) { 160  if (Objects.equals(q.getName(), current)) { 161  allQuests.remove(q); 162  allQuests.add(0, q); 163  } 164  } 165  } 166  167  /** 168  * Are there any quests 169  * @return true if any non completed quest exits 170  */ 171  public static boolean anyQuests() { 172  // tryInit(); removed for assessment 2 173  return currentQuest() != null; 174  } 175  176  // private static void tryInit() { 177  // if (!initialized) { 178  // Initialize(); 179  // } 180  // } 181 }