001package com.fs.starfarer.api.impl.campaign.tutorial; 002 003import java.awt.Color; 004import java.util.ArrayList; 005import java.util.List; 006import java.util.Map; 007import java.util.Random; 008 009import com.fs.starfarer.api.Global; 010import com.fs.starfarer.api.campaign.BaseOnMessageDeliveryScript; 011import com.fs.starfarer.api.campaign.CampaignFleetAPI; 012import com.fs.starfarer.api.campaign.CargoAPI; 013import com.fs.starfarer.api.campaign.CommDirectoryEntryAPI; 014import com.fs.starfarer.api.campaign.FactionAPI; 015import com.fs.starfarer.api.campaign.InteractionDialogAPI; 016import com.fs.starfarer.api.campaign.OnMessageDeliveryScript; 017import com.fs.starfarer.api.campaign.PlanetAPI; 018import com.fs.starfarer.api.campaign.SectorEntityToken; 019import com.fs.starfarer.api.campaign.StarSystemAPI; 020import com.fs.starfarer.api.campaign.CommDirectoryEntryAPI.EntryType; 021import com.fs.starfarer.api.campaign.comm.CommMessageAPI; 022import com.fs.starfarer.api.campaign.comm.MessagePriority; 023import com.fs.starfarer.api.campaign.econ.MarketAPI; 024import com.fs.starfarer.api.campaign.events.CampaignEventTarget; 025import com.fs.starfarer.api.campaign.rules.MemoryAPI; 026import com.fs.starfarer.api.characters.PersonAPI; 027import com.fs.starfarer.api.fleet.FleetMemberAPI; 028import com.fs.starfarer.api.fleet.FleetMemberType; 029import com.fs.starfarer.api.impl.campaign.JumpPointInteractionDialogPluginImpl; 030import com.fs.starfarer.api.impl.campaign.events.BaseEventPlugin; 031import com.fs.starfarer.api.impl.campaign.ids.Abilities; 032import com.fs.starfarer.api.impl.campaign.ids.Commodities; 033import com.fs.starfarer.api.impl.campaign.ids.Entities; 034import com.fs.starfarer.api.impl.campaign.ids.Factions; 035import com.fs.starfarer.api.impl.campaign.ids.MemFlags; 036import com.fs.starfarer.api.impl.campaign.ids.Ranks; 037import com.fs.starfarer.api.impl.campaign.ids.Submarkets; 038import com.fs.starfarer.api.impl.campaign.ids.Tags; 039import com.fs.starfarer.api.impl.campaign.intel.SystemBountyIntel; 040import com.fs.starfarer.api.impl.campaign.intel.SystemBountyManager; 041import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity; 042import com.fs.starfarer.api.impl.campaign.submarkets.StoragePlugin; 043import com.fs.starfarer.api.loading.WeaponSlotAPI; 044import com.fs.starfarer.api.ui.HintPanelAPI; 045import com.fs.starfarer.api.util.Misc; 046import com.fs.starfarer.api.util.Misc.Token; 047 048public class TutorialMissionEvent extends BaseEventPlugin { 049 050 public static final String TUT_STAGE = "$tutStage"; 051 052 public static final String REASON = "tut"; 053 054 public static enum TutorialMissionStage { 055 INIT, 056 GO_GET_DATA, 057 GOT_DATA, 058 GO_GET_AI_CORE, 059 GOT_AI_CORE, 060 GO_RECOVER_SHIPS, 061 RECOVERED_SHIPS, 062 GO_STABILIZE, 063 STABILIZED, 064 DELIVER_REPORT, 065 DONE, 066 ; 067 } 068 069 protected float elapsedDays = 0; 070 protected boolean ended = false; 071 072 //protected TutorialMissionEventData data; 073 protected StarSystemAPI system; 074 protected PlanetAPI ancyra; 075 protected PlanetAPI pontus; 076 protected PlanetAPI tetra; 077 protected SectorEntityToken derinkuyu; 078 protected SectorEntityToken probe; 079 protected SectorEntityToken inner; 080 protected SectorEntityToken fringe; 081 protected SectorEntityToken detachment; 082 protected SectorEntityToken relay; 083 084 protected PersonAPI mainContact; 085 protected PersonAPI dataContact; 086 protected PersonAPI jangalaContact; 087 protected PlanetAPI jangala; 088 089 protected TutorialMissionStage stage = TutorialMissionStage.INIT; 090 091 public void init(String type, CampaignEventTarget eventTarget) { 092 super.init(type, eventTarget, false); 093 } 094 095 @Override 096 public void setParam(Object param) { 097 //data = (TutorialMissionEventData) param; 098 } 099 100 public void startEvent() { 101 super.startEvent(); 102 103 system = Global.getSector().getStarSystem("galatia"); 104 ancyra = (PlanetAPI) system.getEntityById("ancyra"); 105 pontus = (PlanetAPI) system.getEntityById("pontus"); 106 tetra = (PlanetAPI) system.getEntityById("tetra"); 107 derinkuyu = system.getEntityById("derinkuyu_station"); 108 probe = system.getEntityById("galatia_probe"); 109 inner = system.getEntityById("galatia_jump_point_alpha"); 110 fringe = system.getEntityById("galatia_jump_point_fringe"); 111 detachment = system.getEntityById("tutorial_security_detachment"); 112 relay = system.getEntityById("ancyra_relay"); 113 114// mainContact = ancyra.getFaction().createRandomPerson(); 115// mainContact.setRankId(Ranks.CITIZEN); 116// mainContact.setPostId(Ranks.POST_STATION_COMMANDER); 117// ancyra.getMarket().getCommDirectory().addPerson(mainContact); 118 mainContact = createMainContact(ancyra); 119 120 dataContact = Global.getSector().getFaction(Factions.INDEPENDENT).createRandomPerson(); 121 dataContact.setRankId(Ranks.AGENT); 122 dataContact.setPostId(Ranks.POST_AGENT); 123 derinkuyu.getMarket().getCommDirectory().addPerson(dataContact); 124 125 String stageId = "start"; 126 Global.getSector().reportEventStage(this, stageId, Global.getSector().getPlayerFleet(), 127 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(ancyra)); 128 129 130 mainContact.getMemoryWithoutUpdate().set("$tut_mainContact", true); 131 mainContact.getMemoryWithoutUpdate().set("$tut_eventRef", this); 132 Misc.makeImportant(mainContact, REASON); 133 134 updateStage(TutorialMissionStage.INIT); 135 } 136 137 public static PersonAPI createMainContact(PlanetAPI ancyra) { 138 PersonAPI mainContact = ancyra.getFaction().createRandomPerson(); 139 mainContact.setRankId(Ranks.CITIZEN); 140 mainContact.setPostId(Ranks.POST_STATION_COMMANDER); 141 ancyra.getMarket().getCommDirectory().addPerson(mainContact); 142 143 return mainContact; 144 } 145 146 public static PersonAPI getJangalaContact() { 147 StarSystemAPI corvus = Global.getSector().getStarSystem("Corvus"); 148 PlanetAPI jangala = (PlanetAPI) corvus.getEntityById("jangala"); 149 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())) { 154 return curr; 155 } 156 } 157 } 158 return null; 159 } 160 161 public PersonAPI getMainContact() { 162 return mainContact; 163 } 164 165 protected void updateStage(TutorialMissionStage stage) { 166 this.stage = stage; 167 Global.getSector().getMemoryWithoutUpdate().set(TUT_STAGE, stage.name()); 168 } 169 170 protected void endEvent() { 171 ended = true; 172 Global.getSector().getMemoryWithoutUpdate().unset(TUT_STAGE); 173 } 174 175 public void advance(float amount) { 176 if (!isEventStarted()) return; 177 if (isDone()) return; 178 179 float days = Global.getSector().getClock().convertToDays(amount); 180 181 CampaignFleetAPI player = Global.getSector().getPlayerFleet(); 182 if (player == null) return; 183 184 //memory.advance(days); 185 elapsedDays += days; 186 187 if (probe == null) probe = system.getEntityById("galatia_probe"); 188 if (tetra == null) tetra = (PlanetAPI) system.getEntityById("tetra"); 189 if (derinkuyu == null) derinkuyu = system.getEntityById("derinkuyu_station"); 190 if (inner == null) inner = system.getEntityById("galatia_jump_point_alpha"); 191 if (fringe == null) fringe = system.getEntityById("galatia_jump_point_fringe"); 192 if (detachment == null) detachment = system.getEntityById("tutorial_security_detachment"); 193 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)) { 198 Global.getSector().reportEventStage(this, "salvage_core_end", Global.getSector().getPlayerFleet(), 199 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(ancyra)); 200 Misc.makeImportant(mainContact, REASON); 201 updateStage(TutorialMissionStage.GOT_AI_CORE); 202 } 203 } 204 205 if (stage == TutorialMissionStage.GO_RECOVER_SHIPS) { 206 int count = 0; 207 for (FleetMemberAPI member : player.getFleetData().getMembersListCopy()) { 208 //if (member.getVariant().getHullSpec().isDHull()) count++; 209 count++; 210 } 211 212 int wrecks = 0; 213 for (SectorEntityToken entity : system.getEntitiesWithTag(Tags.SALVAGEABLE)) { 214 String id = entity.getCustomEntityType(); 215 if (id == null) continue; 216 if (Entities.WRECK.equals(id)) { 217 wrecks ++; 218 } 219 } 220 221 if (count >= 5 || wrecks < 3) { 222 Global.getSector().reportEventStage(this, "ship_recovery_end", Global.getSector().getPlayerFleet(), 223 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(ancyra)); 224 Misc.makeImportant(mainContact, REASON); 225 Misc.makeUnimportant(tetra, REASON); 226 updateStage(TutorialMissionStage.RECOVERED_SHIPS); 227 } 228 } 229 230 if (stage == TutorialMissionStage.GO_STABILIZE) { 231 boolean innerStable = inner.getMemoryWithoutUpdate().getExpire(JumpPointInteractionDialogPluginImpl.UNSTABLE_KEY) > 0; 232 boolean fringeStable = fringe.getMemoryWithoutUpdate().getExpire(JumpPointInteractionDialogPluginImpl.UNSTABLE_KEY) > 0; 233 234 if (innerStable || fringeStable) { 235 Global.getSector().reportEventStage(this, "stabilize_jump_point_done", Global.getSector().getPlayerFleet(), 236 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(ancyra)); 237 Misc.makeImportant(mainContact, REASON); 238 Misc.makeUnimportant(inner, REASON); 239 updateStage(TutorialMissionStage.STABILIZED); 240 } 241 242 } 243 244 } 245 246 247 @Override 248 public boolean callEvent(String ruleId, final InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) { 249 String action = params.get(0).getString(memoryMap); 250 251 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet(); 252 CargoAPI cargo = playerFleet.getCargo(); 253 254 if (action.equals("startGetData")) { 255 Global.getSector().reportEventStage(this, "sneak_start", Global.getSector().getPlayerFleet(), 256 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(derinkuyu)); 257 258 dataContact.getMemoryWithoutUpdate().set("$tut_dataContact", true); 259 dataContact.getMemoryWithoutUpdate().set("$tut_eventRef", this); 260 Misc.makeImportant(dataContact, REASON); 261 Misc.makeUnimportant(mainContact, REASON); 262 263 detachment.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PATROL_ALLOW_TOFF, true); 264 265 updateStage(TutorialMissionStage.GO_GET_DATA); 266 267 saveNag(); 268 } else if (action.equals("endGetData")) { 269 270 Global.getSector().reportEventStage(this, "sneak_end", Global.getSector().getPlayerFleet(), 271 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(ancyra)); 272 Misc.cleanUpMissionMemory(dataContact.getMemoryWithoutUpdate(), "tut_"); 273 274 Misc.makeUnimportant(dataContact, REASON); 275 Misc.makeImportant(mainContact, REASON); 276 277 updateStage(TutorialMissionStage.GOT_DATA); 278 279 } else if (action.equals("goSalvage")) { 280 Global.getSector().reportEventStage(this, "salvage_core_start", Global.getSector().getPlayerFleet(), 281 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(pontus)); 282 Misc.makeUnimportant(mainContact, REASON); 283 Misc.makeImportant(probe, REASON); 284 285 updateStage(TutorialMissionStage.GO_GET_AI_CORE); 286 287 saveNag(); 288 } else if (action.equals("goRecover")) { 289 Global.getSector().reportEventStage(this, "ship_recovery_start", Global.getSector().getPlayerFleet(), 290 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(tetra)); 291 Misc.makeUnimportant(mainContact, REASON); 292 Misc.makeImportant(tetra, REASON); 293 294 FleetMemberAPI member = Global.getFactory().createFleetMember(FleetMemberType.SHIP, "mudskipper_Standard"); 295 playerFleet.getFleetData().addFleetMember(member); 296 AddRemoveCommodity.addFleetMemberGainText(member, dialog.getTextPanel()); 297 298 updateStage(TutorialMissionStage.GO_RECOVER_SHIPS); 299 } else if (action.equals("goStabilize")) { 300 Global.getSector().reportEventStage(this, "stabilize_jump_point", Global.getSector().getPlayerFleet(), 301 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(inner)); 302 Misc.makeUnimportant(mainContact, REASON); 303 Misc.makeImportant(inner, REASON); 304 305 addWeaponsToStorage(); 306 307 inner.getMemoryWithoutUpdate().set(JumpPointInteractionDialogPluginImpl.CAN_STABILIZE, true); 308 fringe.getMemoryWithoutUpdate().set(JumpPointInteractionDialogPluginImpl.CAN_STABILIZE, true); 309 310 updateStage(TutorialMissionStage.GO_STABILIZE); 311 312 saveNag(); 313 } else if (action.equals("pickJangalaContact")) { 314 315 StarSystemAPI corvus = Global.getSector().getStarSystem("Corvus"); 316 jangala = (PlanetAPI) corvus.getEntityById("jangala"); 317 318 jangalaContact = getJangalaContact(); 319 320 MemoryAPI mem = mainContact.getMemoryWithoutUpdate(); 321 mem.set("$jangalaContactPost", jangalaContact.getPost().toLowerCase(), 0); 322 mem.set("$jangalaContactLastName", jangalaContact.getName().getLast(), 0); 323 324 float distLY = Misc.getDistanceLY(playerFleet.getLocationInHyperspace(), jangala.getLocationInHyperspace()); 325 distLY += 4f; 326 327 float fuel = playerFleet.getLogistics().getFuelCostPerLightYear() * distLY; 328 fuel = (float) (Math.ceil(fuel / 10) * 10); 329 mem.set("$jangalaFuel", (int) fuel); 330 331 } else if (action.equals("deliverReport")) { 332 Global.getSector().reportEventStage(this, "deliver_message", Global.getSector().getPlayerFleet(), 333 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(jangala)); 334 335 Misc.makeUnimportant(mainContact, REASON); 336 Misc.cleanUpMissionMemory(mainContact.getMemoryWithoutUpdate(), REASON + "_"); 337 Misc.makeUnimportant(inner, REASON); 338 339 jangalaContact.getMemoryWithoutUpdate().set("$tut_jangalaContact", true); 340 jangalaContact.getMemoryWithoutUpdate().set("$tut_eventRef", this); 341 Misc.makeImportant(jangalaContact, REASON); 342 343 updateStage(TutorialMissionStage.DELIVER_REPORT); 344 345 endGalatiaPortionOfMission(); 346 347 Global.getSector().getMemoryWithoutUpdate().unset(CampaignTutorialScript.USE_TUTORIAL_RESPAWN); 348 349 } else if (action.equals("reportDelivered")) { 350 Global.getSector().reportEventStage(this, "end", Global.getSector().getPlayerFleet(), 351 MessagePriority.DELIVER_IMMEDIATELY, createSetMessageLocationScript(jangala)); 352 353 Misc.makeUnimportant(jangalaContact, REASON); 354 Misc.cleanUpMissionMemory(jangalaContact.getMemoryWithoutUpdate(), REASON + "_"); 355 356 updateStage(TutorialMissionStage.DONE); 357 358 MarketAPI jangala = Global.getSector().getEconomy().getMarket("jangala"); 359 360 if (jangala != null) { 361 SystemBountyManager.getInstance().addOrResetBounty(jangala); 362 } 363 364 endEvent(); 365 } else if (action.equals("printRefitHint")) { 366 String refit = Global.getSettings().getControlStringForEnumName("CORE_REFIT"); 367 String autofit = Global.getSettings().getControlStringForEnumName("REFIT_MANAGE_VARIANTS"); 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."; 371 } 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." + 375 transponder + "", 376 Misc.getHighlightColor(), refit, autofit, "\"autofit\""); 377 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\""); 382 } 383 384 return true; 385 } 386 387 public static void endGalatiaPortionOfMission() { 388 389 StarSystemAPI system = Global.getSector().getStarSystem("galatia"); 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"); 398 399 relay.getMemoryWithoutUpdate().unset(MemFlags.OBJECTIVE_NON_FUNCTIONAL); 400 401 Global.getSector().getCharacterData().addAbility(Abilities.TRANSPONDER); 402 Global.getSector().getCharacterData().addAbility(Abilities.GO_DARK); 403 Global.getSector().getCharacterData().addAbility(Abilities.SENSOR_BURST); 404 Global.getSector().getCharacterData().addAbility(Abilities.EMERGENCY_BURN); 405 Global.getSector().getCharacterData().addAbility(Abilities.SUSTAINED_BURN); 406 Global.getSector().getCharacterData().addAbility(Abilities.SCAVENGE); 407 Global.getSector().getCharacterData().addAbility(Abilities.INTERDICTION_PULSE); 408 Global.getSector().getCharacterData().addAbility(Abilities.DISTRESS_CALL); 409 410 FactionAPI hegemony = Global.getSector().getFaction(Factions.HEGEMONY); 411 if (hegemony.getRelToPlayer().getRel() < 0) { 412 hegemony.getRelToPlayer().setRel(0); 413 } 414 415 Global.getSector().getEconomy().addMarket(ancyra.getMarket(), false); 416 Global.getSector().getEconomy().addMarket(derinkuyu.getMarket(), false); 417 418 HintPanelAPI hints = Global.getSector().getCampaignUI().getHintPanel(); 419 if (hints != null) { 420 hints.clearHints(false); 421 } 422 423 if (!SystemBountyManager.getInstance().isActive(ancyra.getMarket())) { 424 SystemBountyManager.getInstance().addActive(new SystemBountyIntel(ancyra.getMarket())); 425 } 426// CampaignEventManagerAPI eventManager = Global.getSector().getEventManager(); 427// eventManager.startEvent(new CampaignEventTarget(ancyra.getMarket()), Events.SYSTEM_BOUNTY, null); 428 429 RogueMinerMiscFleetManager script = new RogueMinerMiscFleetManager(derinkuyu); 430 for (int i = 0; i < 20; i++) { 431 script.advance(1f); 432 } 433 system.addScript(script); 434 435 for (CampaignFleetAPI fleet : system.getFleets()) { 436 if (Factions.PIRATES.equals(fleet.getFaction().getId())) { 437 fleet.removeScriptsOfClass(TutorialLeashAssignmentAI.class); 438 } 439 } 440 441 inner.getMemoryWithoutUpdate().unset(JumpPointInteractionDialogPluginImpl.UNSTABLE_KEY); 442 inner.getMemoryWithoutUpdate().unset(JumpPointInteractionDialogPluginImpl.CAN_STABILIZE); 443 444 fringe.getMemoryWithoutUpdate().unset(JumpPointInteractionDialogPluginImpl.UNSTABLE_KEY); 445 fringe.getMemoryWithoutUpdate().unset(JumpPointInteractionDialogPluginImpl.CAN_STABILIZE); 446 } 447 448 449 450 451 protected void saveNag() { 452 if (!Global.getSector().hasScript(SaveNagScript.class)) { 453 Global.getSector().addScript(new SaveNagScript(10f)); 454 } 455 } 456 457 458 public void addWeaponsToStorage() { 459 StoragePlugin plugin = ((StoragePlugin)ancyra.getMarket().getSubmarket(Submarkets.SUBMARKET_STORAGE).getPlugin()); 460 plugin.setPlayerPaidToUnlock(true); 461 462 CargoAPI cargo = plugin.getCargo(); 463 464 CampaignFleetAPI player = Global.getSector().getPlayerFleet(); 465 for (FleetMemberAPI member : player.getFleetData().getMembersListCopy()) { 466 //if (member.getVariant().getHullSpec().isDHull()) { 467 for (WeaponSlotAPI slot : member.getVariant().getHullSpec().getAllWeaponSlotsCopy()) { 468 //if (member.getVariant().getWeaponId(slot.getId()) == null) { 469 String weaponId = getWeaponForSlot(slot); 470 if (weaponId != null) { 471 cargo.addWeapons(weaponId, 1); 472 } 473 //} 474 } 475 //} 476 } 477 478 cargo.addFighters("broadsword_wing", 1); 479 cargo.addFighters("piranha_wing", 1); 480 481 cargo.addSupplies(50); 482 cargo.sort(); 483 } 484 485 public String getWeaponForSlot(WeaponSlotAPI slot) { 486 switch (slot.getWeaponType()) { 487 case BALLISTIC: 488 case COMPOSITE: 489 case HYBRID: 490 case UNIVERSAL: 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"); 495 } 496 break; 497 case MISSILE: 498 case SYNERGY: 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"); 503 } 504 break; 505 case ENERGY: 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"); 510 } 511 break; 512 } 513 514 515 return null; 516 } 517 518 public String pick(String ...strings) { 519 return strings[new Random().nextInt(strings.length)]; 520 } 521 522 523 public OnMessageDeliveryScript createSetMessageLocationScript(final SectorEntityToken entity) { 524 return new BaseOnMessageDeliveryScript() { 525 public void beforeDelivery(CommMessageAPI message) { 526 if (entity != null && entity.getContainingLocation() instanceof StarSystemAPI) { 527 message.setStarSystemId(entity.getContainingLocation().getId()); 528 } else { 529 message.setStarSystemId(system.getId()); 530 } 531 message.setCenterMapOnEntity(entity); 532 } 533 }; 534 } 535 536 537 public Map<String, String> getTokenReplacements() { 538 539 Map<String, String> map = super.getTokenReplacements(); 540 541 addPersonTokens(map, "mainContact", mainContact); 542 543 if (dataContact != null) { 544 addPersonTokens(map, "dataContact", dataContact); 545 } 546 547 if (jangalaContact != null) { 548 addPersonTokens(map, "jangalaContact", jangalaContact); 549 } 550 551 //map.put("$sender", "Ancyra Research Facility"); 552 553 map.put("$systemName", system.getNameWithLowercaseType()); 554 555 556 return map; 557 } 558 559 @Override 560 public String[] getHighlights(String stageId) { 561 List<String> result = new ArrayList<String>(); 562 563 if ("posting".equals(stageId)) { 564 } else if ("success".equals(stageId)) { 565 } else { 566 //addTokensToList(result, "$rewardCredits"); 567 } 568 569 return result.toArray(new String[0]); 570 } 571 572 @Override 573 public Color[] getHighlightColors(String stageId) { 574 return super.getHighlightColors(stageId); 575 } 576 577 public boolean isDone() { 578 return ended; 579 } 580 581 public String getEventName() { 582 if (stage == TutorialMissionStage.INIT) { 583 return "Contact " + mainContact.getPost() + " " + mainContact.getName().getLast(); 584 } 585 if (stage == TutorialMissionStage.DELIVER_REPORT) { 586 return "Deliver Report to Jangala"; 587 } 588 if (stage == TutorialMissionStage.DONE) { 589 return "Deliver Report to Jangala - completed"; 590 } 591 return "Stabilize the Jump-points"; 592 } 593 594 595 596 @Override 597 public CampaignEventCategory getEventCategory() { 598 return CampaignEventCategory.MISSION; 599 } 600 601 @Override 602 public String getEventIcon() { 603 return Global.getSettings().getSpriteName("campaignMissions", "tutorial"); 604 } 605 606 @Override 607 public String getCurrentImage() { 608 return ancyra.getFaction().getLogo(); 609 } 610 611 612 613} 614 615 616