void Start()
 {
     if (teleportEvent == null)
     {
         teleportEvent = new TeleportEvent();
     }
 }
Example #2
0
    //Use this logic to throw to next player's screen
    void OnTriggerExit2D(Collider2D other)
    {
        //TODO will have to change to neighbor's walls
        Vector2 rightWall  = new Vector2(cam.ScreenToWorldPoint(new Vector3(Screen.width, 0f, 0f)).x + 0.5f, 0f); 
        Vector2 leftWall   = new Vector2(cam.ScreenToWorldPoint(new Vector3(0f, 0f, 0f)).x - 0.5f, 0f); 
        Vector3 currentPos = other.gameObject.transform.position;

        if (gameObject.name == "rightWall")
        {
            //Only teleport object if it's leaving screen
            if (other.rigidbody2D.velocity.x > 0)
            {
                //Appear at right player's left wall
                //other.gameObject.transform.position = new Vector3(leftWall.x, currentPos.y, 0f);

                using (var evnt = TeleportEvent.Raise(Bolt.GlobalTargets.Everyone))
                {
                    evnt.isRightWall = true;
                }
            }
        }
        else
        {
            //Only teleport object if it's leaving screen
            if (other.rigidbody2D.velocity.x < 0)
            {
                //Appear at left player's right wall
                //other.gameObject.transform.position = new Vector3(rightWall.x, currentPos.y, 0f);
                using (var evnt = TeleportEvent.Raise(Bolt.GlobalTargets.Everyone))
                {
                    evnt.isRightWall = false;
                }
            }
        }
    }
Example #3
0
        private void On(TeleportEvent e)
        {
            var p = e.Player;

            p.X = e.X;
            p.Y = e.Y;
        }
Example #4
0
        private void CreateBackWall(Player player, Vector3 startPosition, int width, int length, int height, byte material)
        {
            Quaternion rotation  = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f);
            byte       prefabId  = 0;
            Vector3Int playerPos = (Vector3Int)startPosition;
            var        teleEvent = new TeleportEvent(player.Entity, playerPos);

            EventManager.CallEvent((BaseEvent)teleEvent);

            int setX = playerPos.x - (width / 2);

            setX = (int)(setX - (double)(setX / 6));
            int setY = playerPos.y;

            setY = (int)(setY - (double)(setY / 6));
            int setZ = playerPos.z - (length / 2);

            setZ = (int)(setZ - (double)(setZ / 6));

            var originZ = setZ;

            for (var i = 0; i < height; i++)
            {
                for (var ii = 0; ii < width; ii++)
                {
                    BuildBlockOnThisSquare(setX, setY, setZ, material, rotation, prefabId);
                    setZ++;
                }
                setZ = originZ;
                setY++;
            }

            // Tele the player over the platform (to prevent getting stuck
            EventManager.CallEvent((BaseEvent) new TeleportEvent(player.Entity, new Vector3(startPosition.x, startPosition.y + 1, startPosition.z)));
        }
Example #5
0
        private void OnTeleportUser(TeleportEvent e)
        {
            Player p = e.Player;

            p.X    = e.X;
            p.Y    = e.Y;
            p.Dead = false;
        }
Example #6
0
        private void Awake()
        {
            renderer = GetComponent <LineRenderer>();
            renderer.useWorldSpace = true;

            if (OnTeleport == null)
            {
                OnTeleport = new TeleportEvent();
            }
        }
Example #7
0
    public void AddTeleportEvent(TeleportEvent teleportEvent)
    {
        m_events.Add(teleportEvent);
        string name = "事件" + m_events.Count;

        m_eventNames.Add(name);
        m_dpdEventList.ClearOptions();
        m_dpdEventList.AddOptions(m_eventNames);
        m_dpdEventList.value = m_events.Count;
    }
Example #8
0
        void CreateNewPlatform(Player player, Vector3 startPosition, int width, int length)
        {
            byte       material = 2;
            Quaternion rotation = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f);
            byte       prefabId = 0;

            Vector3Int playerPos = (Vector3Int)startPosition;
            var        teleEvent = new TeleportEvent(player.Entity, playerPos);

            EventManager.CallEvent((BaseEvent)teleEvent);

            int setX = playerPos.x - (width / 2);

            setX = (int)(setX - (double)(setX / 6));
            int setY = playerPos.y;

            setY = (int)(setY - (double)(setY / 6) - 1);
            int setZ = playerPos.z - (length / 2);

            setZ = (int)(setZ - (double)(setZ / 6));

            var originX = setX;
            var originY = setY;
            var originZ = setZ;

            for (var i = 0; i < width; i++)
            {
                for (var ii = 0; ii < length; ii++)
                {
                    BuildBlockOnThisSquare(setX, setY, setZ, material, rotation, prefabId);
                    setX++;
                }
                setX = originX;
                setZ++;
            }

            originX = originX + (width / 2);
            originZ = originZ + (length / 2);

            BuildBlockOnThisSquare(originX - 2, originY + 1, originZ + 1, material, rotation, prefabId);
            BuildBlockOnThisSquare(originX - 2, originY + 1, originZ + 2, material, rotation, prefabId);
            BuildBlockOnThisSquare(originX - 1, originY + 1, originZ + 2, material, rotation, prefabId);
            BuildBlockOnThisSquare(originX, originY + 1, originZ + 2, material, rotation, prefabId);
            BuildBlockOnThisSquare(originX + 1, originY + 1, originZ + 2, material, rotation, prefabId);
            BuildBlockOnThisSquare(originX + 2, originY + 1, originZ + 2, material, rotation, prefabId);
            BuildBlockOnThisSquare(originX + 2, originY + 1, originZ + 1, material, rotation, prefabId);

            BuildBlockOnThisSquare(originX - 1, originY + 2, originZ + 2, material, rotation, prefabId);
            BuildBlockOnThisSquare(originX, originY + 2, originZ + 2, material, rotation, prefabId);
            BuildBlockOnThisSquare(originX + 1, originY + 2, originZ + 2, material, rotation, prefabId);


            // Tele the player over the platform (to prevent getting stuck
            EventManager.CallEvent((BaseEvent) new TeleportEvent(player.Entity, new Vector3(startPosition.x, startPosition.y + 1, startPosition.z)));
        }
 void Start()
 {
     if (isControllable)
     {
         TeleportEvent teleportEvent = GameObject.Find("TeleportController").GetComponent <TeleportController>().teleportEvent;
         teleportEvent.AddListener(HandleTeleportEvent);
         playerCamera.SetActive(true);
         gvrControllerPointer.SetActive(true);
         head.SetActive(false);
         otherPlayersController.SetActive(false);
     }
     else
     {
         playerCamera.SetActive(false);
         gvrControllerPointer.SetActive(false);
     }
 }
Example #10
0
    public static TeleportEvent Serdes(TeleportEvent e, AssetMapping mapping, ISerializer s)
    {
        if (s == null)
        {
            throw new ArgumentNullException(nameof(s));
        }
        e ??= new TeleportEvent();
        e.X         = s.UInt8(nameof(X), e.X);
        e.Y         = s.UInt8(nameof(Y), e.Y);
        e.Direction = s.EnumU8(nameof(Direction), e.Direction);
        e.Unk4      = s.UInt8(nameof(Unk4), e.Unk4);
        e.Unk5      = s.UInt8(nameof(Unk5), e.Unk5);
        e.MapId     = MapId.SerdesU16(nameof(MapId), e.MapId, mapping, s);
        int zeroed = s.UInt16(null, 0);

        s.Assert(e.Unk4 is 0 or 1 or 2 or 3 or 6 or 106 or 255, "TeleportEvent: Expected field 4 to be in { 0,1,2,3,6,106,255 }"); // Always 255 in maps
        s.Assert(zeroed == 0, "TeleportEvent: Expected field 8 to be 0");
        return(e);
    }
Example #11
0
    public override void OnEvent(TeleportEvent evnt)
    {
        foreach (PlayerObject p in PlayerObjectRegistry.allPlayers)
        {
            if (p.connection == evnt.RaisedBy)
            {
                Vector3 newPosition;
                if (evnt.isRightWall)
                {
                    newPosition = PlayerObjectRegistry.getRightWallTeleport(p);
                }
                else
                {
                    newPosition = PlayerObjectRegistry.getLeftWallTeleport(p);
                }

                //TODO move potato
                potato.transform.position = newPosition;
                return;
            }
        }
    }
Example #12
0
        /// <summary>
        /// Processes the message
        /// </summary>
        /// <param name="connectionBase">The connection base</param>
        /// <param name="message">The playerio message</param>
        /// <param name="handled">Whether the message was already handled</param>
        public void Process(ConnectionBase connectionBase, Message message, bool handled)
        {
            int userId = message.GetInt(0);

            WorldConnection worldCon = (WorldConnection)connectionBase;
            WorldPlayer     player   = worldCon.Players.GetPlayer(userId);

            Vector location = new Vector(message.GetInt(1), message.GetInt(2));

            if (!handled && player != null)
            {
                player.SetLocationInternal(location);
            }

            TeleportEvent teleportEvent = new TeleportEvent()
            {
                Raw      = message,
                Player   = player,
                Location = location
            };

            connectionBase.RaiseServerEvent <TeleportEvent>(teleportEvent);
        }
Example #13
0
        private void CreateRightWall(Player player, Vector3 startPosition, int width, int length, int height, byte material)
        {
            Quaternion rotation  = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f);
            byte       prefabId  = 0;
            Vector3Int playerPos = (Vector3Int)startPosition;
            var        teleEvent = new TeleportEvent(player.Entity, playerPos);

            EventManager.CallEvent((BaseEvent)teleEvent);

            int setX = playerPos.x - (width / 2);

            setX = (int)(setX - (double)(setX / 6));
            int setY = playerPos.y;

            setY = (int)(setY - (double)(setY / 6));
            int setZ = playerPos.z + (length / 2) - 1;

            setZ = (int)(setZ - (double)(setZ / 6));

            BuildWallBlocks(length, height, material, setX, setY, setZ, rotation, prefabId);

            // Tele the player over the platform (to prevent getting stuck
            EventManager.CallEvent((BaseEvent) new TeleportEvent(player.Entity, new Vector3(startPosition.x, startPosition.y + 1, startPosition.z)));
        }
//        private void OnTransformComponentUpdated(TransformComponent.Update update)
//        {
//            for (int i = 0; i < update.teleportEvent.Count; i++)
//            {
//                TeleportTo(update.teleportEvent[i].targetPosition.ToVector3());
//            }
//        }
        private void OnTeleportEvent(TeleportEvent tevent)
        {
            TeleportTo(tevent.TargetPosition.ToVector3());
        }
Example #15
0
    private bool CreateXml(string filePath)
    {
        try
        {
            XmlDocument    xmlDocument    = new XmlDocument();
            XmlDeclaration xmlDeclaration = xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", null);
            xmlDocument.AppendChild(xmlDeclaration);

            XmlElement eRoot = xmlDocument.CreateElement("MapData");
            xmlDocument.AppendChild(eRoot);

            //保存地图信息
            XmlElement eMap = xmlDocument.CreateElement("Map");
            Map        map  = MapManager.Instance.m_map;

            EncryptAttribute(eMap, "TexturePath", map.m_textureName.ToString());
            EncryptAttribute(eMap, "wid", map.m_width.ToString());
            EncryptAttribute(eMap, "len", map.m_length.ToString());

            //eMap.SetAttribute("TexturePath", map.m_textureName.ToString());
            //eMap.SetAttribute("wid", map.m_width.ToString());
            //eMap.SetAttribute("len", map.m_length.ToString());

            eRoot.AppendChild(eMap);

            //保存实体信息
            XmlElement eEntitiesList = xmlDocument.CreateElement("EntitiesList");
            foreach (Entity entity in EntityManager.Instance.GetEntities())
            {
                XmlElement eEntity = xmlDocument.CreateElement("Entity");
                eEntitiesList.AppendChild(eEntity);

                //实体属性(逆序设置,顺序输出)
                XmlElement eEntityAtr = xmlDocument.CreateElement("EntityAtr");

                EncryptAttribute(eEntityAtr, "EventIndex", entity.m_eventIndex.ToString());
                EncryptAttribute(eEntityAtr, "PathIndex", entity.m_pathIndex.ToString());
                EncryptAttribute(eEntityAtr, "MapCubeIndex", entity.m_mapCubeIndex.ToString());
                EncryptAttribute(eEntityAtr, "Type", entity.m_type.ToString());
                EncryptAttribute(eEntityAtr, "Model", entity.m_modelName);

                EncryptAttribute(eEntityAtr, "quaW", entity.m_quaternion.w.ToString());
                EncryptAttribute(eEntityAtr, "quaZ", entity.m_quaternion.z.ToString());
                EncryptAttribute(eEntityAtr, "quaY", entity.m_quaternion.y.ToString());
                EncryptAttribute(eEntityAtr, "quaX", entity.m_quaternion.x.ToString());

                EncryptAttribute(eEntityAtr, "posZ", entity.m_position.z.ToString());
                EncryptAttribute(eEntityAtr, "posY", entity.m_position.y.ToString());
                EncryptAttribute(eEntityAtr, "posX", entity.m_position.x.ToString());

                //eEntityAtr.SetAttribute("PathIndex", entity.m_pathIndex.ToString());
                //eEntityAtr.SetAttribute("MapCubeIndex", entity.m_mapCubeIndex.ToString());
                //eEntityAtr.SetAttribute("Type", entity.m_type.ToString());
                //eEntityAtr.SetAttribute("Model", entity.m_modelName);

                //eEntityAtr.SetAttribute("quaW", entity.m_quaternion.w.ToString());
                //eEntityAtr.SetAttribute("quaZ", entity.m_quaternion.z.ToString());
                //eEntityAtr.SetAttribute("quaY", entity.m_quaternion.y.ToString());
                //eEntityAtr.SetAttribute("quaX", entity.m_quaternion.x.ToString());

                //eEntityAtr.SetAttribute("posZ", entity.m_position.z.ToString());
                //eEntityAtr.SetAttribute("posY", entity.m_position.y.ToString());
                //eEntityAtr.SetAttribute("posX", entity.m_position.x.ToString());

                //游戏属性
                XmlElement eGameAtr = xmlDocument.CreateElement("GameAtr");

                EncryptAttribute(eGameAtr, "IsAtk", entity.IsAtk.ToString());
                EncryptAttribute(eGameAtr, "IsMove", entity.IsMove.ToString());
                EncryptAttribute(eGameAtr, "MoveSpeed", entity.MoveSpeed.ToString());
                EncryptAttribute(eGameAtr, "AtkRange", entity.AtkRange.ToString());
                EncryptAttribute(eGameAtr, "AtkSpeed", entity.AtkSpeed.ToString());
                EncryptAttribute(eGameAtr, "DefValue", entity.DefValue.ToString());
                EncryptAttribute(eGameAtr, "AtkValue", entity.HP.ToString());
                EncryptAttribute(eGameAtr, "HP", entity.HP.ToString());

                //eGameAtr.SetAttribute("IsAtk", entity.IsAtk.ToString());
                //eGameAtr.SetAttribute("IsMove", entity.IsMove.ToString());
                //eGameAtr.SetAttribute("MoveSpeed", entity.MoveSpeed.ToString());
                //eGameAtr.SetAttribute("AtkRange", entity.AtkRange.ToString());
                //eGameAtr.SetAttribute("AtkSpeed", entity.AtkSpeed.ToString());
                //eGameAtr.SetAttribute("DefValue", entity.DefValue.ToString());
                //eGameAtr.SetAttribute("AtkValue", entity.HP.ToString());
                //eGameAtr.SetAttribute("HP", entity.HP.ToString());

                eEntity.AppendChild(eEntityAtr);
                eEntity.AppendChild(eGameAtr);
            }
            eRoot.AppendChild(eEntitiesList);

            //保存路径信息
            XmlElement ePathList = xmlDocument.CreateElement("PathList");
            foreach (Path path in PathManager.Instance.GetPaths())
            {
                //单个路径节点
                XmlElement ePath = xmlDocument.CreateElement("Path");

                //路径的状态信息
                EncryptAttribute(ePath, "IsEmpty", path.m_isEmpty.ToString());
                EncryptAttribute(ePath, "Index", path.m_index.ToString());

                //ePath.SetAttribute("IsEmpty", path.m_isEmpty.ToString());
                //ePath.SetAttribute("Index", path.m_index.ToString());


                //路径的关键点信息
                XmlElement eKeyPointList = xmlDocument.CreateElement("KeyPointList");
                foreach (Point keyPoint in path.m_keyPoints)
                {
                    XmlElement eKeyPoint = xmlDocument.CreateElement("KeyPoint");
                    EncryptAttribute(eKeyPoint, "y", keyPoint.m_y.ToString());
                    EncryptAttribute(eKeyPoint, "x", keyPoint.m_x.ToString());

                    //eKeyPoint.SetAttribute("y", keyPoint.m_y.ToString());
                    //eKeyPoint.SetAttribute("x", keyPoint.m_x.ToString());

                    eKeyPointList.AppendChild(eKeyPoint);
                }
                ePath.AppendChild(eKeyPointList);

                //路径的点信息
                XmlElement ePointList = xmlDocument.CreateElement("PointList");
                foreach (Point point in path.m_points)
                {
                    XmlElement ePoint = xmlDocument.CreateElement("Point");
                    EncryptAttribute(ePoint, "y", point.m_y.ToString());
                    EncryptAttribute(ePoint, "x", point.m_x.ToString());

                    //ePoint.SetAttribute("y", point.m_y.ToString());
                    //ePoint.SetAttribute("x", point.m_x.ToString());

                    ePointList.AppendChild(ePoint);
                }
                ePath.AppendChild(ePointList);

                ePathList.AppendChild(ePath);
            }
            eRoot.AppendChild(ePathList);

            //保存事件信息
            XmlElement eEventList = xmlDocument.CreateElement("EventList");
            foreach (Event @event in EventManager.Instance.GetEvents())
            {
                XmlElement eEvent = xmlDocument.CreateElement("Event");

                EncryptAttribute(eEvent, "Index", @event.m_index.ToString());
                string type = @event.Type;
                //Debug.Log("事件的类型是: " + type);
                EncryptAttribute(eEvent, "Type", type);

                if (type == "Birth")
                {
                    BirthEvent birthEvent = (BirthEvent)@event;
                    EncryptAttribute(eEvent, "CD", birthEvent.m_cd.ToString());
                    EncryptAttribute(eEvent, "Time", birthEvent.m_time.ToString());
                    EncryptAttribute(eEvent, "IsInfinite", birthEvent.m_isInfinite.ToString());
                }
                else if (type == "Bomb")
                {
                    BombEvent bombEvent = (BombEvent)@event;
                    EncryptAttribute(eEvent, "Delay", bombEvent.m_delay.ToString());
                    EncryptAttribute(eEvent, "Hurt", bombEvent.m_hurt.ToString());
                    EncryptAttribute(eEvent, "IsDestroy", bombEvent.m_isDestory.ToString());
                }
                else if (type == "Speed")
                {
                    SpeedEvent speedEvent = (SpeedEvent)@event;
                    EncryptAttribute(eEvent, "Speed", speedEvent.m_speed.ToString());
                    EncryptAttribute(eEvent, "Time", speedEvent.m_time.ToString());
                    EncryptAttribute(eEvent, "IsInfinite", speedEvent.m_isInfinite.ToString());
                }
                else if (type == "Teleport")
                {
                    TeleportEvent teleportEvent = (TeleportEvent)@event;
                    EncryptAttribute(eEvent, "TeleportID", teleportEvent.m_teleportID.ToString());
                    EncryptAttribute(eEvent, "CD", teleportEvent.m_cd.ToString());
                    EncryptAttribute(eEvent, "Time", teleportEvent.m_time.ToString());
                    EncryptAttribute(eEvent, "IsInfinite", teleportEvent.m_isInfinite.ToString());
                }
                eEventList.AppendChild(eEvent);
            }
            eRoot.AppendChild(eEventList);

            //保存音乐信息
            XmlElement eMusic = xmlDocument.CreateElement("Music");
            Music      music  = MusicManager.Instance.m_music;
            if (music != null)
            {
                EncryptAttribute(eMusic, "Volume", music.m_volume.ToString());
                EncryptAttribute(eMusic, "Name", music.m_name);

                //eMusic.SetAttribute("Volume", music.m_volume.ToString());
                //eMusic.SetAttribute("Name", music.m_name);
            }
            eRoot.AppendChild(eMusic);

            //保存XML文件
            xmlDocument.Save(filePath);
            return(true);
        }
        catch
        {
            LogManager.Instance.Log("保存地图失败!");
            return(false);
        }
    }
Example #16
0
    private bool ParseXml(string filePath)
    {
        try
        {
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(filePath);
            XmlElement eRoot = (XmlElement)xmlDocument.SelectSingleNode("MapData");

            foreach (XmlElement element in eRoot.ChildNodes)
            {
                //处理地图信息
                if (element.Name == "Map")
                {
                    int    len         = int.Parse(DecryptAttribute(element, "len"));
                    int    wid         = int.Parse(DecryptAttribute(element, "wid"));
                    string textureName = (DecryptAttribute(element, "TexturePath"));

                    //int len = int.Parse(element.GetAttribute("len"));
                    //int wid = int.Parse(element.GetAttribute("wid"));
                    //string textureName = element.GetAttribute("TexturePath");
                    MapManager.Instance.CreateMap(len, wid, textureName);
                }
                else if (element.Name == "EntitiesList")
                {
                    List <Entity> entities = new List <Entity>();
                    foreach (XmlElement eEntity in element.ChildNodes)
                    {
                        //实体属性
                        XmlElement eEntityAtr = (XmlElement)eEntity.SelectSingleNode("EntityAtr");

                        //位置
                        float x = float.Parse(DecryptAttribute(eEntityAtr, "posX"));
                        float y = float.Parse(DecryptAttribute(eEntityAtr, "posY"));
                        float z = float.Parse(DecryptAttribute(eEntityAtr, "posZ"));

                        //float x = float.Parse(eEntityAtr.GetAttribute("posX"));
                        //float y = float.Parse(eEntityAtr.GetAttribute("posY"));
                        //float z = float.Parse(eEntityAtr.GetAttribute("posZ"));

                        Vector3 pos = new Vector3(x, y, z);

                        //旋转
                        x = float.Parse(DecryptAttribute(eEntityAtr, "quaX"));
                        y = float.Parse(DecryptAttribute(eEntityAtr, "quaY"));
                        z = float.Parse(DecryptAttribute(eEntityAtr, "quaZ"));
                        float w = float.Parse(DecryptAttribute(eEntityAtr, "quaW"));

                        //x = float.Parse(eEntityAtr.GetAttribute("quaX"));
                        //y = float.Parse(eEntityAtr.GetAttribute("quaY"));
                        //z = float.Parse(eEntityAtr.GetAttribute("quaZ"));
                        //float w = float.Parse(eEntityAtr.GetAttribute("quaW"));

                        Quaternion qua = new Quaternion(x, y, z, w);

                        //模型
                        string modelName = DecryptAttribute(eEntityAtr, "Model");
                        //string modelName = eEntityAtr.GetAttribute("Model");

                        //类型
                        string temp = DecryptAttribute(eEntityAtr, "Type");
                        //string temp = eEntityAtr.GetAttribute("Type");
                        EntityType entityType = EntityType.Zero;
                        if (temp == "NPC")
                        {
                            entityType = EntityType.NPC;
                        }
                        else if (temp == "Monster")
                        {
                            entityType = EntityType.Monster;
                        }
                        else if (temp == "Building")
                        {
                            entityType = EntityType.Building;
                        }
                        //地图块索引
                        int mapCubeIndex = int.Parse(DecryptAttribute(eEntityAtr, "MapCubeIndex"));
                        //int mapCubeIndex = int.Parse(eEntityAtr.GetAttribute("MapCubeIndex"));
                        //路径索引
                        int pathIndex = int.Parse(DecryptAttribute(eEntityAtr, "PathIndex"));
                        //int pathIndex = int.Parse(eEntityAtr.GetAttribute("PathIndex"));

                        int eventIndex = int.Parse(DecryptAttribute(eEntityAtr, "EventIndex"));

                        //游戏属性
                        XmlElement eGameAtr  = (XmlElement)eEntity.SelectSingleNode("GameAtr");
                        float      HP        = int.Parse(DecryptAttribute(eGameAtr, "HP"));
                        float      AtkValue  = float.Parse(DecryptAttribute(eGameAtr, "AtkValue"));
                        float      DefValue  = float.Parse(DecryptAttribute(eGameAtr, "DefValue"));
                        float      AtkSpeed  = float.Parse(DecryptAttribute(eGameAtr, "AtkSpeed"));
                        float      AtkRange  = float.Parse(DecryptAttribute(eGameAtr, "AtkRange"));
                        float      MoveSpeed = float.Parse(DecryptAttribute(eGameAtr, "MoveSpeed"));
                        bool       IsMove    = bool.Parse(DecryptAttribute(eGameAtr, "IsMove"));
                        bool       IsAtk     = bool.Parse(DecryptAttribute(eGameAtr, "IsAtk"));

                        //float HP = int.Parse(eGameAtr.GetAttribute("HP"));
                        //float AtkValue = float.Parse(eGameAtr.GetAttribute("AtkValue"));
                        //float DefValue = float.Parse(eGameAtr.GetAttribute("DefValue"));
                        //float AtkSpeed = float.Parse(eGameAtr.GetAttribute("AtkSpeed"));
                        //float AtkRange = float.Parse(eGameAtr.GetAttribute("AtkRange"));
                        //float MoveSpeed = float.Parse(eGameAtr.GetAttribute("MoveSpeed"));
                        //bool IsMove = bool.Parse(eGameAtr.GetAttribute("IsMove"));
                        //bool IsAtk = bool.Parse(eGameAtr.GetAttribute("IsAtk"));

                        //添加到当前实体管理类
                        EntityManager.Instance.AddEntity(pos, qua, entityType, modelName, mapCubeIndex, pathIndex, eventIndex, HP, AtkValue, DefValue, AtkSpeed, AtkRange, MoveSpeed, IsMove, IsAtk);
                        //更新地图块的状态
                        MapManager.Instance.GetMapCube(mapCubeIndex).m_isEmpty = false;
                    }
                }
                else if (element.Name == "PathList")
                {
                    //根据当前地图信息生成寻路数据
                    PathManager.Instance.GeneratePointMsg();

                    //读取并加载存档中的路径信息
                    foreach (XmlElement ePath in element.ChildNodes)
                    {
                        //状态信息
                        int  index   = int.Parse(DecryptAttribute(ePath, "Index"));
                        bool isEmpty = bool.Parse(DecryptAttribute(ePath, "IsEmpty"));

                        //int index = int.Parse(ePath.GetAttribute("Index"));
                        //bool isEmpty = bool.Parse(ePath.GetAttribute("IsEmpty"));

                        //关键点信息
                        XmlElement     eKeyPointList    = (XmlElement)ePath.SelectSingleNode("KeyPointList");
                        List <Vector2> tempKeyPointList = new List <Vector2>();
                        foreach (XmlElement eKeyPoint in eKeyPointList.ChildNodes)
                        {
                            Vector2 tempKeyPoint = new Vector2
                            {
                                x = int.Parse(DecryptAttribute(eKeyPoint, "x")),
                                y = int.Parse(DecryptAttribute(eKeyPoint, "y"))
                                    //x = int.Parse(eKeyPoint.GetAttribute("x")),
                                    //y = int.Parse(eKeyPoint.GetAttribute("y"))
                            };
                            tempKeyPointList.Add(tempKeyPoint);
                        }

                        //点信息
                        XmlElement     ePointList    = (XmlElement)ePath.SelectSingleNode("PointList");
                        List <Vector2> tempPointList = new List <Vector2>();
                        foreach (XmlElement ePoint in ePointList.ChildNodes)
                        {
                            Vector2 tempPoint = new Vector2
                            {
                                x = int.Parse(DecryptAttribute(ePoint, "x")),
                                y = int.Parse(DecryptAttribute(ePoint, "y"))
                                    //x = int.Parse(ePoint.GetAttribute("x")),
                                    //y = int.Parse(ePoint.GetAttribute("y"))
                            };
                            tempPointList.Add(tempPoint);
                        }
                        //添加到当前路径管理类
                        PathManager.Instance.AddPath(index, isEmpty, tempKeyPointList, tempPointList);
                    }
                }
                else if (element.Name == "EventList")
                {
                    foreach (XmlElement eEvent in element.ChildNodes)
                    {
                        int    index = int.Parse(DecryptAttribute(eEvent, "Index"));
                        string type  = DecryptAttribute(eEvent, "Type");
                        if (type.CompareTo("Birth") == 0)
                        {
                            Debug.Log("BIRTHEVENT: " + type);
                            float      cd         = float.Parse(DecryptAttribute(eEvent, "CD"));
                            float      time       = float.Parse(DecryptAttribute(eEvent, "Time"));
                            bool       isInfinite = bool.Parse(DecryptAttribute(eEvent, "IsInfinite"));
                            BirthEvent birthEvent = new BirthEvent(cd, time, isInfinite);
                            EventManager.Instance.AddBirthEvent(birthEvent);
                        }
                        else if (type.CompareTo("Bomb") == 0)
                        {
                            float     delay     = float.Parse(DecryptAttribute(eEvent, "Delay"));
                            float     hurt      = float.Parse(DecryptAttribute(eEvent, "Hurt"));
                            bool      isDetroy  = bool.Parse(DecryptAttribute(eEvent, "IsDestroy"));
                            BombEvent bombEvent = new BombEvent(delay, hurt, isDetroy);
                            EventManager.Instance.AddBombEvent(bombEvent);
                        }
                        else if (type.CompareTo("Speed") == 0)
                        {
                            float      speed      = float.Parse(DecryptAttribute(eEvent, "Speed"));
                            float      time       = float.Parse(DecryptAttribute(eEvent, "Time"));
                            bool       isInfinite = bool.Parse(DecryptAttribute(eEvent, "IsInfinite"));
                            SpeedEvent speedEvent = new SpeedEvent(speed, time, isInfinite);
                            EventManager.Instance.AddSpeedEvent(speedEvent);
                        }
                        else if (type.CompareTo("Telepo") == 0)
                        {
                            int           teleportID    = int.Parse(DecryptAttribute(eEvent, "TeleportID"));
                            float         cd            = float.Parse(DecryptAttribute(eEvent, "CD"));
                            float         time          = float.Parse(DecryptAttribute(eEvent, "Time"));
                            bool          isInfinite    = bool.Parse(DecryptAttribute(eEvent, "IsInfinite"));
                            TeleportEvent teleportEvent = new TeleportEvent(teleportID, cd, time, isInfinite);
                            EventManager.Instance.AddTeleportEvent(teleportEvent);
                        }
                    }
                }
                else if (element.Name == "Music")
                {
                    if (element.HasAttributes)
                    {
                        string name   = DecryptAttribute(element, "Name");
                        float  volume = float.Parse(DecryptAttribute(element, "Volume"));
                        //string name = element.GetAttribute("Name");
                        //float volume = float.Parse(element.GetAttribute("Volume"));
                        MusicManager.Instance.SetMusic(name, volume);
                    }
                }
            }
            return(true);
        }
        catch
        {
            LogManager.Instance.Log("加载地图失败!");
            return(false);
        }
    }
Example #17
0
    public static IMapEvent SerdesEvent(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, mapping, 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 => MapTextEvent.Serdes((MapTextEvent)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
 */
}
Example #18
0
        static Event ParseEvent(IDataReader dataReader)
        {
            Event @event;
            var   type = (EventType)dataReader.ReadByte();

            switch (type)
            {
            case EventType.Teleport:
            {
                // 1. byte is the x coordinate
                // 2. byte is the y coordinate
                // 3. byte is the character direction
                // Then 1 unknown byte
                // Then 1 byte for the transtion type (0-5)
                // Then a word for the map index
                // Then 2 unknown bytes (seem to be 00 FF)
                uint x          = dataReader.ReadByte();
                uint y          = dataReader.ReadByte();
                var  direction  = (CharacterDirection)dataReader.ReadByte();
                var  unknown1   = dataReader.ReadByte();
                var  transition = (TeleportEvent.TransitionType)dataReader.ReadByte();
                uint mapIndex   = dataReader.ReadWord();
                var  unknown2   = dataReader.ReadBytes(2);
                @event = new TeleportEvent
                {
                    MapIndex   = mapIndex,
                    X          = x,
                    Y          = y,
                    Direction  = direction,
                    Transition = transition,
                    Unknown1   = unknown1,
                    Unknown2   = unknown2,
                };
                break;
            }

            case EventType.Door:
            {
                // 1. byte is a lockpicking chance reduction (0: already open, 100: can't open via lockpicking)
                // 2. byte is the door index (used for unlock bits in savegame)
                // 3. byte is an optional text index that is shown initially (0xff = no text)
                // 4. byte is an optional text index if the door was unlocked (0xff = no text)
                // 5. byte is unknown (always 0)
                // word at position 6 is the key index if a key must unlock it
                // last word is the event index (0-based) of the event that is called when unlocking fails
                var  lockpickingChanceReduction = dataReader.ReadByte();
                var  doorIndex            = dataReader.ReadByte();
                var  textIndex            = dataReader.ReadByte();
                var  unlockTextIndex      = dataReader.ReadByte();
                var  unused               = dataReader.ReadByte();
                uint keyIndex             = dataReader.ReadWord();
                var  unlockFailEventIndex = dataReader.ReadWord();
                @event = new DoorEvent
                {
                    LockpickingChanceReduction = lockpickingChanceReduction,
                    DoorIndex              = doorIndex,
                    TextIndex              = textIndex,
                    UnlockTextIndex        = unlockTextIndex,
                    Unused                 = unused,
                    KeyIndex               = keyIndex,
                    UnlockFailedEventIndex = unlockFailEventIndex
                };
                break;
            }

            case EventType.Chest:
            {
                // 1. byte is a lockpicking chance reduction (0: already open, 100: can't open via lockpicking)
                // 2. byte are the chest flags
                // 3. byte is an optional text index (0xff = no text)
                // 4. byte is the chest index (0-based)
                // 5. byte (0 = chest, 1 = pile/removable loot or item) or "remove if empty"
                // word at position 6 is the key index if a key must unlock it
                // last word is the event index (0-based) of the event that is called when unlocking fails
                var  lockpickingChanceReduction = dataReader.ReadByte();
                var  flags                = (ChestEvent.ChestFlags)dataReader.ReadByte();
                var  textIndex            = dataReader.ReadByte();
                uint chestIndex           = dataReader.ReadByte();
                bool removeWhenEmpty      = dataReader.ReadByte() != 0;
                uint keyIndex             = dataReader.ReadWord();
                var  unlockFailEventIndex = dataReader.ReadWord();
                @event = new ChestEvent
                {
                    LockpickingChanceReduction = lockpickingChanceReduction,
                    Flags                  = flags,
                    TextIndex              = textIndex,
                    ChestIndex             = chestIndex,
                    RemoveWhenEmpty        = removeWhenEmpty,
                    KeyIndex               = keyIndex,
                    UnlockFailedEventIndex = unlockFailEventIndex
                };
                break;
            }

            case EventType.PopupText:
            {
                // event image index (0xff = no image)
                // trigger (1 = move, 2 = eye cursor, 3 = both)
                // unknown boolean
                // map text index as word
                // 4 unknown bytes
                var eventImageIndex = dataReader.ReadByte();
                var popupTrigger    = (EventTrigger)dataReader.ReadByte();
                var unknownBool     = dataReader.ReadByte() != 0;
                var textIndex       = dataReader.ReadWord();
                var unknown         = dataReader.ReadBytes(4);
                @event = new PopupTextEvent
                {
                    EventImageIndex = eventImageIndex,
                    PopupTrigger    = popupTrigger,
                    TextIndex       = textIndex,
                    UnknownBool     = unknownBool,
                    Unknown         = unknown
                };
                break;
            }

            case EventType.Spinner:
            {
                var direction = (CharacterDirection)dataReader.ReadByte();
                var unused    = dataReader.ReadBytes(8);
                @event = new SpinnerEvent
                {
                    Direction = direction,
                    Unused    = unused
                };
                break;
            }

            case EventType.Trap:
            {
                var ailment         = (TrapEvent.TrapAilment)dataReader.ReadByte();
                var target          = (TrapEvent.TrapTarget)dataReader.ReadByte();
                var affectedGenders = (GenderFlag)dataReader.ReadByte();
                var baseDamage      = dataReader.ReadByte();
                var unused          = dataReader.ReadBytes(5); // unused
                @event = new TrapEvent
                {
                    Ailment         = ailment,
                    Target          = target,
                    AffectedGenders = affectedGenders,
                    BaseDamage      = baseDamage,
                    Unused          = unused
                };
                break;
            }

            case EventType.RemoveBuffs:
            {
                byte affectedBuffs = dataReader.ReadByte();
                var  unused        = dataReader.ReadBytes(8);
                @event = new RemoveBuffsEvent
                {
                    AffectedBuff = affectedBuffs == 0 ? (ActiveSpellType?)null: (ActiveSpellType)(affectedBuffs - 1),
                    Unused       = unused
                };
                break;
            }

            case EventType.Riddlemouth:
            {
                var introTextIndex          = dataReader.ReadByte();
                var solutionTextIndex       = dataReader.ReadByte();
                var unused                  = dataReader.ReadBytes(3);
                var correctAnswerTextIndex1 = dataReader.ReadWord();
                var correctAnswerTextIndex2 = dataReader.ReadWord();
                @event = new RiddlemouthEvent
                {
                    RiddleTextIndex               = introTextIndex,
                    SolutionTextIndex             = solutionTextIndex,
                    CorrectAnswerDictionaryIndex1 = correctAnswerTextIndex1,
                    CorrectAnswerDictionaryIndex2 = correctAnswerTextIndex2,
                    Unused = unused
                };
                break;
            }

            case EventType.Award:
            {
                var awardType      = (AwardEvent.AwardType)dataReader.ReadByte();
                var awardOperation = (AwardEvent.AwardOperation)dataReader.ReadByte();
                var random         = dataReader.ReadByte() != 0;
                var awardTarget    = (AwardEvent.AwardTarget)dataReader.ReadByte();
                var unknown        = dataReader.ReadByte();
                var awardTypeValue = dataReader.ReadWord();
                var value          = dataReader.ReadWord();
                @event = new AwardEvent
                {
                    TypeOfAward    = awardType,
                    Operation      = awardOperation,
                    Random         = random,
                    Target         = awardTarget,
                    AwardTypeValue = awardTypeValue,
                    Value          = value,
                    Unknown        = unknown
                };
                break;
            }

            case EventType.ChangeTile:
            {
                var x              = dataReader.ReadByte();
                var y              = dataReader.ReadByte();
                var unknown        = dataReader.ReadBytes(3);
                var frontTileIndex = dataReader.ReadWord();     // also wall/object index in lower byte
                var mapIndex       = dataReader.ReadWord();
                @event = new ChangeTileEvent
                {
                    X = x,
                    Y = y,
                    FrontTileIndex = frontTileIndex,
                    MapIndex       = mapIndex,
                    Unknown        = unknown
                };
                break;
            }

            case EventType.StartBattle:
            {
                var unknown1          = dataReader.ReadBytes(6);
                var monsterGroupIndex = dataReader.ReadByte();
                var unknown2          = dataReader.ReadBytes(2);
                @event = new StartBattleEvent
                {
                    MonsterGroupIndex = monsterGroupIndex,
                    Unknown1          = unknown1,
                    Unknown2          = unknown2
                };
                break;
            }

            case EventType.EnterPlace:
            {
                // map text index when closed (0xff is default message)
                // place type (see PlaceType)
                // opening hour
                // closing hour
                // text index for using the place (sleep, train, buy, etc)
                // place index (1-based, word)
                // 2 unknown bytes
                var textIndexWhenClosed = dataReader.ReadByte();
                var placeType           = (PlaceType)dataReader.ReadByte();
                var openingHour         = dataReader.ReadByte();
                var closingHour         = dataReader.ReadByte();
                var usePlaceTextIndex   = dataReader.ReadByte();
                var placeIndex          = dataReader.ReadWord();
                var merchantIndex       = dataReader.ReadWord();
                @event = new EnterPlaceEvent
                {
                    ClosedTextIndex   = textIndexWhenClosed,
                    PlaceType         = placeType,
                    OpeningHour       = openingHour,
                    ClosingHour       = closingHour,
                    PlaceIndex        = placeIndex,
                    UsePlaceTextIndex = usePlaceTextIndex,
                    MerchantDataIndex = merchantIndex
                };
                break;
            }

            case EventType.Condition:
            {
                var conditionType        = (ConditionEvent.ConditionType)dataReader.ReadByte();
                var value                = dataReader.ReadByte();
                var count                = dataReader.ReadByte();
                var unknown1             = dataReader.ReadBytes(2);
                var objectIndex          = dataReader.ReadWord();
                var jumpToIfNotFulfilled = dataReader.ReadWord();
                @event = new ConditionEvent
                {
                    TypeOfCondition = conditionType,
                    ObjectIndex     = objectIndex,
                    Value           = value,
                    Count           = count,
                    Unknown1        = unknown1,
                    ContinueIfFalseWithMapEventIndex = jumpToIfNotFulfilled
                };
                break;
            }

            case EventType.Action:
            {
                var actionType  = (ActionEvent.ActionType)dataReader.ReadByte();
                var value       = dataReader.ReadByte();
                var count       = dataReader.ReadByte();
                var unknown1    = dataReader.ReadBytes(2);
                var objectIndex = dataReader.ReadWord();
                var unknown2    = dataReader.ReadBytes(2);
                @event = new ActionEvent
                {
                    TypeOfAction = actionType,
                    ObjectIndex  = objectIndex,
                    Value        = value,
                    Unknown1     = unknown1,
                    Unknown2     = unknown2
                };
                break;
            }

            case EventType.Dice100Roll:
            {
                var chance = dataReader.ReadByte();
                var unused = dataReader.ReadBytes(6);
                var jumpToIfNotFulfilled = dataReader.ReadWord();
                @event = new Dice100RollEvent
                {
                    Chance = chance,
                    Unused = unused,
                    ContinueIfFalseWithMapEventIndex = jumpToIfNotFulfilled
                };
                break;
            }

            case EventType.Conversation:
            {
                var interaction = (ConversationEvent.InteractionType)dataReader.ReadByte();
                var unused1     = dataReader.ReadBytes(4); // unused
                var value       = dataReader.ReadWord();
                var unused2     = dataReader.ReadBytes(2); // unused
                @event = new ConversationEvent
                {
                    Interaction = interaction,
                    Value       = value,
                    Unused1     = unused1,
                    Unused2     = unused2
                };
                break;
            }

            case EventType.PrintText:
            {
                var npcTextIndex = dataReader.ReadByte();
                var unused       = dataReader.ReadBytes(8); // unused
                @event = new PrintTextEvent
                {
                    NPCTextIndex = npcTextIndex,
                    Unused       = unused
                };
                break;
            }

            case EventType.Create:
            {
                var createType = (CreateEvent.CreateType)dataReader.ReadByte();
                var unused     = dataReader.ReadBytes(4);
                var amount     = dataReader.ReadWord();
                var itemIndex  = dataReader.ReadWord();
                @event = new CreateEvent
                {
                    TypeOfCreation = createType,
                    Unused         = unused,
                    Amount         = amount,
                    ItemIndex      = itemIndex
                };
                break;
            }

            case EventType.Decision:
            {
                var textIndex    = dataReader.ReadByte();
                var unknown1     = dataReader.ReadBytes(6);
                var noEventIndex = dataReader.ReadWord();
                @event = new DecisionEvent
                {
                    TextIndex    = textIndex,
                    NoEventIndex = noEventIndex,
                    Unknown1     = unknown1
                };
                break;
            }

            case EventType.ChangeMusic:
            {
                var musicIndex = dataReader.ReadWord();
                var volume     = dataReader.ReadByte();
                var unknown1   = dataReader.ReadBytes(6);
                @event = new ChangeMusicEvent
                {
                    MusicIndex = musicIndex,
                    Volume     = volume,
                    Unknown1   = unknown1
                };
                break;
            }

            case EventType.Exit:
            {
                @event = new ExitEvent
                {
                    Unused = dataReader.ReadBytes(9)
                };
                break;
            }

            case EventType.Spawn:
            {
                // byte0: x
                // byte1: y
                // byte2: travel type (see TravelType)
                // byte3-4: unused?
                // byte5-6: map index
                // byte7-8: unused?
                var x          = dataReader.ReadByte();
                var y          = dataReader.ReadByte();
                var travelType = (TravelType)dataReader.ReadByte();
                var unknown1   = dataReader.ReadBytes(2);   // unknown
                var mapIndex   = dataReader.ReadWord();
                var unknown2   = dataReader.ReadBytes(2);   // unknown
                @event = new SpawnEvent
                {
                    X          = x,
                    Y          = y,
                    TravelType = travelType,
                    Unknown1   = unknown1,
                    MapIndex   = mapIndex,
                    Unknown2   = unknown2
                };
                break;
            }

            case EventType.Interact:
            {
                @event = new InteractEvent
                {
                    Unused = dataReader.ReadBytes(9)
                };
                break;
            }

            default:
            {
                @event = new DebugEvent
                {
                    Data = dataReader.ReadBytes(9)
                };
                break;
            }
            }

            @event.Type = type;

            return(@event);
        }
Example #19
0
    //显示事件属性
    private void DisplayEvent()
    {
        m_objBirthEvent.SetActive(false);
        m_objBombEvent.SetActive(false);
        m_objSpeedEvent.SetActive(false);
        m_objTeleportEvent.SetActive(false);

        string    eventType = m_currEvent.Type;
        Transform tempTransform;

        if (eventType == "Birth")
        {
            m_objBirthEvent.SetActive(true);
            BirthEvent birthEvent = (BirthEvent)m_currEvent;
            tempTransform = m_objBirthEvent.transform.Find("Index");
            tempTransform.Find("Text").GetComponent <Text>().text = birthEvent.m_index.ToString();
            tempTransform = m_objBirthEvent.transform.Find("CD");
            tempTransform.GetComponentInChildren <InputField>().text = birthEvent.m_cd.ToString();
            tempTransform = m_objBirthEvent.transform.Find("Time");
            tempTransform.GetComponentInChildren <InputField>().text = birthEvent.m_time.ToString();
            tempTransform = m_objBirthEvent.transform.Find("IsInfinite");
            tempTransform.GetComponentInChildren <Toggle>().isOn = birthEvent.m_isInfinite;
        }
        else if (eventType == "Bomb")
        {
            m_objBombEvent.SetActive(true);
            BombEvent bombEvent = (BombEvent)m_currEvent;
            tempTransform = m_objBombEvent.transform.Find("Index");
            tempTransform.Find("Text").GetComponent <Text>().text = bombEvent.m_index.ToString();
            tempTransform = m_objBombEvent.transform.Find("Delay");
            tempTransform.GetComponentInChildren <InputField>().text = bombEvent.m_delay.ToString();
            tempTransform = m_objBombEvent.transform.Find("Hurt");
            tempTransform.GetComponentInChildren <InputField>().text = bombEvent.m_hurt.ToString();
            tempTransform = m_objBombEvent.transform.Find("IsDestroy");
            tempTransform.GetComponentInChildren <Toggle>().isOn = bombEvent.m_isDestory;
        }
        else if (eventType == "Speed")
        {
            m_objSpeedEvent.SetActive(true);
            SpeedEvent speedEvent = (SpeedEvent)m_currEvent;
            tempTransform = m_objSpeedEvent.transform.Find("Index");
            tempTransform.Find("Text").GetComponent <Text>().text = speedEvent.m_index.ToString();
            tempTransform = m_objSpeedEvent.transform.Find("Speed");
            tempTransform.GetComponentInChildren <InputField>().text = speedEvent.m_speed.ToString();
            tempTransform = m_objSpeedEvent.transform.Find("Time");
            tempTransform.GetComponentInChildren <InputField>().text = speedEvent.m_time.ToString();
            tempTransform = m_objSpeedEvent.transform.Find("IsInfinite");
            tempTransform.GetComponentInChildren <Toggle>().isOn = speedEvent.m_isInfinite;
        }
        else if (eventType == "Teleport")
        {
            m_objTeleportEvent.SetActive(true);
            TeleportEvent teleportEvent = (TeleportEvent)m_currEvent;
            tempTransform = m_objTeleportEvent.transform.Find("Index");
            tempTransform.Find("Text").GetComponent <Text>().text = teleportEvent.m_index.ToString();
            tempTransform = m_objTeleportEvent.transform.Find("TeleportID");
            tempTransform.GetComponentInChildren <InputField>().text = teleportEvent.m_teleportID.ToString();
            tempTransform = m_objTeleportEvent.transform.Find("CD");
            tempTransform.GetComponentInChildren <InputField>().text = teleportEvent.m_cd.ToString();
            tempTransform = m_objTeleportEvent.transform.Find("Time");
            tempTransform.GetComponentInChildren <InputField>().text = teleportEvent.m_time.ToString();
            tempTransform = m_objTeleportEvent.transform.Find("IsInfinite");
            tempTransform.GetComponentInChildren <Toggle>().isOn = teleportEvent.m_isInfinite;
        }
        else
        {
            LogManager.Instance.Log("事件类型不存在!");
            return;
        }
    }