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