001package com.fs.starfarer.api.impl.campaign.missions.cb;
002
003import com.fs.starfarer.api.campaign.StarSystemAPI;
004import com.fs.starfarer.api.campaign.econ.MarketAPI;
005import com.fs.starfarer.api.impl.campaign.ids.Factions;
006import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
007import com.fs.starfarer.api.impl.campaign.ids.Skills;
008import com.fs.starfarer.api.impl.campaign.ids.Tags;
009import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
010import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality;
011import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetSize;
012import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerNum;
013import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerQuality;
014
015public class CBMerc extends BaseCustomBountyCreator {
016
017        public static float PROB_SMALL_FLEET = 0.5f;
018        public static float PROB_SOME_PHASE_IN_SMALL_FLEET = 0.5f;
019        public static float PROB_CARRIER_BASED_LARGE_FLEET = 0.33f;
020        public static float PROB_SOME_PHASE_IN_LARGE_FLEET = 0.5f;
021        
022        @Override
023        public float getFrequency(HubMissionWithBarEvent mission, int difficulty) {
024                return super.getFrequency(mission, difficulty) * CBStats.MERC_FREQ;
025        }
026        
027        public String getBountyNamePostfix(HubMissionWithBarEvent mission, CustomBountyData data) {
028                return " - Elite Mercenary";
029        }
030        
031        protected StarSystemAPI findSystem(MarketAPI createdAt, HubMissionWithBarEvent mission, int difficulty, Object bountyStage) {
032//              mission.requireSystemTags(ReqMode.ANY, Tags.THEME_RUINS, Tags.THEME_MISC, Tags.THEME_REMNANT_SECONDARY,
033//                                                                Tags.THEME_DERELICT, Tags.THEME_REMNANT_DESTROYED);
034                mission.requireSystemInterestingAndNotUnsafeOrCore();
035                mission.requireSystemNotHasPulsar();
036
037                StarSystemAPI system = mission.pickSystem();
038                return system;          
039        }
040        
041        protected boolean isAggro() {
042                return true;
043        }
044        
045        @Override
046        public CustomBountyData createBounty(MarketAPI createdAt, HubMissionWithBarEvent mission, int difficulty, Object bountyStage) {
047                CustomBountyData data = new CustomBountyData();
048                data.difficulty = difficulty;
049                
050                data.system = findSystem(createdAt, mission, difficulty, bountyStage);
051                if (data.system == null) return null;
052        
053//              FleetSize size = FleetSize.MEDIUM;
054//              FleetSize sizeWolfpack = FleetSize.MEDIUM;
055//              FleetQuality quality = FleetQuality.VERY_HIGH;
056//              FleetQuality qualityWolfpack = FleetQuality.SMOD_3;
057                
058                boolean smallFleet = mission.rollProbability(PROB_SMALL_FLEET);
059                boolean smallUsePhase = mission.rollProbability(PROB_SOME_PHASE_IN_SMALL_FLEET);
060                boolean largeUsePhase = mission.rollProbability(PROB_SOME_PHASE_IN_LARGE_FLEET);
061                boolean largeUseCarriers = mission.rollProbability(PROB_CARRIER_BASED_LARGE_FLEET);
062                
063//              smallFleet = true;
064//              largeUseCarriers = false;
065//              largeUsePhase = true;
066//              smallUsePhase = true;
067                
068                beginFleet(mission, data);
069                if (smallFleet) {
070                        data.custom1 = true;
071                        if (difficulty <= 6) {
072                                mission.triggerCreateFleet(FleetSize.SMALL, FleetQuality.SMOD_3, 
073                                                                                   Factions.MERCENARY, FleetTypes.MERC_BOUNTY_HUNTER, data.system);
074                                mission.triggerSetFleetMaxShipSize(1);
075                                mission.triggerSetFleetDoctrineOther(1, 4);
076                        } else if (difficulty <= 7) {
077                                mission.triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.SMOD_3, 
078                                                                                   Factions.MERCENARY, FleetTypes.MERC_BOUNTY_HUNTER, data.system);
079                                mission.triggerSetFleetMaxShipSize(2);
080                                mission.triggerSetFleetDoctrineOther(2, 4);
081                        } else if (difficulty <= 8) {
082                                mission.triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.SMOD_3, 
083                                                Factions.MERCENARY, FleetTypes.MERC_BOUNTY_HUNTER, data.system);
084                                mission.triggerSetFleetMaxShipSize(3);
085                                mission.triggerSetFleetDoctrineOther(3, 4);
086                        } else if (difficulty <= 9) {
087                                mission.triggerCreateFleet(FleetSize.LARGE, FleetQuality.SMOD_3, 
088                                                Factions.MERCENARY, FleetTypes.MERC_BOUNTY_HUNTER, data.system);
089                                mission.triggerSetFleetDoctrineOther(4, 4);
090                        } else if (difficulty <= 10) {
091                                mission.triggerCreateFleet(FleetSize.LARGE, FleetQuality.SMOD_3, 
092                                                Factions.MERCENARY, FleetTypes.MERC_BOUNTY_HUNTER, data.system);
093                                mission.triggerSetFleetDoctrineOther(5, 4);
094                        }
095                        
096                        mission.triggerSetFleetMaxNumShips(12);
097                        
098                        if (smallUsePhase) {
099                                if (difficulty <= 8) {
100                                        mission.triggerSetFleetDoctrineComp(0, 0, 5);
101                                } else {
102                                        mission.triggerSetFleetDoctrineComp(4, 0, 3);
103                                }
104                        } else {
105                                mission.triggerSetFleetDoctrineComp(5, 0, 0);
106                        }
107                        
108                        mission.triggerFleetAddCommanderSkill(Skills.COORDINATED_MANEUVERS, 1);
109                        mission.triggerFleetAddCommanderSkill(Skills.WOLFPACK_TACTICS, 1);
110                        mission.triggerFleetAddCommanderSkill(Skills.ELECTRONIC_WARFARE, 1);
111                        mission.triggerFleetAddCommanderSkill(Skills.FLUX_REGULATION, 1);
112                        mission.triggerFleetAddCommanderSkill(Skills.TACTICAL_DRILLS, 1);
113                        mission.triggerSetFleetOfficers(OfficerNum.MORE, OfficerQuality.UNUSUALLY_HIGH);
114                } else {
115                        if (difficulty <= 6) {
116                                mission.triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.VERY_HIGH, 
117                                                                                   Factions.MERCENARY, FleetTypes.MERC_BOUNTY_HUNTER, data.system);
118                        } else if (difficulty <= 7) {
119                                mission.triggerCreateFleet(FleetSize.LARGE, FleetQuality.VERY_HIGH, 
120                                                                                   Factions.MERCENARY, FleetTypes.MERC_PRIVATEER, data.system);
121                        } else if (difficulty <= 8) {
122                                mission.triggerCreateFleet(FleetSize.VERY_LARGE, FleetQuality.VERY_HIGH, 
123                                                                                   Factions.MERCENARY, FleetTypes.MERC_ARMADA, data.system);
124                        } else if (difficulty <= 9) {
125                                mission.triggerCreateFleet(FleetSize.VERY_LARGE, FleetQuality.SMOD_1, 
126                                                                                   Factions.MERCENARY, FleetTypes.MERC_ARMADA, data.system);
127                        } else if (difficulty <= 10) {
128                                mission.triggerCreateFleet(FleetSize.HUGE, FleetQuality.SMOD_2, 
129                                                                                   Factions.MERCENARY, FleetTypes.MERC_ARMADA, data.system);
130                        }
131                        
132                        if (largeUseCarriers) {
133                                mission.triggerSetFleetDoctrineComp(3, 4, 0);
134                                mission.triggerFleetAddCommanderSkill(Skills.CARRIER_GROUP, 1);
135                                mission.triggerFleetAddCommanderSkill(Skills.FIGHTER_UPLINK, 1);
136                        } else {
137                                if (largeUsePhase) {
138                                        mission.triggerSetFleetDoctrineComp(3, 0, 2);
139                                        mission.triggerFleetAddCommanderSkill(Skills.PHASE_CORPS, 1);
140                                        mission.triggerFleetAddCommanderSkill(Skills.FLUX_REGULATION, 1);
141                                } else {
142                                        mission.triggerSetFleetDoctrineComp(5, 0, 0);
143                                        mission.triggerFleetAddCommanderSkill(Skills.COORDINATED_MANEUVERS, 1);
144                                        mission.triggerFleetAddCommanderSkill(Skills.ELECTRONIC_WARFARE, 1);
145                                }
146                        }
147                        
148                        mission.triggerSetFleetDoctrineOther(3, 3);
149                        mission.triggerSetFleetOfficers(OfficerNum.MORE, OfficerQuality.HIGHER);
150                }
151                
152                
153                mission.triggerSetFleetNoCommanderSkills();
154                mission.triggerFleetAddCommanderSkill(Skills.CREW_TRAINING, 1);
155                mission.triggerSetFleetFaction(Factions.INDEPENDENT);
156                if (isAggro()) {
157                        mission.triggerMakeHostileAndAggressive();
158                        mission.triggerMakeNoRepImpact();
159                }
160                mission.triggerFleetAllowLongPursuit();
161                mission.triggerDoNotShowFleetDesc();
162                mission.triggerFleetSetAllWeapons();
163                
164                mission.triggerPickLocationAtInSystemJumpPoint(data.system);
165                mission.triggerSpawnFleetAtPickedLocation(null, null);
166                //mission.triggerFleetSetPatrolActionText("patrolling");
167                mission.triggerOrderFleetPatrol(data.system, true, Tags.JUMP_POINT, Tags.SALVAGEABLE, Tags.PLANET, Tags.OBJECTIVE);
168                
169                data.fleet = createFleet(mission, data);
170                if (data.fleet == null) return null;
171                
172                setRepChangesBasedOnDifficulty(data, difficulty);
173                data.baseReward = CBStats.getBaseBounty(difficulty, CBStats.MERC_MULT, mission);
174                
175                return data;
176        }
177        
178        @Override
179        public void updateInteractionData(HubMissionWithBarEvent mission, CustomBountyData data) {
180                String id = mission.getMissionId();
181                if (data.custom1 != null) {
182                        mission.set("$" + id + "_smallMerc", data.difficulty);
183                        mission.set("$bcb_smallMerc", data.difficulty);
184                } else {
185                        mission.unset("$" + id + "_smallMerc");
186                        mission.unset("$bcb_smallMerc");
187                }
188        }
189
190        @Override
191        public int getMaxDifficulty() {
192                return super.getMaxDifficulty();
193        }
194
195        @Override
196        public int getMinDifficulty() {
197                return 6;
198        }
199
200}
201
202
203
204
205
206