001package com.fs.starfarer.api.impl.campaign.missions.cb;
002
003import java.awt.Color;
004
005import com.fs.starfarer.api.campaign.CampaignFleetAPI;
006import com.fs.starfarer.api.campaign.StarSystemAPI;
007import com.fs.starfarer.api.campaign.econ.MarketAPI;
008import com.fs.starfarer.api.impl.campaign.ids.Factions;
009import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
010import com.fs.starfarer.api.impl.campaign.ids.Tags;
011import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
012import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality;
013import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetSize;
014import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerNum;
015import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerQuality;
016import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
017import com.fs.starfarer.api.ui.TooltipMakerAPI;
018import com.fs.starfarer.api.util.Misc;
019
020public class CBPatrol extends BaseCustomBountyCreator {
021
022        @Override
023        public float getFrequency(HubMissionWithBarEvent mission, int difficulty) {
024                return super.getFrequency(mission, difficulty) * CBStats.PATROL_FREQ;
025        }
026        
027        public String getBountyNamePostfix(HubMissionWithBarEvent mission, CustomBountyData data) {
028                return " - Patrol";
029        }
030        
031        public void addTargetLocationAndDescriptionBulletPoint(TooltipMakerAPI info,
032                        Color tc, float pad, HubMissionWithBarEvent mission,
033                        CustomBountyData data) {
034                if (data.system != null) {
035                        //info.addPara("Target is in the " + data.system.getNameWithLowercaseTypeShort() + "", tc, pad);
036                        info.addPara("Target is a %s patrol located in the " + 
037                                        data.system.getNameWithLowercaseType() + ".", pad, 
038                                        tc, data.fleet.getFaction().getBaseUIColor(), data.fleet.getFaction().getPersonNamePrefix());
039                }
040        }
041        
042        public void addTargetLocationAndDescription(TooltipMakerAPI info, float width, float height, HubMissionWithBarEvent mission, CustomBountyData data) {
043                float opad = 10f;
044                float pad = 3f;
045                Color h = Misc.getHighlightColor();
046                if (data.system != null && data.fleet != null && data.market != null) {
047                        info.addPara("The target is a %s patrol and is located in the " + data.system.getNameWithLowercaseType() + ".", opad, 
048                                        data.fleet.getFaction().getBaseUIColor(), data.fleet.getFaction().getPersonNamePrefix());
049                        info.addPara("It will most likely be found either in orbit around " + 
050                                        data.market.getName() + ", or patrolling one of the system's objectives "
051                                                        + "(such as a comm relay) or jump-points.", opad);
052                }
053        }
054        
055        @Override
056        public CustomBountyData createBounty(MarketAPI createdAt, HubMissionWithBarEvent mission, int difficulty, Object bountyStage) {
057                CustomBountyData data = new CustomBountyData();
058                data.difficulty = difficulty;
059                
060                mission.requireMarketSizeAtLeast(4);
061                mission.requireMarketNotHidden();
062                mission.requireMarketHasSpaceport();
063                mission.requireMarketNotInHyperspace();
064                mission.requireMarketFactionCustom(ReqMode.NOT_ANY, Factions.CUSTOM_DECENTRALIZED);
065                mission.requireMarketFactionNot(Factions.PIRATES); // redundant, given the above 
066                mission.requireMarketFactionNotPlayer();
067                mission.requireMarketLocationNot(createdAt.getContainingLocation());
068                MarketAPI target = mission.pickMarket();
069                
070                if (target == null || target.getStarSystem() == null) return null;
071
072                
073                StarSystemAPI system = target.getStarSystem();
074                data.system = system;
075                data.market = target;
076                
077                int num = 1;
078                if (difficulty > 6) num = 2;
079                if (difficulty > 8) num = 3;
080                float protectorDiff = difficulty - 3;
081                
082                FleetSize size = FleetSize.MEDIUM;
083                FleetQuality quality = FleetQuality.DEFAULT;
084                String type = FleetTypes.PATROL_MEDIUM;
085                OfficerQuality oQuality = OfficerQuality.DEFAULT;
086                OfficerNum oNum = OfficerNum.DEFAULT;
087        
088                for (int i = 0; i < num; i++) {
089                        float diff = difficulty;
090                        if (i > 0) diff = protectorDiff;
091                        
092                        if (diff <= 2) {
093                                size = FleetSize.TINY;
094                                type = FleetTypes.PATROL_SMALL;
095                        } else if (diff <= 3) {
096                                size = FleetSize.VERY_SMALL;
097                                type = FleetTypes.PATROL_SMALL;
098                        } else if (diff <= 4) {
099                                size = FleetSize.SMALL;
100                                type = FleetTypes.PATROL_SMALL;
101                        } else if (difficulty <= 5) {
102                                size = FleetSize.MEDIUM;
103                                type = FleetTypes.PATROL_MEDIUM;
104                        } else {
105                                size = FleetSize.LARGE;
106                                type = FleetTypes.PATROL_LARGE;
107                        }
108                        
109                        beginFleet(mission, data);
110                        mission.triggerCreateFleet(size, quality, target.getFactionId(), type, data.system);
111                        mission.triggerSetFleetOfficers(oNum, oQuality);
112                        mission.triggerAutoAdjustFleetSize(size, size.next());
113                        mission.triggerFleetAllowLongPursuit();
114                        mission.triggerFleetSetAllWeapons();
115                        
116                        mission.triggerSetPatrol();
117                        
118                        if (i == 0) {
119                                mission.triggerSpawnFleetNear(target.getPrimaryEntity(), null, null);
120                                mission.triggerFleetSetPatrolActionText("patrolling");
121                                mission.triggerOrderFleetPatrol(data.system, true, Tags.JUMP_POINT, Tags.OBJECTIVE);
122                                mission.triggerOrderExtraPatrolPoints(target.getPrimaryEntity());
123                        } else {
124                                mission.triggerSpawnFleetNear(data.fleet, null, null);
125                                mission.triggerFleetSetPatrolActionText("guarding " + data.fleet.getName().toLowerCase());
126                                mission.triggerFleetSetPatrolLeashRange(100f);
127                                mission.triggerOrderFleetPatrol(data.system, true, data.fleet);
128                        }
129                        
130                        CampaignFleetAPI fleet = createFleet(mission, data);
131                        if (i == 0) {
132                                data.fleet = fleet;
133                        }
134                }
135                
136                if (data.fleet == null) return null;
137                
138                setRepChangesBasedOnDifficulty(data, difficulty);
139                data.baseReward = CBStats.getBaseBounty(difficulty, CBStats.PATROL_MULT, mission);
140                
141                return data;
142        }
143        
144        @Override
145        public void updateInteractionData(HubMissionWithBarEvent mission, CustomBountyData data) {
146                String id = mission.getMissionId();
147                String faction = data.fleet.getFaction().getPersonNamePrefix();
148                Color factionColor = data.fleet.getFaction().getBaseUIColor();
149                mission.set("$" + id + "_patrolFaction", faction);
150                mission.set("$bcb_patrolFaction", faction);
151                mission.set("$" + id + "_patrolFactionColor", factionColor);
152                mission.set("$bcb_patrolFactionColor", factionColor);
153        }
154        
155
156        @Override
157        public int getMaxDifficulty() {
158                return super.getMaxDifficulty();
159        }
160
161        @Override
162        public int getMinDifficulty() {
163                return 0;
164        }
165
166}
167
168
169
170
171
172