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