1package com.fs.starfarer.api.impl.campaign.tutorial;
4import java.util.ArrayList;
7import java.util.Random;
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.BaseOnMessageDeliveryScript;
11import com.fs.starfarer.api.campaign.CampaignFleetAPI;
12import com.fs.starfarer.api.campaign.CargoAPI;
13import com.fs.starfarer.api.campaign.CommDirectoryEntryAPI;
14import com.fs.starfarer.api.campaign.FactionAPI;
15import com.fs.starfarer.api.campaign.InteractionDialogAPI;
16import com.fs.starfarer.api.campaign.OnMessageDeliveryScript;
17import com.fs.starfarer.api.campaign.PlanetAPI;
18import com.fs.starfarer.api.campaign.SectorEntityToken;
19import com.fs.starfarer.api.campaign.StarSystemAPI;
20import com.fs.starfarer.api.campaign.CommDirectoryEntryAPI.EntryType;
21import com.fs.starfarer.api.campaign.comm.CommMessageAPI;
22import com.fs.starfarer.api.campaign.comm.MessagePriority;
23import com.fs.starfarer.api.campaign.econ.MarketAPI;
24import com.fs.starfarer.api.campaign.events.CampaignEventTarget;
25import com.fs.starfarer.api.campaign.rules.MemoryAPI;
26import com.fs.starfarer.api.characters.PersonAPI;
27import com.fs.starfarer.api.fleet.FleetMemberAPI;
28import com.fs.starfarer.api.fleet.FleetMemberType;
29import com.fs.starfarer.api.impl.campaign.JumpPointInteractionDialogPluginImpl;
30import com.fs.starfarer.api.impl.campaign.events.BaseEventPlugin;
31import com.fs.starfarer.api.impl.campaign.ids.Abilities;
32import com.fs.starfarer.api.impl.campaign.ids.Commodities;
33import com.fs.starfarer.api.impl.campaign.ids.Entities;
34import com.fs.starfarer.api.impl.campaign.ids.Factions;
35import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
36import com.fs.starfarer.api.impl.campaign.ids.Ranks;
37import com.fs.starfarer.api.impl.campaign.ids.Submarkets;
38import com.fs.starfarer.api.impl.campaign.ids.Tags;
39import com.fs.starfarer.api.impl.campaign.intel.SystemBountyIntel;
40import com.fs.starfarer.api.impl.campaign.intel.SystemBountyManager;
41import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity;
42import com.fs.starfarer.api.impl.campaign.submarkets.StoragePlugin;
43import com.fs.starfarer.api.loading.WeaponSlotAPI;
44import com.fs.starfarer.api.ui.HintPanelAPI;
45import com.fs.starfarer.api.util.Misc;
46import com.fs.starfarer.api.util.Misc.Token;
52 public static final String
REASON =
"tut";
54 public static enum TutorialMissionStage {
70 protected boolean ended =
false;
78 protected SectorEntityToken
probe;
79 protected SectorEntityToken
inner;
82 protected SectorEntityToken
relay;
89 protected TutorialMissionStage
stage = TutorialMissionStage.INIT;
91 public void init(String type, CampaignEventTarget eventTarget) {
92 super.init(type, eventTarget,
false);
109 inner =
system.getEntityById(
"galatia_jump_point_alpha");
110 fringe =
system.getEntityById(
"galatia_jump_point_fringe");
125 String stageId =
"start";
130 mainContact.getMemoryWithoutUpdate().set(
"$tut_mainContact",
true);
131 mainContact.getMemoryWithoutUpdate().set(
"$tut_eventRef",
this);
140 mainContact.setPostId(Ranks.POST_STATION_COMMANDER);
148 PlanetAPI
jangala = (PlanetAPI) corvus.getEntityById(
"jangala");
150 for (CommDirectoryEntryAPI entry :
jangala.getMarket().getCommDirectory().getEntriesCopy()) {
151 if (entry.getType() == EntryType.PERSON && entry.getEntryData() instanceof PersonAPI) {
152 PersonAPI curr = (PersonAPI) entry.getEntryData();
153 if (Ranks.POST_STATION_COMMANDER.equals(curr.getPostId())) {
176 if (!isEventStarted())
return;
182 if (player ==
null)
return;
190 if (
inner ==
null)
inner =
system.getEntityById(
"galatia_jump_point_alpha");
194 if (
stage == TutorialMissionStage.GO_GET_AI_CORE) {
195 int cores = (int) player.getCargo().getCommodityQuantity(Commodities.GAMMA_CORE);
196 float distToProbe = Misc.getDistance(player.getLocation(),
probe.getLocation());
197 if (cores > 0 && (!
probe.isAlive() || distToProbe < 300)) {
205 if (
stage == TutorialMissionStage.GO_RECOVER_SHIPS) {
207 for (FleetMemberAPI member : player.getFleetData().getMembersListCopy()) {
213 for (SectorEntityToken entity :
system.getEntitiesWithTag(Tags.SALVAGEABLE)) {
214 String
id = entity.getCustomEntityType();
215 if (
id ==
null)
continue;
216 if (Entities.WRECK.equals(
id)) {
221 if (count >= 5 || wrecks < 3) {
230 if (
stage == TutorialMissionStage.GO_STABILIZE) {
234 if (innerStable || fringeStable) {
248 public boolean callEvent(String ruleId,
final InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
249 String action = params.get(0).getString(memoryMap);
252 CargoAPI cargo = playerFleet.getCargo();
254 if (action.equals(
"startGetData")) {
258 dataContact.getMemoryWithoutUpdate().set(
"$tut_dataContact",
true);
259 dataContact.getMemoryWithoutUpdate().set(
"$tut_eventRef",
this);
263 detachment.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PATROL_ALLOW_TOFF,
true);
268 }
else if (action.equals(
"endGetData")) {
272 Misc.cleanUpMissionMemory(
dataContact.getMemoryWithoutUpdate(),
"tut_");
279 }
else if (action.equals(
"goSalvage")) {
288 }
else if (action.equals(
"goRecover")) {
295 playerFleet.getFleetData().addFleetMember(member);
296 AddRemoveCommodity.addFleetMemberGainText(member, dialog.getTextPanel());
298 updateStage(TutorialMissionStage.GO_RECOVER_SHIPS);
299 }
else if (action.equals(
"goStabilize")) {
313 }
else if (action.equals(
"pickJangalaContact")) {
316 jangala = (PlanetAPI) corvus.getEntityById(
"jangala");
320 MemoryAPI mem =
mainContact.getMemoryWithoutUpdate();
321 mem.set(
"$jangalaContactPost",
jangalaContact.getPost().toLowerCase(), 0);
322 mem.set(
"$jangalaContactLastName",
jangalaContact.getName().getLast(), 0);
324 float distLY = Misc.getDistanceLY(playerFleet.getLocationInHyperspace(),
jangala.getLocationInHyperspace());
327 float fuel = playerFleet.getLogistics().getFuelCostPerLightYear() * distLY;
328 fuel = (float) (Math.ceil(fuel / 10) * 10);
329 mem.set(
"$jangalaFuel", (
int) fuel);
331 }
else if (action.equals(
"deliverReport")) {
339 jangalaContact.getMemoryWithoutUpdate().set(
"$tut_jangalaContact",
true);
340 jangalaContact.getMemoryWithoutUpdate().set(
"$tut_eventRef",
this);
349 }
else if (action.equals(
"reportDelivered")) {
361 SystemBountyManager.getInstance().addOrResetBounty(
jangala);
365 }
else if (action.equals(
"printRefitHint")) {
368 String transponder =
"";
369 if (!playerFleet.isTransponderOn()) {
370 transponder =
"\n\nAlso: you'll need to re-dock with your transponder turned on to take advantage of Ancyra's facilities.";
372 dialog.getTextPanel().addPara(
"(Once this conversation is over, press %s to open the refit screen. " +
373 "After selecting a specific ship, you can press %s to %s - pick a desired loadout, " +
374 "and the ship will be automatically refitted to match it, using what weapons are available." +
376 Misc.getHighlightColor(), refit, autofit,
"\"autofit\"");
378 dialog.getTextPanel().addPara(
"In addition, you now have access to local storage at Ancyra, " +
379 "and some weapons and supplies have been placed there. To access it, click on the " +
380 "\"Storage\" button in the trade screen.)",
381 Misc.getHighlightColor(), refit, autofit,
"\"Storage\"");
390 PlanetAPI
ancyra = (PlanetAPI)
system.getEntityById(
"ancyra");
391 PlanetAPI
pontus = (PlanetAPI)
system.getEntityById(
"pontus");
392 PlanetAPI
tetra = (PlanetAPI)
system.getEntityById(
"tetra");
393 SectorEntityToken
derinkuyu =
system.getEntityById(
"derinkuyu_station");
394 SectorEntityToken
probe =
system.getEntityById(
"galatia_probe");
395 SectorEntityToken
inner =
system.getEntityById(
"galatia_jump_point_alpha");
396 SectorEntityToken
fringe =
system.getEntityById(
"galatia_jump_point_fringe");
397 SectorEntityToken
relay =
system.getEntityById(
"ancyra_relay");
399 relay.getMemoryWithoutUpdate().unset(MemFlags.OBJECTIVE_NON_FUNCTIONAL);
401 Global.
getSector().getCharacterData().addAbility(Abilities.TRANSPONDER);
403 Global.
getSector().getCharacterData().addAbility(Abilities.SENSOR_BURST);
404 Global.
getSector().getCharacterData().addAbility(Abilities.EMERGENCY_BURN);
405 Global.
getSector().getCharacterData().addAbility(Abilities.SUSTAINED_BURN);
407 Global.
getSector().getCharacterData().addAbility(Abilities.INTERDICTION_PULSE);
408 Global.
getSector().getCharacterData().addAbility(Abilities.DISTRESS_CALL);
410 FactionAPI hegemony =
Global.
getSector().getFaction(Factions.HEGEMONY);
411 if (hegemony.getRelToPlayer().getRel() < 0) {
412 hegemony.getRelToPlayer().setRel(0);
418 HintPanelAPI hints =
Global.
getSector().getCampaignUI().getHintPanel();
420 hints.clearHints(
false);
423 if (!SystemBountyManager.getInstance().isActive(
ancyra.getMarket())) {
424 SystemBountyManager.getInstance().addActive(
new SystemBountyIntel(
ancyra.getMarket()));
430 for (
int i = 0; i < 20; i++) {
435 for (CampaignFleetAPI fleet :
system.getFleets()) {
436 if (Factions.PIRATES.equals(fleet.getFaction().getId())) {
459 StoragePlugin plugin = ((StoragePlugin)
ancyra.getMarket().getSubmarket(Submarkets.SUBMARKET_STORAGE).getPlugin());
460 plugin.setPlayerPaidToUnlock(
true);
462 CargoAPI cargo = plugin.getCargo();
465 for (FleetMemberAPI member : player.getFleetData().getMembersListCopy()) {
467 for (WeaponSlotAPI slot : member.getVariant().getHullSpec().getAllWeaponSlotsCopy()) {
470 if (weaponId !=
null) {
471 cargo.addWeapons(weaponId, 1);
478 cargo.addFighters(
"broadsword_wing", 1);
479 cargo.addFighters(
"piranha_wing", 1);
481 cargo.addSupplies(50);
486 switch (slot.getWeaponType()) {
491 switch (slot.getSlotSize()) {
492 case LARGE:
return pick(
"mark9",
"hephag",
"hellbore");
493 case MEDIUM:
return pick(
"arbalest",
"heavymortar",
"shredder");
494 case SMALL:
return pick(
"lightmg",
"lightac",
"lightmortar");
499 switch (slot.getSlotSize()) {
500 case LARGE:
return pick(
"hammerrack");
501 case MEDIUM:
return pick(
"pilum",
"annihilatorpod");
502 case SMALL:
return pick(
"harpoon",
"sabot",
"annihilator");
506 switch (slot.getSlotSize()) {
507 case LARGE:
return pick(
"autopulse",
"hil");
508 case MEDIUM:
return pick(
"miningblaster",
"gravitonbeam",
"pulselaser");
509 case SMALL:
return pick(
"mininglaser",
"taclaser",
"pdlaser",
"ioncannon");
518 public String
pick(String ...strings) {
519 return strings[
new Random().nextInt(strings.length)];
524 return new BaseOnMessageDeliveryScript() {
525 public void beforeDelivery(CommMessageAPI message) {
526 if (entity !=
null && entity.getContainingLocation() instanceof StarSystemAPI) {
527 message.setStarSystemId(entity.getContainingLocation().getId());
529 message.setStarSystemId(
system.getId());
531 message.setCenterMapOnEntity(entity);
539 Map<String, String> map = super.getTokenReplacements();
553 map.put(
"$systemName",
system.getNameWithLowercaseType());
561 List<String> result =
new ArrayList<String>();
563 if (
"posting".equals(stageId)) {
564 }
else if (
"success".equals(stageId)) {
569 return result.toArray(
new String[0]);
574 return super.getHighlightColors(stageId);
582 if (
stage == TutorialMissionStage.INIT) {
585 if (
stage == TutorialMissionStage.DELIVER_REPORT) {
586 return "Deliver Report to Jangala";
588 if (
stage == TutorialMissionStage.DONE) {
589 return "Deliver Report to Jangala - completed";
591 return "Stabilize the Jump-points";
598 return CampaignEventCategory.MISSION;
608 return ancyra.getFaction().getLogo();
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
static final String CAN_STABILIZE
static final String UNSTABLE_KEY
static final String USE_TUTORIAL_RESPAWN
void advance(float amount)
SectorEntityToken detachment
static void endGalatiaPortionOfMission()
Color[] getHighlightColors(String stageId)
void init(String type, CampaignEventTarget eventTarget)
PersonAPI getMainContact()
TutorialMissionStage stage
static PersonAPI createMainContact(PlanetAPI ancyra)
SectorEntityToken derinkuyu
String getWeaponForSlot(WeaponSlotAPI slot)
String pick(String ...strings)
Map< String, String > getTokenReplacements()
String[] getHighlights(String stageId)
CampaignEventCategory getEventCategory()
void setParam(Object param)
void updateStage(TutorialMissionStage stage)
boolean callEvent(String ruleId, final InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
static PersonAPI getJangalaContact()
static final String REASON
void addWeaponsToStorage()
OnMessageDeliveryScript createSetMessageLocationScript(final SectorEntityToken entity)
void advance(float amount)
static final String TUT_STAGE
FleetMemberAPI createFleetMember(FleetMemberType type, String variantOrWingId)
String getSpriteName(String category, String id)
String getControlStringForEnumName(String name)