diff --git a/.gitignore b/.gitignore index f408c80f71..73c21dc658 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,9 @@ settings.mk /build/ /docs/doxygen/ /include/ld_addrs.h +/include/message_ids.h /include/sprite/ +/include/map # Assets /bin diff --git a/Makefile b/Makefile index da7cc3140a..19126f5a15 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,7 @@ LD_MAP := $(BUILD_DIR)/$(TARGET).map ASSETS_BIN := $(BUILD_DIR)/bin/assets/assets.bin MSG_BIN := $(BUILD_DIR)/msg.bin NPC_BIN := $(BUILD_DIR)/sprite/npc.bin -GENERATED_HEADERS := include/ld_addrs.h include/sprite +GENERATED_HEADERS := include/ld_addrs.h $(foreach dir, $(NPC_DIRS), include/$(dir).h) ### Tools ### @@ -128,7 +128,7 @@ setup: clean submodules tools split $(LD_SCRIPT) # tools/star-rod submodule intentionally omitted submodules: git submodule init tools/n64splat - git submodule update --init --recursive + git submodule update --recursive split: $(SPLAT) --modes ld bin Yay0 PaperMarioMapFS PaperMarioMessages img PaperMarioNpcSprites --new @@ -161,12 +161,12 @@ $(BUILD_DIR)/%.Yay0.o: $(BUILD_DIR)/%.bin.Yay0 $(LD) -r -b binary -o $@ $< # Compile C files -$(BUILD_DIR)/%.c.o: %.c $(MDEPS) | $(GENERATED_HEADERS) +$(BUILD_DIR)/%.c.o: %.c $(MDEPS) $(GENERATED_HEADERS) @mkdir -p $(shell dirname $@) $(CPP) $(CPPFLAGS) -o - $(CPPMFLAGS) $< | $(ICONV) | $(CC) $(CFLAGS) -o - | $(OLD_AS) $(OLDASFLAGS) -o $@ - # Compile C files (with DSL macros) -$(foreach cfile, $(DSL_C_FILES), $(BUILD_DIR)/$(cfile).o): $(BUILD_DIR)/%.c.o: %.c $(MDEPS) tools/compile_dsl_macros.py | $(GENERATED_HEADERS) +$(foreach cfile, $(DSL_C_FILES), $(BUILD_DIR)/$(cfile).o): $(BUILD_DIR)/%.c.o: %.c $(MDEPS) tools/compile_dsl_macros.py $(GENERATED_HEADERS) @mkdir -p $(shell dirname $@) $(CPP) $(CPPFLAGS) -o - $< $(CPPMFLAGS) | $(PYTHON) tools/compile_dsl_macros.py | $(ICONV) | $(CC) $(CFLAGS) -o - | $(OLD_AS) $(OLDASFLAGS) -o $@ - @@ -257,10 +257,12 @@ include/sprite/npc/%.h: sprite/npc/%/SpriteSheet.xml tools/gen_sprite_animations @mkdir -p $(shell dirname $@) @echo "building $@" @$(PYTHON) tools/gen_sprite_animations_h.py $@ sprite/npc/$* $(NPC_DIRS) -include/sprite: $(foreach dir, $(NPC_DIRS), include/$(dir).h) + + +### Linker ### $(LD_SCRIPT): $(SPLAT_YAML) - $(SPLAT) --modes ld + $(SPLAT) --modes ld > /dev/null $(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT) @mkdir -p $(shell dirname $@) @@ -299,7 +301,7 @@ editor: tools/star-rod sprite/SpriteTable.xml ### Make Settings ### -.PHONY: clean tools test setup submodules split editor $(ROM) include/sprite +.PHONY: clean tools test setup submodules split editor $(ROM) .DELETE_ON_ERROR: .SECONDARY: .PRECIOUS: $(ROM) %.Yay0 diff --git a/asm/nonmatchings/code_317020/func_802BDBBC.s b/asm/nonmatchings/code_317020/world_goombario_pre_battle.s similarity index 90% rename from asm/nonmatchings/code_317020/func_802BDBBC.s rename to asm/nonmatchings/code_317020/world_goombario_pre_battle.s index 49ebbff6d8..02787887ac 100644 --- a/asm/nonmatchings/code_317020/func_802BDBBC.s +++ b/asm/nonmatchings/code_317020/world_goombario_pre_battle.s @@ -1,7 +1,7 @@ .set noat # allow manual use of $at .set noreorder # don't insert nops after branches -glabel func_802BDBBC +glabel world_goombario_pre_battle /* 317ADC 802BDBBC 27BDFFE0 */ addiu $sp, $sp, -0x20 /* 317AE0 802BDBC0 AFB10014 */ sw $s1, 0x14($sp) /* 317AE4 802BDBC4 0080882D */ daddu $s1, $a0, $zero @@ -16,9 +16,9 @@ glabel func_802BDBBC /* 317B08 802BDBE8 0C009C22 */ jal func_80027088 /* 317B0C 802BDBEC 0000202D */ daddu $a0, $zero, $zero /* 317B10 802BDBF0 0C038069 */ jal enable_player_input -/* 317B14 802BDBF4 00000000 */ nop +/* 317B14 802BDBF4 00000000 */ nop /* 317B18 802BDBF8 0C0B4312 */ jal CancelMessageAndBlock -/* 317B1C 802BDBFC 00000000 */ nop +/* 317B1C 802BDBFC 00000000 */ nop /* 317B20 802BDC00 0C03BD17 */ jal clear_partner_move_history /* 317B24 802BDC04 0220202D */ daddu $a0, $s1, $zero /* 317B28 802BDC08 0220202D */ daddu $a0, $s1, $zero @@ -34,5 +34,5 @@ glabel func_802BDBBC /* 317B4C 802BDC2C 8FB00010 */ lw $s0, 0x10($sp) /* 317B50 802BDC30 03E00008 */ jr $ra /* 317B54 802BDC34 27BD0020 */ addiu $sp, $sp, 0x20 -/* 317B58 802BDC38 00000000 */ nop -/* 317B5C 802BDC3C 00000000 */ nop +/* 317B58 802BDC38 00000000 */ nop +/* 317B5C 802BDC3C 00000000 */ nop diff --git a/sources.mk b/sources.mk index 20170f1f79..b97c0445f5 100644 --- a/sources.mk +++ b/sources.mk @@ -58,7 +58,7 @@ ASSETS := \ MESSAGES := $(shell find msg -type f -name "*.msg" 2> /dev/null) -NPC_SPRITES := world_goombario world_kooper world_bombette world_parakarry world_bow world_watt world_sushi world_lakilester battle_goombario battle_kooper battle_bombette battle_parakarry battle_bow battle_watt battle_sushi battle_lakilester kooper_without_shell world_eldstar world_mamar world_skolar world_muskular world_misstar world_klevar world_kalmar battle_eldstar battle_mamar battle_skolar battle_muskular battle_misstar battle_klevar battle_kalmar twink jr_troopa spiked_jr_troopa spiked_para_jr_troopa mage_jr_troopa para_jr_troopa goomba spiked_goomba paragoomba koopa_troopa para_troopa fuzzy bob_omb bullet_bill bill_blaster monty_mole cleft pokey battle_bandit buzzy_beetle swooper stone_chomp putrid_piranha piranha_plant sentinel world_clubba battle_clubba shy_guy groove_guy sky_guy pyro_guy spy_guy medi_guy fuzzipede jungle_guy heart_plant hurt_plant m_bush bubble kent_c_koopa dayzee lakitu spiny bzzap ruff_puff spike_top duplighost albino_dino blooper baby_blooper gulpit dry_bones thrown_bone bony_beetle magikoopa flying_magikoopa world_koopatrol koopatrol hammer_bros bush_basic bush_blocky bush_dry bush_leafy bush_matted world_kammy battle_kammy goomba_bros goomba_king spiky_goomnut dark_toad koopa_bros buzzar tutankoopa chain_chomp world_tubba battle_tubba tubbas_heart big_lantern_ghost shy_squad_guy marshal_guy stilt_guy stilt_guy_unfold shy_stack_guy shy_stack_unfold shy_stack_damage shy_stack_rock general_guy general_guy_bomb tank_guy lava_piranha_head petit_piranha lava_bud huff_n_puff tuff_puff monstar crystal_king world_bowser battle_bowser luigi toad three_sisters vanna_t toad_kid toad_guard harry_t toad_minister postmaster conductor_toad train_station_toad fishmael artist_toad koopa koopa_without_shell world_bob_omb whacka dryite mouser boo yoshi yoshi_kid raven bubulb penguin shiver_toad world_bandit goompapa goombaria goomama goompa goomma the_master chan lee merlon chet_rippo rowf minh_t russ_t tayce_t fice_t bartender chanterelle rip_cheato chuck_quizmo merluvlee merlar merlow star_kid kolorado_wife koopa_koot kolorado battle_kolorado archeologist nomadimouse world_merlee battle_merlee disguised_moustafa moustafa oaklie bootler yakkey gourmet_guy village_leader leaders_friend rafael_raven tolielup gate_flower petunia posie lily rosie sun lakilulu ninji mayor_penguin mayor_penguin_wife penguin_patrol herringway merle star_rod fire coin parade_peach parade_koopas parade_burnt_bowser parade_luigi parade_partners parade_yoshis parade_kolorados parade_chicks parade_ice_show parade_toads parade_batons parade_drums parade_flags parade_horns parade_tubba_balloon parade_wizards parade_mario parade_shy_guys parade_twink leaf +NPC_SPRITES := world_goombario world_kooper world_bombette world_parakarry world_bow world_watt world_sushie world_lakilester battle_goombario battle_kooper battle_bombette battle_parakarry battle_bow battle_watt battle_sushie battle_lakilester kooper_without_shell world_eldstar world_mamar world_skolar world_muskular world_misstar world_klevar world_kalmar battle_eldstar battle_mamar battle_skolar battle_muskular battle_misstar battle_klevar battle_kalmar twink jr_troopa spiked_jr_troopa spiked_para_jr_troopa mage_jr_troopa para_jr_troopa goomba spiked_goomba paragoomba koopa_troopa para_troopa fuzzy bob_omb bullet_bill bill_blaster monty_mole cleft pokey battle_bandit buzzy_beetle swooper stone_chomp putrid_piranha piranha_plant sentinel world_clubba battle_clubba shy_guy groove_guy sky_guy pyro_guy spy_guy medi_guy fuzzipede jungle_guy heart_plant hurt_plant m_bush bubble kent_c_koopa dayzee lakitu spiny bzzap ruff_puff spike_top duplighost albino_dino blooper baby_blooper gulpit dry_bones thrown_bone bony_beetle magikoopa flying_magikoopa world_koopatrol koopatrol hammer_bros bush_basic bush_blocky bush_dry bush_leafy bush_matted world_kammy battle_kammy goomba_bros goomba_king spiky_goomnut dark_toad koopa_bros buzzar tutankoopa chain_chomp world_tubba battle_tubba tubbas_heart big_lantern_ghost shy_squad_guy marshal_guy stilt_guy stilt_guy_unfold shy_stack_guy shy_stack_unfold shy_stack_damage shy_stack_rock general_guy general_guy_bomb tank_guy lava_piranha_head petit_piranha lava_bud huff_n_puff tuff_puff monstar crystal_king world_bowser battle_bowser luigi toad three_sisters vanna_t toad_kid toad_guard harry_t toad_minister postmaster conductor_toad train_station_toad fishmael artist_toad koopa koopa_without_shell world_bob_omb whacka dryite mouser boo yoshi yoshi_kid raven bubulb penguin shiver_toad world_bandit goompa goombaria gooma goompapa goomama the_master chan lee merlon chet_rippo rowf minh_t russ_t tayce_t fice_t bartender chanterelle rip_cheato chuck_quizmo merluvlee merlar merlow star_kid kolorado_wife koopa_koot kolorado battle_kolorado archeologist nomadimouse world_merlee battle_merlee disguised_moustafa moustafa oaklie bootler yakkey gourmet_guy village_leader leaders_friend rafael_raven tolielup gate_flower petunia posie lily rosie sun lakilulu ninji mayor_penguin mayor_penguin_wife penguin_patrol herringway merle star_rod fire coin parade_peach parade_koopas parade_burnt_bowser parade_luigi parade_partners parade_yoshis parade_kolorados parade_chicks parade_ice_show parade_toads parade_batons parade_drums parade_flags parade_horns parade_tubba_balloon parade_wizards parade_mario parade_shy_guys parade_twink leaf # Image settings $(BUILD_DIR)/img/battle/text_action_command_ratings.ia4.png: IMG_FLAGS = --flip-y diff --git a/src/code_317020.c b/src/code_317020.c index 95b8c24a09..e65fb76488 100644 --- a/src/code_317020.c +++ b/src/code_317020.c @@ -1,4 +1,7 @@ #include "common.h" +#include "world/partner/goombario.h" + +// TODO: move to world/partner/goombario.c s32 func_802BD100(s32 arg0) { s32 i; @@ -13,7 +16,7 @@ s32 func_802BD100(s32 arg0) { return 0; } -void func_802BD174(Npc* npc) { +void world_goombario_init(Npc* npc) { npc->collisionHeight = 24; npc->collisionRadius = 20; } @@ -42,7 +45,7 @@ ApiStatus func_802BDB84(ScriptInstance* script, s32 isInitialCall) { // Something is up with D_8010EBB0 I think. It might be a struct or something #ifdef NON_MATCHING -void func_802BDBBC(s32 arg0) { +void world_goombario_pre_battle(s32 arg0) { if (D_8010EBB0[0] != 0) { func_80027088(0); enable_player_input(); @@ -55,5 +58,5 @@ void func_802BDBBC(s32 arg0) { D_8010EBB0[3] = 1; } #else -INCLUDE_ASM(s32, "code_317020", func_802BDBBC); +INCLUDE_ASM(void, "code_317020", world_goombario_pre_battle, s32 arg0); #endif diff --git a/src/world/partner/goombaria.c b/src/world/partner/goombaria.c new file mode 100644 index 0000000000..6a62c9edc6 --- /dev/null +++ b/src/world/partner/goombaria.c @@ -0,0 +1,43 @@ +#include "common.h" + +void func_802BD100_324F10(Npc* npc) { + npc->collisionHeight = 24; + npc->collisionRadius = 20; +} + +ApiStatus func_802BD114_324F10(ScriptInstance* script, s32 isInitialCall) { + Npc* owner = script->owner2.npc; + + if (isInitialCall) { + func_800EECC4(owner); + } + return func_800EECE8(owner) != 0; +} + +ApiStatus func_802BD14C_324F10(ScriptInstance* script, s32 isInitialCall) { + PlayerData* playerData = &gPlayerData; + Npc* owner = script->owner2.npc; + + if (isInitialCall) { + enable_partner_walking(owner, TRUE); + } + + func_800EBA3C(owner); + func_800EBB40(owner); + playerData->unk_2F4[PartnerId_GOOMBARIA]++; + + return ApiStatus_BLOCK; +} + +ApiStatus func_802BD1AC_324F10(ScriptInstance* script, s32 isInitialCall) { + return ApiStatus_DONE2; +} + +ApiStatus func_802BD1B4(ScriptInstance* script, s32 isInitialCall) { + Npc* owner = script->owner2.npc; + + if (isInitialCall) { + func_800EE994(owner); + } + return func_800EE9B8(owner) != 0; +} diff --git a/src/world/partner/goombario.h b/src/world/partner/goombario.h new file mode 100644 index 0000000000..7b9f16453b --- /dev/null +++ b/src/world/partner/goombario.h @@ -0,0 +1,20 @@ +#ifndef _WORLD_PARTNER_GOOMBARIO_H_ +#define _WORLD_PARTNER_GOOMBARIO_H_ + +#include "common.h" +#include "script_api/map.h" + +s32 func_802BD100(s32 arg0); +void world_goombario_init(Npc* npc); +s32 func_802BD188(); +s32 func_802BD1D0(); +s32 func_802BD564(); +s32 func_802BD5A8(); +s32 func_802BD5D8(); +s32 func_802BDB30(); +ApiStatus func_802BDB84(ScriptInstance* script, s32 isInitialCall); +void world_goombario_pre_battle(s32 arg0); + +extern Script world_goombario_take_out; + +#endif diff --git a/src/world/partner/goompa.c b/src/world/partner/goompa.c new file mode 100644 index 0000000000..7a385c3ddb --- /dev/null +++ b/src/world/partner/goompa.c @@ -0,0 +1,32 @@ +#include "common.h" + +void func_802BD100_324A10(Npc* npc) { + npc->collisionHeight = 24; + npc->collisionRadius = 20; +} + +ApiStatus func_802BD114(ScriptInstance* script, s32 isInitialCall) { + Npc* owner = script->owner2.npc; + + if (isInitialCall) { + func_800EECC4(owner); + } + return func_800EECE8(owner) != 0; +} + +INCLUDE_ASM(s32, "world_goompa", func_802BD14C); + +INCLUDE_ASM(s32, "world_goompa", func_802BD4E0); + +ApiStatus func_802BD524(ScriptInstance* script, s32 isInitialCall) { + return ApiStatus_DONE2; +} + +ApiStatus func_802BD52C(ScriptInstance* script, s32 isInitialCall) { + Npc* owner = script->owner2.npc; + + if (isInitialCall) { + func_800EE994(owner); + } + return func_800EE9B8(owner) != 0; +} diff --git a/src/world/partner/kooper.h b/src/world/partner/kooper.h new file mode 100644 index 0000000000..c3359d5907 --- /dev/null +++ b/src/world/partner/kooper.h @@ -0,0 +1,9 @@ +#ifndef _WORLD_PARTNER_KOOPER_H_ +#define _WORLD_PARTNER_KOOPER_H_ + +#include "common.h" +#include "script_api/map.h" + +// TODO + +#endif diff --git a/src/world/partner/twink.c b/src/world/partner/twink.c new file mode 100644 index 0000000000..1fb4e6a25d --- /dev/null +++ b/src/world/partner/twink.c @@ -0,0 +1,44 @@ +#include "common.h" + +// Init +void func_802BD100_325070(Npc* npc) { + npc->collisionHeight = 20; + npc->collisionRadius = 20; +} + +ApiStatus func_802BD110(ScriptInstance* script, s32 isInitialCall) { + Npc* owner = script->owner2.npc; + + if (isInitialCall) { + func_800EECC4(owner); + } + return func_800EECE8(owner) != 0; +} + +ApiStatus func_802BD148_325070(ScriptInstance* script, s32 isInitialCall) { + PlayerData* playerData = &gPlayerData; + Npc* owner = script->owner2.npc; + + if (isInitialCall) { + enable_partner_flying(owner, TRUE); + } + + update_player_move_history(owner); + func_800ED5D0(owner); + playerData->unk_2F4[PartnerId_TWINK]++; + + return ApiStatus_BLOCK; +} + +ApiStatus func_802BD1A8(ScriptInstance* script, s32 isInitialCall) { + return ApiStatus_DONE2; +} + +ApiStatus func_802BD1B0(ScriptInstance* script, s32 isInitialCall) { + Npc* owner = script->owner2.npc; + + if (isInitialCall) { + func_800EE994(owner); + } + return func_800EE9B8(owner) != 0; +} diff --git a/src/world/partners.c b/src/world/partners.c new file mode 100644 index 0000000000..092c102c2d --- /dev/null +++ b/src/world/partners.c @@ -0,0 +1,227 @@ +#include "common.h" +#include "ld_addrs.h" + +#include "partner/goombario.h" +#include "sprite/npc/world_goombario.h" + +#include "partner/kooper.h" +#include "sprite/npc/world_kooper.h" + +#include "sprite/npc/world_bombette.h" + +#include "sprite/npc/world_parakarry.h" + +#include "sprite/npc/goompa.h" + +#include "sprite/npc/world_watt.h" + +#include "sprite/npc/world_sushie.h" + +#include "sprite/npc/world_lakilester.h" + +#include "sprite/npc/world_bow.h" + +#include "sprite/npc/goombaria.h" + +#include "sprite/npc/twink.h" + +typedef struct WorldPartner { + /* 0x00 */ void* dmaStart; + /* 0x04 */ void* dmaEnd; + /* 0x08 */ void* dmaDest; ///< Always `0x802BD100` + /* 0x10 */ s32 isFlying; + /* 0x14 */ void (*init)(Npc* partner); + /* 0x18 */ Bytecode* takeOut; + /* 0x1C */ Bytecode* useAbility; + /* 0x20 */ Bytecode* update; + /* 0x24 */ Bytecode* putAway; + /* 0x28 */ NpcAnimID idle; + /* 0x2C */ UNK_FUN_PTR(testFirstStrike); + /* 0x30 */ UNK_FUN_PTR(canUseAbility); + /* 0x34 */ UNK_FUN_PTR(canPlayerPause); + /* 0x38 */ void (*preBattle)(Npc* partner); + /* 0x3C */ UNK_FUN_PTR(postBattle); + /* 0x40 */ Bytecode* whileRiding; +} WorldPartner; // size = 0x40 + +static s32 _pad[] = { 0x00, 0x00, 0x00 }; + +WorldPartner gWorldPartners[] = { + { + // Goombario + .dmaStart = &world_partner_goombario_ROM_START, + .dmaEnd = &world_partner_goombario_ROM_END, + .dmaDest = &world_partner_goombario_VRAM, + .isFlying = FALSE, + .init = world_goombario_init, + .takeOut = world_goombario_take_out, + .useAbility = 0x802BDD8C, + .update = 0x802BDDA8, + .putAway = 0x802BDE60, + .idle = NPC_ANIM(world_goombario, normal, idle), + .canUseAbility = func_802BD5A8, + .canPlayerPause = func_802BD5A8, + .preBattle = world_goombario_pre_battle, + }, + { + // Kooper + .dmaStart = &world_partner_kooper_ROM_START, + .dmaEnd = &world_partner_kooper_ROM_END, + .dmaDest = &world_partner_kooper_VRAM, + .isFlying = FALSE, + .init = 0x802BD200, + .takeOut = 0x802BEB44, + .useAbility = 0x802BEB64, + .update = 0x802BEB80, + .putAway = 0x802BEB9C, + .idle = NPC_ANIM(world_kooper, Palette_00, Anim_3), + .testFirstStrike = 0x802BE818, + .canUseAbility = 0x800EA514, + .canPlayerPause = 0x800EA514, + .preBattle = 0x802BEA24, + .postBattle = 0x802BEB10, + }, + { + // Bombette + .dmaStart = &world_partner_bombette_ROM_START, + .dmaEnd = &world_partner_bombette_ROM_END, + .dmaDest = &world_partner_bombette_VRAM, + .isFlying = FALSE, + .init = 0x802BD2D8, + .takeOut = 0x802BE880, + .useAbility = 0x802BE8A0, + .update = 0x802BE8BC, + .putAway = 0x802BE8D8, + .idle = NPC_ANIM(world_bombette, Palette_00, Anim_3), + .testFirstStrike = 0x802BE520, + .canUseAbility = 0x802BD720, + .canPlayerPause = 0x802BD748, + .preBattle = 0x802BE6E8, + }, + { + // Parakarry + .dmaStart = &world_partner_parakarry_ROM_START, + .dmaEnd = &world_partner_parakarry_ROM_END, + .dmaDest = &world_partner_parakarry_VRAM, + .isFlying = TRUE, + .init = 0x802BD100, + .takeOut = 0x802BEA90, + .useAbility = 0x802BEAB0, + .update = 0x802BEACC, + .putAway = 0x802BEAE8, + .idle = NPC_ANIM(world_parakarry, Palette_00, Anim_1), + .canPlayerPause = 0x800EA514, + .preBattle = 0x802BE90C, + .postBattle = 0x802BE9D0, + }, + { + // Goompa + .dmaStart = &world_partner_goompa_ROM_START, + .dmaEnd = &world_partner_goompa_ROM_END, + .dmaDest = &world_partner_goompa_VRAM, + .isFlying = FALSE, + .init = 0x802BD100, + .takeOut = 0x802BD570, + .useAbility = 0x802BD590, + .update = 0x802BD5AC, + .putAway = 0x802BD5C8, + .idle = NPC_ANIM(goompa, Palette_00, Anim_1), + }, + { + // Watt + .dmaStart = &world_partner_watt_ROM_START, + .dmaEnd = &world_partner_watt_ROM_END, + .dmaDest = &world_partner_watt_VRAM, + .isFlying = TRUE, + .init = 0x802BD23C, + .takeOut = 0x802BE258, + .useAbility = 0x802BE27C, + .update = 0x802BE298, + .putAway = 0x802BE2B4, + .idle = NPC_ANIM(world_watt, Palette_00, Anim_1), + .canPlayerPause = 0x800EA524, + .preBattle = 0x802BDD9C, + .postBattle = 0x802BDE10, + .whileRiding = 0x802BE2D0, + }, + { + // Sushie + .dmaStart = &world_partner_sushie_ROM_START, + .dmaEnd = &world_partner_sushie_ROM_END, + .dmaDest = &world_partner_sushie_VRAM, + .isFlying = FALSE, + .init = 0x802BF520, + .takeOut = 0x802BFDDC, + .useAbility = 0x802BFDFC, + .update = 0x802BFDC0, + .putAway = 0x802BFE18, + .idle = NPC_ANIM(world_sushie, Palette_00, Anim_1), + .canPlayerPause = 0x800EA524, + .preBattle = 0x802BF9B8, + .postBattle = 0x802BFA58, + .whileRiding = 0x802BFE34, + }, + { + // Lakilester + .dmaStart = &world_partner_lakilester_ROM_START, + .dmaEnd = &world_partner_lakilester_ROM_END, + .dmaDest = &world_partner_lakilester_VRAM, + .isFlying = TRUE, + .init = 0x802BD21C, + .takeOut = 0x802BFE60, + .useAbility = 0x802BFE80, + .update = 0x802BFE9C, + .putAway = 0x802BFEB8, + .idle = NPC_ANIM(world_lakilester, Palette_00, Anim_1), + .canPlayerPause = 0x800EA524, + .preBattle = 0x802BFA00, + .postBattle = 0x802BFAA8, + .whileRiding = 0x802BFED4, + }, + { + // Bow + .dmaStart = &world_partner_bow_ROM_START, + .dmaEnd = &world_partner_bow_ROM_END, + .dmaDest = &world_partner_bow_VRAM, + .isFlying = TRUE, + .init = 0x802BD100, + .takeOut = 0x802BDFE0, + .useAbility = 0x802BE000, + .update = 0x802BE01C, + .putAway = 0x802BE038, + .idle = NPC_ANIM(world_bow, Palette_00, Anim_1), + .canUseAbility = 0x800EA514, + .canPlayerPause = 0x800EA524, + .preBattle = 0x802BDF64, + }, + { + // Goombaria + .dmaStart = &world_partner_goombaria_ROM_START, + .dmaEnd = &world_partner_goombaria_ROM_END, + .dmaDest = &world_partner_goombaria_VRAM, + .isFlying = FALSE, + .init = 0x802BD100, + .takeOut = 0x802BD1F0, + .useAbility = 0x802BD20C, + .update = 0x802BD228, + .putAway = 0x802BD244, + .idle = NPC_ANIM(goombaria, Palette_00, Anim_1), + .canUseAbility = 0x800EA514, + .canPlayerPause = 0x800EA514, + }, + { + // Twink + .dmaStart = &world_partner_twink_ROM_START, + .dmaEnd = &world_partner_twink_ROM_END, + .dmaDest = &world_partner_twink_VRAM, + .isFlying = TRUE, + .init = 0x802BD100, + .takeOut = 0x802BD1F0, + .useAbility = 0x802BD20C, + .update = 0x802BD228, + .putAway = 0x802BD244, + .idle = NPC_ANIM(twink, Palette_00, Anim_1), + .canUseAbility = 0x800EA514, + .canPlayerPause = 0x800EA514, + }, +}; diff --git a/tools/splat.yaml b/tools/splat.yaml index 83fa42f220..9b80271083 100644 --- a/tools/splat.yaml +++ b/tools/splat.yaml @@ -226,6 +226,12 @@ segments: - [0x8a860, c, code_8a860_len_3f30] - [0x8e790, c, code_8e790_len_2850] - [0x90fe0, bin] + - type: code + start: 0x91520 # section may start earlier + vram: 0 # TODO + files: + - [0x91520, .data, world/partners] + - [0x917EC, bin] - [0x93CD0, ci4, ui/hammer, 32, 32] - [0x93ED0, palette, ui/hammer] - [0x93EF0, palette, ui/hammer.disabled] @@ -401,70 +407,81 @@ segments: files: - [0x316f30, c, code_316f30] - type: code + ld_name: world_partner_goombario start: 0x317020 vram: 0x802BD100 files: - [0x317020, c] - [0x317b60, bin] - type: code + ld_name: world_partner_bombette start: 0x317e50 vram: 0x802BD100 files: - [0x317e50, c] - [0x3195d0, bin] - type: code + ld_name: world_partner_parakarry start: 0x319670 vram: 0x802BD100 files: - [0x319670, c] - [0x31b000, bin] - type: code + ld_name: world_partner_kooper start: 0x31b120 vram: 0x802BD100 files: - [0x31b120, c] - [0x31cb60, bin] - type: code + ld_name: world_partner_watt start: 0x31cc70 vram: 0x802BD100 files: - [0x31cc70, c] - [0x31ddc0, bin] - type: code + ld_name: world_partner_sushie start: 0x31de70 vram: 0x802BD100 files: - [0x31de70, c] - [0x320b20, bin] - type: code + ld_name: world_partner_lakilester start: 0x320c50 vram: 0x802BD100 files: - [0x320c50, c] - [0x3239b0, bin] - type: code + ld_name: world_partner_bow start: 0x323A50 vram: 0x802BD100 files: - [0x323A50, c] - [0x324930, bin] - type: code + ld_name: world_partner_goompa start: 0x324a10 vram: 0x802BD100 files: - - [0x324a10, c, world_goompa] + - [0x324a10, c, world/partner/goompa] - [0x324e80, bin] - type: code + ld_name: world_partner_goombaria start: 0x324f10 vram: 0x802BD100 files: - - [0x324f10, c, world_goombaria] + - [0x324f10, c, world/partner/goombaria] - [0x325000, bin] - type: code + ld_name: world_partner_twink start: 0x325070 vram: 0x802BD100 files: - - [0x325070, c, world_twink] + - [0x325070, c, world/partner/twink] - [0x325160, bin] - type: code start: 0x3251d0 @@ -7074,7 +7091,7 @@ segments: - world_parakarry - world_bow - world_watt - - world_sushi + - world_sushie - world_lakilester - battle_goombario - battle_kooper @@ -7082,7 +7099,7 @@ segments: - battle_parakarry - battle_bow - battle_watt - - battle_sushi + - battle_sushie - battle_lakilester - kooper_without_shell - world_eldstar @@ -7285,11 +7302,11 @@ segments: - penguin - shiver_toad - world_bandit - - goompapa - - goombaria - - goomama - goompa - - goomma + - goombaria + - gooma + - goompapa + - goomama - the_master - chan - lee diff --git a/undefined_syms.txt b/undefined_syms.txt index 5f64481f84..d592ebf275 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -332,3 +332,5 @@ D_80078DB4 = 0x80078DB4; gSongsUsingVariationFlag = 0x8014F720; D_8014F738 = 0x8014F738; + +world_goombario_take_out = 0x802BDD6C;