//各種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); }
//各種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))); } } }