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