Пример #1
0
        public void LoadBackgrounds(WzImage mapImage, Board mapBoard)
        {
            WzSubProperty bgParent = (WzSubProperty)mapImage["back"];
            WzSubProperty bgProp;
            int           i = 0;

            while ((bgProp = (WzSubProperty)bgParent[(i++).ToString()]) != null)
            {
                int            x      = InfoTool.GetInt(bgProp["x"]);
                int            y      = InfoTool.GetInt(bgProp["y"]);
                int            rx     = InfoTool.GetInt(bgProp["rx"]);
                int            ry     = InfoTool.GetInt(bgProp["ry"]);
                int            cx     = InfoTool.GetInt(bgProp["cx"]);
                int            cy     = InfoTool.GetInt(bgProp["cy"]);
                int            a      = InfoTool.GetInt(bgProp["a"]);
                BackgroundType type   = (BackgroundType)InfoTool.GetInt(bgProp["type"]);
                bool           front  = InfoTool.GetBool(bgProp["front"]);
                bool?          flip_t = InfoTool.GetOptionalBool(bgProp["f"]);
                bool           flip   = flip_t.HasValue ? flip_t.Value : false;
                string         bS     = InfoTool.GetString(bgProp["bS"]);
                bool           ani    = InfoTool.GetBool(bgProp["ani"]);
                string         no     = InfoTool.GetInt(bgProp["no"]).ToString();
                BackgroundInfo bgInfo = BackgroundInfo.Get(bS, ani, no);
                if (bgInfo == null)
                {
                    continue;
                }
                IList list = front ? mapBoard.BoardItems.FrontBackgrounds : mapBoard.BoardItems.BackBackgrounds;
                list.Add((BackgroundInstance)bgInfo.CreateInstance(mapBoard, x, y, i, rx, ry, cx, cy, type, a, front, flip));
            }
        }
Пример #2
0
        public void LoadRopes(WzImage mapImage, Board mapBoard)
        {
            WzSubProperty ropeParent = (WzSubProperty)mapImage["ladderRope"];

            foreach (WzSubProperty rope in ropeParent.WzProperties)
            {
                int  x    = InfoTool.GetInt(rope["x"]);
                int  y1   = InfoTool.GetInt(rope["y1"]);
                int  y2   = InfoTool.GetInt(rope["y2"]);
                bool uf   = InfoTool.GetBool(rope["uf"]);
                int  page = InfoTool.GetInt(rope["page"]);
                bool l    = InfoTool.GetBool(rope["l"]);
                mapBoard.BoardItems.Ropes.Add(new Rope(mapBoard, x, y1, y2, l, page, uf));
            }
        }
Пример #3
0
        public void LoadReactors(WzImage mapImage, Board mapBoard)
        {
            WzSubProperty reactorParent = (WzSubProperty)mapImage["reactor"];

            if (reactorParent == null)
            {
                return;
            }
            foreach (WzSubProperty reactor in reactorParent.WzProperties)
            {
                int    x           = InfoTool.GetInt(reactor["x"]);
                int    y           = InfoTool.GetInt(reactor["y"]);
                int    reactorTime = InfoTool.GetInt(reactor["reactorTime"]);
                string name        = InfoTool.GetOptionalString(reactor["name"]);
                string id          = InfoTool.GetString(reactor["id"]);
                bool   flip        = InfoTool.GetBool(reactor["f"]);
                mapBoard.BoardItems.Reactors.Add((ReactorInstance)Program.InfoManager.Reactors[id].CreateInstance(mapBoard, x, y, reactorTime, name, flip));
            }
        }
Пример #4
0
        private static void LoadBackgrounds(WzImage mapImage, Board mapBoard)
        {
            WzSubProperty bgParent = (WzSubProperty)mapImage["back"];
            WzSubProperty bgProp;
            int           i = 0;

            while ((bgProp = (WzSubProperty)bgParent[(i++).ToString()]) != null)
            {
                int            x     = InfoTool.GetInt(bgProp["x"]);
                int            y     = InfoTool.GetInt(bgProp["y"]);
                int            rx    = InfoTool.GetInt(bgProp["rx"]);
                int            ry    = InfoTool.GetInt(bgProp["ry"]);
                int            cx    = InfoTool.GetInt(bgProp["cx"]);
                int            cy    = InfoTool.GetInt(bgProp["cy"]);
                int            a     = InfoTool.GetInt(bgProp["a"]);
                BackgroundType type  = (BackgroundType)InfoTool.GetInt(bgProp["type"]);
                bool           front = InfoTool.GetBool(bgProp["front"]);
                bool           flip  = InfoTool.GetBool(bgProp["f"]);
                string         bS    = InfoTool.GetString(bgProp["bS"]);
                bool           ani   = InfoTool.GetBool(bgProp["ani"]);
                string         no    = InfoTool.GetInt(bgProp["no"]).ToString();
                WzImage        bsImg = Program.InfoManager.BackgroundSets[bS];
                if (bsImg == null)
                {
                    continue;
                }
                IWzImageProperty bgInfoProp = bsImg[ani ? "ani" : "back"][no];
                if (bgInfoProp.HCTag == null)
                {
                    bgInfoProp.HCTag = BackgroundInfo.Load(bgInfoProp, bS, ani, no);
                }
                BackgroundInfo bgInfo = (BackgroundInfo)bgInfoProp.HCTag;
                IList          list   = front ? mapBoard.BoardItems.FrontBackgrounds : mapBoard.BoardItems.BackBackgrounds;
                list.Add((BackgroundInstance)bgInfo.CreateInstance(mapBoard, x, y, i, rx, ry, cx, cy, type, a, front, flip, false));
            }
        }
Пример #5
0
        private void ExtractSettingsImage(WzImage settingsImage, Type settingsHolderType)
        {
            if (!settingsImage.Parsed)
            {
                settingsImage.ParseImage();
            }
            foreach (FieldInfo fieldInfo in settingsHolderType.GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                string          settingName = fieldInfo.Name;
                WzImageProperty settingProp = settingsImage[settingName];
                byte[]          argb;
                if (settingProp == null)
                {
                    SaveField(settingsImage, fieldInfo);
                }
                else if (fieldInfo.FieldType.BaseType != null && fieldInfo.FieldType.BaseType.FullName == "System.Enum")
                {
                    fieldInfo.SetValue(null, InfoTool.GetInt(settingProp));
                }
                else
                {
                    switch (fieldInfo.FieldType.FullName)
                    {
                    //case "Microsoft.Xna.Framework.Graphics.Color":
                    case "Microsoft.Xna.Framework.Color":
                        if (xnaColorType == null)
                        {
                            throw new InvalidDataException("XNA color detected, but XNA type activator is null");
                        }
                        argb = BitConverter.GetBytes((uint)((WzDoubleProperty)settingProp).Value);
                        fieldInfo.SetValue(null, Activator.CreateInstance(xnaColorType, argb[0], argb[1], argb[2], argb[3]));
                        break;

                    case "System.Drawing.Color":
                        argb = BitConverter.GetBytes((uint)((WzDoubleProperty)settingProp).Value);
                        fieldInfo.SetValue(null, System.Drawing.Color.FromArgb(argb[3], argb[2], argb[1], argb[0]));
                        break;

                    case "System.Int32":
                        fieldInfo.SetValue(null, InfoTool.GetInt(settingProp));
                        break;

                    case "System.Double":
                        fieldInfo.SetValue(null, ((WzDoubleProperty)settingProp).Value);
                        break;

                    case "System.Boolean":
                        fieldInfo.SetValue(null, InfoTool.GetBool(settingProp));
                        //bool a = (bool)fieldInfo.GetValue(null);
                        break;

                    case "System.Single":
                        fieldInfo.SetValue(null, ((WzFloatProperty)settingProp).Value);
                        break;

                    /*case "WzMapleVersion":
                     *  fieldInfo.SetValue(null, (WzMapleVersion)InfoTool.GetInt(settingProp));
                     *  break;
                     * case "ItemTypes":
                     *  fieldInfo.SetValue(null, (ItemTypes)InfoTool.GetInt(settingProp));
                     *  break;*/
                    case "System.Drawing.Size":
                        fieldInfo.SetValue(null, new System.Drawing.Size(((WzVectorProperty)settingProp).X.Value, ((WzVectorProperty)settingProp).Y.Value));
                        break;

                    case "System.String":
                        fieldInfo.SetValue(null, InfoTool.GetString(settingProp));
                        break;

                    case "System.Drawing.Bitmap":
                        fieldInfo.SetValue(null, ((WzCanvasProperty)settingProp).PngProperty.GetImage(false));
                        break;

                    default:
                        throw new Exception("unrecognized setting type");
                    }
                }
            }
        }
Пример #6
0
        public void LoadMisc(WzImage mapImage, Board mapBoard)
        {
            // All of the following properties are extremely esoteric features that only appear in a handful of maps.
            // They are implemented here for the sake of completeness, and being able to repack their maps without corruption.

            WzImageProperty clock    = mapImage["clock"];
            WzImageProperty ship     = mapImage["shipObj"];
            WzImageProperty area     = mapImage["area"];
            WzImageProperty healer   = mapImage["healer"];
            WzImageProperty pulley   = mapImage["pulley"];
            WzImageProperty BuffZone = mapImage["BuffZone"];
            WzImageProperty swimArea = mapImage["swimArea"];

            if (clock != null)
            {
                Clock clockInstance = new Clock(mapBoard, new Rectangle(InfoTool.GetInt(clock["x"]), InfoTool.GetInt(clock["y"]), InfoTool.GetInt(clock["width"]), InfoTool.GetInt(clock["height"])));
                mapBoard.BoardItems.Add(clockInstance, false);
            }
            if (ship != null)
            {
                string     objPath      = InfoTool.GetString(ship["shipObj"]);
                string[]   objPathParts = objPath.Split("/".ToCharArray());
                string     oS           = WzInfoTools.RemoveExtension(objPathParts[objPathParts.Length - 4]);
                string     l0           = objPathParts[objPathParts.Length - 3];
                string     l1           = objPathParts[objPathParts.Length - 2];
                string     l2           = objPathParts[objPathParts.Length - 1];
                ObjectInfo objInfo      = ObjectInfo.Get(oS, l0, l1, l2);
                ShipObject shipInstance = new ShipObject(objInfo, mapBoard,
                                                         InfoTool.GetInt(ship["x"]),
                                                         InfoTool.GetInt(ship["y"]),
                                                         InfoTool.GetOptionalInt(ship["z"]),
                                                         InfoTool.GetOptionalInt(ship["x0"]),
                                                         InfoTool.GetInt(ship["tMove"]),
                                                         InfoTool.GetInt(ship["shipKind"]),
                                                         InfoTool.GetBool(ship["f"]));
                mapBoard.BoardItems.Add(shipInstance, false);
            }
            if (area != null)
            {
                foreach (WzImageProperty prop in area.WzProperties)
                {
                    int  x1       = InfoTool.GetInt(prop["x1"]);
                    int  x2       = InfoTool.GetInt(prop["x2"]);
                    int  y1       = InfoTool.GetInt(prop["y1"]);
                    int  y2       = InfoTool.GetInt(prop["y2"]);
                    Area currArea = new Area(mapBoard, new Rectangle(Math.Min(x1, x2), Math.Min(y1, y2), Math.Abs(x2 - x1), Math.Abs(y2 - y1)), prop.Name);
                    mapBoard.BoardItems.Add(currArea, false);
                }
            }
            if (healer != null)
            {
                string     objPath        = InfoTool.GetString(healer["healer"]);
                string[]   objPathParts   = objPath.Split("/".ToCharArray());
                string     oS             = WzInfoTools.RemoveExtension(objPathParts[objPathParts.Length - 4]);
                string     l0             = objPathParts[objPathParts.Length - 3];
                string     l1             = objPathParts[objPathParts.Length - 2];
                string     l2             = objPathParts[objPathParts.Length - 1];
                ObjectInfo objInfo        = ObjectInfo.Get(oS, l0, l1, l2);
                Healer     healerInstance = new Healer(objInfo, mapBoard,
                                                       InfoTool.GetInt(healer["x"]),
                                                       InfoTool.GetInt(healer["yMin"]),
                                                       InfoTool.GetInt(healer["yMax"]),
                                                       InfoTool.GetInt(healer["healMin"]),
                                                       InfoTool.GetInt(healer["healMax"]),
                                                       InfoTool.GetInt(healer["fall"]),
                                                       InfoTool.GetInt(healer["rise"]));
                mapBoard.BoardItems.Add(healerInstance, false);
            }
            if (pulley != null)
            {
                string     objPath        = InfoTool.GetString(pulley["pulley"]);
                string[]   objPathParts   = objPath.Split("/".ToCharArray());
                string     oS             = WzInfoTools.RemoveExtension(objPathParts[objPathParts.Length - 4]);
                string     l0             = objPathParts[objPathParts.Length - 3];
                string     l1             = objPathParts[objPathParts.Length - 2];
                string     l2             = objPathParts[objPathParts.Length - 1];
                ObjectInfo objInfo        = ObjectInfo.Get(oS, l0, l1, l2);
                Pulley     pulleyInstance = new Pulley(objInfo, mapBoard,
                                                       InfoTool.GetInt(pulley["x"]),
                                                       InfoTool.GetInt(pulley["y"]));
                mapBoard.BoardItems.Add(pulleyInstance, false);
            }
            if (BuffZone != null)
            {
                foreach (WzImageProperty zone in BuffZone.WzProperties)
                {
                    int      x1       = InfoTool.GetInt(zone["x1"]);
                    int      x2       = InfoTool.GetInt(zone["x2"]);
                    int      y1       = InfoTool.GetInt(zone["y1"]);
                    int      y2       = InfoTool.GetInt(zone["y2"]);
                    int      id       = InfoTool.GetInt(zone["ItemID"]);
                    int      interval = InfoTool.GetInt(zone["Interval"]);
                    int      duration = InfoTool.GetInt(zone["Duration"]);
                    BuffZone currZone = new BuffZone(mapBoard, new Rectangle(Math.Min(x1, x2), Math.Min(y1, y2), Math.Abs(x2 - x1), Math.Abs(y2 - y1)), id, interval, duration, zone.Name);
                    mapBoard.BoardItems.Add(currZone, false);
                }
            }
            if (swimArea != null)
            {
                foreach (WzImageProperty prop in swimArea.WzProperties)
                {
                    int      x1       = InfoTool.GetInt(prop["x1"]);
                    int      x2       = InfoTool.GetInt(prop["x2"]);
                    int      y1       = InfoTool.GetInt(prop["y1"]);
                    int      y2       = InfoTool.GetInt(prop["y2"]);
                    SwimArea currArea = new SwimArea(mapBoard, new Rectangle(Math.Min(x1, x2), Math.Min(y1, y2), Math.Abs(x2 - x1), Math.Abs(y2 - y1)), prop.Name);
                    mapBoard.BoardItems.Add(currArea, false);
                }
            }
            // Some misc items are not implemented here; these are copied byte-to-byte from the original. See VerifyMapPropsKnown for details.
        }
Пример #7
0
 public void LoadLayers(WzImage mapImage, Board mapBoard)
 {
     for (int layer = 0; layer <= 7; layer++)
     {
         WzSubProperty   layerProp = (WzSubProperty)mapImage[layer.ToString()];
         WzImageProperty tSprop    = layerProp["info"]["tS"];
         string          tS        = null;
         if (tSprop != null)
         {
             tS = InfoTool.GetString(tSprop);
         }
         foreach (WzImageProperty obj in layerProp["obj"].WzProperties)
         {
             int                        x           = InfoTool.GetInt(obj["x"]);
             int                        y           = InfoTool.GetInt(obj["y"]);
             int                        z           = InfoTool.GetInt(obj["z"]);
             int                        zM          = InfoTool.GetInt(obj["zM"]);
             string                     oS          = InfoTool.GetString(obj["oS"]);
             string                     l0          = InfoTool.GetString(obj["l0"]);
             string                     l1          = InfoTool.GetString(obj["l1"]);
             string                     l2          = InfoTool.GetString(obj["l2"]);
             string                     name        = InfoTool.GetOptionalString(obj["name"]);
             MapleBool                  r           = InfoTool.GetOptionalBool(obj["r"]);
             MapleBool                  hide        = InfoTool.GetOptionalBool(obj["hide"]);
             MapleBool                  reactor     = InfoTool.GetOptionalBool(obj["reactor"]);
             MapleBool                  flow        = InfoTool.GetOptionalBool(obj["flow"]);
             int?                       rx          = InfoTool.GetOptionalTranslatedInt(obj["rx"]);
             int?                       ry          = InfoTool.GetOptionalTranslatedInt(obj["ry"]);
             int?                       cx          = InfoTool.GetOptionalTranslatedInt(obj["cx"]);
             int?                       cy          = InfoTool.GetOptionalTranslatedInt(obj["cy"]);
             string                     tags        = InfoTool.GetOptionalString(obj["tags"]);
             WzImageProperty            questParent = obj["quest"];
             List <ObjectInstanceQuest> questInfo   = null;
             if (questParent != null)
             {
                 questInfo = new List <ObjectInstanceQuest>();
                 foreach (WzIntProperty info in questParent.WzProperties)
                 {
                     questInfo.Add(new ObjectInstanceQuest(int.Parse(info.Name), (QuestState)info.Value));
                 }
             }
             bool       flip    = InfoTool.GetBool(obj["f"]);
             ObjectInfo objInfo = ObjectInfo.Get(oS, l0, l1, l2);
             if (objInfo == null)
             {
                 continue;
             }
             Layer l = mapBoard.Layers[layer];
             mapBoard.BoardItems.TileObjs.Add((LayeredItem)objInfo.CreateInstance(l, mapBoard, x, y, z, zM, r, hide, reactor, flow, rx, ry, cx, cy, name, tags, questInfo, flip, false));
             l.zMList.Add(zM);
         }
         WzImageProperty tileParent = layerProp["tile"];
         foreach (WzImageProperty tile in tileParent.WzProperties)
         {
             int      x        = InfoTool.GetInt(tile["x"]);
             int      y        = InfoTool.GetInt(tile["y"]);
             int      zM       = InfoTool.GetInt(tile["zM"]);
             string   u        = InfoTool.GetString(tile["u"]);
             int      no       = InfoTool.GetInt(tile["no"]);
             Layer    l        = mapBoard.Layers[layer];
             TileInfo tileInfo = TileInfo.Get(tS, u, no.ToString());
             mapBoard.BoardItems.TileObjs.Add((LayeredItem)tileInfo.CreateInstance(l, mapBoard, x, y, int.Parse(tile.Name), zM, false, false));
             l.zMList.Add(zM);
         }
     }
 }
Пример #8
0
 private static void LoadLayers(WzImage mapImage, Board mapBoard)
 {
     for (int layer = 0; layer <= 7; layer++)
     {
         WzSubProperty    layerProp = (WzSubProperty)mapImage[layer.ToString()];
         IWzImageProperty tSprop    = layerProp["info"]["tS"];
         string           tS        = null;
         if (tSprop != null)
         {
             tS = InfoTool.GetString(tSprop);
         }
         foreach (IWzImageProperty obj in layerProp["obj"].WzProperties)
         {
             int x = InfoTool.GetInt(obj["x"]);
             int y = InfoTool.GetInt(obj["y"]);
             int z = InfoTool.GetInt(obj["z"]);
             //int zM = InfoTool.GetInt(obj["zM"]);
             string                     oS          = InfoTool.GetString(obj["oS"]);
             string                     l0          = InfoTool.GetString(obj["l0"]);
             string                     l1          = InfoTool.GetString(obj["l1"]);
             string                     l2          = InfoTool.GetString(obj["l2"]);
             string                     name        = InfoTool.GetOptionalString(obj["name"]);
             MapleBool                  r           = InfoTool.GetOptionalBool(obj["r"]);
             MapleBool                  hide        = InfoTool.GetOptionalBool(obj["hide"]);
             MapleBool                  reactor     = InfoTool.GetOptionalBool(obj["reactor"]);
             MapleBool                  flow        = InfoTool.GetOptionalBool(obj["flow"]);
             int?                       rx          = InfoTool.GetOptionalTranslatedInt(obj["rx"]);
             int?                       ry          = InfoTool.GetOptionalTranslatedInt(obj["ry"]);
             int?                       cx          = InfoTool.GetOptionalTranslatedInt(obj["cx"]);
             int?                       cy          = InfoTool.GetOptionalTranslatedInt(obj["cy"]);
             string                     tags        = InfoTool.GetOptionalString(obj["tags"]);
             IWzImageProperty           questParent = obj["quest"];
             List <ObjectInstanceQuest> questInfo   = null;
             if (questParent != null)
             {
                 foreach (WzCompressedIntProperty info in questParent.WzProperties)
                 {
                     questInfo.Add(new ObjectInstanceQuest(int.Parse(info.Name), (QuestState)info.Value));
                 }
             }
             bool             flip        = InfoTool.GetBool(obj["f"]);
             IWzImageProperty objInfoProp = Program.InfoManager.ObjectSets[oS][l0][l1][l2];
             if (objInfoProp.HCTag == null)
             {
                 objInfoProp.HCTag = ObjectInfo.Load((WzSubProperty)objInfoProp, oS, l0, l1, l2);
             }
             ObjectInfo objInfo = (ObjectInfo)objInfoProp.HCTag;
             mapBoard.BoardItems.TileObjs.Add((LayeredItem)objInfo.CreateInstance(mapBoard.Layers[layer], mapBoard, x, y, z, r, hide, reactor, flow, rx, ry, cx, cy, name, tags, questInfo, flip, false, false));
         }
         IWzImageProperty tileParent = layerProp["tile"];
         for (int i = 0; i < tileParent.WzProperties.Count; i++)
         //foreach (IWzImageProperty tile in layerProp["tile"].WzProperties)
         {
             IWzImageProperty tile = tileParent.WzProperties[i];
             int x = InfoTool.GetInt(tile["x"]);
             int y = InfoTool.GetInt(tile["y"]);
             //int zM = InfoTool.GetInt(tile["zM"]);
             string           u            = InfoTool.GetString(tile["u"]);
             int              no           = InfoTool.GetInt(tile["no"]);
             IWzImageProperty tileInfoProp = Program.InfoManager.TileSets[tS][u][no.ToString()];
             if (tileInfoProp.HCTag == null)
             {
                 tileInfoProp.HCTag = TileInfo.Load((WzCanvasProperty)tileInfoProp, tS, u, no.ToString());
             }
             TileInfo tileInfo = (TileInfo)tileInfoProp.HCTag;
             mapBoard.BoardItems.TileObjs.Add((LayeredItem)tileInfo.CreateInstance(mapBoard.Layers[layer], mapBoard, x, y, i /*zM*/, false, false, false));
         }
     }
 }