001package com.fs.starfarer.api.impl.campaign.rulecmd;
002
003import java.util.List;
004import java.util.Map;
005
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.InteractionDialogAPI;
009import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
010import com.fs.starfarer.api.campaign.rules.MemoryAPI;
011import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
012import com.fs.starfarer.api.util.Misc;
013import com.fs.starfarer.api.util.Misc.Token;
014
015/**
016 * @author Alex Mosolov
017 *
018 *      MakeOtherFleetNonHostile <reason> <true or false> <expire>
019 *
020 * Copyright 2015 Fractal Softworks, LLC
021 */
022public class MakeOtherFleetNonHostile extends BaseCommandPlugin {
023
024        public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
025
026                if (dialog == null) return false;
027                if (!(dialog.getInteractionTarget() instanceof CampaignFleetAPI)) return false;
028                
029                String reason = "generic";
030                boolean value;
031                boolean generic = false;
032                float expire = -1f;
033                if (params.size() >= 2) {
034                        reason = params.get(0).getString(memoryMap);
035                        value = params.get(1).getBoolean(memoryMap);
036                        if (params.size() >= 3) {
037                                expire = params.get(2).getFloat(memoryMap);
038                        }
039                } else if (params.size() < 1) {
040                        value = true;
041                } else {
042                        generic = true;
043                        value = params.get(0).getBoolean(memoryMap);
044                }
045                
046                boolean wasHostile = false;
047                if (dialog.getInteractionTarget() instanceof CampaignFleetAPI) {
048                        CampaignFleetAPI fleet = (CampaignFleetAPI) dialog.getInteractionTarget();
049                        wasHostile = fleet.isHostileTo(Global.getSector().getPlayerFleet());
050                }
051                
052                
053                MemoryAPI memory = dialog.getInteractionTarget().getMemoryWithoutUpdate();
054                
055                if (value) {
056                        if (generic) {
057                                Misc.clearFlag(memory, MemFlags.MEMORY_KEY_MAKE_HOSTILE);
058                                Misc.clearFlag(memory, MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF);
059                                memory.unset(MemFlags.MEMORY_KEY_MAKE_HOSTILE);
060                                memory.unset(MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF);
061                        } else {
062                                Misc.setFlagWithReason(memory, MemFlags.MEMORY_KEY_MAKE_HOSTILE, reason, false, expire);
063                                Misc.setFlagWithReason(memory, MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF, reason, false, expire);
064                        }
065                }
066                
067                boolean stillSet = Misc.setFlagWithReason(memory, MemFlags.MEMORY_KEY_MAKE_NON_HOSTILE, reason, value, expire);
068                
069                if (stillSet) {
070                        CampaignFleetAPI fleet = (CampaignFleetAPI) dialog.getInteractionTarget();
071                        if (fleet.getAI() instanceof ModularFleetAIAPI) {
072                                ModularFleetAIAPI mAI = (ModularFleetAIAPI) fleet.getAI();
073                                mAI.getTacticalModule().forceTargetReEval();
074                        }
075                }
076                
077                boolean isHostile = false;
078                if (dialog.getInteractionTarget() instanceof CampaignFleetAPI) {
079                        CampaignFleetAPI fleet = (CampaignFleetAPI) dialog.getInteractionTarget();
080                        isHostile = fleet.isHostileTo(Global.getSector().getPlayerFleet());
081                }
082                
083                if (isHostile != wasHostile) {
084                        Global.getSoundPlayer().restartCurrentMusic();
085                }
086                
087                return true;
088        }
089
090}
091
092
093
094
095