Coverage Summary for Class: College (com.mygdx.game.Entitys)
| Class | Class, % | Method, % | Line, % |
|---|---|---|---|
| College | 100% (1/1) | 90.9% (10/11) | 83.1% (74/89) |
1 package com.mygdx.game.Entitys; 2 3 import com.badlogic.gdx.math.Vector2; 4 import com.badlogic.gdx.utils.JsonValue; 5 import com.badlogic.gdx.utils.TimeUtils; 6 import com.mygdx.game.Components.Pirate; 7 import com.mygdx.game.Components.Transform; 8 import com.mygdx.game.Faction; 9 import com.mygdx.game.Managers.GameManager; 10 import com.mygdx.utils.Utilities; 11 12 import java.util.ArrayList; 13 14 /** 15 * Defines a college and its associated buildings. 16 */ 17 public class College extends Entity { 18 private static ArrayList<String> buildingNames; 19 private final ArrayList<Building> buildings; 20 public Faction f; 21 private Faction mostRecentAttacker; //Added for Assessment 2, used to determine ownership after capturing 22 private Building flag; //Added for Assessment 2, allows flag to be referenced independently of other buildings. 23 private long lastShootTime; //Added for Assessment 2, stores the time when the college last attacked 24 private float buffer; //Added for Assessment 2, stores the radius of the college's area 25 private boolean alive; //Added for Assessment 2, keeps track of the college's life status 26 27 /** 28 * Creates a college. 29 * Changed for Assessment 2: 30 * - Added lastShootTime to store the time when the college last attacked 31 */ 32 public College() { 33 super(); 34 buildings = new ArrayList<>(); 35 buildingNames = new ArrayList<>(); 36 buildingNames.add("big"); 37 buildingNames.add("small"); 38 buildingNames.add("clock"); 39 Transform t = new Transform(); 40 Pirate p = new Pirate(); 41 addComponents(t, p); 42 lastShootTime = TimeUtils.millis() / 1000; 43 } 44 45 /** 46 * Creates a college at the location associated with the given faction id. 47 * Changed for Assessment 2: 48 * - Set infinite ammo to true in Pirate Component 49 * @param factionId numerical id of the faction 50 */ 51 public College(int factionId) { 52 this(); 53 f = GameManager.getFaction(factionId); 54 Transform t = getComponent(Transform.class); 55 t.setPosition(f.getPosition()); 56 Pirate p = getComponent(Pirate.class); 57 p.setFactionId(factionId); 58 p.setInfiniteAmmo(true); 59 spawn(f.getColour()); 60 alive = true; 61 } 62 63 /** 64 * Randomly populates the college radius with buildings. 65 * Changed for Assessment 2: 66 * - Set buffer in Pirate Component to the radius of the college 67 * @param colour used to pull the appropriate flag sprite 68 */ 69 private void spawn(String colour) { 70 JsonValue collegeSettings = GameManager.getSettings().get("college"); 71 float radius = collegeSettings.getFloat("spawnRadius"); 72 buffer = Utilities.tilesToDistance(radius+1f) ; 73 // radius = Utilities.tilesToDistance(radius) * BUILDING_SCALE; 74 final Vector2 origin = getComponent(Transform.class).getPosition(); 75 ArrayList<Vector2> posList = new ArrayList<>(); 76 posList.add(new Vector2(0, 0)); 77 78 for (int i = 0; i < collegeSettings.getInt("numBuildings"); i++) { 79 Vector2 pos = Utilities.randomPos(-radius, radius); 80 pos = Utilities.floor(pos); 81 82 if (!posList.contains(pos)) { 83 posList.add(pos); 84 85 pos = Utilities.tilesToDistance(pos).add(origin); 86 87 Building b = new Building(this); 88 buildings.add(b); 89 90 String b_name = Utilities.randomChoice(buildingNames); 91 92 b.create(pos, b_name); 93 } 94 } 95 flag = new Building(this,true); 96 buildings.add(flag); 97 flag.create(origin, colour); 98 } 99 100 /** 101 * True as long as unharmed buildings remain, false otherwise. 102 * Changed for Assessment 2: 103 * - Added boolean return for Kill Quest functionality. 104 * - Renamed boolean for readability 105 * - Added functionality for changing Flag upon capture. 106 * @return the status of this college 107 */ 108 public boolean isAlive() { 109 if (!alive) { 110 return false; 111 } 112 boolean buildingsRemain = false; 113 for (int i = 0; i < buildings.size() - 1; i++) { 114 Building b = buildings.get(i); 115 if (b.isAlive()) { 116 buildingsRemain = true; 117 } 118 } 119 if (!buildingsRemain) { 120 getComponent(Pirate.class).kill(); 121 if(mostRecentAttacker != null){ 122 final Vector2 origin = getComponent(Transform.class).getPosition(); 123 flag.create(origin,mostRecentAttacker.getColour()); 124 getComponent(Pirate.class).setFactionId(mostRecentAttacker.getID()); 125 } 126 Player p = GameManager.getPlayer(); 127 p.plunder(25); 128 } 129 130 alive = buildingsRemain; 131 return alive; 132 } 133 134 /** 135 * Added for Assessment 2 136 * @return The Faction of the Pirate Component attached to this entity 137 */ 138 public Faction getFaction() { 139 return getComponent(Pirate.class).getFaction(); 140 } 141 142 /** 143 * Added for Assessment 2 144 * Sets the Faction which most recently attacked this College 145 * @param conqueror the Faction which most recently attacked this college 146 */ 147 public void setMostRecentAttacker(Faction conqueror){ 148 mostRecentAttacker = conqueror; 149 } 150 151 /** 152 * Added for Assessment 2 153 * @return copy of the transform's position 154 */ 155 public Vector2 getPosition() { 156 return getComponent(Transform.class).getPosition().cpy(); 157 } 158 159 /** 160 * Added for Assessment 2 161 * @param ship the Ship being checked 162 * @return displacement in form [magnitude,direction] between parsed ship and this college 163 */ 164 public ArrayList<Vector2> displacementFromShip(Ship ship) { 165 Vector2 shipLocale = ship.getPosition(); 166 Vector2 thisPosition = getPosition(); 167 168 float xDiff = shipLocale.x-thisPosition.x; 169 float yDiff = shipLocale.y-thisPosition.y; 170 171 Vector2 magnitude = new Vector2(Math.abs(xDiff),Math.abs(yDiff)); 172 Vector2 direction = new Vector2(xDiff,yDiff); 173 174 ArrayList<Vector2> displacement = new ArrayList<>(); 175 displacement.add(magnitude); 176 displacement.add(direction); 177 178 return displacement; 179 } 180 181 /** 182 * Added for Assessment 2 to meet requirements 183 * Calls shoot function of internal component 184 * @param startPos the position the cannonball is to be spawned at 185 * @param direction the direction the cannonball is to be fired in 186 */ 187 public void shoot(Vector2 startPos, Vector2 direction) { 188 getComponent(Pirate.class).shoot(startPos, direction); 189 } 190 191 /** 192 * Added for Assessment 2 193 * Systematically kills each building attached to this college, then marks the college as dead. 194 */ 195 public void killThisCollege(Faction conqueror) { 196 for (int i = 0; i < buildings.size() - 1; i++) { 197 Building b = buildings.get(i); 198 if (b.isAlive()) { 199 b.destroy(conqueror); 200 } 201 } 202 isAlive(); 203 } 204 205 /** 206 * Runs once per frame 207 * Changed for Assessment 2: 208 * - Added checks for if the college is in a specific range of the player 209 * - Added functionality where the college shoots at the player if on opposing factions and in range. 210 */ 211 @Override 212 public void update() { 213 super.update(); 214 isAlive(); 215 216 Player p = GameManager.getPlayer(); 217 long current = TimeUtils.millis() / 1000; 218 if ( (current > lastShootTime) && !getFaction().equals(p.getFaction()) ) { 219 220 ArrayList<Vector2> displacementToPlayer = displacementFromShip(p); 221 Vector2 distanceToPlayer = displacementToPlayer.get(0); 222 223 if( (distanceToPlayer.x < buffer*5) && (distanceToPlayer.y < buffer*5) ) { 224 float scaleFactor = Math.max( Math.abs(displacementToPlayer.get(1).x) , Math.abs(displacementToPlayer.get(1).y) ); 225 float xBuffer = (displacementToPlayer.get(1).x / scaleFactor)*buffer; 226 float yBuffer = (displacementToPlayer.get(1).y / scaleFactor)*buffer; 227 Vector2 bufferShift = new Vector2(xBuffer,yBuffer); 228 Vector2 bufferedStart = getPosition().add(bufferShift); 229 230 shoot(bufferedStart, displacementToPlayer.get(1)); 231 } 232 } 233 lastShootTime = current; 234 } 235 }