Exemple #1
0
        private void ParseCreateOnMap(InputMessage message)
        {
            UnityEngine.Vector3Int absolutePosition = message.GetPosition();
            if (!m_WorldMapStorage.IsVisible(absolutePosition, true))
            {
                throw new System.Exception("ProtocolGame.ParseCreateOnMap: Co-ordinate " + absolutePosition + " is out of range.");
            }

            UnityEngine.Vector3Int mapPosition = m_WorldMapStorage.ToMap(absolutePosition);
            int stackPos = message.GetU8();
            int typeOrId = message.GetU16();

            Appearances.ObjectInstance obj;
            if (typeOrId == Appearances.AppearanceInstance.Creature || typeOrId == Appearances.AppearanceInstance.OutdatedCreature || typeOrId == Appearances.AppearanceInstance.UnknownCreature)
            {
                Creatures.Creature creature = ReadCreatureInstance(message, typeOrId);
                if (creature.ID == m_Player.ID)
                {
                    m_Player.StopAutowalk(true);
                }

                obj = m_AppearanceStorage.CreateObjectInstance(Appearances.AppearanceInstance.Creature, creature.ID);
            }
            else
            {
                obj = ReadObjectInstance(message, typeOrId);
            }

            if (stackPos == 255)
            {
                m_WorldMapStorage.PutObject(mapPosition, obj);
            }
            else
            {
                if (stackPos > Constants.MapSizeW)
                {
                    throw new System.Exception("ProtocolGame.ParseCreateOnMap: Invalid position.");
                }

                m_WorldMapStorage.InsertObject(mapPosition, stackPos, obj);
            }

            if (absolutePosition.z == m_MiniMapStorage.PositionZ)
            {
                m_WorldMapStorage.UpdateMiniMap(mapPosition);
                uint color = m_WorldMapStorage.GetMiniMapColour(mapPosition);
                int  cost  = m_WorldMapStorage.GetMiniMapCost(mapPosition);
                m_MiniMapStorage.UpdateField(absolutePosition, color, cost, false);
            }
        }
Exemple #2
0
        private void ParseFullMap(InputMessage message)
        {
            UnityEngine.Vector3Int position = message.GetPosition();

            m_Player.StopAutowalk(true);
            m_CreatureStorage.MarkAllOpponentsVisible(false);
            m_MiniMapStorage.Position = position;
            m_WorldMapStorage.ResetMap();
            m_WorldMapStorage.InvalidateOnscreenMessages();
            m_WorldMapStorage.Position = position;

            ReadArea(message, 0, 0, Constants.MapSizeX - 1, Constants.MapSizeY - 1);
            m_WorldMapStorage.Valid = true;
        }
Exemple #3
0
        private void ParseFieldData(InputMessage message)
        {
            UnityEngine.Vector3Int absolutePosition = message.GetPosition();
            if (!m_WorldMapStorage.IsVisible(absolutePosition, true))
            {
                throw new System.Exception("ProtocolGame.ParseFieldData: Co-ordinate " + absolutePosition + " is out of range.");
            }

            var mapPosition = m_WorldMapStorage.ToMap(absolutePosition);

            m_WorldMapStorage.ResetField(mapPosition, true, false);
            ReadField(message, mapPosition.x, mapPosition.y, mapPosition.z);

            if (absolutePosition.z == m_MiniMapStorage.PositionZ)
            {
                m_WorldMapStorage.UpdateMiniMap(mapPosition);
                uint color = m_WorldMapStorage.GetMiniMapColour(mapPosition);
                int  cost  = m_WorldMapStorage.GetMiniMapCost(mapPosition);
                m_MiniMapStorage.UpdateField(absolutePosition, color, cost, false);
            }
        }
Exemple #4
0
        private void ParseCreatureMove(InputMessage message)
        {
            int x = message.GetU16();

            UnityEngine.Vector3Int oldAbsolutePosition;
            UnityEngine.Vector3Int oldMapPosition;
            int stackPos = -1;

            Appearances.ObjectInstance obj;
            Creatures.Creature         creature;

            if (x != 65535)
            {
                oldAbsolutePosition = message.GetPosition(x);
                if (!m_WorldMapStorage.IsVisible(oldAbsolutePosition, true))
                {
                    throw new System.Exception("ProtocolGame.ParseCreateOnMap: Start Co-ordinate " + oldAbsolutePosition + " is out of range.");
                }

                oldMapPosition = m_WorldMapStorage.ToMap(oldAbsolutePosition);
                stackPos       = message.GetU8();
                obj            = m_WorldMapStorage.GetObject(oldMapPosition, stackPos);
                if (!obj || !obj.IsCreature || !(creature = m_CreatureStorage.GetCreature(obj.Data)))
                {
                    throw new System.Exception("ProtocolGame.ParseCreatureMove: no creature at position " + oldAbsolutePosition);
                }
            }
            else
            {
                uint creatureID = message.GetU32();
                obj = m_AppearanceStorage.CreateObjectInstance(Appearances.AppearanceInstance.Creature, creatureID);
                if (!(creature = m_CreatureStorage.GetCreature(creatureID)))
                {
                    throw new System.Exception("ProtocolGame.ParseCreatureMove: Creature " + creatureID + " not found");
                }

                oldAbsolutePosition = creature.Position;
                if (!m_WorldMapStorage.IsVisible(oldAbsolutePosition, true))
                {
                    throw new System.Exception("ProtocolGame.ParseCreateOnMap: Start Co-ordinate " + oldAbsolutePosition + " is out of range.");
                }

                oldMapPosition = m_WorldMapStorage.ToMap(oldAbsolutePosition);
            }

            UnityEngine.Vector3Int newAbsolutePosition = message.GetPosition();
            if (!m_WorldMapStorage.IsVisible(newAbsolutePosition, true))
            {
                throw new System.Exception("ProtocolGame.ParseCreateOnMap: Target Co-ordinate " + oldAbsolutePosition + " is out of range.");
            }

            UnityEngine.Vector3Int newMapPosition = m_WorldMapStorage.ToMap(newAbsolutePosition);
            UnityEngine.Vector3Int delta          = newMapPosition - oldMapPosition;

            // if the movement is not actually a move (usually he is teleported)
            bool pushMovement = delta.z != 0 || System.Math.Abs(delta.x) > 1 || System.Math.Abs(delta.y) > 1;

            Appearances.ObjectInstance otherObj = null;
            if (!pushMovement && (!(otherObj = m_WorldMapStorage.GetObject(newMapPosition, 0)) || !otherObj.Type || !otherObj.Type.IsBank))
            {
                throw new System.Exception("ProtocolGame.ParseCreateOnMap: Target field " + newAbsolutePosition + " has no BANK.");
            }

            if (x != 65535)
            {
                m_WorldMapStorage.DeleteObject(oldMapPosition, stackPos);
            }

            m_WorldMapStorage.PutObject(newMapPosition, obj);
            creature.Position = newAbsolutePosition;

            if (pushMovement)
            {
                if (creature.ID == m_Player.ID)
                {
                    m_Player.StopAutowalk(true);
                }

                if (delta.x > 0)
                {
                    creature.Direction = Directions.East;
                }
                else if (delta.x < 0)
                {
                    creature.Direction = Directions.West;
                }
                else if (delta.y < 0)
                {
                    creature.Direction = Directions.North;
                }
                else if (delta.y > 0)
                {
                    creature.Direction = Directions.South;
                }

                if (creature.ID != m_Player.ID)
                {
                    creature.StopMovementAnimation();
                }
            }
            else
            {
                creature.StartMovementAnimation(delta.x, delta.y, (int)otherObj.Type.Waypoints);
            }

            m_CreatureStorage.MarkOpponentVisible(creature, true);
            m_CreatureStorage.InvalidateOpponents();

            if (oldAbsolutePosition.z == m_MiniMapStorage.PositionZ)
            {
                m_WorldMapStorage.UpdateMiniMap(oldMapPosition);
                uint color = m_WorldMapStorage.GetMiniMapColour(oldMapPosition);
                int  cost  = m_WorldMapStorage.GetMiniMapCost(oldMapPosition);
                m_MiniMapStorage.UpdateField(oldAbsolutePosition, color, cost, false);
            }

            if (newAbsolutePosition.z == m_MiniMapStorage.PositionZ)
            {
                m_WorldMapStorage.UpdateMiniMap(newMapPosition);
                uint color = m_WorldMapStorage.GetMiniMapColour(newMapPosition);
                int  cost  = m_WorldMapStorage.GetMiniMapCost(newMapPosition);
                m_MiniMapStorage.UpdateField(newAbsolutePosition, color, cost, false);
            }
        }
Exemple #5
0
        private void ParseDeleteOnMap(InputMessage message)
        {
            int x = message.GetU16();

            Appearances.ObjectInstance objectInstance;
            Creatures.Creature         creature = null;

            UnityEngine.Vector3Int absolutePosition;
            UnityEngine.Vector3Int mapPosition;

            if (x != 0xFFFF)
            {
                absolutePosition = message.GetPosition(x);

                if (!m_WorldMapStorage.IsVisible(absolutePosition, true))
                {
                    throw new System.Exception($"ProtocolGame.ParseDeleteOnMap: Co-oridnate ({absolutePosition.x}, {absolutePosition.y}, {absolutePosition.z}) is out of range.");
                }

                mapPosition = m_WorldMapStorage.ToMap(absolutePosition);

                int stackPos = message.GetU8();
                if (!(objectInstance = m_WorldMapStorage.GetObject(mapPosition, stackPos)))
                {
                    throw new System.Exception($"ProtocolGame.ParseDeleteOnMap: Object not found.");
                }

                if (objectInstance.ID == Appearances.AppearanceInstance.Creature && (creature = m_CreatureStorage.GetCreature(objectInstance.Data)) == null)
                {
                    throw new System.Exception($"ProtocolGame.ParseDeleteOnMap: Creature not found.");
                }

                m_WorldMapStorage.DeleteObject(mapPosition, stackPos);
            }
            else
            {
                uint creatureId = message.GetU32();
                if ((creature = m_CreatureStorage.GetCreature(creatureId)) == null)
                {
                    throw new System.Exception($"ProtocolGame.ParseDeleteOnMap: Object not found.");
                }

                absolutePosition = creature.Position;
                if (!m_WorldMapStorage.IsVisible(absolutePosition, true))
                {
                    throw new System.Exception($"ProtocolGame.ParseDeleteOnMap: Co-oridnate ({absolutePosition.x}, {absolutePosition.y}, {absolutePosition.z}) is out of range.");
                }

                mapPosition = m_WorldMapStorage.ToMap(absolutePosition);
            }

            if (!!creature)
            {
                m_CreatureStorage.MarkOpponentVisible(creature, false);
            }

            if (absolutePosition.z == m_MiniMapStorage.Position.z)
            {
                m_WorldMapStorage.UpdateMiniMap(mapPosition);
                uint color = m_WorldMapStorage.GetMiniMapColour(mapPosition);
                int  cost  = m_WorldMapStorage.GetMiniMapCost(mapPosition);
                m_MiniMapStorage.UpdateField(absolutePosition, color, cost, false);
            }
        }
Exemple #6
0
        private void ParseChangeOnMap(InputMessage message)
        {
            int x = message.GetU16();

            Appearances.ObjectInstance objectInstance;
            Creatures.Creature         creature = null;

            UnityEngine.Vector3Int absolutePosition;
            UnityEngine.Vector3Int mapPosition;

            if (x != 65535)
            {
                absolutePosition = message.GetPosition(x);
                if (!m_WorldMapStorage.IsVisible(absolutePosition, true))
                {
                    throw new System.Exception("ProtocolGame.ParseCreateOnMap: Co-ordinate " + absolutePosition + " is out of range.");
                }

                mapPosition = m_WorldMapStorage.ToMap(absolutePosition);
                int stackPos = message.GetU8();
                if (!(objectInstance = m_WorldMapStorage.GetObject(mapPosition, stackPos)))
                {
                    throw new System.Exception("ProtocolGame.ParseChangeOnMap: Object not found.");
                }

                if (objectInstance.ID == Appearances.AppearanceInstance.Creature && !(creature = m_CreatureStorage.GetCreature(objectInstance.Data)))
                {
                    throw new System.Exception("ProtocolGame.ParseChangeOnMap: Creature not found: " + objectInstance.Data);
                }

                if (!!creature)
                {
                    m_CreatureStorage.MarkOpponentVisible(creature, false);
                }

                int typeOrId = message.GetU16();
                if (typeOrId == Appearances.AppearanceInstance.UnknownCreature ||
                    typeOrId == Appearances.AppearanceInstance.OutdatedCreature ||
                    typeOrId == Appearances.AppearanceInstance.Creature)
                {
                    creature       = ReadCreatureInstance(message, typeOrId, absolutePosition);
                    objectInstance = m_AppearanceStorage.CreateObjectInstance(Appearances.AppearanceInstance.Creature, creature.ID);
                }
                else
                {
                    objectInstance = ReadObjectInstance(message, typeOrId);
                }

                m_WorldMapStorage.ChangeObject(mapPosition, stackPos, objectInstance);
            }
            else
            {
                uint creatureID = message.GetU32();
                if (!(creature = m_CreatureStorage.GetCreature(creatureID)))
                {
                    throw new System.Exception("ProtocolGame.ParseChangeOnMap: Creature " + creatureID + " not found");
                }

                absolutePosition = creature.Position;
                if (!m_WorldMapStorage.IsVisible(absolutePosition, true))
                {
                    throw new System.Exception("ProtocolGame.ParseCreateOnMap: Co-ordinate " + absolutePosition + " is out of range.");
                }

                mapPosition = m_WorldMapStorage.ToMap(absolutePosition);
                m_CreatureStorage.MarkOpponentVisible(creature, false);

                int otherType = message.GetU16();
                if (otherType == Appearances.AppearanceInstance.Creature || otherType == Appearances.AppearanceInstance.OutdatedCreature ||
                    otherType == Appearances.AppearanceInstance.UnknownCreature)
                {
                    creature = ReadCreatureInstance(message, otherType);
                }
                else
                {
                    throw new System.Exception("ProtocolGame.ParseCreateOnMap: Received object of type " + otherType + " when a creature was expected.");
                }
            }

            if (absolutePosition.z == m_MiniMapStorage.PositionZ)
            {
                m_WorldMapStorage.UpdateMiniMap(mapPosition);
                uint color = m_WorldMapStorage.GetMiniMapColour(mapPosition);
                int  cost  = m_WorldMapStorage.GetMiniMapCost(mapPosition);
                m_MiniMapStorage.UpdateField(absolutePosition, color, cost, false);
            }
        }