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:
bryanthaboi
2026-08-05 16:36:37 -04:00
parent f56970350a
commit e2820e02c5
36 changed files with 4046 additions and 64 deletions
+88
View File
@@ -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 = {}
+20
View File
@@ -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
+243
View File
@@ -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 },
},
}