match npc sprites

This commit is contained in:
Alex Bates 2020-11-11 13:52:04 +00:00
parent 87023d8be2
commit 87cc5ed999
10 changed files with 447 additions and 244 deletions

1
.gitignore vendored
View File

@ -23,3 +23,4 @@ settings.mk
/bin
/img
/msg
/sprite

View File

@ -18,4 +18,7 @@
"build": true,
"docs/doxygen": true,
},
"python.autoComplete.extraPaths": [
"./tools"
],
}

View File

@ -35,7 +35,8 @@ LD_SCRIPT := $(TARGET).ld
LD_MAP := $(BUILD_DIR)/$(TARGET).map
ASSETS_BIN := $(BUILD_DIR)/bin/assets/assets.bin
MSG_BIN := $(BUILD_DIR)/msg.bin
GENERATED_HEADERS := include/ld_addrs.h
NPC_BIN := $(BUILD_DIR)/sprite/npc.bin
GENERATED_HEADERS := include/ld_addrs.h include/npc_animations.h
### Tools ###
@ -99,14 +100,14 @@ submodules:
git submodule update --init --recursive
split:
rm -rf bin img
$(SPLAT) --modes bin Yay0 PaperMarioMapFS PaperMarioMessages img
rm -rf bin msg img sprite
$(SPLAT) --modes ld bin Yay0 PaperMarioMapFS PaperMarioMessages img PaperMarioNpcSprites
split-%:
$(SPLAT) --modes $* --verbose
$(SPLAT) --modes ld $* --verbose
split-all:
rm -rf bin img
rm -rf bin msg img sprite
$(SPLAT) --modes all
test: $(ROM)
@ -198,11 +199,24 @@ $(MSG_BIN): $(MESSAGES)
@echo "building $@"
@$(PYTHON) tools/compile_messages.py $@ /dev/null $(MESSAGES)
$(MSG_BIN:.bin=.o): $(MSG_BIN)
@mkdir -p $(shell dirname $@)
$(LD) -r -b binary -o $@ $<
$(LD_SCRIPT): $(SPLAT_YAML)
# Sprites
$(foreach npc, $(NPC_SPRITES), $(eval sprite/npc/$(npc): $(shell find sprite/npc/$(npc) -type f))) # dependencies
NPC_DIRS := $(foreach npc, $(NPC_SPRITES), $(BUILD_DIR)/sprite/npc/$(npc))
$(BUILD_DIR)/sprite/npc/%: sprite/npc/%
@mkdir -p $(shell dirname $@)
$(PYTHON) tools/compile_npc_sprite.py $@ $<
$(NPC_BIN): $(foreach dir, $(NPC_DIRS), $(dir).Yay0) tools/compile_npc_sprites.py
@mkdir -p $(shell dirname $@)
@echo "building $@"
@$(PYTHON) tools/compile_npc_sprites.py $@ $(foreach dir, $(NPC_DIRS), $(dir).Yay0)
$(NPC_BIN:.bin=.o): $(NPC_BIN)
$(LD) -r -b binary -o $@ $<
include/npc_animations.h: $(NPC_DIRS)
@echo "TODO"
$(LD_SCRIPT): $(SPLAT_YAML)
$(SPLAT) --modes ld
$(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT)

View File

@ -58,5 +58,7 @@ ASSETS := \
MESSAGES := $(shell find msg -type f -name "*.msg")
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 parada_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

View File

@ -2,7 +2,7 @@ default: all
all: Yay0compress
Yay0compress:
Yay0compress:
gcc Yay0compress.c -O3 -o Yay0compress
clean:

115
tools/compile_npc_sprite.py Executable file
View File

@ -0,0 +1,115 @@
#! /usr/bin/python3
from sys import argv, path
from pathlib import Path
import os
path.append(os.path.join(os.path.dirname(__file__), "n64splat"))
from n64splat.segtypes.PaperMarioNpcSprites import Sprite
from convert_image import pack_color, iter_in_groups
if __name__ == "__main__":
if len(argv) != 3:
print("usage: compile_npc_sprite.py [OUTBIN] [DIR]")
exit(1)
_, outfile, sprite_dir = argv
try:
sprite = Sprite.from_dir(Path(sprite_dir))
except AssertionError as e:
print("error:", e)
exit(1)
with open(outfile, "wb") as f:
f.seek(0x10) # leave space for header
# leave space for animation offset list
f.seek((len(sprite.animations) + 1) * 4, 1)
animation_offsets = []
# write animations
for i, components in enumerate(sprite.animations):
animation_offsets.append(f.tell())
# leave space for component offset list
f.seek((len(components) + 1) * 4, 1)
component_offsets = []
for comp in components:
offset = f.tell()
for command in comp.commands:
f.write(command.to_bytes(2, byteorder="big"))
f.seek(f.tell() % 4, 1)
component_offsets.append(f.tell())
f.write(offset.to_bytes(4, byteorder="big"))
f.write((len(comp.commands) * 2).to_bytes(2, byteorder="big"))
f.write(comp.x.to_bytes(2, byteorder="big"))
f.write(comp.y.to_bytes(2, byteorder="big"))
f.write(comp.z.to_bytes(2, byteorder="big"))
next_anim = f.tell()
# write component offset list
f.seek(animation_offsets[i])
component_offsets.append(-1)
for offset in component_offsets:
f.write(offset.to_bytes(4, byteorder="big", signed=True))
f.seek(next_anim)
# palettes start 8-byte aligned
if (f.tell() & 7) == 4:
f.seek(4, 1)
# write palettes
palette_offsets = []
for i, palette in enumerate(sprite.palettes):
palette_offsets.append(f.tell())
for rgba in palette:
if rgba[3] not in (0, 0xFF):
print("error: translucent pixels not allowed in palette {sprite.palette_names[i]}")
exit(1)
color = pack_color(*rgba)
f.write(color.to_bytes(2, byteorder="big"))
# write images/rasters
image_offsets = []
for image in sprite.images:
offset = f.tell()
for a, b in iter_in_groups(image.raster, 2):
byte = (a << 4) | b
f.write(byte.to_bytes(1, byteorder="big"))
image_offsets.append(f.tell())
f.write(offset.to_bytes(4, byteorder="big"))
f.write(bytes([image.width, image.height, image.palette_index, 0xFF]))
# write image offset list
image_offset_list_offset = f.tell()
image_offsets.append(-1)
for offset in image_offsets:
f.write(offset.to_bytes(4, byteorder="big", signed=True))
# write palette offset list
palette_offset_list_offset = f.tell()
palette_offsets.append(-1)
for offset in palette_offsets:
f.write(offset.to_bytes(4, byteorder="big", signed=True))
# write header
f.seek(0)
f.write(image_offset_list_offset.to_bytes(4, byteorder="big"))
f.write(palette_offset_list_offset.to_bytes(4, byteorder="big"))
f.write(sprite.max_components.to_bytes(4, byteorder="big"))
f.write(sprite.num_variations.to_bytes(4, byteorder="big"))
# write animation offset list
animation_offsets.append(-1)
for offset in animation_offsets:
f.write(offset.to_bytes(4, byteorder="big", signed=True))

32
tools/compile_npc_sprites.py Executable file
View File

@ -0,0 +1,32 @@
#! /usr/bin/python3
from sys import argv
if __name__ == "__main__":
if len(argv) < 4:
print("usage: compile_npc_sprites.py [OUTBIN] [INFILES]")
exit(1)
_, outfile, *infiles = argv
with open(outfile, "wb") as f:
offsets = []
f.seek(4 * (len(infiles) + 1))
for filename in infiles:
with open(filename, "rb") as spritef:
offsets.append(f.tell())
f.write(spritef.read())
# align
while f.tell() % 8 != 0:
f.write(bytes([0]))
print(f"{0x19E67B8 + f.tell():X}")
offsets.append(f.tell())
f.seek(0)
for offset in offsets:
f.write(offset.to_bytes(4, byteorder="big"))

@ -1 +1 @@
Subproject commit 6106762b0561e40a640c11852a17bb87963c7ba8
Subproject commit 0ff02cd4734c26c7ae03aee4a0374a774b3b097b

0
tools/sort_symbol_addrs.py Normal file → Executable file
View File

View File

@ -7022,241 +7022,277 @@ segments:
- [0x19E5758, "Yay0"]
- [0x19E5950, "Yay0"]
- [0x19E62A0, "Yay0"]
- [0x19E67B2, "bin"]
- [0x19E6B60, "Yay0"]
- [0x19E7528, "Yay0"]
- [0x19E9778, "Yay0"]
- [0x19EAF38, "Yay0"]
- [0x19EC4E0, "Yay0"]
- [0x19EDD30, "Yay0"]
- [0x19EEB18, "Yay0"]
- [0x19F0070, "Yay0"]
- [0x19F15A0, "Yay0"]
- [0x19F26D8, "Yay0"]
- [0x19F5390, "Yay0"]
- [0x19F7398, "Yay0"]
- [0x19FA128, "Yay0"]
- [0x19FCAE8, "Yay0"]
- [0x19FED70, "Yay0"]
- [0x1A00958, "Yay0"]
- [0x1A02D00, "Yay0"]
- [0x1A04400, "Yay0"]
- [0x1A05550, "Yay0"]
- [0x1A06390, "Yay0"]
- [0x1A06F98, "Yay0"]
- [0x1A07B68, "Yay0"]
- [0x1A0A0A0, "Yay0"]
- [0x1A0ACC8, "Yay0"]
- [0x1A0B780, "Yay0"]
- [0x1A0BBE0, "Yay0"]
- [0x1A0C000, "Yay0"]
- [0x1A0C438, "Yay0"]
- [0x1A0C860, "Yay0"]
- [0x1A0D1E8, "Yay0"]
- [0x1A0D5B0, "Yay0"]
- [0x1A0D970, "Yay0"]
- [0x1A0EF00, "Yay0"]
- [0x1A13920, "Yay0"]
- [0x1A15850, "Yay0"]
- [0x1A183F8, "Yay0"]
- [0x1A1A608, "Yay0"]
- [0x1A1C5E8, "Yay0"]
- [0x1A1D6D0, "Yay0"]
- [0x1A1E478, "Yay0"]
- [0x1A1F370, "Yay0"]
- [0x1A226B0, "Yay0"]
- [0x1A249B8, "Yay0"]
- [0x1A25E78, "Yay0"]
- [0x1A27FF0, "Yay0"]
- [0x1A28BE0, "Yay0"]
- [0x1A29680, "Yay0"]
- [0x1A2BC68, "Yay0"]
- [0x1A2E120, "Yay0"]
- [0x1A2F3F8, "Yay0"]
- [0x1A31D18, "Yay0"]
- [0x1A33AB0, "Yay0"]
- [0x1A35BB8, "Yay0"]
- [0x1A369A8, "Yay0"]
- [0x1A39600, "Yay0"]
- [0x1A3B018, "Yay0"]
- [0x1A3C310, "Yay0"]
- [0x1A3FCC8, "Yay0"]
- [0x1A423D8, "Yay0"]
- [0x1A449C0, "Yay0"]
- [0x1A46568, "Yay0"]
- [0x1A49340, "Yay0"]
- [0x1A4AC88, "Yay0"]
- [0x1A4D7E8, "Yay0"]
- [0x1A4E028, "Yay0"]
- [0x1A4FA60, "Yay0"]
- [0x1A531D0, "Yay0"]
- [0x1A53D48, "Yay0"]
- [0x1A56C80, "Yay0"]
- [0x1A58F58, "Yay0"]
- [0x1A5A5A8, "Yay0"]
- [0x1A62B40, "Yay0"]
- [0x1A641F8, "Yay0"]
- [0x1A666F0, "Yay0"]
- [0x1A68870, "Yay0"]
- [0x1A6C630, "Yay0"]
- [0x1A6D5A0, "Yay0"]
- [0x1A6EF50, "Yay0"]
- [0x1A70FF0, "Yay0"]
- [0x1A74FC0, "Yay0"]
- [0x1A78A40, "Yay0"]
- [0x1A79900, "Yay0"]
- [0x1A7D798, "Yay0"]
- [0x1A7EEA0, "Yay0"]
- [0x1A7EFD8, "Yay0"]
- [0x1A83450, "Yay0"]
- [0x1A85668, "Yay0"]
- [0x1A87958, "Yay0"]
- [0x1A8BF98, "Yay0"]
- [0x1A8FE28, "Yay0"]
- [0x1A93EA0, "Yay0"]
- [0x1A94188, "Yay0"]
- [0x1A94480, "Yay0"]
- [0x1A946A8, "Yay0"]
- [0x1A94A00, "Yay0"]
- [0x1A94C58, "Yay0"]
- [0x1A98D98, "Yay0"]
- [0x1A9BA80, "Yay0"]
- [0x1A9DB68, "Yay0"]
- [0x1AA0048, "Yay0"]
- [0x1AA0698, "Yay0"]
- [0x1AA1008, "Yay0"]
- [0x1AA6D58, "Yay0"]
- [0x1AAD600, "Yay0"]
- [0x1AB1BF0, "Yay0"]
- [0x1AB2368, "Yay0"]
- [0x1ABA290, "Yay0"]
- [0x1AC14A8, "Yay0"]
- [0x1AC3910, "Yay0"]
- [0x1ACBC98, "Yay0"]
- [0x1ACE058, "Yay0"]
- [0x1ACF910, "Yay0"]
- [0x1AD06D8, "Yay0"]
- [0x1AD0B98, "Yay0"]
- [0x1AD1E90, "Yay0"]
- [0x1AD2348, "Yay0"]
- [0x1AD27F8, "Yay0"]
- [0x1AD28A8, "Yay0"]
- [0x1AD44F0, "Yay0"]
- [0x1AD4758, "Yay0"]
- [0x1AD57C0, "Yay0"]
- [0x1AD9D50, "Yay0"]
- [0x1ADA498, "Yay0"]
- [0x1ADCFC0, "Yay0"]
- [0x1AE2168, "Yay0"]
- [0x1AE2EA0, "Yay0"]
- [0x1AE6A58, "Yay0"]
- [0x1AEB778, "Yay0"]
- [0x1AF4958, "Yay0"]
- [0x1AFCB18, "Yay0"]
- [0x1AFF748, "Yay0"]
- [0x1B00640, "Yay0"]
- [0x1B01390, "Yay0"]
- [0x1B01C08, "Yay0"]
- [0x1B02128, "Yay0"]
- [0x1B02970, "Yay0"]
- [0x1B03118, "Yay0"]
- [0x1B03C18, "Yay0"]
- [0x1B045E8, "Yay0"]
- [0x1B04FC0, "Yay0"]
- [0x1B05998, "Yay0"]
- [0x1B06C88, "Yay0"]
- [0x1B07C48, "Yay0"]
- [0x1B09440, "Yay0"]
- [0x1B0B290, "Yay0"]
- [0x1B0B9A0, "Yay0"]
- [0x1B0C548, "Yay0"]
- [0x1B0CAC0, "Yay0"]
- [0x1B0D130, "Yay0"]
- [0x1B0EB80, "Yay0"]
- [0x1B10CC0, "Yay0"]
- [0x1B129A0, "Yay0"]
- [0x1B13548, "Yay0"]
- [0x1B16420, "Yay0"]
- [0x1B17128, "Yay0"]
- [0x1B17840, "Yay0"]
- [0x1B19318, "Yay0"]
- [0x1B1A030, "Yay0"]
- [0x1B1B8C8, "Yay0"]
- [0x1B1BC88, "Yay0"]
- [0x1B1C7A0, "Yay0"]
- [0x1B1CD28, "Yay0"]
- [0x1B21C48, "Yay0"]
- [0x1B23290, "Yay0"]
- [0x1B253E0, "Yay0"]
- [0x1B26660, "Yay0"]
- [0x1B283F8, "Yay0"]
- [0x1B29C60, "Yay0"]
- [0x1B2A688, "Yay0"]
- [0x1B2B3E8, "Yay0"]
- [0x1B2C8D8, "Yay0"]
- [0x1B2D7B0, "Yay0"]
- [0x1B2E328, "Yay0"]
- [0x1B2ED60, "Yay0"]
- [0x1B2FA18, "Yay0"]
- [0x1B31A18, "Yay0"]
- [0x1B33000, "Yay0"]
- [0x1B34098, "Yay0"]
- [0x1B34928, "Yay0"]
- [0x1B34C00, "Yay0"]
- [0x1B35480, "Yay0"]
- [0x1B36440, "Yay0"]
- [0x1B38748, "Yay0"]
- [0x1B39A98, "Yay0"]
- [0x1B3A2E8, "Yay0"]
- [0x1B3A818, "Yay0"]
- [0x1B3C488, "Yay0"]
- [0x1B3CAC8, "Yay0"]
- [0x1B3D0A0, "Yay0"]
- [0x1B3D920, "Yay0"]
- [0x1B3F060, "Yay0"]
- [0x1B40048, "Yay0"]
- [0x1B40720, "Yay0"]
- [0x1B49570, "Yay0"]
- [0x1B4C3E8, "Yay0"]
- [0x1B4DEA0, "Yay0"]
- [0x1B4FD98, "Yay0"]
- [0x1B50CD8, "Yay0"]
- [0x1B51B08, "Yay0"]
- [0x1B54258, "Yay0"]
- [0x1B580A0, "Yay0"]
- [0x1B5A248, "Yay0"]
- [0x1B5BB88, "Yay0"]
- [0x1B5CC90, "Yay0"]
- [0x1B5E968, "Yay0"]
- [0x1B5ED88, "Yay0"]
- [0x1B608C0, "Yay0"]
- [0x1B625F8, "Yay0"]
- [0x1B633D0, "Yay0"]
- [0x1B64878, "Yay0"]
- [0x1B657E0, "Yay0"]
- [0x1B65A08, "Yay0"]
- [0x1B65E50, "Yay0"]
- [0x1B66238, "Yay0"]
- [0x1B69580, "Yay0"]
- [0x1B6C318, "Yay0"]
- [0x1B6DD98, "Yay0"]
- [0x1B6F150, "Yay0"]
- [0x1B71618, "Yay0"]
- [0x1B72890, "Yay0"]
- [0x1B73B08, "Yay0"]
- [0x1B747B8, "Yay0"]
- [0x1B76E30, "Yay0"]
- [0x1B78EC0, "Yay0"]
- [0x1B79A20, "Yay0"]
- [0x1B79F08, "Yay0"]
- [0x1B7AA08, "Yay0"]
- [0x1B7B008, "Yay0"]
- [0x1B7BB50, "Yay0"]
- [0x1B7EC68, "Yay0"]
- [0x1B7FF48, "Yay0"]
- [0x1B81E88, "Yay0"]
- [0x1B82058, "Yay0"]
- [0x1B82202, "bin"]
- start: 0x19E67B8
type: PaperMarioNpcSprites
files:
- name: world_goombario
frames:
- walk1
- still
- walk2
- pain
- headbonk
- still_copy1
- still_copy2
- jump
- talk1
- talk2
- jump_copy
- fall
- happy1
- happy2
- read_paper
palettes:
- default
- poisoned
- inactive
- electrified
- burnt
animations:
- still
- idle
- walk
- run
- jump
- fall
- headbonk # centered at 0,0,0 rather than at base of sprite
- pain
- talk
- celebrate
- read_paper
- 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
- parada_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
- [0x1B82208, bin]
- start: 0x1B83000
type: PaperMarioMessages
files: