001package com.fs.starfarer.api.impl.campaign.missions.cb; 002 003import java.awt.Color; 004import java.util.ArrayList; 005import java.util.List; 006 007import com.fs.starfarer.api.Global; 008import com.fs.starfarer.api.campaign.CampaignFleetAPI; 009import com.fs.starfarer.api.campaign.FactionAPI; 010import com.fs.starfarer.api.campaign.TextPanelAPI; 011import com.fs.starfarer.api.campaign.econ.Industry; 012import com.fs.starfarer.api.campaign.econ.MarketAPI; 013import com.fs.starfarer.api.characters.PersonAPI; 014import com.fs.starfarer.api.fleet.FleetMemberAPI; 015import com.fs.starfarer.api.fleet.FleetMemberType; 016import com.fs.starfarer.api.impl.campaign.DebugFlags; 017import com.fs.starfarer.api.impl.campaign.econ.impl.OrbitalStation; 018import com.fs.starfarer.api.impl.campaign.ids.Conditions; 019import com.fs.starfarer.api.impl.campaign.ids.Industries; 020import com.fs.starfarer.api.impl.campaign.missions.cb.BaseCustomBounty.Stage; 021import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent; 022import com.fs.starfarer.api.ui.TooltipMakerAPI; 023import com.fs.starfarer.api.util.Misc; 024import com.fs.starfarer.api.util.WeightedRandomPicker; 025 026public class CBEnemyStation extends BaseCustomBountyCreator { 027 028 @Override 029 public float getBountyDays() { 030 return CBStats.ENEMY_STATION_DAYS; 031 } 032 033 @Override 034 public float getFrequency(HubMissionWithBarEvent mission, int difficulty) { 035 if (getStations(mission, difficulty).isEmpty()) return 0f; 036 return super.getFrequency(mission, difficulty) * CBStats.ENEMY_STATION_FREQ; 037 } 038 039 public void addIntelAssessment(TextPanelAPI text, HubMissionWithBarEvent mission, CustomBountyData data) { 040 float opad = 10f; 041 List<FleetMemberAPI> list = new ArrayList<FleetMemberAPI>(); 042 List<FleetMemberAPI> members = data.fleet.getFleetData().getMembersListCopy(); 043 int max = 7; 044 int cols = 7; 045 float iconSize = 440 / cols; 046 Color h = Misc.getHighlightColor(); 047 048 for (FleetMemberAPI member : members) { 049 if (list.size() >= max) break; 050 051 if (member.isFighterWing()) continue; 052 053 FleetMemberAPI copy = Global.getFactory().createFleetMember(FleetMemberType.SHIP, member.getVariant()); 054 if (member.isFlagship()) { 055 copy.setCaptain(data.fleet.getCommander()); 056 } 057 list.add(copy); 058 } 059 060 if (!list.isEmpty()) { 061 TooltipMakerAPI info = text.beginTooltip(); 062 info.setParaSmallInsignia(); 063 info.addPara(Misc.ucFirst(mission.getPerson().getHeOrShe()) + " taps a data pad, and " + 064 "an intel assessment shows up on your tripad.", 0f); 065 info.addShipList(cols, 1, iconSize, data.fleet.getFaction().getBaseUIColor(), list, opad); 066 067 FactionAPI f = data.fleet.getFaction(); 068 info.addPara("The station is controlled by " + f.getDisplayNameWithArticle() + " and is likely to " + 069 "be supported by a number of patrols.", 070 opad, f.getBaseUIColor(), 071 f.getDisplayNameWithArticleWithoutArticle()); 072 text.addTooltip(); 073 } 074 return; 075 } 076 077 078 public void addFleetDescription(TooltipMakerAPI info, float width, float height, HubMissionWithBarEvent mission, CustomBountyData data) { 079 PersonAPI person = data.fleet.getCommander(); 080 FactionAPI faction = person.getFaction(); 081 int cols = 7; 082 float iconSize = width / cols; 083 float opad = 10f; 084 Color h = Misc.getHighlightColor(); 085 086 if (DebugFlags.PERSON_BOUNTY_DEBUG_INFO) { 087 088 } 089 boolean deflate = false; 090 if (!data.fleet.isInflated()) { 091 data.fleet.inflateIfNeeded(); 092 deflate = true; 093 } 094 095 List<FleetMemberAPI> list = new ArrayList<FleetMemberAPI>(); 096 097 List<FleetMemberAPI> members = data.fleet.getFleetData().getMembersListCopy(); 098 int max = 7; 099 for (FleetMemberAPI member : members) { 100 if (list.size() >= max) break; 101 102 if (member.isFighterWing()) continue; 103 104 FleetMemberAPI copy = Global.getFactory().createFleetMember(FleetMemberType.SHIP, member.getVariant()); 105 if (member.isFlagship()) { 106 copy.setCaptain(person); 107 } 108 list.add(copy); 109 } 110 111 if (!list.isEmpty()) { 112 info.addPara("The bounty posting contains partial intel about the station.", opad); 113 info.addShipList(cols, 1, iconSize, faction.getBaseUIColor(), list, opad); 114 115 int num = members.size() - list.size(); 116 //num = Math.round((float)num * (1f + random.nextFloat() * 0.5f)); 117 118 if (num < 5) num = 0; 119 else if (num < 10) num = 5; 120 else if (num < 20) num = 10; 121 else num = 20; 122 123 FactionAPI f = data.fleet.getFaction(); 124 info.addPara("The station is controlled by " + f.getDisplayNameWithArticle() + " and is likely to " + 125 "be supported by a number of patrols.", 126 opad, f.getBaseUIColor(), 127 f.getDisplayNameWithArticleWithoutArticle()); 128 } 129 130 if (deflate) { 131 data.fleet.deflate(); 132 } 133 } 134 135 136 public List<CampaignFleetAPI> getStations(HubMissionWithBarEvent mission, int difficulty) { 137 List<CampaignFleetAPI> stations = new ArrayList<CampaignFleetAPI>(); 138 String faction = mission.getPerson().getFaction().getId(); 139 for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) { 140 if (market.isHidden()) continue; 141 if (market.isPlayerOwned()) continue; 142 if (market.hasCondition(Conditions.DECIVILIZED)) continue; 143 if (!market.getFaction().isHostileTo(faction)) continue; 144 145 Industry ind = Misc.getStationIndustry(market); 146 147 if (!(ind instanceof OrbitalStation)) continue; 148 OrbitalStation os = (OrbitalStation) ind; 149 if (os.getDisruptedDays() > 0) continue; 150 151 boolean battlestation = os.getSpec().hasTag(Industries.TAG_BATTLESTATION); 152 boolean starfortress = os.getSpec().hasTag(Industries.TAG_STARFORTRESS); 153 154 if (difficulty == 10 && !starfortress) continue; 155 if ((difficulty == 8 || difficulty == 9) && !battlestation) continue; 156 if (!battlestation && !starfortress && difficulty >= 8) continue; 157 158 CampaignFleetAPI fleet = Misc.getStationFleet(market); 159 if (fleet != null) { 160 stations.add(fleet); 161 } 162 } 163 return stations; 164 } 165 166 public String getBountyNamePostfix(HubMissionWithBarEvent mission, CustomBountyData data) { 167 return " - " + data.fleet.getName(); 168 } 169 170 171 @Override 172 public CustomBountyData createBounty(MarketAPI createdAt, HubMissionWithBarEvent mission, int difficulty, Object bountyStage) { 173 CustomBountyData data = new CustomBountyData(); 174 data.difficulty = difficulty; 175 176 177 WeightedRandomPicker<CampaignFleetAPI> picker = new WeightedRandomPicker<CampaignFleetAPI>(mission.getGenRandom()); 178 picker.addAll(getStations(mission, difficulty)); 179 180 181 data.fleet = picker.pick(); 182 if (data.fleet == null) return null; 183 184 MarketAPI market = Misc.getStationMarket(data.fleet); 185 if (market == null) return null; 186 187 data.market = market; 188 data.custom2 = bountyStage; 189 190 data.system = data.fleet.getStarSystem(); 191 if (data.system == null) return null; 192 193 setRepChangesBasedOnDifficulty(data, difficulty); 194 data.baseReward = CBStats.getBaseBounty(difficulty, CBStats.ENEMY_STATION_MULT, mission); 195 196 return data; 197 } 198 199 @Override 200 public void notifyAccepted(MarketAPI createdAt, HubMissionWithBarEvent mission, CustomBountyData data) { 201 MarketAPI market = data.market; 202 Object stage = data.custom2; 203 204 if (data.difficulty <= 7) { 205 mission.triggerCreateLargePatrolAroundMarket(market, stage, 0f); 206 mission.triggerCreateSmallPatrolAroundMarket(market, stage, 0f); 207 } else if (data.difficulty <= 9) { 208 mission.triggerCreateLargePatrolAroundMarket(market, stage, 0f); 209 mission.triggerCreateMediumPatrolAroundMarket(market, stage, 0f); 210 mission.triggerCreateSmallPatrolAroundMarket(market, stage, 0f); 211 } else { 212 mission.triggerCreateLargePatrolAroundMarket(market, stage, 0f); 213 mission.triggerCreateLargePatrolAroundMarket(market, stage, 0f); 214 mission.triggerCreateMediumPatrolAroundMarket(market, stage, 0f); 215 mission.triggerCreateSmallPatrolAroundMarket(market, stage, 0f); 216 } 217 218 mission.connectWithHostilitiesEnded(Stage.BOUNTY, Stage.FAILED_NO_PENALTY, mission.getPerson(), market); 219 mission.setStageOnHostilitiesEnded(Stage.FAILED_NO_PENALTY, mission.getPerson(), market); 220 } 221 222 @Override 223 public String getIconName() { 224 return Global.getSettings().getSpriteName("campaignMissions", "station_bounty"); 225 } 226 227 228 @Override 229 public int getMaxDifficulty() { 230 return super.getMaxDifficulty(); 231 } 232 233 @Override 234 public int getMinDifficulty() { 235 return 6; 236 } 237 238} 239 240 241 242 243 244