001package com.fs.starfarer.api.impl.campaign.missions.cb;
002
003import java.util.List;
004
005import com.fs.starfarer.api.Global;
006import com.fs.starfarer.api.campaign.AICoreOfficerPlugin;
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.StarSystemAPI;
009import com.fs.starfarer.api.campaign.econ.MarketAPI;
010import com.fs.starfarer.api.characters.PersonAPI;
011import com.fs.starfarer.api.fleet.FleetMemberAPI;
012import com.fs.starfarer.api.impl.campaign.ids.Commodities;
013import com.fs.starfarer.api.impl.campaign.ids.Factions;
014import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
015import com.fs.starfarer.api.impl.campaign.ids.Skills;
016import com.fs.starfarer.api.impl.campaign.ids.Tags;
017import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
018import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality;
019import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetSize;
020import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerNum;
021import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerQuality;
022import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
023import com.fs.starfarer.api.loading.VariantSource;
024import com.fs.starfarer.api.util.Misc;
025import com.fs.starfarer.api.util.WeightedRandomPicker;
026
027public class CBRemnantPlus extends BaseCustomBountyCreator {
028
029        public static String ACCEPTED_KEY = "$CBRemnantPlus_accepted";
030        public static float PROB_IN_SYSTEM_WITH_BASE = 0.5f;
031        
032        @Override
033        public float getBountyDays() {
034                return CBStats.REMNANT_PLUS_DAYS;
035        }
036        
037        @Override
038        public float getFrequency(HubMissionWithBarEvent mission, int difficulty) {
039                boolean wasEverAccepted = Global.getSector().getMemoryWithoutUpdate().getBoolean(ACCEPTED_KEY);
040                if (wasEverAccepted) return 0f;
041                return super.getFrequency(mission, difficulty) * CBStats.REMNANT_PLUS_FREQ;
042        }
043        
044        @Override
045        public void notifyAccepted(MarketAPI createdAt, HubMissionWithBarEvent mission, CustomBountyData data) {
046                //mission.setNoAbandon();
047                Global.getSector().getMemoryWithoutUpdate().set(ACCEPTED_KEY, true);
048        }
049        
050        @Override
051        protected boolean isRepeatableGlobally() {
052                return false;
053        }
054
055        public String getBountyNamePostfix(HubMissionWithBarEvent mission, CustomBountyData data) {
056                return " - Unusual Remnant Fleet";
057        }
058        
059        @Override
060        public String getIconName() {
061                return Global.getSettings().getSpriteName("campaignMissions", "remnant_bounty");
062        }
063        
064        @Override
065        public CustomBountyData createBounty(MarketAPI createdAt, HubMissionWithBarEvent mission, int difficulty, Object bountyStage) {
066                CustomBountyData data = new CustomBountyData();
067                data.difficulty = difficulty;
068                
069                //mission.requireSystem(this);
070                mission.requireSystemTags(ReqMode.NOT_ANY, Tags.THEME_CORE);
071                mission.preferSystemTags(ReqMode.ANY, Tags.HAS_CORONAL_TAP);
072                mission.preferSystemUnexplored();
073                mission.preferSystemInteresting();
074//              mission.requireSystemTags(ReqMode.ANY, Tags.THEME_RUINS, Tags.THEME_MISC, Tags.THEME_REMNANT,
075//                                Tags.THEME_DERELICT, Tags.THEME_REMNANT_DESTROYED);
076                mission.requireSystemNotHasPulsar();            
077                mission.preferSystemBlackHoleOrNebula();
078                mission.preferSystemOnFringeOfSector();
079                
080                StarSystemAPI system = mission.pickSystem();
081                data.system = system;
082        
083                FleetSize size = FleetSize.HUGE;
084                FleetQuality quality = FleetQuality.SMOD_3;
085                OfficerQuality oQuality = OfficerQuality.AI_ALPHA;
086                OfficerNum oNum = OfficerNum.ALL_SHIPS;
087                String type = FleetTypes.PATROL_LARGE;
088                
089                beginFleet(mission, data);
090                mission.triggerCreateFleet(size, quality, Factions.REMNANTS, type, data.system);
091                mission.triggerSetFleetOfficers(oNum, oQuality);
092                mission.triggerAutoAdjustFleetSize(size, size.next());
093                mission.triggerSetRemnantConfigActive();
094                mission.triggerSetFleetNoCommanderSkills();
095                mission.triggerFleetAddCommanderSkill(Skills.FLUX_REGULATION, 1);
096                mission.triggerFleetAddCommanderSkill(Skills.ELECTRONIC_WARFARE, 1);
097                mission.triggerFleetAddCommanderSkill(Skills.COORDINATED_MANEUVERS, 1);
098                mission.triggerFleetAddCommanderSkill(Skills.NAVIGATION, 1);
099                mission.triggerFleetSetAllWeapons();
100                mission.triggerMakeHostileAndAggressive();
101                mission.triggerFleetAllowLongPursuit();
102                mission.triggerPickLocationAtInSystemJumpPoint(data.system);
103                mission.triggerSpawnFleetAtPickedLocation(null, null);
104                mission.triggerFleetSetPatrolActionText("sending hyperwave signals");
105                mission.triggerOrderFleetPatrol(data.system, true, Tags.JUMP_POINT, Tags.NEUTRINO, Tags.NEUTRINO_HIGH, Tags.STATION,
106                                                                            Tags.SALVAGEABLE, Tags.GAS_GIANT);
107                
108                data.fleet = createFleet(mission, data);
109                if (data.fleet == null) return null;
110                
111                CampaignFleetAPI fleet = Global.getFactory().createEmptyFleet(Factions.OMEGA, "", true);
112                WeightedRandomPicker<String> picker = new WeightedRandomPicker<String>(mission.getGenRandom());
113                picker.add("tesseract_Attack");
114                picker.add("tesseract_Attack2");
115                picker.add("tesseract_Strike");
116                picker.add("tesseract_Disruptor");
117                fleet.getFleetData().addFleetMember(picker.pick());
118                FleetMemberAPI member = fleet.getFlagship();
119                
120                AICoreOfficerPlugin plugin = Misc.getAICoreOfficerPlugin(Commodities.OMEGA_CORE);
121                PersonAPI person = plugin.createPerson(Commodities.OMEGA_CORE, Factions.OMEGA, mission.getGenRandom());
122                member.setCaptain(person);
123                
124                int i = data.fleet.getFleetData().getMembersListCopy().size() - 1;
125                FleetMemberAPI last = data.fleet.getFleetData().getMembersListCopy().get(i);
126                data.fleet.getFleetData().removeFleetMember(last);
127                
128                data.fleet.setCommander(person);
129                data.fleet.getFleetData().addFleetMember(member);
130                data.fleet.getFleetData().sort();
131                List<FleetMemberAPI> members = data.fleet.getFleetData().getMembersListCopy();
132                for (FleetMemberAPI curr : members) {
133                        curr.getRepairTracker().setCR(curr.getRepairTracker().getMaxCR());
134                }
135                
136                member.setVariant(member.getVariant().clone(), false, false);
137                member.getVariant().setSource(VariantSource.REFIT);
138                member.getVariant().addTag(Tags.SHIP_LIMITED_TOOLTIP);
139                member.getVariant().addTag(Tags.VARIANT_CONSISTENT_WEAPON_DROPS);
140                
141                // otherwise, remnant dialog which isn't appropriate with an Omega in charge
142                data.fleet.getMemoryWithoutUpdate().set("$ignorePlayerCommRequests", true);
143                
144                setRepChangesBasedOnDifficulty(data, difficulty);
145                data.baseReward = CBStats.getBaseBounty(difficulty, CBStats.REMNANT_PLUS_MULT, mission);
146                
147                return data;
148        }
149        
150
151        @Override
152        public int getMaxDifficulty() {
153                return super.getMaxDifficulty();
154        }
155
156        @Override
157        public int getMinDifficulty() {
158                return super.getMaxDifficulty();
159        }
160
161}
162
163
164
165
166
167