diff options
35 files changed, 299 insertions, 125 deletions
diff --git a/.travis.yml b/.travis.yml index 519ba1aca..e0608744a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: generic -dist: trusty +dist: bionic sudo: false addons: apt: @@ -27,5 +27,6 @@ matrix: script: - make tools CXX=g++-7 - make -j2 compare + - make -j2 compare_firered_rev1 after_success: - .travis/calcrom/webhook.sh pokefirered @@ -5,36 +5,7 @@ CPP := $(CC) -E LD := tools/binutils/bin/arm-none-eabi-ld OBJCOPY := tools/binutils/bin/arm-none-eabi-objcopy -GAME_VERSION := FIRERED -REVISION := 0 -GAME_LANGUAGE := ENGLISH - -# So long as baserom.gba is required, we error out if the -# user tries to build any ROM other than FireRed. -ifneq ($(GAME_VERSION),FIRERED) -$(error We can only build English Pokemon FireRed v1.0 currently) -else ifneq ($(REVISION),0) -$(error We can only build English Pokemon FireRed v1.0 currently) -else ifneq ($(GAME_LANGUAGE),ENGLISH) -$(error We can only build English Pokemon FireRed v1.0 currently) -endif - -ifeq ($(GAME_VERSION),FIRERED) -TITLE := POKEMON FIRE -GAME_CODE := BPR -BUILD_NAME := firered -else -TITLE := POKEMON LEAF -GAME_CODE := BPL -BUILD_NAME := leafgreen -endif -ifeq ($(GAME_LANGUAGE),ENGLISH) -GAME_CODE := $(GAME_CODE)E -endif -ifneq ($(REVISION),0) -BUILD_NAME := $(BUILD_NAME)_rev$(REVISION) -endif -MAKER_CODE := 01 +include config.mk SHELL := /bin/bash -o pipefail @@ -57,12 +28,12 @@ DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR) SONG_BUILDDIR = $(OBJ_DIR)/$(SONG_SUBDIR) MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR) -ASFLAGS := -mcpu=arm7tdmi --defsym $(GAME_VERSION)=1 --defsym REVISION=$(REVISION) --defsym $(GAME_LANGUAGE)=1 +ASFLAGS := -mcpu=arm7tdmi --defsym $(GAME_VERSION)=1 --defsym REVISION=$(GAME_REVISION) --defsym $(GAME_LANGUAGE)=1 CC1 := tools/agbcc/bin/agbcc override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm -CPPFLAGS := -I tools/agbcc -I tools/agbcc/include -iquote include -nostdinc -undef -D$(GAME_VERSION) -DREVISION=$(REVISION) -D$(GAME_LANGUAGE) +CPPFLAGS := -I tools/agbcc -I tools/agbcc/include -iquote include -nostdinc -undef -D$(GAME_VERSION) -DREVISION=$(GAME_REVISION) -D$(GAME_LANGUAGE) LDFLAGS = -Map ../../$(MAP) @@ -133,7 +104,7 @@ all: tools rom rom: $(ROM) ifeq ($(COMPARE),1) - @$(SHA1) rom.sha1 + @$(SHA1) $(BUILD_NAME).sha1 endif tools: $(TOOLDIRS) @@ -252,8 +223,18 @@ $(OBJ_DIR)/ld_script.ld: ld_script.txt $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_comm $(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) cd $(OBJ_DIR) && ../../$(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ $(LIB) - $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent + $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(GAME_REVISION) --silent $(ROM): $(ELF) $(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0x9000000 $< $@ +# "friendly" target names for convenience sake +firered: ; @$(MAKE) GAME_VERSION=FIRERED +firered_rev1: ; @$(MAKE) GAME_VERSION=FIRERED GAME_REVISION=1 +leafgreen: ; @$(MAKE) GAME_VERSION=LEAFGREEN +leafgreen_rev1: ; @$(MAKE) GAME_VERSION=LEAFGREEN GAME_REVISION=1 + +compare_firered: ; @$(MAKE) GAME_VERSION=FIRERED COMPARE=1 +compare_firered_rev1: ; @$(MAKE) GAME_VERSION=FIRERED GAME_REVISION=1 COMPARE=1 +compare_leafgreen: ; @$(MAKE) GAME_VERSION=LEAFGREEN COMPARE=1 +compare_leafgreen_rev1: ; @$(MAKE) GAME_VERSION=LEAFGREEN GAME_REVISION=1 COMPARE=1 diff --git a/asm/crt0.s b/asm/crt0.s index f2e28c9e1..609845337 100644 --- a/asm/crt0.s +++ b/asm/crt0.s @@ -46,20 +46,29 @@ GPIOPortReadEnable: @ 80000C8 .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF .4byte 0xFFFFFFFF + .ifdef FIRERED .4byte 4 .4byte 2 .ascii "pokemon red version" .space 13 - .4byte 0x82350AC @ gMonFrontPicTable - .4byte 0x823654C @ gMonBackPicTable - .4byte 0x823730C @ gMonPaletteTable - .4byte 0x82380CC @ gMonShinyPaletteTable - .4byte 0x83D37A0 @ gMonIconTable - .4byte 0x83D3E80 @ gMonIconPaletteIndices - .4byte 0x83D4038 @ gMonIconPaletteTable - .4byte 0x8245EE0 @ gSpeciesNames - .4byte 0x8247094 @ gMoveNames - .4byte 0x84556F8 @ gDecorations + .else + .ifdef LEAFGREEN + .4byte 5 + .4byte 2 + .ascii "pokemon green version" + .space 11 + .endif + .endif + .4byte gMonFrontPicTable + .4byte gMonBackPicTable + .4byte gMonPaletteTable + .4byte gMonShinyPaletteTable + .4byte gMonIconTable + .4byte gMonIconPaletteIndices + .4byte gMonIconPaletteTable + .4byte gSpeciesNames + .4byte gMoveNames + .4byte gDecorations .4byte 0xEE0 @ offsetof(struct SaveBlock1, flags) .4byte 0x1000 @ offsetof(struct SaveBlock1, vars) .4byte 0x18 @ offsetof(struct SaveBlock2, pokedex) @@ -88,13 +97,13 @@ GPIOPortReadEnable: @ 80000C8 .4byte 0x30BB .4byte 0x30A7 .4byte 0 - .4byte 0x8254784 @ gBaseStats - .4byte 0x824FC40 @ gAbilityNames - .4byte 0x824FB08 @ gAbilityDescriptionPointers - .4byte 0x83DB028 @ gItems - .4byte 0x8250C04 @ gBattleMoves - .4byte 0x826056C @ gBallSpriteSheets - .4byte 0x82605CC @ gBallSpritePalettes + .4byte gBaseStats + .4byte gAbilityNames + .4byte gAbilityDescriptionPointers + .4byte gItems + .4byte gBattleMoves + .4byte gBallSpriteSheets + .4byte gBallSpritePalettes .4byte 0xA8 .4byte 0x82C .4byte 0x83B diff --git a/asm/librfu.s b/asm/librfu.s index bdf816bd8..a291fcad3 100644 --- a/asm/librfu.s +++ b/asm/librfu.s @@ -2363,7 +2363,7 @@ _081E0668: lsrs r5, r0, 16 cmp r5, 0x3 bls _081E0668 - ldr r1, _081E06E0 @ =0x081E1B25 + ldr r1, _081E06E0 @ =sub_81E1B24 movs r5, 0x2 negs r5, r5 ands r5, r1 @@ -2371,7 +2371,7 @@ _081E0668: ldr r0, [r2] adds r4, r0, 0 adds r4, 0x8 - ldr r0, _081E06E4 @ =0x081E1B55 + ldr r0, _081E06E4 @ =rfu_REQ_changeMasterSlave subs r0, r1 lsls r0, 15 lsrs r3, r0, 16 @@ -2408,8 +2408,8 @@ _081E06D0: .4byte gUnknown_3007464 _081E06D4: .4byte gUnknown_3007468 _081E06D8: .4byte gUnknown_3007450 _081E06DC: .4byte gUnknown_3007440 -_081E06E0: .4byte 0x081E1B25 -_081E06E4: .4byte 0x081E1B55 +_081E06E0: .4byte sub_81E1B24 +_081E06E4: .4byte rfu_REQ_changeMasterSlave _081E06E8: .4byte 0x0000ffff thumb_func_end sub_81E05B0 diff --git a/asm/macros.inc b/asm/macros.inc index 3cc26c6f7..ffbe3db29 100644 --- a/asm/macros.inc +++ b/asm/macros.inc @@ -158,3 +158,12 @@ .byte \bg, \top, \left, \height, \width, \palno .2byte \baseBlock .endm + + .macro abspath relative + .if REVISION == 0 + .ascii "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/" + .else + .ascii "C:/WORK/POKeFRLG/Src/pm_lgfr_ose/source/" + .endif + .asciz "\relative" + .endm diff --git a/asm/pokedex_screen.s b/asm/pokedex_screen.s index 4bd153c77..94107279e 100644 --- a/asm/pokedex_screen.s +++ b/asm/pokedex_screen.s @@ -337,7 +337,11 @@ sub_8105800: @ 8105800 cmp r0, 0 beq _08105864 ldrb r0, [r5] + .if REVISION == 0 cmp r0, 0 + .else + cmp r0, 0xFF + .endif beq _08105878 _08105840: mov r1, sp @@ -351,7 +355,11 @@ _08105840: lsrs r4, r0, 24 adds r0, r5, r4 ldrb r0, [r0] + .if REVISION == 0 cmp r0, 0 + .else + cmp r0, 0xFF + .endif beq _08105878 cmp r4, 0xA bls _08105840 diff --git a/asmdiff.sh b/asmdiff.sh index d4627c007..9e2bef55b 100755 --- a/asmdiff.sh +++ b/asmdiff.sh @@ -1,7 +1,27 @@ #!/bin/bash +if [ "$1" == "firered" ] || [ "$1" == "leafgreen" ] || [ "$1" == "firered_rev1" ] || [ "$1" == "leafgreen_rev1" ]; then + buildname="$1" + shift +else + buildname=firered +fi + +if [ "$buildname" == "firered" ]; then + baserom=baserom +elif [ "$buildname" == "leafgreen" ]; then + baserom=baserom_lg +elif [ "$buildname" == "firered_rev1" ]; then + baserom=baserom_fr_rev1 +elif [ "$buildname" == "leafgreen_rev1" ]; then + baserom=baserom_lg_rev1 +else + echo unknown buildname $buildname + exit 1 +fi + OBJDUMP="$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb" OPTIONS="--start-address=$(($1)) --stop-address=$(($1 + $2))" -$OBJDUMP $OPTIONS baserom.gba > baserom.dump -$OBJDUMP $OPTIONS pokefirered.gba > pokefirered.dump -diff -u baserom.dump pokefirered.dump +$OBJDUMP $OPTIONS ${baserom}.gba > ${baserom}.dump || exit 1 +$OBJDUMP $OPTIONS poke${buildname}.gba > poke${buildname}.dump +diff -u ${baserom}.dump poke${buildname}.dump diff --git a/config.mk b/config.mk new file mode 100644 index 000000000..bf8f2ce3f --- /dev/null +++ b/config.mk @@ -0,0 +1,51 @@ +# Default variables + +GAME_VERSION ?= FIRERED +GAME_REVISION ?= 0 +GAME_LANGUAGE ?= ENGLISH +MODERN ?= 0 +COMPARE ?= 0 + +# For gbafix +MAKER_CODE := 01 + +# Version +ifeq ($(GAME_VERSION),FIRERED) +TITLE := POKEMON FIRE +GAME_CODE := BPR +BUILD_NAME := firered +else +ifeq ($(GAME_VERSION),LEAFGREEN) +TITLE := POKEMON LEAF +GAME_CODE := BPG +BUILD_NAME := leafgreen +else +$(error unknown version $(GAME_VERSION)) +endif +endif + +# Revision +ifeq ($(GAME_REVISION),0) +BUILD_NAME := $(BUILD_NAME) +else +ifeq ($(GAME_REVISION),1) +BUILD_NAME := $(BUILD_NAME)_rev1 +else +$(error unknown revision $(GAME_REVISION)) +endif +endif + +# Language +ifeq ($(GAME_LANGUAGE),ENGLISH) +BUILD_NAME := $(BUILD_NAME) +GAME_CODE := $(GAME_CODE)E +else +$(error unknown language $(GAME_LANGUAGE)) +endif + +# Modern GCC +ifeq ($(MODERN), 0) + BUILD_NAME := $(BUILD_NAME) +else + BUILD_NAME := $(BUILD_NAME)_modern +endif diff --git a/data/event_object_80688E4.s b/data/event_object_80688E4.s index 884bf379f..8d1917825 100644 --- a/data/event_object_80688E4.s +++ b/data/event_object_80688E4.s @@ -1,3 +1,5 @@ + .include "asm/macros.inc" + .include "constants/constants.inc" .section .rodata .align 2 @@ -88,7 +90,7 @@ gUnknown_83A7208:: @ 83A7208 .align 2 gUnknown_83A720C:: @ 83A720C - .asciz "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/evobjmv.c" + abspath "evobjmv.c" .align 2 gUnknown_83A7240:: @ 83A7240 diff --git a/data/event_scripts.s b/data/event_scripts.s index c2daa0031..21fdffe43 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -12361,9 +12361,8 @@ gUnknown_81C1300:: @ 81C1300 .string "It looks like it's having fun.$" EventScript_1C1338:: @ 81C1338 - waitse - setdivewarp MAP_UNKNOWN_MAP_00_00, 72, 7187, 8 - nop + map_script_2 VAR_0x4030, 0, EventScript_1C1348 + .2byte 0 copyvar VAR_0x4030, 1 end @@ -14474,8 +14473,9 @@ Text_1C55A4:: @ 81C55A4 .string "テストよう メッセージです!\n" .string "ざひょう チェックの イベントです$" -Text_1C55C5:: @ 81C55C5 - .string " $" + .align 2 +Text_1C55C8:: @ 81C55C8 + .string "$" gText_WouldYouLikeToSaveTheGame:: @ 81C55C9 .string "Would you like to save the game?$" diff --git a/data/field_effect.s b/data/field_effect.s index c6affccd2..7e797c560 100644 --- a/data/field_effect.s +++ b/data/field_effect.s @@ -45,6 +45,9 @@ gUnknown_83CBB10:: @ 83CBB10 gbapal gUnknown_83CBA90 gUnknown_83CBB30:: @ 83CBB30 4bpp .incbin "graphics/field_effects/unk_83CBB30.bin" +gUnknown_83CBDB0:: + .incbin "graphics/field_effects/unk_83CBDB0.4bpp" + .align 2 gUnknown_83CBE30:: @ 83CBE30 dataptr .4byte FieldEffectCmd_loadtiles @@ -398,10 +401,10 @@ gUnknown_83CC244:: @ 83CC244 dataptr .4byte sub_8087CB4 gUnknown_83CC250:: @ 83CC250 sprite_frames - obj_frame_tiles 0x083cbdb0, 0x0020 - obj_frame_tiles 0x083cbdd0, 0x0020 - obj_frame_tiles 0x083cbdf0, 0x0020 - obj_frame_tiles 0x083cbe10, 0x0020 + obj_frame_tiles gUnknown_83CBDB0 + 0x00, 0x0020 + obj_frame_tiles gUnknown_83CBDB0 + 0x20, 0x0020 + obj_frame_tiles gUnknown_83CBDB0 + 0x40, 0x0020 + obj_frame_tiles gUnknown_83CBDB0 + 0x60, 0x0020 gUnknown_83CC270:: @ 83CC270 animcmd obj_image_anim_frame 0x0000, 0 diff --git a/data/link_rfu.s b/data/link_rfu.s index 8e9abd3f0..79be01714 100644 --- a/data/link_rfu.s +++ b/data/link_rfu.s @@ -221,10 +221,10 @@ gUnknown_843F9A0:: obj_image_anim_end gUnknown_843F9A8:: - .4byte 0x843f988 - .4byte 0x843f990 - .4byte 0x843f998 - .4byte 0x843f9a0 + .4byte gUnknown_843F988 + .4byte gUnknown_843F990 + .4byte gUnknown_843F998 + .4byte gUnknown_843F9A0 gUnknown_843F9B8:: @ 843F9B8 sprite_template spr_template 1, 1, gUnknown_843F980, gUnknown_843F9A8, NULL, gDummySpriteAffineAnimTable, sub_8101B20 diff --git a/data/link_rfu_2.s b/data/link_rfu_2.s index 5285ac578..4f88177aa 100644 --- a/data/link_rfu_2.s +++ b/data/link_rfu_2.s @@ -95,7 +95,7 @@ gUnknown_843ED88:: @ 843ED88 .align 2 gUnknown_843ED94:: @ 843ED94 - .asciz "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/rfu.c" + abspath "rfu.c" .align 2 gUnknown_843EDC4:: @ 843EDC4 diff --git a/data/link_rfu_3.s b/data/link_rfu_3.s index 2effddd97..6cd65b04d 100644 --- a/data/link_rfu_3.s +++ b/data/link_rfu_3.s @@ -315,7 +315,7 @@ gUnknown_8457120:: @ 8457120 .align 2 gUnknown_8457138:: @ 8457138 - .asciz "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/rfu_union_tool.c" + abspath "rfu_union_tool.c" .align 2 gUnknown_8457174:: @ 8457174 diff --git a/data/text/help_system.inc b/data/text/help_system.inc index 7a74de349..ccc57332b 100644 --- a/data/text/help_system.inc +++ b/data/text/help_system.inc @@ -980,8 +980,13 @@ gUnknown_81B752C:: @ 81B752C .string " the POKéDEX list.\n" .string "{CIRCLE_2} A caught POKéMON will provide a\n" .string " large amount of data.\n" + .if REVISION < 1 .string "{CIRCLE_3} Select “AREA” to display the TOWN\n" .string " MAP with the POKéMON's habitat(s).$" + .else + .string "{CIRCLE_3} Select “NEXT DATA” to display the\n" + .string " TOWN MAP with its habitat(s).$" + .endif gUnknown_81B7611:: @ 81B7611 .string "{CIRCLE_1} Go up to the PC at home, then press\n" diff --git a/rom.sha1 b/firered.sha1 index a4d3b2fe2..a4d3b2fe2 100644 --- a/rom.sha1 +++ b/firered.sha1 diff --git a/firered_rev1.sha1 b/firered_rev1.sha1 new file mode 100644 index 000000000..2cb2ef855 --- /dev/null +++ b/firered_rev1.sha1 @@ -0,0 +1 @@ +dd5945db9b930750cb39d00c84da8571feebf417 pokefirered_rev1.gba diff --git a/graphics/field_effects/unk_83CBB30.bin b/graphics/field_effects/unk_83CBB30.bin Binary files differindex 9543a056e..f7c2f2142 100644 --- a/graphics/field_effects/unk_83CBB30.bin +++ b/graphics/field_effects/unk_83CBB30.bin diff --git a/graphics/field_effects/unk_83CBDB0.png b/graphics/field_effects/unk_83CBDB0.png Binary files differnew file mode 100644 index 000000000..5a84d2e06 --- /dev/null +++ b/graphics/field_effects/unk_83CBDB0.png diff --git a/include/config.h b/include/config.h index 491eadf13..67dc38a2b 100644 --- a/include/config.h +++ b/include/config.h @@ -11,9 +11,15 @@ // #define NDEBUG // Fire Red likely forgot to define NDEBUG/NOAGBPRN before release, leading -// to the inclusion of asserts in the retail ROM. Don't try to re-enable this yet -// since not all baseroms and pointers have been dumped yet and will result in -// a broken ROM. +// to the inclusion of asserts in the retail ROM. + +#if REVISION == 0 +#define CODE_ROOT "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/" +#else +#define CODE_ROOT "C:/WORK/POKeFRLG/Src/pm_lgfr_ose/source/" +#endif + +#define ABSPATH(x) (CODE_ROOT x) #ifdef ENGLISH #define UNITS_IMPERIAL diff --git a/leafgreen.sha1 b/leafgreen.sha1 new file mode 100644 index 000000000..3cb75847e --- /dev/null +++ b/leafgreen.sha1 @@ -0,0 +1 @@ +574fa542ffebb14be69902d1d36f1ec0a4afd71e pokeleafgreen.gba diff --git a/leafgreen_rev1.sha1 b/leafgreen_rev1.sha1 new file mode 100644 index 000000000..94c865e70 --- /dev/null +++ b/leafgreen_rev1.sha1 @@ -0,0 +1 @@ +7862c67bdecbe21d1d69ce082ce34327e1c6ed5e pokeleafgreen_rev1.gba diff --git a/src/cereader_tool.c b/src/cereader_tool.c index 654a70b48..2c5d05018 100644 --- a/src/cereader_tool.c +++ b/src/cereader_tool.c @@ -41,8 +41,8 @@ bool32 ValidateTrainerTowerData(struct EReaderTrainerHillSet * ttdata) static bool32 CEReaderTool_SaveTrainerTower_r(struct EReaderTrainerHillSet * ttdata, u8 * buffer) { - AGB_ASSERT_EX(ttdata->dummy == 0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/cereader_tool.c", 198); - AGB_ASSERT_EX(ttdata->id == 0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/cereader_tool.c", 199) + AGB_ASSERT_EX(ttdata->dummy == 0, ABSPATH("cereader_tool.c"), 198); + AGB_ASSERT_EX(ttdata->id == 0, ABSPATH("cereader_tool.c"), 199) memset(buffer, 0, 0x1000); memcpy(buffer, ttdata, SEC30_SIZE); diff --git a/src/data/pokemon/pokedex_text.h b/src/data/pokemon/pokedex_text.h index 3285c8d11..be073876f 100644 --- a/src/data/pokemon/pokedex_text.h +++ b/src/data/pokemon/pokedex_text.h @@ -1063,9 +1063,14 @@ const u8 gMewPokedexText[] = _( const u8 gMewPokedexTextUnused[] = _(""); const u8 gChikoritaPokedexText[] = _( +#if REVISION == 0 "Its pleasantly aromatic leaves have the\n" +#else + "Its pleasantly aromatic leaf has the\n" +#endif "ability to check the humidity and\n" - "temperature."); + "temperature." +); const u8 gChikoritaPokedexTextUnused[] = _(""); @@ -1735,9 +1740,16 @@ const u8 gPupitarPokedexText[] = _( const u8 gPupitarPokedexTextUnused[] = _(""); const u8 gTyranitarPokedexText[] = _( +#if REVISION == 0 "Its body can't be harmed by any sort of\n" "attack, so it is very eager to make\n" - "challenges against enemies."); + "challenges against enemies." +#else + "It has an impudent nature. Having great\n" + "strength, it can even change surrounding\n" + "landforms." +#endif +); const u8 gTyranitarPokedexTextUnused[] = _(""); diff --git a/src/daycare.c b/src/daycare.c index 8862dfda9..b3e76faba 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1503,7 +1503,11 @@ static void DaycarePrintMonLvl(struct DayCare *daycare, u8 windowId, u32 daycare u8 lvlText[12]; u8 intText[8]; +#if REVISION == 0 strcpy((char *)lvlText, (const char *)gText_Lv); +#else + StringCopy(lvlText, gText_Lv); +#endif level = GetLevelAfterDaycareSteps(&daycare->mons[daycareSlotId].mon, daycare->mons[daycareSlotId].steps); ConvertIntToDecimalStringN(intText, level, STR_CONV_MODE_LEFT_ALIGN, 3); StringAppend(lvlText, intText); diff --git a/src/field_specials.c b/src/field_specials.c index de3bc7d57..7abc3f5c9 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1915,7 +1915,7 @@ u16 Special_BattleCardAction(void) case 4: return sub_81445C0(2); default: - AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/scr_tool.c", 3873); + AGB_ASSERT_EX(0, ABSPATH("scr_tool.c"), 3873); return 0; } } diff --git a/src/fieldmap.c b/src/fieldmap.c index 5582b6977..adb26f230 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -83,7 +83,7 @@ void sub_8058A00(struct MapHeader * mapHeader) VMap.map = gBackupMapLayout; VMap.Xsize = mapLayout->width + 15; VMap.Ysize = mapLayout->height + 14; - AGB_ASSERT_EX(VMap.Xsize * VMap.Ysize <= VIRTUAL_MAP_SIZE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/fieldmap.c", 158); + AGB_ASSERT_EX(VMap.Xsize * VMap.Ysize <= VIRTUAL_MAP_SIZE, ABSPATH("fieldmap.c"), 158); map_copy_with_padding(mapLayout->map, mapLayout->width, mapLayout->height); mapheader_copy_mapdata_of_adjacent_maps(mapHeader); } diff --git a/src/intro.c b/src/intro.c index 33a03a389..cee1c8fec 100644 --- a/src/intro.c +++ b/src/intro.c @@ -131,6 +131,11 @@ static void sub_80EE9D4(struct Sprite * sprite); static void sub_80EEA94(struct IntroSequenceData * ptr); static void sub_80EEB08(struct Sprite * sprite); static void sub_80EEBE4(void); +#if REVISION >= 1 +static void sub_rev1_80EDFAC(void); +#else +#define sub_rev1_80EDFAC() +#endif extern const u32 gMultiBootProgram_PokemonColosseum_Start[]; @@ -828,6 +833,7 @@ static void sub_80ECD60(struct IntroSequenceData * this) if (!IsDma3ManagerBusyWithBgCopy()) { DestroySprite(this->field_0014); + sub_rev1_80EDFAC(); this->field_0012 = 0; this->field_0004++; } @@ -1592,6 +1598,17 @@ static struct Sprite * sub_80EDF68(void) return &gSprites[spriteId]; } +#if REVISION >= 1 +static void sub_rev1_80EDFAC(void) +{ + int i; + for (i = 0; i < 2; i++) + { + gSprites[CreateSprite(&gUnknown_840BCFC, 0x68 + 32 * i, 0x6c, 5)].oam.tileNum += i * 4; + } +} +#endif + static void sub_80EDF94(struct IntroSequenceData * this) { u8 taskId; diff --git a/src/main.c b/src/main.c index 9294c80ce..6d50e5fd3 100644 --- a/src/main.c +++ b/src/main.c @@ -57,14 +57,20 @@ static void IntrDummy(void); #if defined(FIRERED) #define GAME_VERSION VERSION_FIRE_RED -#elif defined(LEAF_GREEN) +#elif defined(LEAFGREEN) #define GAME_VERSION VERSION_LEAF_GREEN +#else +#error unknown version #endif const u8 gGameVersion = GAME_VERSION; const u8 gGameLanguage = GAME_LANGUAGE; +#if REVISION == 0 const char BuildDateTime[] = "2004 04 26 11:20"; +#else +const char BuildDateTime[] = "2004 07 20 09:30"; +#endif const IntrFunc gIntrTableTemplate[] = { diff --git a/src/malloc.c b/src/malloc.c index 4768721ba..590d45c05 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -93,7 +93,7 @@ void *AllocInternal(void *heapStart, u32 size) if (pos->next == head) { - AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/gflib/malloc.c", 174); + AGB_ASSERT_EX(0, ABSPATH("gflib/malloc.c"), 174); return NULL; } @@ -103,20 +103,20 @@ void *AllocInternal(void *heapStart, u32 size) void FreeInternal(void *heapStart, void *p) { - AGB_ASSERT_EX(p != NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/gflib/malloc.c", 195); + AGB_ASSERT_EX(p != NULL, ABSPATH("gflib/malloc.c"), 195); if (p) { struct MemBlock *head = (struct MemBlock *)heapStart; struct MemBlock *pos = (struct MemBlock *)((u8 *)p - sizeof(struct MemBlock)); - AGB_ASSERT_EX(pos->magic_number == MALLOC_SYSTEM_ID, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/gflib/malloc.c", 204); - AGB_ASSERT_EX(pos->flag == TRUE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/gflib/malloc.c", 205); + AGB_ASSERT_EX(pos->magic_number == MALLOC_SYSTEM_ID, ABSPATH("gflib/malloc.c"), 204); + AGB_ASSERT_EX(pos->flag == TRUE, ABSPATH("gflib/malloc.c"), 205); pos->flag = FALSE; // If the freed block isn't the last one, merge with the next block // if it's not in use. if (pos->next != head) { if (!pos->next->flag) { - AGB_ASSERT_EX(pos->next->magic_number == MALLOC_SYSTEM_ID, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/gflib/malloc.c", 211); + AGB_ASSERT_EX(pos->next->magic_number == MALLOC_SYSTEM_ID, ABSPATH("gflib/malloc.c"), 211); pos->size += sizeof(struct MemBlock) + pos->next->size; pos->next->magic_number = 0; pos->next = pos->next->next; @@ -129,7 +129,7 @@ void FreeInternal(void *heapStart, void *p) // if it's not in use. if (pos != head) { if (!pos->prev->flag) { - AGB_ASSERT_EX(pos->prev->magic_number == MALLOC_SYSTEM_ID, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/gflib/malloc.c", 228); + AGB_ASSERT_EX(pos->prev->magic_number == MALLOC_SYSTEM_ID, ABSPATH("gflib/malloc.c"), 228); pos->prev->next = pos->next; diff --git a/src/menews_jisan.c b/src/menews_jisan.c index f38de9cfd..d8971f6a2 100644 --- a/src/menews_jisan.c +++ b/src/menews_jisan.c @@ -142,7 +142,7 @@ static u32 GetMENewsJisanState(struct MENewsJisanStruct *a0) return 4; return 5; default: - AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/menews_jisan.c", 383); + AGB_ASSERT_EX(0, ABSPATH("menews_jisan.c"), 383); return 0; } } diff --git a/src/mevent.c b/src/mevent.c index 5ed001d09..3eff0c086 100644 --- a/src/mevent.c +++ b/src/mevent.c @@ -852,7 +852,7 @@ u16 sub_81444B0(const struct MEventClientHeaderStruct * a0, u32 command) case 4: return a0->unk_44; default: - AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent.c", 825); + AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 825); return 0; } } @@ -881,7 +881,7 @@ void sub_814451C(u32 command) } if (dest == NULL) { - AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent.c", 868); + AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 868); } else if (++(*dest) > 999) { @@ -939,7 +939,7 @@ u16 sub_81445C0(u32 command) break; } } - AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent.c", 913); + AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 913); return 0; } @@ -977,7 +977,7 @@ void sub_8144714(u32 a0, u32 a1) sub_8144824(1, a1, gSaveBlock1Ptr->mysteryEventBuffers.unk_344[0], 5); break; default: - AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent.c", 988); + AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 988); } } } diff --git a/src/mevent_server.c b/src/mevent_server.c index 252a8885f..bebd69fe3 100644 --- a/src/mevent_server.c +++ b/src/mevent_server.c @@ -68,7 +68,7 @@ static void mevent_srv_free_resources(struct mevent_srv_common * svr) static void mevent_srv_common_init_send(struct mevent_srv_common * svr, u32 ident, const void * src, u32 size) { - AGB_ASSERT_EX(size <= ME_SEND_BUF_SIZE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 257); + AGB_ASSERT_EX(size <= ME_SEND_BUF_SIZE, ABSPATH("mevent_server.c"), 257); mevent_srv_sub_init_send(&svr->manager, ident, src, size); } @@ -129,7 +129,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) switch (cmd->instr) { case 0: - AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 354); + AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 354); svr->mainseqno = 1; svr->param = cmd->flag; break; @@ -137,23 +137,23 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) svr->mainseqno = 3; break; case 2: - AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 364); + AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 364); mevent_srv_sub_init_recv(&svr->manager, cmd->flag, svr->recvBuffer); svr->mainseqno = 2; break; case 3: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 370); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 370); svr->cmdidx = 0; svr->cmdBuffer = cmd->parameter; break; case 5: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 376); - AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 377); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 376); + AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 377); memcpy(svr->mevent_unk1442cc, svr->recvBuffer, sizeof(struct MEventClientHeaderStruct)); break; case 6: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 382); - AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 383); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 382); + AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 383); svr->param = ValidateMEventClientHeader(svr->mevent_unk1442cc); break; case 4: @@ -164,42 +164,42 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) } break; case 7: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 396); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 396); ptr = mevent_first_if_not_null_else_second(cmd->parameter, svr->card); svr->param = sub_8144418(ptr, svr->mevent_unk1442cc, ptr); break; case 8: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 402); - AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 403); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 402); + AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 403); svr->param = *(u32 *)svr->recvBuffer; break; case 9: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 408); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 408); ptr = mevent_first_if_not_null_else_second(cmd->parameter, &svr->sendWord); svr->param = sub_8144434(ptr, svr->mevent_unk1442cc, ptr); break; case 10: - AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 415); + AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 415); svr->param = sub_81444B0(svr->mevent_unk1442cc, cmd->flag); break; case 11: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 420); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 420); svr->param = sub_8144474(svr->mevent_unk1442cc, cmd->parameter); break; case 12: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 426); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 426); svr->param = mevent_compare_pointers(cmd->parameter, *(void **)svr->recvBuffer); break; case 14: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 432); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 432); mevent_srv_common_init_send(svr, 0x17, mevent_first_if_not_null_else_second(cmd->parameter, svr->news), sizeof(struct MEWonderNewsData)); break; case 13: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 438); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 438); mevent_srv_common_init_send(svr, 0x16, mevent_first_if_not_null_else_second(cmd->parameter, svr->card), sizeof(struct MEWonderCardData)); break; case 16: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 444); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 444); mevent_srv_common_init_send(svr, 0x18, mevent_first_if_not_null_else_second(cmd->parameter, &svr->sendWord), 4); break; case 15: @@ -215,7 +215,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) mevent_srv_common_init_send(svr, 0x10, cmd->parameter, cmd->flag); break; case 19: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 466); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 466); mevent_srv_common_init_send(svr, 0x1a, cmd->parameter, 188); break; case 20: @@ -225,15 +225,15 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) mevent_srv_common_init_send(svr, 0x1c, cmd->parameter, cmd->flag); break; case 22: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 481); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 481); memcpy(svr->card, cmd->parameter, 332); break; case 23: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 486); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 486); memcpy(svr->news, cmd->parameter, 444); break; case 21: - AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 491); + AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 491); svr->sendWord = *(u32 *)cmd->parameter; break; case 24: @@ -245,16 +245,16 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) svr->sendBuffer2Size = cmd->flag; break; case 26: - AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 506); + AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 506); memcpy(svr->card, GetSavedWonderCard(), 332); sub_814410C(svr->card); break; case 27: - AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 512); + AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 512); memcpy(svr->news, GetSavedWonderNews(), 444); break; case 28: - AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 517); + AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 517); svr->sendBuffer1 = sub_8069E48(); break; case 29: @@ -276,8 +276,8 @@ static u32 (*const func_tbl[])(struct mevent_srv_common *) = { static u32 mevent_srv_exec_common(struct mevent_srv_common * svr) { u32 response; - AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl), "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 546); + AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl), ABSPATH("mevent_server.c"), 546); response = func_tbl[svr->mainseqno](svr); - AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl), "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 548); + AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl), ABSPATH("mevent_server.c"), 548); return response; } diff --git a/src/scrcmd.c b/src/scrcmd.c index 6a5d61227..a88655e17 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -105,7 +105,7 @@ bool8 ScrCmd_special(struct ScriptContext *ctx) if (specialPtr < gSpecialsEnd) (*specialPtr)(); else - AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/scrcmd.c", 241); + AGB_ASSERT_EX(0, ABSPATH("scrcmd.c"), 241); return FALSE; } @@ -116,7 +116,7 @@ bool8 ScrCmd_specialvar(struct ScriptContext *ctx) if (specialPtr < gSpecialsEnd) *varPtr = (*specialPtr)(); else - AGB_ASSERT_EX(0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/scrcmd.c", 263); + AGB_ASSERT_EX(0, ABSPATH("scrcmd.c"), 263); return FALSE; } diff --git a/src/title_screen.c b/src/title_screen.c index 2d6b6cf15..5955ea3a3 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -60,6 +60,7 @@ static void UpdateScanlineEffectRegBuffer(s16 a0); static void ScheduleStopScanlineEffect(void); static void LoadMainTitleScreenPalsAndResetBgs(void); static void CB2_FadeOutTransitionToSaveClearScreen(void); +static void SpriteCallback_TitleScreenFlameOrLeaf(struct Sprite * sprite); static void CB2_FadeOutTransitionToBerryFix(void); static void LoadSpriteGfxAndPals(void); static void Task_FlameOrLeafSpawner(u8 taskId); @@ -238,6 +239,12 @@ static const u8 gUnknown_83BFBD4[] = { 0x04, 0x10, 0x1a, 0x20, 0x30, 0xc8, 0xd8, 0xe0, 0xe8, 0x3c, 0x4c, 0x5c, 0x6c, 0x80, 0x90 }; +#if defined(LEAFGREEN) +static const u16 gUnknown_LG_83BFA10[] = { + 50, 80, 110, 60, 90, 70, 100, 50 +}; +#endif + void CB2_InitTitleScreen(void) { switch (gMain.state) @@ -876,6 +883,7 @@ static void SpriteCallback_TitleScreenFlameOrLeaf(struct Sprite * sprite) #endif } +#if defined(FIRERED) static bool32 CreateFlameOrLeafSprite(s32 x, s32 y, s32 xspeed, s32 yspeed, bool32 templateId) { u8 spriteId; @@ -901,6 +909,35 @@ static bool32 CreateFlameOrLeafSprite(s32 x, s32 y, s32 xspeed, s32 yspeed, bool } return FALSE; } +#elif defined(LEAFGREEN) +void _CreateFlameOrLeafSprite(s32 y0, s32 x1, s32 y1) +{ + u8 spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf_State0, 0xF0, y0, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].data[0] = 0xF00; + gSprites[spriteId].data[1] = x1; + gSprites[spriteId].data[2] = y0 << 4; + gSprites[spriteId].data[3] = y1; + gSprites[spriteId].callback = SpriteCallback_TitleScreenFlameOrLeaf; + } +} + +void SpriteCallback_LG_8079800(struct Sprite * sprite) +{ + sprite->pos1.x -= 7; + if (sprite->pos1.x < -16) + { + sprite->pos1.x = 0x100; + sprite->data[7]++; + if (sprite->data[7] >= NELEMS(gUnknown_LG_83BFA10)) + sprite->data[7] = 0; + sprite->pos1.y = gUnknown_LG_83BFA10[sprite->data[7]]; + } +} + +#define CreateFlameOrLeafSprite ((bool32 (*)())_CreateFlameOrLeafSprite) +#endif //FRLG static void Task_FlameOrLeafSpawner(u8 taskId) { |