//各種Plist一括取得.
        public static PLists GetMapPListsWhereAddr(uint addr)
        {
            PLists plists = new PLists();

            if (!U.isSafetyOffset(addr))
            {
                return(plists);
            }
            plists.obj_plist        = (uint)Program.ROM.u16(addr + 4);
            plists.palette_plist    = (uint)Program.ROM.u8(addr + 6);
            plists.config_plist     = (uint)Program.ROM.u8(addr + 7);
            plists.mappointer_plist = (uint)Program.ROM.u8(addr + 8);
            plists.anime1_plist     = (uint)Program.ROM.u8(addr + 9);
            plists.anime2_plist     = (uint)Program.ROM.u8(addr + 10);
            plists.mapchange_plist  = (uint)Program.ROM.u8(addr + 11);

            plists.event_plist = Program.ROM.u8(addr + Program.ROM.RomInfo.map_setting_event_plist_pos());
            //            //FE6だけ worldmapは plistなんだけど。。。 別ルーチンでやっているからいれないことにする.
            //            plists.worldmapevent_plist = Program.ROM.u8(addr + Program.ROM.RomInfo.map_setting_worldmap_plist_pos());

            //マップ第2パレット
            PatchUtil.MapSecondPalette_extends secondPalette = PatchUtil.SearchFlag0x28ToMapSecondPalettePatch();
            if (secondPalette == PatchUtil.MapSecondPalette_extends.Flag0x28_146)
            {
                plists.palette2_plist = (uint)Program.ROM.u8(addr + 146);
            }
            else if (secondPalette == PatchUtil.MapSecondPalette_extends.Flag0x28_45)
            {
                plists.palette2_plist = (uint)Program.ROM.u8(addr + 45);
            }

            return(plists);
        }
Example #2
0
        //各種Plist一括取得.
        public static PLists GetMapPListsWhereAddr(uint addr)
        {
            PLists plists = new PLists();

            if (!U.isSafetyOffset(addr))
            {
                return(plists);
            }
            plists.obj_plist        = (uint)Program.ROM.u16(addr + 4);
            plists.palette_plist    = (uint)Program.ROM.u8(addr + 6);
            plists.config_plist     = (uint)Program.ROM.u8(addr + 7);
            plists.mappointer_plist = (uint)Program.ROM.u8(addr + 8);
            plists.anime1_plist     = (uint)Program.ROM.u8(addr + 9);
            plists.anime2_plist     = (uint)Program.ROM.u8(addr + 10);
            plists.mapchange_plist  = (uint)Program.ROM.u8(addr + 11);

            plists.event_plist = Program.ROM.u8(addr + Program.ROM.RomInfo.map_setting_event_plist_pos());
            //            //FE6だけ worldmapは plistなんだけど。。。 別ルーチンでやっているからいれないことにする.
            //            plists.worldmapevent_plist = Program.ROM.u8(addr + Program.ROM.RomInfo.map_setting_worldmap_plist_pos());

            return(plists);
        }
        //エラー検出
        public static void MakeCheckErrors(uint mapid, List <FELint.ErrorSt> errors)
        {
            uint mapaddr = GetMapAddr(mapid);

            if (mapaddr == U.NOT_FOUND)
            {
                return;
            }
            PLists plists = GetMapPListsWhereAddr(mapaddr);

            {
                uint obj2_plist  = (plists.obj_plist >> 8) & 0xFF; //FE8にはないが FE7は、 plistを2つ設定できることがある.
                uint obj2_offset = 0;

                uint obj_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.OBJECT, plists.obj_plist & 0xFF);
                if (!U.isSafetyOffset(obj_offset))
                {
                    errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_OBJECT, mapaddr
                                                  , R._("PLIST({0})が無効です", plists.obj_plist)));
                }
                else
                {
                    FELint.CheckLZ77ImageErrors(obj_offset, errors, FELint.Type.MAPSETTING_PLIST_OBJECT, mapaddr, 256, 120);
                }

                if (obj2_plist > 0)
                {//plist2があれば
                    obj2_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.OBJECT, obj2_plist);
                    if (!U.isSafetyOffset(obj2_offset))
                    {
                        errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_OBJECT, mapaddr
                                                      , R._("PLIST({0})が無効です", obj2_plist)));
                    }
                    else
                    {
                        FELint.CheckLZ77ImageErrors(obj2_offset, errors, FELint.Type.MAPSETTING_PLIST_OBJECT, mapaddr, 256, 120);
                    }
                }
            }
            {
                uint config_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.CONFIG, plists.config_plist);
                if (!U.isSafetyOffset(config_offset))
                {
                    errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_CONFIG, mapaddr
                                                  , R._("PLIST({0})が無効です", plists.config_plist)));
                }
                else
                {
                    FELint.CheckLZ77(config_offset, errors, FELint.Type.MAPSETTING_PLIST_CONFIG, mapaddr);
                }
            }
            {
                uint map_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.MAP, plists.mappointer_plist);
                if (!U.isSafetyOffset(map_offset))
                {
                    errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_MAP, mapaddr
                                                  , R._("PLIST({0})が無効です", plists.mappointer_plist)));
                }
                else
                {
                    Size mapsize = ImageUtilMap.GetMapSize(plists.obj_plist, plists.palette_plist, plists.config_plist, plists.mappointer_plist);
                    if (mapsize.Width <= 0 || mapsize.Height <= 0)
                    {
                        //LZ77に失敗してそうだからチェックする
                        FELint.CheckLZ77(map_offset, errors, FELint.Type.MAPSETTING_PLIST_MAP, mapaddr);
                        errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_MAP, mapaddr
                                                      , R._("マップが破損しています。")
                                                      , mapid));
                    }

                    uint limitWidth = ImageUtilMap.GetLimitMapWidth(mapsize.Height);
                    if (mapsize.Width < ImageUtilMap.MAP_MIN_WIDTH || mapsize.Height < ImageUtilMap.MAP_MIN_HEIGHT)
                    {
                        if (IsFreliaCasle(mapid))
                        {
                            //nop
                            //フレリア城
                        }
                        else
                        {
                            errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_MAP, mapaddr
                                                          , R._("マップが狭すぎます。現在のサイズ:({0},{1}) 利用できる最少サイズ:({2},{3})"
                                                                , mapsize.Width, mapsize.Height, ImageUtilMap.MAP_MIN_WIDTH, ImageUtilMap.MAP_MIN_HEIGHT)
                                                          , mapid));
                        }
                    }
                    else if (limitWidth == 0)
                    {
                        errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_MAP, mapaddr
                                                      , R._("マップが広すぎます。\r\n現在のサイズ({0},{1})", mapsize.Width, mapsize.Height, limitWidth)
                                                      ));
                    }
                    else if (mapsize.Width > limitWidth)
                    {
                        errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_MAP, mapaddr
                                                      , R._("マップが広すぎます。\r\n現在のサイズ({0},{1})\r\nこの幅だと、利用可能な高さは、幅は{2}までです。", mapsize.Width, mapsize.Height, limitWidth)
                                                      ));
                    }
                }
            }
            {
                uint pal_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.PALETTE, plists.palette_plist);
                if (!U.isSafetyOffset(pal_offset))
                {
                    errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_PALETTE, mapaddr
                                                  , R._("PLIST({0})が無効です", plists.palette_plist)));
                }
            }

            if (plists.mapchange_plist != 0)
            {
                uint mapchange_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.CHANGE, plists.mapchange_plist);
                if (!U.isSafetyOffset(mapchange_offset))
                {
                    errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_MAPCHANGE, mapaddr
                                                  , R._("PLIST({0})が無効です", plists.mapchange_plist)));
                }
            }
            if (plists.anime1_plist != 0)
            {
                uint anime1_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.ANIMATION, plists.anime1_plist);
                if (!U.isSafetyOffset(anime1_offset))
                {
                    errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_ANIMETION1, mapaddr
                                                  , R._("PLIST({0})が無効です", plists.anime1_plist)));
                }
            }
            if (plists.anime2_plist != 0)
            {
                uint anime2_offset = MapPointerForm.PlistToOffsetAddr(MapPointerForm.PLIST_TYPE.ANIMATION2, plists.anime2_plist);
                if (!U.isSafetyOffset(anime2_offset))
                {
                    errors.Add(new FELint.ErrorSt(FELint.Type.MAPSETTING_PLIST_ANIMETION2, mapaddr
                                                  , R._("PLIST({0})が無効です", plists.anime2_plist)));
                }
            }
        }