public void TriggerEvents(IRenderPlayer player, MapEventTrigger trigger, uint x, uint y, IMapManager mapManager, uint ticks) { var mapEventId = Type == MapType.Map2D ? Tiles[x, y].MapEventId : Blocks[x, y].MapEventId; if (mapEventId == 0) { return; // no map events at this position } var mapEvents = Events[(int)mapEventId - 1]; switch (trigger) { case MapEventTrigger.Move: ExecuteEvent(player, x, y, mapManager, ticks, mapEvents); // TODO break; case MapEventTrigger.Hand: // TODO break; case MapEventTrigger.Eye: // TODO break; case MapEventTrigger.Mouth: // TODO break; } }
void ExecuteEvent(IRenderPlayer player, uint x, uint y, IMapManager mapManager, uint ticks, MapEvent mapEvent) { if (mapEvent.Type == MapEventType.MapChange) { // TODO: conditions? if (mapEvent is MapChangeEvent mapChangeEvent) { // The position (x, y) is 1-based in the data so we subtract 1. var map = mapManager.GetMap(mapChangeEvent.MapIndex); // Moreover the players position is 1 tile below its drawing position in 2D so subtract another 1 from y. player.MoveTo(map, mapChangeEvent.X - 1, mapChangeEvent.Y - (map.Type == MapType.Map2D ? 2u : 1u), ticks, true, mapChangeEvent.Direction); } } }
public bool TriggerEvents(IRenderPlayer player, EventTrigger trigger, uint x, uint y, IMapManager mapManager, uint ticks, Savegame savegame) { if (trigger != EventTrigger.Always) { // First check character interaction var position = new Position((int)x, (int)y); foreach (var mapCharacter in mapCharacters.ToList()) { if (TestCharacterInteraction(mapCharacter.Value, trigger != EventTrigger.Move, position) && mapCharacter.Value.Interact(trigger, this[(uint)mapCharacter.Value.Position.X, (uint)mapCharacter.Value.Position.Y].Type == Map.TileType.Bed)) { return(true); } } } if (x >= Map.Width) { if (y >= Map.Height) { return(adjacentMaps[2].TriggerEvents(game, trigger, x - (uint)Map.Width, y - (uint)Map.Height, ticks, savegame)); } else { return(adjacentMaps[0].TriggerEvents(game, trigger, x - (uint)Map.Width, y, ticks, savegame)); } } else if (y >= Map.Height) { return(adjacentMaps[1].TriggerEvents(game, trigger, x, y - (uint)Map.Height, ticks, savegame)); } else { return(Map.TriggerEvents(game, trigger, x, y, ticks, savegame)); } }