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.binBinary files differ index 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.pngBinary files differ new 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)  { | 
