Merge branch 'porymap-6' into generate-map-constants

This commit is contained in:
GriffinR 2024-12-17 20:48:28 -05:00 committed by GitHub
commit 587d494421
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
101 changed files with 822 additions and 986 deletions

110
Makefile
View File

@ -150,12 +150,20 @@ ifneq (,$(MAKECMDGOALS))
endif
endif
.SHELLSTATUS ?= 0
ifeq ($(SETUP_PREREQS),1)
# If set on: Default target or a rule requiring a scan
# Forcibly execute `make tools` since we need them for what we are doing.
$(call infoshell, $(MAKE) -f make_tools.mk)
$(foreach line, $(shell $(MAKE) -f make_tools.mk | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line))))
ifneq ($(.SHELLSTATUS),0)
$(error Errors occurred while building tools. See error messages above for more details)
endif
# Oh and also generate mapjson sources before we use `SCANINC`.
$(call infoshell, $(MAKE) generated)
$(foreach line, $(shell $(MAKE) generated | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line))))
ifneq ($(.SHELLSTATUS),0)
$(error Errors occurred while generating map-related sources. See error messages above for more details)
endif
endif
# Collect sources
@ -237,7 +245,10 @@ include spritesheet_rules.mk
include json_data_rules.mk
include audio_rules.mk
# NOTE: Tools must have been built prior (FIXME)
# so you can't really call this rule directly
generated: $(AUTO_GEN_TARGETS)
@: # Silence the "Nothing to be done for `generated'" message, which some people were confusing for an error.
%.s: ;
%.png: ;
@ -252,8 +263,6 @@ generated: $(AUTO_GEN_TARGETS)
%.lz: % ; $(GFX) $< $@
%.rl: % ; $(GFX) $< $@
# NOTE: Tools must have been built prior (FIXME)
generated: tools $(AUTO_GEN_TARGETS)
clean-generated:
@rm -f $(AUTO_GEN_TARGETS)
@echo "rm -f <AUTO_GEN_TARGETS>"
@ -288,71 +297,52 @@ endif
# As a side effect, they're evaluated immediately instead of when the rule is invoked.
# It doesn't look like $(shell) can be deferred so there might not be a better way (Icedude_907: there is soon).
# For C dependencies.
# Args: $1 = Output file without extension (build/assets/src/data), $2 = Input file (src/data.c)
define C_DEP
$(call C_DEP_IMPL,$1,$2,$1)
endef
# Internal implementation details.
# $1: Output file without extension, $2 input file, $3 temp path (if keeping)
define C_DEP_IMPL
$1.o: $2
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.c
ifneq ($(KEEP_TEMPS),1)
@echo "$$(CC1) <flags> -o $$@ $$<"
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) -i $$< charmap.txt | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
@echo "$(CC1) <flags> -o $@ $<"
@$(CPP) $(CPPFLAGS) $< | $(PREPROC) -i $< charmap.txt | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
else
@$$(CPP) $$(CPPFLAGS) $$< -o $3.i
@$$(PREPROC) $3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $3.s
@echo -e ".text\n\t.align\t2, 0 @ Don't pad with nop\n" >> $3.s
$$(AS) $$(ASFLAGS) -o $$@ $3.s
@$(CPP) $(CPPFLAGS) $< -o $*.i
@$(PREPROC) $*.i charmap.txt | $(CC1) $(CFLAGS) -o $*.s
@echo -e ".text\n\t.align\t2, 0\n" >> $*.s
$(AS) $(ASFLAGS) -o $@ $*.s
endif
$1.d: $2
$(SCANINC) -M $1.d $(INCLUDE_SCANINC_ARGS) -I tools/agbcc/include $2
$(C_BUILDDIR)/%.d: $(C_SUBDIR)/%.c
$(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I tools/agbcc/include $<
ifneq ($(NODEP),1)
$1.o: $1.d
-include $1.d
endif
endef
# Create generic rules if no dependency scanning, else create the real rules
ifeq ($(NODEP),1)
$(eval $(call C_DEP,$(C_BUILDDIR)/%,$(C_SUBDIR)/%.c))
else
$(foreach src,$(C_SRCS),$(eval $(call C_DEP,$(OBJ_DIR)/$(basename $(src)),$(src))))
-include $(addprefix $(OBJ_DIR)/,$(C_SRCS:.c=.d))
endif
# Similar methodology for Assembly files
# $1: Output path without extension, $2: Input file (`*.s`)
define ASM_DEP
$1.o: $2
$$(AS) $$(ASFLAGS) -o $$@ $$<
$(call ASM_SCANINC,$1,$2)
endef
# As above but first doing a preprocessor pass
define ASM_DEP_PREPROC
$1.o: $2
$$(PREPROC) $$< charmap.txt | $$(CPP) $(INCLUDE_SCANINC_ARGS) - | $$(PREPROC) -ie $$< charmap.txt | $$(AS) $$(ASFLAGS) -o $$@
$(call ASM_SCANINC,$1,$2)
endef
$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s
$(AS) $(ASFLAGS) -o $@ $<
$(ASM_BUILDDIR)/%.d: $(ASM_SUBDIR)/%.s
$(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I "" $<
define ASM_SCANINC
ifneq ($(NODEP),1)
$1.o: $1.d
$1.d: $2
$(SCANINC) -M $1.d $(INCLUDE_SCANINC_ARGS) -I "" $2
-include $1.d
-include $(addprefix $(OBJ_DIR)/,$(ASM_SRCS:.s=.d))
endif
endef
# Dummy rules or real rules
ifeq ($(NODEP),1)
$(eval $(call ASM_DEP,$(ASM_BUILDDIR)/%,$(ASM_SUBDIR)/%.s))
$(eval $(call ASM_DEP_PREPROC,$(C_BUILDDIR)/%,$(C_SUBDIR)/%.s))
$(eval $(call ASM_DEP_PREPROC,$(DATA_ASM_BUILDDIR)/%,$(DATA_ASM_SUBDIR)/%.s))
else
$(foreach src, $(ASM_SRCS), $(eval $(call ASM_DEP,$(src:%.s=$(OBJ_DIR)/%),$(src))))
$(foreach src, $(C_ASM_SRCS), $(eval $(call ASM_DEP_PREPROC,$(src:%.s=$(OBJ_DIR)/%),$(src))))
$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call ASM_DEP_PREPROC,$(src:%.s=$(OBJ_DIR)/%),$(src))))
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s
$(PREPROC) $< charmap.txt | $(CPP) $(INCLUDE_SCANINC_ARGS) - | $(PREPROC) -ie $< charmap.txt | $(AS) $(ASFLAGS) -o $@
$(C_BUILDDIR)/%.d: $(C_SUBDIR)/%.s
$(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I "" $<
ifneq ($(NODEP),1)
-include $(addprefix $(OBJ_DIR)/,$(C_ASM_SRCS:.s=.d))
endif
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s
$(PREPROC) $< charmap.txt | $(CPP) $(INCLUDE_SCANINC_ARGS) - | $(PREPROC) -ie $< charmap.txt | $(AS) $(ASFLAGS) -o $@
$(DATA_ASM_BUILDDIR)/%.d: $(DATA_ASM_SUBDIR)/%.s
$(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I "" $<
ifneq ($(NODEP),1)
-include $(addprefix $(OBJ_DIR)/,$(REGULAR_DATA_ASM_SRCS:.s=.d))
endif
$(OBJ_DIR)/sym_bss.ld: sym_bss.txt
@ -376,8 +366,10 @@ endif
# Final rules
# Elf from object files
LDFLAGS = -Map ../../$(MAP)
$(ELF): $(LD_SCRIPT) $(LD_SCRIPT_DEPS) $(OBJS)
@cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat
@echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ <objs> <libs> | cat"
$(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(GAME_REVISION) --silent
# Builds the rom from the elf file

View File

@ -1 +0,0 @@
lman

View File

@ -1,10 +0,0 @@
gFlashTimeoutFlag
PollFlashStatus
WaitForFlashWrite
ProgramFlashSector
gFlash
ProgramFlashByte
gFlashNumRemainingBytes
EraseFlashChip
EraseFlashSector
gFlashMaxTime

View File

@ -1,3 +0,0 @@
gMonShrinkDuration
gMonShrinkDelta
gMonShrinkDistance

View File

@ -1 +0,0 @@
gPokedudeBattlerStates

View File

@ -1,9 +0,0 @@
gPreBattleCallback1
gBattleMainFunc
gBattleResults
gLeveledUpInBattle
gBattlerControllerFuncs
gHealthboxSpriteIds
gMultiUsePlayerCursor
gNumberOfMovesToChoose
gBattleControllerData

View File

@ -1,4 +0,0 @@
gMultibootStart
gMultibootStatus
gMultibootSize
gMultibootParam

View File

@ -1 +0,0 @@
gWindowTileAutoAllocEnabled

View File

@ -1 +0,0 @@
UnusedVarNeededToMatch

View File

@ -1 +0,0 @@
gEReaderData

View File

@ -1 +0,0 @@
gLastQuestLogStoredFlagOrVarIdx

View File

@ -1 +0,0 @@
gCB2_AfterEvolution

View File

@ -1,2 +0,0 @@
gFameChecker_ListMenuTemplate
gIconDescriptionBoxIsOpen

View File

@ -1,3 +0,0 @@
gFieldCamera
gTotalCameraPixelOffsetY
gTotalCameraPixelOffsetX

View File

@ -1 +0,0 @@
gFieldInputRecord

View File

@ -1,2 +0,0 @@
sFieldSpecialsListMenuTemplate
sFieldSpecialsListMenuScrollBuffer

View File

@ -1 +0,0 @@
VMap

View File

@ -1,2 +0,0 @@
gHelpSystemState
gHelpContextIdBackup

View File

@ -1 +0,0 @@
gHelpSystemEnabled

View File

@ -1,10 +0,0 @@
gCanvasColumnStart
gCanvasPixels
gCanvasRowEnd
gCanvasHeight
gCanvasColumnEnd
gCanvasRowStart
gCanvasMonPersonality
gCanvasWidth
gCanvasPalette
gCanvasPaletteStart

View File

@ -1,5 +0,0 @@
gRfuSlotStatusUNI
gRfuSlotStatusNI
gRfuLinkStatus
gRfuStatic
gRfuFixed

View File

@ -1 +0,0 @@
gRfuSIO32Id

View File

@ -1 +0,0 @@
gSTWIStatus

View File

@ -1,35 +0,0 @@
gLinkPartnersHeldKeys
gLinkDebugSeed
gLocalLinkPlayerBlock
gLinkErrorOccurred
gLinkDebugFlags
gLinkFiller1
gRemoteLinkPlayersNotReceived
gBlockReceivedStatus
gLinkFiller2
gLinkHeldKeys
gRecvCmds
gLinkStatus
gLinkDummy1
gLinkDummy2
gReadyToExitStandby
gReadyToCloseLink
gReadyCloseLinkType
gSuppressLinkErrorMessage
gWirelessCommType
gSavedLinkPlayerCount
gSendCmd
gSavedMultiplayerId
gReceivedRemoteLinkPlayers
gLinkTestBGInfo
gLinkCallback
gShouldAdvanceLinkState
gLinkTestBlockChecksums
gBlockRequestType
gLinkFiller3
gLinkFiller4
gLinkFiller5
gLastSendQueueCount
gLink
gLastRecvQueueCount
gLinkSavedIme

View File

@ -1,3 +0,0 @@
gHostRfuGameData
gRfu
gHostRfuUsername

View File

@ -1,2 +0,0 @@
gListMenuOverride
gMultiuseListMenuTemplate

View File

@ -1,4 +0,0 @@
gFlashMemoryPresent
gSaveBlock1Ptr
gSaveBlock2Ptr
gPokemonStoragePtr

View File

@ -1,12 +0,0 @@
gSoundInfo
gPokemonCrySongs
gPokemonCryMusicPlayers
gMPlayJumpTable
gCgbChans
gPokemonCryTracks
gPokemonCrySong
gMPlayInfo_BGM
gMPlayInfo_SE1
gMPlayInfo_SE2
gMPlayMemAccArea
gMPlayInfo_SE3

View File

@ -1,12 +0,0 @@
gKeyRepeatStartDelay
gLinkTransferringData
gMain
gKeyRepeatContinueDelay
gSoftResetDisabled
gIntrTable
sVcountAfterSound
gLinkVSyncDisabled
IntrMain_Buffer
sVcountAtIntr
sVcountBeforeSound
gPcmDmaCounter

View File

@ -1,8 +0,0 @@
gBGTilemapBuffers1
gBGTilemapBuffers2
gBGTilemapBuffers3
gFieldCallback
gFieldCallback2
gHeldKeyCodeToSend
gLocalLinkPlayerId
gFieldLinkPlayerCount

View File

@ -1 +0,0 @@
gItemUseCB

View File

@ -1,4 +0,0 @@
gQuestLogPlaybackState
sMaxActionsInScene
gQuestLogFieldInput
sCurSceneActions

View File

@ -1 +0,0 @@
gRngValue

View File

@ -1,12 +0,0 @@
gLastWrittenSector
gLastSaveCounter
gLastKnownGoodSector
gDamagedSaveSectors
gSaveCounter
gSaveDataBufferPtr
gIncrementalSectorId
gSaveUnusedVar
gSaveFileStatus
gGameContinueCallback
gRamSaveSectorLocations
gSaveAttemptStatus

View File

@ -1 +0,0 @@
sIsInSaveFailedScreen

View File

@ -1,2 +0,0 @@
sQuestLogScriptContextPtr
gSelectedObjectEvent

View File

@ -1 +0,0 @@
gDisableMusic

View File

@ -1,2 +0,0 @@
gOamMatrixAllocBitmap
gReservedSpritePaletteCount

View File

@ -1 +0,0 @@
gTasks

View File

@ -1 +0,0 @@
gTextFlags

View File

@ -1,2 +0,0 @@
gFonts
gGlyphInfo

View File

@ -1,2 +0,0 @@
gWindowClearTile
gWindowBgTilemapBuffers

View File

@ -1,4 +1,5 @@
# Will be moved to build/ eventually
map_groups.h
layouts.h
region_map_sections.h
map_event_ids.h

View File

@ -1,214 +0,0 @@
#ifndef GUARD_CONSTANTS_REGION_MAP_SECTIONS_H
#define GUARD_CONSTANTS_REGION_MAP_SECTIONS_H
#define MAPSEC_LITTLEROOT_TOWN 0x00
#define MAPSEC_OLDALE_TOWN 0x01
#define MAPSEC_DEWFORD_TOWN 0x02
#define MAPSEC_LAVARIDGE_TOWN 0x03
#define MAPSEC_FALLARBOR_TOWN 0x04
#define MAPSEC_VERDANTURF_TOWN 0x05
#define MAPSEC_PACIFIDLOG_TOWN 0x06
#define MAPSEC_PETALBURG_CITY 0x07
#define MAPSEC_SLATEPORT_CITY 0x08
#define MAPSEC_MAUVILLE_CITY 0x09
#define MAPSEC_RUSTBORO_CITY 0x0A
#define MAPSEC_FORTREE_CITY 0x0B
#define MAPSEC_LILYCOVE_CITY 0x0C
#define MAPSEC_MOSSDEEP_CITY 0x0D
#define MAPSEC_SOOTOPOLIS_CITY 0x0E
#define MAPSEC_EVER_GRANDE_CITY 0x0F
#define MAPSEC_ROUTE_101 0x10
#define MAPSEC_ROUTE_102 0x11
#define MAPSEC_ROUTE_103 0x12
#define MAPSEC_ROUTE_104 0x13
#define MAPSEC_ROUTE_105 0x14
#define MAPSEC_ROUTE_106 0x15
#define MAPSEC_ROUTE_107 0x16
#define MAPSEC_ROUTE_108 0x17
#define MAPSEC_ROUTE_109 0x18
#define MAPSEC_ROUTE_110 0x19
#define MAPSEC_ROUTE_111 0x1A
#define MAPSEC_ROUTE_112 0x1B
#define MAPSEC_ROUTE_113 0x1C
#define MAPSEC_ROUTE_114 0x1D
#define MAPSEC_ROUTE_115 0x1E
#define MAPSEC_ROUTE_116 0x1F
#define MAPSEC_ROUTE_117 0x20
#define MAPSEC_ROUTE_118 0x21
#define MAPSEC_ROUTE_119 0x22
#define MAPSEC_ROUTE_120 0x23
#define MAPSEC_ROUTE_121 0x24
#define MAPSEC_ROUTE_122 0x25
#define MAPSEC_ROUTE_123 0x26
#define MAPSEC_ROUTE_124 0x27
#define MAPSEC_ROUTE_125 0x28
#define MAPSEC_ROUTE_126 0x29
#define MAPSEC_ROUTE_127 0x2A
#define MAPSEC_ROUTE_128 0x2B
#define MAPSEC_ROUTE_129 0x2C
#define MAPSEC_ROUTE_130 0x2D
#define MAPSEC_ROUTE_131 0x2E
#define MAPSEC_ROUTE_132 0x2F
#define MAPSEC_ROUTE_133 0x30
#define MAPSEC_ROUTE_134 0x31
#define MAPSEC_UNDERWATER_124 0x32
#define MAPSEC_UNDERWATER_125 0x33
#define MAPSEC_UNDERWATER_126 0x34
#define MAPSEC_UNDERWATER_127 0x35
#define MAPSEC_UNDERWATER_SOOTOPOLIS 0x36
#define MAPSEC_GRANITE_CAVE 0x37
#define MAPSEC_MT_CHIMNEY 0x38
#define MAPSEC_SAFARI_ZONE 0x39
#define MAPSEC_BATTLE_FRONTIER 0x3A
#define MAPSEC_PETALBURG_WOODS 0x3B
#define MAPSEC_RUSTURF_TUNNEL 0x3C
#define MAPSEC_ABANDONED_SHIP 0x3D
#define MAPSEC_NEW_MAUVILLE 0x3E
#define MAPSEC_METEOR_FALLS 0x3F
#define MAPSEC_METEOR_FALLS2 0x40
#define MAPSEC_MT_PYRE 0x41
#define MAPSEC_AQUA_HIDEOUT_OLD 0x42
#define MAPSEC_SHOAL_CAVE 0x43
#define MAPSEC_SEAFLOOR_CAVERN 0x44
#define MAPSEC_UNDERWATER_128 0x45
#define MAPSEC_VICTORY_ROAD 0x46
#define MAPSEC_MIRAGE_ISLAND 0x47
#define MAPSEC_CAVE_OF_ORIGIN 0x48
#define MAPSEC_SOUTHERN_ISLAND 0x49
#define MAPSEC_FIERY_PATH 0x4A
#define MAPSEC_FIERY_PATH2 0x4B
#define MAPSEC_JAGGED_PASS 0x4C
#define MAPSEC_JAGGED_PASS2 0x4D
#define MAPSEC_SEALED_CHAMBER 0x4E
#define MAPSEC_UNDERWATER_SEALED_CHAMBER 0x4F
#define MAPSEC_SCORCHED_SLAB 0x50
#define MAPSEC_ISLAND_CAVE 0x51
#define MAPSEC_DESERT_RUINS 0x52
#define MAPSEC_ANCIENT_TOMB 0x53
#define MAPSEC_INSIDE_OF_TRUCK 0x54
#define MAPSEC_SKY_PILLAR 0x55
#define MAPSEC_SECRET_BASE 0x56
#define MAPSEC_DYNAMIC 0x57
#define MAPSECS_KANTO 0x58
#define MAPSEC_PALLET_TOWN 0x58
#define MAPSEC_VIRIDIAN_CITY 0x59
#define MAPSEC_PEWTER_CITY 0x5A
#define MAPSEC_CERULEAN_CITY 0x5B
#define MAPSEC_LAVENDER_TOWN 0x5C
#define MAPSEC_VERMILION_CITY 0x5D
#define MAPSEC_CELADON_CITY 0x5E
#define MAPSEC_FUCHSIA_CITY 0x5F
#define MAPSEC_CINNABAR_ISLAND 0x60
#define MAPSEC_INDIGO_PLATEAU 0x61
#define MAPSEC_SAFFRON_CITY 0x62
#define MAPSEC_ROUTE_4_POKECENTER 0x63
#define MAPSEC_ROUTE_10_POKECENTER 0x64
#define MAPSEC_ROUTE_1 0x65
#define MAPSEC_ROUTE_2 0x66
#define MAPSEC_ROUTE_3 0x67
#define MAPSEC_ROUTE_4 0x68
#define MAPSEC_ROUTE_5 0x69
#define MAPSEC_ROUTE_6 0x6A
#define MAPSEC_ROUTE_7 0x6B
#define MAPSEC_ROUTE_8 0x6C
#define MAPSEC_ROUTE_9 0x6D
#define MAPSEC_ROUTE_10 0x6E
#define MAPSEC_ROUTE_11 0x6F
#define MAPSEC_ROUTE_12 0x70
#define MAPSEC_ROUTE_13 0x71
#define MAPSEC_ROUTE_14 0x72
#define MAPSEC_ROUTE_15 0x73
#define MAPSEC_ROUTE_16 0x74
#define MAPSEC_ROUTE_17 0x75
#define MAPSEC_ROUTE_18 0x76
#define MAPSEC_ROUTE_19 0x77
#define MAPSEC_ROUTE_20 0x78
#define MAPSEC_ROUTE_21 0x79
#define MAPSEC_ROUTE_22 0x7A
#define MAPSEC_ROUTE_23 0x7B
#define MAPSEC_ROUTE_24 0x7C
#define MAPSEC_ROUTE_25 0x7D
#define MAPSEC_VIRIDIAN_FOREST 0x7E
#define MAPSEC_MT_MOON 0x7F
#define MAPSEC_S_S_ANNE 0x80
#define MAPSEC_UNDERGROUND_PATH 0x81
#define MAPSEC_UNDERGROUND_PATH_2 0x82
#define MAPSEC_DIGLETTS_CAVE 0x83
#define MAPSEC_KANTO_VICTORY_ROAD 0x84
#define MAPSEC_ROCKET_HIDEOUT 0x85
#define MAPSEC_SILPH_CO 0x86
#define MAPSEC_POKEMON_MANSION 0x87
#define MAPSEC_KANTO_SAFARI_ZONE 0x88
#define MAPSEC_POKEMON_LEAGUE 0x89
#define MAPSEC_ROCK_TUNNEL 0x8A
#define MAPSEC_SEAFOAM_ISLANDS 0x8B
#define MAPSEC_POKEMON_TOWER 0x8C
#define MAPSEC_CERULEAN_CAVE 0x8D
#define MAPSEC_POWER_PLANT 0x8E
#define MAPSECS_SEVII_123 0x8F
#define MAPSEC_ONE_ISLAND 0x8F
#define MAPSEC_TWO_ISLAND 0x90
#define MAPSEC_THREE_ISLAND 0x91
#define MAPSEC_FOUR_ISLAND 0x92
#define MAPSEC_FIVE_ISLAND 0x93
#define MAPSEC_SEVEN_ISLAND 0x94
#define MAPSEC_SIX_ISLAND 0x95
#define MAPSEC_KINDLE_ROAD 0x96
#define MAPSEC_TREASURE_BEACH 0x97
#define MAPSEC_CAPE_BRINK 0x98
#define MAPSEC_BOND_BRIDGE 0x99
#define MAPSEC_THREE_ISLE_PORT 0x9A
#define MAPSEC_SEVII_ISLE_6 0x9B
#define MAPSEC_SEVII_ISLE_7 0x9C
#define MAPSEC_SEVII_ISLE_8 0x9D
#define MAPSEC_SEVII_ISLE_9 0x9E
#define MAPSEC_RESORT_GORGEOUS 0x9F
#define MAPSEC_WATER_LABYRINTH 0xA0
#define MAPSEC_FIVE_ISLE_MEADOW 0xA1
#define MAPSEC_MEMORIAL_PILLAR 0xA2
#define MAPSEC_OUTCAST_ISLAND 0xA3
#define MAPSEC_GREEN_PATH 0xA4
#define MAPSEC_WATER_PATH 0xA5
#define MAPSEC_RUIN_VALLEY 0xA6
#define MAPSEC_TRAINER_TOWER 0xA7
#define MAPSEC_CANYON_ENTRANCE 0xA8
#define MAPSEC_SEVAULT_CANYON 0xA9
#define MAPSEC_TANOBY_RUINS 0xAA
#define MAPSEC_SEVII_ISLE_22 0xAB
#define MAPSEC_SEVII_ISLE_23 0xAC
#define MAPSEC_SEVII_ISLE_24 0xAD
#define MAPSEC_NAVEL_ROCK 0xAE
#define MAPSEC_MT_EMBER 0xAF
#define MAPSEC_BERRY_FOREST 0xB0
#define MAPSEC_ICEFALL_CAVE 0xB1
#define MAPSEC_ROCKET_WAREHOUSE 0xB2
#define MAPSEC_TRAINER_TOWER_2 0xB3
#define MAPSEC_DOTTED_HOLE 0xB4
#define MAPSEC_LOST_CAVE 0xB5
#define MAPSEC_PATTERN_BUSH 0xB6
#define MAPSEC_ALTERING_CAVE 0xB7
#define MAPSEC_TANOBY_CHAMBERS 0xB8
#define MAPSEC_THREE_ISLE_PATH 0xB9
#define MAPSEC_TANOBY_KEY 0xBA
#define MAPSEC_BIRTH_ISLAND 0xBB
#define MAPSEC_MONEAN_CHAMBER 0xBC
#define MAPSEC_LIPTOO_CHAMBER 0xBD
#define MAPSEC_WEEPTH_CHAMBER 0xBE
#define MAPSEC_DILFORD_CHAMBER 0xBF
#define MAPSEC_SCUFIB_CHAMBER 0xC0
#define MAPSEC_RIXY_CHAMBER 0xC1
#define MAPSEC_VIAPOIS_CHAMBER 0xC2
#define MAPSEC_EMBER_SPA 0xC3
#define MAPSEC_SPECIAL_AREA 0xC4
#define MAPSEC_NONE 0xC5
#define MAPSEC_COUNT 0xC6
#define METLOC_SPECIAL_EGG 0xFD
#define METLOC_IN_GAME_TRADE 0xFE
#define METLOC_FATEFUL_ENCOUNTER 0xFF
#endif //GUARD_CONSTANTS_REGION_MAP_SECTIONS_H

View File

@ -13,6 +13,7 @@
#define IWRAM_DATA __attribute__((section("iwram_data")))
#define EWRAM_DATA __attribute__((section("ewram_data")))
#endif
#define COMMON_DATA __attribute__((section("common_data")))
#if MODERN
#define NOINLINE __attribute__((noinline))

View File

@ -19,6 +19,10 @@ $(DATA_SRC_SUBDIR)/region_map/region_map_entry_strings.h: $(DATA_SRC_SUBDIR)/reg
$(C_BUILDDIR)/region_map.o: c_dep += $(DATA_SRC_SUBDIR)/region_map/region_map_entry_strings.h
AUTO_GEN_TARGETS += include/constants/region_map_sections.h
include/constants/region_map_sections.h: $(DATA_SRC_SUBDIR)/region_map/region_map_sections.json $(DATA_SRC_SUBDIR)/region_map/region_map_sections.constants.json.txt
$(JSONPROC) $^ $@
AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/items.h
$(DATA_SRC_SUBDIR)/items.h: $(DATA_SRC_SUBDIR)/items.json $(DATA_SRC_SUBDIR)/items.json.txt
$(JSONPROC) $^ $@

View File

@ -38,6 +38,7 @@ SECTIONS {
/* COMMON starts at 0x30030E0 */
INCLUDE "sym_common.ld"
src/*.o(COMMON);
*libc.a:sbrkr.o(COMMON);
end = .;

View File

@ -30,6 +30,7 @@ SECTIONS {
/* COMMON starts at 0x30022A8 */
*(COMMON);
*(common_data);
end = .;
__end__ = .;
} > IWRAM

View File

@ -14,7 +14,7 @@
#define FSP_ON 0x01
#define FSP_START 0x02
LINK_MANAGER lman;
COMMON_DATA LINK_MANAGER lman = {0};
static void rfu_LMAN_clearVariables(void);
static void rfu_LMAN_settingPCSWITCH(u32 rand);

View File

@ -6,16 +6,16 @@ static u16 sTimerCount;
static vu16 *sTimerReg;
static u16 sSavedIme;
u8 gFlashTimeoutFlag;
u8 (*PollFlashStatus)(u8 *);
u16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData);
u16 (*ProgramFlashSector)(u16 sectorNum, void *src);
const struct FlashType *gFlash;
u16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data);
u16 gFlashNumRemainingBytes;
u16 (*EraseFlashChip)();
u16 (*EraseFlashSector)(u16 sectorNum);
const u16 *gFlashMaxTime;
COMMON_DATA u8 gFlashTimeoutFlag = 0;
COMMON_DATA u8 (*PollFlashStatus)(u8 *) = NULL;
COMMON_DATA u16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData) = NULL;
COMMON_DATA u16 (*ProgramFlashSector)(u16 sectorNum, void *src) = NULL;
COMMON_DATA const struct FlashType *gFlash = NULL;
COMMON_DATA u16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data) = NULL;
COMMON_DATA u16 gFlashNumRemainingBytes = 0;
COMMON_DATA u16 (*EraseFlashChip)() = NULL;
COMMON_DATA u16 (*EraseFlashSector)(u16 sectorNum) = NULL;
COMMON_DATA const u16 *gFlashMaxTime = NULL;
void SetReadFlash1(u16 *dest);

View File

@ -30,9 +30,9 @@
#define TAG_PARTICLES_LUXURYBALL 55030
#define TAG_PARTICLES_PREMIERBALL 55031
u32 gMonShrinkDuration;
u16 gMonShrinkDelta;
u16 gMonShrinkDistance;
COMMON_DATA u32 gMonShrinkDuration = 0;
COMMON_DATA u16 gMonShrinkDelta = 0;
COMMON_DATA u16 gMonShrinkDistance = 0;
static void AnimTask_UnusedLevelUpHealthBox_Step(u8);
static void AnimTask_FlashHealthboxOnLevelUp_Step(u8);

View File

@ -2424,7 +2424,7 @@ static const struct PokedudeBattlePartyInfo *const sPokedudeBattlePartyPointers[
[TTVSCR_CATCHING] = sParties_Catching,
};
struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT];
COMMON_DATA struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT] = {0};
static void PokedudeSimulateInputChooseAction(void)
{

View File

@ -220,15 +220,15 @@ EWRAM_DATA u16 gBattleMovePower = 0;
EWRAM_DATA u16 gMoveToLearn = 0;
EWRAM_DATA u8 gBattleMonForms[MAX_BATTLERS_COUNT] = {0};
void (*gPreBattleCallback1)(void);
void (*gBattleMainFunc)(void);
struct BattleResults gBattleResults;
u8 gLeveledUpInBattle;
void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void);
u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT];
u8 gMultiUsePlayerCursor;
u8 gNumberOfMovesToChoose;
u8 gBattleControllerData[MAX_BATTLERS_COUNT];
COMMON_DATA void (*gPreBattleCallback1)(void) = NULL;
COMMON_DATA void (*gBattleMainFunc)(void) = NULL;
COMMON_DATA struct BattleResults gBattleResults = {0};
COMMON_DATA u8 gLeveledUpInBattle = 0;
COMMON_DATA void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void) = {0};
COMMON_DATA u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT] = {0};
COMMON_DATA u8 gMultiUsePlayerCursor = 0;
COMMON_DATA u8 gNumberOfMovesToChoose = 0;
COMMON_DATA u8 gBattleControllerData[MAX_BATTLERS_COUNT] = {0};
static const struct ScanlineEffectParams sIntroScanlineParams16Bit =
{

View File

@ -237,7 +237,7 @@ static const u8 sText_PkmnAnchoredItself[] = _("{B_DEF_NAME_WITH_PREFIX} anchore
static const u8 sText_PkmnWasMadeDrowsy[] = _("{B_ATK_NAME_WITH_PREFIX} made\n{B_DEF_NAME_WITH_PREFIX} drowsy!");
static const u8 sText_PkmnKnockedOff[] = _("{B_ATK_NAME_WITH_PREFIX} knocked off\n{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}!");
static const u8 sText_PkmnSwappedAbilities[] = _("{B_ATK_NAME_WITH_PREFIX} swapped abilities\nwith its opponent!");
static const u8 sText_PkmnSealedOpponentMove[] = _("{B_ATK_NAME_WITH_PREFIX} sealed the\nopponent's moveシsス!");
static const u8 sText_PkmnSealedOpponentMove[] = _("{B_ATK_NAME_WITH_PREFIX} sealed the\nopponent's move(s)!");
static const u8 sText_PkmnWantsGrudge[] = _("{B_ATK_NAME_WITH_PREFIX} wants the\nopponent to bear a GRUDGE!");
static const u8 sText_PkmnLostPPGrudge[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} lost\nall its PP due to the GRUDGE!");
static const u8 sText_PkmnShroudedItself[] = _("{B_ATK_NAME_WITH_PREFIX} shrouded\nitself in {B_CURRENT_MOVE}!");

View File

@ -32,10 +32,10 @@ enum {
STATE_RETRY,
};
const void *gMultibootStart;
int gMultibootStatus;
size_t gMultibootSize;
struct MultiBootParam gMultibootParam;
COMMON_DATA const void *gMultibootStart = NULL;
COMMON_DATA int gMultibootStatus = 0;
COMMON_DATA size_t gMultibootSize = 0;
COMMON_DATA struct MultiBootParam gMultibootParam = {0};
static void CB2_BerryFix(void);
static void Task_BerryFixMain(u8 taskId);

View File

@ -43,7 +43,7 @@ static struct BgConfig2 sGpuBgConfigs2[4];
static u32 sDmaBusyBitfield[4];
static u8 gpu_tile_allocation_map_bg[0x100];
bool32 gWindowTileAutoAllocEnabled;
COMMON_DATA bool32 gWindowTileAutoAllocEnabled = 0;
static const struct BgConfig sZeroedBgControlStruct = { 0 };

View File

@ -27,7 +27,7 @@
#include "constants/field_weather.h"
#include "constants/maps.h"
u32 UnusedVarNeededToMatch[8];
COMMON_DATA u32 UnusedVarNeededToMatch[8] = {0};
static void Task_LinkupStart(u8 taskId);
static void Task_LinkupAwaitConnection(u8 taskId);

View File

@ -0,0 +1,24 @@
{{ doNotModifyHeader }}
#ifndef GUARD_CONSTANTS_REGION_MAP_SECTIONS_H
#define GUARD_CONSTANTS_REGION_MAP_SECTIONS_H
enum {
## for map_section in map_sections
{{ map_section.id }},
## endfor
MAPSEC_NONE,
MAPSEC_COUNT
};
// Values before KANTO_MAPSEC_START are assumed to have no data.
#define KANTO_MAPSEC_START MAPSEC_PALLET_TOWN
// Values starting from SEVII_MAPSEC_START are assumed to have data in sSeviiMapsecs.
#define SEVII_MAPSEC_START MAPSEC_ONE_ISLAND
// Special location IDs that use the same value space as MAPSECs.
#define METLOC_SPECIAL_EGG 0xFD
#define METLOC_IN_GAME_TRADE 0xFE
#define METLOC_FATEFUL_ENCOUNTER 0xFF
#endif // GUARD_CONSTANTS_REGION_MAP_SECTIONS_H

View File

@ -3,24 +3,30 @@
#define GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H
## for map_section in map_sections
{% if isEmptyString(getVar(map_section.name)) and not existsIn(map_section, "name_clone") %}{{ setVar(map_section.name, map_section.map_section) }}{% endif %}
{% if existsIn(map_section, "name") and isEmptyString(getVar(map_section.name)) and not existsIn(map_section, "name_clone") %}{{ setVar(map_section.name, map_section.id) }}{% endif %}
## endfor
static const u8 *const sMapNames[] = {
## for map_section in map_sections
[{{ map_section.map_section }} - MAPSECS_KANTO] = sMapsecName_{{ cleanString(map_section.name) }}{% if existsIn(map_section, "name_clone") %}_Clone{% endif %},
{% if existsIn(map_section, "name") %}
[{{ map_section.id }} - KANTO_MAPSEC_START] = sMapsecName_{{ cleanString(map_section.name) }}{% if existsIn(map_section, "name_clone") %}_Clone{% endif %},
{% endif %}
## endfor
};
static const u16 sMapSectionTopLeftCorners[MAPSEC_COUNT][2] = {
## for map_section in map_sections
[{{ map_section.map_section }} - MAPSECS_KANTO] = { {{ map_section.x }}, {{ map_section.y }} },
{% if existsIn(map_section, "x") and existsIn(map_section, "y") %}
[{{ map_section.id }} - KANTO_MAPSEC_START] = { {{ map_section.x }}, {{ map_section.y }} },
{% endif %}
## endfor
};
static const u16 sMapSectionDimensions[MAPSEC_COUNT][2] = {
## for map_section in map_sections
[{{ map_section.map_section }} - MAPSECS_KANTO] = { {{ map_section.width }}, {{ map_section.height }} },
{% if existsIn(map_section, "width") and existsIn(map_section, "height") %}
[{{ map_section.id }} - KANTO_MAPSEC_START] = { {{ map_section.width }}, {{ map_section.height }} },
{% endif %}
## endfor
};

File diff suppressed because it is too large Load Diff

View File

@ -3,16 +3,18 @@
#define GUARD_DATA_REGION_MAP_REGION_MAP_ENTRY_STRINGS_H
## for map_section in map_sections
{% if isEmptyString(getVar(map_section.name)) and not existsIn(map_section, "name_clone") %}{{ setVar(map_section.name, map_section.map_section) }}{% endif %}
{% if existsIn(map_section, "name") and isEmptyString(getVar(map_section.name)) and not existsIn(map_section, "name_clone") %}{{ setVar(map_section.name, map_section.id) }}{% endif %}
## endfor
## for map_section in map_sections
{% if getVar(map_section.name) == map_section.map_section %}
{% if existsIn(map_section, "name") %}
{% if getVar(map_section.name) == map_section.id %}
static const u8 sMapsecName_{{ cleanString(map_section.name) }}[] = _("{{ map_section.name }}");
{% endif %}
{% if existsIn(map_section, "name_clone") %}
static const u8 sMapsecName_{{ cleanString(map_section.name) }}_Clone[] = _("{{ map_section.name }}");
{% endif %}
{% endif %}
## endfor
#endif // GUARD_DATA_REGION_MAP_REGION_MAP_ENTRY_STRINGS_H

View File

@ -41,7 +41,7 @@ struct EReaderData
static void Task_EReader(u8);
struct EReaderData gEReaderData;
COMMON_DATA struct EReaderData gEReaderData = {0};
extern const u8 gMultiBootProgram_EReader_Start[];
extern const u8 gMultiBootProgram_EReader_End[];

View File

@ -35,7 +35,7 @@ EWRAM_DATA u16 gSpecialVar_PrevTextColor = 0;
EWRAM_DATA u16 gSpecialVar_0x8014 = 0;
EWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_SIZE] = {};
u16 gLastQuestLogStoredFlagOrVarIdx;
COMMON_DATA u16 gLastQuestLogStoredFlagOrVarIdx = 0;
extern u16 *const gSpecialVars[];

View File

@ -43,7 +43,7 @@ static EWRAM_DATA struct EvoInfo *sEvoStructPtr = NULL;
static EWRAM_DATA u16 *sBgAnimPal = NULL;
// IWRAM common
void (*gCB2_AfterEvolution)(void);
COMMON_DATA void (*gCB2_AfterEvolution)(void) = NULL;
#define sEvoCursorPos gBattleCommunication[1] // when learning a new move
#define sEvoGraphicsTaskId gBattleCommunication[2]

View File

@ -57,8 +57,8 @@ static EWRAM_DATA struct FameCheckerData * sFameCheckerData = NULL;
static EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL;
static EWRAM_DATA s32 sLastMenuIdx = 0;
struct ListMenuTemplate gFameChecker_ListMenuTemplate;
u8 gIconDescriptionBoxIsOpen;
COMMON_DATA struct ListMenuTemplate gFameChecker_ListMenuTemplate = {0};
COMMON_DATA u8 gIconDescriptionBoxIsOpen = 0;
static void MainCB2_LoadFameChecker(void);
static void LoadUISpriteSheetsAndPalettes(void);

View File

@ -37,9 +37,9 @@ static s16 sVerticalCameraPan;
static u8 sBikeCameraPanFlag;
static void (*sFieldCameraPanningCallback)(void);
struct CameraObject gFieldCamera;
u16 gTotalCameraPixelOffsetY;
u16 gTotalCameraPixelOffsetX;
COMMON_DATA struct CameraObject gFieldCamera = {0};
COMMON_DATA u16 gTotalCameraPixelOffsetY = 0;
COMMON_DATA u16 gTotalCameraPixelOffsetX = 0;
// text
static void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraOffset *cameraOffset)

View File

@ -71,7 +71,7 @@ static bool8 TryDoorWarp(struct MapPosition * position, u16 metatileBehavior, u8
static s8 GetWarpEventAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z);
static const u8 *GetCoordEventScriptAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z);
struct FieldInput gFieldInputRecord;
COMMON_DATA struct FieldInput gFieldInputRecord = {0};
void FieldClearPlayerInput(struct FieldInput *input)
{

View File

@ -50,8 +50,8 @@ static EWRAM_DATA u16 sListMenuLastScrollPosition = 0;
static EWRAM_DATA u8 sPCBoxToSendMon = 0;
static EWRAM_DATA u8 sBrailleTextCursorSpriteID = 0;
struct ListMenuTemplate sFieldSpecialsListMenuTemplate;
u16 sFieldSpecialsListMenuScrollBuffer;
COMMON_DATA struct ListMenuTemplate sFieldSpecialsListMenuTemplate = {0};
COMMON_DATA u16 sFieldSpecialsListMenuScrollBuffer = 0;
static void Task_AnimatePcTurnOn(u8 taskId);
static void PcTurnOnUpdateMetatileId(bool16 flag);

View File

@ -14,7 +14,7 @@ struct ConnectionFlags
u8 east:1;
};
struct BackupMapLayout VMap;
COMMON_DATA struct BackupMapLayout VMap = {0};
EWRAM_DATA u16 gBackupMapData[VIRTUAL_MAP_SIZE] = {};
EWRAM_DATA struct MapHeader gMapHeader = {};
EWRAM_DATA struct Camera gCamera = {};

View File

@ -51,8 +51,8 @@ struct HelpSystemState
u8 scrollSub;
};
struct HelpSystemState gHelpSystemState;
u16 gHelpContextIdBackup;
COMMON_DATA struct HelpSystemState gHelpSystemState = {0};
COMMON_DATA u16 gHelpContextIdBackup = 0;
static bool32 IsCurrentMapInArray(const u16 * mapIdxs);
static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);

View File

@ -10,7 +10,7 @@
#define ZERO 0
bool8 gHelpSystemEnabled;
COMMON_DATA bool8 gHelpSystemEnabled = 0;
struct HelpSystemVideoState
{

View File

@ -2,16 +2,16 @@
#include "image_processing_effects.h"
// IWRAM common
u8 gCanvasColumnStart;
u16 (*gCanvasPixels)[][32];
u8 gCanvasRowEnd;
u8 gCanvasHeight;
u8 gCanvasColumnEnd;
u8 gCanvasRowStart;
u8 gCanvasMonPersonality;
u8 gCanvasWidth;
u16 *gCanvasPalette;
u16 gCanvasPaletteStart;
COMMON_DATA u8 gCanvasColumnStart = 0;
COMMON_DATA u16 (*gCanvasPixels)[][32] = {0};
COMMON_DATA u8 gCanvasRowEnd = 0;
COMMON_DATA u8 gCanvasHeight = 0;
COMMON_DATA u8 gCanvasColumnEnd = 0;
COMMON_DATA u8 gCanvasRowStart = 0;
COMMON_DATA u8 gCanvasMonPersonality = 0;
COMMON_DATA u8 gCanvasWidth = 0;
COMMON_DATA u16 *gCanvasPalette = NULL;
COMMON_DATA u16 gCanvasPaletteStart = 0;
static void ApplyImageEffect_Pointillism(void);
static void ApplyImageEffect_Blur(void);

View File

@ -68,11 +68,11 @@ static void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuLocalStruct *, con
static void rfu_STC_NI_initSlot_asRecvDataEntity(u8, struct NIComm *);
static void rfu_STC_NI_initSlot_asRecvControllData(u8, struct NIComm *);
struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX];
struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX];
struct RfuLinkStatus *gRfuLinkStatus;
struct RfuStatic *gRfuStatic;
struct RfuFixed *gRfuFixed;
COMMON_DATA struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX] = {0};
COMMON_DATA struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX] = {0};
COMMON_DATA struct RfuLinkStatus *gRfuLinkStatus = NULL;
COMMON_DATA struct RfuStatic *gRfuStatic = NULL;
COMMON_DATA struct RfuFixed *gRfuFixed = NULL;
static const struct LLSFStruct llsf_struct[2] = {
[MODE_CHILD] = {

View File

@ -15,7 +15,7 @@ struct RfuSIO32Id
u16 lastId;
};
struct RfuSIO32Id gRfuSIO32Id;
COMMON_DATA struct RfuSIO32Id gRfuSIO32Id = {0};
static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO
static const char Sio32IDLib_Var[] = "Sio32ID_030820";

View File

@ -8,7 +8,7 @@ static void STWI_stop_timer(void);
static s32 STWI_restart_Command(void);
static s32 STWI_reset_ClockCounter(void);
struct STWIStatus *gSTWIStatus;
COMMON_DATA struct STWIStatus *gSTWIStatus = NULL;
void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam)
{

View File

@ -62,41 +62,41 @@ static u16 sRecvNonzeroCheck;
static u8 sChecksumAvailable;
static u8 sHandshakePlayerCount;
u16 gLinkPartnersHeldKeys[6];
u32 gLinkDebugSeed;
struct LinkPlayerBlock gLocalLinkPlayerBlock;
bool8 gLinkErrorOccurred;
u32 gLinkDebugFlags;
u32 gLinkFiller1;
bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS];
u8 gBlockReceivedStatus[MAX_LINK_PLAYERS];
u32 gLinkFiller2;
u16 gLinkHeldKeys;
u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];
u32 gLinkStatus;
bool8 gLinkDummy1; // Never read
bool8 gLinkDummy2; // Never read
bool8 gReadyToExitStandby[MAX_LINK_PLAYERS];
bool8 gReadyToCloseLink[MAX_LINK_PLAYERS];
u16 gReadyCloseLinkType;
u8 gSuppressLinkErrorMessage;
u8 gWirelessCommType;
u8 gSavedLinkPlayerCount;
u16 gSendCmd[CMD_LENGTH];
u8 gSavedMultiplayerId;
bool8 gReceivedRemoteLinkPlayers;
struct LinkTestBGInfo gLinkTestBGInfo;
void (*gLinkCallback)(void);
u8 gShouldAdvanceLinkState;
u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS];
u8 gBlockRequestType;
u32 gLinkFiller3; // file
u32 gLinkFiller4; // boundary
u32 gLinkFiller5; // here?
u8 gLastSendQueueCount;
struct Link gLink;
u8 gLastRecvQueueCount;
u16 gLinkSavedIme;
COMMON_DATA u16 gLinkPartnersHeldKeys[6] = {0};
COMMON_DATA u32 gLinkDebugSeed = 0;
COMMON_DATA struct LinkPlayerBlock gLocalLinkPlayerBlock = {0};
COMMON_DATA bool8 gLinkErrorOccurred = 0;
COMMON_DATA u32 gLinkDebugFlags = 0;
COMMON_DATA u32 gLinkFiller1 = 0;
COMMON_DATA bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS] = {0};
COMMON_DATA u8 gBlockReceivedStatus[MAX_LINK_PLAYERS] = {0};
COMMON_DATA u32 gLinkFiller2 = 0;
COMMON_DATA u16 gLinkHeldKeys = 0;
COMMON_DATA u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH] = {0};
COMMON_DATA u32 gLinkStatus = 0;
COMMON_DATA bool8 gLinkDummy1 = 0; // Never read
COMMON_DATA bool8 gLinkDummy2 = 0; // Never read
COMMON_DATA bool8 gReadyToExitStandby[MAX_LINK_PLAYERS] = {0};
COMMON_DATA bool8 gReadyToCloseLink[MAX_LINK_PLAYERS] = {0};
COMMON_DATA u16 gReadyCloseLinkType = 0;
COMMON_DATA u8 gSuppressLinkErrorMessage = 0;
COMMON_DATA u8 gWirelessCommType = 0;
COMMON_DATA u8 gSavedLinkPlayerCount = 0;
COMMON_DATA u16 gSendCmd[CMD_LENGTH] = {0};
COMMON_DATA u8 gSavedMultiplayerId = 0;
COMMON_DATA bool8 gReceivedRemoteLinkPlayers = 0;
COMMON_DATA struct LinkTestBGInfo gLinkTestBGInfo = {0};
COMMON_DATA void (*gLinkCallback)(void) = NULL;
COMMON_DATA u8 gShouldAdvanceLinkState = 0;
COMMON_DATA u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS] = {0};
COMMON_DATA u8 gBlockRequestType = 0;
COMMON_DATA u32 gLinkFiller3 = 0; // file
COMMON_DATA u32 gLinkFiller4 = 0; // boundary
COMMON_DATA u32 gLinkFiller5 = 0; // here?
COMMON_DATA u8 gLastSendQueueCount = 0;
COMMON_DATA struct Link gLink = {0};
COMMON_DATA u8 gLastRecvQueueCount = 0;
COMMON_DATA u16 gLinkSavedIme = 0;
static EWRAM_DATA bool8 sLinkTestDebugValuesEnabled = FALSE;
static EWRAM_DATA bool8 sDummyFlag = FALSE;

View File

@ -75,9 +75,9 @@ static u32 sRfuAPIBuffer[RFU_API_BUFF_SIZE_RAM / 4];
static u8 sResendBlock8[CMD_LENGTH * 2];
static u16 sResendBlock16[CMD_LENGTH];
struct RfuGameData gHostRfuGameData;
struct RfuManager gRfu;
u8 gHostRfuUsername[PLAYER_NAME_LENGTH + 1];
COMMON_DATA struct RfuGameData gHostRfuGameData = {0};
COMMON_DATA struct RfuManager gRfu = {0};
COMMON_DATA u8 gHostRfuUsername[PLAYER_NAME_LENGTH + 1] = {0};
static void InitChildRecvBuffers(void);
static void InitParentSendData(void);

View File

@ -39,8 +39,8 @@ struct MoveMenuInfoIcon
static EWRAM_DATA struct MysteryGiftLinkMenuStruct sMysteryGiftLinkMenu = {0};
struct ListMenuOverride gListMenuOverride;
struct ListMenuTemplate gMultiuseListMenuTemplate;
COMMON_DATA struct ListMenuOverride gListMenuOverride = {0};
COMMON_DATA struct ListMenuTemplate gMultiuseListMenuTemplate = {0};
static u8 ListMenuInitInternal(const struct ListMenuTemplate *listMenuTemplate, u16 cursorPos, u16 itemsAbove);
static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown);

View File

@ -37,10 +37,10 @@ EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0};
EWRAM_DATA u32 gLastEncryptionKey = 0;
// IWRAM common
bool32 gFlashMemoryPresent;
struct SaveBlock1 *gSaveBlock1Ptr;
struct SaveBlock2 *gSaveBlock2Ptr;
struct PokemonStorage *gPokemonStoragePtr;
COMMON_DATA bool32 gFlashMemoryPresent = 0;
COMMON_DATA struct SaveBlock1 *gSaveBlock1Ptr = NULL;
COMMON_DATA struct SaveBlock2 *gSaveBlock2Ptr = NULL;
COMMON_DATA struct PokemonStorage *gPokemonStoragePtr = NULL;
void CheckForFlashMemory(void)
{

View File

@ -7,18 +7,18 @@ extern const u8 gCgb3Vol[];
BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0};
struct SoundInfo gSoundInfo;
struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES];
struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES];
MPlayFunc gMPlayJumpTable[36];
struct CgbChannel gCgbChans[4];
struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2];
struct PokemonCrySong gPokemonCrySong;
struct MusicPlayerInfo gMPlayInfo_BGM;
struct MusicPlayerInfo gMPlayInfo_SE1;
struct MusicPlayerInfo gMPlayInfo_SE2;
struct MusicPlayerInfo gMPlayInfo_SE3;
u8 gMPlayMemAccArea[0x10];
COMMON_DATA struct SoundInfo gSoundInfo = {0};
COMMON_DATA struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES] = {0};
COMMON_DATA struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES] = {0};
COMMON_DATA MPlayFunc gMPlayJumpTable[36] = {0};
COMMON_DATA struct CgbChannel gCgbChans[4] = {0};
COMMON_DATA struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2] = {0};
COMMON_DATA struct PokemonCrySong gPokemonCrySong = {0};
COMMON_DATA struct MusicPlayerInfo gMPlayInfo_BGM = {0};
COMMON_DATA struct MusicPlayerInfo gMPlayInfo_SE1 = {0};
COMMON_DATA struct MusicPlayerInfo gMPlayInfo_SE2 = {0};
COMMON_DATA u8 gMPlayMemAccArea[0x10] = {0};
COMMON_DATA struct MusicPlayerInfo gMPlayInfo_SE3 = {0};
u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust)
{

View File

@ -58,21 +58,18 @@ const IntrFunc gIntrTableTemplate[] =
#define INTR_COUNT ((int)(sizeof(gIntrTableTemplate)/sizeof(IntrFunc)))
u16 gKeyRepeatStartDelay;
u8 gLinkTransferringData;
struct Main gMain;
u16 gKeyRepeatContinueDelay;
u8 gSoftResetDisabled;
IntrFunc gIntrTable[INTR_COUNT];
bool8 gLinkVSyncDisabled;
u32 IntrMain_Buffer[0x200];
u8 gPcmDmaCounter;
// These variables are not defined in RS or Emerald, and are never read.
// They were likely used to debug the audio engine and VCount interrupt.
u8 sVcountAfterSound;
u8 sVcountAtIntr;
u8 sVcountBeforeSound;
COMMON_DATA u16 gKeyRepeatStartDelay = 0;
COMMON_DATA u8 gLinkTransferringData = 0;
COMMON_DATA struct Main gMain = {0};
COMMON_DATA u16 gKeyRepeatContinueDelay = 0;
COMMON_DATA u8 gSoftResetDisabled = 0;
COMMON_DATA IntrFunc gIntrTable[INTR_COUNT] = {0};
COMMON_DATA u8 sVcountAfterSound = 0;
COMMON_DATA bool8 gLinkVSyncDisabled = 0;
COMMON_DATA u32 IntrMain_Buffer[0x200] = {0};
COMMON_DATA u8 sVcountAtIntr = 0;
COMMON_DATA u8 sVcountBeforeSound = 0;
COMMON_DATA u8 gPcmDmaCounter = 0;
static IntrFunc * const sTimerIntrFunc = gIntrTable + 0x7;

View File

@ -106,14 +106,14 @@ static EWRAM_DATA s16 sCreditsOverworld_CmdIndex = 0;
EWRAM_DATA struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4] = {};
u16 *gBGTilemapBuffers1;
u16 *gBGTilemapBuffers2;
u16 *gBGTilemapBuffers3;
void (*gFieldCallback)(void);
bool8 (*gFieldCallback2)(void);
u16 gHeldKeyCodeToSend;
u8 gLocalLinkPlayerId;
u8 gFieldLinkPlayerCount;
COMMON_DATA u16 *gBGTilemapBuffers1 = NULL;
COMMON_DATA u16 *gBGTilemapBuffers2 = NULL;
COMMON_DATA u16 *gBGTilemapBuffers3 = NULL;
COMMON_DATA void (*gFieldCallback)(void) = NULL;
COMMON_DATA bool8 (*gFieldCallback2)(void) = NULL;
COMMON_DATA u16 gHeldKeyCodeToSend = 0;
COMMON_DATA u8 gLocalLinkPlayerId = 0;
COMMON_DATA u8 gFieldLinkPlayerCount = 0;
static u8 sPlayerLinkStates[MAX_LINK_PLAYERS];
static KeyInterCB sPlayerKeyInterceptCallback;

View File

@ -414,7 +414,7 @@ EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0};
static EWRAM_DATA u16 sPartyMenuItemId = ITEM_NONE;
ALIGNED(4) EWRAM_DATA u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2] = {0}; // bits 0-3 are the current pos of Slot 1, 4-7 are Slot 2, and so on
void (*gItemUseCB)(u8, TaskFunc);
COMMON_DATA void (*gItemUseCB)(u8, TaskFunc) = NULL;
#include "data/pokemon/tutor_learnsets.h"
#include "data/party_menu.h"

View File

@ -5212,7 +5212,7 @@ static bool32 CurrentMonIsFromGBA(void)
static bool32 MapSecIsInKantoOrSevii(u8 mapSec)
{
if (mapSec >= MAPSECS_KANTO && mapSec < MAPSEC_NONE)
if (mapSec >= KANTO_MAPSEC_START && mapSec < MAPSEC_NONE)
return TRUE;
return FALSE;
}

View File

@ -67,10 +67,10 @@ struct FlagOrVarRecord
u16 value;
};
u8 gQuestLogPlaybackState;
u16 sMaxActionsInScene;
struct FieldInput gQuestLogFieldInput;
struct QuestLogAction * sCurSceneActions;
COMMON_DATA u8 gQuestLogPlaybackState = 0;
COMMON_DATA u16 sMaxActionsInScene = 0;
COMMON_DATA struct FieldInput gQuestLogFieldInput = {0};
COMMON_DATA struct QuestLogAction * sCurSceneActions = NULL;
static struct FlagOrVarRecord * sFlagOrVarRecords;
static u16 sNumFlagsOrVars;

View File

@ -4,7 +4,7 @@
// The number 1103515245 comes from the example implementation
// of rand and srand in the ISO C standard.
u32 gRngValue;
COMMON_DATA u32 gRngValue = 0;
u16 Random(void)
{

View File

@ -826,114 +826,114 @@ static const u8 sTextColors[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_CO
#include "data/region_map/region_map_layout_sevii_67.h"
static const u8 sMapFlyDestinations[][3] = {
[MAPSEC_PALLET_TOWN - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_PALLET_TOWN},
[MAPSEC_VIRIDIAN_CITY - MAPSECS_KANTO] = {MAP(MAP_VIRIDIAN_CITY), HEAL_LOCATION_VIRIDIAN_CITY},
[MAPSEC_PEWTER_CITY - MAPSECS_KANTO] = {MAP(MAP_PEWTER_CITY), HEAL_LOCATION_PEWTER_CITY},
[MAPSEC_CERULEAN_CITY - MAPSECS_KANTO] = {MAP(MAP_CERULEAN_CITY), HEAL_LOCATION_CERULEAN_CITY},
[MAPSEC_LAVENDER_TOWN - MAPSECS_KANTO] = {MAP(MAP_LAVENDER_TOWN), HEAL_LOCATION_LAVENDER_TOWN},
[MAPSEC_VERMILION_CITY - MAPSECS_KANTO] = {MAP(MAP_VERMILION_CITY), HEAL_LOCATION_VERMILION_CITY},
[MAPSEC_CELADON_CITY - MAPSECS_KANTO] = {MAP(MAP_CELADON_CITY), HEAL_LOCATION_CELADON_CITY},
[MAPSEC_FUCHSIA_CITY - MAPSECS_KANTO] = {MAP(MAP_FUCHSIA_CITY), HEAL_LOCATION_FUCHSIA_CITY},
[MAPSEC_CINNABAR_ISLAND - MAPSECS_KANTO] = {MAP(MAP_CINNABAR_ISLAND), HEAL_LOCATION_CINNABAR_ISLAND},
[MAPSEC_INDIGO_PLATEAU - MAPSECS_KANTO] = {MAP(MAP_INDIGO_PLATEAU_EXTERIOR), HEAL_LOCATION_INDIGO_PLATEAU},
[MAPSEC_SAFFRON_CITY - MAPSECS_KANTO] = {MAP(MAP_SAFFRON_CITY), HEAL_LOCATION_SAFFRON_CITY},
[MAPSEC_ROUTE_4_POKECENTER - MAPSECS_KANTO] = {MAP(MAP_ROUTE4), HEAL_LOCATION_ROUTE4},
[MAPSEC_ROUTE_10_POKECENTER - MAPSECS_KANTO] = {MAP(MAP_ROUTE10), HEAL_LOCATION_ROUTE10},
[MAPSEC_ROUTE_1 - MAPSECS_KANTO] = {MAP(MAP_ROUTE1), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_2 - MAPSECS_KANTO] = {MAP(MAP_ROUTE2), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_3 - MAPSECS_KANTO] = {MAP(MAP_ROUTE3), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_4 - MAPSECS_KANTO] = {MAP(MAP_ROUTE4), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_5 - MAPSECS_KANTO] = {MAP(MAP_ROUTE5), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_6 - MAPSECS_KANTO] = {MAP(MAP_ROUTE6), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_7 - MAPSECS_KANTO] = {MAP(MAP_ROUTE7), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_8 - MAPSECS_KANTO] = {MAP(MAP_ROUTE8), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_9 - MAPSECS_KANTO] = {MAP(MAP_ROUTE9), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_10 - MAPSECS_KANTO] = {MAP(MAP_ROUTE10), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_11 - MAPSECS_KANTO] = {MAP(MAP_ROUTE11), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_12 - MAPSECS_KANTO] = {MAP(MAP_ROUTE12), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_13 - MAPSECS_KANTO] = {MAP(MAP_ROUTE13), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_14 - MAPSECS_KANTO] = {MAP(MAP_ROUTE14), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_15 - MAPSECS_KANTO] = {MAP(MAP_ROUTE15), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_16 - MAPSECS_KANTO] = {MAP(MAP_ROUTE16), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_17 - MAPSECS_KANTO] = {MAP(MAP_ROUTE17), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_18 - MAPSECS_KANTO] = {MAP(MAP_ROUTE18), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_19 - MAPSECS_KANTO] = {MAP(MAP_ROUTE19), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_20 - MAPSECS_KANTO] = {MAP(MAP_ROUTE20), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_21 - MAPSECS_KANTO] = {MAP(MAP_ROUTE21_NORTH), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_22 - MAPSECS_KANTO] = {MAP(MAP_ROUTE22), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_23 - MAPSECS_KANTO] = {MAP(MAP_ROUTE23), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_24 - MAPSECS_KANTO] = {MAP(MAP_ROUTE24), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_25 - MAPSECS_KANTO] = {MAP(MAP_ROUTE25), HEAL_LOCATION_NONE},
[MAPSEC_VIRIDIAN_FOREST - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_MT_MOON - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_S_S_ANNE - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_UNDERGROUND_PATH - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_UNDERGROUND_PATH_2 - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_DIGLETTS_CAVE - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_KANTO_VICTORY_ROAD - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ROCKET_HIDEOUT - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_SILPH_CO - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_POKEMON_MANSION - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_KANTO_SAFARI_ZONE - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_POKEMON_LEAGUE - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ROCK_TUNNEL - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_SEAFOAM_ISLANDS - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_POKEMON_TOWER - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_CERULEAN_CAVE - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_POWER_PLANT - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ONE_ISLAND - MAPSECS_KANTO] = {MAP(MAP_ONE_ISLAND), HEAL_LOCATION_ONE_ISLAND},
[MAPSEC_TWO_ISLAND - MAPSECS_KANTO] = {MAP(MAP_TWO_ISLAND), HEAL_LOCATION_TWO_ISLAND},
[MAPSEC_THREE_ISLAND - MAPSECS_KANTO] = {MAP(MAP_THREE_ISLAND), HEAL_LOCATION_THREE_ISLAND},
[MAPSEC_FOUR_ISLAND - MAPSECS_KANTO] = {MAP(MAP_FOUR_ISLAND), HEAL_LOCATION_FOUR_ISLAND},
[MAPSEC_FIVE_ISLAND - MAPSECS_KANTO] = {MAP(MAP_FIVE_ISLAND), HEAL_LOCATION_FIVE_ISLAND},
[MAPSEC_SEVEN_ISLAND - MAPSECS_KANTO] = {MAP(MAP_SEVEN_ISLAND), HEAL_LOCATION_SEVEN_ISLAND},
[MAPSEC_SIX_ISLAND - MAPSECS_KANTO] = {MAP(MAP_SIX_ISLAND), HEAL_LOCATION_SIX_ISLAND},
[MAPSEC_KINDLE_ROAD - MAPSECS_KANTO] = {MAP(MAP_ONE_ISLAND_KINDLE_ROAD), HEAL_LOCATION_NONE},
[MAPSEC_TREASURE_BEACH - MAPSECS_KANTO] = {MAP(MAP_ONE_ISLAND_TREASURE_BEACH), HEAL_LOCATION_NONE},
[MAPSEC_CAPE_BRINK - MAPSECS_KANTO] = {MAP(MAP_TWO_ISLAND_CAPE_BRINK), HEAL_LOCATION_NONE},
[MAPSEC_BOND_BRIDGE - MAPSECS_KANTO] = {MAP(MAP_THREE_ISLAND_BOND_BRIDGE), HEAL_LOCATION_NONE},
[MAPSEC_THREE_ISLE_PORT - MAPSECS_KANTO] = {MAP(MAP_THREE_ISLAND_PORT), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_6 - MAPSECS_KANTO] = {MAP(MAP_PROTOTYPE_SEVII_ISLE_6), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_7 - MAPSECS_KANTO] = {MAP(MAP_PROTOTYPE_SEVII_ISLE_7), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_8 - MAPSECS_KANTO] = {MAP(MAP_PROTOTYPE_SEVII_ISLE_8), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_9 - MAPSECS_KANTO] = {MAP(MAP_PROTOTYPE_SEVII_ISLE_9), HEAL_LOCATION_NONE},
[MAPSEC_RESORT_GORGEOUS - MAPSECS_KANTO] = {MAP(MAP_FIVE_ISLAND_RESORT_GORGEOUS), HEAL_LOCATION_NONE},
[MAPSEC_WATER_LABYRINTH - MAPSECS_KANTO] = {MAP(MAP_FIVE_ISLAND_WATER_LABYRINTH), HEAL_LOCATION_NONE},
[MAPSEC_FIVE_ISLE_MEADOW - MAPSECS_KANTO] = {MAP(MAP_FIVE_ISLAND_MEADOW), HEAL_LOCATION_NONE},
[MAPSEC_MEMORIAL_PILLAR - MAPSECS_KANTO] = {MAP(MAP_FIVE_ISLAND_MEMORIAL_PILLAR), HEAL_LOCATION_NONE},
[MAPSEC_OUTCAST_ISLAND - MAPSECS_KANTO] = {MAP(MAP_SIX_ISLAND_OUTCAST_ISLAND), HEAL_LOCATION_NONE},
[MAPSEC_GREEN_PATH - MAPSECS_KANTO] = {MAP(MAP_SIX_ISLAND_GREEN_PATH), HEAL_LOCATION_NONE},
[MAPSEC_WATER_PATH - MAPSECS_KANTO] = {MAP(MAP_SIX_ISLAND_WATER_PATH), HEAL_LOCATION_NONE},
[MAPSEC_RUIN_VALLEY - MAPSECS_KANTO] = {MAP(MAP_SIX_ISLAND_RUIN_VALLEY), HEAL_LOCATION_NONE},
[MAPSEC_TRAINER_TOWER - MAPSECS_KANTO] = {MAP(MAP_SEVEN_ISLAND_TRAINER_TOWER), HEAL_LOCATION_NONE},
[MAPSEC_CANYON_ENTRANCE - MAPSECS_KANTO] = {MAP(MAP_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), HEAL_LOCATION_NONE},
[MAPSEC_SEVAULT_CANYON - MAPSECS_KANTO] = {MAP(MAP_SEVEN_ISLAND_SEVAULT_CANYON), HEAL_LOCATION_NONE},
[MAPSEC_TANOBY_RUINS - MAPSECS_KANTO] = {MAP(MAP_SEVEN_ISLAND_TANOBY_RUINS), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_22 - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_23 - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_24 - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_NAVEL_ROCK - MAPSECS_KANTO] = {MAP(MAP_NAVEL_ROCK_EXTERIOR), HEAL_LOCATION_NONE},
[MAPSEC_MT_EMBER - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_BERRY_FOREST - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ICEFALL_CAVE - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ROCKET_WAREHOUSE - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_TRAINER_TOWER_2 - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_DOTTED_HOLE - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_LOST_CAVE - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_PATTERN_BUSH - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ALTERING_CAVE - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_TANOBY_CHAMBERS - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_THREE_ISLE_PATH - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_TANOBY_KEY - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_BIRTH_ISLAND - MAPSECS_KANTO] = {MAP(MAP_BIRTH_ISLAND_EXTERIOR), HEAL_LOCATION_NONE},
[MAPSEC_MONEAN_CHAMBER - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_LIPTOO_CHAMBER - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_WEEPTH_CHAMBER - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_DILFORD_CHAMBER - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_SCUFIB_CHAMBER - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_RIXY_CHAMBER - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_VIAPOIS_CHAMBER - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_EMBER_SPA - MAPSECS_KANTO] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_PALLET_TOWN - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_PALLET_TOWN},
[MAPSEC_VIRIDIAN_CITY - KANTO_MAPSEC_START] = {MAP(MAP_VIRIDIAN_CITY), HEAL_LOCATION_VIRIDIAN_CITY},
[MAPSEC_PEWTER_CITY - KANTO_MAPSEC_START] = {MAP(MAP_PEWTER_CITY), HEAL_LOCATION_PEWTER_CITY},
[MAPSEC_CERULEAN_CITY - KANTO_MAPSEC_START] = {MAP(MAP_CERULEAN_CITY), HEAL_LOCATION_CERULEAN_CITY},
[MAPSEC_LAVENDER_TOWN - KANTO_MAPSEC_START] = {MAP(MAP_LAVENDER_TOWN), HEAL_LOCATION_LAVENDER_TOWN},
[MAPSEC_VERMILION_CITY - KANTO_MAPSEC_START] = {MAP(MAP_VERMILION_CITY), HEAL_LOCATION_VERMILION_CITY},
[MAPSEC_CELADON_CITY - KANTO_MAPSEC_START] = {MAP(MAP_CELADON_CITY), HEAL_LOCATION_CELADON_CITY},
[MAPSEC_FUCHSIA_CITY - KANTO_MAPSEC_START] = {MAP(MAP_FUCHSIA_CITY), HEAL_LOCATION_FUCHSIA_CITY},
[MAPSEC_CINNABAR_ISLAND - KANTO_MAPSEC_START] = {MAP(MAP_CINNABAR_ISLAND), HEAL_LOCATION_CINNABAR_ISLAND},
[MAPSEC_INDIGO_PLATEAU - KANTO_MAPSEC_START] = {MAP(MAP_INDIGO_PLATEAU_EXTERIOR), HEAL_LOCATION_INDIGO_PLATEAU},
[MAPSEC_SAFFRON_CITY - KANTO_MAPSEC_START] = {MAP(MAP_SAFFRON_CITY), HEAL_LOCATION_SAFFRON_CITY},
[MAPSEC_ROUTE_4_POKECENTER - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE4), HEAL_LOCATION_ROUTE4},
[MAPSEC_ROUTE_10_POKECENTER - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE10), HEAL_LOCATION_ROUTE10},
[MAPSEC_ROUTE_1 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE1), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_2 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE2), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_3 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE3), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_4 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE4), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_5 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE5), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_6 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE6), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_7 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE7), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_8 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE8), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_9 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE9), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_10 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE10), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_11 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE11), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_12 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE12), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_13 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE13), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_14 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE14), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_15 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE15), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_16 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE16), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_17 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE17), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_18 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE18), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_19 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE19), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_20 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE20), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_21 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE21_NORTH), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_22 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE22), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_23 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE23), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_24 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE24), HEAL_LOCATION_NONE},
[MAPSEC_ROUTE_25 - KANTO_MAPSEC_START] = {MAP(MAP_ROUTE25), HEAL_LOCATION_NONE},
[MAPSEC_VIRIDIAN_FOREST - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_MT_MOON - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_S_S_ANNE - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_UNDERGROUND_PATH - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_UNDERGROUND_PATH_2 - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_DIGLETTS_CAVE - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_KANTO_VICTORY_ROAD - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ROCKET_HIDEOUT - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_SILPH_CO - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_POKEMON_MANSION - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_KANTO_SAFARI_ZONE - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_POKEMON_LEAGUE - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ROCK_TUNNEL - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_SEAFOAM_ISLANDS - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_POKEMON_TOWER - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_CERULEAN_CAVE - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_POWER_PLANT - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ONE_ISLAND - KANTO_MAPSEC_START] = {MAP(MAP_ONE_ISLAND), HEAL_LOCATION_ONE_ISLAND},
[MAPSEC_TWO_ISLAND - KANTO_MAPSEC_START] = {MAP(MAP_TWO_ISLAND), HEAL_LOCATION_TWO_ISLAND},
[MAPSEC_THREE_ISLAND - KANTO_MAPSEC_START] = {MAP(MAP_THREE_ISLAND), HEAL_LOCATION_THREE_ISLAND},
[MAPSEC_FOUR_ISLAND - KANTO_MAPSEC_START] = {MAP(MAP_FOUR_ISLAND), HEAL_LOCATION_FOUR_ISLAND},
[MAPSEC_FIVE_ISLAND - KANTO_MAPSEC_START] = {MAP(MAP_FIVE_ISLAND), HEAL_LOCATION_FIVE_ISLAND},
[MAPSEC_SEVEN_ISLAND - KANTO_MAPSEC_START] = {MAP(MAP_SEVEN_ISLAND), HEAL_LOCATION_SEVEN_ISLAND},
[MAPSEC_SIX_ISLAND - KANTO_MAPSEC_START] = {MAP(MAP_SIX_ISLAND), HEAL_LOCATION_SIX_ISLAND},
[MAPSEC_KINDLE_ROAD - KANTO_MAPSEC_START] = {MAP(MAP_ONE_ISLAND_KINDLE_ROAD), HEAL_LOCATION_NONE},
[MAPSEC_TREASURE_BEACH - KANTO_MAPSEC_START] = {MAP(MAP_ONE_ISLAND_TREASURE_BEACH), HEAL_LOCATION_NONE},
[MAPSEC_CAPE_BRINK - KANTO_MAPSEC_START] = {MAP(MAP_TWO_ISLAND_CAPE_BRINK), HEAL_LOCATION_NONE},
[MAPSEC_BOND_BRIDGE - KANTO_MAPSEC_START] = {MAP(MAP_THREE_ISLAND_BOND_BRIDGE), HEAL_LOCATION_NONE},
[MAPSEC_THREE_ISLE_PORT - KANTO_MAPSEC_START] = {MAP(MAP_THREE_ISLAND_PORT), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_6 - KANTO_MAPSEC_START] = {MAP(MAP_PROTOTYPE_SEVII_ISLE_6), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_7 - KANTO_MAPSEC_START] = {MAP(MAP_PROTOTYPE_SEVII_ISLE_7), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_8 - KANTO_MAPSEC_START] = {MAP(MAP_PROTOTYPE_SEVII_ISLE_8), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_9 - KANTO_MAPSEC_START] = {MAP(MAP_PROTOTYPE_SEVII_ISLE_9), HEAL_LOCATION_NONE},
[MAPSEC_RESORT_GORGEOUS - KANTO_MAPSEC_START] = {MAP(MAP_FIVE_ISLAND_RESORT_GORGEOUS), HEAL_LOCATION_NONE},
[MAPSEC_WATER_LABYRINTH - KANTO_MAPSEC_START] = {MAP(MAP_FIVE_ISLAND_WATER_LABYRINTH), HEAL_LOCATION_NONE},
[MAPSEC_FIVE_ISLE_MEADOW - KANTO_MAPSEC_START] = {MAP(MAP_FIVE_ISLAND_MEADOW), HEAL_LOCATION_NONE},
[MAPSEC_MEMORIAL_PILLAR - KANTO_MAPSEC_START] = {MAP(MAP_FIVE_ISLAND_MEMORIAL_PILLAR), HEAL_LOCATION_NONE},
[MAPSEC_OUTCAST_ISLAND - KANTO_MAPSEC_START] = {MAP(MAP_SIX_ISLAND_OUTCAST_ISLAND), HEAL_LOCATION_NONE},
[MAPSEC_GREEN_PATH - KANTO_MAPSEC_START] = {MAP(MAP_SIX_ISLAND_GREEN_PATH), HEAL_LOCATION_NONE},
[MAPSEC_WATER_PATH - KANTO_MAPSEC_START] = {MAP(MAP_SIX_ISLAND_WATER_PATH), HEAL_LOCATION_NONE},
[MAPSEC_RUIN_VALLEY - KANTO_MAPSEC_START] = {MAP(MAP_SIX_ISLAND_RUIN_VALLEY), HEAL_LOCATION_NONE},
[MAPSEC_TRAINER_TOWER - KANTO_MAPSEC_START] = {MAP(MAP_SEVEN_ISLAND_TRAINER_TOWER), HEAL_LOCATION_NONE},
[MAPSEC_CANYON_ENTRANCE - KANTO_MAPSEC_START] = {MAP(MAP_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), HEAL_LOCATION_NONE},
[MAPSEC_SEVAULT_CANYON - KANTO_MAPSEC_START] = {MAP(MAP_SEVEN_ISLAND_SEVAULT_CANYON), HEAL_LOCATION_NONE},
[MAPSEC_TANOBY_RUINS - KANTO_MAPSEC_START] = {MAP(MAP_SEVEN_ISLAND_TANOBY_RUINS), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_22 - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_23 - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_SEVII_ISLE_24 - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_NAVEL_ROCK - KANTO_MAPSEC_START] = {MAP(MAP_NAVEL_ROCK_EXTERIOR), HEAL_LOCATION_NONE},
[MAPSEC_MT_EMBER - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_BERRY_FOREST - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ICEFALL_CAVE - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ROCKET_WAREHOUSE - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_TRAINER_TOWER_2 - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_DOTTED_HOLE - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_LOST_CAVE - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_PATTERN_BUSH - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_ALTERING_CAVE - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_TANOBY_CHAMBERS - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_THREE_ISLE_PATH - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_TANOBY_KEY - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_BIRTH_ISLAND - KANTO_MAPSEC_START] = {MAP(MAP_BIRTH_ISLAND_EXTERIOR), HEAL_LOCATION_NONE},
[MAPSEC_MONEAN_CHAMBER - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_LIPTOO_CHAMBER - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_WEEPTH_CHAMBER - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_DILFORD_CHAMBER - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_SCUFIB_CHAMBER - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_RIXY_CHAMBER - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_VIAPOIS_CHAMBER - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
[MAPSEC_EMBER_SPA - KANTO_MAPSEC_START] = {MAP(MAP_PALLET_TOWN), HEAL_LOCATION_NONE},
};
static void RegionMap_DarkenPalette(u16 *pal, u16 size, u16 tint)
@ -1029,7 +1029,7 @@ static void InitRegionMapType(void)
sRegionMap->permissions[MAPPERM_HAS_SWITCH_BUTTON] = FALSE;
region = REGIONMAP_KANTO;
j = REGIONMAP_KANTO;
if (gMapHeader.regionMapSectionId >= MAPSECS_SEVII_123)
if (gMapHeader.regionMapSectionId >= SEVII_MAPSEC_START)
{
// Mapsec is in Sevii Islands, determine which map to use
while (region == REGIONMAP_KANTO)
@ -1470,7 +1470,7 @@ static void DisplayCurrentDungeonName(void)
mapsecId = GetDungeonMapsecUnderCursor();
if (mapsecId != MAPSEC_NONE)
{
descOffset = mapsecId - MAPSECS_KANTO;
descOffset = mapsecId - KANTO_MAPSEC_START;
SetDispCnt(1, FALSE);
sRegionMap->dungeonWinTop = TRUE;
sRegionMap->dungeonWinLeft = StringLength(sMapNames[descOffset]);
@ -3154,7 +3154,7 @@ static void GetPlayerPositionOnRegionMap(void)
break;
}
sMapCursor->selectedMapsec -= MAPSECS_KANTO;
sMapCursor->selectedMapsec -= KANTO_MAPSEC_START;
divisor = width / sMapSectionDimensions[sMapCursor->selectedMapsec][0];
if (divisor == 0)
divisor = 1;
@ -3803,7 +3803,7 @@ u8 *GetMapName(u8 *dst0, u16 mapsec, u16 fill)
u8 *dst;
u16 i;
u16 idx;
if ((idx = mapsec - MAPSECS_KANTO) <= MAPSEC_SPECIAL_AREA - MAPSECS_KANTO)
if ((idx = mapsec - KANTO_MAPSEC_START) <= MAPSEC_SPECIAL_AREA - KANTO_MAPSEC_START)
{
if (IsCeladonDeptStoreMapsec(mapsec) == TRUE)
dst = StringCopy(dst0, sMapsecName_CELADON_DEPT_);
@ -4022,7 +4022,7 @@ static void FreeFlyMap(u8 taskId)
static void SetFlyWarpDestination(u16 mapsec)
{
u16 idx = mapsec - MAPSECS_KANTO;
u16 idx = mapsec - KANTO_MAPSEC_START;
if (sMapFlyDestinations[idx][2])
{
SetWarpDestinationToHealLocation(sMapFlyDestinations[idx][2]);

View File

@ -77,18 +77,18 @@ STATIC_ASSERT(sizeof(struct SaveBlock1) <= SECTOR_DATA_SIZE * (SECTOR_ID_SAVEBLO
STATIC_ASSERT(sizeof(struct PokemonStorage) <= SECTOR_DATA_SIZE * (SECTOR_ID_PKMN_STORAGE_END - SECTOR_ID_PKMN_STORAGE_START + 1), PokemonStorageFreeSpace);
// Sector num to begin writing save data. Sectors are rotated each time the game is saved. (possibly to avoid wear on flash memory?)
u16 gLastWrittenSector;
u32 gLastSaveCounter;
u16 gLastKnownGoodSector;
u32 gDamagedSaveSectors;
u32 gSaveCounter;
struct SaveSector *gSaveDataBufferPtr; // the pointer is in fast IWRAM but points to the slower EWRAM.
u16 gIncrementalSectorId;
u16 gSaveUnusedVar;
u16 gSaveFileStatus;
void (*gGameContinueCallback)(void);
struct SaveSectorLocation gRamSaveSectorLocations[NUM_SECTORS_PER_SLOT];
u16 gSaveAttemptStatus;
COMMON_DATA u16 gLastWrittenSector = 0;
COMMON_DATA u32 gLastSaveCounter = 0;
COMMON_DATA u16 gLastKnownGoodSector = 0;
COMMON_DATA u32 gDamagedSaveSectors = 0;
COMMON_DATA u32 gSaveCounter = 0;
COMMON_DATA struct SaveSector *gSaveDataBufferPtr = NULL; // the pointer is in fast IWRAM but points to the slower EWRAM.
COMMON_DATA u16 gIncrementalSectorId = 0;
COMMON_DATA u16 gSaveUnusedVar = 0;
COMMON_DATA u16 gSaveFileStatus = 0;
COMMON_DATA void (*gGameContinueCallback)(void) = NULL;
COMMON_DATA struct SaveSectorLocation gRamSaveSectorLocations[NUM_SECTORS_PER_SLOT] = {0};
COMMON_DATA u16 gSaveAttemptStatus = 0;
EWRAM_DATA struct SaveSector gSaveDataBuffer = {0};
EWRAM_DATA u32 gSaveUnusedVar2 = 0;

View File

@ -7,7 +7,7 @@
#include "save.h"
#include "strings.h"
bool32 sIsInSaveFailedScreen;
COMMON_DATA bool32 sIsInSaveFailedScreen = 0;
static EWRAM_DATA u16 sSaveType = SAVE_NORMAL;
static EWRAM_DATA u16 sUnused = 0;

View File

@ -54,8 +54,8 @@ static EWRAM_DATA u16 sMovingNpcMapGroup = 0;
static EWRAM_DATA u16 sMovingNpcMapNum = 0;
static EWRAM_DATA u16 sFieldEffectScriptId = 0;
struct ScriptContext * sQuestLogScriptContextPtr;
u8 gSelectedObjectEvent;
COMMON_DATA struct ScriptContext * sQuestLogScriptContextPtr = NULL;
COMMON_DATA u8 gSelectedObjectEvent = 0;
// This is defined in here so the optimizer can't see its value when compiling
// script.c.

View File

@ -30,7 +30,7 @@ static u8 sMapMusicFadeInSpeed;
static u16 sFanfareCounter;
// iwram common
bool8 gDisableMusic;
COMMON_DATA bool8 gDisableMusic = 0;
extern u32 gBattleTypeFlags;
extern struct MusicPlayerInfo gMPlayInfo_BGM;

View File

@ -270,8 +270,8 @@ static u16 sSpriteTileRanges[MAX_SPRITES * 2];
static struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT];
static u16 sSpritePaletteTags[16];
u32 gOamMatrixAllocBitmap;
u8 gReservedSpritePaletteCount;
COMMON_DATA u32 gOamMatrixAllocBitmap = 0;
COMMON_DATA u8 gReservedSpritePaletteCount = 0;
EWRAM_DATA struct Sprite gSprites[MAX_SPRITES + 1] = {0};
EWRAM_DATA u16 gSpritePriorities[MAX_SPRITES] = {0};

View File

@ -4,7 +4,7 @@
#define HEAD_SENTINEL 0xFE
#define TAIL_SENTINEL 0xFF
struct Task gTasks[NUM_TASKS];
COMMON_DATA struct Task gTasks[NUM_TASKS] = {0};
static void InsertTask(u8 newTaskId);
static u8 FindFirstActiveTask();

View File

@ -24,7 +24,7 @@ static s32 GetGlyphWidth_Male(u16 glyphId, bool32 isJapanese);
static s32 GetGlyphWidth_Female(u16 glyphId, bool32 isJapanese);
static void SpriteCB_TextCursor(struct Sprite *sprite);
TextFlags gTextFlags;
COMMON_DATA TextFlags gTextFlags = {0};
static const u8 sDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow.4bpp");
static const u8 sDarkDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow_RS.4bpp");

View File

@ -10,8 +10,8 @@ static u16 sLastTextBgColor;
static u16 sLastTextFgColor;
static u16 sLastTextShadowColor;
const struct FontInfo *gFonts;
struct GlyphInfo gGlyphInfo;
COMMON_DATA const struct FontInfo *gFonts = NULL;
COMMON_DATA struct GlyphInfo gGlyphInfo = {0};
static const u8 sFontHalfRowOffsets[] =
{

View File

@ -1,8 +1,8 @@
#include "global.h"
#include "gflib.h"
u8 gWindowClearTile;
void *gWindowBgTilemapBuffers[4];
COMMON_DATA u8 gWindowClearTile = {0};
COMMON_DATA void *gWindowBgTilemapBuffers[4] = {0};
EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0};

View File

@ -1,7 +1,6 @@
#include <cstdio>
#include <cstring>
#include <cstdint>
#include <map>
#include <vector>
#include <string>
#include "ramscrgen.h"
@ -22,6 +21,7 @@ static int s_shstrtabIndex;
static std::uint32_t s_symtabOffset;
static std::uint32_t s_strtabOffset;
static std::uint32_t s_pseudoCommonSectionIndex;
static std::uint32_t s_symbolCount;
static std::uint32_t s_elfFileOffset;
@ -101,18 +101,6 @@ static void VerifyElfIdent()
FATAL_ERROR("error: \"%s\" not little-endian ELF\n", s_elfPath.c_str());
}
static void VerifyAr()
{
char expectedMagic[8] = {'!', '<', 'a', 'r', 'c', 'h', '>', '\n'};
char magic[8];
if (std::fread(magic, 8, 1, s_file) != 1)
FATAL_ERROR("error: failed to read AR magic from \"%s\"\n", s_archiveFilePath.c_str());
if (std::memcmp(magic, expectedMagic, 8) != 0)
FATAL_ERROR("error: AR magic did not match in \"%s\"\n", s_archiveFilePath.c_str());
}
static void ReadElfHeader()
{
Seek(0x20);
@ -123,40 +111,6 @@ static void ReadElfHeader()
s_shstrtabIndex = ReadInt16();
}
static void FindArObj()
{
char file_ident[17] = {0};
char filesize_s[11] = {0};
char expectedEndMagic[2] = { 0x60, 0x0a };
char end_magic[2];
std::size_t filesize;
Seek(8);
while (!std::feof(s_file)) {
if (std::fread(file_ident, 16, 1, s_file) != 1)
FATAL_ERROR("error: failed to read file ident in \"%s\"\n", s_archiveFilePath.c_str());
Skip(32);
if (std::fread(filesize_s, 10, 1, s_file) != 1)
FATAL_ERROR("error: failed to read filesize in \"%s\"\n", s_archiveFilePath.c_str());
if (std::fread(end_magic, 2, 1, s_file) != 1)
FATAL_ERROR("error: failed to read end sentinel in \"%s\"\n", s_archiveFilePath.c_str());
if (std::memcmp(end_magic, expectedEndMagic, 2) != 0)
FATAL_ERROR("error: corrupted archive header in \"%s\" at \"%s\"\n", s_archiveFilePath.c_str(), file_ident);
char * ptr = std::strchr(file_ident, '/');
if (ptr != nullptr)
*ptr = 0;
filesize = std::strtoul(filesize_s, nullptr, 10);
if (std::strncmp(s_archiveObjectPath.c_str(), file_ident, 16) == 0) {
s_elfFileOffset = std::ftell(s_file);
return;
}
Skip(filesize);
}
FATAL_ERROR("error: could not find object \"%s\" in archive \"%s\"\n", s_archiveObjectPath.c_str(), s_archiveFilePath.c_str());
}
static std::string GetSectionName(std::uint32_t shstrtabOffset, int index)
{
Seek(s_sectionHeaderOffset + s_sectionHeaderEntrySize * index);
@ -169,6 +123,7 @@ static void FindTableOffsets()
{
s_symtabOffset = 0;
s_strtabOffset = 0;
s_pseudoCommonSectionIndex = 0;
Seek(s_sectionHeaderOffset + s_sectionHeaderEntrySize * s_shstrtabIndex + 0x10);
std::uint32_t shstrtabOffset = ReadInt32();
@ -192,6 +147,11 @@ static void FindTableOffsets()
FATAL_ERROR("error: mutiple .strtab sections found in \"%s\"\n", s_elfPath.c_str());
Seek(s_sectionHeaderOffset + s_sectionHeaderEntrySize * i + 0x10);
s_strtabOffset = ReadInt32();
} else if (name == "common_data") {
if (s_pseudoCommonSectionIndex) {
FATAL_ERROR("error: mutiple common_data sections found in \"%s\"\n", s_elfPath.c_str());
}
s_pseudoCommonSectionIndex = i;
}
}
@ -202,65 +162,50 @@ static void FindTableOffsets()
FATAL_ERROR("error: couldn't find .strtab section in \"%s\"\n", s_elfPath.c_str());
}
static std::map<std::string, std::uint32_t> GetCommonSymbols_Shared()
static std::vector<std::pair<std::string, std::uint32_t>> GetCommonSymbols_Shared()
{
VerifyElfIdent();
ReadElfHeader();
FindTableOffsets();
std::map<std::string, std::uint32_t> commonSymbols;
std::vector<std::pair<std::string, std::uint32_t>> commonSymbols;
std::vector<Symbol> commonSymbolVec;
Seek(s_symtabOffset);
for (std::uint32_t i = 0; i < s_symbolCount; i++)
{
Symbol sym;
sym.nameOffset = ReadInt32();
Skip(4);
sym.size = ReadInt32();
Skip(2);
std::uint16_t sectionIndex = ReadInt16();
if (sectionIndex == SHN_COMMON)
commonSymbolVec.push_back(sym);
}
for (const Symbol& sym : commonSymbolVec)
{
Seek(s_strtabOffset + sym.nameOffset);
std::string name = ReadString();
commonSymbols[name] = sym.size;
if (s_pseudoCommonSectionIndex) {
std::vector<Symbol> commonSymbolVec;
Seek(s_symtabOffset);
for (std::uint32_t i = 0; i < s_symbolCount; i++)
{
Symbol sym;
sym.nameOffset = ReadInt32();
Skip(4);
sym.size = ReadInt32();
Skip(2);
std::uint16_t sectionIndex = ReadInt16();
if (sectionIndex == s_pseudoCommonSectionIndex)
commonSymbolVec.push_back(sym);
}
for (const Symbol& sym : commonSymbolVec)
{
Seek(s_strtabOffset + sym.nameOffset);
std::string name = ReadString();
if (name == "$d" || name == "") {
continue;
}
commonSymbols.emplace_back(name, sym.size);
}
}
return commonSymbols;
}
std::map<std::string, std::uint32_t> GetCommonSymbolsFromLib(std::string sourcePath, std::string libpath)
{
std::size_t colonPos = libpath.find(':');
if (colonPos == std::string::npos)
FATAL_ERROR("error: missing colon separator in libfile \"%s\"\n", s_elfPath.c_str());
s_archiveObjectPath = libpath.substr(colonPos + 1);
s_archiveFilePath = sourcePath + "/" + libpath.substr(1, colonPos - 1);
s_elfPath = sourcePath + "/" + libpath.substr(1);
s_file = std::fopen(s_archiveFilePath.c_str(), "rb");
if (s_file == NULL)
FATAL_ERROR("error: failed to open \"%s\" for reading\n", s_archiveFilePath.c_str());
VerifyAr();
FindArObj();
return GetCommonSymbols_Shared();
}
std::map<std::string, std::uint32_t> GetCommonSymbols(std::string sourcePath, std::string path)
std::vector<std::pair<std::string, std::uint32_t>> GetCommonSymbols(std::string sourcePath, std::string path)
{
s_elfFileOffset = 0;
if (path[0] == '*')
return GetCommonSymbolsFromLib(sourcePath, path);
FATAL_ERROR("error: library common syms are unsupported (filename: \"%s\")\n", path.c_str());
s_elfPath = sourcePath + "/" + path;
s_file = std::fopen(s_elfPath.c_str(), "rb");

View File

@ -22,9 +22,9 @@
#define ELF_H
#include <cstdint>
#include <map>
#include <vector>
#include <string>
std::map<std::string, std::uint32_t> GetCommonSymbols(std::string sourcePath, std::string path);
std::vector<std::pair<std::string, std::uint32_t>> GetCommonSymbols(std::string sourcePath, std::string path);
#endif // ELF_H

View File

@ -28,54 +28,19 @@
void HandleCommonInclude(std::string filename, std::string sourcePath, std::string symOrderPath, std::string lang)
{
auto commonSymbols = GetCommonSymbols(sourcePath, filename);
std::size_t dotIndex;
if (filename[0] == '*') {
dotIndex = filename.find_last_of(':');
filename = filename.substr(dotIndex + 1);
}
dotIndex = filename.find_last_of('.');
if (dotIndex == std::string::npos)
FATAL_ERROR("error: \"%s\" doesn't have a file extension\n", filename.c_str());
std::string symOrderFilename = filename.substr(0, dotIndex + 1) + "txt";
SymFile symFile(symOrderPath + "/" + symOrderFilename);
while (!symFile.IsAtEnd())
for (const auto& commonSym : commonSymbols)
{
symFile.HandleLangConditional(lang);
unsigned long size = commonSym.second;
std::string label = symFile.GetLabel(false);
if (label.length() == 0)
{
unsigned long length;
if (symFile.ReadInteger(length))
{
if (length & 3)
symFile.RaiseWarning("gap length %d is not multiple of 4", length);
printf(". += 0x%lX;\n", length);
}
}
else
{
if (commonSymbols.count(label) == 0)
symFile.RaiseError("no common symbol named \"%s\"", label.c_str());
unsigned long size = commonSymbols[label];
int alignment = 4;
if (size > 4)
alignment = 8;
if (size > 8)
alignment = 16;
printf(". = ALIGN(%d);\n", alignment);
printf("%s = .;\n", label.c_str());
printf(". += 0x%lX;\n", size);
}
symFile.ExpectEmptyRestOfLine();
int alignment = 4;
if (size > 4)
alignment = 8;
if (size > 8)
alignment = 16;
printf(". = ALIGN(%d);\n", alignment);
printf("%s = .;\n", commonSym.first.c_str());
printf(". += 0x%lX;\n", size);
}
}

View File

@ -33,6 +33,11 @@ CFile::CFile(std::string path)
m_size = std::ftell(fp);
if (m_size < 0)
FATAL_ERROR("File size of \"%s\" is less than zero.\n", path.c_str());
else if (m_size == 0)
return; // Empty file
m_buffer = new char[m_size + 1];
m_buffer[m_size] = 0;
@ -49,7 +54,7 @@ CFile::CFile(std::string path)
CFile::~CFile()
{
delete[] m_buffer;
if (m_size > 0) delete[] m_buffer;
}
void CFile::FindIncbins()

Some files were not shown because too many files have changed in this diff Show More