Пример #1
0
 public void clear()
 {
     instance     = null;
     evt          = null;
     runner       = null;
     parentRunner = null;
 }
Пример #2
0
    /** 执行触发器(检查条件) */
    protected void runTrigger(TriggerInstance instance, TriggerActionRunner runner)
    {
        TriggerArg arg = _argPool.getOne();

        arg.instance     = instance;
        arg.parentRunner = runner;
        toRunTrigger(arg);
    }
Пример #3
0
    private TriggerInstance doCreateInstance(int id)
    {
        TriggerConfigData config = _configDic.get(id);

        if (config == null)
        {
            warnLog("不该找不到配置", id);
            return(null);
        }

        TriggerInstance one = _instancePool.getOne();

        one.config = config;
        initInstance(one);
        return(one);
    }
Пример #4
0
    public void TestAddSubscriber()
    {
        List <TriggerInstance> listeners = new List <TriggerInstance>();

        Assert.AreEqual(0, manager.subscribers.Count);

        // We subscribe a trigger
        string          trigger_description = "{\"scope\": \"ADJACENT\", \"when\": \"ALWAYS\", \"effect\": {\"resource\": \"MONEY\", \"value\": 2}, \"type\": \"GREEN\"}";
        Trigger         trigger_            = Trigger.LoadFromJson(JSON.Parse(trigger_description) as JSONClass);
        TriggerInstance trigger             = new TriggerInstance(trigger_, suburbs); // Bogus TileInstance

        manager.AddSubscriber(trigger);

        Assert.AreEqual(1, manager.subscribers.Count);
        TileType type_green = new TileType(ETileColor.GREEN);

        Assert.AreEqual(true, manager.subscribers.ContainsKey(type_green));
        manager.subscribers.TryGetValue(type_green, out listeners);
        Assert.AreEqual(1, listeners.Count);
        Assert.AreEqual(true, listeners.Contains(trigger));

        // We subscribe a tile with a trigger
        manager = new TileManager();
        Assert.AreEqual(0, manager.subscribers.Count);
        string       mint_description = "{\"name\": \"Mint\", \"triggers\": [{\"scope\": \"OWN\", \"when\": \"ALWAYS\", \"effect\": {\"resource\": \"MONEY\", \"value\": 2}, \"type\": \"GREY\"}], \"color\": \"GREY\", \"price\": 15, \"number\": 2, \"immediate\": {\"resource\": \"INCOME\", \"value\": 3}, \"letter\": \"A\", \"icon\": \"NONE\"}";
        Tile         mint_            = GetTileFromString(mint_description);
        TileInstance mint             = new TileInstance(mint_);

        mint.position = new TilePosition(0, 6);
        mint.owner    = player;
        manager.AddSubscriber(mint);

        Assert.AreEqual(1, manager.subscribers.Count);
        TileType type_grey = new TileType(ETileColor.GREY);

        Assert.AreEqual(true, manager.subscribers.ContainsKey(type_grey));
        manager.subscribers.TryGetValue(type_grey, out listeners);
        Assert.AreEqual(true, listeners.Contains(mint.triggers[0]));

        // We subscribe a tile with no trigger
        manager = new TileManager();
        Assert.AreEqual(0, manager.subscribers.Count);
        manager.AddSubscriber(suburbs);

        Assert.AreEqual(0, manager.subscribers.Count);
    }
Пример #5
0
    public void AddSubscriber(TriggerInstance p_trigger)
    {
        TileType type_trigger = p_trigger.trigger.type;

        List <TriggerInstance> list;

        if (!m_subscribers.ContainsKey(type_trigger))
        {
            list = new List <TriggerInstance> ();
            list.Add(p_trigger);

            m_subscribers.Add(type_trigger, list);
        }
        else
        {
            m_subscribers.TryGetValue(type_trigger, out list);
            list.Add(p_trigger);
        }
    }
Пример #6
0
 public static bool TriggerIsValid(LevelSettings levelSettings, TriggerInstance trigger)
 {
     if (!GetTriggerTypeRange(levelSettings).Contains(trigger.TriggerType))
     {
         return(false);
     }
     if (!GetTargetTypeRange(levelSettings, trigger.TriggerType).Contains(trigger.TargetType))
     {
         return(false);
     }
     if (!GetTargetRange(levelSettings, trigger.TriggerType, trigger.TargetType, trigger.Timer).ParameterMatches(trigger.Target, false))
     {
         return(false);
     }
     if (!GetTimerRange(levelSettings, trigger.TriggerType, trigger.TargetType, trigger.Target).ParameterMatches(trigger.Timer, false))
     {
         return(false);
     }
     if (!GetExtraRange(levelSettings, trigger.TriggerType, trigger.TargetType, trigger.Target, trigger.Timer).ParameterMatches(trigger.Extra, false))
     {
         return(false);
     }
     return(true);
 }
Пример #7
0
 public void clear()
 {
     instance = null;
     delay    = 0;
     current  = 0;
 }
Пример #8
0
        public static string ExportToScriptTrigger(Level level, TriggerInstance trigger, bool withComment = false)
        {
            checked
            {
                string result = null;

                switch (trigger.TriggerType)
                {
                case TriggerType.ConditionNg:
                {
                    if (!TriggerIsValid(level.Settings, trigger))
                    {
                        throw new Exception("Trigger is invalid.");
                    }

                    ushort           conditionId      = GetValue(level, trigger.Timer);
                    NgTriggerSubtype conditionTrigger = NgCatalog.ConditionTrigger.MainList[conditionId];

                    ushort firstValue  = GetValue(level, trigger.Target);
                    ushort secondValue = conditionId;
                    if (!conditionTrigger.Extra.IsEmpty)
                    {
                        secondValue |= (ushort)(GetValue(level, trigger.Extra) << 8);
                    }

                    result  = trigger.Target is ObjectInstance ? "$9000," : "$8000,";
                    result += firstValue + ",$" + secondValue.ToString("X4");
                    break;
                }

                default:
                    switch (trigger.TargetType)
                    {
                    case TriggerTargetType.FlipEffect:
                    {
                        if (!TriggerIsValid(level.Settings, trigger))
                        {
                            throw new Exception("Trigger is invalid.");
                        }

                        ushort           flipeffectId      = GetValue(level, trigger.Target);
                        NgTriggerSubtype flipeffectTrigger = NgCatalog.FlipEffectTrigger.MainList[flipeffectId];

                        ushort firstValue  = flipeffectId;
                        ushort secondValue = GetValue(level, trigger.Timer);
                        if (!flipeffectTrigger.Extra.IsEmpty)
                        {
                            secondValue |= (ushort)(GetValue(level, trigger.Extra) << 8);
                        }

                        result = "$2000," + firstValue + ",$" + secondValue.ToString("X4");
                        break;
                    }

                    case TriggerTargetType.ActionNg:
                    {
                        if (!TriggerIsValid(level.Settings, trigger))
                        {
                            throw new Exception("Trigger is invalid.");
                        }

                        ushort           actionId      = GetValue(level, trigger.Timer);
                        NgTriggerSubtype actionTrigger = NgCatalog.ActionTrigger.MainList[actionId];

                        ushort firstValue  = GetValue(level, trigger.Target);
                        ushort secondValue = actionId;
                        if (!actionTrigger.Extra.IsEmpty)
                        {
                            secondValue |= (ushort)(GetValue(level, trigger.Extra) << 8);
                        }

                        result  = trigger.Target is StaticInstance ? "$4000," : "$5000,";
                        result += firstValue + ",$" + secondValue.ToString("X4");
                        break;
                    }
                    }
                    break;
                }

                if (!string.IsNullOrEmpty(result))
                {
                    return((withComment ?
                            "; " + trigger.TriggerType + " for " + trigger.TargetType +
                            "\n; <#> " + trigger.Target +
                            "\n; <&> " + trigger.Timer +
                            (trigger.Extra == null ? "" : "\n; <E> " + trigger.Extra) +
                            "\n; Copy following values to your script:" +
                            "\n; "
                        : "")
                           + result);
                }
            }
            throw new ExceptionScriptNotSupported();
        }
Пример #9
0
        public FormTrigger(Level level, TriggerInstance trigger, Action <ObjectInstance> selectObject,
                           Action <Room> selectRoom)
        {
            InitializeComponent();

            _level   = level;
            _trigger = trigger;

            // Setup events
            foreach (var control in panelClassicTriggerControls.Controls.OfType <TriggerParameterControl>())
            {
                control.ViewObject += selectObject;
                control.ViewRoom   += selectRoom;
                control.Level       = level;
            }

            foreach (Control control in scriptExportPanel.Controls)
            {
                control.Click += scriptExportPanel_Click;
            }
            scriptExportPanel.Click += scriptExportPanel_Click;

            this.SetActualSize();
            this.LockHeight();

            if (_level.Settings.GameVersion == TRVersion.Game.TR5Main)
            {
                Text = "Legacy trigger editor";
            }
            else
            {
                Text = "Trigger editor";
            }

            // Set window property handlers
            Configuration.LoadWindowProperties(this, Editor.Instance.Configuration);
            FormClosing += new FormClosingEventHandler((s, e) => Configuration.SaveWindowProperties(this, Editor.Instance.Configuration));

            // Update the dialog
            UpdateDialog();

            // Set values
            cbBit1.Checked    = (_trigger.CodeBits & (1 << 0)) != 0;
            cbBit2.Checked    = (_trigger.CodeBits & (1 << 1)) != 0;
            cbBit3.Checked    = (_trigger.CodeBits & (1 << 2)) != 0;
            cbBit4.Checked    = (_trigger.CodeBits & (1 << 3)) != 0;
            cbBit5.Checked    = (_trigger.CodeBits & (1 << 4)) != 0;
            cbOneShot.Checked = _trigger.OneShot;

            paramTriggerType.Parameter = new TriggerParameterUshort((ushort)_trigger.TriggerType);
            paramTargetType.Parameter  = new TriggerParameterUshort((ushort)_trigger.TargetType);

            // HACK: Change order of population based on target type.
            if (_trigger.TriggerType == TriggerType.ConditionNg)
            {
                paramTimer.Parameter  = _trigger.Timer;
                paramTarget.Parameter = _trigger.Target;
            }
            else
            {
                paramTarget.Parameter = _trigger.Target;
                paramTimer.Parameter  = _trigger.Timer;
            }

            paramExtra.Parameter = _trigger.Extra;
        }
Пример #10
0
 /** 初始化当前instance */
 protected void initInstance(TriggerInstance instance)
 {
 }
Пример #11
0
    public void AddSubscriber(TriggerInstance p_trigger)
    {
        TileType type_trigger = p_trigger.trigger.type;

        List<TriggerInstance> list;
        if (!m_subscribers.ContainsKey (type_trigger)) {

            list = new List<TriggerInstance> ();
            list.Add (p_trigger);

            m_subscribers.Add (type_trigger, list);

        } else {
            m_subscribers.TryGetValue (type_trigger, out list);
            list.Add (p_trigger);
        }
    }
Пример #12
0
    public void TestAddSubscriber()
    {
        List<TriggerInstance> listeners = new List<TriggerInstance>();

        Assert.AreEqual(0, manager.subscribers.Count);

        // We subscribe a trigger
        string trigger_description = "{\"scope\": \"ADJACENT\", \"when\": \"ALWAYS\", \"effect\": {\"resource\": \"MONEY\", \"value\": 2}, \"type\": \"GREEN\"}";
        Trigger trigger_ = Trigger.LoadFromJson(JSON.Parse(trigger_description) as JSONClass);
        TriggerInstance trigger = new TriggerInstance(trigger_, suburbs);  // Bogus TileInstance
        manager.AddSubscriber(trigger);

        Assert.AreEqual(1, manager.subscribers.Count);
        TileType type_green = new TileType(ETileColor.GREEN);
        Assert.AreEqual(true, manager.subscribers.ContainsKey(type_green));
        manager.subscribers.TryGetValue(type_green, out listeners);
        Assert.AreEqual(1, listeners.Count);
        Assert.AreEqual(true, listeners.Contains(trigger));

        // We subscribe a tile with a trigger
        manager = new TileManager();
        Assert.AreEqual(0, manager.subscribers.Count);
        string mint_description = "{\"name\": \"Mint\", \"triggers\": [{\"scope\": \"OWN\", \"when\": \"ALWAYS\", \"effect\": {\"resource\": \"MONEY\", \"value\": 2}, \"type\": \"GREY\"}], \"color\": \"GREY\", \"price\": 15, \"number\": 2, \"immediate\": {\"resource\": \"INCOME\", \"value\": 3}, \"letter\": \"A\", \"icon\": \"NONE\"}";
        Tile mint_ = GetTileFromString(mint_description);
        TileInstance mint = new TileInstance(mint_);
        mint.position = new TilePosition(0, 6);
        mint.owner = player;
        manager.AddSubscriber(mint);

        Assert.AreEqual(1, manager.subscribers.Count);
        TileType type_grey = new TileType(ETileColor.GREY);
        Assert.AreEqual(true, manager.subscribers.ContainsKey(type_grey));
        manager.subscribers.TryGetValue(type_grey, out listeners);
        Assert.AreEqual(true, listeners.Contains(mint.triggers[0]));

        // We subscribe a tile with no trigger
        manager = new TileManager();
        Assert.AreEqual(0, manager.subscribers.Count);
        manager.AddSubscriber(suburbs);

        Assert.AreEqual(0, manager.subscribers.Count);
    }