001package com.fs.starfarer.api.impl.campaign.rulecmd;
002
003import java.awt.Color;
004import java.util.List;
005import java.util.Map;
006import java.util.Random;
007
008import org.lwjgl.util.vector.Vector2f;
009
010import com.fs.starfarer.api.EveryFrameScript;
011import com.fs.starfarer.api.Global;
012import com.fs.starfarer.api.campaign.CampaignFleetAPI;
013import com.fs.starfarer.api.campaign.CargoAPI;
014import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType;
015import com.fs.starfarer.api.campaign.CargoStackAPI;
016import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
017import com.fs.starfarer.api.campaign.FactionAPI;
018import com.fs.starfarer.api.campaign.InteractionDialogAPI;
019import com.fs.starfarer.api.campaign.OptionPanelAPI;
020import com.fs.starfarer.api.campaign.PersonImportance;
021import com.fs.starfarer.api.campaign.SpecialItemData;
022import com.fs.starfarer.api.campaign.TextPanelAPI;
023import com.fs.starfarer.api.campaign.comm.IntelInfoPlugin;
024import com.fs.starfarer.api.campaign.econ.Industry;
025import com.fs.starfarer.api.campaign.econ.MarketAPI;
026import com.fs.starfarer.api.campaign.listeners.ColonyPlayerHostileActListener;
027import com.fs.starfarer.api.campaign.rules.MemKeys;
028import com.fs.starfarer.api.campaign.rules.MemoryAPI;
029import com.fs.starfarer.api.characters.PersonAPI;
030import com.fs.starfarer.api.combat.ShipAPI.HullSize;
031import com.fs.starfarer.api.combat.ShipHullSpecAPI;
032import com.fs.starfarer.api.combat.WeaponAPI.WeaponSize;
033import com.fs.starfarer.api.fleet.FleetMemberAPI;
034import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.CustomRepImpact;
035import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
036import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
037import com.fs.starfarer.api.impl.campaign.DelayedBlueprintLearnScript;
038import com.fs.starfarer.api.impl.campaign.FusionLampEntityPlugin;
039import com.fs.starfarer.api.impl.campaign.econ.impl.InstallableItemEffect;
040import com.fs.starfarer.api.impl.campaign.econ.impl.ItemEffectsRepo;
041import com.fs.starfarer.api.impl.campaign.ids.Conditions;
042import com.fs.starfarer.api.impl.campaign.ids.Entities;
043import com.fs.starfarer.api.impl.campaign.ids.Factions;
044import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
045import com.fs.starfarer.api.impl.campaign.ids.Industries;
046import com.fs.starfarer.api.impl.campaign.ids.Items;
047import com.fs.starfarer.api.impl.campaign.ids.People;
048import com.fs.starfarer.api.impl.campaign.ids.Tags;
049import com.fs.starfarer.api.impl.campaign.intel.contacts.ContactIntel;
050import com.fs.starfarer.api.impl.campaign.intel.contacts.ContactIntel.ContactState;
051import com.fs.starfarer.api.impl.campaign.intel.events.HostileActivityEventIntel;
052import com.fs.starfarer.api.impl.campaign.intel.events.KantasProtectionOneTimeFactor;
053import com.fs.starfarer.api.impl.campaign.intel.events.PiracyRespiteScript;
054import com.fs.starfarer.api.impl.campaign.intel.events.PirateHostileActivityFactor;
055import com.fs.starfarer.api.impl.campaign.missions.DelayedFleetEncounter;
056import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality;
057import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetSize;
058import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.TempData;
059import com.fs.starfarer.api.loading.IndustrySpecAPI;
060import com.fs.starfarer.api.loading.WeaponSpecAPI;
061import com.fs.starfarer.api.util.DelayedActionScript;
062import com.fs.starfarer.api.util.IntervalUtil;
063import com.fs.starfarer.api.util.Misc;
064import com.fs.starfarer.api.util.Misc.Token;
065import com.fs.starfarer.api.util.Pair;
066import com.fs.starfarer.api.util.WeightedRandomPicker;
067
068/**
069 *      KantaCMD <action> <parameters>
070 */
071public class KantaCMD extends BaseCommandPlugin {
072        
073        public static final String KANTA_PROTECTION = "$kantaProtection";
074        public static final String EVER_HAD_KANTA_PROTECTION = "$everHadKantaProtection";
075        
076        public static boolean playerHasProtection() {
077                //if (true) return false;
078                return Global.getSector().getCharacterData().getMemoryWithoutUpdate().getBoolean(KANTA_PROTECTION);
079        }
080        public static boolean playerEverHadProtection() {
081                return Global.getSector().getCharacterData().getMemoryWithoutUpdate().getBoolean(EVER_HAD_KANTA_PROTECTION);
082        }
083        
084        public static class KantaFavorTrigger implements EveryFrameScript {
085
086                public static float MIN_ELAPSED = 720f;
087                
088                // around 50ish percent after 5 cycles
089                // want this to feel unpredictable and like it might not happen
090                public static float PROB_PER_MONTH = 0.01f;
091                
092                public static float MIN_DELAY_BETWEEN_COURIERS = 60f;
093                public static float MAX_DELAY_BETWEEN_COURIERS = 90f;
094                public static int MAX_ATTEMPTS = 5;
095                
096                
097                protected IntervalUtil interval = new IntervalUtil(20f, 40f);
098                protected float elapsed = 0f;
099                protected float resendTimeout = 0f;
100                protected int attempts = 0;
101                protected Random random = new Random();
102                protected boolean done = false;
103
104                public void advance(float amount) {
105                        if (Global.getSector().getMemoryWithoutUpdate().getBoolean("$affk_inProgress")) {
106                                done = true;
107                                return;
108                        }
109                        
110                        //amount *= 1000f;
111                        
112                        float days = Global.getSector().getClock().convertToDays(amount);
113                        elapsed += days;
114                        
115                        boolean send = false;
116                        
117                        interval.advance(days);
118                        if (interval.intervalElapsed()) {
119                                if (random.nextFloat() < PROB_PER_MONTH) {
120                                        send = true;
121                                }
122                        }
123                        
124//                      if (true) {
125//                              loseProtection(null);
126//                              Global.getSector().getCampaignUI().addMessage("Kanta's Protection lost", Misc.getNegativeHighlightColor());
127//                              send = false;
128//                              done = true;
129//                              return;
130//                      }
131                        
132                        if (attempts <= 0 && elapsed < MIN_ELAPSED) {
133                                send = false; // initial timeout
134                        }
135                        if (attempts > 0 && elapsed < resendTimeout) {
136                                send = false; // sent a courier recently
137                        } else if (attempts > 0) {
138                                if (attempts >= MAX_ATTEMPTS) { // too many failed attempts
139                                        loseProtection(null);
140                                        Global.getSector().getCampaignUI().addMessage("Kanta's Protection lost", Misc.getNegativeHighlightColor());
141                                        send = false;
142                                        done = true;
143                                        return;
144                                } else {
145                                        send = true; // sent a courier already, and not recently - always send another one
146                                }
147                        }
148                        
149                        //send = true;
150                        if (send) {
151                                elapsed = 0;
152                                sendCourier();
153                                attempts++;
154                                resendTimeout = MIN_DELAY_BETWEEN_COURIERS + 
155                                                           (MAX_DELAY_BETWEEN_COURIERS - MIN_DELAY_BETWEEN_COURIERS) * random.nextFloat();
156                        }
157                }
158                
159                public boolean isDone() {
160                        return done;
161                }
162
163                public boolean runWhilePaused() {
164                        return false;
165                }
166                
167                public void sendCourier() {
168                        DelayedFleetEncounter e = new DelayedFleetEncounter(random, "kantaFavorCourier");
169                        e.setDelayNone();
170                        e.setLocationInnerSector(false, null);
171                        e.setEncounterFromSomewhereInSystem();
172                        e.setDoNotAbortWhenPlayerFleetTooStrong();
173                        e.beginCreate();
174                        e.triggerCreateFleet(FleetSize.VERY_SMALL, FleetQuality.HIGHER, 
175                                                                Factions.PIRATES, FleetTypes.PATROL_SMALL, new Vector2f());
176                        e.triggerFleetSetName("Courier");
177                        e.triggerMakeNonHostile();
178                        e.triggerFleetMakeImportantPermanent(null);
179                        e.triggerFleetMakeFaster(true, 0, true);
180                        e.triggerOrderFleetInterceptPlayer();
181                        e.triggerOrderFleetEBurn(1f);
182                        e.triggerSetFleetGenericHailPermanent("KantaFavorCourierHail");
183                        e.endCreate();
184                }
185                
186        }
187        
188        
189        public static class TakingBackTheNanoforgeChecker implements ColonyPlayerHostileActListener {
190                protected MarketAPI market;
191                public TakingBackTheNanoforgeChecker(MarketAPI market) {
192                        this.market = market;
193                }
194
195                public void reportRaidForValuablesFinishedBeforeCargoShown(InteractionDialogAPI dialog, MarketAPI market,
196                                TempData actionData, CargoAPI cargo) {
197                        if (this.market.hasCondition(Conditions.DECIVILIZED)) {
198                                Global.getSector().getListenerManager().removeListener(this);
199                        }
200                        if (actionData.secret) {
201                                return;
202                        }
203                        if (market == this.market) {
204                                if (cargo.getQuantity(CargoItemType.SPECIAL, new SpecialItemData(Items.PRISTINE_NANOFORGE, null)) > 0) {
205                                        PersonAPI kanta = People.getPerson(People.KANTA);
206                                        if (kanta != null) {
207                                                TextPanelAPI text = dialog.getTextPanel();
208                                                text.addPara("Word of this is bound to get back to Kanta. "
209                                                                + "You can't imagine she would react well to being made a fool of.");
210                                                loseProtection(dialog);
211                                        }
212                                        Global.getSector().getListenerManager().removeListener(this);
213                                }
214                        }
215                }
216
217                public void reportRaidToDisruptFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData, Industry industry) {
218                }
219
220                public void reportTacticalBombardmentFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData) {
221                }
222
223                public void reportSaturationBombardmentFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData) {
224                }
225                
226        }
227        
228        public static class FusionLampColorChanger implements EveryFrameScript {
229                public boolean isDone() {
230                        return market.getContainingLocation() == null;
231                }
232
233                public boolean runWhilePaused() {
234                        return false;
235                }
236                
237                protected MarketAPI market;
238                protected IntervalUtil interval = new IntervalUtil(0.5f, 1f);
239                public FusionLampColorChanger(MarketAPI market) {
240                        this.market = market;
241                }
242
243                public void advance(float amount) {
244                        float days = Global.getSector().getClock().convertToDays(amount);
245                        if (Global.getSector().getClock().getMonth() == 11 &&
246                                        Global.getSector().getClock().getDay() == 28) {
247                                days *= 100f;
248                        }
249                                
250                        interval.advance(days);
251                        if (interval.intervalElapsed()) {
252                                for (CustomCampaignEntityAPI curr : market.getContainingLocation().getCustomEntities()) {
253                                        if (curr.getCustomEntityType().equals(Entities.FUSION_LAMP) &&
254                                                        curr.getOrbitFocus() == market.getPrimaryEntity()) {
255                                                
256                                                WeightedRandomPicker<Pair<Color, Color>> picker = new WeightedRandomPicker<Pair<Color, Color>>();
257                                                
258                                                // orange
259                                                picker.add(new Pair<Color, Color>(FusionLampEntityPlugin.GLOW_COLOR, FusionLampEntityPlugin.LIGHT_COLOR));
260                                                
261                                                // red
262                                                picker.add(new Pair<Color, Color>(new Color(255,50,50,255), new Color(255,50,50,255)));
263                                                
264                                                // blue
265                                                picker.add(new Pair<Color, Color>(new Color(210,230,255,255), new Color(210,230,255,255)));
266                                                
267                                                // white
268                                                picker.add(new Pair<Color, Color>(new Color(245,250,255,255), new Color(245,250,255,255)));
269                                                
270                                                // yellow
271                                                picker.add(new Pair<Color, Color>(new Color(255,225,125,255), new Color(255,225,125,255)));
272                                                
273                                                // green
274                                                picker.add(new Pair<Color, Color>(new Color(100,255,100,255), new Color(100,255,100,255)));
275                                                
276                                                Pair<Color, Color> pick = picker.pick();
277                                                
278                                                FusionLampEntityPlugin plugin = (FusionLampEntityPlugin) curr.getCustomPlugin();
279                                                plugin.setGlowColor(pick.one);
280                                                plugin.setLightColor(pick.two);
281                                                
282                                                break;
283                                        }
284                                }
285                                
286                        }
287                }
288        }
289        
290        public static class DelayedInstallItemScript extends DelayedActionScript {
291                protected MarketAPI market;
292                protected String industryId;
293                protected String itemId;
294
295                public DelayedInstallItemScript(float daysLeft, MarketAPI market, String industryId, String itemId) {
296                        super(daysLeft);
297                        this.market = market;
298                        this.industryId = industryId;
299                        this.itemId = itemId;
300                }
301
302                @Override
303                public void doAction() {
304                        InstallableItemEffect effect = ItemEffectsRepo.ITEM_EFFECTS.get(itemId);
305                        Industry ind = market.getIndustry(industryId);
306                        if (ind != null && effect != null && !market.hasCondition(Conditions.DECIVILIZED)) {
307                                List<String> unmet = effect.getUnmetRequirements(ind);
308                                if (unmet == null || unmet.isEmpty()) {
309                                        ind.setSpecialItem(new SpecialItemData(itemId, null));
310                                }
311                        }
312                }
313        }
314        
315        
316        public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
317                if (dialog == null) return false;
318                
319                OptionPanelAPI options = dialog.getOptionPanel();
320                TextPanelAPI text = dialog.getTextPanel();
321                CampaignFleetAPI pf = Global.getSector().getPlayerFleet();
322                CargoAPI cargo = pf.getCargo();
323                
324                String action = params.get(0).getString(memoryMap);
325                
326                MemoryAPI memory = memoryMap.get(MemKeys.LOCAL);
327                if (memory == null) return false; // should not be possible unless there are other big problems already
328                
329                MarketAPI market = dialog.getInteractionTarget().getMarket();
330                
331                if ("findLargeOmega".equals(action)) {
332                        for (CargoStackAPI stack : cargo.getStacksCopy()) {
333                                if (!stack.isWeaponStack()) continue;
334                                
335                                WeaponSpecAPI spec = stack.getWeaponSpecIfWeapon();
336                                if (spec.getSize() != WeaponSize.LARGE) continue;
337                                
338                                if (!spec.hasTag(Tags.OMEGA)) continue;
339                                
340                                memory.set("$foundWeaponId", spec.getWeaponId());                               
341                                memory.set("$foundWeaponName", spec.getWeaponName());                           
342                                memory.set("$foundWeaponQuantity", (int) Math.round(stack.getSize()));
343                                return true;
344                        }
345                } else if ("findContactToBetray".equals(action)) {
346                        ContactIntel best = null;
347                        int bestImportance = 0;
348                        float bestRel = 0f;
349                        for (IntelInfoPlugin curr : Global.getSector().getIntelManager().getIntel(ContactIntel.class)) {
350                                ContactIntel intel = (ContactIntel) curr;
351                                if (intel.isEnding() || intel.isEnded() || intel.getState() == ContactState.POTENTIAL) continue;
352                                
353                                int importance = intel.getPerson().getImportance().ordinal();
354                                float rel = intel.getPerson().getRelToPlayer().getRel();
355                                
356                                if (intel.getPerson().getImportance().ordinal() <= PersonImportance.MEDIUM.ordinal()) continue;
357                                //if (intel.getPerson().getRelToPlayer().isAtBest(RepLevel.WELCOMING)) continue;
358                                
359                                if (importance > bestImportance || (importance >= bestImportance && rel > bestRel)) {
360                                        best = intel;
361                                        bestImportance = importance;
362                                        bestRel = rel;
363                                }
364                        }
365                                
366                        if (best == null) return false;
367                        
368                        PersonAPI contact = best.getPerson();
369                        memory.set("$foundContactName", contact.getNameString());                               
370                        memory.set("$foundContactRank", contact.getRank().toLowerCase());                               
371                        memory.set("$foundContactPost", contact.getPost().toLowerCase());
372                        memory.set("$foundContactFaction", contact.getFaction().getPersonNamePrefixAOrAn() + " " + contact.getFaction().getPersonNamePrefix());                         
373                        memory.set("$foundContactIntel", best);                         
374                        
375                        return true;
376                } else if ("betrayContact".equals(action)) {
377                        ContactIntel intel = (ContactIntel) memory.get("$foundContactIntel");
378                        CustomRepImpact impact = new CustomRepImpact();
379                        impact.delta = -0.75f;
380                        Global.getSector().adjustPlayerReputation(
381                                        new RepActionEnvelope(RepActions.CUSTOM, 
382                                                        impact, null, text, true, true),
383                                                        intel.getPerson());
384                        intel.loseContact(dialog);
385                } else if ("gaveHamatsu".equals(action)) {
386                        PersonAPI ibrahim = People.getPerson(People.IBRAHIM);
387                        if (ibrahim != null) {
388                                CustomRepImpact impact = new CustomRepImpact();
389                                impact.delta = -2f;
390                                Global.getSector().adjustPlayerReputation(
391                                                new RepActionEnvelope(RepActions.CUSTOM, 
392                                                                impact, null, text, true, true),
393                                                                ibrahim);
394                                ContactIntel intel = ContactIntel.getContactIntel(ibrahim);
395                                if (intel !=  null) {
396                                        intel.loseContact(dialog);
397                                }
398                        }
399                } else if ("findRemnantCapital".equals(action)) {
400                        for (FleetMemberAPI member : pf.getFleetData().getMembersListCopy()) {
401                                if (member.getHullSpec().hasTag(Tags.SHIP_REMNANTS) && member.isCapital()) {
402                                        memory.set("$foundShipId", member.getId());                             
403                                        memory.set("$foundShipClass", member.getHullSpec().getNameWithDesignationWithDashClass());                              
404                                        memory.set("$foundShipName", member.getShipName());                             
405                                        return true;
406                                }
407                        }
408                } else if ("findShieldBlueprint".equals(action)) {
409                        for (CargoStackAPI stack : cargo.getStacksCopy()) {
410                                if (!stack.isSpecialStack()) continue;
411                                
412                                SpecialItemData data = stack.getSpecialDataIfSpecial();
413                                if (data.getData() == null) continue;
414                                
415                                if (!data.getId().equals(Items.INDUSTRY_BP)) continue;
416                                
417                                IndustrySpecAPI spec = Global.getSettings().getIndustrySpec(data.getData());
418                                
419                                if (spec.getId().equals(Industries.PLANETARYSHIELD)) {
420                                        memory.set("$foundIndustryId", spec.getId());
421                                        String firstWord = stack.getDisplayName().split(" ")[0];
422                                        memory.set("$foundIndustryName", Misc.ucFirst(Misc.getAOrAnFor(firstWord)) + " " + stack.getDisplayName().replace("Blueprint", "blueprint"));                           
423                                        return true;
424                                }
425                        }
426                } else if ("findShipBlueprint".equals(action)) {
427                        FactionAPI pirates = Global.getSector().getFaction(Factions.PIRATES);
428                        for (CargoStackAPI stack : cargo.getStacksCopy()) {
429                                if (!stack.isSpecialStack()) continue;
430                                
431                                SpecialItemData data = stack.getSpecialDataIfSpecial();
432                                if (data.getData() == null) continue;
433                                
434                                if (!data.getId().equals(Items.SHIP_BP)) continue;
435                                
436                                if (pirates.knowsShip(data.getData())) continue;
437                                
438                                ShipHullSpecAPI spec = Global.getSettings().getHullSpec(data.getData());
439                                
440                                boolean match = spec.hasTag(Tags.KANTA_GIFT);
441                                match |= !spec.isCivilianNonCarrier() && spec.getHullSize() == HullSize.CAPITAL_SHIP;
442                                
443                                if (match) {
444                                        memory.set("$foundShipBPId", data.getData());
445                                        String firstWord = stack.getDisplayName().split(" ")[0];
446                                        memory.set("$foundShipBPName", Misc.ucFirst(Misc.getAOrAnFor(firstWord)) + " " + stack.getDisplayName().replace("Blueprint", "blueprint"));                             
447                                        return true;
448                                }
449                        }
450                } else if ("learnShipBP".equals(action)) {
451                        String hullId = params.get(1).getString(memoryMap);
452                        float daysDelay = params.get(2).getFloat(memoryMap);
453                        DelayedBlueprintLearnScript script = new DelayedBlueprintLearnScript(Factions.PIRATES, daysDelay);
454                        script.getShips().add(hullId);
455                        Global.getSector().addScript(script);
456                        return true;
457                } else if ("oweKantaAFavor".equals(action)) {
458                        Global.getSector().addScript(new KantaFavorTrigger());
459                } else if ("abortFavor".equals(action)) {
460                        Global.getSector().removeScriptsOfClass(KantaFavorTrigger.class);
461                } else if ("alreadyDidFavor".equals(action)) {
462                        return !Global.getSector().hasScript(KantaFavorTrigger.class) && playerHasProtection();
463                                        //!Global.getSector().getMemoryWithoutUpdate().getBoolean("$affk_inProgress");
464                } else if ("installFusionLamp".equals(action)) {
465                        SpecialItemData data = new SpecialItemData(Items.ORBITAL_FUSION_LAMP, null);
466                        InstallableItemEffect effect = ItemEffectsRepo.ITEM_EFFECTS.get(data.getId());
467                        Industry ind = market.getIndustry(Industries.POPULATION);
468                        if (ind != null && effect != null) {
469                                List<String> unmet = effect.getUnmetRequirements(ind);
470                                if (unmet == null || unmet.isEmpty()) {
471                                        ind.setSpecialItem(data);
472                                        market.getPrimaryEntity().addScript(new FusionLampColorChanger(market));
473                                }
474                        }
475                        return true;
476                } else if ("buildPlanetaryShield".equals(action)) {
477                        Industry ind = market.getIndustry(Industries.PLANETARYSHIELD);
478                        if (ind == null) {
479                                market.addIndustry(Industries.PLANETARYSHIELD);
480                                
481                                // not very promising - shield is under the station etc
482//                              PlanetAPI planet = market.getContainingLocation().addPlanet(market.getId() + "_fakeForShield", market.getPrimaryEntity(), "", Planets.TUNDRA, 0, 100f, 0f, 1f);
483//                              market.getConnectedEntities().add(planet);
484//                              ind = market.getIndustry(Industries.PLANETARYSHIELD);
485//                              if (ind != null) {
486//                                      ind.startBuilding();
487//                              }
488                        }
489                        return true;
490                } else if ("gavePristineNanoforge".equals(action)) {
491                        float daysDelay = params.get(1).getFloat(memoryMap);
492                        //daysDelay = 0;
493                        MarketAPI kapteyn = Global.getSector().getEconomy().getMarket("station_kapteyn");
494                        if (kapteyn != null) {
495                                Global.getSector().addScript(
496                                                new DelayedInstallItemScript(daysDelay, 
497                                                                kapteyn, Industries.ORBITALWORKS, Items.PRISTINE_NANOFORGE));
498                                Global.getSector().getListenerManager().addListener(new TakingBackTheNanoforgeChecker(kapteyn));
499                        }
500                        return true;
501                } else if ("kapteynHasForge".equals(action)) {
502                        MarketAPI kapteyn = Global.getSector().getEconomy().getMarket("station_kapteyn");
503                        if (kapteyn == null || kapteyn.hasCondition(Conditions.DECIVILIZED)) return false;
504                        
505                        Industry ind = market.getIndustry(Industries.ORBITALWORKS);
506                        if (ind == null) return false;
507                        
508                        return ind.getSpecialItem() != null && Items.PRISTINE_NANOFORGE.equals(ind.getSpecialItem().getId()); 
509                } else if ("gainProtection".equals(action)) {
510                        Global.getSector().getCharacterData().getMemoryWithoutUpdate().set(KANTA_PROTECTION, true);
511                        Global.getSector().getCharacterData().getMemoryWithoutUpdate().set(EVER_HAD_KANTA_PROTECTION, true);
512                        text.setFontSmallInsignia();
513                        text.addPara("Kanta's Protection gained", Misc.getPositiveHighlightColor());
514                        text.setFontInsignia();
515                        
516                        Global.getSoundPlayer().playUISound("ui_rep_raise", 1f, 1f);
517                        
518                        PirateHostileActivityFactor.avertOrAbortRaid();
519                        
520                        HostileActivityEventIntel intel = HostileActivityEventIntel.get();
521                        if (intel != null) {
522                                intel.addFactor(new KantasProtectionOneTimeFactor(-Global.getSettings().getInt("HA_kantaProtection")), dialog);
523                        }
524                        
525                        new PiracyRespiteScript();
526                        
527                } else if ("loseProtection".equals(action)) {
528                        loseProtection(dialog);
529                }
530                
531                
532                
533                return false;
534        }
535
536        public static void loseProtection(InteractionDialogAPI dialog) {
537                if (!playerHasProtection()) return;
538                
539                PersonAPI kanta = People.getPerson(People.KANTA);
540                if (kanta != null) {
541                        Misc.incrUntrustwortyCount();
542                        
543                        TextPanelAPI text = dialog == null ? null : dialog.getTextPanel();
544                        CustomRepImpact impact = new CustomRepImpact();
545                        impact.delta = -0.5f;
546                        Global.getSector().adjustPlayerReputation(
547                                        new RepActionEnvelope(RepActions.CUSTOM, 
548                                                        impact, null, text, true, true),
549                                                        kanta);
550                        Global.getSector().getCharacterData().getMemoryWithoutUpdate().unset(KANTA_PROTECTION);
551                        if (text != null) {
552                                text.setFontSmallInsignia();
553                                text.addPara("Kanta's Protection lost", Misc.getNegativeHighlightColor());
554                                text.setFontInsignia();
555                        }
556                        Global.getSoundPlayer().playUISound("ui_rep_drop", 1f, 1f);
557                }
558        }
559        
560}