mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-16 08:11:35 +02:00
CLOSES #604, CLOSES #666, CLOSES #716, CLOSES #727, CLOSES #763, CLOSES #781, CLOSES #784, CLOSES #799, CLOSES #801, CLOSES #810, CLOSES #828, CLOSES #834, CLOSES #838, CLOSES #849, CLOSES #852, CLOSES #857, CLOSES #863, CLOSES #864, CLOSES #867, CLOSES #869, CLOSES #870, CLOSES #872, CLOSES #839
This commit is contained in:
@@ -93,6 +93,12 @@ O.statusFlags1 = O.townVisited + 29 -- 1B
|
||||
O.statusFlags4 = O.townVisited + 35 -- 1B
|
||||
O.elite4Flags = O.townVisited + 41 -- 1B
|
||||
O.tradeFlags = O.townVisited + 44 -- 2B (flag_array NUM_NPC_TRADES)
|
||||
-- wToggleableObjectFlags (ram/wram.asm, flag_array $100): the ShowObject/
|
||||
-- HideObject persistence, one bit per data/maps/toggleable_objects.asm entry,
|
||||
-- set = hidden (engine/overworld/toggleable_objects.asm IsObjectHidden).
|
||||
-- Sits 2 bytes (wPlayerCoins) past O.coins per the walk above; absolute
|
||||
-- 0x2852 (#763, #857).
|
||||
O.toggleObjectFlags = O.coins + 2 -- 32B
|
||||
-- Play time (wPlayTimeHours/Maxed/Minutes/Seconds/Frames) lives INSIDE the
|
||||
-- sMainData window (wMainDataStart..wMainDataEnd is copied verbatim into
|
||||
-- SRAM), 1866 bytes past wMainDataStart -- reached from the checksum-verified
|
||||
@@ -107,6 +113,15 @@ O.playTimeMaxed = O.mainData + 1867 -- 1B (set once past 2
|
||||
O.playTimeMinutes = O.mainData + 1868 -- 1B (0-59)
|
||||
O.playTimeSeconds = O.mainData + 1869 -- 1B (0-59)
|
||||
O.playTimeFrames = O.mainData + 1870 -- 1B (0-59, 1/60s ticks)
|
||||
-- wPikachuHappiness, Yellow only (pret/pokeyellow ram/wram.asm; no local
|
||||
-- pokeyellow checkout, so verified against the pokeyellow symbol file
|
||||
-- instead: d46f - wMainDataStart d2f6 = 377, the well-known absolute
|
||||
-- 0x271C). In Red/Blue this byte is current-map scratch the game
|
||||
-- regenerates on load, so the codec touches it only when the crosswalk
|
||||
-- data set names the game "yellow" (#763, #838). Every other modeled
|
||||
-- offset is identical between pokered and pokeyellow (same sram.asm, same
|
||||
-- wMainData field spacing per both symbol files).
|
||||
O.pikachuHappiness = O.mainData + 377
|
||||
O.mainDataSize = 1929 -- wMainDataEnd - wMainDataStart
|
||||
|
||||
O.spriteData = O.mainData + O.mainDataSize
|
||||
@@ -729,6 +744,25 @@ function GenSave.decode(bytes, data, opts)
|
||||
if save.flags[vanillaName] then save.flags[portName] = true end
|
||||
end
|
||||
|
||||
-- wToggleableObjectFlags -> save.objectToggles (bit set = hidden). A few
|
||||
-- of these are re-derived from flags on map entry (#106/#234 onEnter
|
||||
-- re-applies), but most ShowObject/HideObject state -- the Mt Moon
|
||||
-- fossils, the Cerulean guard swap -- has no flag to re-derive from, so
|
||||
-- an import that drops the array resurrects taken fossils and blocking
|
||||
-- guards (#763, #857).
|
||||
local toggles = data.toggleObjects
|
||||
if toggles then
|
||||
save.objectToggles = {}
|
||||
for bitIdx, e in pairs(toggles.byBit) do
|
||||
local mapToggles = save.objectToggles[e[1]]
|
||||
if not mapToggles then
|
||||
mapToggles = {}
|
||||
save.objectToggles[e[1]] = mapToggles
|
||||
end
|
||||
mapToggles[e[2]] = not bitGet(bytes, O.toggleObjectFlags, bitIdx)
|
||||
end
|
||||
end
|
||||
|
||||
-- FLY destinations. wTownVisitedFlag's bit index IS the town's map index:
|
||||
-- engine/items/town_map.asm BuildFlyLocationsList loads the 16-bit value
|
||||
-- into de and rotates it right one bit per iteration with b counting up
|
||||
@@ -774,6 +808,15 @@ function GenSave.decode(bytes, data, opts)
|
||||
+ u8(bytes, O.playTimeSeconds)
|
||||
+ u8(bytes, O.playTimeFrames) / 60
|
||||
|
||||
-- Yellow starter friendship (save.pikachuHappiness,
|
||||
-- src/world/PikachuFollower.lua reads it; pokeyellow's
|
||||
-- init_player_data.asm seeds 90 on a new game), gated on the data set's
|
||||
-- game because the byte is map scratch in Red/Blue (see
|
||||
-- O.pikachuHappiness) (#763, #838).
|
||||
if data.gameVersion == "yellow" then
|
||||
save.pikachuHappiness = u8(bytes, O.pikachuHappiness)
|
||||
end
|
||||
|
||||
save.warnings = warnings
|
||||
save.rawImport = bytes -- template for a later encode(); see file header
|
||||
return save
|
||||
@@ -868,6 +911,41 @@ function GenSave.encode(save, data, template)
|
||||
end
|
||||
end
|
||||
|
||||
-- wToggleableObjectFlags, written both ways like the #396 extras: this
|
||||
-- port's save is the authority, and vanilla folds three stores this port
|
||||
-- keeps separate into these same bits -- script ShowObject/HideObject
|
||||
-- (save.objectToggles), taken overworld items (engine/events/
|
||||
-- pick_up_item.asm -> save.itemsTaken) and beaten static encounters
|
||||
-- (home/trainers.asm HideObject after battle -> save.defeatedTrainers) --
|
||||
-- so all three fold back in here or an exported save resurrects them
|
||||
-- (#763, #857).
|
||||
local toggleData = data.toggleObjects
|
||||
if toggleData then
|
||||
local objectToggles = save.objectToggles or {}
|
||||
local itemsTaken = save.itemsTaken or {}
|
||||
local beaten = save.defeatedTrainers or {}
|
||||
for bitIdx, e in pairs(toggleData.byBit) do
|
||||
local mapId, objName, visible = e[1], e[2], e[3]
|
||||
local mapToggles = objectToggles[mapId]
|
||||
if mapToggles and mapToggles[objName] ~= nil then
|
||||
visible = mapToggles[objName]
|
||||
end
|
||||
if visible and data.maps and data.maps[mapId] then
|
||||
for _, obj in ipairs(data.maps[mapId].objects or {}) do
|
||||
if obj.name == objName then
|
||||
local key = mapId .. "_obj_" .. obj.index
|
||||
if (obj.item and itemsTaken[key])
|
||||
or (obj.pokemon and beaten[key]) then
|
||||
visible = false
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
bitSet(buf, O.toggleObjectFlags, bitIdx, not visible)
|
||||
end
|
||||
end
|
||||
|
||||
-- FLY destinations back into wTownVisitedFlag (see the decode note), so a
|
||||
-- save exported from this port is flyable on hardware (#263). A save
|
||||
-- table with no `visited` key at all says nothing about the set, so leave
|
||||
@@ -967,6 +1045,16 @@ function GenSave.encode(save, data, template)
|
||||
setByte(buf, O.playTimeFrames, rem - secs * 60)
|
||||
end
|
||||
|
||||
-- Yellow starter friendship back out (see O.pikachuHappiness); Red/Blue
|
||||
-- data sets never reach this write. 90 is the fresh-game seed the
|
||||
-- follower system itself uses when the save has never tracked it.
|
||||
-- Placed before the checksum pass so the byte is covered by the
|
||||
-- main-data checksum automatically (#763, #838).
|
||||
if data.gameVersion == "yellow" then
|
||||
local h = tonumber(save.pikachuHappiness) or 90
|
||||
setByte(buf, O.pikachuHappiness, math.max(0, math.min(255, math.floor(h))))
|
||||
end
|
||||
|
||||
local out = table.concat(buf)
|
||||
-- checksums, computed last over the now-final bytes
|
||||
local outBuf = {}
|
||||
|
||||
@@ -44,6 +44,19 @@ local DATA_MODULES = {
|
||||
maps = { "data.generated.maps", "data/generated/maps.lua" },
|
||||
charmap = { "src.save_convert.data.charmap", "src/save_convert/data/charmap.lua" },
|
||||
eventFlags = { "src.save_convert.data.event_flags", "src/save_convert/data/event_flags.lua" },
|
||||
toggleObjects = { "src.save_convert.data.toggle_objects", "src/save_convert/data/toggle_objects.lua" },
|
||||
}
|
||||
|
||||
-- Yellow renumbers wEventFlags bits: pokeyellow's constants/event_constants.asm
|
||||
-- inserts events pokered does not have (the Jessie & James fights, catch
|
||||
-- training, the Officer Jenny Squirtle) and shifts the Mt Moon 3 / Silph Co
|
||||
-- 11F block, so writing a Yellow save through the Red table lands bits on the
|
||||
-- wrong events and drops every Yellow-only flag. Kept outside DATA_MODULES so
|
||||
-- the ensureData loop never loads it as a crosswalk of its own -- it
|
||||
-- substitutes for `eventFlags` when the caller names Yellow (#838).
|
||||
local YELLOW_EVENT_FLAGS = {
|
||||
"src.save_convert.data.event_flags_yellow",
|
||||
"src/save_convert/data/event_flags_yellow.lua",
|
||||
}
|
||||
|
||||
local function loadTable(requirePath, filePath)
|
||||
@@ -112,6 +125,9 @@ local function ensureData(gameVersion)
|
||||
local data = {}
|
||||
for name, spec in pairs(DATA_MODULES) do
|
||||
if name ~= "charmap" then
|
||||
if name == "eventFlags" and gameVersion == "yellow" then
|
||||
spec = YELLOW_EVENT_FLAGS -- Yellow's bit numbering differs (#838)
|
||||
end
|
||||
local mod = loadCacheTable(gameVersion, spec[2])
|
||||
if not mod then
|
||||
local e
|
||||
@@ -121,6 +137,10 @@ local function ensureData(gameVersion)
|
||||
data[name] = mod
|
||||
end
|
||||
end
|
||||
-- record which game's tables these are: the codec gates Yellow-only
|
||||
-- bytes (wPikachuFriendship) on it, since those offsets are map
|
||||
-- scratch in Red/Blue (#763, #838)
|
||||
data.gameVersion = gameVersion
|
||||
crosswalks[key] = data
|
||||
end
|
||||
if not charmapReady then
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,243 @@
|
||||
-- wToggleableObjectFlags bit index -> { map id, object_event name, default
|
||||
-- visible } for the Gen1 save codec (src/save_convert/GenSave.lua).
|
||||
-- Derived entry by entry from ../pokered/data/maps/toggleable_objects.asm
|
||||
-- (ToggleableObjectStates: three bytes per entry, blocks laid out in map-id
|
||||
-- order, so an entry's position in the table IS its wToggleableObjectFlags
|
||||
-- bit -- constants/toggle_constants.asm numbers the same list), with the
|
||||
-- default taken from each row's ON/OFF state. Bit set = hidden
|
||||
-- (engine/overworld/toggleable_objects.asm IsObjectHidden). Object names
|
||||
-- match data/generated/maps.lua object_event names one for one; the two
|
||||
-- placeholder bits with no object_event in this port stay as comments so
|
||||
-- the numbering remains auditable (#763, #857).
|
||||
return {
|
||||
byBit = {
|
||||
[0] = { "PALLET_TOWN", "PALLETTOWN_OAK", false },
|
||||
[1] = { "VIRIDIAN_CITY", "VIRIDIANCITY_OLD_MAN_SLEEPY", true },
|
||||
[2] = { "VIRIDIAN_CITY", "VIRIDIANCITY_OLD_MAN", false },
|
||||
[3] = { "PEWTER_CITY", "PEWTERCITY_SUPER_NERD1", true },
|
||||
[4] = { "PEWTER_CITY", "PEWTERCITY_YOUNGSTER", true },
|
||||
[5] = { "CERULEAN_CITY", "CERULEANCITY_RIVAL", false },
|
||||
[6] = { "CERULEAN_CITY", "CERULEANCITY_ROCKET", true },
|
||||
[7] = { "CERULEAN_CITY", "CERULEANCITY_GUARD1", false },
|
||||
[8] = { "CERULEAN_CITY", "CERULEANCITY_SUPER_NERD3", true },
|
||||
[9] = { "CERULEAN_CITY", "CERULEANCITY_GUARD2", true },
|
||||
[10] = { "SAFFRON_CITY", "SAFFRONCITY_ROCKET1", true },
|
||||
[11] = { "SAFFRON_CITY", "SAFFRONCITY_ROCKET2", true },
|
||||
[12] = { "SAFFRON_CITY", "SAFFRONCITY_ROCKET3", true },
|
||||
[13] = { "SAFFRON_CITY", "SAFFRONCITY_ROCKET4", true },
|
||||
[14] = { "SAFFRON_CITY", "SAFFRONCITY_ROCKET5", true },
|
||||
[15] = { "SAFFRON_CITY", "SAFFRONCITY_ROCKET6", true },
|
||||
[16] = { "SAFFRON_CITY", "SAFFRONCITY_ROCKET7", true },
|
||||
[17] = { "SAFFRON_CITY", "SAFFRONCITY_SCIENTIST", false },
|
||||
[18] = { "SAFFRON_CITY", "SAFFRONCITY_SILPH_WORKER_M", false },
|
||||
[19] = { "SAFFRON_CITY", "SAFFRONCITY_SILPH_WORKER_F", false },
|
||||
[20] = { "SAFFRON_CITY", "SAFFRONCITY_GENTLEMAN", false },
|
||||
[21] = { "SAFFRON_CITY", "SAFFRONCITY_PIDGEOT", false },
|
||||
[22] = { "SAFFRON_CITY", "SAFFRONCITY_ROCKER", false },
|
||||
[23] = { "SAFFRON_CITY", "SAFFRONCITY_ROCKET8", true },
|
||||
[24] = { "SAFFRON_CITY", "SAFFRONCITY_ROCKET9", false },
|
||||
[25] = { "ROUTE_2", "ROUTE2_MOON_STONE", true },
|
||||
[26] = { "ROUTE_2", "ROUTE2_HP_UP", true },
|
||||
[27] = { "ROUTE_4", "ROUTE4_TM_WHIRLWIND", true },
|
||||
[28] = { "ROUTE_9", "ROUTE9_TM_TELEPORT", true },
|
||||
[29] = { "ROUTE_12", "ROUTE12_SNORLAX", true },
|
||||
[30] = { "ROUTE_12", "ROUTE12_TM_PAY_DAY", true },
|
||||
[31] = { "ROUTE_12", "ROUTE12_IRON", true },
|
||||
[32] = { "ROUTE_15", "ROUTE15_TM_RAGE", true },
|
||||
[33] = { "ROUTE_16", "ROUTE16_SNORLAX", true },
|
||||
[34] = { "ROUTE_22", "ROUTE22_RIVAL1", false },
|
||||
[35] = { "ROUTE_22", "ROUTE22_RIVAL2", false },
|
||||
[36] = { "ROUTE_24", "ROUTE24_COOLTRAINER_M1", true },
|
||||
[37] = { "ROUTE_24", "ROUTE24_TM_THUNDER_WAVE", true },
|
||||
[38] = { "ROUTE_25", "ROUTE25_TM_SEISMIC_TOSS", true },
|
||||
[39] = { "BLUES_HOUSE", "BLUESHOUSE_DAISY1", true },
|
||||
[40] = { "BLUES_HOUSE", "BLUESHOUSE_DAISY2", false },
|
||||
[41] = { "BLUES_HOUSE", "BLUESHOUSE_TOWN_MAP", true },
|
||||
[42] = { "OAKS_LAB", "OAKSLAB_RIVAL", true },
|
||||
[43] = { "OAKS_LAB", "OAKSLAB_CHARMANDER_POKE_BALL", true },
|
||||
[44] = { "OAKS_LAB", "OAKSLAB_SQUIRTLE_POKE_BALL", true },
|
||||
[45] = { "OAKS_LAB", "OAKSLAB_BULBASAUR_POKE_BALL", true },
|
||||
[46] = { "OAKS_LAB", "OAKSLAB_OAK1", false },
|
||||
[47] = { "OAKS_LAB", "OAKSLAB_POKEDEX1", true },
|
||||
[48] = { "OAKS_LAB", "OAKSLAB_POKEDEX2", true },
|
||||
[49] = { "OAKS_LAB", "OAKSLAB_OAK2", false },
|
||||
[50] = { "VIRIDIAN_GYM", "VIRIDIANGYM_GIOVANNI", true },
|
||||
[51] = { "VIRIDIAN_GYM", "VIRIDIANGYM_REVIVE", true },
|
||||
[52] = { "MUSEUM_1F", "MUSEUM1F_OLD_AMBER", true },
|
||||
[53] = { "CERULEAN_CAVE_1F", "CERULEANCAVE1F_FULL_RESTORE", true },
|
||||
[54] = { "CERULEAN_CAVE_1F", "CERULEANCAVE1F_MAX_ELIXER", true },
|
||||
[55] = { "CERULEAN_CAVE_1F", "CERULEANCAVE1F_NUGGET", true },
|
||||
[56] = { "POKEMON_TOWER_2F", "POKEMONTOWER2F_RIVAL", true },
|
||||
[57] = { "POKEMON_TOWER_3F", "POKEMONTOWER3F_ESCAPE_ROPE", true },
|
||||
[58] = { "POKEMON_TOWER_4F", "POKEMONTOWER4F_ELIXER", true },
|
||||
[59] = { "POKEMON_TOWER_4F", "POKEMONTOWER4F_AWAKENING", true },
|
||||
[60] = { "POKEMON_TOWER_4F", "POKEMONTOWER4F_HP_UP", true },
|
||||
[61] = { "POKEMON_TOWER_5F", "POKEMONTOWER5F_NUGGET", true },
|
||||
[62] = { "POKEMON_TOWER_6F", "POKEMONTOWER6F_RARE_CANDY", true },
|
||||
[63] = { "POKEMON_TOWER_6F", "POKEMONTOWER6F_X_ACCURACY", true },
|
||||
[64] = { "POKEMON_TOWER_7F", "POKEMONTOWER7F_ROCKET1", true },
|
||||
[65] = { "POKEMON_TOWER_7F", "POKEMONTOWER7F_ROCKET2", true },
|
||||
[66] = { "POKEMON_TOWER_7F", "POKEMONTOWER7F_ROCKET3", true },
|
||||
[67] = { "POKEMON_TOWER_7F", "POKEMONTOWER7F_MR_FUJI", true },
|
||||
[68] = { "MR_FUJIS_HOUSE", "MRFUJISHOUSE_MR_FUJI", false },
|
||||
[69] = { "CELADON_MANSION_ROOF_HOUSE", "CELADONMANSION_ROOF_HOUSE_EEVEE_POKEBALL", true },
|
||||
[70] = { "GAME_CORNER", "GAMECORNER_ROCKET", true },
|
||||
[71] = { "WARDENS_HOUSE", "WARDENSHOUSE_RARE_CANDY", true },
|
||||
[72] = { "POKEMON_MANSION_1F", "POKEMONMANSION1F_ESCAPE_ROPE", true },
|
||||
[73] = { "POKEMON_MANSION_1F", "POKEMONMANSION1F_CARBOS", true },
|
||||
[74] = { "FIGHTING_DOJO", "FIGHTINGDOJO_HITMONLEE_POKE_BALL", true },
|
||||
[75] = { "FIGHTING_DOJO", "FIGHTINGDOJO_HITMONCHAN_POKE_BALL", true },
|
||||
[76] = { "SILPH_CO_1F", "SILPHCO1F_LINK_RECEPTIONIST", false },
|
||||
[77] = { "POWER_PLANT", "POWERPLANT_VOLTORB1", true },
|
||||
[78] = { "POWER_PLANT", "POWERPLANT_VOLTORB2", true },
|
||||
[79] = { "POWER_PLANT", "POWERPLANT_VOLTORB3", true },
|
||||
[80] = { "POWER_PLANT", "POWERPLANT_ELECTRODE1", true },
|
||||
[81] = { "POWER_PLANT", "POWERPLANT_VOLTORB4", true },
|
||||
[82] = { "POWER_PLANT", "POWERPLANT_VOLTORB5", true },
|
||||
[83] = { "POWER_PLANT", "POWERPLANT_ELECTRODE2", true },
|
||||
[84] = { "POWER_PLANT", "POWERPLANT_VOLTORB6", true },
|
||||
[85] = { "POWER_PLANT", "POWERPLANT_ZAPDOS", true },
|
||||
[86] = { "POWER_PLANT", "POWERPLANT_CARBOS", true },
|
||||
[87] = { "POWER_PLANT", "POWERPLANT_HP_UP", true },
|
||||
[88] = { "POWER_PLANT", "POWERPLANT_RARE_CANDY", true },
|
||||
[89] = { "POWER_PLANT", "POWERPLANT_TM_THUNDER", true },
|
||||
[90] = { "POWER_PLANT", "POWERPLANT_TM_REFLECT", true },
|
||||
[91] = { "VICTORY_ROAD_2F", "VICTORYROAD2F_MOLTRES", true },
|
||||
[92] = { "VICTORY_ROAD_2F", "VICTORYROAD2F_TM_SUBMISSION", true },
|
||||
[93] = { "VICTORY_ROAD_2F", "VICTORYROAD2F_FULL_HEAL", true },
|
||||
[94] = { "VICTORY_ROAD_2F", "VICTORYROAD2F_TM_MEGA_KICK", true },
|
||||
[95] = { "VICTORY_ROAD_2F", "VICTORYROAD2F_GUARD_SPEC", true },
|
||||
[96] = { "VICTORY_ROAD_2F", "VICTORYROAD2F_BOULDER3", true },
|
||||
[97] = { "BILLS_HOUSE", "BILLSHOUSE_BILL_POKEMON", true },
|
||||
[98] = { "BILLS_HOUSE", "BILLSHOUSE_BILL1", false },
|
||||
[99] = { "BILLS_HOUSE", "BILLSHOUSE_BILL2", false },
|
||||
[100] = { "VIRIDIAN_FOREST", "VIRIDIANFOREST_ANTIDOTE", true },
|
||||
[101] = { "VIRIDIAN_FOREST", "VIRIDIANFOREST_POTION", true },
|
||||
[102] = { "VIRIDIAN_FOREST", "VIRIDIANFOREST_POKE_BALL", true },
|
||||
[103] = { "MT_MOON_1F", "MTMOON1F_POTION1", true },
|
||||
[104] = { "MT_MOON_1F", "MTMOON1F_MOON_STONE", true },
|
||||
[105] = { "MT_MOON_1F", "MTMOON1F_RARE_CANDY", true },
|
||||
[106] = { "MT_MOON_1F", "MTMOON1F_ESCAPE_ROPE", true },
|
||||
[107] = { "MT_MOON_1F", "MTMOON1F_POTION2", true },
|
||||
[108] = { "MT_MOON_1F", "MTMOON1F_TM_WATER_GUN", true },
|
||||
[109] = { "MT_MOON_B2F", "MTMOONB2F_DOME_FOSSIL", true },
|
||||
[110] = { "MT_MOON_B2F", "MTMOONB2F_HELIX_FOSSIL", true },
|
||||
[111] = { "MT_MOON_B2F", "MTMOONB2F_HP_UP", true },
|
||||
[112] = { "MT_MOON_B2F", "MTMOONB2F_TM_MEGA_PUNCH", true },
|
||||
[113] = { "SS_ANNE_2F", "SSANNE2F_RIVAL", false },
|
||||
[114] = { "SS_ANNE_1F_ROOMS", "SSANNE1FROOMS_TM_BODY_SLAM", true },
|
||||
[115] = { "SS_ANNE_2F_ROOMS", "SSANNE2FROOMS_MAX_ETHER", true },
|
||||
[116] = { "SS_ANNE_2F_ROOMS", "SSANNE2FROOMS_RARE_CANDY", true },
|
||||
[117] = { "SS_ANNE_B1F_ROOMS", "SSANNEB1FROOMS_ETHER", true },
|
||||
[118] = { "SS_ANNE_B1F_ROOMS", "SSANNEB1FROOMS_TM_REST", true },
|
||||
[119] = { "SS_ANNE_B1F_ROOMS", "SSANNEB1FROOMS_MAX_POTION", true },
|
||||
[120] = { "VICTORY_ROAD_3F", "VICTORYROAD3F_MAX_REVIVE", true },
|
||||
[121] = { "VICTORY_ROAD_3F", "VICTORYROAD3F_TM_EXPLOSION", true },
|
||||
[122] = { "VICTORY_ROAD_3F", "VICTORYROAD3F_BOULDER4", true },
|
||||
[123] = { "ROCKET_HIDEOUT_B1F", "ROCKETHIDEOUTB1F_ESCAPE_ROPE", true },
|
||||
[124] = { "ROCKET_HIDEOUT_B1F", "ROCKETHIDEOUTB1F_HYPER_POTION", true },
|
||||
[125] = { "ROCKET_HIDEOUT_B2F", "ROCKETHIDEOUTB2F_MOON_STONE", true },
|
||||
[126] = { "ROCKET_HIDEOUT_B2F", "ROCKETHIDEOUTB2F_NUGGET", true },
|
||||
[127] = { "ROCKET_HIDEOUT_B2F", "ROCKETHIDEOUTB2F_TM_HORN_DRILL", true },
|
||||
[128] = { "ROCKET_HIDEOUT_B2F", "ROCKETHIDEOUTB2F_SUPER_POTION", true },
|
||||
[129] = { "ROCKET_HIDEOUT_B3F", "ROCKETHIDEOUTB3F_TM_DOUBLE_EDGE", true },
|
||||
[130] = { "ROCKET_HIDEOUT_B3F", "ROCKETHIDEOUTB3F_RARE_CANDY", true },
|
||||
[131] = { "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_GIOVANNI", true },
|
||||
[132] = { "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_HP_UP", true },
|
||||
[133] = { "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_TM_RAZOR_WIND", true },
|
||||
[134] = { "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_IRON", true },
|
||||
[135] = { "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_SILPH_SCOPE", false },
|
||||
[136] = { "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_LIFT_KEY", false },
|
||||
[137] = { "SILPH_CO_2F", "SILPHCO2F_SILPH_WORKER_F", true },
|
||||
[138] = { "SILPH_CO_2F", "SILPHCO2F_SCIENTIST1", true },
|
||||
[139] = { "SILPH_CO_2F", "SILPHCO2F_SCIENTIST2", true },
|
||||
[140] = { "SILPH_CO_2F", "SILPHCO2F_ROCKET1", true },
|
||||
[141] = { "SILPH_CO_2F", "SILPHCO2F_ROCKET2", true },
|
||||
[142] = { "SILPH_CO_3F", "SILPHCO3F_ROCKET", true },
|
||||
[143] = { "SILPH_CO_3F", "SILPHCO3F_SCIENTIST", true },
|
||||
[144] = { "SILPH_CO_3F", "SILPHCO3F_HYPER_POTION", true },
|
||||
[145] = { "SILPH_CO_4F", "SILPHCO4F_ROCKET1", true },
|
||||
[146] = { "SILPH_CO_4F", "SILPHCO4F_SCIENTIST", true },
|
||||
[147] = { "SILPH_CO_4F", "SILPHCO4F_ROCKET2", true },
|
||||
[148] = { "SILPH_CO_4F", "SILPHCO4F_FULL_HEAL", true },
|
||||
[149] = { "SILPH_CO_4F", "SILPHCO4F_MAX_REVIVE", true },
|
||||
[150] = { "SILPH_CO_4F", "SILPHCO4F_ESCAPE_ROPE", true },
|
||||
[151] = { "SILPH_CO_5F", "SILPHCO5F_ROCKET1", true },
|
||||
[152] = { "SILPH_CO_5F", "SILPHCO5F_SCIENTIST", true },
|
||||
[153] = { "SILPH_CO_5F", "SILPHCO5F_ROCKER", true },
|
||||
[154] = { "SILPH_CO_5F", "SILPHCO5F_ROCKET2", true },
|
||||
[155] = { "SILPH_CO_5F", "SILPHCO5F_TM_TAKE_DOWN", true },
|
||||
[156] = { "SILPH_CO_5F", "SILPHCO5F_PROTEIN", true },
|
||||
[157] = { "SILPH_CO_5F", "SILPHCO5F_CARD_KEY", true },
|
||||
[158] = { "SILPH_CO_6F", "SILPHCO6F_ROCKET1", true },
|
||||
[159] = { "SILPH_CO_6F", "SILPHCO6F_SCIENTIST", true },
|
||||
[160] = { "SILPH_CO_6F", "SILPHCO6F_ROCKET2", true },
|
||||
[161] = { "SILPH_CO_6F", "SILPHCO6F_HP_UP", true },
|
||||
[162] = { "SILPH_CO_6F", "SILPHCO6F_X_ACCURACY", true },
|
||||
[163] = { "SILPH_CO_7F", "SILPHCO7F_ROCKET1", true },
|
||||
[164] = { "SILPH_CO_7F", "SILPHCO7F_SCIENTIST", true },
|
||||
[165] = { "SILPH_CO_7F", "SILPHCO7F_ROCKET2", true },
|
||||
[166] = { "SILPH_CO_7F", "SILPHCO7F_ROCKET3", true },
|
||||
[167] = { "SILPH_CO_7F", "SILPHCO7F_RIVAL", true },
|
||||
[168] = { "SILPH_CO_7F", "SILPHCO7F_CALCIUM", true },
|
||||
[169] = { "SILPH_CO_7F", "SILPHCO7F_TM_SWORDS_DANCE", true },
|
||||
-- [170] SILPH_CO_7F (SILPHCO7F_UNUSED): placeholder entry, no object_event in this port
|
||||
[171] = { "SILPH_CO_8F", "SILPHCO8F_ROCKET1", true },
|
||||
[172] = { "SILPH_CO_8F", "SILPHCO8F_SCIENTIST", true },
|
||||
[173] = { "SILPH_CO_8F", "SILPHCO8F_ROCKET2", true },
|
||||
[174] = { "SILPH_CO_9F", "SILPHCO9F_ROCKET1", true },
|
||||
[175] = { "SILPH_CO_9F", "SILPHCO9F_SCIENTIST", true },
|
||||
[176] = { "SILPH_CO_9F", "SILPHCO9F_ROCKET2", true },
|
||||
[177] = { "SILPH_CO_10F", "SILPHCO10F_ROCKET", true },
|
||||
[178] = { "SILPH_CO_10F", "SILPHCO10F_SCIENTIST", true },
|
||||
[179] = { "SILPH_CO_10F", "SILPHCO10F_SILPH_WORKER_F", true },
|
||||
[180] = { "SILPH_CO_10F", "SILPHCO10F_TM_EARTHQUAKE", true },
|
||||
[181] = { "SILPH_CO_10F", "SILPHCO10F_RARE_CANDY", true },
|
||||
[182] = { "SILPH_CO_10F", "SILPHCO10F_CARBOS", true },
|
||||
[183] = { "SILPH_CO_11F", "SILPHCO11F_GIOVANNI", true },
|
||||
[184] = { "SILPH_CO_11F", "SILPHCO11F_ROCKET1", true },
|
||||
[185] = { "SILPH_CO_11F", "SILPHCO11F_ROCKET2", true },
|
||||
-- [186] UNUSED_MAP_F4 ($02): placeholder entry, no object_event in this port
|
||||
[187] = { "POKEMON_MANSION_2F", "POKEMONMANSION2F_CALCIUM", true },
|
||||
[188] = { "POKEMON_MANSION_3F", "POKEMONMANSION3F_MAX_POTION", true },
|
||||
[189] = { "POKEMON_MANSION_3F", "POKEMONMANSION3F_IRON", true },
|
||||
[190] = { "POKEMON_MANSION_B1F", "POKEMONMANSIONB1F_RARE_CANDY", true },
|
||||
[191] = { "POKEMON_MANSION_B1F", "POKEMONMANSIONB1F_FULL_RESTORE", true },
|
||||
[192] = { "POKEMON_MANSION_B1F", "POKEMONMANSIONB1F_TM_BLIZZARD", true },
|
||||
[193] = { "POKEMON_MANSION_B1F", "POKEMONMANSIONB1F_TM_SOLARBEAM", true },
|
||||
[194] = { "POKEMON_MANSION_B1F", "POKEMONMANSIONB1F_SECRET_KEY", true },
|
||||
[195] = { "SAFARI_ZONE_EAST", "SAFARIZONEEAST_FULL_RESTORE", true },
|
||||
[196] = { "SAFARI_ZONE_EAST", "SAFARIZONEEAST_MAX_RESTORE", true },
|
||||
[197] = { "SAFARI_ZONE_EAST", "SAFARIZONEEAST_CARBOS", true },
|
||||
[198] = { "SAFARI_ZONE_EAST", "SAFARIZONEEAST_TM_EGG_BOMB", true },
|
||||
[199] = { "SAFARI_ZONE_NORTH", "SAFARIZONENORTH_PROTEIN", true },
|
||||
[200] = { "SAFARI_ZONE_NORTH", "SAFARIZONENORTH_TM_SKULL_BASH", true },
|
||||
[201] = { "SAFARI_ZONE_WEST", "SAFARIZONEWEST_MAX_POTION", true },
|
||||
[202] = { "SAFARI_ZONE_WEST", "SAFARIZONEWEST_TM_DOUBLE_TEAM", true },
|
||||
[203] = { "SAFARI_ZONE_WEST", "SAFARIZONEWEST_MAX_REVIVE", true },
|
||||
[204] = { "SAFARI_ZONE_WEST", "SAFARIZONEWEST_GOLD_TEETH", true },
|
||||
[205] = { "SAFARI_ZONE_CENTER", "SAFARIZONECENTER_NUGGET", true },
|
||||
[206] = { "CERULEAN_CAVE_2F", "CERULEANCAVE2F_PP_UP", true },
|
||||
[207] = { "CERULEAN_CAVE_2F", "CERULEANCAVE2F_ULTRA_BALL", true },
|
||||
[208] = { "CERULEAN_CAVE_2F", "CERULEANCAVE2F_FULL_RESTORE", true },
|
||||
[209] = { "CERULEAN_CAVE_B1F", "CERULEANCAVEB1F_MEWTWO", true },
|
||||
[210] = { "CERULEAN_CAVE_B1F", "CERULEANCAVEB1F_ULTRA_BALL", true },
|
||||
[211] = { "CERULEAN_CAVE_B1F", "CERULEANCAVEB1F_MAX_REVIVE", true },
|
||||
[212] = { "VICTORY_ROAD_1F", "VICTORYROAD1F_TM_SKY_ATTACK", true },
|
||||
[213] = { "VICTORY_ROAD_1F", "VICTORYROAD1F_RARE_CANDY", true },
|
||||
[214] = { "CHAMPIONS_ROOM", "CHAMPIONSROOM_OAK", false },
|
||||
[215] = { "SEAFOAM_ISLANDS_1F", "SEAFOAMISLANDS1F_BOULDER1", true },
|
||||
[216] = { "SEAFOAM_ISLANDS_1F", "SEAFOAMISLANDS1F_BOULDER2", true },
|
||||
[217] = { "SEAFOAM_ISLANDS_B1F", "SEAFOAMISLANDSB1F_BOULDER1", false },
|
||||
[218] = { "SEAFOAM_ISLANDS_B1F", "SEAFOAMISLANDSB1F_BOULDER2", false },
|
||||
[219] = { "SEAFOAM_ISLANDS_B2F", "SEAFOAMISLANDSB2F_BOULDER1", false },
|
||||
[220] = { "SEAFOAM_ISLANDS_B2F", "SEAFOAMISLANDSB2F_BOULDER2", false },
|
||||
[221] = { "SEAFOAM_ISLANDS_B3F", "SEAFOAMISLANDSB3F_BOULDER2", true },
|
||||
[222] = { "SEAFOAM_ISLANDS_B3F", "SEAFOAMISLANDSB3F_BOULDER3", true },
|
||||
[223] = { "SEAFOAM_ISLANDS_B3F", "SEAFOAMISLANDSB3F_BOULDER5", false },
|
||||
[224] = { "SEAFOAM_ISLANDS_B3F", "SEAFOAMISLANDSB3F_BOULDER6", false },
|
||||
[225] = { "SEAFOAM_ISLANDS_B4F", "SEAFOAMISLANDSB4F_BOULDER1", false },
|
||||
[226] = { "SEAFOAM_ISLANDS_B4F", "SEAFOAMISLANDSB4F_BOULDER2", false },
|
||||
[227] = { "SEAFOAM_ISLANDS_B4F", "SEAFOAMISLANDSB4F_ARTICUNO", true },
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user