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