public frmMapEvent(IMapEvent e) { InitializeComponent(); this.Event = e; this.Icon = Icon.FromHandle(Resources.imgLightning.GetHicon()); this.InitialHeight = this.Height - this.flowParameters.Height; }
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()); }
public IMapEvent NextEvent() { if (_events.Count > 0) { IMapEvent e = (IMapEvent)_events.Dequeue(); return(e); } else { return(null); } }
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); } }
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; }
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); }
public void ReferenceSetOrAdd(Map map, IMapEvent mapevent) { this.ReferenceSetOrAdd(map.Name, mapevent); }
private void EnqueueEvent(IMapEvent e) { _jsMapController.EnqueueEvent(e); }
public BranchNode(ushort id, IMapEvent @event) : base(id, @event) { }
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(); }
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 */ }
public bool RemoveEvent(string mapname, IMapEvent mapevent) { lock(this.events) { if(!this.events.ContainsKey(mapname)) return false; return this.events[mapname].Remove(mapevent); } }
public void AddEvent(Map map, IMapEvent mapevent) { this.AddEvent (map.Name, mapevent); }
void IJSMapController.EnqueueEvent(IMapEvent e) { _events.Enqueue(e); }
public bool RemoveEvent(Map map, IMapEvent mapevent) { return this.RemoveEvent(map.Name, mapevent); }
public void RemoveEvent(IMapEvent mapevent) { this.events[TileEngine.CurrentMapChunk].Remove(mapevent); }
public void DelEvent(IMapEvent e) { this.events[TileEngine.CurrentMapChunk].Remove(e); }
public void AddEvent(IMapEvent mapevent) { this.events[TileEngine.CurrentMapChunk].Add(mapevent); }
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); }
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); } }