001package com.fs.starfarer.api.campaign; 002 003import java.util.ArrayList; 004import java.util.HashMap; 005import java.util.LinkedHashSet; 006import java.util.List; 007import java.util.Map; 008import java.util.Set; 009 010import com.fs.starfarer.api.Global; 011import com.fs.starfarer.api.characters.PersonAPI; 012import com.fs.starfarer.api.combat.DeployedFleetMemberAPI; 013import com.fs.starfarer.api.combat.EngagementResultAPI; 014import com.fs.starfarer.api.fleet.CrewCompositionAPI; 015import com.fs.starfarer.api.fleet.FleetGoal; 016import com.fs.starfarer.api.fleet.FleetMemberAPI; 017 018public interface FleetEncounterContextPlugin { 019 020 public static enum Status { 021 NORMAL, 022 DISABLED, 023 DESTROYED, 024 REPAIRED, 025 CAPTURED, 026 } 027 028 /** 029 * This, and any FleetEncounterContext code that uses this, is only used for battles involving the player, 030 * and not AI vs AI autoresloved ones. 031 * @author Alex Mosolov 032 * 033 * Copyright 2013 Fractal Softworks, LLC 034 */ 035 public static enum EngagementOutcome { 036 MUTUAL_DESTRUCTION, 037 BATTLE_PLAYER_WIN, 038 BATTLE_PLAYER_WIN_TOTAL, 039 BATTLE_ENEMY_WIN, 040 BATTLE_ENEMY_WIN_TOTAL, 041 ESCAPE_PLAYER_LOSS_TOTAL, 042 ESCAPE_PLAYER_SUCCESS, 043 ESCAPE_PLAYER_WIN, 044 ESCAPE_PLAYER_WIN_TOTAL, 045 ESCAPE_ENEMY_LOSS_TOTAL, 046 ESCAPE_ENEMY_SUCCESS, 047 ESCAPE_ENEMY_WIN, 048 ESCAPE_ENEMY_WIN_TOTAL, 049 050 BATTLE_PLAYER_OUT_FIRST_WIN, 051 BATTLE_PLAYER_OUT_FIRST_LOSS, 052 ESCAPE_PLAYER_OUT_FIRST_WIN, 053 ESCAPE_PLAYER_OUT_FIRST_LOSS, 054 PURSUIT_PLAYER_OUT_FIRST_WIN, 055 PURSUIT_PLAYER_OUT_FIRST_LOSS, 056 } 057 058 public static class FleetMemberData { 059 private Status status; 060 private FleetMemberAPI member; 061 public FleetMemberData(Status status, FleetMemberAPI member) { 062 this.status = status; 063 this.member = member; 064 } 065 public Status getStatus() { 066 return status; 067 } 068 public FleetMemberAPI getMember() { 069 return member; 070 } 071 public void setStatus(Status status) { 072 this.status = status; 073 } 074 public void setMember(FleetMemberAPI member) { 075 this.member = member; 076 } 077 } 078 079 public static class DataForEncounterSide { 080 public static class OfficerEngagementData { 081 public CampaignFleetAPI sourceFleet; 082 public PersonAPI person; 083 public float timeDeployed; 084 public OfficerEngagementData(CampaignFleetAPI sourceFleet) { 085 this.sourceFleet = sourceFleet; 086 } 087 } 088 private float maxTimeDeployed; 089 private Map<PersonAPI, OfficerEngagementData> officerData = new HashMap<PersonAPI, OfficerEngagementData>(); 090 private Map<FleetMemberAPI, OfficerEngagementData> fleetMemberDeploymentData = new HashMap<FleetMemberAPI, OfficerEngagementData>(); 091 092 private CampaignFleetAPI fleet; 093 094 private List<FleetMemberData> ownCasualties = new ArrayList<FleetMemberData>(); 095 private List<FleetMemberData> enemyCasualties = new ArrayList<FleetMemberData>(); 096 097 private List<FleetMemberAPI> deployedInLastEngagement = new ArrayList<FleetMemberAPI>(); 098 private List<FleetMemberAPI> retreatedFromLastEngagement = new ArrayList<FleetMemberAPI>(); 099 private List<FleetMemberAPI> inReserveDuringLastEngagement = new ArrayList<FleetMemberAPI>(); 100 private List<FleetMemberAPI> disabledInLastEngagement = new ArrayList<FleetMemberAPI>(); 101 private List<FleetMemberAPI> destroyedInLastEngagement = new ArrayList<FleetMemberAPI>(); 102 private Map<FleetMemberAPI, DeployedFleetMemberAPI> memberToDeployedMap = new HashMap<FleetMemberAPI, DeployedFleetMemberAPI>(); 103 104 private Set<FleetMemberAPI> membersWithOfficerOrPlayerAsOrigCaptain = new LinkedHashSet<FleetMemberAPI>(); 105 106 private CrewCompositionAPI crewLossesDuringLastEngagement = Global.getFactory().createCrewComposition(); 107 private CrewCompositionAPI recoverableCrewLosses = Global.getFactory().createCrewComposition(); 108 109 private boolean wonLastEngagement = false; 110 private FleetGoal lastGoal = null; 111 private boolean disengaged = false; 112 private boolean didEnoughToDisengage = false; 113 private boolean enemyCanCleanDisengage = false; 114 //private boolean fleetCanCleanDisengage = false; 115 116 public DataForEncounterSide(CampaignFleetAPI fleet) { 117 this.fleet = fleet; 118 } 119 120 public Set<FleetMemberAPI> getMembersWithOfficerOrPlayerAsOrigCaptain() { 121 return membersWithOfficerOrPlayerAsOrigCaptain; 122 } 123 124 public float getMaxTimeDeployed() { 125 return maxTimeDeployed; 126 } 127 128 public void setMaxTimeDeployed(float maxTimeDeployed) { 129 this.maxTimeDeployed = maxTimeDeployed; 130 } 131 132 public Map<PersonAPI, OfficerEngagementData> getOfficerData() { 133 return officerData; 134 } 135 public Map<FleetMemberAPI, OfficerEngagementData> getFleetMemberDeploymentData() { 136 return fleetMemberDeploymentData; 137 } 138 139 public CrewCompositionAPI getRecoverableCrewLosses() { 140 return recoverableCrewLosses; 141 } 142 public CrewCompositionAPI getCrewLossesDuringLastEngagement() { 143 return crewLossesDuringLastEngagement; 144 } 145 public CampaignFleetAPI getFleet() { 146 return fleet; 147 } 148 public List<FleetMemberData> getOwnCasualties() { 149 return ownCasualties; 150 } 151 public List<FleetMemberData> getEnemyCasualties() { 152 return enemyCasualties; 153 } 154 public void addOwn(FleetMemberAPI member, Status status) { 155 ownCasualties.add(new FleetMemberData(status, member)); 156 } 157 public void removeOwnCasualty(FleetMemberAPI member) { 158 for (FleetMemberData data : ownCasualties) { 159 if (data.member == member) { 160 ownCasualties.remove(data); 161 break; 162 } 163 } 164 } 165 public void removeEnemyCasualty(FleetMemberAPI member) { 166 for (FleetMemberData data : enemyCasualties) { 167 if (data.member == member) { 168 enemyCasualties.remove(data); 169 break; 170 } 171 } 172 } 173 public void changeOwn(FleetMemberAPI member, Status newStatus) { 174 for (FleetMemberData data : ownCasualties) { 175 if (data.member == member) { 176 data.status = newStatus; 177 break; 178 } 179 } 180 } 181 public void changeEnemy(FleetMemberAPI member, Status newStatus) { 182 for (FleetMemberData data : enemyCasualties) { 183 if (data.member == member) { 184 data.status = newStatus; 185 break; 186 } 187 } 188 } 189 public void addEnemy(FleetMemberAPI member, Status status) { 190 enemyCasualties.add(new FleetMemberData(status, member)); 191 } 192 public boolean isWonLastEngagement() { 193 return wonLastEngagement; 194 } 195 public void setWonLastEngagement(boolean wonLastEngagement) { 196 this.wonLastEngagement = wonLastEngagement; 197 } 198 public FleetGoal getLastGoal() { 199 return lastGoal; 200 } 201 public void setLastGoal(FleetGoal lastGoal) { 202 this.lastGoal = lastGoal; 203 } 204 public boolean disengaged() { 205 return disengaged; 206 } 207 public void setDisengaged(boolean disengaged) { 208 this.disengaged = disengaged; 209 } 210 public List<FleetMemberAPI> getDeployedInLastEngagement() { 211 return deployedInLastEngagement; 212 } 213 public List<FleetMemberAPI> getRetreatedFromLastEngagement() { 214 return retreatedFromLastEngagement; 215 } 216 public List<FleetMemberAPI> getInReserveDuringLastEngagement() { 217 return inReserveDuringLastEngagement; 218 } 219 public List<FleetMemberAPI> getDisabledInLastEngagement() { 220 return disabledInLastEngagement; 221 } 222 public List<FleetMemberAPI> getDestroyedInLastEngagement() { 223 return destroyedInLastEngagement; 224 } 225 public boolean isDidEnoughToDisengage() { 226 return didEnoughToDisengage; 227 } 228 public void setDidEnoughToDisengage(boolean didEnoughToDisengage) { 229 this.didEnoughToDisengage = didEnoughToDisengage; 230 } 231 /** 232 * Only matters for non-autoresolved engagements. 233 * @return 234 */ 235 public Map<FleetMemberAPI, DeployedFleetMemberAPI> getMemberToDeployedMap() { 236 return memberToDeployedMap; 237 } 238 239 public boolean isEnemyCanCleanDisengage() { 240 return enemyCanCleanDisengage; 241 } 242 243 public void setEnemyCanCleanDisengage(boolean enemyCanCleanDisengage) { 244 this.enemyCanCleanDisengage = enemyCanCleanDisengage; 245 } 246 247// public boolean isFleetCanCleanDisengage() { 248// return fleetCanCleanDisengage; 249// } 250// 251// public void setFleetCanCleanDisengage(boolean fleetCanCleanDisengage) { 252// this.fleetCanCleanDisengage = fleetCanCleanDisengage; 253// } 254 255 256 } 257 258 public static enum PursueAvailability { 259 AVAILABLE, 260 TOO_SLOW, 261 NO_READY_SHIPS, 262 TOOK_SERIOUS_LOSSES, 263 LOST_LAST_ENGAGEMENT, 264 } 265 266 public static enum DisengageHarryAvailability { 267 AVAILABLE, 268 NO_READY_SHIPS, 269 LOST_LAST_ENGAGEMENT, 270 } 271 272 273 DataForEncounterSide getDataFor(CampaignFleetAPI fleet); 274 DataForEncounterSide getWinnerData(); 275 DataForEncounterSide getLoserData(); 276 CampaignFleetAPI getWinner(); 277 CampaignFleetAPI getLoser(); 278 279 boolean isEngagedInHostilities(); 280 281 EngagementOutcome getLastEngagementOutcome(); 282 283 PursueAvailability getPursuitAvailability(CampaignFleetAPI fleet, CampaignFleetAPI otherFleet); 284 DisengageHarryAvailability getDisengageHarryAvailability(CampaignFleetAPI fleet, CampaignFleetAPI otherFleet); 285 286 287 /** 288 * Returns average recovery per ship, in the range from 0 to 1. 289 * @param result 290 * @return 291 */ 292 float performPostVictoryRecovery(EngagementResultAPI result); 293 BattleAPI getBattle(); 294 void setOtherFleetHarriedPlayer(boolean otherFleetHarriedPlayer); 295 boolean isOtherFleetHarriedPlayer(); 296 boolean adjustPlayerReputation(InteractionDialogAPI dialog, String ffText); 297 float computePlayerContribFraction(); 298 //boolean isLowRepImpact(); 299 300 //void applyPostEngagementOption(EngagementResultAPI result); 301 302} 303 304 305