Пример #1
0
        public frmMapEvent(IMapEvent e)
        {
            InitializeComponent();

            this.Event = e;

            this.Icon = Icon.FromHandle(Resources.imgLightning.GetHicon());
            this.InitialHeight = this.Height - this.flowParameters.Height;
        }
Пример #2
0
 static byte[] EventToBytes(IMapEvent e)
 {
     using var ms = new MemoryStream();
     using var bw = new BinaryWriter(ms);
     using var s  = new AlbionWriter(bw);
     MapEvent.Serdes(e, s, EventSetId.None, TextId.None, AssetMapping.Global);
     bw.Flush();
     ms.Position = 0;
     return(ms.ToArray());
 }
Пример #3
0
 public IMapEvent NextEvent()
 {
     if (_events.Count > 0)
     {
         IMapEvent e = (IMapEvent)_events.Dequeue();
         return(e);
     }
     else
     {
         return(null);
     }
 }
Пример #4
0
        public void AddEvent(string mapname, IMapEvent mapevent)
        {
            lock(this.events)
            {
                if(!this.events.ContainsKey(mapname))
                    this.events.Add(mapname, new List<IMapEvent>());

                if(this.events.Values.Where(e => e == mapevent).FirstOrDefault() != null)
                    throw new ArgumentException ("Event already exist.");

                this.events[mapname].Add(mapevent);
            }
        }
Пример #5
0
        public XmlNode EventToXmlNode(IMapEvent mapevent, XmlDocument doc)
        {
            XmlElement xmlevent = doc.CreateElement("Event");

            // Properties of event
            XmlElement loc = doc.CreateElement("Location");
            new MapPoint(mapevent.Rectangle.X, mapevent.Rectangle.Y).ToXml(doc, loc);

            XmlElement size = doc.CreateElement("Size");
            new MapPoint(mapevent.Rectangle.Width, mapevent.Rectangle.Height).ToXml(doc, size);

            XmlElement type = doc.CreateElement("Type");
            type.InnerText = mapevent.GetType().FullName;

            XmlElement dir = doc.CreateElement("Dir");
            dir.InnerText = mapevent.Direction.ToString();

            XmlElement activation = doc.CreateElement("Activation");
            activation.InnerText = ((int)mapevent.Activation).ToString();

            XmlElement parmRoot = doc.CreateElement("Parameters");

            foreach (var parm in mapevent.Parameters)
            {
                XmlElement pname = doc.CreateElement("Name");
                pname.InnerText = parm.Key;

                XmlElement pvalue = doc.CreateElement("Value");
                pvalue.InnerText = parm.Value;

                XmlElement parmNode = doc.CreateElement("Parameter");
                parmNode.AppendChild(pname);
                parmNode.AppendChild(pvalue);

                parmRoot.AppendChild(parmNode);
            }

            xmlevent.AppendChild(type);
            xmlevent.AppendChild(activation);
            xmlevent.AppendChild(dir);
            xmlevent.AppendChild(loc);
            xmlevent.AppendChild(size);
            xmlevent.AppendChild(parmRoot);

            return xmlevent;
        }
Пример #6
0
        static string Test(string scriptFormat, string expectedToStringResult, IMapEvent e)
        {
            if (!string.Equals(e.ToString(), expectedToStringResult, StringComparison.OrdinalIgnoreCase))
            {
                return($"Event \"{e}\" did not serialise to the expected string \"{expectedToStringResult}\"");
            }

            IMapEvent parsed;

            try { parsed = (IMapEvent)Event.Parse(scriptFormat); }
            catch (Exception ex) { return($"Could not parse \"{scriptFormat}\": {ex}"); }


            var bytes1 = EventToBytes(e);
            var bytes2 = EventToBytes(parsed);
            var hex1   = FormatUtil.BytesToHexString(bytes1);
            var hex2   = FormatUtil.BytesToHexString(bytes2);

            if (!string.Equals(hex1, hex2, StringComparison.Ordinal))
            {
                return($"The literal event ({e}) serialised to {hex1}, but the parsed event ({scriptFormat}) serialised to {hex2}");
            }

            if (scriptFormat != expectedToStringResult)
            {
                IMapEvent roundTripped;
                try { roundTripped = (IMapEvent)Event.Parse(expectedToStringResult); }
                catch (Exception ex) { return($"Could not parse \"{expectedToStringResult}\": {ex}"); }

                var bytes3 = EventToBytes(roundTripped);
                var hex3   = FormatUtil.BytesToHexString(bytes3);
                if (!string.Equals(hex1, hex2, StringComparison.Ordinal))
                {
                    return($"The literal event ({e}) serialised to {hex1}, but after round-tripping through text ({expectedToStringResult}) it serialised to {hex3}");
                }
            }

            return(null);
        }
Пример #7
0
 public void ReferenceSetOrAdd(Map map, IMapEvent mapevent)
 {
     this.ReferenceSetOrAdd(map.Name, mapevent);
 }
Пример #8
0
 private void EnqueueEvent(IMapEvent e)
 {
     _jsMapController.EnqueueEvent(e);
 }
Пример #9
0
 public BranchNode(ushort id, IMapEvent @event) : base(id, @event)
 {
 }
Пример #10
0
        private void btnOk_Click(object sender, EventArgs e)
        {
            if( this.Event == null)
                this.Event = (IMapEvent)Activator.CreateInstance((Type)this.inType.SelectedItem);

            this.Event.Direction = (Directions)Enum.Parse(typeof(Directions), this.inDirection.Text);
            this.Event.Activation = (ActivationTypes)Enum.Parse(typeof(ActivationTypes), this.inActivation.SelectedItem.ToString());

            this.Event.Parameters = new Dictionary<string, string>();
            foreach (var Parameter in this.GetParameters())
            {
                if(!String.IsNullOrEmpty(Parameter.Key))
                    this.Event.Parameters.Add(Parameter.Key, Parameter.Value);
            }

            this.Close();
        }
Пример #11
0
        public static IMapEvent Serdes(IMapEvent e, ISerializer s, AssetId chainSource, TextId textSourceId, AssetMapping mapping)
        {
            if (s == null)
            {
                throw new ArgumentNullException(nameof(s));
            }
            var initialPosition = s.Offset;

            s.Begin();
            var type = s.EnumU8("Type", e?.EventType ?? MapEventType.UnkFf);

            e = type switch // Individual parsers handle byte range [1,9]
            {
                MapEventType.Action => ActionEvent.Serdes((ActionEvent)e, mapping, s),
                MapEventType.AskSurrender => AskSurrenderEvent.Serdes((AskSurrenderEvent)e, s),
                MapEventType.ChangeIcon => ChangeIconEvent.Serdes((ChangeIconEvent)e, s),
                MapEventType.ChangeUsedItem => ChangeUsedItemEvent.Serdes((ChangeUsedItemEvent)e, mapping, s),
                MapEventType.Chest => ChestEvent.Serdes((ChestEvent)e, mapping, s, textSourceId),
                MapEventType.CloneAutomap => CloneAutomapEvent.Serdes((CloneAutomapEvent)e, mapping, s),
                MapEventType.CreateTransport => CreateTransportEvent.Serdes((CreateTransportEvent)e, s),
                MapEventType.DataChange => DataChangeEvent.Serdes((DataChangeEvent)e, mapping, s),
                MapEventType.Door => DoorEvent.Serdes((DoorEvent)e, mapping, s, textSourceId),
                MapEventType.Encounter => EncounterEvent.Serdes((EncounterEvent)e, s),
                MapEventType.EndDialogue => EndDialogueEvent.Serdes((EndDialogueEvent)e, s),
                MapEventType.Execute => ExecuteEvent.Serdes((ExecuteEvent)e, s),
                MapEventType.MapExit => TeleportEvent.Serdes((TeleportEvent)e, mapping, s),
                MapEventType.Modify => ModifyEvent.BaseSerdes((ModifyEvent)e, mapping, chainSource, s),
                MapEventType.Offset => OffsetEvent.Serdes((OffsetEvent)e, s),
                MapEventType.Pause => PauseEvent.Serdes((PauseEvent)e, s),
                MapEventType.PlaceAction => PlaceActionEvent.Serdes((PlaceActionEvent)e, s),
                MapEventType.PlayAnimation => PlayAnimationEvent.Serdes((PlayAnimationEvent)e, mapping, s),
                MapEventType.Query => QueryEvent.Serdes((QueryEvent)e, mapping, s, textSourceId),
                MapEventType.RemovePartyMember => RemovePartyMemberEvent.Serdes((RemovePartyMemberEvent)e, mapping, s),
                MapEventType.Script => DoScriptEvent.Serdes((DoScriptEvent)e, mapping, s),
                MapEventType.Signal => SignalEvent.Serdes((SignalEvent)e, s),
                MapEventType.SimpleChest => SimpleChestEvent.Serdes((SimpleChestEvent)e, mapping, s),
                MapEventType.Sound => SoundEvent.Serdes((SoundEvent)e, mapping, s),
                MapEventType.Spinner => SpinnerEvent.Serdes((SpinnerEvent)e, s),
                MapEventType.StartDialogue => StartDialogueEvent.Serdes((StartDialogueEvent)e, mapping, s),
                MapEventType.Text => TextEvent.Serdes((TextEvent)e, mapping, s, textSourceId),
                MapEventType.Trap => TrapEvent.Serdes((TrapEvent)e, s),
                MapEventType.Wipe => WipeEvent.Serdes((WipeEvent)e, s),
                _ => DummyMapEvent.Serdes((DummyMapEvent)e, s, type)
            };
            s.End();
            if (e is IBranchingEvent)
            {
                s.Assert(s.Offset - initialPosition == 8, "Query events should always be 8 bytes");
            }
            else
            {
                s.Assert(s.Offset - initialPosition == 10, "Non-query map events should always be 10 bytes");
            }
            return(e);
        }

/* ==  Binary Serialisable Event types: ==
 * 1 Teleport (teleport 300 32 75)
 * 2 Door     (open_door ...)
 * 3 Chest    (open_chest ...)
 * 4 Text     (map_text 100)
 * 5 Spinner  (spinner ...)
 * 6 Trap     (trap ...)
 * 7 ChangeUsedItem (change_used_item ...)
 * 8 DataChange (further subdivided by operation: min,max,?,set,add,sub,add%,sub%)
 *   0 Unk0 (TODO)
 *   2 Health     (party[Tom].health += 20%)
 *   3 Mana       (party[Sira].mana -= 5)
 *   5 Status     (party[Rainer].status[Poisoned] = max)
 *   7 Language   (party[Tom].language[Iskai] = max)
 *   8 Experience (party[Drirr].experience += 2000)
 *   B UnkB (TODO)
 *   C UnkC (TODO)
 *  13 Item (party[Tom].items[LughsShield] = 1)
 *  14 Gold (party[Joe].gold += 12)
 *  15 Food (party[Siobhan].food -= 10%)
 * 9 ChangeIcon (scope: rel vs abs, temp vs perm)
 *  0 Underlay    (map.tempUnderlay[23,12] = 47)
 *  1 Overlay     (map.permOverlay[+0,-3] = 1231)
 *  2 Wall        (map.tempWall[10, 10] = 7)
 *  3 Floor       (map.permFloor[64, 64] = 1)
 *  4 Ceiling     (map.permCeiling[12, 24] = 7)
 *  5 NpcMovement (npc[12].permMovement = 3)
 *  6 NpcSprite   (npc[5].tempSprite = 14)
 *  7 Chain       (map.tempChain[10, 10] = 15)
 *  8 BlockHard   (block_hard ...)
 *  9 BlockSoft   (block_soft ...)
 *  A Trigger     (map.tempTrigger[96, 7] = Normal)
 * A Encounter (encounter ...)
 * B PlaceAction
 *   0 LearnCloseCombat
 *   1 Heal
 *   2 Cure
 *   3 RemoveCurse
 *   4 AskOpinion
 *   5 RestoreItemEnergy
 *   6 SleepInRoom
 *   7 Merchant
 *   8 OrderFood
 *   9 ScrollMerchant
 *   B LearnSpells
 *   C RepairItem
 * C Query (further subdivided by operation: NZ, <=, !=, ==, >=, >, <)
 *   0 Switch (switch[100]), (!switch[203]), (switch[KhunagMentionedSecretPassage])
 *   1 Unk1
 *   4 Unk4
 *   5 HasPartyMember (party[Tom].isPresent)
 *   6 HasItem        (!party.hasItem[Axe])
 *   7 UsedItem       (context.usedItem == Pick)
 *   9 PreviousActionResult (context.result)
 *   A ScriptDebugMode      (context.isDebug)
 *   C UnkC
 *   E NpcActive      (npc[16].isActive)
 *   F Gold           (party.gold > 100)
 *  11 RandomChance   (random(50))
 *  12 Unk12
 *  14 ChosenVerb     (context.verb == Examine)
 *  15 Conscious      (party[Tom].isConscious)
 *  1A Leader         (party[Rainer].isLeader)
 *  1C Ticker         (ticker[50] > 12)
 *  1D Map            (context.map == Drinno3)
 *  1E Unk1E
 *  1F PromptPlayer   (askYesNo(100))
 *  19 Unk19
 *  20 TriggerType    (context.trigger == UseItem)
 *  21 Unk21
 *  22 EventUsed      (context.event[108].hasRun)
 *  23 DemoVersion    (context.isDemo)
 *  29 Unk29
 *  2A Unk2A
 *  2B PromptPlayerNumeric (askNumeric() = 1042)
 * D Modify
 *   0 Switch            (switch[125] = 1)
 *   1 DisableEventChain (map[CantosHouse].chain[120] = 0)
 *   2 Unk2
 *   4 NpcActive         (set_npc_active ...)
 *   5 AddPartyMember    (add_party_member ...)
 *   6 InventoryItem     (party.item[Knife] += 3)
 *   B Lighting          (map.lighting = 5) ??
 *   F PartyGold         (party.gold = min)
 *  10 PartyRations      (party.rations += 12)
 *  12 Time              (context.time += 6)
 *  1A Leader            (party.leader = Tom)
 *  1C Ticker            (ticker[93] = 108)
 * E Action (action ...)
 *   0 Word
 *   1 AskAboutItem
 *   2 Unk2 // Pay money? See ES156 (Garris, Gratogel sailor)
 *   4 Unk4
 *   5 Unk5
 *   6 StartDialogue
 *   7 FinishDialogue
 *   8 DialogueLine
 *   9 Unk9
 *   E Unk14
 *  17 Unk23
 *  2D Unk45
 *  2E UseItem
 *  2F EquipItem
 *  30 UnequipItem
 *  36 PickupItem
 *  39 Unk57
 *  3D Unk61
 * F Signal            (signal ...)
 * 10 CloneAutomap      (clone_automap ...)
 * 11 Sound             (sound ...)
 * 12 StartDialogue     (start_dialogue ...)
 * 13 CreateTransport   (???)
 * 14 Execute           (execute)
 * 15 RemovePartyMember (remove_party_member ...)
 * 16 EndDialogue       (end_dialogue)
 * 17 Wipe              (wipe ...)
 * 18 PlayAnimation     (play_anim ...)
 * 19 Offset            (offset 0 0)
 * 1A Pause             (pause 3)
 * 1B SimpleChest       (simple_chest ...)
 * 1C AskSurrender      (ask_surrender)
 * 1D Script            (script 15)
 * FF UnkFF
 */
    }
Пример #12
0
        public bool RemoveEvent(string mapname, IMapEvent mapevent)
        {
            lock(this.events)
            {
                if(!this.events.ContainsKey(mapname))
                    return false;

                return this.events[mapname].Remove(mapevent);
            }
        }
Пример #13
0
 public void AddEvent(Map map, IMapEvent mapevent)
 {
     this.AddEvent (map.Name, mapevent);
 }
Пример #14
0
 void IJSMapController.EnqueueEvent(IMapEvent e)
 {
     _events.Enqueue(e);
 }
Пример #15
0
 public bool RemoveEvent(Map map, IMapEvent mapevent)
 {
     return this.RemoveEvent(map.Name, mapevent);
 }
Пример #16
0
 void IJSMapController.EnqueueEvent(IMapEvent e)
 {
     _events.Enqueue(e);
 }
Пример #17
0
 public void RemoveEvent(IMapEvent mapevent)
 {
     this.events[TileEngine.CurrentMapChunk].Remove(mapevent);
 }
Пример #18
0
 public void DelEvent(IMapEvent e)
 {
     this.events[TileEngine.CurrentMapChunk].Remove(e);
 }
Пример #19
0
 public void AddEvent(IMapEvent mapevent)
 {
     this.events[TileEngine.CurrentMapChunk].Add(mapevent);
 }
Пример #20
0
        public void SetOrAddEvent(IMapEvent e)
        {
            if (this.events[TileEngine.CurrentMapChunk].Contains(e))
            {
                int index = this.events[TileEngine.CurrentMapChunk].IndexOf(e);

                this.events[TileEngine.CurrentMapChunk][index] = (IMapEvent)e.Clone();
            }
            else
                this.events[TileEngine.CurrentMapChunk].Add(e);
        }
Пример #21
0
        public void ReferenceSetOrAdd(string mapname, IMapEvent mapevent)
        {
            lock(this.events)
            {
                if(this.events[mapname].Contains(mapevent))
                {
                    int index = this.events[mapname].IndexOf(mapevent);

                    this.events[mapname][index] = (IMapEvent)mapevent.Clone();
                }
                else
                    this.events[mapname].Add(mapevent);
            }
        }
Пример #22
0
 private void EnqueueEvent(IMapEvent e)
 {
     _jsMapController.EnqueueEvent(e);
 }