001package com.fs.starfarer.api.impl.campaign.missions.academy;
002
003import java.awt.Color;
004import java.util.List;
005import java.util.Map;
006
007import com.fs.starfarer.api.Global;
008import com.fs.starfarer.api.campaign.InteractionDialogAPI;
009import com.fs.starfarer.api.campaign.econ.MarketAPI;
010import com.fs.starfarer.api.campaign.rules.MemoryAPI;
011import com.fs.starfarer.api.characters.PersonAPI;
012import com.fs.starfarer.api.impl.campaign.ids.Factions;
013import com.fs.starfarer.api.impl.campaign.ids.Ranks;
014import com.fs.starfarer.api.ui.TooltipMakerAPI;
015import com.fs.starfarer.api.util.Misc;
016import com.fs.starfarer.api.util.Misc.Token;
017
018public class GARansomResearcher extends GABaseMission {
019
020        public static float RAID_DIFFICULTY = 300f;
021        
022        public static float MISSION_DAYS = 120f;
023        
024        public static float PROB_PIRATE_VARIATION = 0.5f;
025        
026        
027        public static enum Stage {
028                GO_TO_MARKET,
029                RETURN_TO_ACADEMY,
030                COMPLETED,
031                FAILED,
032                FAILED_DECIV,
033        }
034        
035        public static enum Variation {
036                PIRATE,
037                CHURCH,
038        }
039        
040        protected MarketAPI market;
041        protected Variation variation;
042        protected PersonAPI contact;
043        protected PersonAPI researcher;
044        
045        protected int costNormal;
046        protected int costHigh;
047        protected int costVeryLow;
048
049        
050        @Override
051        protected boolean create(MarketAPI createdAt, boolean barEvent) {
052                // if this mission type was already accepted by the player, abort
053                if (!setGlobalReference("$gaRR_ref")) {
054                        return false;
055                }
056                if (getGlobalMemory().contains("$gaRR_playerOwes")) {
057                        return false; // the player needs to pay back the advance before this mission is offered again
058                }
059                
060                pickAnyDepartment();
061                
062                if (rollProbability(PROB_PIRATE_VARIATION)) {
063                        variation = Variation.PIRATE;
064                        setIconName("campaignMissions", "prisoner_pirate");
065                } else {
066                        variation = Variation.CHURCH;
067                        setIconName("campaignMissions", "prisoner_luddic");
068                }
069                
070                resetSearch();
071                
072                if (variation == Variation.PIRATE) {
073                        requireMarketFaction(Factions.PIRATES);
074                } else {
075                        requireMarketFaction(Factions.LUDDIC_CHURCH);
076                }
077                requireMarketNotHidden();
078                requireMarketNotInHyperspace();
079                requireMarketLocationNot("galatia");
080                preferMarketInDirectionOfOtherMissions();
081                market = pickMarket();
082                
083//              market = getMarket("kantas_den");
084//              variation = Variation.PIRATE;
085                
086                if (market == null) {
087                        return false;
088                }
089                
090                if (variation == Variation.PIRATE) {
091                        contact = findOrCreateCriminal(market, true);
092                } else {
093                        contact = findOrCreatePerson(Factions.LUDDIC_CHURCH, market, true,
094                                                                                 Ranks.KNIGHT_CAPTAIN, Ranks.POST_GENERIC_MILITARY); 
095                }
096                if (contact == null) {
097                        return false;
098                }
099                
100                setStartingStage(Stage.GO_TO_MARKET);
101                addSuccessStages(Stage.COMPLETED);
102                addFailureStages(Stage.FAILED);
103                addNoPenaltyFailureStages(Stage.FAILED_DECIV);
104                
105                //setPersonDoGenericPortAuthorityCheck(contact);
106                makeImportant(contact, "$gaRR_contact", Stage.GO_TO_MARKET);
107                makeImportant(getPerson(), "$gaRR_returnHere", Stage.RETURN_TO_ACADEMY);
108                
109                connectWithGlobalFlag(Stage.GO_TO_MARKET, Stage.RETURN_TO_ACADEMY, "$gaRR_needToReturn");
110                setStageOnGlobalFlag(Stage.COMPLETED, "$gaRR_completed");
111                setStageOnGlobalFlag(Stage.FAILED, "$gaRR_failed");
112                connectWithMarketDecivilized(Stage.GO_TO_MARKET, Stage.FAILED_DECIV, market);
113                
114                if (WITH_TIME_LIMIT) {
115                        setTimeLimit(Stage.FAILED, MISSION_DAYS, market.getStarSystem(), Stage.RETURN_TO_ACADEMY);
116                }
117                //setCreditReward(30000, 40000);
118                setCreditReward(CreditReward.AVERAGE);
119                setDefaultGARepRewards();
120                
121                costNormal = genRoundNumber(60000, 70000);
122                costHigh = genRoundNumber(90000, 100000);
123                costVeryLow = genRoundNumber(8000, 10000);
124                
125                researcher = Global.getSector().getFaction(Factions.INDEPENDENT).createRandomPerson(genRandom);
126                researcher.setRankId(Ranks.CITIZEN);
127                researcher.setPostId(Ranks.POST_ACADEMICIAN);
128                
129                beginStageTrigger(Stage.FAILED, Stage.FAILED_DECIV);
130                triggerSetGlobalMemoryValuePermanent("$gaRR_playerOwes", true);
131                triggerSetGlobalMemoryValuePermanent("$gaRR_failedCredits", Misc.getWithDGS(costNormal));
132                endTrigger();
133                
134                return true;
135        }
136        
137        @Override
138        protected boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List<Token> params,
139                                                                Map<String, MemoryAPI> memoryMap) {
140                if (dialog != null && action.equals("showResearcher")) {
141                        showPersonInfo(researcher, dialog, false, false);
142                        return true;
143                }
144                return false;
145        }
146        
147        protected void updateInteractionDataImpl() {
148                set("$gaRR_department", department);
149                set("$gaRR_marketName", market.getName());
150                set("$gaRR_onOrAt", market.getOnOrAt());
151                
152                set("$gaRR_contactName", contact.getNameString());
153                set("$gaRR_raidDifficulty", RAID_DIFFICULTY);
154                set("$gaRR_researcherName", researcher.getNameString());
155                
156                set("$gaRR_costVeryLow", Misc.getWithDGS(costVeryLow));
157                set("$gaRR_costNormal", Misc.getWithDGS(costNormal));
158                set("$gaRR_costHigh", Misc.getWithDGS(costHigh));
159                
160                set("$gaRR_systemName", market.getStarSystem().getNameWithNoType());
161                set("$gaRR_dist", getDistanceLY(market));
162                set("$gaRR_reward", Misc.getWithDGS(getCreditsReward()));
163                set("$gaRR_variation", variation);
164        }
165        
166        @Override
167        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
168                float opad = 10f;
169                Color h = Misc.getHighlightColor();
170                if (currentStage == Stage.GO_TO_MARKET) {
171                        String adjective = "kidnapped";
172                        if (variation == Variation.CHURCH) adjective = "imprisoned"; 
173                        info.addPara(getGoToMarketText(market) +
174                                        ", and ransom the " + adjective + " researcher from " + contact.getNameString() + ".", opad);
175                        //addCustomRaidInfo((int)RAID_DIFFICULTY, RaidDangerLevel.MINIMAL, info, opad);
176                } else if (currentStage == Stage.RETURN_TO_ACADEMY) {
177                        info.addPara(getReturnText("the Galatia Academy") + ".", opad);
178                }
179        }
180
181        @Override
182        public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
183                Color h = Misc.getHighlightColor();
184                if (currentStage == Stage.GO_TO_MARKET) {
185                        info.addPara(getGoToMarketText(market), tc, pad);
186                        return true;
187                } else if (currentStage == Stage.RETURN_TO_ACADEMY) {
188                        info.addPara(getReturnTextShort("the Galatia Academy"), tc, pad);
189                        return true;
190                }
191                return false;
192        }
193
194        @Override
195        public String getBaseName() {
196                return "Ransom Researcher";
197        }
198
199}
200
201
202
203
204