Ejemplo n.º 1
0
        public void OnMessage(Core.MessageEventArgs e)
        {
            switch (e.MessageType)
            {
            case Core.EventTypes.ActionReqMove:
                // request movement
                Core.MovementReqEventArgs moveReq = (Core.MovementReqEventArgs)e;
                Core.Entity     entoToMove        = moveReq.EntRequestingMove;
                int             eid       = entoToMove.UID;
                Core.Directions dirToMove = moveReq.Direction;

                Components.PositionComp posComp
                    = (Components.PositionComp)_entityManager.GetSingleComponentByID(eid, Core.ComponentTypes.Position);
                int newX = posComp.X;
                int newY = posComp.Y;
                switch (dirToMove)
                {
                case Core.Directions.None:

                    break;

                case Core.Directions.DownLeft:
                    newX = posComp.X - 1;
                    newY = posComp.Y + 1;
                    break;

                case Core.Directions.Down:
                    newX = posComp.X;
                    newY = posComp.Y + 1;
                    break;

                case Core.Directions.DownRight:
                    newX = posComp.X + 1;
                    newY = posComp.Y + 1;
                    break;

                case Core.Directions.Left:
                    newX = posComp.X - 1;
                    newY = posComp.Y;
                    break;

                case Core.Directions.Centre:

                    break;

                case Core.Directions.Right:
                    newX = posComp.X + 1;
                    newY = posComp.Y;
                    break;

                case Core.Directions.UpLeft:
                    newX = posComp.X - 1;
                    newY = posComp.Y - 1;
                    break;

                case Core.Directions.Up:
                    newX = posComp.X;
                    newY = posComp.Y - 1;
                    break;

                case Core.Directions.UpRight:
                    newX = posComp.X + 1;
                    newY = posComp.Y - 1;
                    break;
                }

                //check for collision

                Core.CollisionEventArgs msg = new Core.CollisionEventArgs(Core.EventTypes.CollisionCheck, entoToMove, newX, newY);
                Core.EventBus.Publish(Core.EventTypes.CollisionCheck, msg);

                break;

            case Core.EventTypes.MoveOK:

                Core.MoveOkayEventArgs m = (Core.MoveOkayEventArgs)e;
                if (_dungeonMap.GetCell(m.newX, m.newY).IsWalkable)
                {
                    // get current pos

                    Core.Entity             ent = m.EntRequestingMove;
                    Components.PositionComp pos
                        = (Components.PositionComp)_entityManager.GetSingleComponentByID(ent.UID, Core.ComponentTypes.Position);
                    Components.AIComp aiComp
                        = (Components.AIComp)_entityManager.GetSingleComponentByID(ent.UID, Core.ComponentTypes.AI);

                    aiComp.TurnsSinceMove = 0;
                    _dungeonMap.SetIsWalkable(pos.X, pos.Y, true);
                    _entityManager.RemoveEntFromPosition(pos.X, pos.Y, ent.UID);
                    pos.X = m.newX;
                    pos.Y = m.newY;
                    _dungeonMap.SetIsWalkable(m.newX, m.newY, false);
                    _entityManager.AddEntToPosition(m.newX, m.newY, ent.UID);
                }
                break;

            case Core.EventTypes.DirectMove:

                Core.DirectMoveEventArgs dm = (Core.DirectMoveEventArgs)e;

                //check for collision

                Core.CollisionEventArgs checkMsg
                    = new Core.CollisionEventArgs(Core.EventTypes.CollisionCheck,
                                                  dm.EntRequestingMove, dm.PointToMoveTo.X, dm.PointToMoveTo.Y);
                Core.EventBus.Publish(Core.EventTypes.CollisionCheck, checkMsg);

                break;

            case Core.EventTypes.NoMove:

                Core.NoMoveEventArgs nmEvent = (Core.NoMoveEventArgs)e;

                Components.AIComp aiC =
                    (Components.AIComp)_entityManager.GetSingleComponentByID(nmEvent.EntNotMoving.UID, Core.ComponentTypes.AI);
                if (aiC != null)
                {
                    aiC.TurnsSinceMove++;
                }

                //Game.MessageLog.Add($"Turns Since = {aiC.TurnsSinceMove.ToString()}");
                break;
            }
        }
Ejemplo n.º 2
0
        public void OnMessage(Core.MessageEventArgs e)
        {
            switch (e.MessageType)
            {
            case Core.EventTypes.DeleteEntity:
                Core.DeleteEntEventArgs msg = (Core.DeleteEntEventArgs)e;

                //_entsToDelete.Add(msg.entID);
                // set cell walkable
                List <Components.Component> compList = _entityManager.GetCompsByID(msg.entID);
                Components.PositionComp     pc
                    = (Components.PositionComp)compList.FirstOrDefault(x => x.CompType == Core.ComponentTypes.Position);
                _dungeonMap.SetIsWalkable(pc.X, pc.Y, true);

                _shedSystem.Remove(_entityManager.JustEntities[msg.entID]);
                _entityManager.RemoveEntity(msg.entID);
                break;

            case Core.EventTypes.DeadEntity:

                // leave corpse of entity

                Core.DeleteEntEventArgs dM = (Core.DeleteEntEventArgs)e;
                int entID = dM.entID;

                Components.PositionComp posC = (Components.PositionComp)_entityManager.GetSingleComponentByID(entID, Core.ComponentTypes.Position);
                _dungeonMap.SetIsWalkable(posC.X, posC.Y, true);

                Components.RenderComp rendC = (Components.RenderComp)_entityManager.GetSingleComponentByID(entID, Core.ComponentTypes.Render);
                rendC.Glyph  = '%';
                rendC.Colour = RLNET.RLColor.LightRed;

                Components.AttributesComp attC = (Components.AttributesComp)_entityManager.GetSingleComponentByID(entID, Core.ComponentTypes.Attributes);
                attC.Dead = true;
                Game.MessageLog.Add($"ENT IS DEAD YEAH: {attC.Dead}   ----------------------------------------------------------------------------");

                _shedSystem.Remove(_entityManager.JustEntities[entID]);

                _entityManager.RemoveCompFromEnt(entID, Core.ComponentTypes.Health);
                _entityManager.RemoveCompFromEnt(entID, Core.ComponentTypes.Actor);
                _entityManager.RemoveCompFromEnt(entID, Core.ComponentTypes.Schedulable);

                _entityManager.AddFurnitureToEnt(entID);
                _entityManager.AddDeadComp(entID);

                // drop inventory
                Components.InventoryComp invC = (Components.InventoryComp)_entityManager.GetSingleComponentByID(entID, Core.ComponentTypes.Inventory);
                if (invC != null)
                {
                    foreach (int droppedID in invC.Inventory)
                    {
                        Components.CollectableComp cc = (Components.CollectableComp)_entityManager.GetSingleComponentByID(droppedID, Core.ComponentTypes.Collectable);
                        // only drop treasure for the moment
                        //TODO - drop other items apart from treasure
                        if (cc.Treasure)
                        {
                            _entityManager.AddPositionToEnt(droppedID, posC.X, posC.Y);
                            cc.Active = true;
                        }
                    }
                }
                break;
            }
        }