diff --git a/.gitignore b/.gitignore index 9eece179..680120ae 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,7 @@ build/* *.dump *.mio0 *.z64 +*.otr *.map .assets-local.txt diff --git a/.gitmodules b/.gitmodules index 4c47809e..ca59494f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "libultraship"] path = libultraship url = https://github.com/KiritoDv/libultraship + branch = version/pu \ No newline at end of file diff --git a/CHANGES b/CHANGES deleted file mode 100644 index 4854e294..00000000 --- a/CHANGES +++ /dev/null @@ -1,416 +0,0 @@ - Refresh 15 (mostly a hotfix for RSP microcode selection) - -1.) Renamed frame_buffer funcs and _ZBUFFER (#1184) -2.) RSP Microcode Hotfix (#1183) -3.) Label osSetTimer.c (#1182) -4.) Fix styling (#1177) -5.) Rename all `FrameBuffer` variants to `Framebuffer` (#1176) -6.) Remove (WIP) from sh. -7.) Allow both archives and ELF objects to be patched (#1127) - -Refresh 14 - -1.) Label whomp and some object fields (#1174) -2.) Generate MIO0 object files using binutils `ld` instead of `as` (#1173) -3.) Bowser documentation (#1166) -4.) Fix comment syntax in 00_sound_player.0 (#1172) -5.) Rename in-game menu variables (#1163) -6.) Document double red coin sound and JP sound glitch (#1170) -7.) Document different bug in external.c (#1168) -8.) updated names/types of octagonal platform data (#1164) -9.) Label a number of unnamed variables. (#1169) -10.) Document JP PU sound glitch (#1167) -11.) Set model ids to spawn_triangle_break_particles (#1165) -12.) Fix borders in clear_frame_buffer (#1162) -13.) Fix seq header files for 64-bit (#1161) -14.) Game_init.c remaining doc (#1158) -15.) Label a couple static variables in sound_init.c (#1159) -16.) Properly define dialog values (status, flags, cutscenes) (#1153) -17.) Label all of amp's assets. (#1018) -18.) Split audio/synthesis.c into Shindou/non-Shindou files (#1144) -19.) Avoid CC_CHECK warnings when using gcc (#1157) -20.) level_select_menu.c => title_screen.c (#1152) -21.) Use C preprocessor on assembly files (#1126) -22.) Replace output_level_headers.py with sed equivalent (#1109) -23.) Fix CC_CHECK warnings related to unused symbols and UB (#1155) -24.) Define remaining floor lower limit values (#1147) -25.) use r+b mode for libultra.a patch tool (#1148) -26.) Use proper values for gPrevFrameObjectCount ifs (#1146) -27.) Some minor bowser.inc.c labelling. (#1150) -28.) fix king bob-omb texture pointers (#1145) -29.) Split audio/load.c into Shindou/non-Shindou files (#1143) -30.) Small Shindou audio cleanups (#1142) -31.) Fix endians in ALSeqData (#1141) -32.) Document S8 decoder rsp operation and some more (#1139) -33.) Fix Shindou synthesis_process_note fake match (#1140) -34.) More audio documentation, for the new rsp code and other fixes (#1138) -35.) Build fixes for macOS: cpp, clang, recomp, aiff_extract_codebook (#1135) -36.) Add ENABLE_RUMBLE to config.h (#1122) -37.) Reduce recomp memory consumption by using smaller disassembly blocks (#1128) -38.) Makefile fixes (#1123) -39.) Update README.md -40.) Update README.md -41.) Reflect current decompilation status -42.) Allow both archives and ELF objects to be patched (#1127) -43.) Remove WIP mention in README for sh version. - -Refresh 13 2 - -- No more nonmatchings remain for all builds including Shindou. - -1.) Shindou OK (#1118) -2.) Match shindou sequence_player_process_sequence (#1117) -3.) Match func_sh_802f4e50 (#1116) - -Refresh 13 - -- No more nonmatchings remain for US, JP, or EU builds. Three(!!!) remain for Shindou (SH). - -*) SHINDOU MATCHING (#1081) -*) Makefile gcc fixes (#1114) - -1.) Update diff.py (#1113) -2.) Add support for generating C arrays from n64graphics and add Texture typedef (#1032) -3.) Update README and Dockerfile with recomp info (#1105) -4.) Support building tools with MSYS2 (#1112) -5.) Support building tools with clang and macOS (#1106) -6.) Clean tools directory when running distclean target (#1104) -7.) Make build output cleaner (#1095) -8.) Added 2 surface defines to bowser.inc.c (#1111) -9.) fix fake matchings (#1108) -10.) Use statically recompiled IDO instead of qemu-irix (#1099) -11.) Add VERBOSE=1 to Jenkinsfile -12.) updated intro_geo to use layer defines for geo flags (#1090) -13.) Fix F3DZEX (#1097) -14.) layer_transpose should take an s8 (#1093) -15.) Fix tools/ build (#1082) -16.) Relabel and document fish.inc.c (#1077) -17.) Ensure all calls to .py files use $(PYTHON) (#1080) -18.) Name Mario, Peach, and instrument sound files (#1078) -19.) Goddard labeling, part 2 (#1076) -20.) Fix envfx_snow and envfx_bubbles fake matches (#1075) -21.) Use array subscripts instead of pointer math in 2 files (#1074) -22.) refactor Makefile a bit (#1068) -23.) Further improvements on field names (#1059) -24.) Label and document manta_ray.inc.c (#1073) -25.) Fix level_script and behavior fake matches (#1072) -26.) Proper cell defines and more floor lower limit values. (#1065) -27.) Document and re-label some goddard/intro code (#1069) -28.) Match remaining functions (#1070) -29.) match 'spawn_special_objects' (#1071) -30.) Document parts of external.c and format sound defines (#1067) - -Refresh 12 - -1.) Debug box improvements (#1066) -2.) Improve 'geo_render_mirror_mario' (#1064) -3.) Cleanup and small labeling (#1063) -4.) Anim renames and other related renames (#1062) -5.) remove do while 0 and make one line comments consistent (#1061) -6.) fixed typo in segments.h (#1060) -7.) Name unknown fields (from public repo) (#1058) -8.) Change 'void *' to 'struct MainPoolState *' (#1057) -9.) Fix type of freeList (#1056) -10.) Newer version of diff script (#1055) -11.) Add stubbed_printfs based on unused audio strings (#1054) -12.) Fix comment in paintings.c (#1053) -13.) Add defines for hardcoded cell/floor height values (#1051) -14.) Update README.md: Remove GitHub specific Markdown syntax (#1052) -15.) Properly label interation status that handle's Bowser's shockwave attack (#1050) - -Refresh 11 -1.) Make geo_process_level_of_detail endian-independent (#1049) -2.) Label oMoveFlags and slight cleanup. (#1046) -3.) Avoid UB in synthesis_resample_and_mix_reverb (#1048) -4.) Change some void * to correct type (#1047) -5.) Remove oPathedWaypointsS16 and convert all paths to Trajectory struct. (#1045) -6.) Mr Blizzard documentation, Tox Box Unks (#1042) -7.) Pipe input to textconv. (#1041) -8.) Remove erroneous long double casts from audiofile.cpp (#1039) -9.) Replace fixed dialogID in play_dialog_sound to DIALOG_COUNT (#1040) - -Refresh #10.1 -1.) Diff update (#1033) -2.) Fix texture dimensions for exclamation boxes (#1034) -3.) Fix armips compilation on Windows by changing order of inclusion files (#1035) -4.) Embed libaudiofile into the repo as a single file (#1036) -5.) Fix some tools issues found while compiling on MSYS2 (#1037) - -Refresh #10 -1.) GCC 9 noreturn UB fixes (#961) -2.) List supported binutils variants in README.md (#960) -3.) fix fly guy's possible values for target roll -4.) clarify that 1 is an exclusive bound in random_float (#962) -5.) replace unkB8 with prevNumStarsForDialog (#963) -6.) Replace "BulletBillUnkF8" with "BulletBillInitialMoveYaw" (#966) -7.) Renamed more warp behaviors and spawn types (#949) -8.) EU bss cleanups (#965) -9.) Add -fno-zero-initialized-in-bss to GCC CFLAGS (#968) -10.) Use empty .SECONDARY target instead of .PRECIOUS (#964) -11.) Match EU seq_channel_layer_process_script (#969) -12.) Fix version variable overwriting bug for non-matching compilations (#974) -13.) small bhv_collect_star_init labeling (#972) -14.) Align SI DMA command buffers, add more names to osCont code (#973) -15.) Minor for loop fix in playback.c (#976) -16.) Add Docker config (Public #36) -17.) Fix usage output crash for skyconv (#977) -18.) Cleanup tools and their build flags (#978) -19.) Print more detailed file reading error messages in extract_assets (#982) -20.) Remove asmdiff (#983) -21.) Fixed tabledesign makefile bug (#985) -22.) Improve first-diff.py (#987) -23.) Bring in some enhancements such as widescreen enhancements (#981) -24.) Fix background shadow border if widescreen in shade_screen (#988) -25.) Merge common EU sections in osExceptionPreamble (#990) -26.) Introduce the NO_SEGMENTED_MEMORY define (#989) -27.) NO_SEGMENTED_MEMORY comments (#992) -28.) Introduce f3dex2e and a GBI_FLOATS setting (#993) -29.) Audio uses signed 16-bit integers as samples, not unsigned (#995) -30.) Assemble RSP ucode with armips (#970) -31.) Label Mr. Blizzard, Yoshi, Whomp, Wiggler, Wood Piece oFields. (#996) -32.) update crash enhancement (#1003) -33.) Update README.md to use new public Discord server invite -34.) Label variables in act_idle. (#1005) -35.) Fix a typo in camera.h (#1009) -36.) Fixed up profiler.c (#1010) -37.) Add -d to first-diff.py (#1012) -38.) Fix typo in first-diff.py (#1013) -39.) Remove binutils 2.27 dependency check (#1015) -40.) Update armips to v0.11.0 tag and add generator script (#1004) -41.) Extract IPL3 font from ROM (#1011) -42.) Documented audio playback flags (#1021) -43.) Change RSP register notation to dollar-prefixed numbers (#1022) -44.) Only check for QEMU_IRIX in Makefile when compiling with IDO (#1023) -45.) Clean up header files and update function prototypes (#1000) -46.) Named local variables in geo_update_layer_transparency (#1019) -47.) Extract crash screen font textures from EU and SH ROMs (#1025) -48.) Use ACTIVE_FLAG defines where appropriate (#1026) -49.) Changed type of actor collision from s16 to Collision (#1024) -50.) Implement sqrtf in assembly file (#1028) -51.) Rename Struct8032FCE8 as OpenableGrill and identify data members (#1029) -52.) Fix some mistakes in the abi doc (#1031) -53.) The README.md PR (#979) - -Refresh #8 -1.) Use INT_STATUS_ macros for oInteractStatus (#911) -2.) Update bullet_bill.inc.c (#912) -3.) Make geo.c in levels nonconst to reduce diffs with gcc enhancement patch in future (#913) -4.) Improve process_level_music_dynamics (#915) -5.) add AVOID_UB define for fixing libultra aliasing. (#916) -6.) const hack to TARGET_N64 and tweak ld script (#918) -7.) Replace raw level/course numbers with defines (#919) -8.) Label all graph node flags. (#920) -9.) readme.md capitalization -10.) The Big Function PR (Part 5) (#910) -11.) Label hardware registers (#922) -12.) Match EU synthesis_process_note (#923) -13.) Some quick value changes (#909) -14.) Added sequence player defines (#926) -15.) Shindou diffs 2 [merge game.c and display.c, required for SH] (#927) -16.) Match synthesis_process_notes and use -sopt for synthesis.c (#928) -17.) Fix mips64-binutils for Fedora 31 and similar Linux distros (#931) -18.) Update first-diff.py to work with Shindou (#933) -19.) Labelled behavior_script.c (#929) -20.) shindou diffs up to level_update (#932) -21.) Update diff.py and diff_settings.py to work with SH (#936) -22.) Add some Shindou resources to extract_assets.py (#939) -23.) Label and document gd_math.c (#930) -24.) Label all of Mario's actions. (#941) -25.) Label all particles. (#940) -26.) Renamed death related warpBhvs (#942) -27.) Small Shindou differences (#945) -28.) match player_performed_grab_escape_action in all versions (#943) -29.) add main alignment (aglab2, #947) -30.) Match a bunch of fake EU matchings (#944) -31.) Shindou diffs round 4 (#937) -32.) Easy PAL fake matchings (#946) -33.) Merge object_helpers and object_helpers2 headers (#948) -34.) match cap_check_quicksand (#950) -35.) Shindou crash screen diffs (#938) -36.) Thread6 (#951) -37.) Correct IPL3 function and label addresses (#952) -38.) Add COMPILER flag for Makefile and add official mips gcc support. (#953) -39.) add align to sequence_00 (fixes gcc build) (#957) -40.) Fixed itty bitty typo (#959) - -Refresh #7 -1.) update README.md (#861) -2.) [eu] fix decompilation bugs in synthesis_process_note (#862) -3.) Label and document Snufit.inc.c (#863) -4.) Label and document Snufit.inc.c (#863) -5.) Match append_bubble_vertex_buffer, append_snowflake_vertex_buffer (#860) -6.) Compile audio/effects.c with -sopt (#870) -7.) Match handle_dialog_text_and_pages (#872) -8.) Remove improperly used LEVEL_SA define. (#875) -9.) Remove unused EU ASM files (#873) -10.) Shindou build flag support (#876) -11.) The Big Function PR (Part 1) (#864) -12.) "Re-document" file_select and star_select for EU (#877) -13.) Document paintings.c (#868) -14.) Minor interaction.c labelling/documentation. (#882) -15.) Match synthesis_execute, prepare_reverb_ring_buffer, func_eu_802e00d8 (#886) -16.) The Big Function PR (Part 2) (#874) -17.) Additional painting documentation (#883) -18.) Some EU audio labelling (#885) -19.) Bring synthesis_do_one_audio_update a bit closer to matching (#887) -20.) Misleading comment, this actually contols Bowser's init action (#889) -21.) Match synthesis_do_one_audio_update (#890) -22.) Remove unneeded if(1) in synthesis_do_one_audio_update (#891) -23.) Match synthesis_resample_and_mix_reverb (#893) -24.) Set LANG=C (#896) -25.) Match note_apply_headset_pan_effects (#897) -26.) Match play_sequence (#898) -27.) Match sequence_channel_enable (#899) -28.) Match sequence_player_process_sequence (#900) -29.) Match (eu) alloc_bank_or_seq (#901) -30.) Match alloc_bank_or_seq (#903) -31.) Update README.md (again) -32.) Documented behaviour/fish.inc.c & blue_fish.inc.c (#894) -33.) Labelled 4 behavior files, made object_helper functions consistent (#881) -34.) Add a make target for .copt (#902) -35.) The Big Function PR (Part 3) (#888) -36.) The Big Function PR (Part 4) (#906) -37.) Rename src/audio/memory.c -> heap.c (#907) -38.) Fix BBH texture (#908) - -Refresh #6 -1.) Make tools work on MinGW (#804) -2.) Document mario_misc (#628) -3.) add patch_libmalloc.py script to work around compiler crashes (#811) -4.) Label the coffins file. (#829) -5.) Convert enhancements into patches (#827) -6.) Document Tweester.inc.c (#840) -7.) EU OK and cleanup EU (#782) - -Refresh #5 -1.) mem_error_screen.inc.c updated for C (#775) -2.) updated patch_libultra_math to work directly on libultra.a (#781) -3.) Enhancement: Debug boxes (#783) -4.) Label effects MemoryPool (#784) -5.) Use full-width characters for JP text and rename mislabeled stuff (#772) -6.) Small asset extraction fixes (#785) -7.) Fix incremental asset extraction after the last PR (#790) -8.) Labelled behavior script commands, tidied up behavior scripts and ren… -9.) Document camera.c (#741) -10.) Fix a HMC texture asset (#795) -11.) Fix UB in angle conversion for paintings. Needed for pc-port. (#796) -12.) Fix PSS texture assets (#801) -13.) Fix some camera typos (#802) - -Refresh #4 -1.) Label screen_transition.c (#737) -2.) Revamp macros (#738) -3.) Simplify the cake makefile logic (#739) -4.) Move zbuffer to C (#742) -5.) Audio blob endian/64-bit fixes (#740) -6.) Ub fixes (#745) -7.) process_level_music_dynamics: slightly better stack and regalloc (#746) -8.) move level order specific definitions out to levels/level_defines.h (#743) -9.) Renamed some mislabelled sound effects (#748) -10.) Very minor white space fixes in Mario.c (#752) -11.) Renamed GRAVITY to OBJ_PHYSICS (#755) -12.) Use defined macros instead of literal values for interactions in behavior_data.c (#754) -13.) iQue Player console detection + full support (#756) -14.) Fix Goddard Mario head for little endian etc. (#757) -15.) Small bits of audio doc (#749) -16.) Update diff script (#750) -17.) Nicer format for course/dialog text, enum for dialog IDs (#753) -18.) first-diff: store most recent mtime during check (#759) -19.) Use Lights1 struct for light values (#760) -20.) Detect mips64-elf in diff.py (#761) -21.) Name display lists in gd renderer.c (#764) -22.) Document a variety of PU type crashes. (#765) -23.) Label object_behaviors. (#716) -24.) Update swoop.inc.c (#767) -25.) Label tilting_pyramid.inc.c (#768) -26.) Label red_coin.inc.c (#770) -27.) Use more level defines (#758) -28.) Named Mario actions 6, 7, and 8 and noted causes of hands-free holding glitch (#769) - -Refresh #3 -1.) Small bits of sound sample labelling -2.) Append 'b' to fopen calls in n64graphics to satisfy Windows -3.) Document synthesis.c and abi.h -4.) Remove gbi_old.h and use gbi.h instead for F3D_OLD -5.) Fix and change most values used by f3d commands -6.) Convert actors to C -7.) Make extract_assets.py fail on bad baserom -8.) Fix some (pragma-ignored) warnings -9.) Convert trig tables and data/ buffers into C -10.) Document intro behaviors and some of camera.c -11.) Match dma_sample_data -12.) Convert levels, bin, text, goddard_tex_dl to C -13.) Remove .bss size hardcoding -14.) Add mips64 fallback and alt dump option to diff.sh -15.) Convert behavior_data to C -16.) Get rid of the enum in behavior_data. -17.) Change more values used by f3d commands -18.) Document game/skybox.c -19.) Actors levels fixup -20.) Convert Mario animations to C (kind of) -22.) generate skybox data from 248x248 images -23.) 64-bit fixes -24.) Move demo data to C -25.) Change uintptr_t to GeoLayout for actors -26.) Move libc includes to include/libc/ - -Refresh #2a (hotfix) -Changes from Refresh #2: - -1.) Fixed text Makefile dependencies" - -Refresh #2 -Changes from Refresh #1: - -1.) Label src/game/behaviors/boo.inc.c -2.) Verify half of audio_defines.h -3.) Label ingame_menu.c and some dialog stuff -4.) Improve handle_dialog_text_and_pages EU non-matching -5.) Fix texture format for water splash/sparkle -6.) Merge ucode.bin and ucode_unk.bin -7.) 64-bit fixes -8.) [AUDIO] Match func_80316928 -9.) Documented bug in Tuxie's mother's code -10.) [AUDIO] Slightly closer matching for process_level_music_dynamics -11.) Name channel scripts in sequence 0 -12.) Nicer error message when sha1sum doesn't match -13.) Refactor object fields -14.) Document file_select.c -15.) Document star_select.c -16.) Add uncompressed string support to textconv -17.) Document main_menu geo and leveldata -18.) Document hud.c and rename char textures -19.) Correct gSPTextureRectangle values -20.) Linker script wildcard - - Fixes "undefined reference to x in discarded section y" linker errors. - - Also means that you no longer have to add linker script entries for source files. -21.) Reference qemu-irix package and add project structure - - Installing qemu-irix is as simple as installing the provided Debian package on the GitHub "Releases" tab - (https://github.com/n64decomp/qemu-irix). - - Old qemu-irix installs are unaffected by this change, and it is still possible to install qemu-irix with the older method. - -Refresh #1 -Changes from initial release: - -1.) More README cleanups and documentation -2.) Fix .gitignore in tools/ -3.) More README cleanups and corrections -4.) oUnk190 -> oInteractionSubtype -5.) Normalize line endings -6.) Replace bank_sets.s by sequences.json + build magic -7.) Fix tabledesign in .gitignore -8.) Cleaned and documented arrays in audio/ -9.) Change minimum Python 3 requirement in README.md to 3.6 -10.) Remove whitespace in ingame_menu.c, save_file.c, and star_select.c -11.) Documentation comment style fixed -12.) sm64.map -> sm64.version.map (ex: sm64.us.map) -13.) Decompile EU versions of HUD and obj behaviors -14.) Label ukiki.inc.c and ukiki_cage.inc.c -15.) Add missing OS header includes -16.) Fix alignment issue in model_ids.h -17.) A bunch of behavior changes: - a.) Made styles consistent with function names (ex: BehBehaviorLoop -> beh_behavior_loop) - b.) Split obj_behaviors_2.c into multiple .inc.c files in behaviors/ - c.) bhvHauntedRoomCheck -> bhvCoffinManager -18.) Update README.md notes on WSL and add links -19.) Added tidy.sh and also bracing around single-line ifs and loops diff --git a/CMakeLists.txt b/CMakeLists.txt index eadbe72d..b2418d88 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,8 @@ include(FindFontconfig) if (WIN32) include(cmake/automate-vcpkg.cmake) +# Forced to use MSVC +set(MSVC ON) if(MSVC) set(VCPKG_TRIPLET x64-windows-static) @@ -44,35 +46,12 @@ endif() # Set game compilation version set(VERSION us) -# Add the tools subdirectory to the build -add_subdirectory(tools) - -# Find Python 3 for the custom target -find_package(Python3 COMPONENTS Interpreter REQUIRED) - -# Add a custom target to extract assets -add_custom_target( - ExtractAssets - COMMAND ${CMAKE_COMMAND} -E env "TOOLS_PATH=$" ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/extract_assets.py ${VERSION} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Running asset extraction..." - DEPENDS Tools -) - -# Add a custom target to extract assets -add_custom_target( - CleanAssets - COMMAND ${CMAKE_COMMAND} -E env "TOOLS_PATH=$" ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/extract_assets.py --clean - COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/.assets-local.txt - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Running asset extraction..." - DEPENDS Tools -) - # Add compile definitions for the target add_compile_definitions( VERSION_US=1 F3DEX_GBI_2=1 + GBI_FLOATS=1 + ENABLE_RUMBLE=1 _LANGUAGE_C _USE_MATH_DEFINES CIMGUI_DEFINE_ENUMS_AND_STRUCTS @@ -129,6 +108,10 @@ file(GLOB_RECURSE ALL_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/port/*.h" "src/port/*.c" "src/port/*.cpp" + "src/port/Enhancements/*.h" + "src/port/Enhancements/*.cpp" + "src/port/Enhancements/game-interactor/*.h" + "src/port/Enhancements/game-interactor/*.cpp" "src/port/importer/*.cpp" "src/port/importer/types/*.cpp" "text/*.c" @@ -142,45 +125,6 @@ list(FILTER ALL_FILES EXCLUDE REGEX "bin/eu/.*.c") list(FILTER ALL_FILES EXCLUDE REGEX "src/game/main.c") list(FILTER ALL_FILES EXCLUDE REGEX "src/pc/dlmalloc.c") - -#==============================================================================# -# Generated Source Code Files # -#==============================================================================# - -set(INC_C_FILES "") - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/text/us/define_text-tmp - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/text/us - COMMAND ${CPP} -I${CMAKE_CURRENT_SOURCE_DIR}/text/us ${CMAKE_CURRENT_SOURCE_DIR}/text/define_text.inc.c > ${CMAKE_CURRENT_BINARY_DIR}/text/us/define_text-tmp -) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/text/us/define_text.inc.c - COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/charmap.txt ${CMAKE_CURRENT_BINARY_DIR}/text/us/define_text-tmp ${CMAKE_CURRENT_BINARY_DIR}/text/us/define_text.inc.c - VERBATIM - DEPENDS textconv - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/text/us/define_text-tmp -) - -list(APPEND INC_C_FILES ${CMAKE_CURRENT_BINARY_DIR}/text/us/define_text.inc.c) - -add_custom_command( - OUTPUT include/text_strings.h - COMMAND $ charmap.txt ${CMAKE_CURRENT_SOURCE_DIR}/include/text_strings.h.in ${CMAKE_CURRENT_BINARY_DIR}/include/text_strings.h - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS textconv -) -list(APPEND ALL_FILES ${CMAKE_CURRENT_BINARY_DIR}/include/text_strings.h) - -add_custom_command( - OUTPUT include/text_menu_strings.h - COMMAND $ charmap_menu.txt ${CMAKE_CURRENT_SOURCE_DIR}/include/text_menu_strings.h.in ${CMAKE_CURRENT_BINARY_DIR}/include/text_menu_strings.h - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS textconv -) -list(APPEND ALL_FILES ${CMAKE_CURRENT_BINARY_DIR}/include/text_menu_strings.h) - add_executable(${PROJECT_NAME} ${ALL_FILES} ${GENERATED_SOURCES}) ################################################################################ @@ -345,7 +289,6 @@ if(MSVC) /W3; /MT > - /sdl-; /permissive-; /MP; ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; @@ -355,16 +298,16 @@ if(MSVC) elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32") target_compile_options(${PROJECT_NAME} PRIVATE $<$: - /RTCs + /MTd > $<$: /O2; /Oi; - /Gy + /Gy; + /MT > /permissive-; /MP; - /sdl-; /w; ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; ${DEFAULT_CXX_EXCEPTION_HANDLING} @@ -401,6 +344,14 @@ if(MSVC) /SUBSYSTEM:WINDOWS ) endif() + + # Remove /RTC from msvc flags + foreach (fentry + CMAKE_C_FLAGS + CMAKE_CXX_FLAGS + ) + string (REGEX REPLACE "/RTC(su|[1su])" "" ${fentry} "${${fentry}}") + endforeach(fentry) endif() if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") @@ -506,10 +457,3 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") ) endif() endif() - -add_custom_target( - ConvertIncCFiles - DEPENDS ${INC_C_FILES} -) - -add_dependencies(${PROJECT_NAME} ConvertIncCFiles) diff --git a/README.md b/README.md index aee71d4f..13811342 100644 --- a/README.md +++ b/README.md @@ -1,193 +1,43 @@ -# Super Mario 64 +# Ghostship (Name Pending) +_A Super Mario 64 PC Port_ -- This repo contains a full decompilation of Super Mario 64 (J), (U), (E), and (SH). -- Naming and documentation of the source code and data structures are in progress. +A prior copy of the game is required to extract the assets. We do not condone piracy. -It builds the following ROMs: +__The following ROMs are supported:__ * sm64.jp.z64 `sha1: 8a20a5c83d6ceb0f0506cfc9fa20d8f438cafe51` * sm64.us.z64 `sha1: 9bef1128717f958171a4afac3ed78ee2bb4e86ce` * sm64.eu.z64 `sha1: 4ac5721683d0e0b6bbb561b58a71740845dceea9` * sm64.sh.z64 `sha1: 3f319ae697533a255a1003d09202379d78d5a2e0` -This repo does not include all assets necessary for compiling the ROMs. -A prior copy of the game is required to extract the assets. +## Discord -## Quick Start (for Ubuntu) + +Currently this project is in the early stages of development, and the relevant discord channels are not yet public. If you would like to contribute, please contact one of the developers on the [HM64 Discord](https://discord.com/invite/shipofharkinian) for more information. -1. Install prerequisites: `sudo apt install -y build-essential git binutils-mips-linux-gnu python3` -2. Clone the repo from within Linux: `git clone https://github.com/n64decomp/sm64.git` -3. Place a Super Mario 64 ROM called `baserom..z64` into the project folder for asset extraction, where `VERSION` can be `us`, `jp`, `eu`, or `sh`. -4. Run `make` to build. Qualify the version through `make VERSION=`. Add `-j4` to improve build speed (hardware dependent). +## Quick Start +#### 1. Verify your ROM +Upload your ROM dump to [Hasher-js](https://www.romhacking.net/hash/) and verify that the SHA1 hash matches one of the hashes listed above. -Ensure the repo path length does not exceed 255 characters. Long path names result in build errors. +#### 2. Create an OTR from your ROM + +Eventually this step will be a bit more user friendly and built-in to the port, but for now you will need to clone and use [CubeOS](https://github.com/HarbourMasters/CubeOS) and follow the instructions in the README. -## Installation +#### 3. Download the latest release + +Currently there are no releases or nightly builds available. You will need to build the project yourself, or check back later. -### Windows +#### 4. Place your OTR next to the executable and launch the game! -Install WSL and a distro of your choice following -[Windows Subsystem for Linux Installation Guide for Windows 10.](https://docs.microsoft.com/en-us/windows/wsl/install-win10) -We recommend either Debian or Ubuntu 18.04 Linux distributions under WSL. -Note: WSL1 does not currently support Ubuntu 20.04. +## Development -Next, clone the SM64 repo from within the Linux shell: -`git clone https://github.com/n64decomp/sm64.git` +### Building -Then continue following the directions in the [Linux](#linux) installation section below. +If you want to manually compile this, please consult the [building instructions](docs/building.md). -### Linux - -There are 3 steps to set up a working build. - -#### Step 1: Install dependencies - -The build system has the following package requirements: - * binutils-mips - * capstone - * pkgconf - * python3 >= 3.6 - -Dependency installation instructions for common Linux distros are provided below: - -##### Debian / Ubuntu -To install build dependencies: -``` -sudo apt install -y binutils-mips-linux-gnu build-essential git libcapstone-dev pkgconf python3 -``` - -##### Arch Linux -To install build dependencies: -``` -sudo pacman -S base-devel capstone python -``` -Install the following AUR packages: -* [mips64-elf-binutils](https://aur.archlinux.org/packages/mips64-elf-binutils) (AUR) - - -##### Other Linux distributions - -Most modern Linux distributions should have equivalent packages to the other two listed above. -You may have to use a different version of GNU binutils. Listed below are fully compatible binutils -distributions with support in the makefile, and examples of distros that offer them: - -* `mips64-elf-` (Arch AUR) -* `mips-linux-gnu-` (Ubuntu and other Debian-based distros) -* `mips64-linux-gnu-` (RHEL/CentOS/Fedora) - -You may also use [Docker](#docker-installation) to handle installing an image with minimal dependencies. - -#### Step 2: Copy baserom(s) for asset extraction - -For each version (jp/us/eu/sh) for which you want to build a ROM, put an existing ROM at -`./baserom..z64` for asset extraction. - -##### Step 3: Build the ROM - -Run `make` to build the ROM (defaults to `VERSION=us`). -Other examples: -``` -make VERSION=jp -j4 # build (J) version instead with 4 jobs -make VERSION=eu COMPARE=0 # build (EU) version but do not compare ROM hashes -``` - -Resulting artifacts can be found in the `build` directory. - -The full list of configurable variables are listed below, with the default being the first listed: - -* ``VERSION``: ``us``, ``jp``, ``eu``, ``sh`` -* ``GRUCODE``: ``f3d_old``, ``f3d_new``, ``f3dex``, ``f3dex2``, ``f3dzex`` -* ``COMPARE``: ``1`` (compare ROM hash), ``0`` (do not compare ROM hash) -* ``NON_MATCHING``: Use functionally equivalent C implementations for non-matchings (Currently there aren't any non-matchings, but this will apply to iQue). Also will avoid instances of undefined behavior. -* ``CROSS``: Cross-compiler tool prefix (Example: ``mips64-elf-``). - -### macOS - -With macOS, you may either use Homebrew or [Docker](#docker-installation). - -#### Homebrew - -#### Step 1: Install dependencies -Install [Homebrew](https://brew.sh) and the following dependencies: -``` -brew update -brew install capstone coreutils make pkg-config tehzz/n64-dev/mips64-elf-binutils -``` - -#### Step 2: Copy baserom(s) for asset extraction - -For each version (jp/us/eu/sh) for which you want to build a ROM, put an existing ROM at -`./baserom..z64` for asset extraction. - -##### Step 3: Build the ROM - -Use Homebrew's GNU make because the version included with macOS is too old. - -``` -gmake VERSION=jp -j4 # build (J) version instead with 4 jobs -``` - -### Docker Installation - -#### Create Docker image - -After installing and starting Docker, create the docker image. This only needs to be done once. -``` -docker build -t sm64 . -``` - -#### Build - -To build, mount the local filesystem into the Docker container and build the ROM with `docker run sm64 make`. - -##### macOS example for (U): -``` -docker run --rm --mount type=bind,source="$(pwd)",destination=/sm64 sm64 make VERSION=us -j4 -``` - -##### Linux example for (U): -For a Linux host, Docker needs to be instructed which user should own the output files: -``` -docker run --rm --mount type=bind,source="$(pwd)",destination=/sm64 --user $UID:$GID sm64 make VERSION=us -j4 -``` - -Resulting artifacts can be found in the `build` directory. - -## Project Structure - - sm64 - ├── actors: object behaviors, geo layout, and display lists - ├── asm: handwritten assembly code, rom header - │ └── non_matchings: asm for non-matching sections - ├── assets: animation and demo data - │ ├── anims: animation data - │ └── demos: demo data - ├── bin: C files for ordering display lists and textures - ├── build: output directory - ├── data: behavior scripts, misc. data - ├── doxygen: documentation infrastructure - ├── enhancements: example source modifications - ├── include: header files - ├── levels: level scripts, geo layout, and display lists - ├── lib: SDK library code - ├── rsp: audio and Fast3D RSP assembly code - ├── sound: sequences, sound samples, and sound banks - ├── src: C source code for game - │ ├── audio: audio code - │ ├── buffers: stacks, heaps, and task buffers - │ ├── engine: script processing engines and utils - │ ├── game: behaviors and rest of game source - │ ├── goddard: Mario intro screen - │ └── menu: title screen and file, act, and debug level selection menus - ├── text: dialog, level names, act names - ├── textures: skybox and generic texture data - └── tools: build tools - -## Contributing - -Pull requests are welcome. For major changes, please open an issue first to -discuss what you would like to change. - -Run `clang-format` on your code to ensure it meets the project's coding standards. - -Official Discord: [discord.gg/DuYH3Fh](https://discord.gg/DuYH3Fh) + + + + Powered by libultraship + + diff --git a/assets/fonts/Fipps-Regular.otf b/assets/fonts/Fipps-Regular.otf new file mode 100644 index 00000000..9334dad5 Binary files /dev/null and b/assets/fonts/Fipps-Regular.otf differ diff --git a/assets/fonts/PressStart2P-Regular.ttf b/assets/fonts/PressStart2P-Regular.ttf new file mode 100644 index 00000000..2442affb Binary files /dev/null and b/assets/fonts/PressStart2P-Regular.ttf differ diff --git a/assets/textures/buttons/ABtn.png b/assets/textures/buttons/ABtn.png new file mode 100644 index 00000000..c1b06571 Binary files /dev/null and b/assets/textures/buttons/ABtn.png differ diff --git a/assets/textures/buttons/BBtn.png b/assets/textures/buttons/BBtn.png new file mode 100644 index 00000000..99b1197c Binary files /dev/null and b/assets/textures/buttons/BBtn.png differ diff --git a/assets/textures/buttons/CDown.png b/assets/textures/buttons/CDown.png new file mode 100644 index 00000000..741188ea Binary files /dev/null and b/assets/textures/buttons/CDown.png differ diff --git a/assets/textures/buttons/CLeft.png b/assets/textures/buttons/CLeft.png new file mode 100644 index 00000000..5e26a206 Binary files /dev/null and b/assets/textures/buttons/CLeft.png differ diff --git a/assets/textures/buttons/CRight.png b/assets/textures/buttons/CRight.png new file mode 100644 index 00000000..9e618063 Binary files /dev/null and b/assets/textures/buttons/CRight.png differ diff --git a/assets/textures/buttons/CUp.png b/assets/textures/buttons/CUp.png new file mode 100644 index 00000000..6c0e29d2 Binary files /dev/null and b/assets/textures/buttons/CUp.png differ diff --git a/assets/textures/buttons/LBtn.png b/assets/textures/buttons/LBtn.png new file mode 100644 index 00000000..2e0a8f00 Binary files /dev/null and b/assets/textures/buttons/LBtn.png differ diff --git a/assets/textures/buttons/RBtn.png b/assets/textures/buttons/RBtn.png new file mode 100644 index 00000000..c255643c Binary files /dev/null and b/assets/textures/buttons/RBtn.png differ diff --git a/assets/textures/buttons/StartBtn.png b/assets/textures/buttons/StartBtn.png new file mode 100644 index 00000000..c3e08dc3 Binary files /dev/null and b/assets/textures/buttons/StartBtn.png differ diff --git a/assets/textures/buttons/ZBtn.png b/assets/textures/buttons/ZBtn.png new file mode 100644 index 00000000..def8d9a6 Binary files /dev/null and b/assets/textures/buttons/ZBtn.png differ diff --git a/assets/textures/icons/gIcon.png b/assets/textures/icons/gIcon.png new file mode 100644 index 00000000..4cad9d48 Binary files /dev/null and b/assets/textures/icons/gIcon.png differ diff --git a/assets/textures/virtual/gEmptyTexture.rgba32.png b/assets/textures/virtual/gEmptyTexture.rgba32.png new file mode 100644 index 00000000..eaf806b7 Binary files /dev/null and b/assets/textures/virtual/gEmptyTexture.rgba32.png differ diff --git a/bin/segment2.c b/bin/segment2.c index 93f5425b..9e2783ba 100644 --- a/bin/segment2.c +++ b/bin/segment2.c @@ -48,9 +48,7 @@ ALIGNED8 static const Texture texture_hud_char_H[] = "__OTR__textures/segment2/s ALIGNED8 static const Texture texture_hud_char_I[] = "__OTR__textures/segment2/segment2.02400"; -#if defined(VERSION_JP) || defined(VERSION_SH) ALIGNED8 static const Texture texture_hud_char_J[] = "__OTR__textures/segment2/segment2.02600"; -#endif ALIGNED8 static const Texture texture_hud_char_K[] = "__OTR__textures/segment2/segment2.02800"; @@ -64,9 +62,7 @@ ALIGNED8 static const Texture texture_hud_char_O[] = "__OTR__textures/segment2/s ALIGNED8 static const Texture texture_hud_char_P[] = "__OTR__textures/segment2/segment2.03200"; -#if defined(VERSION_JP) || defined(VERSION_SH) ALIGNED8 static const Texture texture_hud_char_Q[] = "__OTR__textures/segment2/segment2.03400"; -#endif ALIGNED8 static const Texture texture_hud_char_R[] = "__OTR__textures/segment2/segment2.03600"; @@ -76,21 +72,15 @@ ALIGNED8 static const Texture texture_hud_char_T[] = "__OTR__textures/segment2/s ALIGNED8 static const Texture texture_hud_char_U[] = "__OTR__textures/segment2/segment2.03C00"; -#if defined(VERSION_JP) || defined(VERSION_EU) || defined(VERSION_SH) ALIGNED8 static const Texture texture_hud_char_V[] = "__OTR__textures/segment2/segment2.03E00"; -#endif ALIGNED8 static const Texture texture_hud_char_W[] = "__OTR__textures/segment2/segment2.04000"; -#if defined(VERSION_JP) || defined(VERSION_SH) ALIGNED8 static const Texture texture_hud_char_X[] = "__OTR__textures/segment2/segment2.04200"; -#endif ALIGNED8 static const Texture texture_hud_char_Y[] = "__OTR__textures/segment2/segment2.04400"; -#if defined(VERSION_JP) || defined(VERSION_EU) || defined(VERSION_SH) ALIGNED8 static const Texture texture_hud_char_Z[] = "__OTR__textures/segment2/segment2.04600"; -#endif ALIGNED8 static const Texture texture_hud_char_apostrophe[] = "__OTR__textures/segment2/segment2.04800"; @@ -100,17 +90,15 @@ ALIGNED8 static const Texture texture_hud_char_double_quote[] = "__OTR__textures ALIGNED8 static const Texture texture_hud_char_umlaut[] = "__OTR__textures/segment2/segment2.umlaut"// EU ¨; #endif -#if defined(VERSION_JP) || defined(VERSION_SH) -ALIGNED8 static const Texture texture_hud_char_exclamation[] = "__OTR__textures/segment2/segment2.04C00"// JP !; +ALIGNED8 static const Texture texture_hud_char_exclamation[] = "__OTR__textures/segment2/segment2.04C00"; -ALIGNED8 static const Texture texture_hud_char_double_exclamation[] = "__OTR__textures/segment2/segment2.04E00"// JP !!; +ALIGNED8 static const Texture texture_hud_char_double_exclamation[] = "__OTR__textures/segment2/segment2.04E00"; -ALIGNED8 static const Texture texture_hud_char_question[] = "__OTR__textures/segment2/segment2.05000"// JP ?; +ALIGNED8 static const Texture texture_hud_char_question[] = "__OTR__textures/segment2/segment2.05000"; -ALIGNED8 static const Texture texture_hud_char_ampersand[] = "__OTR__textures/segment2/segment2.05200"// JP &; +ALIGNED8 static const Texture texture_hud_char_ampersand[] = "__OTR__textures/segment2/segment2.05200"; -ALIGNED8 static const Texture texture_hud_char_percent[] = "__OTR__textures/segment2/segment2.05400"// JP %; -#endif +ALIGNED8 static const Texture texture_hud_char_percent[] = "__OTR__textures/segment2/segment2.05400"; ALIGNED8 static const Texture texture_hud_char_multiply[] = "__OTR__textures/segment2/segment2.05600"; @@ -120,13 +108,9 @@ ALIGNED8 static const Texture texture_hud_char_mario_head[] = "__OTR__textures/s ALIGNED8 static const Texture texture_hud_char_star[] = "__OTR__textures/segment2/segment2.05C00"; -#if defined(VERSION_JP) || defined(VERSION_SH) ALIGNED8 static const Texture texture_hud_char_decimal_point[] = "__OTR__textures/segment2/segment2.05E00"; -#endif -#if defined(VERSION_JP) || defined(VERSION_SH) ALIGNED8 static const Texture texture_hud_char_beta_key[] = "__OTR__textures/segment2/segment2.06000"; -#endif ALIGNED8 static const Texture texture_credits_char_3[] = "__OTR__textures/segment2/segment2.06200"; @@ -189,7 +173,6 @@ ALIGNED8 static const Texture texture_credits_char_Z[] = "__OTR__textures/segmen ALIGNED8 static const Texture texture_credits_char_period[] = "__OTR__textures/segment2/segment2.07080"; // JP Small Font -#if defined(VERSION_JP) || defined(VERSION_SH) ALIGNED8 static const Texture texture_font_char_jp_0[] = "__OTR__textures/segment2/segment2.07100"; ALIGNED8 static const Texture texture_font_char_jp_1[] = "__OTR__textures/segment2/segment2.07110"; @@ -521,7 +504,7 @@ ALIGNED8 static const Texture texture_font_char_jp_wave_dash[] = "__OTR__texture ALIGNED8 static const Texture texture_font_char_jp_ellipsis[] = "__OTR__textures/segment2/segment2.07B40"; // EU Small Font -#elif defined(VERSION_EU) +#if defined(VERSION_EU) ALIGNED8 static const Texture texture_font_char_eu_0[] = "__OTR__textures/segment2/font_graphics.05F00"; @@ -724,7 +707,8 @@ ALIGNED8 static const Texture texture_font_char_eu_Cedilla[] = "__OTR__textures/ ALIGNED8 static const Texture texture_font_char_eu_eszeet[] = "__OTR__textures/segment2/font_graphics.06530"; // US Small Font -#else +#endif + ALIGNED8 static const Texture texture_font_char_us_0[] = "__OTR__textures/segment2/font_graphics.05900"; ALIGNED8 static const Texture texture_font_char_us_1[] = "__OTR__textures/segment2/font_graphics.05940"; @@ -908,7 +892,6 @@ ALIGNED8 static const Texture texture_font_char_us_button_C_down[] = "__OTR__tex ALIGNED8 static const Texture texture_font_char_us_button_C_left[] = "__OTR__textures/segment2/font_graphics.06F80"; ALIGNED8 static const Texture texture_font_char_us_button_C_right[] = "__OTR__textures/segment2/font_graphics.06FC0"; -#endif ALIGNED8 static const Texture texture_hud_char_camera[] = "__OTR__textures/segment2/segment2.07B50"; @@ -938,22 +921,6 @@ const Texture *const main_hud_lut[] = { 0x0, 0x0, texture_hud_char_multiply, texture_hud_char_coin, texture_hud_char_mario_head, texture_hud_char_star, 0x0, 0x0, texture_hud_char_apostrophe, texture_hud_char_double_quote, texture_hud_char_umlaut, -#elif defined(VERSION_US) - texture_hud_char_0, texture_hud_char_1, texture_hud_char_2, texture_hud_char_3, - texture_hud_char_4, texture_hud_char_5, texture_hud_char_6, texture_hud_char_7, - texture_hud_char_8, texture_hud_char_9, texture_hud_char_A, texture_hud_char_B, - texture_hud_char_C, texture_hud_char_D, texture_hud_char_E, texture_hud_char_F, - texture_hud_char_G, texture_hud_char_H, texture_hud_char_I, 0x0, - texture_hud_char_K, texture_hud_char_L, texture_hud_char_M, texture_hud_char_N, - texture_hud_char_O, texture_hud_char_P, 0x0, texture_hud_char_R, - texture_hud_char_S, texture_hud_char_T, texture_hud_char_U, 0x0, - texture_hud_char_W, 0x0, texture_hud_char_Y, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, texture_hud_char_multiply, texture_hud_char_coin, - texture_hud_char_mario_head, texture_hud_char_star, 0x0, 0x0, - texture_hud_char_apostrophe, texture_hud_char_double_quote, #else texture_hud_char_0, texture_hud_char_1, texture_hud_char_2, texture_hud_char_3, texture_hud_char_4, texture_hud_char_5, texture_hud_char_6, texture_hud_char_7, @@ -974,8 +941,8 @@ const Texture *const main_hud_lut[] = { }; // Main small font print table 0x02008338-0x02008737 -const Texture *const main_font_lut[] = { #ifdef VERSION_EU // EU Font Table +const Texture *const main_font_lut_eu[] = { texture_font_char_eu_0, texture_font_char_eu_1, texture_font_char_eu_2, texture_font_char_eu_3, texture_font_char_eu_4, texture_font_char_eu_5, texture_font_char_eu_6, texture_font_char_eu_7, texture_font_char_eu_8, texture_font_char_eu_9, texture_font_char_eu_A, texture_font_char_eu_B, @@ -1042,7 +1009,11 @@ const Texture *const main_font_lut[] = { texture_font_char_eu_interpunct, texture_font_char_eu_star_hollow, 0x0, 0x0, -#elif defined(VERSION_US) // US Font Table +}; +#endif + +const Texture *const main_font_lut_us[] = { + // US Font Table texture_font_char_us_0, texture_font_char_us_1, texture_font_char_us_2, texture_font_char_us_3, texture_font_char_us_4, texture_font_char_us_5, texture_font_char_us_6, texture_font_char_us_7, texture_font_char_us_8, texture_font_char_us_9, texture_font_char_us_A, texture_font_char_us_B, @@ -1107,7 +1078,9 @@ const Texture *const main_font_lut[] = { texture_font_char_us_question, texture_font_char_us_double_quote_open, texture_font_char_us_double_quote_close, texture_font_char_us_tilde, 0x0, texture_font_char_us_coin, texture_font_char_us_star_filled, texture_font_char_us_multiply, texture_font_char_us_interpunct, texture_font_char_us_star_hollow, 0x0, 0x0, -#elif defined(VERSION_JP) || defined(VERSION_SH) +}; + +const Texture *const main_font_lut_jp[] = { texture_font_char_jp_0, texture_font_char_jp_1, texture_font_char_jp_2, texture_font_char_jp_3, texture_font_char_jp_4, texture_font_char_jp_5, texture_font_char_jp_6, texture_font_char_jp_7, texture_font_char_jp_8, texture_font_char_jp_9, texture_font_char_jp_A, texture_font_char_jp_B, @@ -1172,7 +1145,6 @@ const Texture *const main_font_lut[] = { texture_font_char_jp_question, texture_font_char_jp_double_quotation_open, texture_font_char_jp_double_quotation_close, texture_font_char_jp_wave_dash, texture_font_char_jp_ellipsis, texture_font_char_jp_coin, texture_font_char_jp_star_filled, texture_font_char_jp_multiply, texture_font_char_jp_interpunct, texture_font_char_jp_star_hollow, 0x0, 0x0, -#endif }; // credits font LUT 0x02008738-0x020087CB @@ -1195,15 +1167,6 @@ const Texture *const main_hud_camera_lut[] = { texture_hud_char_arrow_up, texture_hud_char_arrow_down, }; -// If you change the language here, the following Makefile rule also needs to -// change, to generate the right version of define_text.inc.c: -// $(BUILD_DIR)/bin/segment2.o: $(BUILD_DIR)/text/$(VERSION)/define_text.inc.c -#if defined(VERSION_JP) || defined(VERSION_SH) -#include "text/jp/define_text.inc.c" -#elif defined(VERSION_US) -#include "text/us/define_text.inc.c" -#endif - UNUSED static const u64 segment2_unused_0 = 0; // 0x0200EC60 - 0x0200EC98 @@ -1304,18 +1267,18 @@ const Gfx dl_draw_text_bg_box[] = { #ifndef VERSION_EU // 0x0200EE28 - 0x0200EE68 -static const Vtx vertex_ia8_char[] = { -#if defined(VERSION_JP) || defined(VERSION_SH) +static const Vtx vertex_ia8_char_jp[] = { {{{ 0, 0, 0}, 0, { 0, 1024}, {0xff, 0xff, 0xff, 0xff}}}, {{{ 8, 0, 0}, 0, { 512, 1024}, {0xff, 0xff, 0xff, 0xff}}}, {{{ 8, 16, 0}, 0, { 512, 0}, {0xff, 0xff, 0xff, 0xff}}}, {{{ 0, 16, 0}, 0, { 0, 0}, {0xff, 0xff, 0xff, 0xff}}}, -#else +}; + +static const Vtx vertex_ia8_char_us[] = { {{{ 0, 0, 0}, 0, { 0, 256}, {0xff, 0xff, 0xff, 0xff}}}, {{{ 8, 0, 0}, 0, { 0, 0}, {0xff, 0xff, 0xff, 0xff}}}, {{{ 8, 16, 0}, 0, { 480, 0}, {0xff, 0xff, 0xff, 0xff}}}, {{{ 0, 16, 0}, 0, { 480, 256}, {0xff, 0xff, 0xff, 0xff}}}, -#endif }; // !EU #endif @@ -1354,8 +1317,9 @@ const Gfx dl_ia_text_end[] = { }; #elif defined(VERSION_US) -const Gfx dl_ia_text_begin[] = { +const Gfx dl_ia_text_begin_us[] = { gsDPPipeSync(), + gsSPDisableFiltering(1), gsSPClearGeometryMode(G_LIGHTING), gsDPSetCombineMode(G_CC_FADEA, G_CC_FADEA), gsDPSetEnvColor(255, 255, 255, 255), @@ -1365,13 +1329,36 @@ const Gfx dl_ia_text_begin[] = { gsSPEndDisplayList(), }; -const Gfx dl_ia_text_tex_settings[] = { +const Gfx dl_ia_text_begin_jp[] = { + gsDPPipeSync(), + gsSPDisableFiltering(1), + gsSPClearGeometryMode(G_LIGHTING), + gsDPSetCombineMode(G_CC_FADEA, G_CC_FADEA), + gsDPSetEnvColor(255, 255, 255, 255), + gsDPSetRenderMode(G_RM_XLU_SURF, G_RM_XLU_SURF2), + gsDPSetTextureFilter(G_TF_POINT), + gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON), + gsSPEndDisplayList(), +}; + +const Gfx dl_ia_text_tex_settings_us[] = { gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, 3, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, 4, G_TX_NOLOD), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, ((16 * 8 + G_IM_SIZ_4b_INCR) >> G_IM_SIZ_4b_SHIFT) - 1, CALC_DXT(16, G_IM_SIZ_4b_BYTES)), gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_4b, 1, 0, G_TX_RENDERTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, 3, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, 4, G_TX_NOLOD), gsDPSetTileSize(0, 0, 0, (16 - 1) << G_TEXTURE_IMAGE_FRAC, (8 - 1) << G_TEXTURE_IMAGE_FRAC), - gsSPVertex(vertex_ia8_char, 4, 0), + gsSPVertex(vertex_ia8_char_us, 4, 0), + gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0), + gsSPEndDisplayList(), +}; + +const Gfx dl_ia_text_tex_settings_jp[] = { + gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_8b, 0, 0, G_TX_LOADTILE, 0, G_TX_CLAMP, 4, G_TX_NOLOD, G_TX_CLAMP, 3, G_TX_NOLOD), + gsDPLoadSync(), + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 8 * 16 - 1, CALC_DXT(8, G_IM_SIZ_8b_BYTES)), + gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_8b, 1, 0, G_TX_RENDERTILE, 0, G_TX_CLAMP, 4, G_TX_NOLOD, G_TX_CLAMP, 3, G_TX_NOLOD), + gsDPSetTileSize(0, 0, 0, (8 - 1) << G_TEXTURE_IMAGE_FRAC, (16 - 1) << G_TEXTURE_IMAGE_FRAC), + gsSPVertex(vertex_ia8_char_jp, 4, 0), gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0), gsSPEndDisplayList(), }; @@ -1396,7 +1383,7 @@ const Gfx dl_ia_text_tex_settings[] = { gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 8 * 16 - 1, CALC_DXT(8, G_IM_SIZ_8b_BYTES)), gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_8b, 1, 0, G_TX_RENDERTILE, 0, G_TX_CLAMP, 4, G_TX_NOLOD, G_TX_CLAMP, 3, G_TX_NOLOD), gsDPSetTileSize(0, 0, 0, (8 - 1) << G_TEXTURE_IMAGE_FRAC, (16 - 1) << G_TEXTURE_IMAGE_FRAC), - gsSPVertex(vertex_ia8_char, 4, 0), + gsSPVertex(vertex_ia8_char_us, 4, 0), gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0), gsSPEndDisplayList(), }; @@ -1412,6 +1399,7 @@ const Gfx dl_ia_text_end[] = { gsSPSetGeometryMode(G_LIGHTING | G_SHADING_SMOOTH), gsDPSetRenderMode(G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2), gsDPSetTextureFilter(G_TF_BILERP), + gsSPDisableFiltering(0), gsSPEndDisplayList(), }; #endif diff --git a/define_text.inc.c b/define_text.inc.c new file mode 100644 index 00000000..0dc835bc --- /dev/null +++ b/define_text.inc.c @@ -0,0 +1,666 @@ +static const u8 Debug0[] = { + 0x1C,0x1D,0x0A,0x10,0x0E,0x9E,0x1C,0x0E,0x15,0x0E,0x0C,0x1D,0xFE,0x9E,0x51,0xF0,0x51,0x48,0x68,0xF4,0xFE,0x9E,0x01,0x9E,0x8E,0x72,0x9D,0x82,0x9D,0xFE,0x9E,0x02,0x9E,0x8B,0xD5,0x71,0x70,0x9F,0xF0,0x89,0xF0,0x8B,0x98,0xFE,0x9E,0x03,0x9E,0x7C,0x88,0x9F,0x7C,0x96,0x71,0xF0,0x7F,0x9F,0xFE,0x9E,0x04,0x9E,0x72,0xD8,0x9F,0x7F,0x9F,0x96,0x9D,0xF0,0x83,0xFE,0x9E,0x9E,0x9E,0x77,0xD1,0xF1,0x89,0x01,0xF0,0x49,0x42,0xFE,0x9E,0x62,0xF0,0x53,0x68,0xFF +}; +static const u8 Debug1[] = { + 0x19,0x0A,0x1E,0x1C,0x0E,0x9E,0x9E,0x9E,0x9E,0xFE,0x9E,0x51,0xF0,0x51,0x48,0x68,0xF4,0xFE,0x9E,0x63,0x61,0x68,0x9E,0xF4,0xFF +}; +static const struct DialogEntry debug_text_entry_0 = { + 1, 8, 30, 200, Debug0 +}; +static const struct DialogEntry debug_text_entry_1 = { + 1, 3, 100, 150, Debug1 +}; +const struct DialogEntry *const seg2_debug_text_table[] = { + &debug_text_entry_0, &debug_text_entry_1, NULL, +}; +static const u8 dialog_text_DIALOG_000[] = { 0x44,0x44,0xA1,0x53,0x6F,0x49,0x49,0x59,0x76,0x78,0x9D,0x54,0xFE,0x4D,0x6D,0xF0,0x4B,0xA4,0x42,0x58,0x9E,0xF0,0x53,0x5E,0x6D,0x54,0x45,0x6E,0xFE,0xF5,0x43,0xF6,0x58,0x54,0x45,0x58,0x4D,0x45,0x41,0x55,0x59,0xFE,0x77,0xD1,0xF1,0x89,0xF0,0x45,0x9E,0x56,0x4C,0x6D,0xF0,0x4F,0xFE,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0xF0,0x45,0x40,0x68,0x6E,0xFE,0x5E,0xF0,0x4C,0x59,0x6F,0x40,0x45,0x41,0xF0,0x8D,0x90,0x5C,0x41,0x55,0xFE,0x59,0x54,0x4B,0x45,0x48,0x52,0x5F,0x68,0x53,0x41,0x41,0xF2,0xFE,0x0B,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0x59,0x54,0x4B,0xF0,0x45,0xF0,0x52,0x46,0x68,0x6E,0xFE,0x46,0xA1,0x53,0x6F,0x50,0x45,0x66,0x55,0x54,0xA1,0x52,0xFE,0x47,0x69,0x68,0x59,0xF0,0x4C,0xF0,0x4F,0x6E,0xFE,0x75,0x9D,0xF0,0x89,0x9D,0x6C,0x9E,0x65,0x60,0x53,0x46,0x62,0xFE,0x4F,0x50,0xF0,0x53,0x5E,0xA1,0x52,0x9E,0x0B,0xF0,0x8D,0x7F,0x9D,0xF2,0xFE,0x0A,0x45,0x0B,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0x4C,0x4C,0x61,0x68,0xF2,0xFE,0x5E,0x43,0x55,0x4F,0x51,0xF0,0x4F,0x48,0xF0,0x52,0x9E,0x59,0x54,0x4B,0xFE,0x45,0x48,0x68,0x6F,0xF0,0x53,0x42,0xF0,0x5B,0x51,0x62,0x41,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_001[] = { 0x40,0xF0,0x5B,0x54,0x41,0x9E,0x40,0xF0,0x5B,0x54,0x41,0xF2,0xF2,0xFE,0x49,0x6D,0x54,0x53,0x49,0x6A,0x6C,0x9E,0x42,0x6A,0x42,0x6A,0xFE,0x4B,0x52,0x68,0x53,0x6F,0x5F,0xF0,0x4C,0xF0,0x59,0x47,0xF0,0x4F,0x6D,0xF0,0x45,0xFE,0x5B,0xA1,0x52,0x46,0x5E,0x4C,0x65,0x6E,0xFE,0x47,0x6A,0x41,0xF0,0x8D,0x90,0x5C,0x41,0x4F,0x50,0x59,0xFE,0x4F,0x4F,0x45,0x41,0xF0,0x45,0x9E,0xF0,0x4F,0x41,0x4C,0x46,0xF0,0x52,0x6F,0xFE,0x41,0x51,0x62,0x9E,0xF0,0x5D,0x47,0x66,0x6C,0xFE,0x49,0x42,0xF0,0x48,0x46,0x4B,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0xF0,0x8D,0x90,0x76,0x9D,0xF0,0x77,0x53,0x41,0x42,0x9E,0xF0,0x8D,0x7C,0xF0,0x45,0xFE,0x7C,0x7F,0x9F,0x6C,0x9E,0x52,0x55,0x41,0x69,0x52,0x45,0x66,0xFE,0x49,0x49,0x59,0x9E,0x4D,0x6D,0xF0,0x4B,0xA4,0x42,0x55,0xFE,0x54,0xA1,0x52,0x4B,0x5E,0x41,0x5E,0x4B,0x4F,0x6E,0xFE,0xF0,0x8D,0x90,0x76,0x9D,0xF0,0x77,0x45,0x66,0x9E,0x7C,0x7F,0x9F,0x6C,0xFE,0x53,0x67,0x40,0xF0,0x48,0x52,0x47,0x69,0x5E,0x4D,0x6D,0x45,0xF4,0xFE,0x49,0x58,0x4A,0x46,0x58,0x9E,0x59,0x4B,0x6C,0x6B,0x4F,0x67,0xFE,0x5F,0x50,0xF0,0x4E,0x41,0x55,0x5A,0xF0,0x4F,0x67,0x55,0x41,0x48,0xF0,0x59,0x6F,0xFE,0xF0,0x8D,0x90,0x53,0x67,0xF0,0x52,0x58,0x9E,0x41,0x67,0xF0,0x47,0x50,0x55,0xFE,0x51,0x46,0x5E,0x4C,0x6E,0x76,0x9D,0xF0,0x77,0x58,0x7C,0x7F,0x9F,0xFE,0x6C,0x9E,0x53,0x67,0x62,0xF0,0x53,0x4B,0x4F,0x66,0x9E,0x5E,0x4F,0xFE,0x40,0x41,0x55,0x9E,0x46,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_002[] = { 0x50,0xA4,0xA1,0x53,0x9E,0x40,0x54,0x4F,0xF2,0xFE,0x49,0x58,0x4A,0x46,0x59,0x76,0x78,0x9D,0xF0,0x52,0x4C,0x65,0xF2,0xFE,0xFE,0x4E,0x49,0xF0,0x52,0x6F,0x70,0xF0,0x83,0xF0,0x89,0x71,0x7C,0xF0,0x52,0x4C,0x6E,0xFE,0x4E,0x66,0x45,0x66,0x9E,0x5B,0xA1,0x52,0x47,0x68,0xFE,0x5F,0xF0,0x4C,0xF0,0x59,0x47,0xF0,0x4F,0x6D,0x6C,0x65,0x48,0x52,0x6F,0xFE,0x59,0x4B,0x6C,0xF5,0x02,0x51,0xF6,0x6B,0x4F,0x68,0x53,0xFE,0x40,0x50,0x66,0x58,0xF5,0xF0,0x4B,0x6D,0x50,0xF6,0xF0,0x52,0x4C,0x6E,0xFE,0x63,0x5E,0x58,0x42,0x43,0x58,0xF0,0x8D,0x90,0x76,0x9D,0xF0,0x77,0x59,0xFE,0x4C,0xF0,0x49,0x47,0x9E,0x50,0x45,0x66,0x62,0x50,0xF0,0x52,0x4C,0x6E,0xFE,0x45,0x51,0xF0,0x46,0x40,0xF0,0x48,0x66,0x69,0x54,0x41,0x65,0x42,0x55,0xFE,0x46,0x6C,0x51,0x48,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0xF0,0x5D,0x47,0x66,0x9E,0x40,0x45,0xF0,0x8D,0x90,0x5C,0x41,0x59,0xFE,0x40,0x54,0x4F,0x58,0x5F,0x45,0x4F,0xF0,0x52,0x4C,0x6E,0xFE,0x41,0x51,0xF0,0x52,0x62,0x9E,0x59,0x54,0x4B,0x45,0x48,0x52,0xFE,0x46,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x57,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_003[] = { 0x44,0x45,0xF0,0x48,0xF0,0x52,0x9E,0xF0,0x8D,0x90,0x76,0x9D,0xF0,0x77,0x59,0xFE,0x44,0x53,0x54,0x4B,0x47,0x54,0x67,0x5E,0x4B,0x4F,0xF2,0xFE,0xF0,0x52,0x62,0x6F,0x4F,0x4F,0x45,0x41,0x59,0x9E,0x44,0x6B,0x67,0xFE,0x5E,0x4D,0x6D,0x6E,0x9E,0x45,0x41,0xF0,0x5B,0x51,0x4F,0x50,0xF0,0x45,0xFE,0x5E,0xF0,0x4F,0x7C,0x7F,0x9F,0x6C,0x62,0xA1,0x52,0x41,0x5E,0x4C,0x6E,0xFE,0x7C,0x7F,0x9F,0x6C,0x41,0x47,0x51,0x45,0x53,0xA1,0x4F,0x66,0xFE,0x40,0x4F,0x66,0x4B,0x41,0x9E,0x5C,0x63,0x58,0xF0,0x83,0x70,0x6C,0xFE,0x5A,0x66,0x47,0x49,0x53,0xF0,0x45,0x9E,0xF0,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0x51,0xF0,0x46,0x58,0x5C,0x63,0x58,0x9E,0x4D,0x45,0x41,0x5C,0x53,0xFE,0x4C,0x4C,0x6D,0xF0,0x52,0x47,0xF0,0x4F,0x4A,0x41,0xF2,0xFE,0xF0,0x5D,0x47,0x66,0x58,0x54,0x45,0x5E,0xF0,0x45,0xFE,0x44,0x5E,0x50,0x4B,0x52,0x41,0x5E,0x4C,0x6E,0xFE,0x59,0x54,0x4B,0x45,0x48,0x52,0x9E,0x47,0xF0,0x4F,0x4A,0x41,0x57,0x6E,0xFE,0x41,0x51,0xF0,0x52,0x62,0x9E,0x4F,0x41,0x5D,0x42,0x6C,0xFE,0xF0,0x4B,0xA3,0x6D,0xF0,0x5A,0x4B,0x5E,0x4C,0x65,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_004[] = { 0xF0,0x5D,0x47,0x4F,0x50,0x59,0x9E,0x5C,0x41,0x6B,0x6C,0xFE,0x57,0xF0,0x45,0xA1,0x52,0x41,0x5E,0x4C,0x6E,0x9E,0xF0,0x4F,0x45,0x66,0xFE,0x4F,0x41,0x5D,0x42,0x59,0x9E,0x51,0x45,0x41,0x5E,0x4D,0x6D,0x6E,0xFE,0x48,0x69,0xF0,0x53,0x9E,0x40,0x54,0x4F,0x6C,0xF0,0x53,0x49,0x45,0x55,0xFE,0x53,0xF0,0x59,0x4C,0x54,0x66,0x9E,0x5C,0x41,0x46,0xF0,0x52,0x4C,0x6E,0xFE,0xF0,0x53,0x42,0xF0,0x4E,0x9E,0x51,0x45,0xA1,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x49,0x58,0x79,0x9F,0x7C,0x55,0x40,0x68,0x4C,0xF0,0x5C,0x52,0x58,0xFE,0x40,0x45,0xF0,0x8D,0x90,0xF0,0x47,0x6D,0x9E,0x4F,0x41,0x5D,0x42,0x6C,0xFE,0x51,0x45,0x43,0x68,0x65,0x42,0x55,0x9E,0x4B,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_005[] = { 0x54,0x9F,0x6D,0xF0,0x4F,0x6F,0x8E,0x97,0x74,0x4A,0x6D,0xF0,0x4B,0xA2,0xFE,0x54,0x41,0xD1,0x7C,0x45,0xF2,0xFE,0xF0,0x8D,0x90,0x76,0x9D,0xF0,0x77,0x63,0xA1,0x51,0x48,0x4F,0xA1,0x52,0xFE,0x5D,0x6D,0x53,0x9F,0xD1,0x7C,0x45,0xF4,0xFE,0x41,0x63,0x9F,0x9E,0x4C,0xF0,0x49,0x41,0xD1,0x7C,0xF2,0xFE,0x4A,0xA1,0x4C,0xF0,0x45,0x9E,0x51,0x65,0x41,0x4B,0x6F,0xFE,0x74,0x71,0x96,0x5D,0xF0,0x53,0xF0,0x52,0x59,0x54,0x41,0x48,0xF0,0x53,0x6F,0xFE,0x40,0x4B,0x62,0x9E,0x59,0x63,0x41,0xD1,0x7C,0x65,0x57,0xF2,0xFE,0x5A,0x53,0x51,0x74,0x71,0x96,0x53,0x6F,0xFE,0xF0,0x8D,0x90,0x76,0x9D,0xF0,0x77,0x58,0x93,0x81,0xF0,0x45,0x41,0x4F,0xFE,0x44,0x63,0x5E,0x58,0x50,0xA4,0x42,0xF0,0x4B,0xA4,0x42,0x5E,0xF0,0x52,0xFE,0x45,0x48,0xA1,0x49,0xF0,0x52,0x62,0x4B,0x5E,0x4D,0x6D,0x45,0xF4,0xFE,0x4E,0x69,0xF0,0x52,0x59,0x9E,0x74,0x71,0x96,0xF0,0x45,0x6F,0xFE,0xF5,0xF0,0x83,0x9D,0xF2,0xF6,0x53,0x41,0xA1,0x4F,0x66,0xFE,0x7C,0x7F,0x9F,0x83,0x9E,0xD1,0x7C,0x65,0x6E,0xFE,0xFE,0x9E,0x95,0x9F,0x9F,0x9F,0x71,0xF2,0xFE,0xFE,0x9E,0x9E,0x9E,0xF0,0x83,0x9D,0xF2,0x9E,0x9E,0x63,0x61,0x68,0xFF }; +static const u8 dialog_text_DIALOG_006[] = { 0x59,0x59,0xA1,0x9E,0xF0,0x7C,0x98,0xD1,0x79,0x59,0xFE,0x54,0x4B,0xD1,0x7C,0xF2,0x9E,0x8E,0x97,0x74,0x4A,0x6D,0x6E,0xFE,0x5E,0x4F,0x49,0x6D,0xF0,0x53,0xFE,0x40,0x4E,0xF0,0x5A,0x5E,0x4B,0xA4,0x42,0x57,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_007[] = { 0x89,0x70,0x9E,0x89,0x70,0x9E,0x89,0x70,0xFE,0x41,0x63,0x9F,0x5E,0x41,0xA1,0x4F,0xD1,0x7C,0xF2,0xFE,0x5D,0x6D,0x53,0x9E,0x59,0x43,0x9F,0xD1,0x7C,0x57,0xF2,0xFE,0x74,0x71,0x96,0x55,0x9E,0x45,0xA1,0x4F,0x46,0x57,0x6D,0x55,0x6F,0xFE,0x49,0x69,0x6F,0x40,0xF0,0x48,0x68,0xD1,0x7C,0x6E,0xFE,0x8D,0x71,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_008[] = { 0x62,0x42,0x48,0x6D,0x9B,0x9D,0x9B,0x9D,0x9E,0x76,0x78,0x9D,0xFE,0x0C,0xF0,0x8D,0x7F,0x9D,0x58,0x9E,0x42,0x43,0x6C,0x44,0x4B,0x52,0xFE,0xF5,0x8E,0x97,0x74,0x58,0x50,0x45,0x47,0xF6,0x45,0x66,0xFE,0x54,0xF0,0x45,0x61,0x52,0x9E,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x53,0x52,0x62,0x9E,0x79,0x9B,0x71,0xF0,0x52,0x4C,0x6E,0xFE,0x77,0x71,0x58,0x42,0x43,0x58,0x9E,0x40,0x45,0x79,0x71,0x9D,0x6E,0xFE,0x44,0x54,0xF0,0x4B,0x79,0x71,0x9D,0x6C,0x9E,0x4A,0xF0,0x45,0x4B,0x52,0xFE,0x08,0x5E,0x41,0x40,0x51,0x61,0x68,0x53,0x6F,0x59,0x4B,0x6C,0xFE,0x6B,0x4F,0xA1,0x4F,0x5A,0xF0,0x4F,0x67,0x58,0x59,0x63,0x4B,0x55,0xFE,0x7C,0x7F,0x9F,0xF0,0x45,0xF0,0x52,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_009[] = { 0x5A,0xA1,0x4A,0x4B,0xF0,0x5B,0x67,0xD1,0x7C,0xF2,0x9E,0x41,0x5E,0xFE,0x50,0xA4,0x9F,0xF0,0x53,0x45,0x43,0xA1,0x4F,0x53,0x49,0xD1,0x7C,0x6E,0xFE,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x58,0x4D,0x41,0x45,0xFE,0x41,0x50,0xF0,0x4F,0x6D,0x53,0x9E,0x59,0x63,0x47,0x54,0xA1,0x4F,0xFE,0x65,0x42,0xD1,0x7C,0x57,0xF2,0xFE,0x49,0x58,0x5E,0x43,0x59,0x9E,0x5E,0x48,0x50,0xA2,0xA1,0x52,0xFE,0x5D,0x9F,0x6D,0x53,0x9E,0x47,0x63,0x4B,0x41,0xD1,0x7C,0x6E,0xFE,0x49,0x49,0x59,0x9E,0x74,0x71,0x96,0x58,0x8D,0x9F,0x90,0xFE,0xF0,0x77,0x96,0x9D,0xF0,0x83,0xF2,0xF0,0x4B,0x4B,0x6D,0x40,0x68,0xD1,0x7C,0x6E,0xFE,0x62,0x41,0x50,0xF0,0x53,0x63,0x67,0x5E,0x4B,0xA4,0x42,0x65,0xF2,0xFE,0xF0,0x79,0x9F,0x98,0x59,0x75,0xF0,0x7D,0x5B,0x46,0x58,0x4F,0x55,0xF2,0xFE,0x4B,0xA1,0x52,0x68,0xD1,0x7C,0x65,0x57,0xF2,0xF4,0xFE,0x4E,0x6D,0xF0,0x4B,0xA2,0xFE,0x9E,0x95,0x9F,0x9F,0x9F,0x71,0xF2,0xFE,0x9E,0x9E,0x9E,0xF0,0x83,0x9D,0xF2,0x9E,0x9E,0x63,0x61,0x68,0xFF }; +static const u8 dialog_text_DIALOG_010[] = { 0x4E,0x66,0x6C,0x9E,0xF0,0x4B,0x64,0x42,0x55,0x53,0xF0,0x5C,0x68,0xFE,0xF5,0x59,0x57,0x58,0xF0,0x5D,0x42,0x4B,0xF6,0x58,0xFE,0x7C,0x71,0xD1,0x80,0x6C,0x9E,0x5B,0x5F,0x5E,0x4B,0x4F,0x6E,0xFE,0x4D,0x45,0x41,0xF0,0x4B,0xA3,0x42,0x55,0x40,0x68,0xFE,0x40,0x45,0xF0,0x8B,0x9A,0xD1,0x77,0x45,0x66,0x6F,0x59,0x57,0x58,0xFE,0xF0,0x5D,0x42,0x4B,0xF0,0x45,0x53,0xF0,0x5A,0xF0,0x4F,0x4B,0x5E,0x4C,0x6E,0xFE,0x49,0x49,0x5E,0xF0,0x52,0x6C,0x7D,0x9F,0xF0,0x8B,0x4C,0x68,0xF4,0xFE,0xFE,0x9E,0x9E,0x9E,0x59,0x41,0x9E,0x9E,0x9E,0x41,0x41,0x43,0xFF }; +static const u8 dialog_text_DIALOG_011[] = { 0x60,0x52,0x46,0x58,0x9E,0x45,0x66,0xF0,0x4F,0x55,0x54,0x69,0x68,0xFE,0xF5,0x91,0x7F,0x98,0x58,0xF0,0x5D,0x42,0x4B,0xF6,0x58,0xFE,0x7C,0x71,0xD1,0x80,0x6C,0x9E,0x5B,0x5F,0x5E,0x4B,0x4F,0x6E,0xFE,0x4D,0x45,0x41,0xF0,0x4B,0xA3,0x42,0x58,0x9E,0x5F,0xF0,0x53,0x67,0x58,0xFE,0xF0,0x8B,0x9A,0xD1,0x77,0x45,0x66,0x6F,0x91,0x7F,0x98,0x58,0xFE,0xF0,0x5D,0x42,0x4B,0xF0,0x45,0x9E,0x53,0xF0,0x5A,0xF0,0x4F,0x4B,0x5E,0x4C,0x6E,0xFE,0x49,0x49,0x5E,0xF0,0x52,0x6C,0x7D,0x9F,0xF0,0x8B,0x4C,0x68,0xF4,0xFE,0xFE,0x9E,0x9E,0x9E,0x59,0x41,0x9E,0x9E,0x9E,0x41,0x41,0x43,0xFF }; +static const u8 dialog_text_DIALOG_012[] = { 0x4C,0xF0,0x45,0x4F,0x6C,0x48,0x4D,0x68,0x9E,0x5E,0x5D,0x42,0x58,0xFE,0xF5,0x53,0x42,0x61,0x41,0x58,0xF0,0x5D,0x42,0x4B,0xF6,0x58,0xFE,0x7C,0x71,0xD1,0x80,0x6C,0x9E,0x5B,0x5F,0x5E,0x4B,0x4F,0x6E,0xFE,0x4D,0x45,0x41,0xF0,0x4B,0xA3,0x42,0x58,0x9E,0x40,0x44,0x41,0xFE,0xF0,0x8B,0x9A,0xD1,0x77,0x45,0x66,0x6F,0x53,0x42,0x61,0x41,0xFE,0xF0,0x5D,0x42,0x4B,0xF0,0x45,0x9E,0x53,0xF0,0x5A,0xF0,0x4F,0x4B,0x5E,0x4C,0x6E,0xFE,0x49,0x49,0x5E,0xF0,0x52,0x6C,0x7D,0x9F,0xF0,0x8B,0x4C,0x68,0xF4,0xFE,0xFE,0x9E,0x9E,0x9E,0x59,0x41,0x9E,0x9E,0x9E,0x41,0x41,0x43,0xFF }; +static const u8 dialog_text_DIALOG_013[] = { 0x01,0x00,0x00,0x5E,0x41,0x79,0x71,0x9D,0x58,0xFE,0x7C,0x7F,0x9F,0x6C,0x9E,0x52,0x55,0x41,0x69,0x4F,0xF2,0xFE,0x44,0x4B,0x6A,0x58,0xF1,0x89,0x9B,0x9F,0xF0,0x45,0xFE,0x5E,0x4F,0x5A,0x53,0x51,0x8E,0x97,0x74,0x55,0xFE,0x9E,0x9E,0x50,0x45,0x66,0x6C,0x9E,0x40,0x4F,0x43,0x4F,0x6E,0xFE,0xFE,0x49,0x49,0x5E,0xF0,0x52,0x7D,0x9F,0xF0,0x8B,0x4B,0x5E,0x4C,0x45,0xF4,0xFE,0xFE,0x9E,0x9E,0x9E,0x59,0x41,0x9E,0x9E,0x9E,0x41,0x41,0x43,0xFF }; +static const u8 dialog_text_DIALOG_014[] = { 0x44,0x62,0x6B,0x56,0x53,0x49,0x6A,0xF0,0x52,0xFE,0x7C,0x7F,0x9F,0x6C,0x52,0x55,0x41,0x69,0x4F,0x6E,0xFE,0x4E,0x4B,0x52,0x9E,0x44,0x4B,0x6A,0x58,0xF1,0x89,0x9B,0x9F,0xF0,0x45,0xFE,0x5E,0x4F,0x5A,0x53,0x51,0x9E,0x8E,0x97,0x74,0x55,0xFE,0x9E,0x9E,0x64,0x42,0x46,0x6C,0x9E,0x40,0x4F,0x43,0x4F,0x6E,0xFE,0xFE,0x49,0x49,0x5E,0xF0,0x52,0x7D,0x9F,0xF0,0x8B,0x4B,0x5E,0x4C,0x45,0xF4,0xFE,0xFE,0x9E,0x9E,0x9E,0x59,0x41,0x9E,0x9E,0x9E,0x41,0x41,0x43,0xFF }; +static const u8 dialog_text_DIALOG_015[] = { 0x52,0x46,0x59,0xF1,0x89,0x9D,0x80,0xF0,0x52,0x4F,0x44,0x4D,0x68,0x65,0x6E,0xFE,0x0A,0xF0,0x8D,0x7F,0x9D,0x59,0xF5,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF6,0xFE,0x0B,0xF0,0x8D,0x7F,0x9D,0x59,0xF5,0xF1,0x89,0x9D,0x80,0xF6,0xF0,0x52,0x4C,0x6E,0xFE,0x0A,0x53,0x0B,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0xF5,0x76,0xD1,0x77,0xF6,0x6E,0xFE,0xF5,0x62,0x58,0x6C,0x62,0x51,0xF6,0x53,0x46,0x62,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x0B,0xF0,0x8D,0x7F,0x9D,0xF2,0xFE,0xF5,0x54,0xF0,0x48,0x68,0xF6,0x59,0x9E,0x62,0x42,0x41,0x50,0xF0,0x53,0xFE,0x0B,0xF0,0x8D,0x7F,0x9D,0x6C,0x44,0x4B,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_016[] = { 0x76,0x96,0x76,0x96,0x5A,0x45,0xA1,0x4F,0x79,0x72,0x96,0x55,0xFE,0x58,0x68,0x53,0x6F,0xF0,0x53,0x6D,0x54,0x53,0x49,0x6A,0x62,0xFE,0x7C,0x71,0x7C,0x71,0x4C,0x4C,0x61,0x68,0xF2,0xFE,0x52,0x46,0x6C,0x48,0x50,0x66,0x4B,0x9E,0x4C,0x4C,0x61,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_017[] = { 0x9B,0x7B,0xF0,0x45,0xF0,0x8D,0x90,0x76,0x9D,0xF0,0x77,0x6F,0x51,0x5E,0x67,0xFE,0xF0,0x59,0x47,0xF0,0x4F,0x6D,0x58,0x9E,0x44,0x42,0x4A,0x5E,0xF0,0x4F,0x6E,0xFE,0x65,0x47,0x49,0x49,0x5E,0xF0,0x52,0x46,0x4F,0x6E,0x4E,0x58,0xFE,0x64,0x42,0x46,0x59,0x9E,0x5D,0x61,0x52,0x63,0x6A,0x42,0x6E,0xFE,0x53,0x59,0x41,0x43,0x6F,0x44,0x5E,0x43,0x55,0x7F,0xF0,0x7F,0xF0,0x52,0xFE,0xF0,0x4F,0x41,0xF0,0x4B,0x54,0x9E,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xFE,0x63,0x68,0x6B,0x48,0x55,0x59,0x9E,0x41,0x45,0x6D,0x6E,0xFE,0x4E,0x49,0xF0,0x52,0x9E,0x80,0xD2,0x9D,0x7C,0x6C,0x63,0x6A,0x42,0x6E,0xFE,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0xF0,0x45,0x5D,0x4B,0x48,0x69,0xF0,0x59,0xFE,0x9B,0x7B,0x6C,0x9E,0x54,0xF0,0x48,0x53,0xF0,0x59,0x4B,0x52,0x5F,0x6A,0x6E,0xFE,0x42,0x4B,0x6A,0x45,0x66,0x9E,0x45,0x51,0xF0,0x48,0x68,0x45,0xF4,0xFE,0x4A,0x40,0x6F,0x45,0x45,0xA1,0x52,0x49,0x41,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_018[] = { 0x57,0x60,0x41,0x58,0xF0,0x52,0x6F,0x57,0x52,0x41,0x5E,0x4C,0x6E,0xFE,0x44,0x49,0x4C,0x53,0x9E,0x44,0x49,0x67,0x5E,0x4C,0x6E,0xFE,0xFE,0x4B,0xF0,0x4C,0x45,0x55,0x9E,0x40,0x68,0x46,0x5E,0x4B,0xA4,0x42,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_019[] = { 0x6A,0x42,0x45,0x59,0x9E,0x4B,0xF0,0x4C,0x45,0x55,0xFE,0x40,0x68,0x46,0x5E,0x4B,0xA4,0x42,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_020[] = { 0x44,0x4B,0x6A,0x5C,0x9E,0x40,0x4E,0xF0,0x5A,0x55,0xFE,0x46,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x78,0x9F,0x76,0x6C,0x9E,0x51,0x47,0xA1,0x52,0xFE,0x5E,0xA1,0x52,0x5E,0x4C,0x6E,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x9F,0xF1,0x8A,0x9F,0x80,0x65,0x67,0x9F,0xFF }; +static const u8 dialog_text_DIALOG_021[] = { 0x65,0x42,0x49,0x4E,0x41,0x66,0xA1,0x4B,0xA2,0x41,0x5E,0x4D,0xFE,0xFC,0xFC,0xF0,0x4F,0x69,0x62,0x9E,0x41,0x5E,0x4D,0x6D,0x58,0xF0,0x52,0xFE,0x53,0xA1,0x53,0x53,0xFE,0x9E,0x9E,0x44,0x45,0x43,0x67,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0xF0,0x75,0x89,0x89,0x89,0xD1,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_022[] = { 0x75,0xF0,0x76,0xF0,0x45,0x9E,0x45,0x45,0xA1,0x52,0x41,0x68,0xFC,0xFC,0xFF }; +static const u8 dialog_text_DIALOG_023[] = { 0xFC,0xFC,0xFC,0x75,0xF0,0x76,0xF0,0x45,0x40,0x6B,0x54,0x41,0xF2,0xFE,0x49,0x58,0x75,0xF0,0x76,0x59,0xF5,0x50,0x45,0xF6,0x5C,0x58,0xFE,0x75,0xF0,0x76,0x58,0x65,0x42,0xF0,0x4F,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_024[] = { 0x77,0xD1,0xF1,0x89,0xF0,0x45,0x53,0xF0,0x4B,0x4F,0x49,0x58,0xF0,0x83,0x70,0x6C,0xFE,0x5A,0x66,0x47,0x55,0x59,0x6F,0x7C,0x7F,0x9F,0x58,0xFE,0xF1,0x89,0x9B,0x9F,0xF0,0x45,0x9E,0x5A,0x51,0x65,0x42,0xF0,0x52,0x4C,0x6E,0xFE,0xF0,0x53,0x49,0x45,0x58,0x5C,0x63,0x58,0xF5,0x43,0xF6,0x58,0xFE,0x54,0x45,0x58,0x9E,0x92,0x9D,0x7C,0x7F,0x9F,0x45,0x66,0xFE,0x53,0x67,0x62,0xF0,0x53,0x4B,0x52,0x46,0x52,0x47,0xF0,0x4F,0x4A,0x41,0xFF }; +static const u8 dialog_text_DIALOG_025[] = { 0x49,0x58,0xF0,0x83,0x70,0x6C,0x9E,0x5A,0x66,0x47,0x55,0x59,0xFE,0x7C,0x7F,0x9F,0x03,0x5E,0x41,0x58,0x9E,0xF1,0x89,0x9B,0x9F,0xF0,0x45,0xFE,0x5A,0x51,0x65,0x42,0xF0,0x52,0x4C,0x6E,0xFE,0x40,0x53,0xE0,0x5E,0x41,0x58,0x9E,0x7C,0x7F,0x9F,0xF0,0x45,0xFE,0x5A,0x51,0x65,0x42,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_026[] = { 0x49,0x58,0xF0,0x83,0x70,0x6C,0x9E,0x5A,0x66,0x47,0x55,0x59,0xFE,0x7C,0x7F,0x9F,0x08,0x5E,0x41,0x58,0x9E,0xF1,0x89,0x9B,0x9F,0xF0,0x45,0xFE,0x5A,0x51,0x65,0x42,0xF0,0x52,0x4C,0x6E,0xFE,0x40,0x53,0xE0,0x5E,0x41,0x58,0x9E,0x7C,0x7F,0x9F,0xF0,0x45,0xFE,0x5A,0x51,0x65,0x42,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_027[] = { 0x49,0x58,0xF0,0x83,0x70,0x6C,0x9E,0x5A,0x66,0x47,0x55,0x59,0xFE,0x7C,0x7F,0x9F,0x03,0x00,0x5E,0x41,0x58,0xF1,0x89,0x9B,0x9F,0xF0,0x45,0xFE,0x5A,0x51,0x65,0x42,0xF0,0x52,0x4C,0x6E,0xFE,0x7C,0x7F,0x9F,0xF0,0x45,0x40,0x53,0xFE,0xE0,0x5E,0x41,0x5A,0x51,0x65,0x42,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_028[] = { 0x49,0x58,0xF0,0x83,0x70,0x6C,0x9E,0x5A,0x66,0x47,0x55,0x59,0xFE,0x7C,0x7F,0x9F,0x05,0x00,0x5E,0x41,0x58,0xF1,0x89,0x9B,0x9F,0xF0,0x45,0xFE,0x5A,0x51,0x65,0x42,0xF0,0x52,0x4C,0x6E,0xFE,0x40,0x53,0xE0,0x5E,0x41,0x58,0x9E,0x7C,0x7F,0x9F,0xF0,0x45,0xFE,0x5A,0x51,0x65,0x42,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_029[] = { 0x59,0x52,0x4B,0x54,0x41,0x9E,0x45,0x41,0xF0,0x4F,0x6D,0x58,0xFE,0xF0,0x83,0x70,0x6C,0x9E,0x5A,0x66,0x47,0x55,0x59,0xFE,0x7C,0x7F,0x9F,0x07,0x00,0x5E,0x41,0x58,0xF1,0x89,0x9B,0x9F,0xF0,0x45,0xFE,0x5A,0x51,0x65,0x42,0xF0,0x52,0x4C,0xFC,0xFC,0xFC,0xFC,0xFC,0xFE,0x40,0x53,0xE0,0x5E,0x41,0x58,0x9E,0x7C,0x7F,0x9F,0xF0,0x45,0xFE,0x4F,0x67,0x5E,0x4D,0x6D,0xFC,0xFC,0xFC,0xFE,0xF0,0x75,0x89,0x89,0xD1,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_030[] = { 0x75,0x91,0x96,0x8E,0x9D,0x58,0xF0,0x7B,0xD3,0xF0,0x78,0x90,0xF0,0x52,0x4C,0x6E,0xFE,0x50,0xA4,0xA1,0x53,0x9E,0x70,0xF0,0x83,0xF0,0x89,0x71,0x7C,0xF2,0xFE,0x4B,0xF0,0x4C,0x45,0x55,0x40,0x68,0x46,0x4F,0x41,0x53,0x46,0x59,0xFE,0x64,0xA1,0x47,0x67,0x9E,0x40,0x68,0x47,0x49,0x53,0xF0,0x52,0x4C,0x6E,0xFE,0x5E,0x6B,0x67,0x6C,0x9E,0x5F,0x4F,0x41,0x53,0x46,0x59,0xFE,0x0C,0xF0,0x8D,0x7F,0x9D,0x58,0x5F,0xF0,0x46,0x53,0x5A,0xF0,0x4F,0x67,0xF0,0x52,0xFE,0x75,0x91,0x96,0x6C,0x4C,0x49,0x4B,0x5E,0x6B,0x4D,0x5E,0x4C,0x6E,0xFE,0x0C,0x58,0x4B,0x4F,0xF0,0x52,0x9E,0x53,0x44,0x47,0x45,0x66,0x6E,0xFE,0xF0,0x52,0x46,0x54,0x41,0x53,0x49,0x6A,0xF0,0x52,0x59,0xFE,0xF5,0xF0,0x8B,0x9F,0xD1,0xF2,0xF6,0x53,0x41,0x41,0x5E,0x4C,0x6E,0xFE,0x65,0x6A,0x4B,0x47,0xF2,0xF2,0x9E,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9F,0xF0,0x7B,0xD3,0xF0,0x78,0x90,0xFF }; +static const u8 dialog_text_DIALOG_031[] = { 0x5E,0x4F,0x5E,0x4F,0x9E,0x5E,0x48,0x50,0xA2,0xA1,0x4F,0x65,0x6E,0xFE,0x49,0x6D,0xF0,0x53,0x59,0x7C,0xD1,0xF0,0x79,0x41,0x9E,0xF0,0x4B,0x4B,0x6D,0xFE,0x40,0xA1,0x4F,0x6D,0xD1,0x7C,0x48,0xF0,0x53,0x57,0xFC,0xFC,0xFC,0xFE,0x5D,0x6D,0x53,0x9E,0x4C,0xF0,0x49,0x41,0xD1,0x7C,0x57,0xF2,0xFE,0x49,0x58,0x7C,0x7F,0x9F,0x62,0xFE,0x40,0xF0,0x48,0x50,0xA2,0x41,0x5E,0x4C,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_032[] = { 0x59,0x57,0xF0,0x5D,0x42,0x4B,0x58,0x9E,0x40,0x68,0x5A,0x53,0x59,0xFE,0x03,0x45,0x41,0x69,0x6D,0xF0,0x4E,0x47,0xF0,0x52,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xFE,0x4B,0x65,0x42,0x6E,0x9E,0x44,0x44,0xF0,0x4E,0x66,0x4F,0x45,0x47,0xFE,0x53,0xF0,0x5A,0x40,0xF0,0x45,0x69,0x5E,0x4C,0x6E,0xFE,0x4F,0x41,0x5D,0x42,0xF0,0x52,0x53,0xF0,0x5B,0x53,0xFE,0x4A,0x66,0x55,0x9E,0x4F,0x45,0x47,0x53,0xF0,0x5C,0x5E,0x4C,0x6E,0xFE,0x5E,0x6B,0x67,0x6C,0x5F,0x68,0x58,0x59,0x0C,0xF0,0x8D,0x7F,0x9D,0x6E,0xFE,0x44,0x67,0x4F,0x41,0x53,0x46,0x59,0x23,0xF0,0x8D,0x7F,0x9D,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_033[] = { 0x9B,0x9F,0xF1,0x8B,0xF0,0x53,0x45,0x6D,0x6C,0xFE,0x47,0xF0,0x47,0x67,0x56,0x48,0x6F,0xFE,0xF1,0x8A,0x9F,0x80,0x58,0x9E,0x44,0x4B,0x6A,0x55,0xFE,0x51,0x46,0x5E,0x4B,0x4F,0x6E,0xFE,0x4E,0x42,0x4A,0x59,0x9E,0x75,0x9D,0x7F,0x9D,0x6E,0xFE,0x0A,0xF0,0x8D,0x7F,0x9D,0xF0,0x45,0x9E,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF2,0xFE,0x0B,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0x9E,0x49,0x42,0xF0,0x48,0x46,0xF2,0xFE,0x75,0x9D,0xF0,0x89,0x9D,0x62,0x9E,0x65,0x61,0x5E,0x4C,0x6E,0xFE,0x8E,0x97,0x74,0x6C,0x9E,0x42,0xF0,0x49,0x45,0x4C,0x58,0x59,0xFE,0x5E,0x6D,0x54,0x45,0x55,0x9E,0x51,0x41,0x52,0x68,0xFE,0xF5,0x03,0x0D,0x7C,0x82,0xD6,0xD1,0x77,0xF6,0x6E,0xFE,0x5E,0xF0,0x4C,0x59,0x44,0x4B,0x6A,0x5C,0x9E,0x4C,0x4C,0x61,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_034[] = { 0x49,0x6D,0x55,0x50,0x59,0xF2,0x9E,0xFE,0xF0,0x5D,0x47,0x4F,0x50,0x75,0x91,0x96,0x8E,0x9D,0x58,0xFE,0xF0,0x7B,0xD3,0xF0,0x78,0x90,0xF0,0x8B,0x96,0xF0,0x7A,0x9F,0xF0,0x7C,0xF0,0x52,0x4C,0x6E,0xFE,0x49,0x69,0x45,0x66,0x6F,0x75,0x91,0x96,0x6C,0x62,0xA1,0x52,0xFE,0x40,0x54,0x4F,0x55,0x9E,0x51,0x41,0x52,0x41,0x46,0x5E,0x4C,0x6E,0xFE,0x75,0x91,0x96,0x59,0x9E,0x44,0x4C,0x4C,0x61,0x58,0x41,0x50,0xFE,0x45,0x66,0x9E,0x4A,0x51,0x43,0x41,0x4B,0x52,0x5E,0x4C,0x6E,0xFE,0x60,0x46,0x6C,0x45,0x43,0x68,0x58,0x59,0x0C,0xF0,0x8D,0x7F,0x9D,0x6F,0xFE,0x45,0x43,0x66,0x69,0x54,0x41,0x9E,0x53,0x46,0x59,0xFE,0xF5,0xF0,0x8B,0x9F,0xD1,0xF2,0xF6,0x53,0x41,0x41,0x5E,0x4C,0x6E,0xFE,0x50,0xA4,0xA1,0x53,0x9E,0x4F,0x50,0xF0,0x53,0x5E,0xA1,0x4F,0x66,0xFE,0x0C,0xF0,0x8D,0x7F,0x9D,0x58,0x42,0x43,0xF2,0xFE,0x5E,0x6B,0x67,0x6C,0x9E,0x54,0xF0,0x45,0x61,0x66,0x69,0x5E,0x4C,0x6E,0xFE,0xF0,0x78,0x9F,0x90,0x55,0x9E,0x62,0xF0,0x53,0x4C,0x53,0x46,0x59,0xFE,0xF5,0x0A,0xF0,0x8D,0x7F,0x9D,0xF6,0xF0,0x52,0x4C,0x6E,0xFE,0xF5,0x1B,0xF0,0x8D,0x7F,0x9D,0xF6,0x6C,0x51,0x45,0x42,0x53,0xFE,0x41,0x6A,0x6D,0x54,0x75,0x91,0x96,0x92,0x9F,0xF0,0x83,0x55,0xFE,0x46,0x67,0x45,0x43,0x66,0x69,0x5E,0x4C,0x6E,0xFE,0x5E,0x4F,0x6F,0x45,0x6D,0xF0,0x59,0x6D,0x54,0xF0,0x53,0x6C,0x5F,0x52,0xFE,0x44,0xF0,0x5D,0x43,0x52,0x47,0xF0,0x4F,0x4A,0x41,0xF2,0xFE,0x41,0xF0,0x4B,0xA4,0x42,0xF2,0xF2,0x9E,0x75,0x91,0x96,0x8E,0x9D,0xFE,0xF0,0x7B,0xD3,0xF0,0x78,0x90,0xF0,0x8B,0x96,0xF0,0x7A,0x9F,0xF0,0x7C,0x45,0x66,0x58,0xFE,0x44,0x4B,0x66,0x4D,0xF0,0x52,0x4B,0x4F,0x6E,0xFE,0x4E,0x69,0xF0,0x4B,0xA2,0x6F,0x46,0x6C,0x51,0x48,0x52,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_035[] = { 0x46,0x41,0x6A,0x41,0x04,0x51,0x58,0x9E,0x0C,0xF0,0x8D,0x7F,0x9D,0x6E,0xFE,0xF5,0x42,0x43,0xF6,0x6C,0x44,0x4C,0x53,0xFE,0x03,0x0D,0x7C,0x82,0xD6,0xD1,0x77,0xF0,0x52,0xFE,0x5E,0x6B,0x67,0x6C,0x9E,0x5F,0x6B,0x4F,0x4D,0x5E,0x4C,0x6E,0xFE,0x5B,0xF0,0x4F,0x6D,0x8E,0x97,0x74,0x6C,0x5F,0x52,0x68,0x58,0x59,0xFE,0x44,0x4C,0x4C,0x61,0x58,0xF0,0x7B,0xD3,0xF0,0x78,0x90,0x75,0x91,0x96,0x6E,0xFE,0x0C,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0x9E,0x4C,0x49,0x4B,0x6F,0xFE,0x45,0x47,0xF0,0x53,0xF0,0x45,0x9E,0x45,0x43,0x66,0x69,0x5E,0x4C,0x6E,0xFE,0x1B,0xF0,0x8D,0x7F,0x9D,0x6C,0x44,0x4C,0x53,0xFE,0x8E,0x97,0x74,0x58,0x9E,0x42,0x4B,0x6A,0x45,0x66,0x5F,0x68,0xFE,0x8E,0x97,0x74,0x75,0x91,0x96,0x55,0x9E,0x54,0x67,0x5E,0x4C,0x6E,0xFE,0x62,0xF0,0x53,0x4C,0x53,0x46,0x59,0x62,0x42,0x41,0x50,0xF0,0x53,0x1B,0x6E,0xFE,0xF5,0xF0,0x7B,0xD3,0xF0,0x78,0x90,0x75,0x91,0x96,0xF6,0x53,0xFE,0xF5,0x8E,0x97,0x74,0x75,0x91,0x96,0xF6,0xF0,0x53,0x50,0x66,0x62,0xFE,0x0C,0xF0,0x8D,0x7F,0x9D,0x58,0x9E,0x4B,0x4F,0x6C,0x44,0x4C,0x53,0x6F,0xFE,0x53,0x44,0x47,0x5C,0x9E,0x59,0x54,0x69,0x5E,0x4C,0x6E,0xFE,0x41,0x5E,0x51,0x45,0xA1,0x52,0x41,0x68,0xFE,0x75,0x91,0x96,0x6C,0x9E,0x4B,0x67,0x4F,0x41,0x53,0x46,0x59,0x6F,0xFE,0xF0,0x45,0x61,0x6D,0x9E,0x5F,0xF0,0x46,0x4B,0x4F,0x58,0xFE,0x70,0x71,0x79,0x9D,0x6C,0x9E,0x5F,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_036[] = { 0x9E,0xF5,0x52,0x6D,0xF0,0x5D,0x42,0xF0,0x4F,0x41,0xF6,0xFE,0x0C,0xF0,0x8D,0x7F,0x9D,0x58,0x9E,0x42,0x43,0x6C,0x44,0x4C,0x53,0x6F,0xFE,0x5E,0x6B,0x67,0x6C,0x9E,0x5F,0x6B,0x4F,0x4D,0x5E,0x4C,0x6E,0xFE,0x5F,0x43,0x54,0x41,0x53,0x49,0x6A,0x59,0x9E,0x65,0x9F,0x47,0xFE,0x4F,0x4B,0x45,0x61,0x52,0x45,0x66,0x4C,0x4C,0x61,0x9F,0xF2,0xFE,0x1B,0xF0,0x8D,0x7F,0x9D,0x59,0x8E,0x97,0x74,0x58,0x75,0x91,0x96,0x6E,0xFE,0x41,0x51,0x62,0x9E,0x8E,0x97,0x74,0x58,0x42,0x4B,0x6A,0x6C,0xFE,0x51,0x41,0x52,0x41,0x47,0xF0,0x4E,0x6E,0xF0,0x7B,0xD3,0xF0,0x78,0x90,0x55,0xFE,0x62,0xF0,0x53,0x4C,0x53,0x46,0x59,0x9E,0x62,0x42,0x41,0x50,0xF0,0x53,0xFE,0x1B,0xF0,0x8D,0x7F,0x9D,0x6C,0x44,0x4C,0x49,0x53,0x6E,0xFE,0xF1,0x8D,0x9F,0xF0,0x7C,0xF0,0x45,0x61,0x6D,0xF0,0x52,0x9E,0x92,0x9F,0xF0,0x83,0x6C,0xFE,0x45,0x43,0x68,0x53,0x6F,0x1B,0xF0,0x8D,0x7F,0x9D,0x6C,0xFE,0x44,0x4B,0x52,0x68,0x40,0x41,0xF0,0x4F,0x9E,0x75,0x91,0x96,0x6C,0xFE,0xF5,0x53,0x61,0x68,0xF6,0x49,0x53,0x62,0xF0,0x52,0x46,0x68,0xF2,0xFE,0x4F,0x61,0x4B,0x52,0x5F,0x65,0x42,0x6E,0xFE,0x51,0x45,0xA1,0x52,0x68,0x75,0x91,0x96,0x92,0x9F,0xF0,0x83,0x59,0xFE,0x5F,0xF0,0x46,0x4B,0x4F,0x58,0x70,0x71,0x79,0x9D,0xF0,0x52,0xFE,0x4F,0x4B,0x45,0x61,0x65,0x42,0x6E,0xFE,0x8E,0x97,0x74,0x53,0x58,0x9E,0x46,0xA4,0x67,0x59,0xFE,0x46,0x41,0x6A,0x63,0xF0,0x4B,0x68,0x4B,0x6C,0x9E,0x5F,0x65,0x42,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_037[] = { 0x40,0x4F,0x4B,0x58,0xF5,0x45,0x50,0xF6,0xF0,0x52,0x4C,0x6E,0xFE,0x40,0x54,0x4F,0x58,0xF5,0x5E,0x48,0xF6,0xF0,0x52,0x4C,0x6E,0xFE,0x59,0x59,0x59,0x59,0x59,0xF2,0xF2,0xF2,0xFE,0x8E,0x97,0x74,0x4A,0x6D,0x6F,0x53,0x9F,0xA1,0x52,0x62,0xFE,0x44,0x4B,0x45,0xA1,0x4F,0xF0,0x52,0x4C,0x57,0x6E,0xFE,0x5E,0x4F,0x9E,0x40,0x4E,0xF0,0x5A,0x5E,0x4B,0xA4,0x42,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_038[] = { 0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x58,0x9E,0x50,0x45,0x66,0xF0,0x52,0xFE,0x51,0xF0,0x46,0x58,0x9E,0x4D,0x45,0x41,0x5C,0x58,0xF0,0x83,0x70,0x59,0xFE,0x4B,0xF0,0x4C,0x45,0x55,0x5A,0x66,0x41,0x4F,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_039[] = { 0x9F,0xF0,0x8D,0x90,0x53,0x67,0xF0,0x52,0x9E,0x41,0x67,0xF0,0x47,0x50,0x9F,0xFE,0x9E,0x9E,0xF0,0x4F,0x69,0x62,0x9E,0x59,0x41,0x68,0x54,0xF2,0xFE,0xFE,0x9B,0x7B,0x58,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x59,0xFE,0xF0,0x4F,0x69,0x55,0x62,0x9E,0x6B,0x4F,0x4A,0x56,0x6E,0xFE,0x77,0xD1,0xF1,0x89,0xF0,0x53,0x58,0x45,0x66,0x41,0x4F,0xF0,0x4F,0x41,0x4F,0xFE,0xF0,0x4F,0x41,0xF0,0x4B,0x54,0x9E,0xF0,0x4F,0x41,0xF0,0x4B,0x54,0xFE,0x4F,0x45,0x66,0x62,0x58,0xF0,0x4F,0x6E,0xFE,0x54,0x6D,0x5E,0x41,0x45,0x9E,0x45,0x47,0x4B,0x4F,0xF0,0x45,0xFE,0xF0,0x59,0x4B,0xA4,0x59,0x9E,0x44,0x4B,0x43,0x56,0x6E,0xFE,0x79,0x9F,0x7C,0x59,0xF0,0x4B,0x61,0x58,0x9E,0x7C,0x7F,0x9F,0x58,0xFE,0x54,0x5E,0x43,0x6C,0x6F,0x8A,0x9D,0x83,0x55,0x4C,0x68,0xFE,0xF0,0x47,0x66,0x41,0x54,0x66,0x9E,0x64,0x68,0x4C,0x6E,0xFE,0xFE,0x44,0x63,0x5E,0x58,0x42,0x43,0x58,0xF0,0x8D,0x90,0x76,0x9D,0xF0,0x77,0xFF }; +static const u8 dialog_text_DIALOG_040[] = { 0x49,0x58,0x4A,0x46,0x9E,0x76,0x78,0x9D,0xF2,0xFE,0x97,0x8B,0x83,0x58,0x4F,0x55,0xF0,0x4E,0x49,0x9E,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_041[] = { 0x74,0x71,0x96,0xF0,0x45,0x45,0xA1,0x50,0xA2,0x41,0x5E,0x4B,0x4F,0x6E,0xFE,0x89,0xD1,0x89,0xD1,0x89,0xD1,0xFE,0x4F,0x41,0x4B,0x4F,0x49,0x53,0x54,0x41,0xD1,0x7C,0x57,0xF2,0xFE,0xF0,0x4B,0xA2,0x6F,0x5E,0x4F,0x49,0x6D,0xF0,0x53,0x57,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_042[] = { 0x49,0x58,0xF5,0x59,0x4B,0xF6,0x4D,0x5E,0x41,0x6E,0xFE,0x64,0xA1,0x47,0x67,0x6B,0x4F,0x6A,0x42,0xF2,0xFE,0xF0,0x75,0x78,0x58,0x75,0xF0,0x83,0x55,0x53,0xF0,0x5A,0x51,0x41,0x4F,0x67,0xFE,0x64,0xA1,0x47,0x67,0x53,0x9E,0x44,0x67,0x68,0x53,0xFE,0xF0,0x5B,0x66,0x4A,0xF0,0x45,0x69,0x5E,0x4C,0x6E,0xFE,0xF5,0x52,0xF6,0x6C,0x9E,0x59,0x54,0x4C,0x53,0x46,0x59,0xFE,0x23,0xF0,0x8D,0x7F,0x9D,0x45,0x9E,0x7C,0x82,0xD6,0xD1,0x77,0x6C,0xFE,0x8E,0x97,0x74,0x58,0x42,0x4B,0x6A,0x5C,0x6E,0xFE,0x58,0xF0,0x5D,0x68,0x53,0x46,0x55,0x59,0x9E,0x5E,0x43,0x5C,0xFE,0x4F,0x44,0x4B,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0xF0,0x5B,0x66,0x4A,0xF0,0x45,0xA1,0x52,0x9E,0x4C,0xF0,0x47,0x55,0xFE,0x0A,0xF0,0x8D,0x7F,0x9D,0x6C,0x44,0x4C,0x53,0xFE,0x4C,0xF0,0x59,0x63,0x47,0x9E,0x40,0xF0,0x45,0x69,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_043[] = { 0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4B,0x52,0x0A,0xF0,0x8D,0x7F,0x9D,0x6C,0xFE,0x44,0x4B,0xA1,0xF1,0x59,0x54,0x4B,0x55,0x9E,0x4C,0x68,0x53,0xFE,0xF0,0x5B,0x66,0x4A,0xF0,0x45,0x69,0x68,0x9E,0x53,0x49,0x6A,0xF0,0x45,0xFE,0x40,0x67,0x5E,0x4C,0x6E,0xFE,0xF5,0x53,0x67,0xF6,0x55,0x51,0x45,0x5E,0x68,0x53,0x46,0xFE,0x53,0x9E,0x44,0x54,0xF0,0x4B,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_044[] = { 0xF0,0x4F,0x69,0xF0,0x4F,0x41,0xF2,0x9E,0x9E,0x4D,0xA1,0x45,0x47,0xFE,0x41,0x41,0x46,0x62,0x50,0xF0,0x52,0x9E,0x57,0x52,0x4F,0x58,0x55,0x6E,0xFE,0x40,0x9F,0x9E,0x75,0x96,0xF0,0x7F,0xF0,0x45,0x44,0x62,0x41,0x54,0x9F,0xFE,0x50,0xA4,0x9F,0xF0,0x53,0x41,0x41,0x63,0xF2,0x6B,0x4F,0x4B,0x53,0xFE,0x5A,0x53,0x9F,0xA1,0x53,0xF0,0x5A,0x9E,0x4B,0x5E,0x4D,0x6D,0xF4,0xFE,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF0,0x8D,0x7F,0x9D,0x6C,0xFE,0x44,0x4B,0x52,0x41,0x68,0x40,0x41,0xF0,0x4F,0xFE,0xF0,0x5B,0x66,0x4A,0xF0,0x45,0x69,0x5E,0x4C,0x65,0x9F,0x6E,0xFE,0x44,0x67,0x4F,0x41,0x53,0x46,0x55,0xFE,0x59,0x54,0x4D,0xF0,0x59,0x41,0x9F,0xF0,0x52,0x4C,0x6E,0xFE,0x44,0x9F,0x4C,0x46,0x54,0x53,0x49,0x6A,0x5C,0xFE,0x44,0x51,0x69,0x4B,0x5E,0x9F,0x4C,0x6E,0xFE,0x45,0xF0,0x48,0x6C,0x9E,0x65,0x9F,0x47,0x5F,0x52,0xFE,0x0A,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0x9E,0x51,0x45,0x5E,0xA1,0x52,0xFE,0x47,0xF0,0x4F,0x4A,0x41,0x57,0x9F,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_045[] = { 0x40,0x9F,0x40,0x6F,0x51,0x45,0x69,0x4F,0x9F,0xFC,0xFC,0xFE,0x63,0x9F,0xA1,0xF1,0x59,0x67,0x9E,0x44,0x62,0x41,0x54,0x9F,0x6E,0xFE,0x46,0xA4,0x42,0x59,0x9E,0x49,0x58,0x40,0x4F,0x67,0xF0,0x52,0xF2,0xFE,0xF5,0x62,0x42,0x41,0x50,0xF0,0x53,0x0A,0xF0,0x8D,0x7F,0x9D,0x6C,0xFE,0x44,0x4B,0x54,0x44,0x4B,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xF6,0xFE,0x62,0x42,0x4C,0x49,0x4B,0x9E,0x53,0x6D,0xF0,0x4F,0x66,0xFE,0x5D,0x6D,0x53,0x55,0x9E,0x52,0x6C,0x59,0x54,0x4B,0x52,0x57,0xFE,0xFE,0xF0,0x4B,0xA2,0x40,0x6F,0x4A,0x65,0x54,0x66,0x9F,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_046[] = { 0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x58,0x9B,0xF0,0x7A,0x9E,0x5E,0x53,0x61,0x52,0xFE,0x4D,0x41,0x67,0x4B,0x52,0x44,0x46,0x5E,0x4C,0x6E,0xFE,0x53,0x52,0x62,0xF0,0x4F,0x41,0xF0,0x4B,0x54,0x03,0x51,0x58,0x9B,0xF0,0x7A,0x6E,0xFE,0x44,0xF0,0x5D,0x43,0x52,0x9E,0x51,0x45,0xA1,0x52,0xFE,0x5F,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x7F,0x71,0x8F,0x9D,0xF0,0x77,0x65,0x47,0x9E,0x51,0xF0,0x51,0x48,0x52,0xFE,0x53,0xF0,0x5B,0x53,0x9E,0x4F,0x45,0x47,0x53,0xF0,0x5C,0x5E,0x4C,0x6E,0xFE,0x59,0x63,0x47,0x9E,0x59,0x4B,0xA1,0x52,0x41,0x68,0x53,0xFE,0x4A,0x66,0x55,0x9E,0x4F,0x45,0x47,0x53,0xF0,0x5C,0x5E,0x4C,0x6E,0xFE,0xF5,0x03,0xF0,0x4F,0x6D,0x53,0xF0,0x5A,0xF6,0xF0,0x52,0x4C,0x6E,0xFE,0x59,0x4B,0x67,0x54,0xF0,0x45,0x66,0x9E,0x23,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0xFE,0x4B,0xA2,0xF0,0x45,0x6D,0xF0,0x52,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4C,0x68,0x53,0xFE,0x53,0x44,0x47,0x5C,0x9E,0x53,0xF0,0x5C,0x5E,0x4C,0x6E,0xFE,0xF5,0x59,0xF0,0x59,0x53,0xF0,0x5A,0xF6,0xF0,0x52,0x4C,0x6E,0xFE,0x53,0x52,0x62,0xF0,0x5C,0x6D,0x67,0xF0,0x52,0x4C,0x6E,0xFE,0x5E,0xA1,0x4C,0xF0,0x47,0x4F,0xA1,0x4F,0x9E,0x75,0xF0,0x8C,0x55,0xFE,0x60,0x45,0xA1,0x52,0x9E,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4B,0x52,0x6F,0xFE,0xF0,0x5B,0x51,0x45,0xA1,0x4F,0x9E,0x53,0x49,0x6A,0x45,0x66,0xFE,0x5E,0x4F,0x9E,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF0,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0xF5,0x75,0xF0,0x8C,0x76,0xD1,0x77,0xF6,0x53,0x41,0x41,0x5E,0x4C,0x6E,0xFE,0xF0,0x4F,0x41,0xF0,0x4B,0x54,0x9E,0x82,0x77,0x85,0xD1,0x77,0xFE,0xF5,0x03,0xF0,0x4F,0x6D,0x53,0xF0,0x5A,0xF6,0xFE,0xF5,0x59,0xF0,0x59,0x53,0xF0,0x5A,0xF6,0xFE,0xF5,0x75,0xF0,0x8C,0x76,0xD1,0x77,0xF6,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x6B,0x45,0xA1,0x4F,0xF4,0xFF }; +static const u8 dialog_text_DIALOG_047[] = { 0x49,0x6D,0x55,0x50,0x59,0xF2,0xFE,0x4F,0x41,0x5D,0x42,0x58,0x9E,0xF0,0x4B,0xA3,0x6D,0xF0,0x5A,0x55,0xFE,0x45,0x45,0x67,0x5E,0x4C,0xF2,0xFC,0xFC,0xFC,0xFC,0xFC,0xFF }; +static const u8 dialog_text_DIALOG_048[] = { 0x49,0x49,0x59,0x9E,0x81,0x98,0x81,0x98,0x4C,0xF0,0x5C,0x68,0xFE,0x64,0x46,0x63,0x5E,0x58,0x9E,0x50,0xA4,0x42,0xF0,0x4B,0xA4,0x42,0x6E,0xFE,0x5E,0xF0,0x4C,0x59,0x4E,0x49,0x58,0xFE,0x63,0x5E,0xF0,0x49,0x63,0x5C,0x9E,0xF0,0x53,0x42,0xF0,0x4E,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_049[] = { 0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x6B,0xF0,0x4A,0x75,0xF0,0x8C,0x76,0xD1,0x77,0x6C,0xFE,0x44,0xF0,0x5D,0x43,0x52,0x41,0x5E,0x4C,0x45,0xF4,0xFE,0x4F,0x45,0x41,0x53,0x49,0x6A,0x5C,0x9E,0x40,0xF0,0x45,0x68,0xFE,0x53,0x52,0x62,0xF0,0x4F,0x41,0xF0,0x4B,0x54,0x82,0x77,0x85,0xD1,0x77,0x6E,0xFE,0x75,0xF0,0x8C,0x45,0x66,0x75,0xF0,0x8C,0x5C,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF2,0xFE,0x7C,0x82,0xD6,0xD1,0x77,0x6C,0x51,0x45,0xA1,0x52,0xFE,0x59,0x57,0x45,0x43,0xA1,0x4F,0x5D,0x42,0x55,0xFE,0x45,0x4E,0x47,0x4C,0x68,0x6E,0xFE,0x65,0x9F,0x47,0xFE,0x69,0x6D,0x4B,0xA3,0x42,0x9E,0x4B,0x52,0x44,0x49,0x42,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_050[] = { 0x23,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0x9E,0x4B,0xA2,0xF0,0x45,0x61,0x5E,0x4C,0x6E,0xFE,0xF5,0x4A,0x45,0xF6,0xF0,0x52,0x59,0x9E,0x4C,0xF0,0x5C,0x69,0x5E,0x4C,0x6E,0xFE,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x58,0x9E,0x53,0x50,0xA3,0x42,0x54,0x66,0xFE,0xF5,0x8A,0xD1,0xF1,0x8B,0xF0,0x83,0x9A,0xD1,0xF1,0x8B,0xF6,0xF2,0xF2,0xFE,0x53,0x5E,0xA1,0x52,0x9E,0x4B,0xA2,0xF0,0x45,0x6D,0xF0,0x52,0x45,0x66,0xFE,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4C,0x68,0x53,0xFE,0xF5,0xF0,0x89,0xD1,0x77,0x50,0xA3,0x42,0xF6,0xF0,0x52,0x46,0x68,0xF2,0xFE,0x6B,0x45,0xA1,0x4F,0xF4,0x9E,0x5E,0xF0,0x4F,0x40,0x67,0x5E,0x4C,0x6E,0xFE,0x59,0x4B,0x67,0x54,0xF0,0x45,0x66,0x9E,0x4B,0xA2,0xF0,0x45,0x6D,0xF0,0x52,0xFE,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF0,0x52,0xF5,0x59,0xF0,0x59,0x53,0xF0,0x5A,0xF6,0xF2,0xFE,0x4B,0xA2,0xF0,0x45,0x6D,0xF0,0x52,0x45,0x66,0x9E,0x40,0x68,0x47,0x53,0xFE,0xFC,0xFC,0xFC,0x5A,0x5F,0x51,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_051[] = { 0xF5,0x46,0xF6,0x63,0xF5,0xF0,0x5D,0x42,0xF6,0x55,0x59,0xFE,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF0,0x52,0x9E,0x51,0x45,0x5E,0x69,0x5E,0x4C,0x6E,0xFE,0xF5,0x58,0xF0,0x5D,0x68,0xF6,0xF5,0x44,0x67,0x68,0xF6,0x59,0xFE,0x7C,0x82,0xD6,0xD1,0x77,0xF0,0x52,0x6F,0x63,0x61,0x68,0x58,0x59,0xFE,0x23,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0xF5,0x52,0xF6,0x6C,0x59,0x54,0x4C,0x6E,0xFE,0xF5,0x60,0x46,0x6C,0x45,0x43,0x68,0xF6,0x53,0x46,0x59,0xFE,0x9E,0x03,0x0D,0x7C,0x82,0xD6,0xD1,0x77,0x58,0xFE,0x9E,0x9E,0x9E,0x5F,0xF0,0x46,0x9E,0x53,0x9E,0x5A,0xF0,0x4F,0x67,0x6E,0xFE,0x0A,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0xF5,0x4D,0x54,0x45,0xF6,0x58,0xFE,0x5D,0x42,0x49,0x42,0x55,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4B,0x5E,0x4C,0x6E,0xFE,0x82,0xD1,0xF1,0x8C,0x9D,0xF0,0x52,0x9E,0x62,0x42,0x41,0x50,0xF0,0x53,0xFE,0x7C,0x82,0xD6,0xD1,0x77,0x6C,0x9E,0x42,0x43,0x55,0x41,0x69,0x6F,0xFE,0xF5,0x4A,0x45,0xF0,0x4F,0x50,0xF6,0xF0,0x45,0xF0,0x52,0x46,0x68,0x6E,0xFE,0x60,0x46,0x6C,0x46,0x61,0x52,0x9E,0x4D,0x54,0x45,0x58,0xFE,0x5D,0x42,0x49,0x42,0x55,0x9E,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF0,0x4F,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_052[] = { 0x23,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0x9E,0x4B,0xA2,0xF0,0x45,0x61,0x5E,0x4C,0x6E,0xFE,0x53,0x5E,0xA1,0x52,0x9E,0x4B,0xA2,0xF0,0x45,0x6D,0xF0,0x52,0x45,0x66,0xFE,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4C,0x68,0x53,0x6F,0xFE,0xF5,0xF0,0x89,0xD1,0x77,0x50,0xA3,0x42,0xF6,0xF0,0x52,0x46,0x68,0xF2,0xFE,0x4C,0xF0,0x59,0x63,0x47,0x94,0x9F,0x7F,0x9F,0x9D,0x6C,0xFE,0x4B,0x54,0xF0,0x45,0x66,0x6F,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4C,0x68,0x53,0xFE,0xF5,0x50,0xA3,0x42,0xF0,0x45,0x43,0x67,0xF6,0xF2,0xFE,0xF0,0x53,0x50,0x66,0x62,0x9E,0x4F,0x45,0x47,0x53,0xF0,0x5C,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_053[] = { 0x79,0x71,0x9D,0x97,0x9D,0xF0,0x77,0x63,0x9E,0x45,0x47,0x69,0x4F,0xFE,0x7B,0x9F,0x77,0x99,0xD1,0x83,0xF1,0x8D,0x71,0x9D,0x83,0x6C,0xFE,0x53,0x44,0x68,0x53,0x9E,0x40,0x45,0x41,0x4C,0x42,0xF0,0x4B,0xF0,0x45,0xFE,0xF0,0x52,0x52,0x46,0x5E,0x4C,0x6E,0x05,0x49,0x51,0xF0,0x51,0x48,0x52,0xFE,0x53,0x44,0x68,0x53,0x9E,0x5A,0x5F,0x51,0x58,0x7C,0x7F,0x9F,0xFE,0xF0,0x45,0x9E,0x40,0x66,0x6B,0x69,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_054[] = { 0x7C,0x96,0x71,0xF0,0x7F,0x9F,0x5C,0x65,0x42,0x49,0x4E,0xF2,0xF2,0xFE,0x4A,0x45,0x6C,0x9E,0x4C,0xF0,0x5C,0x67,0x59,0xF0,0x4B,0x61,0x4F,0x66,0xFE,0x7C,0x82,0xD6,0xD1,0x77,0x5E,0x43,0xF0,0x52,0x9E,0x45,0x4E,0x47,0x6F,0xFE,0x42,0x4B,0x6A,0xF0,0x52,0x9E,0xF0,0x48,0x6D,0x4E,0x47,0xF0,0x52,0x46,0x68,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_055[] = { 0x40,0x4F,0x4B,0x6F,0x49,0x58,0x7C,0x96,0x71,0xF0,0x7F,0x9F,0x58,0xFE,0x4D,0x45,0x41,0x80,0xD2,0x9D,0xF1,0x8A,0x74,0x9D,0xF2,0xF2,0xF2,0xFE,0x45,0x66,0xF0,0x4F,0x6F,0xF0,0x82,0x75,0x71,0x48,0xF0,0x53,0xFE,0x53,0xA1,0x52,0x62,0x9E,0x59,0x63,0x41,0x65,0xF2,0xFE,0x40,0x54,0x4F,0x80,0xD2,0x99,0x9D,0xF0,0x7B,0x4B,0x5E,0x4C,0xF4,0xFE,0x4E,0x69,0xF0,0x52,0x59,0xF2,0xFE,0xFE,0x9E,0x99,0xF0,0x82,0xD6,0x9F,0x9F,0x9F,0xFC,0xFC,0xFC,0xF2,0xFE,0x9E,0x9E,0xFC,0xFC,0xFC,0x9E,0xFE,0x9E,0x9E,0x9E,0xF0,0x79,0x9F,0xF2,0xF2,0x9E,0x63,0x61,0x53,0x47,0xFF }; +static const u8 dialog_text_DIALOG_056[] = { 0x8A,0x73,0x9F,0x9F,0x9F,0xD1,0xF2,0xF2,0xF2,0xFE,0x7D,0x75,0x71,0x46,0x6A,0x47,0xF0,0x4F,0x65,0xF2,0xFE,0x7C,0xF0,0x79,0x71,0x65,0xF2,0x40,0x54,0x4F,0xF2,0xF2,0xFE,0x46,0x6D,0x91,0xF0,0x7F,0x98,0x58,0x9E,0x45,0x6B,0x67,0x55,0xFE,0x79,0x99,0x9E,0x40,0xF0,0x48,0x5E,0x4C,0xF2,0xFE,0x41,0x63,0x9F,0x9F,0x7C,0xF0,0x79,0x71,0x7C,0xF0,0x79,0x71,0xF2,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_057[] = { 0xF0,0x53,0x49,0x45,0xF0,0x52,0x9E,0x42,0x50,0x58,0x49,0xF0,0x53,0x62,0x6C,0xFE,0x5F,0x45,0x48,0x5E,0x4D,0x6D,0x9E,0xF0,0x52,0x4B,0x4F,0x45,0xF4,0xFE,0xFC,0xFC,0xFC,0x6B,0x4F,0x4B,0x6D,0x50,0x9E,0x49,0xF0,0x53,0x62,0xFE,0x41,0xA1,0xF1,0x59,0x41,0x9E,0x41,0x5E,0x4B,0x52,0x57,0xFC,0xFC,0xFE,0x54,0x6D,0xF0,0x5A,0x46,0x9E,0x41,0x4F,0x58,0x45,0x62,0xFE,0x44,0xF0,0x5D,0x43,0x52,0x54,0x47,0x52,0xFC,0xFC,0xFC,0xFC,0xFE,0x5D,0x6D,0x53,0x55,0xFC,0xFC,0xFE,0xF0,0x53,0x49,0x5C,0x9E,0x41,0xA1,0x4F,0x6D,0xF0,0x52,0x4B,0xA4,0x42,0x6E,0xFE,0xF0,0x4F,0x41,0x52,0x63,0x68,0x53,0xFE,0x53,0x52,0x62,0x9E,0x41,0x41,0x49,0x43,0xF0,0x52,0xFE,0x54,0x47,0x6D,0xF0,0x52,0x4C,0x48,0xF0,0x53,0x57,0xFC,0xFC,0xFC,0xFE,0x93,0x99,0x93,0x99,0xFC,0xFC,0xFC,0xFC,0xFC,0xFF }; +static const u8 dialog_text_DIALOG_058[] = { 0x40,0x40,0x9F,0x9F,0xA1,0xF2,0xF2,0x4F,0x4B,0x45,0x55,0xFE,0x42,0x50,0x58,0x9E,0x49,0xF0,0x53,0x62,0xF0,0x52,0x4C,0xFC,0xFC,0xFC,0xFE,0xF5,0x49,0x66,0xA1,0xF2,0x9E,0x41,0x51,0x62,0xFE,0x50,0x45,0x47,0xF0,0x52,0x9E,0x40,0x4E,0xF0,0x5A,0x54,0x4A,0x41,0x53,0xFE,0x41,0xA1,0x52,0x68,0xF0,0x4F,0x6A,0xF2,0xF6,0xFE,0x40,0x54,0x4F,0x9E,0x53,0xA1,0x52,0x62,0xFE,0x41,0x41,0x5A,0x53,0xF0,0x52,0x4C,0x6E,0x9E,0x44,0x69,0x41,0x55,0xFE,0x49,0x69,0x6C,0x9E,0x4A,0x4B,0x40,0xF0,0x48,0x5E,0x4C,0x6E,0xFE,0x40,0xA1,0x4F,0x45,0x47,0xA1,0x52,0x9E,0x53,0x52,0x62,0xFE,0xF0,0x48,0x6D,0x46,0x55,0x9E,0x54,0x67,0x5E,0x4C,0x65,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_059[] = { 0x49,0x58,0x49,0x59,0x9E,0x42,0x50,0x58,0x49,0xF0,0x4B,0xA2,0x9F,0xFE,0x54,0x41,0x65,0x42,0xF0,0x4F,0x54,0x40,0xFC,0xFC,0xFC,0xFE,0x45,0x6B,0x41,0x4E,0x42,0x55,0xFC,0xFC,0xFC,0xFE,0x44,0x63,0x59,0x41,0xA1,0x4F,0x41,0xFE,0x54,0x55,0x6C,0x4B,0x52,0x68,0x6D,0xF0,0x4F,0x6A,0x42,0xFC,0xFC,0xFF }; +static const u8 dialog_text_DIALOG_060[] = { 0x9F,0x5F,0xF0,0x4C,0x55,0x59,0x41,0x68,0x50,0xA3,0x42,0x41,0x9F,0xFE,0xFE,0x62,0xF0,0x47,0xA1,0x52,0x41,0x68,0x53,0x9E,0x4B,0x56,0x5D,0xF0,0x53,0xFE,0x47,0x68,0x4B,0x47,0x54,0xA1,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0x4C,0x41,0x61,0x6D,0x55,0x9E,0x40,0xF0,0x45,0x68,0x45,0xFE,0x70,0xF0,0x8B,0x77,0x6C,0x5F,0x51,0x48,0x52,0xFE,0x4A,0x6B,0xA1,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x5A,0x53,0x41,0x46,0x9E,0x51,0x48,0x5E,0x4C,0x6E,0xFE,0x44,0x65,0xF0,0x47,0x53,0x46,0x59,0x9E,0x0A,0xF0,0x8D,0x7F,0x9D,0xF2,0xFE,0x44,0x4B,0x52,0x68,0xF0,0x4F,0x48,0xF0,0x52,0x62,0x9E,0x4C,0x4C,0x5F,0xFE,0x7F,0x71,0x8F,0x9D,0xF0,0x77,0x65,0x47,0x9E,0x44,0x4C,0x53,0xFE,0x7C,0xF1,0x8A,0x9F,0xF0,0x83,0xF0,0x45,0xF0,0x52,0x5E,0x4C,0x6E,0xFE,0x62,0xF0,0x47,0x68,0x53,0x46,0x59,0x7C,0x82,0xD6,0xD1,0x77,0x6C,0xFE,0x5E,0x43,0x55,0x4F,0x44,0x4B,0x52,0x9E,0x0A,0xF0,0x8D,0x7F,0x9D,0x6E,0xFE,0x42,0x45,0xF0,0x5B,0x53,0x46,0x59,0x7C,0x82,0xD6,0xD1,0x77,0x6C,0xFE,0x52,0x5E,0x43,0x55,0x5A,0x41,0x52,0x9E,0x0A,0xF0,0x8D,0x7F,0x9D,0x6E,0xFE,0x4C,0x41,0x61,0x6D,0x55,0x9E,0x41,0x68,0x53,0x46,0x59,0xFE,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4B,0x5E,0x4C,0x6E,0xFE,0x9E,0xF5,0xF0,0x4B,0xA3,0x6D,0xF0,0x5A,0x4F,0x41,0x4E,0x42,0xFE,0x9E,0x9E,0x9E,0x9E,0x6B,0x4C,0x69,0xF0,0x4C,0x55,0xF2,0xF2,0xF6,0xFF }; +static const u8 dialog_text_DIALOG_061[] = { 0x51,0x61,0x4F,0x41,0x5F,0xF0,0x4C,0x9E,0x76,0x78,0x9D,0xF2,0xF2,0xFE,0x44,0x65,0x41,0xF0,0x52,0x59,0x9E,0x41,0x48,0x5E,0x4D,0x6D,0xF2,0xFE,0x49,0x58,0x9E,0x49,0x44,0x67,0x58,0x41,0x48,0x59,0xFE,0x53,0xF0,0x5A,0x40,0xF0,0x45,0x68,0xF0,0x47,0x66,0x41,0xFE,0x51,0x61,0x4F,0x41,0xF0,0x52,0x4C,0xF2,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0xF1,0x8C,0x9D,0xF0,0x76,0x9D,0xFF }; +static const u8 dialog_text_DIALOG_062[] = { 0x5F,0xF0,0x53,0x67,0x58,0x9E,0xF0,0x8B,0x9A,0xD1,0x77,0x55,0xFE,0x45,0x47,0x4A,0x69,0x52,0x41,0x68,0xFE,0x5B,0x4B,0xF0,0x46,0x54,0x9E,0x5B,0x4B,0xF0,0x46,0x54,0xFE,0xF5,0x91,0x7F,0x98,0x58,0xF0,0x5D,0x42,0x4B,0xF6,0x6E,0xFE,0xFE,0x5A,0x6C,0x51,0x48,0x4F,0xA1,0x52,0x62,0x43,0x54,0x41,0x4B,0xFE,0x52,0x46,0x58,0x4F,0x5E,0x62,0x9E,0x59,0x57,0x45,0x43,0x4C,0x6E,0xFE,0x41,0x46,0x6C,0x9E,0x53,0x61,0x52,0x62,0xFE,0x5C,0x41,0x46,0xF0,0x52,0x4C,0x6E,0xFE,0x49,0x5E,0xA1,0x4F,0x49,0x53,0x55,0x44,0x65,0xF0,0x48,0x54,0x41,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_063[] = { 0x40,0x44,0x41,0xF0,0x8B,0x9A,0xD1,0x77,0x55,0x59,0xFE,0xF5,0x53,0x42,0x61,0x41,0xF0,0x5D,0x42,0x4B,0xF6,0x6E,0xFE,0x91,0xF0,0x7F,0x8E,0x62,0x9E,0xF0,0x8A,0xD1,0x77,0x97,0xFE,0x4C,0xF0,0x45,0x4F,0x6C,0x48,0x4D,0x68,0x6E,0xFE,0x82,0x99,0x7A,0x62,0x9E,0x5E,0xA1,0x4A,0x44,0xFE,0xF5,0x5A,0x5F,0x51,0x58,0x75,0xF0,0x8C,0xF6,0x6C,0xFE,0x53,0x44,0x67,0x56,0x48,0x68,0xF0,0x4E,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_064[] = { 0x40,0x45,0x41,0xF0,0x8B,0x9A,0xD1,0x77,0x58,0x54,0x45,0x58,0xFE,0x59,0x57,0x58,0xF0,0x5D,0x42,0x4B,0x6C,0x9E,0x45,0xF0,0x5B,0x68,0x53,0x6F,0xFE,0x03,0x45,0x41,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF0,0x52,0xFE,0x4E,0x66,0x4F,0x45,0x47,0x9E,0x53,0xF0,0x5A,0x40,0xF0,0x45,0x69,0x68,0x6E,0xFE,0x4E,0x42,0x4A,0x59,0x7C,0x82,0xD6,0xD1,0x77,0xF0,0x52,0xF2,0xFE,0x52,0x5E,0x43,0x55,0x5A,0x47,0x53,0x9E,0x40,0xF0,0x45,0x68,0x6E,0xFE,0x5E,0x43,0x55,0x4F,0x44,0x4C,0x53,0x9E,0x4A,0xF0,0x45,0x68,0x6E,0xFE,0x63,0x61,0x68,0x53,0x46,0x59,0x23,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_065[] = { 0x44,0x65,0xF0,0x46,0x45,0x4F,0x9E,0x44,0x4B,0x43,0x5E,0x4C,0x6E,0xFE,0xFE,0x5F,0xF0,0x4C,0x55,0x59,0x41,0x68,0x53,0x44,0x65,0xF0,0x48,0x5E,0x4C,0x6E,0xFE,0x54,0xF0,0x45,0x41,0x40,0x41,0xF0,0x4F,0xF5,0x62,0xF0,0x47,0x68,0xF6,0x53,0xFE,0x47,0x68,0x4B,0x47,0x54,0x67,0x5E,0x4C,0x6E,0xFE,0x4C,0x4C,0x60,0x4F,0x61,0x55,0x59,0x9E,0x0A,0xF0,0x8D,0x7F,0x9D,0x6E,0xFE,0x7F,0x71,0x8F,0x9D,0xF0,0x77,0x65,0x47,0x9E,0x44,0x4C,0x53,0xFE,0x7C,0xF1,0x8A,0x9F,0xF0,0x83,0xF0,0x45,0x9E,0xF0,0x52,0x5E,0x4C,0x6E,0xFE,0x03,0x0D,0x7C,0x82,0xD6,0xD1,0x77,0x6C,0x9E,0x5E,0x43,0x55,0xFE,0x4F,0x44,0x4C,0x53,0x9E,0x62,0xF0,0x47,0x67,0x5E,0x4C,0x6E,0xFE,0x4C,0x41,0x61,0x6D,0x55,0x9E,0x62,0xF0,0x53,0xA1,0x4F,0x67,0x6F,0xFE,0x5F,0xF0,0x4C,0x45,0x66,0x9E,0x40,0xF0,0x45,0x68,0x53,0x46,0x59,0xFE,0x52,0x5E,0x43,0x55,0x5A,0x41,0x52,0x9E,0x0A,0xF0,0x8D,0x7F,0x9D,0x6E,0xFE,0x4C,0x41,0x61,0x6D,0xF0,0x52,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF0,0x4F,0xF2,0xFE,0xFE,0x0A,0xF0,0x8D,0x7F,0x9D,0x9E,0x44,0x4B,0xA1,0xF1,0x59,0x54,0x4B,0x55,0xFE,0x4B,0x52,0x41,0x52,0x62,0x6F,0x44,0x65,0xF0,0x48,0x5E,0x4C,0x6E,0xFE,0x66,0x47,0x50,0x6D,0xF0,0x52,0x4C,0x6E,0xFE,0x44,0x65,0x41,0xF0,0x52,0x41,0x68,0x40,0x41,0xF0,0x4F,0x59,0xFE,0xF0,0x83,0x70,0x6C,0x9E,0x40,0x48,0x66,0x69,0x5E,0x4D,0x6D,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_066[] = { 0x8E,0x97,0x74,0xF2,0x9E,0x9E,0x77,0xD1,0xF1,0x89,0x58,0x59,0x47,0xFE,0x5D,0x58,0x44,0x55,0x9E,0x46,0x6C,0x51,0x48,0x52,0xF2,0xFE,0x77,0xD1,0xF1,0x89,0x6C,0x9E,0x49,0x66,0x4B,0x61,0x68,0x55,0x59,0xFE,0x42,0x4B,0x6A,0x55,0x5E,0x6B,0x67,0x0B,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0xFE,0x7B,0xD1,0xF1,0x8D,0x6C,0x51,0x45,0x60,0x58,0x65,0xF2,0xFE,0x54,0xF0,0x48,0x53,0xF0,0x59,0x4C,0x9E,0x5E,0x43,0x55,0x59,0xFE,0x03,0x0D,0x7C,0x82,0xD6,0xD1,0x77,0xF0,0x52,0xFE,0xF0,0x77,0x97,0xF0,0x77,0x97,0x5B,0x67,0x5E,0x6B,0x4C,0x58,0x6E,0xFE,0x59,0x63,0x47,0x9E,0x5E,0x6B,0x4C,0x5D,0xF0,0x53,0xFE,0x53,0x44,0x47,0x5E,0xF0,0x52,0x9E,0x53,0xF0,0x5B,0x6B,0xF2,0xFE,0x0C,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0x9E,0x5E,0x6B,0x67,0x6C,0xFE,0x65,0x9F,0x47,0x5F,0x52,0xF2,0xFE,0x54,0xF0,0x48,0x53,0xF0,0x59,0x4B,0x4F,0x9E,0x77,0xD1,0xF1,0x89,0x59,0xFE,0x04,0x4C,0x5F,0x58,0x9E,0xF0,0x89,0x77,0xF0,0x7F,0x9D,0x55,0xFE,0xF0,0x5B,0x51,0x48,0x52,0x63,0x68,0x58,0xF2,0xFE,0x57,0x66,0x41,0x6C,0xFE,0x65,0x9F,0x47,0x4A,0xF0,0x4F,0x61,0x52,0xFC,0xFC,0xFC,0xFE,0xFE,0x62,0x42,0x41,0x50,0xF0,0x53,0x0B,0xF0,0x8D,0x7F,0x9D,0x65,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_067[] = { 0xF0,0x4A,0x6D,0x57,0x6D,0xF0,0x4F,0xA1,0x4F,0x54,0x8E,0x97,0x74,0xF2,0xFE,0x49,0x49,0x55,0x59,0x9E,0xF1,0x8A,0x9F,0x80,0x50,0xA2,0x6D,0x59,0xFE,0x41,0x5E,0x4D,0x6D,0xF0,0x52,0x4B,0x4F,0x6E,0xFE,0x9E,0x9E,0x9E,0x9E,0xF0,0x75,0x89,0x89,0xD1,0xF2,0xF2,0xFE,0x6B,0xF0,0x45,0x59,0x41,0x58,0x9E,0x42,0x4B,0x6A,0x55,0xFE,0x5E,0x6B,0x67,0x49,0x6D,0xF0,0x52,0x9E,0x7B,0xD1,0xF1,0x8D,0x6C,0xFE,0x51,0x45,0x61,0x68,0x62,0x58,0x54,0x66,0xFE,0x51,0x45,0x6D,0xF0,0x52,0x5F,0x68,0x6D,0xF0,0x4F,0x54,0x6E,0xFE,0x7C,0x82,0xD6,0xD1,0x77,0xF0,0x52,0xF0,0x77,0x97,0xF0,0x77,0x97,0xFE,0x5E,0x6B,0x4B,0x52,0x9E,0x54,0xF0,0x48,0x68,0x54,0xF0,0x53,0xFE,0xF0,0x52,0x46,0x68,0x6B,0x48,0xF0,0x45,0x9E,0x54,0x41,0xF2,0xF2,0xFE,0x9E,0x9E,0xF0,0x75,0x89,0x89,0xD1,0xF2,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_068[] = { 0x49,0x49,0x59,0x9E,0x4B,0xA2,0x47,0x57,0x51,0x58,0xFE,0x8B,0xD5,0x71,0x70,0xF0,0x89,0xF0,0x8B,0x98,0x9E,0x96,0x9D,0xF0,0x83,0xF2,0xFE,0x45,0x66,0xF0,0x4F,0x55,0x9E,0x5A,0xF0,0x45,0x51,0x41,0x52,0x62,0xFE,0x44,0x50,0x54,0x41,0x65,0x42,0x55,0x9E,0x40,0x6B,0x52,0xF0,0x4C,0xFE,0x4E,0x42,0x4A,0x4B,0x65,0x42,0x6E,0xFE,0x5D,0x58,0x44,0x58,0x41,0x48,0x55,0x9E,0x44,0x50,0x68,0x53,0xFE,0x59,0x57,0x40,0xF0,0x45,0x68,0xF2,0x9E,0x9E,0x4E,0x42,0x4A,0x59,0xFE,0xF0,0x52,0x46,0x68,0x58,0xF0,0x52,0x6F,0x44,0x50,0x51,0x41,0x52,0x6E,0xFE,0x40,0x5E,0x67,0x42,0xF0,0x49,0x46,0x5E,0x6B,0x66,0x54,0x41,0xF0,0x52,0xFE,0xF0,0x75,0x9D,0xF0,0x89,0x99,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_069[] = { 0xF5,0x43,0xF6,0x58,0x54,0x45,0x58,0x75,0x71,0xF0,0x8B,0x81,0x58,0xFE,0x4D,0x45,0x41,0x55,0x59,0x6F,0x4D,0x45,0x41,0x58,0xFE,0x59,0x52,0xF0,0x45,0x40,0x67,0x5E,0x4C,0x6E,0xFE,0x5F,0x43,0x54,0x41,0x75,0xF0,0x8C,0x55,0x40,0x4F,0xA1,0x4F,0x66,0xFE,0x46,0xA1,0x53,0x9E,0x4E,0x49,0xF0,0x45,0xFE,0xF5,0x43,0xF6,0x58,0x4D,0x45,0x41,0x58,0x59,0x52,0xF0,0x52,0x4C,0x6E,0xFE,0x4E,0x66,0x6C,0x9E,0x53,0x6D,0xF0,0x52,0x41,0x68,0x53,0x46,0x62,0xFE,0x4E,0x49,0x45,0x66,0x9E,0x4A,0x46,0x55,0x59,0xFE,0x4C,0x4C,0x61,0x5E,0x4D,0x6D,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_070[] = { 0x45,0x41,0xF0,0x5B,0x51,0x4F,0x50,0x58,0x9E,0x4C,0x6D,0xF0,0x52,0x68,0xFE,0xF5,0x43,0xF6,0x58,0x54,0x45,0x58,0x4D,0x45,0x41,0x45,0x66,0x6F,0xFE,0x44,0x4B,0x6A,0x58,0x9E,0x41,0x67,0xF0,0x47,0x50,0x58,0xFE,0x91,0x71,0x9D,0x8D,0x9F,0x98,0x55,0xFE,0x41,0x51,0xF0,0x52,0x62,0x9E,0x62,0xF0,0x53,0x69,0x5E,0x4C,0x6E,0xFE,0x45,0x54,0x66,0xF0,0x4C,0x9E,0x46,0x50,0x6D,0x53,0xFE,0x4F,0x50,0xF0,0x53,0x5E,0xA1,0x52,0x45,0x66,0xF2,0xFE,0x7C,0x7F,0x9F,0x83,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0xF1,0x8D,0x9F,0xF0,0x7C,0x4B,0x6F,0xFE,0xF5,0x79,0x9F,0x7C,0x45,0x66,0xF0,0x52,0x68,0xF6,0x6C,0xFE,0x43,0x66,0x6D,0xF0,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x5A,0x53,0x51,0x58,0x4D,0x45,0x41,0x58,0x7C,0x7F,0x9F,0x59,0xFE,0xF0,0x4D,0x6D,0xF0,0x5B,0x9E,0x53,0x66,0x54,0x47,0x52,0x62,0x6F,0xFE,0x51,0xF0,0x46,0x58,0x4D,0x45,0x41,0x55,0x4C,0x4C,0x61,0x5E,0x4C,0x6E,0xFE,0xF0,0x4B,0xA4,0x42,0xF0,0x4C,0x55,0x54,0xA1,0x4F,0x66,0x6F,0x5E,0x4F,0xFE,0x62,0xF0,0x53,0xA1,0x52,0x46,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x7C,0x7F,0x9F,0x6C,0x01,0x51,0x9E,0x53,0x68,0xF0,0x49,0x53,0x55,0xFE,0x51,0xF0,0x46,0x58,0x7C,0x7F,0x9F,0x58,0x8A,0x9D,0x83,0xF0,0x45,0xFE,0x7C,0x7F,0x9F,0x83,0xF0,0x45,0x61,0x6D,0x55,0x9E,0xF0,0x52,0x5E,0x4C,0x6E,0xFE,0x43,0x66,0x6D,0xF0,0x4F,0x8A,0x9D,0x83,0x41,0xF0,0x45,0x41,0x58,0xFE,0x7C,0x7F,0x9F,0x6C,0x53,0xA1,0x52,0x62,0x18,0x14,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_071[] = { 0x9E,0x9F,0x49,0x58,0x4A,0x46,0x76,0x78,0x9D,0x9F,0xFE,0x9E,0x9E,0x40,0x63,0x4B,0x41,0x78,0x90,0x97,0x55,0xFE,0x9E,0x9E,0x50,0xA3,0x42,0x41,0xF2,0xFE,0x9E,0x41,0x46,0xF0,0x45,0xF0,0x52,0x46,0x5E,0x4D,0x6D,0xF2,0xFE,0x47,0x68,0x4B,0x47,0x54,0xA1,0x4F,0x66,0xFE,0x4F,0x45,0x41,0x53,0x49,0x6A,0x5C,0xF2,0xFE,0x5E,0x68,0xFC,0xFC,0xFC,0xFC,0xFC,0x5A,0x54,0x6D,0xF0,0x4B,0xA4,0xFE,0x63,0xF0,0x4B,0x68,0x4B,0xFC,0xFC,0xFC,0xF0,0x52,0x41,0x67,0xF0,0x47,0x50,0xFF }; +static const u8 dialog_text_DIALOG_072[] = { 0x75,0xF0,0x7D,0x51,0x65,0x4B,0xF2,0x9E,0x9E,0xF0,0x5D,0x42,0x4B,0x59,0xFE,0x4B,0xA1,0x45,0x67,0x9E,0x45,0xF0,0x5B,0x67,0x5E,0x4B,0xA4,0x42,0x6E,0xFE,0x62,0x4B,0x9E,0xF0,0x5D,0x42,0x4B,0x6C,0x54,0x47,0x4B,0x52,0x62,0xFE,0x49,0x49,0xF0,0x52,0x54,0x47,0x4B,0x4F,0x9E,0xF0,0x5D,0x42,0x4B,0x59,0xFE,0x49,0x58,0x63,0x5E,0xF0,0x52,0x9E,0x5F,0x51,0x45,0x67,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_073[] = { 0x4F,0xF0,0x4F,0x4B,0x41,0x9E,0xF0,0x4B,0xA3,0x6D,0xF0,0x59,0x6D,0xF0,0x52,0xFE,0x59,0x49,0x6C,0x9E,0x5A,0x66,0x47,0x49,0x53,0x6E,0xFE,0x49,0x4F,0x43,0x59,0x9E,0xF0,0x4F,0x69,0x55,0x62,0xFE,0x44,0x4B,0x43,0x52,0x63,0x66,0x54,0x41,0x6E,0xFE,0x9E,0x9E,0x9E,0x9F,0x9F,0x4D,0x6D,0x50,0xA4,0x42,0x9F,0x9F,0xFF }; +static const u8 dialog_text_DIALOG_074[] = { 0xF0,0x75,0x78,0x58,0x75,0xF0,0x83,0x55,0x9E,0x53,0xF0,0x5A,0x51,0x47,0x53,0xFE,0xF0,0x5B,0x66,0x4A,0xF0,0x45,0x69,0x5E,0x4C,0x6E,0xFE,0x44,0x67,0x68,0x53,0x46,0x59,0x7C,0x82,0xD6,0xD1,0x77,0x6C,0xFE,0x8E,0x97,0x74,0x58,0x42,0x4B,0x6A,0x5C,0x41,0x69,0x68,0x45,0x6F,0xFE,0x23,0xF0,0x8D,0x7F,0x9D,0x6C,0x44,0x4B,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x58,0xF0,0x5D,0x68,0x53,0x46,0x59,0x7C,0x82,0xD6,0xD1,0x77,0x6C,0xFE,0x5E,0x43,0x55,0x9E,0x4F,0x44,0x4B,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0xF0,0x5B,0x66,0x4A,0xF0,0x45,0xA1,0x52,0xFE,0x4C,0xF0,0x47,0x55,0x9E,0x0A,0xF0,0x8D,0x7F,0x9D,0x6C,0x44,0x4C,0x53,0xFE,0x4C,0xF0,0x59,0x63,0x47,0x9E,0x58,0xF0,0x5D,0x69,0x5E,0x4C,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_075[] = { 0x8E,0x97,0x74,0xF2,0xF2,0x4F,0x41,0x5C,0x6D,0xF0,0x52,0x4C,0x6E,0xFE,0x77,0xD1,0xF1,0x89,0xF0,0x45,0x5E,0x4F,0xFC,0xFC,0xFC,0xFC,0xFE,0x44,0x4B,0x6A,0x58,0x9E,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xFE,0x56,0x4C,0x6D,0xF0,0x52,0x9E,0x75,0xF0,0x8C,0x58,0x54,0x45,0x5C,0xF2,0xFE,0x6B,0x4F,0x4B,0x4F,0x50,0x62,0xFC,0xFC,0xFC,0xFE,0x5F,0x6D,0x54,0x75,0xF0,0x8C,0x58,0x54,0x45,0x5C,0xFC,0xFC,0xFC,0xFE,0x4C,0x41,0x49,0x5E,0x69,0x52,0x41,0x47,0x6B,0xFC,0xFC,0xFC,0xFE,0xF5,0x75,0xF0,0x8C,0xF6,0x63,0xF5,0x43,0xF6,0x58,0x54,0x45,0xFE,0x45,0x66,0x9E,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xFE,0x53,0x67,0x62,0xF0,0x53,0x4B,0x52,0xF2,0xFE,0x77,0xD1,0xF1,0x89,0x58,0x9E,0x5B,0x4A,0x41,0xF0,0x4F,0xF0,0x83,0x70,0x59,0xFE,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x58,0x9E,0x50,0x45,0x66,0xF0,0x52,0xFE,0x5A,0x66,0x47,0x49,0x53,0xF0,0x45,0x9E,0xF0,0x52,0x46,0x68,0x6B,0xF2,0xFE,0x49,0x58,0x5C,0x63,0x55,0x59,0x9E,0x5A,0x5F,0x51,0x58,0xFE,0x51,0x42,0x6A,0xF0,0x45,0x40,0x68,0x58,0x6E,0xFE,0x77,0xD1,0xF1,0x89,0x55,0x5F,0x51,0x45,0x66,0x54,0x45,0xA1,0x4F,0xFE,0x45,0x47,0x4B,0x51,0x42,0x6A,0x58,0x9E,0x5A,0x53,0x51,0x65,0x6E,0xFE,0x4E,0x49,0x55,0x59,0x9E,0x44,0x4B,0x6A,0x58,0xFE,0x45,0x47,0x69,0x7C,0x7F,0x9F,0xF0,0x45,0x9E,0x40,0x68,0x6B,0xF2,0xFE,0x46,0xA1,0x53,0x9E,0x63,0x47,0x55,0x4F,0x51,0x59,0xF0,0x4C,0x65,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_076[] = { 0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x58,0x44,0x45,0xF0,0x48,0xF0,0x52,0xFE,0x44,0x4B,0x6A,0x55,0x6F,0xF0,0x48,0x6D,0x46,0xF0,0x45,0xFE,0x62,0xF0,0x53,0xA1,0x52,0x46,0x5E,0x4B,0x4F,0x6E,0xFE,0x77,0xD1,0xF1,0x89,0x54,0x6D,0x45,0xFE,0x44,0x41,0x59,0x66,0xA1,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x44,0x63,0x47,0x55,0x9E,0x4F,0x51,0x54,0x66,0xFE,0x44,0x4B,0x6A,0x58,0x9E,0x59,0x54,0x4B,0x6C,0x4B,0x5E,0x4C,0x6E,0xFE,0xF5,0x75,0xF0,0x75,0x8F,0x58,0x5C,0x63,0xF6,0xF0,0x52,0x59,0xFE,0x75,0xF0,0x75,0x8F,0x55,0x42,0x51,0x66,0x54,0x41,0x62,0x58,0x6C,0xFE,0x65,0x47,0x5F,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x5F,0xF0,0x4C,0x58,0x5E,0x50,0x5C,0x9E,0x41,0x47,0x53,0x46,0x59,0x6F,0xFE,0xF5,0x43,0xF6,0x55,0x53,0xF0,0x5A,0x49,0x60,0x9E,0x4F,0x45,0x4A,0xFE,0x55,0x65,0xA1,0x52,0x6F,0x5E,0x50,0x6C,0x4C,0xA1,0x45,0x67,0xFE,0x5F,0xF0,0x4C,0xF0,0x5A,0x4F,0x4B,0x55,0x9E,0xF0,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0x70,0xD1,0x6F,0x49,0x69,0x9E,0x5F,0x51,0x48,0x5E,0x4B,0x4F,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_077[] = { 0x53,0xF0,0x5A,0x66,0x6C,0x9E,0x5A,0x66,0x47,0x5E,0x43,0x55,0xFE,0x02,0x51,0x58,0x9E,0x59,0x4B,0x66,0x6C,0xFE,0x44,0x4B,0x4A,0xF0,0x48,0x52,0x9E,0x44,0x47,0x49,0x53,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_078[] = { 0x40,0x44,0x79,0x71,0x9D,0x58,0xF0,0x8B,0x9A,0xD1,0x77,0x6C,0xFE,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x50,0xA3,0x42,0x55,0x23,0xF0,0x8D,0x7F,0x9D,0xFE,0xF5,0x8A,0xD1,0xF1,0x8B,0xF0,0x83,0x9A,0xD1,0xF1,0x8B,0xF6,0xF0,0x52,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0xF0,0x5B,0xA1,0x51,0xF0,0x5B,0x4C,0x53,0xFE,0x40,0x44,0x79,0x71,0x9D,0xF0,0x45,0xF0,0x52,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0x40,0x44,0x79,0x71,0x9D,0x01,0x5E,0x41,0xF0,0x52,0xFE,0x46,0x41,0x6A,0x79,0x71,0x9D,0x05,0x5E,0x41,0xF0,0x5B,0x6D,0xFE,0x53,0x52,0x62,0x96,0xD1,0x76,0x9F,0xF2,0xFE,0xF0,0x52,0x62,0x9E,0xF0,0x4B,0x45,0x6D,0xF0,0x45,0x4F,0x51,0x53,0xFE,0x46,0x43,0x52,0x4B,0x5E,0x42,0xFC,0xFC,0xF0,0x7A,0x9D,0x87,0x9D,0xFF }; +static const u8 dialog_text_DIALOG_079[] = { 0x41,0x52,0x52,0x52,0xF2,0xFE,0x59,0x54,0x4B,0x52,0x47,0x69,0x65,0x6E,0xFE,0x72,0xD1,0x76,0xD1,0x76,0x9F,0xF2,0xFE,0x80,0xD4,0xD1,0x83,0x45,0x66,0x45,0xA1,0x4F,0xFE,0xF0,0x4F,0x48,0x54,0x58,0x55,0xF2,0xFE,0x59,0x54,0x4B,0x52,0x47,0x69,0x4F,0x66,0x6F,0xFE,0x41,0x41,0x62,0x58,0x9E,0x40,0xF0,0x48,0x68,0x45,0x66,0x4A,0x6E,0xFE,0x87,0x9F,0x87,0x9F,0x9E,0x59,0x54,0x4B,0x52,0x47,0x69,0x65,0x6E,0xFE,0xFE,0x9E,0x9E,0x9E,0x59,0x54,0x4C,0x9E,0x9E,0x41,0x63,0xF0,0x4F,0xFF }; +static const u8 dialog_text_DIALOG_080[] = { 0x8C,0xD1,0x8C,0xD1,0x8C,0xD1,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_081[] = { 0x49,0x49,0x59,0x9E,0x5F,0xF0,0x4C,0x55,0x5F,0x50,0x4F,0x5E,0x50,0x6E,0xFE,0x49,0x58,0x5E,0x50,0x59,0x6F,0x40,0x54,0x4F,0xF0,0x45,0xFE,0x49,0x49,0x6C,0x9E,0x44,0x53,0xF0,0x4C,0x69,0x68,0x53,0x46,0x58,0xFE,0x4F,0x45,0x4A,0x53,0x6F,0x44,0x54,0xF0,0x4B,0xF0,0x4F,0x48,0x58,0xFE,0x5F,0xF0,0x4C,0x6C,0x62,0xA1,0x52,0xFE,0x40,0x54,0x4F,0x6C,0x60,0x45,0x43,0x68,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_082[] = { 0xF0,0x5D,0x42,0x4B,0x6C,0x9E,0x54,0x47,0x4C,0x53,0xFE,0xF0,0x7F,0x91,0x9F,0xF0,0x7B,0xF0,0x45,0x44,0x44,0x47,0x54,0x68,0x58,0xF0,0x52,0xFE,0xF0,0x4F,0x41,0xF0,0x4B,0x55,0x9E,0x4B,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x54,0x47,0x4B,0x4F,0x66,0x6F,0x54,0x47,0x4B,0x4F,0xFE,0x79,0x9F,0x7C,0xF0,0x52,0x9E,0x5F,0x51,0x45,0x67,0x5E,0x4C,0x6E,0xFE,0x70,0x70,0x9F,0xF0,0x53,0x42,0x4B,0x65,0x42,0xFC,0xFC,0xFC,0xFE,0xF1,0x8A,0x9F,0x80,0x5A,0x61,0x59,0x6F,0x75,0xF0,0x8C,0x55,0xFE,0x5A,0x46,0x49,0x5E,0x69,0x4F,0x9E,0x5E,0x5E,0xF0,0x4F,0x4B,0x6E,0xFE,0x59,0x63,0x47,0x9E,0x77,0xD1,0xF1,0x89,0x6C,0xFE,0x63,0xA1,0x51,0x48,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x43,0x58,0x5D,0x45,0x55,0x75,0xF0,0x8C,0x58,0x54,0x45,0x55,0x62,0xFE,0x92,0x9D,0x7C,0x7F,0x9F,0x58,0x9E,0x4D,0x45,0x41,0xF0,0x45,0xFE,0x40,0x67,0x5E,0x4C,0x6E,0x9E,0x9E,0x40,0xA1,0xF2,0x49,0x69,0xFE,0x62,0xA1,0x52,0x41,0xA1,0x52,0x9E,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x45,0x47,0x4B,0x52,0x9E,0x62,0xA1,0x52,0x5E,0x4B,0x4F,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_083[] = { 0x53,0x48,0x41,0xF0,0x45,0x53,0x52,0x62,0x9E,0x5C,0x6D,0xF0,0x52,0x4C,0x6E,0xFE,0x53,0x48,0x41,0x55,0x9E,0x59,0x41,0x68,0x53,0x46,0x6F,0xFE,0x54,0xF0,0x45,0x41,0x59,0x67,0x58,0x9E,0xF0,0x59,0x4B,0xA4,0x55,0xFE,0x50,0xA3,0x42,0x41,0x4B,0x52,0x47,0xF0,0x4F,0x4A,0x41,0xF2,0xFE,0x49,0x69,0x6F,0x53,0x67,0x62,0xF0,0x53,0x4B,0x5E,0x4B,0x4F,0x6E,0xFE,0x62,0xA1,0x52,0x41,0xA1,0x52,0x9E,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x45,0xA1,0x49,0x65,0x47,0xFE,0x42,0x48,0x53,0xA1,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x57,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_084[] = { 0x71,0x82,0x82,0x9E,0x66,0x6D,0xF0,0x5D,0x42,0x54,0x5A,0x53,0xF0,0x4F,0x6E,0xFE,0x49,0x58,0x7C,0x7F,0x9F,0x59,0x9E,0x77,0xD1,0xF1,0x89,0xA1,0x52,0xFE,0x93,0x81,0xF0,0x45,0x9E,0x47,0x69,0x4F,0x6D,0xF0,0x4F,0x65,0x6E,0xFE,0x40,0x6D,0x4F,0x58,0x62,0x58,0xF0,0x4F,0x9E,0x54,0x6D,0x52,0xFE,0x4B,0x66,0x54,0x45,0xA1,0x4F,0x65,0x6E,0xFE,0x45,0x43,0x4C,0xA1,0x52,0x6F,0x45,0x43,0x4C,0xA1,0x52,0xF0,0x59,0x6F,0xFE,0x45,0x43,0x4D,0xF0,0x59,0x9E,0x41,0x41,0x6D,0xF0,0x52,0x4B,0xA4,0x6E,0xFE,0x59,0x54,0x4B,0x52,0x47,0x69,0x4F,0x66,0xFE,0x7C,0x7F,0x9F,0xF0,0x47,0x66,0x41,0x9E,0x45,0x43,0x4C,0x45,0x66,0x6E,0xFE,0x8D,0x71,0xF2,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_085[] = { 0x49,0x58,0x9E,0x63,0x45,0x4F,0x45,0x66,0xFE,0x9E,0x9E,0xF0,0x5B,0xF0,0x4B,0x55,0xF0,0x52,0x66,0x69,0x4F,0x66,0xFE,0xFE,0xFC,0xFC,0xFC,0x73,0x96,0x71,0x6E,0xFC,0xFC,0xFF }; +static const u8 dialog_text_DIALOG_086[] = { 0x5E,0x6B,0x67,0x6C,0x77,0x98,0x77,0x98,0x5E,0x6B,0x68,0x53,0xFE,0x61,0x6C,0x5E,0x6B,0x4C,0x9E,0x93,0x81,0xF0,0x45,0x41,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_087[] = { 0x43,0x6D,0x53,0x51,0x45,0x66,0x9E,0x59,0x41,0x68,0x58,0x59,0xFE,0x7A,0x9D,0x7F,0xF0,0x4F,0x48,0xF0,0x52,0x59,0x40,0x67,0x5E,0x4D,0x6D,0x6E,0xFE,0x9E,0x9E,0xF0,0x49,0x43,0x6D,0x67,0xA4,0x54,0x47,0xFE,0x9E,0x9E,0x44,0x59,0x41,0x67,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x7C,0x88,0x9F,0x8E,0x9D,0x89,0x72,0x7C,0x44,0x9F,0x54,0x9F,0xFF }; +static const u8 dialog_text_DIALOG_088[] = { 0x9F,0x4A,0xF0,0x46,0xA4,0x42,0x97,0x8B,0x83,0xF0,0x4B,0xA4,0x42,0x9F,0xFE,0xFE,0x49,0x49,0x45,0x66,0x9E,0x44,0x67,0x68,0x5A,0x53,0x59,0xFE,0x5A,0xF0,0x4F,0x67,0x58,0xF0,0x5D,0x42,0x55,0x51,0x45,0x5E,0xA1,0x52,0x6F,0xFE,0x46,0x6C,0x51,0x48,0x52,0x9E,0x44,0x67,0x68,0x49,0x53,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_089[] = { 0xF0,0x53,0x50,0x66,0x58,0x5F,0x50,0x62,0x9E,0x76,0x78,0x9D,0xF2,0xFE,0x47,0x66,0x41,0x40,0x4B,0x62,0x53,0x55,0x80,0xD3,0x72,0x71,0x6E,0xFE,0x59,0xF0,0x59,0x53,0xF0,0x5A,0x9E,0xF0,0x52,0x46,0x54,0x41,0x5A,0x53,0x59,0xFE,0x5F,0xF0,0x46,0x58,0x5F,0x50,0x6C,0x9E,0x4C,0x4C,0x61,0x6E,0xFE,0x5F,0xF0,0x46,0xFC,0xFC,0x4A,0xF0,0x46,0xA4,0x42,0x97,0x8B,0x83,0xFE,0x9E,0x9E,0x9E,0x9E,0x78,0x90,0x97,0x61,0x41,0x6A,0xFE,0x5A,0xF0,0x4F,0x67,0xFC,0xFC,0x63,0x5F,0x58,0x44,0x44,0x40,0x54,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x50,0x52,0x41,0x49,0x9E,0x8C,0xFE,0x40,0x45,0x5E,0x68,0xFE,0x9E,0xFC,0xFC,0x02,0xF0,0x49,0x42,0x73,0x99,0xF0,0x8C,0x9F,0x7F,0x9F,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x50,0x52,0x41,0x49,0x9E,0x5C,0xFE,0x63,0xF0,0x4B,0x68,0x4B,0xFC,0xFC,0xF0,0x48,0x6D,0xF0,0x4A,0x41,0x50,0xFF }; +static const u8 dialog_text_DIALOG_090[] = { 0xF0,0x75,0x89,0x89,0xD1,0xF2,0xFE,0x9B,0x84,0x55,0x59,0x5E,0xA1,0x4F,0x54,0x8E,0x97,0x74,0xF2,0xFE,0x5E,0x4F,0x9E,0xF0,0x7B,0xD2,0x8E,0x6C,0x4B,0x55,0x46,0x4F,0xFE,0x65,0x42,0xF0,0x4F,0xF0,0x45,0x6F,0x53,0x62,0xF0,0x4F,0x50,0x45,0x66,0x58,0xFE,0x50,0xA3,0x42,0x49,0x47,0xF0,0x4F,0x6E,0xFE,0x40,0x4B,0x62,0x53,0x55,0x59,0x9E,0x46,0x6C,0x51,0x48,0x54,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_091[] = { 0x51,0x65,0x41,0x75,0xF0,0x7D,0x55,0x9E,0x80,0xD3,0x72,0x71,0xF2,0xFE,0xF0,0x52,0x62,0x6F,0x75,0xF0,0x7D,0x55,0x58,0x68,0x53,0xFE,0x8B,0x9B,0x8B,0x9B,0x46,0x62,0x50,0x41,0x41,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_092[] = { 0x41,0x41,0x45,0xF0,0x48,0x6D,0x55,0x4B,0x6A,0x8E,0x97,0x74,0xF2,0xFE,0x41,0x51,0x62,0x41,0x51,0x62,0x6F,0x6B,0xF0,0x45,0x59,0x41,0x58,0xFE,0xF0,0x7B,0xD2,0x8E,0x6C,0x4B,0x44,0xA1,0x52,0xF2,0xFE,0x4D,0xA1,0x45,0x47,0x9E,0x45,0x41,0xF0,0x5B,0x51,0x4F,0x50,0x53,0xFE,0x4F,0x58,0x4B,0x47,0x63,0xA1,0x52,0x41,0x68,0x58,0x55,0x6E,0xFE,0x7C,0x7F,0x9F,0x6C,0x45,0x43,0x4C,0x6D,0xF0,0x4F,0xF2,0xFE,0x75,0xF0,0x8C,0x58,0x54,0x45,0x58,0x93,0x81,0x66,0x55,0x59,0x6F,0xFE,0x4E,0x41,0x51,0xF0,0x45,0x9E,0x41,0x68,0x6D,0xF0,0x4F,0x65,0xF2,0xF2,0xFE,0xF0,0x75,0x89,0x89,0xD1,0xF2,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_093[] = { 0x70,0x96,0x96,0xF2,0x41,0x51,0x58,0x5E,0x55,0x46,0x4F,0xF4,0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0x90,0x90,0xFE,0xF0,0x53,0x50,0x66,0x55,0x4B,0x6A,0x9E,0x6B,0xF0,0x45,0x59,0x41,0x58,0xFE,0x5D,0x58,0x44,0x58,0x9E,0x43,0xF0,0x4B,0x46,0xF0,0x4F,0xA1,0xF2,0xFE,0xF0,0x53,0x69,0xF0,0x4F,0x48,0x7C,0x7F,0x9F,0x58,0x50,0x45,0x66,0x6C,0xFE,0x45,0x67,0x52,0x62,0x6F,0x6B,0xF0,0x45,0x59,0x41,0x55,0x59,0xFE,0x45,0x54,0x42,0x6B,0x48,0xF0,0x45,0x54,0x41,0x6B,0xF2,0xFE,0xF0,0x75,0x89,0x89,0xD1,0xF2,0xF2,0x9E,0x8E,0x97,0x74,0xF2,0xFE,0x76,0x7A,0x8E,0x58,0x9E,0x44,0x53,0x62,0xF0,0x4F,0x50,0x62,0xFE,0x5F,0x9F,0x6D,0x54,0x9E,0x75,0xF0,0x8C,0x58,0x54,0x45,0x4A,0x6E,0xFE,0xF1,0x8A,0x9F,0x80,0x50,0xA2,0x6D,0x62,0x9E,0x6B,0x4F,0x4A,0x6D,0xFE,0x62,0x6D,0x57,0xF2,0x9E,0x9E,0x41,0x47,0xF0,0x4E,0xF2,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_094[] = { 0x58,0xF0,0x5D,0x67,0x55,0x47,0x41,0x9E,0x4A,0x45,0x5F,0x50,0x59,0xFE,0xF0,0x4B,0xA4,0x4E,0x42,0x6C,0x51,0x48,0x52,0xFE,0xF0,0x48,0x6D,0x46,0x65,0x47,0x9E,0x58,0xF0,0x5D,0x68,0xF2,0xFE,0x59,0xF0,0x59,0x53,0xF0,0x5A,0x9E,0x44,0xF0,0x5D,0x43,0x52,0x68,0x45,0xF4,0xFE,0x59,0x4B,0x67,0x54,0xF0,0x45,0x66,0x9E,0x23,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0xFE,0x4B,0xA2,0xF0,0x45,0x6D,0xF0,0x52,0x9E,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF0,0x4F,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_095[] = { 0x49,0x58,0x65,0x42,0x55,0x9E,0x75,0x9D,0xF0,0x89,0x9D,0x58,0xFE,0x5E,0x43,0xF0,0x52,0x9E,0x0B,0xF0,0x8D,0x7F,0x9D,0x6C,0x44,0x4C,0x53,0xFE,0x65,0x60,0x49,0x53,0xF0,0x45,0xF0,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0x88,0x79,0x88,0x79,0x63,0x9E,0xF0,0x53,0x42,0xF0,0x5B,0x51,0x4F,0x50,0xFE,0x53,0x9E,0x59,0x54,0x4C,0x53,0x46,0x59,0x6F,0x5E,0x43,0x55,0xFE,0x4F,0x50,0xF0,0x53,0x5E,0xA1,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x49,0x58,0x79,0x9F,0x7C,0x55,0x40,0x68,0x77,0xD1,0xF1,0x89,0x55,0xFE,0x56,0x4C,0x5E,0x69,0x4F,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xFE,0x53,0x67,0x45,0x43,0x4B,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_096[] = { 0x49,0x58,0x40,0x4F,0x67,0x9E,0x5F,0x50,0x4D,0x5E,0x4B,0x6E,0xFE,0x64,0xA1,0x47,0x67,0x9E,0x40,0x68,0x49,0x42,0xF2,0xFE,0xF0,0x4F,0x69,0x62,0x9E,0x50,0xA4,0x42,0xF0,0x4B,0xA4,0x42,0x5E,0xF0,0x52,0xFE,0x4F,0xF0,0x53,0x67,0x51,0x45,0x4D,0x54,0x41,0x6E,0xFE,0x8B,0x8B,0x8B,0x6E,0xFE,0x46,0x62,0x50,0x65,0x47,0x57,0x52,0x41,0x68,0x5A,0x53,0x6C,0xFE,0x44,0x49,0x4C,0x53,0x6F,0x53,0xA1,0x52,0x62,0xFE,0x5B,0x46,0xF0,0x48,0x6D,0x55,0x9E,0x54,0x67,0x5E,0x4C,0x6E,0xFE,0x64,0xA1,0x47,0x67,0x53,0x9E,0x4B,0xF0,0x4C,0x45,0x55,0xFE,0x40,0x68,0x46,0x5E,0x4B,0xA4,0x42,0x6E,0x8B,0x8B,0x8B,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_097[] = { 0x4F,0x41,0x40,0x4F,0x67,0x9E,0x4A,0x69,0x4F,0x66,0xFE,0x4F,0x41,0x40,0x4F,0x67,0xF0,0x52,0x9E,0x45,0x43,0x4D,0xF2,0xFE,0x5D,0x58,0x44,0x58,0x42,0x5F,0x55,0x51,0x46,0x44,0x53,0x4C,0xFE,0x01,0x4F,0x41,0x01,0x58,0xF0,0x82,0x7C,0x8E,0xD1,0x80,0xF0,0x4F,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_098[] = { 0x49,0x49,0x5E,0xF0,0x52,0x44,0x41,0xF0,0x52,0xFC,0xFC,0xFC,0xFC,0xFE,0x78,0xD1,0x78,0xD1,0x78,0xFC,0xFC,0xFF }; +static const u8 dialog_text_DIALOG_099[] = { 0x77,0xD1,0x77,0xD1,0x77,0xFC,0xFC,0xFE,0x9E,0x53,0x67,0x51,0x41,0x52,0x63,0x68,0x6E,0xFE,0x9E,0x9E,0x9E,0x9E,0x8A,0xD1,0x8A,0xD1,0x8A,0xF2,0xFE,0x75,0xF0,0x8C,0x62,0x9E,0x53,0x44,0x67,0x56,0x48,0x52,0x63,0x68,0x6E,0xFE,0x49,0x6D,0x54,0x49,0x53,0x9E,0xF0,0x52,0x46,0x68,0x45,0xF4,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x78,0xD1,0x78,0xD1,0x78,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_100[] = { 0x72,0xD1,0x76,0xD1,0x76,0x9F,0xFE,0x9E,0x9B,0xD1,0x76,0xD1,0x76,0x9F,0xF2,0xFE,0x9E,0x9E,0x9E,0x8D,0x95,0x8D,0x95,0x6E,0xFE,0x41,0xA1,0x4F,0xF0,0x4F,0x46,0x9F,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_101[] = { 0x8C,0xD1,0x8C,0xD1,0x8C,0xD1,0xF2,0xFE,0x51,0x45,0x5E,0xA1,0x50,0xA2,0x41,0x5E,0x4B,0x4F,0x6E,0xFE,0x46,0x55,0x41,0xA1,0x52,0x4F,0x58,0x55,0x54,0x40,0xFC,0xFC,0xFE,0x45,0x43,0x4B,0x5E,0x4C,0x65,0x6E,0xFE,0x9E,0x72,0xD1,0x76,0xD1,0x76,0x9F,0xF2,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_102[] = { 0x82,0x99,0x7A,0x58,0x9E,0x4F,0x44,0x4B,0x45,0x4F,0xFE,0x44,0x4B,0x43,0x5E,0x4C,0x6E,0xFE,0x59,0xF0,0x4C,0x45,0x4B,0xF0,0x45,0x67,0x63,0x58,0xFE,0x82,0x99,0x7A,0xF0,0x52,0x4C,0x6E,0xFE,0xF5,0x61,0x53,0x61,0xF0,0x45,0x40,0x42,0xF6,0x53,0xFE,0x4C,0xF0,0x45,0x4F,0x6C,0x48,0x4B,0x5E,0x4C,0x6E,0xFE,0xF5,0x53,0x42,0x61,0x41,0x58,0x53,0x46,0xF6,0x59,0xFE,0x40,0x4F,0x67,0x5E,0x4D,0x6D,0x6E,0xFE,0xF5,0x4D,0x54,0x45,0x6C,0x60,0x48,0x68,0xF6,0x53,0xFE,0x40,0x66,0x6B,0x69,0x5E,0x4C,0x6E,0xFE,0x42,0x4B,0x6A,0x55,0x5E,0x6B,0xA1,0x52,0xFE,0x54,0xF0,0x47,0x68,0x53,0x9E,0x65,0x6B,0x41,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_103[] = { 0x04,0x5D,0x6D,0x58,0x9E,0x59,0x4B,0x66,0x58,0x42,0x43,0x55,0xFE,0x4F,0x51,0x62,0x58,0x55,0x6F,0x6B,0x4F,0x4B,0x59,0x6F,0xFE,0x49,0x58,0x63,0x45,0x4F,0x6C,0x9E,0x44,0x53,0xF0,0x4C,0x69,0x68,0xFE,0x4B,0x45,0x47,0x6C,0x9E,0x40,0x4F,0x43,0x65,0x42,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_104[] = { 0x61,0x58,0x5E,0x43,0x58,0xF0,0x8B,0x98,0x9F,0xF0,0x77,0x99,0x9F,0x58,0xFE,0x59,0x6D,0x53,0x42,0x61,0x41,0x58,0x9E,0x5D,0x4B,0x59,0xFE,0xF5,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x58,0xF0,0x4F,0x41,0xF6,0xF0,0x4F,0x6E,0xFE,0x40,0x45,0x79,0x71,0x9D,0x6C,0x9E,0x5F,0x51,0x48,0x52,0xFE,0x08,0x5E,0x41,0xF0,0x4D,0x6D,0xF0,0x5B,0x9E,0x40,0x51,0x61,0x68,0x53,0x6F,0xFE,0x7C,0x7F,0x9F,0xF0,0x45,0x9E,0x40,0x66,0x6B,0x69,0x68,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_105[] = { 0xF0,0x4B,0xA3,0x6D,0xF0,0x5A,0x9E,0x45,0x6D,0x67,0xA4,0x42,0xF2,0xFE,0x4E,0x49,0x58,0x9E,0x40,0x54,0x55,0xFE,0x59,0x41,0xA1,0x52,0x5F,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x04,0x51,0x58,0x4F,0x41,0x5D,0x42,0x6C,0x51,0x45,0xA1,0x52,0xFE,0x4E,0x66,0x58,0x4B,0x5E,0x55,0x40,0x68,0x7C,0x7F,0x9F,0x6C,0xFE,0x53,0x69,0x68,0x59,0xF0,0x4C,0xF0,0x52,0x4C,0x6E,0xFE,0x7C,0x82,0xD6,0xD1,0x77,0xF0,0x52,0x57,0x66,0x41,0x6C,0x51,0x48,0x6F,0xFE,0x0A,0xF0,0x52,0x59,0xA1,0x4B,0xA2,0xF2,0x53,0xF0,0x5A,0x54,0xF0,0x45,0x66,0xFE,0xF5,0x46,0xF6,0x55,0x62,0x9E,0x51,0x45,0x5E,0x69,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_106[] = { 0xF0,0x4B,0xA3,0x6D,0xF0,0x5A,0xF0,0x45,0xFE,0x45,0x6D,0x67,0xA4,0x42,0x9E,0x4B,0x5E,0x4B,0x4F,0xF2,0xFE,0x4E,0x69,0xF0,0x52,0x59,0x6F,0x44,0x46,0x6C,0x51,0x48,0x52,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_107[] = { 0x44,0xF0,0x59,0x48,0x59,0x9E,0x4B,0x9E,0x54,0x9E,0x54,0x9E,0x41,0xFE,0x78,0xD1,0x78,0xD1,0x78,0xFC,0xFC,0xFE,0xF0,0x5B,0xF0,0x4B,0x55,0x9E,0xF0,0x52,0x66,0x69,0x68,0x45,0x54,0xF4,0xFF }; +static const u8 dialog_text_DIALOG_108[] = { 0xF0,0x5D,0x65,0x65,0x9F,0x6D,0xFE,0x44,0x63,0x45,0x4F,0x58,0x9E,0x44,0xF0,0x52,0x5E,0x4B,0xF0,0x4F,0x6E,0xFE,0x75,0xD1,0x75,0xD1,0x75,0xFC,0xFC,0xFF }; +static const u8 dialog_text_DIALOG_109[] = { 0x75,0x96,0xF0,0x7F,0xF0,0x45,0x9E,0x53,0x48,0x50,0xA2,0xA1,0x4F,0x95,0x6E,0xFE,0x41,0x41,0x75,0x96,0xF0,0x7F,0x9E,0x41,0x54,0x41,0x45,0x54,0x9F,0xFE,0x54,0x55,0x45,0x9E,0x44,0x50,0x51,0x45,0x54,0x47,0x52,0x87,0x6E,0xFE,0x70,0x9F,0x9E,0x45,0x44,0xF0,0x45,0x51,0x61,0x4F,0x41,0x54,0x9F,0xFF }; +static const u8 dialog_text_DIALOG_110[] = { 0x4B,0xA4,0x42,0x66,0x41,0x9E,0x46,0xA1,0x53,0xFE,0x67,0xA1,0xF1,0x59,0x54,0x75,0x96,0xF0,0x7F,0x55,0x54,0x6A,0x42,0x53,0xFE,0x44,0x62,0xA1,0x52,0x5E,0x9F,0x4C,0xF2,0xFE,0x41,0x41,0x70,0x7F,0x8E,0x9E,0x41,0x54,0x41,0x45,0x54,0x9F,0xFE,0x62,0x4B,0x4B,0xA1,0x52,0x41,0x4F,0x66,0x9E,0x4E,0x49,0x5C,0xFE,0x51,0x69,0x52,0xA1,0x52,0x47,0x69,0x5E,0x4D,0x6D,0x45,0xF4,0xFE,0x5E,0x43,0x6C,0x9E,0x4C,0xF0,0x5C,0xA1,0x52,0x47,0x69,0x69,0xF0,0x59,0xFE,0x42,0x4B,0x6A,0x6C,0x51,0x41,0x52,0x41,0x46,0x5E,0x9F,0x4C,0x6E,0xFE,0x9E,0x95,0x9A,0x7B,0x77,0x9F,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_111[] = { 0x93,0xD1,0x97,0x9F,0xF2,0xFE,0x46,0xF0,0x5B,0x6D,0x7C,0xD1,0x76,0x97,0xF2,0x67,0xA1,0xF1,0x59,0x54,0xFE,0x75,0x96,0xF0,0x7F,0xF0,0x45,0x9E,0x5F,0x51,0x45,0xA1,0x4F,0xF2,0xFE,0x44,0x69,0x41,0x55,0x9E,0x49,0x69,0x40,0xF0,0x48,0x5E,0x4C,0xF2,0xFE,0x62,0xA1,0x52,0x41,0xA1,0x52,0x9E,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x53,0xA1,0x52,0x62,0x70,0xD1,0x7F,0x75,0x71,0xF0,0x52,0x4C,0x65,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_112[] = { 0x79,0x71,0x9D,0x41,0xA1,0xF1,0x59,0x41,0x40,0x51,0x61,0x65,0x42,0x6E,0xFE,0x50,0x45,0x66,0xF0,0x45,0x9E,0x45,0x41,0x5B,0x47,0x4C,0x68,0x6E,0xFE,0x43,0x58,0x54,0x45,0x58,0x01,0x05,0x79,0x9F,0x7C,0xF0,0x52,0x59,0xFE,0x46,0x6A,0x47,0x55,0x62,0x9E,0x58,0x49,0x68,0x65,0x6E,0xFE,0x40,0x45,0x41,0x89,0x9F,0x83,0x55,0x4A,0x6B,0xA1,0x52,0x62,0xFE,0x50,0x45,0x66,0xF0,0x45,0x9E,0x45,0x41,0x5B,0x47,0x4C,0x68,0x6E,0xFE,0x59,0x63,0x47,0x9E,0x45,0x48,0x56,0x48,0x68,0x5D,0xF0,0x53,0xFE,0x4F,0x47,0x4A,0x6D,0x9E,0x45,0x41,0x5B,0x47,0x4C,0x68,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_113[] = { 0x40,0x45,0xFC,0x40,0x44,0xFC,0x5F,0xF0,0x53,0x67,0x58,0xFE,0xF0,0x8B,0x9A,0xD1,0x77,0x55,0x59,0x9E,0x70,0x71,0x82,0x90,0x58,0xFE,0xF5,0xF0,0x5D,0x42,0x4B,0xF6,0xF0,0x45,0x9E,0x59,0x41,0xA1,0x52,0x68,0x6E,0xFE,0x44,0x4B,0x6A,0x58,0x9E,0xF0,0x53,0x49,0x45,0x55,0x40,0x68,0xFE,0x7C,0x71,0xD1,0x80,0x6C,0x9E,0x5B,0x6D,0xF0,0x52,0x47,0x68,0x53,0xFE,0x51,0x45,0x43,0x68,0x65,0x42,0x55,0x9E,0x54,0x67,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_114[] = { 0x40,0x40,0xF7,0x9E,0x46,0x55,0x41,0x66,0x57,0x43,0xF2,0xFE,0x44,0x69,0x4F,0x50,0x6F,0x41,0x4B,0x58,0x44,0x45,0xF0,0x48,0xF0,0x52,0xFE,0xF5,0x41,0x43,0xF6,0x62,0xF5,0x4B,0x6A,0xF6,0x62,0xFE,0xF0,0x52,0x46,0x52,0x68,0xA1,0x52,0x9F,0x58,0x55,0x6E,0xFE,0x41,0x51,0x62,0x9E,0x5B,0x5F,0x51,0x48,0x68,0xF0,0x59,0xA1,0x45,0xFE,0x67,0xF0,0x52,0x6F,0x9E,0x50,0xA1,0x4F,0x9F,0x40,0x67,0xF0,0x45,0x4F,0xFE,0xF0,0x45,0xA1,0x4F,0x66,0x9E,0xF0,0x53,0x42,0x54,0x6D,0xF0,0x52,0xA6,0xF2,0xFE,0x44,0x42,0x44,0x42,0xA1,0xF2,0xFE,0x44,0x41,0xF2,0x9E,0x4E,0x49,0x58,0x85,0x71,0x7A,0x9D,0xF2,0xFE,0x5B,0x66,0x5B,0x66,0x4B,0x52,0x6D,0xF0,0x4B,0xA2,0x57,0x9F,0x63,0x6E,0xFE,0x46,0xF0,0x48,0x6D,0xF0,0x45,0x9E,0x6B,0x68,0x41,0x6D,0xF0,0x52,0xA6,0xF2,0xFE,0x44,0x4B,0x51,0xF0,0x5B,0x4B,0x50,0x5E,0x42,0xF0,0x4E,0xA8,0xF2,0xF2,0xFE,0x62,0x6D,0x47,0xF0,0x45,0x9E,0x40,0x6D,0x54,0x66,0xFE,0x8A,0xD1,0xF1,0x8B,0xF0,0x83,0x9A,0xD1,0xF1,0x8B,0xF0,0x52,0x9E,0x49,0x58,0xFE,0xF0,0x89,0xD1,0x7F,0x9D,0x76,0x9D,0xF0,0x77,0x4A,0x5E,0x6C,0xFE,0x5B,0x5F,0x51,0x48,0x52,0x9E,0x5F,0x63,0xF0,0x45,0x69,0xA1,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_115[] = { 0x40,0x40,0x9E,0x47,0x63,0x4B,0x41,0xF0,0x4E,0xF2,0xFE,0x5E,0x4F,0x5E,0x4F,0xFE,0x5B,0x5F,0x51,0x48,0x66,0x69,0x50,0x5E,0xA1,0x4F,0xF2,0xFE,0x4B,0xA4,0x4D,0x6D,0x9E,0x41,0x4B,0x59,0xFE,0x9E,0x9E,0x9E,0x9E,0x41,0x4B,0x54,0x58,0x45,0xFC,0xFC,0xFC,0xFE,0x44,0x61,0xA0,0x58,0x9E,0x45,0x50,0xF0,0x52,0xA0,0xF2,0xFE,0x49,0x69,0x9E,0x62,0xA1,0x52,0x41,0x46,0x63,0xF0,0x45,0x69,0xF2,0xFE,0xF0,0x75,0x77,0xD1,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_116[] = { 0x44,0x44,0xA1,0xF2,0x41,0x52,0x52,0xF2,0x9E,0x5E,0x6B,0x67,0xFE,0x49,0x5F,0x58,0x59,0x63,0x4A,0x59,0x9E,0x5E,0xF0,0x4F,0x5E,0xF0,0x4F,0xFE,0xF0,0x4F,0xF0,0x45,0x6F,0x54,0x45,0x54,0x45,0x9E,0x51,0x65,0x41,0x54,0x6E,0xFE,0x44,0x5E,0x43,0x58,0x65,0x42,0x54,0x9E,0x48,0x66,0x41,0xF0,0x45,0xFE,0x5D,0x4B,0x45,0xA1,0x4F,0xF0,0x4E,0xFC,0xFC,0xFE,0x59,0xF0,0x4B,0x61,0x58,0x9E,0x63,0x47,0x4E,0x47,0xF0,0x53,0x44,0x67,0xFE,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0x63,0x6A,0x42,0x6E,0xFE,0x5E,0x4F,0x9E,0x9B,0x7B,0x55,0x40,0x41,0x4F,0x41,0x53,0x46,0xFE,0x49,0x58,0x7C,0x7F,0x9F,0x6C,0x91,0x85,0xD3,0x9F,0x45,0x66,0xFE,0x43,0x66,0xF0,0x5B,0xF0,0x45,0x65,0x41,0x6E,0x4A,0x66,0xF0,0x59,0xF0,0x4B,0xA2,0xFF }; +static const u8 dialog_text_DIALOG_117[] = { 0xF0,0x7B,0xD2,0xF0,0x7B,0xD2,0xF0,0x7B,0xD2,0x9F,0x9D,0xF2,0xFE,0xF0,0x53,0x42,0xF0,0x4F,0xF2,0xFE,0x44,0xF0,0x53,0x6A,0x41,0x4F,0x45,0xF4,0xF4,0xFC,0xFC,0xFC,0xFE,0x90,0x90,0xFC,0xFC,0xFC,0xFC,0x9E,0x54,0x66,0xF0,0x59,0xFE,0x62,0xA1,0x53,0x74,0xF0,0x83,0x9A,0x75,0x7D,0x82,0x63,0x68,0xF2,0xFE,0x71,0x77,0xF0,0x7E,0xF2,0x9E,0x75,0x75,0xD1,0x82,0x79,0x71,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_118[] = { 0x74,0x74,0x74,0xD1,0xFC,0xFC,0xFC,0xFE,0x74,0x8E,0x73,0x6F,0x41,0xF0,0x45,0x41,0x53,0x81,0x95,0x71,0xF2,0xFE,0x49,0x58,0x93,0x75,0x7F,0x59,0x6F,0x46,0xA4,0x42,0x45,0x66,0xFE,0x74,0x8E,0x73,0x58,0x62,0x58,0xF0,0x7F,0xD1,0xFC,0xFC,0xFE,0xF0,0x7B,0x94,0x72,0x85,0x51,0x45,0x73,0x6E,0xF0,0x75,0x77,0xD1,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_119[] = { 0xF0,0x77,0x72,0x72,0xD1,0xF2,0x9E,0x9E,0x50,0xA4,0xA1,0x53,0xFE,0x64,0xF0,0x4F,0x6D,0x9E,0x4B,0x52,0x44,0xA1,0x4F,0x6B,0xF2,0xFE,0x4D,0xA1,0x45,0x47,0x58,0x78,0x71,0x75,0x77,0xF0,0x45,0xFE,0xF0,0x5B,0x50,0x49,0x6B,0x4B,0xF0,0x4F,0xFC,0xFC,0xFC,0x4B,0x45,0x4B,0xFE,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x62,0xF1,0x8A,0x9F,0x80,0x62,0xFE,0x6B,0xF0,0x45,0x59,0x41,0x58,0x9E,0x52,0x58,0x54,0x45,0x55,0xFE,0x40,0x68,0x58,0xF0,0x4F,0x6E,0xF0,0x75,0x89,0x89,0x89,0xF2,0xFE,0x5E,0xF0,0x4F,0x5E,0xF0,0x4F,0x9E,0x5E,0x48,0x52,0x59,0x44,0x66,0x6D,0x6E,0xFE,0x49,0x69,0x41,0xF0,0x4B,0xA4,0x42,0x7C,0x7F,0x9F,0x59,0xFE,0x6B,0x4F,0x4A,0x6D,0xF0,0x4E,0x6E,0x46,0xA4,0x42,0x59,0x49,0x49,0xFE,0x66,0xF0,0x52,0x9E,0x45,0x6D,0xF0,0x5C,0x6D,0x4B,0x52,0x63,0x68,0xF2,0xFE,0x44,0x44,0xA8,0x6F,0x44,0xF0,0x5D,0x43,0x52,0x6A,0x65,0xF2,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_120[] = { 0xF0,0x77,0xF0,0x77,0xF0,0x77,0xD1,0x9B,0xD1,0xF2,0xFE,0x49,0x42,0x62,0x9E,0x45,0x6D,0x4F,0x6D,0x55,0xFE,0x63,0x66,0x69,0x68,0x53,0x59,0x6F,0x7C,0x7F,0x9F,0x58,0xFE,0x50,0x45,0x66,0xF0,0x45,0x9E,0x4F,0x67,0x6D,0x58,0x45,0x54,0xF4,0xFE,0x6B,0xF0,0x45,0x59,0x41,0xF0,0x45,0xF0,0x7D,0xD1,0x79,0x9F,0x80,0xD4,0x9F,0xFE,0x58,0x53,0x46,0x54,0x66,0x6F,0x76,0x7A,0x8E,0x54,0x6D,0x45,0xFE,0x52,0x46,0xF0,0x52,0x59,0x54,0x41,0x6E,0xFE,0x49,0x6D,0x45,0x41,0x59,0x9E,0x5A,0x46,0x6B,0x48,0xF0,0x4F,0xA1,0xFE,0xF1,0x8A,0x9F,0x80,0x55,0x9E,0x40,0x41,0x4F,0x48,0x69,0xF0,0x59,0x6F,0xFE,0x53,0x42,0x58,0x52,0xA1,0xF1,0x5C,0x6D,0x5E,0xF0,0x52,0xFE,0x58,0xF0,0x5D,0xA1,0x52,0x46,0x52,0x5F,0x6A,0x6E,0xFE,0x5E,0xA1,0x52,0x68,0xF0,0x4E,0xF2,0xF0,0x75,0x89,0x89,0xD1,0xF2,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_121[] = { 0x40,0x40,0x40,0xA1,0xFC,0xFC,0x5E,0x4F,0x49,0x6D,0xF0,0x53,0x62,0xFE,0x76,0x7A,0x8E,0x58,0x45,0x50,0x45,0x9E,0x8E,0x97,0x74,0xF2,0xFE,0x76,0x7A,0x8E,0x59,0x54,0x6F,0x6B,0xF0,0x45,0x59,0x41,0xF0,0x45,0xFE,0x4D,0x45,0x41,0xF0,0x52,0x9E,0x41,0x9F,0x50,0xF0,0x59,0x6D,0xFE,0x5E,0x48,0x4F,0x47,0x54,0x41,0x93,0x81,0x54,0x58,0x55,0xF2,0xFE,0x4D,0xA1,0x45,0x47,0x9E,0x54,0x45,0x5E,0x55,0x4B,0x4F,0xFE,0x92,0x9D,0x7C,0x7F,0x9F,0x4F,0x50,0x58,0x50,0x45,0x66,0x62,0xFE,0x54,0x47,0x54,0x67,0x9E,0x49,0x58,0x5E,0x5E,0xF0,0x52,0x59,0xFE,0x5E,0x4F,0x5E,0x4F,0x6F,0x6B,0xF0,0x45,0x59,0x41,0x58,0xFE,0xF0,0x4F,0x9F,0x41,0x46,0x66,0x41,0x54,0xFE,0x5C,0x41,0x6B,0xF0,0x45,0x9E,0x62,0xF0,0x53,0xA1,0x52,0x4B,0x5E,0x42,0xFE,0xF0,0x52,0x59,0x54,0x41,0x45,0xF2,0x9E,0xFE,0x90,0x90,0x90,0xD1,0xFC,0xFC,0xFC,0xFC,0xFE,0x4B,0x45,0x4B,0x6F,0x49,0x58,0xF0,0x78,0x9F,0x90,0x59,0xFE,0x5E,0xF0,0x4F,0x5E,0xF0,0x4F,0x9E,0x44,0x6B,0x66,0x6D,0xF0,0x4E,0x6E,0xFE,0x5F,0x6D,0x54,0xF0,0x52,0x9E,0x40,0x51,0x5E,0xA1,0x52,0x6F,0xFE,0x54,0x45,0x65,0x47,0x73,0x9D,0xF0,0x82,0xD6,0x9D,0xF0,0x77,0xF0,0x52,0x62,0xFE,0x5F,0x68,0x6D,0xF0,0x4F,0x54,0xF2,0xFE,0xFE,0xF0,0x75,0x89,0x89,0x89,0xD1,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_122[] = { 0x9F,0x63,0x5F,0x55,0x53,0x48,0x68,0x44,0x44,0x40,0x54,0x9F,0xFE,0xFE,0x5F,0xF0,0x46,0xFC,0xFC,0xFC,0x4A,0xF0,0x46,0xA4,0x42,0x97,0x8B,0x83,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x78,0x90,0x97,0x61,0x41,0x6A,0xFE,0x5A,0xF0,0x4F,0x67,0xFC,0xFC,0x50,0x52,0x41,0x49,0xFF }; +static const u8 dialog_text_DIALOG_123[] = { 0x9E,0x9F,0x91,0x7F,0x98,0x58,0xF0,0x53,0x42,0x47,0x51,0x9F,0xFE,0xFE,0x5F,0xF0,0x46,0xFC,0xFC,0xFC,0x50,0xF0,0x4B,0xA4,0x42,0x5C,0xFE,0x5A,0xF0,0x4F,0x67,0xFC,0xFC,0x91,0x7F,0x98,0x7C,0x71,0xD1,0x80,0xFF }; +static const u8 dialog_text_DIALOG_124[] = { 0x9F,0x4A,0xF0,0x46,0xA4,0x42,0x65,0x42,0x97,0x8B,0x83,0x9F,0xFE,0xFE,0x9E,0x9E,0x9E,0x76,0x78,0x9D,0xF2,0xF2,0xFE,0x9E,0x4E,0x42,0x4A,0x5D,0x42,0x5D,0x42,0x6C,0xFE,0x9E,0x65,0x47,0x9E,0x65,0x60,0x49,0x53,0x6E,0xFE,0x5B,0x6D,0xF0,0x4F,0x6F,0x63,0xF0,0x4B,0x68,0x4B,0x58,0x5D,0x42,0x55,0xFE,0x4C,0x4C,0x5F,0x51,0xF0,0x51,0x48,0x5E,0x4C,0x6E,0xFE,0xFE,0x44,0x67,0x68,0x53,0x9E,0x62,0x53,0x58,0xF0,0x59,0x4B,0xA4,0x55,0xFE,0x62,0xF0,0x53,0x67,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_125[] = { 0x9F,0x78,0x90,0x97,0x61,0x41,0x6A,0xFC,0xF0,0x52,0xF0,0x47,0x50,0x9F,0xFE,0xFE,0x76,0x78,0x9D,0xF2,0x9E,0x8C,0x71,0x7A,0x50,0xA3,0x42,0x6E,0xFE,0x49,0x49,0x45,0x66,0x59,0x9E,0x59,0x41,0x69,0x5E,0x4D,0x6D,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_126[] = { 0xFC,0x01,0xF0,0x49,0x42,0x73,0x99,0xF0,0x8C,0x9F,0x7F,0x9F,0xFC,0xFE,0xFE,0x42,0x43,0xFC,0xFC,0x63,0x5F,0x58,0x44,0x44,0x40,0x54,0xFE,0x5F,0xF0,0x46,0xFC,0xFC,0x4A,0xF0,0x46,0xA4,0x42,0x97,0x8B,0x83,0xFE,0x9E,0x9E,0x9E,0x9E,0x78,0x90,0x97,0x61,0x41,0x6A,0xFF }; +static const u8 dialog_text_DIALOG_127[] = { 0x9E,0x9E,0x9F,0x50,0x52,0x41,0x49,0x9F,0xFE,0xFE,0x5F,0xF0,0x46,0xFC,0xFC,0x91,0x7F,0x98,0x58,0xF0,0x53,0x42,0x47,0x51,0xFE,0x5A,0xF0,0x4F,0x67,0xFC,0xFC,0x59,0x41,0x49,0x42,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x5C,0x41,0x4A,0x50,0xA3,0x42,0xFE,0x44,0x53,0x54,0x4B,0x41,0x9E,0x45,0x41,0x67,0xA3,0x42,0xFE,0xF0,0x83,0xD1,0x7B,0x9F,0xF0,0x45,0x9E,0x4C,0x6D,0xF0,0x52,0x5E,0x4C,0xFE,0x4D,0x54,0x45,0xF0,0x52,0x8A,0xD1,0xF1,0x8B,0xF0,0x83,0x9A,0xD1,0xF1,0x8B,0x6C,0xFE,0x4C,0x68,0x53,0x6F,0x40,0x4F,0x5E,0x6C,0x4A,0xF0,0x48,0x5E,0x4C,0x6E,0xFE,0x73,0x7A,0x55,0x54,0x66,0x54,0x41,0xF0,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_128[] = { 0x44,0xA1,0x53,0xA1,0x53,0xF2,0xF0,0x4B,0xA4,0x42,0xF0,0x45,0x41,0x55,0xFE,0x54,0xF0,0x48,0x68,0x58,0x59,0x9E,0x59,0x6D,0x4E,0x47,0xF0,0x4F,0xF2,0xFE,0x97,0x9D,0xF0,0x77,0x58,0x42,0x43,0xF0,0x52,0x8B,0xD0,0x70,0x9F,0x55,0xFE,0x4F,0x4F,0x45,0x44,0x42,0xF0,0x52,0x59,0x9E,0x54,0x41,0x45,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_129[] = { 0x53,0x42,0x61,0x41,0x7C,0x71,0xD1,0x80,0x58,0xFE,0x9E,0x9E,0x79,0x9F,0x7C,0x5C,0x9E,0x65,0x42,0x49,0x4E,0xF2,0xFE,0x40,0x44,0x41,0x7C,0x71,0xD1,0x80,0x6C,0x9E,0x5B,0x60,0x53,0xFE,0x4C,0xF0,0x5C,0x52,0x58,0x9E,0x40,0x44,0xF0,0x8B,0x9A,0xD1,0x77,0xF0,0x45,0xFE,0xF5,0xF0,0x4B,0xA1,0x4F,0x41,0xF6,0x55,0x54,0x68,0x6E,0xFE,0x53,0x42,0x61,0x41,0xF0,0x5D,0x42,0x4B,0xF0,0x52,0xFE,0x53,0x42,0x61,0x41,0x55,0x9E,0x54,0x68,0x53,0xFE,0x41,0x6A,0x6D,0x54,0x9E,0x62,0x58,0x6C,0xFE,0x53,0x44,0x67,0x56,0x48,0x66,0x69,0x5E,0x4C,0x6E,0xFE,0x5E,0xF0,0x4C,0x59,0x9E,0x44,0x4F,0x61,0x4B,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_130[] = { 0x91,0x7F,0x98,0x58,0x7C,0x71,0xD1,0x80,0x58,0xFE,0x9E,0x9E,0x79,0x9F,0x7C,0x8C,0x9E,0x65,0x42,0x49,0x4E,0xF2,0xFE,0x5F,0xF0,0x53,0x67,0x58,0x7C,0x71,0xD1,0x80,0x6C,0xFE,0x5B,0x61,0xF0,0x59,0x9E,0x5F,0xF0,0x53,0x67,0xF0,0x8B,0x9A,0xD1,0x77,0xF0,0x45,0xFE,0xF5,0xF0,0x4B,0xA1,0x4F,0x41,0xF6,0x55,0x54,0x68,0x6E,0xFE,0x91,0x7F,0x98,0x58,0xF0,0x5D,0x42,0x4B,0xF0,0x52,0xFE,0x91,0x7F,0x98,0x55,0x54,0x69,0xF0,0x59,0x6F,0xFE,0x5F,0xF0,0x4C,0x58,0x54,0x45,0xF0,0x52,0x62,0xFE,0x40,0x68,0x48,0x52,0x4B,0x5E,0x42,0x6E,0xFE,0x5E,0xF0,0x4C,0x59,0x9E,0x44,0x4F,0x61,0x4B,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_131[] = { 0x59,0x57,0x58,0x7C,0x71,0xD1,0x80,0x58,0xFE,0x9E,0x9E,0x79,0x9F,0x7C,0x8C,0x9E,0x65,0x42,0x49,0x4E,0xF2,0xFE,0x55,0xF0,0x4B,0x58,0x97,0x9D,0xF0,0x77,0x58,0x5E,0x6D,0x54,0x45,0x58,0xFE,0x53,0x42,0x58,0x9E,0x42,0x43,0x55,0x40,0x68,0xFE,0x40,0x45,0x41,0x7C,0x71,0xD1,0x80,0x6C,0x9E,0x5B,0x62,0x42,0x6E,0xFE,0x49,0x58,0x4D,0x45,0x41,0x58,0x9E,0x4C,0xF0,0x5C,0x52,0x58,0xFE,0x40,0x45,0x41,0xF0,0x8B,0x9A,0xD1,0x77,0xF0,0x45,0xFE,0xF5,0xF0,0x4B,0xA1,0x4F,0x41,0xF6,0x55,0x54,0x68,0x6E,0xFE,0x03,0xF0,0x4F,0x6D,0x53,0xF0,0x5A,0xF0,0x52,0x9E,0x4E,0x66,0x5C,0x53,0xF0,0x5A,0x6F,0xFE,0x23,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0x9E,0x96,0x9D,0xF0,0x82,0xD6,0x9D,0xF0,0x77,0x6E,0xFE,0x4E,0x42,0x4A,0x59,0x9E,0x5A,0x49,0x42,0x46,0x58,0xFE,0x4E,0x42,0xF0,0x4B,0xA3,0x42,0x45,0x6D,0x9E,0x58,0x65,0x42,0x55,0xFE,0x5E,0x43,0x55,0x4F,0x44,0x4C,0x53,0xF5,0x4A,0xF0,0x45,0x68,0xF6,0xFE,0x52,0x5E,0x43,0x55,0x5A,0x47,0x53,0xF5,0x40,0xF0,0x45,0x68,0xF6,0xFE,0x5E,0xF0,0x4C,0x59,0x9E,0x44,0x4F,0x61,0x4B,0x6C,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_132[] = { 0xF0,0x7F,0x91,0xF0,0x7F,0x91,0xF2,0xFE,0x4E,0x69,0x59,0x9E,0x46,0x52,0x41,0x41,0x59,0x6D,0xF0,0x52,0x4C,0x6E,0xFE,0xF5,0x4B,0xA1,0x45,0x9F,0x47,0xF2,0xF6,0xFE,0x49,0x6D,0xF0,0x53,0x59,0x8B,0xD0,0x70,0x9F,0x55,0xFE,0x41,0x46,0x5E,0x4B,0xA4,0x42,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_133[] = { 0x40,0x40,0x65,0x45,0xA1,0x4F,0x6E,0xFE,0x46,0x52,0x47,0x69,0x4F,0x6D,0xF0,0x52,0x4C,0x57,0xF2,0xFE,0xF1,0x8A,0x9F,0x80,0x5A,0x61,0x62,0x9E,0xF0,0x5D,0x47,0x4F,0x50,0x62,0xFE,0x5F,0x6D,0x54,0xF5,0x75,0xF0,0x8C,0xF6,0x58,0x54,0x45,0x55,0xFE,0x53,0xF0,0x4B,0x49,0x61,0x66,0x69,0x50,0xA2,0x41,0x5E,0x4B,0x4F,0x6E,0xFE,0x77,0xD1,0xF1,0x89,0x59,0x9E,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xFE,0x51,0x45,0xA1,0x52,0xF5,0x75,0xF0,0x8C,0xF6,0x63,0xF5,0x43,0xF6,0xFE,0x58,0x54,0x45,0x55,0x75,0x71,0xF0,0x8B,0x81,0x58,0x47,0x55,0x6C,0xFE,0x51,0x47,0x6A,0x42,0x53,0x9E,0x4B,0x52,0x41,0x5E,0x4C,0x6E,0xFE,0x7C,0x7F,0x9F,0x6C,0x53,0x67,0x45,0x43,0x4B,0x52,0xF2,0xFE,0xF5,0x7C,0x7F,0x9F,0xF6,0x6C,0x41,0x47,0x51,0x45,0xFE,0x53,0x67,0x45,0x43,0x4B,0x4F,0x66,0x6F,0x77,0xD1,0xF1,0x89,0x58,0xFE,0x53,0xF0,0x4B,0x4F,0xF0,0x83,0x70,0xF0,0x45,0x9E,0x5A,0x66,0x46,0x5E,0x4C,0x6E,0xFE,0x01,0x45,0x41,0x58,0x9E,0x04,0x51,0x58,0x5C,0x63,0x6C,0xFE,0x4A,0xF0,0x45,0x4B,0x6F,0x4C,0x4C,0x6D,0xF0,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x5E,0xF0,0x4C,0x59,0x6F,0x8A,0xF0,0x7F,0x97,0xF0,0x45,0x6B,0x58,0xFE,0xF0,0x8D,0x90,0x5C,0x41,0x58,0xF5,0x43,0xF6,0x58,0xFE,0x5C,0x63,0x55,0x9E,0x59,0x41,0x69,0x5E,0x4C,0x6E,0xFE,0x49,0x58,0x5C,0x63,0xF0,0x4F,0x48,0x59,0x9E,0x77,0xD1,0xF1,0x89,0x58,0xFE,0x5B,0x42,0x41,0x6D,0x6C,0x9E,0x58,0xF0,0x45,0x69,0x5E,0x4B,0x4F,0x6E,0xFE,0x08,0x5E,0x41,0x9E,0x4F,0x5E,0xA1,0x4F,0x66,0xFE,0x44,0x44,0x46,0x54,0x9E,0x5D,0x4B,0x58,0xF0,0x83,0x70,0x6C,0xFE,0x5A,0x66,0x47,0x49,0x53,0xF0,0x45,0x9E,0xF0,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0x46,0xA1,0x53,0x9E,0xF1,0x8A,0x9F,0x80,0x5A,0x61,0x59,0xFE,0x4E,0x58,0x54,0x45,0xF0,0x52,0x4C,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_134[] = { 0x79,0x9F,0x7C,0x58,0x59,0xF0,0x4B,0x61,0x55,0x43,0x66,0xF0,0x5C,0x68,0xFE,0x7C,0x7F,0x9F,0x58,0x54,0x5E,0x43,0x59,0x6F,0xFE,0x51,0xF0,0x46,0x55,0x9E,0x5F,0x51,0x48,0x66,0x69,0x4E,0x42,0x54,0xFE,0x7C,0x7F,0x9F,0x58,0x8A,0x9D,0x83,0xF0,0x52,0x4C,0x6E,0xFE,0x8A,0x9D,0x83,0x55,0xF0,0x52,0x52,0x47,0x68,0xFE,0xF0,0x4B,0xA3,0x6D,0xF0,0x59,0x6D,0x53,0x6F,0x50,0xF0,0x45,0x42,0xFE,0x7C,0x7F,0x9F,0x6C,0x9E,0x53,0x67,0x62,0xF0,0x53,0x4B,0x52,0x62,0xFE,0x45,0x5E,0x6B,0x54,0x41,0xF0,0x52,0x4C,0x65,0x6E,0xFE,0xF5,0x7C,0x7F,0x9F,0xF6,0x63,0xF5,0x52,0x46,0xF6,0x63,0xFE,0xF5,0x70,0x71,0x82,0x90,0xF6,0x58,0x54,0x45,0x55,0x59,0xFE,0x4E,0x58,0x7C,0x7F,0x9F,0x6C,0x43,0x66,0xF0,0x59,0x54,0x41,0x53,0xFE,0xF0,0x52,0x54,0x41,0x62,0x58,0x62,0x9E,0x40,0x67,0x5E,0x4C,0x6E,0xFE,0x41,0x47,0x51,0x45,0x9E,0x53,0x67,0x45,0x43,0x4B,0x4F,0x66,0xFE,0x51,0xF0,0x46,0x58,0x79,0x9F,0x7C,0x58,0xF0,0x83,0x70,0x5C,0x53,0xFE,0x4C,0x4C,0x6D,0xF0,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0x5F,0x6D,0x54,0xFE,0x4F,0x4C,0x48,0x6C,0x9E,0x5E,0xA1,0x52,0x41,0x5E,0x4C,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_135[] = { 0x77,0xD1,0xF1,0x89,0xF0,0x45,0x7C,0x7F,0x9F,0x6C,0x62,0xA1,0x52,0xFE,0x41,0xA1,0x50,0xA2,0x41,0x5E,0x4B,0x4F,0x6E,0xFE,0x49,0x49,0x55,0x45,0x47,0x69,0x52,0x5F,0x52,0x5E,0x4B,0x4F,0x6E,0xFE,0x7C,0x7F,0x9F,0x59,0x5A,0x53,0x51,0x58,0x79,0x9F,0x7C,0x55,0xFE,0x06,0x49,0x40,0x68,0x59,0xF0,0x4C,0xF0,0x52,0x4C,0x6E,0xFE,0xF0,0x52,0x62,0x9E,0x70,0x71,0x82,0x90,0x7C,0x71,0xD1,0x80,0x6C,0xFE,0xF0,0x4D,0x6D,0xF0,0x5B,0x44,0x4B,0x52,0x45,0x66,0xF0,0x52,0x54,0x41,0x53,0xFE,0x53,0x69,0x54,0x41,0x7C,0x7F,0x9F,0x62,0x40,0x67,0x5E,0x4C,0x6E,0xFE,0xF0,0x53,0x6D,0xF0,0x53,0x6D,0x9E,0x4A,0x46,0x58,0x79,0x9F,0x7C,0x5C,0xFE,0x4C,0x4C,0x6D,0xF0,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x7C,0x7F,0x9F,0x83,0xF0,0x45,0x61,0x6D,0xF0,0x52,0x7C,0x7F,0x9F,0x58,0xFE,0x54,0x5E,0x43,0xF0,0x45,0x9E,0x5F,0x66,0x69,0x5E,0x4C,0x6E,0xFE,0x60,0x45,0x4B,0x58,0x52,0x46,0x55,0x9E,0x40,0x41,0x4F,0x41,0xFE,0x53,0x46,0x6F,0x4E,0x58,0x5D,0x4B,0x6C,0x43,0x66,0xF0,0x5B,0x53,0xFE,0x5E,0x4F,0x40,0x43,0x68,0x9E,0x52,0x46,0x62,0x41,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_136[] = { 0x9B,0xD5,0x4C,0xF0,0x49,0x41,0xF2,0x62,0x42,0x4E,0x6D,0x54,0x55,0xFE,0x7C,0x7F,0x9F,0x6C,0x62,0xA1,0x52,0x68,0x6D,0xF0,0x52,0x4C,0x57,0x6E,0xFE,0x62,0x42,0x4C,0xF0,0x47,0x9E,0xF0,0x5D,0x47,0x66,0x58,0x49,0x53,0x62,0xFE,0x4F,0x4C,0x48,0xF0,0x4F,0x4B,0x52,0x47,0x69,0x5E,0x4C,0x57,0xF2,0xFE,0x77,0xD1,0xF1,0x89,0x4F,0x50,0x59,0x9E,0x5A,0xA1,0x4B,0xF0,0x52,0x4C,0x6E,0xFE,0x46,0x6C,0x51,0x48,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x79,0x71,0x9D,0x6C,0x53,0x68,0x53,0x9E,0x50,0x45,0x66,0xF0,0x45,0xFE,0x45,0x41,0x5B,0x47,0x4B,0x5E,0x4C,0x6E,0xFE,0x40,0x45,0x79,0x71,0x9D,0x59,0x02,0x5E,0x41,0xF0,0x5B,0x6D,0x6E,0xFE,0x40,0x44,0x79,0x71,0x9D,0x59,0x05,0x5E,0x41,0xF0,0x5B,0x6D,0x6E,0xFE,0x40,0x44,0x79,0x71,0x9D,0x58,0xF0,0x8B,0x9A,0xD1,0x77,0x6C,0xFE,0x49,0x6B,0x4C,0x53,0x9E,0xF0,0x52,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0x4F,0x45,0x41,0x53,0x49,0x6A,0x45,0x66,0x44,0x50,0x52,0x62,0xFE,0x50,0xF0,0x4B,0xA4,0x42,0x58,0x9E,0x50,0x45,0x47,0xF0,0x52,0xFE,0xF5,0x8A,0xD1,0xF1,0x8B,0xF0,0x83,0x9A,0xD1,0xF1,0x8B,0xF6,0x4C,0x68,0x53,0xFE,0xF0,0x7F,0x91,0x9F,0xF0,0x7B,0x6C,0x9E,0x5B,0x4D,0xF0,0x48,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_137[] = { 0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0xF0,0x45,0x9E,0x62,0xF0,0x53,0xA1,0x52,0x6F,0xFE,0x44,0x4B,0x6A,0x58,0x50,0x45,0x66,0xF0,0x45,0xFE,0x45,0x41,0x5B,0x47,0x9E,0x4B,0x52,0x46,0x5E,0x4B,0x4F,0xF2,0xFE,0x40,0x67,0xF0,0x45,0x53,0x42,0x6E,0x9E,0x77,0xD1,0xF1,0x89,0x59,0xFE,0x49,0x58,0x4A,0x46,0x55,0x9E,0x55,0xF0,0x48,0x5E,0x4B,0x4F,0x6E,0xFE,0x4E,0x42,0xF0,0x4F,0xF2,0x79,0x71,0x9D,0x6C,0x40,0x51,0x61,0x52,0xFE,0x5E,0x4C,0x45,0xF4,0x01,0x05,0x58,0x79,0x9F,0x7C,0xF0,0x52,0x59,0xFE,0x79,0x71,0x9D,0x01,0x00,0x00,0x5E,0x41,0x9E,0x53,0x68,0x53,0xFE,0x7C,0xF1,0x8C,0x7B,0xD2,0x98,0x7C,0x7F,0x9F,0xF0,0x45,0xFE,0x40,0x66,0x6B,0x69,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_138[] = { 0xFC,0x02,0xF0,0x49,0x42,0x73,0x99,0xF0,0x8C,0x9F,0x7F,0x9F,0xFC,0xFE,0x4B,0x4F,0xFC,0xFC,0x50,0x52,0x41,0x49,0xFE,0x5A,0xF0,0x4F,0x67,0xFC,0xFC,0x63,0x5F,0x58,0x44,0x44,0x40,0x54,0xFE,0x5F,0xF0,0x46,0xFC,0xFC,0xFC,0x78,0x90,0x97,0x61,0x41,0x6A,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x5C,0x41,0x4A,0x50,0xA3,0x42,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_139[] = { 0x49,0x58,0x42,0x43,0xFC,0xFC,0xF0,0x4B,0xF0,0x53,0x42,0x97,0x8B,0x83,0xFE,0xF0,0x4B,0xF0,0x53,0x42,0x97,0x8B,0x83,0x59,0x9E,0x58,0x68,0x53,0xFE,0xF0,0x4B,0xF0,0x53,0x42,0x52,0x46,0x55,0x9E,0x42,0xF0,0x49,0x46,0xF0,0x4F,0x4B,0x6F,0xFE,0x79,0x9F,0x7C,0x55,0x4E,0xA1,0x52,0x4C,0x4C,0x5F,0x5E,0x4C,0x6E,0xFE,0x44,0x67,0x52,0x9E,0x5D,0x42,0xA1,0x52,0x44,0x47,0x53,0xFE,0x46,0x43,0x52,0x4B,0x5E,0x41,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_140[] = { 0x9F,0x4E,0x42,0x4A,0x97,0x8B,0x83,0xF0,0x4B,0xA4,0x42,0x9F,0xFE,0x5F,0xF0,0x46,0xFC,0xFC,0xFC,0x78,0x90,0x97,0x61,0x41,0x6A,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x41,0x67,0xF0,0x47,0x50,0xFE,0x5A,0xF0,0x4F,0x67,0xFC,0xFC,0x63,0x5F,0x58,0x44,0x44,0x40,0x54,0xFE,0x9E,0x9E,0x01,0xF0,0x49,0x42,0x73,0x99,0xF0,0x8C,0x9F,0x7F,0x9F,0x5C,0xFE,0x63,0xF0,0x4B,0x68,0x4B,0xFC,0xFC,0xF0,0x48,0x6D,0xF0,0x4A,0x41,0x50,0xFF }; +static const u8 dialog_text_DIALOG_141[] = { 0x56,0x4C,0x5E,0x69,0x4F,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xFE,0x53,0x67,0x45,0x43,0x4B,0x4F,0xF2,0xFE,0x77,0xD1,0xF1,0x89,0xF0,0x45,0x9E,0x53,0xF0,0x4B,0x52,0x4B,0x5E,0xA1,0x4F,0xFE,0xF0,0x83,0x70,0x6C,0x9E,0x40,0x48,0x66,0x69,0x68,0x65,0x42,0x55,0xFE,0x54,0xA1,0x4F,0xF0,0x4E,0xF2,0xFE,0x02,0x45,0x41,0x58,0x9E,0xF1,0x8A,0x9F,0x80,0x58,0x5C,0x63,0x6F,0xFE,0x01,0x45,0x41,0x58,0x9E,0x53,0x67,0xF0,0x52,0x58,0x5C,0x63,0x6F,0xFE,0x02,0x51,0x58,0x5C,0x63,0x58,0xF0,0x83,0x70,0xF0,0x45,0x5A,0x66,0x47,0x6E,0xFE,0x51,0xF0,0x46,0x58,0x7C,0x7F,0x9F,0x6C,0x53,0x67,0x45,0x43,0x4B,0xFE,0x44,0x4B,0x6A,0x58,0x5F,0x6D,0x54,0x6C,0x4C,0x47,0x43,0xF2,0xFE,0x92,0x9D,0x7C,0x7F,0x9F,0x4F,0x50,0x59,0xF0,0x53,0x6D,0xF0,0x53,0x6D,0xFE,0x50,0x45,0x66,0x6C,0x9E,0x51,0x48,0x52,0x46,0x52,0x41,0x68,0x6E,0xFE,0x41,0x4E,0xF0,0x48,0x9E,0x8E,0x97,0x74,0xF2,0xF2,0xFE,0x44,0x4B,0x6A,0x58,0x9E,0x41,0x50,0xF0,0x4F,0x41,0xF0,0x4B,0xF0,0x4F,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_142[] = { 0x03,0x49,0x58,0x7C,0x7F,0x9F,0x6C,0xFE,0x53,0x67,0x62,0xF0,0x53,0x4B,0x4F,0xF0,0x4E,0xF2,0x9E,0xFE,0x4E,0x4B,0x52,0x9E,0x7C,0x7F,0x9F,0x55,0xF5,0x03,0xF6,0x58,0xFE,0x4C,0x42,0xF0,0x4B,0xF0,0x45,0x9E,0x51,0x41,0x4F,0xF0,0x83,0x70,0x6C,0xFE,0x5A,0x66,0x48,0x68,0x65,0x42,0x55,0x9E,0x54,0xA1,0x4F,0xF2,0xFE,0x04,0x51,0x58,0x5C,0x63,0x58,0x9E,0x4D,0x45,0x41,0x6C,0xFE,0xF0,0x4B,0x64,0x42,0x55,0x9E,0x41,0x46,0x46,0xF0,0x52,0x46,0x68,0x6E,0xFE,0x40,0x4F,0x66,0x4B,0x41,0x75,0x71,0xF0,0x8B,0x81,0x4F,0x50,0x59,0xFE,0x62,0xA1,0x53,0x9E,0x52,0xF0,0x49,0x6B,0x41,0xF0,0x4E,0x6E,0xFE,0x46,0x6C,0x51,0x48,0x52,0x9E,0x4C,0x4C,0x61,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_143[] = { 0x08,0x49,0x58,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xFE,0xF0,0x5B,0xF0,0x4B,0x9E,0x53,0x67,0x62,0xF0,0x53,0x4B,0x6F,0xFE,0x44,0x44,0x46,0x54,0x9E,0x5D,0x4B,0x58,0xF0,0x83,0x70,0xF0,0x45,0xFE,0x5A,0x66,0x47,0x65,0x42,0x55,0x54,0xA1,0x4F,0x6E,0xFE,0x77,0xD1,0xF1,0x89,0x59,0x9E,0x4C,0xF0,0x47,0x4E,0x49,0xF0,0x4F,0xF2,0xFE,0xF1,0x8A,0x9F,0x80,0x58,0x49,0x43,0xF0,0x45,0x46,0x49,0x43,0x68,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_144[] = { 0x03,0x00,0x49,0x58,0x9E,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xFE,0x53,0x67,0x62,0xF0,0x53,0x4B,0x6F,0xFE,0x44,0x44,0x46,0x54,0x7C,0x7F,0x9F,0x58,0xF0,0x83,0x70,0xF0,0x45,0xFE,0x5A,0x66,0x47,0x65,0x42,0x55,0x54,0xA1,0x4F,0xF2,0xFE,0x49,0x49,0xF0,0x52,0x4C,0x49,0x4B,0x9E,0x52,0x6D,0x48,0x6D,0xF0,0x4F,0x6E,0xFE,0x02,0x5D,0x6D,0x58,0x59,0x4B,0x66,0x6C,0x9E,0x8A,0xD1,0xF1,0x8B,0xFE,0xF0,0x83,0x9A,0xD1,0xF1,0x8B,0x4B,0x52,0x5F,0x4F,0x45,0xF4,0xFE,0xF0,0x5D,0x42,0x4B,0x59,0x54,0x47,0x4B,0x52,0x54,0x41,0x45,0xF4,0xFE,0x4A,0xF0,0x59,0x47,0xF0,0x52,0x9E,0x54,0x47,0x4B,0x4F,0x54,0x66,0xFE,0x89,0xF0,0x78,0x4F,0x45,0xF0,0x7B,0xD2,0x9D,0xF0,0x79,0x6C,0x4A,0xF0,0x45,0x4D,0x6E,0xFE,0x77,0xD1,0xF1,0x89,0x59,0x9E,0x42,0x5F,0x45,0x66,0xFE,0x49,0x58,0x50,0x45,0x55,0x4D,0x6D,0x55,0xA3,0x42,0xFE,0x4B,0x4F,0x66,0x4B,0x41,0x6E,0xFE,0x53,0x42,0x53,0x42,0x63,0x51,0x6C,0xFE,0x44,0x41,0x51,0x61,0x4F,0xF0,0x4E,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_145[] = { 0x05,0x00,0x49,0x58,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xFE,0x53,0x67,0x62,0xF0,0x53,0x4B,0x4F,0xF2,0xFE,0x03,0x45,0x41,0x5C,0x58,0x9E,0x5D,0x4B,0x58,0xF0,0x83,0x70,0xF0,0x45,0xFE,0x5A,0x66,0x47,0xF0,0x4E,0xF2,0xFE,0x77,0xD1,0xF1,0x89,0x59,0x4C,0xF0,0x47,0x4E,0x49,0xF0,0x4F,0xF2,0xFE,0x70,0x71,0x82,0x90,0x7C,0x71,0xD1,0x80,0x59,0xFE,0xF0,0x4D,0x6D,0xF0,0x5B,0x44,0x4B,0x52,0x46,0x4F,0x45,0xF4,0xFE,0x45,0x47,0x55,0x6D,0x9E,0x4B,0x52,0x44,0x49,0x42,0x6E,0xFE,0x40,0x45,0xFC,0x40,0x44,0xFC,0x5F,0xF0,0x53,0x67,0x58,0xFE,0x03,0x51,0x58,0x70,0x71,0x82,0x90,0xF0,0x8B,0x9A,0xD1,0x77,0x59,0xFE,0x53,0x52,0x62,0xF0,0x4F,0x41,0xF0,0x4B,0x54,0x9E,0x5F,0x45,0x4F,0xF0,0x4F,0x6E,0xFE,0x4A,0x40,0xF5,0x03,0x45,0x41,0xF6,0x5C,0x4C,0x4C,0x61,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_146[] = { 0x07,0x00,0x49,0x58,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xFE,0x53,0x67,0x62,0xF0,0x53,0x4B,0x4F,0xF2,0xFE,0x59,0x52,0x4B,0x54,0x41,0x9E,0x45,0x41,0xF0,0x4F,0x6D,0x58,0xFE,0x84,0xF0,0x7E,0xF0,0x45,0x53,0x45,0x69,0x4F,0x6E,0xFE,0x77,0xD1,0xF1,0x89,0x59,0x45,0x54,0x67,0x40,0x4D,0xA1,0x52,0x68,0x6E,0xFE,0x4A,0x40,0xF2,0x4A,0x41,0xF0,0x49,0x58,0x4F,0x4F,0x45,0x41,0xF0,0x4F,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_147[] = { 0x40,0x45,0xFC,0x40,0x44,0xFC,0x5F,0xF0,0x53,0x67,0x58,0xFE,0xF5,0x70,0x71,0x82,0x90,0xF0,0x8B,0x9A,0xD1,0x77,0xF6,0x6C,0xFE,0x51,0x45,0xA1,0x52,0x41,0x5E,0x4C,0x45,0xF4,0xFE,0x7C,0x7F,0x9F,0x6C,0x53,0x67,0x62,0xF0,0x53,0x4C,0x53,0xFE,0x41,0x67,0xF0,0x47,0x50,0xF0,0x45,0x5F,0x51,0x45,0x68,0x6F,0xFE,0x44,0x4B,0x6A,0x58,0x45,0x47,0x4B,0x79,0x9F,0x7C,0xF0,0x52,0x6F,0xFE,0x03,0x51,0x58,0x7C,0x71,0xD1,0x80,0x6C,0x9E,0x44,0x4C,0x53,0xFE,0x4E,0x58,0x41,0x6A,0x58,0xF0,0x8B,0x9A,0xD1,0x77,0xF0,0x45,0xFE,0xF5,0xF0,0x4B,0xA1,0x4F,0x41,0xF6,0x53,0x54,0x67,0x6F,0xFE,0x51,0x45,0x43,0x68,0x65,0x42,0x55,0x54,0x67,0x5E,0x4C,0x6E,0xFE,0x40,0x45,0x59,0x9E,0x59,0x57,0x58,0xF0,0x5D,0x42,0x4B,0xFE,0x5F,0xF0,0x53,0x67,0x59,0x9E,0x91,0x7F,0x98,0x58,0xF0,0x5D,0x42,0x4B,0xFE,0x40,0x44,0x59,0x9E,0x53,0x42,0x61,0x41,0x58,0xF0,0x5D,0x42,0x4B,0xFE,0xFE,0x53,0x52,0x62,0x51,0x65,0x41,0x9E,0x5F,0x45,0x4F,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_148[] = { 0x49,0x58,0x4A,0x46,0x7C,0x88,0x9F,0x8E,0x9D,0x58,0x63,0x5E,0xFE,0xF0,0x4F,0x69,0x62,0x9E,0x59,0x41,0x68,0x54,0xF2,0xFE,0x70,0x71,0x7C,0xF0,0x8B,0x9A,0xD1,0x77,0x7B,0xD3,0x9F,0x7F,0x9F,0xFE,0x6C,0x9E,0x03,0xF0,0x4F,0x6D,0x53,0xF0,0x5A,0x54,0xF0,0x53,0x4B,0x52,0xFE,0x53,0xF0,0x5A,0x49,0x43,0x52,0x59,0x9E,0x71,0x78,0x8E,0x7D,0x9D,0x6E,0xFE,0x51,0x61,0x4F,0x41,0x9E,0x41,0x48,0xF0,0x52,0x59,0xFE,0x59,0x63,0x47,0x9E,0x4F,0x41,0x67,0xA4,0x47,0xF0,0x45,0xFE,0x5C,0x67,0x5E,0x4C,0xF2,0xFE,0x45,0x41,0x5B,0x47,0x62,0x9E,0x4B,0x5E,0x4D,0x6D,0x6E,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x7C,0x88,0x9F,0x8E,0x9D,0xFF }; +static const u8 dialog_text_DIALOG_149[] = { 0xF1,0x8A,0x9F,0x80,0x58,0x45,0x47,0x69,0x7C,0x96,0x71,0xF0,0x7F,0x9F,0xFE,0x5C,0x9E,0x65,0x42,0x49,0x4E,0xF2,0xFE,0x49,0x49,0x55,0x59,0x9E,0x77,0xD1,0xF1,0x89,0x55,0x5F,0x51,0x48,0xFE,0x66,0x69,0x54,0x45,0xA1,0x4F,0x9E,0x44,0x4B,0x6A,0x58,0xFE,0x45,0x47,0x69,0x7C,0x7F,0x9F,0xF0,0x45,0x58,0x49,0xA1,0x52,0x68,0x6E,0xFE,0x4A,0x45,0x6C,0x9E,0x4C,0xF0,0x5C,0x67,0x59,0xF0,0x4B,0x61,0x4F,0x66,0xFE,0x7C,0x82,0xD6,0xD1,0x77,0x5E,0x43,0xF0,0x52,0x9E,0x45,0x4E,0x47,0x6F,0xFE,0x42,0x4B,0x6A,0xF0,0x52,0x9E,0xF0,0x48,0x6D,0x4E,0x47,0xF0,0x52,0x46,0x68,0x6E,0xFE,0x59,0x63,0x47,0x4C,0xF0,0x5C,0x69,0xF0,0x59,0x9E,0x7C,0x7F,0x9F,0xF0,0x45,0xFE,0x5F,0x51,0x45,0x68,0x59,0xF0,0x4C,0xF0,0x4F,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_150[] = { 0x40,0x9F,0x9F,0x6D,0x6F,0xF0,0x4F,0x69,0xF0,0x4F,0x41,0xF4,0xFE,0x53,0x51,0xF0,0x4D,0x6D,0x9E,0xF0,0x8A,0x7B,0xD4,0x56,0x69,0x55,0xFE,0x54,0xA1,0x50,0xA2,0x41,0x5E,0x4B,0x4F,0xF2,0xFE,0x76,0x80,0x9D,0x53,0x9E,0x52,0x6D,0xF0,0x4B,0xA4,0x42,0xFE,0x54,0x44,0x4B,0x52,0x62,0x66,0x42,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_151[] = { 0x5F,0xF0,0x4C,0x6C,0x45,0x48,0x66,0x69,0x4F,0x9E,0x51,0xF0,0x46,0x59,0xFE,0x5B,0x6D,0xF0,0x51,0x48,0x66,0x69,0x5E,0x4B,0x4F,0x6E,0xFE,0x62,0x42,0x9E,0x5D,0x6D,0x53,0x9F,0x55,0xFE,0x44,0x49,0xA1,0x4F,0xF0,0x52,0x4C,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_152[] = { 0x41,0x52,0x52,0x52,0xF2,0xF2,0xF2,0xFE,0x66,0x6D,0xF0,0x5D,0x42,0x54,0x5A,0x53,0xF0,0x4F,0x54,0x40,0x6E,0xFE,0x54,0xF0,0x4D,0x45,0x71,0x96,0x71,0x96,0x4B,0x52,0x4F,0x48,0xF0,0x53,0x6F,0xFE,0x5E,0x40,0x6F,0x4E,0x66,0xF0,0x45,0x5F,0x43,0x68,0x58,0x62,0xFE,0x6B,0x68,0x47,0x59,0x54,0x41,0xF0,0x52,0x4C,0x6E,0xFE,0x65,0x68,0x55,0x59,0x9E,0x41,0xA1,0xF1,0x59,0x41,0x5D,0x4B,0xF0,0x45,0xFE,0x5F,0x43,0x68,0x4B,0x57,0xF2,0xFE,0x49,0x58,0x5D,0x4B,0x59,0x9E,0x45,0x43,0x4B,0x5E,0x4C,0x6E,0xFE,0x40,0x9F,0x6F,0x54,0x6D,0xF0,0x4F,0x45,0x9E,0x46,0x62,0x50,0xF0,0x45,0xFE,0x44,0x50,0x51,0x41,0x52,0x46,0x4F,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_153[] = { 0x6B,0x4B,0x58,0x9E,0x75,0x96,0xF0,0x7F,0x55,0xFE,0x58,0xF0,0x5D,0xA1,0x52,0x59,0x9E,0x41,0x45,0x9F,0x6D,0xF2,0xFE,0x4E,0x42,0x41,0x42,0x93,0x81,0x59,0x9E,0x5F,0x6D,0x54,0xFE,0x5B,0x46,0xA1,0x53,0xF0,0x59,0x4B,0x50,0x5E,0x42,0xF0,0x4E,0x9F,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_154[] = { 0xF0,0x5D,0x42,0x4B,0x6C,0x9E,0x54,0x47,0x4C,0x53,0xFE,0xF0,0x7F,0x91,0x9F,0xF0,0x7B,0xF0,0x45,0x44,0x44,0x47,0x54,0x68,0x58,0xF0,0x52,0xFE,0xF0,0x4F,0x41,0xF0,0x4B,0x55,0x9E,0x4B,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x54,0x47,0x4B,0x4F,0x66,0x6F,0x54,0x47,0x4B,0x4F,0xFE,0x79,0x9F,0x7C,0xF0,0x52,0x9E,0x5F,0x51,0x45,0x67,0x5E,0x4C,0x6E,0xFE,0x70,0x70,0x9F,0xF0,0x53,0x42,0x4B,0x65,0x42,0xFC,0xFC,0xFC,0xFE,0xF1,0x8A,0x9F,0x80,0x5A,0x61,0x59,0x6F,0x75,0xF0,0x8C,0x55,0xFE,0x5A,0x46,0x49,0x5E,0x69,0x4F,0x5E,0x5E,0xF0,0x4F,0x4B,0x6E,0xFE,0x59,0x63,0x47,0x9E,0x77,0xD1,0xF1,0x89,0x6C,0xFE,0x63,0xA1,0x51,0x48,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x40,0x40,0x6F,0x4E,0x42,0xF0,0x4F,0xF2,0xFE,0x43,0x58,0x5D,0x45,0x55,0x75,0xF0,0x8C,0x58,0x54,0x45,0x55,0x62,0xFE,0x92,0x9D,0x7C,0x7F,0x9F,0x58,0x9E,0x4D,0x45,0x41,0xF0,0x45,0xFE,0x40,0x67,0x5E,0x4C,0x6E,0xFE,0x65,0x9F,0x47,0x6F,0x4B,0x66,0xF0,0x5C,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_155[] = { 0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x58,0x44,0x45,0xF0,0x48,0xF0,0x52,0xFE,0x44,0x4B,0x6A,0x55,0x6F,0xF0,0x48,0x6D,0x46,0xF0,0x45,0xFE,0x62,0xF0,0x53,0xA1,0x52,0x46,0x5E,0x4B,0x4F,0x6E,0xFE,0x77,0xD1,0xF1,0x89,0x54,0x6D,0x45,0xFE,0x44,0x41,0x59,0x66,0xA1,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x44,0x63,0x47,0x55,0x9E,0x4F,0x51,0x54,0x66,0xFE,0x44,0x4B,0x6A,0x58,0x9E,0x59,0x54,0x4B,0x6C,0x4B,0x5E,0x4C,0x6E,0xFE,0xF5,0x75,0xF0,0x75,0x8F,0x58,0x5C,0x63,0xF6,0xF0,0x52,0x59,0xFE,0x75,0xF0,0x75,0x8F,0x55,0x42,0x51,0x66,0x54,0x41,0x62,0x58,0x6C,0xFE,0x65,0x47,0x5F,0x52,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xFE,0x5F,0xF0,0x4C,0x58,0x5E,0x50,0x5C,0x9E,0x41,0x47,0x53,0x46,0x59,0x6F,0xFE,0xF5,0x43,0xF6,0x55,0x53,0xF0,0x5A,0x49,0x60,0x9E,0x4F,0x45,0x4A,0xFE,0x55,0x65,0xA1,0x52,0x6F,0x5E,0x50,0x6C,0x4C,0xA1,0x45,0x67,0xFE,0x5F,0xF0,0x4C,0xF0,0x5A,0x4F,0x4B,0x55,0x9E,0xF0,0x52,0x46,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_156[] = { 0x53,0x48,0x41,0xF0,0x45,0x53,0x52,0x62,0x9E,0x5C,0x6D,0xF0,0x52,0x4C,0x6E,0xFE,0x53,0x48,0x41,0x55,0x9E,0x59,0x41,0x68,0x53,0x46,0x6F,0xFE,0x54,0xF0,0x45,0x41,0x59,0x67,0x58,0x9E,0xF0,0x59,0x4B,0xA4,0x55,0xFE,0x50,0xA3,0x42,0x41,0x4B,0x52,0x47,0xF0,0x4F,0x4A,0x41,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_157[] = { 0x54,0xF0,0x45,0x69,0x68,0xF5,0x4C,0x54,0xF6,0x55,0xFE,0x54,0xF0,0x45,0x4A,0x69,0x54,0x41,0x65,0x42,0x55,0xFE,0x46,0x6C,0x51,0x48,0x52,0xF2,0xFE,0x45,0x66,0xF0,0x4F,0xF0,0x45,0x9E,0x4B,0xF0,0x4C,0x6D,0xF0,0x52,0xFE,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF0,0x52,0x46,0x5E,0x4D,0x6D,0x6E,0xFE,0x40,0x4F,0x5E,0x5E,0xF0,0x52,0x4B,0xF0,0x4C,0x60,0x53,0xFE,0x41,0x46,0xF0,0x45,0x9E,0xF0,0x52,0x46,0x5E,0x4D,0x6D,0x6E,0xFE,0x47,0x66,0x41,0x41,0x6A,0x58,0x9E,0x53,0x49,0x6A,0x59,0xFE,0x53,0x47,0x55,0x9E,0x76,0x78,0x9D,0xF2,0xF2,0xFE,0x4E,0x49,0x54,0x4B,0x58,0x9E,0xF0,0x4B,0xF0,0x49,0x47,0xF0,0x52,0x4C,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_158[] = { 0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x58,0x82,0x77,0x85,0xD1,0x77,0xFE,0x4E,0x58,0x01,0xFE,0x7F,0x71,0x8F,0x9D,0xF0,0x77,0x65,0x47,0x6F,0xFE,0x69,0x6D,0xF0,0x4E,0x47,0xF0,0x52,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4C,0x68,0x53,0xFE,0xF0,0x4F,0x6D,0xF0,0x4F,0x6D,0x9E,0x4F,0x45,0x47,0x53,0xF0,0x5C,0x68,0x6E,0xFE,0x7C,0xF1,0x8A,0x9F,0xF0,0x83,0xF0,0x45,0x59,0x63,0x41,0x5D,0xF0,0x53,0xFE,0x4F,0x45,0x47,0x9E,0x53,0xF0,0x5A,0x40,0xF0,0x45,0x69,0x68,0x6E,0xFE,0x69,0x6D,0xF0,0x4E,0x47,0x03,0x45,0x41,0x61,0x55,0xFE,0x4F,0x45,0x47,0x53,0xF0,0x5C,0x68,0x6B,0xF0,0x4A,0x6C,0xFE,0xF5,0x03,0xF0,0x4F,0x6D,0x53,0xF0,0x5A,0xF6,0x53,0x41,0x41,0x5E,0x4C,0x6E,0xFE,0x4E,0x58,0x02,0x9E,0x9E,0x75,0xF0,0x8C,0x55,0x60,0x45,0xA1,0x52,0xFE,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4B,0x52,0x6F,0x4E,0x49,0x45,0x66,0xFE,0x62,0x42,0x41,0x50,0xF0,0x53,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF0,0x52,0x46,0x68,0x6E,0xFE,0xF5,0x75,0xF0,0x8C,0x76,0xD1,0x77,0xF6,0x53,0x41,0xA1,0x52,0x6F,0xFE,0x4F,0x45,0x41,0x53,0x49,0x6A,0x55,0x58,0xF0,0x5D,0x69,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_159[] = { 0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x58,0x82,0x77,0x85,0xD1,0x77,0xFE,0x4E,0x58,0x03,0x9E,0x9E,0x23,0xF0,0x8D,0x7F,0x9D,0x6B,0xF0,0x4A,0xFE,0x4F,0x50,0xF0,0x53,0x5E,0xA1,0x52,0x9E,0x4B,0xA2,0xF0,0x45,0x6D,0xF0,0x52,0xFE,0x45,0x66,0x9E,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4C,0x68,0x53,0x6F,0xFE,0xF5,0xF0,0x89,0xD1,0x77,0x50,0xA3,0x42,0xF6,0xF0,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0x59,0x63,0x47,0x59,0x4B,0x67,0x54,0xF0,0x45,0x66,0xFE,0x4B,0xA2,0xF0,0x45,0x6D,0xF0,0x52,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0x4C,0x68,0x53,0xFE,0x53,0x44,0x47,0x5E,0xF0,0x52,0x9E,0x53,0xF0,0x5C,0x68,0x6E,0xFE,0xF5,0x59,0xF0,0x59,0x53,0xF0,0x5A,0xF6,0xF0,0x52,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_160[] = { 0x59,0x63,0x47,0x9E,0x59,0x4B,0x67,0x54,0xF0,0x45,0x66,0xFE,0x0B,0xF0,0x8D,0x7F,0x9D,0x6C,0x44,0x4C,0x53,0xFE,0xF5,0xF0,0x8D,0xF0,0x82,0xD6,0x70,0x7F,0xD1,0x77,0xF6,0xF0,0x45,0xFE,0xF0,0x52,0x46,0x5E,0x4C,0x6E,0xFE,0x44,0x54,0x45,0xF0,0x52,0xFE,0x4C,0xF0,0x5C,0xA1,0x52,0x41,0x68,0x40,0x41,0xF0,0x4F,0x59,0x6F,0xFE,0x0A,0xFC,0x0B,0xF0,0x53,0x50,0x66,0x58,0xF0,0x8D,0x7F,0x9D,0xF0,0x52,0x62,0xFE,0x44,0x46,0x40,0xF0,0x45,0x68,0x49,0x53,0xF0,0x45,0xF0,0x52,0x46,0x5E,0x4C,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_161[] = { 0x41,0x63,0x9F,0x9E,0x4C,0xF0,0x49,0x41,0xF0,0x52,0x4C,0xF2,0xF2,0xFE,0x49,0x49,0x55,0x41,0x69,0xF0,0x59,0x9E,0x40,0x43,0x68,0x53,0xFE,0x46,0x41,0x52,0x4F,0x48,0xF0,0x53,0x6F,0x5D,0x6D,0x53,0x55,0xFE,0x40,0x43,0x52,0x4B,0x5E,0x41,0x5E,0x4B,0x4F,0xF2,0xF2,0xFE,0xF0,0x52,0x6D,0xF0,0x49,0x6D,0xF0,0x45,0x9E,0x40,0x67,0x5E,0x4C,0x6E,0xFE,0xF5,0x49,0x69,0xF0,0x52,0x6F,0x44,0x4B,0x5E,0x41,0xF0,0x52,0x4C,0xF0,0x45,0xFE,0x62,0xA1,0x53,0x40,0x4E,0x6D,0xF0,0x52,0x5D,0x4B,0x41,0x58,0xF0,0x52,0xFE,0x51,0x5E,0x66,0x54,0x41,0x62,0x58,0xF0,0x52,0x4C,0xF0,0x45,0xFE,0x42,0x48,0x53,0xA1,0x52,0x9E,0x47,0xF0,0x4F,0x4A,0x41,0x6E,0xF6,0xFE,0x9F,0x8E,0x97,0x74,0xFC,0x7C,0x7F,0xD1,0x8B,0x65,0x67,0x9F,0xFF }; +static const u8 dialog_text_DIALOG_162[] = { 0x71,0x82,0x82,0x9E,0x40,0x41,0x45,0x6B,0x66,0xF0,0x4C,0xFE,0x66,0x6D,0xF0,0x5D,0x42,0x54,0x5A,0x53,0xF0,0x4F,0x54,0x6E,0xFE,0x49,0x58,0x7C,0x7F,0x9F,0x59,0x9E,0xF0,0x5C,0x51,0x55,0xFE,0x45,0x47,0x4B,0x52,0x4F,0x6B,0x48,0xF0,0x4B,0xA2,0xFE,0x54,0x41,0x6D,0xF0,0x4F,0xA1,0x52,0xF0,0x59,0xF2,0xFE,0x45,0x43,0x4D,0xF0,0x59,0x9E,0x41,0x41,0x6D,0xF0,0x52,0x4B,0xA4,0x6E,0xFE,0x59,0x54,0x4B,0x52,0x47,0x69,0x4F,0x66,0xFE,0x7C,0x7F,0x9F,0xF0,0x47,0x66,0x41,0x9E,0x45,0x43,0x4C,0x45,0x66,0x6E,0xFE,0x49,0x69,0xF0,0x52,0x9E,0x5D,0x6D,0x53,0x55,0xFE,0x4A,0x41,0xF0,0x49,0xF0,0x4F,0x65,0xF2,0x9E,0x9E,0x8D,0x71,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_163[] = { 0x40,0x40,0x40,0xA1,0xFC,0xFC,0x5E,0x4F,0x49,0x6D,0xF0,0x53,0x62,0xFE,0x76,0x7A,0x8E,0x58,0x45,0x50,0x45,0x9E,0x8E,0x97,0x74,0xF2,0xFE,0x76,0x7A,0x8E,0x59,0x54,0x6F,0x6B,0xF0,0x45,0x59,0x41,0xF0,0x45,0xFE,0x4D,0x45,0x41,0xF0,0x52,0x9E,0x41,0x9F,0x50,0xF0,0x59,0x6D,0xFE,0x5E,0x48,0x4F,0x47,0x54,0x41,0x93,0x81,0x54,0x58,0x55,0xF2,0xFE,0x5D,0x6D,0x53,0x42,0x55,0x9E,0x63,0x47,0x55,0x4F,0x4F,0x56,0xFE,0x75,0x71,0xF0,0x8B,0x81,0xF0,0x53,0x62,0xF0,0x4F,0xF2,0xFE,0x76,0x7A,0x8E,0xF0,0x49,0x53,0x46,0x55,0xFE,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0x6C,0xF0,0x4D,0x9F,0x6D,0xF0,0x5B,0xFE,0x53,0x67,0x62,0xF0,0x53,0x4A,0x69,0x68,0x53,0x59,0xFC,0xFC,0xFC,0xFE,0xF0,0x4D,0x6D,0xF0,0x5B,0xF0,0x52,0xF5,0x01,0x02,0x00,0x49,0xF6,0x62,0xFE,0x40,0xA1,0x4F,0x58,0x45,0xF2,0xF4,0xFE,0xF5,0x4B,0x6A,0xF6,0x55,0x9E,0x6B,0xF0,0x45,0x59,0x41,0x62,0xFE,0x46,0xF0,0x51,0x45,0x54,0x45,0xA1,0x4F,0x7C,0x7F,0x9F,0xF0,0x45,0xFE,0x58,0x49,0xA1,0x52,0x9E,0x44,0xA1,0x4F,0x53,0x59,0xFC,0xFC,0xFE,0x5E,0x4F,0x5E,0x4F,0x9E,0x6B,0xF0,0x45,0x59,0x41,0x58,0xFE,0xF0,0x4F,0x9F,0x41,0x46,0x66,0x41,0x54,0x9E,0x5C,0x41,0x6B,0xF0,0x45,0x6F,0xFE,0x62,0xF0,0x53,0xA1,0x52,0x4B,0x5E,0x42,0xF0,0x52,0x59,0x54,0x41,0x45,0x6E,0xFE,0x6B,0xF0,0x45,0x59,0x41,0x59,0x9E,0x47,0x63,0x4B,0x9F,0xF0,0x4E,0xF2,0xFE,0x46,0xA4,0x42,0x59,0x9E,0x5A,0x46,0x40,0xF0,0x48,0x52,0x63,0x68,0x6E,0xFE,0xF0,0x4F,0xF0,0x45,0x6F,0x49,0x6D,0xF0,0x53,0x40,0x42,0x53,0x46,0x59,0xFE,0xF0,0x4D,0x9F,0xA1,0x4F,0x41,0x9E,0x5E,0x48,0x54,0x41,0xF0,0x4E,0xF2,0xFE,0x03,0x0D,0x7C,0x82,0xD6,0xD1,0x77,0x6C,0x5F,0xF0,0x45,0x41,0x52,0xFE,0x5E,0xA1,0x52,0x6A,0x65,0xF2,0xFE,0x9E,0xF0,0x75,0x89,0x89,0xD1,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_164[] = { 0x4B,0xF0,0x59,0x66,0x47,0x9E,0x63,0x4C,0x6D,0xF0,0x52,0x4F,0x58,0xF0,0x52,0xFE,0x49,0x6D,0x54,0x55,0x5F,0xF0,0x49,0x53,0x55,0x6F,0xFE,0x5B,0x53,0xA1,0x50,0xA2,0x41,0x5E,0x4B,0x4F,0x6E,0xFE,0x5A,0x4A,0x4B,0xF0,0x5B,0x67,0x55,0x9E,0x63,0x67,0x5E,0x4C,0xF4,0xFE,0xF0,0x52,0x59,0xF2,0x9E,0x41,0x51,0x62,0x58,0x65,0x42,0x55,0x6F,0xFE,0x99,0xF0,0x82,0xD6,0x9F,0xF2,0xFE,0xFE,0x9E,0x9E,0x9E,0xF0,0x79,0x9F,0xF2,0xF2,0x9E,0x63,0x61,0x53,0x47,0xFF }; +static const u8 dialog_text_DIALOG_165[] = { 0x49,0x58,0x77,0x71,0x58,0x9E,0x5E,0x6B,0x67,0x6C,0xFE,0x77,0x98,0x77,0x98,0x5E,0x6B,0xA1,0x52,0xFE,0x61,0x6C,0x5E,0x6B,0x4B,0x52,0x62,0xFE,0x4B,0x67,0x5E,0x4D,0x6D,0x6E,0xFF }; +static const u8 dialog_text_DIALOG_166[] = { 0x46,0xA4,0x42,0x59,0x9E,0x83,0x99,0x9F,0x85,0x9D,0xF0,0x77,0xF0,0x52,0xFE,0x68,0x4C,0x55,0x9E,0x4B,0x52,0x68,0xD1,0x7C,0xF2,0xFE,0x74,0x71,0x96,0x55,0x9E,0x50,0xA4,0x9F,0x4D,0x6D,0xFE,0x4B,0x4F,0x41,0x5A,0x53,0x59,0x6F,0x5E,0x4F,0x49,0x6D,0xF0,0x53,0xFE,0x47,0x68,0x53,0x41,0x41,0xD1,0x7C,0xF2,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x88,0x79,0x88,0x79,0xFF }; +static const u8 dialog_text_DIALOG_167[] = { 0xF5,0xF1,0x8A,0x9F,0x80,0x58,0x9E,0x44,0x4B,0x6A,0xF6,0xFE,0x9E,0x9E,0x9E,0x9E,0x9E,0x4C,0xF0,0x47,0x4E,0x49,0xFE,0x0A,0xF0,0x8D,0x7F,0x9D,0xF5,0xF0,0x7B,0xD2,0x9D,0xF1,0x8B,0xF6,0xFE,0x23,0xF0,0x8D,0x7F,0x9D,0xF5,0x4B,0xA2,0xF0,0x45,0x60,0xF6,0xFE,0x0B,0xF0,0x8D,0x7F,0x9D,0xF5,0x75,0x9D,0xF0,0x89,0x9D,0x65,0x60,0xF6,0xFE,0x9E,0x9E,0x9E,0x9E,0xF5,0xF1,0x89,0x9D,0x80,0xF6,0xFE,0x9E,0x9E,0x9E,0x9E,0xF5,0x62,0x58,0x6C,0x62,0x51,0xF6,0xFE,0x62,0x42,0x41,0x50,0xF0,0x53,0x44,0x4C,0xF5,0x54,0xF0,0x48,0x68,0xF6,0xFF }; +static const u8 dialog_text_DIALOG_168[] = { 0x70,0x9F,0x9D,0x6F,0x5E,0x4F,0x5E,0x4F,0x9E,0xFE,0x5B,0x6D,0xF0,0x51,0x48,0x66,0x69,0x50,0xA2,0x41,0x5E,0x4B,0x4F,0x6E,0xFE,0x89,0x84,0x80,0xD2,0x9D,0x9E,0x45,0x6D,0xF0,0x4D,0x6D,0x55,0xFE,0x44,0x49,0xA1,0x4F,0xF0,0x52,0x4C,0xF2,0xFF }; +static const u8 dialog_text_DIALOG_169[] = { 0x45,0xA1,0x52,0x55,0x9E,0x59,0x41,0x68,0x54,0xF2,0xFE,0x49,0x58,0xF5,0xF0,0x53,0x42,0x47,0x51,0xF6,0x55,0xFE,0x60,0xF0,0x4F,0x6D,0xF0,0x52,0x9E,0x59,0x41,0x68,0x62,0x58,0x55,0x59,0x6F,0xFE,0x6B,0xF0,0x4A,0x6B,0x41,0xF0,0x45,0x9E,0x44,0x53,0xF0,0x4C,0x69,0x68,0xF2,0xFE,0x9E,0x9E,0x9F,0x9F,0x4D,0x6D,0x50,0xA4,0x42,0x65,0x67,0xFF }; +static const struct DialogEntry dialog_entry_DIALOG_000 = { 1, 5, 30, 200, dialog_text_DIALOG_000 }; +static const struct DialogEntry dialog_entry_DIALOG_001 = { 1, 4, 95, 200, dialog_text_DIALOG_001 }; +static const struct DialogEntry dialog_entry_DIALOG_002 = { 1, 4, 95, 200, dialog_text_DIALOG_002 }; +static const struct DialogEntry dialog_entry_DIALOG_003 = { 1, 5, 95, 200, dialog_text_DIALOG_003 }; +static const struct DialogEntry dialog_entry_DIALOG_004 = { 1, 3, 95, 200, dialog_text_DIALOG_004 }; +static const struct DialogEntry dialog_entry_DIALOG_005 = { 1, 4, 30, 200, dialog_text_DIALOG_005 }; +static const struct DialogEntry dialog_entry_DIALOG_006 = { 1, 4, 30, 200, dialog_text_DIALOG_006 }; +static const struct DialogEntry dialog_entry_DIALOG_007 = { 1, 6, 30, 200, dialog_text_DIALOG_007 }; +static const struct DialogEntry dialog_entry_DIALOG_008 = { 1, 5, 30, 200, dialog_text_DIALOG_008 }; +static const struct DialogEntry dialog_entry_DIALOG_009 = { 1, 5, 30, 200, dialog_text_DIALOG_009 }; +static const struct DialogEntry dialog_entry_DIALOG_010 = { 1, 3, 30, 200, dialog_text_DIALOG_010 }; +static const struct DialogEntry dialog_entry_DIALOG_011 = { 1, 3, 30, 200, dialog_text_DIALOG_011 }; +static const struct DialogEntry dialog_entry_DIALOG_012 = { 1, 3, 30, 200, dialog_text_DIALOG_012 }; +static const struct DialogEntry dialog_entry_DIALOG_013 = { 1, 5, 30, 200, dialog_text_DIALOG_013 }; +static const struct DialogEntry dialog_entry_DIALOG_014 = { 1, 5, 30, 200, dialog_text_DIALOG_014 }; +static const struct DialogEntry dialog_entry_DIALOG_015 = { 1, 4, 30, 200, dialog_text_DIALOG_015 }; +static const struct DialogEntry dialog_entry_DIALOG_016 = { 1, 4, 30, 200, dialog_text_DIALOG_016 }; +static const struct DialogEntry dialog_entry_DIALOG_017 = { 1, 4, 30, 200, dialog_text_DIALOG_017 }; +static const struct DialogEntry dialog_entry_DIALOG_018 = { 1, 4, 30, 200, dialog_text_DIALOG_018 }; +static const struct DialogEntry dialog_entry_DIALOG_019 = { 1, 2, 30, 200, dialog_text_DIALOG_019 }; +static const struct DialogEntry dialog_entry_DIALOG_020 = { 1, 5, 95, 150, dialog_text_DIALOG_020 }; +static const struct DialogEntry dialog_entry_DIALOG_021 = { 1, 5, 95, 200, dialog_text_DIALOG_021 }; +static const struct DialogEntry dialog_entry_DIALOG_022 = { 1, 3, 95, 200, dialog_text_DIALOG_022 }; +static const struct DialogEntry dialog_entry_DIALOG_023 = { 1, 3, 95, 200, dialog_text_DIALOG_023 }; +static const struct DialogEntry dialog_entry_DIALOG_024 = { 1, 3, 95, 200, dialog_text_DIALOG_024 }; +static const struct DialogEntry dialog_entry_DIALOG_025 = { 1, 3, 95, 200, dialog_text_DIALOG_025 }; +static const struct DialogEntry dialog_entry_DIALOG_026 = { 1, 3, 95, 200, dialog_text_DIALOG_026 }; +static const struct DialogEntry dialog_entry_DIALOG_027 = { 1, 3, 95, 200, dialog_text_DIALOG_027 }; +static const struct DialogEntry dialog_entry_DIALOG_028 = { 1, 3, 95, 200, dialog_text_DIALOG_028 }; +static const struct DialogEntry dialog_entry_DIALOG_029 = { 1, 4, 95, 200, dialog_text_DIALOG_029 }; +static const struct DialogEntry dialog_entry_DIALOG_030 = { 1, 4, 30, 200, dialog_text_DIALOG_030 }; +static const struct DialogEntry dialog_entry_DIALOG_031 = { 1, 3, 30, 200, dialog_text_DIALOG_031 }; +static const struct DialogEntry dialog_entry_DIALOG_032 = { 1, 4, 30, 200, dialog_text_DIALOG_032 }; +static const struct DialogEntry dialog_entry_DIALOG_033 = { 1, 4, 30, 200, dialog_text_DIALOG_033 }; +static const struct DialogEntry dialog_entry_DIALOG_034 = { 1, 5, 30, 200, dialog_text_DIALOG_034 }; +static const struct DialogEntry dialog_entry_DIALOG_035 = { 1, 4, 30, 200, dialog_text_DIALOG_035 }; +static const struct DialogEntry dialog_entry_DIALOG_036 = { 1, 5, 30, 200, dialog_text_DIALOG_036 }; +static const struct DialogEntry dialog_entry_DIALOG_037 = { 1, 3, 30, 200, dialog_text_DIALOG_037 }; +static const struct DialogEntry dialog_entry_DIALOG_038 = { 1, 3, 95, 200, dialog_text_DIALOG_038 }; +static const struct DialogEntry dialog_entry_DIALOG_039 = { 1, 5, 30, 200, dialog_text_DIALOG_039 }; +static const struct DialogEntry dialog_entry_DIALOG_040 = { 1, 3, 30, 200, dialog_text_DIALOG_040 }; +static const struct DialogEntry dialog_entry_DIALOG_041 = { 1, 4, 30, 200, dialog_text_DIALOG_041 }; +static const struct DialogEntry dialog_entry_DIALOG_042 = { 1, 5, 30, 200, dialog_text_DIALOG_042 }; +static const struct DialogEntry dialog_entry_DIALOG_043 = { 1, 4, 30, 200, dialog_text_DIALOG_043 }; +static const struct DialogEntry dialog_entry_DIALOG_044 = { 1, 5, 95, 200, dialog_text_DIALOG_044 }; +static const struct DialogEntry dialog_entry_DIALOG_045 = { 1, 5, 95, 200, dialog_text_DIALOG_045 }; +static const struct DialogEntry dialog_entry_DIALOG_046 = { 1, 5, 30, 200, dialog_text_DIALOG_046 }; +static const struct DialogEntry dialog_entry_DIALOG_047 = { 1, 3, 95, 200, dialog_text_DIALOG_047 }; +static const struct DialogEntry dialog_entry_DIALOG_048 = { 1, 4, 30, 200, dialog_text_DIALOG_048 }; +static const struct DialogEntry dialog_entry_DIALOG_049 = { 1, 5, 30, 200, dialog_text_DIALOG_049 }; +static const struct DialogEntry dialog_entry_DIALOG_050 = { 1, 4, 30, 200, dialog_text_DIALOG_050 }; +static const struct DialogEntry dialog_entry_DIALOG_051 = { 1, 5, 30, 200, dialog_text_DIALOG_051 }; +static const struct DialogEntry dialog_entry_DIALOG_052 = { 1, 4, 30, 200, dialog_text_DIALOG_052 }; +static const struct DialogEntry dialog_entry_DIALOG_053 = { 1, 6, 30, 200, dialog_text_DIALOG_053 }; +static const struct DialogEntry dialog_entry_DIALOG_054 = { 1, 4, 30, 200, dialog_text_DIALOG_054 }; +static const struct DialogEntry dialog_entry_DIALOG_055 = { 1, 5, 30, 200, dialog_text_DIALOG_055 }; +static const struct DialogEntry dialog_entry_DIALOG_056 = { 1, 3, 30, 200, dialog_text_DIALOG_056 }; +static const struct DialogEntry dialog_entry_DIALOG_057 = { 1, 4, 30, 200, dialog_text_DIALOG_057 }; +static const struct DialogEntry dialog_entry_DIALOG_058 = { 1, 5, 30, 200, dialog_text_DIALOG_058 }; +static const struct DialogEntry dialog_entry_DIALOG_059 = { 1, 5, 30, 200, dialog_text_DIALOG_059 }; +static const struct DialogEntry dialog_entry_DIALOG_060 = { 1, 4, 30, 200, dialog_text_DIALOG_060 }; +static const struct DialogEntry dialog_entry_DIALOG_061 = { 1, 6, 30, 200, dialog_text_DIALOG_061 }; +static const struct DialogEntry dialog_entry_DIALOG_062 = { 1, 5, 30, 200, dialog_text_DIALOG_062 }; +static const struct DialogEntry dialog_entry_DIALOG_063 = { 1, 4, 30, 200, dialog_text_DIALOG_063 }; +static const struct DialogEntry dialog_entry_DIALOG_064 = { 1, 4, 30, 200, dialog_text_DIALOG_064 }; +static const struct DialogEntry dialog_entry_DIALOG_065 = { 1, 5, 30, 200, dialog_text_DIALOG_065 }; +static const struct DialogEntry dialog_entry_DIALOG_066 = { 1, 5, 30, 200, dialog_text_DIALOG_066 }; +static const struct DialogEntry dialog_entry_DIALOG_067 = { 1, 4, 30, 200, dialog_text_DIALOG_067 }; +static const struct DialogEntry dialog_entry_DIALOG_068 = { 1, 5, 30, 200, dialog_text_DIALOG_068 }; +static const struct DialogEntry dialog_entry_DIALOG_069 = { 1, 3, 30, 200, dialog_text_DIALOG_069 }; +static const struct DialogEntry dialog_entry_DIALOG_070 = { 1, 5, 30, 200, dialog_text_DIALOG_070 }; +static const struct DialogEntry dialog_entry_DIALOG_071 = { 1, 4, 30, 200, dialog_text_DIALOG_071 }; +static const struct DialogEntry dialog_entry_DIALOG_072 = { 1, 5, 30, 200, dialog_text_DIALOG_072 }; +static const struct DialogEntry dialog_entry_DIALOG_073 = { 1, 5, 95, 200, dialog_text_DIALOG_073 }; +static const struct DialogEntry dialog_entry_DIALOG_074 = { 1, 5, 30, 200, dialog_text_DIALOG_074 }; +static const struct DialogEntry dialog_entry_DIALOG_075 = { 1, 5, 30, 200, dialog_text_DIALOG_075 }; +static const struct DialogEntry dialog_entry_DIALOG_076 = { 1, 5, 30, 200, dialog_text_DIALOG_076 }; +static const struct DialogEntry dialog_entry_DIALOG_077 = { 1, 3, 150, 200, dialog_text_DIALOG_077 }; +static const struct DialogEntry dialog_entry_DIALOG_078 = { 1, 5, 30, 200, dialog_text_DIALOG_078 }; +static const struct DialogEntry dialog_entry_DIALOG_079 = { 1, 5, 30, 200, dialog_text_DIALOG_079 }; +static const struct DialogEntry dialog_entry_DIALOG_080 = { 1, 3, 30, 200, dialog_text_DIALOG_080 }; +static const struct DialogEntry dialog_entry_DIALOG_081 = { 1, 6, 30, 200, dialog_text_DIALOG_081 }; +static const struct DialogEntry dialog_entry_DIALOG_082 = { 1, 5, 30, 200, dialog_text_DIALOG_082 }; +static const struct DialogEntry dialog_entry_DIALOG_083 = { 1, 4, 30, 200, dialog_text_DIALOG_083 }; +static const struct DialogEntry dialog_entry_DIALOG_084 = { 1, 5, 30, 200, dialog_text_DIALOG_084 }; +static const struct DialogEntry dialog_entry_DIALOG_085 = { 1, 4, 30, 200, dialog_text_DIALOG_085 }; +static const struct DialogEntry dialog_entry_DIALOG_086 = { 1, 3, 30, 200, dialog_text_DIALOG_086 }; +static const struct DialogEntry dialog_entry_DIALOG_087 = { 1, 5, 30, 200, dialog_text_DIALOG_087 }; +static const struct DialogEntry dialog_entry_DIALOG_088 = { 1, 5, 30, 200, dialog_text_DIALOG_088 }; +static const struct DialogEntry dialog_entry_DIALOG_089 = { 1, 4, 95, 200, dialog_text_DIALOG_089 }; +static const struct DialogEntry dialog_entry_DIALOG_090 = { 1, 6, 30, 200, dialog_text_DIALOG_090 }; +static const struct DialogEntry dialog_entry_DIALOG_091 = { 1, 3, 30, 200, dialog_text_DIALOG_091 }; +static const struct DialogEntry dialog_entry_DIALOG_092 = { 1, 3, 30, 200, dialog_text_DIALOG_092 }; +static const struct DialogEntry dialog_entry_DIALOG_093 = { 1, 4, 30, 200, dialog_text_DIALOG_093 }; +static const struct DialogEntry dialog_entry_DIALOG_094 = { 1, 3, 30, 200, dialog_text_DIALOG_094 }; +static const struct DialogEntry dialog_entry_DIALOG_095 = { 1, 3, 30, 200, dialog_text_DIALOG_095 }; +static const struct DialogEntry dialog_entry_DIALOG_096 = { 1, 5, 30, 200, dialog_text_DIALOG_096 }; +static const struct DialogEntry dialog_entry_DIALOG_097 = { 1, 4, 30, 200, dialog_text_DIALOG_097 }; +static const struct DialogEntry dialog_entry_DIALOG_098 = { 1, 3, 95, 200, dialog_text_DIALOG_098 }; +static const struct DialogEntry dialog_entry_DIALOG_099 = { 1, 3, 95, 200, dialog_text_DIALOG_099 }; +static const struct DialogEntry dialog_entry_DIALOG_100 = { 1, 4, 95, 200, dialog_text_DIALOG_100 }; +static const struct DialogEntry dialog_entry_DIALOG_101 = { 1, 5, 95, 200, dialog_text_DIALOG_101 }; +static const struct DialogEntry dialog_entry_DIALOG_102 = { 1, 4, 30, 200, dialog_text_DIALOG_102 }; +static const struct DialogEntry dialog_entry_DIALOG_103 = { 1, 4, 95, 200, dialog_text_DIALOG_103 }; +static const struct DialogEntry dialog_entry_DIALOG_104 = { 1, 6, 30, 200, dialog_text_DIALOG_104 }; +static const struct DialogEntry dialog_entry_DIALOG_105 = { 1, 3, 95, 200, dialog_text_DIALOG_105 }; +static const struct DialogEntry dialog_entry_DIALOG_106 = { 1, 3, 95, 200, dialog_text_DIALOG_106 }; +static const struct DialogEntry dialog_entry_DIALOG_107 = { 1, 3, 95, 200, dialog_text_DIALOG_107 }; +static const struct DialogEntry dialog_entry_DIALOG_108 = { 1, 3, 95, 200, dialog_text_DIALOG_108 }; +static const struct DialogEntry dialog_entry_DIALOG_109 = { 1, 4, 95, 200, dialog_text_DIALOG_109 }; +static const struct DialogEntry dialog_entry_DIALOG_110 = { 1, 3, 95, 200, dialog_text_DIALOG_110 }; +static const struct DialogEntry dialog_entry_DIALOG_111 = { 1, 3, 95, 200, dialog_text_DIALOG_111 }; +static const struct DialogEntry dialog_entry_DIALOG_112 = { 1, 4, 30, 200, dialog_text_DIALOG_112 }; +static const struct DialogEntry dialog_entry_DIALOG_113 = { 1, 6, 30, 200, dialog_text_DIALOG_113 }; +static const struct DialogEntry dialog_entry_DIALOG_114 = { 1, 4, 95, 200, dialog_text_DIALOG_114 }; +static const struct DialogEntry dialog_entry_DIALOG_115 = { 1, 5, 95, 200, dialog_text_DIALOG_115 }; +static const struct DialogEntry dialog_entry_DIALOG_116 = { 1, 5, 95, 200, dialog_text_DIALOG_116 }; +static const struct DialogEntry dialog_entry_DIALOG_117 = { 1, 3, 95, 200, dialog_text_DIALOG_117 }; +static const struct DialogEntry dialog_entry_DIALOG_118 = { 1, 5, 95, 200, dialog_text_DIALOG_118 }; +static const struct DialogEntry dialog_entry_DIALOG_119 = { 1, 4, 30, 200, dialog_text_DIALOG_119 }; +static const struct DialogEntry dialog_entry_DIALOG_120 = { 1, 4, 30, 200, dialog_text_DIALOG_120 }; +static const struct DialogEntry dialog_entry_DIALOG_121 = { 1, 5, 30, 200, dialog_text_DIALOG_121 }; +static const struct DialogEntry dialog_entry_DIALOG_122 = { 1, 6, 30, 200, dialog_text_DIALOG_122 }; +static const struct DialogEntry dialog_entry_DIALOG_123 = { 1, 5, 30, 200, dialog_text_DIALOG_123 }; +static const struct DialogEntry dialog_entry_DIALOG_124 = { 1, 5, 30, 200, dialog_text_DIALOG_124 }; +static const struct DialogEntry dialog_entry_DIALOG_125 = { 1, 5, 30, 200, dialog_text_DIALOG_125 }; +static const struct DialogEntry dialog_entry_DIALOG_126 = { 1, 6, 30, 200, dialog_text_DIALOG_126 }; +static const struct DialogEntry dialog_entry_DIALOG_127 = { 1, 5, 30, 200, dialog_text_DIALOG_127 }; +static const struct DialogEntry dialog_entry_DIALOG_128 = { 1, 4, 95, 200, dialog_text_DIALOG_128 }; +static const struct DialogEntry dialog_entry_DIALOG_129 = { 1, 5, 30, 200, dialog_text_DIALOG_129 }; +static const struct DialogEntry dialog_entry_DIALOG_130 = { 1, 5, 30, 200, dialog_text_DIALOG_130 }; +static const struct DialogEntry dialog_entry_DIALOG_131 = { 1, 5, 30, 200, dialog_text_DIALOG_131 }; +static const struct DialogEntry dialog_entry_DIALOG_132 = { 1, 5, 30, 200, dialog_text_DIALOG_132 }; +static const struct DialogEntry dialog_entry_DIALOG_133 = { 1, 5, 30, 200, dialog_text_DIALOG_133 }; +static const struct DialogEntry dialog_entry_DIALOG_134 = { 1, 4, 30, 200, dialog_text_DIALOG_134 }; +static const struct DialogEntry dialog_entry_DIALOG_135 = { 1, 5, 30, 200, dialog_text_DIALOG_135 }; +static const struct DialogEntry dialog_entry_DIALOG_136 = { 1, 4, 30, 200, dialog_text_DIALOG_136 }; +static const struct DialogEntry dialog_entry_DIALOG_137 = { 1, 5, 30, 200, dialog_text_DIALOG_137 }; +static const struct DialogEntry dialog_entry_DIALOG_138 = { 1, 5, 30, 200, dialog_text_DIALOG_138 }; +static const struct DialogEntry dialog_entry_DIALOG_139 = { 1, 6, 30, 200, dialog_text_DIALOG_139 }; +static const struct DialogEntry dialog_entry_DIALOG_140 = { 1, 6, 30, 200, dialog_text_DIALOG_140 }; +static const struct DialogEntry dialog_entry_DIALOG_141 = { 1, 5, 150, 200, dialog_text_DIALOG_141 }; +static const struct DialogEntry dialog_entry_DIALOG_142 = { 1, 5, 150, 200, dialog_text_DIALOG_142 }; +static const struct DialogEntry dialog_entry_DIALOG_143 = { 1, 6, 150, 200, dialog_text_DIALOG_143 }; +static const struct DialogEntry dialog_entry_DIALOG_144 = { 1, 5, 150, 200, dialog_text_DIALOG_144 }; +static const struct DialogEntry dialog_entry_DIALOG_145 = { 1, 4, 150, 200, dialog_text_DIALOG_145 }; +static const struct DialogEntry dialog_entry_DIALOG_146 = { 1, 6, 150, 200, dialog_text_DIALOG_146 }; +static const struct DialogEntry dialog_entry_DIALOG_147 = { 1, 5, 30, 200, dialog_text_DIALOG_147 }; +static const struct DialogEntry dialog_entry_DIALOG_148 = { 1, 5, 30, 200, dialog_text_DIALOG_148 }; +static const struct DialogEntry dialog_entry_DIALOG_149 = { 1, 5, 30, 200, dialog_text_DIALOG_149 }; +static const struct DialogEntry dialog_entry_DIALOG_150 = { 1, 5, 30, 200, dialog_text_DIALOG_150 }; +static const struct DialogEntry dialog_entry_DIALOG_151 = { 1, 4, 30, 200, dialog_text_DIALOG_151 }; +static const struct DialogEntry dialog_entry_DIALOG_152 = { 1, 5, 30, 200, dialog_text_DIALOG_152 }; +static const struct DialogEntry dialog_entry_DIALOG_153 = { 1, 4, 30, 200, dialog_text_DIALOG_153 }; +static const struct DialogEntry dialog_entry_DIALOG_154 = { 1, 5, 30, 200, dialog_text_DIALOG_154 }; +static const struct DialogEntry dialog_entry_DIALOG_155 = { 1, 5, 30, 200, dialog_text_DIALOG_155 }; +static const struct DialogEntry dialog_entry_DIALOG_156 = { 1, 4, 30, 200, dialog_text_DIALOG_156 }; +static const struct DialogEntry dialog_entry_DIALOG_157 = { 1, 5, 30, 200, dialog_text_DIALOG_157 }; +static const struct DialogEntry dialog_entry_DIALOG_158 = { 1, 5, 30, 200, dialog_text_DIALOG_158 }; +static const struct DialogEntry dialog_entry_DIALOG_159 = { 1, 5, 30, 200, dialog_text_DIALOG_159 }; +static const struct DialogEntry dialog_entry_DIALOG_160 = { 1, 4, 30, 200, dialog_text_DIALOG_160 }; +static const struct DialogEntry dialog_entry_DIALOG_161 = { 1, 5, 30, 200, dialog_text_DIALOG_161 }; +static const struct DialogEntry dialog_entry_DIALOG_162 = { 1, 5, 30, 200, dialog_text_DIALOG_162 }; +static const struct DialogEntry dialog_entry_DIALOG_163 = { 1, 5, 30, 200, dialog_text_DIALOG_163 }; +static const struct DialogEntry dialog_entry_DIALOG_164 = { 1, 4, 30, 200, dialog_text_DIALOG_164 }; +static const struct DialogEntry dialog_entry_DIALOG_165 = { 1, 4, 30, 200, dialog_text_DIALOG_165 }; +static const struct DialogEntry dialog_entry_DIALOG_166 = { 1, 6, 30, 200, dialog_text_DIALOG_166 }; +static const struct DialogEntry dialog_entry_DIALOG_167 = { 1, 4, 30, 200, dialog_text_DIALOG_167 }; +static const struct DialogEntry dialog_entry_DIALOG_168 = { 1, 4, 30, 200, dialog_text_DIALOG_168 }; +static const struct DialogEntry dialog_entry_DIALOG_169 = { 1, 5, 30, 200, dialog_text_DIALOG_169 }; +const struct DialogEntry *const seg2_dialog_table[] = { +&dialog_entry_DIALOG_000, +&dialog_entry_DIALOG_001, +&dialog_entry_DIALOG_002, +&dialog_entry_DIALOG_003, +&dialog_entry_DIALOG_004, +&dialog_entry_DIALOG_005, +&dialog_entry_DIALOG_006, +&dialog_entry_DIALOG_007, +&dialog_entry_DIALOG_008, +&dialog_entry_DIALOG_009, +&dialog_entry_DIALOG_010, +&dialog_entry_DIALOG_011, +&dialog_entry_DIALOG_012, +&dialog_entry_DIALOG_013, +&dialog_entry_DIALOG_014, +&dialog_entry_DIALOG_015, +&dialog_entry_DIALOG_016, +&dialog_entry_DIALOG_017, +&dialog_entry_DIALOG_018, +&dialog_entry_DIALOG_019, +&dialog_entry_DIALOG_020, +&dialog_entry_DIALOG_021, +&dialog_entry_DIALOG_022, +&dialog_entry_DIALOG_023, +&dialog_entry_DIALOG_024, +&dialog_entry_DIALOG_025, +&dialog_entry_DIALOG_026, +&dialog_entry_DIALOG_027, +&dialog_entry_DIALOG_028, +&dialog_entry_DIALOG_029, +&dialog_entry_DIALOG_030, +&dialog_entry_DIALOG_031, +&dialog_entry_DIALOG_032, +&dialog_entry_DIALOG_033, +&dialog_entry_DIALOG_034, +&dialog_entry_DIALOG_035, +&dialog_entry_DIALOG_036, +&dialog_entry_DIALOG_037, +&dialog_entry_DIALOG_038, +&dialog_entry_DIALOG_039, +&dialog_entry_DIALOG_040, +&dialog_entry_DIALOG_041, +&dialog_entry_DIALOG_042, +&dialog_entry_DIALOG_043, +&dialog_entry_DIALOG_044, +&dialog_entry_DIALOG_045, +&dialog_entry_DIALOG_046, +&dialog_entry_DIALOG_047, +&dialog_entry_DIALOG_048, +&dialog_entry_DIALOG_049, +&dialog_entry_DIALOG_050, +&dialog_entry_DIALOG_051, +&dialog_entry_DIALOG_052, +&dialog_entry_DIALOG_053, +&dialog_entry_DIALOG_054, +&dialog_entry_DIALOG_055, +&dialog_entry_DIALOG_056, +&dialog_entry_DIALOG_057, +&dialog_entry_DIALOG_058, +&dialog_entry_DIALOG_059, +&dialog_entry_DIALOG_060, +&dialog_entry_DIALOG_061, +&dialog_entry_DIALOG_062, +&dialog_entry_DIALOG_063, +&dialog_entry_DIALOG_064, +&dialog_entry_DIALOG_065, +&dialog_entry_DIALOG_066, +&dialog_entry_DIALOG_067, +&dialog_entry_DIALOG_068, +&dialog_entry_DIALOG_069, +&dialog_entry_DIALOG_070, +&dialog_entry_DIALOG_071, +&dialog_entry_DIALOG_072, +&dialog_entry_DIALOG_073, +&dialog_entry_DIALOG_074, +&dialog_entry_DIALOG_075, +&dialog_entry_DIALOG_076, +&dialog_entry_DIALOG_077, +&dialog_entry_DIALOG_078, +&dialog_entry_DIALOG_079, +&dialog_entry_DIALOG_080, +&dialog_entry_DIALOG_081, +&dialog_entry_DIALOG_082, +&dialog_entry_DIALOG_083, +&dialog_entry_DIALOG_084, +&dialog_entry_DIALOG_085, +&dialog_entry_DIALOG_086, +&dialog_entry_DIALOG_087, +&dialog_entry_DIALOG_088, +&dialog_entry_DIALOG_089, +&dialog_entry_DIALOG_090, +&dialog_entry_DIALOG_091, +&dialog_entry_DIALOG_092, +&dialog_entry_DIALOG_093, +&dialog_entry_DIALOG_094, +&dialog_entry_DIALOG_095, +&dialog_entry_DIALOG_096, +&dialog_entry_DIALOG_097, +&dialog_entry_DIALOG_098, +&dialog_entry_DIALOG_099, +&dialog_entry_DIALOG_100, +&dialog_entry_DIALOG_101, +&dialog_entry_DIALOG_102, +&dialog_entry_DIALOG_103, +&dialog_entry_DIALOG_104, +&dialog_entry_DIALOG_105, +&dialog_entry_DIALOG_106, +&dialog_entry_DIALOG_107, +&dialog_entry_DIALOG_108, +&dialog_entry_DIALOG_109, +&dialog_entry_DIALOG_110, +&dialog_entry_DIALOG_111, +&dialog_entry_DIALOG_112, +&dialog_entry_DIALOG_113, +&dialog_entry_DIALOG_114, +&dialog_entry_DIALOG_115, +&dialog_entry_DIALOG_116, +&dialog_entry_DIALOG_117, +&dialog_entry_DIALOG_118, +&dialog_entry_DIALOG_119, +&dialog_entry_DIALOG_120, +&dialog_entry_DIALOG_121, +&dialog_entry_DIALOG_122, +&dialog_entry_DIALOG_123, +&dialog_entry_DIALOG_124, +&dialog_entry_DIALOG_125, +&dialog_entry_DIALOG_126, +&dialog_entry_DIALOG_127, +&dialog_entry_DIALOG_128, +&dialog_entry_DIALOG_129, +&dialog_entry_DIALOG_130, +&dialog_entry_DIALOG_131, +&dialog_entry_DIALOG_132, +&dialog_entry_DIALOG_133, +&dialog_entry_DIALOG_134, +&dialog_entry_DIALOG_135, +&dialog_entry_DIALOG_136, +&dialog_entry_DIALOG_137, +&dialog_entry_DIALOG_138, +&dialog_entry_DIALOG_139, +&dialog_entry_DIALOG_140, +&dialog_entry_DIALOG_141, +&dialog_entry_DIALOG_142, +&dialog_entry_DIALOG_143, +&dialog_entry_DIALOG_144, +&dialog_entry_DIALOG_145, +&dialog_entry_DIALOG_146, +&dialog_entry_DIALOG_147, +&dialog_entry_DIALOG_148, +&dialog_entry_DIALOG_149, +&dialog_entry_DIALOG_150, +&dialog_entry_DIALOG_151, +&dialog_entry_DIALOG_152, +&dialog_entry_DIALOG_153, +&dialog_entry_DIALOG_154, +&dialog_entry_DIALOG_155, +&dialog_entry_DIALOG_156, +&dialog_entry_DIALOG_157, +&dialog_entry_DIALOG_158, +&dialog_entry_DIALOG_159, +&dialog_entry_DIALOG_160, +&dialog_entry_DIALOG_161, +&dialog_entry_DIALOG_162, +&dialog_entry_DIALOG_163, +&dialog_entry_DIALOG_164, +&dialog_entry_DIALOG_165, +&dialog_entry_DIALOG_166, +&dialog_entry_DIALOG_167, +&dialog_entry_DIALOG_168, +&dialog_entry_DIALOG_169, + NULL +}; +static const u8 GLUE2(seg2_course_name_table, _COURSE_BOB)[] = { 0x9E,0x01,0x9E,0xF0,0x8D,0x90,0x5C,0x41,0x58,0x9E,0x4D,0x6D,0xF0,0x4B,0xA4,0x42,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_WF)[] = { 0x9E,0x02,0x9E,0xF0,0x89,0xD1,0x7F,0x9D,0x76,0x9D,0xF0,0x77,0x58,0x9E,0x53,0x67,0xF0,0x52,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_JRB)[] = { 0x9E,0x03,0x9E,0x45,0x41,0xF0,0x4E,0x47,0x58,0x9E,0x41,0x67,0x43,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_CCM)[] = { 0x9E,0x04,0x9E,0x4A,0x60,0x41,0x4A,0x60,0x41,0x9E,0x8E,0x72,0x9D,0x82,0x9D,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_BBH)[] = { 0x9E,0x05,0x9E,0x82,0x99,0x7A,0x58,0x9E,0x8D,0x96,0x9F,0x89,0x72,0x7C,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_HMC)[] = { 0x9E,0x06,0x9E,0x63,0x5F,0x55,0x53,0x48,0x68,0x9E,0xF0,0x53,0x42,0x47,0x51,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_LLL)[] = { 0x9E,0x07,0x9E,0x8B,0xD5,0x71,0x70,0xF0,0x89,0xF0,0x8B,0x98,0x9E,0x96,0x9D,0xF0,0x83,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_SSL)[] = { 0x9E,0x08,0x9E,0x40,0xA1,0x50,0xA1,0x50,0x9E,0x4A,0xF0,0x59,0x47,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_DDD)[] = { 0x9E,0x09,0x9E,0x72,0xD8,0x9F,0x7F,0x9F,0x9E,0x96,0x9D,0xF0,0x83,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_SL)[] = { 0x01,0x00,0x9E,0x7C,0x88,0x9F,0x8E,0x9D,0xF0,0x7C,0x9E,0x96,0x9D,0xF0,0x83,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_WDW)[] = { 0x01,0x01,0x9E,0x5F,0xF0,0x4C,0xF0,0x5A,0x4F,0x7B,0x82,0xD6,0x9F,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_TTM)[] = { 0x01,0x02,0x9E,0x4F,0x45,0x41,0x4F,0x45,0x41,0x8E,0x72,0x9D,0x82,0x9D,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_THI)[] = { 0x01,0x03,0x9E,0x50,0xF0,0x5A,0xF0,0x52,0x45,0x9E,0x70,0x71,0x96,0x9D,0xF0,0x83,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_TTC)[] = { 0x01,0x04,0x9E,0x80,0xD1,0x77,0x7F,0xD1,0x77,0x9A,0xD1,0x77,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_RR)[] = { 0x01,0x05,0x9E,0x99,0x71,0x9D,0xF0,0x8D,0x9F,0x9E,0x77,0x98,0x9F,0xF0,0x7C,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_BITDW)[] = { 0x9E,0x9E,0x9E,0x63,0x5F,0x58,0x9E,0x4D,0x45,0x41,0x58,0x9E,0x77,0xD1,0xF1,0x89,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_BITFS)[] = { 0x9E,0x9E,0x9E,0x5D,0x58,0x44,0x58,0x9E,0x42,0x5F,0x58,0x9E,0x77,0xD1,0xF1,0x89,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_BITS)[] = { 0x9E,0x9E,0x9E,0x52,0x6D,0x47,0x42,0x58,0x9E,0x4F,0x4F,0x45,0x41,0xF2,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_PSS)[] = { 0x9E,0x9E,0x9E,0xF1,0x8A,0x9F,0x80,0x58,0x45,0x47,0x69,0x7C,0x96,0x71,0xF0,0x7F,0x9F,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_COTMC)[] = { 0x9E,0x9E,0x9E,0x91,0x7F,0x98,0x7C,0x71,0xD1,0x80,0x58,0x9E,0x4F,0x46,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_TOTWC)[] = { 0x9E,0x9E,0x9E,0x59,0xF0,0x59,0x4F,0x48,0xF2,0x59,0x57,0x7C,0x71,0xD1,0x80,0x5C,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_VCUTM)[] = { 0x9E,0x9E,0x9E,0x44,0x5D,0x67,0x58,0x53,0x42,0x61,0x41,0x7C,0x71,0xD1,0x80,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_WMOTR)[] = { 0x9E,0x9E,0x9E,0x55,0xF0,0x4B,0x9E,0x45,0x48,0x68,0x9E,0x59,0x57,0x8E,0x97,0x74,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_SA)[] = { 0x9E,0x9E,0x9E,0x44,0x4A,0x45,0x54,0x53,0x9E,0x41,0xA1,0x4B,0xA4,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _COURSE_CAKE_END)[] = { 0x9E,0x9E,0x9E,0x44,0x41,0x4B,0x41,0x78,0x9F,0x76,0xFF }; +static const u8 GLUE2(seg2_course_name_table, _castle_secret_stars)[] = { 0x9E,0x9E,0x9E,0x44,0x4B,0x6A,0x58,0x45,0x47,0x69,0x7C,0x7F,0x9F,0xFF }; + + + + + + + +const u8 *const seg2_course_name_table[] = { +GLUE2(seg2_course_name_table, _COURSE_BOB), +GLUE2(seg2_course_name_table, _COURSE_WF), +GLUE2(seg2_course_name_table, _COURSE_JRB), +GLUE2(seg2_course_name_table, _COURSE_CCM), +GLUE2(seg2_course_name_table, _COURSE_BBH), +GLUE2(seg2_course_name_table, _COURSE_HMC), +GLUE2(seg2_course_name_table, _COURSE_LLL), +GLUE2(seg2_course_name_table, _COURSE_SSL), +GLUE2(seg2_course_name_table, _COURSE_DDD), +GLUE2(seg2_course_name_table, _COURSE_SL), +GLUE2(seg2_course_name_table, _COURSE_WDW), +GLUE2(seg2_course_name_table, _COURSE_TTM), +GLUE2(seg2_course_name_table, _COURSE_THI), +GLUE2(seg2_course_name_table, _COURSE_TTC), +GLUE2(seg2_course_name_table, _COURSE_RR), +GLUE2(seg2_course_name_table, _COURSE_BITDW), +GLUE2(seg2_course_name_table, _COURSE_BITFS), +GLUE2(seg2_course_name_table, _COURSE_BITS), +GLUE2(seg2_course_name_table, _COURSE_PSS), +GLUE2(seg2_course_name_table, _COURSE_COTMC), +GLUE2(seg2_course_name_table, _COURSE_TOTWC), +GLUE2(seg2_course_name_table, _COURSE_VCUTM), +GLUE2(seg2_course_name_table, _COURSE_WMOTR), +GLUE2(seg2_course_name_table, _COURSE_SA), +GLUE2(seg2_course_name_table, _COURSE_CAKE_END), +GLUE2(seg2_course_name_table, _castle_secret_stars), + + + + + + + + NULL +}; +static const u8 act_name_COURSE_BOB_1[] = { 0x63,0x5E,0x58,0x42,0x43,0x58,0x9E,0xF0,0x8D,0x90,0x76,0x9D,0xF0,0x77,0xFF }; static const u8 act_name_COURSE_BOB_2[] = { 0x59,0x47,0x57,0x51,0x9E,0x88,0x79,0x88,0x79,0x99,0x9F,0x7C,0xFF }; static const u8 act_name_COURSE_BOB_3[] = { 0x4E,0x66,0x58,0x4B,0x5E,0x5E,0xF0,0x52,0x9E,0xF0,0x5B,0xA1,0x53,0xF0,0x5C,0xFF }; static const u8 act_name_COURSE_BOB_4[] = { 0x08,0x5E,0x41,0x58,0x9E,0x40,0x45,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_BOB_5[] = { 0x4E,0x66,0x55,0x59,0xF0,0x59,0x4F,0x48,0x9E,0x59,0x57,0x8E,0x97,0x74,0xFF }; static const u8 act_name_COURSE_BOB_6[] = { 0x9B,0x9D,0x9B,0x9D,0x58,0x9E,0x41,0x56,0xF0,0x49,0x63,0xF0,0x52,0xFF }; +static const u8 act_name_COURSE_WF_1[] = { 0x41,0x45,0x67,0x58,0xF0,0x89,0xD1,0x7F,0x9D,0x9E,0x76,0x9D,0xF0,0x77,0xFF }; static const u8 act_name_COURSE_WF_2[] = { 0x53,0x67,0xF0,0x52,0x58,0x9E,0x52,0xA1,0xF1,0x5C,0x6D,0x5C,0xFF }; static const u8 act_name_COURSE_WF_3[] = { 0x4F,0x41,0x5D,0x42,0xF0,0x52,0x9E,0x5A,0x53,0xA1,0x53,0xF0,0x5A,0xFF }; static const u8 act_name_COURSE_WF_4[] = { 0x42,0x46,0x4B,0x5E,0x58,0x9E,0x08,0x5E,0x41,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_WF_5[] = { 0x53,0x67,0x45,0xF0,0x49,0x5C,0x9E,0x7C,0x83,0x9F,0x9D,0xFF }; static const u8 act_name_COURSE_WF_6[] = { 0x4F,0x41,0x5D,0x42,0xF0,0x52,0x9E,0xF0,0x5B,0xA1,0x49,0x6B,0x4D,0xF2,0xFF }; +static const u8 act_name_COURSE_JRB_1[] = { 0x50,0x6D,0xF0,0x5D,0x51,0x4D,0x6D,0x58,0x9E,0x44,0x4F,0x45,0x66,0xFF }; static const u8 act_name_COURSE_JRB_2[] = { 0xF0,0x52,0x52,0x49,0x41,0x9E,0x46,0xA4,0xF0,0x4F,0x41,0x72,0x81,0xF0,0x8D,0xFF }; static const u8 act_name_COURSE_JRB_3[] = { 0x45,0x41,0x52,0x41,0xF0,0x53,0x42,0x47,0x51,0x58,0x9E,0x44,0x4F,0x45,0x66,0xFF }; static const u8 act_name_COURSE_JRB_4[] = { 0x42,0x45,0x6D,0xF0,0x4F,0x8B,0x87,0x58,0x9E,0x40,0x45,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_JRB_5[] = { 0x41,0x6B,0x58,0x59,0x4B,0x66,0x5C,0x9E,0x5A,0x53,0xA1,0x53,0xF0,0x5A,0xFF }; static const u8 act_name_COURSE_JRB_6[] = { 0x5B,0x46,0xF0,0x4F,0x4C,0x9E,0x5F,0xF0,0x4C,0x6C,0x9E,0x47,0xF0,0x47,0x69,0xFF }; +static const u8 act_name_COURSE_CCM_1[] = { 0x7C,0x9F,0xF1,0x89,0x9F,0x7C,0x88,0x9F,0x7C,0x96,0x71,0xF0,0x7F,0x9F,0xFF }; static const u8 act_name_COURSE_CCM_2[] = { 0x5E,0x41,0xF0,0x49,0x58,0x9E,0x49,0xF1,0x8C,0x9D,0xF0,0x76,0x9D,0xFF }; static const u8 act_name_COURSE_CCM_3[] = { 0xF1,0x8C,0x9D,0xF0,0x76,0x9D,0x9E,0x80,0xD2,0x9D,0xF1,0x8A,0x74,0x9D,0x99,0x9F,0x7C,0xFF }; static const u8 act_name_COURSE_CCM_4[] = { 0x4C,0xF0,0x5C,0xA1,0x52,0x9E,0x08,0x5E,0x41,0x40,0x45,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_CCM_5[] = { 0xF0,0x79,0x9A,0xF0,0x79,0x9A,0x9E,0x64,0x46,0xF0,0x7F,0x98,0x8E,0xFF }; static const u8 act_name_COURSE_CCM_6[] = { 0x45,0x47,0x69,0x9E,0x7C,0x9F,0xF1,0x89,0x9F,0x9E,0x75,0xF0,0x8C,0x76,0xD1,0x77,0xFF }; +static const u8 act_name_COURSE_BBH_1[] = { 0x44,0x63,0x45,0x4F,0x82,0x99,0x7A,0x6C,0x9E,0x4A,0xF0,0x45,0x4D,0xFF }; static const u8 act_name_COURSE_BBH_2[] = { 0x82,0x99,0x7A,0x58,0x9E,0x91,0x97,0x9F,0xF0,0x79,0x9F,0x96,0x9D,0xF0,0x83,0xFF }; static const u8 act_name_COURSE_BBH_3[] = { 0x5D,0x6D,0xF0,0x4F,0x54,0x74,0xF0,0x89,0x78,0x58,0x9E,0x84,0xF0,0x7E,0xFF }; static const u8 act_name_COURSE_BBH_4[] = { 0x08,0x5E,0x41,0x79,0x71,0x9D,0x59,0x9E,0xF0,0x53,0x49,0xF0,0x4F,0xFF }; static const u8 act_name_COURSE_BBH_5[] = { 0xF0,0x89,0x98,0x79,0x85,0x9F,0x58,0x9E,0xF0,0x8D,0x7C,0x82,0x99,0x7A,0xFF }; static const u8 act_name_COURSE_BBH_6[] = { 0x45,0x47,0x4B,0xF0,0x5C,0x63,0x58,0x9E,0x44,0x44,0x61,0xF0,0x4F,0x5E,0xFF }; +static const u8 act_name_COURSE_HMC_1[] = { 0xF0,0x83,0xD1,0x7B,0x9F,0x58,0x41,0x68,0x9E,0x50,0x52,0x41,0x49,0xFF }; static const u8 act_name_COURSE_HMC_2[] = { 0x4E,0x42,0x4A,0x97,0x8B,0x83,0x58,0x9E,0x40,0x45,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_HMC_3[] = { 0x91,0x7F,0x98,0xF0,0x52,0x9E,0xF0,0x7F,0xD1,0x7B,0xD3,0xFF }; static const u8 act_name_COURSE_HMC_4[] = { 0x78,0x90,0x97,0x61,0x41,0x6A,0x6C,0x9E,0x56,0x48,0x52,0xFF }; static const u8 act_name_COURSE_HMC_5[] = { 0x78,0x90,0x97,0x61,0x41,0x6A,0x58,0x9E,0x5A,0xF0,0x4B,0xA4,0x42,0xF0,0x47,0x50,0xFF }; static const u8 act_name_COURSE_HMC_6[] = { 0xF0,0x79,0x9A,0xF0,0x79,0x9A,0x41,0x6B,0x58,0x9E,0x5A,0x5F,0x51,0xFF }; +static const u8 act_name_COURSE_LLL_1[] = { 0x44,0x53,0x4D,0x9E,0xF0,0x8D,0x7C,0xF0,0x53,0x6D,0x48,0x51,0xFF }; static const u8 act_name_COURSE_LLL_2[] = { 0x4F,0x4F,0x45,0x43,0xF2,0xF0,0x53,0x6D,0x48,0x51,0x4F,0x41,0xFF }; static const u8 act_name_COURSE_LLL_3[] = { 0x01,0x05,0xF1,0x89,0xF0,0x7C,0x98,0x58,0x9E,0x08,0x5E,0x41,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_LLL_4[] = { 0x79,0x9A,0x79,0x9A,0x9E,0x5E,0x68,0x4F,0x6B,0x4F,0x67,0xFF }; static const u8 act_name_COURSE_LLL_5[] = { 0x45,0xF0,0x4A,0x6D,0x58,0x9E,0xF1,0x89,0x9B,0x9F,0x7C,0x7F,0x9F,0xFF }; static const u8 act_name_COURSE_LLL_6[] = { 0x45,0xF0,0x4A,0x6D,0x58,0x9E,0x97,0x8B,0x83,0x81,0x70,0x9F,0xFF }; +static const u8 act_name_COURSE_SSL_1[] = { 0x41,0x4F,0xF0,0x4C,0x66,0x89,0xF0,0x78,0x4F,0x45,0x9E,0xF0,0x7B,0xD2,0x9D,0xF0,0x79,0xFF }; static const u8 act_name_COURSE_SSL_2[] = { 0xF1,0x8A,0x96,0x8F,0xD1,0xF0,0x83,0x58,0x9E,0x52,0xA1,0xF1,0x5C,0x6D,0xF0,0x52,0xFF }; static const u8 act_name_COURSE_SSL_3[] = { 0x46,0xA4,0xF0,0x4F,0x41,0xF1,0x8A,0x96,0x8F,0xD1,0xF0,0x83,0x58,0x9E,0x54,0x41,0xF0,0x5B,0xFF }; static const u8 act_name_COURSE_SSL_4[] = { 0x04,0x51,0x58,0x59,0x4B,0x66,0x55,0x9E,0x4F,0x51,0x62,0x58,0x5C,0xFF }; static const u8 act_name_COURSE_SSL_5[] = { 0x53,0xF0,0x5A,0x5E,0x6B,0x69,0x9E,0x08,0x5E,0x41,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_SSL_6[] = { 0x46,0xA4,0xF0,0x4F,0x41,0xF1,0x8A,0x96,0x8F,0xD1,0xF0,0x83,0x58,0x84,0xF0,0x7E,0xFF }; +static const u8 act_name_COURSE_DDD_1[] = { 0x77,0xD1,0xF1,0x89,0x58,0x9E,0x4D,0x6D,0x4C,0x41,0x45,0x6D,0xFF }; static const u8 act_name_COURSE_DDD_2[] = { 0x42,0xF0,0x4C,0x4B,0x44,0x58,0x9E,0x4F,0x45,0x66,0xF0,0x59,0x49,0xFF }; static const u8 act_name_COURSE_DDD_3[] = { 0x55,0xF0,0x48,0x4F,0x77,0xD1,0xF1,0x89,0x58,0x9E,0x40,0x45,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_DDD_4[] = { 0x5B,0x46,0xF0,0x4F,0x4C,0x9E,0x5F,0xF0,0x4C,0x6C,0x9E,0x47,0xF0,0x47,0x69,0xFF }; static const u8 act_name_COURSE_DDD_5[] = { 0x8E,0x9D,0x7F,0x58,0x9E,0x44,0x47,0x67,0x62,0x58,0xFF }; static const u8 act_name_COURSE_DDD_6[] = { 0xF0,0x8D,0x72,0x7B,0xF0,0x45,0x9E,0x4E,0x6A,0xA1,0x4F,0x66,0xFF }; +static const u8 act_name_COURSE_SL_1[] = { 0x44,0x44,0x64,0x46,0xF0,0x7F,0x98,0x8E,0x58,0x9E,0x44,0xF0,0x52,0x49,0xFF }; static const u8 act_name_COURSE_SL_2[] = { 0x49,0x44,0x67,0x58,0x47,0x55,0x58,0x9E,0xF0,0x53,0x6D,0x48,0x51,0xFF }; static const u8 act_name_COURSE_SL_3[] = { 0x49,0x44,0x67,0x58,0x9E,0x74,0xF0,0x8B,0xF0,0x7B,0xD0,0xFF }; static const u8 act_name_COURSE_SL_4[] = { 0x51,0x61,0x4F,0x41,0x9E,0x41,0x48,0x6C,0x9E,0x49,0x43,0x52,0xFF }; static const u8 act_name_COURSE_SL_5[] = { 0x79,0x72,0x96,0x55,0x58,0xA1,0x52,0x9E,0x40,0x45,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_SL_6[] = { 0x8B,0x9B,0x8B,0x9B,0x4A,0x6D,0x58,0x9E,0x44,0x42,0x50,0xFF }; +static const u8 act_name_COURSE_WDW_1[] = { 0xF0,0x8A,0x97,0xF0,0x8A,0x97,0x58,0x9E,0x5E,0x61,0x97,0x8B,0x83,0xFF }; static const u8 act_name_COURSE_WDW_2[] = { 0x83,0xD1,0xF1,0x8B,0x74,0xF0,0x8B,0x9E,0xF0,0x7A,0x9E,0x7B,0x82,0xD6,0x9F,0xFF }; static const u8 act_name_COURSE_WDW_3[] = { 0x40,0x4A,0x4D,0x53,0x9E,0x4E,0x66,0x58,0x7B,0x9F,0x77,0x99,0xD1,0x83,0xFF }; static const u8 act_name_COURSE_WDW_4[] = { 0x41,0x4E,0xF0,0x48,0xF2,0x45,0x54,0x40,0x5F,0x73,0x99,0xF0,0x8C,0x9F,0x7F,0x9F,0xFF }; static const u8 act_name_COURSE_WDW_5[] = { 0xF0,0x7F,0x72,0x9D,0x7F,0x72,0x9D,0x58,0x9E,0x40,0x45,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_WDW_6[] = { 0xF0,0x7F,0x72,0x9D,0x7F,0x72,0x9D,0x6C,0x9E,0x45,0x48,0x6A,0xFF }; +static const u8 act_name_COURSE_TTM_1[] = { 0x4F,0x45,0x41,0x4F,0x45,0x41,0x9E,0x63,0x5E,0x58,0x42,0x43,0xFF }; static const u8 act_name_COURSE_TTM_2[] = { 0x41,0x4F,0xF0,0x4C,0x66,0xF0,0x7A,0x98,0x9E,0x72,0xD1,0x76,0xD6,0x58,0x74,0x97,0xFF }; static const u8 act_name_COURSE_TTM_3[] = { 0x44,0xF0,0x59,0x48,0x76,0x88,0x79,0x58,0x9E,0x40,0x45,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_TTM_4[] = { 0x8E,0x72,0x9D,0x82,0x9D,0x9E,0x7C,0x96,0x71,0xF0,0x7F,0x9F,0xFF }; static const u8 act_name_COURSE_TTM_5[] = { 0x59,0x4B,0x58,0x42,0x43,0x45,0x66,0x9E,0x5F,0x6B,0x4F,0x4D,0xF0,0x59,0xFF }; static const u8 act_name_COURSE_TTM_6[] = { 0xF0,0x5B,0xA1,0x53,0xF0,0x5C,0x9E,0x59,0x54,0x69,0x76,0x88,0x79,0x5C,0xFF }; +static const u8 act_name_COURSE_THI_1[] = { 0x46,0xA4,0xF0,0x4F,0x41,0xF1,0x89,0xD1,0x77,0x9D,0x8B,0x96,0x9B,0x9F,0xFF }; static const u8 act_name_COURSE_THI_2[] = { 0xF0,0x82,0x75,0xF0,0x4B,0x5E,0x58,0x9E,0x52,0xA1,0xF1,0x5C,0x6D,0xF0,0x52,0xFF }; static const u8 act_name_COURSE_THI_3[] = { 0x88,0x79,0x88,0x79,0x9E,0x97,0x7F,0x9F,0x9D,0x8E,0xD1,0x80,0xFF }; static const u8 act_name_COURSE_THI_4[] = { 0x80,0xF0,0x8A,0xF0,0x4B,0x5E,0x58,0x9E,0x05,0x7B,0x9F,0x77,0x99,0xD1,0x83,0xFF }; static const u8 act_name_COURSE_THI_5[] = { 0x89,0x84,0x80,0xD2,0x9D,0x58,0x9E,0x40,0x45,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_THI_6[] = { 0x71,0x75,0x97,0x58,0x9E,0x89,0x84,0x80,0xD2,0x9D,0xFF }; +static const u8 act_name_COURSE_TTC_1[] = { 0xF0,0x77,0x98,0xF0,0x77,0x98,0x9E,0x45,0xF0,0x49,0x58,0x54,0x45,0x5C,0xFF }; static const u8 act_name_COURSE_TTC_2[] = { 0x5B,0x67,0x49,0x58,0x9E,0x5C,0x63,0xFF }; static const u8 act_name_COURSE_TTC_3[] = { 0x80,0xD1,0x77,0x7F,0xD1,0x77,0x59,0x67,0x58,0x9E,0x42,0x43,0xFF }; static const u8 act_name_COURSE_TTC_4[] = { 0x43,0xA1,0x5C,0x6D,0x9E,0x52,0xA1,0xF1,0x5C,0x6D,0x9E,0xF0,0x83,0xD1,0x7C,0x9D,0xFF }; static const u8 act_name_COURSE_TTC_5[] = { 0x51,0x46,0xF0,0x4F,0x4B,0x6C,0x9E,0x58,0x67,0x49,0x43,0x52,0xFF }; static const u8 act_name_COURSE_TTC_6[] = { 0x00,0x00,0x5B,0x6D,0x58,0x9E,0x40,0x45,0x79,0x71,0x9D,0xFF }; +static const u8 act_name_COURSE_RR_1[] = { 0x55,0xF0,0x4B,0x6C,0x9E,0x6B,0x4F,0x68,0x9E,0x5B,0x57,0xFF }; static const u8 act_name_COURSE_RR_2[] = { 0x52,0x6D,0x47,0x42,0x58,0x9E,0x44,0x63,0x4B,0x46,0xFF }; static const u8 act_name_COURSE_RR_3[] = { 0x7F,0x82,0x61,0x41,0x6A,0x58,0x9E,0x40,0x45,0x79,0x71,0x9D,0xFF }; static const u8 act_name_COURSE_RR_4[] = { 0x75,0xF0,0x7D,0x46,0x68,0x9E,0x46,0xA4,0xF0,0x4F,0x41,0xF0,0x8B,0x96,0x9D,0x79,0xFF }; static const u8 act_name_COURSE_RR_5[] = { 0x44,0x44,0xF0,0x4E,0x66,0x9E,0x70,0x7C,0x99,0x80,0xD1,0x77,0xFF }; static const u8 act_name_COURSE_RR_6[] = { 0x55,0xF0,0x4B,0x58,0x9E,0x45,0x54,0x4F,0x58,0x9E,0x4B,0x5E,0xFF }; + + + + + + + + + + + +static const u8 extra_text_0[] = { 0x44,0x4B,0x6A,0x58,0x45,0x47,0x69,0x7C,0x7F,0x9F,0xFF }; +static const u8 extra_text_1[] = { 0x01,0x00,0x00,0x5E,0x41,0x79,0x71,0x9D,0x58,0x9E,0x7C,0x7F,0x9F,0xFF }; +static const u8 extra_text_2[] = { 0x8E,0x72,0x9D,0x82,0x9D,0x58,0x5C,0x63,0xF0,0x45,0x9E,0x5A,0x66,0x47,0xF2,0xFF }; +static const u8 extra_text_3[] = { 0x5F,0xF0,0x4C,0x53,0x64,0x46,0x02,0x51,0x58,0x5C,0x63,0xF0,0x45,0x9E,0x5A,0x66,0x47,0xF2,0xFF }; +static const u8 extra_text_4[] = { 0x44,0x44,0x46,0x54,0x5D,0x4B,0x58,0x9E,0xF0,0x83,0x70,0xF0,0x45,0x5A,0x66,0x47,0xF2,0xFF }; +static const u8 extra_text_5[] = { 0x77,0xD1,0xF1,0x89,0x5C,0x58,0x9E,0x53,0xF0,0x5A,0x66,0xF0,0x45,0x5A,0x66,0x47,0xF2,0xFF }; +static const u8 extra_text_6[] = { 0x03,0xF0,0x45,0x41,0x5C,0x58,0x9E,0x53,0xF0,0x5A,0x66,0xF0,0x45,0x5A,0x66,0x47,0xF2,0xFF }; +const u8 *const seg2_act_name_table[] = { +act_name_COURSE_BOB_1, act_name_COURSE_BOB_2, act_name_COURSE_BOB_3, act_name_COURSE_BOB_4, act_name_COURSE_BOB_5, act_name_COURSE_BOB_6, +act_name_COURSE_WF_1, act_name_COURSE_WF_2, act_name_COURSE_WF_3, act_name_COURSE_WF_4, act_name_COURSE_WF_5, act_name_COURSE_WF_6, +act_name_COURSE_JRB_1, act_name_COURSE_JRB_2, act_name_COURSE_JRB_3, act_name_COURSE_JRB_4, act_name_COURSE_JRB_5, act_name_COURSE_JRB_6, +act_name_COURSE_CCM_1, act_name_COURSE_CCM_2, act_name_COURSE_CCM_3, act_name_COURSE_CCM_4, act_name_COURSE_CCM_5, act_name_COURSE_CCM_6, +act_name_COURSE_BBH_1, act_name_COURSE_BBH_2, act_name_COURSE_BBH_3, act_name_COURSE_BBH_4, act_name_COURSE_BBH_5, act_name_COURSE_BBH_6, +act_name_COURSE_HMC_1, act_name_COURSE_HMC_2, act_name_COURSE_HMC_3, act_name_COURSE_HMC_4, act_name_COURSE_HMC_5, act_name_COURSE_HMC_6, +act_name_COURSE_LLL_1, act_name_COURSE_LLL_2, act_name_COURSE_LLL_3, act_name_COURSE_LLL_4, act_name_COURSE_LLL_5, act_name_COURSE_LLL_6, +act_name_COURSE_SSL_1, act_name_COURSE_SSL_2, act_name_COURSE_SSL_3, act_name_COURSE_SSL_4, act_name_COURSE_SSL_5, act_name_COURSE_SSL_6, +act_name_COURSE_DDD_1, act_name_COURSE_DDD_2, act_name_COURSE_DDD_3, act_name_COURSE_DDD_4, act_name_COURSE_DDD_5, act_name_COURSE_DDD_6, +act_name_COURSE_SL_1, act_name_COURSE_SL_2, act_name_COURSE_SL_3, act_name_COURSE_SL_4, act_name_COURSE_SL_5, act_name_COURSE_SL_6, +act_name_COURSE_WDW_1, act_name_COURSE_WDW_2, act_name_COURSE_WDW_3, act_name_COURSE_WDW_4, act_name_COURSE_WDW_5, act_name_COURSE_WDW_6, +act_name_COURSE_TTM_1, act_name_COURSE_TTM_2, act_name_COURSE_TTM_3, act_name_COURSE_TTM_4, act_name_COURSE_TTM_5, act_name_COURSE_TTM_6, +act_name_COURSE_THI_1, act_name_COURSE_THI_2, act_name_COURSE_THI_3, act_name_COURSE_THI_4, act_name_COURSE_THI_5, act_name_COURSE_THI_6, +act_name_COURSE_TTC_1, act_name_COURSE_TTC_2, act_name_COURSE_TTC_3, act_name_COURSE_TTC_4, act_name_COURSE_TTC_5, act_name_COURSE_TTC_6, +act_name_COURSE_RR_1, act_name_COURSE_RR_2, act_name_COURSE_RR_3, act_name_COURSE_RR_4, act_name_COURSE_RR_5, act_name_COURSE_RR_6, + + + + + + + + + + + +extra_text_0, +extra_text_1, +extra_text_2, +extra_text_3, +extra_text_4, +extra_text_5, +extra_text_6, + NULL +}; diff --git a/docs/building.md b/docs/building.md new file mode 100644 index 00000000..627cfcc4 --- /dev/null +++ b/docs/building.md @@ -0,0 +1,112 @@ +# Building Ghostship + +## Setting Up CubeOS + +1. Clone the CubeOS repository and follow the build instructions. +2. Run the executable passing the path to your ROM as an argument. +3. You should now have a smcube.otr in the root folder of the repository, which will be needed when running this application. + +## Windows + +Requires: + * Visual Studio 2022 Community Edition with the C++ feature set + * One of the Windows SDKs that comes with Visual Studio, for example the current Windows 10 version 10.0.19041.0 + * The `MSVC v142 - VS 2019 C++ build tools` component of Visual Studio + * Git (can be installed manually or as part of Visual Studio) + * Cmake (can be installed via chocolatey or manually) + +### Clone the Ghostship repository + +_Note: Be sure to either clone with the ``--recursive`` flag or do ``git submodule update --init`` after cloning to pull in the libultraship submodule!_ + +### Building Ghostship + +_Note: Instructions assume using powershell_ +```powershell +# Navigate to the Ghostship repo within powershell. ie: cd "C:\yourpath\Ghostship" +cd Ghostship + +# Setup cmake project +& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 17 2022" -T v142 -A x64 -DCMAKE_BUILD_TYPE=Debug +# or for VS2019 +& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 16 2019" -T v142 -A x64 -DCMAKE_BUILD_TYPE=Debug +# Compile project +& 'C:\Program Files\CMake\bin\cmake.exe' --build .\build\x64 # --config Release (if you're packaging) + +# If you need to clean the project you can run +& 'C:\Program Files\CMake\bin\cmake.exe' --build .\build\x64 --target clean + +#### Visual Studio +To develop using Visual Studio you only need to use cmake to generate the solution file: +```powershell +# Generates Ghostship.sln at `build/x64` for Visual Studio 2022 +& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 17 2022" -T v142 -A x64 +# or for Visual Studio 2019 +& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 16 2019" -T v142 -A x64 +``` + +### Running the executable + +1. Copy over the smcube.otr you have generated into the directory containing your executable, e.g. `.\build\x64\Debug` +2. Download the latest `sm64.otr` from the pins in the discord channel and place that in the same directory as you smcube.otr +3. Now you can run the executable directly or from Visual Studio + +## Linux +Requires `gcc >= 10, x11, sdl2 >= 2.0.22, libpng, ninja, cmake, lld` + +**Important: For maximum performance make sure you have ninja build tools installed!** + +_Note: If you're using Visual Studio Code, the [cpack plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._ + +### Building Ghostship + +```bash +# Clone the repo +git clone https://github.com/HarbourMasters/Ghostship.git +cd Ghostship +# Clone the submodule libultraship +git submodule update --init +# Generate Ninja project +cmake -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE= Debug +# Compile the project +cmake --build build-cmake + +# If you need to clean the project you can run +cmake --build build-cmake --target clean +``` + +### Running the executable + +1. Copy over the smcube.otr you have generated into the root directory if the repository +2. Download the latest `sm64.otr` from the pins in the discord channel and place that in the build directory, e.g. `./build-cmake` +3. Now you can run the executable directly or from Visual Studio Code + +## macOS +Requires Xcode (or xcode-tools) && `ninja, cmake` (can be installed via homebrew, macports, etc) + +**Important: For maximum performance make sure you have ninja build tools installed!** + +_Note: If you're using Visual Studio Code, the [cpack plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._ + +### Building Ghostship + +```bash +# Clone the repo +git clone https://github.com/HarbourMasters/Ghostship.git +cd Ghostship +# Clone the submodule libultraship +git submodule update --init +# Generate Ninja project +cmake -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE=Debug +# Compile the project +cmake --build build-cmake + +# If you need to clean the project you can run +cmake --build build-cmake --target clean +``` + +### Running the executable + +1. Copy over the smcube.otr you have generated into the root directory if the repository +2. Download the latest `sm64.otr` from the pins in the discord channel and place that in the build directory, e.g. `./build-cmake` +3. Now you can run the executable directly or from Visual Studio Code diff --git a/docs/poweredbylus.darkmode.png b/docs/poweredbylus.darkmode.png new file mode 100644 index 00000000..2e266081 Binary files /dev/null and b/docs/poweredbylus.darkmode.png differ diff --git a/docs/poweredbylus.lightmode.png b/docs/poweredbylus.lightmode.png new file mode 100644 index 00000000..74067541 Binary files /dev/null and b/docs/poweredbylus.lightmode.png differ diff --git a/include/banks_table.h b/include/banks_table.h deleted file mode 100644 index b1a3bad5..00000000 --- a/include/banks_table.h +++ /dev/null @@ -1,129 +0,0 @@ -#pragma once -#include "align_asset_macro.h" - -#define dgBank00 "__OTR__sound/banks/00_bank" -static const ALIGN_ASSET(2) char gBank00[] = dgBank00; - -#define dgBank01 "__OTR__sound/banks/01_bank" -static const ALIGN_ASSET(2) char gBank01[] = dgBank01; - -#define dgBank02 "__OTR__sound/banks/02_bank" -static const ALIGN_ASSET(2) char gBank02[] = dgBank02; - -#define dgBank03 "__OTR__sound/banks/03_bank" -static const ALIGN_ASSET(2) char gBank03[] = dgBank03; - -#define dgBank04 "__OTR__sound/banks/04_bank" -static const ALIGN_ASSET(2) char gBank04[] = dgBank04; - -#define dgBank05 "__OTR__sound/banks/05_bank" -static const ALIGN_ASSET(2) char gBank05[] = dgBank05; - -#define dgBank06 "__OTR__sound/banks/06_bank" -static const ALIGN_ASSET(2) char gBank06[] = dgBank06; - -#define dgBank07 "__OTR__sound/banks/07_bank" -static const ALIGN_ASSET(2) char gBank07[] = dgBank07; - -#define dgBank08 "__OTR__sound/banks/08_bank" -static const ALIGN_ASSET(2) char gBank08[] = dgBank08; - -#define dgBank09 "__OTR__sound/banks/09_bank" -static const ALIGN_ASSET(2) char gBank09[] = dgBank09; - -#define dgBank0A "__OTR__sound/banks/0A_bank" -static const ALIGN_ASSET(2) char gBank0A[] = dgBank0A; - -#define dgBank0B "__OTR__sound/banks/0B_bank" -static const ALIGN_ASSET(2) char gBank0B[] = dgBank0B; - -#define dgBank0C "__OTR__sound/banks/0C_bank" -static const ALIGN_ASSET(2) char gBank0C[] = dgBank0C; - -#define dgBank0D "__OTR__sound/banks/0D_bank" -static const ALIGN_ASSET(2) char gBank0D[] = dgBank0D; - -#define dgBank0E "__OTR__sound/banks/0E_bank" -static const ALIGN_ASSET(2) char gBank0E[] = dgBank0E; - -#define dgBank0F "__OTR__sound/banks/0F_bank" -static const ALIGN_ASSET(2) char gBank0F[] = dgBank0F; - -#define dgBank10 "__OTR__sound/banks/10_bank" -static const ALIGN_ASSET(2) char gBank10[] = dgBank10; - -#define dgBank11 "__OTR__sound/banks/11_bank" -static const ALIGN_ASSET(2) char gBank11[] = dgBank11; - -#define dgBank12 "__OTR__sound/banks/12_bank" -static const ALIGN_ASSET(2) char gBank12[] = dgBank12; - -#define dgBank13 "__OTR__sound/banks/13_bank" -static const ALIGN_ASSET(2) char gBank13[] = dgBank13; - -#define dgBank14 "__OTR__sound/banks/14_bank" -static const ALIGN_ASSET(2) char gBank14[] = dgBank14; - -#define dgBank15 "__OTR__sound/banks/15_bank" -static const ALIGN_ASSET(2) char gBank15[] = dgBank15; - -#define dgBank16 "__OTR__sound/banks/16_bank" -static const ALIGN_ASSET(2) char gBank16[] = dgBank16; - -#define dgBank17 "__OTR__sound/banks/17_bank" -static const ALIGN_ASSET(2) char gBank17[] = dgBank17; - -#define dgBank18 "__OTR__sound/banks/18_bank" -static const ALIGN_ASSET(2) char gBank18[] = dgBank18; - -#define dgBank19 "__OTR__sound/banks/19_bank" -static const ALIGN_ASSET(2) char gBank19[] = dgBank19; - -#define dgBank1A "__OTR__sound/banks/1A_bank" -static const ALIGN_ASSET(2) char gBank1A[] = dgBank1A; - -#define dgBank1B "__OTR__sound/banks/1B_bank" -static const ALIGN_ASSET(2) char gBank1B[] = dgBank1B; - -#define dgBank1C "__OTR__sound/banks/1C_bank" -static const ALIGN_ASSET(2) char gBank1C[] = dgBank1C; - -#define dgBank1D "__OTR__sound/banks/1D_bank" -static const ALIGN_ASSET(2) char gBank1D[] = dgBank1D; - -#define dgBank1E "__OTR__sound/banks/1E_bank" -static const ALIGN_ASSET(2) char gBank1E[] = dgBank1E; - -#define dgBank1F "__OTR__sound/banks/1F_bank" -static const ALIGN_ASSET(2) char gBank1F[] = dgBank1F; - -#define dgBank20 "__OTR__sound/banks/20_bank" -static const ALIGN_ASSET(2) char gBank20[] = dgBank20; - -#define dgBank21 "__OTR__sound/banks/21_bank" -static const ALIGN_ASSET(2) char gBank21[] = dgBank21; - -#define dgBank22 "__OTR__sound/banks/22_bank" -static const ALIGN_ASSET(2) char gBank22[] = dgBank22; - -#define dgBank23 "__OTR__sound/banks/23_bank" -static const ALIGN_ASSET(2) char gBank23[] = dgBank23; - -#define dgBank24 "__OTR__sound/banks/24_bank" -static const ALIGN_ASSET(2) char gBank24[] = dgBank24; - -#define dgBank25 "__OTR__sound/banks/25_bank" -static const ALIGN_ASSET(2) char gBank25[] = dgBank25; - -static const char* gBankTable[] = { - gBank00, gBank01, gBank02, gBank03, - gBank04, gBank05, gBank06, gBank07, - gBank08, gBank09, gBank0A, gBank0B, - gBank0C, gBank0D, gBank0E, gBank0F, - gBank10, gBank11, gBank12, gBank13, - gBank14, gBank15, gBank16, gBank17, - gBank18, gBank19, gBank1A, gBank1B, - gBank1C, gBank1D, gBank1E, gBank1F, - gBank20, gBank21, gBank22, gBank23, - gBank24, gBank25, -}; diff --git a/include/course_table.h b/include/course_table.h index c8963274..6ed26678 100644 --- a/include/course_table.h +++ b/include/course_table.h @@ -4,13 +4,13 @@ // Start of the 3 cap courses in a row. #define COURSE_CAP_COURSES COURSE_COTMC -#define DEFINE_COURSE(courseenum, _1) courseenum, +#define DEFINE_COURSE(courseenum, _1, _2) courseenum, #define DEFINE_COURSES_END() \ COURSE_BONUS_STAGES, \ COURSE_STAGES_MAX = COURSE_BONUS_STAGES - 1, \ COURSE_STAGES_COUNT = COURSE_STAGES_MAX, -#define DEFINE_BONUS_COURSE(courseenum, _1) courseenum, +#define DEFINE_BONUS_COURSE(courseenum, _1, _2) courseenum, enum CourseNum { #include "levels/course_defines.h" diff --git a/include/level_table.h b/include/level_table.h index b0c2c633..c486b246 100644 --- a/include/level_table.h +++ b/include/level_table.h @@ -4,8 +4,8 @@ // For LEVEL_NAME defines, see level_defines.h. // Please include this file if you want to use them. -#define STUB_LEVEL(_0, levelenum, _2, _3, _4, _5, _6, _7, _8) levelenum, -#define DEFINE_LEVEL(_0, levelenum, _2, _3, _4, _5, _6, _7, _8, _9, _10) levelenum, +#define STUB_LEVEL(_0, levelenum, _2, _3, _4, _5, _6, _7, _8, _9) levelenum, +#define DEFINE_LEVEL(_0, levelenum, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) levelenum, enum LevelNum { LEVEL_NONE, diff --git a/include/samples_table.h b/include/samples_table.h deleted file mode 100644 index 5f1a3aeb..00000000 --- a/include/samples_table.h +++ /dev/null @@ -1,717 +0,0 @@ -#pragma once -#include "align_asset_macro.h" - -#define dgSample00 "__OTR__sound/samples/sfx_1/00_twirl" -static const ALIGN_ASSET(2) char gSample00[] = dgSample00; - -#define dgSample01 "__OTR__sound/samples/sfx_1/01_brushing" -static const ALIGN_ASSET(2) char gSample01[] = dgSample01; - -#define dgSample02 "__OTR__sound/samples/sfx_1/02_hand_touch" -static const ALIGN_ASSET(2) char gSample02[] = dgSample02; - -#define dgSample03 "__OTR__sound/samples/sfx_1/03_yoshi" -static const ALIGN_ASSET(2) char gSample03[] = dgSample03; - -#define dgSample04 "__OTR__sound/samples/sfx_1/04_plop" -static const ALIGN_ASSET(2) char gSample04[] = dgSample04; - -#define dgSample05 "__OTR__sound/samples/sfx_1/05_heavy_landing" -static const ALIGN_ASSET(2) char gSample05[] = dgSample05; - -#define dgSample06 "__OTR__sound/samples/sfx_terrain/00_step_default" -static const ALIGN_ASSET(2) char gSample06[] = dgSample06; - -#define dgSample07 "__OTR__sound/samples/sfx_terrain/01_step_grass" -static const ALIGN_ASSET(2) char gSample07[] = dgSample07; - -#define dgSample08 "__OTR__sound/samples/sfx_terrain/02_step_stone" -static const ALIGN_ASSET(2) char gSample08[] = dgSample08; - -#define dgSample09 "__OTR__sound/samples/sfx_terrain/03_step_spooky" -static const ALIGN_ASSET(2) char gSample09[] = dgSample09; - -#define dgSample0A "__OTR__sound/samples/sfx_terrain/04_step_snow" -static const ALIGN_ASSET(2) char gSample0A[] = dgSample0A; - -#define dgSample0B "__OTR__sound/samples/sfx_terrain/05_step_ice" -static const ALIGN_ASSET(2) char gSample0B[] = dgSample0B; - -#define dgSample0C "__OTR__sound/samples/sfx_terrain/06_step_metal" -static const ALIGN_ASSET(2) char gSample0C[] = dgSample0C; - -#define dgSample0D "__OTR__sound/samples/sfx_terrain/07_step_sand" -static const ALIGN_ASSET(2) char gSample0D[] = dgSample0D; - -#define dgSample0E "__OTR__sound/samples/sfx_water/00_plunge" -static const ALIGN_ASSET(2) char gSample0E[] = dgSample0E; - -#define dgSample0F "__OTR__sound/samples/sfx_water/01_splash" -static const ALIGN_ASSET(2) char gSample0F[] = dgSample0F; - -#define dgSample10 "__OTR__sound/samples/sfx_water/02_swim" -static const ALIGN_ASSET(2) char gSample10[] = dgSample10; - -#define dgSample11 "__OTR__sound/samples/sfx_4/00" -static const ALIGN_ASSET(2) char gSample11[] = dgSample11; - -#define dgSample12 "__OTR__sound/samples/sfx_4/01" -static const ALIGN_ASSET(2) char gSample12[] = dgSample12; - -#define dgSample13 "__OTR__sound/samples/sfx_4/02" -static const ALIGN_ASSET(2) char gSample13[] = dgSample13; - -#define dgSample14 "__OTR__sound/samples/sfx_4/03" -static const ALIGN_ASSET(2) char gSample14[] = dgSample14; - -#define dgSample15 "__OTR__sound/samples/sfx_4/04" -static const ALIGN_ASSET(2) char gSample15[] = dgSample15; - -#define dgSample16 "__OTR__sound/samples/sfx_4/05" -static const ALIGN_ASSET(2) char gSample16[] = dgSample16; - -#define dgSample17 "__OTR__sound/samples/sfx_4/06" -static const ALIGN_ASSET(2) char gSample17[] = dgSample17; - -#define dgSample18 "__OTR__sound/samples/sfx_4/07" -static const ALIGN_ASSET(2) char gSample18[] = dgSample18; - -#define dgSample19 "__OTR__sound/samples/sfx_4/08" -static const ALIGN_ASSET(2) char gSample19[] = dgSample19; - -#define dgSample1A "__OTR__sound/samples/sfx_4/09" -static const ALIGN_ASSET(2) char gSample1A[] = dgSample1A; - -#define dgSample1B "__OTR__sound/samples/sfx_5/00" -static const ALIGN_ASSET(2) char gSample1B[] = dgSample1B; - -#define dgSample1C "__OTR__sound/samples/sfx_5/01" -static const ALIGN_ASSET(2) char gSample1C[] = dgSample1C; - -#define dgSample1D "__OTR__sound/samples/sfx_5/02" -static const ALIGN_ASSET(2) char gSample1D[] = dgSample1D; - -#define dgSample1E "__OTR__sound/samples/sfx_5/03" -static const ALIGN_ASSET(2) char gSample1E[] = dgSample1E; - -#define dgSample1F "__OTR__sound/samples/sfx_5/04" -static const ALIGN_ASSET(2) char gSample1F[] = dgSample1F; - -#define dgSample20 "__OTR__sound/samples/sfx_5/05" -static const ALIGN_ASSET(2) char gSample20[] = dgSample20; - -#define dgSample21 "__OTR__sound/samples/sfx_5/06" -static const ALIGN_ASSET(2) char gSample21[] = dgSample21; - -#define dgSample22 "__OTR__sound/samples/sfx_5/07" -static const ALIGN_ASSET(2) char gSample22[] = dgSample22; - -#define dgSample23 "__OTR__sound/samples/sfx_5/08" -static const ALIGN_ASSET(2) char gSample23[] = dgSample23; - -#define dgSample24 "__OTR__sound/samples/sfx_5/09" -static const ALIGN_ASSET(2) char gSample24[] = dgSample24; - -#define dgSample25 "__OTR__sound/samples/sfx_5/0A" -static const ALIGN_ASSET(2) char gSample25[] = dgSample25; - -#define dgSample26 "__OTR__sound/samples/sfx_5/0B" -static const ALIGN_ASSET(2) char gSample26[] = dgSample26; - -#define dgSample27 "__OTR__sound/samples/sfx_5/0C" -static const ALIGN_ASSET(2) char gSample27[] = dgSample27; - -#define dgSample28 "__OTR__sound/samples/sfx_5/0D" -static const ALIGN_ASSET(2) char gSample28[] = dgSample28; - -#define dgSample29 "__OTR__sound/samples/sfx_5/0E" -static const ALIGN_ASSET(2) char gSample29[] = dgSample29; - -#define dgSample2A "__OTR__sound/samples/sfx_5/0F" -static const ALIGN_ASSET(2) char gSample2A[] = dgSample2A; - -#define dgSample2B "__OTR__sound/samples/sfx_5/10" -static const ALIGN_ASSET(2) char gSample2B[] = dgSample2B; - -#define dgSample2C "__OTR__sound/samples/sfx_5/11" -static const ALIGN_ASSET(2) char gSample2C[] = dgSample2C; - -#define dgSample2D "__OTR__sound/samples/sfx_5/12" -static const ALIGN_ASSET(2) char gSample2D[] = dgSample2D; - -#define dgSample2E "__OTR__sound/samples/sfx_5/13" -static const ALIGN_ASSET(2) char gSample2E[] = dgSample2E; - -#define dgSample2F "__OTR__sound/samples/sfx_5/14" -static const ALIGN_ASSET(2) char gSample2F[] = dgSample2F; - -#define dgSample30 "__OTR__sound/samples/sfx_5/15" -static const ALIGN_ASSET(2) char gSample30[] = dgSample30; - -#define dgSample31 "__OTR__sound/samples/sfx_5/16" -static const ALIGN_ASSET(2) char gSample31[] = dgSample31; - -#define dgSample32 "__OTR__sound/samples/sfx_5/17" -static const ALIGN_ASSET(2) char gSample32[] = dgSample32; - -#define dgSample33 "__OTR__sound/samples/sfx_5/18" -static const ALIGN_ASSET(2) char gSample33[] = dgSample33; - -#define dgSample34 "__OTR__sound/samples/sfx_5/19" -static const ALIGN_ASSET(2) char gSample34[] = dgSample34; - -#define dgSample35 "__OTR__sound/samples/sfx_5/1A" -static const ALIGN_ASSET(2) char gSample35[] = dgSample35; - -#define dgSample36 "__OTR__sound/samples/sfx_5/1B" -static const ALIGN_ASSET(2) char gSample36[] = dgSample36; - -#define dgSample37 "__OTR__sound/samples/sfx_5/1C" -static const ALIGN_ASSET(2) char gSample37[] = dgSample37; - -#define dgSample38 "__OTR__sound/samples/sfx_6/00" -static const ALIGN_ASSET(2) char gSample38[] = dgSample38; - -#define dgSample39 "__OTR__sound/samples/sfx_6/01" -static const ALIGN_ASSET(2) char gSample39[] = dgSample39; - -#define dgSample3A "__OTR__sound/samples/sfx_6/02" -static const ALIGN_ASSET(2) char gSample3A[] = dgSample3A; - -#define dgSample3B "__OTR__sound/samples/sfx_6/03" -static const ALIGN_ASSET(2) char gSample3B[] = dgSample3B; - -#define dgSample3C "__OTR__sound/samples/sfx_6/04" -static const ALIGN_ASSET(2) char gSample3C[] = dgSample3C; - -#define dgSample3D "__OTR__sound/samples/sfx_6/05" -static const ALIGN_ASSET(2) char gSample3D[] = dgSample3D; - -#define dgSample3E "__OTR__sound/samples/sfx_6/06" -static const ALIGN_ASSET(2) char gSample3E[] = dgSample3E; - -#define dgSample3F "__OTR__sound/samples/sfx_6/07" -static const ALIGN_ASSET(2) char gSample3F[] = dgSample3F; - -#define dgSample40 "__OTR__sound/samples/sfx_6/08" -static const ALIGN_ASSET(2) char gSample40[] = dgSample40; - -#define dgSample41 "__OTR__sound/samples/sfx_6/09" -static const ALIGN_ASSET(2) char gSample41[] = dgSample41; - -#define dgSample42 "__OTR__sound/samples/sfx_6/0A" -static const ALIGN_ASSET(2) char gSample42[] = dgSample42; - -#define dgSample43 "__OTR__sound/samples/sfx_6/0B" -static const ALIGN_ASSET(2) char gSample43[] = dgSample43; - -#define dgSample44 "__OTR__sound/samples/sfx_6/0C" -static const ALIGN_ASSET(2) char gSample44[] = dgSample44; - -#define dgSample45 "__OTR__sound/samples/sfx_6/0D" -static const ALIGN_ASSET(2) char gSample45[] = dgSample45; - -#define dgSample46 "__OTR__sound/samples/sfx_7/00" -static const ALIGN_ASSET(2) char gSample46[] = dgSample46; - -#define dgSample47 "__OTR__sound/samples/sfx_7/01" -static const ALIGN_ASSET(2) char gSample47[] = dgSample47; - -#define dgSample48 "__OTR__sound/samples/sfx_7/02" -static const ALIGN_ASSET(2) char gSample48[] = dgSample48; - -#define dgSample49 "__OTR__sound/samples/sfx_7/03" -static const ALIGN_ASSET(2) char gSample49[] = dgSample49; - -#define dgSample4A "__OTR__sound/samples/sfx_7/04" -static const ALIGN_ASSET(2) char gSample4A[] = dgSample4A; - -#define dgSample4B "__OTR__sound/samples/sfx_7/05" -static const ALIGN_ASSET(2) char gSample4B[] = dgSample4B; - -#define dgSample4C "__OTR__sound/samples/sfx_7/06" -static const ALIGN_ASSET(2) char gSample4C[] = dgSample4C; - -#define dgSample4D "__OTR__sound/samples/sfx_7/07" -static const ALIGN_ASSET(2) char gSample4D[] = dgSample4D; - -#define dgSample4E "__OTR__sound/samples/sfx_7/08" -static const ALIGN_ASSET(2) char gSample4E[] = dgSample4E; - -#define dgSample4F "__OTR__sound/samples/sfx_7/09" -static const ALIGN_ASSET(2) char gSample4F[] = dgSample4F; - -#define dgSample50 "__OTR__sound/samples/sfx_7/0A" -static const ALIGN_ASSET(2) char gSample50[] = dgSample50; - -#define dgSample51 "__OTR__sound/samples/sfx_7/0B" -static const ALIGN_ASSET(2) char gSample51[] = dgSample51; - -#define dgSample52 "__OTR__sound/samples/sfx_7/0C" -static const ALIGN_ASSET(2) char gSample52[] = dgSample52; - -#define dgSample53 "__OTR__sound/samples/sfx_7/0D_chain_chomp_bark" -static const ALIGN_ASSET(2) char gSample53[] = dgSample53; - -#define dgSample54 "__OTR__sound/samples/sfx_mario/00_mario_jump_hoo" -static const ALIGN_ASSET(2) char gSample54[] = dgSample54; - -#define dgSample55 "__OTR__sound/samples/sfx_mario/01_mario_jump_wah" -static const ALIGN_ASSET(2) char gSample55[] = dgSample55; - -#define dgSample56 "__OTR__sound/samples/sfx_mario/02_mario_yah" -static const ALIGN_ASSET(2) char gSample56[] = dgSample56; - -#define dgSample57 "__OTR__sound/samples/sfx_mario/03_mario_haha" -static const ALIGN_ASSET(2) char gSample57[] = dgSample57; - -#define dgSample58 "__OTR__sound/samples/sfx_mario/04_mario_yahoo" -static const ALIGN_ASSET(2) char gSample58[] = dgSample58; - -#define dgSample59 "__OTR__sound/samples/sfx_mario/05_mario_uh" -static const ALIGN_ASSET(2) char gSample59[] = dgSample59; - -#define dgSample5A "__OTR__sound/samples/sfx_mario/06_mario_hrmm" -static const ALIGN_ASSET(2) char gSample5A[] = dgSample5A; - -#define dgSample5B "__OTR__sound/samples/sfx_mario/07_mario_wah2" -static const ALIGN_ASSET(2) char gSample5B[] = dgSample5B; - -#define dgSample5C "__OTR__sound/samples/sfx_mario/08_mario_whoa" -static const ALIGN_ASSET(2) char gSample5C[] = dgSample5C; - -#define dgSample5D "__OTR__sound/samples/sfx_mario/09_mario_eeuh" -static const ALIGN_ASSET(2) char gSample5D[] = dgSample5D; - -#define dgSample5E "__OTR__sound/samples/sfx_mario/0A_mario_attacked" -static const ALIGN_ASSET(2) char gSample5E[] = dgSample5E; - -#define dgSample5F "__OTR__sound/samples/sfx_mario/0B_mario_ooof" -static const ALIGN_ASSET(2) char gSample5F[] = dgSample5F; - -#define dgSample60 "__OTR__sound/samples/sfx_mario/0C_mario_here_we_go" -static const ALIGN_ASSET(2) char gSample60[] = dgSample60; - -#define dgSample61 "__OTR__sound/samples/sfx_mario/0D_mario_yawning" -static const ALIGN_ASSET(2) char gSample61[] = dgSample61; - -#define dgSample62 "__OTR__sound/samples/sfx_mario/0E_mario_snoring1" -static const ALIGN_ASSET(2) char gSample62[] = dgSample62; - -#define dgSample63 "__OTR__sound/samples/sfx_mario/0F_mario_snoring2" -static const ALIGN_ASSET(2) char gSample63[] = dgSample63; - -#define dgSample64 "__OTR__sound/samples/sfx_mario/10_mario_doh" -static const ALIGN_ASSET(2) char gSample64[] = dgSample64; - -#define dgSample65 "__OTR__sound/samples/sfx_mario/11_mario_game_over" -static const ALIGN_ASSET(2) char gSample65[] = dgSample65; - -#define dgSample66 "__OTR__sound/samples/sfx_mario/12_mario_hello" -static const ALIGN_ASSET(2) char gSample66[] = dgSample66; - -#define dgSample67 "__OTR__sound/samples/sfx_mario/13_mario_press_start_to_play" -static const ALIGN_ASSET(2) char gSample67[] = dgSample67; - -#define dgSample68 "__OTR__sound/samples/sfx_mario/14_mario_twirl_bounce" -static const ALIGN_ASSET(2) char gSample68[] = dgSample68; - -#define dgSample69 "__OTR__sound/samples/sfx_mario/15_mario_snoring3" -static const ALIGN_ASSET(2) char gSample69[] = dgSample69; - -#define dgSample6A "__OTR__sound/samples/sfx_mario/16_mario_so_longa_bowser" -static const ALIGN_ASSET(2) char gSample6A[] = dgSample6A; - -#define dgSample6B "__OTR__sound/samples/sfx_mario/17_mario_ima_tired" -static const ALIGN_ASSET(2) char gSample6B[] = dgSample6B; - -#define dgSample6C "__OTR__sound/samples/sfx_mario/18_mario_waha" -static const ALIGN_ASSET(2) char gSample6C[] = dgSample6C; - -#define dgSample6D "__OTR__sound/samples/sfx_mario/19_mario_yippee" -static const ALIGN_ASSET(2) char gSample6D[] = dgSample6D; - -#define dgSample6E "__OTR__sound/samples/sfx_mario/1A_mario_lets_a_go" -static const ALIGN_ASSET(2) char gSample6E[] = dgSample6E; - -#define dgSample6F "__OTR__sound/samples/sfx_9/00" -static const ALIGN_ASSET(2) char gSample6F[] = dgSample6F; - -#define dgSample70 "__OTR__sound/samples/sfx_9/01" -static const ALIGN_ASSET(2) char gSample70[] = dgSample70; - -#define dgSample71 "__OTR__sound/samples/sfx_9/02" -static const ALIGN_ASSET(2) char gSample71[] = dgSample71; - -#define dgSample72 "__OTR__sound/samples/sfx_9/03" -static const ALIGN_ASSET(2) char gSample72[] = dgSample72; - -#define dgSample73 "__OTR__sound/samples/sfx_9/04_camera_buzz" -static const ALIGN_ASSET(2) char gSample73[] = dgSample73; - -#define dgSample74 "__OTR__sound/samples/sfx_9/05_camera_shutter" -static const ALIGN_ASSET(2) char gSample74[] = dgSample74; - -#define dgSample75 "__OTR__sound/samples/sfx_9/06" -static const ALIGN_ASSET(2) char gSample75[] = dgSample75; - -#define dgSample76 "__OTR__sound/samples/sfx_mario_peach/00_mario_waaaooow" -static const ALIGN_ASSET(2) char gSample76[] = dgSample76; - -#define dgSample77 "__OTR__sound/samples/sfx_mario_peach/01_mario_hoohoo" -static const ALIGN_ASSET(2) char gSample77[] = dgSample77; - -#define dgSample78 "__OTR__sound/samples/sfx_mario_peach/02_mario_panting" -static const ALIGN_ASSET(2) char gSample78[] = dgSample78; - -#define dgSample79 "__OTR__sound/samples/sfx_mario_peach/03_mario_dying" -static const ALIGN_ASSET(2) char gSample79[] = dgSample79; - -#define dgSample7A "__OTR__sound/samples/sfx_mario_peach/04_mario_on_fire" -static const ALIGN_ASSET(2) char gSample7A[] = dgSample7A; - -#define dgSample7B "__OTR__sound/samples/sfx_mario_peach/05_mario_uh2" -static const ALIGN_ASSET(2) char gSample7B[] = dgSample7B; - -#define dgSample7C "__OTR__sound/samples/sfx_mario_peach/06_mario_coughing" -static const ALIGN_ASSET(2) char gSample7C[] = dgSample7C; - -#define dgSample7D "__OTR__sound/samples/sfx_mario_peach/07_mario_its_a_me_mario" -static const ALIGN_ASSET(2) char gSample7D[] = dgSample7D; - -#define dgSample7E "__OTR__sound/samples/sfx_mario_peach/08_mario_punch_yah" -static const ALIGN_ASSET(2) char gSample7E[] = dgSample7E; - -#define dgSample7F "__OTR__sound/samples/sfx_mario_peach/09_mario_punch_hoo" -static const ALIGN_ASSET(2) char gSample7F[] = dgSample7F; - -#define dgSample80 "__OTR__sound/samples/sfx_mario_peach/0A_mario_mama_mia" -static const ALIGN_ASSET(2) char gSample80[] = dgSample80; - -#define dgSample81 "__OTR__sound/samples/sfx_mario_peach/0B_mario_okey_dokey" -static const ALIGN_ASSET(2) char gSample81[] = dgSample81; - -#define dgSample82 "__OTR__sound/samples/sfx_mario_peach/0C_mario_drowning" -static const ALIGN_ASSET(2) char gSample82[] = dgSample82; - -#define dgSample83 "__OTR__sound/samples/sfx_mario_peach/0D_mario_thank_you_playing_my_game" -static const ALIGN_ASSET(2) char gSample83[] = dgSample83; - -#define dgSample84 "__OTR__sound/samples/sfx_mario_peach/0E_peach_dear_mario" -static const ALIGN_ASSET(2) char gSample84[] = dgSample84; - -#define dgSample85 "__OTR__sound/samples/sfx_mario_peach/0F_peach_mario" -static const ALIGN_ASSET(2) char gSample85[] = dgSample85; - -#define dgSample86 "__OTR__sound/samples/sfx_mario_peach/10_peach_power_of_the_stars" -static const ALIGN_ASSET(2) char gSample86[] = dgSample86; - -#define dgSample87 "__OTR__sound/samples/sfx_mario_peach/11_peach_thanks_to_you" -static const ALIGN_ASSET(2) char gSample87[] = dgSample87; - -#define dgSample88 "__OTR__sound/samples/sfx_mario_peach/12_peach_thank_you_mario" -static const ALIGN_ASSET(2) char gSample88[] = dgSample88; - -#define dgSample89 "__OTR__sound/samples/sfx_mario_peach/13_peach_something_special" -static const ALIGN_ASSET(2) char gSample89[] = dgSample89; - -#define dgSample8A "__OTR__sound/samples/sfx_mario_peach/14_peach_bake_a_cake" -static const ALIGN_ASSET(2) char gSample8A[] = dgSample8A; - -#define dgSample8B "__OTR__sound/samples/sfx_mario_peach/15_peach_for_mario" -static const ALIGN_ASSET(2) char gSample8B[] = dgSample8B; - -#define dgSample8C "__OTR__sound/samples/sfx_mario_peach/16_peach_mario2" -static const ALIGN_ASSET(2) char gSample8C[] = dgSample8C; - -#define dgSample8D "__OTR__sound/samples/instruments/00" -static const ALIGN_ASSET(2) char gSample8D[] = dgSample8D; - -#define dgSample8E "__OTR__sound/samples/instruments/01_banjo_1" -static const ALIGN_ASSET(2) char gSample8E[] = dgSample8E; - -#define dgSample8F "__OTR__sound/samples/instruments/02" -static const ALIGN_ASSET(2) char gSample8F[] = dgSample8F; - -#define dgSample90 "__OTR__sound/samples/instruments/03_human_whistle" -static const ALIGN_ASSET(2) char gSample90[] = dgSample90; - -#define dgSample91 "__OTR__sound/samples/instruments/04_bright_piano" -static const ALIGN_ASSET(2) char gSample91[] = dgSample91; - -#define dgSample92 "__OTR__sound/samples/instruments/05_acoustic_bass" -static const ALIGN_ASSET(2) char gSample92[] = dgSample92; - -#define dgSample93 "__OTR__sound/samples/instruments/06_kick_drum_1" -static const ALIGN_ASSET(2) char gSample93[] = dgSample93; - -#define dgSample94 "__OTR__sound/samples/instruments/07_rimshot" -static const ALIGN_ASSET(2) char gSample94[] = dgSample94; - -#define dgSample95 "__OTR__sound/samples/instruments/08" -static const ALIGN_ASSET(2) char gSample95[] = dgSample95; - -#define dgSample96 "__OTR__sound/samples/instruments/09" -static const ALIGN_ASSET(2) char gSample96[] = dgSample96; - -#define dgSample97 "__OTR__sound/samples/instruments/0A_tambourine" -static const ALIGN_ASSET(2) char gSample97[] = dgSample97; - -#define dgSample98 "__OTR__sound/samples/instruments/0B" -static const ALIGN_ASSET(2) char gSample98[] = dgSample98; - -#define dgSample99 "__OTR__sound/samples/instruments/0C_conga_stick" -static const ALIGN_ASSET(2) char gSample99[] = dgSample99; - -#define dgSample9A "__OTR__sound/samples/instruments/0D_clave" -static const ALIGN_ASSET(2) char gSample9A[] = dgSample9A; - -#define dgSample9B "__OTR__sound/samples/instruments/0E_hihat_closed" -static const ALIGN_ASSET(2) char gSample9B[] = dgSample9B; - -#define dgSample9C "__OTR__sound/samples/instruments/0F_hihat_open" -static const ALIGN_ASSET(2) char gSample9C[] = dgSample9C; - -#define dgSample9D "__OTR__sound/samples/instruments/10_cymbal_bell" -static const ALIGN_ASSET(2) char gSample9D[] = dgSample9D; - -#define dgSample9E "__OTR__sound/samples/instruments/11_splash_cymbal" -static const ALIGN_ASSET(2) char gSample9E[] = dgSample9E; - -#define dgSample9F "__OTR__sound/samples/instruments/12_snare_drum_1" -static const ALIGN_ASSET(2) char gSample9F[] = dgSample9F; - -#define dgSampleA0 "__OTR__sound/samples/instruments/13_snare_drum_2" -static const ALIGN_ASSET(2) char gSampleA0[] = dgSampleA0; - -#define dgSampleA1 "__OTR__sound/samples/instruments/14_strings_5" -static const ALIGN_ASSET(2) char gSampleA1[] = dgSampleA1; - -#define dgSampleA2 "__OTR__sound/samples/instruments/15_strings_4" -static const ALIGN_ASSET(2) char gSampleA2[] = dgSampleA2; - -#define dgSampleA3 "__OTR__sound/samples/instruments/16_french_horns" -static const ALIGN_ASSET(2) char gSampleA3[] = dgSampleA3; - -#define dgSampleA4 "__OTR__sound/samples/instruments/17_trumpet" -static const ALIGN_ASSET(2) char gSampleA4[] = dgSampleA4; - -#define dgSampleA5 "__OTR__sound/samples/instruments/18_timpani" -static const ALIGN_ASSET(2) char gSampleA5[] = dgSampleA5; - -#define dgSampleA6 "__OTR__sound/samples/instruments/19_brass" -static const ALIGN_ASSET(2) char gSampleA6[] = dgSampleA6; - -#define dgSampleA7 "__OTR__sound/samples/instruments/1A_slap_bass" -static const ALIGN_ASSET(2) char gSampleA7[] = dgSampleA7; - -#define dgSampleA8 "__OTR__sound/samples/instruments/1B_organ_2" -static const ALIGN_ASSET(2) char gSampleA8[] = dgSampleA8; - -#define dgSampleA9 "__OTR__sound/samples/instruments/1C" -static const ALIGN_ASSET(2) char gSampleA9[] = dgSampleA9; - -#define dgSampleAA "__OTR__sound/samples/instruments/1D" -static const ALIGN_ASSET(2) char gSampleAA[] = dgSampleAA; - -#define dgSampleAB "__OTR__sound/samples/instruments/1E_closed_triangle" -static const ALIGN_ASSET(2) char gSampleAB[] = dgSampleAB; - -#define dgSampleAC "__OTR__sound/samples/instruments/1F_open_triangle" -static const ALIGN_ASSET(2) char gSampleAC[] = dgSampleAC; - -#define dgSampleAD "__OTR__sound/samples/instruments/20_cabasa" -static const ALIGN_ASSET(2) char gSampleAD[] = dgSampleAD; - -#define dgSampleAE "__OTR__sound/samples/instruments/21_sine_bass" -static const ALIGN_ASSET(2) char gSampleAE[] = dgSampleAE; - -#define dgSampleAF "__OTR__sound/samples/instruments/22_boys_choir" -static const ALIGN_ASSET(2) char gSampleAF[] = dgSampleAF; - -#define dgSampleB0 "__OTR__sound/samples/instruments/23_strings_1" -static const ALIGN_ASSET(2) char gSampleB0[] = dgSampleB0; - -#define dgSampleB1 "__OTR__sound/samples/instruments/24_strings_2" -static const ALIGN_ASSET(2) char gSampleB1[] = dgSampleB1; - -#define dgSampleB2 "__OTR__sound/samples/instruments/25_strings_3" -static const ALIGN_ASSET(2) char gSampleB2[] = dgSampleB2; - -#define dgSampleB3 "__OTR__sound/samples/instruments/26_crystal_rhodes" -static const ALIGN_ASSET(2) char gSampleB3[] = dgSampleB3; - -#define dgSampleB4 "__OTR__sound/samples/instruments/27_harpsichord" -static const ALIGN_ASSET(2) char gSampleB4[] = dgSampleB4; - -#define dgSampleB5 "__OTR__sound/samples/instruments/28_sitar_1" -static const ALIGN_ASSET(2) char gSampleB5[] = dgSampleB5; - -#define dgSampleB6 "__OTR__sound/samples/instruments/29_orchestra_hit" -static const ALIGN_ASSET(2) char gSampleB6[] = dgSampleB6; - -#define dgSampleB7 "__OTR__sound/samples/instruments/2A" -static const ALIGN_ASSET(2) char gSampleB7[] = dgSampleB7; - -#define dgSampleB8 "__OTR__sound/samples/instruments/2B" -static const ALIGN_ASSET(2) char gSampleB8[] = dgSampleB8; - -#define dgSampleB9 "__OTR__sound/samples/instruments/2C" -static const ALIGN_ASSET(2) char gSampleB9[] = dgSampleB9; - -#define dgSampleBA "__OTR__sound/samples/instruments/2D_trombone" -static const ALIGN_ASSET(2) char gSampleBA[] = dgSampleBA; - -#define dgSampleBB "__OTR__sound/samples/instruments/2E_accordion" -static const ALIGN_ASSET(2) char gSampleBB[] = dgSampleBB; - -#define dgSampleBC "__OTR__sound/samples/instruments/2F_sleigh_bells" -static const ALIGN_ASSET(2) char gSampleBC[] = dgSampleBC; - -#define dgSampleBD "__OTR__sound/samples/instruments/30_rarefaction-lahna" -static const ALIGN_ASSET(2) char gSampleBD[] = dgSampleBD; - -#define dgSampleBE "__OTR__sound/samples/instruments/31_rarefaction-convolution" -static const ALIGN_ASSET(2) char gSampleBE[] = dgSampleBE; - -#define dgSampleBF "__OTR__sound/samples/instruments/32_metal_rimshot" -static const ALIGN_ASSET(2) char gSampleBF[] = dgSampleBF; - -#define dgSampleC0 "__OTR__sound/samples/instruments/33_kick_drum_2" -static const ALIGN_ASSET(2) char gSampleC0[] = dgSampleC0; - -#define dgSampleC1 "__OTR__sound/samples/instruments/34_alto_flute" -static const ALIGN_ASSET(2) char gSampleC1[] = dgSampleC1; - -#define dgSampleC2 "__OTR__sound/samples/instruments/35_gospel_organ" -static const ALIGN_ASSET(2) char gSampleC2[] = dgSampleC2; - -#define dgSampleC3 "__OTR__sound/samples/instruments/36_sawtooth_synth" -static const ALIGN_ASSET(2) char gSampleC3[] = dgSampleC3; - -#define dgSampleC4 "__OTR__sound/samples/instruments/37_square_synth" -static const ALIGN_ASSET(2) char gSampleC4[] = dgSampleC4; - -#define dgSampleC5 "__OTR__sound/samples/instruments/38_electric_kick_drum" -static const ALIGN_ASSET(2) char gSampleC5[] = dgSampleC5; - -#define dgSampleC6 "__OTR__sound/samples/instruments/39_sitar_2" -static const ALIGN_ASSET(2) char gSampleC6[] = dgSampleC6; - -#define dgSampleC7 "__OTR__sound/samples/instruments/3A_music_box" -static const ALIGN_ASSET(2) char gSampleC7[] = dgSampleC7; - -#define dgSampleC8 "__OTR__sound/samples/instruments/3B_banjo_2" -static const ALIGN_ASSET(2) char gSampleC8[] = dgSampleC8; - -#define dgSampleC9 "__OTR__sound/samples/instruments/3C_acoustic_guitar" -static const ALIGN_ASSET(2) char gSampleC9[] = dgSampleC9; - -#define dgSampleCA "__OTR__sound/samples/instruments/3D" -static const ALIGN_ASSET(2) char gSampleCA[] = dgSampleCA; - -#define dgSampleCB "__OTR__sound/samples/instruments/3E_monk_choir" -static const ALIGN_ASSET(2) char gSampleCB[] = dgSampleCB; - -#define dgSampleCC "__OTR__sound/samples/instruments/3F" -static const ALIGN_ASSET(2) char gSampleCC[] = dgSampleCC; - -#define dgSampleCD "__OTR__sound/samples/instruments/40_bell" -static const ALIGN_ASSET(2) char gSampleCD[] = dgSampleCD; - -#define dgSampleCE "__OTR__sound/samples/instruments/41_pan_flute" -static const ALIGN_ASSET(2) char gSampleCE[] = dgSampleCE; - -#define dgSampleCF "__OTR__sound/samples/instruments/42_vibraphone" -static const ALIGN_ASSET(2) char gSampleCF[] = dgSampleCF; - -#define dgSampleD0 "__OTR__sound/samples/instruments/43_harmonica" -static const ALIGN_ASSET(2) char gSampleD0[] = dgSampleD0; - -#define dgSampleD1 "__OTR__sound/samples/instruments/44_grand_piano" -static const ALIGN_ASSET(2) char gSampleD1[] = dgSampleD1; - -#define dgSampleD2 "__OTR__sound/samples/instruments/45_french_horns_lq" -static const ALIGN_ASSET(2) char gSampleD2[] = dgSampleD2; - -#define dgSampleD3 "__OTR__sound/samples/instruments/46_pizzicato_strings_1" -static const ALIGN_ASSET(2) char gSampleD3[] = dgSampleD3; - -#define dgSampleD4 "__OTR__sound/samples/instruments/47_pizzicato_strings_2" -static const ALIGN_ASSET(2) char gSampleD4[] = dgSampleD4; - -#define dgSampleD5 "__OTR__sound/samples/instruments/48_steel_drum" -static const ALIGN_ASSET(2) char gSampleD5[] = dgSampleD5; - -#define dgSampleD6 "__OTR__sound/samples/piranha_music_box/00_music_box" -static const ALIGN_ASSET(2) char gSampleD6[] = dgSampleD6; - -#define dgSampleD7 "__OTR__sound/samples/course_start/00_la" -static const ALIGN_ASSET(2) char gSampleD7[] = dgSampleD7; - -#define dgSampleD8 "__OTR__sound/samples/bowser_organ/00_organ_1" -static const ALIGN_ASSET(2) char gSampleD8[] = dgSampleD8; - -#define dgSampleD9 "__OTR__sound/samples/bowser_organ/01_organ_1_lq" -static const ALIGN_ASSET(2) char gSampleD9[] = dgSampleD9; - -#define dgSampleDA "__OTR__sound/samples/bowser_organ/02_boys_choir" -static const ALIGN_ASSET(2) char gSampleDA[] = dgSampleDA; - -static const char* gSampleTable[] = { - gSample00, gSample01, gSample02, gSample03, - gSample04, gSample05, gSample06, gSample07, - gSample08, gSample09, gSample0A, gSample0B, - gSample0C, gSample0D, gSample0E, gSample0F, - gSample10, gSample11, gSample12, gSample13, - gSample14, gSample15, gSample16, gSample17, - gSample18, gSample19, gSample1A, gSample1B, - gSample1C, gSample1D, gSample1E, gSample1F, - gSample20, gSample21, gSample22, gSample23, - gSample24, gSample25, gSample26, gSample27, - gSample28, gSample29, gSample2A, gSample2B, - gSample2C, gSample2D, gSample2E, gSample2F, - gSample30, gSample31, gSample32, gSample33, - gSample34, gSample35, gSample36, gSample37, - gSample38, gSample39, gSample3A, gSample3B, - gSample3C, gSample3D, gSample3E, gSample3F, - gSample40, gSample41, gSample42, gSample43, - gSample44, gSample45, gSample46, gSample47, - gSample48, gSample49, gSample4A, gSample4B, - gSample4C, gSample4D, gSample4E, gSample4F, - gSample50, gSample51, gSample52, gSample53, - gSample54, gSample55, gSample56, gSample57, - gSample58, gSample59, gSample5A, gSample5B, - gSample5C, gSample5D, gSample5E, gSample5F, - gSample60, gSample61, gSample62, gSample63, - gSample64, gSample65, gSample66, gSample67, - gSample68, gSample69, gSample6A, gSample6B, - gSample6C, gSample6D, gSample6E, gSample6F, - gSample70, gSample71, gSample72, gSample73, - gSample74, gSample75, gSample76, gSample77, - gSample78, gSample79, gSample7A, gSample7B, - gSample7C, gSample7D, gSample7E, gSample7F, - gSample80, gSample81, gSample82, gSample83, - gSample84, gSample85, gSample86, gSample87, - gSample88, gSample89, gSample8A, gSample8B, - gSample8C, gSample8D, gSample8E, gSample8F, - gSample90, gSample91, gSample92, gSample93, - gSample94, gSample95, gSample96, gSample97, - gSample98, gSample99, gSample9A, gSample9B, - gSample9C, gSample9D, gSample9E, gSample9F, - gSampleA0, gSampleA1, gSampleA2, gSampleA3, - gSampleA4, gSampleA5, gSampleA6, gSampleA7, - gSampleA8, gSampleA9, gSampleAA, gSampleAB, - gSampleAC, gSampleAD, gSampleAE, gSampleAF, - gSampleB0, gSampleB1, gSampleB2, gSampleB3, - gSampleB4, gSampleB5, gSampleB6, gSampleB7, - gSampleB8, gSampleB9, gSampleBA, gSampleBB, - gSampleBC, gSampleBD, gSampleBE, gSampleBF, - gSampleC0, gSampleC1, gSampleC2, gSampleC3, - gSampleC4, gSampleC5, gSampleC6, gSampleC7, - gSampleC8, gSampleC9, gSampleCA, gSampleCB, - gSampleCC, gSampleCD, gSampleCE, gSampleCF, - gSampleD0, gSampleD1, gSampleD2, gSampleD3, - gSampleD4, gSampleD5, gSampleD6, gSampleD7, - gSampleD8, gSampleD9, gSampleDA, -}; diff --git a/include/sequences_table.h b/include/sequences_table.h deleted file mode 100644 index 5572b8f1..00000000 --- a/include/sequences_table.h +++ /dev/null @@ -1,119 +0,0 @@ -#pragma once -#include "align_asset_macro.h" - -#define dgSequence00 "__OTR__sound/sequences/00_sound_player" -static const ALIGN_ASSET(2) char gSequence00[] = dgSequence00; - -#define dgSequence01 "__OTR__sound/sequences/01_cutscene_collect_star" -static const ALIGN_ASSET(2) char gSequence01[] = dgSequence01; - -#define dgSequence02 "__OTR__sound/sequences/02_menu_title_screen" -static const ALIGN_ASSET(2) char gSequence02[] = dgSequence02; - -#define dgSequence03 "__OTR__sound/sequences/03_level_grass" -static const ALIGN_ASSET(2) char gSequence03[] = dgSequence03; - -#define dgSequence04 "__OTR__sound/sequences/04_level_inside_castle" -static const ALIGN_ASSET(2) char gSequence04[] = dgSequence04; - -#define dgSequence05 "__OTR__sound/sequences/05_level_water" -static const ALIGN_ASSET(2) char gSequence05[] = dgSequence05; - -#define dgSequence06 "__OTR__sound/sequences/06_level_hot" -static const ALIGN_ASSET(2) char gSequence06[] = dgSequence06; - -#define dgSequence07 "__OTR__sound/sequences/07_level_boss_koopa" -static const ALIGN_ASSET(2) char gSequence07[] = dgSequence07; - -#define dgSequence08 "__OTR__sound/sequences/08_level_snow" -static const ALIGN_ASSET(2) char gSequence08[] = dgSequence08; - -#define dgSequence09 "__OTR__sound/sequences/09_level_slide" -static const ALIGN_ASSET(2) char gSequence09[] = dgSequence09; - -#define dgSequence0A "__OTR__sound/sequences/0A_level_spooky" -static const ALIGN_ASSET(2) char gSequence0A[] = dgSequence0A; - -#define dgSequence0B "__OTR__sound/sequences/0B_event_piranha_plant" -static const ALIGN_ASSET(2) char gSequence0B[] = dgSequence0B; - -#define dgSequence0C "__OTR__sound/sequences/0C_level_underground" -static const ALIGN_ASSET(2) char gSequence0C[] = dgSequence0C; - -#define dgSequence0D "__OTR__sound/sequences/0D_menu_star_select" -static const ALIGN_ASSET(2) char gSequence0D[] = dgSequence0D; - -#define dgSequence0E "__OTR__sound/sequences/0E_event_powerup" -static const ALIGN_ASSET(2) char gSequence0E[] = dgSequence0E; - -#define dgSequence0F "__OTR__sound/sequences/0F_event_metal_cap" -static const ALIGN_ASSET(2) char gSequence0F[] = dgSequence0F; - -#define dgSequence10 "__OTR__sound/sequences/10_event_koopa_message" -static const ALIGN_ASSET(2) char gSequence10[] = dgSequence10; - -#define dgSequence11 "__OTR__sound/sequences/11_level_koopa_road" -static const ALIGN_ASSET(2) char gSequence11[] = dgSequence11; - -#define dgSequence12 "__OTR__sound/sequences/12_event_high_score" -static const ALIGN_ASSET(2) char gSequence12[] = dgSequence12; - -#define dgSequence13 "__OTR__sound/sequences/13_event_merry_go_round" -static const ALIGN_ASSET(2) char gSequence13[] = dgSequence13; - -#define dgSequence14 "__OTR__sound/sequences/14_event_race" -static const ALIGN_ASSET(2) char gSequence14[] = dgSequence14; - -#define dgSequence15 "__OTR__sound/sequences/15_cutscene_star_spawn" -static const ALIGN_ASSET(2) char gSequence15[] = dgSequence15; - -#define dgSequence16 "__OTR__sound/sequences/16_event_boss" -static const ALIGN_ASSET(2) char gSequence16[] = dgSequence16; - -#define dgSequence17 "__OTR__sound/sequences/17_cutscene_collect_key" -static const ALIGN_ASSET(2) char gSequence17[] = dgSequence17; - -#define dgSequence18 "__OTR__sound/sequences/18_event_endless_stairs" -static const ALIGN_ASSET(2) char gSequence18[] = dgSequence18; - -#define dgSequence19 "__OTR__sound/sequences/19_level_boss_koopa_final" -static const ALIGN_ASSET(2) char gSequence19[] = dgSequence19; - -#define dgSequence1A "__OTR__sound/sequences/1A_cutscene_credits" -static const ALIGN_ASSET(2) char gSequence1A[] = dgSequence1A; - -#define dgSequence1B "__OTR__sound/sequences/1B_event_solve_puzzle" -static const ALIGN_ASSET(2) char gSequence1B[] = dgSequence1B; - -#define dgSequence1C "__OTR__sound/sequences/1C_event_toad_message" -static const ALIGN_ASSET(2) char gSequence1C[] = dgSequence1C; - -#define dgSequence1D "__OTR__sound/sequences/1D_event_peach_message" -static const ALIGN_ASSET(2) char gSequence1D[] = dgSequence1D; - -#define dgSequence1E "__OTR__sound/sequences/1E_cutscene_intro" -static const ALIGN_ASSET(2) char gSequence1E[] = dgSequence1E; - -#define dgSequence1F "__OTR__sound/sequences/1F_cutscene_victory" -static const ALIGN_ASSET(2) char gSequence1F[] = dgSequence1F; - -#define dgSequence20 "__OTR__sound/sequences/20_cutscene_ending" -static const ALIGN_ASSET(2) char gSequence20[] = dgSequence20; - -#define dgSequence21 "__OTR__sound/sequences/21_menu_file_select" -static const ALIGN_ASSET(2) char gSequence21[] = dgSequence21; - -#define dgSequence22 "__OTR__sound/sequences/22_cutscene_lakitu" -static const ALIGN_ASSET(2) char gSequence22[] = dgSequence22; - -static const char* gSequenceTable[] = { - gSequence00, gSequence01, gSequence02, gSequence03, - gSequence04, gSequence05, gSequence06, gSequence07, - gSequence08, gSequence09, gSequence0A, gSequence0B, - gSequence0C, gSequence0D, gSequence0E, gSequence0F, - gSequence10, gSequence11, gSequence12, gSequence13, - gSequence14, gSequence15, gSequence16, gSequence17, - gSequence18, gSequence19, gSequence1A, gSequence1B, - gSequence1C, gSequence1D, gSequence1E, gSequence1F, - gSequence20, gSequence21, gSequence22, -}; diff --git a/include/sm64.h b/include/sm64.h index da808907..b8f9be50 100644 --- a/include/sm64.h +++ b/include/sm64.h @@ -17,6 +17,10 @@ #include #include #include +#include "port/Engine.h" + +#define GAME_VERSION GameEngine_GetGameVersion() +#define ROM_JP (GAME_VERSION == 0xE3DAA4E) #ifdef _WIN32 #define bzero(b,len) (memset((b), '\0', (len)), (void) 0) @@ -496,6 +500,21 @@ extern void osCreateViManager(OSPri); extern uintptr_t osVirtualToPhysical(void *addr); extern void * osPhysicalToVirtual(u32); extern void osMapTLB(int32_t a, uint32_t b, void* c, uint32_t d, uint32_t e, uint32_t f); + +// Interpolation + +extern void *vec3s_copy(Vec3s dest, Vec3s src); +extern void interpolate_vectors(Vec3f res, Vec3f a, Vec3f b); +extern void interpolate_vectors_s16(Vec3s res, Vec3s a, Vec3s b); +extern void mtx_patch_interpolated(void); +extern void patch_screen_transition_interpolated(void); +extern void patch_title_screen_scales(void); +extern void patch_interpolated_dialog(void); +extern void patch_interpolated_hud(void); +extern void patch_interpolated_paintings(void); +extern void patch_interpolated_bubble_particles(void); +extern void patch_interpolated_snow_particles(void); + #ifndef TRUE #define TRUE 1 #endif diff --git a/include/text_menu_strings.h.in b/include/text_menu_strings.h.in deleted file mode 100644 index c9f93af3..00000000 --- a/include/text_menu_strings.h.in +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef TEXT_MENU_STRINGS_H -#define TEXT_MENU_STRINGS_H - -// These strings use a different table defined in menu_hud_lut -// Unlike text_strings.h.in, the charmap is different and -// uses char values from charmap_menu.txt - -/** - * File Select JP HUD Text - */ -#define TEXT_JPHUD_MARIO _("マリオ") -#define TEXT_JPHUD_SELECT_FILE _("ファイルセレクト") -#define TEXT_JPHUD_CHECK_FILE _("どのスコアをみる?") -#define TEXT_JPHUD_COPY_FILE _("ファイルコピーする") -#define TEXT_JPHUD_ERASE_FILE _("ファイルけす") -#define TEXT_JPHUD_SOUND_SELECT _("サウンドセレクト") - -#endif // TEXT_MENU_STRINGS_H diff --git a/include/text_strings.h.in b/include/text_strings.h.in deleted file mode 100644 index 749179b1..00000000 --- a/include/text_strings.h.in +++ /dev/null @@ -1,475 +0,0 @@ -#ifndef TEXT_STRINGS_H -#define TEXT_STRINGS_H - -#include "text_menu_strings.h" - -/** - * Global Symbols - */ -#define TEXT_ZERO _("0") -#define TEXT_COIN _("$") -#define TEXT_STAR _("★") -#define TEXT_COIN_X _("$×") -#define TEXT_STAR_X _("★×") -#define TEXT_VARIABLE_X _("×") -#define TEXT_UNFILLED_STAR _("☆") - -/** - * Global Text - */ -// File Select -#define TEXT_NEW _("NEW") // New File Text -#define TEXT_4DASHES _("----") // Used in Score File Menu - -// Ingame Menu -#define TEXT_PAUSE _("PAUSE") // Pause text, Castle Courses -#define TEXT_HUD_CONGRATULATIONS _("CONGRATULATIONS") // Course Complete Text, Bowser Courses - -#if defined(VERSION_JP) || defined(VERSION_SH) - -/** - * File Select Text - */ -// Main Screens -// JPHUD menu strings are defined in "text_menu_strings.h.in" -#define TEXT_MARIO TEXT_JPHUD_MARIO // View Score Menu -#define TEXT_SELECT_FILE TEXT_JPHUD_SELECT_FILE -#define TEXT_CHECK_FILE TEXT_JPHUD_CHECK_FILE -#define TEXT_COPY_FILE TEXT_JPHUD_COPY_FILE -#define TEXT_ERASE_FILE TEXT_JPHUD_ERASE_FILE -#define TEXT_SOUND_SELECT TEXT_JPHUD_SOUND_SELECT - -#define TEXT_FILE_MARIO_A _("マリオA") -#define TEXT_FILE_MARIO_B _("マリオB") -#define TEXT_FILE_MARIO_C _("マリオC") -#define TEXT_FILE_MARIO_D _("マリオD") - -// Menu Options -#define TEXT_SCORE _("スコア") -#define TEXT_COPY _("コピー") -#define TEXT_ERASE _("けす") - -// Sound Options -#define TEXT_STEREO _("ステレオ") -#define TEXT_MONO _("モノラル") -#define TEXT_HEADSET _("ヘッドホン") - -// Misc Menu Text -#define TEXT_SAVED_DATA_EXISTS _("ファイルにデータがはいってます") -#define TEXT_NO_SAVED_DATA_EXISTS _("ファイルにデータがありません") - -// Inside a Menu -#define TEXT_RETURN _("もどる") -#define TEXT_CHECK_SCORE _("スコアをみる") -#define TEXT_COPY_FILE_BUTTON _("ファイルコピー") -#define TEXT_ERASE_FILE_BUTTON _("ファイルけす") - -// Score Menu -#define TEXT_HI_SCORE _("ハイスコア") -#define TEXT_MY_SCORE _("マイスコア") -#define TEXT_SCORE_MARIO_A _("マリオA") -#define TEXT_SCORE_MARIO_B _("マリオB") -#define TEXT_SCORE_MARIO_C _("マリオC") -#define TEXT_SCORE_MARIO_D _("マリオD") - -// Copy Menu -#define TEXT_COPY_IT_TO_WHERE _("どこにコピーしますか?") -#define TEXT_COPYING_COMPLETED _("コピーおわりました") -#define TEXT_NO_FILE_TO_COPY_FROM _("からのファイルがありません") - -// Erase Menu -#define TEXT_SURE _("ほんと?") -#define TEXT_YES _("はい") -#define TEXT_NO _("いいえ") -#define TEXT_FILE_MARIO_A_JUST_ERASED _("マリオAをけしました") - -/** - * Menus Text (Pause, Course Completed) - */ -// Main Courses -#define TEXT_COURSE _("コース") -#define TEXT_MYSCORE _("マイスコア") -#define TEXT_CONTINUE _("つづけて マリオする?") -#define TEXT_EXIT_COURSE _("コースからでる?") -#define TEXT_CAMERA_ANGLE_R _("Rボタンのカメラきりかえ") - -// Camera Options -#define TEXT_LAKITU_MARIO _("ジュゲム↔マリオ") -#define TEXT_LAKITU_STOP _("ジュゲム↔ストップ") -#define TEXT_NORMAL_UPCLOSE _("(おすすめ)(リアル)") -#define TEXT_NORMAL_FIXED _("(おすすめ)(とまる)") - -// Course Completed Misc Text -#define TEXT_CATCH _("キャッチ!") -#define TEXT_CLEAR _("クリア!") -#define TEXT_HUD_HI_SCORE _("HISCORE") - -// Save Options -#define TEXT_SAVE_AND_CONTINUE _("セーブしてつづける?") -#define TEXT_SAVE_AND_QUIT _("セーブしておわる?") -#define TEXT_CONTINUE_WITHOUT_SAVING _("セーブしないでつづける?") - -/** - * Ending Peach cutscene text. - */ -#define TEXT_FILE_MARIO_EXCLAMATION _("マリオ!!") -#define TEXT_POWER_STARS_RESTORED _("おしろにスターが もどったのね") -#define TEXT_THANKS_TO_YOU _("みんな あなたのおかげだわ!") -#define TEXT_THANK_YOU_MARIO _("ありがとう マリオ") -#define TEXT_SOMETHING_SPECIAL _("なにか おれいをしなくちゃ・・") -#define TEXT_LISTEN_EVERYBODY _("さあ みんな") -#define TEXT_LETS_HAVE_CAKE _("おいしいケーキを やきましょう") -#define TEXT_FOR_MARIO _("マリオの ために・・・") -#define TEXT_FILE_MARIO_QUESTION _("マリオ?") - -#endif - -#if defined(VERSION_US) || defined(VERSION_EU) - -/** - * File Select Text - */ -// Main Screens -#define TEXT_MARIO _("MARIO") // View Score Menu -#define TEXT_SELECT_FILE _("SELECT FILE") -#define TEXT_CHECK_FILE _("CHECK FILE") -#define TEXT_COPY_FILE _("COPY FILE") -#define TEXT_ERASE_FILE _("ERASE FILE") -#define TEXT_SOUND_SELECT _("SOUND SELECT") -#define TEXT_FILE_MARIO_A _("MARIO A") -#define TEXT_FILE_MARIO_B _("MARIO B") -#define TEXT_FILE_MARIO_C _("MARIO C") -#define TEXT_FILE_MARIO_D _("MARIO D") - -// Menu Options -#define TEXT_SCORE _("SCORE") -#define TEXT_COPY _("COPY") -#define TEXT_ERASE _("ERASE") - -// Sound Options -#define TEXT_STEREO _("STEREO") -#define TEXT_MONO _("MONO") -#define TEXT_HEADSET _("HEADSET") - -// Misc Menu Text -#define TEXT_SAVED_DATA_EXISTS _("SAVED DATA EXITS") // Misspell -#define TEXT_NO_SAVED_DATA_EXISTS _("NO SAVED DATA EXISTS") - -// Inside a Menu -#define TEXT_RETURN _("RETURN") -#define TEXT_CHECK_SCORE _("CHECK SCORE") -#define TEXT_COPY_FILE_BUTTON _("COPY FILE") -#define TEXT_ERASE_FILE_BUTTON _("ERASE FILE") - -// Score Menu -#define TEXT_HI_SCORE _("HI SCORE") -#define TEXT_MY_SCORE _("MY SCORE") -// Score Mario Text ("☺" is the Mario face defined in the US/EU menu char table) -#define TEXT_SCORE_MARIO_A _("☺A") -#define TEXT_SCORE_MARIO_B _("☺B") -#define TEXT_SCORE_MARIO_C _("☺C") -#define TEXT_SCORE_MARIO_D _("☺D") - -// Copy Menu -#define TEXT_COPY_IT_TO_WHERE _("COPY IT TO WHERE?") -#define TEXT_COPYING_COMPLETED _("COPYING COMPLETED") -#define TEXT_NO_FILE_TO_COPY_FROM _("NO EMPTY FILE") - -// Erase Menu -#define TEXT_SURE _("SURE?") -#define TEXT_YES _("YES") -#define TEXT_NO _("NO") -#define TEXT_FILE_MARIO_A_JUST_ERASED _("MARIO A JUST ERASED") - -/** - * Menus Text (Pause, Course Completed) - */ -// Main Courses -#define TEXT_COURSE _("COURSE") -#define TEXT_MYSCORE _("MYSCORE") -#define TEXT_CONTINUE _("CONTINUE") -#define TEXT_EXIT_COURSE _("EXIT COURSE") -#ifndef VERSION_EU // "R" text is different in EU -#define TEXT_CAMERA_ANGLE_R _("SET CAMERA ANGLE WITH R") -#endif - -// Camera Options -#define TEXT_LAKITU_MARIO _("LAKITU + MARIO") -#define TEXT_LAKITU_STOP _("LAKITU + STOP") -#define TEXT_NORMAL_UPCLOSE __("(NORMAL)(UP-CLOSE)") -#define TEXT_NORMAL_FIXED __("(NORMAL)(FIXED)") - -// Course Completed Misc Text -#define TEXT_CATCH _("CATCH") -#define TEXT_CLEAR _("CLEAR") -#define TEXT_HUD_HI_SCORE _("HI SCORE") - -// Save Options -#define TEXT_SAVE_AND_CONTINUE _("SAVE & CONTINUE") -#define TEXT_SAVE_AND_QUIT _("SAVE & QUIT") -#define TEXT_CONTINUE_WITHOUT_SAVING _("CONTINUE, DON'T SAVE") - -/** - * Ending Peach cutscene text. - */ -#define TEXT_FILE_MARIO_EXCLAMATION _("Mario!") -#define TEXT_POWER_STARS_RESTORED __("The power of the Stars is restored to the castle...") -#define TEXT_THANKS_TO_YOU __("...and it's all thanks to you!") -#define TEXT_THANK_YOU_MARIO __("Thank you, Mario!") -#define TEXT_SOMETHING_SPECIAL __("We have to do something special for you...") -#define TEXT_LISTEN_EVERYBODY _("Listen, everybody,") -#define TEXT_LETS_HAVE_CAKE _("let's bake a delicious cake...") -#define TEXT_FOR_MARIO _("...for Mario...") -#define TEXT_FILE_MARIO_QUESTION _("Mario!") - -#endif - -#ifdef VERSION_EU - -/** - * File Select Text - */ -#define TEXT_RETURN_FR _("RETOUR") -#define TEXT_RETURN_DE _("ZURÜCK") - -#define TEXT_CHECK_SCORE_FR _("SCORE") -#define TEXT_CHECK_SCORE_DE _("LEISTUNG") - -#define TEXT_COPY_FILE_FR _("COPIER") -#define TEXT_COPY_FILE_DE _("KOPIEREN") - -#define TEXT_ERASE_FILE_FR _("EFFACER") -#define TEXT_ERASE_FILE_DE _("LÖSCHEN") - -#define TEXT_SELECT_FILE_FR _("CHOISIR FICHIER") -#define TEXT_SELECT_FILE_DE _("WwHLE SPIEL") - -#define TEXT_SCORE_FR _("SCORE") -#define TEXT_SCORE_DE _("LEISTUNG") - -#define TEXT_COPY_FR _("COPIER") -#define TEXT_COPY_DE _("KOPIEREN") - -#define TEXT_ERASE_FR _("EFFACER") -#define TEXT_ERASE_DE _("LÖSCHEN") - -#define TEXT_OPTION _("OPTION") // new in EU -#define TEXT_OPTION_FR _("OPTION") -#define TEXT_OPTION_DE _("OPTIONEN") - -#define TEXT_CHECK_FILE_FR _("VOIR SCORE") -#define TEXT_CHECK_FILE_DE _("VON WELCHEM SPIEL") - -#define TEXT_NO_SAVED_DATA_EXISTS_FR _("AUCUNE SAUVEGARDE DISPONIBLE") -#define TEXT_NO_SAVED_DATA_EXISTS_DE _("KEIN SPIEL VORHANDEN") - -#define TEXT_COPY_FILE_BUTTON_FR _("COPIER FICHIER") -#define TEXT_COPY_FILE_BUTTON_DE _("SPIEL KOPIEREN") - -#define TEXT_COPY_IT_TO_WHERE_FR _("COPIER SUR?") -#define TEXT_COPY_IT_TO_WHERE_DE _("WOHIN KOPIEREN?") - -#define TEXT_COPYING_COMPLETED_FR _("COPIE ACHEVEÉ") -#define TEXT_COPYING_COMPLETED_DE _("SPIEL KOPIERT") - -#define TEXT_SAVED_DATA_EXISTS_FR _("SAVEGARDE EXISTANTE") -#define TEXT_SAVED_DATA_EXISTS_DE _("BEREITS BELEGT") - -#define TEXT_NO_FILE_TO_COPY_FROM_FR _("AUCUN FICHIER VIDE") -#define TEXT_NO_FILE_TO_COPY_FROM_DE _("KEIN PLATZ VORHANDEN") - -#define TEXT_YES_FR _("OUI") -#define TEXT_YES_DE _("JA") - -#define TEXT_NO_FR _("NON") -#define TEXT_NO_DE _("NEIN") - -#define TEXT_ERASE_FILE_BUTTON_FR _("EFFACER FICHIER") -#define TEXT_ERASE_FILE_BUTTON_DE _("SPIEL LxSCHEN") - -#define TEXT_SURE_FR _("OK?") -#define TEXT_SURE_DE _("SICHER?") - -#define TEXT_FILE_MARIO_A_JUST_ERASED_FR _("MARIO A EFFACÉ") -#define TEXT_FILE_MARIO_A_JUST_ERASED_DE _("MARIO A GELÖSCHT") - -#define TEXT_SOUND_SELECT_FR _("SON") -#define TEXT_SOUND_SELECT_DE _("SOUND") - -#define TEXT_LANGUAGE_SELECT _("LANGUAGE SELECT") // new in EU -#define TEXT_LANGUAGE_SELECT_FR _("SELECTION LANGUE") -#define TEXT_LANGUAGE_SELECT_DE _("WwHLE SPRACHE") - -#define TEXT_STEREO_FR _("STÉRÉO") -#define TEXT_MONO_FR _("MONO") -#define TEXT_HEADSET_FR _("CASQUE") - -#define TEXT_STEREO_DE _("STEREO") -#define TEXT_MONO_DE _("MONO") -#define TEXT_HEADSET_DE _("PHONES") - -#define TEXT_ENGLISH _("ENGLISH") -#define TEXT_FRENCH _("FRANÇAIS") -#define TEXT_GERMAN _("DEUTSCH") - -#define TEXT_HI_SCORE_FR _("MEILLEUR SCORE") -#define TEXT_HI_SCORE_DE _("BESTLEISTUNG") - -#define TEXT_MY_SCORE_FR _("MON SCORE") -#define TEXT_MY_SCORE_DE _("LEISTUNG") - -#define TEXT_NEW_FR _("VIDE") -#define TEXT_NEW_DE _("FREI") - - -/** - * Menus Text (Pause, Course Completed) - */ -// Main Courses -// English, "R" text is different -#define TEXT_CAMERA_ANGLE_R _("SET CAMERA ANGLE WITH [R]") -// French -#define TEXT_COURSE_FR _("NIVEAU") -#define TEXT_MY_SCORE_FR _("MON SCORE") -#define TEXT_CONTINUE_FR _("CONTINUER") -#define TEXT_EXIT_COURSE_FR _("QUITTER NIVEAU") -#define TEXT_CAMERA_ANGLE_R_FR _("RÉGLAGE CAMÉRA AVEC [R]") -// German -#define TEXT_COURSE_DE _("KURS") -#define TEXT_MY_SCORE_DE _("LEISTUNG") -#define TEXT_CONTINUE_DE _("WEITER") -#define TEXT_EXIT_COURSE_DE _("KURS VERLASSEN") -#define TEXT_CAMERA_ANGLE_R_DE _("KAMERA MIT [R] VERSTELLEN") - -// Camera Options -// French -#define TEXT_NORMAL_UPCLOSE_FR __("(NORMAL)(GROS-PLAN)") -#define TEXT_NORMAL_FIXED_FR __("(NORMAL)(FIXE)") -// German -#define TEXT_NORMAL_UPCLOSE_DE __("(NORMAL)(WEIT-ZOOM)") -#define TEXT_NORMAL_FIXED_DE __("(NORMAL)(STATIV)") - -// Course Completed Misc Text -// French -#define TEXT_HUD_HI_SCORE_FR _("MEILLEUR SCORE") -#define TEXT_HUD_CONGRATULATIONS_FR _("FELICITATIONS") -// German -#define TEXT_HUD_HI_SCORE_DE _("BESTLEISTUNG") -#define TEXT_HUD_CONGRATULATIONS_DE _("GRATULATION") - -// Save Options -// French -#define TEXT_SAVE_AND_CONTINUE_FR _("SAUVEGARDER & CONTINUER") -#define TEXT_SAVE_AND_QUIT_FR _("SAUVEGARDER & QUITTER") -#define TEXT_CONTINUE_WITHOUT_SAVING_FR _("CONTINUER SANS SAUVEGARDER") -// German -#define TEXT_SAVE_AND_CONTINUE_DE _("SPEICHERN & WEITER") -#define TEXT_SAVE_AND_QUIT_DE _("SPEICHERN & ENDE") -#define TEXT_CONTINUE_WITHOUT_SAVING_DE _("WEITER OHNE ZU SPEICHERN") - -/** - * Ending Peach cutscene text. - */ -// French -#define TEXT_POWER_STARS_RESTORED_FR _("Grâce aux étoiles, le château a retrouvé ses pouvoirs...") -#define TEXT_THANKS_TO_YOU_FR _("...et ceci grâce à toi!") -#define TEXT_THANK_YOU_MARIO_FR _("Merci, Mario!") -#define TEXT_SOMETHING_SPECIAL_FR _("Tu mérites une récompense...") -#define TEXT_COME_ON_EVERYBODY_FR _("Venez les amis...") -#define TEXT_LETS_HAVE_CAKE_FR _("Allons préparer un délicieux gâteau...") -#define TEXT_FOR_MARIO_FR _("...pour Mario...") -// German -#define TEXT_POWER_STARS_RESTORED_DE _("Die Macht der Sterne ruht wieder sicher im Schloss...") -#define TEXT_THANKS_TO_YOU_DE _("...und alles dank Deiner Hilfe!") -#define TEXT_THANK_YOU_MARIO_DE _("Vielen Dank, Mario!") -#define TEXT_SOMETHING_SPECIAL_DE _("Wir haben eine Überraschung für Dich...") -#define TEXT_COME_ON_EVERYBODY_DE _("Hört alle her...") -#define TEXT_LETS_HAVE_CAKE_DE _("Laßt uns einen leckeren Kuchen backen...") -#define TEXT_FOR_MARIO_DE _("...für Mario...") - -/** - * Course Table names for Score Menu Save view - */ -#define TEXT_MENU_BOB _(" 1 BOB-OMB BATTLEFIELD") -#define TEXT_MENU_WF _(" 2 WHOMP'S FORTRESS") -#define TEXT_MENU_JRB _(" 3 JOLLY ROGER BAY") -#define TEXT_MENU_CCM _(" 4 COOL, COOL MOUNTAIN") -#define TEXT_MENU_BBH _(" 5 BIG BOO'S HAUNT") -#define TEXT_MENU_HMC _(" 6 HAZY MAZE CAVE") -#define TEXT_MENU_LLL _(" 7 LETHAL LAVA LAND") -#define TEXT_MENU_SSL _(" 8 SHIFTING SAND LAND") -#define TEXT_MENU_DDD _(" 9 DIRE, DIRE DOCKS") -#define TEXT_MENU_SL _("10 SNOWMAN'S LAND") -#define TEXT_MENU_WDW _("11 WET-DRY WORLD") -#define TEXT_MENU_TTM _("12 TALL, TALL MOUNTAIN") -#define TEXT_MENU_THI _("13 TINY-HUGE ISLAND") -#define TEXT_MENU_TTC _("14 TICK TOCK CLOCK") -#define TEXT_MENU_RR _("15 RAINBOW RIDE") -#define TEXT_MENU_BITDW _(" BOWSER IN THE DARK WORLD") -#define TEXT_MENU_BITFS _(" BOWSER IN THE FIRE SEA") -#define TEXT_MENU_BITS _(" BOWSER IN THE SKY") -#define TEXT_MENU_PSS _(" THE PRINCESS'S SECRET SLIDE") -#define TEXT_MENU_COTMC _(" CAVERN OF THE METAL CAP") -#define TEXT_MENU_TOTWC _(" TOWER OF THE WING CAP") -#define TEXT_MENU_VCUTM _(" VANISH CAP UNDER THE MOAT") -#define TEXT_MENU_WMOTR _(" WING MARIO OVER THE RAINBOW") -#define TEXT_MENU_SA _(" THE SECRET AQUARIUM") -#define TEXT_MENU_NONE _("") -#define TEXT_MENU_STARS _(" CASTLE SECRET STARS") - -#define TEXT_MENU_BOB_FR _(" 1 BATAILLE DE BOB-OMB") -#define TEXT_MENU_WF_FR _(" 2 FORTERESSE DE WHOMP") -#define TEXT_MENU_JRB_FR _(" 3 BAIE DES PIRATES") -#define TEXT_MENU_CCM_FR _(" 4 MONTAGNE GLA-GLA") -#define TEXT_MENU_BBH_FR _(" 5 MANOIR DE BIG BOO") -#define TEXT_MENU_HMC_FR _(" 6 CAVERNE BRUMEUSE") -#define TEXT_MENU_LLL_FR _(" 7 LAVES FATALES") -#define TEXT_MENU_SSL_FR _(" 8 SABLES TROP MOUVANTS") -#define TEXT_MENU_DDD_FR _(" 9 AFFREUX BASSIN") -#define TEXT_MENU_SL_FR _("10 CHEZ LE ROI DES NEIGES") -#define TEXT_MENU_WDW_FR _("11 MONDE TREMPE-SECHE") -#define TEXT_MENU_TTM_FR _("12 TROP HAUTE MONTAGNE") -#define TEXT_MENU_THI_FR _("13 ILE GRANDS-PETITS") -#define TEXT_MENU_TTC_FR _("14 HORLOGE TIC-TAC") -#define TEXT_MENU_RR_FR _("15 COURSE ARC-EN-CIEL") -#define TEXT_MENU_BITDW_FR _(" BOWSER DES TENEBRES") -#define TEXT_MENU_BITFS_FR _(" BOWSER DES LAVES") -#define TEXT_MENU_BITS_FR _(" BOWSER DES CIEUX") -#define TEXT_MENU_PSS_FR _(" GLISSADE DE LA PRINCESSE") -#define TEXT_MENU_COTMC_FR _(" MINE DES CASQUETTES-METAL") -#define TEXT_MENU_TOTWC_FR _(" INTERRUPTEUR DE LA TOUR AILEE") -#define TEXT_MENU_VCUTM_FR _(" INVISIBLE SOUS LES DOUVES") -#define TEXT_MENU_WMOTR_FR _(" AU-DELA DE L'ARC-EN-CIEL") -#define TEXT_MENU_SA_FR _(" AQUARIUM SECRET") -#define TEXT_MENU_NONE_FR _("") -#define TEXT_MENU_STARS_FR _(" ETOILES SECRETES") - -#define TEXT_MENU_BOB_DE _(" 1 BOB-OMBS BOMBENBERG") -#define TEXT_MENU_WF_DE _(" 2 WUMMPS WUCHTWALL") -#define TEXT_MENU_JRB_DE _(" 3 PIRATENBUCHT PANIK") -#define TEXT_MENU_CCM_DE _(" 4 BIBBERBERG BOB") -#define TEXT_MENU_BBH_DE _(" 5 BIG BOOS BURG") -#define TEXT_MENU_HMC_DE _(" 6 GRÜNE GIFTGROTTE") -#define TEXT_MENU_LLL_DE _(" 7 LAVA LAGUNE") -#define TEXT_MENU_SSL_DE _(" 8 WOBIWABA WÜSTE") -#define TEXT_MENU_DDD_DE _(" 9 WILDE WASSERWERFT") -#define TEXT_MENU_SL_DE _("10 FROSTBEULEN FRUST") -#define TEXT_MENU_WDW_DE _("11 ATLANTIS AQUARIA") -#define TEXT_MENU_TTM_DE _("12 FLIEGENPILZ FIASKO") -#define TEXT_MENU_THI_DE _("13 GULLIVER GUMBA") -#define TEXT_MENU_TTC_DE _("14 TICK TACK TRAUMA") -#define TEXT_MENU_RR_DE _("15 REGENBOGEN RASEREI") -#define TEXT_MENU_BITDW_DE _(" BOWSERS SCHATTENWELT") -#define TEXT_MENU_BITFS_DE _(" BOWSERS LAVASEE") -#define TEXT_MENU_BITS_DE _(" BOWSERS LUFTSCHLOSS") -#define TEXT_MENU_PSS_DE _(" TOADSTOOLS RUTSCHBAHN") -#define TEXT_MENU_COTMC_DE _(" GRÜNER SCHALTERPALAST") -#define TEXT_MENU_TOTWC_DE _(" ROTER SCHALTERPALAST") -#define TEXT_MENU_VCUTM_DE _(" BLAUER SCHALTERPALAST") -#define TEXT_MENU_WMOTR_DE _(" REGENBOGEN FEUERWERK") -#define TEXT_MENU_SA_DE _(" VERSTECKTES AQUARIUM") -#define TEXT_MENU_NONE_DE _("") -#define TEXT_MENU_STARS_DE _(" GEHEIME STERNE") -#endif // VERSION_EU - -#endif // TEXT_STRINGS_H diff --git a/include/texts_table.h b/include/texts_table.h new file mode 100644 index 00000000..97e7b332 --- /dev/null +++ b/include/texts_table.h @@ -0,0 +1,12 @@ +#pragma once + +#include "align_asset_macro.h" + +#define dgDialogRoot "texts/dialogs/dialog_%02X" +static const ALIGN_ASSET(2) char gDialogRoot[] = dgDialogRoot; + +#define dgCourseRoot "texts/courses/course_%02X" +static const ALIGN_ASSET(2) char gCourseRoot[] = dgCourseRoot; + +#define dgActRoot "texts/acts/act_%02X" +static const ALIGN_ASSET(2) char gActRoot[] = dgActRoot; \ No newline at end of file diff --git a/include/types.h b/include/types.h index bd088d5a..4592c7f9 100644 --- a/include/types.h +++ b/include/types.h @@ -109,6 +109,10 @@ struct AnimInfo { /*0x0A 0x42*/ u16 animTimer; /*0x0C 0x44*/ s32 animFrameAccelAssist; /*0x10 0x48*/ s32 animAccel; + s16 prevAnimFrame; + s16 prevAnimID; + u32 prevAnimFrameTimestamp; + struct Animation *prevAnimPtr; }; struct GraphNodeObject { @@ -118,11 +122,22 @@ struct GraphNodeObject { /*0x19*/ s8 activeAreaIndex; /*0x1A*/ Vec3s angle; /*0x20*/ Vec3f pos; + Vec3s prevAngle; + Vec3f prevPos; + u32 prevTimestamp; + Vec3f prevShadowPos; + u32 prevShadowPosTimestamp; /*0x2C*/ Vec3f scale; + Vec3f prevScale; + u32 prevScaleTimestamp; /*0x38*/ struct AnimInfo animInfo; /*0x4C*/ struct SpawnInfo *unk4C; /*0x50*/ Mat4 *throwMatrix; // matrix ptr + Mat4 prevThrowMatrix; + u32 prevThrowMatrixTimestamp; + Mat4 *throwMatrixInterpolated; /*0x54*/ Vec3f cameraToObject; + u32 skipInterpolationTimestamp; }; struct ObjectNode { @@ -227,6 +242,10 @@ struct Surface { } normal; /*0x28*/ f32 originOffset; /*0x2C*/ struct Object *object; + Vec3s prevVertex1; + Vec3s prevVertex2; + Vec3s prevVertex3; + u32 modifiedTimestamp; }; struct MarioBodyState { diff --git a/levels/castle_inside/texture.inc.c b/levels/castle_inside/texture.inc.c index fe9b72da..7ecf7b51 100644 --- a/levels/castle_inside/texture.inc.c +++ b/levels/castle_inside/texture.inc.c @@ -66,21 +66,12 @@ ALIGNED8 static const Texture inside_castle_seg7_texture_0700E800[] = "__OTR__le // 0x0700F800 - 0x07010800 ALIGNED8 static const Texture inside_castle_seg7_texture_0700F800[] = "__OTR__levels/castle_inside/22"; -#ifdef VERSION_JP // 0x07010800 - 0x07011800 ALIGNED8 static const Texture inside_castle_seg7_texture_07010800[] = "__OTR__levels/castle_inside/23"; // 0x07011800 - 0x0701200 ALIGNED8 static const Texture inside_castle_seg7_texture_07011800[] = "__OTR__levels/castle_inside/24"; -#else -// 0x07010800 - 0x07011800 -ALIGNED8 static const Texture inside_castle_seg7_texture_07010800[] = "__OTR__levels/castle_inside/23_us"; - -// 0x07011800 - 0x0701200 -ALIGNED8 static const Texture inside_castle_seg7_texture_07011800[] = "__OTR__levels/castle_inside/24_us"; -#endif - // 0x07012800 - 0x07013800 ALIGNED8 static const Texture inside_castle_seg7_texture_07012800[] = "__OTR__levels/castle_inside/25"; diff --git a/levels/course_defines.h b/levels/course_defines.h index 600cead4..e2fbdfa8 100644 --- a/levels/course_defines.h +++ b/levels/course_defines.h @@ -9,31 +9,35 @@ * 2: The camera goes to a closeup of mario * 3: Bowser keys and the grand star * 4: Default, used for 100 coin stars, 8 red coin stars in bowser levels, and secret stars + * + * #region [PU] Added info for each course + * Argument 3: Human readable name of the course. + * #endregion */ -DEFINE_COURSE(COURSE_NONE, 0x44444440) // (0) Course Hub (Castle Grounds) -DEFINE_COURSE(COURSE_BOB, 0x00022240) // (1) Bob Omb Battlefield -DEFINE_COURSE(COURSE_WF, 0x00002040) // (2) Whomp's Fortress -DEFINE_COURSE(COURSE_JRB, 0x22222240) // (3) Jolly Rodger's Bay -DEFINE_COURSE(COURSE_CCM, 0x00220040) // (4) Cool Cool Mountain -DEFINE_COURSE(COURSE_BBH, 0x22222240) // (5) Big Boo's Haunt -DEFINE_COURSE(COURSE_HMC, 0x22222240) // (6) Hazy Maze Cave -DEFINE_COURSE(COURSE_LLL, 0x21212140) // (7) Lethal Lava Land -DEFINE_COURSE(COURSE_SSL, 0x20222240) // (8) Shifting Sand Land -DEFINE_COURSE(COURSE_DDD, 0x22222240) // (9) Dire Dire Docks -DEFINE_COURSE(COURSE_SL, 0x02020240) // (10) Snowman's Land -DEFINE_COURSE(COURSE_WDW, 0x22102240) // (11) Wet Dry World -DEFINE_COURSE(COURSE_TTM, 0x00000040) // (12) Tall Tall Mountain -DEFINE_COURSE(COURSE_THI, 0x11112140) // (13) Tiny Huge Island -DEFINE_COURSE(COURSE_TTC, 0x22222240) // (14) Tick Tock Clock -DEFINE_COURSE(COURSE_RR, 0x00000040) // (15) Rainbow Ride +DEFINE_COURSE( COURSE_NONE, 0x44444440, "Course Hub (Castle Grounds)") // (0) +DEFINE_COURSE( COURSE_BOB, 0x00022240, "Bob Omb Battlefield") // (1) +DEFINE_COURSE( COURSE_WF, 0x00002040, "Whomp's Fortress") // (2) +DEFINE_COURSE( COURSE_JRB, 0x22222240, "Jolly Rodger's Bay") // (3) +DEFINE_COURSE( COURSE_CCM, 0x00220040, "Cool Cool Mountain") // (4) +DEFINE_COURSE( COURSE_BBH, 0x22222240, "Big Boo's Haunt") // (5) +DEFINE_COURSE( COURSE_HMC, 0x22222240, "Hazy Maze Cave") // (6) +DEFINE_COURSE( COURSE_LLL, 0x21212140, "Lethal Lava Land") // (7) +DEFINE_COURSE( COURSE_SSL, 0x20222240, "Shifting Sand Land") // (8) +DEFINE_COURSE( COURSE_DDD, 0x22222240, "Dire Dire Docks") // (9) +DEFINE_COURSE( COURSE_SL, 0x02020240, "Snowman's Land") // (10) +DEFINE_COURSE( COURSE_WDW, 0x22102240, "Wet Dry World") // (11) +DEFINE_COURSE( COURSE_TTM, 0x00000040, "Tall Tall Mountain") // (12) +DEFINE_COURSE( COURSE_THI, 0x11112140, "Tiny Huge Island") // (13) +DEFINE_COURSE( COURSE_TTC, 0x22222240, "Tick Tock Clock") // (14) +DEFINE_COURSE( COURSE_RR, 0x00000040, "Rainbow Ride") // (15) DEFINE_COURSES_END() -DEFINE_BONUS_COURSE(COURSE_BITDW, 0x34444440) // (16) Bowser in the Dark World -DEFINE_BONUS_COURSE(COURSE_BITFS, 0x34444440) // (17) Bowser in the Fire Sea -DEFINE_BONUS_COURSE(COURSE_BITS, 0x34444440) // (18) Bowser in the Sky -DEFINE_BONUS_COURSE(COURSE_PSS, 0x24444440) // (19) Princess's Secret Slide -DEFINE_BONUS_COURSE(COURSE_COTMC, 0x44444440) // (20) Cavern of the Metal Cap -DEFINE_BONUS_COURSE(COURSE_TOTWC, 0x04444440) // (21) Tower of the Wing Cap -DEFINE_BONUS_COURSE(COURSE_VCUTM, 0x24444440) // (22) Vanish Cap Under the Moat -DEFINE_BONUS_COURSE(COURSE_WMOTR, 0x04444440) // (23) Winged Mario over the Rainbow -DEFINE_BONUS_COURSE(COURSE_SA, 0x24444440) // (24) Secret Aquarium -DEFINE_BONUS_COURSE(COURSE_CAKE_END, 0x44444440) // (25) The End (Cake Scene) +DEFINE_BONUS_COURSE(COURSE_BITDW, 0x34444440, "Bowser in the Dark World") // (16) +DEFINE_BONUS_COURSE(COURSE_BITFS, 0x34444440, "Bowser in the Fire Sea") // (17) +DEFINE_BONUS_COURSE(COURSE_BITS, 0x34444440, "Bowser in the Sky") // (18) +DEFINE_BONUS_COURSE(COURSE_PSS, 0x24444440, "Princess's Secret Slide") // (19) +DEFINE_BONUS_COURSE(COURSE_COTMC, 0x44444440, "Cavern of the Metal Cap") // (20) +DEFINE_BONUS_COURSE(COURSE_TOTWC, 0x04444440, "Tower of the Wing Cap") // (21) +DEFINE_BONUS_COURSE(COURSE_VCUTM, 0x24444440, "Vanish Cap Under the Moat") // (22) +DEFINE_BONUS_COURSE(COURSE_WMOTR, 0x04444440, "Winged Mario over the Rainbow") // (23) +DEFINE_BONUS_COURSE(COURSE_SA, 0x24444440, "Secret Aquarium") // (24) +DEFINE_BONUS_COURSE(COURSE_CAKE_END, 0x44444440, "The End (Cake Scene)") // (25) diff --git a/levels/ending/leveldata.c b/levels/ending/leveldata.c index 555eae04..66d19a0d 100644 --- a/levels/ending/leveldata.c +++ b/levels/ending/leveldata.c @@ -7,7 +7,6 @@ #include "make_const_nonconst.h" #ifdef VERSION_EU -#include "levels/ending/cake_eu.inc.c" // 0x07023000 - 0x07023FFF ALIGNED8 static const Texture cake_end_texture_eu_35[] = "__OTR__levels/ending/eu_023000"; diff --git a/levels/intro/leveldata.c b/levels/intro/leveldata.c index 929b4d3e..64f20aab 100644 --- a/levels/intro/leveldata.c +++ b/levels/intro/leveldata.c @@ -3329,24 +3329,11 @@ static const Vtx intro_seg7_vertex_0700B460[] = { {{{ 268, 196, -1}, 0, { 0, 0}, {0xff, 0xff, 0xff, 0xff}}}, }; -#if defined(VERSION_EU) || defined(VERSION_SH) -// 0x0700B4A0 - 0x0700B4A2 -ALIGNED8 static const Texture intro_seg7_texture_0700B4A0[] = "__OTR__levels/intro/2_eu_copyright"; - -#else // 0x0700B4A0 - 0x0700B4A2 ALIGNED8 static const Texture intro_seg7_texture_0700B4A0[] = "__OTR__levels/intro/2_copyright"; -#endif -#if defined(VERSION_EU) -// 0x0700C4A0 - 0x0700D4A0 -ALIGNED8 static const u8 intro_seg7_texture_0700C4A0[] = "__OTR__levels/intro/3_eu_tm"; -#elif defined(VERSION_SH) -ALIGNED8 static const u8 intro_seg7_texture_0700C4A0[] = "__OTR__levels/intro/3_sh_tm"; -#else // 0x0700C4A0 - 0x0700D4A0 ALIGNED8 static const Texture intro_seg7_texture_0700C4A0[] = "__OTR__levels/intro/3_tm"; -#endif // 0x0700C6A0 - 0x0700C790 const Gfx intro_seg7_dl_0700C6A0[] = { diff --git a/levels/level_defines.h b/levels/level_defines.h index c14f2523..a46d3696 100644 --- a/levels/level_defines.h +++ b/levels/level_defines.h @@ -14,44 +14,47 @@ // Argument 7, 8, 9: Echo levels for individual areas. // Argument 10: Specify dynamic music tables for levels, if specified. _ for none. // Argument 11: Specify level camera table, if specified. _ for none. +// #region [PU] Added info for each level +// Argument 12: Human readable name of the level. +// #endregion // NOTE: Be sure to edit sZoomOutAreaMasks in camera.c, as there isnt a good way to macro those right now. // TODO: Figure something out for sZoomOutAreaMasks? -STUB_LEVEL( "", LEVEL_UNKNOWN_1, COURSE_NONE, 20000, 0x00, 0x00, 0x00, _, _) -STUB_LEVEL( "", LEVEL_UNKNOWN_2, COURSE_NONE, 20000, 0x00, 0x00, 0x00, _, _) -STUB_LEVEL( "", LEVEL_UNKNOWN_3, COURSE_NONE, 20000, 0x00, 0x00, 0x00, _, _) -DEFINE_LEVEL("TERESA OBAKE", LEVEL_BBH, COURSE_BBH, bbh, spooky, 28000, 0x28, 0x28, 0x28, sDynBbh, sCamBBH) -DEFINE_LEVEL("YYAMA1 % YSLD1", LEVEL_CCM, COURSE_CCM, ccm, snow, 17000, 0x10, 0x38, 0x38, _, sCamCCM) -DEFINE_LEVEL("SELECT ROOM", LEVEL_CASTLE, COURSE_NONE, castle_inside, inside, 20000, 0x20, 0x20, 0x30, _, sCamCastle) -DEFINE_LEVEL("HORROR DUNGEON", LEVEL_HMC, COURSE_HMC, hmc, cave, 16000, 0x28, 0x28, 0x28, sDynHmc, sCamHMC) -DEFINE_LEVEL("SABAKU % PYRMD", LEVEL_SSL, COURSE_SSL, ssl, generic, 15000, 0x08, 0x30, 0x30, _, sCamSSL) -DEFINE_LEVEL("BATTLE FIELD", LEVEL_BOB, COURSE_BOB, bob, generic, 15000, 0x08, 0x08, 0x08, _, _) -DEFINE_LEVEL("YUKIYAMA2", LEVEL_SL, COURSE_SL, sl, snow, 14000, 0x10, 0x28, 0x28, _, sCamSL) -DEFINE_LEVEL("POOL KAI", LEVEL_WDW, COURSE_WDW, wdw, grass, 17000, 0x10, 0x18, 0x18, sDynWdw, _) -DEFINE_LEVEL("WTDG % TINBOTU", LEVEL_JRB, COURSE_JRB, jrb, water, 20000, 0x10, 0x18, 0x18, sDynJrb, _) -DEFINE_LEVEL("BIG WORLD", LEVEL_THI, COURSE_THI, thi, grass, 20000, 0x0c, 0x0c, 0x20, _, sCamTHI) -DEFINE_LEVEL("CLOCK TOWER", LEVEL_TTC, COURSE_TTC, ttc, machine, 18000, 0x18, 0x18, 0x18, _, _) -DEFINE_LEVEL("RAINBOW CRUISE", LEVEL_RR, COURSE_RR, rr, sky, 20000, 0x20, 0x20, 0x20, _, sCamRR) -DEFINE_LEVEL("MAIN MAP", LEVEL_CASTLE_GROUNDS, COURSE_NONE, castle_grounds, outside, 25000, 0x08, 0x08, 0x08, _, _) -DEFINE_LEVEL("EXT1 YOKO SCRL", LEVEL_BITDW, COURSE_BITDW, bitdw, sky, 16000, 0x28, 0x28, 0x28, _, _) -DEFINE_LEVEL("EXT7 HORI MINI", LEVEL_VCUTM, COURSE_VCUTM, vcutm, outside, 30000, 0x28, 0x28, 0x28, _, _) -DEFINE_LEVEL("EXT2 TIKA LAVA", LEVEL_BITFS, COURSE_BITFS, bitfs, sky, 16000, 0x28, 0x28, 0x28, _, _) -DEFINE_LEVEL("EXT9 SUISOU", LEVEL_SA, COURSE_SA, sa, inside, 20000, 0x10, 0x10, 0x10, _, _) -DEFINE_LEVEL("EXT3 HEAVEN", LEVEL_BITS, COURSE_BITS, bits, sky, 16000, 0x28, 0x28, 0x28, _, _) -DEFINE_LEVEL("FIREB1 % INVLC", LEVEL_LLL, COURSE_LLL, lll, fire, 22000, 0x08, 0x30, 0x30, _, _) -DEFINE_LEVEL("WATER LAND", LEVEL_DDD, COURSE_DDD, ddd, water, 17000, 0x10, 0x20, 0x20, sDynDdd, _) -DEFINE_LEVEL("MOUNTAIN", LEVEL_WF, COURSE_WF, wf, grass, 13000, 0x08, 0x08, 0x08, _, _) -DEFINE_LEVEL("ENDING", LEVEL_ENDING, COURSE_CAKE_END, ending, generic, 20000, 0x00, 0x00, 0x00, _, _) -DEFINE_LEVEL("URANIWA", LEVEL_CASTLE_COURTYARD, COURSE_NONE, castle_courtyard, outside, 20000, 0x08, 0x08, 0x08, _, _) -DEFINE_LEVEL("EXT4 MINI SLID", LEVEL_PSS, COURSE_PSS, pss, mountain, 20000, 0x28, 0x28, 0x28, _, _) -DEFINE_LEVEL("IN THE FALL", LEVEL_COTMC, COURSE_COTMC, cotmc, cave, 18000, 0x28, 0x28, 0x28, _, sCamCotMC) -DEFINE_LEVEL("EXT6 MARIO FLY", LEVEL_TOTWC, COURSE_TOTWC, totwc, sky, 20000, 0x20, 0x20, 0x20, _, _) -DEFINE_LEVEL("KUPPA1", LEVEL_BOWSER_1, COURSE_BITDW, bowser_1, generic, VAL_DIFF, 0x40, 0x40, 0x40, _, _) -DEFINE_LEVEL("EXT8 BLUE SKY", LEVEL_WMOTR, COURSE_WMOTR, wmotr, generic, 20000, 0x28, 0x28, 0x28, _, _) -STUB_LEVEL( "", LEVEL_UNKNOWN_32, COURSE_NONE, 20000, 0x70, 0x00, 0x00, _, _) -DEFINE_LEVEL("KUPPA2", LEVEL_BOWSER_2, COURSE_BITFS, bowser_2, fire, VAL_DIFF, 0x40, 0x40, 0x40, _, _) -DEFINE_LEVEL("KUPPA3", LEVEL_BOWSER_3, COURSE_BITS, bowser_3, generic, VAL_DIFF, 0x40, 0x40, 0x40, _, _) -STUB_LEVEL( "", LEVEL_UNKNOWN_35, COURSE_NONE, 20000, 0x00, 0x00, 0x00, _, _) -DEFINE_LEVEL("DONKEY % SLID2", LEVEL_TTM, COURSE_TTM, ttm, mountain, 15000, 0x08, 0x08, 0x08, _, _) -STUB_LEVEL( "", LEVEL_UNKNOWN_37, COURSE_NONE, 20000, 0x00, 0x00, 0x00, _, _) -STUB_LEVEL( "", LEVEL_UNKNOWN_38, COURSE_NONE, 20000, 0x00, 0x00, 0x00, sDynUnk38, _) +STUB_LEVEL( "", LEVEL_UNKNOWN_1, COURSE_NONE, 20000, 0x00, 0x00, 0x00, _, _, "") +STUB_LEVEL( "", LEVEL_UNKNOWN_2, COURSE_NONE, 20000, 0x00, 0x00, 0x00, _, _, "") +STUB_LEVEL( "", LEVEL_UNKNOWN_3, COURSE_NONE, 20000, 0x00, 0x00, 0x00, _, _, "") +DEFINE_LEVEL("TERESA OBAKE", LEVEL_BBH, COURSE_BBH, bbh, spooky, 28000, 0x28, 0x28, 0x28, sDynBbh, sCamBBH, "Big Boos Haunt") +DEFINE_LEVEL("YYAMA1 % YSLD1", LEVEL_CCM, COURSE_CCM, ccm, snow, 17000, 0x10, 0x38, 0x38, _, sCamCCM, "Cool Cool Mountain") +DEFINE_LEVEL("SELECT ROOM", LEVEL_CASTLE, COURSE_NONE, castle_inside, inside, 20000, 0x20, 0x20, 0x30, _, sCamCastle, "Inside Peachs Castle") +DEFINE_LEVEL("HORROR DUNGEON", LEVEL_HMC, COURSE_HMC, hmc, cave, 16000, 0x28, 0x28, 0x28, sDynHmc, sCamHMC, "Hazy Maze Cave") +DEFINE_LEVEL("SABAKU % PYRMD", LEVEL_SSL, COURSE_SSL, ssl, generic, 15000, 0x08, 0x30, 0x30, _, sCamSSL, "Shifting Sand Land") +DEFINE_LEVEL("BATTLE FIELD", LEVEL_BOB, COURSE_BOB, bob, generic, 15000, 0x08, 0x08, 0x08, _, _, "Bobomb Battlefield") +DEFINE_LEVEL("YUKIYAMA2", LEVEL_SL, COURSE_SL, sl, snow, 14000, 0x10, 0x28, 0x28, _, sCamSL, "Snowmans Land") +DEFINE_LEVEL("POOL KAI", LEVEL_WDW, COURSE_WDW, wdw, grass, 17000, 0x10, 0x18, 0x18, sDynWdw, _, "Wet Dry World") +DEFINE_LEVEL("WTDG % TINBOTU", LEVEL_JRB, COURSE_JRB, jrb, water, 20000, 0x10, 0x18, 0x18, sDynJrb, _, "Jolly Roger Bay") +DEFINE_LEVEL("BIG WORLD", LEVEL_THI, COURSE_THI, thi, grass, 20000, 0x0c, 0x0c, 0x20, _, sCamTHI, "Tiny Huge Island") +DEFINE_LEVEL("CLOCK TOWER", LEVEL_TTC, COURSE_TTC, ttc, machine, 18000, 0x18, 0x18, 0x18, _, _, "Tick Tock Clock") +DEFINE_LEVEL("RAINBOW CRUISE", LEVEL_RR, COURSE_RR, rr, sky, 20000, 0x20, 0x20, 0x20, _, sCamRR, "Rainbow Ride") +DEFINE_LEVEL("MAIN MAP", LEVEL_CASTLE_GROUNDS, COURSE_NONE, castle_grounds, outside, 25000, 0x08, 0x08, 0x08, _, _, "Outside the Castle") +DEFINE_LEVEL("EXT1 YOKO SCRL", LEVEL_BITDW, COURSE_BITDW, bitdw, sky, 16000, 0x28, 0x28, 0x28, _, _, "Bowser in the Dark World") +DEFINE_LEVEL("EXT7 HORI MINI", LEVEL_VCUTM, COURSE_VCUTM, vcutm, outside, 30000, 0x28, 0x28, 0x28, _, _, "Vanish Cap Under the Moat") +DEFINE_LEVEL("EXT2 TIKA LAVA", LEVEL_BITFS, COURSE_BITFS, bitfs, sky, 16000, 0x28, 0x28, 0x28, _, _, "Bowser in the Fire Sea") +DEFINE_LEVEL("EXT9 SUISOU", LEVEL_SA, COURSE_SA, sa, inside, 20000, 0x10, 0x10, 0x10, _, _, "The Secret Aquarium") +DEFINE_LEVEL("EXT3 HEAVEN", LEVEL_BITS, COURSE_BITS, bits, sky, 16000, 0x28, 0x28, 0x28, _, _, "Bowser in the Sky") +DEFINE_LEVEL("FIREB1 % INVLC", LEVEL_LLL, COURSE_LLL, lll, fire, 22000, 0x08, 0x30, 0x30, _, _, "Lethal Lava Land") +DEFINE_LEVEL("WATER LAND", LEVEL_DDD, COURSE_DDD, ddd, water, 17000, 0x10, 0x20, 0x20, sDynDdd, _, "Dire Dire Docks") +DEFINE_LEVEL("MOUNTAIN", LEVEL_WF, COURSE_WF, wf, grass, 13000, 0x08, 0x08, 0x08, _, _, "Whomps Fortress") +DEFINE_LEVEL("ENDING", LEVEL_ENDING, COURSE_CAKE_END, ending, generic, 20000, 0x00, 0x00, 0x00, _, _, "The End") +DEFINE_LEVEL("URANIWA", LEVEL_CASTLE_COURTYARD, COURSE_NONE, castle_courtyard, outside, 20000, 0x08, 0x08, 0x08, _, _, "Castle Courtyard") +DEFINE_LEVEL("EXT4 MINI SLID", LEVEL_PSS, COURSE_PSS, pss, mountain, 20000, 0x28, 0x28, 0x28, _, _, "Secret Slide") +DEFINE_LEVEL("IN THE FALL", LEVEL_COTMC, COURSE_COTMC, cotmc, cave, 18000, 0x28, 0x28, 0x28, _, sCamCotMC, "Cavern of the Metal Cap") +DEFINE_LEVEL("EXT6 MARIO FLY", LEVEL_TOTWC, COURSE_TOTWC, totwc, sky, 20000, 0x20, 0x20, 0x20, _, _, "Tower of the Wing Cap") +DEFINE_LEVEL("KUPPA1", LEVEL_BOWSER_1, COURSE_BITDW, bowser_1, generic, VAL_DIFF, 0x40, 0x40, 0x40, _, _, "Bowser in the Dark World Boss") +DEFINE_LEVEL("EXT8 BLUE SKY", LEVEL_WMOTR, COURSE_WMOTR, wmotr, generic, 20000, 0x28, 0x28, 0x28, _, _, "Wing Mario Over the Rainbow") +STUB_LEVEL( "", LEVEL_UNKNOWN_32, COURSE_NONE, 20000, 0x70, 0x00, 0x00, _, _, "") +DEFINE_LEVEL("KUPPA2", LEVEL_BOWSER_2, COURSE_BITFS, bowser_2, fire, VAL_DIFF, 0x40, 0x40, 0x40, _, _, "Bowser in the Fire Sea Boss") +DEFINE_LEVEL("KUPPA3", LEVEL_BOWSER_3, COURSE_BITS, bowser_3, generic, VAL_DIFF, 0x40, 0x40, 0x40, _, _, "Bowser in the Sky Boss") +STUB_LEVEL( "", LEVEL_UNKNOWN_35, COURSE_NONE, 20000, 0x00, 0x00, 0x00, _, _, "") +DEFINE_LEVEL("DONKEY % SLID2", LEVEL_TTM, COURSE_TTM, ttm, mountain, 15000, 0x08, 0x08, 0x08, _, _, "Tall Tall Mountain") +STUB_LEVEL( "", LEVEL_UNKNOWN_37, COURSE_NONE, 20000, 0x00, 0x00, 0x00, _, _, "") +STUB_LEVEL( "", LEVEL_UNKNOWN_38, COURSE_NONE, 20000, 0x00, 0x00, 0x00, sDynUnk38, _, "") diff --git a/levels/level_headers.h.in b/levels/level_headers.h.in index 038608e7..b401ee68 100644 --- a/levels/level_headers.h.in +++ b/levels/level_headers.h.in @@ -1,7 +1,7 @@ // This file is to be processed by the Makefile to add #include "" before being included in build. -#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8) -#define DEFINE_LEVEL(_0, _1, _2, folder, _4, _5, _6, _7, _8, _9, _10) levels/folder/header.h +#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) +#define DEFINE_LEVEL(_0, _1, _2, folder, _4, _5, _6, _7, _8, _9, _10, _11) levels/folder/header.h #include "levels/level_defines.h" diff --git a/levels/level_rules.mk b/levels/level_rules.mk index 28ef92a9..db21b827 100644 --- a/levels/level_rules.mk +++ b/levels/level_rules.mk @@ -1,5 +1,5 @@ -#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8) -#define DEFINE_LEVEL(_0, _1, _2, folder, texturebin, _5, _6, _7, _8, _9, _10) $(eval $(call level_rules,folder,texturebin)) +#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) +#define DEFINE_LEVEL(_0, _1, _2, folder, texturebin, _5, _6, _7, _8, _9, _10, _11) $(eval $(call level_rules,folder,texturebin)) #include "levels/level_defines.h" diff --git a/levels/menu/header.h b/levels/menu/header.h index 170c16c1..ed95cd45 100644 --- a/levels/menu/header.h +++ b/levels/menu/header.h @@ -31,7 +31,8 @@ extern const Gfx dl_menu_generic_button[]; extern const Gfx dl_menu_idle_hand[]; extern const Gfx dl_menu_grabbing_hand[]; extern const u8 *const menu_hud_lut[]; -extern const u8 *const menu_font_lut[]; +extern const u8 *const menu_font_lut_us[]; +extern const u8 *const menu_font_lut_jp[]; extern const Gfx dl_menu_ia8_text_begin[]; extern const Gfx dl_menu_ia8_text_end[]; extern const Gfx dl_menu_rgba16_wood_course[]; diff --git a/levels/menu/leveldata.c b/levels/menu/leveldata.c index 923deca3..d2d877d4 100644 --- a/levels/menu/leveldata.c +++ b/levels/menu/leveldata.c @@ -5,9 +5,6 @@ #include "surface_terrains.h" #include "types.h" -#ifdef VERSION_EU -#include "text_strings.h" -#endif #include "make_const_nonconst.h" // 0x07000000 - 0x07000018 @@ -529,7 +526,6 @@ const Texture *const menu_hud_lut[] = { texture_menu_hud_char_katakana_sa, texture_menu_hud_char_katakana_u, texture_menu_hud_char_katakana_n, texture_menu_hud_char_kana_dakuten_do, }; -#if defined(VERSION_JP) || defined(VERSION_SH) UNUSED static const u64 menu_unused_0 = 0; // 0x0700AC48 @@ -925,250 +921,181 @@ ALIGNED8 static const Texture texture_menu_font_char_jp_multiply[] = "__OTR__lev // 0x0700CCC8 ALIGNED8 static const Texture texture_menu_font_char_jp_exclamation[] = "__OTR__levels/menu/main_menu_seg7.0CCC8"; -#else - // 0x0700AC40 -ALIGNED8 static const Texture texture_menu_font_char_0[] = "__OTR__levels/menu/main_menu_seg7_us.0AC40"; +ALIGNED8 static const Texture texture_menu_font_char_0[] = "__OTR__levels/menu/main_menu_seg7.0AC40"; // 0x0700AC80 -ALIGNED8 static const Texture texture_menu_font_char_1[] = "__OTR__levels/menu/main_menu_seg7_us.0AC80"; +ALIGNED8 static const Texture texture_menu_font_char_1[] = "__OTR__levels/menu/main_menu_seg7.0AC80"; // 0x0700ACC0 -ALIGNED8 static const Texture texture_menu_font_char_2[] = "__OTR__levels/menu/main_menu_seg7_us.0ACC0"; +ALIGNED8 static const Texture texture_menu_font_char_2[] = "__OTR__levels/menu/main_menu_seg7.0ACC0"; // 0x0700AD00 -ALIGNED8 static const Texture texture_menu_font_char_3[] = "__OTR__levels/menu/main_menu_seg7_us.0AD00"; +ALIGNED8 static const Texture texture_menu_font_char_3[] = "__OTR__levels/menu/main_menu_seg7.0AD00"; // 0x0700AD40 -ALIGNED8 static const Texture texture_menu_font_char_4[] = "__OTR__levels/menu/main_menu_seg7_us.0AD40"; +ALIGNED8 static const Texture texture_menu_font_char_4[] = "__OTR__levels/menu/main_menu_seg7.0AD40"; // 0x0700AD80 -ALIGNED8 static const Texture texture_menu_font_char_5[] = "__OTR__levels/menu/main_menu_seg7_us.0AD80"; +ALIGNED8 static const Texture texture_menu_font_char_5[] = "__OTR__levels/menu/main_menu_seg7.0AD80"; // 0x0700ADC0 -ALIGNED8 static const Texture texture_menu_font_char_6[] = "__OTR__levels/menu/main_menu_seg7_us.0ADC0"; +ALIGNED8 static const Texture texture_menu_font_char_6[] = "__OTR__levels/menu/main_menu_seg7.0ADC0"; // 0x0700AE00 -ALIGNED8 static const Texture texture_menu_font_char_7[] = "__OTR__levels/menu/main_menu_seg7_us.0AE00"; +ALIGNED8 static const Texture texture_menu_font_char_7[] = "__OTR__levels/menu/main_menu_seg7.0AE00"; // 0x0700AE40 -ALIGNED8 static const Texture texture_menu_font_char_8[] = "__OTR__levels/menu/main_menu_seg7_us.0AE40"; +ALIGNED8 static const Texture texture_menu_font_char_8[] = "__OTR__levels/menu/main_menu_seg7.0AE40"; // 0x0700AE80 -ALIGNED8 static const Texture texture_menu_font_char_9[] = "__OTR__levels/menu/main_menu_seg7_us.0AE80"; +ALIGNED8 static const Texture texture_menu_font_char_9[] = "__OTR__levels/menu/main_menu_seg7.0AE80"; // 0x0700AEC0 -ALIGNED8 static const Texture texture_menu_font_char_A[] = "__OTR__levels/menu/main_menu_seg7_us.0AEC0"; +ALIGNED8 static const Texture texture_menu_font_char_A[] = "__OTR__levels/menu/main_menu_seg7.0AEC0"; // 0x0700AF00 -ALIGNED8 static const Texture texture_menu_font_char_B[] = "__OTR__levels/menu/main_menu_seg7_us.0AF00"; +ALIGNED8 static const Texture texture_menu_font_char_B[] = "__OTR__levels/menu/main_menu_seg7.0AF00"; // 0x0700AF40 -ALIGNED8 static const Texture texture_menu_font_char_C[] = "__OTR__levels/menu/main_menu_seg7_us.0AF40"; +ALIGNED8 static const Texture texture_menu_font_char_C[] = "__OTR__levels/menu/main_menu_seg7.0AF40"; #ifdef VERSION_EU // 0x0700AF80 -ALIGNED8 static const Texture texture_menu_font_char_D[] = "__OTR__levels/menu/main_menu_seg7_eu.0AF80"; +ALIGNED8 static const Texture texture_menu_font_char_D[] = "__OTR__levels/menu/main_menu_seg7.0AF80"; #else // 0x0700AF80 -ALIGNED8 static const Texture texture_menu_font_char_D[] = "__OTR__levels/menu/main_menu_seg7_us.0AF80"; +ALIGNED8 static const Texture texture_menu_font_char_D[] = "__OTR__levels/menu/main_menu_seg7.0AF80"; #endif // 0x0700AFC0 -ALIGNED8 static const Texture texture_menu_font_char_E[] = "__OTR__levels/menu/main_menu_seg7_us.0AFC0"; +ALIGNED8 static const Texture texture_menu_font_char_E[] = "__OTR__levels/menu/main_menu_seg7.0AFC0"; // 0x0700B000 -ALIGNED8 static const Texture texture_menu_font_char_F[] = "__OTR__levels/menu/main_menu_seg7_us.0B000"; +ALIGNED8 static const Texture texture_menu_font_char_F[] = "__OTR__levels/menu/main_menu_seg7.0B000"; // 0x0700B040 -ALIGNED8 static const Texture texture_menu_font_char_G[] = "__OTR__levels/menu/main_menu_seg7_us.0B040"; +ALIGNED8 static const Texture texture_menu_font_char_G[] = "__OTR__levels/menu/main_menu_seg7.0B040"; // 0x0700B080 -ALIGNED8 static const Texture texture_menu_font_char_H[] = "__OTR__levels/menu/main_menu_seg7_us.0B080"; +ALIGNED8 static const Texture texture_menu_font_char_H[] = "__OTR__levels/menu/main_menu_seg7.0B080"; // 0x0700B0C0 -ALIGNED8 static const Texture texture_menu_font_char_I[] = "__OTR__levels/menu/main_menu_seg7_us.0B0C0"; +ALIGNED8 static const Texture texture_menu_font_char_I[] = "__OTR__levels/menu/main_menu_seg7.0B0C0"; // 0x0700B100 -ALIGNED8 static const Texture texture_menu_font_char_J[] = "__OTR__levels/menu/main_menu_seg7_us.0B100"; +ALIGNED8 static const Texture texture_menu_font_char_J[] = "__OTR__levels/menu/main_menu_seg7.0B100"; // 0x0700B140 -ALIGNED8 static const Texture texture_menu_font_char_K[] = "__OTR__levels/menu/main_menu_seg7_us.0B140"; +ALIGNED8 static const Texture texture_menu_font_char_K[] = "__OTR__levels/menu/main_menu_seg7.0B140"; // 0x0700B180 -ALIGNED8 static const Texture texture_menu_font_char_L[] = "__OTR__levels/menu/main_menu_seg7_us.0B180"; +ALIGNED8 static const Texture texture_menu_font_char_L[] = "__OTR__levels/menu/main_menu_seg7.0B180"; // 0x0700B1C0 -ALIGNED8 static const Texture texture_menu_font_char_M[] = "__OTR__levels/menu/main_menu_seg7_us.0B1C0"; +ALIGNED8 static const Texture texture_menu_font_char_M[] = "__OTR__levels/menu/main_menu_seg7.0B1C0"; // 0x0700B200 -ALIGNED8 static const Texture texture_menu_font_char_N[] = "__OTR__levels/menu/main_menu_seg7_us.0B200"; +ALIGNED8 static const Texture texture_menu_font_char_N[] = "__OTR__levels/menu/main_menu_seg7.0B200"; // 0x0700B240 -ALIGNED8 static const Texture texture_menu_font_char_O[] = "__OTR__levels/menu/main_menu_seg7_us.0B240"; +ALIGNED8 static const Texture texture_menu_font_char_O[] = "__OTR__levels/menu/main_menu_seg7.0B240"; // 0x0700B280 -ALIGNED8 static const Texture texture_menu_font_char_P[] = "__OTR__levels/menu/main_menu_seg7_us.0B280"; +ALIGNED8 static const Texture texture_menu_font_char_P[] = "__OTR__levels/menu/main_menu_seg7.0B280"; // 0x0700B2C0 -ALIGNED8 static const Texture texture_menu_font_char_Q[] = "__OTR__levels/menu/main_menu_seg7_us.0B2C0"; +ALIGNED8 static const Texture texture_menu_font_char_Q[] = "__OTR__levels/menu/main_menu_seg7.0B2C0"; // 0x0700B300 -ALIGNED8 static const Texture texture_menu_font_char_R[] = "__OTR__levels/menu/main_menu_seg7_us.0B300"; +ALIGNED8 static const Texture texture_menu_font_char_R[] = "__OTR__levels/menu/main_menu_seg7.0B300"; // 0x0700B340 -ALIGNED8 static const Texture texture_menu_font_char_S[] = "__OTR__levels/menu/main_menu_seg7_us.0B340"; +ALIGNED8 static const Texture texture_menu_font_char_S[] = "__OTR__levels/menu/main_menu_seg7.0B340"; // 0x0700B380 -ALIGNED8 static const Texture texture_menu_font_char_T[] = "__OTR__levels/menu/main_menu_seg7_us.0B380"; +ALIGNED8 static const Texture texture_menu_font_char_T[] = "__OTR__levels/menu/main_menu_seg7.0B380"; // 0x0700B3C0 -ALIGNED8 static const Texture texture_menu_font_char_U[] = "__OTR__levels/menu/main_menu_seg7_us.0B3C0"; +ALIGNED8 static const Texture texture_menu_font_char_U[] = "__OTR__levels/menu/main_menu_seg7.0B3C0"; // 0x0700B400 -ALIGNED8 static const Texture texture_menu_font_char_V[] = "__OTR__levels/menu/main_menu_seg7_us.0B400"; +ALIGNED8 static const Texture texture_menu_font_char_V[] = "__OTR__levels/menu/main_menu_seg7.0B400"; // 0x0700B440 -ALIGNED8 static const Texture texture_menu_font_char_W[] = "__OTR__levels/menu/main_menu_seg7_us.0B440"; +ALIGNED8 static const Texture texture_menu_font_char_W[] = "__OTR__levels/menu/main_menu_seg7.0B440"; // 0x0700B480 -ALIGNED8 static const Texture texture_menu_font_char_X[] = "__OTR__levels/menu/main_menu_seg7_us.0B480"; +ALIGNED8 static const Texture texture_menu_font_char_X[] = "__OTR__levels/menu/main_menu_seg7.0B480"; // 0x0700B4C0 -ALIGNED8 static const Texture texture_menu_font_char_Y[] = "__OTR__levels/menu/main_menu_seg7_us.0B4C0"; +ALIGNED8 static const Texture texture_menu_font_char_Y[] = "__OTR__levels/menu/main_menu_seg7.0B4C0"; // 0x0700B500 -ALIGNED8 static const Texture texture_menu_font_char_Z[] = "__OTR__levels/menu/main_menu_seg7_us.0B500"; +ALIGNED8 static const Texture texture_menu_font_char_Z[] = "__OTR__levels/menu/main_menu_seg7.0B500"; // 0x0700B540 -ALIGNED8 static const Texture texture_menu_font_char_coin[] = "__OTR__levels/menu/main_menu_seg7_us.0B540"; +ALIGNED8 static const Texture texture_menu_font_char_coin[] = "__OTR__levels/menu/main_menu_seg7.0B540"; // 0x0700B580 -ALIGNED8 static const Texture texture_menu_font_char_multiply[] = "__OTR__levels/menu/main_menu_seg7_us.0B580"; +ALIGNED8 static const Texture texture_menu_font_char_multiply[] = "__OTR__levels/menu/main_menu_seg7.0B580"; // 0x0700B5C0 -ALIGNED8 static const Texture texture_menu_font_char_star_filled[] = "__OTR__levels/menu/main_menu_seg7_us.0B5C0"; +ALIGNED8 static const Texture texture_menu_font_char_star_filled[] = "__OTR__levels/menu/main_menu_seg7.0B5C0"; // 0x0700B600 -ALIGNED8 static const Texture texture_menu_font_char_dash[] = "__OTR__levels/menu/main_menu_seg7_us.0B600"; +ALIGNED8 static const Texture texture_menu_font_char_dash[] = "__OTR__levels/menu/main_menu_seg7.0B600"; #ifdef VERSION_EU // 0x0700B640 -ALIGNED8 static const Texture texture_menu_font_char_comma[] = "__OTR__levels/menu/main_menu_seg7_eu.0B640"; +ALIGNED8 static const Texture texture_menu_font_char_comma[] = "__OTR__levels/menu/main_menu_seg7.0B640"; // 0x0700B680 -ALIGNED8 static const Texture texture_menu_font_char_apostrophe[] = "__OTR__levels/menu/main_menu_seg7_eu.0B680"; +ALIGNED8 static const Texture texture_menu_font_char_apostrophe[] = "__OTR__levels/menu/main_menu_seg7.0B680"; #else // 0x0700B640 -ALIGNED8 static const Texture texture_menu_font_char_comma[] = "__OTR__levels/menu/main_menu_seg7_us.0B640"; +ALIGNED8 static const Texture texture_menu_font_char_comma[] = "__OTR__levels/menu/main_menu_seg7.0B640"; // 0x0700B680 -ALIGNED8 static const Texture texture_menu_font_char_apostrophe[] = "__OTR__levels/menu/main_menu_seg7_us.0B680"; +ALIGNED8 static const Texture texture_menu_font_char_apostrophe[] = "__OTR__levels/menu/main_menu_seg7.0B680"; #endif // 0x0700B6C0 -ALIGNED8 static const Texture texture_menu_font_char_exclamation[] = "__OTR__levels/menu/main_menu_seg7_us.0B6C0"; +ALIGNED8 static const Texture texture_menu_font_char_exclamation[] = "__OTR__levels/menu/main_menu_seg7.0B6C0"; // 0x0700B700 -ALIGNED8 static const Texture texture_menu_font_char_question[] = "__OTR__levels/menu/main_menu_seg7_us.0B700"; +ALIGNED8 static const Texture texture_menu_font_char_question[] = "__OTR__levels/menu/main_menu_seg7.0B700"; // 0x0700B740 -ALIGNED8 static const Texture texture_menu_font_char_mface1[] = "__OTR__levels/menu/main_menu_seg7_us.0B740"; +ALIGNED8 static const Texture texture_menu_font_char_mface1[] = "__OTR__levels/menu/main_menu_seg7.0B740"; // 0x0700B780 -ALIGNED8 static const Texture texture_menu_font_char_mface2[] = "__OTR__levels/menu/main_menu_seg7_us.0B780"; +ALIGNED8 static const Texture texture_menu_font_char_mface2[] = "__OTR__levels/menu/main_menu_seg7.0B780"; // 0x0700B7C0 -ALIGNED8 static const Texture texture_menu_font_char_period[] = "__OTR__levels/menu/main_menu_seg7_us.0B7C0"; +ALIGNED8 static const Texture texture_menu_font_char_period[] = "__OTR__levels/menu/main_menu_seg7.0B7C0"; // 0x0700B800 -ALIGNED8 static const Texture texture_menu_font_char_ampersand[] = "__OTR__levels/menu/main_menu_seg7_us.0B800"; -#endif +ALIGNED8 static const Texture texture_menu_font_char_ampersand[] = "__OTR__levels/menu/main_menu_seg7.0B800"; #ifdef VERSION_EU // 0x0700B840 -ALIGNED8 static const Texture texture_menu_font_char_umlaut[] = "__OTR__levels/menu/main_menu_seg7_eu.0B840"; +ALIGNED8 static const Texture texture_menu_font_char_umlaut[] = "__OTR__levels/menu/main_menu_seg7.0B840"; // 0x0700B880 -ALIGNED8 static const Texture texture_menu_font_char_cedilla_mayus[] = "__OTR__levels/menu/main_menu_seg7_eu.0B880"; +ALIGNED8 static const Texture texture_menu_font_char_cedilla_mayus[] = "__OTR__levels/menu/main_menu_seg7.0B880"; // 0x0700B8C0 -ALIGNED8 static const Texture texture_menu_font_char_colon[] = "__OTR__levels/menu/main_menu_seg7_eu.0B8C0"; +ALIGNED8 static const Texture texture_menu_font_char_colon[] = "__OTR__levels/menu/main_menu_seg7.0B8C0"; #endif // Menu small font print table // 0x0700CD08 -const Texture *const menu_font_lut[] = { -#if defined(VERSION_JP) || defined(VERSION_SH) - texture_menu_font_char_jp_0, texture_menu_font_char_jp_1, texture_menu_font_char_jp_2, texture_menu_font_char_jp_3, - texture_menu_font_char_jp_4, texture_menu_font_char_jp_5, texture_menu_font_char_jp_6, texture_menu_font_char_jp_7, - texture_menu_font_char_jp_8, texture_menu_font_char_jp_9, texture_menu_font_char_jp_A, texture_menu_font_char_jp_B, - texture_menu_font_char_jp_C, texture_menu_font_char_jp_D, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - texture_menu_font_char_jp_hiragana_a, texture_menu_font_char_jp_hiragana_i, texture_menu_font_char_jp_hiragana_u, texture_menu_font_char_jp_hiragana_c, - texture_menu_font_char_jp_hiragana_o, texture_menu_font_char_jp_hiragana_ka, texture_menu_font_char_jp_hiragana_ki, texture_menu_font_char_jp_hiragana_ku, - texture_menu_font_char_jp_hiragana_ke, texture_menu_font_char_jp_hiragana_ko, texture_menu_font_char_jp_hiragana_sa, texture_menu_font_char_jp_hiragana_shi, - texture_menu_font_char_jp_hiragana_su, texture_menu_font_char_jp_hiragana_se, texture_menu_font_char_jp_hiragana_so, texture_menu_font_char_jp_hiragana_ta, - texture_menu_font_char_jp_hiragana_chi, texture_menu_font_char_jp_hiragana_tsu, texture_menu_font_char_jp_hiragana_te, texture_menu_font_char_jp_hiragana_to, - texture_menu_font_char_jp_hiragana_na, texture_menu_font_char_jp_hiragana_ni, texture_menu_font_char_jp_hiragana_nu, texture_menu_font_char_jp_hiragana_ne, - texture_menu_font_char_jp_hiragana_no, texture_menu_font_char_jp_hiragana_ha, texture_menu_font_char_jp_hiragana_hi, texture_menu_font_char_jp_hiragana_hu, - texture_menu_font_char_jp_hiragana_he, texture_menu_font_char_jp_hiragana_ho, texture_menu_font_char_jp_hiragana_ma, texture_menu_font_char_jp_hiragana_mi, - texture_menu_font_char_jp_hiragana_mu, texture_menu_font_char_jp_hiragana_me, texture_menu_font_char_jp_hiragana_mo, texture_menu_font_char_jp_hiragana_ya, - texture_menu_font_char_jp_hiragana_yu, texture_menu_font_char_jp_hiragana_yo, texture_menu_font_char_jp_hiragana_ra, texture_menu_font_char_jp_hiragana_ri, - texture_menu_font_char_jp_hiragana_ru, texture_menu_font_char_jp_hiragana_re, texture_menu_font_char_jp_hiragana_ro, texture_menu_font_char_jp_hiragana_wa, - texture_menu_font_char_jp_hiragana_wo, texture_menu_font_char_jp_hiragana_n, 0x0, 0x0, - texture_menu_font_char_jp_katakana_a, texture_menu_font_char_jp_katakana_i, texture_menu_font_char_jp_katakana_u, texture_menu_font_char_jp_katakana_e, - texture_menu_font_char_jp_katakana_o, texture_menu_font_char_jp_katakana_ka, texture_menu_font_char_jp_katakana_ki, texture_menu_font_char_jp_katakana_ku, - texture_menu_font_char_jp_katakana_ke, texture_menu_font_char_jp_katakana_ko, texture_menu_font_char_jp_katakana_sa, texture_menu_font_char_jp_katakana_shi, - texture_menu_font_char_jp_katakana_su, texture_menu_font_char_jp_katakana_se, texture_menu_font_char_jp_katakana_so, texture_menu_font_char_jp_katakana_ta, - texture_menu_font_char_jp_katakana_chi, texture_menu_font_char_jp_katakana_tsu, texture_menu_font_char_jp_katakana_te, texture_menu_font_char_jp_katakana_to, - texture_menu_font_char_jp_katakana_na, texture_menu_font_char_jp_katakana_ni, texture_menu_font_char_jp_katakana_nu, texture_menu_font_char_jp_katakana_ne, - texture_menu_font_char_jp_katakana_no, texture_menu_font_char_jp_katakana_ha, texture_menu_font_char_jp_katakana_hi, texture_menu_font_char_jp_katakana_hu, - texture_menu_font_char_jp_katakana_he, texture_menu_font_char_jp_katakana_ho, texture_menu_font_char_jp_katakana_ma, texture_menu_font_char_jp_katakana_mi, - texture_menu_font_char_jp_katakana_mu, texture_menu_font_char_jp_katakana_me, texture_menu_font_char_jp_katakana_mo, texture_menu_font_char_jp_katakana_ya, - texture_menu_font_char_jp_katakana_yu, texture_menu_font_char_jp_katakana_yo, texture_menu_font_char_jp_katakana_ra, texture_menu_font_char_jp_katakana_ri, - texture_menu_font_char_jp_katakana_ru, texture_menu_font_char_jp_katakana_re, texture_menu_font_char_jp_katakana_ro, texture_menu_font_char_jp_katakana_wa, - texture_menu_font_char_jp_katakana_wo, texture_menu_font_char_jp_katakana_n, 0x0, texture_menu_font_char_jp_long_vowel, - texture_menu_font_char_jp_hiragana_small_e, texture_menu_font_char_jp_hiragana_small_tsu, texture_menu_font_char_jp_hiragana_small_ka, texture_menu_font_char_jp_hiragana_small_yu, - texture_menu_font_char_jp_hiragana_small_yo, texture_menu_font_char_jp_hiragana_small_a, texture_menu_font_char_jp_hiragana_small_i, texture_menu_font_char_jp_hiragana_small_u, - texture_menu_font_char_jp_hiragana_small_o, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - texture_menu_font_char_jp_katakana_small_e, texture_menu_font_char_jp_katakana_small_tsu, texture_menu_font_char_jp_katakana_small_ka, texture_menu_font_char_jp_katakana_small_yu, - texture_menu_font_char_jp_katakana_small_yo, texture_menu_font_char_jp_katakana_small_a, texture_menu_font_char_jp_katakana_small_i, texture_menu_font_char_jp_katakana_small_u, - texture_menu_font_char_jp_katakana_small_o, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - texture_menu_font_char_jp_dakuten, texture_menu_font_char_jp_handakuten, texture_menu_font_char_jp_exclamation, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, texture_menu_font_char_jp_coin, texture_menu_font_char_jp_star_filled, texture_menu_font_char_jp_multiply, - 0x0, 0x0, 0x0, 0x0, -#else +const Texture *const menu_font_lut_us[] = { texture_menu_font_char_0, texture_menu_font_char_1, texture_menu_font_char_2, texture_menu_font_char_3, texture_menu_font_char_4, texture_menu_font_char_5, texture_menu_font_char_6, texture_menu_font_char_7, texture_menu_font_char_8, texture_menu_font_char_9, texture_menu_font_char_A, texture_menu_font_char_B, @@ -1239,7 +1166,73 @@ const Texture *const menu_font_lut[] = { texture_menu_font_char_question, 0x0, 0x0, 0x0, 0x0, texture_menu_font_char_coin, texture_menu_font_char_star_filled, texture_menu_font_char_multiply, 0x0, 0x0, 0x0, 0x0, -#endif +}; + +const Texture *const menu_font_lut_jp[] = { + texture_menu_font_char_jp_0, texture_menu_font_char_jp_1, texture_menu_font_char_jp_2, texture_menu_font_char_jp_3, + texture_menu_font_char_jp_4, texture_menu_font_char_jp_5, texture_menu_font_char_jp_6, texture_menu_font_char_jp_7, + texture_menu_font_char_jp_8, texture_menu_font_char_jp_9, texture_menu_font_char_jp_A, texture_menu_font_char_jp_B, + texture_menu_font_char_jp_C, texture_menu_font_char_jp_D, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + texture_menu_font_char_jp_hiragana_a, texture_menu_font_char_jp_hiragana_i, texture_menu_font_char_jp_hiragana_u, texture_menu_font_char_jp_hiragana_c, + texture_menu_font_char_jp_hiragana_o, texture_menu_font_char_jp_hiragana_ka, texture_menu_font_char_jp_hiragana_ki, texture_menu_font_char_jp_hiragana_ku, + texture_menu_font_char_jp_hiragana_ke, texture_menu_font_char_jp_hiragana_ko, texture_menu_font_char_jp_hiragana_sa, texture_menu_font_char_jp_hiragana_shi, + texture_menu_font_char_jp_hiragana_su, texture_menu_font_char_jp_hiragana_se, texture_menu_font_char_jp_hiragana_so, texture_menu_font_char_jp_hiragana_ta, + texture_menu_font_char_jp_hiragana_chi, texture_menu_font_char_jp_hiragana_tsu, texture_menu_font_char_jp_hiragana_te, texture_menu_font_char_jp_hiragana_to, + texture_menu_font_char_jp_hiragana_na, texture_menu_font_char_jp_hiragana_ni, texture_menu_font_char_jp_hiragana_nu, texture_menu_font_char_jp_hiragana_ne, + texture_menu_font_char_jp_hiragana_no, texture_menu_font_char_jp_hiragana_ha, texture_menu_font_char_jp_hiragana_hi, texture_menu_font_char_jp_hiragana_hu, + texture_menu_font_char_jp_hiragana_he, texture_menu_font_char_jp_hiragana_ho, texture_menu_font_char_jp_hiragana_ma, texture_menu_font_char_jp_hiragana_mi, + texture_menu_font_char_jp_hiragana_mu, texture_menu_font_char_jp_hiragana_me, texture_menu_font_char_jp_hiragana_mo, texture_menu_font_char_jp_hiragana_ya, + texture_menu_font_char_jp_hiragana_yu, texture_menu_font_char_jp_hiragana_yo, texture_menu_font_char_jp_hiragana_ra, texture_menu_font_char_jp_hiragana_ri, + texture_menu_font_char_jp_hiragana_ru, texture_menu_font_char_jp_hiragana_re, texture_menu_font_char_jp_hiragana_ro, texture_menu_font_char_jp_hiragana_wa, + texture_menu_font_char_jp_hiragana_wo, texture_menu_font_char_jp_hiragana_n, 0x0, 0x0, + texture_menu_font_char_jp_katakana_a, texture_menu_font_char_jp_katakana_i, texture_menu_font_char_jp_katakana_u, texture_menu_font_char_jp_katakana_e, + texture_menu_font_char_jp_katakana_o, texture_menu_font_char_jp_katakana_ka, texture_menu_font_char_jp_katakana_ki, texture_menu_font_char_jp_katakana_ku, + texture_menu_font_char_jp_katakana_ke, texture_menu_font_char_jp_katakana_ko, texture_menu_font_char_jp_katakana_sa, texture_menu_font_char_jp_katakana_shi, + texture_menu_font_char_jp_katakana_su, texture_menu_font_char_jp_katakana_se, texture_menu_font_char_jp_katakana_so, texture_menu_font_char_jp_katakana_ta, + texture_menu_font_char_jp_katakana_chi, texture_menu_font_char_jp_katakana_tsu, texture_menu_font_char_jp_katakana_te, texture_menu_font_char_jp_katakana_to, + texture_menu_font_char_jp_katakana_na, texture_menu_font_char_jp_katakana_ni, texture_menu_font_char_jp_katakana_nu, texture_menu_font_char_jp_katakana_ne, + texture_menu_font_char_jp_katakana_no, texture_menu_font_char_jp_katakana_ha, texture_menu_font_char_jp_katakana_hi, texture_menu_font_char_jp_katakana_hu, + texture_menu_font_char_jp_katakana_he, texture_menu_font_char_jp_katakana_ho, texture_menu_font_char_jp_katakana_ma, texture_menu_font_char_jp_katakana_mi, + texture_menu_font_char_jp_katakana_mu, texture_menu_font_char_jp_katakana_me, texture_menu_font_char_jp_katakana_mo, texture_menu_font_char_jp_katakana_ya, + texture_menu_font_char_jp_katakana_yu, texture_menu_font_char_jp_katakana_yo, texture_menu_font_char_jp_katakana_ra, texture_menu_font_char_jp_katakana_ri, + texture_menu_font_char_jp_katakana_ru, texture_menu_font_char_jp_katakana_re, texture_menu_font_char_jp_katakana_ro, texture_menu_font_char_jp_katakana_wa, + texture_menu_font_char_jp_katakana_wo, texture_menu_font_char_jp_katakana_n, 0x0, texture_menu_font_char_jp_long_vowel, + texture_menu_font_char_jp_hiragana_small_e, texture_menu_font_char_jp_hiragana_small_tsu, texture_menu_font_char_jp_hiragana_small_ka, texture_menu_font_char_jp_hiragana_small_yu, + texture_menu_font_char_jp_hiragana_small_yo, texture_menu_font_char_jp_hiragana_small_a, texture_menu_font_char_jp_hiragana_small_i, texture_menu_font_char_jp_hiragana_small_u, + texture_menu_font_char_jp_hiragana_small_o, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + texture_menu_font_char_jp_katakana_small_e, texture_menu_font_char_jp_katakana_small_tsu, texture_menu_font_char_jp_katakana_small_ka, texture_menu_font_char_jp_katakana_small_yu, + texture_menu_font_char_jp_katakana_small_yo, texture_menu_font_char_jp_katakana_small_a, texture_menu_font_char_jp_katakana_small_i, texture_menu_font_char_jp_katakana_small_u, + texture_menu_font_char_jp_katakana_small_o, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + texture_menu_font_char_jp_dakuten, texture_menu_font_char_jp_handakuten, texture_menu_font_char_jp_exclamation, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, texture_menu_font_char_jp_coin, texture_menu_font_char_jp_star_filled, texture_menu_font_char_jp_multiply, + 0x0, 0x0, 0x0, 0x0, }; // 0x0700D108 - 0x0700D160 @@ -1274,16 +1267,16 @@ UNUSED static const u64 menu_unused_1 = 0; #ifdef VERSION_EU // 0x0700BDA0 - 0x0700CDA0 -ALIGNED8 static const Texture texture_menu_course_upper[] = "__OTR__levels/menu/main_menu_seg7_eu.0BDA0"; +ALIGNED8 static const Texture texture_menu_course_upper[] = "__OTR__levels/menu/main_menu_seg7.0BDA0"; // 0x0700CDA0 - 0x0700DDA0 -ALIGNED8 static const Texture texture_menu_niveau_upper[] = "__OTR__levels/menu/main_menu_seg7_eu.0CDA0"; +ALIGNED8 static const Texture texture_menu_niveau_upper[] = "__OTR__levels/menu/main_menu_seg7.0CDA0"; // 0x0700DDA0 - 0x0700EDA0 -ALIGNED8 static const Texture texture_menu_kurs_upper[] = "__OTR__levels/menu/main_menu_seg7_eu.0DDA0"; +ALIGNED8 static const Texture texture_menu_kurs_upper[] = "__OTR__levels/menu/main_menu_seg7.0DDA0"; // 0x0700EDA0 - 0x0700FDA0 -ALIGNED8 static const Texture texture_menu_course_lower[] = "__OTR__levels/menu/main_menu_seg7_eu.0EDA0"; +ALIGNED8 static const Texture texture_menu_course_lower[] = "__OTR__levels/menu/main_menu_seg7.0EDA0"; #else diff --git a/levels/scripts.c b/levels/scripts.c index 2e2edeee..2775ec26 100644 --- a/levels/scripts.c +++ b/levels/scripts.c @@ -36,8 +36,8 @@ #include "level_table.h" -#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8) -#define DEFINE_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) + 3 +#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) +#define DEFINE_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) + 3 static const LevelScript script_exec_level_table[2 #include "levels/level_defines.h" ]; @@ -50,8 +50,8 @@ static const LevelScript goto_mario_head_regular[4]; static const LevelScript goto_mario_head_dizzy[4]; static const LevelScript script_L5[4]; -#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8) -#define DEFINE_LEVEL(_0, _1, _2, folder, _4, _5, _6, _7, _8, _9, _10) static const LevelScript script_exec_ ## folder [4 + 1]; +#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) +#define DEFINE_LEVEL(_0, _1, _2, folder, _4, _5, _6, _7, _8, _9, _10, _11) static const LevelScript script_exec_ ## folder [4 + 1]; #include "level_defines.h" @@ -148,9 +148,9 @@ static const LevelScript script_L5[] = { // Include the level jumptable. -#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8) +#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) -#define DEFINE_LEVEL(_0, levelenum, _2, folder, _4, _5, _6, _7, _8, _9, _10) JUMP_IF(OP_EQ, levelenum, script_exec_ ## folder), +#define DEFINE_LEVEL(_0, levelenum, _2, folder, _4, _5, _6, _7, _8, _9, _10, _11) JUMP_IF(OP_EQ, levelenum, script_exec_ ## folder), static const LevelScript script_exec_level_table[] = { GET_OR_SET(/*op*/ OP_GET, /*var*/ VAR_CURR_LEVEL_NUM), @@ -159,7 +159,7 @@ static const LevelScript script_exec_level_table[] = { }; #undef DEFINE_LEVEL -#define DEFINE_LEVEL(_0, _1, _2, folder, _4, _5, _6, _7, _8, _9, _10) \ +#define DEFINE_LEVEL(_0, _1, _2, folder, _4, _5, _6, _7, _8, _9, _10, _11) \ static const LevelScript script_exec_ ## folder [] = { \ EXECUTE(0x0E, _ ## folder ## SegmentRomStart, _ ## folder ## SegmentRomEnd, level_ ## folder ## _entry), \ RETURN(), \ diff --git a/libultraship b/libultraship index 69b7b616..e75054e3 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 69b7b61602b149112c2c398b2382c073a7aa72dd +Subproject commit e75054e386c9d8bc2ebb18c7ca303b8d287be907 diff --git a/sound/README.md b/sound/README.md deleted file mode 100644 index 93493955..00000000 --- a/sound/README.md +++ /dev/null @@ -1,47 +0,0 @@ -Sound in SM64 consists of three parts: samples, sound banks, and sequences. - -Samples represent raw sound data, given as AIFF files with a custom ADPCM-based -compression format that reduces file sizes by ~70% compared to uncompressed -AIFF (with 16-bit samples). The build system automatically converts -uncompressed AIFF files into this format. - -Samples are collected into banks, given by directories. The order in which each -bank's samples end up in the final binary is determined by their file names. -Thus, to keep the ROM OK, sample files should be prefixed by a number to -maintain sort order. (Bank directories are ordered by their usages in way -that automatically makes the ROM match.) - -Samples cannot be referred to directly from sequence files. Instead, there is -an indirect step in the form of sound banks. Each sound bank refers to a single -sample bank, and amends it with extra information in the form of a JSON file. -This JSON file contains a set of "instruments", which describe how note values -(pitches) map to samples, which pitch corrections to perform, and what ADSR -envelopes to use. The `instrument_list` key maps indices to instruments; these -indices are what sequence files can refer to. A special instrument `percussion` -is also supported, as an array with (usually) 64 different entries, covering -note values 0..63. It is referred to as instrument ID 0x7f. - -C-style comments are supported in the JSON. Similar to samples, the sound banks -come in alphabetical order in the ROM, so they should be prefixed to maintain -sort order. - -Sequence files are what actually controls the audio. The are in .m64 format, -which is similar to MIDI, but Turing complete. An .m64 file has a sequence -script that can spawn channels, which have channel scripts that can spawn -layers, which have layer scripts that can play notes. Each note is performed -using an instrument from a sound bank. A sequence file can use multiple banks; -`sequences.json` describes the mapping from sequences to sound banks. Channels -can switch between banks using a command. However, in practice most sequences -limit themselves to a single sound bank. The main exception is sequence 0, -which is responsible for sound effects. - -Like samples and sound banks, sequence files are included in the ROM in -alphabetical file name order. They can be located in either `sound/sequences/` -or `sound/sequences//`, and can optionally be given in disassembled -form -- see `include/seq_macros.inc` for more details on the format. - -The repo gitignores .m64 and .aiff files by default, unless they include -"custom" somewhere in the name (including in a directory name). Thus, for new -custom-made samples and sequences it is advisable to include that substring -in the file name (this also helps distinguish custom sounds from ones from -the game). `git add -f` also works for adding edited existing files to git. diff --git a/sound/sequences/00_sound_player.s b/sound/sequences/00_sound_player.s deleted file mode 100644 index 1d1e0173..00000000 --- a/sound/sequences/00_sound_player.s +++ /dev/null @@ -1,8197 +0,0 @@ -#include "seq_macros.inc" - -.section .rodata -.align 0 - -sequence_start: -seq_setmutebhv 0x60 -seq_setmutescale 0 -#ifdef VERSION_SH - seq_setvol 100 -#else - seq_setvol 127 -#endif -seq_settempo 120 -seq_initchannels 0x3ff -seq_startchannel 0, .channel0 -seq_startchannel 1, .channel1 -seq_startchannel 2, .channel2 -seq_startchannel 3, .channel38 -seq_startchannel 4, .channel4 -seq_startchannel 5, .channel59 -seq_startchannel 6, .channel6 -seq_startchannel 7, .channel7 -seq_startchannel 8, .channel38 -seq_startchannel 9, .channel59 -.seq_loop: -seq_delay 20000 -seq_jump .seq_loop - -.channel0: -chan_largenoteson -chan_setinstr 0 -chan_setpanmix 127 -chan_setnotepriority 14 -chan_setval 0 -chan_iowriteval 5 -chan_stereoheadseteffects 1 -chan_setdyntable .channel0_table -chan_jump .main_loop_023589 - -.channel2: -chan_largenoteson -chan_setinstr 0 -chan_setpanmix 127 -chan_setnotepriority 14 -chan_setval 0 -chan_iowriteval 5 -chan_stereoheadseteffects 1 -chan_setdyntable .channel2_table -chan_jump .main_loop_023589 - -.channel38: -chan_largenoteson -chan_setinstr 0 -chan_setpanmix 127 -chan_setnotepriority 14 -chan_setval 0 -chan_iowriteval 5 -chan_stereoheadseteffects 1 -chan_setdyntable .channel38_table -chan_jump .main_loop_023589 - -.channel59: -chan_largenoteson -chan_setinstr 0 -chan_setpanmix 127 -chan_setnotepriority 14 -chan_setval 0 -chan_iowriteval 5 -chan_stereoheadseteffects 1 -chan_setdyntable .channel59_table -chan_jump .main_loop_023589 - -// Main loop for standard, non-continuous sound effects -.main_loop_023589: -chan_delay1 -chan_ioreadval 0 -chan_bltz .main_loop_023589 -.start_playing_023589: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 -chan_setval 0 -chan_iowriteval 5 -chan_ioreadval 4 -chan_dyncall - -// keep looping until layer 0 finishes or we are told to stop or to play something else -.poll_023589: -chan_delay1 -chan_ioreadval 0 -chan_bltz .skip_023589 // if we have a signal: - chan_beqz .force_stop_023589 // told to stop - chan_jump .start_playing_023589 // told to play something else -.skip_023589: -chan_testlayerfinished 0 -chan_beqz .poll_023589 // if layer 0 hasn't finished, keep polling -chan_jump .main_loop_023589 // otherwise go back to the main loop -.force_stop_023589: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 -chan_jump .main_loop_023589 - -.channel1: -chan_largenoteson -chan_setinstr 0 -chan_setpanmix 127 -chan_setnotepriority 14 -chan_setval 0 -chan_iowriteval 5 -chan_setmutebhv 0x20 -chan_stereoheadseteffects 1 -chan_setdyntable .channel1_table -chan_jump .main_loop_146 - -.channel4: -chan_largenoteson -chan_setinstr 0 -chan_setpanmix 127 -chan_setnotepriority 14 -chan_setval 0 -chan_iowriteval 5 -chan_setmutebhv 0x20 -chan_stereoheadseteffects 1 -chan_setdyntable .channel4_table -chan_jump .main_loop_146 - -.channel6: -chan_largenoteson -chan_setinstr 0 -chan_setpanmix 127 -chan_setnotepriority 14 -chan_setval 0 -chan_iowriteval 5 -chan_setmutebhv 0x20 -chan_stereoheadseteffects 1 -chan_setdyntable .channel6_table -chan_jump .main_loop_146 - -// Main loop for moving, env and air sound effects, which play continuously -.main_loop_146: -chan_delay1 -chan_ioreadval 0 -chan_bltz .main_loop_146 -.start_playing_146: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 -chan_setvolscale 127 -chan_setval 0 -chan_iowriteval 5 -chan_ioreadval 4 -chan_dyncall - -// keep looping until we are told to stop or to play something else -.poll_146: -chan_delay1 -chan_ioreadval 0 -chan_bltz .poll_146 -chan_beqz .force_stop_146 -chan_jump .start_playing_146 -.force_stop_146: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 -chan_jump .main_loop_146 - -.channel7: -chan_largenoteson -chan_setinstr 0 -chan_setnotepriority 14 -chan_setval 0 -chan_iowriteval 5 -chan_stereoheadseteffects 1 -chan_setdyntable .channel7_table - -// Loop for menu sound effects -.main_loop_7: -chan_delay1 -chan_ioreadval 0 -chan_bltz .main_loop_7 -.start_playing_7: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 -chan_setval 0 -chan_iowriteval 5 -chan_setreverb 0 -chan_setpan 64 -chan_setpanmix 127 -chan_ioreadval 4 -chan_dyncall - -// keep looping until layer 0 finishes or we are told to stop or to play something else -.poll_7: -chan_delay1 -chan_ioreadval 0 -chan_bltz .skip_7 // if we have a signal: - chan_beqz .force_stop_7 // told to stop - chan_unreservenotes - chan_jump .start_playing_7 // told to play something else -.skip_7: -chan_testlayerfinished 0 -chan_beqz .poll_7 // if layer 0 hasn't finished, keep polling -chan_unreservenotes -chan_jump .main_loop_7 // otherwise go back to the main loop -.force_stop_7: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 -chan_unreservenotes -chan_jump .main_loop_7 - -// Delay for a number of ticks (1-255) in an interruptible manner. -.delay: -chan_writeseq_nextinstr 0, 1 -chan_loop 20 -chan_delay1 -chan_ioreadval 0 -chan_iowriteval 1 -chan_bgez .delay_interrupt -chan_loopend -chan_end - -.delay_interrupt: -chan_setpanmix 127 -chan_setvolscale 127 -chan_setvibratoextent 0 -chan_ioreadval 1 // IO slots 0-3 are reset to -1 when read; restore the value -chan_iowriteval 0 -chan_break // break out of the loop -chan_break // force the caller to return immediately -chan_end - -// Set reverb in way that takes area echo level and volume into account. This -// is done by writing to IO slot 5 and letting get_sound_reverb in external.c -// do the necessary math. -.set_reverb: -chan_writeseq_nextinstr 0, 1 -chan_setreverb 10 -chan_iowriteval 5 -chan_end - -.channel0_table: -sound_ref .sound_action_jump_default -sound_ref .sound_action_jump_grass -sound_ref .sound_action_jump_water -sound_ref .sound_action_jump_stone -sound_ref .sound_action_jump_spooky -sound_ref .sound_action_jump_snow -sound_ref .sound_action_jump_ice -sound_ref .sound_action_jump_sand -sound_ref .sound_action_landing_default -sound_ref .sound_action_landing_grass -sound_ref .sound_action_landing_water -sound_ref .sound_action_landing_stone -sound_ref .sound_action_landing_spooky -sound_ref .sound_action_landing_snow -sound_ref .sound_action_landing_ice -sound_ref .sound_action_landing_sand -sound_ref .sound_action_step_default -sound_ref .sound_action_step_grass -sound_ref .sound_action_step_water -sound_ref .sound_action_step_stone -sound_ref .sound_action_step_spooky -sound_ref .sound_action_step_snow -sound_ref .sound_action_step_ice -sound_ref .sound_action_step_sand -sound_ref .sound_action_body_hit_ground_default -sound_ref .sound_action_body_hit_ground_grass -sound_ref .sound_action_body_hit_ground_water -sound_ref .sound_action_body_hit_ground_stone -sound_ref .sound_action_body_hit_ground_spooky -sound_ref .sound_action_body_hit_ground_snow -sound_ref .sound_action_body_hit_ground_ice -sound_ref .sound_action_body_hit_ground_sand -sound_ref .sound_action_step_tiptoe_default -sound_ref .sound_action_step_tiptoe_grass -sound_ref .sound_action_step_tiptoe_water -sound_ref .sound_action_step_tiptoe_stone -sound_ref .sound_action_step_tiptoe_spooky -sound_ref .sound_action_step_tiptoe_snow -sound_ref .sound_action_step_tiptoe_ice -sound_ref .sound_action_step_tiptoe_sand -sound_ref .sound_action_metal_jump -sound_ref .sound_action_metal_landing -sound_ref .sound_action_metal_step -sound_ref .sound_action_metal_heavy_landing -sound_ref .sound_action_clap_hands_cold -sound_ref .sound_action_hanging_step -sound_ref .sound_action_quicksand_step -sound_ref .sound_action_metal_step_tiptoe -sound_ref .chan_4E5 -sound_ref .chan_4F1 -sound_ref .chan_4FD -sound_ref .sound_action_swim -sound_ref .chan_522 -sound_ref .sound_action_throw -sound_ref .sound_action_key_swish -sound_ref .sound_action_spin -sound_ref .sound_action_spin -sound_ref .sound_action_spin -sound_ref .sound_action_climb_up_tree -sound_ref .sound_action_climb_down_tree -sound_ref .chan_582 -sound_ref .chan_591 -sound_ref .chan_5A3 -sound_ref .sound_action_pat_back -sound_ref .sound_action_brush_hair -sound_ref .sound_action_climb_up_pole -sound_ref .sound_action_metal_bonk -sound_ref .sound_action_unstuck_from_ground -sound_ref .sound_action_hit -sound_ref .sound_action_bonk -sound_ref .sound_action_enter_bbh -sound_ref .sound_action_swim_fast -sound_ref .sound_action_stuck_in_ground_default -sound_ref .sound_action_stuck_in_ground_default -sound_ref .sound_action_stuck_in_ground_default -sound_ref .sound_action_stuck_in_ground_default -sound_ref .sound_action_stuck_in_ground_default -sound_ref .sound_action_stuck_in_ground_snow -sound_ref .sound_action_stuck_in_ground_sand -sound_ref .sound_action_stuck_in_ground_sand -sound_ref .sound_action_metal_jump_water -sound_ref .sound_action_metal_land_water -sound_ref .sound_action_metal_step_water -sound_ref .chan_731 -sound_ref .chan_743 -sound_ref .chan_756 -sound_ref .sound_action_flying_fast -sound_ref .sound_action_teleport -sound_ref .chan_7A5 -sound_ref .sound_action_bounce_off_object -sound_ref .chan_7ED -sound_ref .sound_action_read_sign -sound_ref .chan_810 -#ifdef VERSION_JP - sound_ref .sound_action_jump_default - sound_ref .sound_action_jump_default - sound_ref .sound_action_jump_default -#else - sound_ref .chan_828 - sound_ref .sound_action_intro_unk45e - sound_ref .sound_action_intro_unk45f -#endif -sound_ref .sound_action_heavy_landing_default -sound_ref .sound_action_heavy_landing_grass -sound_ref .sound_action_heavy_landing_water -sound_ref .sound_action_heavy_landing_stone -sound_ref .sound_action_heavy_landing_spooky -sound_ref .sound_action_heavy_landing_snow -sound_ref .sound_action_heavy_landing_ice -sound_ref .sound_action_heavy_landing_sand -sound_ref .sound_action_jump_default -sound_ref .sound_action_jump_default -sound_ref .sound_action_jump_default -sound_ref .sound_action_jump_default -sound_ref .sound_action_jump_default -sound_ref .sound_action_jump_default -sound_ref .sound_action_jump_default -sound_ref .sound_action_jump_default - -.sound_action_jump_default: -chan_setbank 1 -chan_setinstr 0 -chan_setlayer 0, .layer_234 -chan_end - -.layer_234: -layer_note1 41, 0xc, 117 -layer_note1 46, 0x18, 117 -layer_end - -.sound_action_jump_grass: -chan_setbank 1 -chan_setinstr 1 -chan_setlayer 0, .layer_243 -chan_end - -.layer_243: -layer_note1 41, 0xc, 120 -layer_note1 50, 0x18, 120 -layer_end - -.sound_action_jump_water: -chan_setbank 2 -chan_setinstr 1 -chan_setlayer 0, .layer_252 -chan_end - -.layer_252: -layer_note1 41, 0x6, 80 -layer_note1 50, 0x18, 80 -layer_end - -.sound_action_jump_stone: -chan_setbank 1 -chan_setinstr 3 -chan_setlayer 0, .layer_261 -chan_end - -.layer_261: -layer_note1 41, 0xc, 127 -layer_note1 50, 0x18, 127 -layer_end - -.sound_action_jump_spooky: -chan_setbank 1 -chan_setinstr 4 -chan_setlayer 0, .layer_270 -chan_end - -.layer_270: -layer_note1 41, 0xc, 90 -layer_note1 50, 0x18, 90 -layer_end - -.sound_action_jump_snow: -chan_setbank 1 -chan_setinstr 5 -chan_setlayer 0, .layer_27F -chan_end - -.layer_27F: -layer_note1 41, 0xc, 80 -layer_note1 50, 0x18, 80 -layer_end - -.sound_action_jump_ice: -chan_setbank 1 -chan_setinstr 6 -chan_setlayer 0, .layer_28E -chan_end - -.layer_28E: -layer_note1 29, 0xc, 127 -layer_note1 38, 0x18, 127 -layer_end - -.sound_action_jump_sand: -chan_setbank 1 -chan_setinstr 8 -chan_setlayer 0, .layer_29D -chan_end - -.layer_29D: -layer_note0 34, 0xc, 100, 127 -layer_note0 43, 0x24, 100, 127 -layer_end - -.sound_action_landing_default: -chan_setbank 1 -chan_setinstr 0 -chan_setlayer 0, .layer_2AE -chan_end - -.layer_2AE: -layer_note1 46, 0xc, 117 -layer_note1 41, 0x18, 117 -layer_end - -.sound_action_landing_grass: -chan_setbank 1 -chan_setinstr 1 -chan_setlayer 0, .layer_2BD -chan_end - -.layer_2BD: -layer_note1 50, 0xc, 120 -layer_note1 41, 0x18, 120 -layer_end - -.sound_action_landing_water: -chan_setbank 2 -chan_setinstr 1 -chan_setlayer 0, .layer_2CC -chan_end - -.layer_2CC: -layer_note1 50, 0xc, 80 -layer_note1 41, 0x18, 80 -layer_end - -.sound_action_landing_stone: -chan_setbank 1 -chan_setinstr 3 -chan_setlayer 0, .layer_2DB -chan_end - -.layer_2DB: -layer_note1 50, 0xc, 127 -layer_note1 41, 0x18, 127 -layer_end - -.sound_action_landing_spooky: -chan_setbank 1 -chan_setinstr 4 -chan_setlayer 0, .layer_2EA -chan_end - -.layer_2EA: -layer_note1 50, 0xc, 90 -layer_note1 41, 0x18, 90 -layer_end - -.sound_action_landing_snow: -chan_setbank 1 -chan_setinstr 5 -chan_setlayer 0, .layer_2F9 -chan_end - -.layer_2F9: -layer_note1 50, 0xc, 80 -layer_note1 41, 0x18, 80 -layer_end - -.sound_action_landing_ice: -chan_setbank 1 -chan_setinstr 6 -chan_setlayer 0, .layer_308 -chan_end - -.layer_308: -layer_note1 38, 0xc, 127 -layer_note1 29, 0x18, 127 -layer_end - -.sound_action_landing_sand: -chan_setbank 1 -chan_setinstr 8 -chan_setlayer 0, .layer_317 -chan_end - -.layer_317: -layer_note0 43, 0xc, 100, 127 -layer_note0 34, 0x24, 100, 127 -layer_end - -.sound_action_step_default: -chan_setbank 1 -chan_setinstr 0 -chan_setlayer 0, .layer_328 -chan_end - -.layer_328: -layer_note1 39, 0x18, 85 -layer_end - -.sound_action_step_grass: -chan_setbank 1 -chan_setinstr 1 -chan_setlayer 0, .layer_334 -chan_end - -.layer_334: -layer_note1 39, 0x18, 100 -layer_end - -.sound_action_step_water: -chan_setbank 2 -chan_setinstr 1 -chan_setlayer 0, .layer_340 -chan_end - -.layer_340: -layer_note1 43, 0x18, 63 -layer_end - -.sound_action_step_stone: -chan_setbank 1 -chan_setinstr 3 -chan_setlayer 0, .layer_34C -chan_end - -.layer_34C: -layer_note1 39, 0x18, 77 -layer_end - -.sound_action_step_spooky: -chan_setbank 1 -chan_setinstr 4 -chan_setlayer 0, .layer_358 -chan_end - -.layer_358: -layer_note1 39, 0x18, 70 -layer_end - -.sound_action_step_snow: -chan_setbank 1 -chan_setinstr 5 -chan_setlayer 0, .layer_364 -chan_end - -.layer_364: -layer_note1 39, 0x18, 68 -layer_end - -.sound_action_step_ice: -chan_setbank 1 -chan_setinstr 6 -chan_setlayer 0, .layer_370 -chan_end - -.layer_370: -layer_note1 39, 0x18, 100 -layer_end - -.sound_action_step_sand: -chan_setbank 1 -chan_setinstr 8 -chan_setlayer 0, .layer_37C -chan_end - -.layer_37C: -layer_note1 39, 0x18, 70 -layer_end - -.sound_action_body_hit_ground_default: -chan_setbank 1 -chan_setinstr 0 -chan_setlayer 0, .layer_388 -chan_end - -.layer_388: -layer_note1 17, 0xc, 117 -layer_note1 19, 0x18, 117 -layer_end - -.sound_action_body_hit_ground_grass: -chan_setbank 1 -chan_setinstr 1 -chan_setlayer 0, .layer_397 -chan_end - -.layer_397: -layer_note1 29, 0xc, 120 -layer_note1 31, 0x18, 120 -layer_end - -.sound_action_body_hit_ground_water: -chan_setbank 2 -chan_setinstr 1 -chan_setlayer 0, .layer_3A6 -chan_end - -.layer_3A6: -layer_note1 34, 0xc, 80 -layer_note1 39, 0x18, 80 -layer_end - -.sound_action_body_hit_ground_stone: -chan_setbank 1 -chan_setinstr 3 -chan_setlayer 0, .layer_3B5 -chan_end - -.layer_3B5: -layer_note1 29, 0xc, 115 -layer_note1 31, 0xc, 115 -layer_end - -.sound_action_body_hit_ground_spooky: -chan_setbank 1 -chan_setinstr 4 -chan_setlayer 0, .layer_3C4 -chan_end - -.layer_3C4: -layer_note1 29, 0xc, 90 -layer_note1 31, 0x18, 90 -layer_end - -.sound_action_body_hit_ground_snow: -chan_setbank 1 -chan_setinstr 5 -chan_setlayer 0, .layer_3D3 -chan_end - -.layer_3D3: -layer_note1 34, 0xc, 80 -layer_note1 36, 0x18, 80 -layer_end - -.sound_action_body_hit_ground_ice: -chan_setbank 1 -chan_setinstr 6 -chan_setlayer 0, .layer_3E2 -chan_end - -.layer_3E2: -layer_note1 29, 0xc, 127 -layer_note1 31, 0x18, 127 -layer_end - -.sound_action_body_hit_ground_sand: -chan_setbank 1 -chan_setinstr 8 -chan_setlayer 0, .layer_3F1 -chan_end - -.layer_3F1: -layer_note0 31, 0xc, 100, 127 -layer_note0 32, 0x24, 100, 127 -layer_end - -.sound_action_step_tiptoe_default: -chan_setbank 1 -chan_setinstr 0 -chan_setlayer 0, .layer_402 -chan_end - -.layer_402: -layer_note1 37, 0x18, 63 -layer_end - -.sound_action_step_tiptoe_grass: -chan_setbank 1 -chan_setinstr 1 -chan_setlayer 0, .layer_40E -chan_end - -.layer_40E: -layer_note1 37, 0x18, 57 -layer_end - -.sound_action_step_tiptoe_water: -chan_setbank 2 -chan_setinstr 1 -chan_setlayer 0, .layer_41A -chan_end - -.layer_41A: -layer_note1 39, 0x18, 39 -layer_end - -.sound_action_step_tiptoe_stone: -chan_setbank 1 -chan_setinstr 3 -chan_setlayer 0, .layer_426 -chan_end - -.layer_426: -layer_note1 37, 0x18, 49 -layer_end - -.sound_action_step_tiptoe_spooky: -chan_setbank 1 -chan_setinstr 4 -chan_setlayer 0, .layer_432 -chan_end - -.layer_432: -layer_note1 37, 0x18, 39 -layer_end - -.sound_action_step_tiptoe_snow: -chan_setbank 1 -chan_setinstr 5 -chan_setlayer 0, .layer_43E -chan_end - -.layer_43E: -layer_note1 37, 0x18, 39 -layer_end - -.sound_action_step_tiptoe_ice: -chan_setbank 1 -chan_setinstr 6 -chan_setlayer 0, .layer_44A -chan_end - -.layer_44A: -layer_note1 37, 0x18, 70 -layer_end - -.sound_action_step_tiptoe_sand: -chan_setbank 1 -chan_setinstr 8 -chan_setlayer 0, .layer_456 -chan_end - -.layer_456: -layer_note1 35, 0x18, 49 -layer_end - -.sound_action_metal_jump: -chan_setbank 1 -chan_setinstr 7 -chan_setlayer 0, .layer_462 -chan_end - -.layer_462: -layer_note1 29, 0xc, 100 -layer_note1 38, 0x12, 100 -layer_end - -.sound_action_metal_landing: -chan_setbank 1 -chan_setinstr 7 -chan_setlayer 0, .layer_471 -chan_end - -.layer_471: -layer_note1 38, 0xc, 100 -layer_note1 29, 0x18, 100 -layer_end - -.sound_action_metal_step: -chan_setbank 1 -chan_setinstr 7 -chan_setlayer 0, .layer_480 -chan_end - -.layer_480: -layer_portamento 0x85, 27, 255 -layer_note1 31, 0x10, 100 -layer_end - -.sound_action_metal_heavy_landing: -chan_setbank 1 -chan_setinstr 7 -chan_setlayer 0, .layer_490 -chan_end - -.layer_490: -layer_note1 20, 0xc, 100 -layer_note1 24, 0x18, 100 -layer_end - -.sound_action_clap_hands_cold: -chan_setbank 3 -chan_setinstr 6 -chan_setenvelope .envelope_3304 -chan_setlayer 0, .layer_4A2 -chan_end - -.layer_4A2: -layer_note1 62, 0x6, 90 -layer_note1 58, 0x7, 90 -layer_end - -.sound_action_hanging_step: -chan_setbank 0 -chan_setinstr 2 -chan_setlayer 0, .layer_4BD -chan_setval 1 -chan_call .delay -chan_setbank 3 -chan_setinstr 1 -chan_setenvelope .envelope_32D4 -chan_end - -.layer_4BD: -layer_note1 62, 0x4, 127 -layer_note0 56, 0x3, 127, 80 -layer_end - -.sound_action_quicksand_step: -chan_setbank 1 -chan_setinstr 8 -chan_setlayer 0, .layer_4CD -chan_end - -.layer_4CD: -layer_portamento 0x1, 29, 0x12 -layer_note1 24, 0x12, 115 -layer_end - -.sound_action_metal_step_tiptoe: -chan_setbank 1 -chan_setinstr 7 -chan_setlayer 0, .layer_4DD -chan_end - -.layer_4DD: -layer_portamento 0x85, 25, 255 -layer_note1 29, 0x10, 70 -layer_end - -.chan_4E5: -chan_setbank 2 -chan_setinstr 0 -chan_setlayer 0, .layer_4ED -chan_end - -.layer_4ED: -layer_note1 39, 0x7f, 100 -layer_end - -.chan_4F1: -chan_setbank 2 -chan_setinstr 1 -chan_setlayer 0, .layer_4F9 -chan_end - -.layer_4F9: -layer_note1 36, 0x64, 90 -layer_end - -.chan_4FD: -chan_setbank 2 -chan_setlayer 0, .layer_503 -chan_end - -.layer_503: -layer_setinstr 2 -layer_note1 36, 0xa, 80 -layer_setinstr 0 -layer_portamento 0x81, 36, 255 -layer_note1 50, 0x32, 80 -layer_end - -.sound_action_swim: -chan_setbank 2 -chan_setinstr 2 -chan_setlayer 0, .layer_51A -chan_end - -.layer_51A: -layer_portamento 0x81, 35, 255 -layer_note1 30, 0x3c, 110 -layer_end - -.chan_522: -chan_setbank 2 -chan_setinstr 2 -chan_setlayer 0, .layer_52A -chan_end - -.layer_52A: -layer_note1 39, 0x7f, 115 -layer_end - -.sound_action_throw: -chan_setbank 0 -chan_setinstr 0 -chan_setlayer 0, .layer_538 -chan_end - -.layer_536: -layer_transpose 1 - -.layer_538: -layer_portamento 0x81, 46, 255 -layer_note1 31, 0xf, 100 -layer_end - -.sound_action_key_swish: -chan_setbank 0 -chan_setinstr 0 -chan_setlayer 0, .layer_548 -chan_end - -.layer_548: -layer_note1 39, 0x12, 100 -layer_end - -.sound_action_spin: -chan_setbank 0 -chan_setinstr 0 -chan_setdecayrelease 30 -chan_setlayer 0, .layer_556 -chan_end - -.layer_556: -layer_portamento 0x81, 34, 255 -layer_note1 41, 0xc, 127 -layer_end - -.sound_action_climb_up_tree: -chan_setbank 0 -chan_setinstr 1 -chan_setlayer 0, .layer_566 -chan_end - -.layer_566: -layer_note1 37, 0xa, 105 -layer_portamento 0x81, 42, 255 -layer_note1 37, 0x1e, 105 -layer_end - -.sound_action_climb_down_tree: // unused -chan_setbank 0 -chan_setinstr 1 -chan_setlayer 0, .layer_579 -chan_end - -.layer_579: -layer_portamento 0x81, 44, 255 -layer_note1 40, 0xb4, 100 -layer_end - -.chan_582: // unused -chan_setbank 0 -chan_setinstr 2 -chan_setlayer 0, .layer_58A -chan_end - -.layer_58A: -layer_note1 39, 0x4, 127 -layer_note1 41, 0x12, 127 -layer_end - -.chan_591: -chan_setbank 1 -chan_setinstr 1 -chan_setenvelope .envelope_32C4 -chan_setlayer 0, .layer_59C -chan_end - -.layer_59C: -layer_note1 38, 0x6, 127 -layer_note1 41, 0x6, 127 -layer_end - -.chan_5A3: -chan_setbank 1 -chan_setinstr 1 -chan_setenvelope .envelope_32C4 -chan_setlayer 0, .layer_5AE -chan_end - -.layer_5AE: -layer_note1 41, 0x6, 127 -layer_note1 38, 0x6, 127 -layer_end - -.sound_action_pat_back: -chan_setbank 0 -chan_setinstr 2 -chan_setlayer 0, .layer_5BD -chan_end - -.layer_5BD: -layer_note1 32, 0xa, 127 -layer_end - -.sound_action_brush_hair: -chan_setbank 0 -chan_setinstr 1 -chan_setenvelope .envelope_32C4 -chan_setlayer 0, .layer_5CC -chan_end - -.layer_5CC: -layer_note1 39, 0x8, 90 -layer_note1 41, 0x8, 90 -layer_end - -.sound_action_climb_up_pole: -chan_setbank 3 -chan_setinstr 1 -chan_setenvelope .envelope_32E4 -chan_setlayer 0, .layer_5DE -chan_end - -.layer_5DE: -layer_portamento 0x85, 53, 255 -layer_note1 55, 0xc, 127 -layer_note1 53, 0x18, 127 -layer_end - -.sound_action_metal_bonk: -chan_setbank 1 -chan_setinstr 7 -chan_setlayer 0, .layer_5F1 -chan_end - -.layer_5F1: -layer_note1 39, 0x7, 100 -layer_note1 20, 0x18, 115 -layer_end - -.sound_action_unstuck_from_ground: -chan_setbank 0 -chan_setinstr 4 -chan_setlayer 0, .layer_600 -chan_end - -.layer_600: -layer_note1 37, 0x48, 127 -layer_end - -.sound_action_hit: -chan_setbank 7 -chan_setinstr 3 -chan_setlayer 0, .layer_618 -chan_setval 1 -chan_call .delay -chan_setbank 6 -chan_setinstr 10 -chan_setenvelope .envelope_3314 -chan_end - -.layer_618: -layer_portamento 0x81, 27, 255 -layer_note1 46, 0xb, 127 -.layer_61F: -layer_somethingon -layer_portamento 0x85, 32, 255 -layer_note1 44, 0x5, 100 -layer_call .layer_fn_64A -layer_transpose 1 -layer_call .layer_fn_64A -layer_transpose 3 -layer_call .layer_fn_64A -layer_transpose 4 -layer_call .layer_fn_64A -layer_transpose 6 -layer_call .layer_fn_64A -layer_transpose 7 -layer_call .layer_fn_64A -layer_transpose 9 -layer_call .layer_fn_64A -layer_transpose 10 - -.layer_fn_64A: -layer_note1 20, 0x5, 115 -layer_note1 32, 0x5, 115 -layer_end - -.sound_action_bonk: -chan_setbank 7 -chan_setinstr 3 -chan_setlayer 0, .layer_659 -chan_end - -.layer_659: -layer_portamento 0x82, 19, 255 -layer_note1 34, 0x5, 110 -layer_note1 39, 0x2, 110 -layer_end - -.sound_action_enter_bbh: -chan_setbank 3 -chan_setinstr 3 -chan_setval 50 -chan_call .set_reverb -chan_setenvelope .envelope_3324 -chan_setlayer 0, .layer_68F -chan_delay 1 -chan_setlayer 1, .layer_6A1 -chan_setbank 9 -chan_setinstr 1 -chan_setenvelope .envelope_32D4 -chan_setdecayrelease 20 -chan_delay 1 -chan_setlayer 2, .layer_699 -chan_setbank 4 -chan_setinstr 14 -chan_setdecayrelease 12 -chan_setvibratoextent 10 -chan_end - -.layer_68F: -layer_transpose 36 -layer_portamento 0x81, 62, 255 -layer_note1 38, 0x7f, 127 -layer_end - -.layer_699: -layer_portamento 0x81, 39, 255 -layer_note1 15, 0x7f, 127 -layer_end - -.layer_6A1: -layer_portamento 0x81, 62, 255 -layer_note1 38, 0x7f, 100 -layer_end - -.sound_action_swim_fast: -chan_setbank 2 -chan_setinstr 2 -chan_setval 20 -chan_call .set_reverb -chan_setlayer 0, .layer_6C1 -chan_setlayer 1, .layer_6B9 -chan_end - -.layer_6B9: -layer_portamento 0x81, 23, 255 -layer_note1 59, 0x30, 120 -layer_end - -.layer_6C1: -layer_portamento 0x81, 35, 255 -layer_note1 42, 0x3c, 110 -layer_end - -.sound_action_stuck_in_ground_default: -chan_setbank 1 -chan_setinstr 0 -chan_setlayer 0, .layer_6D1 -chan_end - -.layer_6D1: -layer_note1 17, 0x6, 127 -layer_portamento 0x81, 31, 255 -layer_note1 7, 0xc, 127 -layer_end - -.sound_action_stuck_in_ground_snow: -chan_setbank 1 -chan_setinstr 5 -chan_setlayer 0, .layer_6E4 -chan_end - -.layer_6E4: -layer_note1 23, 0x6, 127 -layer_note1 25, 0xc, 127 -layer_end - -.sound_action_stuck_in_ground_sand: -chan_setbank 1 -chan_setinstr 8 -chan_setlayer 0, .layer_6F3 -chan_end - -.layer_6F3: -layer_note1 17, 0x6, 127 -layer_note1 19, 0xc, 127 -layer_end - -.sound_action_metal_jump_water: -chan_setbank 1 -chan_setinstr 7 -chan_setenvelope .envelope_3314 -chan_setlayer 0, .layer_705 -chan_end - -.layer_705: -layer_note1 20, 0xf, 90 -layer_note1 29, 0x17, 90 -layer_end - -.sound_action_metal_land_water: -chan_setbank 1 -chan_setinstr 7 -chan_setenvelope .envelope_3314 -chan_setlayer 0, .layer_717 -chan_end - -.layer_717: -layer_note1 29, 0xf, 90 -layer_note1 20, 0x1f, 90 -layer_end - -.sound_action_metal_step_water: -chan_setbank 1 -chan_setinstr 7 -chan_setenvelope .envelope_3314 -chan_setlayer 0, .layer_729 -chan_end - -.layer_729: -layer_portamento 0x85, 18, 255 -layer_note1 22, 0x15, 90 -layer_end - -.chan_731: -chan_setbank 1 -chan_setinstr 7 -chan_setenvelope .envelope_3314 -chan_setlayer 0, .layer_73C -chan_end - -.layer_73C: -layer_note1 11, 0xf, 90 -layer_note1 15, 0x1f, 90 -layer_end - -.chan_743: -chan_setbank 1 -chan_setinstr 7 -chan_setenvelope .envelope_3314 -chan_setlayer 0, .layer_74E -chan_end - -.layer_74E: -layer_portamento 0x85, 18, 255 -layer_note1 22, 0x10, 90 -layer_end - -.chan_756: -chan_setbank 6 -chan_setinstr 10 -chan_setenvelope .envelope_3314 -chan_setlayer 0, .layer_761 -chan_end - -.layer_761: -layer_transpose 8 -layer_jump .layer_61F - -.sound_action_flying_fast: -chan_setbank 5 -chan_setinstr 6 -chan_setenvelope .envelope_33AC -chan_setlayer 0, .layer_774 -chan_setlayer 1, .layer_776 -chan_end - -.layer_774: -layer_transpose 12 - -.layer_776: -layer_somethingon -layer_portamento 0x85, 27, 255 -layer_note1 51, 0x14, 127 -layer_note1 36, 0x5a, 127 -layer_end - -.sound_action_teleport: -chan_setbank 9 -chan_setinstr 3 -chan_setvibratoextent 60 -chan_setvibratorate 60 -chan_setenvelope .envelope_32E4 -chan_setlayer 0, .layer_79D -chan_setlayer 1, .layer_79B -chan_setval 36 -chan_call .delay -chan_setvibratoextent 0 -chan_end - -.layer_79B: -layer_transpose 1 - -.layer_79D: -layer_portamento 0x81, 20, 100 -layer_note1 27, 0x30, 127 -layer_end - -.chan_7A5: -chan_setbank 1 -chan_setinstr 7 -chan_setenvelope .envelope_3344 -chan_setlayer 0, .layer_7B9 -chan_setval 4 -chan_call .delay -chan_setbank 9 -chan_setinstr 3 -chan_end - -.layer_7B9: -layer_note1 43, 0x3, 115 -layer_note1 48, 0x5, 115 -layer_transpose 12 -layer_note1 55, 0x6, 80 -layer_end - -.sound_action_bounce_off_object: -chan_setbank 7 -chan_setinstr 3 -chan_setlayer 0, .layer_7D9 -chan_setval 1 -chan_call .delay -chan_setbank 6 -chan_setinstr 10 -chan_setenvelope .envelope_3314 -chan_end - -.layer_7D9: -layer_portamento 0x81, 27, 255 -layer_note1 41, 0xb, 127 -layer_somethingon -layer_transpose -4 -layer_portamento 0x85, 32, 255 -layer_note1 44, 0x5, 100 -layer_jump .layer_fn_64A - -.chan_7ED: -chan_setbank 0 -chan_setinstr 3 -chan_setdecayrelease 30 -chan_setlayer 0, .layer_7F7 -chan_end - -.layer_7F7: -layer_setinstr 0 -layer_portamento 0x81, 32, 255 -layer_note1 39, 0x24, 127 -layer_end - -.sound_action_read_sign: -chan_jump .sound_menu_read_sign - -.heavy_landing_common: -chan_setbank 0 -chan_setinstr 5 -chan_setlayer 0, .layer_80C -chan_end - -.layer_80C: -layer_note1 41, 0x3c, 127 -layer_end - -.chan_810: -chan_setbank 1 -chan_setinstr 1 -chan_setenvelope .envelope_32C4 -chan_setlayer 0, .layer_81B -chan_end - -.layer_81B: -layer_note1 38, 0x8, 127 -layer_note1 41, 0x9, 127 -layer_note1 39, 0xa, 127 -layer_note1 42, 0x8, 127 -layer_end - -#ifndef VERSION_JP - .chan_828: // unused - chan_setbank 7 - chan_setinstr 3 - chan_setlayer 0, .layer_83C - chan_setval 1 - chan_call .delay - chan_setbank 6 - chan_setinstr 10 - chan_setenvelope .envelope_3314 - chan_end - - .layer_83C: - layer_portamento 0x81, 27, 255 - layer_note1 46, 0x7, 127 - layer_portamento 0x85, 3, 255 - layer_note1 39, 0xf, 100 - layer_end - - .sound_action_intro_unk45e: - chan_setbank 5 - chan_setinstr 6 - chan_setenvelope .envelope_33AC - chan_setlayer 0, .layer_859 - chan_setlayer 1, .layer_85B - chan_end - - .layer_859: - layer_transpose 12 - - .layer_85B: - layer_portamento 0x85, 26, 240 - layer_note1 51, 0x53, 127 - layer_end - - .sound_action_intro_unk45f: - chan_setbank 5 - chan_setinstr 6 - chan_setenvelope .envelope_33AC - chan_setlayer 0, .layer_871 - chan_setlayer 1, .layer_776 - chan_end - - .layer_871: - layer_transpose 8 - layer_jump .layer_776 -#endif - -.sound_action_heavy_landing_default: -chan_call .heavy_landing_common -chan_setval 1 -chan_call .delay -chan_setbank 1 -chan_setinstr 0 -chan_setlayer 1, .layer_388 -chan_end - -.sound_action_heavy_landing_grass: -chan_call .heavy_landing_common -chan_setval 1 -chan_call .delay -chan_setbank 1 -chan_setinstr 1 -chan_setlayer 1, .layer_397 -chan_end - -.sound_action_heavy_landing_water: -chan_call .heavy_landing_common -chan_setval 1 -chan_call .delay -chan_setbank 2 -chan_setinstr 1 -chan_setlayer 1, .layer_3A6 -chan_end - -.sound_action_heavy_landing_stone: -chan_call .heavy_landing_common -chan_setval 1 -chan_call .delay -chan_setbank 1 -chan_setinstr 3 -chan_setlayer 1, .layer_3B5 -chan_end - -.sound_action_heavy_landing_spooky: -chan_call .heavy_landing_common -chan_setval 1 -chan_call .delay -chan_setbank 1 -chan_setinstr 4 -chan_setlayer 1, .layer_3C4 -chan_end - -.sound_action_heavy_landing_snow: -chan_call .heavy_landing_common -chan_setval 1 -chan_call .delay -chan_setbank 1 -chan_setinstr 5 -chan_setlayer 1, .layer_3D3 -chan_end - -.sound_action_heavy_landing_ice: -chan_call .heavy_landing_common -chan_setval 1 -chan_call .delay -chan_setbank 1 -chan_setinstr 6 -chan_setlayer 1, .layer_3E2 -chan_end - -.sound_action_heavy_landing_sand: -chan_call .heavy_landing_common -chan_setval 1 -chan_call .delay -chan_setbank 1 -chan_setinstr 8 -chan_setlayer 1, .layer_3F1 -chan_end - -.channel1_table: -sound_ref .sound_moving_slide_default -sound_ref .sound_moving_slide_grass -sound_ref .sound_moving_slide_water -sound_ref .sound_moving_slide_stone -sound_ref .sound_moving_slide_spooky -sound_ref .sound_moving_slide_snow -sound_ref .sound_moving_slide_ice -sound_ref .sound_moving_slide_sand -sound_ref .sound_moving_slide_default -sound_ref .sound_moving_slide_grass -sound_ref .sound_moving_slide_water -sound_ref .sound_moving_slide_stone -sound_ref .sound_moving_slide_spooky -sound_ref .sound_moving_slide_snow -sound_ref .sound_moving_slide_ice -sound_ref .sound_moving_slide_sand -sound_ref .sound_moving_lava_burn -sound_ref .sound_moving_slide_down_pole -sound_ref .sound_moving_slide_down_tree -sound_ref .sound_general_coin -sound_ref .sound_moving_quicksand_death -sound_ref .sound_general_coin -sound_ref .sound_moving_shocked -sound_ref .sound_moving_flying -sound_ref .sound_moving_almost_drowning -sound_ref .sound_moving_aim_cannon -sound_ref .chan_AC3 -sound_ref .sound_moving_slide_stone -sound_ref .sound_moving_slide_spooky -sound_ref .sound_moving_slide_snow -sound_ref .sound_moving_slide_ice -sound_ref .sound_moving_slide_sand -sound_ref .sound_moving_riding_shell_default -sound_ref .sound_moving_riding_shell_grass -sound_ref .sound_moving_riding_shell_water -sound_ref .sound_moving_riding_shell_stone -sound_ref .sound_moving_riding_shell_spooky -sound_ref .sound_moving_riding_shell_snow -sound_ref .sound_moving_riding_shell_ice -sound_ref .sound_moving_riding_shell_sand -sound_ref .sound_moving_riding_shell_lava -sound_ref .sound_moving_riding_shell_grass -sound_ref .sound_moving_riding_shell_water -sound_ref .sound_moving_riding_shell_stone -sound_ref .sound_moving_riding_shell_spooky -sound_ref .sound_moving_riding_shell_snow -sound_ref .sound_moving_riding_shell_ice -sound_ref .sound_moving_riding_shell_sand -sound_ref .sound_moving_riding_shell_default -sound_ref .sound_moving_riding_shell_grass -sound_ref .sound_moving_riding_shell_water -sound_ref .sound_moving_riding_shell_stone -sound_ref .sound_moving_riding_shell_spooky -sound_ref .sound_moving_riding_shell_snow -sound_ref .sound_moving_riding_shell_ice -sound_ref .sound_moving_riding_shell_sand - -.sound_moving_slide_default: -chan_setbank 3 -chan_setinstr 0 -chan_setlayer 0, .layer_96E -chan_end - -.layer_96E: -layer_somethingon -.layer_96F: -layer_note1 39, 0x12c, 80 -layer_jump .layer_96F -layer_end - -.sound_moving_slide_grass: -chan_setbank 1 -chan_setinstr 1 -chan_setlayer 0, .layer_988 -chan_setval 1 -chan_call .delay -chan_setbank 3 -chan_setinstr 1 -chan_end - -.layer_988: -layer_note1 41, 0x8, 105 -layer_somethingon -.layer_98C: -layer_note1 39, 0x12c, 70 -layer_jump .layer_98C -layer_end - -.sound_moving_slide_water: -chan_setbank 2 -chan_setinstr 1 -chan_setlayer 0, .layer_9A8 -chan_setlayer 1, .layer_9B3 -chan_setval 1 -chan_call .delay -chan_setbank 3 -chan_setinstr 2 -chan_end - -.layer_9A8: -layer_delay 1 -layer_somethingon -.layer_9AB: -layer_note1 39, 0x12c, 88 -layer_jump .layer_9AB -layer_end - -.layer_9B3: -layer_portamento 0x81, 39, 255 -layer_note1 48, 0x32, 80 -layer_end - -.sound_moving_slide_stone: -chan_setbank 3 -chan_setinstr 3 -chan_setlayer 0, .layer_9C3 -chan_end - -.layer_9C3: -layer_somethingon -.layer_9C4: -layer_note1 39, 0x12c, 68 -layer_jump .layer_9C4 -layer_end - -.sound_moving_slide_spooky: -chan_setbank 1 -chan_setinstr 4 -chan_setlayer 0, .layer_9DD -chan_setval 1 -chan_call .delay -chan_setbank 3 -chan_setinstr 4 -chan_end - -.layer_9DD: -layer_note1 42, 0xc, 75 -layer_somethingon -.layer_9E1: -layer_note1 39, 0x12c, 76 -layer_jump .layer_9E1 -layer_end - -.sound_moving_slide_snow: -chan_setbank 3 -chan_setinstr 5 -chan_setlayer 0, .layer_9F1 -chan_end - -.layer_9F1: -layer_somethingon -.layer_9F2: -layer_note1 39, 0x12c, 80 -layer_jump .layer_9F2 -layer_end - -.sound_moving_slide_ice: -chan_setbank 3 -chan_setinstr 6 -chan_setlayer 0, .layer_A02 -chan_end - -.layer_A02: -layer_somethingon -.layer_A03: -layer_note1 39, 0x12c, 100 -layer_jump .layer_A03 -layer_end - -.sound_moving_slide_sand: -chan_setbank 1 -chan_setinstr 8 -chan_setlayer 0, .layer_A1C -chan_setval 1 -chan_call .delay -chan_setbank 3 -chan_setinstr 7 -chan_end - -.layer_A1C: -layer_note1 42, 0xc, 100 -layer_somethingon -.layer_A20: -layer_note1 39, 0x12c, 81 -layer_jump .layer_A20 -layer_end - -.sound_moving_lava_burn: -chan_setbank 3 -chan_setinstr 8 -chan_setlayer 0, .layer_A30 -chan_end - -.layer_A30: -layer_somethingon -.layer_A31: -layer_note1 39, 0x12c, 120 -layer_jump .layer_A31 -layer_end - -.sound_moving_slide_down_pole: -chan_setbank 3 -chan_setinstr 1 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_A44 -chan_end - -.layer_A44: -layer_somethingon -.layer_A45: -layer_note1 43, 0x12c, 80 -layer_jump .layer_A45 -layer_end - -.sound_moving_slide_down_tree: -chan_setbank 0 -chan_setinstr 1 -chan_setlayer 0, .layer_A55 -chan_end - -.layer_A55: -layer_portamento 0x81, 44, 255 -.layer_A59: -layer_somethingon -layer_note1 40, 0xb4, 100 -layer_jump .layer_A59 -layer_end - -.sound_moving_quicksand_death: -chan_setbank 3 -chan_setinstr 7 -chan_setlayer 0, .layer_A6A -chan_end - -.layer_A6A: -layer_somethingon -layer_portamento 0x85, 37, 255 -.layer_A6F: -layer_note1 34, 0xc8, 127 -layer_jump .layer_A6F -layer_end - -.sound_moving_shocked: -chan_setbank 3 -chan_setinstr 9 -chan_setlayer 0, .layer_A84 -chan_setlayer 1, .layer_A82 -chan_end - -.layer_A82: -layer_transpose 24 - -.layer_A84: -layer_note1_long 43, 0x6, 127 -layer_jump .layer_A84 -layer_end - -.sound_moving_flying: -chan_setbank 5 -chan_setinstr 6 -chan_setlayer 0, .layer_A9B -chan_setlayer 1, .layer_A97 -chan_end - -.layer_A97: -layer_setinstr 13 -layer_transpose -12 - -.layer_A9B: -layer_somethingon -.layer_A9C: -layer_note1 43, 0x12c, 105 -layer_jump .layer_A9C - -.sound_moving_almost_drowning: -chan_setbank 9 -chan_setinstr 3 -chan_setval 40 -chan_call .set_reverb -chan_setenvelope .envelope_3344 -chan_setlayer 0, .layer_AB3 -chan_end - -.layer_AB3: -layer_transpose 12 -.layer_AB5: -layer_note0 60, 0xc, 100, 127 -layer_note0 60, 0x30, 100, 127 -layer_jump .layer_AB5 - -.sound_moving_aim_cannon: -chan_jump .chan_29C2 - -.chan_AC3: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3368 -chan_setlayer 0, .layer_AD8 -chan_setlayer 1, .layer_AD6 -chan_setlayer 2, .layer_AD4 -chan_end - -.layer_AD4: -layer_delay 0x4 - -.layer_AD6: -layer_delay 0x4 - -.layer_AD8: -layer_transpose 24 -.layer_ADA: -layer_portamento 0x85, 32, 40 -layer_note1 39, 0x9, 100 -layer_note1 44, 0x6, 50 -layer_note1 51, 0x3, 20 -layer_jump .layer_ADA - -.sound_moving_riding_shell_default: -chan_setbank 3 -chan_setinstr 0 -chan_setlayer 0, .layer_AF2 -chan_end - -.layer_AF2: -layer_transpose 4 -layer_jump .layer_96E - -.sound_moving_riding_shell_grass: -chan_setbank 1 -chan_setinstr 1 -chan_setlayer 0, .layer_B08 -chan_setval 1 -chan_call .delay -chan_setbank 3 -chan_setinstr 1 -chan_end - -.layer_B08: -layer_transpose 4 -layer_jump .layer_988 - -.sound_moving_riding_shell_water: -chan_setbank 2 -chan_setinstr 1 -chan_setlayer 0, .layer_B21 -chan_setlayer 1, .layer_B26 -chan_setval 1 -chan_call .delay -chan_setbank 3 -chan_setinstr 2 -chan_end - -.layer_B21: -layer_transpose 4 -layer_jump .layer_9A8 - -.layer_B26: -layer_transpose 4 -layer_jump .layer_9B3 - -.sound_moving_riding_shell_stone: -chan_setbank 3 -chan_setinstr 3 -chan_setlayer 0, .layer_B33 -chan_end - -.layer_B33: -layer_transpose 4 -layer_jump .layer_9C3 - -.sound_moving_riding_shell_spooky: -chan_setbank 1 -chan_setinstr 4 -chan_setlayer 0, .layer_B49 -chan_setval 1 -chan_call .delay -chan_setbank 3 -chan_setinstr 4 -chan_end - -.layer_B49: -layer_transpose 4 -layer_jump .layer_9DD - -.sound_moving_riding_shell_snow: -chan_setbank 3 -chan_setinstr 5 -chan_setlayer 0, .layer_B56 -chan_end - -.layer_B56: -layer_transpose 4 -layer_jump .layer_9F1 - -.sound_moving_riding_shell_ice: -chan_setbank 3 -chan_setinstr 6 -chan_setlayer 0, .layer_B63 -chan_end - -.layer_B63: -layer_transpose 4 -layer_jump .layer_A02 - -.sound_moving_riding_shell_sand: -chan_setbank 1 -chan_setinstr 8 -chan_setlayer 0, .layer_B79 -chan_setval 1 -chan_call .delay -chan_setbank 3 -chan_setinstr 7 -chan_end - -.layer_B79: -layer_transpose 4 -layer_jump .layer_A1C - -.sound_moving_riding_shell_lava: -chan_setlayer 0, .layer_B9F -chan_setlayer 1, .layer_BA8 -.chan_B84: -chan_setbank 3 -chan_setinstr 2 -chan_setval 1 -chan_call .delay -chan_setdecayrelease 30 -chan_setbank 2 -chan_setinstr 1 -chan_setenvelope .envelope_3334 -chan_setval 1 -chan_call .delay -chan_jump .chan_B84 -chan_end - -.layer_B9F: -layer_somethingon -.layer_BA0: -layer_note1 42, 0x12c, 88 -layer_jump .layer_BA0 -layer_end - -.layer_BA8: -layer_delay 1 -.layer_BAA: -layer_portamento 0x81, 41, 255 -layer_note1 56, 0xa, 127 -layer_jump .layer_BAA - -.channel2_table: -sound_ref .sound_mario_jump_yah -sound_ref .sound_mario_jump_wah -sound_ref .sound_mario_jump_hoo -sound_ref .sound_mario_hoohoo -sound_ref .sound_mario_yahoo -sound_ref .sound_mario_uh -sound_ref .sound_mario_hrmm -sound_ref .sound_mario_wah2 -sound_ref .sound_mario_whoa -sound_ref .sound_mario_eeuh -sound_ref .sound_mario_attacked -sound_ref .sound_mario_ooof -sound_ref .sound_mario_here_we_go -sound_ref .sound_mario_yawning -sound_ref .sound_mario_snoring1 -sound_ref .sound_mario_snoring2 -sound_ref .sound_mario_waaaooow -sound_ref .sound_mario_haha -sound_ref .sound_mario_panting1 -sound_ref .sound_mario_uh2 -sound_ref .sound_mario_on_fire -sound_ref .sound_mario_dying -sound_ref .sound_mario_panting_cold -sound_ref .sound_mario_coughing3 -sound_ref .sound_mario_panting1 -sound_ref .sound_mario_panting2 -sound_ref .sound_mario_panting3 -sound_ref .sound_mario_coughing1 -sound_ref .sound_mario_coughing2 -sound_ref .sound_mario_coughing3 -sound_ref .sound_mario_punch_yah -sound_ref .sound_mario_punch_hoo -sound_ref .sound_mario_mama_mia -sound_ref .sound_mario_okey_dokey -sound_ref .sound_mario_ground_pound_wah -sound_ref .sound_mario_drowning -sound_ref .sound_mario_punch_wah -sound_ref .sound_mario_uh -sound_ref .sound_mario_hrmm -sound_ref .sound_mario_wah2 -#ifdef VERSION_JP - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo -#else - sound_ref .sound_peach_dear_mario - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_jump_hoo - sound_ref .sound_mario_yahoo - sound_ref .sound_mario_yahoo - sound_ref .sound_mario_yahoo - sound_ref .sound_mario_waha - sound_ref .sound_mario_yippee - sound_ref .sound_mario_doh - sound_ref .sound_mario_game_over - sound_ref .sound_mario_hello - sound_ref .sound_mario_press_start_to_play - sound_ref .sound_mario_twirl_bounce - sound_ref .sound_mario_snoring3 - sound_ref .sound_mario_so_longa_bowser - sound_ref .sound_mario_ima_tired - sound_ref .sound_peach_mario - sound_ref .sound_peach_power_of_the_stars - sound_ref .sound_peach_thanks_to_you - sound_ref .sound_peach_thank_you_mario - sound_ref .sound_peach_something_special - sound_ref .sound_peach_bake_a_cake - sound_ref .sound_peach_for_mario - sound_ref .sound_peach_mario2 -#endif - -.sound_mario_jump_hoo: -chan_setbank 8 -chan_setinstr 0 -chan_setlayer 0, .layer_C3C -chan_end - -.layer_C3C: -#if defined(VERSION_EU) || defined(VERSION_SH) - layer_transpose 2 -#endif -layer_portamento 0x82, 41, 127 -layer_note1 37, 0x14, 127 -layer_end - -.sound_mario_jump_wah: -chan_setbank 8 -chan_setinstr 1 -chan_setlayer 0, .layer_C4C -chan_end - -.layer_C4C: -layer_transpose -2 -.layer_C4E: -layer_note1 38, 0x18, 127 -layer_end - -.sound_mario_jump_yah: -chan_setbank 10 -chan_setinstr 9 -chan_setlayer 0, .layer_C5A -chan_end - -.layer_C5A: -layer_transpose -2 -.layer_C5C: -layer_portamento 0x82, 39, 200 -layer_note1 38, 0x24, 120 -layer_end - -.sound_mario_hoohoo: -chan_setbank 10 -chan_setinstr 1 -chan_setlayer 0, .layer_C6C -chan_end - -.layer_C6C: -#if defined(VERSION_EU) || defined(VERSION_SH) - layer_transpose 1 -#endif -layer_portamento 0x82, 44, 200 -layer_note1 39, 0x30, 127 -layer_end - -.sound_mario_yahoo: -chan_setbank 8 -chan_setinstr 4 -chan_setlayer 0, .layer_C7C -chan_end - -.layer_C7C: -layer_transpose -2 -layer_somethingon -layer_portamento 0x85, 39, 255 -layer_note1 42, 0x1e, 110 -layer_note1 39, 0x41, 110 -layer_end - -.sound_mario_uh: -chan_setbank 8 -chan_setinstr 5 -chan_setlayer 0, .layer_C92 -chan_end - -.layer_C92: -layer_transpose -2 -layer_portamento 0x81, 41, 255 -layer_note1 38, 0x2b, 115 -layer_end - -.sound_mario_hrmm: -chan_setbank 8 -chan_setinstr 6 -chan_setlayer 0, .layer_CA4 -chan_end - -.layer_CA4: -layer_transpose -2 -layer_note1 44, 0x1e, 110 -layer_end - -.sound_mario_wah2: -chan_setbank 8 -chan_setinstr 7 -chan_setlayer 0, .layer_CB2 -chan_end - -.layer_CB2: -layer_transpose -3 -layer_note1 39, 0x1c, 127 -layer_end - -.sound_mario_whoa: -chan_setbank 8 -chan_setinstr 8 -chan_setlayer 0, .layer_CC0 -chan_end - -.layer_CC0: -layer_transpose -2 -layer_note1 40, 0x30, 110 -layer_end - -.sound_mario_eeuh: -chan_setbank 8 -chan_setinstr 9 -chan_setlayer 0, .layer_CCE -chan_end - -.layer_CCE: -layer_transpose -2 -layer_note1 40, 0x44, 105 -layer_end - -.sound_mario_attacked: -chan_setbank 8 -chan_setinstr 10 -chan_setlayer 0, .layer_CDC -chan_end - -.layer_CDC: -layer_transpose -2 -layer_note1 41, 0x30, 120 -layer_end - -.sound_mario_ooof: -chan_setbank 8 -chan_setinstr 11 -chan_setlayer 0, .layer_CEA -chan_end - -.layer_CEA: -layer_transpose -2 -layer_note1 38, 0x30, 127 -layer_end - -.sound_mario_here_we_go: -chan_setbank 8 -chan_setinstr 12 -chan_setlayer 0, .layer_CF8 -chan_end - -.layer_CF8: -layer_portamento 0x81, 38, 200 -layer_note1 41, 0x85, 127 -layer_end - -.sound_mario_yawning: -chan_setbank 8 -chan_setinstr 13 -chan_setlayer 0, .layer_D09 -chan_end - -.layer_D09: -layer_transpose -2 -layer_note1 39, 0x7f, 105 -layer_end - -.sound_mario_snoring1: -chan_setbank 8 -chan_setinstr 14 -chan_setlayer 0, .layer_D17 -chan_end - -.layer_D17: -layer_transpose -2 -layer_note1 39, 0x60, 64 -layer_end - -.sound_mario_snoring2: -chan_setbank 8 -chan_setinstr 15 -chan_setlayer 0, .layer_D25 -chan_end - -.layer_D25: -layer_transpose -2 -layer_note1 39, 0x5c, 52 -layer_end - -.sound_mario_waaaooow: -chan_setbank 10 -chan_setinstr 0 -chan_setlayer 0, .layer_D33 -chan_end - -.layer_D33: -layer_transpose -2 -layer_note1 39, 0xaa, 127 -layer_end - -.sound_mario_haha: -chan_setbank 8 -chan_setinstr 3 -chan_setlayer 0, .layer_D42 -chan_end - -.layer_D42: -layer_transpose -1 -layer_note1 39, 0x4d, 120 -layer_end - -.sound_mario_uh2: -chan_setbank 10 -chan_setinstr 6 -chan_setlayer 0, .layer_D50 -chan_end - -.layer_D50: -layer_transpose -2 -layer_note1 43, 0x1e, 105 -layer_end - -.sound_mario_on_fire: -chan_setbank 10 -chan_setinstr 5 -chan_setlayer 0, .layer_D5E -chan_end - -.layer_D5E: -layer_transpose -2 -layer_note1 39, 0xc8, 127 -layer_end - -.sound_mario_dying: -chan_setbank 10 -chan_setinstr 4 -chan_setlayer 0, .layer_D6D -chan_end - -.layer_D6D: -layer_transpose -2 -layer_note1 39, 0x8c, 110 -layer_end - -.sound_mario_panting_cold: -chan_setbank 10 -chan_setinstr 2 -chan_setlayer 0, .layer_D7C -chan_end - -.layer_D7C: -layer_transpose -2 -layer_portamento 0x82, 35, 255 -layer_note1 38, 0x30, 127 -layer_end - -.sound_mario_panting1: -chan_setbank 10 -chan_setinstr 2 -chan_setlayer 0, .layer_D8E -chan_end - -.layer_D8E: -layer_transpose -2 -layer_note1 39, 0x3c, 100 -layer_end - -.sound_mario_panting2: -chan_setbank 10 -chan_setinstr 2 -chan_setlayer 0, .layer_D9C -chan_end - -.layer_D9C: -layer_transpose -2 -layer_delay 0x4 -layer_note1 38, 0x3c, 100 -layer_end - -.sound_mario_panting3: -chan_setbank 10 -chan_setinstr 2 -chan_setlayer 0, .layer_DAC -chan_end - -.layer_DAC: -layer_transpose -2 -layer_delay 0x8 -layer_note1 40, 0x3c, 100 -layer_end - -.sound_mario_coughing1: -chan_setbank 10 -chan_setinstr 7 -chan_setlayer 0, .layer_DBC -chan_end - -.layer_DBC: -layer_transpose -2 -layer_note1 39, 0x10, 115 -layer_end - -.sound_mario_coughing2: -chan_setbank 10 -chan_setinstr 7 -chan_setlayer 0, .layer_DCA -chan_end - -.layer_DCA: -layer_transpose -2 -layer_portamento 0x81, 38, 255 -layer_note1 41, 0x18, 115 -layer_end - -.sound_mario_coughing3: -chan_setbank 10 -chan_setinstr 7 -chan_setlayer 0, .layer_DDC -chan_end - -.layer_DDC: -layer_transpose -2 -layer_somethingon -layer_portamento 0x85, 38, 255 -layer_note1 41, 0xc, 115 -layer_note1 35, 0x12, 115 -layer_end - -.sound_mario_punch_yah: -chan_setbank 10 -chan_setinstr 9 -chan_setlayer 0, .layer_DFE -chan_setval 1 -chan_call .delay -chan_setbank 0 -chan_setinstr 0 -chan_setlayer 1, .layer_538 -chan_end - -.layer_DFE: -layer_transpose -2 -layer_jump .layer_C5C - -.sound_mario_punch_hoo: -chan_setbank 10 -chan_setinstr 10 -chan_setlayer 0, .layer_E17 -chan_setval 1 -chan_call .delay -chan_setbank 0 -chan_setinstr 0 -chan_setlayer 1, .layer_548 -chan_end - -.layer_E17: -layer_transpose -2 -layer_portamento 0x81, 42, 255 -layer_note1 38, 0x30, 115 -layer_end - -.sound_mario_mama_mia: -chan_setbank 10 -chan_setinstr 11 -chan_setlayer 0, .layer_E29 -chan_end - -.layer_E29: -layer_portamento 0x81, 38, 255 -layer_note1 36, 0x8c, 115 -layer_end - -.sound_mario_okey_dokey: -chan_setbank 10 -chan_setinstr 12 -chan_setlayer 0, .layer_E3A -chan_end - -.layer_E3A: -layer_note1 39, 0x60, 115 -layer_end - -.sound_mario_ground_pound_wah: -chan_jump .sound_mario_wah2 - -.sound_mario_drowning: -chan_setbank 10 -chan_setinstr 13 -chan_setlayer 0, .layer_E49 -chan_end - -.layer_E49: -layer_note1 38, 0x91, 127 -layer_end - -.sound_mario_punch_wah: -chan_setbank 8 -chan_setinstr 1 -chan_setlayer 0, .layer_E62 -chan_setval 1 -chan_call .delay -chan_setbank 0 -chan_setinstr 0 -chan_setlayer 1, .layer_536 -chan_end - -.layer_E62: -layer_transpose -1 -layer_jump .layer_C4E - -#ifndef VERSION_JP - .sound_peach_dear_mario: - chan_setbank 10 - chan_setinstr 15 - chan_setlayer 0, .layer_E6F - chan_end - - .layer_E6F: - layer_note1 39, 0x2bc, 127 - layer_end - - .sound_mario_waha: - chan_setbank 8 - chan_setinstr 24 - chan_setlayer 0, .layer_E7C - chan_end - - .layer_E7C: - layer_note1 39, 0x5a, 127 - layer_end - - .sound_mario_yippee: - chan_setbank 8 - chan_setinstr 25 - chan_setlayer 0, .layer_E88 - chan_end - - .layer_E88: - layer_note1 39, 0x5a, 97 - layer_end - - .sound_mario_doh: - chan_setbank 8 - chan_setinstr 16 - chan_setlayer 0, .layer_E94 - chan_end - - .layer_E94: - layer_note1 41, 0x46, 127 - layer_end - - .sound_mario_game_over: - chan_setbank 8 - chan_setinstr 17 - chan_setlayer 0, .layer_EA0 - chan_end - - .layer_EA0: - layer_note1 39, 0x55, 110 - layer_end - - .sound_mario_hello: - chan_setbank 8 - chan_setinstr 18 - chan_setlayer 0, .layer_EAC - chan_end - - .layer_EAC: - layer_note1 39, 0x46, 127 - layer_end - - .sound_mario_press_start_to_play: - chan_setbank 8 - chan_setinstr 19 - chan_setlayer 0, .layer_EB8 - chan_end - - .layer_EB8: - layer_note1 39, 0x12c, 127 - layer_end - - .sound_mario_twirl_bounce: - chan_setbank 8 - chan_setinstr 20 - chan_setlayer 0, .layer_EC5 - chan_end - - .layer_EC5: - layer_note1 39, 0x30, 127 - layer_end - - .sound_mario_snoring3: - chan_setbank 8 - chan_setlayer 0, .layer_ECF - chan_end - - .layer_ECF: - layer_delay 0x4e - .layer_ED1: - layer_loop 50 - layer_call .layer_fn_EE1 - layer_loopend - layer_setinstr 21 - layer_note1 39, 0x44c, 127 - layer_jump .layer_ED1 - layer_end - - .layer_fn_EE1: - layer_setinstr 21 - layer_note1 37, 0x53, 127 - layer_setinstr 15 - layer_note1 37, 0x4e, 64 - layer_end - - .sound_mario_so_longa_bowser: - chan_setbank 8 - chan_setinstr 22 - chan_setlayer 0, .layer_EF7 - chan_setlayer 1, .layer_EF7 - chan_end - - .layer_EF7: - layer_portamento 0x82, 42, 200 - layer_note1 39, 0xc8, 110 - layer_end - - .sound_mario_ima_tired: - chan_setbank 8 - chan_setinstr 23 - chan_setlayer 0, .layer_F08 - chan_end - - .layer_F08: - layer_note1 39, 0x96, 110 - layer_end - - .sound_peach_mario: - chan_setbank 10 - chan_setinstr 16 - chan_setlayer 0, .layer_F18 - chan_setlayer 1, .layer_F18 - chan_end - - .layer_F18: - layer_note1 39, 0x46, 127 - layer_end - - .sound_peach_power_of_the_stars: - chan_setbank 10 - chan_setinstr 17 - chan_setlayer 0, .layer_F27 - chan_setlayer 1, .layer_F27 - chan_end - - .layer_F27: - layer_note1 39, 0x15e, 127 - layer_end - - .sound_peach_thanks_to_you: - chan_setbank 10 - chan_setinstr 18 - chan_setlayer 0, .layer_F37 - chan_setlayer 1, .layer_F37 - chan_end - - .layer_F37: - layer_note1 39, 0xb4, 127 - layer_end - - .sound_peach_thank_you_mario: - chan_setbank 10 - chan_setinstr 19 - chan_setlayer 0, .layer_F47 - chan_setlayer 1, .layer_F47 - chan_end - - .layer_F47: - layer_note1 39, 0x64, 127 - layer_end - - .sound_peach_something_special: - chan_setbank 10 - chan_setinstr 20 - chan_setlayer 0, .layer_F56 - chan_setlayer 1, .layer_F56 - chan_end - - .layer_F56: - layer_note1 39, 0xdc, 127 - layer_end - - .sound_peach_bake_a_cake: - chan_setbank 10 - chan_setinstr 21 - chan_setlayer 0, .layer_F66 - chan_setlayer 1, .layer_F66 - chan_end - - .layer_F66: - layer_note1 39, 0x190, 127 - layer_end - - .sound_peach_for_mario: - chan_setbank 10 - chan_setinstr 22 - chan_setlayer 0, .layer_F76 - chan_setlayer 1, .layer_F76 - chan_end - - .layer_F76: - layer_note1 39, 0x50, 127 - layer_end - - .sound_peach_mario2: - chan_setbank 10 - chan_setinstr 23 - chan_setval 20 - chan_call .set_reverb - chan_setlayer 0, .layer_F8A - chan_setlayer 1, .layer_F8A - chan_end - - .layer_F8A: - layer_note1 39, 0x50, 127 - layer_end -#endif - -#if defined(VERSION_EU) || defined(VERSION_SH) - .chan_unused_F9A_eu: - chan_setbank 8 - chan_setinstr 0 - chan_setlayer 0, .layer_FA2_eu - chan_end - - .layer_FA2_eu: - layer_delay 0x5 - layer_end -#endif - -.channel38_table: -sound_ref .sound_general_activate_cap_switch -sound_ref .sound_menu_enter_hole -sound_ref .sound_menu_enter_hole -sound_ref .sound_general_flame_out -sound_ref .sound_general_open_wood_door -sound_ref .sound_general_close_wood_door -sound_ref .sound_general_open_iron_door -sound_ref .sound_general_close_iron_door -sound_ref .sound_general_bubbles -sound_ref .sound_general_moving_water -sound_ref .sound_general_swish_water -sound_ref .sound_general_quiet_bubble -sound_ref .sound_general_volcano_explosion -sound_ref .sound_general_quiet_bubble2 -sound_ref .sound_general_castle_trap_open -sound_ref .sound_general_wall_explosion -sound_ref .sound_general_coin -sound_ref .sound_general_coin -sound_ref .sound_general_coin_water -sound_ref .sound_general_coin_water -sound_ref .sound_general_coin_water -sound_ref .sound_general_coin_water -sound_ref .sound_general_short_star -sound_ref .sound_general_big_clock -sound_ref .sound_general_loud_pound -sound_ref .sound_general_loud_pound -sound_ref .sound_general_short_pound -sound_ref .sound_general_short_pound -sound_ref .sound_general_short_pound -sound_ref .sound_general_short_pound -sound_ref .sound_general_short_pound -sound_ref .sound_general_short_pound -sound_ref .sound_general_open_chest -sound_ref .sound_general_open_chest -sound_ref .sound_general_clam_shell1 -sound_ref .sound_general_clam_shell1 -sound_ref .sound_general_box_landing -sound_ref .chan_12EB -sound_ref .sound_general_clam_shell2 -sound_ref .sound_general_clam_shell3 -sound_ref .sound_general_painting_eject -sound_ref .sound_general_painting_eject -sound_ref .sound_general_painting_eject -sound_ref .sound_general_painting_eject -sound_ref .sound_menu_star_sound -sound_ref .sound_general_platform -sound_ref .sound_general_bobomb_explosion -sound_ref .sound_general_bowser_bomb_explosion -sound_ref .sound_general_coin_spurt -sound_ref .sound_general_explosion6 -sound_ref .chan_13D4 -sound_ref .sound_general_coin -sound_ref .sound_general_boat_tilt1 -sound_ref .sound_general_boat_tilt2 -sound_ref .sound_general_coin_drop -sound_ref .chan_1429 -sound_ref .sound_general_pendulum_swing -sound_ref .sound_general_chain_chomp1 -sound_ref .sound_general_chain_chomp2 -sound_ref .sound_general_door_turn_key -sound_ref .sound_general_moving_in_sand -sound_ref .chan_1519 -sound_ref .sound_general_moving_platform_switch -sound_ref .sound_general_cage_open -sound_ref .sound_general_quiet_pound1 -sound_ref .sound_general_break_box -sound_ref .sound_general_door_insert_key -sound_ref .sound_general_quiet_pound2 -sound_ref .sound_general_big_pound -sound_ref .chan_15CD -sound_ref .chan_15DA -sound_ref .sound_general_cannon_up -sound_ref .sound_general_grindel_spindel_roll -sound_ref .sound_general_explosion7 -sound_ref .sound_general_shake_coffin -sound_ref .sound_general_pyramid_top_spin -sound_ref .sound_general_pyramid_top_explosion -sound_ref .sound_general_race_gun_shot -sound_ref .sound_general_star_door_open -sound_ref .sound_general_star_door_close -sound_ref .sound_general_bird_chirp2 -sound_ref .sound_obj_bird_chirp3 -sound_ref .sound_obj_bird_chirp1 -sound_ref .sound_air_castle_outdoors_ambient -sound_ref .sound_general_switch_tick_fast -sound_ref .sound_general_switch_tick_slow -sound_ref .sound_general_pound_rock -sound_ref .sound_general_star_appears -sound_ref .sound_general_collect_1up -sound_ref .sound_general_rotating_block_alert -sound_ref .sound_general_button_press -sound_ref .sound_general_elevator_move -sound_ref .sound_general_swish_air -sound_ref .sound_general_haunted_chair -sound_ref .sound_general_soft_landing -sound_ref .sound_general_haunted_chair_move -sound_ref .sound_general_bowser_explode -sound_ref .sound_general_bowser_key -sound_ref .sound_general_bowser_platform -sound_ref .sound_general_1up_appear -sound_ref .sound_general_heart_spin -sound_ref .sound_general_pound_wood_post -sound_ref .sound_general_water_level_trig -sound_ref .sound_general_switch_door_open -sound_ref .sound_general_red_coin -sound_ref .sound_general_birds_fly_away -sound_ref .sound_general_right_answer -sound_ref .sound_general_metal_pound -sound_ref .sound_general_boing1 -sound_ref .sound_general_boing2 -sound_ref .sound_general_yoshi_walk -sound_ref .sound_general_enemy_alert1 -sound_ref .sound_general_yoshi_talk -sound_ref .sound_general_splattering -sound_ref .sound_general_boing3 -sound_ref .sound_general_grand_star -sound_ref .sound_general_grand_star_jump -sound_ref .sound_general_boat_rock -#ifdef VERSION_JP - sound_ref .sound_menu_enter_hole - sound_ref .sound_menu_enter_hole - sound_ref .sound_menu_enter_hole - sound_ref .sound_general_open_wood_door - sound_ref .sound_general_close_wood_door - sound_ref .sound_general_open_iron_door - sound_ref .sound_general_close_iron_door - sound_ref .sound_general_bubbles - sound_ref .sound_menu_enter_hole - sound_ref .sound_menu_enter_hole -#else - sound_ref .sound_general_vanish_sfx - sound_ref .sound_menu_enter_hole - sound_ref .sound_general_red_coin - sound_ref .sound_general_birds_fly_away - sound_ref .sound_general_right_answer - sound_ref .sound_general_metal_pound - sound_ref .sound_general_boing1 - sound_ref .sound_general_boing2 - sound_ref .sound_general_yoshi_walk - sound_ref .sound_general_enemy_alert1 -#endif - -.sound_general_activate_cap_switch: -chan_setbank 5 -chan_setinstr 7 -chan_setlayer 0, .layer_109F -chan_delay 1 -chan_setbank 4 -chan_setinstr 9 -chan_setlayer 1, .layer_1537 -chan_end - -.layer_109F: -layer_portamento 0x1, 27, 0x28 -layer_note1 37, 0x7f, 120 -layer_end - -.sound_menu_enter_hole: -chan_setbank 4 -chan_setinstr 0 -chan_setlayer 0, .layer_10AF -chan_end - -.layer_10AF: -layer_note1 39, 0x30, 85 -layer_end - -.sound_general_flame_out: -chan_setbank 3 -chan_setinstr 8 -chan_setenvelope .envelope_3314 -chan_setlayer 0, .layer_10BE -chan_end - -.layer_10BE: -layer_somethingon -layer_portamento 0x85, 34, 255 -layer_note1 43, 0x8, 127 -layer_note1 27, 0x7f, 127 -layer_end - -.sound_general_open_wood_door: -chan_setbank 4 -chan_setinstr 1 -chan_setlayer 0, .layer_10D2 -chan_end - -.layer_10D2: -layer_note1 39, 0x18, 100 -layer_setinstr 2 -layer_note1 39, 0x48, 60 -layer_end - -.sound_general_close_wood_door: -chan_setbank 4 -chan_setinstr 1 -chan_setlayer 0, .layer_10E3 -chan_end - -.layer_10E3: -layer_note1 37, 0x6, 100 -layer_note1 34, 0x18, 100 -layer_end - -.sound_general_open_iron_door: -chan_setbank 4 -chan_setinstr 4 -chan_setlayer 0, .layer_10FE -chan_setlayer 1, .layer_1108 -chan_setval 6 -chan_call .delay -chan_setbank 4 -chan_setinstr 3 -chan_end - -.layer_10FE: -layer_delay 0xf -layer_portamento 0x81, 39, 255 -layer_note1 44, 0x38, 115 -layer_end - -.layer_1108: -layer_portamento 0x81, 44, 255 -layer_note1 34, 0x2c, 85 -layer_end - -.sound_general_close_iron_door: -chan_setbank 4 -chan_setinstr 4 -chan_setlayer 0, .layer_1118 -chan_end - -.layer_1118: -layer_note1 39, 0x30, 115 -layer_end - -.sound_general_bubbles: -chan_setbank 4 -chan_setinstr 6 -chan_setlayer 0, .layer_1124 -chan_end - -.layer_1124: -layer_transpose 24 -layer_note1 39, 0xa, 65 -layer_note1 39, 0x9, 70 -layer_note1 39, 0x8, 75 -layer_end - -.sound_general_moving_water: -chan_setbank 4 -chan_setinstr 5 -chan_setlayer 0, .layer_1138 -chan_end - -.layer_1138: -layer_note1 39, 0x91, 127 -layer_end - -.sound_obj_sushi_shark_water_sound: -chan_setbank 4 -chan_setinstr 5 -chan_setlayer 0, .layer_1145 -chan_end - -.layer_1145: -layer_portamento 0x81, 27, 255 -layer_note1 32, 0x60, 127 -layer_end - -.sound_general_quiet_bubble: -chan_setbank 4 -chan_setinstr 6 -chan_setlayer 0, .layer_1155 -chan_end - -.layer_1155: -layer_note1 39, 0x14, 70 -layer_end - -.sound_general_volcano_explosion: -chan_setbank 4 -chan_setinstr 15 -chan_setlayer 0, .layer_1161 -chan_end - -.layer_1161: -layer_note1 32, 0x18, 127 -layer_portamento 0x81, 41, 255 -layer_note1 27, 0x96, 127 -layer_end - -.sound_general_quiet_bubble2: -chan_setbank 4 -chan_setinstr 6 -chan_setlayer 0, .layer_1175 -chan_end - -.layer_1175: -layer_portamento 0x81, 34, 255 -layer_note1 37, 0x18, 80 -layer_end - -.sound_general_castle_trap_open: -chan_setbank 4 -chan_setinstr 8 -chan_setlayer 0, .layer_1185 -chan_end - -.layer_1185: -layer_note1 39, 0x40, 120 -layer_end - -.sound_general_wall_explosion: -chan_setbank 5 -chan_setinstr 7 -chan_setlayer 0, .layer_109F -chan_setval 1 -chan_call .delay -chan_setbank 4 -chan_setinstr 9 -chan_setlayer 1, .layer_119D -chan_end - -.layer_119D: -layer_transpose -12 - -.layer_fn_119F: -layer_portamento 0x83, 27, 255 -layer_note0 55, 0x4, 127, 64 -layer_note0 51, 0x5, 127, 64 -layer_note0 48, 0x4, 127, 64 -layer_note0 44, 0x6, 127, 64 -layer_note0 41, 0x9, 127, 64 -layer_note0 39, 0x6, 127, 64 -.layer_11BB: -layer_note0 37, 0x7, 127, 64 -layer_note0 34, 0x5, 127, 64 -layer_note0 31, 0x8, 127, 64 -layer_note0 29, 0x9, 127, 64 -layer_note0 24, 0x8, 127, 64 -layer_end - -.sound_general_coin: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3358 -chan_setvibratoextent 3 -chan_setvibratorate 60 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_11E4 -chan_end - -.layer_11E4: -layer_transpose 24 - -.layer_fn_11E6: -layer_note1 25, 0x2, 40 -layer_note1 37, 0x7, 85 -layer_note1 30, 0x5, 40 -layer_note1 42, 0x37, 85 -layer_end - -.sound_general_coin_water: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3358 -chan_setvibratoextent 12 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_1242 -chan_setlayer 1, .layer_1254 -chan_setval 1 -chan_call .delay -chan_setbank 4 -chan_setinstr 6 -chan_setval 1 -chan_call .delay -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3358 -chan_setval 9 -chan_call .delay -chan_setbank 4 -chan_setinstr 6 -chan_setval 3 -chan_call .delay -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3358 -chan_setval 6 -chan_call .delay -chan_setbank 4 -chan_setinstr 6 -chan_setval 49 -chan_call .delay -chan_setvibratoextent 0 -chan_end - -.layer_1242: -layer_delay 1 -layer_setinstr 6 -layer_transpose 22 -layer_note1 39, 0xa, 55 -layer_note1 39, 0x9, 60 -layer_note1 39, 0x8, 65 -layer_delay 0x29 -layer_end - -.layer_1254: -layer_transpose 23 -layer_call .layer_fn_11E6 -layer_end - -.sound_general_short_star: -chan_setbank 4 -chan_setinstr 14 -chan_setenvelope .envelope_33FC -chan_setlayer 0, .layer_1265 -chan_end - -.layer_1265: -layer_portamento 0x81, 34, 127 -layer_note1 38, 0x30, 127 -layer_delay 0x30 -layer_end - -.sound_general_big_clock: -chan_setbank 4 -chan_setinstr 9 -chan_setlayer 0, .layer_1277 -chan_end - -.layer_1277: -layer_note1 37, 0xa, 100 -layer_note1 26, 0x12, 120 -layer_end - -.sound_general_loud_pound: -chan_setbank 4 -chan_setinstr 10 -chan_setlayer 0, .layer_1286 -chan_end - -.layer_1286: -layer_note1 39, 0xf, 120 -layer_end - -.sound_general_short_pound: -chan_setbank 4 -chan_setinstr 10 -chan_setlayer 0, .layer_1292 -chan_end - -.layer_1292: -layer_note1 37, 0x12, 120 -layer_end - -.sound_general_open_chest: -chan_setbank 7 -chan_setinstr 1 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_12AF -chan_setlayer 1, .layer_12AF -chan_setval 6 -chan_call .delay -chan_setbank 4 -chan_setinstr 4 -chan_end - -.layer_12AF: -layer_note1 43, 0x5, 127 -layer_note1 62, 0x9, 127 -layer_setinstr 2 -layer_portamento 0x81, 27, 255 -layer_note1 25, 0x5a, 108 -layer_end - -.sound_general_clam_shell1: -chan_setbank 4 -chan_setinstr 11 -chan_setlayer 0, .layer_12C7 -chan_end - -.layer_12C7: -layer_note1 24, 0xa, 110 -.layer_12CA: -layer_setinstr 5 -layer_portamento 0x82, 27, 255 -layer_note1 32, 0x73, 127 -layer_end - -.sound_general_box_landing: -chan_setbank 4 -chan_setinstr 1 -chan_setenvelope .envelope_33CC -chan_setlayer 0, .layer_12DF -chan_end - -.layer_12DF: -layer_somethingon -layer_note1 39, 0x4, 127 -layer_portamento 0x82, 36, 255 -layer_note1 27, 0x9, 115 -layer_end - -.chan_12EB: -chan_setbank 4 -chan_setinstr 2 -chan_setenvelope .envelope_3454 -chan_setlayer 0, .layer_12F9 -chan_setlayer 1, .layer_12FB -chan_end - -.layer_12F9: -layer_transpose 3 - -.layer_12FB: -layer_portamento 0x2, 17, 0x28 -layer_note1 5, 0x60, 127 -layer_end - -.sound_general_clam_shell2: -chan_setbank 4 -chan_setinstr 11 -chan_setlayer 0, .layer_130B -chan_end - -.layer_130B: -layer_note1 19, 0x6, 110 -layer_note1 31, 0x6, 110 -layer_transpose 8 -layer_jump .layer_12CA - -.sound_general_clam_shell3: -chan_setbank 4 -chan_setinstr 5 -chan_setlayer 0, .layer_131E -chan_end - -.layer_131E: -layer_setinstr 11 -layer_note1 31, 0x6, 127 -layer_note1 19, 0x6, 127 -layer_setinstr 5 -layer_portamento 0x82, 20, 255 -layer_note1 32, 0x5a, 127 -layer_end - -.sound_general_painting_eject: -chan_setbank 4 -chan_setinstr 13 -chan_setlayer 0, .layer_1338 -chan_end - -.layer_1338: -layer_note1 39, 0x73, 95 -layer_end - -.sound_menu_star_sound: -chan_setbank 4 -chan_setinstr 14 -chan_setlayer 0, .layer_1344 -chan_end - -.layer_1344: -layer_note1 39, 0x7f, 115 -layer_end - -.sound_general_platform: -chan_setbank 4 -chan_setinstr 15 -chan_setlayer 0, .layer_1350 -chan_end - -.layer_1350: -layer_note0 36, 0xd, 115, 20 -layer_note0 34, 0xe, 115, 20 -layer_note0 32, 0xd, 115, 20 -layer_note0 31, 0xa, 115, 20 -layer_note0 30, 0x7, 115, 20 -layer_note0 29, 0x60, 115, 20 -layer_end - -.sound_general_bobomb_explosion: -chan_setbank 4 -chan_setinstr 15 -chan_setenvelope .envelope_33EC -chan_setlayer 0, .layer_137B -chan_setlayer 1, .layer_1377 -chan_end - -.layer_1377: -layer_note1 15, 0x7f, 127 -layer_end - -.layer_137B: -layer_note1 55, 0x6, 115 -layer_note1 43, 0xc, 115 -layer_note1 34, 0x7f, 127 -layer_end - -.sound_general_bowser_bomb_explosion: -chan_setbank 4 -chan_setinstr 15 -chan_setlayer 0, .layer_1395 -chan_setlayer 1, .layer_13A0 -chan_setlayer 2, .layer_1393 -chan_end - -.layer_1393: -layer_transpose 6 - -.layer_1395: -layer_note1 44, 0x7, 127 -layer_note1 39, 0x8, 127 -layer_note1 36, 0x96, 127 -layer_end - -.layer_13A0: -layer_note1 22, 0x96, 127 -layer_end - -.sound_general_coin_spurt: -chan_setbank 9 -chan_setinstr 3 -chan_setval 20 -chan_call .set_reverb -chan_setlayer 0, .layer_13B2 -chan_end - -.layer_13B2: -layer_portamento 0x81, 36, 255 -layer_note1 48, 0x6, 80 -layer_end - -.sound_general_explosion6: -chan_setbank 4 -chan_setinstr 15 -chan_setenvelope .envelope_33EC -chan_setlayer 0, .layer_13C8 -chan_setlayer 1, .layer_13D0 -chan_end - -.layer_13C8: -layer_portamento 0x81, 56, 255 -layer_note1 20, 0x78, 80 -layer_end - -.layer_13D0: -layer_note1 15, 0x78, 127 -layer_end - -.chan_13D4: -chan_setbank 4 -chan_setinstr 6 -chan_setlayer 0, .layer_13DC -chan_end - -.layer_13DC: -layer_portamento 0x81, 37, 255 -layer_note1 39, 0x8, 127 -layer_setinstr 5 -layer_portamento 0x81, 20, 255 -layer_note1 25, 0x60, 127 -layer_end - -.sound_general_boat_tilt1: -chan_setbank 4 -chan_setinstr 2 -chan_setlayer 0, .layer_13F5 -chan_end - -.layer_13F5: -layer_portamento 0x81, 12, 255 -layer_note1 13, 0x6e, 127 -layer_end - -.sound_general_boat_tilt2: -chan_setbank 4 -chan_setinstr 2 -chan_setlayer 0, .layer_1405 -chan_end - -.layer_1405: -layer_portamento 0x81, 15, 255 -layer_note1 11, 0x6e, 127 -layer_end - -.sound_general_coin_drop: -chan_setbank 9 -chan_setinstr 3 -chan_setval 40 -chan_call .set_reverb -#ifdef VERSION_SH - chan_setreverb 40 -#endif -chan_setlayer 0, .layer_141A -chan_end - -.layer_141A: -layer_transpose 24 -#ifdef VERSION_SH - layer_note1 51, 0xc, 90 -#endif -layer_note1 39, 0x4, 90 -layer_note1 51, 0xc, 90 -layer_note1 39, 0x4, 50 -layer_note1 51, 0xc, 50 -layer_end - -.chan_1429: -chan_setbank 9 -chan_setinstr 3 -chan_setval 40 -chan_call .set_reverb -chan_setlayer 0, .layer_1436 -chan_end - -.layer_1436: -layer_transpose 12 -layer_note1 39, 0x3, 90 -layer_note1 51, 0x3, 90 -layer_note1 27, 0xa, 115 -layer_note1 39, 0x3, 50 -layer_note1 51, 0x3, 50 -layer_note1 27, 0xa, 75 -layer_end - -.sound_general_pendulum_swing: -chan_setbank 4 -chan_setinstr 9 -chan_setval 50 -chan_call .set_reverb -chan_setlayer 0, .layer_1463 -chan_setval 13 -chan_call .delay -chan_setdecayrelease 30 -chan_setbank 4 -chan_setinstr 2 -chan_end - -.layer_1463: -layer_note1 33, 0xc, 100 -layer_note1 25, 0x28, 120 -layer_portamento 0x81, 22, 255 -layer_note1 15, 0x48, 80 -layer_end - -.sound_general_chain_chomp1: -chan_setbank 1 -chan_setinstr 1 -chan_setval 15 -chan_call .set_reverb -chan_setlayer 0, .layer_148A -chan_setval 1 -chan_call .delay -chan_setbank 1 -chan_setinstr 7 -chan_setenvelope .envelope_3368 -chan_end - -.layer_148A: -layer_note1 29, 0xc, 120 -layer_transpose 12 -layer_portamento 0x81, 51, 255 -layer_note1 53, 0x6, 118 -layer_portamento 0x81, 52, 255 -layer_note1 54, 0x9, 118 -layer_end - -.sound_general_chain_chomp2: -chan_setbank 7 -#ifdef VERSION_JP - chan_setinstr 8 -#else - chan_setinstr 14 -#endif -chan_setval 15 -chan_call .set_reverb -chan_setlayer 0, .layer_14C6 -chan_setlayer 1, .layer_14E3 -#ifndef VERSION_JP - chan_setlayer 2, .layer_14E3 -#endif -chan_setval 1 -chan_call .delay -chan_setenvelope .envelope_3368 -chan_setbank 1 -chan_setinstr 7 -chan_setval 13 -chan_call .delay -chan_setbank 7 -#ifdef VERSION_JP - chan_setinstr 8 -#else - chan_setinstr 14 -#endif -chan_end - -.layer_14C6: -layer_delay 1 -layer_transpose 12 -layer_portamento 0x81, 54, 255 -layer_note0 55, 0x6, 118, 127 -layer_portamento 0x81, 55, 255 -layer_note0 56, 0x5, 118, 127 -layer_portamento 0x81, 57, 255 -layer_note0 58, 0xc, 118, 127 -layer_end - -.layer_14E3: -layer_loop 2 -#ifdef VERSION_JP - layer_portamento 0x81, 36, 255 - layer_note1 24, 0x18, 127 -#else - layer_note1 34, 0x19, 100 -#endif -layer_loopend -layer_end - -.sound_general_door_turn_key: -chan_setbank 4 -chan_setinstr 9 -chan_setlayer 0, .layer_14F2 -chan_end - -.layer_14F2: -layer_note0 31, 0x12, 80, 80 -layer_portamento 0x82, 53, 255 -layer_note1 44, 0x7, 88 -layer_end - -.sound_general_moving_in_sand: -chan_setbank 3 -chan_setinstr 5 -chan_setenvelope .envelope_32D4 -chan_setval 10 -chan_call .set_reverb -chan_setlayer 0, .layer_150E -chan_end - -.layer_150E: -layer_note1 41, 0x4, 100 -layer_note0 34, 0x14, 100, 100 -layer_note1 29, 0x6, 115 -layer_end - -.chan_1519: -chan_setval 10 -chan_call .set_reverb -chan_setlayer 0, .layer_152B -chan_setlayer 1, .layer_1529 -chan_setbank 4 -chan_setinstr 1 -chan_end - -.layer_1529: -layer_transpose 1 - -.layer_152B: -layer_note1 15, 0x2c, 127 -layer_end - -.sound_general_moving_platform_switch: -chan_setbank 4 -chan_setinstr 9 -chan_setlayer 0, .layer_1539 -chan_end - -.layer_1537: -layer_transpose -3 - -.layer_1539: -layer_note1 39, 0x6, 120 -layer_portamento 0x81, 15, 255 -layer_note1 8, 0xc, 120 -layer_portamento 0x81, 27, 255 -layer_note1 3, 0x18, 120 -layer_end - -.sound_general_cage_open: -chan_setbank 4 -chan_setinstr 3 -chan_setval 30 -chan_call .set_reverb -chan_setlayer 0, .layer_1558 -chan_end - -.layer_1558: -layer_portamento 0x81, 19, 40 -layer_note1 22, 0xb4, 115 -layer_end - -.sound_general_quiet_pound1: -chan_setbank 5 -chan_setinstr 5 -chan_setenvelope .envelope_3344 -chan_setval 20 -chan_call .set_reverb -chan_setlayer 0, .layer_1571 -chan_end - -.layer_1571: -layer_note1 14, 0x34, 110 -layer_delay 0x14 -layer_end - -.sound_general_break_box: -chan_setbank 5 -chan_setinstr 7 -chan_setlayer 0, .layer_1582 -chan_setlayer 1, .layer_1582 -chan_end - -.layer_1582: -layer_somethingon -layer_portamento 0x85, 39, 255 -layer_note1 36, 0x14, 110 -layer_note1 38, 0x10, 110 -layer_note1 27, 0x64, 110 -layer_end - -.sound_general_door_insert_key: -chan_setbank 4 -chan_setinstr 9 -chan_setlayer 0, .layer_1599 -chan_end - -.layer_1599: -layer_note0 36, 0xa, 80, 80 -layer_note0 24, 0xa, 80, 80 -layer_end - -.sound_general_quiet_pound2: -chan_setbank 6 -chan_setinstr 15 -chan_setlayer 0, .layer_15AA -chan_end - -.layer_15AA: -layer_somethingon -layer_portamento 0x85, 35, 255 -layer_note1 34, 0x60, 127 -layer_note1 32, 0x60, 127 -layer_note1 32, 0x30, 127 -layer_end - -.sound_general_big_pound: -chan_setbank 6 -chan_setinstr 1 -chan_setval 55 -chan_call .set_reverb -chan_setlayer 0, .layer_15C6 -chan_end - -.layer_15C6: -layer_note1 32, 0xc, 127 -layer_note1 27, 0x30, 127 -layer_end - -.chan_15CD: -chan_setbank 6 -chan_setinstr 15 -chan_setlayer 0, .layer_15D5 -chan_end - -.layer_15D5: -layer_note1 31, 0xc0, 127 -layer_end - -.chan_15DA: -chan_setbank 7 -chan_setinstr 1 -chan_setlayer 0, .layer_15EB -chan_setval 1 -chan_call .delay -chan_setbank 5 -chan_setinstr 5 -chan_end - -.layer_15EB: -layer_note1 24, 0xc, 127 -layer_note1 22, 0x48, 127 -layer_end - -.sound_general_cannon_up: -chan_setbank 6 -chan_setinstr 10 -chan_setlayer 0, .layer_15FA -chan_end - -.layer_15FA: -layer_note1 44, 0xfa, 127 -layer_end - -.sound_general_grindel_spindel_roll: -chan_setbank 6 -chan_setinstr 1 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_160C -chan_end - -.layer_160C: -layer_note1 29, 0xc, 120 -layer_note1 24, 0x24, 120 -layer_end - -.sound_general_explosion7: -chan_setbank 3 -chan_setinstr 5 -chan_setenvelope .envelope_3358 -chan_setlayer 0, .layer_162D -chan_setlayer 1, .layer_1637 -chan_setval 1 -chan_call .delay -chan_setbank 4 -chan_setinstr 15 -chan_setenvelope .envelope_3358 -chan_end - -.layer_162D: -layer_delay 1 -layer_note1 36, 0xc, 127 -layer_note1 32, 0x96, 127 -layer_end - -.layer_1637: -layer_note1 24, 0x60, 127 -layer_end - -.sound_general_shake_coffin: -chan_setbank 6 -chan_setinstr 15 -chan_setenvelope .envelope_3304 -chan_setlayer 0, .layer_1646 -chan_end - -.layer_1646: -layer_note1 31, 0xa, 127 -layer_note1 43, 0x10, 127 -layer_end - -.sound_general_pyramid_top_spin: -chan_setbank 4 -chan_setinstr 15 -chan_setval 30 -chan_call .set_reverb -chan_setlayer 0, .layer_1660 -chan_setlayer 1, .layer_1669 -chan_setlayer 2, .layer_1665 -chan_end - -.layer_1660: -layer_note1 20, 0x226, 0 -layer_end - -.layer_1665: -layer_delay 0x4 -layer_transpose -12 - -.layer_1669: -layer_note1 27, 0x4f, 93 -layer_note1 28, 0x41, 99 -layer_note1 29, 0x36, 101 -layer_note1 30, 0x31, 109 -layer_note1 36, 0xe, 113 -layer_note1 38, 0x3b, 123 -layer_note1 32, 0x27, 105 -layer_note1 35, 0x60, 92 -layer_note1 32, 0xe, 100 -layer_note1 36, 0xb, 105 -layer_note1 39, 0x31, 116 -layer_end - -.sound_general_pyramid_top_explosion: -chan_setbank 4 -chan_setinstr 15 -chan_setval 30 -chan_call .set_reverb -chan_setenvelope .envelope_338C -chan_setlayer 0, .layer_16A1 -chan_setlayer 1, .layer_16AA -chan_setlayer 2, .layer_16A6 -chan_end - -.layer_16A1: -layer_note1 24, 0x12c, 127 -layer_end - -.layer_16A6: -layer_delay 0x4 -layer_transpose -12 - -.layer_16AA: -layer_note1 46, 0xe, 116 -layer_note1 44, 0xb, 121 -layer_note1 48, 0x12, 101 -layer_note1 41, 0xf, 109 -layer_note1 43, 0xfa, 113 -layer_end - -.sound_general_race_gun_shot: -chan_setbank 5 -chan_setinstr 0 -chan_setval 127 -chan_call .set_reverb -chan_setlayer 0, .layer_16CE -chan_setlayer 1, .layer_16CE -chan_setlayer 2, .layer_16D2 -chan_end - -.layer_16CE: -layer_note1 49, 0x3a, 127 -layer_end - -.layer_16D2: -layer_delay 0xa -layer_note1 48, 0x30, 85 -layer_end - -.sound_general_star_door_open: -chan_setbank 6 -chan_setinstr 10 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_16E3 -chan_end - -.layer_16E3: -layer_portamento 0x81, 51, 96 -layer_note1 58, 0x40, 100 -layer_end - -.sound_general_star_door_close: -chan_setbank 6 -chan_setinstr 10 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_16F6 -chan_end - -.layer_16F6: -layer_portamento 0x82, 51, 96 -layer_note1 58, 0x40, 100 -layer_end - -.sound_general_pound_rock: -chan_setbank 6 -chan_setinstr 1 -chan_setval 55 -chan_call .set_reverb -chan_setlayer 0, .layer_170B -chan_end - -.layer_170B: -layer_note1 27, 0x7, 127 -layer_note1 15, 0x12, 127 -layer_end - -.sound_general_star_appears: -chan_setbank 4 -chan_setinstr 14 -chan_setlayer 0, .layer_171A -chan_end - -.layer_171A: -layer_portamento 0x81, 43, 127 -layer_note1 31, 0x7f, 115 -layer_end - -.sound_general_collect_1up: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3358 -chan_setlayer 0, .layer_1734 -chan_setdecayrelease 50 -chan_setlayer 1, .layer_1732 -chan_end - -.layer_1732: -layer_delay 0x4 - -.layer_1734: -layer_transpose 24 -layer_note1 31, 0xc, 100 -layer_note1 34, 0xc, 100 -layer_note1 43, 0xc, 100 -layer_note1 39, 0xc, 100 -layer_note1 41, 0xc, 100 -layer_note1 46, 0x18, 100 -layer_end - -.sound_general_rotating_block_alert: -chan_setbank 4 -chan_setinstr 9 -chan_setlayer 0, .layer_1751 -chan_end - -.layer_1751: -layer_call .layer_fn_1756 -layer_transpose -4 - -.layer_fn_1756: -layer_note1 27, 0x5, 105 -layer_portamento 0x81, 15, 255 -layer_note1 8, 0xa, 100 -layer_end - -.sound_general_button_press: -chan_setbank 4 -chan_setinstr 9 -chan_setlayer 0, .layer_1769 -chan_end - -.layer_1769: -layer_note1 8, 0x5, 127 -layer_note1 18, 0x12, 127 -layer_end - -.sound_general_elevator_move: -chan_setbank 4 -chan_setinstr 9 -chan_setenvelope .envelope_33BC -chan_setlayer 0, .layer_177B -chan_end - -.layer_177B: -layer_portamento 0x82, 5, 255 -layer_note1 8, 0xa, 127 -layer_end - -.sound_general_swish_air: -chan_setbank 0 -chan_setinstr 0 -chan_setlayer 0, .layer_178B -chan_end - -.layer_178B: -layer_note1 44, 0x6, 100 -layer_portamento 0x81, 44, 255 -layer_note1 32, 0x12, 100 -layer_end - -.sound_general_haunted_chair: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3428 -chan_setlayer 0, .layer_17A1 -chan_end - -.layer_17A1: -layer_transpose 12 -layer_portamento 0x85, 62, 255 -layer_note1 38, 0x78, 93 -layer_end - -.sound_general_soft_landing: -chan_setbank 1 -chan_setinstr 1 -chan_setlayer 0, .layer_17B3 -chan_end - -.layer_17B3: -layer_note1 29, 0xc, 127 -layer_end - -.sound_general_haunted_chair_move: -chan_setbank 4 -chan_setinstr 1 -chan_setlayer 0, .layer_17C4 -chan_setlayer 1, .layer_17C2 -chan_end - -.layer_17C2: -layer_delay 1 - -.layer_17C4: -layer_note1 34, 0x6, 127 -layer_note1 33, 0x7, 127 -layer_note1 33, 0x6, 127 -layer_note1 34, 0x6, 127 -layer_end - -.sound_general_bowser_explode: -chan_setbank 6 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_17E8 -chan_setval 1 -chan_call .delay -chan_setenvelope .envelope_32D4 -chan_setlayer 1, .layer_17F3 -chan_setlayer 2, .layer_17EF -chan_end - -.layer_17E8: -layer_setinstr 10 -layer_transpose 24 -layer_jump .layer_17F5 - -.layer_17EF: -layer_delay 0x2 -layer_transpose 12 - -.layer_17F3: -layer_setinstr 0 -.layer_17F5: -layer_portamento 0x83, 3, 255 -layer_note1 15, 0x30, 100 -layer_note1 17, 0x2c, 100 -layer_note1 19, 0x28, 100 -layer_note1 20, 0x24, 100 -layer_note1 22, 0x20, 100 -layer_note1 24, 0x1c, 100 -layer_note1 26, 0x18, 100 -layer_note1 27, 0x14, 100 -layer_note1 29, 0x11, 100 -layer_note1 31, 0xe, 100 -layer_note1 32, 0xc, 100 -.layer_181A: -layer_note1 34, 0xa, 100 -layer_jump .layer_181A -layer_end - -.sound_general_bowser_key: -chan_setbank 4 -chan_setinstr 14 -chan_setlayer 0, .layer_171A -chan_setval 1 -chan_call .delay -chan_setbank 4 -chan_setinstr 15 -chan_setenvelope .envelope_33EC -chan_setlayer 1, .layer_137B -chan_setval 100 -chan_call .delay -chan_setbank 4 -chan_setinstr 14 -chan_setlayer 0, .layer_1844 -chan_end - -.layer_1844: -layer_transpose -6 -layer_portamento 0x81, 43, 127 -layer_note1 31, 0xfa, 115 -layer_end - -.sound_general_bowser_platform: -chan_setbank 4 -chan_setinstr 15 -chan_setlayer 0, .layer_185C -chan_setlayer 1, .layer_185A -chan_end - -.layer_185A: -layer_transpose 2 - -.layer_185C: -layer_note1 39, 0xc, 127 -layer_jump .layer_1350 - -.sound_general_1up_appear: -chan_setbank 4 -chan_setinstr 14 -chan_setlayer 0, .layer_186A -chan_end - -.layer_186A: -layer_portamento 0x83, 39, 128 -layer_note1 42, 0x2d, 115 -layer_note1 42, 0x2d, 115 -layer_note1 42, 0x2d, 115 -layer_note1 44, 0x7f, 115 -layer_end - -.sound_general_heart_spin: -chan_setbank 9 -chan_setinstr 3 -chan_setval 30 -chan_call .set_reverb -chan_setlayer 0, .layer_1888 -chan_end - -.layer_1888: -layer_transpose 12 -layer_portamento 0x83, 3, 255 -layer_note1 27, 0xa, 85 -layer_note1 32, 0xa, 85 -layer_note1 39, 0xa, 85 -layer_note1 44, 0xa, 85 -layer_note1 51, 0xa, 85 -layer_note1 56, 0xa, 85 -layer_note1 51, 0xa, 45 -layer_note1 56, 0xa, 35 -layer_end - -.sound_general_pound_wood_post: -chan_setbank 5 -chan_setinstr 7 -chan_setlayer 0, .layer_18B8 -chan_delay 1 -chan_setbank 4 -chan_setinstr 9 -chan_setlayer 1, .layer_1537 -chan_end - -.layer_18B8: -layer_portamento 0x1, 27, 0x28 -layer_note1 32, 0x32, 120 -layer_end - -.sound_general_water_level_trig: -chan_setbank 6 -chan_setinstr 11 -chan_setlayer 0, .layer_2DBF -chan_setval 9 -chan_call .delay -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3454 -chan_setlayer 0, .layer_2D26 -chan_end - -.sound_general_switch_door_open: -chan_setbank 4 -chan_setinstr 9 -chan_setlayer 0, .layer_1539 -chan_setval 12 -chan_call .delay -chan_setbank 6 -chan_setinstr 1 -chan_setlayer 0, .layer_18EB -chan_end - -.layer_18EB: -layer_portamento 0x82, 15, 255 -layer_note1 31, 0x14, 127 -layer_end - -.sound_general_red_coin: -#ifdef VERSION_JP - chan_setbank 9 - chan_setinstr 3 - chan_setlayer 0, .layer_1909 - chan_setlayer 1, .layer_1902 - chan_setlayer 2, .layer_1907 -#else - #if defined(VERSION_EU) || defined(VERSION_SH) - chan_setbank 9 - chan_setinstr 3 - #else - chan_setinstr 128 - #endif - chan_setenvelope .envelope_3378 - // Small bugfix: .main_loop_023589 expects layer 0 to live the longest. - // I don't think this actually makes any audible difference given the - // silence at the end. - chan_setlayer 0, .layer_1907 - chan_setlayer 1, .layer_1902 - chan_setlayer 2, .layer_1909 -#endif -chan_end - -.layer_1902: -layer_transpose 7 -layer_jump .layer_190B - -.layer_1907: -layer_delay 0x6 - -.layer_1909: -layer_transpose 12 -.layer_190B: -layer_note0 46, 0xc, 90, 20 -layer_note0 45, 0xc, 90, 20 -layer_note0 46, 0xc, 90, 20 -layer_note0 58, 0x10, 100, 80 -layer_note0 58, 0x10, 60, 80 -layer_note0 58, 0x10, 40, 80 -layer_note0 58, 0x10, 25, 80 -// This small delay should not have any effect, but decreases the probability of -// encountering double red coin glitch. Without it, layer 0 finishes in 1.04 -// seconds, and with some bad luck around scheduling/lag the sound spawner with -// a lifetime of 30 frames that creates the sound may deactivate on the same -// frame. That leads to double sound glitch on JP, see src/audio/external.c. -// With the delay, the same thing can still happen but requires more CPU lag. -layer_delay 0xa -layer_end - -.sound_general_birds_fly_away: -chan_setbank 5 -chan_setinstr 13 -chan_setenvelope .envelope_33DC -chan_setval 20 -chan_call .set_reverb -chan_setval 127 -chan_iowriteval 7 -chan_setlayer 0, .layer_195F -chan_setlayer 1, .layer_1986 -chan_setlayer 2, .layer_1982 -.chan_1942: -chan_setval 4 -chan_call .delay -chan_ioreadval 7 -chan_subtract 1 -chan_beqz .chan_1957 -chan_iowriteval 7 -chan_writeseq_nextinstr 0, 1 -chan_setvolscale 127 -chan_jump .chan_1942 -.chan_1957: -chan_setval 127 -chan_call .delay -chan_jump .chan_1957 - -.layer_195F: -layer_setinstr 9 -layer_note1 40, 0x6, 122 -layer_note1 41, 0x4, 112 -layer_note1 43, 0x5, 109 -layer_note1 44, 0x6, 124 -layer_note1 44, 0x4, 116 -layer_note1 45, 0x7, 114 -layer_delay 0x19 -.layer_1975: -layer_note1 43, 0x7f, 122 -layer_note1 43, 0xa, 127 -layer_note1 43, 0x64, 114 -layer_jump .layer_1975 -layer_end - -.layer_1982: -layer_transpose 4 -layer_delay 0x2 - -.layer_1986: -layer_portamento 0x83, 39, 255 -layer_loop 2 -layer_note1 55, 0x6, 120 -layer_note1 60, 0x9, 112 -layer_delay 0x4 -layer_loopend -layer_note1 56, 0x5, 125 -layer_note1 62, 0xa, 109 -layer_delay 0x5 -layer_note1 56, 0x6, 123 -layer_note1 62, 0x7, 119 -layer_delay 0x8 -.layer_19A5: -layer_loop 10 -layer_note1 57, 0x5, 120 -layer_note1 62, 0x8, 120 -layer_delay 0x5 -layer_loopend -layer_loop 10 -layer_note1 59, 0x7, 115 -layer_note1 60, 0x7, 113 -layer_delay 0x2 -layer_loopend -layer_loop 10 -layer_note1 55, 0x8, 115 -layer_note1 58, 0x6, 113 -layer_delay 0x5 -layer_loopend -layer_jump .layer_19A5 -layer_end - -.sound_general_right_answer: -chan_setbank 9 -chan_setinstr 3 -chan_setval 40 -chan_call .set_reverb -chan_setenvelope .envelope_3344 -chan_setlayer 0, .layer_19DA -chan_end - -.layer_19DA: -layer_loop 2 -layer_note1 62, 0x6, 110 -layer_note1 62, 0x2, 45 -layer_note1 58, 0x6, 110 -layer_note1 58, 0x2, 45 -layer_loopend -layer_end - -.sound_general_metal_pound: -chan_setbank 7 -chan_setinstr 1 -chan_setlayer 0, .layer_1A00 -chan_setlayer 1, .layer_19FE -chan_setval 1 -chan_call .delay -chan_setbank 5 -chan_setinstr 5 -chan_end - -.layer_19FE: -layer_transpose -6 - -.layer_1A00: -layer_note1 15, 0xc, 127 -layer_note1 17, 0x3a, 127 -layer_end - -.sound_general_boing1: -chan_setbank 5 -chan_setinstr 14 -chan_setlayer 0, .layer_1A0F -chan_end - -.layer_1A0F: -layer_portamento 0x82, 40, 127 -layer_note1 38, 0x28, 100 -layer_end - -.sound_general_boing2: -chan_setbank 5 -chan_setinstr 14 -chan_setlayer 0, .layer_1A1F -chan_end - -.layer_1A1F: -layer_portamento 0x82, 43, 127 -layer_note1 39, 0x36, 100 -layer_end - -.sound_general_yoshi_walk: -chan_jump .sound_obj_koopa_the_quick_walk - -.sound_general_enemy_alert1: -chan_jump .sound_obj_goomba_alert - -.sound_general_yoshi_talk: -chan_setbank 0 -chan_setinstr 3 -chan_setlayer 0, .layer_1A35 -chan_end - -.layer_1A35: -layer_note1 39, 0x32, 127 -layer_end - -.sound_general_splattering: -chan_setbank 6 -chan_setinstr 2 -chan_setlayer 0, .layer_1A44 -chan_setlayer 1, .layer_1A44 -chan_end - -.layer_1A44: -layer_transpose 7 -layer_call .layer_fn_1A4B -layer_transpose -2 - -.layer_fn_1A4B: -layer_portamento 0x83, 31, 255 -layer_note1 51, 0x6, 127 -layer_note1 56, 0xc, 127 -layer_end - -.sound_general_boing3: -chan_setbank 9 -chan_setinstr 6 -chan_setval 10 -chan_call .set_reverb -chan_setlayer 0, .layer_1A66 -chan_setlayer 1, .layer_1A66 -chan_end - -.layer_1A66: -layer_portamento 0x82, 39, 255 -layer_note1 31, 0x60, 100 -layer_end - -.sound_general_grand_star: -chan_setbank 4 -chan_setinstr 14 -chan_setlayer 0, .layer_1A79 -chan_setlayer 1, .layer_1A7D -chan_end - -.layer_1A79: -layer_transpose 3 -layer_delay 0x5 - -.layer_1A7D: -layer_somethingon -layer_portamento 0x85, 31, 255 -layer_note1 34, 0x12c, 127 -layer_end - -.sound_general_grand_star_jump: -chan_setbank 4 -chan_setinstr 14 -chan_setenvelope .envelope_3358 -chan_setlayer 0, .layer_1AA0 -chan_setval 1 -chan_call .delay -chan_setenvelope .envelope_3358 -chan_setlayer 1, .layer_1AAA -chan_setlayer 2, .layer_1AA8 -chan_end - -.layer_1AA0: -layer_portamento 0x81, 32, 64 -layer_note1 38, 0x46, 127 -layer_end - -.layer_1AA8: -layer_delay 0x4 - -.layer_1AAA: -layer_delay 0x4 -layer_portamento 0x81, 36, 40 -layer_note1 41, 0xc, 127 -layer_end - -#ifdef VERSION_JP - .sound_general_boat_rock: - chan_setbank 9 - chan_setinstr 0 - chan_setenvelope .envelope_3438 - chan_setvibratorate 25 - chan_setvibratoextent 110 - chan_setlayer 0, .layer_1943_jp - chan_setval 40 - chan_call .delay - chan_end - - .layer_1943_jp: - layer_portamento 0x1, 32, 0x7f - layer_note1 60, 0x28, 100 - layer_end -#else - .sound_general_boat_rock: - chan_setbank 4 - chan_setinstr 2 - chan_setlayer 0, .layer_1AC1 - chan_setlayer 1, .layer_1ABF - chan_end - - .layer_1ABF: - layer_transpose 12 - - .layer_1AC1: - layer_portamento 0x81, 7, 255 - layer_note1 15, 0x3c, 127 - layer_portamento 0x81, 20, 200 - layer_note1 7, 0x5a, 127 - layer_end - - .sound_general_vanish_sfx: - chan_setbank 9 - chan_setinstr 3 - chan_setvibratoextent 70 - chan_setvibratorate 70 - chan_setenvelope .envelope_32E4 - chan_setlayer 0, .layer_1AEB - chan_setlayer 1, .layer_1AE9 - chan_setval 35 - chan_call .delay - chan_setvibratoextent 0 - chan_end - - .layer_1AE9: - layer_transpose 1 - - .layer_1AEB: - layer_portamento 0x81, 19, 255 - layer_note1 31, 0x32, 115 - layer_end -#endif - -.channel4_table: -sound_ref .sound_env_waterfall1 -sound_ref .sound_env_waterfall1 -sound_ref .sound_env_elevator1 -sound_ref .sound_env_droning1 -sound_ref .sound_env_droning1 -sound_ref .sound_env_wind1 -sound_ref .sound_env_moving_sand_snow -sound_ref .chan_1BE5 -sound_ref .sound_env_elevator2 -sound_ref .sound_env_water -sound_ref .chan_1C46 -sound_ref .sound_env_boat_rocking1 -sound_ref .sound_env_elevator3 -sound_ref .sound_env_elevator4 -sound_ref .sound_env_movingsand -sound_ref .sound_env_merry_go_round_creaking -sound_ref .sound_env_wind2 -sound_ref .sound_air_rough_slide -sound_ref .chan_1D42 -sound_ref .sound_env_sliding -sound_ref .sound_env_star -sound_ref .chan_1D81 -sound_ref .sound_env_water_drain -sound_ref .sound_env_metal_box_push -sound_ref .sound_env_sink_quicksand -sound_ref .sound_air_peach_twinkle -sound_ref .sound_env_elevator1 -sound_ref .sound_env_droning1 -sound_ref .sound_env_waterfall1 -sound_ref .sound_env_waterfall1 -sound_ref .sound_env_waterfall1 -sound_ref .sound_env_waterfall1 -sound_ref .sound_menu_enter_hole -sound_ref .sound_general_elevator_move -sound_ref .sound_env_elevator1 -sound_ref .sound_env_droning1 -sound_ref .sound_env_waterfall1 -sound_ref .sound_env_waterfall1 -sound_ref .sound_env_waterfall1 -sound_ref .sound_env_waterfall1 - -.sound_env_waterfall1: -chan_setbank 5 -chan_setinstr 1 -chan_setval 25 -chan_call .set_reverb -#ifdef VERSION_JP - chan_setenvelope .envelope_32E4 -#else - chan_setenvelope .envelope_32C4 -#endif -chan_setlayer 0, .layer_1B53 -chan_end - -.layer_1B53: -layer_somethingon -#ifdef VERSION_JP - layer_delay 0x6 -#else - layer_delay 0x4 -#endif -.layer_1B56: -layer_note1 41, 0x12c, 95 -layer_jump .layer_1B56 - -.sound_env_elevator1: -chan_setbank 5 -chan_setinstr 2 -chan_setlayer 0, .layer_1B65 -chan_end - -.layer_1B65: -layer_somethingon -.layer_1B66: -layer_note1 39, 0x12c, 90 -layer_jump .layer_1B66 - -.sound_env_droning1: -chan_setbank 5 -chan_setinstr 3 -chan_setlayer 0, .layer_1B75 -chan_end - -.layer_1B75: -layer_somethingon -.layer_1B76: -layer_note1 44, 0x12c, 105 -layer_jump .layer_1B76 - -.sound_env_wind1: -chan_setbank 5 -chan_setinstr 6 -chan_setdecayrelease 13 -chan_setlayer 0, .layer_1B8A -chan_setlayer 1, .layer_1B8C -chan_end - -.layer_1B8A: -layer_transpose -12 - -.layer_1B8C: -layer_somethingon -layer_portamento 0x85, 39, 255 -.layer_1B91: -layer_note1 44, 0x18, 110 -layer_note1 38, 0x3c, 110 -layer_note1 47, 0xa, 110 -layer_note1 49, 0x32, 110 -layer_note1 40, 0x4b, 110 -layer_note1 37, 0x14, 110 -layer_note1 46, 0xc, 110 -layer_note1 48, 0x1f, 110 -layer_note1 55, 0x18, 110 -layer_note1 46, 0x40, 110 -layer_note1 36, 0xc, 110 -layer_note1 39, 0xa, 110 -layer_note1 36, 0xe, 110 -layer_note1 39, 0xc, 110 -layer_note1 32, 0x54, 110 -layer_note1 39, 0xa, 110 -layer_note1 36, 0x2b, 110 -layer_note1 41, 0x60, 110 -layer_note1 39, 0x22, 110 -layer_jump .layer_1B91 - -.sound_env_moving_sand_snow: -chan_setbank 3 -chan_setinstr 2 -chan_setlayer 0, .layer_1BD5 -chan_end - -.layer_1BD5: -layer_somethingon -layer_portamento 0x85, 36, 255 -.layer_1BDA: -layer_note1 34, 0x12c, 95 -layer_note1 36, 0x12c, 95 -layer_jump .layer_1BDA - -.chan_1BE5: -chan_setbank 6 -chan_setinstr 15 -chan_setlayer 0, .layer_1BED -chan_end - -.layer_1BED: -layer_somethingon -layer_note1 43, 0xc, 127 -layer_portamento 0x81, 44, 255 -layer_note1 43, 0x50, 127 -.layer_1BF8: -layer_note1 43, 0x12c, 127 -layer_jump .layer_1BF8 - -.sound_env_elevator2: -chan_setbank 5 -chan_setinstr 2 -chan_setlayer 0, .layer_1C07 -chan_end - -.layer_1C07: -layer_somethingon -.layer_1C08: -layer_note1 27, 0x12c, 100 -layer_jump .layer_1C08 - -.sound_env_water: -chan_setbank 4 -chan_setinstr 5 -chan_setenvelope .envelope_32E4 -chan_setdecayrelease 25 -chan_setlayer 0, .layer_1C1C -chan_end - -.layer_1C1C: -layer_transpose 6 -layer_portamento 0x85, 39, 255 -.layer_1C22: -layer_note1 39, 0x18, 127 -layer_note1 31, 0x36, 127 -layer_note1 43, 0xc, 127 -layer_note1 36, 0x32, 127 -layer_note1 27, 0x50, 127 -layer_note1 36, 0x37, 127 -layer_note1 34, 0x40, 127 -layer_note1 32, 0x3d, 127 -layer_note1 29, 0x4a, 127 -layer_note1 32, 0x31, 127 -layer_note1 38, 0x1f, 127 -layer_jump .layer_1C22 - -.chan_1C46: -chan_setbank 6 -chan_setinstr 15 -chan_setlayer 0, .layer_1C4E -chan_end - -.layer_1C4E: -layer_somethingon -layer_portamento 0x85, 39, 255 -layer_note1 42, 0x3c, 127 -.layer_1C56: -layer_note1 41, 0x3c, 127 -layer_note1 42, 0x3c, 127 -layer_jump .layer_1C56 - -.sound_env_boat_rocking1: -chan_setbank 4 -chan_setinstr 2 -chan_setdecayrelease 30 -chan_setlayer 0, .layer_1C69 -chan_end - -.layer_1C69: -layer_portamento 0x81, 15, 255 -#ifdef VERSION_JP - layer_note1 11, 0x1f4, 100 -#else - layer_note1 11, 0x1f4, 127 -#endif -layer_end - -.sound_env_elevator3: -chan_setbank 5 -chan_setinstr 5 -chan_setenvelope .envelope_3368 -chan_setval 45 -chan_call .set_reverb -chan_setlayer 0, .layer_1C82 -chan_end - -.layer_1C82: -layer_call .layer_fn_1CA3 -layer_delay 0xb -layer_call .layer_fn_1CA3 -layer_delay 0x9 -layer_call .layer_fn_1CA3 -layer_delay 0x8 -layer_call .layer_fn_1CA3 -layer_delay 0x6 -layer_call .layer_fn_1CA3 -layer_delay 0x5 -.layer_1C9B: -layer_call .layer_fn_1CA3 -layer_delay 0x3 -layer_jump .layer_1C9B - -.layer_fn_1CA3: -layer_transpose 0 -layer_setinstr 4 -layer_note1 22, 0x6, 127 -layer_transpose 36 -layer_setinstr 5 -layer_somethingon -layer_portamento 0x85, 51, 255 -layer_note1 41, 0x5, 77 -layer_delay 0x4 -layer_disableportamento -layer_somethingoff -layer_end - -.sound_env_elevator4: -chan_setbank 4 -chan_setinstr 2 -chan_setlayer 0, .layer_1CC3 -chan_end - -.layer_1CC3: -layer_portamento 0x81, 19, 10 -layer_note1 8, 0x9, 127 -layer_jump .layer_1CC3 - -.sound_env_movingsand: -chan_setbank 3 -chan_setinstr 7 -chan_setdecayrelease 5 -chan_setlayer 0, .layer_1CE2 -chan_setlayer 1, .layer_1CDA -chan_end - -.layer_1CDA: -layer_somethingon -.layer_1CDB: -layer_note1 47, 0x1f4, 90 -layer_jump .layer_1CDB - -.layer_1CE2: -layer_somethingon -.layer_1CE3: -layer_note1 46, 0x1f4, 90 -layer_jump .layer_1CE3 - -.sound_env_merry_go_round_creaking: -chan_setbank 4 -chan_setinstr 2 -chan_setdecayrelease 30 -chan_setlayer 0, .layer_1CF9 -chan_setlayer 1, .layer_1CF7 -chan_end - -.layer_1CF7: -layer_transpose 6 - -.layer_1CF9: -layer_portamento 0x85, 7, 255 -layer_note1_long 13, 0x46, 120 -layer_jump .layer_1CF9 - -.sound_env_wind2: -chan_setbank 5 -chan_setinstr 6 -chan_setdecayrelease 13 -chan_setlayer 0, .layer_1D11 -chan_setlayer 1, .layer_1D13 -chan_end - -.layer_1D11: -layer_transpose -6 - -.layer_1D13: -layer_somethingon -layer_portamento 0x85, 34, 255 -.layer_1D18: -layer_note1 51, 0x18, 110 -layer_note1 43, 0x63, 110 -layer_note1 47, 0xa, 110 -layer_note1 49, 0x32, 110 -layer_note1 41, 0x4b, 110 -layer_note1 46, 0xc, 110 -layer_note1 48, 0x1f, 110 -layer_note1 55, 0x7f, 110 -layer_note1 46, 0x63, 110 -layer_note1 43, 0xa, 110 -layer_note1 39, 0xc, 110 -layer_note1 41, 0x60, 110 -layer_note1 39, 0x22, 110 -layer_jump .layer_1D18 - -.chan_1D42: -chan_setbank 4 -chan_setinstr 2 -chan_setbank 6 -chan_setenvelope .envelope_3314 -chan_setdecayrelease 200 -chan_setlayer 0, .layer_1D51 -chan_end - -.layer_1D51: -layer_transpose 3 -.layer_1D53: -layer_note0 62, 0x2, 127, 127 -layer_jump .layer_1D53 - -.sound_env_sliding: -chan_setbank 3 -chan_setinstr 1 -chan_setenvelope .envelope_32E4 -chan_setdecayrelease 15 -chan_setlayer 0, .layer_1D67 -chan_end - -.layer_1D67: -layer_somethingon -.layer_1D68: -layer_note1 44, 0x12c, 95 -layer_jump .layer_1D68 - -.sound_env_star: -chan_setbank 4 -chan_setinstr 14 -chan_setlayer 0, .layer_1D77 -chan_end - -.layer_1D77: -layer_portamento 0x81, 38, 127 -layer_note1 39, 0x9, 127 -layer_jump .layer_1D77 - -.chan_1D81: -chan_setval 50 -chan_call .set_reverb -chan_setbank 4 -chan_setinstr 15 -chan_setlayer 0, .layer_1DA5 -chan_setval 1 -chan_call .delay -chan_setbank 6 -chan_setinstr 15 -chan_setlayer 1, .layer_1DAD -chan_setval 1 -chan_call .delay -chan_setbank 4 -chan_setinstr 15 -chan_setdecayrelease 10 -chan_end - -.layer_1DA5: -layer_note1 21, 0xc, 127 -layer_note1 18, 0x226, 127 -layer_end - -.layer_1DAD: -layer_transpose 24 -layer_portamento 0x82, 19, 255 -layer_note1 20, 0x1f4, 127 -layer_end - -.sound_env_water_drain: -chan_setbank 3 -chan_setinstr 2 -chan_setenvelope .envelope_32E4 -chan_setlayer 0, .layer_1DD4 -chan_setval 1 -chan_call .delay -chan_setbank 4 -chan_setinstr 5 -chan_setdecayrelease 20 -chan_setlayer 1, .layer_1DE4 -chan_setlayer 2, .layer_1DE2 -chan_end - -.layer_1DD4: -layer_transpose -12 -layer_somethingon -layer_portamento 0x82, 39, 255 -.layer_1DDB: -layer_note1 46, 0x2710, 80 -layer_jump .layer_1DDB - -.layer_1DE2: -layer_transpose 6 - -.layer_1DE4: -layer_portamento 0x83, 20, 255 -layer_note1 15, 0x5a, 127 -layer_note1 32, 0x2d, 127 -layer_note1 29, 0x46, 127 -layer_note1 24, 0x78, 127 -layer_note1 32, 0x44, 127 -layer_note1 24, 0x74, 127 -layer_transpose 7 -layer_jump .layer_1DE4 - -.sound_env_metal_box_push: -chan_setbank 6 -chan_setinstr 1 -chan_setlayer 0, .layer_1E0C -chan_setlayer 1, .layer_1E12 -chan_setdecayrelease 127 -chan_end - -.layer_1E0C: -layer_note1 24, 0xc, 85 -layer_jump .layer_1E0C - -.layer_1E12: -layer_setinstr 15 -.layer_1E14: -layer_note1 39, 0x10, 115 -layer_jump .layer_1E14 - -.sound_env_sink_quicksand: -chan_setbank 3 -chan_setinstr 6 -chan_setenvelope .envelope_32E4 -chan_setlayer 0, .layer_1E28 -chan_setlayer 1, .layer_1E28 -chan_end - -.layer_1E28: -layer_portamento 0x81, 38, 80 -layer_somethingon -.layer_1E2D: -layer_note1 35, 0x12c, 100 -layer_jump .layer_1E2D -layer_end - -.sound_air_peach_twinkle: -chan_setbank 5 -chan_setinstr 15 -chan_setenvelope .envelope_32E4 -chan_setdecayrelease 8 -chan_setlayer 0, .layer_1E42 -chan_end - -.layer_1E42: -layer_somethingon -layer_portamento 0x82, 20, 255 -.layer_1E47: -layer_note1 43, 0x1b58, 63 -layer_jump .layer_1E47 - -.channel59_table: -sound_ref .sound_obj_sushi_shark_water_sound -sound_ref .sound_obj_mri_shoot -sound_ref .sound_obj_baby_penguin_walk -sound_ref .sound_obj_bowser_walk -sound_ref .sound_obj_bowser_roar -sound_ref .sound_obj_bowser_tail_pickup -sound_ref .sound_obj_bowser_defeated -sound_ref .sound_obj_bowser_spinning -sound_ref .sound_obj_bowser_inhaling -sound_ref .sound_obj_big_penguin_walk -sound_ref .sound_obj_boo_bounce_top -sound_ref .sound_obj_boo_laugh_short -sound_ref .sound_obj_thwomp -sound_ref .sound_obj_cannon1 -sound_ref .sound_obj_cannon2 -sound_ref .sound_obj_cannon3 -sound_ref .sound_obj_piranha_plant_bite -sound_ref .sound_obj_piranha_plant_dying -sound_ref .sound_obj_jump_walk_water -sound_ref .chan_20B2 -sound_ref .sound_obj_mri_death -sound_ref .sound_obj_pounding1 -sound_ref .sound_obj_king_bobomb -sound_ref .sound_obj_bully_metal -sound_ref .sound_obj_bully_explode -sound_ref .sound_obj_bowser_puzzle_piece_move -sound_ref .sound_obj_pounding_cannon -sound_ref .sound_obj_bully_walk -sound_ref .sound_obj_bully_attacked -sound_ref .chan_2177 -sound_ref .chan_218E -sound_ref .sound_obj_baby_penguin_dive -sound_ref .sound_obj_goomba_walk -sound_ref .sound_obj_ukiki_chatter_long -sound_ref .sound_obj_monty_mole_lakitu_attack -sound_ref .chan_21FF -sound_ref .sound_obj_dying_enemy1 -sound_ref .sound_obj_cannon4 -sound_ref .sound_obj_dying_enemy2 -sound_ref .sound_obj_bobomb_walk -sound_ref .sound_obj_something_landing -sound_ref .sound_obj_diving_in_water -sound_ref .sound_obj_snow_sand1 -sound_ref .sound_obj_snow_sand2 -sound_ref .sound_obj_default_death -sound_ref .sound_obj_big_penguin_yell -sound_ref .sound_obj_water_bomb_bouncing -sound_ref .sound_obj_goomba_alert -sound_ref .sound_obj_stomped -sound_ref .chan_233D -sound_ref .sound_obj_diving_into_water -sound_ref .sound_obj_piranha_plant_shrink -sound_ref .sound_obj_koopa_the_quick_walk -sound_ref .sound_obj_koopa_walk -sound_ref .sound_obj_bully_walking -sound_ref .sound_obj_dorrie -sound_ref .sound_obj_bowser_laugh -sound_ref .sound_obj_ukiki_chatter_short -sound_ref .sound_obj_ukiki_chatter_idle -sound_ref .sound_obj_ukiki_step_default -sound_ref .sound_obj_ukiki_step_leaves -sound_ref .sound_obj_koopa_talk -sound_ref .sound_obj_koopa_damage -sound_ref .sound_obj_klepto1 -sound_ref .sound_obj_klepto2 -sound_ref .sound_obj_king_bobomb_talk -sound_ref .sound_obj_king_bobomb_damage -sound_ref .sound_obj_scuttlebug_walk -sound_ref .sound_obj_scuttlebug_alert -sound_ref .sound_obj_baby_penguin_yell -sound_ref .sound_obj_king_bobomb_jump -sound_ref .sound_obj_king_whomp_death -sound_ref .sound_obj_boo_laugh_long -sound_ref .sound_obj_swoop -sound_ref .sound_obj_eel -sound_ref .sound_obj_eyerok_show_eye -sound_ref .sound_obj_mr_blizzard_alert -sound_ref .sound_obj_snufit_shoot -sound_ref .sound_obj_skeeter_walk -sound_ref .sound_obj_walking_water -sound_ref .sound_general_bird_chirp2 -sound_ref .sound_obj_bird_chirp3 -sound_ref .sound_obj_bird_chirp1 -sound_ref .sound_air_castle_outdoors_ambient -sound_ref .sound_obj_piranha_plant_appear -sound_ref .sound_obj_flame_blown -sound_ref .sound_obj_mad_piano_chomping -sound_ref .sound_obj_large_bully_attacked -sound_ref .sound_obj_bobomb_buddy_talk -sound_ref .chan_26A9 -sound_ref .sound_obj_eyerok_sound_short -sound_ref .sound_obj_eyerok_sound_long -sound_ref .sound_obj_wiggler_high_pitch -sound_ref .sound_obj_heaveho_tossed -sound_ref .sound_obj_wiggler_death -sound_ref .sound_obj_bowser_intro_laugh -sound_ref .sound_obj_enemy_death_high -sound_ref .sound_obj_enemy_death_low -sound_ref .sound_obj_swoop_death -sound_ref .sound_obj_koopa_flyguy_pokey_death -sound_ref .sound_obj_snowman_bounce -sound_ref .sound_obj_snowman_explode -sound_ref .sound_obj_bowser_teleport -sound_ref .sound_obj_monty_mole_appear -sound_ref .sound_obj_pounding_loud -sound_ref .sound_obj_boss_dialog_grunt -sound_ref .sound_obj_mips_rabbit -sound_ref .sound_obj_mri_spinning -sound_ref .sound_obj_mips_rabbit_water -sound_ref .sound_obj_eyerok_explode -sound_ref .sound_obj_chuckya_death -sound_ref .sound_obj_wiggler_talk -sound_ref .sound_obj_wiggler_attacked -sound_ref .sound_obj_wiggler_low_pitch -sound_ref .sound_obj_snufit_skeeter_death -sound_ref .sound_obj_bubba_chomp -sound_ref .sound_obj_enemy_defeat_shrink -sound_ref .sound_obj_bowser_tail_pickup -sound_ref .sound_obj_bowser_defeated -sound_ref .sound_obj_bowser_spinning -sound_ref .sound_obj_klepto2 -sound_ref .sound_obj_king_bobomb_talk -sound_ref .sound_obj_baby_penguin_walk -sound_ref .sound_obj_bowser_walk -sound_ref .sound_obj_bowser_roar -sound_ref .sound_obj_bowser_tail_pickup -sound_ref .sound_obj_bowser_defeated -sound_ref .sound_obj_bowser_spinning - -.sound_general_swish_water: -chan_setbank 6 -chan_setinstr 5 -chan_setlayer 0, .layer_1F56 -chan_end - -.layer_1F56: -layer_note1 27, 0x8, 90 -layer_portamento 0x81, 43, 255 -layer_note1 27, 0x21, 90 -layer_end - -.sound_obj_mri_shoot: -chan_setbank 7 -chan_setinstr 3 -chan_setlayer 0, .layer_1F72 -chan_setval 1 -chan_call .delay -chan_setbank 6 -chan_setinstr 0 -chan_end - -.layer_1F72: -layer_note1 43, 0xf, 90 -layer_portamento 0x82, 27, 255 -layer_note1 36, 0xb, 90 -layer_end - -.sound_obj_baby_penguin_walk: -chan_setbank 6 -chan_setinstr 7 -chan_setlayer 0, .layer_1F85 -chan_end - -.layer_1F85: -layer_portamento 0x81, 43, 255 -layer_note1 48, 0x30, 110 -layer_end - -.sound_obj_bowser_walk: -chan_setbank 6 -chan_setinstr 1 -chan_setval 60 -chan_call .set_reverb -chan_setlayer 0, .layer_1F9D -chan_setlayer 1, .layer_1FA6 -chan_end - -.layer_1F9D: -layer_note1 36, 0x8, 120 -layer_note1 35, 0x28, 120 -layer_delay 0x30 -layer_end - -.layer_1FA6: -layer_delay 0x18 -layer_note1 0, 0x1e, 95 -layer_end - -.sound_obj_bowser_roar: -chan_setbank 6 -chan_setinstr 2 -chan_setval 10 -chan_call .set_reverb -chan_setlayer 0, .layer_1FC0 -chan_setlayer 1, .layer_1FBC -chan_end - -.layer_1FBC: -layer_delay 0x3 -layer_transpose 5 - -.layer_1FC0: -layer_note1 39, 0x7f, 127 -layer_end - -.sound_obj_bowser_tail_pickup: -chan_setbank 6 -chan_setinstr 2 -chan_setval 10 -chan_call .set_reverb -chan_setlayer 0, .layer_1FD8 -chan_setlayer 1, .layer_1FD4 -chan_end - -.layer_1FD4: -layer_delay 0x3 -layer_transpose 5 - -.layer_1FD8: -layer_portamento 0x81, 45, 255 -layer_note1 33, 0x30, 127 -layer_end - -.sound_obj_bowser_defeated: -chan_setbank 6 -chan_setinstr 4 -chan_setval 10 -chan_call .set_reverb -chan_setlayer 0, .layer_1FED -chan_end - -.layer_1FED: -layer_note1 32, 0x104, 127 -layer_end - -.sound_obj_bowser_spinning: -chan_setbank 6 -chan_setinstr 5 -chan_setlayer 0, .layer_1FFA -chan_end - -.layer_1FFA: -layer_note1 32, 0x28, 127 -layer_end - -.sound_obj_bowser_inhaling: -chan_setbank 6 -chan_setinstr 6 -chan_setlayer 0, .layer_2006 -chan_end - -.layer_2006: -layer_note1 36, 0x5a, 127 -layer_end - -.sound_obj_big_penguin_walk: -chan_setbank 6 -chan_setinstr 7 -chan_setlayer 0, .layer_2012 -chan_end - -.layer_2012: -layer_portamento 0x81, 39, 255 -layer_note1 36, 0x26, 100 -layer_end - -.sound_obj_boo_bounce_top: -chan_setbank 6 -chan_setinstr 8 -chan_setlayer 0, .layer_2022 -chan_end - -.layer_2022: -layer_note1 39, 0x18, 127 -layer_end - -.sound_obj_boo_laugh_short: -chan_setbank 6 -chan_setinstr 9 -chan_setlayer 0, .layer_202E -chan_end - -.layer_202E: -layer_note1 50, 0xa, 127 -layer_note1 55, 0xa, 127 -layer_end - -.sound_obj_thwomp: -chan_setbank 7 -chan_setinstr 12 -chan_setval 55 -chan_call .set_reverb -chan_setlayer 0, .layer_2055 -chan_setval 1 -chan_call .delay -chan_setbank 6 -chan_setinstr 1 -chan_setlayer 1, .layer_204E -chan_end - -.layer_204E: -layer_note1 37, 0xc, 127 -layer_note1 31, 0x1e, 127 -layer_end - -.layer_2055: -layer_note1 31, 0x2a, 127 -layer_end - -.sound_obj_cannon1: -chan_setbank 6 -chan_setinstr 10 -chan_setlayer 0, .layer_2061 -chan_end - -.layer_2061: -layer_note1 39, 0xd2, 127 -layer_end - -.sound_obj_cannon2: -chan_setbank 6 -chan_setinstr 11 -chan_setlayer 0, .layer_206E -chan_end - -.layer_206E: -layer_note1 39, 0xd2, 127 -layer_end - -.sound_obj_cannon3: -chan_setbank 6 -chan_setinstr 12 -chan_setlayer 0, .layer_207B -chan_end - -.layer_207B: -layer_note1 39, 0x24, 127 -layer_end - -.sound_obj_piranha_plant_bite: -chan_setbank 6 -chan_setinstr 11 -chan_setlayer 0, .layer_2087 -chan_end - -.layer_2087: -layer_portamento 0x81, 33, 255 -layer_note1 57, 0x4, 127 -layer_transpose -4 -layer_portamento 0x81, 57, 255 -layer_note1 33, 0x6, 127 -layer_delay 0x14 -layer_end - -.sound_obj_piranha_plant_dying: -chan_setbank 6 -chan_setinstr 14 -chan_setlayer 0, .layer_20A2 -chan_end - -.layer_20A2: -layer_note1 39, 0x48, 110 -layer_end - -.sound_obj_jump_walk_water: -chan_setbank 4 -chan_setinstr 5 -chan_setlayer 0, .layer_20AE -chan_end - -.layer_20AE: -layer_note1 59, 0x24, 105 -layer_end - -.chan_20B2: -chan_setbank 6 -chan_setinstr 15 -chan_setlayer 0, .layer_20BA -chan_end - -.layer_20BA: -layer_note1 39, 0x4c, 127 -layer_end - -.sound_obj_mri_death: -chan_setbank 7 -chan_setinstr 0 -chan_setlayer 0, .layer_20C6 -chan_end - -.layer_20C6: -layer_note1 39, 0x18, 105 -layer_end - -.sound_obj_pounding1: -chan_setbank 6 -chan_setinstr 1 -chan_setlayer 0, .layer_20D2 -chan_end - -.layer_20D2: -layer_portamento 0x81, 44, 255 -#ifdef VERSION_JP - layer_note1 36, 0x18, 90 -#else - layer_note1 36, 0x18, 115 -#endif -layer_delay 0x32 -layer_end - -.sound_obj_king_bobomb: -chan_setbank 7 -chan_setinstr 12 -chan_setlayer 0, .layer_20F0 -chan_setval 1 -chan_call .delay -chan_setbank 6 -chan_setinstr 1 -chan_setlayer 1, .layer_20F4 -chan_end - -.layer_20F0: -layer_note1 31, 0x26, 127 -layer_end - -.layer_20F4: -#ifdef VERSION_JP - layer_note1 38, 0x8, 120 - layer_note1 33, 0x1e, 120 -#else - layer_note1 38, 0x8, 127 - layer_note1 33, 0x1e, 127 -#endif -layer_end - -.sound_obj_bully_metal: -chan_setbank 7 -chan_setinstr 1 -chan_setlayer 0, .layer_2103 -chan_end - -.layer_2103: -layer_note1 39, 0x24, 120 -layer_end - -.sound_obj_bully_explode: -chan_setbank 4 -chan_setinstr 15 -chan_setenvelope .envelope_33EC -chan_setlayer 0, .layer_211C -chan_setlayer 1, .layer_2126 -chan_setlayer 2, .layer_2124 -chan_setval 1 -chan_setdecayrelease 10 -chan_end - -.layer_211C: -layer_portamento 0x81, 51, 255 -layer_note1 20, 0x2e, 115 -layer_end - -.layer_2124: -layer_transpose 3 - -.layer_2126: -layer_setinstr 5 -layer_delay 0xa -layer_note1 48, 0x23, 127 -layer_end - -.sound_obj_bowser_puzzle_piece_move: -chan_setbank 7 -chan_setinstr 2 -chan_setlayer 0, .layer_2136 -chan_end - -.layer_2136: -layer_note1 39, 0xc, 105 -layer_end - -.sound_obj_pounding_cannon: -chan_setbank 7 -chan_setinstr 3 -chan_setlayer 0, .layer_2142 -chan_end - -.layer_2142: -layer_note1 39, 0x68, 127 -layer_end - -.sound_obj_bully_walk: -chan_setbank 7 -chan_setinstr 3 -chan_setlayer 0, .layer_214E -chan_end - -.layer_214E: -layer_portamento 0x82, 38, 127 -layer_note1 51, 0x4, 80 -layer_delay 0x1e -layer_end - -.sound_obj_bully_attacked: -chan_setbank 7 -chan_setinstr 12 -chan_setlayer 0, .layer_2160 -chan_end - -.layer_2160: -layer_portamento 0x83, 33, 255 -layer_note0 40, 0xf, 127, 127 -layer_note1 26, 0x20, 127 -layer_end - -.layer_unused_216C: -layer_portamento 0x83, 27, 255 -layer_note1 22, 0x9, 127 -layer_note1 24, 0x1c, 127 -layer_end - -.chan_2177: -chan_setbank 7 -chan_setinstr 3 -chan_setlayer 0, .layer_217F -chan_end - -.layer_217F: -layer_portamento 0x81, 27, 255 -layer_note1 48, 0x9, 100 -layer_portamento 0x81, 27, 255 -layer_note1 48, 0x5, 100 -layer_end - -.chan_218E: -chan_setbank 6 -chan_setinstr 5 -chan_setlayer 0, .layer_2196 -chan_end - -.layer_2196: -layer_note1 36, 0x8, 90 -layer_portamento 0x81, 43, 255 -layer_note1 27, 0x14, 90 -layer_end - -.sound_obj_baby_penguin_dive: -chan_setbank 6 -chan_setinstr 7 -chan_setlayer 0, .layer_21A9 -chan_end - -.layer_21A9: -layer_portamento 0x81, 39, 255 -layer_note1 44, 0xc, 110 -layer_portamento 0x81, 46, 255 -layer_note1 58, 0x30, 110 -layer_end - -.sound_obj_goomba_walk: -chan_setbank 6 -chan_setinstr 12 -chan_setlayer 0, .layer_21C9 -chan_setval 1 -chan_call .delay -chan_setbank 0 -chan_setinstr 4 -chan_end - -.layer_21C9: -layer_portamento 0x82, 24, 255 -layer_note1 12, 0x4, 100 -layer_note1 51, 0x8, 80 -layer_delay 0x1e -layer_end - -.sound_obj_ukiki_chatter_long: -chan_setbank 7 -chan_setinstr 7 -chan_setdecayrelease 15 -chan_setlayer 0, .layer_21E0 -chan_end - -.layer_21E0: -layer_note1 39, 0x30, 127 -layer_end - -.sound_obj_monty_mole_lakitu_attack: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3428 -chan_setval 10 -chan_call .set_reverb -chan_setlayer 0, .layer_21F4 -chan_end - -.layer_21F4: -layer_portamento 0x85, 48, 255 -layer_note1 60, 0x7, 115 -layer_note1 39, 0x23, 115 -layer_end - -.chan_21FF: -chan_setbank 4 -chan_setinstr 13 -chan_setlayer 0, .layer_2207 -chan_end - -.layer_2207: -layer_portamento 0x81, 27, 255 -layer_note1 3, 0x14, 115 -layer_delay 0x1e -layer_end - -.sound_obj_dying_enemy1: -chan_setbank 7 -chan_setinstr 0 -chan_setlayer 0, .layer_2219 -chan_end - -.layer_2219: -layer_note1 43, 0x6, 105 -layer_portamento 0x81, 32, 255 -layer_note1 44, 0x18, 105 -layer_end - -.sound_obj_cannon4: -chan_setbank 7 -chan_setinstr 3 -chan_setval 15 -chan_call .set_reverb -chan_setlayer 0, .layer_2231 -chan_end - -.layer_2231: -layer_note1 48, 0x55, 127 -layer_end - -.sound_obj_dying_enemy2: -chan_setbank 7 -chan_setinstr 8 -chan_setlayer 0, .layer_223D -chan_end - -.layer_223D: -layer_note1 44, 0xc, 100 -layer_portamento 0x81, 44, 255 -layer_note1 32, 0x18, 105 -layer_end - -.sound_obj_bobomb_walk: -chan_setbank 9 -chan_setinstr 1 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_2253 -chan_end - -.layer_2253: -layer_portamento 0x83, 46, 255 -layer_note1 27, 0x5, 127 -layer_note1 32, 0x3, 127 -layer_delay 0x22 -layer_end - -.sound_obj_something_landing: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3428 -chan_setlayer 0, .layer_226B -chan_end - -.layer_226B: -layer_somethingon -layer_portamento 0x85, 62, 255 -layer_note1 50, 0x24, 93 -layer_note1 26, 0x3c, 93 -layer_end - -.sound_obj_diving_in_water: -chan_setbank 4 -chan_setinstr 5 -chan_setlayer 0, .layer_2288 -chan_setval 1 -chan_call .delay -chan_setbank 2 -chan_setinstr 0 -chan_end - -.layer_2288: -layer_note1 62, 0x4, 105 -layer_portamento 0x81, 43, 200 -layer_note1 36, 0x4e, 127 -layer_end - -.sound_obj_snow_sand1: -chan_setbank 3 -chan_setinstr 5 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_229E -chan_end - -.layer_229E: -layer_note1 41, 0x6, 100 -layer_note1 24, 0x1c, 100 -layer_end - -.sound_obj_snow_sand2: -chan_setbank 3 -chan_setinstr 5 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_22B0 -chan_end - -.layer_22B0: -layer_note1 36, 0x5, 100 -layer_note1 44, 0x18, 100 -layer_end - -.sound_obj_default_death: -chan_setbank 0 -chan_setinstr 4 -chan_setenvelope .envelope_32D4 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_22C7 -chan_end - -.layer_22C7: -layer_somethingon -layer_portamento 0x81, 39, 255 -layer_note1 62, 0x1b, 107 -layer_delay 0x12 -layer_end - -.sound_obj_big_penguin_yell: -chan_setbank 7 -chan_setinstr 10 -chan_setlayer 0, .layer_22DA -chan_end - -.layer_22DA: -layer_somethingon -layer_portamento 0x85, 41, 255 -layer_note1 45, 0x28, 127 -layer_note1 41, 0xf, 127 -layer_end - -.sound_obj_water_bomb_bouncing: -chan_setbank 7 -chan_setinstr 11 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_22F3 -chan_end - -.layer_unused_22F1: -layer_transpose -12 - -.layer_22F3: -layer_somethingon -layer_portamento 0x85, 39, 255 -layer_note1 32, 0xc, 127 -layer_note1 39, 0x60, 127 -layer_end - -.sound_obj_goomba_alert: -chan_setbank 9 -chan_setinstr 3 -chan_setval 20 -chan_call .set_reverb -chan_setenvelope .envelope_33EC -chan_setlayer 0, .layer_230F -chan_end - -.layer_230F: -layer_transpose -24 -layer_somethingon -layer_portamento 0x85, 25, 255 -layer_note1 3, 0xf, 85 -layer_transpose 0 -layer_note1 51, 0x1c, 85 -layer_delay 0x19 -layer_end - -.sound_obj_stomped: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3428 -chan_setlayer 0, .layer_232C -chan_end - -.layer_232C: -layer_transpose -3 -layer_somethingon -layer_portamento 0x85, 24, 255 -layer_note1 17, 0xa, 100 -layer_note1 32, 0xa, 100 -layer_note1 27, 0x6, 100 -layer_end - -.chan_233D: -chan_setbank 6 -chan_setinstr 5 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_2348 -chan_end - -.layer_2348: -layer_transpose 10 -layer_call .layer_fn_2353 -layer_call .layer_fn_2353 -layer_delay 0x14 -layer_end - -.layer_fn_2353: -layer_portamento 0x85, 52, 255 -layer_note1 48, 0x4, 115 -layer_note1 52, 0x2, 115 -layer_delay 0x2 -layer_disableportamento -layer_end - -.sound_obj_diving_into_water: -chan_setbank 2 -chan_setlayer 0, .layer_236A -chan_setlayer 1, .layer_2374 -chan_end - -.layer_236A: -layer_setinstr 0 -layer_portamento 0x82, 44, 255 -layer_note1 43, 0x54, 100 -layer_end - -.layer_2374: -layer_setinstr 1 -layer_portamento 0x82, 32, 255 -layer_note1 31, 0x54, 100 -layer_end - -.sound_obj_piranha_plant_shrink: -chan_setbank 3 -chan_setinstr 0 -chan_setenvelope .envelope_3324 -chan_setlayer 0, .layer_2389 -chan_end - -.layer_2389: -layer_portamento 0x81, 62, 255 -layer_note1 38, 0x7f, 117 -layer_end - -.sound_obj_koopa_the_quick_walk: -chan_setbank 7 -chan_setinstr 3 -chan_setlayer 0, .layer_2399 -chan_end - -.layer_2399: -layer_note1 27, 0x6, 100 -layer_note1 29, 0x3, 70 -layer_delay 0x1e -layer_end - -.sound_obj_koopa_walk: -chan_setbank 7 -chan_setinstr 3 -chan_setlayer 0, .layer_23AA -chan_end - -.layer_23AA: -layer_note1 20, 0x4, 100 -layer_delay 0x1e -layer_end - -.sound_obj_bully_walking: -chan_setbank 7 -chan_setinstr 3 -chan_setlayer 0, .layer_23B8 -chan_end - -.layer_23B8: -layer_portamento 0x82, 29, 255 -layer_note1 46, 0xc, 80 -layer_end - -.sound_obj_dorrie: -chan_setbank 6 -chan_setinstr 4 -chan_setenvelope .envelope_32F4 -chan_setlayer 0, .layer_23CD -chan_end - -.layer_unused_23CB: -layer_transpose 12 - -.layer_23CD: -layer_somethingon -layer_portamento 0x85, 36, 255 -layer_note1 48, 0x8, 100 -layer_note1 45, 0x4, 100 -layer_note1 48, 0xa, 100 -layer_note1 41, 0x48, 100 -layer_end - -.sound_obj_bowser_laugh: -chan_setbank 6 -chan_setinstr 9 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_23EF -chan_setlayer 1, .layer_23EF -chan_end - -.layer_23EF: -layer_portamento 0x81, 20, 255 -layer_note1 26, 0x12c, 127 -layer_end - -.sound_obj_ukiki_chatter_short: -chan_setbank 7 -chan_setinstr 7 -chan_setlayer 0, .layer_2400 -chan_end - -.layer_2400: -layer_portamento 0x81, 32, 221 -layer_note1 34, 0xa, 115 -layer_end - -.sound_obj_ukiki_chatter_idle: -chan_setbank 7 -chan_setinstr 7 -chan_setlayer 0, .layer_2410 -chan_end - -.layer_2410: -layer_portamento 0x81, 34, 221 -layer_note1 38, 0xc, 127 -layer_portamento 0x82, 34, 221 -layer_note1 39, 0x12, 127 -layer_end - -.sound_obj_ukiki_step_default: -chan_setbank 1 -chan_setinstr 1 -chan_setlayer 0, .layer_2427 -chan_end - -.layer_2427: -layer_portamento 0x81, 58, 255 -layer_note1 52, 0x6, 105 -layer_end - -.sound_obj_ukiki_step_leaves: -chan_setbank 0 -chan_setinstr 1 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_243A -chan_end - -.layer_243A: -layer_note1 43, 0x6, 90 -layer_note1 44, 0x6, 90 -layer_end - -.sound_obj_koopa_talk: -chan_setbank 7 -chan_setinstr 8 -chan_setlayer 0, .layer_2449 -chan_end - -.layer_2449: -layer_transpose -8 -layer_call .layer_fn_244E - -.layer_fn_244E: -layer_portamento 0x85, 44, 255 -layer_note1 51, 0x9, 100 -layer_note1 39, 0xc, 100 -layer_end - -.sound_obj_koopa_damage: -chan_setbank 7 -chan_setinstr 8 -chan_setlayer 0, .layer_2461 -chan_end - -.layer_2461: -layer_transpose 10 -layer_portamento 0x83, 32, 255 -layer_note1 39, 0x6, 105 -layer_note1 27, 0x12, 105 -layer_end - -.sound_obj_klepto1: -chan_setbank 7 -chan_setinstr 9 -chan_setlayer 0, .layer_2476 -chan_end - -.layer_2476: -layer_somethingon -layer_portamento 0x83, 39, 255 -layer_note1 41, 0x6, 127 -layer_note1 37, 0x24, 127 -layer_end - -.sound_obj_klepto2: -chan_setbank 7 -chan_setinstr 9 -chan_setlayer 0, .layer_248A -chan_end - -.layer_248A: -layer_portamento 0x81, 48, 255 -layer_note1 40, 0x24, 127 -layer_end - -.sound_obj_king_bobomb_talk: -chan_setbank 7 -chan_setinstr 9 -chan_setval 20 -chan_call .set_reverb -chan_setlayer 0, .layer_249F -chan_end - -.layer_249F: -layer_transpose -5 -layer_call .layer_fn_24AF -layer_delay 0xb -layer_transpose -8 -layer_call .layer_fn_24AF -layer_delay 0xa -layer_transpose -10 - -.layer_fn_24AF: -layer_portamento 0x85, 29, 255 -layer_note1 24, 0x2, 127 -layer_note1 41, 0x10, 127 -layer_end - -.sound_obj_king_bobomb_damage: -chan_setbank 7 -chan_setinstr 9 -chan_setval 20 -chan_call .set_reverb -chan_setlayer 0, .layer_24C7 -chan_end - -.layer_24C7: -layer_transpose -12 -layer_portamento 0x85, 25, 255 -layer_note1 39, 0x4, 127 -layer_note1 29, 0x30, 127 -layer_end - -.sound_obj_scuttlebug_walk: -chan_setbank 7 -chan_setinstr 2 -chan_setlayer 0, .layer_24DC -chan_end - -.layer_24DC: -layer_note1 44, 0x4, 127 -layer_delay 0x14 -layer_end - -.sound_obj_scuttlebug_alert: -chan_setbank 9 -chan_setinstr 3 -chan_setlayer 0, .layer_24EA -chan_end - -.layer_24EA: -layer_portamento 0x81, 24, 255 -layer_note1 53, 0x12, 80 -layer_end - -.sound_obj_baby_penguin_yell: -chan_setbank 7 -chan_setinstr 10 -chan_setenvelope .envelope_3344 -chan_setlayer 0, .layer_24FD -chan_end - -.layer_24FD: -layer_note1 50, 0x8, 105 -layer_portamento 0x82, 46, 255 -layer_note1 50, 0x30, 105 -layer_end - -.sound_obj_king_bobomb_jump: -chan_setbank 6 -chan_setinstr 1 -chan_setlayer 0, .layer_2510 -chan_end - -.layer_2510: -layer_portamento 0x81, 27, 255 -layer_note1 43, 0x1e, 127 -layer_end - -.sound_obj_king_whomp_death: -chan_setbank 5 -chan_setinstr 7 -chan_setlayer 0, .layer_252C -chan_setval 1 -chan_call .delay -chan_setbank 7 -chan_setinstr 12 -chan_setlayer 1, .layer_26D7 -chan_end - -.layer_252C: -layer_note1 34, 0xaf, 127 -layer_end - -.sound_obj_boo_laugh_long: -chan_setbank 6 -chan_setinstr 9 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_253E -chan_end - -.layer_253E: -layer_note1 55, 0x32, 127 -layer_end - -.sound_obj_swoop: -chan_setbank 7 -chan_setinstr 7 -chan_setlayer 0, .layer_254A -chan_end - -.layer_254A: -layer_portamento 0x82, 51, 127 -layer_note1 48, 0x6, 127 -layer_end - -.sound_obj_eel: -chan_setbank 6 -chan_setinstr 2 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_2564 -chan_setlayer 1, .layer_2562 -chan_end - -.layer_2562: -layer_delay 0x4 - -.layer_2564: -layer_somethingon -layer_portamento 0x85, 31, 255 -layer_note1 34, 0x18, 127 -layer_note1 17, 0x48, 127 -layer_end - -.sound_obj_eyerok_show_eye: -chan_setbank 4 -chan_setinstr 15 -chan_setlayer 0, .layer_257D -chan_setlayer 1, .layer_257B -chan_end - -.layer_257B: -layer_transpose 4 - -.layer_257D: -layer_jump .layer_11BB - -.sound_obj_mr_blizzard_alert: -chan_setbank 9 -chan_setinstr 3 -chan_setval 24 -chan_call .set_reverb -chan_setenvelope .envelope_3428 -chan_setvibratoextent 80 -chan_setvibratorate 60 -chan_setlayer 0, .layer_259B -chan_setval 30 -chan_call .delay -chan_setvibratoextent 0 -chan_end - -.layer_259B: -layer_somethingon -layer_portamento 0x85, 15, 255 -layer_note1 3, 0x7, 100 -layer_note1 36, 0x18, 100 -layer_end - -.sound_obj_snufit_shoot: -chan_setbank 6 -chan_setinstr 0 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_25B2 -chan_end - -.layer_25B2: -layer_somethingon -layer_portamento 0x81, 44, 255 -layer_note1 51, 0x8, 118 -layer_end - -.sound_obj_skeeter_walk: -chan_setbank 6 -chan_setinstr 7 -chan_setlayer 0, .layer_25CC -chan_setval 1 -chan_call .delay -chan_setbank 7 -chan_setinstr 2 -chan_end - -.layer_25CC: -layer_portamento 0x81, 3, 255 -layer_note1 39, 0x5, 127 -layer_portamento 0x81, 27, 255 -layer_note1 49, 0x6, 127 -layer_end - -.sound_obj_walking_water: -chan_setbank 6 -chan_setinstr 7 -chan_setlayer 0, .layer_25EC -chan_setval 1 -chan_call .delay -chan_setbank 2 -chan_setinstr 1 -chan_end - -.layer_25EC: -layer_portamento 0x81, 3, 255 -layer_note1 39, 0x5, 127 -layer_portamento 0x83, 36, 255 -layer_note1 48, 0x6, 92 -layer_note1 55, 0x30, 92 -layer_end - -.sound_obj_piranha_plant_appear: -chan_setbank 3 -chan_setinstr 0 -chan_setenvelope .envelope_3324 -chan_setlayer 0, .layer_2609 -chan_end - -.layer_2609: -layer_portamento 0x82, 62, 255 -layer_note1 38, 0x60, 117 -layer_end - -.sound_obj_flame_blown: -chan_setbank 7 -chan_setinstr 5 -chan_setenvelope .envelope_32F4 -chan_setlayer 0, .layer_261C -chan_end - -.layer_261C: -layer_portamento 0x85, 41, 255 -layer_note1 36, 0x18, 127 -layer_end - -.sound_obj_mad_piano_chomping: -chan_call .sound_obj_piranha_plant_bite -chan_setval 1 -chan_call .delay -chan_setbank 7 -chan_setinstr 13 -chan_setlayer 1, .layer_2655 -chan_setlayer 2, .layer_2659 -chan_setval 11 -chan_call .delay -chan_call .sound_general_elevator_move -chan_setval 20 -chan_call .delay -chan_setbank 1 -chan_setinstr 4 -chan_setlayer 0, .layer_264B -chan_end - -.layer_264B: -layer_note1 37, 0x8, 96 -layer_note1 41, 0x6, 96 -layer_note1 32, 0x18, 96 -layer_end - -.layer_2655: -layer_note1 46, 0x32, 127 -layer_end - -.layer_2659: -layer_note1 39, 0x32, 127 -layer_end - -.sound_obj_large_bully_attacked: -chan_setbank 7 -chan_setinstr 12 -chan_setlayer 0, .layer_2665 -chan_end - -.layer_2665: -layer_portamento 0x83, 27, 255 -layer_note0 34, 0x12, 127, 127 -layer_note1 20, 0x28, 127 -layer_end - -.sound_obj_bobomb_buddy_talk: -chan_setbank 8 -chan_setinstr 12 -chan_setvibratoextent 80 -chan_setvibratorate 5 -chan_setlayer 0, .layer_2684 -chan_setval 88 -chan_call .delay -chan_setvibratoextent 0 -chan_end - -.layer_2684: -layer_portamento 0x83, 44, 200 -layer_note0 49, 0xc, 127, 127 -layer_note0 40, 0x12, 127, 155 -layer_note0 39, 0xb, 127, 127 -layer_portamento 0x83, 41, 200 -layer_note0 51, 0xa, 127, 127 -layer_note0 48, 0x12, 127, 80 -layer_note0 46, 0xa, 127, 127 -layer_note0 48, 0xb, 127, 127 -layer_end - -.chan_26A9: -chan_setbank 9 -chan_setinstr 3 -chan_setlayer 0, .layer_26B1 -chan_end - -.layer_26B1: -layer_portamento 0x85, 31, 255 -layer_note1 8, 0x6, 100 -layer_note1 32, 0xc, 100 -layer_end - -.sound_obj_eyerok_sound_short: -chan_setbank 7 -chan_setinstr 12 -chan_setlayer 0, .layer_26C7 -chan_setlayer 1, .layer_26C7 -chan_end - -.layer_26C7: -layer_portamento 0x81, 32, 255 -layer_note1 22, 0x24, 110 -layer_end - -.sound_obj_eyerok_sound_long: -chan_setbank 7 -chan_setinstr 12 -chan_setlayer 0, .layer_26D7 -chan_end - -.layer_26D7: -layer_portamento 0x81, 26, 255 -layer_note1 19, 0x60, 127 -layer_end - -.sound_obj_wiggler_high_pitch: -chan_setbank 6 -chan_setinstr 7 -chan_setlayer 0, .layer_26E7 -chan_end - -.layer_26E7: -layer_transpose 3 -layer_note0 31, 0x8, 127, 70 -layer_note0 30, 0x9, 127, 70 -layer_note0 29, 0x8, 127, 70 -layer_note0 28, 0x9, 127, 70 -layer_end - -.sound_obj_heaveho_tossed: -chan_setbank 6 -chan_setinstr 11 -chan_setlayer 0, .layer_2702 -chan_end - -.layer_2702: -layer_portamento 0x81, 12, 255 -layer_note1 51, 0x24, 127 -layer_end - -.sound_obj_bowser_intro_laugh: -chan_setbank 6 -chan_setinstr 9 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_271A -chan_setlayer 1, .layer_271A -chan_end - -.layer_271A: -layer_delay 0xdc - -.layer_271D: -layer_portamento 0x81, 20, 255 -layer_note1 26, 0xc8, 110 -layer_end - -.sound_obj_enemy_death_high: -chan_call .sound_obj_default_death -chan_setval 1 -chan_call .delay -chan_setbank 7 -chan_setinstr 8 -chan_setlayer 1, .layer_223D -chan_end - -.sound_obj_enemy_death_low: -chan_call .sound_obj_default_death -chan_setval 1 -chan_call .delay -chan_setbank 7 -chan_setinstr 8 -chan_setlayer 1, .layer_2746 -chan_end - -.layer_2746: -layer_note1 39, 0xe, 100 -layer_portamento 0x81, 39, 255 -layer_note1 27, 0x1c, 105 -layer_end - -.sound_obj_swoop_death: -chan_call .sound_obj_default_death -chan_setval 1 -chan_call .delay -chan_setbank 7 -chan_setinstr 7 -chan_setlayer 1, .layer_254A -chan_end - -.sound_obj_koopa_flyguy_pokey_death: -chan_call .sound_obj_default_death -chan_setval 1 -chan_call .delay -chan_setbank 7 -chan_setinstr 8 -chan_setlayer 1, .layer_2461 -chan_end - -.sound_obj_wiggler_death: -chan_call .sound_obj_default_death -chan_setval 1 -chan_call .delay -chan_setbank 7 -chan_setinstr 0 -chan_setlayer 1, .layer_2219 -chan_end - -.sound_obj_snowman_bounce: -chan_call .sound_obj_water_bomb_bouncing -chan_setlayer 1, .layer_22F3 -chan_end - -.sound_obj_snowman_explode: -chan_call .sound_general_explosion7 -chan_setval 12 -chan_call .delay -chan_setbank 6 -chan_setinstr 1 -chan_setlayer 2, .layer_2798 -chan_end - -.layer_2798: -layer_note1 24, 0x46, 127 -layer_end - -.sound_obj_bowser_teleport: -chan_setbank 9 -chan_setinstr 3 -chan_setvibratoextent 80 -chan_setvibratorate 60 -chan_setenvelope .envelope_32E4 -chan_setlayer 0, .layer_27B7 -chan_setlayer 1, .layer_27B5 -chan_setval 56 -chan_call .delay -chan_setvibratoextent 0 -chan_end - -.layer_27B5: -layer_transpose 1 - -.layer_27B7: -layer_note1 15, 0x48, 127 -layer_end - -.sound_obj_monty_mole_appear: -chan_setbank 4 -chan_setinstr 15 -chan_setval 40 -chan_call .set_reverb -chan_setenvelope .envelope_33BC -chan_setlayer 0, .layer_27CB -chan_end - -.layer_27CB: -layer_portamento 0x84, 3, 255 -layer_note1 39, 0x7, 127 -layer_note1 44, 0x8, 127 -layer_note1 51, 0x7, 127 -layer_note1 56, 0x8, 127 -layer_end - -.sound_obj_pounding_loud: -chan_setbank 6 -chan_setinstr 1 -chan_setval 55 -chan_call .set_reverb -chan_setlayer 0, .layer_204E -chan_end - -.sound_obj_boss_dialog_grunt: -chan_setbank 7 -chan_setinstr 12 -chan_setlayer 0, .layer_27F1 -chan_end - -.layer_27F1: -layer_note1 29, 0x7, 127 -layer_note0 31, 0x18, 127, 127 -layer_note1 27, 0x26, 127 -layer_end - -.sound_obj_mips_rabbit: -chan_setbank 6 -chan_setinstr 0 -chan_setlayer 0, .layer_2804 -chan_end - -.layer_2804: -layer_somethingon -layer_portamento 0x85, 32, 255 -layer_note1 46, 0x9, 80 -layer_note1 36, 0xa, 90 -layer_end - -.sound_obj_mri_spinning: -chan_setbank 6 -chan_setinstr 11 -chan_setenvelope .envelope_3304 -chan_setlayer 0, .layer_281B -chan_end - -.layer_281B: -layer_somethingon -layer_portamento 0x85, 19, 255 -layer_note1 31, 0xe, 127 -layer_note1 62, 0x8, 127 -layer_end - -.sound_obj_mips_rabbit_water: -chan_setbank 2 -chan_setinstr 1 -chan_setenvelope .envelope_32C4 -chan_setlayer 0, .layer_283E -chan_setval 1 -chan_call .delay -chan_setbank 6 -chan_setinstr 0 -chan_setlayer 1, .layer_2804 -chan_end - -.layer_283E: -layer_portamento 0x81, 47, 255 -layer_note1 50, 0x18, 115 -layer_end - -.sound_obj_eyerok_explode: -chan_setbank 4 -chan_setinstr 9 -chan_setenvelope .envelope_32C4 -chan_setlayer 0, .layer_2854 -chan_setlayer 1, .layer_2856 -chan_end - -.layer_2854: -layer_setinstr 15 - -.layer_2856: -layer_transpose 6 -layer_call .layer_fn_119F -layer_transpose -9 -layer_call .layer_fn_119F -layer_transpose -20 -layer_jump .layer_fn_119F - -.sound_obj_chuckya_death: -chan_call .sound_obj_king_whomp_death -chan_setlayer 1, .layer_288B -chan_setval 2 -chan_call .delay -chan_setbank 8 -chan_setinstr 10 -chan_setlayer 2, .layer_2878 -chan_end - -.layer_2878: -layer_portamento 0x83, 43, 255 -layer_note1 46, 0x9, 115 -layer_somethingon -layer_portamento 0x85, 48, 255 -layer_note1 50, 0x8, 127 -layer_note1 44, 0x1e, 127 -layer_end - -.layer_288B: -layer_transpose 2 -layer_jump .layer_252C - -.sound_obj_wiggler_talk: -chan_setbank 7 -chan_setinstr 10 -chan_setenvelope .envelope_3344 -chan_setlayer 0, .layer_289B -chan_end - -.layer_289B: -layer_transpose 3 -layer_portamento 0x81, 46, 255 -layer_note1 55, 0xa, 105 -layer_call .layer_fn_28BF -layer_delay 0xf -layer_portamento 0x81, 44, 255 -layer_note0 53, 0xf, 105, 127 -layer_portamento 0x81, 43, 255 -layer_note1 51, 0xc, 105 -layer_portamento 0x81, 46, 255 -layer_note1 43, 0xe, 105 - -.layer_fn_28BF: -layer_portamento 0x81, 43, 255 -layer_note1 51, 0xc, 105 -layer_end - -.sound_obj_wiggler_attacked: -chan_setbank 7 -chan_setinstr 10 -chan_setenvelope .envelope_3344 -chan_setlayer 0, .layer_28D2 -chan_end - -.layer_28D2: -layer_transpose 6 -layer_portamento 0x83, 53, 255 -layer_note1 48, 0x8, 105 -layer_note0 60, 0x9, 105, 100 -layer_note1 39, 0xb, 105 -layer_end - -.sound_obj_wiggler_low_pitch: -chan_setbank 6 -chan_setinstr 7 -chan_setlayer 0, .layer_28EB -chan_end - -.layer_28EB: -layer_transpose -2 -layer_note0 31, 0xa, 127, 70 -layer_note0 30, 0xb, 127, 70 -layer_note0 29, 0xa, 127, 70 -layer_note0 28, 0xc, 127, 70 -layer_end - -.sound_obj_snufit_skeeter_death: -chan_call .sound_obj_default_death -chan_setval 1 -chan_call .delay -chan_setbank 7 -chan_setinstr 10 -chan_setenvelope .envelope_3344 -chan_setlayer 1, .layer_2911 -chan_end - -.layer_2911: -layer_transpose 12 -layer_portamento 0x83, 53, 255 -layer_note1 48, 0x8, 105 -layer_note0 60, 0x9, 105, 100 -layer_note1 39, 0x14, 105 -layer_end - -.sound_obj_bubba_chomp: -chan_call .sound_obj_piranha_plant_bite -chan_setval 10 -chan_call .delay -chan_setbank 9 -chan_setinstr 0 -chan_setenvelope .envelope_340C -chan_setlayer 0, .layer_2935 -chan_end - -.layer_2935: -layer_transpose 6 -layer_portamento 0x85, 12, 255 -layer_note1 0, 0x12, 127 -layer_note1 10, 0x14, 127 -layer_end - -.sound_obj_enemy_defeat_shrink: -chan_setbank 7 -chan_setinstr 0 -chan_setlayer 0, .layer_2951 -chan_setlayer 1, .layer_294D -chan_end - -.layer_294D: -layer_transpose 5 -layer_delay 0x3 - -.layer_2951: -layer_note1 43, 0x6, 105 -layer_portamento 0x81, 32, 255 -layer_note1 44, 0x8, 105 -layer_portamento 0x81, 29, 255 -layer_note1 41, 0xa, 105 -layer_portamento 0x81, 26, 255 -layer_note1 38, 0xd, 105 -layer_portamento 0x81, 22, 255 -layer_note1 34, 0x10, 105 -layer_end - -.channel6_table: -sound_ref .sound_air_bowser_spit_fire -sound_ref .chan_29C2 -sound_ref .sound_air_lakitu_fly -sound_ref .sound_air_amp_buzz -sound_ref .sound_air_blow_fire -sound_ref .sound_air_rough_slide -sound_ref .sound_air_heaveho_move -sound_ref .chan_2A3D -sound_ref .sound_air_bobomb_lit_fuse -sound_ref .sound_air_howling_wind -sound_ref .sound_air_chuckya_move -sound_ref .sound_air_peach_twinkle -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_castle_outdoors_ambient -sound_ref .chan_29C2 -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .chan_29C2 -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire -sound_ref .sound_air_bowser_spit_fire - -.sound_air_bowser_spit_fire: -chan_setbank 7 -chan_setinstr 5 -chan_setlayer 0, .layer_29B9 -chan_end - -.layer_29B9: -layer_somethingon -.layer_29BA: -layer_note1 39, 0x12c, 127 -layer_jump .layer_29BA -layer_end - -.chan_29C2: -chan_setbank 7 -chan_setinstr 6 -chan_setlayer 0, .layer_29CA -chan_end - -.layer_29CA: -layer_somethingon -.layer_29CB: -layer_note1 39, 0x12c, 90 -layer_jump .layer_29CB -layer_end - -.sound_air_lakitu_fly: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_32E4 -chan_setlayer 0, .layer_29DE -chan_end - -.layer_29DE: -layer_transpose 12 -layer_somethingon -layer_portamento 0x85, 27, 255 -.layer_29E5: -layer_note1 51, 0x16, 50 -layer_note1 27, 0x16, 50 -layer_jump .layer_29E5 -layer_end - -.sound_air_amp_buzz: -chan_setbank 3 -chan_setinstr 9 -chan_setenvelope .envelope_32E4 -chan_setlayer 0, .layer_29FA -chan_end - -.layer_29FA: -layer_somethingon -.layer_29FB: -layer_note1 46, 0xc8, 92 -layer_jump .layer_29FB -layer_end - -.sound_air_blow_fire: -chan_setbank 7 -chan_setinstr 5 -chan_setenvelope .envelope_32E4 -chan_setlayer 0, .layer_2A0E -chan_end - -.layer_2A0E: -layer_somethingon -.layer_2A0F: -layer_note1 44, 0x12c, 127 -layer_jump .layer_2A0F -layer_end - -.sound_air_rough_slide: -chan_setbank 3 -chan_setinstr 6 -chan_setenvelope .envelope_32E4 -chan_setlayer 0, .layer_2A22 -chan_end - -.layer_2A22: -layer_somethingon -.layer_2A23: -layer_note1 35, 0x12c, 127 -layer_jump .layer_2A23 -layer_end - -.sound_air_heaveho_move: -chan_setbank 5 -chan_setinstr 5 -chan_setlayer 0, .layer_2A33 -chan_end - -.layer_2A33: -layer_note1 56, 0x4, 62 -layer_note1 32, 0x3, 62 -layer_jump .layer_2A33 -layer_end - -.chan_2A3D: -chan_setbank 9 -chan_setinstr 3 -chan_setlayer 0, .layer_2A45 -chan_end - -.layer_2A45: -layer_portamento 0x81, 24, 255 -layer_note1 56, 0x10, 55 -layer_jump .layer_2A45 -layer_end - -.sound_air_bobomb_lit_fuse: -chan_setbank 3 -chan_setinstr 5 -chan_setlayer 0, .layer_2A61 -chan_setval 1 -chan_call .delay -chan_setbank 3 -chan_setinstr 8 -chan_end - -.layer_2A61: -layer_note1 48, 0x6, 100 -layer_somethingon -.layer_2A65: -layer_note1 44, 0x12c, 127 -layer_jump .layer_2A65 -layer_end - -.chan_unused_2A6D: -chan_setbank 3 -chan_setinstr 6 -chan_setenvelope .envelope_32E4 -chan_setlayer 0, .layer_2A78 -chan_end - -.layer_2A78: -layer_somethingon -layer_note1 35, 0x12c, 100 -layer_jump .layer_2A23 -layer_end - -.sound_air_howling_wind: -chan_setlayer 0, .layer_2AA7 -chan_setlayer 1, .layer_2AB7 -chan_setpanmix 0 -.chan_2A89: -chan_setbank 5 -chan_setinstr 6 -chan_setdecayrelease 3 -chan_setval 1 -chan_call .delay -chan_setbank 6 -chan_setinstr 9 -chan_setdecayrelease 3 -chan_setval 199 -chan_call .delay -chan_setval 100 -chan_call .delay -chan_jump .chan_2A89 - -.layer_2AA7: -layer_somethingon -layer_portamento 0x85, 38, 255 -.layer_2AAC: -layer_note1 41, 0x12c, 127 -layer_note1 38, 0x12c, 127 -layer_jump .layer_2AAC - -.layer_2AB7: -layer_delay 1 -layer_setpan 30 -layer_note1 56, 0xc, 10 -layer_delay 0x6c -layer_setpan 90 -layer_note1 55, 0x1e, 35 -layer_delay 0x3b -layer_setpan 55 -layer_note1 56, 0x2e, 68 -layer_delay 0x2d -layer_note1 58, 0x25, 34 -layer_delay 0x2b -layer_setpan 91 -layer_note1 53, 0x6, 55 -layer_note1 55, 0x18, 70 -layer_delay 0x2b -layer_setpan 21 -layer_note1 56, 0x28, 52 -layer_delay 0x1b -layer_note1 57, 0x18, 65 -layer_delay 0x38 -layer_setpan 75 -layer_note1 53, 0x22, 67 -layer_delay 0x4c -layer_setpan 105 -layer_note1 53, 0x3, 54 -layer_note1 55, 0x17, 61 -layer_delay 0x43 -layer_setpan 64 -layer_note1 52, 0x28, 45 -layer_delay 0x38 -layer_jump .layer_2AB7 - -.sound_air_chuckya_move: -chan_setbank 5 -chan_setinstr 5 -chan_setenvelope .envelope_32C4 -chan_setlayer 0, .layer_2B0F -chan_end - -.layer_2B0F: -layer_portamento 0x81, 56, 255 -layer_note1 44, 0x3, 85 -layer_note1 20, 0x2, 85 -layer_jump .layer_2B0F -layer_end - -.channel7_table: -sound_ref .sound_menu_change_select -sound_ref .sound_menu_reverse_pause -sound_ref .sound_menu_pause -sound_ref .sound_menu_pause -sound_ref .sound_menu_message_appear -sound_ref .sound_menu_message_disappear -sound_ref .sound_menu_camera_zoom_in -sound_ref .sound_menu_camera_zoom_out -sound_ref .sound_menu_pinch_mario_face -sound_ref .sound_menu_let_go_mario_face -sound_ref .sound_menu_hand_appear -sound_ref .sound_menu_hand_disappear -sound_ref .chan_2D18 -sound_ref .sound_menu_power_meter -sound_ref .sound_menu_camera_buzz -sound_ref .sound_menu_camera_turn -sound_ref .chan_2DA8 -sound_ref .sound_menu_click_file_select -sound_ref .sound_menu_read_sign -sound_ref .sound_menu_message_next_page -sound_ref .sound_menu_coin_its_a_me_mario -sound_ref .sound_menu_yoshi_gain_lives -sound_ref .sound_menu_enter_pipe -sound_ref .sound_menu_exit_pipe -sound_ref .sound_menu_bowser_laugh -sound_ref .sound_menu_enter_hole -sound_ref .sound_menu_click_change_view -sound_ref .sound_menu_camera_unused1 -sound_ref .sound_menu_camera_unused2 -sound_ref .sound_menu_mario_castle_warp -sound_ref .sound_menu_star_sound -sound_ref .sound_menu_thank_you_playing_my_game -sound_ref .sound_menu_read_a_sign -sound_ref .sound_menu_exit_a_sign -sound_ref .sound_menu_mario_castle_warp2 -#ifdef VERSION_JP - sound_ref .sound_menu_message_next_page - sound_ref .sound_menu_coin_its_a_me_mario - sound_ref .sound_menu_yoshi_gain_lives - sound_ref .sound_menu_enter_pipe - sound_ref .sound_menu_exit_pipe - sound_ref .sound_menu_bowser_laugh - sound_ref .sound_menu_enter_hole - sound_ref .sound_menu_click_change_view - sound_ref .sound_menu_camera_unused1 - sound_ref .sound_menu_camera_unused2 - sound_ref .sound_menu_mario_castle_warp - sound_ref .sound_menu_star_sound - sound_ref .sound_menu_change_select -#else - sound_ref .sound_menu_star_sound_okey_dokey - sound_ref .sound_menu_star_sound_lets_a_go - sound_ref .sound_menu_yoshi_gain_lives - sound_ref .sound_menu_enter_pipe - sound_ref .sound_menu_exit_pipe - sound_ref .sound_menu_collect_red_coin - sound_ref .sound_menu_collect_red_coin - sound_ref .sound_menu_collect_red_coin - sound_ref .sound_menu_collect_red_coin - sound_ref .sound_menu_collect_red_coin - sound_ref .sound_menu_collect_red_coin - sound_ref .sound_menu_collect_red_coin - sound_ref .sound_menu_collect_red_coin - sound_ref .sound_menu_collect_secret - sound_ref .sound_menu_collect_secret - sound_ref .sound_menu_collect_secret - sound_ref .sound_menu_collect_secret - sound_ref .sound_menu_collect_secret - sound_ref .sound_menu_collect_secret - sound_ref .sound_menu_collect_secret - sound_ref .sound_menu_collect_secret - sound_ref .sound_menu_pinch_mario_face - sound_ref .sound_menu_let_go_mario_face - sound_ref .sound_menu_hand_appear - sound_ref .sound_menu_hand_disappear - sound_ref .chan_2D18 - sound_ref .sound_menu_power_meter - sound_ref .sound_menu_camera_buzz - sound_ref .sound_menu_camera_turn -#endif - -.sound_menu_change_select: -chan_setbank 9 -chan_setinstr 1 -chan_setmutebhv 0x0 -chan_setnotepriority 14 -chan_setpanmix 0 -chan_setenvelope .envelope_340C -chan_setlayer 0, .layer_2BB0 -chan_setlayer 1, .layer_2BBD -chan_end - -.layer_2BB0: -layer_portamento 0x1, 35, 0xa -layer_note1 41, 0xa, 80 -layer_setpan 0 -layer_note1 41, 0xa, 80 -layer_end - -.layer_2BBD: -layer_setpan 127 -layer_delay 0xc -layer_note1 41, 0xa, 80 -layer_end - -.sound_menu_reverse_pause: -chan_setbank 9 -chan_setinstr 1 -chan_setmutebhv 0x0 -chan_setnotepriority 14 -chan_setpanmix 0 -chan_setlayer 0, .layer_2BD5 -chan_setlayer 1, .layer_2BEC -chan_end - -.layer_2BD5: -layer_setpan 34 -.layer_2BD7: -layer_note0 45, 0xc, 80, 63 -layer_note0 41, 0xc, 80, 63 -layer_note0 48, 0xc, 80, 63 -layer_note0 41, 0xc, 38, 63 -layer_note0 48, 0xc, 38, 63 -layer_end - -.layer_2BEC: -layer_setpan 94 -layer_delay 0x2 -layer_jump .layer_2BD7 - -.sound_menu_pause: -chan_setbank 9 -chan_setinstr 1 -chan_setmutebhv 0x0 -chan_setnotepriority 14 -chan_setpanmix 0 -chan_setlayer 0, .layer_2C03 -chan_setlayer 1, .layer_2C10 -chan_end - -.layer_2C03: -layer_note1 43, 0x9, 95 -layer_note1 39, 0x9, 90 -layer_note1 43, 0x9, 95 -layer_note1 39, 0x9, 90 -layer_end - -.layer_2C10: -layer_delay 0x8 -layer_setpan 40 -layer_note1 43, 0x9, 35 -layer_setpan 88 -layer_note1 39, 0x9, 35 -layer_setpan 36 -layer_note1 43, 0x9, 30 -layer_setpan 92 -layer_note1 39, 0x9, 30 -layer_setpan 28 -layer_note1 43, 0x9, 25 -layer_setpan 100 -layer_note1 39, 0x9, 25 -layer_end - -.sound_menu_message_appear: -chan_setbank 9 -chan_setnotepriority 14 -chan_setinstr 2 -chan_setlayer 0, .layer_2C3A -chan_end - -.layer_2C3A: -layer_portamento 0x1, 32, 0x7f -layer_note1 56, 0x1e, 102 -layer_end - -.sound_menu_message_disappear: -chan_setnotepriority 14 -chan_setbank 9 -chan_setinstr 0 -chan_setenvelope .envelope_3438 -chan_setlayer 0, .layer_2C4E -chan_end - -.layer_2C4E: -layer_portamento 0x1, 32, 0x7f -layer_note1 53, 0x1e, 78 -layer_end - -.sound_menu_camera_zoom_out: -chan_setmutebhv 0x0 -chan_setnotepriority 14 -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_341C -chan_setlayer 0, .layer_2C64 -chan_end - -.layer_2C64: -layer_portamento 0x1, 32, 0x8 -layer_note1 27, 0x8, 127 -layer_portamento 0x81, 39, 255 -layer_note1 20, 0x28, 127 -layer_end - -.sound_menu_camera_zoom_in: -chan_setmutebhv 0x0 -chan_setnotepriority 14 -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3428 -chan_setlayer 0, .layer_2C81 -chan_end - -.layer_2C81: -layer_portamento 0x1, 27, 0x8 -layer_note1 32, 0x8, 93 -layer_portamento 0x81, 20, 255 -layer_note1 39, 0x28, 93 -layer_end - -.sound_menu_pinch_mario_face: -chan_setbank 9 -chan_setnotepriority 14 -chan_setinstr 1 -chan_setenvelope .envelope_3444 -chan_setvibratorate 1 -chan_setvibratoextent 100 -chan_setlayer 0, .layer_2CA0 -chan_end - -.layer_2CA0: -layer_somethingon -layer_portamento 0x85, 27, 255 -layer_note1 15, 0x6, 127 -layer_note1 34, 0xc, 127 -layer_end - -.sound_menu_let_go_mario_face: -chan_setbank 9 -chan_setnotepriority 14 -chan_setinstr 1 -chan_setenvelope .envelope_3454 -chan_setvibratorate 25 -chan_setvibratoextent 80 -chan_setlayer 0, .layer_2CDA -chan_setlayer 1, .layer_2CD6 -chan_setval 5 -chan_call .delay -chan_setvibratorate 35 -chan_setvibratoextent 115 -chan_setval 55 -chan_call .delay -chan_setvibratoextent 80 -chan_setval 67 -chan_call .delay -chan_setvibratoextent 0 -chan_end - -.layer_2CD6: -layer_transpose 12 -layer_delay 0x3 - -.layer_2CDA: -layer_portamento 0x85, 24, 255 -layer_note1 28, 0x5, 110 -layer_note1 28, 0x78, 110 -layer_end - -.sound_menu_hand_appear: -chan_setbank 9 -chan_setnotepriority 14 -chan_setinstr 3 -chan_setlayer 0, .layer_2CF3 -chan_setlayer 1, .layer_2CF1 -chan_end - -.layer_2CF1: -layer_delay 0x2 - -.layer_2CF3: -layer_portamento 0x85, 47, 255 -layer_note1 35, 0x8, 90 -layer_note1 47, 0x10, 90 -layer_end - -.sound_menu_hand_disappear: -chan_setbank 9 -chan_setnotepriority 14 -chan_setinstr 3 -chan_setlayer 0, .layer_2D0C -chan_setlayer 1, .layer_2D0A -chan_end - -.layer_2D0A: -layer_delay 0x2 - -.layer_2D0C: -layer_portamento 0x85, 35, 255 -layer_note1 47, 0x8, 90 -layer_note1 35, 0x10, 90 -layer_disableportamento -layer_end - -.chan_2D18: -chan_setbank 9 -chan_setnotepriority 14 -chan_setpanmix 0 -chan_setinstr 3 -chan_setenvelope .envelope_3454 -chan_setlayer 0, .layer_2D26 -chan_end - -.layer_2D26: -layer_note1 45, 0x6, 100 -layer_note1 57, 0x6, 100 -layer_note1 57, 0xc, 100 -layer_setpan 10 -layer_note1 57, 0x6, 57 -layer_note1 57, 0xc, 57 -layer_setpan 117 -layer_note1 57, 0x6, 38 -layer_note1 57, 0xc, 38 -layer_end - -.sound_menu_power_meter: -chan_setbank 9 -chan_setnotepriority 14 -chan_setpanmix 0 -chan_setinstr 3 -chan_setenvelope .envelope_3454 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_2D53 -chan_end - -.layer_2D53: -layer_setpan 30 -layer_note1 44, 0x5, 105 -layer_setpan 50 -layer_note1 47, 0x5, 105 -layer_setpan 77 -layer_note1 52, 0x5, 105 -layer_setpan 97 -layer_note1 56, 0xa, 105 -layer_setpan 30 -layer_note1 52, 0x5, 45 -layer_setpan 97 -layer_note1 56, 0xa, 45 -layer_setpan 30 -layer_note1 52, 0x5, 32 -layer_setpan 97 -layer_note1 56, 0xa, 32 -layer_end - -.sound_menu_camera_buzz: -chan_setmutebhv 0x0 -chan_setnotepriority 14 -chan_setbank 9 -chan_setinstr 4 -chan_setlayer 0, .layer_2D87 -chan_end - -.layer_2D87: -layer_note1 39, 0x18, 105 -layer_end - -.sound_menu_camera_turn: -chan_setmutebhv 0x0 -chan_setnotepriority 14 -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3428 -chan_setlayer 0, .layer_2D99 -chan_end - -.layer_2D99: -layer_portamento 0x81, 23, 255 -layer_note1 35, 0x9, 96 -layer_portamento 0x81, 36, 255 -layer_note1 43, 0x44, 100 -layer_end - -.chan_2DA8: -chan_setnotepriority 14 -chan_setbank 9 -chan_setinstr 3 -chan_setlayer 0, .layer_2DB1 -chan_end - -.layer_2DB1: -layer_delay 1 -layer_end - -.sound_menu_click_file_select: -chan_setmutebhv 0x0 -chan_setnotepriority 14 -chan_setbank 6 -chan_setinstr 11 -chan_setlayer 0, .layer_2DBF -chan_end - -.layer_2DBF: -layer_portamento 0x81, 32, 255 -layer_note0 39, 0x5, 115, 255 -layer_portamento 0x81, 44, 255 -layer_note0 51, 0x3, 115, 255 -layer_end - -.sound_menu_read_sign: -chan_setmutebhv 0x0 -chan_setbank 9 -chan_setinstr 1 -chan_setval 60 -chan_call .set_reverb -chan_setlayer 0, .layer_2DDF -chan_end - -.layer_2DDF: -layer_note1 46, 0x3, 90 -layer_note1 46, 0x3, 30 -layer_note1 58, 0x3, 90 -layer_note1 58, 0x3, 30 -layer_note1 46, 0x3, 90 -layer_note1 46, 0x3, 30 -layer_end - -.sound_menu_message_next_page: -chan_setbank 9 -chan_setinstr 0 -chan_setenvelope .envelope_32C4 -chan_setlayer 0, .layer_2DFD -chan_end - -.layer_2DFD: -layer_portamento 0x81, 15, 255 -layer_note1 51, 0x5, 73 -layer_end - -.sound_menu_coin_its_a_me_mario: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_3358 -chan_setvibratoextent 3 -chan_setvibratorate 60 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_2E28 -chan_setlayer 1, .layer_2E3D -chan_setlayer 2, .layer_2E34 -chan_setval 70 -chan_call .delay -chan_setbank 10 -chan_setinstr 8 -chan_end - -.layer_2E28: -layer_call .layer_11E4 -layer_delay 0x12 -layer_transpose 0 -layer_note1 39, 0xc8, 120 -layer_end - -.layer_2E34: -layer_delay 0x6e -layer_transpose 0 -layer_note1 39, 0xc8, 31 -layer_end - -.layer_2E3D: -layer_transpose 24 -layer_delay 0x1e -layer_note1 25, 0x2, 18 -layer_note1 37, 0x7, 36 -layer_note1 30, 0x5, 18 -layer_note1 42, 0x37, 36 -layer_end - -.sound_menu_yoshi_gain_lives: -chan_setbank 9 -chan_setnotepriority 14 -chan_setpanmix 0 -chan_setinstr 3 -chan_setenvelope .envelope_3454 -chan_setval 25 -chan_call .set_reverb -chan_setpanmix 0 -chan_stereoheadseteffects 1 -chan_setlayer 0, .layer_2E65 -chan_end - -.layer_2E65: -layer_note1 46, 0x5, 105 -layer_note1 53, 0x5, 105 -layer_note1 58, 0x5, 105 -layer_setpan 30 -layer_note1 53, 0x5, 50 -layer_setpan 98 -layer_note1 58, 0x5, 50 -layer_setpan 20 -layer_note1 53, 0x5, 20 -layer_setpan 108 -layer_note1 58, 0x5, 20 -layer_end - -.sound_menu_enter_pipe: -chan_reservenotes 4 -chan_setbank 9 -chan_setinstr 2 -chan_setpanmix 0 -chan_stereoheadseteffects 1 -chan_setval 30 -chan_call .set_reverb -chan_setenvelope .envelope_33BC -chan_setdecayrelease 220 -chan_setlayer 0, .layer_2EA3 -chan_setlayer 1, .layer_2E9E -chan_end - -.layer_2E9E: -layer_transpose -12 -layer_jump .layer_2EA5 - -.layer_2EA3: -layer_transpose -24 -.layer_2EA5: -layer_call .layer_fn_2EAB -layer_call .layer_fn_2EAB - -.layer_fn_2EAB: -layer_portamento 0x85, 60, 192 -layer_setpan 117 -layer_note1 60, 0x3, 126 -layer_setpan 105 -layer_note1 58, 0x3, 126 -layer_setpan 93 -layer_note1 55, 0x3, 126 -layer_setpan 81 -layer_note1 51, 0x3, 126 -layer_setpan 46 -layer_note1 50, 0x3, 126 -layer_setpan 34 -layer_note1 46, 0x3, 126 -layer_setpan 22 -layer_note1 44, 0x3, 126 -layer_setpan 10 -layer_note1 41, 0x3, 126 -layer_end - -.sound_menu_exit_pipe: -chan_reservenotes 4 -chan_setbank 9 -chan_setinstr 2 -#ifdef VERSION_SH - chan_setval 15 - .set EXIT_PIPE_NOTE_VELOCITY, 106 -#else - chan_setval 30 - .set EXIT_PIPE_NOTE_VELOCITY, 126 -#endif -chan_call .set_reverb -chan_setenvelope .envelope_3464 -chan_setdecayrelease 220 -chan_setlayer 0, .layer_2EF4 -chan_setlayer 1, .layer_2EEF -chan_end - -.layer_2EEF: -layer_transpose 24 -layer_jump .layer_2EF6 - -.layer_2EF4: -layer_transpose 12 -.layer_2EF6: -layer_portamento 0x85, 15, 128 -layer_note1 15, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 19, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 22, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 27, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 22, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 27, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 31, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 34, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 39, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 34, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 23, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 27, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 30, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 35, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 30, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 35, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 39, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 42, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 47, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 42, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 25, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 29, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 32, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 37, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 32, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 37, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 41, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 44, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 49, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_note1 44, 0x3, EXIT_PIPE_NOTE_VELOCITY -layer_end - -.sound_menu_bowser_laugh: -chan_setbank 6 -chan_setinstr 9 -chan_setval 25 -chan_call .set_reverb -chan_setlayer 0, .layer_271D -chan_setlayer 1, .layer_271D -chan_end - -.sound_menu_click_change_view: -chan_setbank 9 -chan_setinstr 5 -chan_setlayer 0, .layer_2F6D -chan_end - -.layer_2F6D: -layer_note1 39, 0x30, 127 -layer_end - -.sound_menu_camera_unused1: -chan_setbank 9 -chan_setinstr 3 -chan_setenvelope .envelope_32D4 -chan_setlayer 0, .layer_2F7C -chan_end - -.layer_2F7C: -layer_transpose -12 -layer_portamento 0x83, 3, 255 -layer_note1 15, 0xa, 127 -layer_somethingon -layer_transpose 0 -layer_note1 46, 0x64, 127 -layer_end - -.sound_menu_camera_unused2: -chan_setbank 9 -chan_setinstr 3 -chan_setlayer 0, .layer_2F97 -chan_setenvelope .envelope_32D4 -chan_end - -.layer_2F97: -layer_portamento 0x81, 3, 255 -layer_note1 15, 0xc, 127 -layer_portamento 0x81, 39, 255 -layer_note1 3, 0x64, 127 -layer_end - -.sound_menu_mario_castle_warp: -chan_setbank 9 -chan_setnotepriority 14 -chan_setpanmix 0 -chan_setinstr 3 -chan_setenvelope .envelope_340C -chan_setreverb 30 -chan_setlayer 0, .layer_3032 -chan_setlayer 1, .layer_2FB9 -chan_end - -.layer_2FB9: -layer_transpose -24 -layer_setpan 24 -layer_call .layer_fn_300D -layer_transpose -12 -layer_setpan 44 -layer_call .layer_fn_300D -layer_transpose 0 - -.layer_2FC9: -layer_setpan 64 -layer_call .layer_fn_300D -layer_transpose 12 -layer_setpan 84 -layer_call .layer_fn_300D -layer_transpose 24 -layer_setpan 104 -layer_call .layer_fn_300D -layer_setpan 24 -layer_note1 56, 0x2, 100 -layer_note1 56, 0x1, 50 -layer_setpan 104 -layer_note1 60, 0x14, 70 -layer_note1 60, 0xa, 30 -layer_setpan 24 -layer_note1 56, 0x2, 50 -layer_note1 56, 0x1, 20 -layer_setpan 104 -layer_note1 60, 0x14, 30 -layer_note1 60, 0xa, 10 -layer_setpan 24 -layer_note1 56, 0x2, 30 -layer_note1 56, 0x1, 10 -layer_setpan 104 -layer_note1 60, 0x14, 20 -layer_note1 60, 0xa, 7 -layer_end - -.layer_fn_300D: -layer_note1 51, 0x2, 50 -layer_note1 39, 0x1, 40 -layer_note1 39, 0x2, 20 -layer_note1 55, 0x2, 50 -layer_note1 43, 0x1, 40 -layer_note1 43, 0x2, 20 -layer_note1 56, 0x2, 50 -layer_note1 44, 0x1, 40 -layer_note1 44, 0x2, 20 -layer_note1 60, 0x2, 50 -layer_note1 48, 0x1, 40 -layer_note1 48, 0x2, 20 -layer_end - -.layer_3032: -layer_transpose -24 -layer_call .layer_fn_3072 -layer_transpose -12 -layer_call .layer_fn_3072 -layer_transpose 0 -layer_call .layer_fn_3072 - -.layer_3041: -layer_transpose 12 -layer_call .layer_fn_3072 -layer_transpose 24 -layer_call .layer_fn_3072 -layer_setpan 64 -layer_note1 44, 0x1, 100 -layer_note1 56, 0x2, 50 -layer_note1 48, 0xa, 70 -layer_note1 60, 0x14, 30 -layer_note1 44, 0x1, 50 -layer_note1 56, 0x2, 20 -layer_note1 48, 0xa, 30 -layer_note1 60, 0x14, 10 -layer_note1 44, 0x1, 30 -layer_note1 56, 0x2, 10 -layer_note1 48, 0xa, 20 -layer_note1 60, 0x14, 7 -layer_end - -.layer_fn_3072: -layer_setpan 54 -layer_note1 39, 0x3, 100 -layer_note1 51, 0x1, 50 -layer_note1 51, 0x1, 20 -layer_setpan 74 -layer_note1 43, 0x3, 100 -layer_note1 55, 0x1, 50 -layer_note1 55, 0x1, 20 -layer_setpan 54 -layer_note1 44, 0x3, 100 -layer_note1 56, 0x1, 50 -layer_note1 56, 0x1, 20 -layer_setpan 74 -layer_note1 48, 0x3, 100 -layer_note1 60, 0x1, 50 -layer_note1 60, 0x1, 20 -layer_end - -.sound_menu_thank_you_playing_my_game: -chan_setbank 10 -chan_setinstr 14 -chan_setlayer 0, .layer_30AA -chan_setlayer 1, .layer_30AF -chan_end - -.layer_30AA: -layer_note1 39, 0xfa, 127 -layer_end - -.layer_30AF: -layer_delay 0x9 -layer_note1 39, 0xf1, 45 -layer_end - -.sound_menu_read_a_sign: -chan_setbank 9 -chan_setinstr 1 -chan_setlayer 0, .layer_30BE -chan_end - -.layer_30BE: -layer_note1 46, 0x3, 90 -layer_note1 46, 0x3, 30 -layer_note1 58, 0x3, 90 -layer_note1 58, 0x3, 30 -layer_end - -.sound_menu_exit_a_sign: -chan_setbank 9 -chan_setinstr 1 -chan_setlayer 0, .layer_30D3 -chan_end - -.layer_30D3: -layer_note1 58, 0x3, 90 -layer_note1 58, 0x3, 30 -layer_note1 46, 0x3, 90 -layer_note1 46, 0x3, 30 -layer_end - -.sound_menu_mario_castle_warp2: -chan_reservenotes 6 -chan_setbank 9 -chan_setnotepriority 14 -chan_setpanmix 0 -chan_setinstr 3 -chan_setenvelope .envelope_340C -chan_setreverb 30 -chan_setlayer 0, .layer_3041 -chan_setlayer 1, .layer_2FC9 -chan_end - -#ifndef VERSION_JP - .sound_menu_star_sound_okey_dokey: - chan_setbank 4 - chan_setinstr 14 - chan_setlayer 0, .layer_1344 - chan_setval 1 - chan_call .delay - chan_setbank 10 - chan_setinstr 12 - chan_setlayer 1, .layer_E3A - chan_end - - .sound_menu_star_sound_lets_a_go: - chan_setbank 8 - chan_setinstr 26 - chan_setlayer 0, .layer_311D - chan_setval 1 - chan_call .delay - chan_setbank 4 - chan_setinstr 14 - chan_setlayer 1, .layer_1344 - chan_end - - .layer_311D: - layer_note1 39, 0xb4, 127 - layer_end - - .sound_menu_collect_red_coin: - chan_setinstr 128 - chan_setnotepriority 14 - chan_setpanmix 0 - chan_setenvelope .envelope_3378 - chan_ioreadval 4 - chan_subtract 0x28 - chan_readseq .major_scale - chan_writeseq 0, .transpose_by_coin_index, 1 - chan_setlayer 0, .layer_3146 - chan_setlayer 1, .layer_3168 - chan_setlayer 2, .layer_3148 - chan_end - - .major_scale: - .byte 0 - .byte 2 - .byte 4 - .byte 5 - .byte 7 - .byte 9 - .byte 11 - .byte 12 - - .layer_3146: - layer_delay 0x6 - - #ifdef VERSION_SH - .set RED_COIN_NOTE_VELOCITY_SUB, 10 - #else - .set RED_COIN_NOTE_VELOCITY_SUB, 0 - #endif - - .layer_3148: - layer_call .transpose_by_coin_index - layer_note0 46, 0xc, (75 - RED_COIN_NOTE_VELOCITY_SUB), 20 - layer_note0 45, 0xc, (75 - RED_COIN_NOTE_VELOCITY_SUB), 20 - layer_note0 46, 0xc, (75 - RED_COIN_NOTE_VELOCITY_SUB), 20 - layer_note0 58, 0x10, (80 - RED_COIN_NOTE_VELOCITY_SUB), 80 - layer_note0 58, 0x10, (45 - RED_COIN_NOTE_VELOCITY_SUB), 80 - layer_note0 58, 0x10, (20 - RED_COIN_NOTE_VELOCITY_SUB), 80 - layer_note0 58, 0x10, (15 - RED_COIN_NOTE_VELOCITY_SUB), 80 - - layer_end - - .layer_3168: - layer_call .transpose_by_coin_index - layer_note0 41, 0xc, (75 - RED_COIN_NOTE_VELOCITY_SUB), 20 - layer_note0 40, 0xc, (75 - RED_COIN_NOTE_VELOCITY_SUB), 20 - layer_note0 41, 0xc, (75 - RED_COIN_NOTE_VELOCITY_SUB), 20 - layer_note0 53, 0x10, (80 - RED_COIN_NOTE_VELOCITY_SUB), 80 - layer_note0 53, 0x10, (45 - RED_COIN_NOTE_VELOCITY_SUB), 80 - layer_note0 53, 0x10, (20 - RED_COIN_NOTE_VELOCITY_SUB), 80 - layer_note0 53, 0x10, (15 - RED_COIN_NOTE_VELOCITY_SUB), 80 - layer_end - - .transpose_by_coin_index: - layer_transpose 0 - layer_end - - .sound_menu_collect_secret: - chan_setbank 4 - chan_setinstr 14 - chan_setnotepriority 14 - chan_setpanmix 0 - chan_ioreadval 4 - chan_subtract 0x30 - chan_readseq .major_scale - chan_writeseq 0, .layer_31A0, 1 - chan_setlayer 0, .layer_31A0 - chan_end - - .layer_31A0: - layer_transpose 0 - layer_note1 32, 0x7f, 115 - layer_end -#endif - -.sound_general_bird_chirp2: -chan_setbank 5 -chan_setinstr 9 -chan_setval 40 -chan_call .set_reverb -chan_setlayer 0, .layer_31B3 -chan_end - -.layer_31B3: -layer_delay 0x4b -layer_note0 39, 0xf5, 100, 127 -layer_note0 39, 0xa, 85, 127 -layer_note0 40, 0x123, 98, 127 -layer_note0 39, 0x91, 75, 127 -layer_note0 41, 0xbd, 84, 127 -layer_note0 39, 0x4b, 73, 127 -layer_note0 39, 0x96, 94, 127 -layer_note0 36, 0x74, 78, 127 -layer_jump .layer_31B3 -layer_end - -.sound_obj_bird_chirp3: -chan_setbank 5 -chan_setinstr 10 -chan_setval 60 -chan_call .set_reverb -chan_setlayer 0, .layer_31EB -chan_end - -.layer_31EB: -layer_delay 0x14 -layer_note1 39, 0x71, 70 -layer_note1 37, 0xd3, 62 -layer_note1 39, 0x48, 84 -layer_note1 40, 0x71, 49 -layer_note1 39, 0xa8, 65 -layer_note1 41, 0x86, 59 -layer_note1 41, 0x31, 54 -layer_note1 38, 0x6f, 51 -layer_note1 39, 0xc7, 79 -layer_note1 35, 0xe9, 74 -layer_jump .layer_31EB -layer_end - -.sound_obj_bird_chirp1: -chan_setbank 5 -chan_setinstr 12 -chan_setval 30 -chan_call .set_reverb -chan_setlayer 0, .layer_3221 -chan_end - -.layer_3221: -layer_delay 0x32 -layer_note1 41, 0x31, 66 -layer_delay 0x9f -layer_note1 39, 0x31, 51 -layer_delay 0xf9 -layer_note1 38, 0x1d, 60 -layer_note1 41, 0x4c, 77 -layer_delay_long 0x64 -layer_note1 42, 0x31, 59 -layer_delay 0x159 -layer_note1 36, 0x4f, 61 -layer_delay 0xc6 -layer_jump .layer_3221 -layer_end - -.sound_air_castle_outdoors_ambient: -chan_setbank 5 -chan_setval 15 -chan_call .set_reverb -chan_setlayer 0, .layer_3259 -chan_setlayer 1, .layer_327F -chan_setlayer 2, .layer_3281 -chan_end - -.layer_3259: -layer_setinstr 8 -layer_delay 0x18 -layer_note1 41, 0x9, 26 -layer_note1 37, 0xbc, 22 -layer_note1 39, 0x71, 33 -layer_note1 40, 0xd7, 33 -layer_note1 39, 0x54, 39 -layer_note1 39, 0x6f, 31 -layer_note1 43, 0xa8, 26 -layer_note1 40, 0xe1, 22 -layer_note1 38, 0x74, 31 -layer_jump .layer_3259 - -.layer_327F: -layer_transpose 12 - -.layer_3281: -layer_setinstr 13 -layer_somethingon -layer_delay 0xf -.layer_3286: -layer_note1 39, 0x12c, 25 -layer_jump .layer_3286 - -.sound_general_switch_tick_slow: -chan_setval 18 -chan_jump .chan_3294 - -.sound_general_switch_tick_fast: -chan_setval 42 -.chan_3294: -chan_writeseq 0, .layer_32BF, 1 -chan_reservenotes 4 -chan_setbank 4 -chan_setinstr 2 -chan_setenvelope .envelope_3314 -chan_setdecayrelease 15 -chan_setlayer 0, .layer_32B7 -chan_setlayer 1, .layer_32B3 -.chan_32A9: -chan_delay1 -chan_ioreadval 0 -chan_iowriteval 0 -chan_subtract 255 -chan_beqz .chan_32A9 -chan_unreservenotes -chan_end - -.layer_32B3: -layer_setinstr 9 -layer_transpose 12 - -.layer_32B7: -layer_note0 50, 0x3, 127, 127 -layer_note0 38, 0x3, 127, 127 -.layer_32BF: -layer_delay 0x2a -layer_jump .layer_32B7 - -.align 2, 0 -.envelope_32C4: -envelope_line 7 20000 -envelope_line 6 32700 -envelope_line 32700 32700 -envelope_goto 2 - -.envelope_32D4: -envelope_line 9 15000 -envelope_line 7 32700 -envelope_line 32700 32700 -envelope_goto 2 - -.envelope_32E4: -envelope_line 10 10000 -envelope_line 100 32700 -envelope_line 32700 32700 -envelope_goto 2 - -.envelope_32F4: -envelope_line 35 32700 -envelope_line 10 32700 -envelope_line 300 0 -envelope_goto 2 - -.envelope_3304: -envelope_line 15 20000 -envelope_line 5 32700 -envelope_line 32700 32700 -envelope_goto 2 - -.envelope_3314: -envelope_line 8 32700 -envelope_line 50 32700 -envelope_line 300 0 -envelope_goto 2 - -.envelope_3324: -envelope_line 100 25000 -envelope_line 35 32700 -envelope_line 300 5000 -envelope_goto 2 - -.envelope_3334: -envelope_line 25 32700 -envelope_line 4 22500 -envelope_line 35 32700 -envelope_goto 2 - -.envelope_3344: -envelope_line 1 32700 -envelope_line 10 30000 -envelope_line 50 30000 -envelope_line 100 0 -envelope_goto 3 - -.envelope_3358: -envelope_line 4 32700 -envelope_line 100 15000 -envelope_line 1000 0 -envelope_goto 2 - -.envelope_3368: -envelope_line 10 32700 -envelope_line 1 32700 -envelope_line 10 0 -envelope_goto 2 - -#ifndef VERSION_JP - .envelope_3378: - envelope_line 3 32700 - envelope_line 10 30000 - envelope_line 10 10000 - envelope_line 100 0 - envelope_goto 3 -#endif - -.envelope_338C: -envelope_line 1 32700 -envelope_line 20 32700 -envelope_line 600 6000 -envelope_goto 2 - -.envelope_unused_339C: -envelope_line 1 32700 -envelope_line 20 32700 -envelope_line 100 18000 -envelope_goto 2 - -.envelope_33AC: -envelope_line 1 32700 -envelope_line 20 32700 -envelope_line 300 6000 -envelope_goto 2 - -.envelope_33BC: -envelope_line 7 18000 -envelope_line 4 32760 -envelope_line 30 0 -envelope_goto 2 - -.envelope_33CC: -envelope_line 19 32700 -envelope_line 5 32700 -envelope_line 15 0 -envelope_goto 2 - -.envelope_33DC: -envelope_line 25 32700 -envelope_line 9 32700 -envelope_line 9 0 -envelope_goto 2 - -.envelope_33EC: -envelope_line 1 32700 -envelope_line 100 32760 -envelope_line 300 0 -envelope_goto 2 - -.envelope_33FC: -envelope_line 22 32700 -envelope_line 50 32760 -envelope_line 70 0 -envelope_goto 2 - -.envelope_340C: -envelope_line 5 32760 -envelope_line 192 0 -envelope_line 1000 1000 -envelope_goto 2 - -.envelope_341C: -envelope_line 25 32760 -envelope_line 60 10000 -#ifdef VERSION_SH - envelope_hang -#else - envelope_goto 2 -#endif - -.envelope_3428: -envelope_line 1 10000 -envelope_line 1 10000 -envelope_line 40 32760 -envelope_goto 2 - -.envelope_3438: -envelope_line 23 32760 -envelope_line 80 15000 -envelope_goto 2 - -.envelope_3444: -envelope_line 22 32760 -envelope_line 50 32760 -envelope_line 100 25000 -envelope_goto 2 - -.envelope_3454: -envelope_line 13 32760 -envelope_line 50 32760 -envelope_line 200 0 -envelope_goto 2 - -.envelope_3464: -envelope_line 6 12000 -envelope_line 4 32760 -envelope_line 50 32760 -envelope_line 200 0 -envelope_goto 2 - -.envelope_unused_3478: -envelope_line 1 32700 -envelope_line 1000 32700 -envelope_line 10 16000 -envelope_line 200 32760 -envelope_goto 3 diff --git a/sound/sound_data.h b/sound/sound_data.h index 5a7b8553..6d4d989b 100644 --- a/sound/sound_data.h +++ b/sound/sound_data.h @@ -3,9 +3,5 @@ #include "types.h" #include "align_asset_macro.h" -extern u8 gSoundDataADSR[]; // sound_data.ctl -extern u8 gSoundDataRaw[]; // sound_data.tbl -extern u8 gMusicData[]; // sequences.s - #define dgBankSetsData "__OTR__sound/bank_sets" static const ALIGN_ASSET(2) char gBankSetsData[] = dgBankSetsData; \ No newline at end of file diff --git a/src/audio/data.c b/src/audio/data.c index 490b991c..c856da37 100644 --- a/src/audio/data.c +++ b/src/audio/data.c @@ -49,8 +49,7 @@ struct AudioSessionSettingsEU gAudioSessionPresets[] = { // - memory used for temporary sequences // - memory used for temporary banks #if defined(VERSION_JP) || defined(VERSION_US) -struct AudioSessionSettings gAudioSessionPresets[] = { -#ifdef VERSION_JP +struct AudioSessionSettings gAudioSessionPresetsJP[] = { { 32000, 16, 1, 0x0800, 0x2FFF, 0x7FFF, 0x3900, 0x6000, 0x4400, 0x2A00 }, { 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x3900, 0x6000, 0x4400, 0x2A00 }, { 32000, 16, 1, 0x1000, 0x2FFF, 0x7FFF, 0x3900, 0x6000, 0x4400, 0x2A00 }, @@ -59,7 +58,19 @@ struct AudioSessionSettings gAudioSessionPresets[] = { { 32000, 16, 1, 0x0800, 0x2FFF, 0x7FFF, 0x3E00, 0x6200, 0x3F00, 0x2A00 }, { 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x3F00, 0x6200, 0x4400, 0x2A80 }, { 32000, 20, 1, 0x0800, 0x37FF, 0x7FFF, 0x3300, 0x5500, 0x4000, 0x1B00 }, -#else + { 27000, 16, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, + { 27000, 16, 1, 0x0800, 0x3FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, + { 27000, 16, 1, 0x1000, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, + { 27000, 16, 1, 0x1000, 0x3FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, + { 27000, 16, 1, 0x0C00, 0x4FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, + { 32000, 14, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, + { 32000, 12, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, + { 32000, 10, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, + { 32000, 8, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } +}; + +struct AudioSessionSettings gAudioSessionPresetsUS[] = { { 32000, 16, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x3A00, 0x6D00, 0x4400, 0x2A00 }, { 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x3A00, 0x6D00, 0x4400, 0x2A00 }, { 32000, 16, 1, 0x1000, 0x2FFF, 0x7FFF, 0x3A00, 0x6D00, 0x4400, 0x2A00 }, @@ -68,7 +79,6 @@ struct AudioSessionSettings gAudioSessionPresets[] = { { 32000, 16, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x4000, 0x6E00, 0x3F00, 0x2A00 }, { 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x4100, 0x6E00, 0x4400, 0x2A80 }, { 32000, 20, 1, 0x0800, 0x37FF, 0x7FFF, 0x34C0, 0x6280, 0x4000, 0x1B00 }, -#endif { 27000, 16, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, { 27000, 16, 1, 0x0800, 0x3FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, { 27000, 16, 1, 0x1000, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 }, diff --git a/src/audio/data.h b/src/audio/data.h index a704c0c2..f359548d 100644 --- a/src/audio/data.h +++ b/src/audio/data.h @@ -16,7 +16,8 @@ #if defined(VERSION_EU) || defined(VERSION_SH) extern struct AudioSessionSettingsEU gAudioSessionPresets[]; #else -extern struct AudioSessionSettings gAudioSessionPresets[]; +extern struct AudioSessionSettings gAudioSessionPresetsJP[]; +extern struct AudioSessionSettings gAudioSessionPresetsUS[]; #endif extern u16 D_80332388[128]; // unused diff --git a/src/audio/external.c b/src/audio/external.c index 7076816f..c165f4cc 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -207,8 +207,8 @@ s16 sDynNone[] = { SEQ_SOUND_PLAYER, 0 }; u8 sCurrentMusicDynamic = 0xff; u8 sBackgroundMusicForDynamics = SEQUENCE_NONE; -#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, leveldyn, _8) leveldyn, -#define DEFINE_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, leveldyn, _10) leveldyn, +#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, leveldyn, _8, _9) leveldyn, +#define DEFINE_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, leveldyn, _10, _11) leveldyn, #define _ sDynNone s16 *sLevelDynamics[LEVEL_COUNT] = { @@ -239,8 +239,8 @@ struct MusicDynamic sMusicDynamics[8] = { { 0xffff, 127, 100, 0x0000, 0, 100 }, // any (unused) }; -#define STUB_LEVEL(_0, _1, _2, _3, echo1, echo2, echo3, _7, _8) { echo1, echo2, echo3 }, -#define DEFINE_LEVEL(_0, _1, _2, _3, _4, _5, echo1, echo2, echo3, _9, _10) { echo1, echo2, echo3 }, +#define STUB_LEVEL(_0, _1, _2, _3, echo1, echo2, echo3, _7, _8, _9) { echo1, echo2, echo3 }, +#define DEFINE_LEVEL(_0, _1, _2, _3, _4, _5, echo1, echo2, echo3, _9, _10, _11) { echo1, echo2, echo3 }, u8 sLevelAreaReverbs[LEVEL_COUNT][3] = { { 0x00, 0x00, 0x00 }, // LEVEL_NONE @@ -249,8 +249,8 @@ u8 sLevelAreaReverbs[LEVEL_COUNT][3] = { #undef STUB_LEVEL #undef DEFINE_LEVEL -#define STUB_LEVEL(_0, _1, _2, volume, _4, _5, _6, _7, _8) volume, -#define DEFINE_LEVEL(_0, _1, _2, _3, _4, volume, _6, _7, _8, _9, _10) volume, +#define STUB_LEVEL(_0, _1, _2, volume, _4, _5, _6, _7, _8, _9) volume, +#define DEFINE_LEVEL(_0, _1, _2, _3, _4, volume, _6, _7, _8, _9, _10, _11) volume, u16 sLevelAcousticReaches[LEVEL_COUNT] = { 20000, // LEVEL_NONE @@ -2551,7 +2551,7 @@ void sound_reset(u8 presetId) { func_802ad74c(0xF2000000, 0); #endif #if defined(VERSION_JP) || defined(VERSION_US) - audio_reset_session(&gAudioSessionPresets[presetId]); + // audio_reset_session(ROM_JP ? &gAudioSessionPresetsJP[presetId] : &gAudioSessionPresetsUS[presetId]); #else audio_reset_session_eu(presetId); #endif diff --git a/src/audio/heap.c b/src/audio/heap.c index 712ee07f..9d15952d 100644 --- a/src/audio/heap.c +++ b/src/audio/heap.c @@ -1188,9 +1188,8 @@ void audio_reset_session(void) { #endif #else reverbWindowSize = preset->reverbWindowSize; - gAiFrequency = GameEngine_GetSampleRate(); gMaxSimultaneousNotes = preset->maxSimultaneousNotes; - gSamplesPerFrameTarget = ALIGN16(gAiFrequency / 60); + gSamplesPerFrameTarget = ALIGN16(GameEngine_GetSampleRate() / 60); gReverbDownsampleRate = preset->reverbDownsampleRate; switch (gReverbDownsampleRate) { diff --git a/src/audio/internal.h b/src/audio/internal.h index fc742066..617e7587 100644 --- a/src/audio/internal.h +++ b/src/audio/internal.h @@ -222,7 +222,7 @@ struct AudioBank { struct CtlEntry { #ifndef VERSION_SH - u8 unused; + u8 bankId; #endif u8 numInstruments; u8 numDrums; @@ -238,6 +238,7 @@ struct AudioSequenceData { u32 bankCount; u8* banks; u8* data; + u8 id; }; struct M64ScriptState { diff --git a/src/audio/load.c b/src/audio/load.c index 05ac803d..85386acd 100644 --- a/src/audio/load.c +++ b/src/audio/load.c @@ -8,7 +8,6 @@ #include "load.h" #include "seqplayer.h" #include "sound/sound_data.h" -#include "sequences_table.h" #include #include @@ -65,8 +64,6 @@ u16 gSequenceCount; #if defined(VERSION_EU) u32 padEuBss1; struct AudioBufferParametersEU gAudioBufferParameters; -#elif defined(VERSION_US) || defined(VERSION_JP) -s32 gAiFrequency; #endif u32 sDmaBufSize; @@ -200,11 +197,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) { if (arg2 != 0 || *dmaIndexRef >= sSampleDmaListSize1) { for (i = sSampleDmaListSize1; i < gSampleDmaNumListItems; i++) { -#if defined(VERSION_EU) dma = &sSampleDmas[i]; -#else - dma = sSampleDmas + i; -#endif bufferPos = devAddr - dma->source; if (0 <= bufferPos && (size_t) bufferPos <= dma->bufSize - size) { // We already have a DMA request for this memory range. @@ -221,11 +214,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) { } dma->ttl = 60; *dmaIndexRef = (u8) i; -#if defined(VERSION_EU) return &dma->buffer[(devAddr - dma->source)]; -#else - return (devAddr - dma->source) + dma->buffer; -#endif } } @@ -297,7 +286,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) { osPiStartDma(&gCurrAudioFrameDmaIoMesgBufs[gCurrAudioFrameDmaCount - 1], OS_MESG_PRI_NORMAL, OS_READ, dmaDevAddr, dma->buffer, transfer, &gCurrAudioFrameDmaQueue); *dmaIndexRef = dmaIndex; - return dma->buffer + (devAddr - dmaDevAddr); + return (devAddr - dmaDevAddr) + dma->buffer; #endif } @@ -313,7 +302,7 @@ void init_sample_dma_buffers(UNUSED s32 arg0) { #if defined(VERSION_EU) sDmaBufSize = 0x400; #else - sDmaBufSize = 144 * 9; + sDmaBufSize = 0x800; #endif #if defined(VERSION_EU) @@ -403,7 +392,7 @@ uint8_t* load_sequence_immediate(s32 seqId, s32 arg1) { struct CtlEntry* load_banks_immediate(s32 seqId, u8 *outDefaultBank) { u32 bankId; - struct AudioSequenceData *seqData = ResourceGetDataByName(gSequenceTable[seqId]); + struct AudioSequenceData *seqData = GameEngine_LoadSequence(seqId); struct CtlEntry *output; for(size_t i = 0; i < seqData->bankCount; i++) { output = GameEngine_LoadBank(bankId = seqData->banks[i]); @@ -544,11 +533,12 @@ void audio_init() { gAudioResetStatus = 1; audio_shut_down_and_reset_step(); #else - audio_reset_session(&gAudioSessionPresets[0]); + struct AudioSessionSettings* settings = ROM_JP ? &gAudioSessionPresetsJP[0] : &gAudioSessionPresetsUS[0]; + audio_reset_session(settings); #endif // Load headers for sounds and sequences - gSequenceCount = sizeof(gSequenceTable) / sizeof(gSequenceTable[0]); + gSequenceCount = GameEngine_GetSequenceCount(); init_sequence_players(); gAudioLoadLock = AUDIO_LOCK_NOT_LOADING; diff --git a/src/audio/load.h b/src/audio/load.h index caa28ded..b240d471 100644 --- a/src/audio/load.h +++ b/src/audio/load.h @@ -34,7 +34,6 @@ extern u32 gSampleDmaNumListItems; #if defined(VERSION_EU) || defined(VERSION_SH) extern struct AudioBufferParametersEU gAudioBufferParameters; #endif -extern s32 gAiFrequency; #ifdef VERSION_SH extern s16 gCurrAiBufferLength; extern s32 D_SH_8034F68C; diff --git a/src/audio/playback.c b/src/audio/playback.c index 2ddfbd79..65790fca 100644 --- a/src/audio/playback.c +++ b/src/audio/playback.c @@ -605,9 +605,6 @@ void process_notes(void) { scale = note->adsrVolScale; frequency *= note->vibratoFreqScale * note->portamentoFreqScale; cap = 3.99992f; - if (gAiFrequency != 32006) { - frequency *= US_FLOAT(32000.0) / (f32) gAiFrequency; - } frequency = (frequency < cap ? frequency : cap); scale *= 4.3498e-5f; // ~1 / 23000 velocity = velocity * scale * scale; diff --git a/src/audio/seqplayer.c b/src/audio/seqplayer.c index b9d33c8b..90e29a85 100644 --- a/src/audio/seqplayer.c +++ b/src/audio/seqplayer.c @@ -954,7 +954,6 @@ u8 audioString107[] = "Error: Your assignchannel is stolen.\n"; #else // US/JP version with macros to simulate inlining by copt. Edit if you dare. #include "copt/seq_channel_layer_process_script_copt.inc.c" -#include "sequences_table.h" #endif @@ -1784,7 +1783,7 @@ void sequence_channel_process_script(struct SequenceChannel *seqChannel) { loBits = *(sp38 + gAlBankSets); cmd = gAlBankSets[(s32)sp38 + loBits - cmd]; #else - struct AudioSequenceData *sequence = ResourceGetDataByName(gSequenceTable[seqPlayer->seqId]); + struct AudioSequenceData *sequence = GameEngine_LoadSequence(seqPlayer->seqId); cmd = sequence->banks[cmd]; #endif #ifdef VERSION_SH diff --git a/src/engine/graph_node.h b/src/engine/graph_node.h index b397932c..27b40957 100644 --- a/src/engine/graph_node.h +++ b/src/engine/graph_node.h @@ -105,6 +105,8 @@ struct GraphNodePerspective { /*0x1C*/ f32 fov; // horizontal field of view in degrees /*0x20*/ s16 near; // near clipping plane /*0x22*/ s16 far; // far clipping plane + f32 prevFov; + f32 prevTimestamp; }; /** An entry in the master list. It is a linked list of display lists @@ -112,7 +114,9 @@ struct GraphNodePerspective { */ struct DisplayListNode { Mtx *transform; + void *transformInterpolated; void *displayList; + void *displayListInterpolated; struct DisplayListNode *next; }; @@ -174,7 +178,11 @@ struct GraphNodeCamera { } config; /*0x1C*/ Vec3f pos; /*0x28*/ Vec3f focus; + Vec3f prevPos; + Vec3f prevFocus; + u32 prevTimestamp; /*0x34*/ Mat4 *matrixPtr; // pointer to look-at matrix of this camera as a Mat4 + Mat4 *matrixPtrInterpolated; /*0x38*/ s16 roll; // roll in look at matrix. Doesn't account for light direction unlike rollScreen. /*0x3A*/ s16 rollScreen; // rolls screen while keeping the light direction consistent }; @@ -212,7 +220,8 @@ struct GraphNodeRotation { /*0x00*/ struct GraphNode node; /*0x14*/ void *displayList; /*0x18*/ Vec3s rotation; - u8 filler[2]; + Vec3s prevRotation; + u32 prevTimestamp; }; /** GraphNode part that transforms itself and its children based on animation @@ -301,6 +310,9 @@ struct GraphNodeBackground { /*0x00*/ struct FnGraphNode fnNode; /*0x18*/ s32 unused; /*0x1C*/ s32 background; // background ID, or rgba5551 color if fnNode.func is null + Vec3f prevCameraPos; + Vec3f prevCameraFocus; + u32 prevCameraTimestamp; }; /** Renders the object that Mario is holding. @@ -310,6 +322,8 @@ struct GraphNodeHeldObject { /*0x18*/ s32 playerIndex; /*0x1C*/ struct Object *objNode; /*0x20*/ Vec3s translation; + Vec3f prevShadowPos; + u32 prevShadowPosTimestamp; }; /** A node that allows an object to specify a different culling radius than the diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c index fad021b0..26599187 100644 --- a/src/engine/surface_collision.c +++ b/src/engine/surface_collision.c @@ -7,6 +7,7 @@ #include "game/object_list_processor.h" #include "surface_collision.h" #include "surface_load.h" +#include "game/game_init.h" /************************************************** * WALLS * @@ -395,26 +396,44 @@ f32 find_floor_height_and_data(f32 xPos, f32 yPos, f32 zPos, struct FloorGeometr return floorHeight; } +u8 gInterpolatingSurfaces; + /** * Iterate through the list of floors and find the first floor under a given point. */ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 x, s32 y, s32 z, f32 *pheight) { register struct Surface *surf; - register s32 x1, z1, x2, z2, x3, z3; + register f32 x1, z1, x2, z2, x3, z3; f32 nx, ny, nz; f32 oo; f32 height; struct Surface *floor = NULL; + s32 interpolate; // Iterate through the list of floors until there are no more floors. while (surfaceNode != NULL) { surf = surfaceNode->surface; surfaceNode = surfaceNode->next; + interpolate = gInterpolatingSurfaces && surf->modifiedTimestamp == gGlobalTimer; x1 = surf->vertex1[0]; z1 = surf->vertex1[2]; x2 = surf->vertex2[0]; z2 = surf->vertex2[2]; + if (interpolate) { + f32 diff = (surf->prevVertex1[0] - x1) * (surf->prevVertex1[0] - x1); + diff += (surf->prevVertex1[1] - surf->vertex1[1]) * (surf->prevVertex1[1] - surf->vertex1[1]); + diff += (surf->prevVertex1[2] - z1) * (surf->prevVertex1[2] - z1); + //printf("%f\n", sqrtf(diff)); + if (diff > 10000) { + interpolate = FALSE; + } else { + x1 = (surf->prevVertex1[0] + x1) / 2; + z1 = (surf->prevVertex1[2] + z1) / 2; + x2 = (surf->prevVertex2[0] + x2) / 2; + z2 = (surf->prevVertex2[2] + z2) / 2; + } + } // Check that the point is within the triangle bounds. if ((z1 - z) * (x2 - x1) - (x1 - x) * (z2 - z1) < 0) { @@ -424,6 +443,10 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 // To slightly save on computation time, set this later. x3 = surf->vertex3[0]; z3 = surf->vertex3[2]; + if (interpolate) { + x3 = (surf->prevVertex3[0] + x3) / 2; + z3 = (surf->prevVertex3[2] + z3) / 2; + } if ((z2 - z) * (x3 - x2) - (x2 - x) * (z3 - z2) < 0) { continue; @@ -443,10 +466,30 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 continue; } - nx = surf->normal.x; - ny = surf->normal.y; - nz = surf->normal.z; - oo = surf->originOffset; + if (interpolate) { + f32 y1, y2, y3; + f32 mag; + y1 = (surf->prevVertex1[1] + surf->vertex1[1]) / 2; + y2 = (surf->prevVertex2[1] + surf->vertex2[1]) / 2; + y3 = (surf->prevVertex3[1] + surf->vertex3[1]) / 2; + nx = (y2 - y1) * (z3 - z2) - (z2 - z1) * (y3 - y2); + ny = (z2 - z1) * (x3 - x2) - (x2 - x1) * (z3 - z2); + nz = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2); + mag = sqrtf(nx * nx + ny * ny + nz * nz); + if (mag < 0.0001) { + continue; + } + mag = (f32)(1.0 / mag); + nx *= mag; + ny *= mag; + nz *= mag; + oo = -(nx * x1 + ny * y1 + nz * z1); + } else { + nx = surf->normal.x; + ny = surf->normal.y; + nz = surf->normal.z; + oo = surf->originOffset; + } // If a wall, ignore it. Likely a remnant, should never occur. if (ny == 0.0f) { @@ -461,6 +504,15 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 } *pheight = height; + if (interpolate) { + static struct Surface s; + s.type = surf->type; + s.normal.x = nx; + s.normal.y = ny; + s.normal.z = nz; + s.originOffset = oo; + return &s; + } floor = surf; break; } diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index 689f95fd..93147805 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -1,6 +1,7 @@ #include #include "sm64.h" +#include "engine/math_util.h" #include "game/ingame_menu.h" #include "graph_node.h" #include "behavior_script.h" @@ -12,6 +13,7 @@ #include "game/mario.h" #include "game/object_list_processor.h" #include "surface_load.h" +#include "game/game_init.h" s32 unused8038BE90; @@ -357,6 +359,11 @@ static struct Surface *read_surface_data(s16 *vertexData, s16 **vertexIndices) { surface = alloc_surface(); + vec3s_copy(surface->prevVertex1, surface->vertex1); + vec3s_copy(surface->prevVertex2, surface->vertex2); + vec3s_copy(surface->prevVertex3, surface->vertex3); + surface->modifiedTimestamp = gGlobalTimer; + surface->vertex1[0] = x1; surface->vertex2[0] = x2; surface->vertex3[0] = x3; diff --git a/src/game/behaviors/bbh_tilting_trap.inc.c b/src/game/behaviors/bbh_tilting_trap.inc.c index 6f35cf06..9e1b2ff1 100644 --- a/src/game/behaviors/bbh_tilting_trap.inc.c +++ b/src/game/behaviors/bbh_tilting_trap.inc.c @@ -15,21 +15,16 @@ void bhv_bbh_tilting_trap_platform_loop(void) { // if statement, while immediately setting it over here. // This was done so that Mario leaving or getting on the platform // resets oTimer to 0. -#ifndef VERSION_JP - if (gMarioObject->platform == o) { - o->oAction = BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_ON; - } else { - o->oAction = BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_OFF; + if(!ROM_JP){ + if (gMarioObject->platform == o) { + o->oAction = BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_ON; + } else { + o->oAction = BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_OFF; + } } - - if (o->oAction == BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_ON) { -#else - if (gMarioObject->platform == o) { -#endif + if (!ROM_JP ? o->oAction == BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_ON : gMarioObject->platform == o) { o->oAngleVelPitch = (s32)(o->oDistanceToMario * coss(o->oAngleToMario)); o->oFaceAnglePitch += o->oAngleVelPitch; - } else -#ifndef VERSION_JP // In the post-JP versions, if the platform has tilted more than 3000 angle units // in less than 16 frames since Mario got on it, and he has stepped off, // this code will not run, so it will continue to rotate with the same @@ -37,9 +32,7 @@ void bhv_bbh_tilting_trap_platform_loop(void) { // the platform more dangerous. This code will not work correctly // without the oAction changes above, since oTimer will not ever // reset to 0 without them. - if ((absi(o->oFaceAnglePitch) < 3000) || (o->oTimer > 15)) -#endif - { + } else if (ROM_JP || (absi(o->oFaceAnglePitch) < 3000) || (o->oTimer > 15)) { // Make the platform return to the horizontal at a speed of // 200 angle units/frame, and clamp it to 0 if it's within 200 units of 0. o->oAngleVelPitch = 0; diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index 1f935acd..b6ed237e 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -267,13 +267,9 @@ static s32 boo_update_during_death(void) { if (o->oBooParentBigBoo != NULL) { struct Object *parentBigBoo = o->oBooParentBigBoo; -#ifndef VERSION_JP - if (!cur_obj_has_behavior(bhvBoo)) { -#endif + if (ROM_JP || !cur_obj_has_behavior(bhvBoo)) { parentBigBoo->oBigBooNumMinionBoosKilled++; -#ifndef VERSION_JP } -#endif } return TRUE; @@ -499,12 +495,9 @@ static void big_boo_act_0(void) { o->oBooParentBigBoo = NULL; - if (boo_should_be_active() -#ifndef VERSION_JP - && o->oBigBooNumMinionBoosKilled >= gDebugInfo[DEBUG_PAGE_ENEMYINFO][0] + 5 -#else - && o->oBigBooNumMinionBoosKilled >= 5 -#endif + if (boo_should_be_active() && + (ROM_JP ? o->oBigBooNumMinionBoosKilled >= 5 : + o->oBigBooNumMinionBoosKilled >= gDebugInfo[DEBUG_PAGE_ENEMYINFO][0] + 5) ) { o->oAction = 1; @@ -625,9 +618,9 @@ static void big_boo_act_3(void) { } static void big_boo_act_4(void) { -#ifndef VERSION_JP - boo_stop(); -#endif + if(!ROM_JP){ + boo_stop(); + } if (o->oBehParams2ndByte == 0) { obj_set_pos(o, 973, 0, 626); @@ -765,11 +758,11 @@ void bhv_merry_go_round_boo_manager_loop(void) { o->oAction = 2; -#ifndef VERSION_JP - play_puzzle_jingle(); -#else - play_sound(SOUND_GENERAL2_RIGHT_ANSWER, gGlobalSoundSource); -#endif + if(ROM_JP){ + play_sound(SOUND_GENERAL2_RIGHT_ANSWER, gGlobalSoundSource); + } else { + play_puzzle_jingle(); + } } } diff --git a/src/game/behaviors/bowser.inc.c b/src/game/behaviors/bowser.inc.c index 2cd9a96c..e1d3e289 100644 --- a/src/game/behaviors/bowser.inc.c +++ b/src/game/behaviors/bowser.inc.c @@ -331,19 +331,15 @@ void bowser_bitdw_actions(void) { o->oBowserIsReacting = FALSE; // Set starting Bowser level actions, randomly he can also start // dancing after the introduction -#ifndef VERSION_JP - if (gCurrDemoInput == NULL) { // demo check because entry exits post JP -#endif + if (ROM_JP || gCurrDemoInput == NULL) { // demo check because entry exits post JP if (rand < 0.1) { o->oAction = BOWSER_ACT_DANCE; // 10% chance } else { o->oAction = BOWSER_ACT_WALK_TO_MARIO; // common } -#ifndef VERSION_JP } else { o->oAction = BOWSER_ACT_WALK_TO_MARIO; } -#endif } } diff --git a/src/game/behaviors/camera_lakitu.inc.c b/src/game/behaviors/camera_lakitu.inc.c index 61925755..a1a3ca02 100644 --- a/src/game/behaviors/camera_lakitu.inc.c +++ b/src/game/behaviors/camera_lakitu.inc.c @@ -96,12 +96,10 @@ static void camera_lakitu_intro_act_show_dialog(void) { approach_f32_ptr(&o->oCameraLakituCircleRadius, 200.0f, 50.0f); if (o->oDistanceToMario < 1000.0f) { -#ifndef VERSION_JP - if (!o->oCameraLakituUnk104) { + if (!ROM_JP && !o->oCameraLakituUnk104) { play_music(SEQ_PLAYER_LEVEL, SEQUENCE_ARGS(15, SEQ_EVENT_CUTSCENE_LAKITU), 0); o->oCameraLakituUnk104 = TRUE; } -#endif // Once within 1000 units, slow down approach_f32_ptr(&o->oCameraLakituSpeed, 20.0f, 1.0f); if (o->oDistanceToMario < 500.0f diff --git a/src/game/behaviors/coin.inc.c b/src/game/behaviors/coin.inc.c index bbd07fcd..15108ac0 100644 --- a/src/game/behaviors/coin.inc.c +++ b/src/game/behaviors/coin.inc.c @@ -105,25 +105,17 @@ void bhv_coin_loop(void) { } if (o->oMoveFlags & OBJ_MOVE_LANDED) { -#ifndef VERSION_JP - if (o->oMoveFlags & (OBJ_MOVE_ABOVE_DEATH_BARRIER | OBJ_MOVE_ABOVE_LAVA)) -#else - if (o->oMoveFlags & OBJ_MOVE_ABOVE_LAVA) -#endif - { + if (o->oMoveFlags & (ROM_JP ? OBJ_MOVE_ABOVE_LAVA : (OBJ_MOVE_ABOVE_DEATH_BARRIER | OBJ_MOVE_ABOVE_LAVA))) { obj_mark_for_deletion(o); } } if (o->oMoveFlags & OBJ_MOVE_BOUNCE) { -#ifndef VERSION_JP - if (o->oCoinUnk1B0 < 5) { + if (!ROM_JP && o->oCoinUnk1B0 < 5) { cur_obj_play_sound_2(SOUND_GENERAL_COIN_DROP); } o->oCoinUnk1B0++; -#else cur_obj_play_sound_2(SOUND_GENERAL_COIN_DROP); -#endif } if (cur_obj_wait_then_blink(400, 20)) { diff --git a/src/game/behaviors/cruiser.inc.c b/src/game/behaviors/cruiser.inc.c index 71b22c03..f236734c 100644 --- a/src/game/behaviors/cruiser.inc.c +++ b/src/game/behaviors/cruiser.inc.c @@ -13,10 +13,8 @@ void bhv_rr_cruiser_wing_loop(void) { o->oFaceAngleYaw = o->oRRCruiserWingUnkF4 - sins(o->oTimer * 0x400) * 8192.0f; o->oFaceAnglePitch = o->oRRCruiserWingUnkF8 + coss(o->oTimer * 0x400) * 2048.0f; } -#ifndef VERSION_JP - if (o->oTimer == 64) { + if (!ROM_JP && o->oTimer == 64) { cur_obj_play_sound_2(SOUND_GENERAL_BOAT_ROCK); o->oTimer = 0; } -#endif } diff --git a/src/game/behaviors/dorrie.inc.c b/src/game/behaviors/dorrie.inc.c index 8919677b..671bbd0c 100644 --- a/src/game/behaviors/dorrie.inc.c +++ b/src/game/behaviors/dorrie.inc.c @@ -61,30 +61,29 @@ void dorrie_act_lower_head(void) { if (cur_obj_init_anim_check_frame(2, 35)) { cur_obj_reverse_animation(); -#ifdef VERSION_JP - if (o->oTimer > 150) { - dorrie_begin_head_raise(FALSE); - } else if (gMarioObject->platform == o) { - if (o->oDorrieForwardDistToMario > 830.0f - && set_mario_npc_dialog(MARIO_DIALOG_LOOK_UP) == MARIO_DIALOG_STATUS_START) { - dorrie_begin_head_raise(TRUE); - } else if (o->oDorrieForwardDistToMario > 320.0f) { - o->oTimer = 0; + if(ROM_JP){ + if (o->oTimer > 150) { + dorrie_begin_head_raise(FALSE); + } else if (gMarioObject->platform == o) { + if (o->oDorrieForwardDistToMario > 830.0f + && set_mario_npc_dialog(MARIO_DIALOG_LOOK_UP) == MARIO_DIALOG_STATUS_START) { + dorrie_begin_head_raise(TRUE); + } else if (o->oDorrieForwardDistToMario > 320.0f) { + o->oTimer = 0; + } + } + } else { + if (gMarioObject->platform == o) { + if (o->oDorrieOffsetY == -17.0f && o->oDorrieForwardDistToMario > 780.0f + && set_mario_npc_dialog(MARIO_DIALOG_LOOK_UP) == MARIO_DIALOG_STATUS_START) { + dorrie_begin_head_raise(TRUE); + } else if (o->oDorrieForwardDistToMario > 320.0f) { + o->oTimer = 0; + } + } else if (o->oTimer > 150) { + dorrie_begin_head_raise(FALSE); } } -#else - if (gMarioObject->platform == o) { - if (o->oDorrieOffsetY == -17.0f && o->oDorrieForwardDistToMario > 780.0f - && set_mario_npc_dialog(MARIO_DIALOG_LOOK_UP) == MARIO_DIALOG_STATUS_START) { - dorrie_begin_head_raise(TRUE); - } else if (o->oDorrieForwardDistToMario > 320.0f) { - o->oTimer = 0; - } - } else if (o->oTimer > 150) { - dorrie_begin_head_raise(FALSE); - } -#endif - } else { o->oDorrieNeckAngle += 0x115; } diff --git a/src/game/behaviors/hidden_star.inc.c b/src/game/behaviors/hidden_star.inc.c index 9dd2c1e3..535b9baa 100644 --- a/src/game/behaviors/hidden_star.inc.c +++ b/src/game/behaviors/hidden_star.inc.c @@ -42,12 +42,12 @@ void bhv_hidden_star_trigger_loop(void) { spawn_orange_number(hiddenStar->oHiddenStarTriggerCounter, 0, 0, 0); } -#ifdef VERSION_JP - play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource); -#else - play_sound(SOUND_MENU_COLLECT_SECRET + if(ROM_JP){ + play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource); + } else { + play_sound(SOUND_MENU_COLLECT_SECRET + (((u8) hiddenStar->oHiddenStarTriggerCounter - 1) << 16), gGlobalSoundSource); -#endif + } } o->activeFlags = ACTIVE_FLAG_DEACTIVATED; diff --git a/src/game/behaviors/intro_lakitu.inc.c b/src/game/behaviors/intro_lakitu.inc.c index 7ca8055d..cc7859cd 100644 --- a/src/game/behaviors/intro_lakitu.inc.c +++ b/src/game/behaviors/intro_lakitu.inc.c @@ -186,11 +186,9 @@ void bhv_intro_lakitu_loop(void) { obj_mark_for_deletion(o->oIntroLakituCloud); } -#ifndef VERSION_JP - if (o->oTimer == 14) { + if (!ROM_JP && o->oTimer == 14) { cur_obj_play_sound_2(SOUND_ACTION_INTRO_UNK45F); } -#endif break; case 100: diff --git a/src/game/behaviors/king_bobomb.inc.c b/src/game/behaviors/king_bobomb.inc.c index 3c35449d..444248de 100644 --- a/src/game/behaviors/king_bobomb.inc.c +++ b/src/game/behaviors/king_bobomb.inc.c @@ -20,10 +20,10 @@ void bhv_bobomb_anchor_mario_loop(void) { } void king_bobomb_act_0(void) { -#ifndef VERSION_JP - o->oForwardVel = 0.0f; - o->oVelY = 0.0f; -#endif + if(!ROM_JP){ + o->oForwardVel = 0.0f; + o->oVelY = 0.0f; + } if (o->oSubAction == 0) { cur_obj_become_intangible(); @@ -200,7 +200,7 @@ void king_bobomb_act_6(void) { void king_bobomb_act_7(void) { cur_obj_init_animation_with_sound(2); - if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, + if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_TEXT_DEFAULT, CUTSCENE_DIALOG, DIALOG_116)) { create_sound_spawner(SOUND_OBJ_KING_WHOMP_DEATH); @@ -211,12 +211,12 @@ void king_bobomb_act_7(void) { spawn_triangle_break_particles(20, MODEL_DIRT_ANIMATION, 3.0f, 4); cur_obj_shake_screen(SHAKE_POS_SMALL); -#ifndef VERSION_JP - cur_obj_spawn_star_at_y_offset(2000.0f, 4500.0f, -4500.0f, 200.0f); -#else - o->oPosY += 100.0f; - spawn_default_star(2000.0f, 4500.0f, -4500.0f); -#endif + if(ROM_JP){ + o->oPosY += 100.0f; + spawn_default_star(2000.0f, 4500.0f, -4500.0f); + } else { + cur_obj_spawn_star_at_y_offset(2000.0f, 4500.0f, -4500.0f, 200.0f); + } o->oAction = 8; } @@ -319,7 +319,7 @@ void king_bobomb_act_5(void) { // bobomb returns home break; case 4: - if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, + if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_TURN_TO_MARIO, CUTSCENE_DIALOG, DIALOG_128)) { o->oAction = 2; } diff --git a/src/game/behaviors/mips.inc.c b/src/game/behaviors/mips.inc.c index fc081722..a4b7ac34 100644 --- a/src/game/behaviors/mips.inc.c +++ b/src/game/behaviors/mips.inc.c @@ -15,17 +15,17 @@ void bhv_mips_init(void) { if (save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_MIN - 1, COURSE_MAX - 1) >= 15 && !(starFlags & SAVE_FLAG_TO_STAR_FLAG(SAVE_FLAG_COLLECTED_MIPS_STAR_1))) { o->oBehParams2ndByte = 0; -#ifndef VERSION_JP - o->oMipsForwardVelocity = 40.0f; -#endif + if(!ROM_JP){ + o->oMipsForwardVelocity = 40.0f; + } } // If the player has >= 50 stars and hasn't collected second MIPS star... else if (save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_MIN - 1, COURSE_MAX - 1) >= 50 && !(starFlags & SAVE_FLAG_TO_STAR_FLAG(SAVE_FLAG_COLLECTED_MIPS_STAR_2))) { o->oBehParams2ndByte = 1; -#ifndef VERSION_JP - o->oMipsForwardVelocity = 45.0f; -#endif + if(!ROM_JP){ + o->oMipsForwardVelocity = 45.0f; + } } else { // No MIPS stars are available, hide MIPS. o->activeFlags = ACTIVE_FLAG_DEACTIVATED; @@ -33,11 +33,7 @@ void bhv_mips_init(void) { o->oInteractionSubtype = INT_SUBTYPE_HOLDABLE_NPC; -#ifndef VERSION_JP - o->oGravity = 15.0f; -#else - o->oGravity = 2.5f; -#endif + o->oGravity = !ROM_JP ? 15.0f : 2.5f; o->oFriction = 0.89f; o->oBuoyancy = 1.2f; @@ -119,11 +115,7 @@ void bhv_mips_act_follow_path(void) { followStatus = cur_obj_follow_path(followStatus); // Update velocity and angle and do movement. -#ifndef VERSION_JP - o->oForwardVel = o->oMipsForwardVelocity; -#else - o->oForwardVel = 45.0f; -#endif + o->oForwardVel = !ROM_JP ? o->oMipsForwardVelocity : 45.0f; o->oMoveAngleYaw = o->oPathedTargetYaw; collisionFlags = object_step(); diff --git a/src/game/behaviors/moneybag.inc.c b/src/game/behaviors/moneybag.inc.c index 9f819208..46b9bef4 100644 --- a/src/game/behaviors/moneybag.inc.c +++ b/src/game/behaviors/moneybag.inc.c @@ -147,9 +147,9 @@ void moneybag_act_return_home(void) { if (is_point_close_to_object(o, o->oHomeX, o->oHomeY, o->oHomeZ, 100)) { spawn_object(o, MODEL_YELLOW_COIN, bhvMoneybagHidden); -#ifndef VERSION_JP - cur_obj_play_sound_2(SOUND_GENERAL_VANISH_SFX); -#endif + if(!ROM_JP){ + cur_obj_play_sound_2(SOUND_GENERAL_VANISH_SFX); + } cur_obj_init_animation(0); o->oAction = MONEYBAG_ACT_DISAPPEAR; o->oMoneybagJumpState = MONEYBAG_JUMP_LANDING; @@ -218,9 +218,9 @@ void bhv_moneybag_hidden_loop(void) { case FAKE_MONEYBAG_COIN_ACT_IDLE: if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 400)) { spawn_object(o, MODEL_MONEYBAG, bhvMoneybag); -#ifndef VERSION_JP - cur_obj_play_sound_2(SOUND_GENERAL_VANISH_SFX); -#endif + if(!ROM_JP){ + cur_obj_play_sound_2(SOUND_GENERAL_VANISH_SFX); + } o->oAction = FAKE_MONEYBAG_COIN_ACT_TRANSFORM; } break; diff --git a/src/game/behaviors/mr_i.inc.c b/src/game/behaviors/mr_i.inc.c index cbf0a759..4d94542c 100644 --- a/src/game/behaviors/mr_i.inc.c +++ b/src/game/behaviors/mr_i.inc.c @@ -267,13 +267,9 @@ void mr_i_act_1(void) { } void mr_i_act_0(void) { -#ifndef VERSION_JP - obj_set_angle(o, 0, 0, 0); -#else o->oMoveAnglePitch = 0; o->oMoveAngleYaw = 0; o->oMoveAngleRoll = 0; -#endif cur_obj_scale(o->oBehParams2ndByte + 1); if (o->oTimer == 0) { diff --git a/src/game/behaviors/racing_penguin.inc.c b/src/game/behaviors/racing_penguin.inc.c index 21639ec1..a26f5579 100644 --- a/src/game/behaviors/racing_penguin.inc.c +++ b/src/game/behaviors/racing_penguin.inc.c @@ -132,26 +132,25 @@ static void racing_penguin_act_show_final_text(void) { } } else { cur_obj_init_animation_with_sound(0); - -#ifndef VERSION_JP - play_penguin_walking_sound(1); -#endif + if(!ROM_JP){ + play_penguin_walking_sound(1); + } o->oForwardVel = 4.0f; } } else if (o->oRacingPenguinFinalTextbox > 0) { s32 textResult; - if ((textResult = cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, + if ((textResult = cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_TURN_TO_MARIO, CUTSCENE_DIALOG, o->oRacingPenguinFinalTextbox))) { o->oRacingPenguinFinalTextbox = -1; o->oTimer = 0; } } else if (o->oRacingPenguinMarioWon) { -#ifdef VERSION_JP - spawn_default_star(-7339.0f, -5700.0f, -6774.0f); -#else - cur_obj_spawn_star_at_y_offset(-7339.0f, -5700.0f, -6774.0f, 200.0f); -#endif + if(ROM_JP){ + spawn_default_star(-7339.0f, -5700.0f, -6774.0f); + } else { + cur_obj_spawn_star_at_y_offset(-7339.0f, -5700.0f, -6774.0f, 200.0f); + } o->oRacingPenguinMarioWon = FALSE; } } diff --git a/src/game/behaviors/red_coin.inc.c b/src/game/behaviors/red_coin.inc.c index 6c4ef8ef..24b383dc 100644 --- a/src/game/behaviors/red_coin.inc.c +++ b/src/game/behaviors/red_coin.inc.c @@ -56,21 +56,20 @@ void bhv_red_coin_loop(void) { // ...increment the star's counter. o->parentObj->oHiddenStarTriggerCounter++; - // For JP version, play an identical sound for all coins. -#ifdef VERSION_JP - create_sound_spawner(SOUND_GENERAL_RED_COIN); -#endif // Spawn the orange number counter, as long as it isn't the last coin. if (o->parentObj->oHiddenStarTriggerCounter != 8) { spawn_orange_number(o->parentObj->oHiddenStarTriggerCounter, 0, 0, 0); } - // On all versions but the JP version, each coin collected plays a higher noise. -#ifndef VERSION_JP - play_sound(SOUND_MENU_COLLECT_RED_COIN + if(ROM_JP){ + // For JP version, play an identical sound for all coins. + create_sound_spawner(SOUND_GENERAL_RED_COIN); + } else { + // On all versions but the JP version, each coin collected plays a higher noise. + play_sound(SOUND_MENU_COLLECT_RED_COIN + (((u8) o->parentObj->oHiddenStarTriggerCounter - 1) << 16), gGlobalSoundSource); -#endif + } } coin_collected(); diff --git a/src/game/behaviors/sparkle_spawn_star.inc.c b/src/game/behaviors/sparkle_spawn_star.inc.c index f9d7510b..59ba57d3 100644 --- a/src/game/behaviors/sparkle_spawn_star.inc.c +++ b/src/game/behaviors/sparkle_spawn_star.inc.c @@ -87,11 +87,7 @@ void bhv_spawned_star_loop(void) { o->oVelY = 20.0f; o->oGravity = -1.0f; if (o->oInteractionSubtype & INT_SUBTYPE_NO_EXIT) { -#ifdef VERSION_JP - play_power_star_jingle(FALSE); -#else - play_power_star_jingle(TRUE); -#endif + play_power_star_jingle(!ROM_JP); } else { play_power_star_jingle(TRUE); } diff --git a/src/game/behaviors/tuxie.inc.c b/src/game/behaviors/tuxie.inc.c index c3c98f98..17716c81 100644 --- a/src/game/behaviors/tuxie.inc.c +++ b/src/game/behaviors/tuxie.inc.c @@ -59,7 +59,7 @@ void tuxies_mother_act_1(void) { } else { dialogID = DIALOG_059; } - if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, + if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_TURN_TO_MARIO, CUTSCENE_DIALOG, dialogID)) { if (dialogID == DIALOG_058) { o->oSubAction = 1; @@ -85,11 +85,11 @@ void tuxies_mother_act_1(void) { // or 1, which is not affected by the bitwise AND. o->prevObj->OBJECT_FIELD_S32(o->oInteractionSubtype) &= ~INT_SUBTYPE_DROP_IMMEDIATELY; obj_set_behavior(o->prevObj, bhvUnused20E0); -#ifndef VERSION_JP - cur_obj_spawn_star_at_y_offset(3167.0f, -4300.0f, 5108.0f, 200.0f); -#else - spawn_default_star(3500.0f, -4300.0f, 4650.0f); -#endif + if(ROM_JP){ + spawn_default_star(3500.0f, -4300.0f, 4650.0f); + } else { + cur_obj_spawn_star_at_y_offset(3167.0f, -4300.0f, 5108.0f, 200.0f); + } o->oAction = 2; } break; @@ -129,7 +129,7 @@ void tuxies_mother_act_0(void) { } break; case 1: - if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, + if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_TURN_TO_MARIO, CUTSCENE_DIALOG, DIALOG_057)) { o->oSubAction++; } @@ -308,11 +308,11 @@ void bhv_small_penguin_loop(void) { } obj_copy_pos(o, gMarioObject); if (gGlobalTimer % 30 == 0) { -#ifndef VERSION_JP - play_sound(SOUND_OBJ2_BABY_PENGUIN_YELL, gMarioObject->header.gfx.cameraToObject); -#else - play_sound(SOUND_OBJ2_BABY_PENGUIN_YELL, o->header.gfx.cameraToObject); -#endif + if(ROM_JP){ + play_sound(SOUND_OBJ2_BABY_PENGUIN_YELL, o->header.gfx.cameraToObject); + } else { + play_sound(SOUND_OBJ2_BABY_PENGUIN_YELL, gMarioObject->header.gfx.cameraToObject); + } } break; case HELD_THROWN: diff --git a/src/game/behaviors/water_ring.inc.c b/src/game/behaviors/water_ring.inc.c index 22dcce74..b1f8f1bd 100644 --- a/src/game/behaviors/water_ring.inc.c +++ b/src/game/behaviors/water_ring.inc.c @@ -60,13 +60,7 @@ void water_ring_check_collection(f32 avgScale, struct Object *ringManager) { ringSpawner->oWaterRingSpawnerRingsCollected++; if (ringSpawner->oWaterRingSpawnerRingsCollected < 6) { spawn_orange_number(ringSpawner->oWaterRingSpawnerRingsCollected, 0, -40, 0); -#ifdef VERSION_JP - play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource); -#else - play_sound(SOUND_MENU_COLLECT_SECRET - + (((u8) ringSpawner->oWaterRingSpawnerRingsCollected - 1) << 16), - gGlobalSoundSource); -#endif + play_sound(ROM_JP ? SOUND_MENU_STAR_SOUND : SOUND_MENU_COLLECT_SECRET + (((u8) ringSpawner->oWaterRingSpawnerRingsCollected - 1) << 16), gGlobalSoundSource); } ringManager->oWaterRingMgrLastRingCollected = o->oWaterRingIndex; } else { diff --git a/src/game/camera.c b/src/game/camera.c index 1d3b194e..229913ae 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -487,6 +487,10 @@ CameraTransition sModeTransitions[] = { extern u8 sDanceCutsceneIndexTable[][4]; extern u8 sZoomOutAreaMasks[]; +static void skip_camera_interpolation(void) { + gLakituState.skipCameraInterpolationTimestamp = gGlobalTimer; +} + /** * Starts a camera shake triggered by an interaction */ @@ -3330,18 +3334,18 @@ void init_camera(struct Camera *c) { // Note: This replaced an "old" way to call these cutscenes using // a camEvent value: CAM_EVENT_BOWSER_INIT case LEVEL_BOWSER_1: -#ifndef VERSION_JP - // Since Bowser 1 has a demo entry, check for it - // If it is, then set CamAct to the end to directly activate Bowser - // If it isn't, then start cutscene - if (gCurrDemoInput == NULL) { + if(!ROM_JP){ + // Since Bowser 1 has a demo entry, check for it + // If it is, then set CamAct to the end to directly activate Bowser + // If it isn't, then start cutscene + if (gCurrDemoInput == NULL) { + start_cutscene(c, CUTSCENE_ENTER_BOWSER_ARENA); + } else if (gSecondCameraFocus != NULL) { + gSecondCameraFocus->oBowserCamAct = BOWSER_CAM_ACT_END; + } + } else { start_cutscene(c, CUTSCENE_ENTER_BOWSER_ARENA); - } else if (gSecondCameraFocus != NULL) { - gSecondCameraFocus->oBowserCamAct = BOWSER_CAM_ACT_END; } -#else - start_cutscene(c, CUTSCENE_ENTER_BOWSER_ARENA); -#endif break; case LEVEL_BOWSER_2: start_cutscene(c, CUTSCENE_ENTER_BOWSER_ARENA); @@ -4941,9 +4945,8 @@ s32 radial_camera_input(struct Camera *c, UNUSED f32 unused) { if (gPlayer1Controller->buttonPressed & D_CBUTTONS) { if (gCameraMovementFlags & CAM_MOVE_ZOOMED_OUT) { gCameraMovementFlags |= CAM_MOVE_ALREADY_ZOOMED_OUT; -#ifndef VERSION_JP + if(ROM_JP) return; play_camera_buzz_if_cdown(); -#endif } else { gCameraMovementFlags |= CAM_MOVE_ZOOMED_OUT; play_sound_cbutton_down(); @@ -4995,9 +4998,8 @@ void handle_c_button_movement(struct Camera *c) { if (gCameraMovementFlags & CAM_MOVE_ZOOMED_OUT) { gCameraMovementFlags |= CAM_MOVE_ALREADY_ZOOMED_OUT; sZoomAmount = gCameraZoomDist + 400.f; -#ifndef VERSION_JP + if(ROM_JP) return; play_camera_buzz_if_cdown(); -#endif } else { gCameraMovementFlags |= CAM_MOVE_ZOOMED_OUT; sZoomAmount = gCameraZoomDist + 400.f; @@ -5506,6 +5508,7 @@ s32 set_camera_mode_fixed(struct Camera *c, s16 x, s16 y, s16 z) { c->mode = CAMERA_MODE_FIXED; vec3f_set(c->pos, sFixedModeBasePosition[0], sMarioCamState->pos[1], sFixedModeBasePosition[2]); + skip_camera_interpolation(); } return basePosSet; } @@ -5656,6 +5659,7 @@ BAD_RETURN(s32) cam_rr_enter_building_side(struct Camera *c) { if (c->mode != CAMERA_MODE_FIXED) { sStatusFlags &= ~CAM_FLAG_SMOOTH_MOVEMENT; c->mode = CAMERA_MODE_FIXED; + skip_camera_interpolation(); } } @@ -5706,10 +5710,10 @@ BAD_RETURN(s32) cam_hmc_enter_maze(struct Camera *c) { vec3f_get_dist_and_angle(c->focus, gLakituState.goalPos, &dist, &pitch, &yaw); vec3f_set_dist_and_angle(c->focus, gLakituState.goalPos, 300.f, pitch, yaw); gLakituState.goalPos[1] = -800.f; -#ifndef VERSION_JP - c->pos[1] = gLakituState.goalPos[1]; - gLakituState.curPos[1] = gLakituState.goalPos[1]; -#endif + if(!ROM_JP){ + c->pos[1] = gLakituState.goalPos[1]; + gLakituState.curPos[1] = gLakituState.goalPos[1]; + } sStatusFlags &= ~CAM_FLAG_SMOOTH_MOVEMENT; } } @@ -5851,6 +5855,7 @@ BAD_RETURN(s32) cam_castle_enter_lobby(struct Camera *c) { sStatusFlags &= ~CAM_FLAG_SMOOTH_MOVEMENT; set_fixed_cam_axis_sa_lobby(c->mode); c->mode = CAMERA_MODE_FIXED; + skip_camera_interpolation(); } } @@ -6357,8 +6362,8 @@ struct CameraTrigger sCamBBH[] = { }; #define _ NULL -#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, cameratable) cameratable, -#define DEFINE_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, cameratable) cameratable, +#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, cameratable, _9) cameratable, +#define DEFINE_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, cameratable, _11) cameratable, /* * This table has an extra 2 levels after the last unknown_38 stub level. What I think @@ -7026,11 +7031,12 @@ BAD_RETURN(s32) cutscene_intro_peach_start_letter_music(UNUSED struct Camera *c) /** * Raise the volume (not in JP) and start the flying music. */ -BAD_RETURN(s32) cutscene_intro_peach_start_flying_music(UNUSED struct Camera *c) { -#ifndef VERSION_JP - seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60); -#endif - cutscene_intro_peach_play_lakitu_flying_music(); +BAD_RETURN(s32) cutscene_intro_peach_start_flying_music(UNUSED struct Camera *c) {\ + if(!ROM_JP){ + seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60); + } else { + cutscene_intro_peach_play_lakitu_flying_music(); + } } #ifdef VERSION_EU @@ -7214,6 +7220,7 @@ BAD_RETURN(s32) cutscene_unused_loop(UNUSED struct Camera *c) { BAD_RETURN(s32) cutscene_ending_mario_fall_start(struct Camera *c) { vec3f_set(c->focus, -26.f, 0.f, -137.f); vec3f_set(c->pos, 165.f, 4725.f, 324.f); + skip_camera_interpolation(); } /** @@ -7246,6 +7253,7 @@ BAD_RETURN(s32) cutscene_ending_mario_fall(struct Camera *c) { BAD_RETURN(s32) cutscene_ending_mario_land_closeup(struct Camera *c) { vec3f_set(c->focus, 85.f, 826.f, 250.f); vec3f_set(c->pos, -51.f, 988.f, -202.f); + skip_camera_interpolation(); player2_rotate_cam(c, -0x2000, 0x2000, -0x2000, 0x2000); } @@ -7255,6 +7263,7 @@ BAD_RETURN(s32) cutscene_ending_mario_land_closeup(struct Camera *c) { BAD_RETURN(s32) cutscene_ending_reset_spline(UNUSED struct Camera *c) { sCutsceneVars[9].point[0] = 0.f; cutscene_reset_spline(); + skip_camera_interpolation(); } /** @@ -7290,6 +7299,7 @@ BAD_RETURN(s32) cutscene_ending_peach_appear_closeup(struct Camera *c) { vec3f_set(c->pos, 179.f, 2463.f, -1216.f); c->pos[1] = gCutsceneFocus->oPosY + 35.f; vec3f_set(c->focus, gCutsceneFocus->oPosX, gCutsceneFocus->oPosY + 125.f, gCutsceneFocus->oPosZ); + skip_camera_interpolation(); } /** @@ -7308,6 +7318,7 @@ BAD_RETURN(s32) cutscene_ending_peach_appears(struct Camera *c) { BAD_RETURN(s32) cutscene_ending_peach_descends_start(UNUSED struct Camera *c) { cutscene_reset_spline(); sCutsceneVars[2].point[1] = 150.f; + skip_camera_interpolation(); } /** @@ -7395,6 +7406,7 @@ BAD_RETURN(s32) cutscene_ending_dialog(struct Camera *c) { vec3f_set(c->focus, 11.f, 983.f, -1273.f); vec3f_set(c->pos, -473.f, 970.f, -1152.f); player2_rotate_cam(c, -0x800, 0x2000, -0x2000, 0x2000); + skip_camera_interpolation(); } /** @@ -7404,6 +7416,7 @@ BAD_RETURN(s32) cutscene_ending_kiss_closeup(struct Camera *c) { set_fov_function(CAM_FOV_SET_29); vec3f_set(c->focus, 350.f, 1034.f, -1216.f); vec3f_set(c->pos, -149.f, 1021.f, -1216.f); + skip_camera_interpolation(); } /** @@ -7439,6 +7452,7 @@ BAD_RETURN(s32) cutscene_ending_kiss(struct Camera *c) { BAD_RETURN(s32) cutscene_ending_look_at_sky(struct Camera *c) { move_point_along_spline(c->focus, sEndingLookAtSkyFocus, &sCutsceneSplineSegment, &sCutsceneSplineSegmentProgress); vec3f_set(c->pos, 699.f, 1680.f, -703.f); + skip_camera_interpolation(); } /** @@ -8896,16 +8910,12 @@ BAD_RETURN(s32) cutscene_dialog_start(struct Camera *c) { cutscene_soften_music(c); set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_DIALOG); -#ifndef VERSION_JP - if (c->mode == CAMERA_MODE_BOSS_FIGHT) { + if (!ROM_JP && c->mode == CAMERA_MODE_BOSS_FIGHT) { vec3f_copy(sCameraStoreCutscene.focus, c->focus); vec3f_copy(sCameraStoreCutscene.pos, c->pos); } else { -#endif store_info_star(c); -#ifndef VERSION_JP } -#endif // Store Mario's position and faceAngle sCutsceneVars[8].angle[0] = 0; @@ -9515,11 +9525,11 @@ BAD_RETURN(s32) peach_letter_text(UNUSED struct Camera *c) { create_dialog_box(DIALOG_020); } -#ifndef VERSION_JP BAD_RETURN(s32) play_sound_peach_reading_letter(UNUSED struct Camera *c) { - play_sound(SOUND_PEACH_DEAR_MARIO, gGlobalSoundSource); + if(!ROM_JP){ + play_sound(SOUND_PEACH_DEAR_MARIO, gGlobalSoundSource); + } } -#endif /** * Move the camera from peach reading the letter all the way to Mario's warp pipe. Follow the @@ -9585,11 +9595,10 @@ BAD_RETURN(s32) intro_pipe_exit_text(UNUSED struct Camera *c) { create_dialog_box(DIALOG_033); } -#ifndef VERSION_JP BAD_RETURN(s32) play_sound_intro_turn_on_hud(UNUSED struct Camera *c) { + if(ROM_JP) return; play_sound_rbutton_changed(); } -#endif /** * Fly to the pipe. Near the end, the camera jumps to Lakitu's position and the hud turns on. @@ -9654,9 +9663,10 @@ BAD_RETURN(s32) cutscene_intro_peach_letter(struct Camera *c) { #endif cutscene_event(cutscene_intro_peach_start_to_pipe_spline, c, 0, 0); cutscene_event(peach_letter_text, c, 65, 65); -#ifndef VERSION_JP - cutscene_event(play_sound_peach_reading_letter, c, 83, 83); -#endif + + if(!ROM_JP){ + cutscene_event(play_sound_peach_reading_letter, c, 83, 83); + } if ((gCutsceneTimer > 120) && (get_dialog_id() == DIALOG_NONE)) { // Start the next scene @@ -10259,6 +10269,7 @@ BAD_RETURN(s32) cutscene_door_start(struct Camera *c) { BAD_RETURN(s32) cutscene_door_fix_cam(struct Camera *c) { vec3f_copy(c->pos, sCutsceneVars[0].point); vec3f_copy(c->focus, sCutsceneVars[1].point); + skip_camera_interpolation(); } /** @@ -10292,6 +10303,7 @@ BAD_RETURN(s32) cutscene_door_move_behind_mario(struct Camera *c) { } offset_rotated(c->pos, sMarioCamState->pos, camOffset, sCutsceneVars[0].angle); + skip_camera_interpolation(); } /** @@ -10765,9 +10777,9 @@ struct Cutscene sCutsceneReadMessage[] = { #define DANCE_ENTRY(c) { DROT(c, 0), DROT(c, 1), DROT(c, 2), DROT(c, 3) }, -#define DEFINE_COURSE(_0, cutscenes) DANCE_ENTRY(cutscenes) +#define DEFINE_COURSE(_0, cutscenes, _2) DANCE_ENTRY(cutscenes) #define DEFINE_COURSES_END() -#define DEFINE_BONUS_COURSE(_0, cutscenes) DANCE_ENTRY(cutscenes) +#define DEFINE_BONUS_COURSE(_0, cutscenes, _2) DANCE_ENTRY(cutscenes) /** * Each hex digit is an index into sDanceCutsceneTable. diff --git a/src/game/camera.h b/src/game/camera.h index 81a2034b..4aca8be6 100644 --- a/src/game/camera.h +++ b/src/game/camera.h @@ -639,6 +639,8 @@ struct LakituState { /// Mario's action from the previous frame. Only used to determine if Mario just finished a dive. /*0xB8*/ u32 lastFrameAction; /*0xBC*/ s16 unused; + + u32 skipCameraInterpolationTimestamp; }; // bss order hack to not affect BSS order. if possible, remove me, but it will be hard to match otherwise diff --git a/src/game/debug.c b/src/game/debug.c index 16a4c6ad..6705a155 100644 --- a/src/game/debug.c +++ b/src/game/debug.c @@ -50,7 +50,10 @@ s8 sDebugLvSelectCheckFlag = FALSE; #define DEBUG_PAGE_MIN DEBUG_PAGE_OBJECTINFO #define DEBUG_PAGE_MAX DEBUG_PAGE_ENEMYINFO -s8 sDebugPage = DEBUG_PAGE_MIN; +// #region [PU] Replace variable with CVar so we have better control from the UI and it can be persisted +// s8 sDebugPage = DEBUG_PAGE_MIN; +#define sDebugPage CVarGetInteger("gDeveloper.DebugInfoPage", DEBUG_PAGE_MIN) +// #endregion s8 sNoExtraDebug = FALSE; s8 sDebugStringArrPrinted = FALSE; s8 sDebugSysCursor = 0; @@ -135,29 +138,29 @@ void set_text_array_x_y(s32 xOffset, s32 yOffset) { * current debug mode as well as the printer array (down to up vs up to down). */ void print_debug_bottom_up(const char *str, s32 number) { - if (gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT) { + if (gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT || CVarGetInteger("gDeveloper.DrawDebugInfo", 0)) { print_text_array_info(gDebugPrintState2, str, number); } } void print_debug_top_down_objectinfo(const char *str, s32 number) { - if ((gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT) && sDebugPage == DEBUG_PAGE_OBJECTINFO) { + if ((gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT || CVarGetInteger("gDeveloper.DrawDebugInfo", 0)) && sDebugPage == DEBUG_PAGE_OBJECTINFO) { print_text_array_info(gDebugPrintState1, str, number); } } void print_debug_top_down_mapinfo(const char *str, s32 number) { - if (sNoExtraDebug) { // how come this is the only instance of the sNoExtraDebug check? + if (sNoExtraDebug && !CVarGetInteger("gDeveloper.DrawDebugInfo", 0)) { // how come this is the only instance of the sNoExtraDebug check? return; } - if (gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT) { + if (gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT || CVarGetInteger("gDeveloper.DrawDebugInfo", 0)) { print_text_array_info(gDebugPrintState1, str, number); } } void print_debug_top_down_normal(const char *str, s32 number) { - if (gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT) { + if (gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT || CVarGetInteger("gDeveloper.DrawDebugInfo", 0)) { print_text_array_info(gDebugPrintState1, str, number); } } @@ -332,20 +335,20 @@ UNUSED static void check_debug_button_seq(void) { * control sDebugPage's range. (unused) */ UNUSED static void try_change_debug_page(void) { - if (gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT) { + if (gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT || CVarGetInteger("gDeveloper.DrawDebugInfo", 0)) { if ((gPlayer1Controller->buttonPressed & L_JPAD) && (gPlayer1Controller->buttonDown & (L_TRIG | R_TRIG))) { - sDebugPage++; + CVarSetInteger("gDeveloper.DebugInfoPage", sDebugPage + 1); } if ((gPlayer1Controller->buttonPressed & R_JPAD) && (gPlayer1Controller->buttonDown & (L_TRIG | R_TRIG))) { - sDebugPage--; + CVarSetInteger("gDeveloper.DebugInfoPage", sDebugPage - 1); } if (sDebugPage >= (DEBUG_PAGE_MAX + 1)) { - sDebugPage = DEBUG_PAGE_MIN; + CVarSetInteger("gDeveloper.DebugInfoPage", DEBUG_PAGE_MIN); } if (sDebugPage < DEBUG_PAGE_MIN) { - sDebugPage = DEBUG_PAGE_MAX; + CVarSetInteger("gDeveloper.DebugInfoPage", DEBUG_PAGE_MAX); } } } diff --git a/src/game/envfx_bubbles.c b/src/game/envfx_bubbles.c index feda81d2..84acee31 100644 --- a/src/game/envfx_bubbles.c +++ b/src/game/envfx_bubbles.c @@ -10,6 +10,7 @@ #include "engine/behavior_script.h" #include "audio/external.h" #include "textures.h" +#include "rendering_graph_node.h" /** * This file implements environment effects that are not snow: @@ -35,6 +36,20 @@ Vtx_t gBubbleTempVtx[3] = { { { 0, 0, 0 }, 0, { -498, 964 }, { 0xFF, 0xFF, 0xFF, 0xFF } }, }; +static Gfx sGfxSaved[60 / 5]; +static Gfx *sBubbleInterpolatedDisplayListPos[60 / 5]; +static Vec3s sPrevBubblePositions[60]; + +void patch_interpolated_bubble_particles(void) { + s32 i; + for (i = 0; i < 60 / 5; i++) { + if (sBubbleInterpolatedDisplayListPos[i] != NULL) { + *sBubbleInterpolatedDisplayListPos[i] = sGfxSaved[i]; + sBubbleInterpolatedDisplayListPos[i] = NULL; + } + } +} + /** * Check whether the particle with the given index is * laterally within distance of point (x, z). Used to @@ -239,6 +254,7 @@ void envfx_update_whirlpool(void) { (gEnvFxBuffer + i)->yPos = (i + gEnvFxBuffer)->bubbleY; (gEnvFxBuffer + i)->unusedBubbleVar = 0; (gEnvFxBuffer + i)->isAlive = TRUE; + (gEnvFxBuffer + i)->spawnTimestamp = gGlobalTimer; envfx_rotate_around_whirlpool(&(gEnvFxBuffer + i)->xPos, &(gEnvFxBuffer + i)->yPos, &(gEnvFxBuffer + i)->zPos); @@ -297,6 +313,7 @@ void envfx_update_jetstream(void) { + coss((gEnvFxBuffer + i)->angleAndDist[0]) * (gEnvFxBuffer + i)->angleAndDist[1]; (gEnvFxBuffer + i)->yPos = gEnvFxBubbleConfig[ENVFX_STATE_SRC_Y] + (random_float() * 400.0f - 200.0f); + (gEnvFxBuffer + i)->spawnTimestamp = gGlobalTimer; } else { (gEnvFxBuffer + i)->angleAndDist[1] += 10; (gEnvFxBuffer + i)->xPos += sins((gEnvFxBuffer + i)->angleAndDist[0]) * 10.0f; @@ -471,6 +488,12 @@ Gfx *envfx_update_bubble_particles(s32 mode, UNUSED Vec3s marioPos, Vec3s camFro Vec3s vertex1; Vec3s vertex2; Vec3s vertex3; + Vec3s interpolatedVertices[3]; + + static Vec3s prevVertex1; + static Vec3s prevVertex2; + static Vec3s prevVertex3; + static u32 prevTimestamp; Gfx *gfxStart = alloc_display_list(((sBubbleParticleMaxCount / 5) * 10 + sBubbleParticleMaxCount + 3) * sizeof(Gfx)); @@ -484,18 +507,53 @@ Gfx *envfx_update_bubble_particles(s32 mode, UNUSED Vec3s marioPos, Vec3s camFro envfx_bubbles_update_switch(mode, camTo, vertex1, vertex2, vertex3); rotate_triangle_vertices(vertex1, vertex2, vertex3, pitch, yaw); + if (gGlobalTimer == prevTimestamp + 1) { + interpolate_vectors_s16(interpolatedVertices[0], prevVertex1, vertex1); + interpolate_vectors_s16(interpolatedVertices[1], prevVertex2, vertex2); + interpolate_vectors_s16(interpolatedVertices[2], prevVertex3, vertex3); + } + vec3s_copy(prevVertex1, vertex1); + vec3s_copy(prevVertex2, vertex2); + vec3s_copy(prevVertex3, vertex3); + prevTimestamp = gGlobalTimer; + gSPDisplayList(sGfxCursor++, &tiny_bubble_dl_0B006D38); for (i = 0; i < sBubbleParticleMaxCount; i += 5) { + Vtx *interpolatedVertBuf = alloc_display_list(15 * sizeof(Vtx)); + s32 j, k; gDPPipeSync(sGfxCursor++); envfx_set_bubble_texture(mode, i); append_bubble_vertex_buffer(sGfxCursor++, i, vertex1, vertex2, vertex3, (Vtx *) gBubbleTempVtx); + sBubbleInterpolatedDisplayListPos[i / 5] = sGfxCursor; + for (j = 0; j < 5; j++) { + for (k = 0; k < 3; k++) { + Vtx *v = &interpolatedVertBuf[j * 3 + k]; + v->v = gBubbleTempVtx[k]; + if (gGlobalTimer != gEnvFxBuffer[i + j].spawnTimestamp && mode != ENVFX_LAVA_BUBBLES) { + v->v.ob[0] = (sPrevBubblePositions[i + j][0] + gEnvFxBuffer[i + j].xPos) / 2.0f + interpolatedVertices[k][0]; + v->v.ob[1] = (sPrevBubblePositions[i + j][1] + gEnvFxBuffer[i + j].yPos) / 2.0f + interpolatedVertices[k][1]; + v->v.ob[2] = (sPrevBubblePositions[i + j][2] + gEnvFxBuffer[i + j].zPos) / 2.0f + interpolatedVertices[k][2]; + } else { + v->v.ob[0] = gEnvFxBuffer[i + j].xPos + interpolatedVertices[k][0]; + v->v.ob[1] = gEnvFxBuffer[i + j].yPos + interpolatedVertices[k][1]; + v->v.ob[2] = gEnvFxBuffer[i + j].zPos + interpolatedVertices[k][2]; + } + } + } + gSPVertex(sGfxCursor++, VIRTUAL_TO_PHYSICAL(interpolatedVertBuf), 15, 0); + append_bubble_vertex_buffer(&sGfxSaved[i / 5], i, vertex1, vertex2, vertex3, (Vtx *) gBubbleTempVtx); gSP1Triangle(sGfxCursor++, 0, 1, 2, 0); gSP1Triangle(sGfxCursor++, 3, 4, 5, 0); gSP1Triangle(sGfxCursor++, 6, 7, 8, 0); gSP1Triangle(sGfxCursor++, 9, 10, 11, 0); gSP1Triangle(sGfxCursor++, 12, 13, 14, 0); } + for (i = 0; i < sBubbleParticleMaxCount; i++) { + sPrevBubblePositions[i][0] = gEnvFxBuffer[i].xPos; + sPrevBubblePositions[i][1] = gEnvFxBuffer[i].yPos; + sPrevBubblePositions[i][2] = gEnvFxBuffer[i].zPos; + } gSPDisplayList(sGfxCursor++, &tiny_bubble_dl_0B006AB0); gSPEndDisplayList(sGfxCursor++); diff --git a/src/game/envfx_snow.c b/src/game/envfx_snow.c index 5e1a032d..0a8e5c8b 100644 --- a/src/game/envfx_snow.c +++ b/src/game/envfx_snow.c @@ -55,6 +55,26 @@ extern void *tiny_bubble_dl_0B006AB0; extern void *tiny_bubble_dl_0B006A50; extern void *tiny_bubble_dl_0B006CD8; +static struct { + Gfx *pos; + Vtx vertices[15]; +} sPrevSnowVertices[140 / 5]; +static s16 sPrevSnowParticleCount; +static u32 sPrevSnowTimestamp; + +void patch_interpolated_snow_particles(void) { + int i; + + if (gGlobalTimer != sPrevSnowTimestamp + 1) { + return; + } + + for (i = 0; i < sPrevSnowParticleCount; i += 5) { + gSPVertex(sPrevSnowVertices[i / 5].pos, + VIRTUAL_TO_PHYSICAL(sPrevSnowVertices[i / 5].vertices), 15, 0); + } +} + /** * Initialize snow particles by allocating a buffer for storing their state * and setting a start amount. @@ -220,6 +240,7 @@ void envfx_update_snow_normal(s32 snowCylinderX, s32 snowCylinderY, s32 snowCyli 400.0f * random_float() - 200.0f + snowCylinderZ + (s16)(deltaZ * 2); (gEnvFxBuffer + i)->yPos = 200.0f * random_float() + snowCylinderY; (gEnvFxBuffer + i)->isAlive = TRUE; + (gEnvFxBuffer + i)->spawnTimestamp = gGlobalTimer; } else { (gEnvFxBuffer + i)->xPos += random_float() * 2 - 1.0f + (s16)(deltaX / 1.2); (gEnvFxBuffer + i)->yPos -= 2 -(s16)(deltaY * 0.8); @@ -254,6 +275,7 @@ void envfx_update_snow_blizzard(s32 snowCylinderX, s32 snowCylinderY, s32 snowCy 400.0f * random_float() - 200.0f + snowCylinderZ + (s16)(deltaZ * 2); (gEnvFxBuffer + i)->yPos = 400.0f * random_float() - 200.0f + snowCylinderY; (gEnvFxBuffer + i)->isAlive = TRUE; + (gEnvFxBuffer + i)->spawnTimestamp = gGlobalTimer; } else { (gEnvFxBuffer + i)->xPos += random_float() * 2 - 1.0f + (s16)(deltaX / 1.2) + 20.0f; (gEnvFxBuffer + i)->yPos -= 5 -(s16)(deltaY * 0.8); @@ -297,6 +319,7 @@ void envfx_update_snow_water(s32 snowCylinderX, s32 snowCylinderY, s32 snowCylin (gEnvFxBuffer + i)->zPos = 400.0f * random_float() - 200.0f + snowCylinderZ; (gEnvFxBuffer + i)->yPos = 400.0f * random_float() - 200.0f + snowCylinderY; (gEnvFxBuffer + i)->isAlive = TRUE; + (gEnvFxBuffer + i)->spawnTimestamp = gGlobalTimer; } } } @@ -347,29 +370,30 @@ void rotate_triangle_vertices(Vec3s vertex1, Vec3s vertex2, Vec3s vertex3, s16 p void append_snowflake_vertex_buffer(Gfx *gfx, s32 index, Vec3s vertex1, Vec3s vertex2, Vec3s vertex3) { s32 i = 0; Vtx *vertBuf = (Vtx *) alloc_display_list(15 * sizeof(Vtx)); + Vtx *vertBufInterpolated = (Vtx *) alloc_display_list(15 * sizeof(Vtx)); + Vtx *v; if (vertBuf == NULL) { return; } - for (i = 0; i < 15; i += 3) { - vertBuf[i] = gSnowTempVtx[0]; - (vertBuf + i)->v.ob[0] = (gEnvFxBuffer + (index + i / 3))->xPos + vertex1[0]; - (vertBuf + i)->v.ob[1] = (gEnvFxBuffer + (index + i / 3))->yPos + vertex1[1]; - (vertBuf + i)->v.ob[2] = (gEnvFxBuffer + (index + i / 3))->zPos + vertex1[2]; - - vertBuf[i + 1] = gSnowTempVtx[1]; - (vertBuf + i + 1)->v.ob[0] = (gEnvFxBuffer + (index + i / 3))->xPos + vertex2[0]; - (vertBuf + i + 1)->v.ob[1] = (gEnvFxBuffer + (index + i / 3))->yPos + vertex2[1]; - (vertBuf + i + 1)->v.ob[2] = (gEnvFxBuffer + (index + i / 3))->zPos + vertex2[2]; - - vertBuf[i + 2] = gSnowTempVtx[2]; - (vertBuf + i + 2)->v.ob[0] = (gEnvFxBuffer + (index + i / 3))->xPos + vertex3[0]; - (vertBuf + i + 2)->v.ob[1] = (gEnvFxBuffer + (index + i / 3))->yPos + vertex3[1]; - (vertBuf + i + 2)->v.ob[2] = (gEnvFxBuffer + (index + i / 3))->zPos + vertex3[2]; + for (i = 0; i < 15; i++) { + v = &sPrevSnowVertices[index / 5].vertices[i]; + vertBufInterpolated[i] = gSnowTempVtx[i % 3]; + if (index < sPrevSnowParticleCount && gGlobalTimer == sPrevSnowTimestamp + 1 && + gGlobalTimer != gEnvFxBuffer[index + i / 3].spawnTimestamp) { + vertBufInterpolated[i].v.ob[0] = (v->v.ob[0] + vertBuf[i].v.ob[0]) / 2; + vertBufInterpolated[i].v.ob[1] = (v->v.ob[1] + vertBuf[i].v.ob[1]) / 2; + vertBufInterpolated[i].v.ob[2] = (v->v.ob[2] + vertBuf[i].v.ob[2]) / 2; + } else { + vertBufInterpolated[i].v.ob[0] = vertBuf[i].v.ob[0]; + vertBufInterpolated[i].v.ob[1] = vertBuf[i].v.ob[1]; + vertBufInterpolated[i].v.ob[2] = vertBuf[i].v.ob[2]; + } + *v = vertBuf[i]; } - - gSPVertex(gfx, VIRTUAL_TO_PHYSICAL(vertBuf), 15, 0); + sPrevSnowVertices[index / 5].pos = gfx; + gSPVertex(gfx, VIRTUAL_TO_PHYSICAL(vertBufInterpolated), 15, 0); } /** @@ -453,8 +477,11 @@ Gfx *envfx_update_snow(s32 snowMode, Vec3s marioPos, Vec3s camFrom, Vec3s camTo) gSP1Triangle(gfx++, 9, 10, 11, 0); gSP1Triangle(gfx++, 12, 13, 14, 0); } + sPrevSnowParticleCount = gSnowParticleCount; + sPrevSnowTimestamp = gGlobalTimer; - gSPDisplayList(gfx++, &tiny_bubble_dl_0B006AB0) gSPEndDisplayList(gfx++); + gSPDisplayList(gfx++, &tiny_bubble_dl_0B006AB0); + gSPEndDisplayList(gfx++); return gfxStart; } diff --git a/src/game/envfx_snow.h b/src/game/envfx_snow.h index 92462d5d..23c6ff60 100644 --- a/src/game/envfx_snow.h +++ b/src/game/envfx_snow.h @@ -25,7 +25,7 @@ struct EnvFxParticle { s32 angleAndDist[2]; // for whirpools, [0] = angle from center, [1] = distance from center s32 unusedBubbleVar; // set to zero for bubbles when respawning, never used elsewhere s32 bubbleY; // for Bubbles, yPos is always set to this - u8 filler[24]; + u32 spawnTimestamp; }; extern s8 gEnvFxMode; diff --git a/src/game/hud.c b/src/game/hud.c index 93dd6e74..eb94390b 100644 --- a/src/game/hud.c +++ b/src/game/hud.c @@ -57,6 +57,20 @@ UNUSED static struct UnusedHUDStruct sUnusedHUDValues = { 0x00, 0x0A, 0x00 }; static struct CameraHUD sCameraHUD = { CAM_STATUS_NONE }; +static u32 sPowerMeterLastRenderTimestamp; +static s16 sPowerMeterLastY; +static Gfx *sPowerMeterDisplayListPos; + +void patch_interpolated_hud(void) { + if (sPowerMeterDisplayListPos != NULL) { + Mtx *mtx = alloc_display_list(sizeof(Mtx)); + guTranslate(mtx, (f32) sPowerMeterHUD.x, (f32) sPowerMeterHUD.y, 0); + gSPMatrix(sPowerMeterDisplayListPos, VIRTUAL_TO_PHYSICAL(mtx), + G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH); + sPowerMeterDisplayListPos = NULL; + } +} + /** * Renders a rgba16 16x16 glyph texture from a table list. */ @@ -107,12 +121,21 @@ void render_power_meter_health_segment(s16 numHealthWedges) { */ void render_dl_power_meter(s16 numHealthWedges) { Mtx *mtx = alloc_display_list(sizeof(Mtx)); + f32 interpolatedY; if (mtx == NULL) { return; } - guTranslate(mtx, (f32) sPowerMeterHUD.x, (f32) sPowerMeterHUD.y, 0); + if (gGlobalTimer == sPowerMeterLastRenderTimestamp + 1) { + interpolatedY = (sPowerMeterLastY + sPowerMeterHUD.y) / 2.0f; + } else { + interpolatedY = sPowerMeterHUD.y; + } + guTranslate(mtx, (f32) sPowerMeterHUD.x, interpolatedY, 0); + sPowerMeterLastY = sPowerMeterHUD.y; + sPowerMeterLastRenderTimestamp = gGlobalTimer; + sPowerMeterDisplayListPos = gDisplayListHead; gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(mtx++), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH); @@ -252,11 +275,7 @@ void render_hud_power_meter(void) { sPowerMeterVisibleTimer++; } -#ifdef VERSION_JP -#define HUD_TOP_Y 210 -#else #define HUD_TOP_Y 209 -#endif /** * Renders the amount of lives Mario has. @@ -276,11 +295,7 @@ void render_hud_coins(void) { print_text_fmt_int(198, HUD_TOP_Y, "%d", gHudDisplay.coins); } -#ifdef VERSION_JP -#define HUD_STARS_X 73 -#else -#define HUD_STARS_X 78 -#endif +#define HUD_STARS_X (ROM_JP ? 73 : 78) /** * Renders the amount of stars collected. @@ -430,6 +445,8 @@ void render_hud(void) { create_dl_ortho_matrix(); #endif + gSPDisableFiltering(gDisplayListHead++, TRUE); + if (gCurrentArea != NULL && gCurrentArea->camera->mode == CAMERA_MODE_INSIDE_CANNON) { render_hud_cannon_reticle(); } @@ -458,5 +475,7 @@ void render_hud(void) { if (hudDisplayFlags & HUD_DISPLAY_FLAG_TIMER) { render_hud_timer(); } + + gSPDisableFiltering(gDisplayListHead++, FALSE); } } diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index c6947c61..eadde543 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -1,4 +1,6 @@ #include +#include +#include #include "actors/common1.h" #include "area.h" @@ -20,14 +22,17 @@ #include "segment7.h" #include "seq_ids.h" #include "sm64.h" -#include "text_strings.h" #include "types.h" +#include "endianness.h" #ifdef VERSION_EU #undef LANGUAGE_FUNCTION #define LANGUAGE_FUNCTION gInGameLanguage #endif +static unsigned char textPause[] = { 0x19,0x0A,0x1E,0x1C,0x0E,0xFF }; +static unsigned char textHudCongratulations[] = { 0x0C,0x18,0x17,0x10,0x1B,0x0A,0x1D,0x1E,0x15,0x0A,0x1D,0x12,0x18,0x17,0x1C,0xFF }; + u16 gDialogColorFadeTimer; s8 gLastDialogLineNum; s32 gDialogVariable; @@ -66,34 +71,34 @@ enum DialogBoxType { #if defined(VERSION_US) || defined(VERSION_EU) u8 gDialogCharWidths[256] = { // TODO: Is there a way to auto generate this? - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, - 6, 6, 5, 6, 6, 5, 8, 8, 6, 6, 6, 6, 6, 5, 6, 6, - 8, 7, 6, 6, 6, 5, 5, 6, 5, 5, 6, 5, 4, 5, 5, 3, - 7, 5, 5, 5, 6, 5, 5, 5, 5, 5, 7, 7, 5, 5, 4, 4, - 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 8, 8, 7, 7, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, + 6, 6, 5, 6, 6, 5, 8, 8, 6, 6, 6, 6, 6, 5, 6, 6, + 8, 7, 6, 6, 6, 5, 5, 6, 5, 5, 6, 5, 4, 5, 5, 3, + 7, 5, 5, 5, 6, 5, 5, 5, 5, 5, 7, 7, 5, 5, 4, 4, + 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 7, 7, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, #ifdef VERSION_EU - 6, 6, 6, 0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 6, 6, 6, 0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 5, 5, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 4, 4, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, #else - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #endif - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #ifdef VERSION_EU - 7, 5, 10, 5, 9, 8, 4, 0, 0, 0, 0, 5, 5, 6, 5, 0, + 7, 5, 10, 5, 9, 8, 4, 0, 0, 0, 0, 5, 5, 6, 5, 0, #else - 7, 5, 10, 5, 9, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 5, 10, 5, 9, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, #endif - 0, 0, 5, 7, 7, 6, 6, 8, 0, 8, 10, 6, 4, 10, 0, 0 + 0, 0, 5, 7, 7, 6, 6, 8, 0, 8, 10, 6, 4, 10, 0, 0 }; #endif @@ -114,6 +119,41 @@ u8 gMenuHoldKeyIndex = 0; u8 gMenuHoldKeyTimer = 0; s32 gDialogResponse = DIALOG_RESPONSE_NONE; +static Gfx *sInterpolatedDialogOffsetPos; +static f32 sInterpolatedDialogOffset; +static Gfx *sInterpolatedDialogRotationPos; +static f32 sInterpolatedDialogScale; +static f32 sInterpolatedDialogRotation; +static Gfx *sInterpolatedDialogZoomPos; + +void patch_interpolated_dialog(void) { + Mtx *matrix; + + if (sInterpolatedDialogOffsetPos != NULL) { + matrix = (Mtx *) alloc_display_list(sizeof(Mtx)); + guTranslate(matrix, 0, sInterpolatedDialogOffset, 0); + gSPMatrix(sInterpolatedDialogOffsetPos, VIRTUAL_TO_PHYSICAL(matrix), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); + sInterpolatedDialogOffsetPos = NULL; + } + if (sInterpolatedDialogRotationPos != NULL) { + matrix = (Mtx *) alloc_display_list(sizeof(Mtx)); + guScale(matrix, 1.0 / sInterpolatedDialogScale, 1.0 / sInterpolatedDialogScale, 1.0f); + gSPMatrix(sInterpolatedDialogRotationPos++, VIRTUAL_TO_PHYSICAL(matrix), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); + matrix = (Mtx *) alloc_display_list(sizeof(Mtx)); + guRotate(matrix, sInterpolatedDialogRotation * 4.0f, 0, 0, 1.0f); + gSPMatrix(sInterpolatedDialogRotationPos, VIRTUAL_TO_PHYSICAL(matrix), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); + sInterpolatedDialogRotationPos = NULL; + } + if (sInterpolatedDialogZoomPos != NULL) { + matrix = (Mtx *) alloc_display_list(sizeof(Mtx)); + guTranslate(matrix, 65.0 - (65.0 / sInterpolatedDialogScale), (40.0 / sInterpolatedDialogScale) - 40, 0); + gSPMatrix(sInterpolatedDialogZoomPos++, VIRTUAL_TO_PHYSICAL(matrix), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); + matrix = (Mtx *) alloc_display_list(sizeof(Mtx)); + guScale(matrix, 1.0 / sInterpolatedDialogScale, 1.0 / sInterpolatedDialogScale, 1.0f); + gSPMatrix(sInterpolatedDialogZoomPos, VIRTUAL_TO_PHYSICAL(matrix), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); + sInterpolatedDialogZoomPos = NULL; + } +} void create_dl_identity_matrix(void) { Mtx *matrix = (Mtx *) alloc_display_list(sizeof(Mtx)); @@ -206,16 +246,14 @@ void create_dl_ortho_matrix(void) { gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(matrix), G_MTX_PROJECTION | G_MTX_MUL | G_MTX_NOPUSH); } -#if defined(VERSION_US) || defined(VERSION_EU) -UNUSED -#endif static u8 *alloc_ia8_text_from_i1(u16 *in, s16 width, s16 height) { s32 inPos; u16 bitMask; u8 *out; s16 outPos = 0; + // u16* in = ResourceGetDataByName(path); - out = (u8 *) alloc_display_list((u32) width * (u32) height); + out = alloc_display_list((u32) width * (u32) height); if (out == NULL) { return NULL; @@ -225,7 +263,7 @@ static u8 *alloc_ia8_text_from_i1(u16 *in, s16 width, s16 height) { bitMask = 0x8000; while (bitMask != 0) { - if (in[inPos] & bitMask) { + if (BSWAP16(in[inPos]) & bitMask) { out[outPos] = 0xFF; } else { out[outPos] = 0x00; @@ -240,21 +278,21 @@ static u8 *alloc_ia8_text_from_i1(u16 *in, s16 width, s16 height) { } void render_generic_char(u8 c) { - void **fontLUT = segmented_to_virtual(main_font_lut); - void *packedTexture = segmented_to_virtual(fontLUT[c]); -#if defined(VERSION_JP) || defined(VERSION_SH) - void *unpackedTexture = alloc_ia8_text_from_i1(packedTexture, 8, 16); -#endif + void **fontLUT = segmented_to_virtual(ROM_JP ? main_font_lut_jp : main_font_lut_us); + char* packedTexture = segmented_to_virtual(fontLUT[c]); + + if (packedTexture == NULL) { + return; + } -#ifndef VERSION_EU gDPPipeSync(gDisplayListHead++); -#endif -#if defined(VERSION_JP) || defined(VERSION_SH) - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_8b, 1, VIRTUAL_TO_PHYSICAL(unpackedTexture)); -#else - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_16b, 1, VIRTUAL_TO_PHYSICAL(packedTexture)); -#endif - gSPDisplayList(gDisplayListHead++, dl_ia_text_tex_settings); + if(ROM_JP){ + gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_8b, 1, VIRTUAL_TO_PHYSICAL(packedTexture)); + gSPDisplayList(gDisplayListHead++, dl_ia_text_tex_settings_jp); + } else { + gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_16b, 1, VIRTUAL_TO_PHYSICAL(packedTexture)); + gSPDisplayList(gDisplayListHead++, dl_ia_text_tex_settings_us); + } #ifdef VERSION_EU gSPTextureRectangleFlip(gDisplayListHead++, gDialogX << 2, (gDialogY - 16) << 2, (gDialogX + 8) << 2, gDialogY << 2, G_TX_RENDERTILE, 8 << 6, 4 << 6, 1 << 10, 1 << 10); @@ -339,15 +377,15 @@ void render_multi_text_string(s16 *xPos, s16 *yPos, s8 multiTextID) { s8 i; struct MultiTextEntry textLengths[2] = { - { 3, { TEXT_THE_RAW } }, - { 3, { TEXT_YOU_RAW } }, + { 3, { TEXT_THE_RAW } }, + { 3, { TEXT_YOU_RAW } }, }; for (i = 0; i < textLengths[multiTextID].length; i++) { #if defined(VERSION_US) render_generic_char(textLengths[multiTextID].str[i]); create_dl_translation_matrix( - MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[textLengths[multiTextID].str[i]]), 0.0f, 0.0f); + MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[textLengths[multiTextID].str[i]]), 0.0f, 0.0f); #elif defined(VERSION_EU) render_generic_char_at_pos(*xPos, *yPos, textLengths[multiTextID].str[i]); *xPos += gDialogCharWidths[textLengths[multiTextID].str[i]]; @@ -356,15 +394,9 @@ void render_multi_text_string(s16 *xPos, s16 *yPos, s8 multiTextID) } #endif -#if defined(VERSION_JP) || defined(VERSION_SH) - #define MAX_STRING_WIDTH 18 - #define CHAR_WIDTH_SPACE 5.0f - #define CHAR_WIDTH_DEFAULT 10.0f -#else - #define MAX_STRING_WIDTH 16 - #define CHAR_WIDTH_SPACE (f32)(gDialogCharWidths[DIALOG_CHAR_SPACE]) - #define CHAR_WIDTH_DEFAULT (f32)(gDialogCharWidths[str[strPos]]) -#endif +#define MAX_STRING_WIDTH (ROM_JP ? 18 : 16) +#define CHAR_WIDTH_SPACE (ROM_JP ? 5.0f : (f32)(gDialogCharWidths[DIALOG_CHAR_SPACE])) +#define CHAR_WIDTH_DEFAULT (ROM_JP ? 10.0f : (f32)(gDialogCharWidths[str[strPos]])) /** * Prints a generic white string. @@ -381,59 +413,11 @@ void print_generic_string(s16 x, s16 y, const u8 *str) { #ifndef VERSION_EU create_dl_translation_matrix(MENU_MTX_PUSH, x, y, 0.0f); + gSPDisableFiltering(gDisplayListHead++, TRUE); #endif while (str[strPos] != DIALOG_CHAR_TERMINATOR) { switch (str[strPos]) { -#ifdef VERSION_EU - case DIALOG_CHAR_SPACE: - xCoord += 5; - break; - case DIALOG_CHAR_NEWLINE: - yCoord += 16; - xCoord = x; - lineNum++; - break; - case DIALOG_CHAR_LOWER_A_GRAVE: - case DIALOG_CHAR_LOWER_A_CIRCUMFLEX: - case DIALOG_CHAR_LOWER_A_UMLAUT: - render_lowercase_diacritic(&xCoord, &yCoord, ASCII_TO_DIALOG('a'), str[strPos] & 0xF); - break; - case DIALOG_CHAR_UPPER_A_UMLAUT: // @bug grave and circumflex (0x64-0x65) are absent here - render_uppercase_diacritic(&xCoord, &yCoord, ASCII_TO_DIALOG('A'), str[strPos] & 0xF); - break; - case DIALOG_CHAR_LOWER_E_GRAVE: - case DIALOG_CHAR_LOWER_E_CIRCUMFLEX: - case DIALOG_CHAR_LOWER_E_UMLAUT: - case DIALOG_CHAR_LOWER_E_ACUTE: - render_lowercase_diacritic(&xCoord, &yCoord, ASCII_TO_DIALOG('e'), str[strPos] & 0xF); - break; - case DIALOG_CHAR_UPPER_E_GRAVE: - case DIALOG_CHAR_UPPER_E_CIRCUMFLEX: - case DIALOG_CHAR_UPPER_E_UMLAUT: - case DIALOG_CHAR_UPPER_E_ACUTE: - render_uppercase_diacritic(&xCoord, &yCoord, ASCII_TO_DIALOG('E'), str[strPos] & 0xF); - break; - case DIALOG_CHAR_LOWER_U_GRAVE: - case DIALOG_CHAR_LOWER_U_CIRCUMFLEX: - case DIALOG_CHAR_LOWER_U_UMLAUT: - render_lowercase_diacritic(&xCoord, &yCoord, ASCII_TO_DIALOG('u'), str[strPos] & 0xF); - break; - case DIALOG_CHAR_UPPER_U_UMLAUT: // @bug grave and circumflex (0x84-0x85) are absent here - render_uppercase_diacritic(&xCoord, &yCoord, ASCII_TO_DIALOG('U'), str[strPos] & 0xF); - break; - case DIALOG_CHAR_LOWER_O_CIRCUMFLEX: - case DIALOG_CHAR_LOWER_O_UMLAUT: - render_lowercase_diacritic(&xCoord, &yCoord, ASCII_TO_DIALOG('o'), str[strPos] & 0xF); - break; - case DIALOG_CHAR_UPPER_O_UMLAUT: // @bug circumflex (0x95) is absent here - render_uppercase_diacritic(&xCoord, &yCoord, ASCII_TO_DIALOG('O'), str[strPos] & 0xF); - break; - case DIALOG_CHAR_LOWER_I_CIRCUMFLEX: - case DIALOG_CHAR_LOWER_I_UMLAUT: - render_lowercase_diacritic(&xCoord, &yCoord, DIALOG_CHAR_I_NO_DIA, str[strPos] & 0xF); - break; -#else // i.e. not EU case DIALOG_CHAR_DAKUTEN: mark = DIALOG_MARK_DAKUTEN; break; @@ -450,7 +434,6 @@ void print_generic_string(s16 x, s16 y, const u8 *str) { render_generic_char(DIALOG_CHAR_PERIOD_OR_HANDAKUTEN); gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); break; -#endif #if defined(VERSION_US) || defined(VERSION_EU) case DIALOG_CHAR_SLASH: @@ -458,7 +441,7 @@ void print_generic_string(s16 x, s16 y, const u8 *str) { xCoord += gDialogCharWidths[DIALOG_CHAR_SPACE] * 2; #else create_dl_translation_matrix( - MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[DIALOG_CHAR_SPACE] * 2), 0.0f, 0.0f); + MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[DIALOG_CHAR_SPACE] * 2), 0.0f, 0.0f); #endif break; case DIALOG_CHAR_MULTI_THE: @@ -481,9 +464,6 @@ void print_generic_string(s16 x, s16 y, const u8 *str) { case DIALOG_CHAR_SPACE: create_dl_translation_matrix(MENU_MTX_NOPUSH, CHAR_WIDTH_SPACE, 0.0f, 0.0f); break; -#ifdef VERSION_JP - break; // ? needed to match -#endif #endif default: @@ -500,9 +480,6 @@ void print_generic_string(s16 x, s16 y, const u8 *str) { } create_dl_translation_matrix(MENU_MTX_NOPUSH, CHAR_WIDTH_DEFAULT, 0.0f, 0.0f); -#endif -#ifndef VERSION_JP - break; // what an odd difference. US (and probably later) versions added a useless break here. #endif } @@ -511,6 +488,7 @@ void print_generic_string(s16 x, s16 y, const u8 *str) { #ifndef VERSION_EU gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); + gSPDisableFiltering(gDisplayListHead++, FALSE); #endif } @@ -539,64 +517,76 @@ void print_hud_lut_string(s8 hudLUT, s16 x, s16 y, const u8 *str) { u32 curX = x; u32 curY = y; + gSPDisableFiltering(gDisplayListHead++, TRUE); u32 xStride; // X separation if (hudLUT == HUD_LUT_JPMENU) { xStride = 16; } else { // HUD_LUT_GLOBAL -#ifdef VERSION_JP - xStride = 14; -#else - xStride = 12; //? Shindou uses this. -#endif + xStride = ROM_JP ? 14 : 12; } while (str[strPos] != GLOBAR_CHAR_TERMINATOR) { -#ifndef VERSION_JP - switch (str[strPos]) { -#ifdef VERSION_EU - case GLOBAL_CHAR_SPACE: - curX += xStride / 2; - break; - case HUD_CHAR_A_UMLAUT: - print_hud_char_umlaut(curX, curY, ASCII_TO_DIALOG('A')); - curX += xStride; - break; - case HUD_CHAR_O_UMLAUT: - print_hud_char_umlaut(curX, curY, ASCII_TO_DIALOG('O')); - curX += xStride; - break; - case HUD_CHAR_U_UMLAUT: - print_hud_char_umlaut(curX, curY, ASCII_TO_DIALOG('U')); - curX += xStride; - break; -#else - case GLOBAL_CHAR_SPACE: - curX += 8; - break; -#endif - default: -#endif - gDPPipeSync(gDisplayListHead++); + if(!ROM_JP){ + switch (str[strPos]) { + #ifdef VERSION_EU + case GLOBAL_CHAR_SPACE: + curX += xStride / 2; + break; + case HUD_CHAR_A_UMLAUT: + print_hud_char_umlaut(curX, curY, ASCII_TO_DIALOG('A')); + curX += xStride; + break; + case HUD_CHAR_O_UMLAUT: + print_hud_char_umlaut(curX, curY, ASCII_TO_DIALOG('O')); + curX += xStride; + break; + case HUD_CHAR_U_UMLAUT: + print_hud_char_umlaut(curX, curY, ASCII_TO_DIALOG('U')); + curX += xStride; + break; + #else + case GLOBAL_CHAR_SPACE: + curX += 8; + break; + #endif + default: + gDPPipeSync(gDisplayListHead++); - if (hudLUT == HUD_LUT_JPMENU) { - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, hudLUT1[str[strPos]]); - } + if (hudLUT == HUD_LUT_JPMENU) { + gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, hudLUT1[str[strPos]]); + } - if (hudLUT == HUD_LUT_GLOBAL) { - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, hudLUT2[str[strPos]]); - } + if (hudLUT == HUD_LUT_GLOBAL) { + gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, hudLUT2[str[strPos]]); + } - gSPDisplayList(gDisplayListHead++, dl_rgba16_load_tex_block); - gSPTextureRectangle(gDisplayListHead++, curX << 2, curY << 2, (curX + 16) << 2, - (curY + 16) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + gSPDisplayList(gDisplayListHead++, dl_rgba16_load_tex_block); + gSPTextureRectangle(gDisplayListHead++, curX << 2, curY << 2, (curX + 16) << 2, + (curY + 16) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); - curX += xStride; -#ifndef VERSION_JP + curX += xStride; + } + } else { + gDPPipeSync(gDisplayListHead++); + + if (hudLUT == HUD_LUT_JPMENU) { + gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, hudLUT1[str[strPos]]); + } + + if (hudLUT == HUD_LUT_GLOBAL) { + gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, hudLUT2[str[strPos]]); + } + + gSPDisplayList(gDisplayListHead++, dl_rgba16_load_tex_block); + gSPTextureRectangle(gDisplayListHead++, curX << 2, curY << 2, (curX + 16) << 2, + (curY + 16) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + + curX += xStride; } -#endif strPos++; } + gSPDisableFiltering(gDisplayListHead++, FALSE); } #ifdef VERSION_EU @@ -620,7 +610,8 @@ void print_menu_generic_string(s16 x, s16 y, const u8 *str) { s32 strPos = 0; u32 curX = x; u32 curY = y; - void **fontLUT = segmented_to_virtual(menu_font_lut); + void **fontLUT = segmented_to_virtual(ROM_JP ? menu_font_lut_jp : menu_font_lut_us); + gSPDisableFiltering(gDisplayListHead++, TRUE); while (str[strPos] != DIALOG_CHAR_TERMINATOR) { switch (str[strPos]) { @@ -666,14 +657,12 @@ void print_menu_generic_string(s16 x, s16 y, const u8 *str) { mark = DIALOG_MARK_NONE; } #endif -#if defined(VERSION_JP) || defined(VERSION_SH) - curX += 9; -#else - curX += gDialogCharWidths[str[strPos]]; -#endif + curX += ROM_JP ? 9 : gDialogCharWidths[str[strPos]]; } strPos++; } + + gSPDisableFiltering(gDisplayListHead++, FALSE); } void print_credits_string(s16 x, s16 y, const u8 *str) { @@ -683,10 +672,10 @@ void print_credits_string(s16 x, s16 y, const u8 *str) { u32 curY = y; gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, - G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD); + G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD); gDPTileSync(gDisplayListHead++); gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 2, 0, G_TX_RENDERTILE, 0, - G_TX_CLAMP, 3, G_TX_NOLOD, G_TX_CLAMP, 3, G_TX_NOLOD); + G_TX_CLAMP, 3, G_TX_NOLOD, G_TX_CLAMP, 3, G_TX_NOLOD); gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, (8 - 1) << G_TEXTURE_IMAGE_FRAC, (8 - 1) << G_TEXTURE_IMAGE_FRAC); while (str[strPos] != GLOBAR_CHAR_TERMINATOR) { @@ -765,6 +754,9 @@ void handle_menu_scrolling(s8 scrollDirection, s8 *currentIndex, s8 minIndex, s8 // JP, US and Shindou only implement one or the other #if defined(VERSION_US) || defined(VERSION_EU) s16 get_str_x_pos_from_center(s16 centerPos, u8 *str, UNUSED f32 scale) { + if(ROM_JP){ + return get_str_x_pos_from_center_scale(centerPos, str, scale); + } s16 strPos = 0; f32 spacesWidth = 0.0f; @@ -778,7 +770,6 @@ s16 get_str_x_pos_from_center(s16 centerPos, u8 *str, UNUSED f32 scale) { } #endif -#if defined(VERSION_JP) || defined(VERSION_EU) || defined(VERSION_SH) s16 get_str_x_pos_from_center_scale(s16 centerPos, u8 *str, f32 scale) { s16 strPos = 0; f32 charsWidth = 0.0f; @@ -798,7 +789,6 @@ s16 get_str_x_pos_from_center_scale(s16 centerPos, u8 *str, f32 scale) { // length from the position of the provided center. return (f32) centerPos - (scale * (charsWidth / 2.0)) - ((scale / 2.0) * (spacesWidth / 2.0)); } -#endif #if defined(VERSION_US) || defined(VERSION_EU) s16 get_string_width(u8 *str) { @@ -930,15 +920,9 @@ void reset_dialog_render_state(void) { gDialogResponse = DIALOG_RESPONSE_NONE; } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define X_VAL1 -5.0f - #define Y_VAL1 2.0 - #define Y_VAL2 4 -#else - #define X_VAL1 -7.0f - #define Y_VAL1 5.0 - #define Y_VAL2 5.0f -#endif +#define X_VAL1 (ROM_JP ? -5.0f : -7.0f) +#define Y_VAL1 (ROM_JP ? 2.0 : 5.0) +#define Y_VAL2 (ROM_JP ? 4 : 5.0f) void render_dialog_box_type(struct DialogEntry *dialog, s8 linesPerBox) { UNUSED u8 filler[4]; @@ -948,6 +932,14 @@ void render_dialog_box_type(struct DialogEntry *dialog, s8 linesPerBox) { switch (gDialogBoxType) { case DIALOG_TYPE_ROTATE: // Renders a dialog black box with zoom and rotation if (gDialogBoxState == DIALOG_STATE_OPENING || gDialogBoxState == DIALOG_STATE_CLOSING) { + sInterpolatedDialogRotationPos = gDisplayListHead; + if (gDialogBoxState == DIALOG_STATE_OPENING) { + sInterpolatedDialogScale = gDialogBoxScale - 2 / 2; + sInterpolatedDialogRotation = gDialogBoxOpenTimer - 7.5f / 2; + } else { + sInterpolatedDialogScale = gDialogBoxScale + 2 / 2; + sInterpolatedDialogRotation = gDialogBoxOpenTimer + 7.5f / 2; + } create_dl_scale_matrix(MENU_MTX_NOPUSH, 1.0 / gDialogBoxScale, 1.0 / gDialogBoxScale, 1.0f); // convert the speed into angle create_dl_rotation_matrix(MENU_MTX_NOPUSH, gDialogBoxOpenTimer * 4.0f, 0, 0, 1.0f); @@ -956,8 +948,14 @@ void render_dialog_box_type(struct DialogEntry *dialog, s8 linesPerBox) { break; case DIALOG_TYPE_ZOOM: // Renders a dialog white box with zoom if (gDialogBoxState == DIALOG_STATE_OPENING || gDialogBoxState == DIALOG_STATE_CLOSING) { + sInterpolatedDialogZoomPos = gDisplayListHead; + if (gDialogBoxState == DIALOG_STATE_OPENING) { + sInterpolatedDialogScale = gDialogBoxScale - 2 / 2; + } else { + sInterpolatedDialogScale = gDialogBoxScale + 2 / 2; + } create_dl_translation_matrix(MENU_MTX_NOPUSH, 65.0 - (65.0 / gDialogBoxScale), - (40.0 / gDialogBoxScale) - 40, 0); + (40.0 / gDialogBoxScale) - 40, 0); create_dl_scale_matrix(MENU_MTX_NOPUSH, 1.0 / gDialogBoxScale, 1.0 / gDialogBoxScale, 1.0f); } gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, 150); @@ -1016,13 +1014,8 @@ void render_generic_dialog_char_at_pos(struct DialogEntry *dialog, s16 x, s16 y, } #endif -#if defined(VERSION_JP) || defined(VERSION_SH) - #define X_VAL3 5.0f - #define Y_VAL3 20 -#else - #define X_VAL3 0.0f - #define Y_VAL3 16 -#endif +#define X_VAL3 (ROM_JP ? 5.0f : 0.0f) +#define Y_VAL3 (ROM_JP ? 20 : 16) #ifdef VERSION_EU void handle_dialog_scroll_page_state(s8 lineNum, s8 totalLines, s8 *pageState, s8 *xMatrix) @@ -1048,7 +1041,6 @@ void handle_dialog_scroll_page_state(s8 lineNum, s8 totalLines, s8 *pageState, s *xMatrix = 1; } -#if defined(VERSION_JP) || defined(VERSION_SH) void adjust_pos_and_print_period_char(s8 *xMatrix, s16 *linePos) { if (*linePos != 0) { create_dl_translation_matrix(MENU_MTX_NOPUSH, 10 * *xMatrix, 0, 0); @@ -1062,7 +1054,6 @@ void adjust_pos_and_print_period_char(s8 *xMatrix, s16 *linePos) { (*linePos)++; *xMatrix = 1; } -#endif #ifdef VERSION_EU void render_star_count_dialog_text(struct DialogEntry *dialog, s8 *linePos) @@ -1074,46 +1065,46 @@ void render_star_count_dialog_text(s8 *xMatrix, s16 *linePos) s8 onesDigit = gDialogVariable - (tensDigit * 10); // remainder if (tensDigit != 0) { -#if defined(VERSION_JP) || defined(VERSION_SH) - create_dl_translation_matrix(MENU_MTX_NOPUSH, 10 * *xMatrix, 0, 0); - render_generic_char(tensDigit); -#elif defined(VERSION_US) - if (*xMatrix != 1) { +#if !defined(VERSION_EU) + if(ROM_JP){ + create_dl_translation_matrix(MENU_MTX_NOPUSH, 10 * *xMatrix, 0, 0); + render_generic_char(tensDigit); + } else { + if (*xMatrix != 1) { create_dl_translation_matrix( - MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[DIALOG_CHAR_SPACE] * *xMatrix), 0, 0); - } + MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[DIALOG_CHAR_SPACE] * *xMatrix), 0, 0); + } - render_generic_char(tensDigit); - create_dl_translation_matrix(MENU_MTX_NOPUSH, (f32) gDialogCharWidths[tensDigit], 0, 0); - *xMatrix = 1; - (*linePos)++; -#elif defined(VERSION_EU) + render_generic_char(tensDigit); + create_dl_translation_matrix(MENU_MTX_NOPUSH, (f32) gDialogCharWidths[tensDigit], 0, 0); + *xMatrix = 1; + (*linePos)++; + } +#else render_generic_dialog_char_at_pos(dialog, gDialogX, gDialogY, tensDigit); gDialogX += gDialogCharWidths[tensDigit]; *linePos = 1; #endif } #ifndef VERSION_EU - else { -#if defined(VERSION_JP) || defined(VERSION_SH) + else if(ROM_JP) { (*xMatrix)++; -#endif } #endif #ifndef VERSION_EU -#if defined(VERSION_JP) || defined(VERSION_SH) - create_dl_translation_matrix(MENU_MTX_NOPUSH, 10 * *xMatrix, 0, 0); - render_generic_char(onesDigit); -#elif defined(VERSION_US) - if (*xMatrix != 1) { - create_dl_translation_matrix( - MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[DIALOG_CHAR_SPACE] * (*xMatrix - 1)), 0, 0); - } + if(ROM_JP){ + create_dl_translation_matrix(MENU_MTX_NOPUSH, 10 * *xMatrix, 0, 0); + render_generic_char(onesDigit); + } else { + if (*xMatrix != 1) { + create_dl_translation_matrix( + MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[DIALOG_CHAR_SPACE] * (*xMatrix - 1)), 0, 0); + } - render_generic_char(onesDigit); - create_dl_translation_matrix(MENU_MTX_NOPUSH, (f32) gDialogCharWidths[onesDigit], 0, 0); -#endif + render_generic_char(onesDigit); + create_dl_translation_matrix(MENU_MTX_NOPUSH, (f32) gDialogCharWidths[onesDigit], 0, 0); + } (*linePos)++; *xMatrix = 1; #else // VERSION_EU @@ -1132,15 +1123,15 @@ void render_multi_text_string_lines(s8 multiTextId, s8 lineNum, s16 *linePos, s8 { s8 i; struct MultiTextEntry textLengths[2] = { - { 3, { TEXT_THE_RAW } }, - { 3, { TEXT_YOU_RAW } }, + { 3, { TEXT_THE_RAW } }, + { 3, { TEXT_YOU_RAW } }, }; if (lineNum >= lowerBound && lineNum <= (lowerBound + linesPerBox)) { #ifdef VERSION_US if (*linePos != 0 || xMatrix != 1) { create_dl_translation_matrix( - MENU_MTX_NOPUSH, (gDialogCharWidths[DIALOG_CHAR_SPACE] * (xMatrix - 1)), 0, 0); + MENU_MTX_NOPUSH, (gDialogCharWidths[DIALOG_CHAR_SPACE] * (xMatrix - 1)), 0, 0); } #endif for (i = 0; i < textLengths[multiTextId].length; i++) { @@ -1150,7 +1141,7 @@ void render_multi_text_string_lines(s8 multiTextId, s8 lineNum, s16 *linePos, s8 #else render_generic_char(textLengths[multiTextId].str[i]); create_dl_translation_matrix( - MENU_MTX_NOPUSH, (gDialogCharWidths[textLengths[multiTextId].str[i]]), 0, 0); + MENU_MTX_NOPUSH, (gDialogCharWidths[textLengths[multiTextId].str[i]]), 0, 0); #endif } } @@ -1183,16 +1174,8 @@ u32 ensure_nonnegative(s16 value) { return value; } -#ifdef VERSION_JP -void handle_dialog_text_and_pages(s8 colorMode, struct DialogEntry *dialog) -#else -void handle_dialog_text_and_pages(s8 colorMode, struct DialogEntry *dialog, s8 lowerBound) -#endif -{ +void handle_dialog_text_and_pages(s8 colorMode, struct DialogEntry *dialog, s8 lowerBound) { UNUSED u8 filler[8]; -#ifdef VERSION_EU - s16 startY = 14; -#endif u8 strChar; u8 *str = segmented_to_virtual(dialog->str); s8 lineNum = 1; @@ -1202,9 +1185,7 @@ void handle_dialog_text_and_pages(s8 colorMode, struct DialogEntry *dialog, s8 l s8 xMatrix = 1; s8 linesPerBox = dialog->linesPerBox; s16 strIdx; -#ifndef VERSION_EU s16 linePos = 0; -#endif if (gDialogBoxState == DIALOG_STATE_HORIZONTAL) { // If scrolling, consider the number of lines for both @@ -1214,26 +1195,17 @@ void handle_dialog_text_and_pages(s8 colorMode, struct DialogEntry *dialog, s8 l totalLines = linesPerBox + 1; } - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); strIdx = gDialogTextPos; -#ifdef VERSION_EU - gDialogX = 0; - gDialogY = startY; -#endif - if (gDialogBoxState == DIALOG_STATE_HORIZONTAL) { -#ifdef VERSION_EU - gDialogY -= gDialogScrollOffsetY; -#else + sInterpolatedDialogOffset = gDialogScrollOffsetY + dialog->linesPerBox; + sInterpolatedDialogOffsetPos = gDisplayListHead; create_dl_translation_matrix(MENU_MTX_NOPUSH, 0, (f32) gDialogScrollOffsetY, 0); -#endif } -#ifndef VERSION_EU create_dl_translation_matrix(MENU_MTX_PUSH, X_VAL3, 2 - lineNum * Y_VAL3, 0); -#endif while (pageState == DIALOG_PAGE_STATE_NONE) { change_and_flash_dialog_text_color_lines(colorMode, lineNum); @@ -1242,143 +1214,52 @@ void handle_dialog_text_and_pages(s8 colorMode, struct DialogEntry *dialog, s8 l switch (strChar) { case DIALOG_CHAR_TERMINATOR: pageState = DIALOG_PAGE_STATE_END; -#ifndef VERSION_EU - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); -#endif break; case DIALOG_CHAR_NEWLINE: lineNum++; -#ifdef VERSION_EU - handle_dialog_scroll_page_state(lineNum, totalLines, &pageState, &xMatrix); - gDialogX = 0; -#else handle_dialog_scroll_page_state(lineNum, totalLines, &pageState, &xMatrix, &linePos); -#ifdef VERSION_SH - mark = DIALOG_MARK_NONE; -#endif -#endif break; - -#ifdef VERSION_EU - case DIALOG_CHAR_LOWER_A_GRAVE: - case DIALOG_CHAR_LOWER_A_CIRCUMFLEX: - case DIALOG_CHAR_LOWER_A_UMLAUT: - render_dialog_lowercase_diacritic(dialog, ASCII_TO_DIALOG('a'), strChar & 0xF); - break; - case DIALOG_CHAR_UPPER_A_GRAVE: - case DIALOG_CHAR_UPPER_A_CIRCUMFLEX: - case DIALOG_CHAR_UPPER_A_UMLAUT: - render_dialog_uppercase_diacritic(dialog, ASCII_TO_DIALOG('A'), strChar & 0xF); - break; - case DIALOG_CHAR_LOWER_E_GRAVE: - case DIALOG_CHAR_LOWER_E_CIRCUMFLEX: - case DIALOG_CHAR_LOWER_E_UMLAUT: - case DIALOG_CHAR_LOWER_E_ACUTE: - render_dialog_lowercase_diacritic(dialog, ASCII_TO_DIALOG('e'), strChar & 0xF); - break; - case DIALOG_CHAR_UPPER_E_GRAVE: - case DIALOG_CHAR_UPPER_E_CIRCUMFLEX: - case DIALOG_CHAR_UPPER_E_UMLAUT: - case DIALOG_CHAR_UPPER_E_ACUTE: - render_dialog_uppercase_diacritic(dialog, ASCII_TO_DIALOG('E'), strChar & 0xF); - break; - case DIALOG_CHAR_LOWER_U_GRAVE: - case DIALOG_CHAR_LOWER_U_CIRCUMFLEX: - case DIALOG_CHAR_LOWER_U_UMLAUT: - render_dialog_lowercase_diacritic(dialog, ASCII_TO_DIALOG('u'), strChar & 0xF); - break; - case DIALOG_CHAR_UPPER_U_GRAVE: - case DIALOG_CHAR_UPPER_U_CIRCUMFLEX: - case DIALOG_CHAR_UPPER_U_UMLAUT: - render_dialog_uppercase_diacritic(dialog, ASCII_TO_DIALOG('U'), strChar & 0xF); - break; - case DIALOG_CHAR_LOWER_O_CIRCUMFLEX: - case DIALOG_CHAR_LOWER_O_UMLAUT: - render_dialog_lowercase_diacritic(dialog, ASCII_TO_DIALOG('o'), strChar & 0xF); - break; - case DIALOG_CHAR_UPPER_O_CIRCUMFLEX: - case DIALOG_CHAR_UPPER_O_UMLAUT: - render_dialog_uppercase_diacritic(dialog, ASCII_TO_DIALOG('O'), strChar & 0xF); - break; - case DIALOG_CHAR_LOWER_I_CIRCUMFLEX: - case DIALOG_CHAR_LOWER_I_UMLAUT: - render_dialog_lowercase_diacritic(dialog, DIALOG_CHAR_I_NO_DIA, strChar & 0xF); - break; -#else case DIALOG_CHAR_DAKUTEN: mark = DIALOG_MARK_DAKUTEN; break; case DIALOG_CHAR_PERIOD_OR_HANDAKUTEN: mark = DIALOG_MARK_HANDAKUTEN; break; -#endif case DIALOG_CHAR_SPACE: -#ifdef VERSION_EU - gDialogX += gDialogCharWidths[DIALOG_CHAR_SPACE]; -#else -#if defined(VERSION_JP) || defined(VERSION_SH) - if (linePos != 0) { -#endif + if(!ROM_JP || linePos != 0){ xMatrix++; -#if defined(VERSION_JP) || defined(VERSION_SH) } -#endif linePos++; -#endif break; - -#if defined(VERSION_JP) || defined(VERSION_SH) - case DIALOG_CHAR_PERIOD: - adjust_pos_and_print_period_char(&xMatrix, &linePos); - break; -#else - case DIALOG_CHAR_SLASH: -#ifdef VERSION_EU - gDialogX += gDialogCharWidths[DIALOG_CHAR_SPACE] * 2; -#else - xMatrix += 2; - linePos += 2; -#endif - break; - case DIALOG_CHAR_MULTI_THE: -#ifdef VERSION_EU - render_multi_text_string_lines(STRING_THE, lineNum, linesPerBox, xMatrix, lowerBound, dialog); -#else - render_multi_text_string_lines(STRING_THE, lineNum, &linePos, linesPerBox, xMatrix, lowerBound); -#endif - xMatrix = 1; - break; - case DIALOG_CHAR_MULTI_YOU: -#ifdef VERSION_EU - render_multi_text_string_lines(STRING_YOU, lineNum, linesPerBox, xMatrix, lowerBound, dialog); -#else - render_multi_text_string_lines(STRING_YOU, lineNum, &linePos, linesPerBox, xMatrix, lowerBound); -#endif - xMatrix = 1; - break; -#endif - case DIALOG_CHAR_STAR_COUNT: -#ifdef VERSION_EU - render_star_count_dialog_text(dialog, &xMatrix); -#else render_star_count_dialog_text(&xMatrix, &linePos); -#endif break; - -#ifdef VERSION_EU - case DIALOG_CHAR_DOUBLE_LOW_QUOTE: - render_generic_dialog_char_at_pos(dialog, gDialogX, gDialogY + 8, 0xF6); - gDialogX += gDialogCharWidths[0xF6]; - break; -#endif - - default: // any other character -#if defined(VERSION_JP) || defined(VERSION_SH) -#ifdef VERSION_SH - if (lineNum >= lowerBound && lineNum <= (lowerBound + linesPerBox)) { -#endif + case DIALOG_CHAR_PERIOD: + if(ROM_JP) { + adjust_pos_and_print_period_char(&xMatrix, &linePos); + break; + } + case DIALOG_CHAR_SLASH: + if(!ROM_JP){ + xMatrix += 2; + linePos += 2; + break; + } + case DIALOG_CHAR_MULTI_THE: + if(!ROM_JP){ + render_multi_text_string_lines(STRING_THE, lineNum, &linePos, linesPerBox, xMatrix, lowerBound); + xMatrix = 1; + break; + } + case DIALOG_CHAR_MULTI_YOU: + if(!ROM_JP){ + render_multi_text_string_lines(STRING_YOU, lineNum, &linePos, linesPerBox, xMatrix, lowerBound); + xMatrix = 1; + break; + } + default: + if(ROM_JP){ if (linePos != 0) { create_dl_translation_matrix(MENU_MTX_NOPUSH, 10 * xMatrix, 0, 0); } @@ -1393,31 +1274,23 @@ void handle_dialog_text_and_pages(s8 colorMode, struct DialogEntry *dialog, s8 l gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); mark = DIALOG_MARK_NONE; } -#ifdef VERSION_SH - } -#endif -#elif defined(VERSION_US) - if (lineNum >= lowerBound && lineNum <= (lowerBound + linesPerBox)) { - if (linePos != 0 || xMatrix != 1) { - create_dl_translation_matrix( - MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[DIALOG_CHAR_SPACE] * (xMatrix - 1)), 0, 0); - } + } else { + if (lineNum >= lowerBound && lineNum <= (lowerBound + linesPerBox)) { + if (linePos != 0 || xMatrix != 1) { + create_dl_translation_matrix( + MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[DIALOG_CHAR_SPACE] * (xMatrix - 1)), 0, 0); + } - render_generic_char(strChar); - create_dl_translation_matrix(MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[strChar]), 0, 0); - xMatrix = 1; - linePos++; + render_generic_char(strChar); + create_dl_translation_matrix(MENU_MTX_NOPUSH, (f32)(gDialogCharWidths[strChar]), 0, 0); + xMatrix = 1; + linePos++; + } } -#else // VERSION_EU - if (lineNum >= lowerBound && lineNum <= (lowerBound + linesPerBox)) { - render_generic_dialog_char_at_pos(dialog, gDialogX, gDialogY, strChar); - } - gDialogX += gDialogCharWidths[strChar]; -#endif + break; } -#ifdef VERSION_JP - if (linePos == 12) { + if (ROM_JP && linePos == 12) { if (str[strIdx + 1] == DIALOG_CHAR_PERIOD) { adjust_pos_and_print_period_char(&xMatrix, &linePos); strIdx++; @@ -1442,7 +1315,6 @@ void handle_dialog_text_and_pages(s8 colorMode, struct DialogEntry *dialog, s8 l handle_dialog_scroll_page_state(lineNum, totalLines, &pageState, &xMatrix, &linePos); } } -#endif strIdx++; } @@ -1460,17 +1332,10 @@ void handle_dialog_text_and_pages(s8 colorMode, struct DialogEntry *dialog, s8 l gLastDialogLineNum = lineNum; } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define X_VAL4_1 50 - #define X_VAL4_2 25 - #define Y_VAL4_1 1 - #define Y_VAL4_2 20 -#else - #define X_VAL4_1 56 - #define X_VAL4_2 47 - #define Y_VAL4_1 2 - #define Y_VAL4_2 16 -#endif +#define X_VAL4_1 (ROM_JP ? 50 : 56) +#define X_VAL4_2 (ROM_JP ? 25 : 47) +#define Y_VAL4_1 (ROM_JP ? 1 : 2) +#define Y_VAL4_2 (ROM_JP ? 20 : 16) void render_dialog_triangle_choice(void) { if (gDialogBoxState == DIALOG_STATE_VERTICAL) { @@ -1488,18 +1353,13 @@ void render_dialog_triangle_choice(void) { gSPDisplayList(gDisplayListHead++, dl_draw_triangle); } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define X_VAL5 123.0f - #define Y_VAL5_1 -20 - #define Y_VAL5_2 2 - #define X_Y_VAL6 0.8f -#elif defined(VERSION_US) - #define X_VAL5 118.0f - #define Y_VAL5_1 -16 - #define Y_VAL5_2 5 - #define X_Y_VAL6 0.8f +#if defined(VERSION_US) +#define X_VAL5 (ROM_JP ? 123.0f : 118.0f) +#define Y_VAL5_1 (ROM_JP ? -20 : -16) +#define Y_VAL5_2 (ROM_JP ? 2 : 5) +#define X_Y_VAL6 0.8f #elif defined(VERSION_EU) - #define X_VAL5 122.0f +#define X_VAL5 122.0f #define Y_VAL5_1 -16 #define Y_VAL5_2 3 #define X_Y_VAL6 0.5f @@ -1575,32 +1435,22 @@ void handle_special_dialog_text(s16 dialogID) { // dialog ID tables, in order s16 gMenuMode = MENU_MODE_NONE; -u8 gEndCutsceneStrEn0[] = { TEXT_FILE_MARIO_EXCLAMATION }; -u8 gEndCutsceneStrEn1[] = { TEXT_POWER_STARS_RESTORED }; -u8 gEndCutsceneStrEn2[] = { TEXT_THANKS_TO_YOU }; -u8 gEndCutsceneStrEn3[] = { TEXT_THANK_YOU_MARIO }; -u8 gEndCutsceneStrEn4[] = { TEXT_SOMETHING_SPECIAL }; -u8 gEndCutsceneStrEn5[] = { TEXT_LISTEN_EVERYBODY }; -u8 gEndCutsceneStrEn6[] = { TEXT_LETS_HAVE_CAKE }; -u8 gEndCutsceneStrEn7[] = { TEXT_FOR_MARIO }; -u8 gEndCutsceneStrEn8[] = { TEXT_FILE_MARIO_QUESTION }; - -u8 *gEndCutsceneStringsEn[] = { - gEndCutsceneStrEn0, - gEndCutsceneStrEn1, - gEndCutsceneStrEn2, - gEndCutsceneStrEn3, - gEndCutsceneStrEn4, - gEndCutsceneStrEn5, - gEndCutsceneStrEn6, - gEndCutsceneStrEn7, - // This [8] string is actually unused. In the cutscene handler, the developers do not - // set the 8th one, but use the first string again at the very end, so Peach ends up - // saying "Mario!" twice. It is likely that she was originally meant to say "Mario?" at - // the end but the developers changed their mind, possibly because the line recorded - // sounded more like an exclamation than a question. - gEndCutsceneStrEn8, - NULL +char *gEndCutsceneStringsEn[] = { + "TEXT_FILE_MARIO_EXCLAMATION", + "TEXT_POWER_STARS_RESTORED", + "TEXT_THANKS_TO_YOU", + "TEXT_THANK_YOU_MARIO", + "TEXT_SOMETHING_SPECIAL", + "TEXT_LISTEN_EVERYBODY", + "TEXT_LETS_HAVE_CAKE", + "TEXT_FOR_MARIO", + // This [8] string is actually unused. In the cutscene handler, the developers do not + // set the 8th one, but use the first string again at the very end, so Peach ends up + // saying "Mario!" twice. It is likely that she was originally meant to say "Mario?" at + // the end but the developers changed their mind, possibly because the line recorded + // sounded more like an exclamation than a question. + "TEXT_FILE_MARIO_QUESTION", + NULL }; #ifdef VERSION_EU @@ -1658,27 +1508,15 @@ s16 gCutsceneMsgTimer = 0; s8 gDialogCameraAngleIndex = CAM_SELECTION_MARIO; s8 gDialogCourseActNum = 1; -#if defined(VERSION_JP) || defined(VERSION_SH) - #define DIAG_VAL1 20 - #define DIAG_VAL2 240 - #define DIAG_VAL3 130 - #define DIAG_VAL4 4 -#else - #define DIAG_VAL1 16 -#ifdef VERSION_US - #define DIAG_VAL2 240 -#else - #define DIAG_VAL2 238 -#endif - #define DIAG_VAL3 132 - #define DIAG_VAL4 5 -#endif +#define DIAG_VAL1 (ROM_JP ? 20 : 16) +#define DIAG_VAL2 240 +#define DIAG_VAL3 (ROM_JP ? 130 : 132) +#define DIAG_VAL4 (ROM_JP ? 4 : 5) void render_dialog_entries(void) { #ifdef VERSION_EU s8 lowerBound; #endif - void **dialogTable; struct DialogEntry *dialog; #if defined(VERSION_US) || defined(VERSION_SH) s8 lowerBound; @@ -1697,10 +1535,8 @@ void render_dialog_entries(void) { dialogTable = segmented_to_virtual(dialog_table_eu_de); break; } -#else - dialogTable = segmented_to_virtual(seg2_dialog_table); #endif - dialog = segmented_to_virtual(dialogTable[gDialogID]); + dialog = GameEngine_LoadDialog(gDialogID); // if the dialog entry is invalid, set the ID to DIALOG_NONE. if (segmented_to_virtual(NULL) == dialog) { @@ -1732,9 +1568,7 @@ void render_dialog_entries(void) { gDialogBoxState = DIALOG_STATE_VERTICAL; gDialogLineNum = 1; } -#ifndef VERSION_JP lowerBound = 1; -#endif break; case DIALOG_STATE_VERTICAL: @@ -1750,9 +1584,7 @@ void render_dialog_entries(void) { play_sound(SOUND_MENU_MESSAGE_NEXT_PAGE, gGlobalSoundSource); } } -#ifndef VERSION_JP lowerBound = 1; -#endif break; case DIALOG_STATE_HORIZONTAL: @@ -1763,9 +1595,7 @@ void render_dialog_entries(void) { gDialogBoxState = DIALOG_STATE_VERTICAL; gDialogScrollOffsetY = 0; } -#ifndef VERSION_JP lowerBound = (gDialogScrollOffsetY / DIAG_VAL1) + 1; -#endif break; case DIALOG_STATE_CLOSING: @@ -1791,42 +1621,36 @@ void render_dialog_entries(void) { gLastDialogPageStrPos = 0; gDialogResponse = DIALOG_RESPONSE_NONE; } -#ifndef VERSION_JP lowerBound = 1; -#endif break; } render_dialog_box_type(dialog, dialog->linesPerBox); gDPSetScissor( - gDisplayListHead++, G_SC_NON_INTERLACE, - // Horizontal scissoring isn't really required and can potentially mess up widescreen enhancements. - 0, - ensure_nonnegative(DIAG_VAL2 - dialog->width), - SCREEN_WIDTH, - ensure_nonnegative((240 - dialog->width) + (dialog->linesPerBox * 80 / DIAG_VAL4)) + gDisplayListHead++, G_SC_NON_INTERLACE, + // Horizontal scissoring isn't really required and can potentially mess up widescreen enhancements. + 0, + ensure_nonnegative(DIAG_VAL2 - dialog->width), + SCREEN_WIDTH, + ensure_nonnegative((240 - dialog->width) + (dialog->linesPerBox * 80 / DIAG_VAL4)) ); -#ifdef VERSION_JP - handle_dialog_text_and_pages(0, dialog); -#else handle_dialog_text_and_pages(0, dialog, lowerBound); -#endif if (gLastDialogPageStrPos == -1 && gLastDialogResponse == 1) { render_dialog_triangle_choice(); } - #ifdef VERSION_EU - #undef BORDER_HEIGHT +#ifdef VERSION_EU + #undef BORDER_HEIGHT #define BORDER_HEIGHT 8 - #endif +#endif gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 2, 2, SCREEN_WIDTH - BORDER_HEIGHT / 2, SCREEN_HEIGHT - BORDER_HEIGHT / 2); - #ifdef VERSION_EU +#ifdef VERSION_EU #undef BORDER_HEIGHT #define BORDER_HEIGHT 1 - #endif +#endif if (gLastDialogPageStrPos != -1 && gDialogBoxState == DIALOG_STATE_VERTICAL) { render_dialog_triangle_next(dialog->linesPerBox); @@ -1928,7 +1752,7 @@ void do_cutscene_handler(void) { create_dl_ortho_matrix(); - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gCutsceneMsgFade); #ifdef VERSION_EU @@ -1948,8 +1772,9 @@ void do_cutscene_handler(void) { } #else // get the x coordinate of where the cutscene string starts. - x = get_str_x_pos_from_center(gCutsceneMsgXOffset, gEndCutsceneStringsEn[gCutsceneMsgIndex], 10.0f); - print_generic_string(x, 240 - gCutsceneMsgYOffset, gEndCutsceneStringsEn[gCutsceneMsgIndex]); + uint8_t* line = GameEngine_LoadTranslation(gEndCutsceneStringsEn[gCutsceneMsgIndex]); + x = get_str_x_pos_from_center(gCutsceneMsgXOffset, line, 10.0f); + print_generic_string(x, 240 - gCutsceneMsgYOffset, line); #endif gSPDisplayList(gDisplayListHead++, dl_ia_text_end); @@ -1982,23 +1807,13 @@ void do_cutscene_handler(void) { gCutsceneMsgTimer++; } -#ifdef VERSION_JP - #define PEACH_MESSAGE_TIMER 170 -#else - #define PEACH_MESSAGE_TIMER 250 -#endif +#define PEACH_MESSAGE_TIMER (ROM_JP ? 170 : 250) -#if defined(VERSION_JP) || defined(VERSION_SH) - #define STR_X 53 - #define STR_Y 136 -#else - #define STR_X 38 - #define STR_Y 142 -#endif +#define STR_X (ROM_JP ? 53 : 38) +#define STR_Y (ROM_JP ? 136 : 142) // "Dear Mario" message handler void print_peach_letter_message(void) { - void **dialogTable; struct DialogEntry *dialog; u8 *str; @@ -2015,10 +1830,8 @@ void print_peach_letter_message(void) { dialogTable = segmented_to_virtual(dialog_table_eu_de); break; } -#else - dialogTable = segmented_to_virtual(seg2_dialog_table); #endif - dialog = segmented_to_virtual(dialogTable[gDialogID]); + dialog = GameEngine_LoadDialog(gDialogID); str = segmented_to_virtual(dialog->str); create_dl_translation_matrix(MENU_MTX_PUSH, 97.0f, 118.0f, 0); @@ -2026,19 +1839,19 @@ void print_peach_letter_message(void) { gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gCutsceneMsgFade); gSPDisplayList(gDisplayListHead++, castle_grounds_seg7_dl_0700EA58); gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 20, 20, 20, gCutsceneMsgFade); print_generic_string(STR_X, STR_Y, str); -#if defined(VERSION_JP) - gSPDisplayList(gDisplayListHead++, dl_ia_text_end); -#endif - gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, 255); -#ifndef VERSION_JP - gSPDisplayList(gDisplayListHead++, dl_ia_text_end); - gDPSetEnvColor(gDisplayListHead++, 200, 80, 120, gCutsceneMsgFade); - gSPDisplayList(gDisplayListHead++, castle_grounds_seg7_us_dl_0700F2E8); -#endif + if(ROM_JP){ + gSPDisplayList(gDisplayListHead++, dl_ia_text_end); + gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, 255); + } else { + gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, 255); + gSPDisplayList(gDisplayListHead++, dl_ia_text_end); + gDPSetEnvColor(gDisplayListHead++, 200, 80, 120, gCutsceneMsgFade); + gSPDisplayList(gDisplayListHead++, castle_grounds_seg7_us_dl_0700F2E8); + } // at the start/end of message, reset the fade. if (gCutsceneMsgTimer == 0) { @@ -2166,57 +1979,40 @@ u8 gTextCourse[][7] = { #define textCourse gTextCourse #endif -#if defined(VERSION_JP) || defined(VERSION_SH) - #define CRS_NUM_X1 93 -#elif defined(VERSION_US) - #define CRS_NUM_X1 100 +#if defined(VERSION_US) +#define CRS_NUM_X1 (ROM_JP ? 93 : 100) #elif defined(VERSION_EU) - #define CRS_NUM_X1 get_string_width(LANGUAGE_ARRAY(textCourse)) + 51 +#define CRS_NUM_X1 get_string_width(GameEngine_LoadTranslation(textCourse)) + 51 #endif #ifdef VERSION_EU - #define TXT_COURSE_X 48 - #define TXT_STAR_X 89 - #define ACT_NAME_X 107 - #define LVL_NAME_X 108 - #define SECRET_LVL_NAME_X get_str_x_pos_from_center(159, &courseName[3], 10.0f) - #define MYSCORE_X 48 +#define TXT_COURSE_X 48 +#define TXT_STAR_X 89 +#define ACT_NAME_X 107 +#define LVL_NAME_X 108 +#define SECRET_LVL_NAME_X get_str_x_pos_from_center(159, &courseName[3], 10.0f) +#define MYSCORE_X 48 #else - #define TXT_COURSE_X 63 - #define TXT_STAR_X 98 - #define ACT_NAME_X 116 - #define LVL_NAME_X 117 - #define SECRET_LVL_NAME_X 94 - #define MYSCORE_X 62 +#define TXT_COURSE_X 63 +#define TXT_STAR_X 98 +#define ACT_NAME_X 116 +#define LVL_NAME_X 117 +#define SECRET_LVL_NAME_X 94 +#define MYSCORE_X 62 #endif void render_pause_my_score_coins(void) { -#ifdef VERSION_EU - u8 textMyScore[][10] = { - { TEXT_MY_SCORE }, - { TEXT_MY_SCORE_FR }, - { TEXT_MY_SCORE_DE } - }; -#else - u8 textCourse[] = { TEXT_COURSE }; - u8 textMyScore[] = { TEXT_MY_SCORE }; -#endif - u8 textStar[] = { TEXT_STAR }; - u8 textUnfilledStar[] = { TEXT_UNFILLED_STAR }; +// u8* textCourse = GameEngine_LoadTranslation(""); +// u8* textMyScore = GameEngine_LoadTranslation("TEXT_MY_SCORE"); +// u8* textStar = GameEngine_LoadTranslation("TEXT_STAR"); +// u8* textUnfilledStar = GameEngine_LoadTranslation("TEXT_UNFILLED_STAR"); u8 strCourseNum[4]; - void **courseNameTbl; u8 *courseName; - void **actNameTbl; u8 *actName; u8 courseIndex; u8 starFlags; -#ifndef VERSION_EU - courseNameTbl = segmented_to_virtual(seg2_course_name_table); - actNameTbl = segmented_to_virtual(seg2_act_name_table); -#endif - courseIndex = COURSE_NUM_TO_INDEX(gCurrCourseNum); starFlags = save_file_get_star_flags(gCurrSaveFileNum - 1, COURSE_NUM_TO_INDEX(gCurrCourseNum)); @@ -2246,83 +2042,59 @@ void render_pause_my_score_coins(void) { } gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); if (courseIndex <= COURSE_NUM_TO_INDEX(COURSE_STAGES_MAX) && save_file_get_course_star_count(gCurrSaveFileNum - 1, courseIndex) != 0) { - print_generic_string(MYSCORE_X, 121, LANGUAGE_ARRAY(textMyScore)); + print_generic_string(MYSCORE_X, 121, GameEngine_LoadTranslation("TEXT_MY_SCORE")); } - courseName = segmented_to_virtual(courseNameTbl[courseIndex]); + courseName = GameEngine_LoadLevelName(courseIndex); if (courseIndex <= COURSE_NUM_TO_INDEX(COURSE_STAGES_MAX)) { - print_generic_string(TXT_COURSE_X, 157, LANGUAGE_ARRAY(textCourse)); + print_generic_string(TXT_COURSE_X, 157, GameEngine_LoadTranslation("TEXT_COURSE")); int_to_str(gCurrCourseNum, strCourseNum); print_generic_string(CRS_NUM_X1, 157, strCourseNum); - actName = segmented_to_virtual(actNameTbl[COURSE_NUM_TO_INDEX(gCurrCourseNum) * 6 + gDialogCourseActNum - 1]); + actName = GameEngine_LoadActName(COURSE_NUM_TO_INDEX(gCurrCourseNum) * 6 + gDialogCourseActNum - 1); if (starFlags & (1 << (gDialogCourseActNum - 1))) { - print_generic_string(TXT_STAR_X, 140, textStar); + print_generic_string(TXT_STAR_X, 140, GameEngine_LoadTranslation("TEXT_STAR")); } else { - print_generic_string(TXT_STAR_X, 140, textUnfilledStar); + print_generic_string(TXT_STAR_X, 140, GameEngine_LoadTranslation("TEXT_UNFILLED_STAR")); } print_generic_string(ACT_NAME_X, 140, actName); -#ifndef VERSION_JP - print_generic_string(LVL_NAME_X, 157, &courseName[3]); - } else { + if(!ROM_JP){ + print_generic_string(LVL_NAME_X, 157, &courseName[3]); + } + } else if(!ROM_JP) { print_generic_string(SECRET_LVL_NAME_X, 157, &courseName[3]); -#endif } - -#ifdef VERSION_JP - print_generic_string(LVL_NAME_X, 157, &courseName[3]); -#endif + // TODO: JPTODO This could be cleaner + if(ROM_JP){ + print_generic_string(LVL_NAME_X, 157, &courseName[3]); + } gSPDisplayList(gDisplayListHead++, dl_ia_text_end); } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define TXT1_X 4 - #define TXT2_X 116 - #define Y_VAL7 0 -#else - #define TXT1_X 3 - #define TXT2_X 119 - #define Y_VAL7 2 -#endif +#define TXT1_X (ROM_JP ? 4 : 3) +#define TXT2_X (ROM_JP ? 116 : 119) +#define Y_VAL7 (ROM_JP ? 0 : 2) void render_pause_camera_options(s16 x, s16 y, s8 *index, s16 xIndex) { - u8 textLakituMario[] = { TEXT_LAKITU_MARIO }; - u8 textLakituStop[] = { TEXT_LAKITU_STOP }; -#ifdef VERSION_EU - u8 textNormalUpClose[][20] = { - { TEXT_NORMAL_UPCLOSE }, - { TEXT_NORMAL_UPCLOSE_FR }, - { TEXT_NORMAL_UPCLOSE_DE } - }; - u8 textNormalFixed[][17] = { - { TEXT_NORMAL_FIXED }, - { TEXT_NORMAL_FIXED_FR }, - { TEXT_NORMAL_FIXED_DE }, - }; -#else - u8 textNormalUpClose[] = { TEXT_NORMAL_UPCLOSE }; - u8 textNormalFixed[] = { TEXT_NORMAL_FIXED }; -#endif - handle_menu_scrolling(MENU_SCROLL_HORIZONTAL, index, 1, 2); - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); - print_generic_string(x + 14, y + 2, textLakituMario); - print_generic_string(x + TXT1_X, y - 13, LANGUAGE_ARRAY(textNormalUpClose)); - print_generic_string(x + 124, y + 2, textLakituStop); - print_generic_string(x + TXT2_X, y - 13, LANGUAGE_ARRAY(textNormalFixed)); + print_generic_string(x + 14, y + 2, GameEngine_LoadTranslation("TEXT_LAKITU_MARIO")); + print_generic_string(x + TXT1_X, y - 13, GameEngine_LoadTranslation("TEXT_NORMAL_UPCLOSE")); + print_generic_string(x + 124, y + 2, GameEngine_LoadTranslation("TEXT_LAKITU_STOP")); + print_generic_string(x + TXT2_X, y - 13, GameEngine_LoadTranslation("TEXT_NORMAL_FIXED")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); create_dl_translation_matrix(MENU_MTX_PUSH, ((*index - 1) * xIndex) + x, y + Y_VAL7, 0); @@ -2340,47 +2112,21 @@ void render_pause_camera_options(s16 x, s16 y, s8 *index, s16 xIndex) { } } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define X_VAL8 0 - #define Y_VAL8 4 -#else - #define X_VAL8 4 - #define Y_VAL8 2 -#endif +#define X_VAL8 (ROM_JP ? 0 : 4) +#define Y_VAL8 (ROM_JP ? 4 : 2) void render_pause_course_options(s16 x, s16 y, s8 *index, s16 yIndex) { -#ifdef VERSION_EU - u8 textContinue[][10] = { - { TEXT_CONTINUE }, - { TEXT_CONTINUE_FR }, - { TEXT_CONTINUE_DE } - }; - u8 textExitCourse[][15] = { - { TEXT_EXIT_COURSE }, - { TEXT_EXIT_COURSE_FR }, - { TEXT_EXIT_COURSE_DE } - }; - u8 textCameraAngleR[][24] = { - { TEXT_CAMERA_ANGLE_R }, - { TEXT_CAMERA_ANGLE_R_FR }, - { TEXT_CAMERA_ANGLE_R_DE } - }; -#else - u8 textContinue[] = { TEXT_CONTINUE }; - u8 textExitCourse[] = { TEXT_EXIT_COURSE }; - u8 textCameraAngleR[] = { TEXT_CAMERA_ANGLE_R }; -#endif handle_menu_scrolling(MENU_SCROLL_VERTICAL, index, 1, 3); - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); - print_generic_string(x + 10, y - 2, LANGUAGE_ARRAY(textContinue)); - print_generic_string(x + 10, y - 17, LANGUAGE_ARRAY(textExitCourse)); + print_generic_string(x + 10, y - 2, GameEngine_LoadTranslation("TEXT_CONTINUE")); + print_generic_string(x + 10, y - 17, GameEngine_LoadTranslation("TEXT_EXIT_COURSE")); if (*index != MENU_OPT_CAMERA_ANGLE_R) { - print_generic_string(x + 10, y - 33, LANGUAGE_ARRAY(textCameraAngleR)); + print_generic_string(x + 10, y - 33, GameEngine_LoadTranslation("TEXT_CAMERA_ANGLE_R")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); create_dl_translation_matrix(MENU_MTX_PUSH, x - X_VAL8, (y - ((*index - 1) * yIndex)) - Y_VAL8, 0); @@ -2431,14 +2177,12 @@ void highlight_last_course_complete_stars(void) { } #ifdef VERSION_EU - #define PAUSE_X get_str_x_pos_from_center_scale(SCREEN_WIDTH / 2, textPause, 12.0f) +#define PAUSE_X get_str_x_pos_from_center_scale(SCREEN_WIDTH / 2, textPause, 12.0f) #else - #define PAUSE_X 123 +#define PAUSE_X 123 #endif void print_hud_pause_colorful_str(void) { - u8 textPause[] = { TEXT_PAUSE }; - gSPDisplayList(gDisplayListHead++, dl_rgba16_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); @@ -2451,9 +2195,6 @@ void render_pause_castle_course_stars(s16 x, s16 y, s16 fileIndex, s16 courseInd s16 hasStar = 0; u8 str[COURSE_STAGES_COUNT * 2]; - - u8 textStar[] = { TEXT_STAR }; - u8 starFlags = save_file_get_star_flags(fileIndex, courseIndex); u16 starCount = save_file_get_course_star_count(fileIndex, courseIndex); @@ -2461,7 +2202,7 @@ void render_pause_castle_course_stars(s16 x, s16 y, s16 fileIndex, s16 courseInd if (starFlags & (1 << 6)) { starCount--; - print_generic_string(x + 89, y - 5, textStar); + print_generic_string(x + 89, y - 5, GameEngine_LoadTranslation("TEXT_STAR")); } while (hasStar != starCount) { @@ -2490,15 +2231,12 @@ void render_pause_castle_course_stars(s16 x, s16 y, s16 fileIndex, s16 courseInd void render_pause_castle_main_strings(s16 x, s16 y) { #ifdef VERSION_EU void **courseNameTbl; -#else - void **courseNameTbl = segmented_to_virtual(seg2_course_name_table); #endif #ifdef VERSION_EU u8 textCoin[] = { TEXT_COIN }; u8 textX[] = { TEXT_VARIABLE_X }; #else - u8 textCoin[] = { TEXT_COIN_X }; #endif void *courseName; @@ -2521,8 +2259,8 @@ void render_pause_castle_main_strings(s16 x, s16 y) { #endif handle_menu_scrolling( - MENU_SCROLL_VERTICAL, &gDialogLineNum, - COURSE_NUM_TO_INDEX(COURSE_MIN) - 1, COURSE_NUM_TO_INDEX(COURSE_BONUS_STAGES) + 1 + MENU_SCROLL_VERTICAL, &gDialogLineNum, + COURSE_NUM_TO_INDEX(COURSE_MIN) - 1, COURSE_NUM_TO_INDEX(COURSE_BONUS_STAGES) + 1 ); if (gDialogLineNum == COURSE_NUM_TO_INDEX(COURSE_BONUS_STAGES) + 1) { @@ -2549,13 +2287,13 @@ void render_pause_castle_main_strings(s16 x, s16 y) { } } - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); if (gDialogLineNum <= COURSE_NUM_TO_INDEX(COURSE_STAGES_MAX)) { // Main courses - courseName = segmented_to_virtual(courseNameTbl[gDialogLineNum]); + courseName = GameEngine_LoadLevelName(gDialogLineNum); render_pause_castle_course_stars(x, y, gCurrSaveFileNum - 1, gDialogLineNum); - print_generic_string(x + 34, y - 5, textCoin); + print_generic_string(x + 34, y - 5, GameEngine_LoadTranslation("TEXT_COIN_X")); #ifdef VERSION_EU print_generic_string(x + 44, y - 5, textX); #endif @@ -2565,9 +2303,8 @@ void render_pause_castle_main_strings(s16 x, s16 y) { print_generic_string(x - 17, y + 30, courseName); #endif } else { // Castle secret stars - u8 textStarX[] = { TEXT_STAR_X }; - courseName = segmented_to_virtual(courseNameTbl[COURSE_MAX]); - print_generic_string(x + 40, y + 13, textStarX); + courseName = GameEngine_LoadLevelName(COURSE_MAX); + print_generic_string(x + 40, y + 13, GameEngine_LoadTranslation("TEXT_STAR_X")); int_to_str(save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_BONUS_STAGES - 1, COURSE_MAX - 1), strVal); print_generic_string(x + 60, y + 13, strVal); #ifdef VERSION_EU @@ -2671,18 +2408,14 @@ s16 render_pause_courses_and_castle(void) { return MENU_OPT_NONE; } -#if defined(VERSION_JP) - #define TXT_HISCORE_X 112 - #define TXT_HISCORE_Y 48 - #define TXT_CONGRATS_X 60 -#elif defined(VERSION_US) - #define TXT_HISCORE_X 109 - #define TXT_HISCORE_Y 36 - #define TXT_CONGRATS_X 70 +#if defined(VERSION_US) +#define TXT_HISCORE_X (ROM_JP ? 112 : 109) +#define TXT_HISCORE_Y (ROM_JP ? 48 : 36) +#define TXT_CONGRATS_X (ROM_JP ? 60 : 70) #elif defined(VERSION_EU) - #define TXT_HISCORE_X get_str_x_pos_from_center_scale(160, LANGUAGE_ARRAY(textHiScore), 12.0f) +#define TXT_HISCORE_X get_str_x_pos_from_center_scale(160, GameEngine_LoadTranslation(textHiScore), 12.0f) #define TXT_HISCORE_Y 36 - #define TXT_CONGRATS_X get_str_x_pos_from_center_scale(160, LANGUAGE_ARRAY(textCongratulations), 12.0f) + #define TXT_CONGRATS_X get_str_x_pos_from_center_scale(160, GameEngine_LoadTranslation(textCongratulations), 12.0f) #elif defined(VERSION_SH) #define TXT_HISCORE_X 118 #define TXT_HISCORE_Y 48 @@ -2693,31 +2426,15 @@ s16 render_pause_courses_and_castle(void) { #define HUD_PRINT_CONGRATULATIONS 1 void print_hud_course_complete_string(s8 str) { -#ifdef VERSION_EU - u8 textHiScore[][15] = { - { TEXT_HUD_HI_SCORE }, - { TEXT_HUD_HI_SCORE_FR }, - { TEXT_HUD_HI_SCORE_DE } - }; - u8 textCongratulations[][16] = { - { TEXT_HUD_CONGRATULATIONS }, - { TEXT_HUD_CONGRATULATIONS_FR }, - { TEXT_HUD_CONGRATULATIONS_DE } - }; -#else - u8 textHiScore[] = { TEXT_HUD_HI_SCORE }; - u8 textCongratulations[] = { TEXT_HUD_CONGRATULATIONS }; -#endif - u8 colorFade = sins(gDialogColorFadeTimer) * 50.0f + 200.0f; gSPDisplayList(gDisplayListHead++, dl_rgba16_text_begin); gDPSetEnvColor(gDisplayListHead++, colorFade, colorFade, colorFade, 255); if (str == HUD_PRINT_HISCORE) { - print_hud_lut_string(HUD_LUT_GLOBAL, TXT_HISCORE_X, TXT_HISCORE_Y, LANGUAGE_ARRAY(textHiScore)); + print_hud_lut_string(HUD_LUT_GLOBAL, TXT_HISCORE_X, TXT_HISCORE_Y, GameEngine_LoadTranslation("TEXT_HUD_HI_SCORE")); } else { // HUD_PRINT_CONGRATULATIONS - print_hud_lut_string(HUD_LUT_GLOBAL, TXT_CONGRATS_X, 67, LANGUAGE_ARRAY(textCongratulations)); + print_hud_lut_string(HUD_LUT_GLOBAL, TXT_CONGRATS_X, 67, textHudCongratulations); } gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); @@ -2771,46 +2488,23 @@ void play_star_fanfare_and_flash_hud(s32 arg, u8 starNum) { } #ifdef VERSION_EU - #define TXT_NAME_X1 centerX - #define TXT_NAME_X2 centerX - 1 +#define TXT_NAME_X1 centerX +#define TXT_NAME_X2 centerX - 1 #else - #define TXT_NAME_X1 71 - #define TXT_NAME_X2 TXT_NAME_X1 - 2 +#define TXT_NAME_X1 71 +#define TXT_NAME_X2 TXT_NAME_X1 - 2 #endif -#if defined(VERSION_JP) || defined(VERSION_SH) - #define CRS_NUM_X2 95 - #define CRS_NUM_X3 CRS_NUM_X2 - 2 - #define TXT_CLEAR_X1 205 - #define TXT_CLEAR_X2 TXT_CLEAR_X1 - 2 -#else - #define CRS_NUM_X2 104 - #define CRS_NUM_X3 CRS_NUM_X2 - 2 - #define TXT_CLEAR_X1 get_string_width(name) + 81 - #define TXT_CLEAR_X2 TXT_CLEAR_X1 - 2 -#endif +#define CRS_NUM_X2 (ROM_JP ? 95 : 104) +#define CRS_NUM_X3 CRS_NUM_X2 - 2 +#define TXT_CLEAR_X1 (ROM_JP ? 205 : get_string_width(name) + 81) +#define TXT_CLEAR_X2 TXT_CLEAR_X1 - 2 void render_course_complete_lvl_info_and_hud_str(void) { -#if defined(VERSION_JP) - u8 textSymStar[] = { GLYPH_STAR, GLYPH_SPACE }; - u8 textCourse[] = { TEXT_COURSE }; - u8 textCatch[] = { TEXT_CATCH }; - u8 textClear[] = { TEXT_CLEAR }; -#elif defined(VERSION_EU) - UNUSED u8 textCatch[] = { TEXT_CATCH }; // unused in EU - u8 textSymStar[] = { GLYPH_STAR, GLYPH_SPACE }; -#else - u8 textCourse[] = { TEXT_COURSE }; - UNUSED u8 textCatch[] = { TEXT_CATCH }; // unused in US - UNUSED u8 textClear[] = { TEXT_CLEAR }; - u8 textSymStar[] = { GLYPH_STAR, GLYPH_SPACE }; -#endif - - void **actNameTbl; - void **courseNameTbl; u8 *name; u8 strCourseNum[4]; + u8 textSymStar[] = { GLYPH_STAR, GLYPH_SPACE }; #ifdef VERSION_EU s16 centerX; @@ -2828,9 +2522,6 @@ void render_course_complete_lvl_info_and_hud_str(void) { courseNameTbl = segmented_to_virtual(course_name_table_eu_de); break; } -#else - actNameTbl = segmented_to_virtual(seg2_act_name_table); - courseNameTbl = segmented_to_virtual(seg2_course_name_table); #endif if (gLastCompletedCourseNum <= COURSE_STAGES_MAX) { // Main courses @@ -2838,30 +2529,30 @@ void render_course_complete_lvl_info_and_hud_str(void) { play_star_fanfare_and_flash_hud(1, 1 << (gLastCompletedStarNum - 1)); if (gLastCompletedStarNum == 7) { - name = segmented_to_virtual(actNameTbl[COURSE_STAGES_MAX * 6 + 1]); + name = GameEngine_LoadActName(COURSE_STAGES_MAX * 6 + 1); } else { - name = segmented_to_virtual(actNameTbl[COURSE_NUM_TO_INDEX(gLastCompletedCourseNum) * 6 + gLastCompletedStarNum - 1]); + name = GameEngine_LoadActName(COURSE_NUM_TO_INDEX(gLastCompletedCourseNum) * 6 + gLastCompletedStarNum - 1); } // Print course number - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); int_to_str(gLastCompletedCourseNum, strCourseNum); gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, gDialogTextAlpha); - print_generic_string(65, 165, LANGUAGE_ARRAY(textCourse)); + print_generic_string(65, 165, GameEngine_LoadTranslation("TEXT_COURSE")); print_generic_string(CRS_NUM_X2, 165, strCourseNum); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); - print_generic_string(63, 167, LANGUAGE_ARRAY(textCourse)); + print_generic_string(63, 167, GameEngine_LoadTranslation("TEXT_COURSE")); print_generic_string(CRS_NUM_X3, 167, strCourseNum); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); } else if (gLastCompletedCourseNum == COURSE_BITDW || gLastCompletedCourseNum == COURSE_BITFS) { // Bowser courses - name = segmented_to_virtual(courseNameTbl[COURSE_NUM_TO_INDEX(gLastCompletedCourseNum)]); + name = GameEngine_LoadLevelName(COURSE_NUM_TO_INDEX(gLastCompletedCourseNum)); // Print course name and clear text - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, gDialogTextAlpha); #ifdef VERSION_EU @@ -2869,13 +2560,13 @@ void render_course_complete_lvl_info_and_hud_str(void) { #endif print_generic_string(TXT_NAME_X1, 130, name); #ifndef VERSION_EU - print_generic_string(TXT_CLEAR_X1, 130, textClear); + print_generic_string(TXT_CLEAR_X1, 130, GameEngine_LoadTranslation("TEXT_CLEAR")); #endif gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); print_generic_string(TXT_NAME_X2, 132, name); #ifndef VERSION_EU - print_generic_string(TXT_CLEAR_X2, 132, textClear); + print_generic_string(TXT_CLEAR_X2, 132, GameEngine_LoadTranslation("TEXT_CLEAR")); #endif gSPDisplayList(gDisplayListHead++, dl_ia_text_end); @@ -2886,7 +2577,7 @@ void render_course_complete_lvl_info_and_hud_str(void) { return; } else { // Castle secret stars - name = segmented_to_virtual(actNameTbl[COURSE_STAGES_MAX * 6]); + name = GameEngine_LoadActName(COURSE_STAGES_MAX * 6); print_hud_course_complete_coins(118, 103); play_star_fanfare_and_flash_hud(1, 1 << (gLastCompletedStarNum - 1)); @@ -2901,40 +2592,41 @@ void render_course_complete_lvl_info_and_hud_str(void) { gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); // Print act name and catch text - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, gDialogTextAlpha); print_generic_string(76, 145, name); -#if defined(VERSION_JP) || defined(VERSION_SH) - print_generic_string(220, 145, textCatch); -#endif + + if(ROM_JP){ + print_generic_string(220, 145, GameEngine_LoadTranslation("TEXT_CATCH")); + } gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); print_generic_string(74, 147, name); -#if defined(VERSION_JP) || defined(VERSION_SH) - print_generic_string(218, 147, textCatch); -#endif + if(ROM_JP){ + print_generic_string(218, 147, GameEngine_LoadTranslation("TEXT_CATCH")); + } gSPDisplayList(gDisplayListHead++, dl_ia_text_end); } #if defined(VERSION_JP) || defined(VERSION_SH) - #define X_VAL9 x - #define TXT_SAVEOPTIONS_X x + 10 - #define TXT_SAVECONT_Y 2 - #define TXT_SAVEQUIT_Y 18 - #define TXT_CONTNOSAVE_Y 38 +#define X_VAL9 x +#define TXT_SAVEOPTIONS_X x + 10 +#define TXT_SAVECONT_Y 2 +#define TXT_SAVEQUIT_Y 18 +#define TXT_CONTNOSAVE_Y 38 #else #ifdef VERSION_EU - #define X_VAL9 xOffset - 12 - #define TXT_SAVEOPTIONS_X xOffset +#define X_VAL9 xOffset - 12 +#define TXT_SAVEOPTIONS_X xOffset #else - #define X_VAL9 x - #define TXT_SAVEOPTIONS_X x + 12 +#define X_VAL9 x +#define TXT_SAVEOPTIONS_X x + 12 #endif - #define TXT_SAVECONT_Y 0 - #define TXT_SAVEQUIT_Y 20 - #define TXT_CONTNOSAVE_Y 40 +#define TXT_SAVECONT_Y 0 +#define TXT_SAVEQUIT_Y 20 +#define TXT_CONTNOSAVE_Y 40 #endif #ifdef VERSION_EU @@ -2959,21 +2651,17 @@ void render_save_confirmation(s16 x, s16 y, s8 *index, s16 sp6e) { TEXT_CONTINUE_WITHOUT_SAVING_FR }, { TEXT_CONTINUE_WITHOUT_SAVING_DE } }; - s16 xOffset = get_str_x_pos_from_center(160, LANGUAGE_ARRAY(textContinueWithoutSave), 12.0f); -#else - u8 textSaveAndContinue[] = { TEXT_SAVE_AND_CONTINUE }; - u8 textSaveAndQuit[] = { TEXT_SAVE_AND_QUIT }; - u8 textContinueWithoutSave[] = { TEXT_CONTINUE_WITHOUT_SAVING }; + s16 xOffset = get_str_x_pos_from_center(160, GameEngine_LoadTranslation(textContinueWithoutSave), 12.0f); #endif handle_menu_scrolling(MENU_SCROLL_VERTICAL, index, 1, 3); - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); - print_generic_string(TXT_SAVEOPTIONS_X, y + TXT_SAVECONT_Y, LANGUAGE_ARRAY(textSaveAndContinue)); - print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_SAVEQUIT_Y, LANGUAGE_ARRAY(textSaveAndQuit)); - print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_CONTNOSAVE_Y, LANGUAGE_ARRAY(textContinueWithoutSave)); + print_generic_string(TXT_SAVEOPTIONS_X, y + TXT_SAVECONT_Y, GameEngine_LoadTranslation("TEXT_SAVE_AND_CONTINUE")); + print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_SAVEQUIT_Y, GameEngine_LoadTranslation("TEXT_SAVE_AND_QUIT")); + print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_CONTNOSAVE_Y, GameEngine_LoadTranslation("TEXT_CONTINUE_WITHOUT_SAVING")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); @@ -3013,9 +2701,9 @@ s16 render_course_complete_screen(void) { if (gCourseDoneMenuTimer > 110 && (gPlayer3Controller->buttonPressed & A_BUTTON - || gPlayer3Controller->buttonPressed & START_BUTTON + || gPlayer3Controller->buttonPressed & START_BUTTON #ifdef VERSION_EU - || gPlayer3Controller->buttonPressed & Z_TRIG + || gPlayer3Controller->buttonPressed & Z_TRIG #endif )) { level_set_transition(0, NULL); diff --git a/src/game/ingame_menu.h b/src/game/ingame_menu.h index 4118b3f4..499186c7 100644 --- a/src/game/ingame_menu.h +++ b/src/game/ingame_menu.h @@ -21,11 +21,7 @@ #define HUD_LUT_GLOBAL 2 // For file select JP HUD difference -#if defined(VERSION_JP) || defined(VERSION_SH) -#define HUD_LUT_DIFF HUD_LUT_JPMENU -#else -#define HUD_LUT_DIFF HUD_LUT_GLOBAL -#endif +#define HUD_LUT_DIFF (ROM_JP ? HUD_LUT_JPMENU : HUD_LUT_GLOBAL) enum MenuMode { MENU_MODE_NONE = -1, @@ -139,15 +135,8 @@ void print_generic_string(s16 x, s16 y, const u8 *str); void print_hud_lut_string(s8 hudLUT, s16 x, s16 y, const u8 *str); void print_menu_generic_string(s16 x, s16 y, const u8 *str); void handle_menu_scrolling(s8 scrollDirection, s8 *currentIndex, s8 minIndex, s8 maxIndex); -#if defined(VERSION_US) || defined(VERSION_EU) s16 get_str_x_pos_from_center(s16 centerPos, u8 *str, f32 scale); -#endif -#if defined(VERSION_JP) || defined(VERSION_SH) -#define get_str_x_pos_from_center get_str_x_pos_from_center_scale -#endif -#if defined(VERSION_JP) || defined(VERSION_EU) || defined(VERSION_SH) s16 get_str_x_pos_from_center_scale(s16 centerPos, u8 *str, f32 scale); -#endif void print_hud_my_score_coins(s32 useCourseCoinScore, s8 fileIndex, s8 courseIndex, s16 x, s16 y); void int_to_str(s32 num, u8 *dst); s16 get_dialog_id(void); diff --git a/src/game/interaction.c b/src/game/interaction.c index dda1e906..e4897a51 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -768,7 +768,7 @@ u32 interact_water_ring(struct MarioState *m, UNUSED u32 interactType, struct Ob u32 interact_star_or_key(struct MarioState *m, UNUSED u32 interactType, struct Object *o) { u32 starIndex; u32 starGrabAction = ACT_STAR_DANCE_EXIT; - u32 noExit = (o->oInteractionSubtype & INT_SUBTYPE_NO_EXIT) != 0; + u32 noExit = (o->oInteractionSubtype & INT_SUBTYPE_NO_EXIT) != 0 || CVarGetInteger("gStarNoExit", 0); u32 grandStar = (o->oInteractionSubtype & INT_SUBTYPE_GRAND_STAR) != 0; if (m->health >= 0x100) { @@ -819,9 +819,9 @@ u32 interact_star_or_key(struct MarioState *m, UNUSED u32 interactType, struct O } play_sound(SOUND_MENU_STAR_SOUND, m->marioObj->header.gfx.cameraToObject); -#ifndef VERSION_JP - update_mario_sound_and_camera(m); -#endif + if(!ROM_JP){ + update_mario_sound_and_camera(m); + } if (grandStar) { return set_mario_action(m, ACT_JUMBO_STAR_CUTSCENE, 0); @@ -1345,9 +1345,9 @@ u32 interact_hit_from_below(struct MarioState *m, UNUSED u32 interactType, struc if (o->oInteractionSubtype & INT_SUBTYPE_TWIRL_BOUNCE) { bounce_off_object(m, o, 80.0f); reset_mario_pitch(m); -#ifndef VERSION_JP - play_sound(SOUND_MARIO_TWIRL_BOUNCE, m->marioObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_MARIO_TWIRL_BOUNCE, m->marioObj->header.gfx.cameraToObject); + } return drop_and_set_mario_action(m, ACT_TWIRLING, 0); } else { bounce_off_object(m, o, 30.0f); @@ -1383,9 +1383,9 @@ u32 interact_bounce_top(struct MarioState *m, UNUSED u32 interactType, struct Ob if (o->oInteractionSubtype & INT_SUBTYPE_TWIRL_BOUNCE) { bounce_off_object(m, o, 80.0f); reset_mario_pitch(m); -#ifndef VERSION_JP - play_sound(SOUND_MARIO_TWIRL_BOUNCE, m->marioObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_MARIO_TWIRL_BOUNCE, m->marioObj->header.gfx.cameraToObject); + } return drop_and_set_mario_action(m, ACT_TWIRLING, 0); } else { bounce_off_object(m, o, 30.0f); @@ -1687,17 +1687,8 @@ u32 mario_can_talk(struct MarioState *m, u32 arg) { return FALSE; } -#ifdef VERSION_JP -#define READ_MASK (INPUT_B_PRESSED) -#else #define READ_MASK (INPUT_B_PRESSED | INPUT_A_PRESSED) -#endif - -#ifdef VERSION_JP -#define SIGN_RANGE 0x38E3 -#else #define SIGN_RANGE 0x4000 -#endif u32 check_read_sign(struct MarioState *m, struct Object *o) { if ((m->input & READ_MASK) && mario_can_talk(m, 0) && object_facing_mario(m, o, SIGN_RANGE)) { diff --git a/src/game/level_geo.c b/src/game/level_geo.c index 0e274a89..e3946700 100644 --- a/src/game/level_geo.c +++ b/src/game/level_geo.c @@ -34,12 +34,16 @@ Gfx *geo_envfx_main(s32 callContext, struct GraphNode *node, Mat4 mtxf) { vec3f_to_vec3s(marioPos, gPlayerCameraState->pos); particleList = envfx_update_particles(snowMode, marioPos, camTo, camFrom); if (particleList != NULL) { +#if FALSE Mtx *mtx = alloc_display_list(sizeof(*mtx)); gfx = alloc_display_list(2 * sizeof(*gfx)); mtxf_to_mtx(mtx, mtxf); gSPMatrix(&gfx[0], VIRTUAL_TO_PHYSICAL(mtx), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); gSPBranchList(&gfx[1], VIRTUAL_TO_PHYSICAL(particleList)); +#else + gfx = particleList; +#endif execNode->fnNode.node.flags = (execNode->fnNode.node.flags & 0xFF) | 0x400; } SET_HIGH_U16_OF_32(*params, gAreaUpdateCounter); diff --git a/src/game/level_update.c b/src/game/level_update.c index 1268ec9d..9cdcc24b 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -29,6 +29,8 @@ #include "course_table.h" #include "rumble_init.h" +#include "port/Enhancements/game-interactor/GameInteractor_Hooks.h" + #define PLAY_MODE_NORMAL 0 #define PLAY_MODE_PAUSED 2 #define PLAY_MODE_CHANGE_AREA 3 @@ -455,13 +457,11 @@ void init_mario_after_warp(void) { play_sound(SOUND_MENU_MARIO_CASTLE_WARP, gGlobalSoundSource); } -#ifndef VERSION_JP - if (sWarpDest.levelNum == LEVEL_CASTLE_GROUNDS && sWarpDest.areaIdx == 1 + if (!ROM_JP && sWarpDest.levelNum == LEVEL_CASTLE_GROUNDS && sWarpDest.areaIdx == 1 && (sWarpDest.nodeId == 7 || sWarpDest.nodeId == 10 || sWarpDest.nodeId == 20 || sWarpDest.nodeId == 30)) { play_sound(SOUND_MENU_MARIO_CASTLE_WARP, gGlobalSoundSource); } -#endif } } @@ -761,9 +761,9 @@ s16 level_trigger_warp(struct MarioState *m, s32 warpOp) { sDelayedWarpTimer = 30; sSourceWarpNodeId = WARP_NODE_F2; play_transition(WARP_TRANSITION_FADE_INTO_COLOR, 0x1E, 0xFF, 0xFF, 0xFF); -#ifndef VERSION_JP - play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource); -#endif + if(!ROM_JP){ + play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource); + } break; case WARP_OP_UNKNOWN_02: // bbh enter @@ -1155,6 +1155,9 @@ s32 update_level(void) { enable_background_sound(); } + // Updates only when in game, i.e. past the save select screen + GameInteractor_ExecuteOnGameFrameUpdate(); + return changeLevel; } @@ -1196,7 +1199,7 @@ s32 init_level(void) { if (gMarioState->action != ACT_UNINITIALIZED) { if (save_file_exists(gCurrSaveFileNum - 1)) { set_mario_action(gMarioState, ACT_IDLE, 0); - } else { + } else if (CVarGetInteger("gDisablePeachCutscene", 0) == 0){ set_mario_action(gMarioState, ACT_INTRO_CUTSCENE, 0); val4 = TRUE; } @@ -1265,7 +1268,7 @@ s32 lvl_init_from_save_file(UNUSED s16 arg0, s32 levelNum) { #endif sWarpDest.type = WARP_TYPE_NOT_WARPING; sDelayedWarpOp = WARP_OP_NONE; - gNeverEnteredCastle = !save_file_exists(gCurrSaveFileNum - 1); + gNeverEnteredCastle = !save_file_exists(gCurrSaveFileNum - 1) || CVarGetInteger("gDisablePeachCutscene", 0) == 0; gCurrLevelNum = levelNum; gCurrCourseNum = COURSE_NONE; diff --git a/src/game/level_update.h b/src/game/level_update.h index 6693b295..2ed4850d 100644 --- a/src/game/level_update.h +++ b/src/game/level_update.h @@ -5,6 +5,9 @@ #include "types.h" +#ifdef __cplusplus +extern "C" { +#endif #define TIMER_CONTROL_SHOW 0 #define TIMER_CONTROL_START 1 @@ -128,4 +131,8 @@ s32 lvl_set_current_level(UNUSED s16 arg0, s32 levelNum); s32 lvl_play_the_end_screen_sound(UNUSED s16 arg0, UNUSED s32 arg1); void basic_update(UNUSED s16 *arg); +#ifdef __cplusplus +} +#endif + #endif // LEVEL_UPDATE_H diff --git a/src/game/main.h b/src/game/main.h index 6028cbdb..c533b6ab 100644 --- a/src/game/main.h +++ b/src/game/main.h @@ -63,11 +63,12 @@ extern struct SPTask *gActiveSPTask; extern u32 gNumVblanks; extern s8 gResetTimer; extern s8 gNmiResetBarsTimer; -extern s8 gDebugLevelSelect; extern s8 D_8032C650; extern s8 gShowProfiler; extern s8 gShowDebugText; +#define gDebugLevelSelect (CVarGetInteger("gEnableDebugMode", 0) == 1) + void exec_display_list(struct SPTask *spTask); #endif // MAIN_H diff --git a/src/game/mario.c b/src/game/mario.c index e5c3c8de..8224f5e0 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -35,6 +35,8 @@ #include "rumble_init.h" #include "animation_table.h" +#include "port/Enhancements/game-interactor/GameInteractor_Hooks.h" + u32 unused80339F10; u8 unused80339F1C[20]; @@ -248,17 +250,13 @@ void play_sound_if_no_flag(struct MarioState *m, u32 soundBits, u32 flags) { */ void play_mario_jump_sound(struct MarioState *m) { if (!(m->flags & MARIO_MARIO_SOUND_PLAYED)) { -#ifndef VERSION_JP - if (m->action == ACT_TRIPLE_JUMP) { + if (!ROM_JP && m->action == ACT_TRIPLE_JUMP) { play_sound(SOUND_MARIO_YAHOO_WAHA_YIPPEE + ((gAudioRandom % 5) << 16), m->marioObj->header.gfx.cameraToObject); } else { -#endif play_sound(SOUND_MARIO_YAH_WAH_HOO + ((gAudioRandom % 3) << 16), m->marioObj->header.gfx.cameraToObject); -#ifndef VERSION_JP } -#endif m->flags |= MARIO_MARIO_SOUND_PLAYED; } } @@ -1459,6 +1457,7 @@ void update_mario_health(struct MarioState *m) { if ((m->input & INPUT_IN_POISON_GAS) && !(m->action & ACT_FLAG_INTANGIBLE)) { if (!(m->flags & MARIO_METAL_CAP) && !gDebugLevelSelect) { m->health -= 4; + GameInteractor_ExecuteOnHealthChange(m->health); } } else { if ((m->action & ACT_FLAG_SWIMMING) && !(m->action & ACT_FLAG_INTANGIBLE)) { @@ -1469,8 +1468,10 @@ void update_mario_health(struct MarioState *m) { // If using the debug level select, do not lose any HP to water. if ((m->pos[1] >= (m->waterLevel - 140)) && !terrainIsSnow) { m->health += 0x1A; + GameInteractor_ExecuteOnHealthChange(m->health); } else if (!gDebugLevelSelect) { m->health -= (terrainIsSnow ? 3 : 1); + GameInteractor_ExecuteOnHealthChange(m->health); } } } @@ -1479,10 +1480,12 @@ void update_mario_health(struct MarioState *m) { if (m->healCounter > 0) { m->health += 0x40; m->healCounter--; + GameInteractor_ExecuteOnHealthChange(m->health); } if (m->hurtCounter > 0) { m->health -= 0x40; m->hurtCounter--; + GameInteractor_ExecuteOnHealthChange(m->health); } if (m->health > 0x880) { @@ -1756,16 +1759,16 @@ s32 execute_mario_action(UNUSED struct Object *o) { // non-Japanese releases. if (gMarioState->floor->type == SURFACE_HORIZONTAL_WIND) { spawn_wind_particles(0, (gMarioState->floor->force << 8)); -#ifndef VERSION_JP - play_sound(SOUND_ENV_WIND2, gMarioState->marioObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_ENV_WIND2, gMarioState->marioObj->header.gfx.cameraToObject); + } } if (gMarioState->floor->type == SURFACE_VERTICAL_WIND) { spawn_wind_particles(1, 0); -#ifndef VERSION_JP - play_sound(SOUND_ENV_WIND2, gMarioState->marioObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_ENV_WIND2, gMarioState->marioObj->header.gfx.cameraToObject); + } } play_infinite_stairs_music(); diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index c5c5b648..20fc8139 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -32,7 +32,6 @@ void play_far_fall_sound(struct MarioState *m) { } } -#ifndef VERSION_JP void play_knockback_sound(struct MarioState *m) { if (m->actionArg == 0 && (m->forwardVel <= -28.0f || m->forwardVel >= 28.0f)) { play_sound_if_no_flag(m, SOUND_MARIO_DOH, MARIO_MARIO_SOUND_PLAYED); @@ -40,7 +39,6 @@ void play_knockback_sound(struct MarioState *m) { play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); } } -#endif s32 lava_boost_on_wall(struct MarioState *m) { m->faceAngle[1] = atan2s(m->wall->normal.z, m->wall->normal.x); @@ -130,11 +128,7 @@ s32 should_get_stuck_in_ground(struct MarioState *m) { s32 check_fall_damage_or_get_stuck(struct MarioState *m, u32 hardFallAction) { if (should_get_stuck_in_ground(m)) { -#ifdef VERSION_JP - play_sound(SOUND_MARIO_OOOF, m->marioObj->header.gfx.cameraToObject); -#else - play_sound(SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); -#endif + play_sound(ROM_JP ? SOUND_MARIO_OOOF : SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); m->particleFlags |= PARTICLE_MIST_CIRCLE; drop_and_set_mario_action(m, ACT_FEET_STUCK_IN_GROUND, 0); #if ENABLE_RUMBLE @@ -174,9 +168,9 @@ s32 check_horizontal_wind(struct MarioState *m) { m->slideYaw = atan2s(m->slideVelZ, m->slideVelX); m->forwardVel = speed * coss(m->faceAngle[1] - m->slideYaw); -#ifdef VERSION_JP - play_sound(SOUND_ENV_WIND2, m->marioObj->header.gfx.cameraToObject); -#endif + if(ROM_JP){ + play_sound(SOUND_ENV_WIND2, m->marioObj->header.gfx.cameraToObject); + } return TRUE; } @@ -490,11 +484,7 @@ s32 act_triple_jump(struct MarioState *m) { return set_mario_action(m, ACT_GROUND_POUND, 0); } -#ifndef VERSION_JP - play_mario_sound(m, SOUND_ACTION_TERRAIN_JUMP, 0); -#else - play_mario_sound(m, SOUND_ACTION_TERRAIN_JUMP, SOUND_MARIO_YAHOO); -#endif + play_mario_sound(m, SOUND_ACTION_TERRAIN_JUMP, ROM_JP ? SOUND_MARIO_YAHOO : 0); common_air_action_step(m, ACT_TRIPLE_JUMP_LAND, MARIO_ANIM_TRIPLE_JUMP, 0); #if ENABLE_RUMBLE @@ -756,11 +746,7 @@ s32 act_dive(struct MarioState *m) { #if ENABLE_RUMBLE queue_rumble_data(5, 80); #endif -#ifdef VERSION_JP - play_sound(SOUND_MARIO_OOOF, m->marioObj->header.gfx.cameraToObject); -#else - play_sound(SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); -#endif + play_sound(ROM_JP ? SOUND_MARIO_OOOF : SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); m->particleFlags |= PARTICLE_MIST_CIRCLE; drop_and_set_mario_action(m, ACT_HEAD_STUCK_IN_GROUND, 0); } else if (!check_fall_damage(m, ACT_HARD_FORWARD_GROUND_KB)) { @@ -840,9 +826,9 @@ s32 act_water_jump(struct MarioState *m) { break; case AIR_STEP_GRABBED_LEDGE: -#ifndef VERSION_JP - set_mario_animation(m, MARIO_ANIM_IDLE_ON_LEDGE); -#endif + if(!ROM_JP){ + set_mario_animation(m, MARIO_ANIM_IDLE_ON_LEDGE); + } set_mario_action(m, ACT_LEDGE_GRAB, 0); set_camera_mode(m->area->camera, m->area->camera->defMode, 1); break; @@ -954,11 +940,7 @@ s32 act_ground_pound(struct MarioState *m) { #if ENABLE_RUMBLE queue_rumble_data(5, 80); #endif -#ifdef VERSION_JP - play_sound(SOUND_MARIO_OOOF, m->marioObj->header.gfx.cameraToObject); -#else - play_sound(SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); -#endif + play_sound(ROM_JP ? SOUND_MARIO_OOOF : SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); m->particleFlags |= PARTICLE_MIST_CIRCLE; set_mario_action(m, ACT_BUTT_STUCK_IN_GROUND, 0); } else { @@ -1113,15 +1095,15 @@ u32 common_air_knockback_step(struct MarioState *m, u32 landAction, u32 hardFall } #endif if (!check_fall_damage_or_get_stuck(m, hardFallAction)) { -#ifndef VERSION_JP - if (m->action == ACT_THROWN_FORWARD || m->action == ACT_THROWN_BACKWARD) { - set_mario_action(m, landAction, m->hurtCounter); + if(!ROM_JP){ + if (m->action == ACT_THROWN_FORWARD || m->action == ACT_THROWN_BACKWARD) { + set_mario_action(m, landAction, m->hurtCounter); + } else { + set_mario_action(m, landAction, m->actionArg); + } } else { set_mario_action(m, landAction, m->actionArg); } -#else - set_mario_action(m, landAction, m->actionArg); -#endif } break; @@ -1158,11 +1140,11 @@ s32 act_backward_air_kb(struct MarioState *m) { return TRUE; } -#ifndef VERSION_JP - play_knockback_sound(m); -#else - play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); -#endif + if(!ROM_JP){ + play_knockback_sound(m); + } else { + play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); + } common_air_knockback_step(m, ACT_BACKWARD_GROUND_KB, ACT_HARD_BACKWARD_GROUND_KB, 0x0002, -16.0f); return FALSE; } @@ -1172,32 +1154,32 @@ s32 act_forward_air_kb(struct MarioState *m) { return TRUE; } -#ifndef VERSION_JP - play_knockback_sound(m); -#else - play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); -#endif + if(!ROM_JP){ + play_knockback_sound(m); + } else { + play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); + } common_air_knockback_step(m, ACT_FORWARD_GROUND_KB, ACT_HARD_FORWARD_GROUND_KB, 0x002D, 16.0f); return FALSE; } s32 act_hard_backward_air_kb(struct MarioState *m) { -#ifndef VERSION_JP - play_knockback_sound(m); -#else - play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); -#endif + if(!ROM_JP){ + play_knockback_sound(m); + } else { + play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); + } common_air_knockback_step(m, ACT_HARD_BACKWARD_GROUND_KB, ACT_HARD_BACKWARD_GROUND_KB, 0x0002, -16.0f); return FALSE; } s32 act_hard_forward_air_kb(struct MarioState *m) { -#ifndef VERSION_JP - play_knockback_sound(m); -#else - play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); -#endif + if(!ROM_JP){ + play_knockback_sound(m); + } else { + play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); + } common_air_knockback_step(m, ACT_HARD_FORWARD_GROUND_KB, ACT_HARD_FORWARD_GROUND_KB, 0x002D, 16.0f); return FALSE; } @@ -1249,11 +1231,11 @@ s32 act_soft_bonk(struct MarioState *m) { return TRUE; } -#ifndef VERSION_JP - play_knockback_sound(m); -#else - play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); -#endif + if(!ROM_JP){ + play_knockback_sound(m); + } else { + play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); + } common_air_knockback_step(m, ACT_FREEFALL_LAND, ACT_HARD_BACKWARD_GROUND_KB, 0x0056, m->forwardVel); return FALSE; @@ -1281,9 +1263,9 @@ s32 act_getting_blown(struct MarioState *m) { } mario_set_forward_vel(m, m->forwardVel); -#ifdef VERSION_JP - play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); -#endif + if(ROM_JP){ + play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); + } set_mario_animation(m, MARIO_ANIM_BACKWARD_AIR_KB); switch (perform_air_step(m, 0)) { @@ -1823,10 +1805,10 @@ s32 act_flying(struct MarioState *m) { if (startPitch <= 0 && m->faceAngle[0] > 0 && m->forwardVel >= 48.0f) { play_sound(SOUND_ACTION_FLYING_FAST, m->marioObj->header.gfx.cameraToObject); -#ifndef VERSION_JP - play_sound(SOUND_MARIO_YAHOO_WAHA_YIPPEE + ((gAudioRandom % 5) << 16), + if(!ROM_JP){ + play_sound(SOUND_MARIO_YAHOO_WAHA_YIPPEE + ((gAudioRandom % 5) << 16), m->marioObj->header.gfx.cameraToObject); -#endif + } #if ENABLE_RUMBLE queue_rumble_data(50, 40); #endif @@ -1870,26 +1852,26 @@ s32 act_riding_hoot(struct MarioState *m) { } s32 act_flying_triple_jump(struct MarioState *m) { -#ifndef VERSION_JP - if (m->input & (INPUT_B_PRESSED | INPUT_Z_PRESSED)) { - if (m->area->camera->mode == CAMERA_MODE_BEHIND_MARIO) { - set_camera_mode(m->area->camera, m->area->camera->defMode, 1); + if(!ROM_JP){ + if (m->input & (INPUT_B_PRESSED | INPUT_Z_PRESSED)) { + if (m->area->camera->mode == CAMERA_MODE_BEHIND_MARIO) { + set_camera_mode(m->area->camera, m->area->camera->defMode, 1); + } + if (m->input & INPUT_B_PRESSED) { + return set_mario_action(m, ACT_DIVE, 0); + } else { + return set_mario_action(m, ACT_GROUND_POUND, 0); + } } + } else { if (m->input & INPUT_B_PRESSED) { return set_mario_action(m, ACT_DIVE, 0); - } else { + } + + if (m->input & INPUT_Z_PRESSED) { return set_mario_action(m, ACT_GROUND_POUND, 0); } } -#else - if (m->input & INPUT_B_PRESSED) { - return set_mario_action(m, ACT_DIVE, 0); - } - - if (m->input & INPUT_Z_PRESSED) { - return set_mario_action(m, ACT_GROUND_POUND, 0); - } -#endif play_mario_sound(m, SOUND_ACTION_TERRAIN_JUMP, SOUND_MARIO_YAHOO); if (m->actionState == 0) { diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 8251b599..e7871579 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -113,31 +113,31 @@ s32 set_pole_position(struct MarioState *m, f32 offsetY) { s32 act_holding_pole(struct MarioState *m) { struct Object *marioObj = m->marioObj; -#ifdef VERSION_JP - if (m->input & INPUT_A_PRESSED) { - add_tree_leaf_particles(m); - m->faceAngle[1] += 0x8000; - return set_mario_action(m, ACT_WALL_KICK_AIR, 0); - } + if(ROM_JP){ + if (m->input & INPUT_A_PRESSED) { + add_tree_leaf_particles(m); + m->faceAngle[1] += 0x8000; + return set_mario_action(m, ACT_WALL_KICK_AIR, 0); + } - if (m->input & INPUT_Z_PRESSED) { - add_tree_leaf_particles(m); - m->forwardVel = -2.0f; - return set_mario_action(m, ACT_SOFT_BONK, 0); - } -#else - if ((m->input & INPUT_Z_PRESSED) || m->health < 0x100) { - add_tree_leaf_particles(m); - m->forwardVel = -2.0f; - return set_mario_action(m, ACT_SOFT_BONK, 0); - } + if (m->input & INPUT_Z_PRESSED) { + add_tree_leaf_particles(m); + m->forwardVel = -2.0f; + return set_mario_action(m, ACT_SOFT_BONK, 0); + } + } else { + if ((m->input & INPUT_Z_PRESSED) || m->health < 0x100) { + add_tree_leaf_particles(m); + m->forwardVel = -2.0f; + return set_mario_action(m, ACT_SOFT_BONK, 0); + } - if (m->input & INPUT_A_PRESSED) { - add_tree_leaf_particles(m); - m->faceAngle[1] += 0x8000; - return set_mario_action(m, ACT_WALL_KICK_AIR, 0); + if (m->input & INPUT_A_PRESSED) { + add_tree_leaf_particles(m); + m->faceAngle[1] += 0x8000; + return set_mario_action(m, ACT_WALL_KICK_AIR, 0); + } } -#endif if (m->controller->stickY > 16.0f) { f32 poleTop = m->usedObj->hitboxHeight - 100.0f; @@ -190,13 +190,11 @@ s32 act_climbing_pole(struct MarioState *m) { struct Object *marioObj = m->marioObj; s16 cameraAngle = m->area->camera->yaw; -#ifndef VERSION_JP - if (m->health < 0x100) { + if (!ROM_JP && m->health < 0x100) { add_tree_leaf_particles(m); m->forwardVel = -2.0f; return set_mario_action(m, ACT_SOFT_BONK, 0); } -#endif if (m->input & INPUT_A_PRESSED) { add_tree_leaf_particles(m); diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index c4d60aa4..8f772a67 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -111,9 +111,7 @@ void print_displaying_credits_entry(void) { char *titleStr; s16 numLines; s16 strY; -#ifndef VERSION_JP s16 lineHeight; -#endif if (sDispCreditsEntry != NULL) { currStrPtr = (char **) sDispCreditsEntry->unk0C; @@ -121,47 +119,41 @@ void print_displaying_credits_entry(void) { numLines = *titleStr++ - '0'; strY = (sDispCreditsEntry->unk02 & 0x20 ? 28 : 172) + (numLines == 1) * 16; -#ifndef VERSION_JP - lineHeight = 16; -#endif + if(!ROM_JP){ + lineHeight = 16; + } dl_rgba16_begin_cutscene_msg_fade(); print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY, titleStr); -#ifndef VERSION_JP - switch (numLines) { - case 4: - print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY + 24, *currStrPtr++); - numLines = 2; - lineHeight = 24; - break; - case 5: - print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY + 16, *currStrPtr++); - numLines = 3; - break; -#ifdef VERSION_EU - case 6: - print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY + 32, *currStrPtr++); - numLines = 3; - break; - case 7: - print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY + 16, *currStrPtr++); - print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY + 32, *currStrPtr++); - numLines = 3; - break; -#endif + if(!ROM_JP){ + switch (numLines) { + case 4: + print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY + 24, *currStrPtr++); + numLines = 2; + lineHeight = 24; + break; + case 5: + print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY + 16, *currStrPtr++); + numLines = 3; + break; + #ifdef VERSION_EU + case 6: + print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY + 32, *currStrPtr++); + numLines = 3; + break; + case 7: + print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY + 16, *currStrPtr++); + print_credits_str_ascii(CREDIT_TEXT_X_LEFT, strY + 32, *currStrPtr++); + numLines = 3; + break; + #endif + } } -#endif while (numLines-- > 0) { print_credits_str_ascii(CREDIT_TEXT_X_RIGHT - get_credits_str_width(*currStrPtr), strY, *currStrPtr); - -#ifdef VERSION_JP - strY += 16; -#else - strY += lineHeight; -#endif - + strY += ROM_JP ? 16 : lineHeight; currStrPtr++; } @@ -1156,11 +1148,7 @@ s32 act_exit_land_save_dialog(struct MarioState *m) { s32 act_death_exit(struct MarioState *m) { if (15 < m->actionTimer++ && launch_mario_until_land(m, ACT_DEATH_EXIT_LAND, MARIO_ANIM_GENERAL_FALL, -32.0f)) { -#ifdef VERSION_JP - play_sound(SOUND_MARIO_OOOF, m->marioObj->header.gfx.cameraToObject); -#else - play_sound(SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); -#endif + play_sound(ROM_JP ? SOUND_MARIO_OOOF : SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); #if ENABLE_RUMBLE queue_rumble_data(5, 80); #endif @@ -1175,11 +1163,7 @@ s32 act_death_exit(struct MarioState *m) { s32 act_unused_death_exit(struct MarioState *m) { if (launch_mario_until_land(m, ACT_FREEFALL_LAND_STOP, MARIO_ANIM_GENERAL_FALL, 0.0f)) { -#ifdef VERSION_JP - play_sound(SOUND_MARIO_OOOF, m->marioObj->header.gfx.cameraToObject); -#else - play_sound(SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); -#endif + play_sound(ROM_JP ? SOUND_MARIO_OOOF : SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); m->numLives--; // restore 7.75 units of health m->healCounter = 31; @@ -1191,11 +1175,7 @@ s32 act_unused_death_exit(struct MarioState *m) { s32 act_falling_death_exit(struct MarioState *m) { if (launch_mario_until_land(m, ACT_DEATH_EXIT_LAND, MARIO_ANIM_GENERAL_FALL, 0.0f)) { -#ifdef VERSION_JP - play_sound(SOUND_MARIO_OOOF, m->marioObj->header.gfx.cameraToObject); -#else - play_sound(SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); -#endif + play_sound(ROM_JP ? SOUND_MARIO_OOOF : SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); #if ENABLE_RUMBLE queue_rumble_data(5, 80); #endif @@ -1718,9 +1698,9 @@ static void intro_cutscene_jump_out_of_pipe(struct MarioState *m) { play_sound_if_no_flag(m, SOUND_MARIO_YAHOO, MARIO_MARIO_SOUND_PLAYED); #else play_sound_if_no_flag(m, SOUND_MARIO_YAHOO, MARIO_MARIO_SOUND_PLAYED); -#ifndef VERSION_JP - play_sound_if_no_flag(m, SOUND_ACTION_HIT_3, MARIO_ACTION_SOUND_PLAYED); -#endif + if(!ROM_JP){ + play_sound_if_no_flag(m, SOUND_ACTION_HIT_3, MARIO_ACTION_SOUND_PLAYED); + } #endif set_mario_animation(m, MARIO_ANIM_SINGLE_JUMP); @@ -1728,9 +1708,9 @@ static void intro_cutscene_jump_out_of_pipe(struct MarioState *m) { if (perform_air_step(m, 0) == AIR_STEP_LANDED) { sound_banks_enable(SEQ_PLAYER_SFX, SOUND_BANKS_DISABLED_DURING_INTRO_CUTSCENE); play_mario_landing_sound(m, SOUND_ACTION_TERRAIN_LANDING); -#ifndef VERSION_JP - play_sound(SOUND_MARIO_HAHA, m->marioObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_MARIO_HAHA, m->marioObj->header.gfx.cameraToObject); + } advance_cutscene_step(m); } } @@ -2225,10 +2205,10 @@ static void end_peach_cutscene_dialog_1(struct MarioState *m) { case 230: #endif set_cutscene_message(160, 227, 0, 30); -#ifndef VERSION_JP - seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40); - play_sound(SOUND_PEACH_MARIO, sEndPeachObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40); + play_sound(SOUND_PEACH_MARIO, sEndPeachObj->header.gfx.cameraToObject); + } break; #ifdef VERSION_SH @@ -2246,9 +2226,9 @@ static void end_peach_cutscene_dialog_1(struct MarioState *m) { case 290: #endif set_cutscene_message(160, 227, 1, 60); -#ifndef VERSION_JP - play_sound(SOUND_PEACH_POWER_OF_THE_STARS, sEndPeachObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_PEACH_POWER_OF_THE_STARS, sEndPeachObj->header.gfx.cameraToObject); + } break; #ifdef VERSION_SH @@ -2286,9 +2266,9 @@ static void end_peach_cutscene_dialog_2(struct MarioState *m) { case 29: #endif set_cutscene_message(160, 227, 2, 30); -#ifndef VERSION_JP - play_sound(SOUND_PEACH_THANKS_TO_YOU, sEndPeachObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_PEACH_THANKS_TO_YOU, sEndPeachObj->header.gfx.cameraToObject); + } break; #ifdef VERSION_SH @@ -2305,16 +2285,16 @@ static void end_peach_cutscene_dialog_2(struct MarioState *m) { case 75: #endif set_cutscene_message(160, 227, 3, 30); -#ifndef VERSION_JP - play_sound(SOUND_PEACH_THANK_YOU_MARIO, sEndPeachObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_PEACH_THANK_YOU_MARIO, sEndPeachObj->header.gfx.cameraToObject); + } break; case TIMER_SOMETHING_SPECIAL: set_cutscene_message(160, 227, 4, 40); -#ifndef VERSION_JP - play_sound(SOUND_PEACH_SOMETHING_SPECIAL, sEndPeachObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_PEACH_SOMETHING_SPECIAL, sEndPeachObj->header.gfx.cameraToObject); + } break; case TIMER_PEACH_KISS: @@ -2413,9 +2393,9 @@ static void end_peach_cutscene_star_dance(struct MarioState *m) { break; case 140: -#ifndef VERSION_JP - seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60); -#endif + if(!ROM_JP){ + seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60); + } play_cutscene_music(SEQUENCE_ARGS(15, SEQ_EVENT_CUTSCENE_CREDITS)); break; @@ -2443,9 +2423,9 @@ static void end_peach_cutscene_dialog_3(struct MarioState *m) { sEndToadAnims[1] = 2; D_8032CBE8 = 1; set_cutscene_message(160, 227, 5, 30); -#ifndef VERSION_JP - play_sound(SOUND_PEACH_BAKE_A_CAKE, sEndPeachObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_PEACH_BAKE_A_CAKE, sEndPeachObj->header.gfx.cameraToObject); + } break; case 55: @@ -2454,9 +2434,9 @@ static void end_peach_cutscene_dialog_3(struct MarioState *m) { case 130: set_cutscene_message(160, 227, 7, 50); -#ifndef VERSION_JP - play_sound(SOUND_PEACH_FOR_MARIO, sEndPeachObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_PEACH_FOR_MARIO, sEndPeachObj->header.gfx.cameraToObject); + } break; } @@ -2478,9 +2458,9 @@ static void end_peach_cutscene_run_to_castle(struct MarioState *m) { if (m->actionTimer == 95) { set_cutscene_message(160, 227, 0, 40); -#ifndef VERSION_JP - play_sound(SOUND_PEACH_MARIO2, sEndPeachObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + play_sound(SOUND_PEACH_MARIO2, sEndPeachObj->header.gfx.cameraToObject); + } } if (m->actionTimer == 389) { advance_cutscene_step(m); diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index fa3758b9..0c0fe4db 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -1384,13 +1384,9 @@ void common_slide_action(struct MarioState *m, u32 endAction, u32 airAction, s32 case GROUND_STEP_HIT_WALL: if (!mario_floor_is_slippery(m)) { -#ifdef VERSION_JP - m->particleFlags |= PARTICLE_VERTICAL_STAR; -#else - if (m->forwardVel > 16.0f) { + if (ROM_JP || m->forwardVel > 16.0f) { m->particleFlags |= PARTICLE_VERTICAL_STAR; } -#endif slide_bonk(m, ACT_GROUND_BONK, endAction); } else if (m->wall != NULL) { s16 wallAngle = atan2s(m->wall->normal.z, m->wall->normal.x); @@ -1595,11 +1591,7 @@ s32 common_ground_knockback_action(struct MarioState *m, s32 animation, s32 arg2 if (arg4 > 0) { play_sound_if_no_flag(m, SOUND_MARIO_ATTACKED, MARIO_MARIO_SOUND_PLAYED); } else { -#ifdef VERSION_JP - play_sound_if_no_flag(m, SOUND_MARIO_OOOF, MARIO_MARIO_SOUND_PLAYED); -#else - play_sound_if_no_flag(m, SOUND_MARIO_OOOF2, MARIO_MARIO_SOUND_PLAYED); -#endif + play_sound_if_no_flag(m, ROM_JP ? SOUND_MARIO_OOOF : SOUND_MARIO_OOOF2, MARIO_MARIO_SOUND_PLAYED); } if (m->forwardVel > 32.0f) { @@ -1645,11 +1637,9 @@ s32 act_hard_backward_ground_kb(struct MarioState *m) { set_mario_action(m, ACT_DEATH_ON_BACK, 0); } -#ifndef VERSION_JP - if (animFrame == 54 && m->prevAction == ACT_SPECIAL_DEATH_EXIT) { + if (!ROM_JP && animFrame == 54 && m->prevAction == ACT_SPECIAL_DEATH_EXIT) { play_sound(SOUND_MARIO_MAMA_MIA, m->marioObj->header.gfx.cameraToObject); } -#endif if (animFrame == 69) { play_mario_landing_sound_once(m, SOUND_ACTION_TERRAIN_LANDING); diff --git a/src/game/mario_actions_object.c b/src/game/mario_actions_object.c index fe13272e..11f64ea5 100644 --- a/src/game/mario_actions_object.c +++ b/src/game/mario_actions_object.c @@ -337,15 +337,17 @@ s32 act_holding_bowser(struct MarioState *m) { s16 spin; if (m->input & INPUT_B_PRESSED) { -#ifndef VERSION_JP - if (m->angleVel[1] <= -0xE00 || m->angleVel[1] >= 0xE00) { - play_sound(SOUND_MARIO_SO_LONGA_BOWSER, m->marioObj->header.gfx.cameraToObject); + + if(!ROM_JP){ + if (m->angleVel[1] <= -0xE00 || m->angleVel[1] >= 0xE00) { + play_sound(SOUND_MARIO_SO_LONGA_BOWSER, m->marioObj->header.gfx.cameraToObject); + } else { + play_sound(SOUND_MARIO_HERE_WE_GO, m->marioObj->header.gfx.cameraToObject); + } } else { play_sound(SOUND_MARIO_HERE_WE_GO, m->marioObj->header.gfx.cameraToObject); } -#else - play_sound(SOUND_MARIO_HERE_WE_GO, m->marioObj->header.gfx.cameraToObject); -#endif + return set_mario_action(m, ACT_RELEASING_BOWSER, 0); } diff --git a/src/game/mario_actions_stationary.c b/src/game/mario_actions_stationary.c index 69e8be52..709fd679 100644 --- a/src/game/mario_actions_stationary.c +++ b/src/game/mario_actions_stationary.c @@ -179,9 +179,7 @@ void play_anim_sound(struct MarioState *m, u32 actionState, s32 animFrame, u32 s } s32 act_start_sleeping(struct MarioState *m) { -#ifndef VERSION_JP s32 animFrame; -#endif if (check_common_idle_cancels(m)) { return TRUE; @@ -197,32 +195,20 @@ s32 act_start_sleeping(struct MarioState *m) { switch (m->actionState) { case 0: -#ifndef VERSION_JP - animFrame = -#endif - set_mario_animation(m, MARIO_ANIM_START_SLEEP_IDLE); + animFrame = set_mario_animation(m, MARIO_ANIM_START_SLEEP_IDLE); break; case 1: -#ifndef VERSION_JP - animFrame = -#endif - set_mario_animation(m, MARIO_ANIM_START_SLEEP_SCRATCH); + animFrame = set_mario_animation(m, MARIO_ANIM_START_SLEEP_SCRATCH); break; case 2: -#ifndef VERSION_JP - animFrame = -#endif - set_mario_animation(m, MARIO_ANIM_START_SLEEP_YAWN); + animFrame = set_mario_animation(m, MARIO_ANIM_START_SLEEP_YAWN); m->marioBodyState->eyeState = MARIO_EYES_HALF_CLOSED; break; case 3: -#ifndef VERSION_JP - animFrame = -#endif - set_mario_animation(m, MARIO_ANIM_START_SLEEP_SITTING); + animFrame = set_mario_animation(m, MARIO_ANIM_START_SLEEP_SITTING); m->marioBodyState->eyeState = MARIO_EYES_HALF_CLOSED; break; } @@ -235,19 +221,17 @@ s32 act_start_sleeping(struct MarioState *m) { m->actionState++; } -#ifndef VERSION_JP - if (m->actionState == 2 && animFrame == -1) { + if (!ROM_JP && m->actionState == 2 && animFrame == -1) { play_sound(SOUND_MARIO_YAWNING, m->marioObj->header.gfx.cameraToObject); } - if (m->actionState == 1 && animFrame == -1) { + if (!ROM_JP && m->actionState == 1 && animFrame == -1) { play_sound(SOUND_MARIO_IMA_TIRED, m->marioObj->header.gfx.cameraToObject); } -#else - if (m->actionState == 2) { + + if (ROM_JP && m->actionState == 2) { play_sound_if_no_flag(m, SOUND_MARIO_YAWNING, MARIO_MARIO_SOUND_PLAYED); } -#endif stationary_ground_step(m); return FALSE; @@ -307,17 +291,19 @@ s32 act_sleeping(struct MarioState *m) { case 2: animFrame = set_mario_animation(m, MARIO_ANIM_SLEEP_LYING); -#ifndef VERSION_JP - play_sound_if_no_flag(m, SOUND_MARIO_SNORING3, MARIO_ACTION_SOUND_PLAYED); -#else - if (animFrame == 2) { - play_sound(SOUND_MARIO_SNORING2, m->marioObj->header.gfx.cameraToObject); + + if(!ROM_JP){ + play_sound_if_no_flag(m, SOUND_MARIO_SNORING3, MARIO_ACTION_SOUND_PLAYED); + } else { + if (animFrame == 2) { + play_sound(SOUND_MARIO_SNORING2, m->marioObj->header.gfx.cameraToObject); + } + + if (animFrame == 25) { + play_sound(SOUND_MARIO_SNORING1, m->marioObj->header.gfx.cameraToObject); + } } - if (animFrame == 25) { - play_sound(SOUND_MARIO_SNORING1, m->marioObj->header.gfx.cameraToObject); - } -#endif break; } return FALSE; @@ -327,9 +313,9 @@ s32 act_waking_up(struct MarioState *m) { if (!m->actionTimer) { stop_sound(SOUND_MARIO_SNORING1, m->marioObj->header.gfx.cameraToObject); stop_sound(SOUND_MARIO_SNORING2, m->marioObj->header.gfx.cameraToObject); -#ifndef VERSION_JP - stop_sound(SOUND_MARIO_SNORING3, m->marioObj->header.gfx.cameraToObject); -#endif + if(!ROM_JP){ + stop_sound(SOUND_MARIO_SNORING3, m->marioObj->header.gfx.cameraToObject); + } raise_background_noise(2); } diff --git a/src/game/mario_step.c b/src/game/mario_step.c index 4b03e7de..ca551788 100644 --- a/src/game/mario_step.c +++ b/src/game/mario_step.c @@ -211,9 +211,9 @@ u32 mario_update_windy_ground(struct MarioState *m) { m->vel[0] += pushSpeed * sins(pushAngle); m->vel[2] += pushSpeed * coss(pushAngle); -#ifdef VERSION_JP - play_sound(SOUND_ENV_WIND2, m->marioObj->header.gfx.cameraToObject); -#endif + if(ROM_JP){ + play_sound(SOUND_ENV_WIND2, m->marioObj->header.gfx.cameraToObject); + } return TRUE; } @@ -600,9 +600,9 @@ void apply_vertical_wind(struct MarioState *m) { } } -#ifdef VERSION_JP - play_sound(SOUND_ENV_WIND2, m->marioObj->header.gfx.cameraToObject); -#endif + if(ROM_JP){ + play_sound(SOUND_ENV_WIND2, m->marioObj->header.gfx.cameraToObject); + } } } } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 68885128..2df003d3 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -94,29 +94,29 @@ Gfx *geo_update_layer_transparency(s32 callContext, struct GraphNode *node, UNUS objectGraphNode->oAnimState = 1; -#ifdef VERSION_JP - if (currentGraphNode->parameter == 10) { - if (gDebugInfo[DEBUG_PAGE_ENEMYINFO][3]) { - gDPSetAlphaCompare(dlHead++, G_AC_DITHER); + if(ROM_JP){ + if (currentGraphNode->parameter == 10) { + if (gDebugInfo[DEBUG_PAGE_ENEMYINFO][3]) { + gDPSetAlphaCompare(dlHead++, G_AC_DITHER); + } + } else { + if (objectGraphNode->activeFlags & ACTIVE_FLAG_DITHERED_ALPHA) { + gDPSetAlphaCompare(dlHead++, G_AC_DITHER); + } } - } else { - if (objectGraphNode->activeFlags & ACTIVE_FLAG_DITHERED_ALPHA) { - gDPSetAlphaCompare(dlHead++, G_AC_DITHER); + } else { // gDebugInfo accesses were removed in all non-JP versions. + if (objectOpacity == 0 && segmented_to_virtual(bhvBowser) == objectGraphNode->behavior) { + objectGraphNode->oAnimState = 2; + } + // the debug info check was removed in US. so we need to + // perform the only necessary check instead of the debuginfo + // one. + if (currentGraphNode->parameter != 10) { + if (objectGraphNode->activeFlags & ACTIVE_FLAG_DITHERED_ALPHA) { + gDPSetAlphaCompare(dlHead++, G_AC_DITHER); + } } } -#else // gDebugInfo accesses were removed in all non-JP versions. - if (objectOpacity == 0 && segmented_to_virtual(bhvBowser) == objectGraphNode->behavior) { - objectGraphNode->oAnimState = 2; - } - // the debug info check was removed in US. so we need to - // perform the only necessary check instead of the debuginfo - // one. - if (currentGraphNode->parameter != 10) { - if (objectGraphNode->activeFlags & ACTIVE_FLAG_DITHERED_ALPHA) { - gDPSetAlphaCompare(dlHead++, G_AC_DITHER); - } - } -#endif } gDPSetEnvColor(dlHead++, 255, 255, 255, objectOpacity); @@ -1536,6 +1536,7 @@ void cur_obj_set_pos_to_home(void) { o->oPosX = o->oHomeX; o->oPosY = o->oHomeY; o->oPosZ = o->oHomeZ; + o->header.gfx.skipInterpolationTimestamp = gGlobalTimer; } void cur_obj_set_pos_to_home_and_stop(void) { @@ -1725,13 +1726,10 @@ static void cur_obj_update_floor(void) { if (floor != NULL) { if (floor->type == SURFACE_BURNING) { o->oMoveFlags |= OBJ_MOVE_ABOVE_LAVA; - } -#ifndef VERSION_JP - else if (floor->type == SURFACE_DEATH_PLANE) { + } else if (!ROM_JP && floor->type == SURFACE_DEATH_PLANE) { //! This misses SURFACE_VERTICAL_WIND (and maybe SURFACE_WARP) o->oMoveFlags |= OBJ_MOVE_ABOVE_DEATH_BARRIER; } -#endif o->oFloorType = floor->type; o->oFloorRoom = floor->room; @@ -1742,11 +1740,11 @@ static void cur_obj_update_floor(void) { } static void cur_obj_update_floor_and_resolve_wall_collisions(s16 steepSlopeDegrees) { -#ifdef VERSION_JP - o->oMoveFlags &= ~OBJ_MOVE_ABOVE_LAVA; -#else - o->oMoveFlags &= ~(OBJ_MOVE_ABOVE_LAVA | OBJ_MOVE_ABOVE_DEATH_BARRIER); -#endif + if(ROM_JP){ + o->oMoveFlags &= ~OBJ_MOVE_ABOVE_LAVA; + } else { + o->oMoveFlags &= ~(OBJ_MOVE_ABOVE_LAVA | OBJ_MOVE_ABOVE_DEATH_BARRIER); + } if (o->activeFlags & (ACTIVE_FLAG_FAR_AWAY | ACTIVE_FLAG_IN_DIFFERENT_ROOM)) { cur_obj_update_floor(); @@ -2897,11 +2895,9 @@ void cur_obj_spawn_loot_blue_coin(void) { } } -#ifndef VERSION_JP void cur_obj_spawn_star_at_y_offset(f32 targetX, f32 targetY, f32 targetZ, f32 offsetY) { f32 objectPosY = o->oPosY; o->oPosY += offsetY + gDebugInfo[DEBUG_PAGE_ENEMYINFO][0]; spawn_default_star(targetX, targetY, targetZ); o->oPosY = objectPosY; } -#endif diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index b1846778..640bbfc5 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -274,9 +274,6 @@ void enable_time_stop_including_mario(void); void disable_time_stop_including_mario(void); s32 cur_obj_check_interacted(void); void cur_obj_spawn_loot_blue_coin(void); - -#ifndef VERSION_JP void cur_obj_spawn_star_at_y_offset(f32 targetX, f32 targetY, f32 targetZ, f32 offsetY); -#endif #endif // OBJECT_HELPERS_H diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index e635791f..b7e294fb 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -460,9 +460,9 @@ void spawn_objects_from_info(UNUSED s32 unused, struct SpawnInfo *spawnInfo) { //! (Spawning Displacement) On the Japanese version, Mario's platform object // isn't cleared when transitioning between areas. This can cause Mario to // receive displacement after spawning. -#ifndef VERSION_JP - clear_mario_platform(); -#endif + if(ROM_JP){ + clear_mario_platform(); + } if (gCurrAreaIndex == 2) { gCCMEnteredSlide |= 1; diff --git a/src/game/paintings.c b/src/game/paintings.c index 9bfca393..f0ec4800 100644 --- a/src/game/paintings.c +++ b/src/game/paintings.c @@ -189,6 +189,32 @@ struct Painting **sPaintingGroups[] = { s16 gPaintingUpdateCounter = 1; s16 gLastPaintingUpdateCounter = 0; +static Vtx sLastVertices[2 * 264 * 3]; +static u32 sLastVerticesTimestamp; +static Vtx *sVerticesPtr[2]; +static s32 sVerticesCount; + +void patch_interpolated_paintings(void) { + if (sVerticesPtr[0] != NULL) { + s32 i; + if (sVerticesPtr[1] != NULL) { + for (i = 0; i < sVerticesCount / 2; i++) { + sVerticesPtr[0][i] = sLastVertices[i]; + } + for (; i < sVerticesCount; i++) { + sVerticesPtr[1][i - sVerticesCount / 2] = sLastVertices[i]; + } + } else { + for (i = 0; i < sVerticesCount; i++) { + sVerticesPtr[0][i] = sLastVertices[i]; + } + } + sVerticesPtr[0] = NULL; + sVerticesPtr[1] = NULL; + sVerticesCount = 0; + } +} + /** * Stop paintings in paintingGroup from rippling if their id is different from *idptr. */ @@ -893,6 +919,23 @@ Gfx *render_painting(u8 *img, s16 tWidth, s16 tHeight, s16 *textureMap, s16 mapV gSP1Triangle(gfx++, group * 3, group * 3 + 1, group * 3 + 2, 0); } + if (sVerticesCount >= numVtx * 2) { + sVerticesCount = 0; + } + for (map = 0; map < numVtx; map++) { + Vtx v = verts[map]; + if (gGlobalTimer == sLastVerticesTimestamp + 1) { + s32 i; + for (i = 0; i < 3; i++) { + verts[map].n.ob[i] = (v.n.ob[i] + sLastVertices[sVerticesCount + map].n.ob[i]) / 2; + verts[map].n.n[i] = (v.n.n[i] + sLastVertices[sVerticesCount + map].n.n[i]) / 2; + } + } + sLastVertices[sVerticesCount + map] = v; + } + sVerticesPtr[sVerticesCount / numVtx] = verts; + sVerticesCount += numVtx; + gSPEndDisplayList(gfx); return dlist; } @@ -957,6 +1000,7 @@ Gfx *painting_ripple_image(struct Painting *painting) { meshTris = textureMap[meshVerts * 3 + 1]; gSPDisplayList(gfx++, render_painting(textures[i], tWidth, tHeight, textureMap, meshVerts, meshTris, painting->alpha)); } + sLastVerticesTimestamp = gGlobalTimer; // Update the ripple, may automatically reset the painting's state. painting_update_ripple_state(painting); @@ -994,6 +1038,7 @@ Gfx *painting_ripple_env_mapped(struct Painting *painting) { meshVerts = textureMap[0]; meshTris = textureMap[meshVerts * 3 + 1]; gSPDisplayList(gfx++, render_painting(tArray[0], tWidth, tHeight, textureMap, meshVerts, meshTris, painting->alpha)); + sLastVerticesTimestamp = gGlobalTimer; // Update the ripple, may automatically reset the painting's state. painting_update_ripple_state(painting); diff --git a/src/game/platform_displacement.c b/src/game/platform_displacement.c index 97494278..a6a15f0f 100644 --- a/src/game/platform_displacement.c +++ b/src/game/platform_displacement.c @@ -177,11 +177,9 @@ void apply_mario_platform_displacement(void) { } } -#ifndef VERSION_JP /** * Set Mario's platform to NULL. */ void clear_mario_platform(void) { gMarioPlatform = NULL; } -#endif diff --git a/src/game/platform_displacement.h b/src/game/platform_displacement.h index 1493df03..c1e8f291 100644 --- a/src/game/platform_displacement.h +++ b/src/game/platform_displacement.h @@ -10,8 +10,6 @@ void get_mario_pos(f32 *x, f32 *y, f32 *z); void set_mario_pos(f32 x, f32 y, f32 z); void apply_platform_displacement(u32 isMario, struct Object *platform); void apply_mario_platform_displacement(void); -#ifndef VERSION_JP void clear_mario_platform(void); -#endif #endif // PLATFORM_DISPLACEMENT_H diff --git a/src/game/print.c b/src/game/print.c index a979eb13..69f29dc1 100644 --- a/src/game/print.c +++ b/src/game/print.c @@ -398,6 +398,7 @@ void render_text_labels(void) { gSPPerspNormalize((Gfx *) (gDisplayListHead++), 0xFFFF); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(mtx), G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH); gSPDisplayList(gDisplayListHead++, dl_hud_img_begin); + gSPDisableFiltering(gDisplayListHead++, TRUE); for (i = 0; i < sTextLabelsCount; i++) { for (j = 0; j < sTextLabels[i]->length; j++) { @@ -427,6 +428,7 @@ void render_text_labels(void) { mem_pool_free(gEffectsMemoryPool, sTextLabels[i]); } + gSPDisableFiltering(gDisplayListHead++, FALSE); gSPDisplayList(gDisplayListHead++, dl_hud_img_end); sTextLabelsCount = 0; diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index eea7246a..ed366fa2 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -39,6 +39,10 @@ s16 gMatStackIndex; Mat4 gMatStack[32]; Mtx *gMatStackFixed[32]; +Mat4 gMatStackInterpolated[32]; +Mtx *gMatStackInterpolatedFixed[32]; + +extern float gInterpolationStep; /** * Animation nodes have state in global variables, so this struct captures @@ -52,6 +56,7 @@ struct GeoAnimState { /*0x04*/ f32 translationMultiplier; /*0x08*/ u16 *attribute; /*0x0C*/ s16 *data; + s16 prevFrame; }; // For some reason, this is a GeoAnimState struct, but the current state consists @@ -61,6 +66,7 @@ struct GeoAnimState gGeoTempState; u8 gCurrAnimType; u8 gCurrAnimEnabled; s16 gCurrAnimFrame; +s16 gPrevAnimFrame; f32 gCurrAnimTranslationMultiplier; u16 *gCurrAnimAttribute; s16 *gCurrAnimData; @@ -129,6 +135,46 @@ u16 gAreaUpdateCounter = 0; LookAt lookAt; #endif +static Gfx *sPerspectivePos; +static Mtx *sPerspectiveMtx; + +struct { + Gfx *pos; + void *mtx; + void *displayList; +} gMtxTbl[6400]; +s32 gMtxTblSize; + +static Gfx *sViewportPos; +static Vp sPrevViewport; + +void mtx_patch_interpolated(void) { + s32 i; + + if (sPerspectivePos != NULL) { + gSPMatrix(sPerspectivePos, VIRTUAL_TO_PHYSICAL(sPerspectiveMtx), G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH); + } + + for (i = 0; i < gMtxTblSize; i++) { + Gfx *pos = gMtxTbl[i].pos; + gSPMatrix(pos++, VIRTUAL_TO_PHYSICAL(gMtxTbl[i].mtx), + G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); + gSPDisplayList(pos++, gMtxTbl[i].displayList); + } + + if (sViewportPos != NULL) { + Gfx *saved = gDisplayListHead; + gDisplayListHead = sViewportPos; + make_viewport_clip_rect(&sPrevViewport); + gSPViewport(gDisplayListHead, VIRTUAL_TO_PHYSICAL(&sPrevViewport)); + gDisplayListHead = saved; + } + + gMtxTblSize = 0; + sPerspectivePos = NULL; + sViewportPos = NULL; +} + /** * Process a master list node. */ @@ -156,9 +202,14 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { if ((currList = node->listHeads[i]) != NULL) { gDPSetRenderMode(gDisplayListHead++, modeList->modes[i], mode2List->modes[i]); while (currList != NULL) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(currList->transform), + if ((u32) gMtxTblSize < sizeof(gMtxTbl) / sizeof(gMtxTbl[0])) { + gMtxTbl[gMtxTblSize].pos = gDisplayListHead; + gMtxTbl[gMtxTblSize].mtx = currList->transform; + gMtxTbl[gMtxTblSize++].displayList = currList->displayList; + } + gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(currList->transformInterpolated), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); - gSPDisplayList(gDisplayListHead++, currList->displayList); + gSPDisplayList(gDisplayListHead++, currList->displayListInterpolated); currList = currList->next; } } @@ -174,7 +225,7 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { * parameter. Look at the RenderModeContainer struct to see the corresponding * render modes of layers. */ -static void geo_append_display_list(void *displayList, s16 layer) { +static void geo_append_display_list2(void *displayList, void *displayListInterpolated, s16 layer) { #ifdef F3DEX_GBI_2 gSPLookAt(gDisplayListHead++, &lookAt); @@ -184,7 +235,9 @@ static void geo_append_display_list(void *displayList, s16 layer) { alloc_only_pool_alloc(gDisplayListHeap, sizeof(struct DisplayListNode)); listNode->transform = gMatStackFixed[gMatStackIndex]; + listNode->transformInterpolated = gMatStackInterpolatedFixed[gMatStackIndex]; listNode->displayList = displayList; + listNode->displayListInterpolated = displayListInterpolated; listNode->next = 0; if (gCurGraphNodeMasterList->listHeads[layer] == 0) { gCurGraphNodeMasterList->listHeads[layer] = listNode; @@ -195,12 +248,16 @@ static void geo_append_display_list(void *displayList, s16 layer) { } } +static void geo_append_display_list(void *displayList, s16 layer) { + geo_append_display_list2(displayList, displayList, layer); +} + /** * Process the master list node. */ static void geo_process_master_list(struct GraphNodeMasterList *node) { s32 i; - UNUSED u8 filler[4]; + UNUSED s32 sp1C; if (gCurGraphNodeMasterList == NULL && node->node.children != NULL) { gCurGraphNodeMasterList = node; @@ -241,7 +298,9 @@ static void geo_process_perspective(struct GraphNodePerspective *node) { } if (node->fnNode.node.children != NULL) { u16 perspNorm; + Mtx *mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); Mtx *mtx = alloc_display_list(sizeof(*mtx)); + f32 fovInterpolated; #ifdef VERSION_EU f32 aspect = ((f32) gCurGraphNodeRoot->width / (f32) gCurGraphNodeRoot->height) * 1.1f; @@ -250,9 +309,23 @@ static void geo_process_perspective(struct GraphNodePerspective *node) { #endif guPerspective(mtx, &perspNorm, node->fov, aspect, node->near, node->far, 1.0f); - gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(mtx), G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH); + if (gGlobalTimer == node->prevTimestamp + 1 && gGlobalTimer != gLakituState.skipCameraInterpolationTimestamp) { + + fovInterpolated = (node->prevFov + node->fov) / 2.0f; + guPerspective(mtxInterpolated, &perspNorm, fovInterpolated, aspect, node->near, node->far, 1.0f); + gSPPerspNormalize(gDisplayListHead++, perspNorm); + + sPerspectivePos = gDisplayListHead; + sPerspectiveMtx = mtx; + gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(mtxInterpolated), + G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH); + } else { + gSPPerspNormalize(gDisplayListHead++, perspNorm); + gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(mtx), G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH); + } + node->prevFov = node->fov; + node->prevTimestamp = gGlobalTimer; gCurGraphNodeCamFrustum = node; geo_process_node_and_siblings(node->fnNode.node.children); @@ -277,6 +350,10 @@ static void geo_process_level_of_detail(struct GraphNodeLevelOfDetail *node) { s16 distanceFromCam = -GET_HIGH_S16_OF_32(mtx->m[1][3]); // z-component of the translation column #endif + if(CVarGetInteger("gDisableLOD", 0) == 1) { + distanceFromCam = 0; + } + if (node->minDistance <= distanceFromCam && distanceFromCam < node->maxDistance) { if (node->node.children != 0) { geo_process_node_and_siblings(node->node.children); @@ -304,6 +381,77 @@ static void geo_process_switch(struct GraphNodeSwitchCase *node) { } } +float lerp(f32 o, f32 n) { + return (1 - gInterpolationStep) * o + gInterpolationStep * n; +} + +s16 lerp_s(s16 o, s16 n) { + if (o == n) + return n; + int diff = o - n; + float w = 1 - gInterpolationStep; + if (-0x8000 <= diff && diff <= 0x8000) { + return (s16)(w * o + gInterpolationStep * n); + } else { + if (o < n) { + o += 0x10000; + } else { + n += 0x10000; + } + diff = o - n; + return (s16)(w * o + gInterpolationStep * n); + } +} + +void interpolate_vectors(Vec3f res, Vec3f a, Vec3f b) { + res[0] = lerp(a[0], b[0]); + res[1] = lerp(a[1], b[1]); + res[2] = lerp(a[2], b[2]); +} + +void interpolate_vectors_s16(Vec3s res, Vec3s a, Vec3s b) { + res[0] = lerp_s(a[0], b[0]); + res[1] = lerp_s(a[1], b[1]); + res[2] = lerp_s(a[2], b[2]); +} + +static s16 interpolate_angle(s16 os, s16 ns) { + if (os == ns) + return ns; + int o = (u16)os; + int n = (u16)ns; + u16 res; + int diff = o - n; + float w = 1 - gInterpolationStep; + if (-0x8000 <= diff && diff <= 0x8000) { + if (diff < -0x4000 || diff > 0x4000) { + return ns; + } + res = (u16)(w * o + gInterpolationStep * n); + } else { + if (o < n) { + o += 0x10000; + } else { + n += 0x10000; + } + diff = o - n; + if (diff < -0x4000 || diff > 0x4000) { + return ns; + } + res = (u16)(w * o + gInterpolationStep * n); + } + if (os / 327 == ns / 327 && (s16)res / 327 != os / 327) { + int bp = 0; + } + return res; +} + +static void interpolate_angles(Vec3s res, Vec3s a, Vec3s b) { + res[0] = interpolate_angle(a[0], b[0]); + res[1] = interpolate_angle(a[1], b[1]); + res[2] = interpolate_angle(a[2], b[2]); +} + /** * Process a camera node. */ @@ -311,6 +459,9 @@ static void geo_process_camera(struct GraphNodeCamera *node) { Mat4 cameraTransform; Mtx *rollMtx = alloc_display_list(sizeof(*rollMtx)); Mtx *mtx = alloc_display_list(sizeof(*mtx)); + Mtx *mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); + Vec3f posInterpolated; + Vec3f focusInterpolated; if (node->fnNode.func != NULL) { node->fnNode.func(GEO_CONTEXT_RENDER, &node->fnNode.node, gMatStack[gMatStackIndex]); @@ -321,12 +472,40 @@ static void geo_process_camera(struct GraphNodeCamera *node) { mtxf_lookat(cameraTransform, node->pos, node->focus, node->roll); mtxf_mul(gMatStack[gMatStackIndex + 1], cameraTransform, gMatStack[gMatStackIndex]); + + if (gGlobalTimer == node->prevTimestamp + 1 && gGlobalTimer != gLakituState.skipCameraInterpolationTimestamp) { + interpolate_vectors(posInterpolated, node->prevPos, node->pos); + interpolate_vectors(focusInterpolated, node->prevFocus, node->focus); + float magnitude = 0; + for (int i = 0; i < 3; i++) { + float diff = node->pos[i] - node->prevPos[i]; + magnitude += diff * diff; + } + if (magnitude > 500000) { + // Observed ~479000 in BBH when toggling R camera + // Can get over 3 million in VCUTM though... + vec3f_copy(posInterpolated, node->pos); + vec3f_copy(focusInterpolated, node->focus); + } + } else { + vec3f_copy(posInterpolated, node->pos); + vec3f_copy(focusInterpolated, node->focus); + } + vec3f_copy(node->prevPos, node->pos); + vec3f_copy(node->prevFocus, node->focus); + node->prevTimestamp = gGlobalTimer; + mtxf_lookat(cameraTransform, posInterpolated, focusInterpolated, node->roll); + mtxf_mul(gMatStackInterpolated[gMatStackIndex + 1], cameraTransform, gMatStackInterpolated[gMatStackIndex]); + gMatStackIndex++; mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; + mtxf_to_mtx(mtxInterpolated, gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = mtxInterpolated; if (node->fnNode.node.children != 0) { gCurGraphNodeCamera = node; node->matrixPtr = &gMatStack[gMatStackIndex]; + node->matrixPtrInterpolated = &gMatStackInterpolated[gMatStackIndex]; geo_process_node_and_siblings(node->fnNode.node.children); gCurGraphNodeCamera = NULL; } @@ -343,13 +522,17 @@ static void geo_process_translation_rotation(struct GraphNodeTranslationRotation Mat4 mtxf; Vec3f translation; Mtx *mtx = alloc_display_list(sizeof(*mtx)); + Mtx *mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); vec3s_to_vec3f(translation, node->translation); mtxf_rotate_zxy_and_translate(mtxf, translation, node->rotation); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); + mtxf_mul(gMatStackInterpolated[gMatStackIndex + 1], mtxf, gMatStackInterpolated[gMatStackIndex]); gMatStackIndex++; mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; + mtxf_to_mtx(mtxInterpolated, gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = mtxInterpolated; if (node->displayList != NULL) { geo_append_display_list(node->displayList, node->node.flags >> 8); } @@ -368,13 +551,17 @@ static void geo_process_translation(struct GraphNodeTranslation *node) { Mat4 mtxf; Vec3f translation; Mtx *mtx = alloc_display_list(sizeof(*mtx)); + Mtx *mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); vec3s_to_vec3f(translation, node->translation); mtxf_rotate_zxy_and_translate(mtxf, translation, gVec3sZero); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); + mtxf_mul(gMatStackInterpolated[gMatStackIndex + 1], mtxf, gMatStackInterpolated[gMatStackIndex]); gMatStackIndex++; mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; + mtxf_to_mtx(mtxInterpolated, gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = mtxInterpolated; if (node->displayList != NULL) { geo_append_display_list(node->displayList, node->node.flags >> 8); } @@ -392,12 +579,23 @@ static void geo_process_translation(struct GraphNodeTranslation *node) { static void geo_process_rotation(struct GraphNodeRotation *node) { Mat4 mtxf; Mtx *mtx = alloc_display_list(sizeof(*mtx)); + Mtx *mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); + Vec3s rotationInterpolated; mtxf_rotate_zxy_and_translate(mtxf, gVec3fZero, node->rotation); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); + if (gGlobalTimer == node->prevTimestamp + 1) { + interpolate_angles(rotationInterpolated, node->prevRotation, node->rotation); + mtxf_rotate_zxy_and_translate(mtxf, gVec3fZero, rotationInterpolated); + } + vec3s_copy(node->prevRotation, node->rotation); + node->prevTimestamp = gGlobalTimer; + mtxf_mul(gMatStackInterpolated[gMatStackIndex + 1], mtxf, gMatStackInterpolated[gMatStackIndex]); gMatStackIndex++; mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; + mtxf_to_mtx(mtxInterpolated, gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = mtxInterpolated; if (node->displayList != NULL) { geo_append_display_list(node->displayList, node->node.flags >> 8); } @@ -416,12 +614,16 @@ static void geo_process_scale(struct GraphNodeScale *node) { UNUSED Mat4 transform; Vec3f scaleVec; Mtx *mtx = alloc_display_list(sizeof(*mtx)); + Mtx *mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); vec3f_set(scaleVec, node->scale, node->scale, node->scale); mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex], scaleVec); + mtxf_scale_vec3f(gMatStackInterpolated[gMatStackIndex + 1], gMatStackInterpolated[gMatStackIndex], scaleVec); gMatStackIndex++; mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; + mtxf_to_mtx(mtxInterpolated, gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = mtxInterpolated; if (node->displayList != NULL) { geo_append_display_list(node->displayList, node->node.flags >> 8); } @@ -440,21 +642,30 @@ static void geo_process_scale(struct GraphNodeScale *node) { static void geo_process_billboard(struct GraphNodeBillboard *node) { Vec3f translation; Mtx *mtx = alloc_display_list(sizeof(*mtx)); + Mtx *mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); gMatStackIndex++; vec3s_to_vec3f(translation, node->translation); mtxf_billboard(gMatStack[gMatStackIndex], gMatStack[gMatStackIndex - 1], translation, gCurGraphNodeCamera->roll); + mtxf_billboard(gMatStackInterpolated[gMatStackIndex], gMatStackInterpolated[gMatStackIndex - 1], translation, + gCurGraphNodeCamera->roll); if (gCurGraphNodeHeldObject != NULL) { mtxf_scale_vec3f(gMatStack[gMatStackIndex], gMatStack[gMatStackIndex], gCurGraphNodeHeldObject->objNode->header.gfx.scale); + mtxf_scale_vec3f(gMatStackInterpolated[gMatStackIndex], gMatStackInterpolated[gMatStackIndex], + gCurGraphNodeHeldObject->objNode->header.gfx.scale); } else if (gCurGraphNodeObject != NULL) { mtxf_scale_vec3f(gMatStack[gMatStackIndex], gMatStack[gMatStackIndex], gCurGraphNodeObject->scale); + mtxf_scale_vec3f(gMatStackInterpolated[gMatStackIndex], gMatStackInterpolated[gMatStackIndex], + gCurGraphNodeObject->scale); } mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; + mtxf_to_mtx(mtxInterpolated, gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = mtxInterpolated; if (node->displayList != NULL) { geo_append_display_list(node->displayList, node->node.flags >> 8); } @@ -503,15 +714,46 @@ static void geo_process_generated_list(struct GraphNodeGenerated *node) { */ static void geo_process_background(struct GraphNodeBackground *node) { Gfx *list = NULL; + Gfx *listInterpolated = NULL; if (node->fnNode.func != NULL) { + Vec3f posCopy; + Vec3f focusCopy; + Vec3f posInterpolated; + Vec3f focusInterpolated; + + if (gGlobalTimer == node->prevCameraTimestamp + 1 && + gGlobalTimer != gLakituState.skipCameraInterpolationTimestamp) { + interpolate_vectors(posInterpolated, node->prevCameraPos, gLakituState.pos); + interpolate_vectors(focusInterpolated, node->prevCameraFocus, gLakituState.focus); + } else { + vec3f_copy(posInterpolated, gLakituState.pos); + vec3f_copy(focusInterpolated, gLakituState.focus); + } + vec3f_copy(node->prevCameraPos, gLakituState.pos); + vec3f_copy(node->prevCameraFocus, gLakituState.focus); + node->prevCameraTimestamp = gGlobalTimer; + list = node->fnNode.func(GEO_CONTEXT_RENDER, &node->fnNode.node, (struct AllocOnlyPool *) gMatStack[gMatStackIndex]); + vec3f_copy(posCopy, gLakituState.pos); + vec3f_copy(focusCopy, gLakituState.focus); + vec3f_copy(gLakituState.pos, posInterpolated); + vec3f_copy(gLakituState.focus, focusInterpolated); + listInterpolated = node->fnNode.func(GEO_CONTEXT_RENDER, &node->fnNode.node, NULL); + vec3f_copy(gLakituState.pos, posCopy); + vec3f_copy(gLakituState.focus, focusCopy); } + if (list != NULL) { - geo_append_display_list((void *) VIRTUAL_TO_PHYSICAL(list), node->fnNode.node.flags >> 8); + geo_append_display_list2((void *) VIRTUAL_TO_PHYSICAL(list), + (void *) VIRTUAL_TO_PHYSICAL(listInterpolated), node->fnNode.node.flags >> 8); } else if (gCurGraphNodeMasterList != NULL) { +#ifndef F3DEX_GBI_2E + Gfx *gfxStart = alloc_display_list(sizeof(Gfx) * 7); +#else Gfx *gfxStart = alloc_display_list(sizeof(Gfx) * 8); +#endif Gfx *gfx = gfxStart; gDPPipeSync(gfx++); @@ -530,6 +772,47 @@ static void geo_process_background(struct GraphNodeBackground *node) { } } +static void anim_process(Vec3f translation, Vec3s rotation, u8 *animType, s16 animFrame, u16 **animAttribute) { + if (*animType == ANIM_TYPE_TRANSLATION) { + translation[0] += gCurrAnimData[retrieve_animation_index(animFrame, animAttribute)] + * gCurrAnimTranslationMultiplier; + translation[1] += gCurrAnimData[retrieve_animation_index(animFrame, animAttribute)] + * gCurrAnimTranslationMultiplier; + translation[2] += gCurrAnimData[retrieve_animation_index(animFrame, animAttribute)] + * gCurrAnimTranslationMultiplier; + *animType = ANIM_TYPE_ROTATION; + } else { + if (*animType == ANIM_TYPE_LATERAL_TRANSLATION) { + translation[0] += + gCurrAnimData[retrieve_animation_index(animFrame, animAttribute)] + * gCurrAnimTranslationMultiplier; + *animAttribute += 2; + translation[2] += + gCurrAnimData[retrieve_animation_index(animFrame, animAttribute)] + * gCurrAnimTranslationMultiplier; + *animType = ANIM_TYPE_ROTATION; + } else { + if (*animType == ANIM_TYPE_VERTICAL_TRANSLATION) { + *animAttribute += 2; + translation[1] += + gCurrAnimData[retrieve_animation_index(animFrame, animAttribute)] + * gCurrAnimTranslationMultiplier; + *animAttribute += 2; + *animType = ANIM_TYPE_ROTATION; + } else if (*animType == ANIM_TYPE_NO_TRANSLATION) { + *animAttribute += 6; + *animType = ANIM_TYPE_ROTATION; + } + } + } + + if (*animType == ANIM_TYPE_ROTATION) { + rotation[0] = gCurrAnimData[retrieve_animation_index(animFrame, animAttribute)]; + rotation[1] = gCurrAnimData[retrieve_animation_index(animFrame, animAttribute)]; + rotation[2] = gCurrAnimData[retrieve_animation_index(animFrame, animAttribute)]; + } +} + /** * Render an animated part. The current animation state is not part of the node * but set in global variables. If an animated part is skipped, everything afterwards desyncs. @@ -538,53 +821,32 @@ static void geo_process_animated_part(struct GraphNodeAnimatedPart *node) { Mat4 matrix; Vec3s rotation; Vec3f translation; + Vec3s rotationInterpolated; + Vec3f translationInterpolated; Mtx *matrixPtr = alloc_display_list(sizeof(*matrixPtr)); + Mtx *mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); + u16 *animAttribute = gCurrAnimAttribute; + u8 animType = gCurrAnimType; vec3s_copy(rotation, gVec3sZero); vec3f_set(translation, node->translation[0], node->translation[1], node->translation[2]); - if (gCurrAnimType == ANIM_TYPE_TRANSLATION) { - translation[0] += gCurrAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurrAnimTranslationMultiplier; - translation[1] += gCurrAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurrAnimTranslationMultiplier; - translation[2] += gCurrAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurrAnimTranslationMultiplier; - gCurrAnimType = ANIM_TYPE_ROTATION; - } else { - if (gCurrAnimType == ANIM_TYPE_LATERAL_TRANSLATION) { - translation[0] += - gCurrAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurrAnimTranslationMultiplier; - gCurrAnimAttribute += 2; - translation[2] += - gCurrAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurrAnimTranslationMultiplier; - gCurrAnimType = ANIM_TYPE_ROTATION; - } else { - if (gCurrAnimType == ANIM_TYPE_VERTICAL_TRANSLATION) { - gCurrAnimAttribute += 2; - translation[1] += - gCurrAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurrAnimTranslationMultiplier; - gCurrAnimAttribute += 2; - gCurrAnimType = ANIM_TYPE_ROTATION; - } else if (gCurrAnimType == ANIM_TYPE_NO_TRANSLATION) { - gCurrAnimAttribute += 6; - gCurrAnimType = ANIM_TYPE_ROTATION; - } - } - } + vec3s_copy(rotationInterpolated, rotation); + vec3f_copy(translationInterpolated, translation); + + anim_process(translationInterpolated, rotationInterpolated, &animType, gPrevAnimFrame, &animAttribute); + anim_process(translation, rotation, &gCurrAnimType, gCurrAnimFrame, &gCurrAnimAttribute); + interpolate_vectors(translationInterpolated, translationInterpolated, translation); + interpolate_angles(rotationInterpolated, rotationInterpolated, rotation); - if (gCurrAnimType == ANIM_TYPE_ROTATION) { - rotation[0] = gCurrAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; - rotation[1] = gCurrAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; - rotation[2] = gCurrAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; - } mtxf_rotate_xyz_and_translate(matrix, translation, rotation); mtxf_mul(gMatStack[gMatStackIndex + 1], matrix, gMatStack[gMatStackIndex]); + mtxf_rotate_xyz_and_translate(matrix, translationInterpolated, rotationInterpolated); + mtxf_mul(gMatStackInterpolated[gMatStackIndex + 1], matrix, gMatStackInterpolated[gMatStackIndex]); gMatStackIndex++; mtxf_to_mtx(matrixPtr, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = matrixPtr; + mtxf_to_mtx(mtxInterpolated, gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = mtxInterpolated; if (node->displayList != NULL) { geo_append_display_list(node->displayList, node->node.flags >> 8); } @@ -616,6 +878,17 @@ void geo_set_animation_globals(struct AnimInfo *node, s32 hasAnimation) { } gCurrAnimFrame = node->animFrame; + if (node->prevAnimPtr == anim && node->prevAnimID == node->animID && + gGlobalTimer == node->prevAnimFrameTimestamp + 1) { + gPrevAnimFrame = node->prevAnimFrame; + } else { + gPrevAnimFrame = node->animFrame; + } + node->prevAnimPtr = anim; + node->prevAnimID = node->animID; + node->prevAnimFrame = node->animFrame; + node->prevAnimFrameTimestamp = gGlobalTimer; + gCurrAnimEnabled = (anim->flags & ANIM_FLAG_5) == 0; gCurrAnimAttribute = segmented_to_virtual((void *) anim->index); gCurrAnimData = segmented_to_virtual((void *) anim->values); @@ -634,8 +907,10 @@ void geo_set_animation_globals(struct AnimInfo *node, s32 hasAnimation) { */ static void geo_process_shadow(struct GraphNodeShadow *node) { Gfx *shadowList; + Gfx *shadowListInterpolated; Mat4 mtxf; Vec3f shadowPos; + Vec3f shadowPosInterpolated; Vec3f animOffset; f32 objScale; f32 shadowScale; @@ -643,6 +918,7 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { f32 cosAng; struct GraphNode *geo; Mtx *mtx; + Mtx *mtxInterpolated; if (gCurGraphNodeCamera != NULL && gCurGraphNodeObject != NULL) { if (gCurGraphNodeHeldObject != NULL) { @@ -681,21 +957,57 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { } } + if (gCurGraphNodeHeldObject != NULL) { + if (gGlobalTimer == gCurGraphNodeHeldObject->prevShadowPosTimestamp + 1) { + interpolate_vectors(shadowPosInterpolated, gCurGraphNodeHeldObject->prevShadowPos, shadowPos); + } else { + vec3f_copy(shadowPosInterpolated, shadowPos); + } + vec3f_copy(gCurGraphNodeHeldObject->prevShadowPos, shadowPos); + gCurGraphNodeHeldObject->prevShadowPosTimestamp = gGlobalTimer; + } else { + if (gGlobalTimer == gCurGraphNodeObject->prevShadowPosTimestamp + 1 && + gGlobalTimer != gCurGraphNodeObject->skipInterpolationTimestamp) { + interpolate_vectors(shadowPosInterpolated, gCurGraphNodeObject->prevShadowPos, shadowPos); + } else { + vec3f_copy(shadowPosInterpolated, shadowPos); + } + vec3f_copy(gCurGraphNodeObject->prevShadowPos, shadowPos); + gCurGraphNodeObject->prevShadowPosTimestamp = gGlobalTimer; + } + + extern u8 gInterpolatingSurfaces; + gInterpolatingSurfaces = TRUE; + shadowListInterpolated = create_shadow_below_xyz(shadowPosInterpolated[0], shadowPosInterpolated[1], + shadowPosInterpolated[2], shadowScale, + node->shadowSolidity, node->shadowType); + gInterpolatingSurfaces = FALSE; shadowList = create_shadow_below_xyz(shadowPos[0], shadowPos[1], shadowPos[2], shadowScale, node->shadowSolidity, node->shadowType); - if (shadowList != NULL) { + if (shadowListInterpolated != NULL && shadowList != NULL) { mtx = alloc_display_list(sizeof(*mtx)); + mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); gMatStackIndex++; + mtxf_translate(mtxf, shadowPos); mtxf_mul(gMatStack[gMatStackIndex], mtxf, *gCurGraphNodeCamera->matrixPtr); mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; + + mtxf_translate(mtxf, shadowPosInterpolated); + mtxf_mul(gMatStackInterpolated[gMatStackIndex], mtxf, *gCurGraphNodeCamera->matrixPtrInterpolated); + mtxf_to_mtx(mtxInterpolated, gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = mtxInterpolated; + if (gShadowAboveWaterOrLava == TRUE) { - geo_append_display_list((void *) VIRTUAL_TO_PHYSICAL(shadowList), 4); + geo_append_display_list2((void *) VIRTUAL_TO_PHYSICAL(shadowList), + (void *) VIRTUAL_TO_PHYSICAL(shadowListInterpolated), 4); } else if (gMarioOnIceOrCarpet == 1) { - geo_append_display_list((void *) VIRTUAL_TO_PHYSICAL(shadowList), 5); + geo_append_display_list2((void *) VIRTUAL_TO_PHYSICAL(shadowList), + (void *) VIRTUAL_TO_PHYSICAL(shadowListInterpolated), 5); } else { - geo_append_display_list((void *) VIRTUAL_TO_PHYSICAL(shadowList), 6); + geo_append_display_list2((void *) VIRTUAL_TO_PHYSICAL(shadowList), + (void *) VIRTUAL_TO_PHYSICAL(shadowListInterpolated), 6); } gMatStackIndex--; } @@ -791,28 +1103,87 @@ static s32 obj_is_in_view(struct GraphNodeObject *node, Mat4 matrix) { return TRUE; } +static void interpolate_matrix(Mat4 result, Mat4 a, Mat4 b) { + s32 i, j; + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + result[i][j] = (1 - gInterpolationStep) * a[i][j] + gInterpolationStep * b[i][j]; + } + } +} + /** * Process an object node. */ static void geo_process_object(struct Object *node) { Mat4 mtxf; s32 hasAnimation = (node->header.gfx.node.flags & GRAPH_RENDER_HAS_ANIMATION) != 0; + Vec3f scaleInterpolated; if (node->header.gfx.areaIndex == gCurGraphNodeRoot->areaIndex) { if (node->header.gfx.throwMatrix != NULL) { mtxf_mul(gMatStack[gMatStackIndex + 1], *node->header.gfx.throwMatrix, gMatStack[gMatStackIndex]); + if (gGlobalTimer == node->header.gfx.prevThrowMatrixTimestamp + 1 && + gGlobalTimer != node->header.gfx.skipInterpolationTimestamp) { + interpolate_matrix(mtxf, *node->header.gfx.throwMatrix, node->header.gfx.prevThrowMatrix); + mtxf_mul(gMatStackInterpolated[gMatStackIndex + 1], mtxf, + gMatStackInterpolated[gMatStackIndex]); + } else { + mtxf_mul(gMatStackInterpolated[gMatStackIndex + 1], (void *) node->header.gfx.throwMatrix, + gMatStackInterpolated[gMatStackIndex]); + } + mtxf_copy(node->header.gfx.prevThrowMatrix, *node->header.gfx.throwMatrix); + node->header.gfx.prevThrowMatrixTimestamp = gGlobalTimer; } else if (node->header.gfx.node.flags & GRAPH_RENDER_BILLBOARD) { + Vec3f posInterpolated; + if (gGlobalTimer == node->header.gfx.prevTimestamp + 1 && + gGlobalTimer != node->header.gfx.skipInterpolationTimestamp) { + interpolate_vectors(posInterpolated, node->header.gfx.prevPos, node->header.gfx.pos); + } else { + vec3f_copy(posInterpolated, node->header.gfx.pos); + } + vec3f_copy(node->header.gfx.prevPos, node->header.gfx.pos); + node->header.gfx.prevTimestamp = gGlobalTimer; mtxf_billboard(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex], node->header.gfx.pos, gCurGraphNodeCamera->roll); + mtxf_billboard(gMatStackInterpolated[gMatStackIndex + 1], gMatStackInterpolated[gMatStackIndex], + posInterpolated, gCurGraphNodeCamera->roll); } else { + Vec3f posInterpolated; + Vec3s angleInterpolated; + if (gGlobalTimer == node->header.gfx.prevTimestamp + 1 && + gGlobalTimer != node->header.gfx.skipInterpolationTimestamp) { + interpolate_vectors(posInterpolated, node->header.gfx.prevPos, node->header.gfx.pos); + interpolate_angles(angleInterpolated, node->header.gfx.prevAngle, node->header.gfx.angle); + } else { + vec3f_copy(posInterpolated, node->header.gfx.pos); + vec3s_copy(angleInterpolated, node->header.gfx.angle); + } + vec3f_copy(node->header.gfx.prevPos, node->header.gfx.pos); + vec3s_copy(node->header.gfx.prevAngle, node->header.gfx.angle); + node->header.gfx.prevTimestamp = gGlobalTimer; mtxf_rotate_zxy_and_translate(mtxf, node->header.gfx.pos, node->header.gfx.angle); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); + mtxf_rotate_zxy_and_translate(mtxf, posInterpolated, angleInterpolated); + mtxf_mul(gMatStackInterpolated[gMatStackIndex + 1], mtxf, gMatStackInterpolated[gMatStackIndex]); } + if (gGlobalTimer == node->header.gfx.prevScaleTimestamp + 1 && + gGlobalTimer != node->header.gfx.skipInterpolationTimestamp) { + interpolate_vectors(scaleInterpolated, node->header.gfx.prevScale, node->header.gfx.scale); + } else { + vec3f_copy(scaleInterpolated, node->header.gfx.scale); + } + vec3f_copy(node->header.gfx.prevScale, node->header.gfx.scale); + node->header.gfx.prevScaleTimestamp = gGlobalTimer; + mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex + 1], node->header.gfx.scale); + mtxf_scale_vec3f(gMatStackInterpolated[gMatStackIndex + 1], gMatStackInterpolated[gMatStackIndex + 1], + scaleInterpolated); node->header.gfx.throwMatrix = &gMatStack[++gMatStackIndex]; + node->header.gfx.throwMatrixInterpolated = &gMatStackInterpolated[gMatStackIndex]; node->header.gfx.cameraToObject[0] = gMatStack[gMatStackIndex][3][0]; node->header.gfx.cameraToObject[1] = gMatStack[gMatStackIndex][3][1]; node->header.gfx.cameraToObject[2] = gMatStack[gMatStackIndex][3][2]; @@ -823,9 +1194,12 @@ static void geo_process_object(struct Object *node) { } if (obj_is_in_view(&node->header.gfx, gMatStack[gMatStackIndex])) { Mtx *mtx = alloc_display_list(sizeof(*mtx)); + Mtx *mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; + mtxf_to_mtx(mtxInterpolated, gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = mtxInterpolated; if (node->header.gfx.sharedChild != NULL) { gCurGraphNodeObject = (struct GraphNodeObject *) node; node->header.gfx.sharedChild->parent = &node->header.gfx.node; @@ -836,11 +1210,16 @@ static void geo_process_object(struct Object *node) { if (node->header.gfx.node.children != NULL) { geo_process_node_and_siblings(node->header.gfx.node.children); } + } else { + node->header.gfx.prevThrowMatrixTimestamp = 0; + node->header.gfx.prevTimestamp = 0; + node->header.gfx.prevScaleTimestamp = 0; } gMatStackIndex--; gCurrAnimType = ANIM_TYPE_NONE; node->header.gfx.throwMatrix = NULL; + node->header.gfx.throwMatrixInterpolated = NULL; } } @@ -867,6 +1246,8 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) { Mat4 mat; Vec3f translation; Mtx *mtx = alloc_display_list(sizeof(*mtx)); + Mtx *mtxInterpolated = alloc_display_list(sizeof(*mtxInterpolated)); + Vec3f scaleInterpolated; #ifdef F3DEX_GBI_2 gSPLookAt(gDisplayListHead++, &lookAt); @@ -882,6 +1263,14 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) { translation[1] = node->translation[1] / 4.0f; translation[2] = node->translation[2] / 4.0f; + if (gGlobalTimer == node->objNode->header.gfx.prevScaleTimestamp + 1) { + interpolate_vectors(scaleInterpolated, node->objNode->header.gfx.prevScale, node->objNode->header.gfx.scale); + } else { + vec3f_copy(scaleInterpolated, node->objNode->header.gfx.scale); + } + vec3f_copy(node->objNode->header.gfx.prevScale, node->objNode->header.gfx.scale); + node->objNode->header.gfx.prevScaleTimestamp = gGlobalTimer; + mtxf_translate(mat, translation); mtxf_copy(gMatStack[gMatStackIndex + 1], *gCurGraphNodeObject->throwMatrix); gMatStack[gMatStackIndex + 1][3][0] = gMatStack[gMatStackIndex][3][0]; @@ -890,6 +1279,13 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) { mtxf_mul(gMatStack[gMatStackIndex + 1], mat, gMatStack[gMatStackIndex + 1]); mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex + 1], node->objNode->header.gfx.scale); + mtxf_copy(gMatStackInterpolated[gMatStackIndex + 1], (void *) gCurGraphNodeObject->throwMatrixInterpolated); + gMatStackInterpolated[gMatStackIndex + 1][3][0] = gMatStackInterpolated[gMatStackIndex][3][0]; + gMatStackInterpolated[gMatStackIndex + 1][3][1] = gMatStackInterpolated[gMatStackIndex][3][1]; + gMatStackInterpolated[gMatStackIndex + 1][3][2] = gMatStackInterpolated[gMatStackIndex][3][2]; + mtxf_mul(gMatStackInterpolated[gMatStackIndex + 1], mat, gMatStackInterpolated[gMatStackIndex + 1]); + mtxf_scale_vec3f(gMatStackInterpolated[gMatStackIndex + 1], gMatStackInterpolated[gMatStackIndex + 1], + scaleInterpolated); if (node->fnNode.func != NULL) { node->fnNode.func(GEO_CONTEXT_HELD_OBJ, &node->fnNode.node, (struct AllocOnlyPool *) gMatStack[gMatStackIndex + 1]); @@ -897,12 +1293,15 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) { gMatStackIndex++; mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; + mtxf_to_mtx(mtxInterpolated, gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = mtxInterpolated; gGeoTempState.type = gCurrAnimType; gGeoTempState.enabled = gCurrAnimEnabled; gGeoTempState.frame = gCurrAnimFrame; gGeoTempState.translationMultiplier = gCurrAnimTranslationMultiplier; gGeoTempState.attribute = gCurrAnimAttribute; gGeoTempState.data = gCurrAnimData; + gGeoTempState.prevFrame = gPrevAnimFrame; gCurrAnimType = 0; gCurGraphNodeHeldObject = (void *) node; if (node->objNode->header.gfx.animInfo.curAnim != NULL) { @@ -917,6 +1316,7 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) { gCurrAnimTranslationMultiplier = gGeoTempState.translationMultiplier; gCurrAnimAttribute = gGeoTempState.attribute; gCurrAnimData = gGeoTempState.data; + gPrevAnimFrame = gGeoTempState.prevFrame; gMatStackIndex--; } @@ -1033,11 +1433,12 @@ void geo_process_node_and_siblings(struct GraphNode *firstNode) { * to set up the projection and draw display lists. */ void geo_process_root(struct GraphNodeRoot *node, Vp *b, Vp *c, s32 clearColor) { - UNUSED u8 filler[4]; + UNUSED s32 unused; if (node->node.flags & GRAPH_RENDER_ACTIVE) { Mtx *initialMatrix; Vp *viewport = alloc_display_list(sizeof(*viewport)); + Vp *viewportInterpolated = viewport; gDisplayListHeap = alloc_only_pool_init(main_pool_available() - sizeof(struct AllocOnlyPool), MEMORY_POOL_LEFT); @@ -1048,7 +1449,12 @@ void geo_process_root(struct GraphNodeRoot *node, Vp *b, Vp *c, s32 clearColor) vec3s_set(viewport->vp.vscale, node->width * 4, node->height * 4, 511); if (b != NULL) { clear_framebuffer(clearColor); - make_viewport_clip_rect(b); + viewportInterpolated = alloc_display_list(sizeof(*viewportInterpolated)); + interpolate_vectors_s16(viewportInterpolated->vp.vtrans, sPrevViewport.vp.vtrans, b->vp.vtrans); + interpolate_vectors_s16(viewportInterpolated->vp.vscale, sPrevViewport.vp.vscale, b->vp.vscale); + + sViewportPos = gDisplayListHead; + make_viewport_clip_rect(viewportInterpolated); *viewport = *b; } @@ -1056,11 +1462,16 @@ void geo_process_root(struct GraphNodeRoot *node, Vp *b, Vp *c, s32 clearColor) clear_framebuffer(clearColor); make_viewport_clip_rect(c); } + sPrevViewport = *viewport; mtxf_identity(gMatStack[gMatStackIndex]); mtxf_to_mtx(initialMatrix, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = initialMatrix; - gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(viewport)); + + mtxf_identity(gMatStackInterpolated[gMatStackIndex]); + gMatStackInterpolatedFixed[gMatStackIndex] = initialMatrix; + + gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(viewportInterpolated)); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(gMatStackFixed[gMatStackIndex]), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); gCurGraphNodeRoot = node; diff --git a/src/game/rendering_graph_node.h b/src/game/rendering_graph_node.h index 20a69f61..2e889be8 100644 --- a/src/game/rendering_graph_node.h +++ b/src/game/rendering_graph_node.h @@ -29,5 +29,7 @@ extern u16 gAreaUpdateCounter; void geo_process_node_and_siblings(struct GraphNode *firstNode); void geo_process_root(struct GraphNodeRoot *node, Vp *b, Vp *c, s32 clearColor); +void interpolate_vectors(Vec3f res, Vec3f a, Vec3f b); +void interpolate_vectors_s16(Vec3s res, Vec3s a, Vec3s b); #endif // RENDERING_GRAPH_NODE_H diff --git a/src/game/save_file.c b/src/game/save_file.c index 732f756e..fdc9162f 100644 --- a/src/game/save_file.c +++ b/src/game/save_file.c @@ -32,8 +32,8 @@ u8 gCurrCourseStarFlags = 0; u8 gSpecialTripleJump = FALSE; -#define STUB_LEVEL(_0, _1, courseenum, _3, _4, _5, _6, _7, _8) courseenum, -#define DEFINE_LEVEL(_0, _1, courseenum, _3, _4, _5, _6, _7, _8, _9, _10) courseenum, +#define STUB_LEVEL(_0, _1, courseenum, _3, _4, _5, _6, _7, _8, _9) courseenum, +#define DEFINE_LEVEL(_0, _1, courseenum, _3, _4, _5, _6, _7, _8, _9, _10, _11) courseenum, s8 gLevelToCourseNumTable[] = { #include "levels/level_defines.h" diff --git a/src/game/screen_transition.c b/src/game/screen_transition.c index e0926f85..d1971a35 100644 --- a/src/game/screen_transition.c +++ b/src/game/screen_transition.c @@ -16,6 +16,19 @@ u8 sTransitionColorFadeCount[4] = { 0 }; u16 sTransitionTextureFadeCount[2] = { 0 }; +static Gfx *sScreenTransitionVerticesPos[2]; +static Vtx *sScreenTransitionVertices; + +void patch_screen_transition_interpolated(void) { + if (sScreenTransitionVerticesPos[0] != NULL) { + gSPVertex(sScreenTransitionVerticesPos[0], VIRTUAL_TO_PHYSICAL(sScreenTransitionVertices), 8, 0); + gSPVertex(sScreenTransitionVerticesPos[1], VIRTUAL_TO_PHYSICAL(sScreenTransitionVertices), 4, 0); + sScreenTransitionVerticesPos[0] = NULL; + sScreenTransitionVerticesPos[1] = NULL; + sScreenTransitionVertices = NULL; + } +} + s32 set_and_reset_transition_fade_timer(s8 fadeTimer, u8 transTime) { s32 reset = FALSE; @@ -85,6 +98,8 @@ s32 render_fade_transition_into_color(s8 fadeTimer, u8 transTime, struct WarpTra return dl_transition_color(fadeTimer, transTime, transData, alpha); } +#if FALSE + s16 calc_tex_transition_radius(s8 fadeTimer, s8 transTime, struct WarpTransitionData *transData) { f32 texRadius = transData->endTexRadius - transData->startTexRadius; f32 radiusTime = sTransitionColorFadeCount[fadeTimer] * texRadius / (f32)(transTime - 1); @@ -93,6 +108,19 @@ s16 calc_tex_transition_radius(s8 fadeTimer, s8 transTime, struct WarpTransition return (s16)(result + 0.5); } +#else + +s16 calc_tex_transition_radius(s8 fadeTimer, f32 interpolationFraction, s8 transTime, struct WarpTransitionData *transData) { + f32 texRadius = transData->endTexRadius - transData->startTexRadius; + f32 radiusTime = (sTransitionColorFadeCount[fadeTimer] == 0 ? 0 : + sTransitionColorFadeCount[fadeTimer] - 1 + interpolationFraction) * texRadius / (f32)(transTime - 1); + f32 result = transData->startTexRadius + radiusTime; + + return (s16)(result + 0.5); +} + +#endif + f32 calc_tex_transition_time(s8 fadeTimer, s8 transTime, struct WarpTransitionData *transData) { f32 startX = transData->startTexX; f32 startY = transData->startTexY; @@ -166,6 +194,8 @@ void *sTextureTransitionID[] = { texture_transition_bowser_half, }; +#if 0 + s32 render_textured_transition(s8 fadeTimer, s8 transTime, struct WarpTransitionData *transData, s8 texID, s8 transTexType) { f32 texTransTime = calc_tex_transition_time(fadeTimer, transTime, transData); u16 texTransPos = convert_tex_transition_angle_to_pos(transData); @@ -206,6 +236,56 @@ s32 render_textured_transition(s8 fadeTimer, s8 transTime, struct WarpTransition return set_and_reset_transition_fade_timer(fadeTimer, transTime); } +#else + +s32 render_textured_transition(s8 fadeTimer, s8 transTime, struct WarpTransitionData *transData, s8 texID, s8 transTexType) { + f32 texTransTime = calc_tex_transition_time(fadeTimer, transTime, transData); + u16 texTransPos = convert_tex_transition_angle_to_pos(transData); + s16 centerTransX = center_tex_transition_x(transData, texTransTime, texTransPos); + s16 centerTransY = center_tex_transition_y(transData, texTransTime, texTransPos); + s16 texTransRadius = calc_tex_transition_radius(fadeTimer, 1.0f, transTime, transData); + s16 texTransRadiusInterpolated = calc_tex_transition_radius(fadeTimer, 0.5f, transTime, transData); + Vtx *verts = alloc_display_list(8 * sizeof(*verts)); + Vtx *vertsInterpolated = alloc_display_list(8 * sizeof(*vertsInterpolated)); + + if (verts != NULL && vertsInterpolated != NULL) { + load_tex_transition_vertex(verts, fadeTimer, transData, centerTransX, centerTransY, texTransRadius, transTexType); + load_tex_transition_vertex(vertsInterpolated, fadeTimer, transData, centerTransX, centerTransY, texTransRadiusInterpolated, transTexType); + sScreenTransitionVertices = verts; + gSPDisplayList(gDisplayListHead++, dl_proj_mtx_fullscreen); + gDPSetCombineMode(gDisplayListHead++, G_CC_SHADE, G_CC_SHADE); + gDPSetRenderMode(gDisplayListHead++, G_RM_AA_OPA_SURF, G_RM_AA_OPA_SURF2); + sScreenTransitionVerticesPos[0] = gDisplayListHead; + gSPVertex(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(vertsInterpolated), 8, 0); + gSPDisplayList(gDisplayListHead++, dl_transition_draw_filled_region); + gDPPipeSync(gDisplayListHead++); + gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); + gDPSetRenderMode(gDisplayListHead++, G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2); + gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); + switch (transTexType) { + case TRANS_TYPE_MIRROR: + gDPLoadTextureBlock(gDisplayListHead++, sTextureTransitionID[texID], G_IM_FMT_IA, G_IM_SIZ_8b, 32, 64, 0, + G_TX_WRAP | G_TX_MIRROR, G_TX_WRAP | G_TX_MIRROR, 5, 6, G_TX_NOLOD, G_TX_NOLOD); + break; + case TRANS_TYPE_CLAMP: + gDPLoadTextureBlock(gDisplayListHead++, sTextureTransitionID[texID], G_IM_FMT_IA, G_IM_SIZ_8b, 64, 64, 0, + G_TX_CLAMP, G_TX_CLAMP, 6, 6, G_TX_NOLOD, G_TX_NOLOD); + break; + } + gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); + sScreenTransitionVerticesPos[1] = gDisplayListHead; + gSPVertex(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(vertsInterpolated), 4, 0); + gSPDisplayList(gDisplayListHead++, dl_draw_quad_verts_0123); + gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF); + gSPDisplayList(gDisplayListHead++, dl_screen_transition_end); + sTransitionTextureFadeCount[fadeTimer] += transData->texTimer; + } else { + } + return set_and_reset_transition_fade_timer(fadeTimer, transTime); +} + +#endif + s32 render_screen_transition(s8 fadeTimer, s8 transType, u8 transTime, struct WarpTransitionData *transData) { switch (transType) { case WARP_TRANSITION_FADE_FROM_COLOR: diff --git a/src/game/segment2.h b/src/game/segment2.h index a2cf669d..63cd5377 100644 --- a/src/game/segment2.h +++ b/src/game/segment2.h @@ -4,11 +4,10 @@ #include #include -extern u8 seg2_course_name_table[]; -extern u8 seg2_act_name_table[]; extern Gfx dl_rgba16_text_begin[]; extern Gfx dl_rgba16_text_end[]; -extern Gfx dl_ia_text_begin[]; +extern Gfx dl_ia_text_begin_us[]; +extern Gfx dl_ia_text_begin_jp[]; extern Gfx dl_ia_text_end[]; extern u8 texture_transition_star_half[]; extern u8 texture_transition_circle_half[]; @@ -45,14 +44,16 @@ extern u8* main_hud_lut[58]; extern Gfx dl_hud_img_load_tex_block[]; extern Gfx dl_hud_img_begin[]; extern Gfx dl_hud_img_end[]; -extern void *main_font_lut[]; -extern Gfx dl_ia_text_tex_settings[]; +extern void *main_font_lut_eu[]; +extern void *main_font_lut_us[]; +extern void *main_font_lut_jp[]; +extern Gfx dl_ia_text_tex_settings_us[]; +extern Gfx dl_ia_text_tex_settings_jp[]; extern Gfx dl_rgba16_load_tex_block[]; extern void *main_credits_font_lut[]; extern u8* main_hud_camera_lut[6]; extern Gfx dl_draw_text_bg_box[]; extern Gfx dl_draw_triangle[]; -extern void *seg2_dialog_table[]; extern Gfx dl_billboard_num_0[]; extern Gfx dl_billboard_num_1[]; extern Gfx dl_billboard_num_2[]; diff --git a/src/game/segment7.h b/src/game/segment7.h index 65a0c7ba..4416dc09 100644 --- a/src/game/segment7.h +++ b/src/game/segment7.h @@ -8,7 +8,8 @@ extern u8 dl_menu_idle_hand[]; extern u8 dl_menu_grabbing_hand[]; extern u8 menu_hud_lut[]; -extern u8 menu_font_lut[]; +extern u8 menu_font_lut_us[]; +extern u8 menu_font_lut_jp[]; extern u8 dl_menu_ia8_text_begin[]; extern u8 dl_menu_ia8_text_end[]; extern u8 dl_menu_rgba16_wood_course[]; diff --git a/src/game/shadow.c b/src/game/shadow.c index 049791c3..b8608401 100644 --- a/src/game/shadow.c +++ b/src/game/shadow.c @@ -206,7 +206,7 @@ s8 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, s->parentY = yPos; s->parentZ = zPos; - s->floorHeight = find_floor_height_and_data(s->parentX, s->parentY, s->parentZ, &floorGeometry); + s->floorHeight = find_floor_height_and_data(s->parentX, s->parentY, s->parentZ, &floorGeometry) + 0.4f; if (gEnvironmentRegions != NULL) { waterLevel = get_water_level_below_shadow(s); @@ -384,7 +384,7 @@ void calculate_vertex_xyz(s8 index, struct Shadow s, f32 *xPosVtx, f32 *yPosVtx, // Clamp this vertex's y-position to that of the floor directly // below it, which may differ from the floor below the center // vertex. - *yPosVtx = find_floor_height_and_data(*xPosVtx, s.parentY, *zPosVtx, &dummy); + *yPosVtx = find_floor_height_and_data(*xPosVtx, s.parentY, *zPosVtx, &dummy) + 0.4f; break; case SHADOW_WITH_4_VERTS: // Do not clamp. Instead, extrapolate the y-position of this @@ -466,7 +466,8 @@ void add_shadow_to_display_list(Gfx *displayListHead, Vtx *verts, s8 shadowVerte gSPDisplayList(displayListHead++, dl_shadow_circle); break; case SHADOW_SHAPE_SQUARE: - gSPDisplayList(displayListHead++, dl_shadow_square) break; + gSPDisplayList(displayListHead++, dl_shadow_square); + break; } switch (shadowVertexType) { case SHADOW_WITH_9_VERTS: @@ -700,7 +701,7 @@ Gfx *create_shadow_circle_assuming_flat_ground(f32 xPos, f32 yPos, f32 zPos, s16 Gfx *displayList; struct FloorGeometry *dummy; // only for calling find_floor_height_and_data f32 distBelowFloor; - f32 floorHeight = find_floor_height_and_data(xPos, yPos, zPos, &dummy); + f32 floorHeight = find_floor_height_and_data(xPos, yPos, zPos, &dummy) + 0.4f; f32 radius = shadowScale / 2; if (floorHeight < FLOOR_LOWER_LIMIT_SHADOW) { @@ -760,7 +761,7 @@ Gfx *create_shadow_rectangle(f32 halfWidth, f32 halfLength, f32 relY, u8 solidit s32 get_shadow_height_solidity(f32 xPos, f32 yPos, f32 zPos, f32 *shadowHeight, u8 *solidity) { struct FloorGeometry *dummy; f32 waterLevel; - *shadowHeight = find_floor_height_and_data(xPos, yPos, zPos, &dummy); + *shadowHeight = find_floor_height_and_data(xPos, yPos, zPos, &dummy) + 0.4f; if (*shadowHeight < FLOOR_LOWER_LIMIT_SHADOW) { return 1; diff --git a/src/goddard/renderer.c b/src/goddard/renderer.c index 8161dc2b..2c6a51b4 100644 --- a/src/goddard/renderer.c +++ b/src/goddard/renderer.c @@ -158,7 +158,7 @@ static s32 sPickBufPosition; // @ 801BE784 static s16 *sPickBuf; // @ 801BE788 static LookAt D_801BE790[2]; static LookAt D_801BE7D0[3]; -#if defined(VERSION_JP) || defined(VERSION_US) +#if defined(VERSION_US) static OSMesgQueue D_801BE830; // controller msg queue static OSMesg D_801BE848[10]; UNUSED static u32 unref_801be870[16]; diff --git a/src/goddard/shape_helper.c b/src/goddard/shape_helper.c index 58942c95..1b41a987 100644 --- a/src/goddard/shape_helper.c +++ b/src/goddard/shape_helper.c @@ -1,9 +1,5 @@ #include -#if defined(VERSION_JP) || defined(VERSION_US) -#include "prevent_bss_reordering.h" -#endif - #include "debug_utils.h" #include "draw_objects.h" #include "dynlist_proc.h" diff --git a/src/menu/file_select.c b/src/menu/file_select.c index 866e0b2b..5aa6c0a8 100644 --- a/src/menu/file_select.c +++ b/src/menu/file_select.c @@ -20,7 +20,6 @@ #include "game/spawn_object.h" #include "game/rumble_init.h" #include "sm64.h" -#include "text_strings.h" #include "eu_translation.h" #ifdef VERSION_EU @@ -118,165 +117,165 @@ static s8 sScoreFileCoinScoreMode = 0; static s8 sOpenLangSettings = FALSE; #endif -#ifndef VERSION_EU -static unsigned char textReturn[] = { TEXT_RETURN }; -#else -static unsigned char textReturn[][8] = {{ TEXT_RETURN }, { TEXT_RETURN_FR }, { TEXT_RETURN_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textViewScore[] = { TEXT_CHECK_SCORE }; -#else -static unsigned char textViewScore[][12] = {{ TEXT_CHECK_SCORE }, {TEXT_CHECK_SCORE_FR}, {TEXT_CHECK_SCORE_DE}}; -#endif - -#ifndef VERSION_EU -static unsigned char textCopyFileButton[] = { TEXT_COPY_FILE_BUTTON }; -#else -static unsigned char textCopyFileButton[][15] = {{ TEXT_COPY_FILE }, { TEXT_COPY_FILE_FR }, { TEXT_COPY_FILE_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textEraseFileButton[] = { TEXT_ERASE_FILE_BUTTON }; -#else -static unsigned char textEraseFileButton[][16] = { {TEXT_ERASE_FILE}, {TEXT_ERASE_FILE_FR}, {TEXT_ERASE_FILE_DE} }; -#endif - -#ifndef VERSION_EU -static unsigned char textSoundModes[][8] = { { TEXT_STEREO }, { TEXT_MONO }, { TEXT_HEADSET } }; -#endif - -static unsigned char textMarioA[] = { TEXT_FILE_MARIO_A }; -static unsigned char textMarioB[] = { TEXT_FILE_MARIO_B }; -static unsigned char textMarioC[] = { TEXT_FILE_MARIO_C }; -static unsigned char textMarioD[] = { TEXT_FILE_MARIO_D }; - -#ifndef VERSION_EU -static unsigned char textNew[] = { TEXT_NEW }; +//#ifndef VERSION_EU +//static unsigned char textReturn[] = { TEXT_RETURN }; +//#else +//static unsigned char textReturn[][8] = {{ TEXT_RETURN }, { TEXT_RETURN_FR }, { TEXT_RETURN_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textViewScore[] = { TEXT_CHECK_SCORE }; +//#else +//static unsigned char textViewScore[][12] = {{ TEXT_CHECK_SCORE }, {TEXT_CHECK_SCORE_FR}, {TEXT_CHECK_SCORE_DE}}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCopyFileButton[] = { TEXT_COPY_FILE_BUTTON }; +//#else +//static unsigned char textCopyFileButton[][15] = {{ TEXT_COPY_FILE }, { TEXT_COPY_FILE_FR }, { TEXT_COPY_FILE_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textEraseFileButton[] = { TEXT_ERASE_FILE_BUTTON }; +//#else +//static unsigned char textEraseFileButton[][16] = { {TEXT_ERASE_FILE}, {TEXT_ERASE_FILE_FR}, {TEXT_ERASE_FILE_DE} }; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textSoundModes[][8] = { { TEXT_STEREO }, { TEXT_MONO }, { TEXT_HEADSET } }; +//#endif +// +//static unsigned char textMarioA[] = { TEXT_FILE_MARIO_A }; +//static unsigned char textMarioB[] = { TEXT_FILE_MARIO_B }; +//static unsigned char textMarioC[] = { TEXT_FILE_MARIO_C }; +//static unsigned char textMarioD[] = { TEXT_FILE_MARIO_D }; +// +//#ifndef VERSION_EU +//static unsigned char textNew[] = { TEXT_NEW }; static unsigned char starIcon[] = { GLYPH_STAR, GLYPH_SPACE }; static unsigned char xIcon[] = { GLYPH_MULTIPLY, GLYPH_SPACE }; -#endif - -#ifndef VERSION_EU -static unsigned char textSelectFile[] = { TEXT_SELECT_FILE }; -#else -static unsigned char textSelectFile[][17] = {{ TEXT_SELECT_FILE }, { TEXT_SELECT_FILE_FR }, { TEXT_SELECT_FILE_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textScore[] = { TEXT_SCORE }; -#else -static unsigned char textScore[][9] = {{ TEXT_SCORE }, { TEXT_SCORE_FR }, { TEXT_SCORE_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textCopy[] = { TEXT_COPY }; -#else -static unsigned char textCopy[][9] = {{ TEXT_COPY }, { TEXT_COPY_FR }, { TEXT_COPY_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textErase[] = { TEXT_ERASE }; -#else -static unsigned char textErase[][8] = {{ TEXT_ERASE }, { TEXT_ERASE_FR }, { TEXT_ERASE_DE }}; -#endif - -#ifdef VERSION_EU -static unsigned char textOption[][9] = {{ TEXT_OPTION }, { TEXT_OPTION_FR }, { TEXT_OPTION_DE } }; -#endif - -#ifndef VERSION_EU -static unsigned char textCheckFile[] = { TEXT_CHECK_FILE }; -#else -static unsigned char textCheckFile[][18] = {{ TEXT_CHECK_FILE }, { TEXT_CHECK_FILE_FR }, { TEXT_CHECK_FILE_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textNoSavedDataExists[] = { TEXT_NO_SAVED_DATA_EXISTS }; -#else -static unsigned char textNoSavedDataExists[][30] = {{ TEXT_NO_SAVED_DATA_EXISTS }, { TEXT_NO_SAVED_DATA_EXISTS_FR }, { TEXT_NO_SAVED_DATA_EXISTS_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textCopyFile[] = { TEXT_COPY_FILE }; -#else -static unsigned char textCopyFile[][16] = {{ TEXT_COPY_FILE_BUTTON }, { TEXT_COPY_FILE_BUTTON_FR }, { TEXT_COPY_FILE_BUTTON_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textCopyItToWhere[] = { TEXT_COPY_IT_TO_WHERE }; -#else -static unsigned char textCopyItToWhere[][18] = {{ TEXT_COPY_IT_TO_WHERE }, { TEXT_COPY_IT_TO_WHERE_FR }, { TEXT_COPY_IT_TO_WHERE_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textNoSavedDataExistsCopy[] = { TEXT_NO_SAVED_DATA_EXISTS }; -#endif - -#ifndef VERSION_EU -static unsigned char textCopyCompleted[] = { TEXT_COPYING_COMPLETED }; -#else -static unsigned char textCopyCompleted[][18] = {{ TEXT_COPYING_COMPLETED }, { TEXT_COPYING_COMPLETED_FR }, { TEXT_COPYING_COMPLETED_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textSavedDataExists[] = { TEXT_SAVED_DATA_EXISTS }; -#else -static unsigned char textSavedDataExists[][20] = {{ TEXT_SAVED_DATA_EXISTS }, { TEXT_SAVED_DATA_EXISTS_FR }, { TEXT_SAVED_DATA_EXISTS_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textNoFileToCopyFrom[] = { TEXT_NO_FILE_TO_COPY_FROM }; -#else -static unsigned char textNoFileToCopyFrom[][21] = {{ TEXT_NO_FILE_TO_COPY_FROM }, { TEXT_NO_FILE_TO_COPY_FROM_FR }, { TEXT_NO_FILE_TO_COPY_FROM_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textYes[] = { TEXT_YES }; -#else -static unsigned char textYes[][4] = {{ TEXT_YES }, { TEXT_YES_FR }, { TEXT_YES_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textNo[] = { TEXT_NO }; -#else -static unsigned char textNo[][5] = {{ TEXT_NO }, { TEXT_NO_FR }, { TEXT_NO_DE }}; -#endif - -#ifdef VERSION_EU -// In EU, Erase File and Sound Select strings are outside it's print string function -static unsigned char textEraseFile[][17] = { - { TEXT_ERASE_FILE_BUTTON }, { TEXT_ERASE_FILE_BUTTON_FR }, { TEXT_ERASE_FILE_BUTTON_DE } -}; -static unsigned char textSure[][8] = {{ TEXT_SURE }, { TEXT_SURE_FR }, { TEXT_SURE_DE }}; -static unsigned char textMarioAJustErased[][20] = { - { TEXT_FILE_MARIO_A_JUST_ERASED }, { TEXT_FILE_MARIO_A_JUST_ERASED_FR }, { TEXT_FILE_MARIO_A_JUST_ERASED_DE } -}; - -static unsigned char textSoundSelect[][13] = { - { TEXT_SOUND_SELECT }, { TEXT_SOUND_SELECT_FR }, { TEXT_SOUND_SELECT_DE } -}; - -static unsigned char textLanguageSelect[][17] = { - { TEXT_LANGUAGE_SELECT }, { TEXT_LANGUAGE_SELECT_FR }, { TEXT_LANGUAGE_SELECT_DE } -}; - -static unsigned char textSoundModes[][10] = { - { TEXT_STEREO }, { TEXT_MONO }, { TEXT_HEADSET }, - { TEXT_STEREO_FR }, { TEXT_MONO_FR }, { TEXT_HEADSET_FR }, - { TEXT_STEREO_DE }, { TEXT_MONO_DE }, { TEXT_HEADSET_DE } -}; - -static unsigned char textLanguage[][9] = {{ TEXT_ENGLISH }, { TEXT_FRENCH }, { TEXT_GERMAN }}; - -static unsigned char textMario[] = { TEXT_MARIO }; -static unsigned char textHiScore[][15] = {{ TEXT_HI_SCORE }, { TEXT_HI_SCORE_FR }, { TEXT_HI_SCORE_DE }}; -static unsigned char textMyScore[][10] = {{ TEXT_MY_SCORE }, { TEXT_MY_SCORE_FR }, { TEXT_MY_SCORE_DE }}; - -static unsigned char textNew[][5] = {{ TEXT_NEW }, { TEXT_NEW_FR }, { TEXT_NEW_DE }}; -static unsigned char starIcon[] = { GLYPH_STAR, GLYPH_SPACE }; -static unsigned char xIcon[] = { GLYPH_MULTIPLY, GLYPH_SPACE }; -#endif +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textSelectFile[] = { TEXT_SELECT_FILE }; +//#else +//static unsigned char textSelectFile[][17] = {{ TEXT_SELECT_FILE }, { TEXT_SELECT_FILE_FR }, { TEXT_SELECT_FILE_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textScore[] = { TEXT_SCORE }; +//#else +//static unsigned char textScore[][9] = {{ TEXT_SCORE }, { TEXT_SCORE_FR }, { TEXT_SCORE_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCopy[] = { TEXT_COPY }; +//#else +//static unsigned char textCopy[][9] = {{ TEXT_COPY }, { TEXT_COPY_FR }, { TEXT_COPY_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textErase[] = { TEXT_ERASE }; +//#else +//static unsigned char textErase[][8] = {{ TEXT_ERASE }, { TEXT_ERASE_FR }, { TEXT_ERASE_DE }}; +//#endif +// +//#ifdef VERSION_EU +//static unsigned char textOption[][9] = {{ TEXT_OPTION }, { TEXT_OPTION_FR }, { TEXT_OPTION_DE } }; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCheckFile[] = { TEXT_CHECK_FILE }; +//#else +//static unsigned char textCheckFile[][18] = {{ TEXT_CHECK_FILE }, { TEXT_CHECK_FILE_FR }, { TEXT_CHECK_FILE_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textNoSavedDataExists[] = { TEXT_NO_SAVED_DATA_EXISTS }; +//#else +//static unsigned char textNoSavedDataExists[][30] = {{ TEXT_NO_SAVED_DATA_EXISTS }, { TEXT_NO_SAVED_DATA_EXISTS_FR }, { TEXT_NO_SAVED_DATA_EXISTS_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCopyFile[] = { TEXT_COPY_FILE }; +//#else +//static unsigned char textCopyFile[][16] = {{ TEXT_COPY_FILE_BUTTON }, { TEXT_COPY_FILE_BUTTON_FR }, { TEXT_COPY_FILE_BUTTON_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCopyItToWhere[] = { TEXT_COPY_IT_TO_WHERE }; +//#else +//static unsigned char textCopyItToWhere[][18] = {{ TEXT_COPY_IT_TO_WHERE }, { TEXT_COPY_IT_TO_WHERE_FR }, { TEXT_COPY_IT_TO_WHERE_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textNoSavedDataExistsCopy[] = { TEXT_NO_SAVED_DATA_EXISTS }; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCopyCompleted[] = { TEXT_COPYING_COMPLETED }; +//#else +//static unsigned char textCopyCompleted[][18] = {{ TEXT_COPYING_COMPLETED }, { TEXT_COPYING_COMPLETED_FR }, { TEXT_COPYING_COMPLETED_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textSavedDataExists[] = { TEXT_SAVED_DATA_EXISTS }; +//#else +//static unsigned char textSavedDataExists[][20] = {{ TEXT_SAVED_DATA_EXISTS }, { TEXT_SAVED_DATA_EXISTS_FR }, { TEXT_SAVED_DATA_EXISTS_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textNoFileToCopyFrom[] = { TEXT_NO_FILE_TO_COPY_FROM }; +//#else +//static unsigned char textNoFileToCopyFrom[][21] = {{ TEXT_NO_FILE_TO_COPY_FROM }, { TEXT_NO_FILE_TO_COPY_FROM_FR }, { TEXT_NO_FILE_TO_COPY_FROM_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textYes[] = { TEXT_YES }; +//#else +//static unsigned char textYes[][4] = {{ TEXT_YES }, { TEXT_YES_FR }, { TEXT_YES_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textNo[] = { TEXT_NO }; +//#else +//static unsigned char textNo[][5] = {{ TEXT_NO }, { TEXT_NO_FR }, { TEXT_NO_DE }}; +//#endif +// +//#ifdef VERSION_EU +//// In EU, Erase File and Sound Select strings are outside it's print string function +//static unsigned char textEraseFile[][17] = { +// { TEXT_ERASE_FILE_BUTTON }, { TEXT_ERASE_FILE_BUTTON_FR }, { TEXT_ERASE_FILE_BUTTON_DE } +//}; +//static unsigned char textSure[][8] = {{ TEXT_SURE }, { TEXT_SURE_FR }, { TEXT_SURE_DE }}; +//static unsigned char textMarioAJustErased[][20] = { +// { TEXT_FILE_MARIO_A_JUST_ERASED }, { TEXT_FILE_MARIO_A_JUST_ERASED_FR }, { TEXT_FILE_MARIO_A_JUST_ERASED_DE } +//}; +// +//static unsigned char textSoundSelect[][13] = { +// { TEXT_SOUND_SELECT }, { TEXT_SOUND_SELECT_FR }, { TEXT_SOUND_SELECT_DE } +//}; +// +//static unsigned char textLanguageSelect[][17] = { +// { TEXT_LANGUAGE_SELECT }, { TEXT_LANGUAGE_SELECT_FR }, { TEXT_LANGUAGE_SELECT_DE } +//}; +// +//static unsigned char textSoundModes[][10] = { +// { TEXT_STEREO }, { TEXT_MONO }, { TEXT_HEADSET }, +// { TEXT_STEREO_FR }, { TEXT_MONO_FR }, { TEXT_HEADSET_FR }, +// { TEXT_STEREO_DE }, { TEXT_MONO_DE }, { TEXT_HEADSET_DE } +//}; +// +//static unsigned char textLanguage[][9] = {{ TEXT_ENGLISH }, { TEXT_FRENCH }, { TEXT_GERMAN }}; +// +//static unsigned char textMario[] = { TEXT_MARIO }; +//static unsigned char textHiScore[][15] = {{ TEXT_HI_SCORE }, { TEXT_HI_SCORE_FR }, { TEXT_HI_SCORE_DE }}; +//static unsigned char textMyScore[][10] = {{ TEXT_MY_SCORE }, { TEXT_MY_SCORE_FR }, { TEXT_MY_SCORE_DE }}; +// +//static unsigned char textNew[][5] = {{ TEXT_NEW }, { TEXT_NEW_FR }, { TEXT_NEW_DE }}; +//static unsigned char starIcon[] = { GLYPH_STAR, GLYPH_SPACE }; +//static unsigned char xIcon[] = { GLYPH_MULTIPLY, GLYPH_SPACE }; +//#endif /** * Yellow Background Menu Initial Action @@ -1371,11 +1370,7 @@ void bhv_menu_button_manager_init(void) { sTextBaseAlpha = 0; } -#ifdef VERSION_JP - #define SAVE_FILE_SOUND SOUND_MENU_STAR_SOUND -#else - #define SAVE_FILE_SOUND SOUND_MENU_STAR_SOUND_OKEY_DOKEY -#endif +#define SAVE_FILE_SOUND (ROM_JP ? SOUND_MENU_STAR_SOUND : SOUND_MENU_STAR_SOUND_OKEY_DOKEY) /** * In the main menu, check if a button was clicked to play it's button growing state. @@ -1481,8 +1476,6 @@ void check_main_menu_clicked_buttons(void) { #endif } -#undef SAVE_FILE_SOUND - /** * Menu Buttons Menu Manager Loop Action * Calls a menu function depending of the button chosen. @@ -1722,7 +1715,7 @@ void print_hud_lut_string_fade(s8 hudLUT, s16 x, s16 y, const unsigned char *tex * Prints a generic white string with text fade properties. */ void print_generic_string_fade(s16 x, s16 y, const unsigned char *text) { - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha - sTextFadeAlpha); print_generic_string(x, y, text); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); @@ -1770,30 +1763,16 @@ void print_save_file_star_count(s8 fileIndex, s16 x, s16 y) { print_hud_lut_string(HUD_LUT_GLOBAL, x + offset + 16, y, starCountText); } else { // Print "new" text - print_hud_lut_string(HUD_LUT_GLOBAL, x, y, LANGUAGE_ARRAY(textNew)); + print_hud_lut_string(HUD_LUT_GLOBAL, x, y, GameEngine_LoadTranslation("TEXT_NEW")); } } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define SELECT_FILE_X 96 - #define SCORE_X 50 - #define COPY_X 115 - #define ERASE_X 180 -#ifdef VERSION_JP - #define SOUNDMODE_X1 235 -#else - #define SOUNDMODE_X1 sSoundTextX -#endif - #define SAVEFILE_X1 92 - #define SAVEFILE_X2 209 - #define MARIOTEXT_X1 92 - #define MARIOTEXT_X2 207 -#elif defined(VERSION_US) - #define SELECT_FILE_X 93 - #define SCORE_X 52 - #define COPY_X 117 - #define ERASE_X 177 - #define SOUNDMODE_X1 sSoundTextX +#if defined(VERSION_US) + #define SELECT_FILE_X (ROM_JP ? 96 : 93) + #define SCORE_X (ROM_JP ? 50 : 52) + #define COPY_X (ROM_JP ? 115 : 117) + #define ERASE_X (ROM_JP ? 180 : 177) + #define SOUNDMODE_X1 (ROM_JP ? 235 : sSoundTextX) #define SAVEFILE_X1 92 #define SAVEFILE_X2 209 #define MARIOTEXT_X1 92 @@ -1821,7 +1800,7 @@ void print_main_menu_strings(void) { gSPDisplayList(gDisplayListHead++, dl_rgba16_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); #ifndef VERSION_EU - print_hud_lut_string(HUD_LUT_DIFF, SELECT_FILE_X, 35, textSelectFile); + print_hud_lut_string(HUD_LUT_DIFF, SELECT_FILE_X, 35, GameEngine_LoadTranslation("TEXT_SELECT_FILE")); #endif // Print file star counts print_save_file_star_count(SAVE_FILE_A, SAVEFILE_X1, 78); @@ -1831,24 +1810,27 @@ void print_main_menu_strings(void) { gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); #ifndef VERSION_EU // Print menu names - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); - print_generic_string(SCORE_X, 39, textScore); - print_generic_string(COPY_X, 39, textCopy); - print_generic_string(ERASE_X, 39, textErase); -#ifndef VERSION_JP + print_generic_string(SCORE_X, 39, GameEngine_LoadTranslation("TEXT_SCORE")); + print_generic_string(COPY_X, 39, GameEngine_LoadTranslation("TEXT_COPY")); + print_generic_string(ERASE_X, 39, GameEngine_LoadTranslation("TEXT_ERASE")); + unsigned char* textSoundModes[] = { + GameEngine_LoadTranslation("TEXT_STEREO"), + GameEngine_LoadTranslation("TEXT_MONO"), + GameEngine_LoadTranslation("TEXT_HEADSET") + }; sSoundTextX = get_str_x_pos_from_center(254, textSoundModes[sSoundMode], 10.0f); -#endif print_generic_string(SOUNDMODE_X1, 39, textSoundModes[sSoundMode]); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); #endif // Print file names gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); - print_menu_generic_string(MARIOTEXT_X1, 65, textMarioA); - print_menu_generic_string(MARIOTEXT_X2, 65, textMarioB); - print_menu_generic_string(MARIOTEXT_X1, 105, textMarioC); - print_menu_generic_string(MARIOTEXT_X2, 105, textMarioD); + print_menu_generic_string(MARIOTEXT_X1, 65, GameEngine_LoadTranslation("TEXT_FILE_MARIO_A")); + print_menu_generic_string(MARIOTEXT_X2, 65, GameEngine_LoadTranslation("TEXT_FILE_MARIO_B")); + print_menu_generic_string(MARIOTEXT_X1, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_C")); + print_menu_generic_string(MARIOTEXT_X2, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_D")); gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_end); } @@ -1869,7 +1851,7 @@ void print_main_lang_strings(void) { gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); // Print menu names - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); centeredX = get_str_x_pos_from_center(76, textScore[sLanguageMode], 10.0f); print_generic_string(centeredX, 39, textScore[sLanguageMode]); @@ -1885,12 +1867,9 @@ void print_main_lang_strings(void) { } #endif -#if defined(VERSION_JP) || defined(VERSION_SH) - #define CHECK_FILE_X 90 - #define NOSAVE_DATA_X1 90 -#elif defined(VERSION_US) - #define CHECK_FILE_X 95 - #define NOSAVE_DATA_X1 99 +#if defined(VERSION_US) + #define CHECK_FILE_X (ROM_JP ? 90 : 95) + #define NOSAVE_DATA_X1 (ROM_JP ? 90 : 99) #elif defined(VERSION_EU) #define CHECK_FILE_X checkFileX #define NOSAVE_DATA_X1 noSaveDataX @@ -1907,27 +1886,23 @@ void score_menu_display_message(s8 messageID) { switch (messageID) { case SCORE_MSG_CHECK_FILE: #ifdef VERSION_EU - checkFileX = get_str_x_pos_from_center_scale(160, LANGUAGE_ARRAY(textCheckFile), 12.0f); + checkFileX = get_str_x_pos_from_center_scale(160, GameEngine_LoadTranslation(textCheckFile), 12.0f); #endif - print_hud_lut_string_fade(HUD_LUT_DIFF, CHECK_FILE_X, 35, LANGUAGE_ARRAY(textCheckFile)); + print_hud_lut_string_fade(HUD_LUT_DIFF, CHECK_FILE_X, 35, GameEngine_LoadTranslation("TEXT_CHECK_FILE")); break; case SCORE_MSG_NOSAVE_DATA: #ifdef VERSION_EU - noSaveDataX = get_str_x_pos_from_center(160, LANGUAGE_ARRAY(textNoSavedDataExists), 10.0f); + noSaveDataX = get_str_x_pos_from_center(160, GameEngine_LoadTranslation(textNoSavedDataExists), 10.0f); #endif - print_generic_string_fade(NOSAVE_DATA_X1, 190, LANGUAGE_ARRAY(textNoSavedDataExists)); + print_generic_string_fade(NOSAVE_DATA_X1, 190, GameEngine_LoadTranslation("TEXT_NO_SAVED_DATA_EXISTS")); break; } } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define RETURN_X 45 - #define COPYFILE_X1 128 - #define ERASEFILE_X1 228 -#elif defined(VERSION_US) +#if defined(VERSION_US) #define RETURN_X 44 - #define COPYFILE_X1 135 - #define ERASEFILE_X1 231 + #define COPYFILE_X1 (ROM_JP ? 128 : 135) + #define ERASEFILE_X1 (ROM_JP ? 228 : 231) #elif defined(VERSION_EU) #define RETURN_X centeredX #define COPYFILE_X1 centeredX @@ -1974,20 +1949,20 @@ void print_score_menu_strings(void) { #endif // Print menu names - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(69, textReturn[sLanguageMode], 10.0f); #endif - print_generic_string(RETURN_X, 35, LANGUAGE_ARRAY(textReturn)); + print_generic_string(RETURN_X, 35, GameEngine_LoadTranslation("TEXT_RETURN")); #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(159, textCopyFileButton[sLanguageMode], 10.0f); #endif - print_generic_string(COPYFILE_X1, 35, LANGUAGE_ARRAY(textCopyFileButton)); + print_generic_string(COPYFILE_X1, 35, GameEngine_LoadTranslation("TEXT_COPY_FILE_BUTTON")); #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(249, textEraseFileButton[sLanguageMode], 10.0f); #endif - print_generic_string(ERASEFILE_X1, 35, LANGUAGE_ARRAY(textEraseFileButton)); + print_generic_string(ERASEFILE_X1, 35, GameEngine_LoadTranslation("TEXT_ERASE_FILE_BUTTON")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); #ifdef VERSION_EU @@ -1996,28 +1971,21 @@ void print_score_menu_strings(void) { // Print file names gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); - print_menu_generic_string(89, 62, textMarioA); - print_menu_generic_string(211, 62, textMarioB); - print_menu_generic_string(89, 105, textMarioC); - print_menu_generic_string(211, 105, textMarioD); + print_menu_generic_string(89, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_A")); + print_menu_generic_string(211, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_B")); + print_menu_generic_string(89, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_C")); + print_menu_generic_string(211, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_D")); gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_end); #endif } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define NOFILE_COPY_X 90 - #define COPY_FILE_X 90 - #define COPYIT_WHERE_X 90 - #define NOSAVE_DATA_X2 90 - #define COPYCOMPLETE_X 90 - #define SAVE_EXISTS_X1 90 -#elif defined(VERSION_US) - #define NOFILE_COPY_X 119 - #define COPY_FILE_X 104 - #define COPYIT_WHERE_X 109 - #define NOSAVE_DATA_X2 101 - #define COPYCOMPLETE_X 110 - #define SAVE_EXISTS_X1 110 +#if defined(VERSION_US) + #define NOFILE_COPY_X (ROM_JP ? 90 : 119) + #define COPY_FILE_X (ROM_JP ? 90 : 104) + #define COPYIT_WHERE_X (ROM_JP ? 90 : 109) + #define NOSAVE_DATA_X2 (ROM_JP ? 90 : 101) + #define COPYCOMPLETE_X (ROM_JP ? 90 : 110) + #define SAVE_EXISTS_X1 (ROM_JP ? 90 : 110) #elif defined(VERSION_EU) #define NOFILE_COPY_X centeredX #define COPY_FILE_X centeredX @@ -2041,39 +2009,39 @@ void copy_menu_display_message(s8 messageID) { #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textNoFileToCopyFrom[sLanguageMode], 10.0f); #endif - print_generic_string_fade(NOFILE_COPY_X, 190, LANGUAGE_ARRAY(textNoFileToCopyFrom)); + print_generic_string_fade(NOFILE_COPY_X, 190, GameEngine_LoadTranslation("TEXT_NO_FILE_TO_COPY_FROM")); } else { #ifdef VERSION_EU centeredX = get_str_x_pos_from_center_scale(160, textCopyFile[sLanguageMode], 12.0f); #endif - print_hud_lut_string_fade(HUD_LUT_DIFF, COPY_FILE_X, 35, LANGUAGE_ARRAY(textCopyFile)); + print_hud_lut_string_fade(HUD_LUT_DIFF, COPY_FILE_X, 35, GameEngine_LoadTranslation("TEXT_COPY_FILE")); } break; case COPY_MSG_COPY_WHERE: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textCopyItToWhere[sLanguageMode], 10.0f); #endif - print_generic_string_fade(COPYIT_WHERE_X, 190, LANGUAGE_ARRAY(textCopyItToWhere)); + print_generic_string_fade(COPYIT_WHERE_X, 190, GameEngine_LoadTranslation("TEXT_COPY_IT_TO_WHERE")); break; case COPY_MSG_NOSAVE_EXISTS: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textNoSavedDataExists[sLanguageMode], 10.0f); print_generic_string_fade(NOSAVE_DATA_X2, 190, textNoSavedDataExists[sLanguageMode]); #else - print_generic_string_fade(NOSAVE_DATA_X2, 190, textNoSavedDataExistsCopy); + print_generic_string_fade(NOSAVE_DATA_X2, 190, GameEngine_LoadTranslation("TEXT_NO_SAVED_DATA_EXISTS")); #endif break; case COPY_MSG_COPY_COMPLETE: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textCopyCompleted[sLanguageMode], 10.0f); #endif - print_generic_string_fade(COPYCOMPLETE_X, 190, LANGUAGE_ARRAY(textCopyCompleted)); + print_generic_string_fade(COPYCOMPLETE_X, 190, GameEngine_LoadTranslation("TEXT_COPY_COMPLETED")); break; case COPY_MSG_SAVE_EXISTS: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textSavedDataExists[sLanguageMode], 10.0f); #endif - print_generic_string_fade(SAVE_EXISTS_X1, 190, LANGUAGE_ARRAY(textSavedDataExists)); + print_generic_string_fade(SAVE_EXISTS_X1, 190, GameEngine_LoadTranslation("TEXT_SAVED_DATA_EXISTS")); break; } } @@ -2123,12 +2091,9 @@ void copy_menu_update_message(void) { } } -#if defined(VERSION_JP) - #define VIEWSCORE_X1 133 - #define ERASEFILE_X2 220 -#elif defined(VERSION_US) - #define VIEWSCORE_X1 128 - #define ERASEFILE_X2 230 +#if defined(VERSION_US) + #define VIEWSCORE_X1 (ROM_JP ? 133 : 128) + #define ERASEFILE_X2 (ROM_JP ? 220 : 230) #elif defined(VERSION_EU) #define VIEWSCORE_X1 centeredX #define ERASEFILE_X2 centeredX @@ -2160,20 +2125,20 @@ void print_copy_menu_strings(void) { gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); #endif // Print menu names - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(69, textReturn[sLanguageMode], 10.0f); #endif - print_generic_string(RETURN_X, 35, LANGUAGE_ARRAY(textReturn)); + print_generic_string(RETURN_X, 35, GameEngine_LoadTranslation("TEXT_RETURN")); #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(159, textViewScore[sLanguageMode], 10.0f); #endif - print_generic_string(VIEWSCORE_X1, 35, LANGUAGE_ARRAY(textViewScore)); + print_generic_string(VIEWSCORE_X1, 35, GameEngine_LoadTranslation("TEXT_CHECK_SCORE")); #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(249, textEraseFileButton[sLanguageMode], 10.0f); #endif - print_generic_string(ERASEFILE_X2, 35, LANGUAGE_ARRAY(textEraseFileButton)); + print_generic_string(ERASEFILE_X2, 35, GameEngine_LoadTranslation("TEXT_ERASE_FILE_BUTTON")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); #ifdef VERSION_EU print_main_menu_strings(); @@ -2181,30 +2146,20 @@ void print_copy_menu_strings(void) { // Print file names gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); - print_menu_generic_string(89, 62, textMarioA); - print_menu_generic_string(211, 62, textMarioB); - print_menu_generic_string(89, 105, textMarioC); - print_menu_generic_string(211, 105, textMarioD); + print_menu_generic_string(89, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_A")); + print_menu_generic_string(211, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_B")); + print_menu_generic_string(89, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_C")); + print_menu_generic_string(211, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_D")); gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_end); #endif } -#if defined(VERSION_JP) || defined(VERSION_SH) -#ifdef VERSION_JP - #define CURSOR_X 160.0f -#else - #define CURSOR_X (x + 70) -#endif - #define MENU_ERASE_YES_MIN_X 145 - #define MENU_ERASE_YES_MAX_X 164 -#else - #define CURSOR_X (x + 70) - #define MENU_ERASE_YES_MIN_X 140 - #define MENU_ERASE_YES_MAX_X 169 -#endif - +#define CURSOR_X (ROM_JP ? 160.0f : (x + 70)) +#define MENU_ERASE_YES_MIN_X (ROM_JP ? 145 : 140) +#define MENU_ERASE_YES_MAX_X (ROM_JP ? 164 : 169) #define MENU_ERASE_YES_NO_MIN_Y 191 #define MENU_ERASE_YES_NO_MAX_Y 210 + #ifdef VERSION_SH #define MENU_ERASE_NO_MIN_X 194 #define MENU_ERASE_NO_MAX_X 213 @@ -2273,11 +2228,11 @@ void print_erase_menu_prompt(s16 x, s16 y) { } // Print "YES NO" strings - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, sYesNoColor[0], sYesNoColor[0], sYesNoColor[0], sTextBaseAlpha); - print_generic_string(x + 56, y, LANGUAGE_ARRAY(textYes)); + print_generic_string(x + 56, y, GameEngine_LoadTranslation("TEXT_YES")); gDPSetEnvColor(gDisplayListHead++, sYesNoColor[1], sYesNoColor[1], sYesNoColor[1], sTextBaseAlpha); - print_generic_string(x + 98, y, LANGUAGE_ARRAY(textNo)); + print_generic_string(x + 98, y, GameEngine_LoadTranslation("TEXT_NO")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); } @@ -2285,22 +2240,12 @@ void print_erase_menu_prompt(s16 x, s16 y) { // US and EU --- JP // M a r i o A --- マ リ オ A // 0 1 2 3 4 5 6 --- 0 1 2 3 -#if defined(VERSION_JP) || defined(VERSION_SH) -#ifdef VERSION_JP - #define ERASE_FILE_X 96 -#else - #define ERASE_FILE_X 111 -#endif - #define NOSAVE_DATA_X3 90 - #define MARIO_ERASED_VAR 3 - #define MARIO_ERASED_X 90 - #define SAVE_EXISTS_X2 90 -#elif defined(VERSION_US) - #define ERASE_FILE_X 98 - #define NOSAVE_DATA_X3 100 - #define MARIO_ERASED_VAR 6 - #define MARIO_ERASED_X 100 - #define SAVE_EXISTS_X2 100 +#if defined(VERSION_US) + #define ERASE_FILE_X (ROM_JP ? 96 : 98) + #define NOSAVE_DATA_X3 (ROM_JP ? 90 : 100) + #define MARIO_ERASED_VAR (ROM_JP ? 3 : 6) + #define MARIO_ERASED_X (ROM_JP ? 90 : 100) + #define SAVE_EXISTS_X2 (ROM_JP ? 90 : 100) #elif defined(VERSION_EU) #define ERASE_FILE_X centeredX #define NOSAVE_DATA_X3 centeredX @@ -2318,42 +2263,39 @@ void erase_menu_display_message(s8 messageID) { #endif #ifndef VERSION_EU - unsigned char textEraseFile[] = { TEXT_ERASE_FILE }; - unsigned char textSure[] = { TEXT_SURE }; - unsigned char textNoSavedDataExists[] = { TEXT_NO_SAVED_DATA_EXISTS }; - unsigned char textMarioAJustErased[] = { TEXT_FILE_MARIO_A_JUST_ERASED }; - unsigned char textSavedDataExists[] = { TEXT_SAVED_DATA_EXISTS }; -#endif +#endif + uint8_t* erasedText; switch (messageID) { case ERASE_MSG_MAIN_TEXT: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center_scale(160, textEraseFile[sLanguageMode], 12.0f); #endif - print_hud_lut_string_fade(HUD_LUT_DIFF, ERASE_FILE_X, 35, LANGUAGE_ARRAY(textEraseFile)); + print_hud_lut_string_fade(HUD_LUT_DIFF, ERASE_FILE_X, 35, GameEngine_LoadTranslation("TEXT_ERASE_FILE")); break; case ERASE_MSG_PROMPT: - print_generic_string_fade(90, 190, LANGUAGE_ARRAY(textSure)); + print_generic_string_fade(90, 190, GameEngine_LoadTranslation("TEXT_SURE")); print_erase_menu_prompt(90, 190); // YES NO, has functions for it too break; case ERASE_MSG_NOSAVE_EXISTS: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textNoSavedDataExists[sLanguageMode], 10.0f); #endif - print_generic_string_fade(NOSAVE_DATA_X3, 190, LANGUAGE_ARRAY(textNoSavedDataExists)); + print_generic_string_fade(NOSAVE_DATA_X3, 190, GameEngine_LoadTranslation("TEXT_NO_SAVED_DATA_EXISTS")); break; case ERASE_MSG_MARIO_ERASED: - LANGUAGE_ARRAY(textMarioAJustErased)[MARIO_ERASED_VAR] = sSelectedFileIndex + 10; + erasedText = GameEngine_LoadTranslation("TEXT_FILE_MARIO_A_JUST_ERASED"); + erasedText[MARIO_ERASED_VAR] = sSelectedFileIndex + 10; #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textMarioAJustErased[sLanguageMode], 10.0f); #endif - print_generic_string_fade(MARIO_ERASED_X, 190, LANGUAGE_ARRAY(textMarioAJustErased)); + print_generic_string_fade(MARIO_ERASED_X, 190, erasedText); break; case ERASE_MSG_SAVE_EXISTS: // unused #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textSavedDataExists[sLanguageMode], 10.0f); #endif - print_generic_string_fade(SAVE_EXISTS_X2, 190, LANGUAGE_ARRAY(textSavedDataExists)); + print_generic_string_fade(SAVE_EXISTS_X2, 190, GameEngine_LoadTranslation("TEXT_SAVED_DATA_EXISTS")); break; } } @@ -2400,13 +2342,8 @@ void erase_menu_update_message(void) { } } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define VIEWSCORE_X2 133 - #define COPYFILE_X2 223 -#else - #define VIEWSCORE_X2 127 - #define COPYFILE_X2 233 -#endif +#define VIEWSCORE_X2 (ROM_JP ? 133 : 127) +#define COPYFILE_X2 (ROM_JP ? 223 : 233) /** * Prints erase menu strings that shows on the red background menu screen. @@ -2434,7 +2371,7 @@ void print_erase_menu_strings(void) { #endif // Print menu names - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); #ifdef VERSION_EU @@ -2445,9 +2382,9 @@ void print_erase_menu_strings(void) { centeredX = get_str_x_pos_from_center(249, textCopyFileButton[sLanguageMode], 10.0f); print_generic_string(centeredX, 35, textCopyFileButton[sLanguageMode]); #else - print_generic_string(RETURN_X, 35, textReturn); - print_generic_string(VIEWSCORE_X2, 35, textViewScore); - print_generic_string(COPYFILE_X2, 35, textCopyFileButton); + print_generic_string(RETURN_X, 35, GameEngine_LoadTranslation("TEXT_RETURN")); + print_generic_string(VIEWSCORE_X2, 35, GameEngine_LoadTranslation("TEXT_CHECK_SCORE")); + print_generic_string(COPYFILE_X2, 35, GameEngine_LoadTranslation("TEXT_COPY_FILE_BUTTON")); #endif gSPDisplayList(gDisplayListHead++, dl_ia_text_end); @@ -2457,18 +2394,16 @@ void print_erase_menu_strings(void) { // Print file names gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); - print_menu_generic_string(89, 62, textMarioA); - print_menu_generic_string(211, 62, textMarioB); - print_menu_generic_string(89, 105, textMarioC); - print_menu_generic_string(211, 105, textMarioD); + print_menu_generic_string(89, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_A")); + print_menu_generic_string(211, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_B")); + print_menu_generic_string(89, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_C")); + print_menu_generic_string(211, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_D")); gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_end); #endif } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define SOUND_HUD_X 96 -#elif defined(VERSION_US) - #define SOUND_HUD_X 88 +#if defined(VERSION_US) + #define SOUND_HUD_X (ROM_JP ? 96 : 88) #endif /** @@ -2485,10 +2420,6 @@ void print_sound_mode_menu_strings(void) { s32 textX; #endif -#ifndef VERSION_EU - unsigned char textSoundSelect[] = { TEXT_SOUND_SELECT }; -#endif - // Print "SOUND SELECT" text gSPDisplayList(gDisplayListHead++, dl_rgba16_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); @@ -2497,12 +2428,12 @@ void print_sound_mode_menu_strings(void) { print_hud_lut_string(HUD_LUT_DIFF, 47, 32, textSoundSelect[sLanguageMode]); print_hud_lut_string(HUD_LUT_DIFF, 47, 101, textLanguageSelect[sLanguageMode]); #else - print_hud_lut_string(HUD_LUT_DIFF, SOUND_HUD_X, 35, textSoundSelect); + print_hud_lut_string(HUD_LUT_DIFF, SOUND_HUD_X, 35, GameEngine_LoadTranslation("TEXT_SOUND_SELECT")); #endif gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); #ifdef VERSION_EU // In EU their X position get increased each string // Print sound mode names @@ -2529,6 +2460,11 @@ void print_sound_mode_menu_strings(void) { 72, textLanguage[mode]); } #else + unsigned char* textSoundModes[] = { + GameEngine_LoadTranslation("TEXT_STEREO"), + GameEngine_LoadTranslation("TEXT_MONO"), + GameEngine_LoadTranslation("TEXT_HEADSET") + }; // Print sound mode names for (mode = 0; mode < 3; mode++) { if (mode == sSoundMode) { @@ -2536,13 +2472,9 @@ void print_sound_mode_menu_strings(void) { } else { gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, sTextBaseAlpha); } - #ifndef VERSION_JP - // Mode names are centered correctly on US and Shindou - textX = get_str_x_pos_from_center(mode * 74 + 87, textSoundModes[mode], 10.0f); - print_generic_string(textX, 87, textSoundModes[mode]); - #else - print_generic_string(mode * 74 + 67, 87, textSoundModes[mode]); - #endif + // Mode names are centered correctly on US and Shindou + textX = get_str_x_pos_from_center(mode * 74 + 87, textSoundModes[mode], 10.0f); + print_generic_string(textX, 87, textSoundModes[mode]); } #endif @@ -2554,15 +2486,13 @@ void print_sound_mode_menu_strings(void) { gSPDisplayList(gDisplayListHead++, dl_ia_text_end); } -unsigned char textStarX[] = { TEXT_STAR_X }; - /** * Prints castle secret stars collected in a score menu save file. */ void print_score_file_castle_secret_stars(s8 fileIndex, s16 x, s16 y) { unsigned char secretStarsText[20]; // Print "[star] x" - print_menu_generic_string(x, y, textStarX); + print_menu_generic_string(x, y, GameEngine_LoadTranslation("TEXT_STAR_X")); // Print number of castle secret stars int_to_str(save_file_get_total_star_count(fileIndex, COURSE_BONUS_STAGES - 1, COURSE_MAX - 1), secretStarsText); @@ -2573,15 +2503,9 @@ void print_score_file_castle_secret_stars(s8 fileIndex, s16 x, s16 y) { #endif } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define HISCORE_COIN_ICON_X 0 - #define HISCORE_COIN_TEXT_X 16 - #define HISCORE_COIN_NAMES_X 45 -#else - #define HISCORE_COIN_ICON_X 18 - #define HISCORE_COIN_TEXT_X 34 - #define HISCORE_COIN_NAMES_X 60 -#endif +#define HISCORE_COIN_ICON_X (ROM_JP ? 0 : 18) +#define HISCORE_COIN_TEXT_X (ROM_JP ? 16 : 34) +#define HISCORE_COIN_NAMES_X (ROM_JP ? 45 : 60) /** * Prints course coins collected in a score menu save file. @@ -2589,18 +2513,13 @@ void print_score_file_castle_secret_stars(s8 fileIndex, s16 x, s16 y) { void print_score_file_course_coin_score(s8 fileIndex, s16 courseIndex, s16 x, s16 y) { unsigned char coinScoreText[20]; u8 stars = save_file_get_star_flags(fileIndex, courseIndex); - unsigned char textCoinX[] = { TEXT_COIN_X }; - unsigned char textStar[] = { TEXT_STAR }; -#if defined(VERSION_JP) || defined(VERSION_SH) - #define LENGTH 5 -#else - #define LENGTH 8 -#endif - unsigned char fileNames[][LENGTH] = { - { TEXT_4DASHES }, // huh? - { TEXT_SCORE_MARIO_A }, { TEXT_SCORE_MARIO_B }, { TEXT_SCORE_MARIO_C }, { TEXT_SCORE_MARIO_D }, + unsigned char* textCoinX = GameEngine_LoadTranslation("TEXT_COIN_X"); + unsigned char* textStar = GameEngine_LoadTranslation("TEXT_STAR"); + unsigned char* fileNames[] = { + GameEngine_LoadTranslation("TEXT_4DASHES"), + GameEngine_LoadTranslation("TEXT_FILE_MARIO_A"), GameEngine_LoadTranslation("TEXT_FILE_MARIO_B"), + GameEngine_LoadTranslation("TEXT_FILE_MARIO_C"), GameEngine_LoadTranslation("TEXT_FILE_MARIO_D") }; -#undef LENGTH // MYSCORE if (sScoreFileCoinScoreMode == 0) { // Print "[coin] x" @@ -2612,9 +2531,7 @@ void print_score_file_course_coin_score(s8 fileIndex, s16 courseIndex, s16 x, s1 if (stars & (1 << 6)) { print_menu_generic_string(x + 70, y, textStar); } - } - // HISCORE - else { + } else { // HISCORE // Print "[coin] x" print_menu_generic_string(x + HISCORE_COIN_ICON_X, y, textCoinX); // Print coin highscore @@ -2647,33 +2564,19 @@ void print_score_file_star_score(s8 fileIndex, s16 courseIndex, s16 x, s16 y) { print_menu_generic_string(x, y, starScoreText); } -#if defined(VERSION_JP) || defined(VERSION_SH) - #define MARIO_X 28 - #define FILE_LETTER_X 86 -#ifdef VERSION_JP - #define LEVEL_NUM_PAD 0 - #define SECRET_STARS_PAD 0 -#else - #define LEVEL_NUM_PAD 5 - #define SECRET_STARS_PAD 10 -#endif +#if defined(VERSION_US) + #define MARIO_X (ROM_JP ? 28 : 25) + #define FILE_LETTER_X (ROM_JP ? 86 : 95) + #define LEVEL_NUM_PAD (ROM_JP ? 0 : 3) + #define SECRET_STARS_PAD (ROM_JP ? 0 : 6) #define LEVEL_NAME_X 23 - #define STAR_SCORE_X 152 - #define MYSCORE_X 237 - #define HISCORE_X 237 -#else - #define MARIO_X 25 - #define FILE_LETTER_X 95 - #define LEVEL_NUM_PAD 3 - #define SECRET_STARS_PAD 6 - #define LEVEL_NAME_X 23 - #define STAR_SCORE_X 171 + #define STAR_SCORE_X (ROM_JP ? 152 : 171) #ifdef VERSION_EU #define MYSCORE_X get_str_x_pos_from_center(257, textMyScore[sLanguageMode], 10.0f) #define HISCORE_X get_str_x_pos_from_center(257, textHiScore[sLanguageMode], 10.0f) #else - #define MYSCORE_X 238 - #define HISCORE_X 231 + #define MYSCORE_X (ROM_JP ? 237 : 238) + #define HISCORE_X (ROM_JP ? 237 : 231) #endif #endif @@ -2686,17 +2589,10 @@ void print_score_file_star_score(s8 fileIndex, s16 courseIndex, s16 x, s16 y) { */ void print_save_file_scores(s8 fileIndex) { #ifndef VERSION_EU - unsigned char textMario[] = { TEXT_MARIO }; -#ifdef VERSION_JP - unsigned char textFileLetter[] = { TEXT_ZERO }; - void **levelNameTable = segmented_to_virtual(seg2_course_name_table); -#endif - unsigned char textHiScore[] = { TEXT_HI_SCORE }; - unsigned char textMyScore[] = { TEXT_MY_SCORE }; -#if defined(VERSION_US) || defined(VERSION_SH) - unsigned char textFileLetter[] = { TEXT_ZERO }; - void **levelNameTable = segmented_to_virtual(seg2_course_name_table); -#endif + unsigned char* textMario = GameEngine_LoadTranslation("TEXT_MARIO"); + unsigned char* textFileLetter = GameEngine_LoadTranslation("TEXT_ZERO"); + unsigned char* textHiScore = GameEngine_LoadTranslation("TEXT_HI_SCORE"); + unsigned char* textMyScore = GameEngine_LoadTranslation("TEXT_MY_SCORE"); #else unsigned char textFileLetter[] = { TEXT_ZERO }; void **levelNameTable; @@ -2732,7 +2628,7 @@ void print_save_file_scores(s8 fileIndex) { //! Huge print list, for loops exist for a reason! #define PRINT_COURSE_SCORES(courseIndex, pad) \ print_menu_generic_string(LEVEL_NAME_X + (pad * LEVEL_NUM_PAD), 23 + 12 * courseIndex, \ - segmented_to_virtual(levelNameTable[courseIndex - 1])); \ + GameEngine_LoadLevelName(courseIndex - 1)); \ print_score_file_star_score(fileIndex, courseIndex - 1, STAR_SCORE_X, 23 + 12 * courseIndex); \ print_score_file_course_coin_score(fileIndex, courseIndex - 1, 213, 23 + 12 * courseIndex); @@ -2756,15 +2652,15 @@ void print_save_file_scores(s8 fileIndex) { // Print castle secret stars text print_menu_generic_string(LEVEL_NAME_X + SECRET_STARS_PAD, 23 + 12 * 16, - segmented_to_virtual(levelNameTable[25])); + GameEngine_LoadLevelName(25)); // Print castle secret stars score print_score_file_castle_secret_stars(fileIndex, STAR_SCORE_X, 23 + 12 * 16); // Print current coin score mode if (sScoreFileCoinScoreMode == 0) { - print_menu_generic_string(MYSCORE_X, 24, LANGUAGE_ARRAY(textMyScore)); + print_menu_generic_string(MYSCORE_X, 24, textMyScore); } else { - print_menu_generic_string(HISCORE_X, 24, LANGUAGE_ARRAY(textHiScore)); + print_menu_generic_string(HISCORE_X, 24, textHiScore); } gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_end); diff --git a/src/menu/intro_geo.c b/src/menu/intro_geo.c index a16c8237..55aacdb9 100644 --- a/src/menu/intro_geo.c +++ b/src/menu/intro_geo.c @@ -1,5 +1,6 @@ #include +#include "engine/math_util.h" #include "game/memory.h" #include "game/segment2.h" #include "game/segment7.h" @@ -11,6 +12,7 @@ #include "game/game_init.h" #include "audio/external.h" #include "gfx_dimensions.h" +#include "game/rendering_graph_node.h" // frame counts for the zoom in, hold, and zoom out of title model #define INTRO_STEPS_ZOOM_IN 20 @@ -36,6 +38,18 @@ static s32 sGameOverTableIndex; static s16 sIntroFrameCounter; static s32 sTmCopyrightAlpha; +static Gfx *sIntroScalePos; +static Vec3f sIntroScale; + +void patch_title_screen_scales(void) { + if (sIntroScalePos != NULL) { + Mtx *scaleMat = alloc_display_list(sizeof(*scaleMat)); + guScale(scaleMat, sIntroScale[0], sIntroScale[1], sIntroScale[2]); + gSPMatrix(sIntroScalePos, scaleMat, G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH); + sIntroScalePos = NULL; + } +} + /** * Geo callback to render the "Super Mario 64" logo on the title screen */ @@ -49,6 +63,8 @@ Gfx *geo_intro_super_mario_64_logo(s32 state, struct GraphNode *node, UNUSED voi f32 scaleX; f32 scaleY; f32 scaleZ; + Vec3f scale; + Vec3f scaleInterpolated; if (state != 1) { sIntroFrameCounter = 0; @@ -80,7 +96,12 @@ Gfx *geo_intro_super_mario_64_logo(s32 state, struct GraphNode *node, UNUSED voi scaleY = 0.0f; scaleZ = 0.0f; } - guScale(scaleMat, scaleX, scaleY, scaleZ); + + vec3f_set(scale, scaleX, scaleY, scaleZ); + interpolate_vectors(scaleInterpolated, sIntroScale, scale); + vec3f_set(sIntroScale, scaleX, scaleY, scaleZ); + guScale(scaleMat, scaleInterpolated[0], scaleInterpolated[1], scaleInterpolated[2]); + sIntroScalePos = dlIter; gSPMatrix(dlIter++, scaleMat, G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH); gSPDisplayList(dlIter++, &intro_seg7_dl_0700B3A0); // draw model diff --git a/src/menu/star_select.c b/src/menu/star_select.c index ea6de165..7bdd00d5 100644 --- a/src/menu/star_select.c +++ b/src/menu/star_select.c @@ -1,4 +1,5 @@ #include +#include #include "audio/external.h" #include "behavior_data.h" @@ -18,7 +19,6 @@ #include "game/rumble_init.h" #include "sm64.h" #include "star_select.h" -#include "text_strings.h" /** * @file star_select.c @@ -27,6 +27,12 @@ * strings, act values, and star selector model rendering if a star is collected or not. */ +// The number of stars in a level (excluding the 100 coin star) +#define LEVEL_STARS_MAX 6 + +// The index for the 100 coin star +#define COIN_STAR_INDEX 6 + // Star Selector count models printed in the act selector menu. static struct Object *sStarSelectorModels[8]; @@ -52,6 +58,10 @@ static s8 sSelectableStarIndex = 0; // Act Selector menu timer that keeps counting until you choose an act. static s32 sActSelectorMenuTimer = 0; +// Helper check for the previous star selection enhancment state +// This is used to tell if the star selection enhancment has just changed +static bool sStarSelectState = false; + /** * Act Selector Star Type Loop Action * Defines a select type for a star in the act selector. @@ -89,12 +99,12 @@ void bhv_act_selector_star_type_loop(void) { * Renders the 100 coin star with an special star selector type. */ void render_100_coin_star(u8 stars) { - if (stars & (1 << 6)) { + if (stars & (1 << COIN_STAR_INDEX)) { // If the 100 coin star has been collected, create a new star selector next to the coin score. - sStarSelectorModels[6] = spawn_object_abs_with_rot(gCurrentObject, 0, MODEL_STAR, + sStarSelectorModels[COIN_STAR_INDEX] = spawn_object_abs_with_rot(gCurrentObject, 0, MODEL_STAR, bhvActSelectorStarType, 370, 24, -300, 0, 0, 0); - sStarSelectorModels[6]->oStarSelectorSize = 0.8; - sStarSelectorModels[6]->oStarSelectorType = STAR_SELECTOR_100_COINS; + sStarSelectorModels[COIN_STAR_INDEX]->oStarSelectorSize = 0.8; + sStarSelectorModels[COIN_STAR_INDEX]->oStarSelectorType = STAR_SELECTOR_100_COINS; } } @@ -109,8 +119,14 @@ void bhv_act_selector_init(void) { s32 selectorModelIDs[10]; u8 stars = save_file_get_star_flags(gCurrSaveFileNum - 1, COURSE_NUM_TO_INDEX(gCurrCourseNum)); + if (CVarGetInteger("gSelectAllStars", 0)) { + sStarSelectState = false; + } else { + sStarSelectState = true; + } + sVisibleStars = 0; - while (i != sObtainedStars) { + while (i != sObtainedStars || (CVarGetInteger("gSelectAllStars", 0) && sVisibleStars != LEVEL_STARS_MAX)) { if (stars & (1 << sVisibleStars)) { // Star has been collected selectorModelIDs[sVisibleStars] = MODEL_STAR; i++; @@ -127,7 +143,7 @@ void bhv_act_selector_init(void) { } // If the stars have been collected in order so far, show the next star. - if (sVisibleStars == sObtainedStars && sVisibleStars != 6) { + if (sVisibleStars == sObtainedStars && sVisibleStars != LEVEL_STARS_MAX) { selectorModelIDs[sVisibleStars] = MODEL_TRANSPARENT_STAR; sInitSelectedActNum = sVisibleStars + 1; sSelectableStarIndex = sVisibleStars; @@ -135,7 +151,7 @@ void bhv_act_selector_init(void) { } // If all stars have been collected, set the default selection to the last star. - if (sObtainedStars == 6) { + if (sObtainedStars == LEVEL_STARS_MAX) { sInitSelectedActNum = sVisibleStars; } @@ -168,7 +184,23 @@ void bhv_act_selector_loop(void) { u8 starIndexCounter; u8 stars = save_file_get_star_flags(gCurrSaveFileNum - 1, COURSE_NUM_TO_INDEX(gCurrCourseNum)); - if (sObtainedStars != 6) { + if (!sStarSelectState && !CVarGetInteger("gSelectAllStars", 0)) { + // If the option is toggled after stars have been drawn, then we want to set the star index to a valid index + starIndexCounter = 0; + for (i = 0; i <= sSelectableStarIndex; i++) { + // Can the star be selected (is it either already completed or the first non-completed mission) + if ((stars & (1 << i)) || i + 1 == sInitSelectedActNum) { + starIndexCounter++; + } + } + sSelectableStarIndex = starIndexCounter - 1; + sStarSelectState = true; + } else if (sStarSelectState && CVarGetInteger("gSelectAllStars", 0)) { + sSelectableStarIndex = sSelectedActIndex; + sStarSelectState = false; + } + + if (sObtainedStars != LEVEL_STARS_MAX && !CVarGetInteger("gSelectAllStars", 0)) { // Sometimes, stars are not selectable even if they appear on the screen. // This code filters selectable and non-selectable stars. sSelectedActIndex = 0; @@ -247,11 +279,7 @@ void print_course_number(void) { gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); } -#ifdef VERSION_JP -#define ACT_NAME_X 158 -#else -#define ACT_NAME_X 163 -#endif +#define ACT_NAME_X ROM_JP ? 163 : 158 /** * Print act selector strings, some with special checks. @@ -260,18 +288,14 @@ void print_act_selector_strings(void) { #ifdef VERSION_EU unsigned char myScore[][10] = { {TEXT_MYSCORE}, {TEXT_MY_SCORE_FR}, {TEXT_MY_SCORE_DE} }; #else - unsigned char myScore[] = { TEXT_MYSCORE }; + unsigned char* myScore = GameEngine_LoadTranslation("TEXT_MYSCORE"); #endif - unsigned char starNumbers[] = { TEXT_ZERO }; + unsigned char* starNumbers = GameEngine_LoadTranslation("TEXT_ZERO"); #ifdef VERSION_EU u8 **levelNameTbl; u8 *currLevelName; u8 **actNameTbl; -#else - u8 **levelNameTbl = segmented_to_virtual(seg2_course_name_table); - u8 *currLevelName = segmented_to_virtual(levelNameTbl[COURSE_NUM_TO_INDEX(gCurrCourseNum)]); - u8 **actNameTbl = segmented_to_virtual(seg2_act_name_table); #endif u8 *selectedActName; s16 lvlNameX; @@ -281,6 +305,8 @@ void print_act_selector_strings(void) { s16 language = eu_get_language(); #endif + uint8_t* currLevelName = GameEngine_LoadLevelName(COURSE_NUM_TO_INDEX(gCurrCourseNum)); + create_dl_ortho_matrix(); #ifdef VERSION_EU @@ -307,7 +333,7 @@ void print_act_selector_strings(void) { print_hud_my_score_coins(1, gCurrSaveFileNum - 1, COURSE_NUM_TO_INDEX(gCurrCourseNum), 155, 106); gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); - gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); + gSPDisplayList(gDisplayListHead++, ROM_JP ? dl_ia_text_begin_jp : dl_ia_text_begin_us); gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, 255); // Print the "MY SCORE" text if the coin score is more than 0 if (save_file_get_course_coin_score(gCurrSaveFileNum - 1, COURSE_NUM_TO_INDEX(gCurrCourseNum)) != 0) { @@ -333,8 +359,7 @@ void print_act_selector_strings(void) { gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, 255); // Print the name of the selected act. if (sVisibleStars != 0) { - selectedActName = segmented_to_virtual(actNameTbl[COURSE_NUM_TO_INDEX(gCurrCourseNum) * 6 + sSelectedActIndex]); - + selectedActName = GameEngine_LoadActName(COURSE_NUM_TO_INDEX(gCurrCourseNum) * LEVEL_STARS_MAX + sSelectedActIndex); actNameX = get_str_x_pos_from_center(ACT_NAME_X, selectedActName, 8.0f); print_menu_generic_string(actNameX, 81, selectedActName); } @@ -377,7 +402,7 @@ s32 lvl_init_act_selector_values_and_stars(UNUSED s32 arg, UNUSED s32 unused) { save_file_get_course_star_count(gCurrSaveFileNum - 1, COURSE_NUM_TO_INDEX(gCurrCourseNum)); // Don't count 100 coin star - if (stars & (1 << 6)) { + if (stars & (1 << COIN_STAR_INDEX)) { sObtainedStars--; } @@ -398,16 +423,12 @@ s32 lvl_update_obj_and_load_act_button_actions(UNUSED s32 arg, UNUSED s32 unused #else if ((gPlayer3Controller->buttonPressed & (A_BUTTON | START_BUTTON | B_BUTTON | Z_TRIG))) { #endif -#ifdef VERSION_JP - play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource); -#else - play_sound(SOUND_MENU_STAR_SOUND_LETS_A_GO, gGlobalSoundSource); -#endif + play_sound(ROM_JP ? SOUND_MENU_STAR_SOUND : SOUND_MENU_STAR_SOUND_LETS_A_GO, gGlobalSoundSource); #if ENABLE_RUMBLE queue_rumble_data(60, 70); func_sh_8024C89C(1); #endif - if (sInitSelectedActNum >= sSelectedActIndex + 1) { + if (sInitSelectedActNum >= sSelectedActIndex + 1 || CVarGetInteger("gSelectAllStars", 0)) { sLoadedActNum = sSelectedActIndex + 1; } else { sLoadedActNum = sInitSelectedActNum; diff --git a/src/menu/title_screen.c b/src/menu/title_screen.c index 98e7715c..12c0147c 100644 --- a/src/menu/title_screen.c +++ b/src/menu/title_screen.c @@ -24,8 +24,8 @@ * and a level select used for testing purposes. */ -#define STUB_LEVEL(textname, _1, _2, _3, _4, _5, _6, _7, _8) textname, -#define DEFINE_LEVEL(textname, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) textname, +#define STUB_LEVEL(textname, _1, _2, _3, _4, _5, _6, _7, _8, _9) textname, +#define DEFINE_LEVEL(textname, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) textname, static char sLevelSelectStageNames[64][16] = { #include "levels/level_defines.h" @@ -33,11 +33,18 @@ static char sLevelSelectStageNames[64][16] = { #undef STUB_LEVEL #undef DEFINE_LEVEL +#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, textname) textname, +#define DEFINE_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, textname) textname, + +static char sBetterLevelSelectStageNames[38][31] = { + #include "levels/level_defines.h" +}; +#undef STUB_LEVEL +#undef DEFINE_LEVEL + static u16 sDemoCountdown = 0; -#ifndef VERSION_JP static s16 sPlayMarioGreeting = TRUE; static s16 sPlayMarioGameOver = TRUE; -#endif #define PRESS_START_DEMO_TIMER 800 @@ -64,6 +71,10 @@ s32 run_level_id_or_demo(s32 level) { // start the Mario demo animation for the demo list. void* data = ResourceGetDataByName(gDemoInputs[gDemoInputListID]); + if(data == NULL) { + return 0; + } + // if the next demo sequence ID is the count limit, reset it back to // the first sequence. // TODO: Remove this to check for gDemoInput size instead @@ -93,6 +104,7 @@ s32 run_level_id_or_demo(s32 level) { */ s16 intro_level_select(void) { s32 stageChanged = FALSE; + s8 direction = 1; // perform the ID updates per each button press. // runs into a loop so after a button is pressed @@ -102,17 +114,20 @@ s16 intro_level_select(void) { } if (gPlayer1Controller->buttonPressed & B_BUTTON) { --gCurrLevelNum, stageChanged = TRUE; + direction = -1; } - if (gPlayer1Controller->buttonPressed & U_JPAD) { + if (gPlayer1Controller->buttonPressed & U_JPAD || (CVarGetInteger("gDeveloper.BetterLevelSelect", 0) && gPlayer1Controller->buttonPressed & U_CBUTTONS)) { --gCurrLevelNum, stageChanged = TRUE; + direction = -1; } - if (gPlayer1Controller->buttonPressed & D_JPAD) { + if (gPlayer1Controller->buttonPressed & D_JPAD || (CVarGetInteger("gDeveloper.BetterLevelSelect", 0) && gPlayer1Controller->buttonPressed & D_CBUTTONS)) { ++gCurrLevelNum, stageChanged = TRUE; } - if (gPlayer1Controller->buttonPressed & L_JPAD) { + if (gPlayer1Controller->buttonPressed & L_JPAD || (CVarGetInteger("gDeveloper.BetterLevelSelect", 0) && gPlayer1Controller->buttonPressed & L_CBUTTONS)) { gCurrLevelNum -= 10, stageChanged = TRUE; + direction = -1; } - if (gPlayer1Controller->buttonPressed & R_JPAD) { + if (gPlayer1Controller->buttonPressed & R_JPAD || (CVarGetInteger("gDeveloper.BetterLevelSelect", 0) && gPlayer1Controller->buttonPressed & R_CBUTTONS)) { gCurrLevelNum += 10, stageChanged = TRUE; } @@ -129,14 +144,32 @@ s16 intro_level_select(void) { gCurrLevelNum = LEVEL_MAX; // exceeded min. set to max. } + // This block will ensure that the level select menu skips over the levels that are not in the game. + if (CVarGetInteger("gDeveloper.BetterLevelSelect", 0) && (stageChanged || gCurrLevelNum == 1)) { + while (sBetterLevelSelectStageNames[gCurrLevelNum - 1][0] == '\0') { + gCurrLevelNum += direction; + if (gCurrLevelNum > LEVEL_MAX) { + gCurrLevelNum = LEVEL_MIN; // exceeded max. set to min. + } + if (gCurrLevelNum < LEVEL_MIN) { + gCurrLevelNum = LEVEL_MAX; // exceeded min. set to max. + } + } + } + // Use file 4 and last act as a test gCurrSaveFileNum = 4; gCurrActNum = 6; print_text_centered(160, 80, "SELECT STAGE"); print_text_centered(160, 30, "PRESS START BUTTON"); - print_text_fmt_int(40, 60, "%2d", gCurrLevelNum); - print_text(80, 60, sLevelSelectStageNames[gCurrLevelNum - 1]); // print stage name + if (CVarGetInteger("gDeveloper.BetterLevelSelect", 0)) { + print_text_fmt_int(240, 80, "%2d", gCurrLevelNum); + print_text_centered(160, 60, sBetterLevelSelectStageNames[gCurrLevelNum - 1]); + } else { + print_text_fmt_int(40, 60, "%2d", gCurrLevelNum); + print_text(80, 60, sLevelSelectStageNames[gCurrLevelNum - 1]); // print stage name + } #define QUIT_LEVEL_SELECT_COMBO (Z_TRIG | START_BUTTON | L_CBUTTONS | R_CBUTTONS) @@ -145,7 +178,7 @@ s16 intro_level_select(void) { // ... the level select quit combo is being pressed, which uses START. If this // is the case, quit the menu instead. if (gPlayer1Controller->buttonDown == QUIT_LEVEL_SELECT_COMBO) { - gDebugLevelSelect = FALSE; + // CVarSetInteger("gEnableDebugMode", 0); return -1; } play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource); @@ -160,12 +193,11 @@ s16 intro_level_select(void) { s32 intro_regular(void) { s32 level = LEVEL_NONE; -#ifndef VERSION_JP // When the game stars, gGlobalTimer is less than 129 frames, // so Mario greets the player. After that, he will always say // "press start to play" when it goes back to the title screen // (using SAVE AND QUIT) - if (sPlayMarioGreeting == TRUE) { + if (!ROM_JP && sPlayMarioGreeting == TRUE) { if (gGlobalTimer < 129) { play_sound(SOUND_MARIO_HELLO, gGlobalSoundSource); } else { @@ -173,7 +205,7 @@ s32 intro_regular(void) { } sPlayMarioGreeting = FALSE; } -#endif + print_intro_text(); if (gPlayer1Controller->buttonPressed & START_BUTTON) { @@ -186,9 +218,7 @@ s32 intro_regular(void) { // defined in level_intro_mario_head_regular JUMP_IF commands // 100 is File Select - 101 is Level Select level = 100 + gDebugLevelSelect; -#ifndef VERSION_JP sPlayMarioGreeting = TRUE; -#endif } return run_level_id_or_demo(level); } @@ -199,12 +229,10 @@ s32 intro_regular(void) { s32 intro_game_over(void) { s32 level = LEVEL_NONE; -#ifndef VERSION_JP - if (sPlayMarioGameOver == TRUE) { + if (!ROM_JP && sPlayMarioGameOver == TRUE) { play_sound(SOUND_MARIO_GAME_OVER, gGlobalSoundSource); sPlayMarioGameOver = FALSE; } -#endif print_intro_text(); @@ -216,9 +244,7 @@ s32 intro_game_over(void) { #endif // same criteria as intro_regular level = 100 + gDebugLevelSelect; -#ifndef VERSION_JP sPlayMarioGameOver = TRUE; -#endif } return run_level_id_or_demo(level); } diff --git a/src/port/Engine.cpp b/src/port/Engine.cpp index 981b6100..c73abf96 100644 --- a/src/port/Engine.cpp +++ b/src/port/Engine.cpp @@ -4,19 +4,26 @@ #include "port/importer/AudioBankFactory.h" #include "port/importer/AudioSampleFactory.h" #include "port/importer/AudioSequenceFactory.h" -#include "audio/internal.h" -#include "banks_table.h" -#include "sequences_table.h" #include "audio/GameAudio.h" #include "ZAPDUtils/Utils/StringHelper.h" +#include "texts_table.h" +#include "port/importer/DialogFactory.h" +#include "port/importer/DictionaryFactory.h" +#include "port/Enhancements/game-interactor/GameInteractor.h" +#include "port/Enhancements/mods.h" #include #include +#include + extern "C" { #include "audio/external.h" +#include "audio/internal.h" +#include "game/ingame_menu.h" } GameEngine* GameEngine::Instance; +GameInteractor* GameInteractor::Instance; GameEngine::GameEngine(){ std::vector OTRFiles; @@ -24,10 +31,10 @@ GameEngine::GameEngine(){ if (std::filesystem::exists(cubePath)) { OTRFiles.push_back(cubePath); } - std::string sohOtrPath = LUS::Context::GetPathRelativeToAppBundle("soh.otr"); - if (std::filesystem::exists(sohOtrPath)) { - OTRFiles.push_back(sohOtrPath); - } + std::string sm64OtrPath = LUS::Context::GetPathRelativeToAppBundle("sm64.otr"); + if (std::filesystem::exists(sm64OtrPath)) { + OTRFiles.push_back(sm64OtrPath); + } std::string patchesPath = LUS::Context::GetPathRelativeToAppDirectory("mods"); if (patchesPath.length() > 0 && std::filesystem::exists(patchesPath)) { if (std::filesystem::is_directory(patchesPath)) { @@ -38,39 +45,74 @@ GameEngine::GameEngine(){ } } } - this->context = LUS::Context::CreateInstance("Ghostship", "sm64", "ghostship.cfg.json", OTRFiles, {}, 3); - this->context->GetWindow()->SetTargetFps(30); + this->context = LUS::Context::CreateInstance("Ghostship", "sm64", "ghostship.cfg.json", OTRFiles, { 0xFF2B5A63, 0xE3DAA4E }, 3); + this->context->GetWindow()->SetTargetFps(60); this->context->GetWindow()->SetMaximumFrameLatency(1); - this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Anim, "Animation", std::make_shared()); + this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SAnim, "Animation", std::make_shared()); this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Bank, "Bank", std::make_shared()); this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Sample, "Sample", std::make_shared()); this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Sequence, "Sequence", std::make_shared()); - GameEngine::AudioInit(); + this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SDialog, "Dialog", std::make_shared()); + this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Dictionary, "Dictionary", std::make_shared()); } void GameEngine::Create(){ - GameEngine::Instance = new GameEngine(); + auto instance = GameEngine::Instance = new GameEngine(); + GameInteractor::Instance = new GameInteractor(); + InitMods(); GameUI::SetupGuiElements(); + instance->AudioInit(); + instance->LoadDictionary(); } void GameEngine::Destroy(){ GameEngine::AudioExit(); - this->context = nullptr; } +bool ShouldClearTextureCacheAtEndOfFrame = false; + void GameEngine::StartFrame() const{ + using LUS::KbScancode; + int32_t dwScancode = this->context->GetWindow()->GetLastScancode(); + this->context->GetWindow()->SetLastScancode(-1); + + switch (dwScancode) { + case KbScancode::LUS_KB_TAB: { + // Toggle HD Assets + CVarSetInteger("gAltAssets", !CVarGetInteger("gAltAssets", 0)); + ShouldClearTextureCacheAtEndOfFrame = true; + break; + } + } this->context->GetWindow()->StartFrame(); } void GameEngine::RunCommands(Gfx* Commands) { gfx_run(Commands, {}); gfx_end_frame(); + + if (ShouldClearTextureCacheAtEndOfFrame) { + gfx_texture_cache_clear(); + ShouldClearTextureCacheAtEndOfFrame = false; + } } void GameEngine::ProcessFrame(void (*run_one_game_iter)()) const { this->context->GetWindow()->MainLoop(run_one_game_iter); } +uint32_t GameEngine::GetInterpolationFPS() { + if (LUS::Context::GetInstance()->GetWindow()->GetWindowBackend() == LUS::WindowBackend::DX11) { + return CVarGetInteger("gInterpolationFPS", 30); + } + + if (CVarGetInteger("gMatchRefreshRate", 0)) { + return LUS::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); + } + + return std::min(LUS::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(), CVarGetInteger("gInterpolationFPS", 30)); +} + // Audio void GameEngine::HandleAudioThread(){ @@ -90,8 +132,8 @@ void GameEngine::HandleAudioThread(){ int samples_left = AudioPlayerBuffered(); u32 num_audio_samples = samples_left < AudioPlayerGetDesiredBuffered() ? SAMPLES_HIGH : SAMPLES_LOW; - s16 audio_buffer[SAMPLES_HIGH * NUM_AUDIO_CHANNELS * 3]; - for (int i = 0; i < AUDIO_FRAMES_PER_UPDATE; i++) { + s16 audio_buffer[SAMPLES_PER_FRAME]; + for (int i = 0; i < NUM_AUDIO_CHANNELS; i++) { create_next_audio_buffer(audio_buffer + i * (num_audio_samples * 2), num_audio_samples); } @@ -121,7 +163,23 @@ void GameEngine::EndAudioFrame(){ } void GameEngine::AudioInit() { - LUS::Context::GetInstance()->GetResourceManager()->LoadDirectory("sound"); + auto resourceMgr = LUS::Context::GetInstance()->GetResourceManager(); + resourceMgr->LoadDirectory("sound"); + auto banksFiles = resourceMgr->GetArchive()->ListFiles("sound/banks/*"); + + for(auto& bank : *banksFiles){ + auto path = "__OTR__" + bank; + auto ctl = static_cast(ResourceGetDataByName(path.c_str())); + this->bankMapTable[bank] = ctl->bankId; + } + + auto sequencesFiles = resourceMgr->GetArchive()->ListFiles("sound/sequences/*"); + + for(auto& sequence : *sequencesFiles){ + auto path = "__OTR__" + sequence; + auto seq = static_cast(ResourceGetDataByName(path.c_str())); + this->sequencesMapTable[seq->id] = path; + } if (!audio.running) { audio.running = true; @@ -140,6 +198,22 @@ void GameEngine::AudioExit() { audio.thread.join(); } +void GameEngine::LoadDictionary() { + this->dictionary = static_cast> *>(ResourceGetDataByName("__OTR__texts/strings/global")); +} + +uint8_t GameEngine::GetBankIdByName(const std::string& name) { + auto engine = GameEngine::Instance; + if(engine->bankMapTable.contains(name)){ + return engine->bankMapTable[name]; + } + return 0; +} + +extern "C" uint32_t GameEngine_GetInterpolatedFPS() { + return GameEngine::GetInterpolationFPS(); +} + extern "C" uint32_t GameEngine_GetSampleRate() { auto player = LUS::Context::GetInstance()->GetAudio()->GetAudioPlayer(); if (player == nullptr) { @@ -153,6 +227,10 @@ extern "C" uint32_t GameEngine_GetSampleRate() { return player->GetSampleRate(); } +extern "C" uint32_t GameEngine_GetSamplesPerFrame(){ + return SAMPLES_PER_FRAME; +} + // End extern "C" float GameEngine_GetAspectRatio() { @@ -161,15 +239,20 @@ extern "C" float GameEngine_GetAspectRatio() { extern "C" CtlEntry* GameEngine_LoadBank(uint8_t bankId) { auto engine = GameEngine::Instance; - if(bankId > (sizeof(gBankTable) / sizeof(gBankTable[0])) - 1){ + if(bankId >= engine->bankMapTable.size()){ return nullptr; } if(engine->banks.contains(bankId)){ return engine->banks[bankId]; } - auto ctl = static_cast(ResourceGetDataByName(gBankTable[bankId])); - engine->banks[bankId] = ctl; - return ctl; + for(auto& bank : engine->bankMapTable){ + if(bank.second == bankId){ + auto ctl = static_cast(ResourceGetDataByName(("__OTR__" + bank.first).c_str())); + engine->banks[bankId] = ctl; + return ctl; + } + } + return nullptr; } extern "C" uint8_t GameEngine_IsBankLoaded(uint8_t bankId) { @@ -187,17 +270,24 @@ extern "C" void GameEngine_UnloadBank(uint8_t bankId) { extern "C" AudioSequenceData* GameEngine_LoadSequence(uint8_t seqId) { auto engine = GameEngine::Instance; - if(seqId > (sizeof(gSequenceTable) / sizeof(gSequenceTable[0])) - 1){ + if(!engine->sequencesMapTable.contains(seqId)){ return nullptr; } + if(engine->sequences.contains(seqId)){ return engine->sequences[seqId]; } - auto sequences = static_cast(ResourceGetDataByName(gSequenceTable[seqId])); + + auto sequences = static_cast(ResourceGetDataByName(engine->sequencesMapTable[seqId].c_str())); engine->sequences[seqId] = sequences; return sequences; } +extern "C" uint32_t GameEngine_GetSequenceCount(){ + auto engine = GameEngine::Instance; + return engine->sequencesMapTable.size(); +} + extern "C" uint8_t GameEngine_IsSequenceLoaded(uint8_t seqId) { auto engine = GameEngine::Instance; GameEngine_LoadSequence(seqId); @@ -209,4 +299,31 @@ extern "C" void GameEngine_UnloadSequence(uint8_t seqId) { if(engine->sequences.contains(seqId)){ engine->sequences.erase(seqId); } +} + +extern "C" uint32_t GameEngine_GetGameVersion() { + return LUS::Context::GetInstance()->GetResourceManager()->GetArchive()->GetGameVersions()[0]; +} + +extern "C" uint8_t* GameEngine_LoadActName(uint32_t actId){ + return (uint8_t*) ResourceGetDataByName(StringHelper::Sprintf(gActRoot, actId).c_str()); +} + +extern "C" uint8_t* GameEngine_LoadLevelName(uint32_t courseId){ + return (uint8_t*) ResourceGetDataByName(StringHelper::Sprintf(gCourseRoot, courseId).c_str()); +} + +extern "C" DialogEntry* GameEngine_LoadDialog(uint32_t dialogId){ + auto dialog = (DialogEntry*) ResourceGetDataByName(StringHelper::Sprintf(gDialogRoot, dialogId).c_str()); + return dialog; +} + +extern "C" uint8_t* GameEngine_LoadTranslation(const char* key) { + auto engine = GameEngine::Instance; + auto dictionary = engine->dictionary; + + assert(engine->dictionary != nullptr); + assert(engine->dictionary->contains(key)); + + return engine->dictionary->at(key).data(); } \ No newline at end of file diff --git a/src/port/Engine.h b/src/port/Engine.h index 0cc50e05..303e268b 100644 --- a/src/port/Engine.h +++ b/src/port/Engine.h @@ -3,11 +3,13 @@ #ifdef __cplusplus #include #include +#include #define SAMPLES_HIGH 544 #define SAMPLES_LOW 528 #define AUDIO_FRAMES_PER_UPDATE 2 #define NUM_AUDIO_CHANNELS 2 +#define SAMPLES_PER_FRAME (SAMPLES_HIGH * NUM_AUDIO_CHANNELS * 2) struct CtlEntry; struct AudioBankSample; @@ -20,27 +22,41 @@ class GameEngine { std::shared_ptr context; std::unordered_map banks; std::unordered_map sequences; + std::unordered_map bankMapTable; + std::unordered_map sequencesMapTable; + std::unordered_map>* dictionary; GameEngine(); static void Create(); + void AudioInit(); void StartFrame() const; static void RunCommands(Gfx* Commands); void ProcessFrame(void (*run_one_game_iter)()) const; + static uint32_t GetInterpolationFPS(); static void HandleAudioThread(); static void StartAudioFrame(); static void EndAudioFrame(); - static void AudioInit(); static void AudioExit(); + static uint8_t GetBankIdByName(const std::string& name); + void LoadDictionary(); void Destroy(); }; #else +uint32_t GameEngine_GetInterpolatedFPS(); uint32_t GameEngine_GetSampleRate(); +uint32_t GameEngine_GetSamplesPerFrame(); float GameEngine_GetAspectRatio(); struct CtlEntry* GameEngine_LoadBank(uint8_t bankId); uint8_t GameEngine_IsBankLoaded(uint8_t bankId); void GameEngine_UnloadBank(uint8_t bankId); struct AudioSequenceData* GameEngine_LoadSequence(uint8_t seqId); +uint32_t GameEngine_GetSequenceCount(); uint8_t GameEngine_IsSequenceLoaded(uint8_t seqId); void GameEngine_UnloadSequence(uint8_t seqId); +uint32_t GameEngine_GetGameVersion(); +uint8_t* GameEngine_LoadActName(uint32_t actId); +uint8_t* GameEngine_LoadLevelName(uint32_t levelId); +struct DialogEntry* GameEngine_LoadDialog(uint32_t dialogId); +uint8_t* GameEngine_LoadTranslation(const char* key); #endif \ No newline at end of file diff --git a/src/port/Enhancements/game-interactor/GameInteractor.cpp b/src/port/Enhancements/game-interactor/GameInteractor.cpp new file mode 100644 index 00000000..f237c091 --- /dev/null +++ b/src/port/Enhancements/game-interactor/GameInteractor.cpp @@ -0,0 +1,14 @@ +#include "GameInteractor.h" + +#include "game/level_update.h" + +// Taken from game/level_update.c +#define PLAY_MODE_NORMAL 0 +#define PLAY_MODE_PAUSED 2 +#define PLAY_MODE_CHANGE_AREA 3 +#define PLAY_MODE_CHANGE_LEVEL 4 +#define PLAY_MODE_FRAME_ADVANCE 5 + +bool GameInteractor::IsGameplayPaused() { + return sCurrPlayMode == PLAY_MODE_PAUSED; +} diff --git a/src/port/Enhancements/game-interactor/GameInteractor.h b/src/port/Enhancements/game-interactor/GameInteractor.h new file mode 100644 index 00000000..0124557a --- /dev/null +++ b/src/port/Enhancements/game-interactor/GameInteractor.h @@ -0,0 +1,55 @@ +#ifndef GameInteractor_h +#define GameInteractor_h + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif + + +#ifdef __cplusplus + +#include +#include + +#define DEFINE_HOOK(name, type) \ + struct name { \ + typedef std::function fn; \ + } + +class GameInteractor { +public: + static GameInteractor* Instance; + + // Game State + class State { + + }; + + // Game Hooks + template struct RegisteredGameHooks { inline static std::vector functions; }; + template void RegisterGameHook(typename H::fn h) { RegisteredGameHooks::functions.push_back(h); } + template void ExecuteHooks(Args&&... args) { + for (auto& fn : RegisteredGameHooks::functions) { + fn(std::forward(args)...); + } + } + + DEFINE_HOOK(OnGameFrameUpdate, void()); + DEFINE_HOOK(OnHealthChange, void(int16_t health)); + + // Helpers + static bool IsGameplayPaused(); + + // Game Actions + class RawAction { + + }; + +}; + +#endif // __cplusplus + +#endif // GameInteractor_h diff --git a/src/port/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/src/port/Enhancements/game-interactor/GameInteractor_Hooks.cpp new file mode 100644 index 00000000..285330c0 --- /dev/null +++ b/src/port/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -0,0 +1,12 @@ +#include "GameInteractor_Hooks.h" + +// Gameplay + +// Updates only when in game, i.e. past the save select screen +void GameInteractor_ExecuteOnGameFrameUpdate() { + GameInteractor::Instance->ExecuteHooks(); +} + +void GameInteractor_ExecuteOnHealthChange(int16_t health) { + GameInteractor::Instance->ExecuteHooks(health); +} diff --git a/src/port/Enhancements/game-interactor/GameInteractor_Hooks.h b/src/port/Enhancements/game-interactor/GameInteractor_Hooks.h new file mode 100644 index 00000000..997ad1f4 --- /dev/null +++ b/src/port/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -0,0 +1,13 @@ +#include "GameInteractor.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Gameplay +void GameInteractor_ExecuteOnGameFrameUpdate(); +void GameInteractor_ExecuteOnHealthChange(int16_t health); + +#ifdef __cplusplus +} +#endif diff --git a/src/port/Enhancements/mods.cpp b/src/port/Enhancements/mods.cpp new file mode 100644 index 00000000..0da46ce9 --- /dev/null +++ b/src/port/Enhancements/mods.cpp @@ -0,0 +1,34 @@ +#include "mods.h" +#include +#include "game-interactor/GameInteractor.h" + +#include "game/level_update.h" +extern MarioState* gMarioState; + +#define MARIO_HEALTH_MAX 0x880 + +void RegisterInfiniteHealth() { + GameInteractor::Instance->RegisterGameHook([](int16_t health) { + if (!gMarioState) return; + + if (CVarGetInteger("gInfiniteHealth", 0) != 0) { + gMarioState->health = MARIO_HEALTH_MAX; + } + }); +} + +void RegisterInfiniteLives() { + // There may be a better hook that can be made, rather than doing this every frame + GameInteractor::Instance->RegisterGameHook([]() { + if (!gMarioState) return; + + if (CVarGetInteger("gInfiniteLives", 0) != 0) { + gMarioState->numLives = 100; + } + }); +} + +void InitMods() { + RegisterInfiniteHealth(); + RegisterInfiniteLives(); +} diff --git a/src/port/Enhancements/mods.h b/src/port/Enhancements/mods.h new file mode 100644 index 00000000..f56e68e7 --- /dev/null +++ b/src/port/Enhancements/mods.h @@ -0,0 +1,9 @@ +#ifdef __cplusplus +extern "C" { +#endif + +void InitMods(); + +#ifdef __cplusplus +} +#endif diff --git a/src/port/Game.cpp b/src/port/Game.cpp index 92ed6460..be7197fa 100644 --- a/src/port/Game.cpp +++ b/src/port/Game.cpp @@ -6,6 +6,8 @@ extern "C" { #include "audio/external.h" #include "game/game_init.h" +#include "sm64.h" +float gInterpolationStep = 0.0f; } void alloc_pool() { @@ -14,9 +16,51 @@ void alloc_pool() { gEffectsMemoryPool = mem_pool_init(0x4000, MEMORY_POOL_LEFT); } +void patch_interpolations() { + mtx_patch_interpolated(); + patch_screen_transition_interpolated(); + patch_title_screen_scales(); + patch_interpolated_dialog(); + patch_interpolated_hud(); + patch_interpolated_paintings(); + patch_interpolated_bubble_particles(); + patch_interpolated_snow_particles(); +} + extern "C" void exec_display_list(SPTask *spTask) { - GameEngine::RunCommands((Gfx*) spTask->task.t.data_ptr); + int target_fps = GameEngine::GetInterpolationFPS(); + static int last_fps; + static int time; + int fps = target_fps; + int original_fps = 30; + + if (target_fps == 30 || original_fps > target_fps) { + fps = original_fps; + } + + if (last_fps != fps) { + time = 0; + } + + int next_original_frame = fps; + while (time + original_fps <= next_original_frame) { + time += original_fps; + if (time != next_original_frame) { + gInterpolationStep = (float)time / next_original_frame; + } + GameEngine::RunCommands((Gfx *) spTask->task.t.data_ptr); + patch_interpolations(); + } + + time -= fps; + + GameEngine::Instance->context->GetWindow()->SetTargetFps(fps); + + int threshold = CVarGetInteger("gExtraLatencyThreshold", 80); + GameEngine::Instance->context->GetWindow()->SetMaximumFrameLatency(threshold > 0 && target_fps >= threshold ? 2 : 1); + + last_fps = fps; } void push_frame() { diff --git a/src/port/Variables.cpp b/src/port/Variables.cpp index 98bc69f3..1fccfaa4 100644 --- a/src/port/Variables.cpp +++ b/src/port/Variables.cpp @@ -15,7 +15,6 @@ u64 osClockRate = 62500000; s8 gShowProfiler = FALSE; s8 gShowDebugText = FALSE; -s8 gDebugLevelSelect = TRUE; OSIoMesg gDmaIoMesg; OSMesg gMainReceivedMesg; diff --git a/src/port/importer/AudioBankFactory.cpp b/src/port/importer/AudioBankFactory.cpp index 10931d4a..cbd79cf1 100644 --- a/src/port/importer/AudioBankFactory.cpp +++ b/src/port/importer/AudioBankFactory.cpp @@ -30,11 +30,11 @@ void CubeOS::AudioBankFactoryV0::ParseFileBinary(std::shared_ptrReadUInt32(); uint32_t instrumentCount = reader->ReadUInt32(); for(size_t i = 0; i < instrumentCount; i++){ auto* instrument = new Instrument(); -// memset(instrument, 0, sizeof(Instrument)); bool valid = reader->ReadUByte(); if(!valid){ bank->instruments.push_back(nullptr); @@ -104,7 +104,7 @@ void CubeOS::AudioBankFactoryV0::ParseFileBinary(std::shared_ptrdrums.push_back(drum); } - bank->mData.unused = 1; + bank->mData.bankId = bankId; bank->mData.numInstruments = instrumentCount; bank->mData.numDrums = drumCount; bank->mData.instruments = bank->instruments.data(); diff --git a/src/port/importer/AudioSequenceFactory.cpp b/src/port/importer/AudioSequenceFactory.cpp index 88496bf8..f260617c 100644 --- a/src/port/importer/AudioSequenceFactory.cpp +++ b/src/port/importer/AudioSequenceFactory.cpp @@ -1,6 +1,8 @@ #include "AudioSequenceFactory.h" #include "port/importer/types/AudioSequence.h" #include "spdlog/spdlog.h" +#include "port/Engine.h" +#include "port/importer/types/AudioBank.h" std::shared_ptr CubeOS::AudioSequenceFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { auto resource = std::make_shared(initData); @@ -27,9 +29,11 @@ void CubeOS::AudioSequenceFactoryV0::ParseFileBinary(std::shared_ptrReadUInt32(); size_t bankCount = reader->ReadUInt32(); for(size_t i = 0; i < bankCount; i++){ - bank->banks.push_back(reader->ReadUByte()); + std::string bankName = reader->ReadString(); + bank->banks.push_back(GameEngine::GetBankIdByName(bankName)); } size_t sampleSize = reader->ReadUInt32(); @@ -40,4 +44,5 @@ void CubeOS::AudioSequenceFactoryV0::ParseFileBinary(std::shared_ptrmData.bankCount = bankCount; bank->mData.banks = bank->banks.data(); bank->mData.data = bank->sampleData.data(); + bank->mData.id = id; } \ No newline at end of file diff --git a/src/port/importer/DialogFactory.cpp b/src/port/importer/DialogFactory.cpp new file mode 100644 index 00000000..bf7bffad --- /dev/null +++ b/src/port/importer/DialogFactory.cpp @@ -0,0 +1,41 @@ +#include "DialogFactory.h" +#include "port/importer/types/Dialog.h" +#include "spdlog/spdlog.h" + +std::shared_ptr CubeOS::DialogFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto resource = std::make_shared(initData); + std::shared_ptr factory = nullptr; + + switch (resource->GetInitData()->ResourceVersion) { + case 0: + factory = std::make_shared(); + break; + } + + if (factory == nullptr) { + SPDLOG_ERROR("Failed to load Dialog with version {}", resource->GetInitData()->ResourceVersion); + return nullptr; + } + + factory->ParseFileBinary(reader, resource); + + return resource; +} + +void CubeOS::DialogFactoryV0::ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) { + std::shared_ptr dialog = std::static_pointer_cast(resource); + + ResourceVersionFactory::ParseFileBinary(reader, dialog); + + dialog->mData.unused = reader->ReadUInt32(); + dialog->mData.linesPerBox = reader->ReadInt8(); + dialog->mData.leftOffset = reader->ReadInt16(); + dialog->mData.width = reader->ReadInt16(); + + size_t textSize = reader->ReadUInt32(); + for(size_t i = 0; i < textSize; i++){ + dialog->mText.push_back(reader->ReadUByte()); + } + + dialog->mData.str = dialog->mText.data(); +} \ No newline at end of file diff --git a/src/port/importer/DialogFactory.h b/src/port/importer/DialogFactory.h new file mode 100644 index 00000000..89c79c68 --- /dev/null +++ b/src/port/importer/DialogFactory.h @@ -0,0 +1,16 @@ +#pragma once + +#include "ResourceFactory.h" + +namespace CubeOS{ +class DialogFactory : public LUS::ResourceFactory { + public: + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; +}; + +class DialogFactoryV0 : public LUS::ResourceVersionFactory { + public: + void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; +}; +} diff --git a/src/port/importer/DictionaryFactory.cpp b/src/port/importer/DictionaryFactory.cpp new file mode 100644 index 00000000..56e9f0ca --- /dev/null +++ b/src/port/importer/DictionaryFactory.cpp @@ -0,0 +1,40 @@ +#include "DictionaryFactory.h" +#include "port/importer/types/Dictionary.h" +#include "spdlog/spdlog.h" + +std::shared_ptr CubeOS::DictionaryFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto resource = std::make_shared(initData); + std::shared_ptr factory = nullptr; + + switch (resource->GetInitData()->ResourceVersion) { + case 0: + factory = std::make_shared(); + break; + } + + if (factory == nullptr) { + SPDLOG_ERROR("Failed to load Dialog with version {}", resource->GetInitData()->ResourceVersion); + return nullptr; + } + + factory->ParseFileBinary(reader, resource); + + return resource; +} + +void CubeOS::DictionaryFactoryV0::ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) { + std::shared_ptr dictionary = std::static_pointer_cast(resource); + + ResourceVersionFactory::ParseFileBinary(reader, dictionary); + + size_t numEntries = reader->ReadUInt32(); + for(size_t i = 0; i < numEntries; i++){ + std::string key = reader->ReadString(); + size_t valueSize = reader->ReadUInt32(); + std::vector value; + for(size_t j = 0; j < valueSize; j++){ + value.push_back(reader->ReadUByte()); + } + dictionary->mData[key] = value; + } +} \ No newline at end of file diff --git a/src/port/importer/DictionaryFactory.h b/src/port/importer/DictionaryFactory.h new file mode 100644 index 00000000..d2466bc0 --- /dev/null +++ b/src/port/importer/DictionaryFactory.h @@ -0,0 +1,16 @@ +#pragma once + +#include "ResourceFactory.h" + +namespace CubeOS{ +class DictionaryFactory : public LUS::ResourceFactory { + public: + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; +}; + +class DictionaryFactoryV0 : public LUS::ResourceVersionFactory { + public: + void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; +}; +} diff --git a/src/port/importer/types/AudioBank.h b/src/port/importer/types/AudioBank.h index fbb24d11..bb3c965c 100644 --- a/src/port/importer/types/AudioBank.h +++ b/src/port/importer/types/AudioBank.h @@ -34,7 +34,7 @@ struct Drum { }; struct CtlEntry { - uint8_t unused; + uint8_t bankId; uint8_t numInstruments; uint8_t numDrums; struct Instrument **instruments; diff --git a/src/port/importer/types/AudioSequence.h b/src/port/importer/types/AudioSequence.h index 8f29c92b..5001e60b 100644 --- a/src/port/importer/types/AudioSequence.h +++ b/src/port/importer/types/AudioSequence.h @@ -7,6 +7,7 @@ struct AudioSequenceData { uint32_t bankCount; uint8_t* banks; uint8_t* data; + uint8_t id; }; namespace CubeOS { diff --git a/src/port/importer/types/Dialog.cpp b/src/port/importer/types/Dialog.cpp new file mode 100644 index 00000000..413eab68 --- /dev/null +++ b/src/port/importer/types/Dialog.cpp @@ -0,0 +1,11 @@ +#include "Dialog.h" + +namespace CubeOS { +DialogEntry* Dialog::GetPointer() { + return &mData; +} + +size_t Dialog::GetPointerSize() { + return sizeof(mData); +} +} \ No newline at end of file diff --git a/src/port/importer/types/Dialog.h b/src/port/importer/types/Dialog.h new file mode 100644 index 00000000..776b1d49 --- /dev/null +++ b/src/port/importer/types/Dialog.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +struct DialogEntry { + /*0x00*/ uint32_t unused; + /*0x04*/ int8_t linesPerBox; + /*0x06*/ int16_t leftOffset; + /*0x08*/ int16_t width; + /*0x0C*/ uint8_t *str; +}; + + +namespace CubeOS { + +class Dialog : public LUS::Resource { + public: + using Resource::Resource; + + Dialog() : Resource(std::shared_ptr()) {} + + DialogEntry* GetPointer(); + size_t GetPointerSize(); + + DialogEntry mData; + std::vector mText; +}; +} \ No newline at end of file diff --git a/src/port/importer/types/Dictionary.cpp b/src/port/importer/types/Dictionary.cpp new file mode 100644 index 00000000..41540064 --- /dev/null +++ b/src/port/importer/types/Dictionary.cpp @@ -0,0 +1,11 @@ +#include "Dictionary.h" + +namespace CubeOS { +GameDictionary* Dictionary::GetPointer() { + return &mData; +} + +size_t Dictionary::GetPointerSize() { + return sizeof(mData); +} +} \ No newline at end of file diff --git a/src/port/importer/types/Dictionary.h b/src/port/importer/types/Dictionary.h new file mode 100644 index 00000000..317f06fa --- /dev/null +++ b/src/port/importer/types/Dictionary.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include +#include + +namespace CubeOS { + +typedef std::unordered_map> GameDictionary; + +class Dictionary : public LUS::Resource { + public: + using Resource::Resource; + + Dictionary() : Resource(std::shared_ptr()) {} + + GameDictionary* GetPointer(); + size_t GetPointerSize(); + + GameDictionary mData; +}; +} \ No newline at end of file diff --git a/src/port/ui/ImguiUI.cpp b/src/port/ui/ImguiUI.cpp index f6ff69db..5f68e65f 100644 --- a/src/port/ui/ImguiUI.cpp +++ b/src/port/ui/ImguiUI.cpp @@ -1,5 +1,6 @@ #include "ImguiUI.h" #include "UIWidgets.h" +#include "ResolutionEditor.h" #include #include @@ -7,6 +8,7 @@ #include #include #include +#include "port/Engine.h" extern "C" { #include "audio/external.h" } @@ -16,10 +18,16 @@ std::shared_ptr mGameMenuBar; std::shared_ptr mConsoleWindow; std::shared_ptr mStatsWindow; std::shared_ptr mInputEditorWindow; +std::shared_ptr mAdvancedResolutionSettingsWindow; void SetupGuiElements() { auto gui = LUS::Context::GetInstance()->GetWindow()->GetGui(); + auto& style = ImGui::GetStyle(); + style.FramePadding = ImVec2(4.0f, 6.0f); + style.ItemSpacing = ImVec2(8.0f, 6.0f); + style.Colors[ImGuiCol_MenuBarBg] = UIWidgets::Colors::DarkGray; + mGameMenuBar = std::make_shared("gOpenMenuBar", CVarGetInteger("gOpenMenuBar", 0)); gui->SetMenuBar(mGameMenuBar); mStatsWindow = gui->GetGuiWindow("Stats"); @@ -37,66 +45,455 @@ void SetupGuiElements() { SPDLOG_ERROR("Could not find input editor window"); return; } + + mAdvancedResolutionSettingsWindow = std::make_shared("gAdvancedResolutionEditorEnabled", "Advanced Resolution Settings"); + gui->AddGuiWindow(mAdvancedResolutionSettingsWindow); } void Destroy() { + mAdvancedResolutionSettingsWindow = nullptr; mConsoleWindow = nullptr; mStatsWindow = nullptr; mInputEditorWindow = nullptr; } + +std::string GetWindowButtonText(const char* text, bool menuOpen) { + char buttonText[100] = ""; + if (menuOpen) { + strcat(buttonText, ICON_FA_CHEVRON_RIGHT " "); + } + strcat(buttonText, text); + if (!menuOpen) { strcat(buttonText, " "); } + return buttonText; +} +} + +static const char* filters[3] = { +#ifdef __WIIU__ + "", +#else + "Three-Point", +#endif + "Linear", "None" +}; + +void DrawSettingsMenu(){ + if(UIWidgets::BeginMenu("Settings")){ + if (UIWidgets::BeginMenu("Audio")) { + UIWidgets::CVarSliderFloat("Master Volume", "gGameMasterVolume", 0.0f, 1.0f, 1.0f, { + .format = "%.0f%%", + .isPercentage = true, + }); + if (UIWidgets::CVarSliderFloat("Main Music Volume", "gMainMusicVolume", 0.0f, 1.0f, 1.0f, { + .format = "%.0f%%", + .isPercentage = true, + })) { + audio_set_player_volume(SEQ_PLAYER_LEVEL, CVarGetFloat("gMainMusicVolume", 1.0f)); + } + if (UIWidgets::CVarSliderFloat("Sound Effects Volume", "gSFXMusicVolume", 0.0f, 1.0f, 1.0f, { + .format = "%.0f%%", + .isPercentage = true, + })) { + audio_set_player_volume(SEQ_PLAYER_SFX, CVarGetFloat("gSFXMusicVolume", 1.0f)); + } + if (UIWidgets::CVarSliderFloat("Environment Volume", "gEnvironmentVolume", 0.0f, 1.0f, 1.0f, { + .format = "%.0f%%", + .isPercentage = true, + })) { + audio_set_player_volume(SEQ_PLAYER_ENV, CVarGetFloat("gEnvironmentVolume", 1.0f)); + } + + static std::unordered_map audioBackendNames = { + { LUS::AudioBackend::WASAPI, "Windows Audio Session API" }, + { LUS::AudioBackend::PULSE, "PulseAudio" }, + { LUS::AudioBackend::SDL, "SDL" }, + }; + + ImGui::Text("Audio API (Needs reload)"); + auto currentAudioBackend = LUS::Context::GetInstance()->GetAudio()->GetAudioBackend(); + + if (LUS::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { + UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + } + if (ImGui::BeginCombo("##AApi", audioBackendNames[currentAudioBackend])) { + for (uint8_t i = 0; i < LUS::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size(); i++) { + auto backend = LUS::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->data()[i]; + if (ImGui::Selectable(audioBackendNames[backend], backend == currentAudioBackend)) { + LUS::Context::GetInstance()->GetAudio()->SetAudioBackend(backend); + } + } + ImGui::EndCombo(); + } + if (LUS::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { + UIWidgets::ReEnableComponent(""); + } + + ImGui::EndMenu(); + } + + UIWidgets::Spacer(0); + + if (UIWidgets::BeginMenu("Controller")) { + UIWidgets::WindowButton("Controller Mapping", "gInputEditorWindow", GameUI::mInputEditorWindow); + + UIWidgets::Spacer(0); + +#ifndef __SWITCH__ + UIWidgets::CVarCheckbox("Menubar Controller Navigation", "gControlNav", { + .tooltip = "Allows controller navigation of the SOH menu bar (Settings, Enhancements,...)\nCAUTION: This will disable game inputs while the menubar is visible.\n\nD-pad to move between items, A to select, and X to grab focus on the menu bar" + }); +#endif + UIWidgets::CVarCheckbox("Show Inputs", "gInputEnabled", { + .tooltip = "Shows currently pressed inputs on the bottom right of the screen" + }); + if (CVarGetInteger("gInputEnabled", 0)) { + UIWidgets::CVarSliderFloat("Input Scale", "gInputScale", 1.0f, 3.0f, 1.0f, { + .tooltip = "Sets the on screen size of the displayed inputs from the Show Inputs setting", + .format = "%.1fx", + }); + } + + ImGui::EndMenu(); + } + + ImGui::EndMenu(); + } + + ImGui::SetCursorPosY(0.0f); + if (UIWidgets::BeginMenu("Graphics")) { + UIWidgets::WindowButton("Resolution Editor", "gAdvancedResolutionEditorEnabled", GameUI::mAdvancedResolutionSettingsWindow); + + UIWidgets::Spacer(0); + + // Previously was running every frame, and nothing was setting it? Maybe a bad copy/paste? + // LUS::Context::GetInstance()->GetWindow()->SetResolutionMultiplier(CVarGetFloat("gInternalResolution", 1)); + // UIWidgets::Tooltip("Multiplies your output resolution by the value inputted, as a more intensive but effective form of anti-aliasing"); +#ifndef __WIIU__ + if (UIWidgets::CVarSliderInt("MSAA: %d", "gMSAAValue", 1, 8, 1, { + .tooltip = "Activates multi-sample anti-aliasing when above 1x up to 8x for 8 samples for every pixel" + })) { + LUS::Context::GetInstance()->GetWindow()->SetMsaaLevel(CVarGetInteger("gMSAAValue", 1)); + } +#endif + + { // FPS Slider + const int minFps = 30; + static int maxFps; + if (LUS::Context::GetInstance()->GetWindow()->GetWindowBackend() == LUS::WindowBackend::DX11) { + maxFps = 360; + } else { + maxFps = LUS::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); + } + int currentFps = fmax(fmin(GameEngine::GetInterpolationFPS(), maxFps), minFps); + #ifdef __WIIU__ + UIWidgets::Spacer(0); + // only support divisors of 60 on the Wii U + if (currentFps > 60) { + currentFps = 60; + } else { + currentFps = 60 / (60 / currentFps); + } + + int fpsSlider = 1; + if (currentFps == 30) { + ImGui::Text("FPS: Original (30)"); + } else { + ImGui::Text("FPS: %d", currentFps); + if (currentFps == 30) { + fpsSlider = 2; + } else { // currentFps == 60 + fpsSlider = 3; + } + } + if (CVarGetInteger("gMatchRefreshRate", 0)) { + UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + } + + if (ImGui::Button(" - ##WiiUFPS")) { + fpsSlider--; + } + ImGui::SameLine(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); + + UIWidgets::Spacer(0); + + ImGui::PushItemWidth(std::min((ImGui::GetContentRegionAvail().x - 60.0f), 260.0f)); + ImGui::SliderInt("##WiiUFPSSlider", &fpsSlider, 1, 3, "", ImGuiSliderFlags_AlwaysClamp); + ImGui::PopItemWidth(); + + ImGui::SameLine(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); + if (ImGui::Button(" + ##WiiUFPS")) { + fpsSlider++; + } + + if (CVarGetInteger("gMatchRefreshRate", 0)) { + UIWidgets::ReEnableComponent(""); + } + if (fpsSlider > 3) { + fpsSlider = 3; + } else if (fpsSlider < 1) { + fpsSlider = 1; + } + + if (fpsSlider == 1) { + currentFps = 20; + } else if (fpsSlider == 2) { + currentFps = 30; + } else if (fpsSlider == 3) { + currentFps = 60; + } + CVarSetInteger("gInterpolationFPS", currentFps); + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + #else + bool matchingRefreshRate = + CVarGetInteger("gMatchRefreshRate", 0) && LUS::Context::GetInstance()->GetWindow()->GetWindowBackend() != LUS::WindowBackend::DX11; + UIWidgets::CVarSliderInt((currentFps == 20) ? "FPS: Original (20)" : "FPS: %d", "gInterpolationFPS", minFps, maxFps, 1, { + .disabled = matchingRefreshRate + }); + #endif + if (LUS::Context::GetInstance()->GetWindow()->GetWindowBackend() == LUS::WindowBackend::DX11) { + UIWidgets::Tooltip( + "Uses Matrix Interpolation to create extra frames, resulting in smoother graphics. This is purely " + "visual and does not impact game logic, execution of glitches etc.\n\n" + "A higher target FPS than your monitor's refresh rate will waste resources, and might give a worse result." + ); + } else { + UIWidgets::Tooltip( + "Uses Matrix Interpolation to create extra frames, resulting in smoother graphics. This is purely " + "visual and does not impact game logic, execution of glitches etc." + ); + } + } // END FPS Slider + + if (LUS::Context::GetInstance()->GetWindow()->GetWindowBackend() == LUS::WindowBackend::DX11) { + UIWidgets::Spacer(0); + if (ImGui::Button("Match Refresh Rate")) { + int hz = LUS::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); + if (hz >= 30 && hz <= 360) { + CVarSetInteger("gInterpolationFPS", hz); + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + } + } + } else { + UIWidgets::PaddedEnhancementCheckbox("Match Refresh Rate", "gMatchRefreshRate", true, false); + } + + UIWidgets::Tooltip("Matches interpolation value to the current game's window refresh rate"); + + if (LUS::Context::GetInstance()->GetWindow()->GetWindowBackend() == LUS::WindowBackend::DX11) { + UIWidgets::PaddedEnhancementSliderInt(CVarGetInteger("gExtraLatencyThreshold", 80) == 0 ? "Jitter fix: Off" : "Jitter fix: >= %d FPS", + "##ExtraLatencyThreshold", "gExtraLatencyThreshold", 0, 360, "", 80, true, true, false); + UIWidgets::Tooltip("When Interpolation FPS setting is at least this threshold, add one frame of input lag (e.g. 16.6 ms for 60 FPS) in order to avoid jitter. This setting allows the CPU to work on one frame while GPU works on the previous frame.\nThis setting should be used when your computer is too slow to do CPU + GPU work in time."); + } + + UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + + + static std::unordered_map windowBackendNames = { + { LUS::WindowBackend::DX11, "DirectX" }, + { LUS::WindowBackend::SDL_OPENGL, "OpenGL"}, + { LUS::WindowBackend::SDL_METAL, "Metal" }, + { LUS::WindowBackend::GX2, "GX2"} + }; + + ImGui::Text("Renderer API (Needs reload)"); + LUS::WindowBackend runningWindowBackend = LUS::Context::GetInstance()->GetWindow()->GetWindowBackend(); + LUS::WindowBackend configWindowBackend; + int configWindowBackendId = LUS::Context::GetInstance()->GetConfig()->GetInt("Window.Backend.Id", -1); + if (configWindowBackendId != -1 && configWindowBackendId < static_cast(LUS::WindowBackend::BACKEND_COUNT)) { + configWindowBackend = static_cast(configWindowBackendId); + } else { + configWindowBackend = runningWindowBackend; + } + + if (LUS::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends()->size() <= 1) { + UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + } + if (ImGui::BeginCombo("##RApi", windowBackendNames[configWindowBackend])) { + for (size_t i = 0; i < LUS::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends()->size(); i++) { + auto backend = LUS::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends()->data()[i]; + if (ImGui::Selectable(windowBackendNames[backend], backend == configWindowBackend)) { + LUS::Context::GetInstance()->GetConfig()->SetInt("Window.Backend.Id", static_cast(backend)); + LUS::Context::GetInstance()->GetConfig()->SetString("Window.Backend.Name", + windowBackendNames[backend]); + LUS::Context::GetInstance()->GetConfig()->Save(); + } + } + ImGui::EndCombo(); + } + if (LUS::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends()->size() <= 1) { + UIWidgets::ReEnableComponent(""); + } + + if (LUS::Context::GetInstance()->GetWindow()->CanDisableVerticalSync()) { + UIWidgets::PaddedEnhancementCheckbox("Enable Vsync", "gVsyncEnabled", true, false); + } + + if (LUS::Context::GetInstance()->GetWindow()->SupportsWindowedFullscreen()) { + UIWidgets::PaddedEnhancementCheckbox("Windowed fullscreen", "gSdlWindowedFullscreen", true, false); + } + + if (LUS::Context::GetInstance()->GetWindow()->GetGui()->SupportsViewports()) { + UIWidgets::PaddedEnhancementCheckbox("Allow multi-windows", "gEnableMultiViewports", true, false, false, "", UIWidgets::CheckboxGraphics::Cross, true); + UIWidgets::Tooltip("Allows windows to be able to be dragged off of the main game window. Requires a reload to take effect."); + } + + // If more filters are added to LUS, make sure to add them to the filters list here + ImGui::Text("Texture Filter (Needs reload)"); + + UIWidgets::EnhancementCombobox("gTextureFilter", filters, 0); + + UIWidgets::Spacer(0); + + LUS::Context::GetInstance()->GetWindow()->GetGui()->GetGameOverlay()->DrawSettings(); + + ImGui::EndMenu(); + } +} + +void DrawMenuBarIcon() { + static bool gameIconLoaded = false; + if (!gameIconLoaded) { + LUS::Context::GetInstance()->GetWindow()->GetGui()->LoadTexture("Game_Icon", "textures/icons/gIcon.png"); + gameIconLoaded = true; + } + + if (LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Game_Icon")) { +#ifdef __SWITCH__ + ImVec2 iconSize = ImVec2(20.0f, 20.0f); + float posScale = 1.0f; +#elif defined(__WIIU__) + ImVec2 iconSize = ImVec2(16.0f * 2, 16.0f * 2); + float posScale = 2.0f; +#else + ImVec2 iconSize = ImVec2(20.0f, 20.0f); + float posScale = 1.5f; +#endif + ImGui::SetCursorPos(ImVec2(5, 2.5f) * posScale); + ImGui::Image(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Game_Icon"), iconSize); + ImGui::SameLine(); + ImGui::SetCursorPos(ImVec2(25, 0) * posScale); + } +} + +void DrawGameMenu() { + if (UIWidgets::BeginMenu("Ghostship")) { + if (UIWidgets::MenuItem("Reset", +#ifdef __APPLE__ + "Command-R" +#else + "Ctrl+R" +#endif + )) { + std::reinterpret_pointer_cast(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->Dispatch("reset"); + } +#if !defined(__SWITCH__) && !defined(__WIIU__) + + if (UIWidgets::MenuItem("Toggle Fullscreen", "F9")) { + LUS::Context::GetInstance()->GetWindow()->ToggleFullscreen(); + } + + if (UIWidgets::MenuItem("Quit")) { + LUS::Context::GetInstance()->GetWindow()->Close(); + } +#endif + ImGui::EndMenu(); + } +} + +void DrawEnhancementsMenu() { + if (UIWidgets::BeginMenu("Enhancements")) { + + if (UIWidgets::BeginMenu("Gameplay")) { + UIWidgets::CVarCheckbox("No Level of Detail (LOD)", "gDisableLOD", { + .tooltip = "Disable Level of Detail (LOD) to avoid models using lower poly versions at a distance" + }); + UIWidgets::CVarCheckbox("Select any star from menu", "gSelectAllStars", { + .tooltip = "Let's you select any star from the menu regardless of the courses completion status." + }); + UIWidgets::CVarCheckbox("Collecting Stars Will Not Exit Level", "gStarNoExit", { + .tooltip = "Stars act like the 100 coin star and will not take you out of the level" + }); + UIWidgets::CVarCheckbox("Avoid playing peach cutscene", "gDisablePeachCutscene", { + .tooltip = "Avoid playing the peach cutscene when starting a new game" + }); + ImGui::EndMenu(); + } + + ImGui::EndMenu(); + } +} + +void DrawCheatsMenu() { + if (UIWidgets::BeginMenu("Cheats")) { + UIWidgets::CVarCheckbox("Infinite Health", "gInfiniteHealth"); + UIWidgets::CVarCheckbox("Infinite Lives", "gInfiniteLives"); + + ImGui::EndMenu(); + } +} + +const char* debugInfoPages[6] = { + "Object", + "Check Surface", + "Map", + "Stage", + "Effect", + "Enemy", +}; + +void DrawDebugMenu() { + if (UIWidgets::BeginMenu("Developer")) { + UIWidgets::CVarCheckbox("Debug mode", "gEnableDebugMode", { + .tooltip = "Various debug features, including a level selector from the main menu" + }); + + UIWidgets::CVarCheckbox("Better Level Select", "gDeveloper.BetterLevelSelect", { + .tooltip = "Tweaks to the level select screen, like naming and allowing C-buttons to be used" + }); + + UIWidgets::CVarCheckbox("Draw DebugInfo", "gDeveloper.DrawDebugInfo"); + if (CVarGetInteger("gDeveloper.DrawDebugInfo", 0)) { + UIWidgets::CVarCombobox("DebugInfo mode", "gDeveloper.DebugInfoPage", debugInfoPages, { + .defaultIndex = 0, + }); + } + UIWidgets::Spacer(0); + + UIWidgets::WindowButton("Stats", "gStatsEnabled", GameUI::mStatsWindow, { + .tooltip = "Shows the stats window, with your FPS and frametimes, and the OS you're playing on" + }); + UIWidgets::WindowButton("Console", "gConsoleEnabled", GameUI::mConsoleWindow, { + .tooltip = "Enables the console window, allowing you to input commands, type help for some examples" + }); + + ImGui::EndMenu(); + } } void GameMenuBar::DrawElement() { if(ImGui::BeginMenuBar()){ - if(ImGui::BeginMenu("Settings")){ - if (ImGui::BeginMenu("Audio")) { - UIWidgets::PaddedEnhancementSliderFloat("Master Volume: %d %%", "##Master_Vol", "gGameMasterVolume", 0.0f, 1.0f, "", 1.0f, true, true, false, true); - if (UIWidgets::PaddedEnhancementSliderFloat("Main Music Volume: %d %%", "##Main_Music_Vol", "gMainMusicVolume", 0.0f, 1.0f, "", 1.0f, true, true, false, true)) { - audio_set_player_volume(SEQ_PLAYER_LEVEL, CVarGetFloat("gMainMusicVolume", 1.0f)); - } - if (UIWidgets::PaddedEnhancementSliderFloat("Sound Effects Volume: %d %%", "##Sound_Effect_Vol", "gSFXMusicVolume", 0.0f, 1.0f, "", 1.0f, true, true, false, true)) { - audio_set_player_volume(SEQ_PLAYER_SFX, CVarGetFloat("gSFXMusicVolume", 1.0f)); - } - if (UIWidgets::PaddedEnhancementSliderFloat("Environment Volume: %d %%", "##Environment_Vol", "gEnvironmentVolume", 0.0f, 1.0f, "", 1.0f, true, true, false, true)) { - audio_set_player_volume(SEQ_PLAYER_ENV, CVarGetFloat("gEnvironmentVolume", 1.0f)); - } + DrawMenuBarIcon(); - static std::unordered_map audioBackendNames = { - { LUS::AudioBackend::WASAPI, "Windows Audio Session API" }, - { LUS::AudioBackend::PULSE, "PulseAudio" }, - { LUS::AudioBackend::SDL, "SDL" }, - }; + DrawGameMenu(); - ImGui::Text("Audio API (Needs reload)"); - auto currentAudioBackend = LUS::Context::GetInstance()->GetAudio()->GetAudioBackend(); + ImGui::SetCursorPosY(0.0f); - if (LUS::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - if (ImGui::BeginCombo("##AApi", audioBackendNames[currentAudioBackend])) { - for (uint8_t i = 0; i < LUS::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size(); i++) { - auto backend = LUS::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->data()[i]; - if (ImGui::Selectable(audioBackendNames[backend], backend == currentAudioBackend)) { - LUS::Context::GetInstance()->GetAudio()->SetAudioBackend(backend); - } - } - ImGui::EndCombo(); - } - if (LUS::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { - UIWidgets::ReEnableComponent(""); - } + DrawSettingsMenu(); - ImGui::EndMenu(); - } + ImGui::SetCursorPosY(0.0f); + + DrawEnhancementsMenu(); + + ImGui::SetCursorPosY(0.0f); + + DrawCheatsMenu(); + + ImGui::SetCursorPosY(0.0f); + + DrawDebugMenu(); - if (GameUI::mInputEditorWindow) { - if (ImGui::Button("Controller Mapping", ImVec2 (-1.0f, 0.0f))) { - GameUI::mInputEditorWindow->ToggleVisibility(); - } - } - LUS::Context::GetInstance()->GetWindow()->GetGui()->GetGameOverlay()->DrawSettings(); - ImGui::EndMenu(); - } ImGui::EndMenuBar(); } } \ No newline at end of file diff --git a/src/port/ui/ResolutionEditor.cpp b/src/port/ui/ResolutionEditor.cpp new file mode 100644 index 00000000..3d5293d4 --- /dev/null +++ b/src/port/ui/ResolutionEditor.cpp @@ -0,0 +1,421 @@ +#include "ResolutionEditor.h" +#include "UIWidgets.h" + +#include +#include +#include + +/* Console Variables are grouped under gAdvancedResolution. (e.g. "gAdvancedResolution.Enabled") + + The following CVars are used in Libultraship and can be edited here: + - Enabled - Turns Advanced Resolution Mode on. + - AspectRatioX, AspectRatioY - Aspect ratio controls. To toggle off, set either to zero. + - VerticalPixelCount, VerticalResolutionToggle - Resolution controls. + - PixelPerfectMode, IntegerScale.Factor - Pixel Perfect Mode a.k.a. integer scaling controls. + (Waiting on a second PR merge on LUS for this to fully function.): + - IntegerScale.FitAutomatically - Automatic resizing for Pixel Perfect Mode. + - IntegerScale.NeverExceedBounds - Prevents manual resizing from exceeding screen bounds. + + The following CVars are also implemented in LUS for niche use cases: + - IgnoreAspectCorrection - Stretch framebuffer to fill screen. + This is something of a power-user setting for niche setups that most people won't need or care about, + but may be useful if playing the Switch/Wii U ports on a 4:3 television. + - IntegerScale.ExceedBoundsBy - Offset the max screen bounds, usually by +1. + This isn't that useful at the moment. +*/ + +namespace AdvancedResolutionSettings { + enum setting { UPDATE_aspectRatioX, UPDATE_aspectRatioY, UPDATE_verticalPixelCount }; + + const char* aspectRatioPresetLabels[] = { + "Off", "Custom", "Original (4:3)", "Widescreen (16:9)", "Nintendo 3DS (5:3)", "16:10 (8:5)", "Ultrawide (21:9)" + }; + const float aspectRatioPresetsX[] = { 0.0f, 12.0f, 4.0f, 16.0f, 5.0f, 16.0f, 21.0f }; + const float aspectRatioPresetsY[] = { 0.0f, 9.0f, 3.0f, 9.0f, 3.0f, 10.0f, 9.0f }; + const int default_aspectRatio = 1; // Default combo list option + + const char* pixelCountPresetLabels[] = { "Custom", "Native N64 (240p)", "2x (480p)", "3x (720p)", "4x (960p)", + "5x (1200p)", "6x (1440p)", "Full HD (1080p)", "4K (2160p)" }; + const int pixelCountPresets[] = { 480, 240, 480, 720, 960, 1200, 1440, 1080, 2160, 480 }; + const int default_pixelCount = 0; // Default combo list option + + const uint32_t minVerticalPixelCount = 240; // see: LUS::AdvancedResolution() + const uint32_t maxVerticalPixelCount = 4320; + + const unsigned short default_maxIntegerScaleFactor = 6; // Default size of Integer scale factor slider. + + const float enhancementSpacerHeight = 19.0f; +// This will need to be determined more intelligently when Hi-DPI UI support is added. + + void AdvancedResolutionSettingsWindow::InitElement() { + } + + void AdvancedResolutionSettingsWindow::DrawElement() { + ImGui::SetNextWindowSize(ImVec2(497, 532), ImGuiCond_FirstUseEver); + if (ImGui::Begin("Advanced Resolution Settings", &mIsVisible)) { + // Initialise update flags. + bool update[sizeof(setting)]; + for (unsigned short i = 0; i < sizeof(setting); i++) + update[i] = false; + static short updateCountdown = 0; + short countdownStartingValue = CVarGetInteger("gInterpolationFPS", 20) / 2; // half of a second, in frames. + + // Initialise integer scale bounds. + short max_integerScaleFactor = default_maxIntegerScaleFactor; // default value, which may or may not get + // overridden depending on viewport res + + short integerScale_maximumBounds = 1; // can change when window is resized + // This is mostly just for UX purposes, as Fit Automatically logic is part of LUS. + if (((float)gfx_current_game_window_viewport.width / gfx_current_game_window_viewport.height) > + ((float)gfx_current_dimensions.width / gfx_current_dimensions.height)) { + // Scale to window height + integerScale_maximumBounds = gfx_current_game_window_viewport.height / gfx_current_dimensions.height; + } else { + // Scale to window width + integerScale_maximumBounds = gfx_current_game_window_viewport.width / gfx_current_dimensions.width; + } + // Lower-clamping maximum bounds value to 1 is no-longer necessary as that's accounted for in LUS. + // Letting it go below 1 in this Editor will even allow for checking if screen bounds are being exceeded. + if (default_maxIntegerScaleFactor < integerScale_maximumBounds) { + max_integerScaleFactor = + integerScale_maximumBounds + CVarGetInteger("gAdvancedResolution.IntegerScale.ExceedBoundsBy", 0); + } + + // Stored Values for non-UIWidgets elements + static float aspectRatioX = CVarGetFloat("gAdvancedResolution.AspectRatioX", 16.0f); + static float aspectRatioY = CVarGetFloat("gAdvancedResolution.AspectRatioY", 9.0f); + static int verticalPixelCount = CVarGetInteger("gAdvancedResolution.VerticalPixelCount", 480); + // Combo List defaults + static int item_aspectRatio = default_aspectRatio; + static int item_pixelCount = default_pixelCount; + // Additional settings + static bool showHorizontalResField = false; + static int horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + +#ifdef __APPLE__ + ImGui::Text("Note: these settings may behave incorrectly on Apple Retina Displays."); + UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); +#endif + + // The original resolution slider (for convenience) + if (UIWidgets::EnhancementSliderFloat("Internal Resolution: %d %%", "##IMul", "gInternalResolution", 0.5f, 2.0f, + "", 1.0f, true, true, + (CVarGetInteger("gAdvancedResolution.VerticalResolutionToggle", 0) && + CVarGetInteger("gAdvancedResolution.Enabled", 0)) || + CVarGetInteger("gLowResMode", 0))) { + LUS::Context::GetInstance()->GetWindow()->SetResolutionMultiplier(CVarGetFloat("gInternalResolution", 1)); + } + UIWidgets::Tooltip("Multiplies your output resolution by the value entered, as a more intensive but effective " + "form of anti-aliasing"); // Description pulled from SohMenuBar.cpp + + // N64 Mode toggle (again for convenience) + // UIWidgets::PaddedEnhancementCheckbox("(Enhancements>Graphics) N64 Mode", "gLowResMode", false, false, false, + // "", UIWidgets::CheckboxGraphics::Cross, false); + + UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + // Activator + UIWidgets::PaddedEnhancementCheckbox("Enable advanced settings.", "gAdvancedResolution.Enabled", false, false, + false, "", UIWidgets::CheckboxGraphics::Cross, false); + // Error/Warning display + if (!CVarGetInteger("gLowResMode", 0)) { + if (IsDroppingFrames()) { // Significant frame drop warning + ImGui::TextColored({ 0.85f, 0.85f, 0.0f, 1.0f }, + ICON_FA_EXCLAMATION_TRIANGLE " Significant frame rate (FPS) drops may be occuring."); + UIWidgets::Spacer(2); + } else { // No warnings + UIWidgets::Spacer(enhancementSpacerHeight); + } + } else { // N64 Mode warning + ImGui::TextColored({ 0.0f, 0.85f, 0.85f, 1.0f }, + ICON_FA_QUESTION_CIRCLE " \"N64 Mode\" is overriding these settings."); + ImGui::SameLine(); + if (ImGui::Button("Click to disable")) { + CVarSetInteger("gLowResMode", (int)false); + CVarSave(); + } + } + // Resolution visualiser + ImGui::Text("Viewport dimensions: %d x %d", gfx_current_game_window_viewport.width, + gfx_current_game_window_viewport.height); + ImGui::Text("Internal resolution: %d x %d", gfx_current_dimensions.width, gfx_current_dimensions.height); + + UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + + // Aspect Ratio + ImGui::Text("Force aspect ratio:"); + ImGui::SameLine(); + ImGui::TextColored({ 0.75f, 0.75f, 0.75f, 1.0f }, "(Select \"Off\" to disable.)"); + if (ImGui::Combo(" ", &item_aspectRatio, aspectRatioPresetLabels, + IM_ARRAYSIZE(aspectRatioPresetLabels)) && + item_aspectRatio != default_aspectRatio) { // don't change anything if "Custom" is selected. + aspectRatioX = aspectRatioPresetsX[item_aspectRatio]; + aspectRatioY = aspectRatioPresetsY[item_aspectRatio]; + update[UPDATE_aspectRatioX] = true; + update[UPDATE_aspectRatioY] = true; + + if (showHorizontalResField) { + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + } + } + if (item_aspectRatio == default_aspectRatio && !showHorizontalResField) { + // Declaring the Y input interaction in particular as a variable beforehand + // will prevent a bug where the Y field would disappear when modifying X. + bool inputX = ImGui::InputFloat("X", &aspectRatioX, 0.1f, 1.0f, "%.3f"); + bool inputY = ImGui::InputFloat("Y", &aspectRatioY, 0.1f, 1.0f, "%.3f"); + if (inputX || inputY) { + item_aspectRatio = default_aspectRatio; + update[UPDATE_aspectRatioX] = true; + update[UPDATE_aspectRatioY] = true; + } + } else if (showHorizontalResField) { // Show calculated aspect ratio + if (item_aspectRatio) { + UIWidgets::Spacer(2); + float resolvedAspectRatio = (float)gfx_current_dimensions.height / gfx_current_dimensions.width; + ImGui::Text("Aspect ratio: %.4f", resolvedAspectRatio); + } else { + UIWidgets::Spacer(enhancementSpacerHeight); + } + } + + UIWidgets::Spacer(0); + // Vertical Resolution + UIWidgets::PaddedEnhancementCheckbox("Set fixed vertical resolution (disables Resolution slider)", + "gAdvancedResolution.VerticalResolutionToggle", true, false, false, "", + UIWidgets::CheckboxGraphics::Cross, false); + UIWidgets::Tooltip( + "Override the resolution scale slider and use the settings below, irrespective of window size."); + if (ImGui::Combo("Pixel Count Presets", &item_pixelCount, pixelCountPresetLabels, + IM_ARRAYSIZE(pixelCountPresetLabels)) && + item_pixelCount != default_pixelCount) { // don't change anything if "Custom" is selected. + verticalPixelCount = pixelCountPresets[item_pixelCount]; + update[UPDATE_verticalPixelCount] = true; + + if (showHorizontalResField) { + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + } + } + // Horizontal Resolution, if visibility is enabled for it. + if (showHorizontalResField) { + // Only show the field if Aspect Ratio is being enforced. + if ((aspectRatioX > 0.0f) && (aspectRatioY > 0.0f)) { + // So basically we're "faking" this one by setting aspectRatioX instead. + if (ImGui::InputInt("Horiz. Pixel Count", &horizontalPixelCount, 8, 320)) { + item_aspectRatio = default_aspectRatio; + if (horizontalPixelCount < (minVerticalPixelCount / 3.0f) * 4.0f) { + horizontalPixelCount = (minVerticalPixelCount / 3.0f) * 4.0f; + } + aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; + update[UPDATE_aspectRatioX] = true; + } + } else { // Display a notice instead. + ImGui::TextColored({ 0.0f, 0.85f, 0.85f, 1.0f }, + ICON_FA_QUESTION_CIRCLE " \"Force aspect ratio\" required."); + // ImGui::Text(" "); + ImGui::SameLine(); + if (ImGui::Button("Click to resolve")) { + item_aspectRatio = default_aspectRatio; // Set it to Custom + aspectRatioX = aspectRatioPresetsX[2]; // but use the 4:3 defaults + aspectRatioY = aspectRatioPresetsY[2]; + update[UPDATE_aspectRatioX] = true; + update[UPDATE_aspectRatioY] = true; + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + } + } + } + // Vertical Resolution part 2 + if (ImGui::InputInt("Vertical Pixel Count", &verticalPixelCount, 8, 240)) { + item_pixelCount = default_pixelCount; + update[UPDATE_verticalPixelCount] = true; + + // Account for the natural instinct to enter horizontal first. + // Ignore vertical resolutions that are below the lower clamp constant. + if (showHorizontalResField && !(verticalPixelCount < minVerticalPixelCount)) { + aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; + update[UPDATE_aspectRatioX] = true; + } + } + + UIWidgets::Spacer(0); + // UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + + // Integer scaling settings group + if (ImGui::CollapsingHeader("Integer Scaling Settings")) { + // Pixel-perfect Mode + UIWidgets::PaddedEnhancementCheckbox("Pixel-perfect Mode", "gAdvancedResolution.PixelPerfectMode", true, + true, + !CVarGetInteger("gAdvancedResolution.VerticalResolutionToggle", 0), "", + UIWidgets::CheckboxGraphics::Cross, false); + UIWidgets::Tooltip("Don't scale image to fill window."); + if (!CVarGetInteger("gAdvancedResolution.VerticalResolutionToggle", 0)) { + CVarSetInteger("gAdvancedResolution.PixelPerfectMode", (int)false); + CVarSave(); + } + + // Integer Scaling + UIWidgets::EnhancementSliderInt("Integer scale factor: %d", "##ARSIntScale", + "gAdvancedResolution.IntegerScale.Factor", 1, max_integerScaleFactor, "%d", + 1, true, + !CVarGetInteger("gAdvancedResolution.PixelPerfectMode", 0) || + CVarGetInteger("gAdvancedResolution.IntegerScale.FitAutomatically", 0)); + UIWidgets::Tooltip("Integer scales the image. Only available in pixel-perfect mode."); + // Display warning if size is being clamped or if framebuffer is larger than viewport. + if (CVarGetInteger("gAdvancedResolution.PixelPerfectMode", 0) && + (CVarGetInteger("gAdvancedResolution.IntegerScale.NeverExceedBounds", 1) && + CVarGetInteger("gAdvancedResolution.IntegerScale.Factor", 1) > integerScale_maximumBounds)) { + ImGui::SameLine(); + ImGui::TextColored({ 0.85f, 0.85f, 0.0f, 1.0f }, ICON_FA_EXCLAMATION_TRIANGLE " Window exceeded."); + } + + UIWidgets::PaddedEnhancementCheckbox("Automatically scale image to fit viewport", + "gAdvancedResolution.IntegerScale.FitAutomatically", true, true, + !CVarGetInteger("gAdvancedResolution.PixelPerfectMode", 0), "", + UIWidgets::CheckboxGraphics::Cross, false); + UIWidgets::Tooltip("Automatically sets scale factor to fit window. Only available in pixel-perfect mode."); + if (CVarGetInteger("gAdvancedResolution.IntegerScale.FitAutomatically", 0)) { + // This is just here to update the value shown on the slider. + // The function in LUS to handle this setting will ignore IntegerScaleFactor while active. + CVarSetInteger("gAdvancedResolution.IntegerScale.Factor", integerScale_maximumBounds); + // CVarSave(); + } + } + + UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + + // Collapsible panel for additional settings + if (ImGui::CollapsingHeader("Additional Settings")) { + UIWidgets::Spacer(0); +#if defined(__SWITCH__) || defined(__WIIU__) + // Disable aspect correction, stretching the framebuffer to fill the viewport. + // This option is only really needed on systems limited to 16:9 TV resolutions, such as consoles. + // The associated CVar is still functional on PC platforms if you want to use it though. + UIWidgets::PaddedEnhancementCheckbox("Disable aspect correction and stretch the output image.\n" + "(Might be useful for 4:3 televisions!)\n" + "Not available in Pixel Perfect Mode.", + "gAdvancedResolution.IgnoreAspectCorrection", false, true, + CVarGetInteger("gAdvancedResolution.PixelPerfectMode", 0), "", + UIWidgets::CheckboxGraphics::Cross, false); +#else + if (CVarGetInteger("gAdvancedResolution.IgnoreAspectCorrection", 0)) { + // This setting is intentionally not exposed on PC platforms, + // but may be accidentally activated for varying reasons. + // Having this button should hopefully prevent support headaches. + ImGui::TextColored({ 0.0f, 0.85f, 0.85f, 1.0f }, ICON_FA_QUESTION_CIRCLE + " If the image is stretched and you don't know why, click this."); + if (ImGui::Button("Click to reenable aspect correction.")) { + CVarSetInteger("gAdvancedResolution.IgnoreAspectCorrection", (int)false); + CVarSave(); + } + UIWidgets::Spacer(2); + } +#endif + + if (ImGui::Checkbox("Show a horizontal resolution field.", &showHorizontalResField)) { + if (!showHorizontalResField && (aspectRatioX > 0.0f)) { // when turning this setting off + // Refresh relevant values + aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + } else { // when turning this setting on + item_aspectRatio = default_aspectRatio; + if (aspectRatioX > 0.0f) { + // Refresh relevant values in the opposite order + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; + } + } + update[UPDATE_aspectRatioX] = true; + } + + UIWidgets::PaddedEnhancementCheckbox( + "Don't allow integer scaling to exceed screen bounds.\n" + "(Makes screen bounds take priority over specified factor.)", + "gAdvancedResolution.IntegerScale.NeverExceedBounds", true, false, + !CVarGetInteger("gAdvancedResolution.PixelPerfectMode", 0) || + CVarGetInteger("gAdvancedResolution.IntegerScale.FitAutomatically", 0), + "", UIWidgets::CheckboxGraphics::Cross, true); + + if (!CVarGetInteger("gAdvancedResolution.IntegerScale.NeverExceedBounds", 1) || + CVarGetInteger("gAdvancedResolution.IntegerScale.ExceedBoundsBy", 0)) { + ImGui::TextColored({ 0.0f, 0.85f, 0.85f, 1.0f }, + " " ICON_FA_QUESTION_CIRCLE + " A scroll bar may become visible if screen bounds are exceeded."); + // Another helpful button for an unused CVar. + if (CVarGetInteger("gAdvancedResolution.IntegerScale.ExceedBoundsBy", 0)) { + if (ImGui::Button("Click to reset an unused CVar that may be causing this.")) { + CVarSetInteger("gAdvancedResolution.IntegerScale.ExceedBoundsBy", 0); + CVarSave(); + } + } + } else { + UIWidgets::Spacer(enhancementSpacerHeight); + } + + // I've ended up dummying this one out because it doesn't function in a satisfactory way. + // Consider this idea on the table, but I don't deem it an important enough feature to push for. + /* + UIWidgets::PaddedEnhancementCheckbox("Allow integer scale factor to go 1x above maximum screen bounds.", + "gAdvancedResolution.IntegerScale.ExceedBoundsBy", false, false, + !CVarGetInteger("gAdvancedResolution.PixelPerfectMode", 0), "", + UIWidgets::CheckboxGraphics::Cross, false); + if (CVarGetInteger("gAdvancedResolution.IntegerScale.ExceedBoundsBy", 0)) { + ImGui::TextColored({ 0.0f, 0.85f, 0.85f, 1.0f }, + " " ICON_FA_QUESTION_CIRCLE + " A scroll bar may become visible if screen bounds are exceeded."); + }*/ + + } // end of Additional Settings + + // Clamp and update the CVars that don't use UIWidgets + if (IsBoolArrayTrue(update)) { + if (update[UPDATE_aspectRatioX]) { + if (aspectRatioX < 0.0f) { + aspectRatioX = 0.0f; + } + CVarSetFloat("gAdvancedResolution.AspectRatioX", aspectRatioX); + } + if (update[UPDATE_aspectRatioY]) { + if (aspectRatioY < 0.0f) { + aspectRatioY = 0.0f; + } + CVarSetFloat("gAdvancedResolution.AspectRatioY", aspectRatioY); + } + if (update[UPDATE_verticalPixelCount]) { + // There's a upper and lower clamp on the Libultraship side too, + // so clamping it here is purely visual, so the vertical resolution field reflects it. + if (verticalPixelCount < minVerticalPixelCount) { + verticalPixelCount = minVerticalPixelCount; + } + if (verticalPixelCount > maxVerticalPixelCount) { + verticalPixelCount = maxVerticalPixelCount; + } + CVarSetInteger("gAdvancedResolution.VerticalPixelCount", verticalPixelCount); + } + // Delay saving this set of CVars by a predetermined length of time, in frames. + updateCountdown = countdownStartingValue; + } + if (updateCountdown > 0) { + updateCountdown--; + } else { + CVarSave(); + } + } + ImGui::End(); + } + + void AdvancedResolutionSettingsWindow::UpdateElement() { + } + + bool AdvancedResolutionSettingsWindow::IsDroppingFrames() { + // a rather imprecise way of checking for frame drops. + // but it's mostly there to inform the player of large drops. + const short targetFPS = CVarGetInteger("gInterpolationFPS", 20); + const float threshold = targetFPS / 20.0f + 4.1f; + return ImGui::GetIO().Framerate < targetFPS - threshold; + } + + bool AdvancedResolutionSettingsWindow::IsBoolArrayTrue(bool* foo) { + for (unsigned short i = 0; i < sizeof(&foo); i++) + if (&foo[i]) + return true; + return false; + } +} // namespace AdvancedResolutionSettings \ No newline at end of file diff --git a/src/port/ui/ResolutionEditor.h b/src/port/ui/ResolutionEditor.h new file mode 100644 index 00000000..38af5607 --- /dev/null +++ b/src/port/ui/ResolutionEditor.h @@ -0,0 +1,19 @@ +#pragma once +#include + +namespace AdvancedResolutionSettings { + class AdvancedResolutionSettingsWindow : public LUS::GuiWindow { + private: + bool IsDroppingFrames(); + + protected: + bool IsBoolArrayTrue(bool*); + + public: + using LUS::GuiWindow::GuiWindow; + + void InitElement() override; + void DrawElement() override; + void UpdateElement() override; + }; +} // namespace AdvancedResolutionSettings \ No newline at end of file diff --git a/src/port/ui/UIWidgets.cpp b/src/port/ui/UIWidgets.cpp index a5a2f934..cef68266 100644 --- a/src/port/ui/UIWidgets.cpp +++ b/src/port/ui/UIWidgets.cpp @@ -10,7 +10,6 @@ #define IMGUI_DEFINE_MATH_OPERATORS #include #include - #include namespace UIWidgets { @@ -318,7 +317,7 @@ namespace UIWidgets { changed = true; } ImGui::PopItemWidth(); - + if (PlusMinusButton) { std::string PlusBTNName = " + ##" + std::string(cvarName); ImGui::SameLine(); @@ -390,7 +389,7 @@ namespace UIWidgets { changed = true; } ImGui::PopItemWidth(); - + if (PlusMinusButton) { std::string PlusBTNName = " + ##" + std::string(cvarName); ImGui::SameLine(); @@ -474,7 +473,7 @@ namespace UIWidgets { } ImGui::SameLine(); ImGui::Text("%s", text); - + return ret; } @@ -596,4 +595,437 @@ namespace UIWidgets { } ImGui::PopID(); } + + // V2 + + void PushStyleMenu(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(color.x, color.y, color.z, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_PopupBg, UIWidgets::Colors::DarkGray); + ImGui::PushStyleColor(ImGuiCol_Border, UIWidgets::Colors::DarkGray); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(8.0f, 15.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, 3.0f); + } + + void PopStyleMenu() { + ImGui::PopStyleVar(2); + ImGui::PopStyleColor(4); + } + + bool BeginMenu(const char* label, const ImVec4& color) { + bool dirty = false; + PushStyleMenu(color); + if (ImGui::BeginMenu(label)) { + dirty = true; + } + PopStyleMenu(); + return dirty; + } + + void PushStyleMenuItem(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(20.0f, 15.0f)); + } + + void PopStyleMenuItem() { + ImGui::PopStyleVar(1); + ImGui::PopStyleColor(1); + } + + bool MenuItem(const char* label, const char* shortcut, const ImVec4& color) { + bool dirty = false; + PushStyleMenuItem(color); + if (ImGui::MenuItem(label, shortcut)) { + dirty = true; + } + PopStyleMenuItem(); + return dirty; + } + + void PushStyleButton(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 8.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 5.0f); + } + + void PopStyleButton() { + ImGui::PopStyleVar(3); + ImGui::PopStyleColor(4); + } + + bool Button(const char* label, const ButtonOptions& options) { + ImGui::BeginDisabled(options.disabled); + PushStyleButton(options.color); + bool dirty = ImGui::Button(label, options.size); + PopStyleButton(); + ImGui::EndDisabled(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(options.disabledTooltip, "") != 0) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip)); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(options.tooltip, "") != 0) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip)); + } + return dirty; + } + + bool WindowButton(const char* label, const char* cvarName, std::shared_ptr windowPtr, const ButtonOptions& options) { + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0, 0)); + std::string buttonText = label; + bool dirty = false; + if (CVarGetInteger(cvarName, 0)) { + buttonText = ICON_FA_WINDOW_CLOSE " " + buttonText; + } else { + buttonText = ICON_FA_EXTERNAL_LINK_SQUARE " " + buttonText; + } + if (Button(buttonText.c_str(), options)) { + windowPtr->ToggleVisibility(); + dirty = true; + } + ImGui::PopStyleVar(); + return dirty; + } + + void PushStyleCheckbox(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); + ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(1.0f, 1.0f, 1.0f, 0.7f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 6.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 5.0f); + } + + void PopStyleCheckbox() { + ImGui::PopStyleVar(3); + ImGui::PopStyleColor(5); + } + + bool Checkbox(const char* label, bool* value, const CheckboxOptions& options) { + ImGui::PushID(label); + bool dirty = false; + float startX = ImGui::GetCursorPosX(); + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + ImGui::BeginDisabled(options.disabled); + PushStyleCheckbox(options.color); + if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition == LabelPosition::Near || options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::GetStyle().FramePadding.x * 2 - ImGui::GetStyle().ItemSpacing.x); + } else if (options.labelPosition == LabelPosition::Above) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x); + ImGui::Text(label); + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::GetStyle().FramePadding.x * 2 - ImGui::GetStyle().ItemSpacing.x); + } + } else if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text(label); + } + } + dirty = ImGui::Checkbox(invisibleLabel, value); + if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x - ImGui::GetStyle().FramePadding.x * 2 - ImGui::GetStyle().ItemSpacing.x * 2); + ImGui::Text(label); + } else if (options.labelPosition == LabelPosition::Far) { + ImGui::SameLine(); + ImGui::SetCursorPosX(startX); + ImGui::Text(label); + } + } else if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + ImGui::Text(label); + } else if (options.labelPosition == LabelPosition::Far) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x); + ImGui::Text(label); + } + } + PopStyleCheckbox(); + ImGui::EndDisabled(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(options.disabledTooltip, "") != 0) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip)); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(options.tooltip, "") != 0) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip)); + } + ImGui::PopID(); + return dirty; + } + + bool CVarCheckbox(const char* label, const char* cvarName, const CheckboxOptions& options) { + bool dirty = false; + bool value = (bool)CVarGetInteger(cvarName, options.defaultValue); + if (Checkbox(label, &value, options)) { + CVarSetInteger(cvarName, value); + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + dirty = true; + } + return dirty; + } + + void PushStyleCombobox(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(color.x, color.y, color.z, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 6.0f)); + } + + void PopStyleCombobox() { + ImGui::PopStyleVar(4); + ImGui::PopStyleColor(9); + } + + bool Combobox(const char* label, uint8_t* value, std::span comboArray, const ComboboxOptions& options) { + bool dirty = false; + float startX = ImGui::GetCursorPosX(); + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleCombobox(options.color); + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text(label); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + } else if (options.labelPosition == LabelPosition::Near) { + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x - ImGui::GetStyle().ItemSpacing.x * 2); + } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + ImGui::SetNextItemWidth(ImGui::CalcTextSize(comboArray[*value]).x + ImGui::GetStyle().FramePadding.x * 4 + ImGui::GetStyle().ItemSpacing.x); + } + } else if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x); + ImGui::Text(label); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + } else if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(ImGui::CalcTextSize(label).x + ImGui::GetStyle().ItemSpacing.x * 2); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + float width = ImGui::CalcTextSize(comboArray[*value]).x + ImGui::GetStyle().FramePadding.x * 4; + ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + } + } + if (ImGui::BeginCombo(invisibleLabel, comboArray[*value], options.flags)) { + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10.0f, 10.0f)); + for (uint8_t i = 0; i < comboArray.size(); i++) { + if (strlen(comboArray[i]) > 1) { + if (ImGui::Selectable(comboArray[i], i == *value)) { + *value = i; + dirty = true; + } + } + } + ImGui::PopStyleVar(); + ImGui::EndCombo(); + } + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + ImGui::Text(label); + } else if (options.labelPosition == LabelPosition::Far) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x); + ImGui::Text(label); + } + } else if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition == LabelPosition::Near || options.labelPosition == LabelPosition::Far) { + ImGui::SameLine(startX); + ImGui::Text(label); + } + } + PopStyleCombobox(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(options.disabledTooltip, "") != 0) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip)); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(options.tooltip, "") != 0) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip)); + } + ImGui::PopID(); + return dirty; + } + + bool CVarCombobox(const char* label, const char* cvarName, std::span comboArray, const ComboboxOptions& options) { + bool dirty = false; + uint8_t value = (uint8_t)CVarGetInteger(cvarName, options.defaultIndex); + if (Combobox(label, &value, comboArray, options)) { + CVarSetInteger(cvarName, value); + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + dirty = true; + } + return dirty; + } + + void PushStyleSlider(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_SliderGrab, ImVec4(1.0, 1.0, 1.0, 0.4f)); + ImGui::PushStyleColor(ImGuiCol_SliderGrabActive, ImVec4(1.0, 1.0, 1.0, 0.5f)); + ImGui::PushStyleVar(ImGuiStyleVar_GrabRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 8.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + } + + void PopStyleSlider() { + ImGui::PopStyleVar(4); + ImGui::PopStyleColor(6); + } + + bool SliderInt(const char* label, int32_t* value, int32_t min, int32_t max, const IntSliderOptions& options) { + bool dirty = false; + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleSlider(options.color); + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text(label, *value); + } + } else if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x); + ImGui::Text(label, *value); + } + } + if (options.showButtons) { + if (Button("-", { .color = options.color, .size = Sizes::Inline }) && *value > min) { + *value -= options.step; + if (*value < min) *value = min; + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + dirty = true; + } + ImGui::SameLine(0, 3.0f); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize("+").x + 20.0f + 3.0f)); + } else { + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + } + if (ImGui::SliderScalar(invisibleLabel, ImGuiDataType_S32, value, &min, &max, options.format, options.flags)) { + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + dirty = true; + } + if (options.showButtons) { + ImGui::SameLine(0, 3.0f); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (Button("+", { .color = options.color, .size = Sizes::Inline }) && *value < max) { + *value += options.step; + if (*value > max) *value = max; + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + dirty = true; + } + } + PopStyleSlider(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(options.disabledTooltip, "") != 0) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip)); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(options.tooltip, "") != 0) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip)); + } + ImGui::PopID(); + return dirty; + } + + bool CVarSliderInt(const char* label, const char* cvarName, int32_t min, int32_t max, const int32_t defaultValue, const IntSliderOptions& options) { + bool dirty = false; + int32_t value = CVarGetInteger(cvarName, defaultValue); + if (SliderInt(label, &value, min, max, options)) { + CVarSetInteger(cvarName, value); + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + dirty = true; + } + return dirty; + } + + bool SliderFloat(const char* label, float* value, float min, float max, const FloatSliderOptions& options) { + bool dirty = false; + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + float valueToDisplay = options.isPercentage ? *value * 100.0f : *value; + float maxToDisplay = options.isPercentage ? max * 100.0f : max; + float minToDisplay = options.isPercentage ? min * 100.0f : min; + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleSlider(options.color); + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text(label, valueToDisplay); + } + } else if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x); + ImGui::Text(label, valueToDisplay); + } + } + if (options.showButtons) { + if (Button("-", { .color = options.color, .size = Sizes::Inline }) && *value > min) { + *value -= options.step; + if (*value < min) *value = min; + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + dirty = true; + } + ImGui::SameLine(0, 3.0f); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize("+").x + 20.0f + 3.0f)); + } else { + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + } + if (ImGui::SliderScalar(invisibleLabel, ImGuiDataType_Float, &valueToDisplay, &minToDisplay, &maxToDisplay, options.format, options.flags)) { + *value = options.isPercentage ? valueToDisplay / 100.0f : valueToDisplay; + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + dirty = true; + } + if (options.showButtons) { + ImGui::SameLine(0, 3.0f); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (Button("+", { .color = options.color, .size = Sizes::Inline }) && *value < max) { + *value += options.step; + if (*value > max) *value = max; + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + dirty = true; + } + } + PopStyleSlider(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(options.disabledTooltip, "") != 0) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip)); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(options.tooltip, "") != 0) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip)); + } + ImGui::PopID(); + return dirty; + } + + bool CVarSliderFloat(const char* label, const char* cvarName, float min, float max, const float defaultValue, const FloatSliderOptions& options) { + bool dirty = false; + float value = CVarGetFloat(cvarName, defaultValue); + if (SliderFloat(label, &value, min, max, options)) { + CVarSetFloat(cvarName, value); + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + dirty = true; + } + return dirty; + } } diff --git a/src/port/ui/UIWidgets.h b/src/port/ui/UIWidgets.h index bdaf63b4..2d398f61 100644 --- a/src/port/ui/UIWidgets.h +++ b/src/port/ui/UIWidgets.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace UIWidgets { @@ -87,4 +88,122 @@ namespace UIWidgets { void DrawFlagArray32(const std::string& name, uint32_t& flags); void DrawFlagArray16(const std::string& name, uint16_t& flags); void DrawFlagArray8(const std::string& name, uint8_t& flags); + + // V2 + namespace Colors { + const ImVec4 White = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + const ImVec4 Gray = ImVec4(0.4f, 0.4f, 0.4f, 1.0f); + const ImVec4 DarkGray = ImVec4(0.1f, 0.1f, 0.1f, 1.0f); + const ImVec4 Indigo = ImVec4(0.24f, 0.31f, 0.71f, 1.0f); + const ImVec4 Red = ImVec4(0.5f, 0.0f, 0.0f, 1.0f); + const ImVec4 DarkRed = ImVec4(0.3f, 0.0f, 0.0f, 1.0f); + const ImVec4 LightGreen = ImVec4(0.0f, 0.7f, 0.0f, 1.0f); + const ImVec4 Green = ImVec4(0.0f, 0.5f, 0.0f, 1.0f); + const ImVec4 DarkGreen = ImVec4(0.0f, 0.3f, 0.0f, 1.0f); + const ImVec4 Yellow = ImVec4(1.0f, 0.627f, 0.0f, 1.0f); + }; + + namespace Sizes { + const ImVec2 Inline = ImVec2(0.0f, 0.0f); + const ImVec2 Fill = ImVec2(-1.0f, 0.0f); + } + + enum LabelPosition { + Near, + Far, + Above, + None, + Within, + }; + + enum ComponentAlignment { + Left, + Right, + }; + + void PushStyleMenu(const ImVec4& color = Colors::Indigo); + void PopStyleMenu(); + bool BeginMenu(const char* label, const ImVec4& color = Colors::Indigo); + + void PushStyleMenuItem(const ImVec4& color = Colors::Indigo); + void PopStyleMenuItem(); + bool MenuItem(const char* label, const char* shortcut = NULL, const ImVec4& color = Colors::Indigo); + + struct ButtonOptions { + const ImVec4 color = Colors::Gray; + const ImVec2 size = Sizes::Fill; + const char* tooltip = ""; + bool disabled = false; + const char* disabledTooltip = ""; + }; + + void PushStyleButton(const ImVec4& color = Colors::Gray); + void PopStyleButton(); + bool Button(const char* label, const ButtonOptions& options = {}); + bool WindowButton(const char* label, const char* cvarName, std::shared_ptr windowPtr, const ButtonOptions& options = {}); + + struct CheckboxOptions { + const ImVec4 color = Colors::Indigo; + const char* tooltip = ""; + bool disabled = false; + const char* disabledTooltip = ""; + bool defaultValue = false; // Only applicable to CVarCheckbox + ComponentAlignment alignment = ComponentAlignment::Left; + LabelPosition labelPosition = LabelPosition::Near; + }; + + void PushStyleCheckbox(const ImVec4& color = Colors::Indigo); + void PopStyleCheckbox(); + bool Checkbox(const char* label, bool* v, const CheckboxOptions& options = {}); + bool CVarCheckbox(const char* label, const char* cvarName, const CheckboxOptions& options = {}); + + struct ComboboxOptions { + const ImVec4 color = Colors::Indigo; + const char* tooltip = ""; + bool disabled = false; + const char* disabledTooltip = ""; + uint32_t defaultIndex = 0; // Only applicable to CVarCombobox + ComponentAlignment alignment = ComponentAlignment::Left; + LabelPosition labelPosition = LabelPosition::Above; + ImGuiComboFlags flags = 0; + }; + + void PushStyleCombobox(const ImVec4& color = Colors::Indigo); + void PopStyleCombobox(); + bool Combobox(const char* label, uint8_t* value, std::span comboArray, const ComboboxOptions& options = {}); + bool CVarCombobox(const char* label, const char* cvarName, std::span comboArray, const ComboboxOptions& options = {}); + + struct IntSliderOptions { + const ImVec4 color = Colors::Gray; + const char* tooltip = ""; + bool disabled = false; + const char* disabledTooltip = ""; + bool showButtons = true; + ImGuiSliderFlags flags = 0; + const char* format = "%d"; + const uint32_t step = 1; + ComponentAlignment alignment = ComponentAlignment::Left; + LabelPosition labelPosition = LabelPosition::Above; + }; + + struct FloatSliderOptions { + const ImVec4 color = Colors::Gray; + const char* tooltip = ""; + bool disabled = false; + const char* disabledTooltip = ""; + bool showButtons = true; + ImGuiSliderFlags flags = 0; + const char* format = "%f"; + const float step = 0.01f; + bool isPercentage = false; // Multiplies visual value by 100 + ComponentAlignment alignment = ComponentAlignment::Left; + LabelPosition labelPosition = LabelPosition::Above; + }; + + void PushStyleSlider(const ImVec4& color = Colors::Indigo); + void PopStyleSlider(); + bool SliderInt(const char* label, int32_t* value, int32_t min, int32_t max, const IntSliderOptions& options = {}); + bool CVarSliderInt(const char* label, const char* cvarName, int32_t min, int32_t max, const int32_t defaultValue, const IntSliderOptions& options = {}); + bool SliderFloat(const char* label, float* value, float min, float max, const FloatSliderOptions& options = {}); + bool CVarSliderFloat(const char* label, const char* cvarName, float min, float max, const float defaultValue, const FloatSliderOptions& options = {}); } \ No newline at end of file diff --git a/text/de/courses.h b/text/de/courses.h deleted file mode 100644 index 06b1f293..00000000 --- a/text/de/courses.h +++ /dev/null @@ -1,80 +0,0 @@ -COURSE_ACTS(COURSE_BOB, _(" 1 BOB-OMBS BOMBENBERG"), - _("BESIEGE KÖNIG BOB-OMB!") , _("BESIEGE DEN SCHNELLEN KOOPA!") , _("FLIEGE ZUR SCHWEBENDEN INSEL!"), - _("FINDE DIE 8 ROTEN MÜNZEN!") , _("DURCHFLIEGE ALLE MÜNZENRINGE!") , _("BEFREIE DEN KETTENHUND!")) - -COURSE_ACTS(COURSE_WF, _(" 2 WUMMPS WUCHTWALL"), - _("BESIEGE KÖNIG WUMMP!") , _("STEIGE AUF DIE BERGFESTUNG!") , _("FLIEG INS BLAUE!"), - _("FINDE DIE 8 ROTEN MÜNZEN!") , _("WECKE DIE EULE!") , _("ZERSTÖRE DIE FELSWAND!")) - -COURSE_ACTS(COURSE_JRB, _(" 3 PIRATENBUCHT PANIK"), - _("TAUCHE IN DAS SCHIFFSWRACK!") , _("LOCKE DEN AAL KANO HERAUS!") , _("TAUCHE ZUR SCHATZHÖHLE!"), - _("FINDE DIE 8 ROTEN MÜNZEN!") , _("FLIEGE ZU DEN STEINSÄULEN!") , _("LAUFE DURCH DEN STRUDEL!")) - -COURSE_ACTS(COURSE_CCM, _(" 4 BIBBERBERG BOB"), - _("RUTSCHE AUF DER EISBAHN!") , _("FINDE DAS PINGUINBABY!") , _("BESIEGE DEN SCHNELLEN PINGUIN!"), - _("FINDE DIE 8 ROTEN MÜNZEN!") , _("BAUE EINEN SCHNEEMANN!") , _("DENKE AN DEN WANDSPRUNG!")) - -COURSE_ACTS(COURSE_BBH, _(" 5 BIG BOOS BURG"), - _("GEHE AUF GEISTERJAGD!") , _("BESUCHE BIG BOOS KARUSSEL!") , _("LÖSE DAS BÜCHEREI-RÄTSEL!"), - _("FINDE DIE 8 ROTEN MÜNZEN!") , _("KLETTERE AUF BIG BOOS BALKON!") , _("FINDE DAS AUGE IM GEHEIMRAUM!")) - -COURSE_ACTS(COURSE_HMC, _(" 6 GRÜNE GIFTGROTTE"), - _("KLETTERE AUF NESSIS RÜCKEN!") , _("FINDE DIE 8 ROTEN MÜNZEN!") , _("LAUFE AUF DEM GRUND DES SEES!"), - _("DURCHSUCHE DAS NEBELLABYRINTH!"), _("SUCHE IM NEBEL DEN NOTAUSGANG!"), _("ACHTE AUF ROLLENDE FELSEN!")) - -COURSE_ACTS(COURSE_LLL, _(" 7 LAVA LAGUNE"), - _("WERFE BIG BULLY IN DIE LAVA!") , _("WERFE DIE BULLIES IN DIE LAVA!"), _("FINDE DIE 8 ROTEN MÜNZEN!"), - _("TANZE AUF DEM BAUMSTAMM!") , _("ERKUNDE DEN VULKAN!") , _("GEWINNE IM VULKAN AN HÖHE!")) - -COURSE_ACTS(COURSE_SSL, _(" 8 WOBIWABA WÜSTE"), - _("FOLGE DEM RIESENGEIER!") , _("BRINGE LICHT IN DIE PYRAMIDE!") , _("BEGEBE DICH IN DIE PYRAMIDE!"), - _("LANDE AUF ALLEN VIER SÄULEN!") , _("FINDE DIE 8 ROTEN MÜNZEN!") , _("LÖSE DAS PYRAMIDENPUZZLE!")) - -COURSE_ACTS(COURSE_DDD, _(" 9 WILDE WASSERWERFT"), - _("ENTERE BOWSERS U-BOOT!") , _("ÖFFNE DIE TRUHEN!") , _("SPRINGE ZU DEN ROTEN MÜNZEN!"), - _("SCHWIMME DURCH DIE RINGE!") , _("FOLGE DEM FISCH!") , _("VEREINE DIE MÜTZEN!")) - -COURSE_ACTS(COURSE_SL, _("10 FROSTBEULEN FRUST"), - _("ERKLIMME DEN KOPF!") , _("SPIELE MIT BAD BULLY!") , _("WAGE DICH INS EIS!"), - _("GEHE ZUM EISSEE!") , _("FINDE DIE 8 ROTEN MÜNZEN!") , _("SCHAU IM IGLU NACH!")) - -COURSE_ACTS(COURSE_WDW, _("11 ATLANTIS AQUARIA"), - _("FOLGE DEN BLAUEN PFEILEN!") , _("SUCHE NACH DER SPITZE DER STADT!"), _("ERFORSCHE DIE HÖHEN UND TIEFEN!"), - _("BEEILE DICH - EXPRESSAUFZUG!") , _("FINDE DIE 8 ROTEN MÜNZEN!") , _("BEACHTE DAS ZEITLIMIT!")) - -COURSE_ACTS(COURSE_TTM, _("12 FLIEGENPILZ FIASKO"), - _("ERKLIMME DEN BERG!") , _("ERKUNDE DEN AFFENKÄFIG!") , _("FINDE DIE 8 ROTEN MÜNZEN!"), - _("ERFORSCHE DIE STEILWAND!") , _("HALTE AUSSCHAU AUF DER BRÜCKE!"), _("SUCHE DEN EINSAMEN PILZ!")) - -COURSE_ACTS(COURSE_THI, _("13 GULLIVER GUMBA"), - _("PFLÜCKE DIE SCHNAPP-PIRANHA!") , _("BEGIB DICH ZUR SPITZE DER INSEL!"), _("TRETE NOCH EINMAL GEGEN KOOPA AN!"), - _("LÖSE DIE 5 ITTY BITTY-RÄTSEL!") , _("FINDE DIE 8 ROTEN MÜNZEN!") , _("DREHE WIGGLER IM KREIS!")) - -COURSE_ACTS(COURSE_TTC, _("14 TICK TACK TRAUMA"), - _("ROLLE DEN KÄFIG!") , _("ACHTE AUF DAS PENDEL!") , _("LASS DIR DEN WEG ZEIGEN!"), - _("STAMPFE MÄCHTIG AUF!") , _("SPRINGE AUF DEN SCHWEBEBALKEN!"), _("FINDE DIE 8 ROTEN MÜNZEN!")) - -COURSE_ACTS(COURSE_RR, _("15 REGENBOGEN RASEREI"), - _("REISE AUF DEN REGENBÖGEN!") , _("SUCHE DAS HAUS AM HIMMEL!") , _("FINDE DIE 8 ROTEN MÜNZEN!"), - _("LASS DICH VON DER BRISE TRAGEN!"), _("ÜBERWINDE DIE MACHT DER DREIECKE!"), _("SCHAU DIR DEN REGENBOGEN AN!")) - -SECRET_STAR(COURSE_BITDW, _(" BOWSERS SCHATTENWELT")) -SECRET_STAR(COURSE_BITFS, _(" BOWSERS LAVASEE")) -SECRET_STAR(COURSE_BITS, _(" BOWSERS LUFTSCHLOSS")) -SECRET_STAR(COURSE_PSS, _(" TOADSTOOLS RUTSCHBAHN")) -SECRET_STAR(COURSE_COTMC, _(" GRÜNER SCHALTERPALAST")) -SECRET_STAR(COURSE_TOTWC, _(" ROTER SCHALTERPALAST")) -SECRET_STAR(COURSE_VCUTM, _(" BLAUER SCHALTERPALAST")) -SECRET_STAR(COURSE_WMOTR, _(" REGENBOGEN FEUERWERK")) -SECRET_STAR(COURSE_SA, _(" VERSTECKTES AQUARIUM")) -SECRET_STAR(COURSE_CAKE_END, _("")) - -CASTLE_SECRET_STARS(_(" GEHEIME STERNE")) - -EXTRA_TEXT(0, _("EIN GEHEIMER STERN DES SCHLOSSES!")) -EXTRA_TEXT(1, _("")) -EXTRA_TEXT(2, _("")) -EXTRA_TEXT(3, _("")) -EXTRA_TEXT(4, _("")) -EXTRA_TEXT(5, _("")) -EXTRA_TEXT(6, _("")) diff --git a/text/de/dialogs.h b/text/de/dialogs.h deleted file mode 100644 index fba15c16..00000000 --- a/text/de/dialogs.h +++ /dev/null @@ -1,2058 +0,0 @@ -// Parameters: dialog enum ID, (unused), lines per box, left offset, width - -DEFINE_DIALOG(DIALOG_000, 1, 6, 30, 200, _("\ -Du bist inmitten der\n\ -Kampfarena gelandet.\n\ -Sei vorsichtig!\n\ -Die von Bowser erbeuteten\n\ -Power-Sterne findest Du\n\ -in den Wandgemälden.\n\ -Sprich zuerst mit Buddy,\n\ -der rosa Bombe.\n\ -Drücke [B], um Dich mit ihr\n\ -zu unterhalten. Sie und\n\ -ihre Kolleginnen werden\n\ -Dich sicher unterstützen.\n\ -Drücke [B], um Schilder\n\ -zu lesen. Mit [A] oder [B]\n\ -kannst Du die Nachrichten\n\ -umblättern. In anderen\n\ -Kursen triffst Du weitere\n\ -Freunde, die Dir helfen.")) - -DEFINE_DIALOG(DIALOG_001, 1, 4, 95, 200, _("\ -Bewege Dich vorsichtig\n\ -durch das Gelände, damit\n\ -Du kein Opfer der\n\ -Wasserbomben wirst.\n\ -Die gegnerischen Bob-\n\ -Ombs lieben den Kampf\n\ -und erfinden immer neue\n\ -Angriffsvarianten.\n\ -Sie terrorisieren uns,\n\ -seit ihr König den\n\ -Power-Stern in die\n\ -Hände bekommen hat.\n\ -Hilf uns, den Stern\n\ -zurückzuholen! Gehe zur\n\ -Spitze des Berges, um\n\ -König Bob-Omb zu finden.\n\ -Kehre zu mir zurück,\n\ -wenn es Dir gelungen ist,\n\ -ihm den Stern abzujagen.\n\ -Viel Glück...")) - -DEFINE_DIALOG(DIALOG_002, 1, 4, 95, 200, _("\ -Hallo! Sei wachsam, Du\n\ -befindest Dich inmitten\n\ -einer Schlacht. Aber ich\n\ -gebe Dir ein paar Tips:\n\ -Überquere die beiden\n\ -Brücken und achte auf\n\ -herunterfallende\n\ -Wasserbomben.\n\ -König Bob-Omb ist\n\ -äußerst gefährlich.\n\ -Laß Dich nicht von\n\ -ihm erwischen.\n\ -Wir sind die wahren\n\ -Bob-Ombs und werden Dir\n\ -helfen. Sprich mit uns,\n\ -wann immer Du möchtest.")) - -DEFINE_DIALOG(DIALOG_003, 1, 5, 95, 200, _("\ -Herzlichen Dank, Mario!\n\ -Du hast es diesem\n\ -Tyrannen gezeigt. Aber\n\ -Dein Kampf hat gerade\n\ -erst begonnen.\n\ -Andere Fieslinge besitzen\n\ -weitere Sterne, die Dir\n\ -die Wege zu neuen Welten\n\ -öffnen. Allerdings mußt\n\ -Du sie zuerst besiegen.\n\ -Meine Bob-Omb-Kollegen\n\ -wissen bereits Bescheid.\n\ -Sprich mit ihnen und\n\ -Du darfst bestimmt ihre\n\ -Kanonen benutzen.")) - -DEFINE_DIALOG(DIALOG_004, 1, 3, 95, 200, _("\ -Wir sind friedliebende\n\ -Bob-Ombs und mögen keine\n\ -Kanonen.\n\ -Wir stellen sie Dir aber\n\ -gerne für Luftreisen\n\ -zur Verfügung.\n\ -Alle Kanonen dieses Kurses\n\ -sind für Dich präpariert.\n\ -Guten Flug!!!")) - -DEFINE_DIALOG(DIALOG_005, 1, 4, 30, 200, _("\ -Hey Mario! Stimmt es,\n\ -daß Du König Bob-Omb\n\ -während eines harten\n\ -Kampfes besiegt hast?\n\ -Du scheinst ganz schön\n\ -was auf dem Kasten zu\n\ -haben. Aber glaubst Du,\n\ -es reicht auch für mich?\n\ -Bist Du schnell genug, um\n\ -mich zu schlagen? Ich\n\ -würde sagen, Du siehst\n\ -nicht danach aus!\n\ -Wie wär's mit einem\n\ -Rennen zur Bergspitze,\n\ -um herauszufinden, wer\n\ -der Schnellere ist?\n\ -\n\ -Fertig...?\n\ -\n\ -//Los!/// Später!")) - -DEFINE_DIALOG(DIALOG_006, 1, 3, 30, 200, _("\ -Hey!!! Willst Du mich\n\ -auf den Arm nehmen?\n\ -Abkürzen gilt nicht!\n\ -Am besten versuchst Du's\n\ -später nochmal unter\n\ -fairen Bedingungen.")) - -DEFINE_DIALOG(DIALOG_007, 1, 5, 30, 200, _("\ -Hmmmmpff...pffff...hach!\n\ -Boah! Du...hast...mich...\n\ -geschlagen! Das grenzt an\n\ -ein Wunder! Hier, Du hast\n\ -ihn Dir verdient!")) - -DEFINE_DIALOG(DIALOG_008, 1, 5, 30, 200, _("\ -BISSIGER KETTENHUND!\n\ -Nähere Dich ihm langsam,\n\ -und benutze die [C]-Knöpfe,\n\ -um den Blickwinkel zu\n\ -ändern. Gefährlich, oder?\n\ -Siehst Du die rote Münze\n\ -auf dem Pfahl?\n\ -Du erhältst einen Stern,\n\ -wenn Du acht dieser\n\ -Münzen sammelst.")) - -DEFINE_DIALOG(DIALOG_009, 1, 5, 30, 200, _("\ -Lang, lang ist's her!\n\ -Du scheinst noch schneller\n\ -geworden zu sein. Hast Du\n\ -heimlich geübt oder\n\ -liegt's an den Sternen?\n\ -Meine letzte Niederlage\n\ -geht mir nicht aus dem\n\ -Kopf. Aber das ist meine\n\ -Hausstrecke. Wie wär's\n\ -mit einer Revanche?\n\ -Das Ziel liegt hinter\n\ -der Böen-Brücke.\n\ -Fertig?\n\ -\n\ -//Los!/// Später!")) - -DEFINE_DIALOG(DIALOG_010, 1, 4, 30, 200, _("\ -Du hast den roten\n\ -Schalter aktiviert.\n\ -Ab jetzt kannst Du die\n\ -Federkappe einsetzen\n\ -und durch die Lüfte\n\ -fliegen. Jeder rote\n\ -Block beinhaltet eine\n\ -dieser Mützen.\n\ -Möchtest Du Deinen\n\ -Spielstand speichern?\n\ -\n\ -//Ja!////Nein!")) - -DEFINE_DIALOG(DIALOG_011, 1, 4, 30, 200, _("\ -Du hast den grünen\n\ -Schalter aktiviert.\n\ -Ab jetzt kannst Du die\n\ -Titanenkappe einsetzen\n\ -und Unbesiegbarkeit\n\ -erlangen. Jeder grüne\n\ -Block beinhaltet eine\n\ -dieser Mützen.\n\ -Möchtest Du Deinen\n\ -Spielstand speichern?\n\ -\n\ -//Ja!////Nein!")) - -DEFINE_DIALOG(DIALOG_012, 1, 4, 30, 200, _("\ -Du hast den blauen\n\ -Schalter aktiviert.\n\ -Ab jetzt kannst Du die\n\ -Tarnkappe einsetzen\n\ -und Unsichtbarkeit\n\ -erlangen. Jeder blaue\n\ -Block beinhaltet eine\n\ -dieser Mützen.\n\ -Möchtest Du Deinen\n\ -Spielstand speichern?\n\ -\n\ -//Ja!////Nein!")) - -DEFINE_DIALOG(DIALOG_013, 1, 6, 30, 200, _("\ -Du hast 100 Münzen\n\ -eingesammelt. Der\n\ -Stern verleiht Dir\n\ -zusätzliche Kraft.\n\ -Spielstand speichern?\n\ -//Ja!////Nein!")) - -DEFINE_DIALOG(DIALOG_014, 1, 6, 30, 200, _("\ -Unglaublich, Du hast einen\n\ -weiteren Stern erhalten.\n\ -Er verleiht Dir\n\ -zusätzliche Kraft.\n\ -Spielstand speichern?\n\ -//Ja!////Nein!")) - -DEFINE_DIALOG(DIALOG_015, 1, 4, 30, 200, _("\ -Setze Deine Fäuste ein,\n\ -um Dich zu verteidigen.\n\ -Drücke [A] zum Springen\n\ -und [B] zum Schlagen.\n\ -Drücke [A] und [B], um einen\n\ -Tritt auszuführen.\n\ -Gegenstände kannst Du\n\ -mit [B] nehmen und werfen.")) - -DEFINE_DIALOG(DIALOG_016, 1, 4, 30, 200, _("\ -Springe auf den\n\ -funkelnden Panzer!\n\ -Der Krötensurf eröffnet\n\ -ungeahnte Möglichkeiten!")) - -DEFINE_DIALOG(DIALOG_017, 1, 4, 30, 200, _("\ -Ich bin König Bob-Omb,\n\ -Herrscher über alle\n\ -Bomben und Gebieter der\n\ -Explosionen!\n\ -Wer gibt Dir das Recht,\n\ -diesen Berg zu betreten\n\ -und dieses königliche\n\ -Plateau zu beschmutzen?\n\ -Anscheinend haben Dich\n\ -die Wachen unterschätzt,\n\ -aber mir wird dieser\n\ -Fehler nicht unterlaufen.\n\ -Der Power-Stern ist in\n\ -meinem Besitz und wird\n\ -auch dort bleiben.\n\ -Dein Ende ist gekommen!\n\ -Oder bist Du etwa der\n\ -Meinung, Du könntest\n\ -mich von hinten packen\n\ -und besiegen? Niemals!!!")) - -DEFINE_DIALOG(DIALOG_018, 1, 4, 30, 200, _("\ -Schlafende Gefahren\n\ -sollte man nicht wecken.\n\ -Die schleichende Weisheit\n\ -verleiht längeres Leben!")) - -DEFINE_DIALOG(DIALOG_019, 1, 2, 30, 200, _("\ -Vorsicht, die Fliesen\n\ -sind frisch gebohnert!")) - -DEFINE_DIALOG(DIALOG_020, 1, 6, 95, 150, _("\ -Lieber Mario!\n\ -Komm mich doch einmal\n\ -im Schloss besuchen!\n\ -Der Kuchen steht bereit!\n\ -In Freundschaft\n\ -Toadstool")) - -DEFINE_DIALOG(DIALOG_021, 1, 5, 95, 200, _("\ -Na, wen haben wir denn\n\ -hier? Es ist niemand zu\n\ -Hause, also verschwinde\n\ -besser wieder...\n\ -Hua...hua...hua!!!")) - -DEFINE_DIALOG(DIALOG_022, 1, 3, 95, 200, _("\ -Ohne den passenden\n\ -Schlüssel bleibt Dir\n\ -dieser Weg versperrt!")) - -DEFINE_DIALOG(DIALOG_023, 1, 2, 95, 200, _("\ -Der Kellerschlüssel wird\n\ -Dir hier nichts nützen!")) - -DEFINE_DIALOG(DIALOG_024, 1, 4, 95, 200, _("\ -Du brauchst schon einen\n\ -Stern, um diese Tür zu\n\ -öffnen. Untersuche doch\n\ -einmal die Wandgemälde!")) - -DEFINE_DIALOG(DIALOG_025, 1, 4, 95, 200, _("\ -Zum Öffnen dieser Tür\n\ -benötigst Du drei Sterne.\n\ -Du mußt also noch [%]\n\ -von ihnen finden!")) - -DEFINE_DIALOG(DIALOG_026, 1, 4, 95, 200, _("\ -Zum Öffnen dieser Tür\n\ -benötigst Du acht Sterne.\n\ -Du mußt also noch [%]\n\ -von ihnen finden!")) - -DEFINE_DIALOG(DIALOG_027, 1, 4, 95, 200, _("\ -Zum Öffnen dieser Tür\n\ -benötigst Du 30 Sterne.\n\ -Du mußt also noch [%]\n\ -von ihnen finden.")) - -DEFINE_DIALOG(DIALOG_028, 1, 4, 95, 200, _("\ -Zum Öffnen dieser Tür\n\ -benötigst Du 50 Sterne.\n\ -Du mußt also noch [%]\n\ -von ihnen finden.")) - -DEFINE_DIALOG(DIALOG_029, 1, 4, 95, 200, _("\ -Zum Öffnen der Tür zum\n\ -„Endlosen Vergnügen』\n\ -benötigst Du 70 Sterne.\n\ -Hua...Hua...Hua...!")) - -DEFINE_DIALOG(DIALOG_030, 1, 4, 30, 200, _("\ -Die Lakitu-Film AG\n\ -berichtet live und in\n\ -Farbe! Hier die neuesten\n\ -Meldungen:\n\ -Gegner sind sehr oft\n\ -unachtsam, wenn Du Dich\n\ -leise, also langsam,\n\ -bewegst.\n\ -Die Kameraposition kannst\n\ -Du durch [C]> und [C]<\n\ -verändern, um einen\n\ -Überblick zu erhalten.\n\ -Das Weitwinkelobjektiv\n\ -wird mit [C]| eingesetzt.\n\ -Details der Umgebung\n\ -werden so sichtbar!\n\ -Ein Warnton erklingt,\n\ -wenn die Bewegungs-\n\ -freiheit der Kamera\n\ -eingeschränkt ist.\n\ -Das waren die\n\ -Meldungen und\n\ -damit zurück zum\n\ -laufenden Programm!")) - -DEFINE_DIALOG(DIALOG_031, 1, 3, 30, 200, _("\ -Das darf doch alles nicht\n\ -wahr sein! Ich habe schon\n\ -wieder verloren!\n\ -Dabei habe ich mir extra\n\ -die neuen Koopa-Mach-1-\n\ -Schuhe gekauft! Hmpf!!!\n\ -Naja, ich denke, auch\n\ -dieser Stern gehört Dir!\n\ -Herzlichen Glückwunsch!")) - -DEFINE_DIALOG(DIALOG_032, 1, 5, 30, 200, _("\ -Mit der Federkappe\n\ -kannst Du fliegen.\n\ -Besitzt Du sie, springe\n\ -dreimal hintereinander,\n\ -um einen Flug zu starten.\n\ -Benutzt Du zum Starten\n\ -des Fluges eine Kanone,\n\ -kannst Du die Flughöhe\n\ -enorm steigern. Mit dem\n\ -[Z]-Knopf kannst Du landen.")) - -DEFINE_DIALOG(DIALOG_033, 1, 4, 30, 200, _("\ -Herzlich willkommen! Durch\n\ -eine Warpröhre bist Du\n\ -direkt zum Schloss der\n\ -Prinzessin gelangt.\n\ -Die Steuerung ist einfach:\n\ -Benutze den [A]-Knopf zum\n\ -Springen und den [B]-Knopf\n\ -zum Schlagen.\n\ -Hinweisschilder kannst\n\ -Du lesen, wenn Du Dich\n\ -davor stellst und den\n\ -[B]-Knopf betätigst.\n\ -Der Analog-Stick dient\n\ -der Steuerung. Doch jetzt\n\ -genug der vielen Worte:\n\ -Auf zum Schloss!!!")) - -DEFINE_DIALOG(DIALOG_034, 1, 5, 30, 200, _("\ -Guten Tag, liebe Freunde\n\ -des Actionkinos! Die\n\ -Lakitu-Film AG versorgt\n\ -Euch ständig mit den\n\ -neuesten Informationen.\n\ -Mario hat gerade\n\ -Prinzessin Toadstools\n\ -Schloss erreicht und\n\ -macht sich auf die Suche\n\ -nach den Power-Sternen.\n\ -Unser wagemutiger Kollege\n\ -wird ihn auf dieser\n\ -heiklen Mission begleiten.\n\ -Die [C]-Knöpfe dienen\n\ -seiner Steuerung.\n\ -Du kannst die Perspektiven\n\ -beliebig verändern. Sollte\n\ -sich der Blickwinkel einmal\n\ -nicht verstellen lassen,\n\ -erklingt ein Warnton.\n\ -Genauere Erklärungen\n\ -hierzu werden wir Euch\n\ -zu gegebener Zeit\n\ -mitteilen. Damit zurück\n\ -zum Hauptfilm!")) - -DEFINE_DIALOG(DIALOG_035, 1, 5, 30, 200, _("\ -Die [C]-Knöpfe dienen der\n\ -Steuerung der Kamera.\n\ -Benutze den ^-Knopf, um\n\ -die Kamera mit dem\n\ -Analog-Stick zu bewegen.\n\ -Normalerweise sorgt ein\n\ -Angestellter der Lakitu\n\ -AG dafür, daß Du Mario\n\ -siehst. Das ist die\n\ -Standardeinstellung.\n\ -Diese Kamera steuerst Du\n\ -mit den [C]-Knöpfen.\n\ -Drückst Du die [R]-Taste,\n\ -wechselst Du zwischen\n\ -Lakitus und Marios\n\ -Sicht hin und her. Drücke\n\ -|, um den Zoom oder\n\ -das Weitwinkelobjektiv zu\n\ -aktivieren. Dies ist in\n\ -allen Perspektiven möglich.\n\ -Welchen Kameramodus\n\ -Du gewählt hast, siehst\n\ -Du an einem kleinen Bild,\n\ -das sich rechts unten auf\n\ -dem Bildschirm befindet.")) - -DEFINE_DIALOG(DIALOG_036, 1, 5, 30, 200, _("\ -AUSSICHTSPLATTFORM\n\ -Drücke ^ und genieße die\n\ -Aussicht. Vielleicht\n\ -entdeckst Du Geheimnisse\n\ -Deiner Umgebung.\n\ -Drücke [R], um zu Marios\n\ -Kamera zu wechseln. Sie\n\ -bleibt ständig hinter ihm.\n\ -Mit dieser Taste schaltest\n\ -Du auch zurück auf Lakitu.\n\ -Im Pausenmodus kannst Du\n\ -weitere Einstellungen\n\ -vornehmen. Wähle „Stativ』\n\ -und halte die [R]-Taste\n\ -gedrückt!")) - -DEFINE_DIALOG(DIALOG_037, 1, 3, 30, 200, _("\ -Hihihi, ich habe gewonnen!\n\ -Du solltest noch ein paar\n\ -Trainingsrunden einlegen!")) - -DEFINE_DIALOG(DIALOG_038, 1, 2, 95, 200, _("\ -Die mystische Kraft der\n\ -Sterne öffnet die Tür!")) - -DEFINE_DIALOG(DIALOG_039, 1, 5, 30, 200, _("\ -Besuchern ist das\n\ -Erklimmen des königlichen\n\ -Berges strengstens\n\ -verboten. Verstöße werden\n\ -hart bestraft!\n\ -Niemals werden die\n\ -Power-Sterne, ein\n\ -Geschenk Bowsers, diesen\n\ -Ort verlassen. Ihre Macht\n\ -bleibt in meinen Händen!\n\ -Kein Wort über ihren\n\ -Aufenthaltsort kommt\n\ -über meine Lippen!!!\n\ -Äh, naja, vielleicht\n\ -ein kleiner Tip:\n\ -Die Sternenbeschreibungen\n\ -zu Beginn dieses Kurses\n\ -könnten sich als nützlich\n\ -erweisen!\n\ -König Bob-Omb!!!")) - -DEFINE_DIALOG(DIALOG_040, 1, 3, 30, 200, _("\ -Vorsicht, Brücke zerstört!\n\ -Überquere das Eistal in\n\ -der Gondel.")) - -DEFINE_DIALOG(DIALOG_041, 1, 4, 30, 200, _("\ -Höhöhö, das war ja wohl\n\ -nichts! Sogar meine Uroma\n\ -Koopa ist wesentlich\n\ -schneller als Du!\n\ -Naja, mit zwei Jahren\n\ -Training könntest Du's\n\ -vielleicht schaffen.\n\ -Bis dann...und tschüß!")) - -DEFINE_DIALOG(DIALOG_042, 1, 4, 30, 200, _("\ -Achtung!\n\ -Dieser Steg ist ziemlich\n\ -schmal. Du solltest Dich\n\ -sehr langsam bewegen.\n\ -Überschreitest Du eine\n\ -Kante, fällt Mario nicht\n\ -in die Tiefe, sondern er\n\ -klammert sich daran fest.\n\ -Möchtest Du wieder nach\n\ -oben klettern, drücke\n\ -den Analog-Stick in\n\ -Marios Blickrichtung.\n\ -Mario läßt die Kante los,\n\ -wenn Du den Analog-Stick\n\ -in Richtung seines Rückens\n\ -bewegst oder [Z] drückst.\n\ -Bist Du in Eile, kannst\n\ -Du auch durch einen\n\ -beherzten Sprung mit dem\n\ -[A]-Knopf hinauf gelangen.")) - -DEFINE_DIALOG(DIALOG_043, 1, 4, 30, 200, _("\ -Wenn Du springst und den\n\ -[A]-Knopf gedrückt hältst,\n\ -klammert sich Mario an\n\ -Objekte über ihm.\n\ -Auf diese Weise kannst\n\ -Du Dich auch von der\n\ -Eule durch die Lüfte\n\ -transportieren lassen.")) - -DEFINE_DIALOG(DIALOG_044, 1, 5, 95, 200, _("\ -Uh...oh...gääähn...\n\ -Weeehhr ist daaaahhh...?\n\ -Wer hat mich geweckt?\n\ -Eigentlich sollte ich um\n\ -diese Tageszeit schlafen!\n\ -Aber, da Du mich schon\n\ -geweckt hast, wie wäre\n\ -es dann mit einem\n\ -kleinen Rundflug um die\n\ -Burg?\n\ -Befinde ich mich direkt\n\ -über Dir, springe und\n\ -halte den Sprungknopf\n\ -gedrückt. Laß ihn los,\n\ -um wieder frei zu sein.\n\ -Ich transportiere Dich,\n\ -solange es meine Kraft\n\ -zuläßt. Beobachte meinen\n\ -Schatten, um Dich zu\n\ -orientieren.")) - -DEFINE_DIALOG(DIALOG_045, 1, 6, 95, 200, _("\ -Hey, Mann, Mario! Mir\n\ -geht die Puste aus.\n\ -Du ißt zuviel Pasta!\n\ -Bitte, laß los, ich muß\n\ -mich erholen...sofooort!\n\ -Bis später...vielleicht.")) - -DEFINE_DIALOG(DIALOG_046, 1, 4, 30, 200, _("\ -Es gibt drei verschiedene\n\ -Sprungtechniken. Du mußt\n\ -sie alle beherrschen, um\n\ -die Aufgaben zu meistern.\n\ -Versuche zuerst den\n\ -Dreisprung! Renne und\n\ -springe dreimal direkt\n\ -hintereinander.\n\ -Mit dem richtigen Timing\n\ -wird jeder Sprung höher\n\ -als der vorherige sein.\n\ -Weiter zum Weitsprung!\n\ -Während Du rennst, mußt\n\ -Du den [Z]-Knopf und dann\n\ -den [A]-Knopf drücken.\n\ -Und nun der Wandsprung!\n\ -Springe gegen eine Wand.\n\ -Sobald Du die Wand\n\ -berührst, mußt Du wieder\n\ -den Sprungknopf drücken.\n\ -Alles verstanden?\n\ -Dreisprung? Weitsprung?\n\ -Wandsprung? Dann heißt's\n\ -üben, üben, üben...")) - -DEFINE_DIALOG(DIALOG_047, 1, 3, 95, 200, _("\ -Hallo!\n\ -Ich mache die Kanone\n\ -zum Abschuß bereit!")) - -DEFINE_DIALOG(DIALOG_048, 1, 6, 30, 200, _("\ -An einigen Stellen\n\ -herrscht extreme\n\ -Rutschgefahr! Sieh\n\ -am besten zuerst im\n\ -Schornstein nach dem\n\ -Rechten!")) - -DEFINE_DIALOG(DIALOG_049, 1, 5, 30, 200, _("\ -Du erinnerst Dich an den\n\ -Wandsprung? Auf diese\n\ -Weise kannst Du schnell\n\ -höher gelegene Stellen\n\ -erreichen.\n\ -Benutze ihn, um von\n\ -Wand zu Wand zu springen\n\ -und Stück für Stück\n\ -weiter nach oben zu\n\ -gelangen.\n\ -Denke an die uralte\n\ -Weisheit:\n\ -Übung macht den Meister!\n\ -Sie kommt hier voll zum\n\ -Tragen!!!")) - -DEFINE_DIALOG(DIALOG_050, 1, 4, 30, 200, _("\ -Drücke den [Z]-Knopf, um\n\ -in die Hocke zu gehen und\n\ -einen Hang nach unten zu\n\ -rutschen.\n\ -Betätigst Du den [Z]-Knopf\n\ -während eines Sprungs,\n\ -führst Du eine\n\ -Stampfattacke aus.\n\ -Du machst einen\n\ -Rückwärtssalto, wenn\n\ -Du stehend den [Z]-Knopf\n\ -drückst und springst.\n\ -Es gibt weitere Varianten\n\ -zu entdecken. Nimm Dir\n\ -Zeit und versuche, andere\n\ -Kombinationen zu finden!")) - -DEFINE_DIALOG(DIALOG_051, 1, 5, 30, 200, _("\ -Du kannst auf Bäume und\n\ -Stangen klettern, wenn\n\ -Du gegen sie springst und\n\ -den Analog-Stick nach\n\ -oben drückst.\n\ -Mit dem [A]-Knopf kannst\n\ -Du nach HINTEN wieder\n\ -abspringen. Du kannst\n\ -sogar auf der Spitze\n\ -einen Handstand machen.\n\ -Springst Du aus dem\n\ -Handstand von einem\n\ -Objekt ab, machst Du\n\ -einen unglaublich hohen\n\ -Sprung.")) - -DEFINE_DIALOG(DIALOG_052, 1, 5, 30, 200, _("\ -Du machst einen\n\ -Rückwärtssalto, wenn\n\ -Du stehend den [Z]-Knopf\n\ -gedrückt hältst und dann\n\ -den [A]-Knopf betätigst.\n\ -Seitwärtssaltos führst\n\ -Du aus, indem Du den\n\ -Analog-Stick entgegen\n\ -Deiner Laufrichtung\n\ -bewegst und springst.")) - -DEFINE_DIALOG(DIALOG_053, 1, 5, 30, 200, _("\ -Von Zeit zu Zeit erscheint\n\ -eine farbige Zahl, wenn\n\ -Du Kisten öffnest, Ringe\n\ -durchquerst oder geheime\n\ -Orte erreichst.\n\ -Gelingt es Dir, alle fünf\n\ -farbigen Zahlen dieses\n\ -Bereichs zu finden,\n\ -erhältst Du zur Belohnung\n\ -einen Power-Stern.")) - -DEFINE_DIALOG(DIALOG_054, 1, 6, 30, 200, _("\ -Herzlich willkommen\n\ -auf der Schlidderbahn!\n\ -Drücke den Analog-Stick\n\ -nach vorne, um zu\n\ -beschleunigen und nach\n\ -hinten, um zu bremsen.")) - -DEFINE_DIALOG(DIALOG_055, 1, 5, 30, 200, _("\ -Hihi, hallo Mario!\n\ -Du siehst aus, als\n\ -wolltest Du mich gerade\n\ -fragen, ob wir ein\n\ -Wettrennen machen sollten.\n\ -Und ich sage: Na klar! Es\n\ -ist zwar noch niemandem\n\ -gelungen, mich, den\n\ -Schlidderkönig aller\n\ -Klassen, zu besiegen.\n\ -Aber Du kannst es ja\n\ -einmal versuchen.\n\ -Wie steht's?\n\ -\n\ -//Na klar!/ Später!")) - -DEFINE_DIALOG(DIALOG_056, 1, 6, 30, 200, _("\ -Du...Du...ha...hast\n\ -mich geschlagen! Das kann\n\ -doch nicht wahr sein!\n\ -Du bist der größte\n\ -Schliddermeister, den\n\ -ich kenne!\n\ -Eine Goldmedaille kann\n\ -ich Dir zwar nicht\n\ -überreichen,\n\ -aber nimm diesen\n\ -Power-Stern!\n\ -Du hast ihn verdient.")) - -DEFINE_DIALOG(DIALOG_057, 1, 4, 30, 200, _("\ -Hey Kleiner! Hast Du mein\n\ -Baby gesehen? Es ist das\n\ -schönste und süßeste\n\ -Baby der ganzen Welt!\n\ -Vor kurzem war es noch\n\ -bei mir, aber ich habe\n\ -keine Ahnung, wohin es\n\ -sich verdrückt hat.\n\ -Wenn ich doch nur wüßte,\n\ -wo ich die Suche beginnen\n\ -soll...Oh, was für eine\n\ -fürchterliche Tragödie!!!")) - -DEFINE_DIALOG(DIALOG_058, 1, 5, 30, 200, _("\ -Das ist doch...\n\ -Mensch, Mario, Du hast\n\ -mein Baby gefunden!!!\n\ -Wie kann ich Dir dafür\n\ -danken?\n\ -Oh, ich weiß: Ich fand\n\ -neulich diesen Stern\n\ -hier. Nimm ihn als\n\ -Zeichen meiner ewigen\n\ -Dankbarkeit!")) - -DEFINE_DIALOG(DIALOG_059, 1, 6, 30, 200, _("\ -Was soll ich mit diesem\n\ -Früchtchen? Das ist nicht\n\ -mein Baby! Mein Baby hat\n\ -ein weiche, zarte Stimme,\n\ -und es sieht mir natürlich\n\ -ähnlich!")) - -DEFINE_DIALOG(DIALOG_060, 1, 4, 30, 200, _("\ -Achtung, Achtung!\n\ -Bevor Du Dich in die\n\ -Fluten stürzt, solltest\n\ -Du Dir folgendes merken:\n\ -Bleibst Du zu lange unter\n\ -Wasser, könnte Dir die\n\ -Luft ausgehen. Achte auf\n\ -die Sauerstoffanzeige!\n\ -Schwimme zur Oberfläche\n\ -oder sammle Münzen und\n\ -Luftblasen, um wieder\n\ -Sauerstoff zu tanken.\n\ -Drücke den [A]-Knopf, um\n\ -zu schwimmen. Halte ihn\n\ -gedrückt, um mit den\n\ -Füßen zu paddeln.\n\ -Bewege beim Schwimmen\n\ -den Analog-Stick nach\n\ -oben, um zu tauchen und\n\ -nach unten, um zu steigen.\n\ -Springe aus dem Wasser,\n\ -indem Du an einer Kante\n\ -den Analog-Stick abwärts\n\ -drückst und springst.\n\ -Achte jedoch darauf,\n\ -daß Du den Analog-Stick\n\ -während des Sprungs\n\ -losläßt!")) - -DEFINE_DIALOG(DIALOG_061, 1, 5, 30, 200, _("\ -Wer baden möchte, sollte\n\ -sich besser in wärmere\n\ -Gefilde begeben, denn\n\ -hier ist es auf jeden\n\ -Fall zu kalt!!!")) - -DEFINE_DIALOG(DIALOG_062, 1, 4, 30, 200, _("\ -In den grünen Blöcken\n\ -im Labyrinth findest\n\ -Du die phänomenalen\n\ -Titanenkappen.\n\ -Trägst Du diese Kappen,\n\ -bist Du unverwundbar\n\ -und brauchst kurze Zeit\n\ -nicht zu atmen.\n\ -Das einzige Problem ist:\n\ -Du kannst nicht\n\ -schwimmen, während Du\n\ -sie trägst!")) - -DEFINE_DIALOG(DIALOG_063, 1, 3, 30, 200, _("\ -In den blauen Blöcken\n\ -befinden sich die\n\ -fantastischen Tarnkappen.\n\ -Damit kannst Du durch\n\ -bestimmte Mauern gehen\n\ -oder Geister erschrecken.")) - -DEFINE_DIALOG(DIALOG_064, 1, 3, 30, 200, _("\ -In den roten Blöcken\n\ -kannst Du die berühmten\n\ -Federkappen finden.\n\ -Mit einem Dreisprung\n\ -kannst Du starten und\n\ -in die Lüfte steigen.\n\ -Drücke den Analog-Stick\n\ -nach unten, um im Flug\n\ -an Höhe zu gewinnen.\n\ -Drücke den Analog-Stick\n\ -nach oben, um im Flug\n\ -an Höhe zu verlieren.\n\ -Betätige den [Z]-Knopf,\n\ -um den Flug zu beenden\n\ -und sicher zu landen.")) - -DEFINE_DIALOG(DIALOG_065, 1, 5, 30, 200, _("\ -Schwimmen für Anfänger!\n\ -Drücke den [A]-Knopf für\n\ -einen Schwimmzug. Bei\n\ -richtigem Timing kannst\n\ -Du sehr schnell schwimmen.\n\ -Halte den [A]-Knopf\n\ -gedrückt, um mit den\n\ -Füßen zu paddeln. Mit\n\ -dieser Technik bewegst Du\n\ -Dich langsamer im Wasser.\n\ -Drücke beim Schwimmen\n\ -den Analog-Stick\n\ -nach oben, um zu\n\ -tauchen und nach unten,\n\ -um zu steigen.\n\ -Du kannst aus dem Wasser\n\ -springen, wenn Du an der\n\ -Wasseroberfläche den\n\ -Analog-Stick nach unten\n\ -drückst und springst.\n\ -Beachte: Kein Mensch\n\ -kann unter Wasser atmen!\n\ -Kehre zurück an die\n\ -Oberfläche, wenn Deine\n\ -Luft zur Neige geht.\n\ -Ach ja: Türen, die sich\n\ -unter Wasser befinden,\n\ -kannst Du nicht öffnen.\n\ -Aber vielleicht findest\n\ -Du ja einen Abfluß!!!")) - -DEFINE_DIALOG(DIALOG_066, 1, 5, 30, 200, _("\ -Hallo Mario, ich bin's,\n\ -Peach! Paß auf Dich auf!\n\ -Bowser wird versuchen,\n\ -Dich mit seinem Feueratem\n\ -zu versengen.\n\ -Renne hinter ihn!\n\ -Versuche mit dem\n\ -[B]-Knopf Bowsers\n\ -Schwanz zu packen und\n\ -ihn herumzuschleudern.\n\ -Bewege den Analog-Stick\n\ -im Kreis, um Dich zu\n\ -drehen. Je schneller\n\ -Du Dich drehst, desto\n\ -weiter wird Dein Wurf.\n\ -Benutze die [C]-Knöpfe, um\n\ -Dich zu orientieren. Du\n\ -mußt Bowser gegen eine\n\ -der Bomben am Rand der\n\ -Plattform werfen.\n\ -Drücke den [B]-Knopf, um\n\ -Bowser loszulassen und\n\ -in Richtung der Bombe\n\ -zu schleudern.\n\ -Viel Glück!!!")) - -DEFINE_DIALOG(DIALOG_067, 1, 5, 30, 200, _("\ -Tja, Mario, Pech gehabt!\n\ -Die Prinzessin ist nicht\n\ -hier und wird es auch so\n\ -bald nicht sein...\n\ -Hua...Hua...Hua...Hua!\n\ -Es wird Dir niemals\n\ -gelingen, mich von hinten\n\ -zu packen und zu werfen.\n\ -Da müßte schon ein wahrer\n\ -Held kommen, keine Wurst!\n\ -Vielleicht gehst Du besser\n\ -wieder nach Hause und\n\ -reparierst weiter kaputte\n\ -Rohre, als Dich mit mir\n\ -zu messen!!!")) - -DEFINE_DIALOG(DIALOG_068, 1, 5, 30, 200, _("\ -Du bist im Land des\n\ -flüssigen Feuers. Wenn\n\ -Du vom Weg abkommst,\n\ -bewahre Ruhe, denn Du\n\ -verlierst nicht die\n\ -gesamte Energie auf\n\ -einmal. Außerdem kannst\n\ -Du den qualmenden Mario\n\ -während seines Höhenflugs\n\ -immer noch steuern!")) - -DEFINE_DIALOG(DIALOG_069, 1, 4, 30, 200, _("\ -Während Deiner Abenteuer\n\ -in den Wandbildern stößt\n\ -Du an den Rändern auf\n\ -unsichtbare Mauern.\n\ -Triffst Du fliegend auf\n\ -eine solche Mauer, prallst\n\ -Du ab. Du kannst aber den\n\ -Flug fortsetzen.")) - -DEFINE_DIALOG(DIALOG_070, 1, 4, 30, 200, _("\ -Du kannst die Wandbilder\n\ -jederzeit verlassen, um\n\ -in die Schlosshalle\n\ -zurückzukehren.\n\ -Bleibe stehen, drücke\n\ -START, um das Spiel\n\ -zu pausieren, und wähle\n\ -„Kurs verlassen』!\n\ -Du mußt nicht alle Sterne\n\ -einer Welt finden, um\n\ -den nächsten Abschnitt\n\ -betreten zu können.\n\ -Hebe Dir die schweren\n\ -Brocken für später auf,\n\ -wenn Du Deine Techniken\n\ -perfektioniert hast.\n\ -Findest Du einen Stern,\n\ -erhältst Du einen Hinweis,\n\ -wo sich der nächste\n\ -Fundort befindet.\n\ -Aber Du mußt die Sterne\n\ -in keiner bestimmten\n\ -Reihenfolge finden.\n\ -Die Wahl liegt bei Dir!")) - -DEFINE_DIALOG(DIALOG_071, 1, 4, 30, 200, _("\ -Achtung! Hüte Dich vor\n\ -den Nebelschwaden!\n\ -Sie enthalten keinen\n\ -Sauerstoff!\n\ -Benutze die erhöhten\n\ -Plattformen, um Dich\n\ -auszuruhen und einen\n\ -sicheren Weg zu suchen.\n\ -Auf der Karte sind\n\ -Unterstände als Kreise\n\ -dargestellt, den Eingang\n\ -erkennst Du am Pfeil!")) - -DEFINE_DIALOG(DIALOG_072, 1, 5, 30, 200, _("\ -Hier oben weht eine steife\n\ -Brise. Solltest Du Deine\n\ -Mütze verlieren, kannst\n\ -Du sie auf dem Weg zum\n\ -Gipfel wiederfinden.")) - -DEFINE_DIALOG(DIALOG_073, 1, 5, 95, 200, _("\ -Ahoi, Landratte! Es ist\n\ -doch wohl logisch, daß\n\ -sich hier unten ein\n\ -sagenhafter Schatz\n\ -befindet!\n\ -Zur Bergung mußt Du die\n\ -Kisten in der richtigen\n\ -Reihenfolge öffnen, klar?\n\ -Aber ich sage nicht, wie\n\ -sie lautet, hehehe!")) - -DEFINE_DIALOG(DIALOG_074, 1, 5, 30, 200, _("\ -Siehst Du den Block\n\ -nebenan? Manchmal kannst\n\ -Du im Innern dieser\n\ -Quader interessante\n\ -Entdeckungen machen.\n\ -Zerstöre sie mit einem\n\ -gezielten Schlag oder\n\ -einer Stampfattacke,\n\ -damit sie ihr Geheimnis\n\ -preisgeben!")) - -DEFINE_DIALOG(DIALOG_075, 1, 5, 30, 200, _("\ -Hilfe, Mario! Mein Schloss\n\ -befindet sich in großer\n\ -Gefahr. Ich weiß, daß der\n\ -widerliche Bowser seine\n\ -Hände im Spiel hat.\n\ -Er hat alle Türen des\n\ -Schlosses versiegelt. Nur\n\ -die magische Kraft der\n\ -Power-Sterne kann diese\n\ -Siegel brechen.\n\ -Aber es gibt einige\n\ -Geheimwege im Innern, die\n\ -Bowser nicht entdeckt\n\ -hat. Einer davon befindet\n\ -sich in diesem Raum.\n\ -Suche den Eingang und\n\ -finde den Power-Stern,\n\ -der sich darin verbirgt.\n\ -Hilf uns, Du bist unsere\n\ -einzige Hoffnung!\n\ -Fast alle Power-Sterne\n\ -kannst Du in den\n\ -Wandgemälden finden,\n\ -manche jedoch an\n\ -geheimen Orten.\n\ -Sammle soviele Sterne\n\ -wie möglich, um Bowsers\n\ -Plan zu vereiteln.\n\ -Wir zählen auf Dich!\n\ -Viel Glück!!!")) - -DEFINE_DIALOG(DIALOG_076, 1, 4, 30, 200, _("\ -Hallo Mario! Du hast\n\ -bereits einiges zur\n\ -Rettung des Schlosses\n\ -getan.\n\ -Aber Du mußt noch\n\ -viele Geheimnisse\n\ -der Wandgemälde\n\ -lüften.\n\ -Manchmal spielen Dir\n\ -Deine Augen einen Streich.\n\ -Die Realität verschwindet\n\ -hinter Fassaden.\n\ -Aber Du kannst das\n\ -Trugbild durchdringen,\n\ -wenn Du es im Spiegel\n\ -betrachtest!\n\ -Wasser ist ein flüssiges\n\ -Element. Die Magie des\n\ -Wandgemäldes beeinflußt\n\ -sein Verhalten.\n\ -Wähle verschiedene Wege,\n\ -um die versunkene Stadt\n\ -durch das Gemälde zu\n\ -betreten.\n\ -Ach ja, fast hätte ich es\n\ -vergessen: Hier habe ich\n\ -etwas für Dich! Es hilft\n\ -Dir, Bowser zu besiegen.")) - -DEFINE_DIALOG(DIALOG_077, 1, 4, 150, 200, _("\ -Einst konnte man die Tür\n\ -öffnen. Zu dieser Zeit\n\ -waren die Säulen aber\n\ -niedriger!")) - -DEFINE_DIALOG(DIALOG_078, 1, 5, 30, 200, _("\ -Diesen Schalter kannst Du\n\ -durch eine Stampfattacke\n\ -auslösen. Er läßt einige\n\ -blaue Münzen erscheinen,\n\ -die je fünf gelbe\n\ -Münzen wert sind.\n\ -Allerdings mußt Du Dich\n\ -beeilen, denn die blauen\n\ -Münzen erscheinen nur\n\ -für kurze Zeit.")) - -DEFINE_DIALOG(DIALOG_079, 1, 4, 30, 200, _("\ -Auuuuuaaa! Hey, laß mich\n\ -los! Das war doch nur\n\ -Spaß! Du hast wohl keinen\n\ -Humor, was?\n\ -Okay, ich mache Dir einen\n\ -Vorschlag: Wenn Du mich\n\ -losläßt, habe ich eine\n\ -Überraschung für Dich!\n\ -Na, wie sieht's aus?\n\ -\n\ -//Klar!///Vergiß es!")) - -DEFINE_DIALOG(DIALOG_080, 1, 3, 30, 200, _("\ -Hey Baby, komm schon!\n\ -Wo bleibst Du denn so\n\ -lange?")) - -DEFINE_DIALOG(DIALOG_081, 1, 5, 30, 200, _("\ -Des Rätsels Lösung ist der\n\ -Wasserstand. Tief unten\n\ -erwartet Dich die Stadt,\n\ -nachdem Du den Pegel\n\ -hast sinken lassen.")) - -DEFINE_DIALOG(DIALOG_082, 1, 4, 30, 200, _("\ -Achte auf Deine Mütze!\n\ -Solltest Du sie verlieren,\n\ -wirst Du durch Treffer\n\ -schwerer verletzt.\n\ -Solltest Du sie einmal\n\ -verlieren, findest Du die\n\ -Mütze in dem Gemälde, in\n\ -dem Du sie verloren hast.\n\ -Die Prinzessin wird\n\ -noch immer von Bowser\n\ -gefangen gehalten. Rette\n\ -sie so schnell wie möglich.\n\ -Bowsers Schergen belagern\n\ -seit langer Zeit die\n\ -Welten der Gemälde und\n\ -Wände des Schlosses.\n\ -Aber es ist mir gelungen,\n\ -ihnen diesen Stern\n\ -abzujagen.\n\ -Viel Glück!")) - -DEFINE_DIALOG(DIALOG_083, 1, 6, 30, 200, _("\ -Betrittst Du die Uhr zu\n\ -verschiedenen Zeiten,\n\ -werden Dir weitere\n\ -Geheimnisse offenbart.\n\ -Vielleicht hilft Dir auch\n\ -dieser Stern!")) - -DEFINE_DIALOG(DIALOG_084, 1, 5, 30, 200, _("\ -Hey, Du Rüpel, ich\n\ -bekomme ja blaue Flecken.\n\ -Laß mich sofort los!\n\ -Bowser hat mir diesen\n\ -Stern geschenkt.\n\ -Er wäre ziemlich böse,\n\ -wenn er das wüßte, aber\n\ -ich bin in Eile. Also\n\ -nimm ihn und laß mich\n\ -runter!")) - -DEFINE_DIALOG(DIALOG_085, 1, 4, 30, 200, _("\ -Im Horrorhaus solltest Du\n\ -den Mund geschlossen\n\ -halten, damit Deine Zähne\n\ -nicht vor Angst klappern!")) - -DEFINE_DIALOG(DIALOG_086, 1, 3, 40, 200, _("\ -Wenn Du im Kreis rennst,\n\ -werden manche Gegner\n\ -große Augen machen!")) - -DEFINE_DIALOG(DIALOG_087, 1, 3, 30, 200, _("\ -Der Weihnachtsmann ist\n\ -nicht der einzige, der\n\ -in Schornsteine klettert!")) - -DEFINE_DIALOG(DIALOG_088, 1, 2, 30, 200, _("\ -Benutze die Stange, um\n\ -nach unten zu gelangen!")) - -DEFINE_DIALOG(DIALOG_089, 1, 4, 95, 200, _("\ -Auf beiden Wegen lauern\n\ -Gefahren. Links benötigst\n\ -Du den Weitsprung, um\n\ -weiterzukommen.\n\ -Rechts: Arbeitsplattform\n\ -////Nebellabyrinth\n\ -Links:/Schwarzes Loch\n\ -////Höhlensee")) - -DEFINE_DIALOG(DIALOG_090, 1, 5, 30, 200, _("\ -Hua, hua, hua, ich wußte,\n\ -daß Du mir in die Falle\n\ -gehen würdest. Du solltest\n\ -öfter auf Deine ulkigen\n\ -Füße schauen!")) - -DEFINE_DIALOG(DIALOG_091, 1, 3, 30, 200, _("\ -Achtung, starke Böen!\n\ -Aber es könnte auch eine\n\ -aufregende Reise werden!")) - -DEFINE_DIALOG(DIALOG_092, 1, 4, 30, 200, _("\ -Was willst Du denn schon\n\ -wieder? Du bist ja\n\ -lästiger als ein Schwarm\n\ -Stubenfliegen.\n\ -Gerade jetzt, als mir\n\ -die ganze Sache so viel\n\ -Spaß machte! Aber, wenn\n\ -Du schon mal hier bist:\n\ -Gib mir die Power-Sterne\n\ -zurück! Meine Truppen\n\ -können sie besser\n\ -gebrauchen als Du.")) - -DEFINE_DIALOG(DIALOG_093, 1, 4, 30, 200, _("\ -Mario, wie schön Dich zu\n\ -sehen! Ich dachte gerade\n\ -an eine Grillparty - schon\n\ -bist Du da.\n\ -Jetzt brauche ich mir\n\ -wenigstens keine Gedanken\n\ -zu machen, was ich grille:\n\ -Nämlich Dich!\n\ -Dann gehört die Prinzessin\n\ -endgültig mir und ich bin\n\ -auf ewig der Herrscher\n\ -des Schlosses!!!")) - -DEFINE_DIALOG(DIALOG_094, 1, 4, 30, 200, _("\ -Erinnerst Du Dich noch an\n\ -den Weitsprung? Renne,\n\ -drücke den [Z]-Knopf und\n\ -dann den [A]-Knopf!")) - -DEFINE_DIALOG(DIALOG_095, 1, 3, 30, 200, _("\ -Wie man Schilder liest,\n\ -hast Du offensichtlich\n\ -bereits herausgefunden.\n\ -Auf die gleiche Weise\n\ -kannst Du mit anderen\n\ -sprechen.")) - -DEFINE_DIALOG(DIALOG_096, 1, 4, 30, 200, _("\ -Der Weg zur Burg ist\n\ -sehr schmal! Selbst\n\ -Wagemutige sollten sich\n\ -langsam bewegen.\n\ -Außerdem wecken leise\n\ -Schritte niemanden, der\n\ -schläft - was Dein\n\ -Vorteil sein könnte!")) - -DEFINE_DIALOG(DIALOG_097, 1, 6, 30, 200, _("\ -Sei nicht schüchtern,\n\ -sondern wehre Dich,\n\ -wenn jemand versucht,\n\ -Dich von einer Plattform\n\ -zu schubsen. Sonst steigt\n\ -die Temperatur!")) - -DEFINE_DIALOG(DIALOG_098, 1, 1, 95, 200, _("\ -Komm nur näher, hehehe!")) - -DEFINE_DIALOG(DIALOG_099, 1, 3, 95, 200, _("\ -")) - -DEFINE_DIALOG(DIALOG_100, 1, 2, 95, 200, _("\ -Jippiiiiieee, ich hab' sie!\n\ -Jetzt gehört sie mir!!!")) - -DEFINE_DIALOG(DIALOG_101, 1, 5, 95, 200, _("\ -Hgggnnnhhh! Laß...mich...\n\ -los!!! Diese Mütze? Na\n\ -gut, ich gebe sie Dir,\n\ -obwohl sie mir besser\n\ -steht als Dir!")) - -DEFINE_DIALOG(DIALOG_102, 1, 5, 30, 200, _("\ -Hey, pssst, paß mal auf:\n\ -Die Geister sind sehr\n\ -schüchtern. Siehst Du\n\ -ihnen in die Augen,\n\ -verschwinden sie.\n\ -Drehst Du ihnen allerdings\n\ -den Rücken zu, werden\n\ -sie wieder sichtbar.\n\ -Attackiere sie von hinten,\n\ -um sie zu besiegen.")) - -DEFINE_DIALOG(DIALOG_103, 1, 4, 95, 200, _("\ -Die Pyramide ist von vier\n\ -Säulen umgeben. Erklimme\n\ -die Spitzen der Säulen, um\n\ -das Geheimnis zu lüften.")) - -DEFINE_DIALOG(DIALOG_104, 1, 4, 30, 200, _("\ -Der Schattenstern vor Dir\n\ -wird real, wenn Du die\n\ -acht roten Münzen dieser\n\ -Welt findest.")) - -DEFINE_DIALOG(DIALOG_105, 1, 5, 95, 200, _("\ -Bist Du bereit? Dann rein\n\ -mit Dir in die Kanone! Du\n\ -kannst mir ihrer Hilfe\n\ -die schwebende Insel\n\ -erreichen!\n\ -Benutze den Analog-Stick\n\ -zum Zielen und feuere die\n\ -Kanone mit dem [A]-Knopf\n\ -ab. Akrobaten bevorzugen\n\ -Bäume zur Landung!")) - -DEFINE_DIALOG(DIALOG_106, 1, 2, 95, 200, _("\ -Bist Du bereit? Dann rein\n\ -mit Dir in die Kanone!")) - -DEFINE_DIALOG(DIALOG_107, 1, 4, 95, 200, _("\ -Das werde ich meinem\n\ -großen Bruder erzählen!\n\ -Dann kannst Du aber was\n\ -erleben...")) - -DEFINE_DIALOG(DIALOG_108, 1, 6, 95, 200, _("\ -Ha-Boooo! Du bist also\n\ -der Unruhestifter...\n\ -Jetzt wirst Du das büßen,\n\ -was Du mir und meinen\n\ -Geschwistern angetan\n\ -hast...")) - -DEFINE_DIALOG(DIALOG_109, 1, 4, 95, 200, _("\ -Schnief, schnüff! Mein\n\ -einst stattlicher Körper\n\ -hat sich in Wasser\n\ -aufgelöst.\n\ -Ich würde alles für einen\n\ -neuen Körper geben.\n\ -Vielleicht kannst Du mir\n\ -helfen, schluchz?")) - -DEFINE_DIALOG(DIALOG_110, 1, 5, 95, 200, _("\ -Oh Mann, ich fühle mich\n\ -so kopflos! Kennst Du\n\ -jemanden, der nach einem\n\ -Körper sucht? Unten?\n\ -Okay, dann los!")) - -DEFINE_DIALOG(DIALOG_111, 1, 3, 95, 200, _("\ -Boah, welch komfortables\n\ -Unterteil!\n\ -Ich bin so glücklich...\n\ -Hier, nimm den Stern.\n\ -Ich hoffe, er bringt\n\ -Dir Glück!")) - -DEFINE_DIALOG(DIALOG_112, 1, 4, 30, 200, _("\ -Sammle so viele Münzen,\n\ -wie Du finden kannst.\n\ -Sie geben Dir verlorene\n\ -Energie zurück.\n\ -Die Bestleistung jeder\n\ -Welt wird gespeichert.\n\ -Du kannst sie jederzeit\n\ -abrufen.\n\ -In einigen Welten wirst\n\ -Du transparenten Herzen\n\ -begegnen. Auch sie füllen\n\ -Deinen Power-Meter auf.\n\ -Je schneller Du das Herz\n\ -passierst, desto mehr\n\ -verlorene Energie wird\n\ -ersetzt.")) - -DEFINE_DIALOG(DIALOG_113, 1, 6, 30, 200, _("\ -In den roten, blauen und\n\ -grünen Blöcken befinden\n\ -sich verschiedene Mützen.\n\ -Du mußt die versteckten\n\ -Schalter finden, um die\n\ -Blöcke öffnen zu können.")) - -DEFINE_DIALOG(DIALOG_114, 1, 4, 95, 200, _("\ -Das gibt es doch gar\n\ -nicht! Was willst Du\n\ -Wicht hier in meinem\n\ -Reich?\n\ -Ich werde Dich lehren,\n\ -meine Befehle zu...\n\ -Oh, diese vermaledeiten\n\ -Rückenschmerzen...!")) - -DEFINE_DIALOG(DIALOG_115, 1, 4, 95, 200, _("\ -Unglaublich! Du hast mich\n\ -von meinen Kreuzschmerzen\n\ -befreit! Als Dank gebe\n\ -ich Dir diesen Stern!")) - -DEFINE_DIALOG(DIALOG_116, 1, 4, 95, 200, _("\ -Waaaaa...wie? Du hast\n\ -mich besiegt...\n\ -Ich verneige mein Haupt\n\ -vor Deiner Größe!\n\ -Aber Du mußt Dich\n\ -vorsehen!\n\ -Bowser wird nicht so\n\ -leicht zu besiegen sein.\n\ -Ich gebe Dir diesen\n\ -Stern, um Dir meine\n\ -Demut zu beweisen.\n\ -Trage ihn mit Stolz.\n\ -Wenn Du mich wiedersehen\n\ -willst, wähle den ersten\n\ -Stern des Kursmenüs an!\n\ -Bis dann...")) - -DEFINE_DIALOG(DIALOG_117, 1, 4, 95, 200, _("\ -Schritte? Grabräuber?\n\ -Wer wagt es, den ewigen\n\ -Frieden unseres Grabes\n\ -zu stören?\n\ -Jenem sei gewiß, daß\n\ -wir diesen Frevel mit\n\ -aller Härte bestrafen\n\ -werden!\n\ -Unser Zorn wird ihn\n\ -zermalmen und Ra stehe\n\ -ihm bei, daß es schnell\n\ -gehen wird...")) - -DEFINE_DIALOG(DIALOG_118, 1, 6, 95, 200, _("\ -Wir sind besiegt...\n\ -Du hast den Fluch des\n\ -Pharaos gebrochen.\n\ -Jetzt finden wir unseren\n\ -verdienten Frieden. Nimm\n\ -als Dank diesen Stern!")) - -DEFINE_DIALOG(DIALOG_119, 1, 6, 30, 200, _("\ -Grrrr, offensichtlich war\n\ -ich ein wenig unachtsam.\n\ -Aber ich habe noch immer\n\ -die Prinzessin und die\n\ -Power-Sterne in meiner\n\ -Gewalt!\n\ -Ich werde dafür sorgen,\n\ -daß Du keine weiteren\n\ -Sterne erlangen wirst.\n\ -Unser nächstes Treffen\n\ -wird einen anderen Sieger\n\ -haben...bestimmt!")) - -DEFINE_DIALOG(DIALOG_120, 1, 4, 30, 200, _("\ -Woaaaah, Du hast schon\n\ -wieder gewonnen.\n\ -Hat mich etwa die Kraft\n\ -der Sterne verlassen?\n\ -Betrachte diesen Kampf\n\ -als Unentschieden!\n\ -Das nächste Mal bin ich\n\ -besser vorbereitet!\n\ -Ich warte am höchsten\n\ -Punkt des Schlosses auf\n\ -Dich...dort werden wir\n\ -sehen, wer stärker ist!")) - -DEFINE_DIALOG(DIALOG_121, 1, 6, 30, 200, _("\ -Aaaaaarrrgghh!\n\ -Du...hast...gewonnen!\n\ -Ich wollte mit meinen\n\ -Truppen dieses Schloss\n\ -erobern, doch Du hast\n\ -meine Pläne vereitelt.\n\ -Der Frieden kehrt\n\ -zurück in die Welten\n\ -der Wandgemälde...leider!\n\ -Jetzt bleibt mir nichts\n\ -anderes mehr übrig, als\n\ -mein Ende abzuwarten...")) - -DEFINE_DIALOG(DIALOG_122, 1, 4, 30, 200, _("\ -Das Schwarze Loch\n\ -Rechts: Arbeitsplattform\n\ -////Nebellabyrinth\n\ -Links:/Höhlensee")) - -DEFINE_DIALOG(DIALOG_123, 1, 3, 30, 200, _("\ -Titanenhöhle\n\ -Rechts: Wasserfall\n\ -Links:/Grüner Schalter")) - -DEFINE_DIALOG(DIALOG_124, 1, 5, 30, 200, _("\ -Arbeitsplattform\n\ -Zur Beachtung:\n\ -Aktiviere einen der\n\ -Richtungspfeile, um die\n\ -Plattform zu bewegen.")) - -DEFINE_DIALOG(DIALOG_125, 1, 3, 30, 200, _("\ -Rechts ist der Ausgang\n\ -des Nebellabyrinths. Bitte\n\ -Eingang links benutzen!")) - -DEFINE_DIALOG(DIALOG_126, 1, 3, 30, 200, _("\ -Oben:/ Schwarzes Loch\n\ -Rechts: Arbeitsplattform\n\ -////Nebellabyrinth")) - -DEFINE_DIALOG(DIALOG_127, 1, 4, 30, 200, _("\ -Höhlensee\n\ -Rechts: Titanenhöhle\n\ -Links:/Verlassene Mine\n\ -////(Geschlossen!!!)\n\ -Hier lebt ein Seemonster.\n\ -Führe auf seinem Rücken\n\ -eine Stampfattacke aus,\n\ -damit es den Kopf senkt!")) - -DEFINE_DIALOG(DIALOG_128, 1, 4, 95, 200, _("\ -Hey, es ist gegen die\n\ -königlichen Regeln, den\n\ -Herrscher aus dem Ring\n\ -zu werfen!")) - -DEFINE_DIALOG(DIALOG_129, 1, 4, 30, 200, _("\ -Herzlich willkommen!\n\ -In diesem Kurs kannst\n\ -Du den blauen Schalter\n\ -entdecken.\n\ -Löst Du ihn aus, kannst\n\ -Du in allen blauen Blöcken\n\ -Tarnkappen finden, die\n\ -Dich unsichtbar machen!\n\ -Auf diese Weise kannst Du\n\ -durch bestimmte Wände\n\ -gehen und Gegnern\n\ -ungesehen ausweichen.")) - -DEFINE_DIALOG(DIALOG_130, 1, 4, 30, 200, _("\ -Herzlich willkommen!\n\ -In diesem Kurs kannst\n\ -Du den grünen Schalter\n\ -entdecken.\n\ -Löst Du ihn aus, kannst\n\ -Du in allen grünen Blöcken\n\ -Titanenkappen finden, die\n\ -Dich unbesiegbar machen.\n\ -Bist Du mit diesen Mützen\n\ -ausgerüstet, kannst Du\n\ -unter Wasser laufen und\n\ -brauchst nicht zu atmen.")) - -DEFINE_DIALOG(DIALOG_131, 1, 4, 30, 200, _("\ -Herzlich willkommen!\n\ -In diesem Kurs kannst\n\ -Du den roten Schalter\n\ -entdecken.\n\ -Löst Du ihn aus, kannst\n\ -Du in allen roten Blöcken\n\ -Federkappen finden, mit\n\ -denen Du fliegen kannst.\n\ -Benutze den Dreisprung,\n\ -um den Flug zu starten.\n\ -Die Kontrolle funktioniert\n\ -wie bei einem Flugzeug.\n\ -Bewege den Analog-Stick\n\ -nach vorne, um zu sinken,\n\ -und nach hinten, um zu\n\ -steigen!")) - -DEFINE_DIALOG(DIALOG_132, 1, 3, 30, 200, _("\ -Tsetsetse...Mario!\n\ -Du versuchst doch nicht\n\ -etwa, mich zu betrügen?\n\ -Abkürzungen sind nicht\n\ -erlaubt.\n\ -Du bist disqualifiziert!")) - -DEFINE_DIALOG(DIALOG_133, 1, 5, 30, 200, _("\ -Ich freue mich, Dich zu\n\ -sehen. Die Prinzessin...\n\ -ich...und alle anderen\n\ -sind in den Wänden des\n\ -Schlosses gefangen.\n\ -Bowser hat die Sterne\n\ -entwendet und benutzt\n\ -sie, um seine eigenen\n\ -Welten in den Gemälden\n\ -zu erschaffen.\n\ -Du mußt die Power-Sterne\n\ -finden. Mit ihrer Hilfe\n\ -kannst Du Bowsers Siegel\n\ -an den Türen des Schlosses\n\ -brechen.\n\ -Im Erdgeschoß gibt es\n\ -vier Welten. Beginne in\n\ -der Welt der Bob-Ombs.\n\ -Das ist die einzige Tür,\n\ -die nicht versiegelt ist.\n\ -Hast Du acht Sterne\n\ -gesammelt, kannst Du die\n\ -Tür mit dem großen Stern\n\ -öffnen. Dahinter befindet\n\ -sich die Prinzessin!")) - -DEFINE_DIALOG(DIALOG_134, 1, 4, 30, 200, _("\ -Am Beginn jeder Welt\n\ -erhältst Du einen Hinweis,\n\ -wo der nächste Stern\n\ -zu finden ist.\n\ -Du kannst sie in beliebiger\n\ -Reihenfolge sammeln, aber\n\ -einige erscheinen nur unter\n\ -bestimmten Bedingungen.\n\ -Nachdem Du ein paar\n\ -Sterne gefunden hast,\n\ -kannst Du Dich in anderen\n\ -Welten umsehen.")) - -DEFINE_DIALOG(DIALOG_135, 1, 5, 30, 200, _("\ -Bowser hat sich die\n\ -Power-Sterne unter den\n\ -Nagel gerissen. In jeder\n\ -Welt hat er sechs Sterne\n\ -versteckt.\n\ -Manche der Sterne kannst\n\ -Du aber erst finden, wenn\n\ -Du die farbigen Schalter\n\ -in den Schalterpalästen\n\ -ausgelöst hast.\n\ -Bereits gefundene Sterne\n\ -kannst Du zu Beginn jeder\n\ -Welt sehen. Triff besiegte\n\ -Gegner, indem Du erneut\n\ -ihren Stern anwählst.")) - -DEFINE_DIALOG(DIALOG_136, 1, 4, 30, 200, _("\ -Wow, Du hast bereits so\n\ -viele Sterne gefunden?\n\ -Ich bin sicher, das war\n\ -kein Kinderspiel!\n\ -Ich habe noch einige Tips,\n\ -die Dir bei der Suche nach\n\ -den Power-Sternen von\n\ -Nutzen sein könnten:\n\ -Sammle Münzen, um Deine\n\ -Energie aufzufüllen. Ihre\n\ -Farbe entscheidet, wieviel\n\ -Energie Du erhältst.\n\ -Gelbe Münzen geben eine,\n\ -rote Münzen zwei und\n\ -blaue Münzen sogar fünf\n\ -Energieeinheiten zurück.\n\ -Damit die blauen Münzen\n\ -sichtbar werden, mußt\n\ -Du ihre Schalter in den\n\ -Boden stampfen.\n\ -Halte Verletzungen gering,\n\ -indem Du bei Stürzen im\n\ -letzen Moment eine\n\ -Stampfattacke ausführst.")) - -DEFINE_DIALOG(DIALOG_137, 1, 5, 30, 200, _("\ -Vielen Dank! Du hast\n\ -schon sehr viele Sterne\n\ -gesammelt und Bowser in\n\ -ein höheres Stockwerk\n\ -verbannt.\n\ -Wußtest Du eigentlich,\n\ -daß Du in jeder Welt\n\ -einen geheimen Stern\n\ -erhältst, wenn Du\n\ -100 Münzen sammelst?")) - -DEFINE_DIALOG(DIALOG_138, 1, 4, 30, 200, _("\ -Unten:/Höhlensee\n\ -Links:/Schwarzes Loch\n\ -Rechts: Nebellabyrinth\n\ -////(Geschlossen!!!)")) - -DEFINE_DIALOG(DIALOG_139, 1, 4, 30, 200, _("\ -Automatische Plattform\n\ -Sobald Du diese Plattform\n\ -betrittst, setzt sie sich\n\ -in Bewegung.\n\ -Sie folgt einem\n\ -programmierten Kurs und\n\ -verschwindet automatisch,\n\ -wenn Du sie verläßt.")) - -DEFINE_DIALOG(DIALOG_140, 1, 6, 30, 200, _("\ -Arbeitsplattform\n\ -Rechts: Nebellabyrinth\n\ -////Eingang\n\ -Links:/Schwarzes Loch\n\ -////Aufzug 1\n\ -Pfeil:/Standort")) - -DEFINE_DIALOG(DIALOG_141, 1, 5, 150, 200, _("\ -Du hast einen der\n\ -gestohlenen Power-Sterne\n\ -gefunden.\n\ -Damit kannst Du einige\n\ -versiegelte Türen öffnen.\n\ -Versuch's mal im Zimmer\n\ -der Prinzessin im\n\ -1. Stock oder in\n\ -Wummps Festung im\n\ -Erdgeschoß der Vorhalle.\n\ -Halte Bowser auf und\n\ -rette uns und die\n\ -Power-Sterne.\n\ -Wir zählen auf Dich und\n\ -drücken Dir die Daumen.")) - -DEFINE_DIALOG(DIALOG_142, 1, 5, 150, 200, _("\ -Du hast drei magische\n\ -Power-Sterne gesammelt.\n\ -Jetzt kannst Du jede Tür\n\ -öffnen, deren Siegel eine\n\ -Drei trägt.\n\ -Du kannst die Türen so oft\n\ -passieren, wie Du willst.\n\ -Aber paß auf: In höheren\n\ -Stockwerken werden die\n\ -Gegner viel stärker!")) - -DEFINE_DIALOG(DIALOG_143, 1, 6, 150, 200, _("\ -Du hast acht Sterne\n\ -gesammelt. Jetzt kannst\n\ -Du die Tür mit dem\n\ -großen Stern öffnen.\n\ -Die Prinzessin hält sich\n\ -dahinter auf!")) - -DEFINE_DIALOG(DIALOG_144, 1, 5, 150, 200, _("\ -Du hast 30 Power-Sterne\n\ -gesammelt. Jetzt kannst\n\ -Du die Tür mit dem\n\ -großen Stern öffnen. Aber\n\ -warte noch einen Moment!\n\ -Hast Du die beiden Säulen\n\ -in den Boden gestampft?\n\ -Und Du hast doch wohl\n\ -nicht Deine Mütze\n\ -verloren, oder?\n\ -Wenn ja, mußt Du den\n\ -Riesengeier mit einer\n\ -Stampfattacke besiegen!\n\ -Ach ja: Bowser hält sich\n\ -jetzt im Untergrund auf.")) - -DEFINE_DIALOG(DIALOG_145, 1, 4, 150, 200, _("\ -Du hast 50 Power-Sterne\n\ -gesammelt. Jetzt kannst\n\ -Du die Tür mit dem großen\n\ -Stern im 3. Stock öffnen.\n\ -Hast Du bereits alle\n\ -Schalterpaläste gefunden?\n\ -Diese besonderen Mützen\n\ -sind sehr nützlich.")) - -DEFINE_DIALOG(DIALOG_146, 1, 6, 150, 200, _("\ -Du hast 70 Power-Sterne\n\ -gesammelt. Jetzt kannst\n\ -Du das Geheimnis der\n\ -endlosen Treppe lüften.\n\ -Begib Dich zum finalen\n\ -Duell mit Bowser!")) - -DEFINE_DIALOG(DIALOG_147, 1, 4, 30, 200, _("\ -Bevor Du weitergehst,\n\ -solltest Du nach den\n\ -versteckten Schaltern\n\ -suchen.\n\ -Hast Du sie gefunden,\n\ -kannst Du in allen\n\ -bunten Blöcken besondere\n\ -Mützen finden.\n\ -In roten Blöcken findest\n\ -Du Federkappen, in\n\ -grünen Titanenkappen\n\ -und in blauen Tarnkappen.\n\ -Allerdings mußt Du bereits\n\ -einige Sterne besitzen, um\n\ -die Schalterpaläste finden\n\ -zu können!")) - -DEFINE_DIALOG(DIALOG_148, 1, 4, 30, 200, _("\ -Achtung, Achtung!\n\ -Versuche bloß nicht, den\n\ -Berg mit dem Dreisprung\n\ -zu erreichen!\n\ -Außerdem ist das Wasser\n\ -sehr kalt - Deine Fitness\n\ -könnte bei einem Bad\n\ -großen Schaden nehmen!")) - -DEFINE_DIALOG(DIALOG_149, 1, 5, 30, 200, _("\ -Willkommen auf der\n\ -Rutschbahn der Prinzessin.\n\ -Hier befindet sich ein\n\ -Stern, den Bowser nicht\n\ -entdeckt hat.\n\ -Drücke den Analog-Stick\n\ -nach vorne, um zu\n\ -beschleunigen.\n\ -Wenn Du sehr schnell bist,\n\ -erhältst Du den Stern.")) - -DEFINE_DIALOG(DIALOG_150, 1, 5, 30, 200, _("\ -Aaaaaah! Sieh Dir diese\n\ -Schweinerei an. Du hast\n\ -meine Wohnung überflutet.\n\ -Meine ganze Einrichtung\n\ -ist ruiniert!\n\ -Ich bin stinksauer! Alles\n\ -läuft schief, seit ich\n\ -diesen dämlichen Stern\n\ -gefunden habe. Ich...\n\ -Ich...werde...")) - -DEFINE_DIALOG(DIALOG_151, 1, 5, 30, 200, _("\ -Ich halte das nicht mehr\n\ -aus - zuerst überflutest\n\ -Du meine Wohnung und\n\ -dann hüpfst Du auch noch\n\ -auf mir herum!?\n\ -Mir reicht's! Ich werde\n\ -Dir richtiges Benehmen\n\ -beibringen! Du...Ich...\n\ -werde Dich...Ich werde\n\ -Dich lehren...")) - -DEFINE_DIALOG(DIALOG_152, 1, 4, 30, 200, _("\ -Ooooh, halt, halt! Ich\n\ -gebe auf. Hier, nimm\n\ -den Stern. Ich brauche\n\ -ihn nicht mehr.\n\ -Ich kann mir die Sterne\n\ -durch das Loch in der\n\ -Decke ansehen, wann\n\ -immer ich möchte.")) - -DEFINE_DIALOG(DIALOG_153, 1, 4, 30, 200, _("\ -Hey, wer ist da? Wer\n\ -meint, auf mir 'rumlaufen\n\ -zu müssen? Ein Eisfloh\n\ -oder eine Schneefliege?\n\ -Egal, was es ist, auf\n\ -jeden Fall stört es mich.\n\ -Aber mein Eisatem wird\n\ -mich davon befreien!")) - -DEFINE_DIALOG(DIALOG_154, 1, 6, 30, 200, _("\ -Paß gut auf Deine Mütze\n\ -auf - ohne sie bist Du\n\ -leicht verletzbar!\n\ -Wenn Du sie verloren hast,\n\ -findest Du sie in\n\ -derselben Welt wieder.")) - -DEFINE_DIALOG(DIALOG_155, 1, 3, 30, 200, _("\ -Hi, Mario! Ich erzähle\n\ -Dir einige Geheimnisse\n\ -des Schlosses:\n\ -Es heißt, daß der Spiegel\n\ -des Spiegelsaals magische\n\ -Fähigkeiten besitzt.\n\ -Er soll Dinge zeigen, die\n\ -Du mit bloßem Auge nicht\n\ -erkennen kannst.\n\ -Aber das ist bestimmt\n\ -Unfug und lediglich\n\ -dummer Aberglaube.\n\ -Bei der versunkenen\n\ -Stadt ist das schon\n\ -etwas anderes.\n\ -Du kannst den Pegel des\n\ -Wassers durch die Sprünge\n\ -ins Gemälde beeinflussen.\n\ -Am besten schaust Du Dir\n\ -die Wirkung direkt im\n\ -Gemälde an!")) - -DEFINE_DIALOG(DIALOG_156, 1, 4, 30, 200, _("\ -Diese Uhr ist wirklich\n\ -ungewöhnlich. Ihr Inneres\n\ -verändert sich im Laufe\n\ -der Zeit.")) - -DEFINE_DIALOG(DIALOG_157, 1, 5, 30, 200, _("\ -Achte auf den Treibsand!\n\ -Solltest Du einmal darin\n\ -versinken, findet Dein\n\ -Gemäldebesuch ein rasches\n\ -Ende.\n\ -Schwarze Löcher sind\n\ -bodenlose Fallen. Du wirst\n\ -das Gemälde neu betreten\n\ -müssen, wenn Du in eines\n\ -dieser Löcher hineinfällst.")) - -DEFINE_DIALOG(DIALOG_158, 1, 6, 30, 200, _("\ -Mit dem richtigen Timing\n\ -kannst Du sehr hoch\n\ -springen. Den Dreisprung\n\ -kannst Du ausführen, wenn\n\ -Du rennst und dreimal\n\ -hintereinander springst.\n\ -Wandsprünge sind eine\n\ -effektive Methode, um\n\ -hohe Stellen zu erreichen.\n\ -Springe an eine Wand.\n\ -Sobald Du sie berührst,\n\ -mußt Du erneut springen!")) - -DEFINE_DIALOG(DIALOG_159, 1, 4, 30, 200, _("\ -Gehst Du in die Hocke und\n\ -drückst den Sprungknopf,\n\ -kannst Du einen\n\ -Rückwärtssalto ausführen.\n\ -Du machst einen\n\ -Weitsprung, wenn Du im\n\ -Rennen den [Z]-Knopf\n\ -drückst und springst.")) - -DEFINE_DIALOG(DIALOG_160, 1, 6, 30, 200, _("\ -Drücke im Rennen den\n\ -[B]-Knopf, um einen\n\ -Hechtsprung zu machen.\n\ -Mit dem [A]- oder [B]-Knopf\n\ -kommt Mario auf die Füße\n\ -zurück.")) - -DEFINE_DIALOG(DIALOG_161, 1, 5, 30, 200, _("\ -Hey... Mario!!! Seit\n\ -unserem letzten Abenteuer\n\ -ist viel Zeit vergangen.\n\ -Ich freue mich, Dich\n\ -wiederzusehen.\n\ -Man erzählte mir, daß ich\n\ -Dich hier treffen könnte,\n\ -aber ich hatte die\n\ -Hoffnung schon fast\n\ -aufgegeben.\n\ -Ist es wahr? Du hast\n\ -Bowser besiegt und alle\n\ -gestohlenen Power-Sterne\n\ -zurückerobert?\n\ -Unglaublich!!!\n\ -Und die Prinzessin?\n\ -Du hast sie gerettet?\n\ -Cool! Aber ich wußte\n\ -natürlich, daß Du es\n\ -schaffen würdest.\n\ -Nun habe ich noch eine\n\ -ganz spezielle Nachricht\n\ -für Dich:\n\ -Danke, daß Du SUPER\n\ -MARIO 64 gespielt hast.\n\ -Du hast jetzt alle Sterne\n\ -gefunden und damit das\n\ -Spiel beendet. Aber wir\n\ -haben noch eine kleine\n\ -Überraschung für Dich!\n\ -Wir hoffen, sie wird Dir\n\ -gefallen, denn du kannst\n\ -das Spiel nochmals unter\n\ -veränderten Bedingungen\n\ -spielen. Viel Spaß!\n\ -Es könnte sein, daß Du\n\ -dabei neue Entdeckungen\n\ -machst, die Dir bis jetzt\n\ -verborgen geblieben sind.\n\ -Das Super Mario 64 Team")) - -DEFINE_DIALOG(DIALOG_162, 1, 4, 30, 200, _("\ -Nein, nein, nein! Nicht\n\ -Du schon wieder! Ich habe\n\ -jetzt wirklich keine Zeit,\n\ -über Sterne zu quatschen!\n\ -Hier, nimm ihn und laß\n\ -mich runter. Ich habe noch\n\ -wichtige Geschäfte zu\n\ -erledigen!")) - -DEFINE_DIALOG(DIALOG_163, 1, 5, 30, 200, _("\ -Ich glaub's nicht! Du hast\n\ -mich besiegt...wie konnte\n\ -das nur geschehen. Meine\n\ -Truppen, die Sterne...\n\ -alles umsonst!\n\ -Was??? Es gab insgesamt\n\ -120 Sterne im Schloss zu\n\ -finden? Dann habe ich\n\ -wohl einige bei meiner\n\ -Suche übersehen!\n\ -Jetzt kehrt der Frieden\n\ -zurück in die Welten der\n\ -Gemälde - was für ein\n\ -fürchterlicher Gedanke...\n\ -Aaaaaarrrgghhhh!!!\n\ -Das kann ich mir nicht\n\ -länger ansehen - ich\n\ -verschwinde. So long...\n\ -Bis zum nächsten Mal.\n\ -Ich komme wieder...")) - -DEFINE_DIALOG(DIALOG_164, 1, 6, 30, 200, _("\ -Hi! Wie geht's, Mario?\n\ -Ich bin zwar etwas außer\n\ -Übung, aber ein Rennen\n\ -gegen den Schlidderkönig\n\ -ist immer eine große\n\ -Herausforderung.\n\ -Also, Kumpel, wie steht's?\n\ -Sollen wir ein kleines\n\ -Match wagen?\n\ -\n\ -//Okay!///Später!")) - -DEFINE_DIALOG(DIALOG_165, 1, 4, 30, 200, _("\ -Sei vorsichtig, wenn Du\n\ -um den Pfahl herumrennst,\n\ -damit Dir nicht schlecht\n\ -wird!")) - -DEFINE_DIALOG(DIALOG_166, 1, 5, 30, 200, _("\ -Ich mache gerade einen\n\ -kleinen Waldlauf. Komm\n\ -doch später wieder\n\ -vorbei!\n\ -Dein Freund Koopa")) - -DEFINE_DIALOG(DIALOG_167, 1, 4, 30, 200, _("\ -Dort vorne ist das\n\ -Schloss der Prinzessin.\n\ -Sieh Dich zunächst hier\n\ -im Schlossgarten um.\n\ -Die Steuerung ist ganz\n\ -einfach:\n\ -Drücke den [A]-Knopf, um\n\ -zu springen.\n\ -Schläge kannst Du mit\n\ -dem [B]-Knopf ausführen.\n\ -Drückst Du den [Z]-Knopf,\n\ -duckt sich Mario.\n\ -Schilder kannst Du mit\n\ -dem [A]- oder [B]-Knopf\n\ -lesen, wenn Du direkt\n\ -davor stehst.")) - -DEFINE_DIALOG(DIALOG_168, 1, 4, 30, 200, _("\ -Bist Du immer noch hier?\n\ -Findest Du nicht, daß\n\ -Du bereits genug Schaden\n\ -angerichtet hast?")) - -DEFINE_DIALOG(DIALOG_169, 1, 4, 30, 200, _("\ -Dies ist die erste und\n\ -letzte Warnung:\n\ -Das Betreten dieser\n\ -Höhle ist verboten!!!\n\ -Wer sich hier ohne meine\n\ -Erlaubnis Zutritt\n\ -verschafft, handelt sich\n\ -eine Menge Ärger ein!!!")) diff --git a/text/define_courses.inc.c b/text/define_courses.inc.c deleted file mode 100644 index 3a67c531..00000000 --- a/text/define_courses.inc.c +++ /dev/null @@ -1,30 +0,0 @@ -#define COURSE_ACTS(id, name, a,b,c,d,e,f) \ - static const u8 GLUE2(COURSE_TABLE, _ ## id)[] = { name }; - -#define SECRET_STAR(id, name) \ - static const u8 GLUE2(COURSE_TABLE, _ ## id)[] = { name }; - -#define CASTLE_SECRET_STARS(str) \ - static const u8 GLUE2(COURSE_TABLE, _castle_secret_stars)[] = { str }; - -#define EXTRA_TEXT(id, str) - -#include "courses.h" - -#undef COURSE_ACTS -#undef SECRET_STAR -#undef CASTLE_SECRET_STARS - -#define COURSE_ACTS(id, name, a,b,c,d,e,f) GLUE2(COURSE_TABLE, _ ## id), -#define SECRET_STAR(id, name) GLUE2(COURSE_TABLE, _ ## id), -#define CASTLE_SECRET_STARS(str) GLUE2(COURSE_TABLE, _castle_secret_stars), - -const u8 *const COURSE_TABLE[] = { -#include "courses.h" - NULL -}; - -#undef COURSE_ACTS -#undef SECRET_STAR -#undef CASTLE_SECRET_STARS - diff --git a/text/define_text.inc.c b/text/define_text.inc.c deleted file mode 100644 index d33031f6..00000000 --- a/text/define_text.inc.c +++ /dev/null @@ -1,103 +0,0 @@ -// == debug table == - -#ifndef VERSION_EU - -// (this wasn't translated for US, and was removed in EU) - -static const u8 Debug0[] = { - _("STAGE SELECT\n" - " つづける?\n" - " 1 マウンテン\n" - " 2 ファイアーバブル\n" - " 3 スノースライダー\n" - " 4 ウォーターランド\n" - "   クッパ1ごう\n" - " もどる") -}; - -static const u8 Debug1[] = { - _("PAUSE    \n" - " つづける?\n" - " やめる ?") -}; - -static const struct DialogEntry debug_text_entry_0 = { - 1, 8, 30, 200, Debug0 -}; - -static const struct DialogEntry debug_text_entry_1 = { - 1, 3, 100, 150, Debug1 -}; - -const struct DialogEntry *const seg2_debug_text_table[] = { - &debug_text_entry_0, &debug_text_entry_1, NULL, -}; - -#endif - - -// == dialog == -// (defines en_dialog_table etc.) - -#define DEFINE_DIALOG(id, _1, _2, _3, _4, str) \ - static const u8 dialog_text_ ## id[] = { str }; - -#include "dialogs.h" - -#undef DEFINE_DIALOG -#define DEFINE_DIALOG(id, unused, linesPerBox, leftOffset, width, _) \ - static const struct DialogEntry dialog_entry_ ## id = { \ - unused, linesPerBox, leftOffset, width, dialog_text_ ## id \ - }; - -#include "dialogs.h" - -#undef DEFINE_DIALOG -#define DEFINE_DIALOG(id, _1, _2, _3, _4, _5) &dialog_entry_ ## id, - -const struct DialogEntry *const seg2_dialog_table[] = { -#include "dialogs.h" - NULL -}; - - -// == courses == -// (defines en_course_name_table etc.) -// The game duplicates this in levels/menu/leveldata.c in EU, so we split -// it out into a separate include file. - -#define COURSE_TABLE seg2_course_name_table -#include "define_courses.inc.c" - -// == acts == -// (defines en_act_name_table etc.) - -#define COURSE_ACTS(id, name, a,b,c,d,e,f) \ - static const u8 act_name_ ## id ## _1[] = { a }; \ - static const u8 act_name_ ## id ## _2[] = { b }; \ - static const u8 act_name_ ## id ## _3[] = { c }; \ - static const u8 act_name_ ## id ## _4[] = { d }; \ - static const u8 act_name_ ## id ## _5[] = { e }; \ - static const u8 act_name_ ## id ## _6[] = { f }; - -#define SECRET_STAR(id, name) -#define CASTLE_SECRET_STARS(str) - -#undef EXTRA_TEXT -#define EXTRA_TEXT(id, str) \ - static const u8 extra_text_ ## id[] = { str }; - -#include "courses.h" - -#undef COURSE_ACTS -#undef EXTRA_TEXT - -#define COURSE_ACTS(id, name, a,b,c,d,e,f) \ - act_name_ ## id ## _1, act_name_ ## id ## _2, act_name_ ## id ## _3, \ - act_name_ ## id ## _4, act_name_ ## id ## _5, act_name_ ## id ## _6, -#define EXTRA_TEXT(id, str) extra_text_ ## id, - -const u8 *const seg2_act_name_table[] = { -#include "courses.h" - NULL -}; diff --git a/text/fr/courses.h b/text/fr/courses.h deleted file mode 100644 index 96351ff2..00000000 --- a/text/fr/courses.h +++ /dev/null @@ -1,80 +0,0 @@ -COURSE_ACTS(COURSE_BOB, _(" 1 BATAILLE DE BOB-OMB"), - _("ROI BOB-OMB DU SOMMET") , _("COURSE CONTRE KOOPA-RAPIDO") , _("CANON VERS L'ILE PERCHEE"), - _("LES 8 PIECES ROUGES") , _("VOL DU MARIO AILE") , _("DERRIERE LA CAGE DE CHOMP")) - -COURSE_ACTS(COURSE_WF, _(" 2 FORTERESSE DE WHOMP"), - _("DESTRUCTION DU GROS WHOMP") , _("EN HAUT DE LA FORTERESSE") , _("CANON VERS LES CIEUX"), - _("PIECES ROUGES DANS LES AIRS") , _("TOMBEZ DANS LA CAGE PERCHEE") , _("CANON VERS UN MUR...")) - -COURSE_ACTS(COURSE_JRB, _(" 3 BAIE DES PIRATES"), - _("PILLEZ LE BATEAU COULE") , _("L'ANGUILLE VEUT FAIRE JOUJOU?") , _("TRESOR DANS LA CAVERNE"), - _("PIECES ROUGES A BORD!") , _("CANON VERS LES PILIERS") , _("DANS LE GEYSER")) - -COURSE_ACTS(COURSE_CCM, _(" 4 MONTAGNE GLA-GLA"), - _("GLISSADE SUR GLACE") , _("PETIT PINGOUIN PERDU") , _("COURSE DU PINGOUIN"), - _("8 PIECES ROUGES GIVREES") , _("BONHOMME DE NEIGE SANS TETE") , _("MURS POUR REBONDIR")) - -COURSE_ACTS(COURSE_BBH, _(" 5 MANOIR DE BIG BOO"), - _("CHERCHEZ LE BIG BOO") , _("MANEGE DES BOOS PAS BEAUX") , _("SECRET DES LIVRES HANTES"), - _("TROUVEZ LES 8 PIECES ROUGES") , _("BALCON DE BIG BOO") , _("UN OEIL SUR LES SALLES SECRETES")) - -COURSE_ACTS(COURSE_HMC, _(" 6 CAVERNE BRUMEUSE"), - _("GROS BIBI DE LA CAVERNE") , _("CHARIOT POUR PIECES ROUGES") , _("COURSE DE METAL MARIO"), - _("DANS LE LABYRINTHE TOXIQUE") , _("AU-DESSUS DES GAZ...") , _("ATTENTION AUX BOULETS")) - -COURSE_ACTS(COURSE_LLL, _(" 7 LAVES FATALES"), - _("CRAMEZ LE GROS MOCHE") , _("POUSSEZ LES PETITS MOCHES") , _("PUZZLE DE 8 PIECES ROUGES"), - _("BALADE SUR LA BUCHE") , _("CHAUD DANS LE VOLCAN") , _("ASCENCEUR DANS LE VOLCAN")) - -COURSE_ACTS(COURSE_SSL, _(" 8 SABLES TROP MOUVANTS"), - _("DANS LES GRIFFES DU VAUTOUR") , _("AU SOMMET DE LA PYRAMIDE") , _("DANS L'ANCIENNE PYRAMIDE"), - _("LES QUATRE PILIERS DE LA FOI") , _("VOL VERS LES PIECES ROUGES") , _("ENIGME DE LA PYRAMIDE")) - -COURSE_ACTS(COURSE_DDD, _(" 9 AFFREUX BASSIN"), - _("SOUS-MARIN DE BOWSER") , _("COFFRES DANS LE COURANT") , _("PERCHES POUR PIECES ROUGES"), - _("DANS LE GEYSER") , _("RECOMPENSE DE LA RAIE") , _("ASSOCIATION DE CASQUETTES...")) - -COURSE_ACTS(COURSE_SL, _("10 CHEZ LE ROI DES NEIGES"), - _("GROSSE TETE DU BONHOMME") , _("COMBATTEZ LE GROS MOCHE GIVRE") , _("DANS LE GLAÇON"), - _("VRILLE DEPUIS LE LAC") , _("CARAPACE POUR PIECES ROUGES") , _("DANS L'IGLOO")) - -COURSE_ACTS(COURSE_WDW, _("11 MONDE TREMPE-SECHE"), - _("MINI PLATES-FORMES FLECHEES!") , _("SUR LES TOITS") , _("ENIGME DES CHIFFRES CACHES"), - _("ASCENSEUR EXPRESS!") , _("PIECES ROUGES: VILLE ENGLOUTIE"), _("COURSE EN VILLE")) - -COURSE_ACTS(COURSE_TTM, _("12 TROP HAUTE MONTAGNE"), - _("ESCALADEZ LA MONTAGNE") , _("MYSTERE DE LA CAGE DU SINGE") , _("PIECES ROUGES SUR CHAMPIGNON"), - _("PAROI MYSTERIEUSE") , _("PANORAMA DU PONT") , _("CANON VERS LE CHAMPIGNON")) - -COURSE_ACTS(COURSE_THI, _("13 ILE GRANDS-PETITS"), - _("DETRUISEZ LES MAXI-CARNIVORES") , _("AU SOMMET DE L'ILE DES GEANTS") , _("KOOPA-RAPIDO, LA VENGEANCE"), - _("CINQ TOUT PETITS SECRETS") , _("LES PIECES ROUGES DU GIGOTEUR") , _("ENERVEZ LE GIGOTEUR")) - -COURSE_ACTS(COURSE_TTC, _("14 HORLOGE TIC-TAC"), - _("ROULEMENTS DANS LA CAGE") , _("LES TROUS ET LE PENDULE") , _("CHEVAUCHEZ L'AIGUILLE"), - _("L'ECRABOUILLEUR") , _("SAUTS SYNCHRONISES") , _("L'HEURE PILE POUR LES PIECES")) - -COURSE_ACTS(COURSE_RR, _("15 COURSE ARC-EN-CIEL"), - _("CROISIERE SUR L'ARC-EN-CIEL") , _("MANOIR DANS LES AIRS") , _("LABYRINTHE DES PIECES ROUGES"), - _("BALANÇOIRE CELESTE") , _("VICIEUX TRIANGLES!") , _("L'ARC-EN-CIEL ET AU-DELA")) - -SECRET_STAR(COURSE_BITDW, _(" BOWSER DES TENEBRES")) -SECRET_STAR(COURSE_BITFS, _(" BOWSER DES LAVES")) -SECRET_STAR(COURSE_BITS, _(" BOWSER DES CIEUX")) -SECRET_STAR(COURSE_PSS, _(" GLISSADE DE LA PRINCESSE")) -SECRET_STAR(COURSE_COTMC, _(" MINE DES CASQUETTES-METAL")) -SECRET_STAR(COURSE_TOTWC, _(" INTERRUPTEUR DE LA TOUR AILEE")) -SECRET_STAR(COURSE_VCUTM, _(" INVISIBLE SOUS LES DOUVES")) -SECRET_STAR(COURSE_WMOTR, _(" AU-DELA DE L'ARC-EN-CIEL")) -SECRET_STAR(COURSE_SA, _(" AQUARIUM SECRET")) -SECRET_STAR(COURSE_CAKE_END, _("")) - -CASTLE_SECRET_STARS(_(" ETOILES SECRETES")) - -EXTRA_TEXT(0, _("UNE ETOILE SECRETE DU CHATEAU")) -EXTRA_TEXT(1, _("")) -EXTRA_TEXT(2, _("")) -EXTRA_TEXT(3, _("")) -EXTRA_TEXT(4, _("")) -EXTRA_TEXT(5, _("")) -EXTRA_TEXT(6, _("")) diff --git a/text/fr/dialogs.h b/text/fr/dialogs.h deleted file mode 100644 index 26e8c1fb..00000000 --- a/text/fr/dialogs.h +++ /dev/null @@ -1,2297 +0,0 @@ -// Parameters: dialog enum ID, (unused), lines per box, left offset, width - -DEFINE_DIALOG(DIALOG_000, 1, 6, 30, 200, _("\ -Incroyable! Vous voilà\n\ -propulsé au beau milieu\n\ -d'un champ de bataille!\n\ -\n\ -\n\ -\n\ -Vous trouverez dans les\n\ -mondes au milieu des\n\ -tableaux les étoiles que\n\ -Bowser a dérobées...\n\ -\n\ -\n\ -Tout d'abord, parlez au\n\ -gentil Bob-omb (appuyez\n\ -sur [B] pour parler). Il\n\ -vous aidera sûrement,\n\ -ainsi que ses camarades\n\ -dans d'autres niveaux...\n\ -Pour lire une pancarte:\n\ -arrêtez-vous, faites face\n\ -au panneau et appuyez sur\n\ -[B]. Appuyez sur [A] ou [B]\n\ -pour lire la suite du\n\ -texte.")) - -DEFINE_DIALOG(DIALOG_001, 1, 5, 95, 200, _("\ -Attention! Si tu te\n\ -promènes par ici, tu\n\ -risques de te faire\n\ -écrabouiller par une bombe\n\ -à eau!\n\ -Les méchants Bob-ombs\n\ -adorent se bagarrer, et\n\ -ils trouvent toujours le\n\ -moyen d'attaquer\n\ -quelqu'un...\n\ -Cette prairie est devenue\n\ -un champ de bataille\n\ -depuis que le Roi Bob-omb\n\ -s'est approprié l'étoile de\n\ -puissance.\n\ -Peux-tu aller chercher\n\ -l'étoile pour nous?\n\ -\n\ -\n\ -\n\ -Traverse le pont, va à\n\ -gauche et prends le\n\ -chemin vers le haut pour\n\ -trouver le Roi Bob-omb.\n\ -\n\ -Reviens me voir lorsque tu\n\ -auras récupéré l'étoile de\n\ -puissance!")) - -DEFINE_DIALOG(DIALOG_002, 1, 6, 95, 200, _("\ -Hé, toi! C'est dangereux\n\ -par ici! Alors écoute bien\n\ -mon conseil:\n\ -\n\ -\n\ -\n\ -Traverse les deux ponts\n\ -devant toi, tout en\n\ -faisant attention aux\n\ -bombes à eau.\n\ -\n\ -\n\ -Le Roi Bob-omb au\n\ -sommet de la montagne\n\ -est très puissant...\n\ -Ne le laisse pas\n\ -t'attraper!\n\ -\n\ -Nous sommes de gentils\n\ -Bob-ombs, et nous sommes\n\ -de ton côté.\n\ -N'hésite pas à venir nous\n\ -parler à chaque fois que\n\ -tu en as envie!")) - -DEFINE_DIALOG(DIALOG_003, 1, 5, 95, 200, _("\ -Merci beaucoup Mario!\n\ -Tu as éclaté le vilain Roi\n\ -Bob-omb comme une vieille\n\ -figue! Mais tout ceci\n\ -n'est qu'un début...\n\ -D'autres gros méchants\n\ -pas beaux détiennent des\n\ -étoiles de puissance.\n\ -\n\ -\n\ -Si tu récupères d'autres\n\ -étoiles, tu pourras ouvrir\n\ -de nouvelles portes menant\n\ -à de nouveaux mondes!\n\ -\n\ -Mes camarades Bob-ombs\n\ -t'attendent. Si tu leur\n\ -parles, ils te prépareront\n\ -de jolis canons!")) - -DEFINE_DIALOG(DIALOG_004, 1, 6, 95, 200, _("\ -Nous sommes des\n\ -Bob-ombs pacifiques, nous\n\ -n'utilisons pas de canons.\n\ -\n\ -\n\ -\n\ -Mais si tu désires foncer\n\ -vers les cieux,\n\ -No Problemo: nous\n\ -nous ferons une joie de te\n\ -préparer tous les canons\n\ -de ce niveau. Bon voyage!")) - -DEFINE_DIALOG(DIALOG_005, 1, 5, 30, 200, _("\ -Hé, Mario! C'est vrai ce\n\ -qu'on raconte? Tu as\n\ -vraiment battu le Roi\n\ -Bob-omb? Cool!\n\ -\n\ -Tu dois être vachement\n\ -fort et rapide! Mais\n\ -es-tu aussi rapide que\n\ -moi, Koopa-Rapido?\n\ -Je crois bien que non...\n\ -Ça te dirait une petite\n\ -course jusqu'au sommet\n\ -de la montagne, là où\n\ -était le Roi Bob-omb?\n\ -Alors, qu'en dis-tu?\n\ -Lorsque je dis 『partez』,\n\ -la course commence...\n\ -Prêt...\n\ -\n\ -//Partez!//Heu, non.")) - -DEFINE_DIALOG(DIALOG_006, 1, 4, 30, 200, _("\ -Hé! Tu te moques de moi,\n\ -p'tit nain pas beau?\n\ -Tu dois courir du début\n\ -jusqu'à la fin!\n\ -A plus tard. Reviens me\n\ -voir lorsque tu arrêteras\n\ -de tricher...")) - -DEFINE_DIALOG(DIALOG_007, 1, 5, 30, 200, _("\ -Heuufff...fff...peufff...\n\ -Whoa! Tu...es...vraiment\n\ -rapide...pour un nabot!\n\ -Tu viens de l'espace?\n\ -Tiens, tu l'as méritée!")) - -DEFINE_DIALOG(DIALOG_008, 1, 5, 30, 200, _("\ -ATTENTION AU CHOMP\n\ -ENCHAINE!!!\n\ -Danger! Approchez-vous\n\ -et appuyez sur [C]^ pour\n\ -jeter un oeil.\n\ -Impressionnant, non?\n\ -Avez-vous remarqué la\n\ -pièce rouge sur le rondin?\n\ -Lorsque vous collecterez 8\n\ -pièces comme celle-ci,\n\ -une étoile apparaîtra\n\ -dans le pré de l'autre\n\ -côté du pont...")) - -DEFINE_DIALOG(DIALOG_009, 1, 4, 30, 200, _("\ -Ça fait longtemps qu'on\n\ -ne s'était pas vu, Mario!\n\ -Fouiii! Tu es devenu super\n\ -rapide!\n\ -Tu t'es entraîné aux Jeux\n\ -Olympiques ou les étoiles\n\ -te rendent ultra-méga-\n\ -puissant?\n\ -Je n'ai pas encore avalé\n\ -ma défaite de l'autre\n\ -fois... Mais ici c'est mon\n\ -territoire.\n\ -Tu veux faire le match\n\ -retour? L'arrivée est\n\ -dans la vallée Valvent...\n\ -\n\ -Prêt...\n\ -\n\ -\n\ -//Partez!// Heu, non.")) - -DEFINE_DIALOG(DIALOG_010, 1, 4, 30, 200, _("\ -Vous venez d'actionner\n\ -l'interrupteur des\n\ -casquettes ailées...\n\ -\n\ -Si vous portez une\n\ -casquette ailée, vous\n\ -pourrez voler comme un\n\ -oiseau.\n\ -Désormais des casquettes\n\ -ailées surgiront des blocs\n\ -rouges que vous\n\ -détruirez...\n\ -Voulez-vous sauvegarder?\n\ -\n\ -//Oui////Non.")) - -DEFINE_DIALOG(DIALOG_011, 1, 4, 30, 200, _("\ -Vous venez d'actionner\n\ -l'interrupteur des\n\ -casquettes-métal!\n\ -\n\ -Grâce aux casquettes-\n\ -métal, Mario peut devenir\n\ -invincible!\n\ -\n\ -Désormais, des\n\ -casquettes-métal\n\ -surgiront des blocs verts\n\ -que vous détruirez...\n\ -Voulez-vous sauvegarder?\n\ -\n\ -//Oui////Non.")) - -DEFINE_DIALOG(DIALOG_012, 1, 4, 30, 200, _("\ -Vous venez d'actionner\n\ -l'interrupteur des\n\ -casquettes d'invisibilité.\n\ -\n\ -En portant une casquette\n\ -d'invisibilité, Mario\n\ -disparaîtra...\n\ -\n\ -Désormais des casquettes\n\ -d'invisibilité surgiront\n\ -des blocs bleus que vous\n\ -détruirez...\n\ -Voulez-vous sauvegarder?\n\ -\n\ -//Oui////Non.")) - -DEFINE_DIALOG(DIALOG_013, 1, 6, 30, 200, _("\ -Vous avez récupéré 100\n\ -pièces! Mario sera\n\ -désormais plus puissant!\n\ -Voulez-vous sauvegarder?\n\ -\n\ -//Oui////Non.")) - -DEFINE_DIALOG(DIALOG_014, 1, 6, 30, 200, _("\ -Whoa, génial! Une autre\n\ -étoile de puissance! Mario\n\ -devient de plus en plus\n\ -courageux!\n\ -Voulez-vous sauvegarder?\n\ -//Oui////Non.")) - -DEFINE_DIALOG(DIALOG_015, 1, 6, 30, 200, _("\ -Vous pouvez frapper vos\n\ -ennemis et les assommer.\n\ -Appuyez sur [A] pour sauter\n\ -et sur [B] pour donner un\n\ -coup de poing. Appuyez sur\n\ -[A] et sur [B] pour donner un\n\ -coup de pied, et sur [B]\n\ -pour ramasser quelque\n\ -chose. Pour lancer ce que\n\ -vous portez, appuyez sur\n\ -[B] à nouveau.")) - -DEFINE_DIALOG(DIALOG_016, 1, 4, 30, 200, _("\ -Si vous sautez sur une\n\ -carapace brillante, vous\n\ -pourrez aller n'importe où\n\ -et détruire vos ennemis!")) - -DEFINE_DIALOG(DIALOG_017, 1, 4, 30, 200, _("\ -Je suis le Roi Bob-omb,\n\ -seigneur des explosions.\n\ -Je te félicite d'être\n\ -arrivé jusqu'ici, petit.\n\ -Si tu veux l'étoile de\n\ -puissance, il va falloir me\n\ -jeter au sol.\n\ -\n\ -Es-tu capable de soulever\n\ -mon royal fessier?\n\ -En garde, moucheron!")) - -DEFINE_DIALOG(DIALOG_018, 1, 4, 30, 200, _("\ -SILENCE! Je dors!\n\ -Gare à l'imprudent qui\n\ -oserait me reveiller...\n\ -Marchez doucement, sinon!")) - -DEFINE_DIALOG(DIALOG_019, 1, 2, 30, 200, _("\ -CHUT! Marchez doucement\n\ -dans les couloirs!!!")) - -DEFINE_DIALOG(DIALOG_020, 1, 6, 95, 150, _("\ -Mon très cher Mario:\n\ -Viens vite au château,\n\ -je t'ai préparé un\n\ -délicieux gâteau...\n\ -A bientôt,\n\ -Princesse Toadstool.")) - -DEFINE_DIALOG(DIALOG_021, 1, 4, 95, 200, _("\ -Bienvenue l'ami!\n\ -Ici il n'y a personne,\n\ -alors dégage, moustique!\n\ -GWA HA HA HA HA HA!!!")) - -DEFINE_DIALOG(DIALOG_022, 1, 2, 95, 200, _("\ -Cette porte est fermée\n\ -à clé...")) - -DEFINE_DIALOG(DIALOG_023, 1, 2, 95, 200, _("\ -Ce n'est pas la bonne clé.\n\ -Peut-être à la cave...")) - -DEFINE_DIALOG(DIALOG_024, 1, 6, 95, 200, _("\ -Vous avez besoin de la\n\ -puissance des étoiles pour\n\ -ouvrir cette porte.\n\ -Récupérez des étoiles en\n\ -combattant des ennemis à\n\ -l'intérieur des tableaux...")) - -DEFINE_DIALOG(DIALOG_025, 1, 4, 95, 200, _("\ -Vous avez besoin de 3\n\ -étoiles pour ouvrir cette\n\ -porte. Il vous manque\n\ -encore [%] étoile(s).")) - -DEFINE_DIALOG(DIALOG_026, 1, 4, 95, 200, _("\ -Vous avez besoin de 8\n\ -étoiles pour ouvrir cette\n\ -porte. Il vous manque\n\ -encore [%] étoile(s).")) - -DEFINE_DIALOG(DIALOG_027, 1, 4, 95, 200, _("\ -Vous avez besoin de 30\n\ -étoiles pour ouvrir cette\n\ -porte. Il vous manque\n\ -encore [%] étoile(s).")) - -DEFINE_DIALOG(DIALOG_028, 1, 4, 95, 200, _("\ -Vous avez besoin de 50\n\ -étoiles pour ouvrir cette\n\ -porte. Il vous manque\n\ -encore [%] étoile(s).")) - -DEFINE_DIALOG(DIALOG_029, 1, 6, 95, 200, _("\ -Vous avez besoin de 70\n\ -étoiles pour arriver en\n\ -haut de 『l'escalier sans\n\ -fin』... Il vous manque\n\ -encore [%] étoile(s).\n\ -GWA HA HA HA HA HA!!!")) - -DEFINE_DIALOG(DIALOG_030, 1, 4, 30, 200, _("\ -Bonjour à tous!\n\ -Ici Lakitu, le reporter de\n\ -choc et de charme! Voici\n\ -un petit conseil technique:\n\ -Marchez tout doucement\n\ -pour ne pas faire de bruit\n\ -et ainsi surprendre vos\n\ -ennemis.\n\ -Vous pouvez déplacer ma\n\ -caméra avec [C]> et [C]<.\n\ -Appuyez sur [C]| pour voir\n\ -de loin.\n\ -Lorsque ma caméra ne\n\ -peut plus se déplacer,\n\ -un signal sonore se fera\n\ -entendre...\n\ -Mes chers téléspectateurs,\n\ -à bientôt!\n\ -//// --Lakitu--")) - -DEFINE_DIALOG(DIALOG_031, 1, 5, 30, 200, _("\ -Incroyable! Tu m'as encore\n\ -battu? J'étais pourtant\n\ -certain de gagner!\n\ -Tiens, petit homme, tu as\n\ -bien mérité cette étoile...")) - -DEFINE_DIALOG(DIALOG_032, 1, 5, 30, 200, _("\ -Si en portant une\n\ -casquette ailée vous\n\ -effectuez trois sauts\n\ -consécutifs, vous pourrez\n\ -volez comme un oiseau!\n\ -Vous volerez encore plus\n\ -haut si vous êtes propulsé\n\ -par un canon!\n\ -\n\ -\n\ -Utilisez les boutons [C] pour\n\ -regarder autour de vous\n\ -en plein vol, et appuyez\n\ -sur [Z] pour atterrir.")) - -DEFINE_DIALOG(DIALOG_033, 1, 5, 30, 200, _("\ -Ciao bello!\n\ -Vous voici arrivé au\n\ -château de la Princesse\n\ -grâce à un tuyau de\n\ -téléportation.\n\ -Contrôler Mario est très\n\ -facile: appuyez sur [A]\n\ -pour sauter et sur [B] pour\n\ -attaquer. Appuyez sur [B]\n\ -pour lire les pancartes.\n\ -Utilisez le stick multi-\n\ -directionnel pour déplacer\n\ -Mario...\n\ -Et maintenant, en route\n\ -vers le château!!!")) - -DEFINE_DIALOG(DIALOG_034, 1, 6, 30, 200, _("\ -Bonjour! Nous sommes les\n\ -frères Lakitu et nous nous\n\ -ferons une joie de filmer\n\ -l'intrépide Mario tout au\n\ -long de son périple.\n\ -\n\ -Vous pourrez choisir\n\ -l'angle de prise de vue\n\ -grâce aux boutons [C]. S'il\n\ -est impossible de bouger\n\ -la caméra, un signal\n\ -sonore retentira.\n\ -Pour jeter un oeil autour\n\ -de Mario, arrêtez-vous\n\ -et appuyez sur [C]^.\n\ -Appuyez sur le bouton [A]\n\ -pour revenir au jeu.\n\ -\n\ -Appuyez sur [R] pour\n\ -changer de mode de vue.\n\ -Lisez les pancartes que\n\ -vous croiserez pour en\n\ -savoir d'avantage...\n\ -\n\ -C'était Lakitu,\n\ -le caméraman toujours\n\ -prêt à vous fournir les\n\ -meilleures images...")) - -DEFINE_DIALOG(DIALOG_035, 1, 6, 30, 200, _("\ -Il existe quatre boutons\n\ -[C]. En appuyant sur [C]^ et\n\ -en bougeant le stick\n\ -multidirectionnel, vous\n\ -pourrez jeter un oeil aux\n\ -alentours...\n\ -L'angle de vue normal est\n\ -celui de la caméra de\n\ -Lakitu, mais vous pouvez\n\ -le modifier en appuyant\n\ -sur [R] et ainsi utiliser\n\ -la 『caméra-Mario』.\n\ -Appuyez sur [R] à nouveau\n\ -pour utiliser la caméra de\n\ -Lakitu. Appuyez sur [C]|\n\ -pour voir Mario de loin,\n\ -quelque soit le mode de\n\ -vue que vous utilisez.")) - -DEFINE_DIALOG(DIALOG_036, 1, 4, 30, 200, _("\ ---PANORAMA--\n\ -Appuyez sur [C]^ pour jeter\n\ -un coup d'oeil. Profitez\n\ -de la vue!\n\ -Appuyez sur [R] pour\n\ -utiliser la caméra-Mario\n\ -qui suivra toujours de\n\ -près notre petit ami.\n\ -Appuyez à nouveau sur [R]\n\ -pour revenir à la caméra\n\ -de Lakitu.\n\ -\n\ -Mettez le jeu en pause et\n\ -choisissez le mode 『Fixe』\n\ -puis maintenez [R] pour que\n\ -la caméra reste en place.")) - -DEFINE_DIALOG(DIALOG_037, 1, 2, 30, 200, _("\ -Bwa ha ha ha ha!\n\ -Je t'ai battu gros nain!\n\ -Tu es aussi rapide qu'une\n\ -vieille limace malade!\n\ -Reviens me voir si tu\n\ -veux prendre ta revanche!")) - -DEFINE_DIALOG(DIALOG_038, 1, 3, 95, 200, _("\ -Grâce à la puissance des\n\ -étoiles, la porte s'ouvre\n\ -doucement...")) - -DEFINE_DIALOG(DIALOG_039, 1, 5, 30, 200, _("\ -ROYAUME DE BOB-OMB\n\ -\n\ -Interdit aux touristes!!!\n\ -\n\ -\n\ -Personne ne pourra me\n\ -voler mes étoiles de\n\ -puissance! Elles m'ont été\n\ -offertes par le grand\n\ -Bowser en personne.\n\ -Je ne dirai jamais où\n\ -elles se trouvent, mais\n\ -voici un indice:\n\ -\n\ -\n\ -lisez attentivement le nom\n\ -de chaque étoile au début\n\ -des niveaux.\n\ -\n\ -/// --Roi Bob-omb--")) - -DEFINE_DIALOG(DIALOG_040, 1, 3, 30, 200, _("\ -ATTENTION!\n\ -Crevasse de glace juste\n\ -en dessous!")) - -DEFINE_DIALOG(DIALOG_041, 1, 2, 30, 200, _("\ -J'ai gagné! J'ai gagné!\n\ -Ha! Ha! Pauv'nul!\n\ -Ça t'apprendra à défier\n\ -le grand Koopa-Rapido!\n\ -Reviens me voir si tu\n\ -veux une autre raclée!")) - -DEFINE_DIALOG(DIALOG_042, 1, 6, 30, 200, _("\ -ATTENTION!\n\ -\n\ -Pont étroit!!!\n\ -Traversez doucement...\n\ -\n\ -\n\ -Vous pouvez sauter et\n\ -vous accrocher au bord de\n\ -la falaise ou vous\n\ -suspendre en vous\n\ -déplaçant lentement près\n\ -du vide...\n\ -Si vous voulez lâcher\n\ -prise, appuyez sur [Z] ou\n\ -vers le bas sur le stick\n\ -multidirectionnel.\n\ -\n\ -\n\ -Pour vous hisser, appuyez\n\ -vers le haut sur le stick\n\ -multidirectionnel ou sur le\n\ -bouton [A] pour aller plus\n\ -vite.")) - -DEFINE_DIALOG(DIALOG_043, 1, 5, 30, 200, _("\ -Si vous sautez en\n\ -maintenant le bouton [A],\n\ -vous pourrez vous\n\ -accrocher à des objets\n\ -au-dessus de vous...\n\ -Vous pourrez même vous\n\ -accrocher à un oiseau!")) - -DEFINE_DIALOG(DIALOG_044, 1, 4, 95, 200, _("\ -Mmm? Hein? Qui m'a\n\ -réveillé? Quoi!?! Il fait\n\ -encore jour? Je devrais\n\ -dormir!\n\ -Maintenant que je suis\n\ -réveillé, ça te dirait de\n\ -faire un petit tour avec\n\ -moi?\n\ -Maintiens le bouton [A]\n\ -pour t'accrocher et\n\ -lâche-le pour te laisser\n\ -tomber.\n\ -Je t'emmènerai où tu veux\n\ -aussi longtemps que mes\n\ -ailes pourront supporter\n\ -ton poids!\n\ -Regarde bien mon ombre\n\ -et accroche-toi!!!")) - -DEFINE_DIALOG(DIALOG_045, 1, 4, 95, 200, _("\ -Fouiii! J'suis naze!!!\n\ -Tu devrais peut-être\n\ -arrêter les pâtes aux\n\ -oeufs...\n\ -Allez, ciao Mario!\n\ -Lâche le bouton [A] sinon\n\ -j'te balance dans le vide\n\ -mon gros...")) - -DEFINE_DIALOG(DIALOG_046, 1, 6, 30, 200, _("\ -Il existe trois sauts\n\ -différents que vous\n\ -devez maîtriser:\n\ -Tout d'abord, le Triple\n\ -Saut...\n\ -\n\ -En pleine course, sautez\n\ -trois fois de suite.\n\ -Si votre synchronisation\n\ -est correcte, vous\n\ -sauterez de plus en plus\n\ -haut...\n\ -Ensuite, pour sauter le\n\ -plus loin possible, vous\n\ -devrez effectuer le Saut\n\ -en Longueur:\n\ -\n\ -\n\ -Courez, appuyez sur [Z] pour\n\ -vous accroupir, puis\n\ -appuyez sur [A] pour\n\ -sauter...\n\ -\n\ -\n\ -Enfin, pour créer une\n\ -『Impulsion』, appuyez sur\n\ -[A] vers un mur puis sautez\n\ -à nouveau lorsque vous\n\ -touchez la paroi...\n\ -\n\ -C'est compris?\n\ -Triple Saut, Saut en\n\ -Longueur et Impulsion?\n\ -Pour y arriver à chaque\n\ -fois il faut s'entraîner\n\ -encore et encore et...?")) - -DEFINE_DIALOG(DIALOG_047, 1, 2, 95, 200, _("\ -Salut l'ami! Je vais te\n\ -préparer un joli canon!")) - -DEFINE_DIALOG(DIALOG_048, 1, 5, 30, 200, _("\ -Sommet du glacier...\n\ -Attention à ne pas\n\ -glisser!\n\ -Tout d'abord, visitez ce\n\ -chalet...")) - -DEFINE_DIALOG(DIALOG_049, 1, 4, 30, 200, _("\ -Vous vous souvenez de\n\ -l'Impulsion? Utilisez cette\n\ -technique pour atteindre\n\ -des lieux en hauteur...\n\ -Rebondissez de mur en\n\ -mur, en appuyant sur le\n\ -stick multidirectionnel\n\ -vers la direction desirée.\n\ -Entraînez-vous encore et\n\ -encore et encore et...?")) - -DEFINE_DIALOG(DIALOG_050, 1, 4, 30, 200, _("\ -Maintenez le bouton [Z] pour\n\ -vous accroupir et ainsi\n\ -glisser le long d'une\n\ -pente...\n\ -Appuyez sur [Z] pendant un\n\ -saut pour faire l'Attaque\n\ -Rodéo!\n\ -\n\ -A l'arrêt, si vous appuyez\n\ -sur [Z] pour vous accroupir,\n\ -puis sur [A], vous ferez un\n\ -Saut Périlleux!\n\ -C'est compris? Mais il\n\ -existe encore d'autres\n\ -mouvements...\n\ -\n\ -Vous pouvez courir, vous\n\ -accroupir puis faire un\n\ -Saut en Longueur...\n\ -\n\ -Vous pouvez aussi marcher\n\ -en maintenant le bouton [Z].\n\ -Mais c'est une autre\n\ -histoire...")) - -DEFINE_DIALOG(DIALOG_051, 1, 6, 30, 200, _("\ -Vous pouvez facilement\n\ -vous accrocher aux arbres\n\ -et aux poteaux...\n\ -\n\ -\n\ -\n\ -Appuyez sur [Z] pour lâcher\n\ -prise, sur [A] pour sauter\n\ -en arrière ou sur le stick\n\ -multidirectionnel pour\n\ -descendre doucement.\n\ -\n\ -Une fois au sommet,\n\ -appuyez vers la droite ou\n\ -vers la gauche sur le\n\ -stick multidirectionnel\n\ -pour pivoter, ou vers le\n\ -haut pour faire le poirier.\n\ -Appuyez alors sur [A] pour\n\ -faire un méga-saut vers\n\ -l'arrière, digne des plus\n\ -grands athlètes!")) - -DEFINE_DIALOG(DIALOG_052, 1, 5, 30, 200, _("\ -Arrêtez-vous et appuyez\n\ -sur [Z] pour vous accroupir,\n\ -puis appuyez sur [A] pour\n\ -faire un Saut Périlleux\n\ -en arrière!\n\ -Pour faire un Saut\n\ -Périlleux de côté, courez,\n\ -changez de direction, puis\n\ -sautez.\n\ -\n\ -Ces deux types de saut\n\ -vous permettent de\n\ -sauter beaucoup plus haut\n\ -qu'un saut normal...")) - -DEFINE_DIALOG(DIALOG_053, 1, 5, 30, 200, _("\ -Quelques fois, en\n\ -traversant un anneau ou\n\ -en découvrant un passage\n\ -secret dans un niveau, un\n\ -chiffre rouge apparaîtra.\n\ -Si vous faites apparaître\n\ -cinq chiffres rouges, une\n\ -étoile secrète apparaîtra.")) - -DEFINE_DIALOG(DIALOG_054, 1, 3, 30, 200, _("\ -Attention:\n\ -Glissade Périlleuse!\n\ -En voiture Simone...\n\ -Appuyez vers l'avant sur\n\ -le stick multidirectionnel\n\ -pour accélérer.\n\ -Appuyez vers l'arrière\n\ -pour ralentir...\n\ -Roulez jeunesse!")) - -DEFINE_DIALOG(DIALOG_055, 1, 2, 30, 200, _("\ -Salut mon tout petit\n\ -Mario...\n\ -Alors, il paraît que tu es\n\ -un rapide?\n\ -Mais es-tu aussi rapide\n\ -que moi?\n\ -On fait la course,\n\ -mon petit biquet?\n\ -Prêt...\n\ -//Partez!//Heu, non.")) - -DEFINE_DIALOG(DIALOG_056, 1, 2, 30, 200, _("\ -Qu-qu-quoi? T-t-tu as\n\ -battu mon record?\n\ -Je l'admets, tu es très\n\ -rapide pour un humain.\n\ -Je n'ai pas de médaille\n\ -d'or sur moi mais...\n\ -Cette étoile fera\n\ -l'affaire...")) - -DEFINE_DIALOG(DIALOG_057, 1, 4, 30, 200, _("\ -Mon bébé! J'ai perdu mon\n\ -bébé... Mon p'tit chou...\n\ -Ma puce à moi...\n\ -Mon chocolat...\n\ -JE VEUX MON BÉBÉ!!!\n\ -GNAAAAAAAAAAAAAA!!!\n\ -MON BÉBÉ!")) - -DEFINE_DIALOG(DIALOG_058, 1, 3, 30, 200, _("\ -Tu as trouvé mon bébé!!!\n\ -Mon chou...\n\ -Mon p'tit chou...\n\ -Comment te prouver ma\n\ -gratitude, gros Mario?\n\ -Tu es formidable...\n\ -Tiens, prends cette étoile.\n\ -Tu l'as bien méritée...\n\ -Encore merci, petit!")) - -DEFINE_DIALOG(DIALOG_059, 1, 2, 30, 200, _("\ -C'est pas mon bébé!!!\n\ -Où est mon bébé?\n\ -JE VEUX MON BÉBÉ!!!!\n\ -GNAAAAAAAAAAAAAA!!!!")) - -DEFINE_DIALOG(DIALOG_060, 1, 6, 30, 200, _("\ -ATTENTION!\n\ -A lire avant de plonger!\n\ -Si vous restez sous l'eau\n\ -pendant trop longtemps,\n\ -vous pouvez vous noyer...\n\ -\n\ -Remonter à la surface,\n\ -traverser une bulle d'air\n\ -ou récupérer des pièces\n\ -vous fera regagner de\n\ -l'oxygène.\n\ -\n\ -Appuyez sur [A] pour nager.\n\ -Maintenez le bouton [A]\n\ -pour battre des pieds.\n\ -Appuyez régulièrement sur\n\ -[A] pour gagner de la\n\ -vitesse.\n\ -Appuyez vers le haut sur\n\ -le stick multidirectionnel\n\ -pour plonger.\n\ -Appuyez vers le bas et sur\n\ -[A] pour remonter à la\n\ -surface.\n\ -Lorsque vous êtes à la\n\ -surface, maintenez la\n\ -flèche vers le bas sur le\n\ -stick multidirectionnel et\n\ -appuyez sur [A] pour sortir\n\ -de l'eau.")) - -DEFINE_DIALOG(DIALOG_061, 1, 4, 30, 200, _("\ -Brrrrr!!!\n\ -Baignade déconseillée!!!\n\ -Trop froid...\n\ -// ---Le Pingouin---")) - -DEFINE_DIALOG(DIALOG_062, 1, 4, 30, 200, _("\ -A l'intérieur des\n\ -blocs verts se cache la\n\ -casquette-métal...\n\ -\n\ -En la portant, vous\n\ -deviendrez insensible au\n\ -feu et aux attaques de\n\ -vos ennemis.\n\ -Vous n'aurez même plus\n\ -besoin de respirer!\n\ -Mais il y a un problème:\n\ -vous ne pouvez pas nager!")) - -DEFINE_DIALOG(DIALOG_063, 1, 4, 30, 200, _("\ -La casquette d'invisibilité\n\ -se trouve dans les blocs\n\ -bleus.\n\ -\n\ -En la portant, vos\n\ -ennemis, y compris les\n\ -terribles Boos, ne\n\ -pourront pas vous voir!\n\ -En plus, vous pourrez\n\ -traverser des murs\n\ -secrets!")) - -DEFINE_DIALOG(DIALOG_064, 1, 6, 30, 200, _("\ -Si vous portez une\n\ -casquette ailée provenant\n\ -d'un bloc rouge, faites le\n\ -Triple Saut pour vous\n\ -envoler comme un oiseau!\n\ -\n\ -Utilisez le stick multi-\n\ -directionnel pour diriger\n\ -Mario. Appuyez vers le\n\ -bas pour prendre de\n\ -l'altitude, et vers le haut\n\ -pour piquer du nez.\n\ -Et enfin, appuyez sur [Z]\n\ -pour atterrir.")) - -DEFINE_DIALOG(DIALOG_065, 1, 6, 30, 200, _("\ -Leçons de natation...\n\ -Appuyez sur [A] pour nager\n\ -la brasse. Si votre\n\ -synchronisation est bonne,\n\ -vous pourrez nager très\n\ -vite.\n\ -Maintenez le bouton [A]\n\ -pour battre des pieds\n\ -d'une façon régulière.\n\ -\n\ -\n\ -\n\ -Appuyez vers le haut sur\n\ -le stick multidirectionnel\n\ -pour plonger, et vers le\n\ -bas pour remonter à la\n\ -surface.\n\ -\n\ -Pour sortir de l'eau,\n\ -appuyez vers le bas sur\n\ -le stick multidirectionnel\n\ -et appuyez sur [A]. Ensuite,\n\ -relâcher le stick pour ne\n\ -pas retomber dans l'eau.\n\ -Attention: Mario ne peut\n\ -pas respirer sous l'eau!\n\ -Remontez à la surface\n\ -lorsque vous manquez\n\ -d'oxygène...\n\ -\n\ -Dernière chose:\n\ -vous ne pouvez pas ouvrir\n\ -les portes se trouvant\n\ -sous l'eau.")) - -DEFINE_DIALOG(DIALOG_066, 1, 6, 30, 200, _("\ -Mario! Fais attention:\n\ -Bowser est un gros\n\ -vicieux! Il va tenter de\n\ -te brûler les fesses avec\n\ -son souffle de feu!\n\ -\n\ -Tourne autour de lui et\n\ -attrape sa queue en\n\ -appuyant sur [B]. Une fois\n\ -que tu l'as attrapé,\n\ -fais-le tourner autour\n\ -de toi.\n\ -Fais des rotations avec le\n\ -stick multidirectionnel\n\ -pour aller de plus en plus\n\ -vite.\n\ -\n\ -\n\ -Si tu le fais tourner très\n\ -vite, tu pourras l'envoyer\n\ -très loin.\n\ -\n\ -\n\ -\n\ -Utilise les boutons [C] pour\n\ -regarder autour de toi.\n\ -Tu dois jeter Bowser sur\n\ -une des bombes...\n\ -\n\ -\n\ -Vise bien! Appuie sur [B]\n\ -pour lancer Bowser.\n\ -Bonne chance, Mario!\n\ -Tu en auras besoin...\n\ -\n\ -// ---Peach---")) - -DEFINE_DIALOG(DIALOG_067, 1, 3, 30, 200, _("\ -HA HA! Dommage pour toi,\n\ -Mario! La P'tite Peach\n\ -n'est pas là...\n\ -Mais si tu veux un gros\n\ -bisou, on peut toujours\n\ -s'arranger!\n\ -Je parie que tu n'es pas\n\ -capable d'attraper ma\n\ -queue...\n\ -Tu es trop faible pour me\n\ -faire tourner autour de\n\ -ta tête!\n\ -Tu n'arriveras jamais à\n\ -me faire décoller d'ici...\n\ -GWA HA! A table!!!!!!!")) - -DEFINE_DIALOG(DIALOG_068, 1, 4, 30, 200, _("\ -Voici les Laves Fatales!\n\ -Si vous touchez de la lave\n\ -ou des flammes, vous\n\ -aurez le feu aux fesses!\n\ -Mais pas de panique:\n\ -vous pourrez toujours\n\ -contrôler Mario...\n\ -Restez calme!")) - -DEFINE_DIALOG(DIALOG_069, 1, 6, 30, 200, _("\ -A l'intérieur des tableaux\n\ -vous pourrez touchez des\n\ -murs invisibles marquant\n\ -les limites du niveau.\n\ -Si vous touchez un mur en\n\ -volant, vous serez bloqué.")) - -DEFINE_DIALOG(DIALOG_070, 1, 6, 30, 200, _("\ -Vous pouvez retourner\n\ -dans le hall du château\n\ -depuis n'importe quel\n\ -niveau.\n\ -\n\ -\n\ -Vous devez vous arrêter,\n\ -appuyer sur Start pour\n\ -mettre le jeu en pause,\n\ -puis choisir l'option\n\ -『Quitter Niveau』.\n\ -\n\ -Vous n'avez pas besoin de\n\ -récupérer toutes les\n\ -étoiles d'un niveau pour\n\ -accéder à un autre monde.\n\ -\n\ -\n\ -Vous pouvez retourner\n\ -dans un niveau plus tard,\n\ -et ainsi récupérer les\n\ -étoiles difficiles à\n\ -attraper.\n\ -\n\ -Après avoir récupéré une\n\ -étoile, un indice\n\ -concernant l'étoile\n\ -suivante apparaîtra à\n\ -l'écran au début du\n\ -niveau...\n\ -Toutefois, vous n'êtes pas\n\ -obligé d'attraper l'étoile\n\ -décrite par l'indice.")) - -DEFINE_DIALOG(DIALOG_071, 1, 4, 30, 200, _("\ -DANGER!\n\ -Attention au brouillard\n\ -toxique!\n\ -\n\ -Si vous perdez de\n\ -l'énergie, courez vers une\n\ -plate-forme en hauteur\n\ -pour respirer.\n\ -\n\ -Cercle: Abri\n\ -Flèche: Entrée - Sortie")) - -DEFINE_DIALOG(DIALOG_072, 1, 3, 30, 200, _("\ -Attention: vents violents!\n\ -Accrochez-vous à votre\n\ -casquette!\n\ -Si vous la perdez, vous\n\ -devrez revenir la chercher\n\ -là où vous l'avez perdue...")) - -DEFINE_DIALOG(DIALOG_073, 1, 3, 95, 200, _("\ -Souquez ferme, matelot!\n\ -J'ai caché un trésor\n\ -par ici, moussaillon.\n\ -Mais pour le découvrir,\n\ -vous devrez ouvrir les\n\ -coffres dans l'ordre...\n\ -Y arriveras-tu, petit?\n\ -\n\ -// -- Le capitaine --")) - -DEFINE_DIALOG(DIALOG_074, 1, 5, 30, 200, _("\ -Vous pouvez vous\n\ -accrocher au rebord d'une\n\ -falaise.\n\ -\n\ -\n\ -Pour lâcher prise, appuyez\n\ -vers le bas sur le stick\n\ -multidirectionnel ou sur le\n\ -bouton [Z].\n\ -\n\ -Pour vous hisser, appuyez\n\ -vers le haut sur le stick\n\ -multidirectionnel ou sur le\n\ -bouton [A] pour monter plus\n\ -vite.")) - -DEFINE_DIALOG(DIALOG_075, 1, 5, 30, 200, _("\ -Mario! Mon château est\n\ -en danger, et Bowser en\n\ -est le responsable...\n\ -Toi seul peut contrecarrer\n\ -ses plans diaboliques!\n\ -Les portes du château ont\n\ -été scellées par Bowser et\n\ -ne peuvent être ouvertes\n\ -qu'à l'aide du pouvoir des\n\ -étoiles...\n\ -Bowser a caché les étoiles\n\ -de puissance dans les\n\ -tableaux et les murs du\n\ -château.\n\ -\n\ -Mais Bowser n'a pas\n\ -découvert tous les\n\ -passages secrets du\n\ -château.\n\ -\n\ -Un passage secret se\n\ -trouve dans cette pièce et\n\ -il mène à une des étoiles\n\ -secrètes du château!\n\ -\n\ -Trouve cette étoile, mon\n\ -petit Mario! Elle te sera\n\ -très utile. Je t'en prie,\n\ -aide-nous!\n\ -\n\ -Retrouve toutes les étoiles\n\ -du château et tu pourras\n\ -nous délivrer!\n\ -Je t'en prie, Mario!\n\ -Sauve-nous!")) - -DEFINE_DIALOG(DIALOG_076, 1, 3, 30, 200, _("\ -Grâce au pouvoir des\n\ -étoiles, le château\n\ -revient à la vie...\n\ -Je t'en prie Mario,\n\ -botte les fesses du\n\ -vilain Bowser pas beau!\n\ -As-tu visité la pièce du\n\ -château dans laquelle un\n\ -grand miroir est au mur?\n\ -Prends garde à tout ce\n\ -qui n'a pas de reflet...\n\ -\n\ -Connais-tu le monde\n\ -『Trempé-Séché』?\n\ -\n\ -Rentre dans ce niveau en\n\ -sautant très haut...\n\ -\n\ -Au fait! Regarde ce que\n\ -j'ai pour toi!")) - -DEFINE_DIALOG(DIALOG_077, 1, 2, 150, 200, _("\ -Il est dit que les piliers\n\ -doivent être enfoncés...")) - -DEFINE_DIALOG(DIALOG_078, 1, 4, 30, 200, _("\ -Enfoncez le bloc des\n\ -pièces bleues grâce à\n\ -l'Attaque Rodéo, en\n\ -appuyant sur [Z].\n\ -Une pièce bleue vaut 5\n\ -pièces jaunes.\n\ -\n\ -\n\ -Dépêchez-vous de les\n\ -attraper, sinon elles\n\ -disparaîtront!")) - -DEFINE_DIALOG(DIALOG_079, 1, 2, 30, 200, _("\ -GNIIIIIIIII!!!\n\ -LACHE-MOI!\n\ -Je blaguais! Tu n'as\n\ -aucun sens de l'humour.\n\ -Lâche-moi et je te\n\ -donnerais un truc cool.\n\ -Ça marche?\n\ -//OK//// Jamais!")) - -DEFINE_DIALOG(DIALOG_080, 1, 1, 30, 200, _("\ -Gnii hi hi hi hi hi!!!")) - -DEFINE_DIALOG(DIALOG_081, 1, 3, 30, 200, _("\ -Bienvenue dans le monde\n\ -『Trempé-Séché』...\n\ -\n\ -Ici, il est dit qu'un saut\n\ -altère le niveau d'eau...\n\ -\n\ -En y pénétrant,\n\ -serez-vous assez\n\ -intelligent?")) - -DEFINE_DIALOG(DIALOG_082, 1, 4, 30, 200, _("\ -Accroche-toi à ta\n\ -casquette, gentil petit\n\ -Mario...\n\ -\n\ -Si jamais tu la perds, tu\n\ -devras retourner la\n\ -chercher là où tu l'as\n\ -perdue...\n\ -Sans casquette, tes\n\ -ennemis pourront te faire\n\ -beaucoup plus de dégâts!\n\ -\n\ -La princesse Peach a\n\ -de sérieux ennuis...\n\ -Elle est enfermée dans un\n\ -des murs du château.\n\ -Tu dois absolument l'aider\n\ -mon gros Mario! Savais-\n\ -tu qu'il existe des\n\ -mondes dans les murs?\n\ -Les sbires du Bowser pas\n\ -beau y font régner la\n\ -terreur!\n\ -\n\ -Tiens, j'ai un petit\n\ -cadeau pour toi...")) - -DEFINE_DIALOG(DIALOG_083, 1, 4, 30, 200, _("\ -Cette grosse horloge est\n\ -étrange...\n\ -\n\ -\n\ -Fais attention à la\n\ -position de la grande\n\ -aiguille lorsque tu sautes\n\ -à l'intérieur...\n\ -Au fait, regarde ce que\n\ -j'ai là pour toi!")) - -DEFINE_DIALOG(DIALOG_084, 1, 3, 30, 200, _("\ -GNAAAAAAAAA!!!\n\ -LACHE-MOI!!!\n\ -GROSSE BRUTE!\n\ -Ne me mange pas!\n\ -Ne me mange pas!\n\ -Au secours!!!!!!\n\ -Tiens, voilà une étoile.\n\ -Prends-la, mais tu dois\n\ -me laisser partir...")) - -DEFINE_DIALOG(DIALOG_085, 1, 3, 30, 200, _("\ -Va-t'en, simple mortel!\n\ -Si tu tiens à ton âme,\n\ -retourne chez toi...\n\ -Si tu oses rentrer,\n\ -tu seras damné!!!")) - -DEFINE_DIALOG(DIALOG_086, 1, 3, 30, 200, _("\ -Tourner autour de\n\ -certains ennemis peut\n\ -faire tourner de l'oeil...")) - -DEFINE_DIALOG(DIALOG_087, 1, 5, 30, 200, _("\ -Le Père Noël n'est pas le\n\ -seul à passer par les\n\ -cheminées...\n\ -Avis aux curieux...\n\ -- Le bonhomme de neige -")) - -DEFINE_DIALOG(DIALOG_088, 1, 4, 30, 200, _("\ --Plate-forme de travail-\n\ -Pour descendre, utilisez\n\ -le poteau sur la gauche et\n\ -glissez jusqu'en bas...")) - -DEFINE_DIALOG(DIALOG_089, 1, 6, 95, 200, _("\ -Les deux routes sont très\n\ -dangereuses...\n\ -Ceux qui ne sont pas\n\ -encore capables de faire\n\ -le Saut en Longueur\n\ -doivent aller à droite.\n\ -Droite: Plate-forme de\n\ -////travail.\n\ -////Labyrinthe\n\ -////toxique.\n\ -Gauche: Trou Noir.\n\ -////Lac souterrain.\n\ -Cercle rouge:\n\ -////Ascenseur 2.\n\ -////Lac souterrain.\n\ -Flèche:\n\ -////Votre position\n\ -////actuelle.")) - -DEFINE_DIALOG(DIALOG_090, 1, 6, 30, 200, _("\ -BWA HA HA HA HA HA!!!\n\ -Tu es tombé dans mon\n\ -piège, petit Mario!\n\ -Mais voici un conseil\n\ -d'ami: prends garde à ne\n\ -pas tomber!")) - -DEFINE_DIALOG(DIALOG_091, 1, 5, 30, 200, _("\ -Danger!!!\n\ -Vents violents!\n\ -Sachez utiliser les\n\ -courants à votre\n\ -avantage...")) - -DEFINE_DIALOG(DIALOG_092, 1, 5, 30, 200, _("\ -Mario...\n\ -Mon p'tit Mario...\n\ -Tu m'cherches ou quoi?\n\ -Tu la veux ta baffe?\n\ -Alors tu vas l'avoir!\n\ -Mais d'abord tu vas me\n\ -rendre mes étoiles,\n\ -voleur!\n\ -BWA HA HA HA HA HA!!!\n\ -C'est l'heure du goûter!")) - -DEFINE_DIALOG(DIALOG_093, 1, 6, 30, 200, _("\ -Mario?!?\n\ -Tu es encore là, toi?\n\ -Très bien, tu l'auras\n\ -voulu! Cette fois-ci, je\n\ -vais faire frire ta\n\ -vieille moustache!\n\ -Malgré tes étoiles de\n\ -puissance, tu n'arriveras\n\ -jamais à sauver Peach et\n\ -ses amis...\n\ -Allez... En garde!\n\ -BWA HA HA HA HA HA HA!")) - -DEFINE_DIALOG(DIALOG_094, 1, 6, 30, 200, _("\ -Pourquoi ne pas escalader\n\ -cette pente en courant?\n\ -Petit rappel: pour faire\n\ -un Saut en Longueur,\n\ -courir, appuyer sur [Z],\n\ -puis sauter...")) - -DEFINE_DIALOG(DIALOG_095, 1, 5, 30, 200, _("\ -Pour lire une pancarte,\n\ -il faut se tenir devant\n\ -l'écriteau et appuyer [B].\n\ -Vous le saviez déjà?\n\ -Ah bon... Désolé.\n\ -Pour parler à une tortue\n\ -ou à un autre animal,\n\ -vous devez vous tenir en\n\ -face de lui ou elle.\n\ -\n\ -Retrouvez vite les étoiles\n\ -que Bowser a caché dans\n\ -ce niveau!")) - -DEFINE_DIALOG(DIALOG_096, 1, 5, 30, 200, _("\ -Le sommet de la montagne\n\ -est interdit au public!\n\ -Alors n'essayez pas d'y\n\ -aller, à moins d'être à la\n\ -recherche des étoiles...\n\ -Autre conseil: ne réveillez\n\ -jamais quelqu'un qui dort.\n\ -Marchez doucement...\n\ -Et sans bruit...")) - -DEFINE_DIALOG(DIALOG_097, 1, 5, 30, 200, _("\ -Si quelqu'un vous pousse,\n\ -n'ayez pas peur!\n\ -Poussez-le vous aussi!\n\ -Le perdant aura plutôt\n\ -chaud aux fesses...")) - -DEFINE_DIALOG(DIALOG_098, 1, 5, 95, 200, _("\ -Viens...\n\ -...entre donc...\n\ -Mon biquet...\n\ -...viens dîner...\n\ -Hin...hin...hin...")) - -DEFINE_DIALOG(DIALOG_099, 1, 3, 95, 200, _("\ -Hé...hé...hé...\n\ -Ciao bello Mario!\n\ -Moi j'traverse les murs!\n\ -Tu peux le faire, toi?\n\ -Hin...hin...hin...")) - -DEFINE_DIALOG(DIALOG_100, 1, 4, 95, 200, _("\ -GNIIIIII! KIIIII!\n\ -J'l'ai eue!!!\n\ -HI KI KI KI KI KI!\n\ -C'est à moi!!!")) - -DEFINE_DIALOG(DIALOG_101, 1, 5, 95, 200, _("\ -Aaaak...kiiii!!!\n\ -Arrête! Tu m'étrangles!\n\ -Quoi? Cette casquette?\n\ -OK, prends-la...\n\ -Grande brute, va!\n\ -De toutes façons,\n\ -tu as l'air débile avec ça\n\ -sur la tête...")) - -DEFINE_DIALOG(DIALOG_102, 1, 4, 30, 200, _("\ -Les Boos sont timides! Si\n\ -vous les regardez dans les\n\ -yeux, ils disparaîtront...\n\ -\n\ -Mais si vous leur tournez\n\ -le dos, ils réapparaîtront.\n\ -Invisibles, ils sont\n\ -invincibles...\n\ -Tentez de vous faufiler\n\ -derrière eux et de leur\n\ -botter les fesses!")) - -DEFINE_DIALOG(DIALOG_103, 1, 4, 95, 200, _("\ -Au sommet des quatre\n\ -piliers l'on doit se tenir,\n\ -pour que la lumière puisse\n\ -enfin jaillir...")) - -DEFINE_DIALOG(DIALOG_104, 1, 4, 30, 200, _("\ -L'ombre de l'étoile en\n\ -face de vous est un\n\ -『Marqueur d'étoile』.\n\ -\n\ -Lorsque vous récupérerez\n\ -8 pièces rouges, une\n\ -étoile apparaîtra à cet\n\ -emplacement.")) - -DEFINE_DIALOG(DIALOG_105, 1, 6, 95, 200, _("\ -Canon prêt à tirer!\n\ -Allez, saute à l'intérieur!\n\ -Tu peux atteindre l'étoile\n\ -sur l'île flottante en\n\ -utilisant les quatre\n\ -canons.\n\ -Utilise le stick multi-\n\ -directionnel pour viser et\n\ -appuie sur [A] pour tirer.\n\ -Si tu es habile, sers-toi\n\ -des arbres et des poteaux\n\ -pour atterrir...")) - -DEFINE_DIALOG(DIALOG_106, 1, 2, 95, 200, _("\ -Canon prêt à tirer!\n\ -Allez, saute à l'intérieur!")) - -DEFINE_DIALOG(DIALOG_107, 1, 3, 95, 200, _("\ -Les fantômes sont...\n\ -...immortels!\n\ -Hin hin hin hin...\n\ -Pourras-tu sortir d'ici...\n\ -...vivant?\n\ -Gni hi hi hi hi hi...")) - -DEFINE_DIALOG(DIALOG_108, 1, 3, 95, 200, _("\ -GNI HI HI HI HI HOU!\n\ -Voici le seigneur des\n\ -supplices!\n\ -Le maître des ombres...\n\ -Le souverain des\n\ -cauchemars...\n\ -Le Big Boo en personne!\n\ -Tremblez humains!!!\n\ -GNA HI HOU HA HIN HU !")) - -DEFINE_DIALOG(DIALOG_109, 1, 2, 95, 200, _("\ -Oooooh Noooon!\n\ -Mon corps a fondu!\n\ -Tu ne pourrais pas\n\ -m'aider, petit homme?\n\ -J'ai besoin d'un nouveau\n\ -corps!\n\ -Je dois faire un golf\n\ -demain...")) - -DEFINE_DIALOG(DIALOG_110, 1, 2, 95, 200, _("\ -J'ai perdu la tête, on\n\ -dirait...\n\ -Connais-tu quelqu'un à la\n\ -recherche d'un corps?\n\ -Je suis peut-être petit,\n\ -mais je grandis vite!\n\ -Guide-moi, je te suivrai\n\ -n'importe où!")) - -DEFINE_DIALOG(DIALOG_111, 1, 2, 95, 200, _("\ -Coooooool!\n\ -Quel super corps!\n\ -Maintenant je vais\n\ -pouvoir aller draguer!\n\ -Tiens, voici un petit\n\ -quelque chose pour toi...")) - -DEFINE_DIALOG(DIALOG_112, 1, 4, 30, 200, _("\ -Ramassez le plus de pièces\n\ -possible! Elles rempliront\n\ -votre énergie!\n\ -\n\ -Vous pouvez jeter un oeil\n\ -au nombre de pièces que\n\ -vous avez récupérées dans\n\ -les 15 mondes.\n\ -Vous pouvez aussi remplir\n\ -votre énergie en touchant\n\ -un coeur!\n\ -\n\ -Si vous faites tourner le\n\ -coeur très vite, il vous\n\ -donnera beaucoup\n\ -d'énergie...")) - -DEFINE_DIALOG(DIALOG_113, 1, 5, 30, 200, _("\ -Il existe des casquettes\n\ -spéciales dans les blocs\n\ -rouges, verts et bleus.\n\ -\n\ -\n\ -Marchez sur les\n\ -interrupteurs dans les\n\ -niveaux cachés pour faire\n\ -apparaître les blocs de\n\ -couleur.")) - -DEFINE_DIALOG(DIALOG_114, 1, 3, 95, 200, _("\ -Ah c'est pas le moment\n\ -de venir m'embêter!\n\ -\n\ -Nous les pierres, on\n\ -construit des maisons et\n\ -des châteaux...\n\ -Et vous les humains, vous\n\ -ne pensez jamais à nous\n\ -dire merci!\n\ -Si tu restes là, je m'en\n\ -vais t'écraser la face\n\ -comme une vieille prune...\n\ -Crois-tu pouvoir faire\n\ -une Attaque Rodéo sur\n\ -mon dos?\n\ -Ça m'étonnerais!\n\ -Allez... En garde, nabot\n\ -rouge et bleu!")) - -DEFINE_DIALOG(DIALOG_115, 1, 2, 95, 200, _("\ -Quoi? J'ai perdu?!?\n\ -Sacré nom d'un pétard!\n\ -Vous les humains, vous\n\ -n'avez aucun coeur...\n\ -Tiens, prends ça...\n\ -Et va-t'en!")) - -DEFINE_DIALOG(DIALOG_116, 1, 4, 95, 200, _("\ -Hein?/De quoi?\n\ -Moi? J'ai perdu?\n\ -Battu par un tout petit\n\ -bonhomme de rien du tout!\n\ -Mais cela ne sera pas\n\ -aussi facile contre le\n\ -grand Bowser!\n\ -Oh que non!\n\ -Tiens, voici l'étoile.\n\ -Dette de jeu...\n\ -Dette d'honneur...\n\ -Ciao petit Mario!\n\ -Si tu veux me revoir,\n\ -choisis cette étoile sur\n\ -l'écran du départ.\n\ -A bientôt!")) - -DEFINE_DIALOG(DIALOG_117, 1, 2, 95, 200, _("\ -Qui...dérange...mon...\n\ -...sommeil...éternel...?\n\ -Tout...bruit...doit...\n\ -...être...puni...!\n\ -Intrus...va...être...\n\ -...détruit...!\n\ -...COMBAT...!!!\n\ -...A...MAINS...NUES...!!!")) - -DEFINE_DIALOG(DIALOG_118, 1, 3, 95, 200, _("\ -Qu...qu...qu...Hein?\n\ -Moi...perdu?...Hein?\n\ -Moi...faible...nul.\n\ -Toi...nouveau pharaon...\n\ -Tiens...pour toi...\n\ -Moi...dormir...dodo. Ciao.")) - -DEFINE_DIALOG(DIALOG_119, 1, 5, 30, 200, _("\ -Grrrrr! Tu m'as surpris...\n\ -Je t'ai sous-estimé!\n\ -Petit mais costaud, hein?\n\ -Mais Peach est toujours\n\ -ma prisonnière! Ha Ha!\n\ -Ne t'inquiète pas, on se\n\ -reverra! Et la prochaine\n\ -fois, je te mangerai les\n\ -doigts!\n\ -Allez, à bientôt! GWA HA!")) - -DEFINE_DIALOG(DIALOG_120, 1, 3, 30, 200, _("\ -Moi? Le grand Bowser?\n\ -Vaincu? Non, non!\n\ -Ça ne compte pas!\n\ -Je dormais! Tu as triché!\n\ -La prochaine fois, je te\n\ -mangerai les oreilles!\n\ -Si tu veux revoir ta\n\ -p'tite Peach, rejoins-moi\n\ -en haut de la tour...\n\ -Allez, à la prochaine!\n\ -GWA HA HA HA HA HA HA!\n\ -GWA HI HOU HÉ HEU...HA!")) - -DEFINE_DIALOG(DIALOG_121, 1, 4, 30, 200, _("\ -NOoOoOoOoOoOoOoOon!\n\ -Mario... Méchant petit!\n\ -Cette fois-ci...\n\ -...je suis cuit!!!\n\ -Mes pouvoirs maléfiques\n\ -disparaissent!\n\ -Toutes mes troupes sont\n\ -anéanties!\n\ -La paix, l'amour et\n\ -l'amitié sont de retour!\n\ -AaAaAaAaAargh!\n\ -C'est insupportable!\n\ -Mais je reviendrai...\n\ -Un jour... Je reviendrai!\n\ -Et ce jour-là...\n\ -Bye Bye Mario! BWA HA!!")) - -DEFINE_DIALOG(DIALOG_122, 1, 6, 30, 200, _("\ --Le Trou Noir-\n\ -Droite: Plate-forme de\n\ -////travail.\n\ -////Labyrinthe\n\ -////toxique.\n\ -Gauche: Lac souterrain.")) - -DEFINE_DIALOG(DIALOG_123, 1, 5, 30, 200, _("\ --Caverne Métallique-\n\ -Droite: Vers la cascade.\n\ -Gauche: Interrupteur des\n\ -////casquettes-métal.")) - -DEFINE_DIALOG(DIALOG_124, 1, 4, 30, 200, _("\ -Plate-forme de travail:\n\ -Danger!\n\ -Lire le mode d'emploi\n\ -attentivement!!!\n\ -Appuyez sur une flèche\n\ -pour déplacer la plate-\n\ -forme.\n\ -\n\ -Si jamais vous tombez de\n\ -la plate-forme, retournez\n\ -là où vous l'avez vue pour\n\ -la première fois.")) - -DEFINE_DIALOG(DIALOG_125, 1, 3, 30, 200, _("\ -Sortie du Labyrinthe\n\ -toxique... Fermée!\n\ -Faites demi-tour!")) - -DEFINE_DIALOG(DIALOG_126, 1, 6, 30, 200, _("\ --Ascenseur 1-\n\ -Haut:/ Trou Noir.\n\ -Droite: Plate-forme de\n\ -////travail.\n\ -////Labyrinthe\n\ -////toxique.")) - -DEFINE_DIALOG(DIALOG_127, 1, 5, 30, 200, _("\ --Lac Souterrain-\n\ -Droite: Caverne\n\ -////métallique.\n\ -Gauche: Mine abandonnée\n\ -////(Fermée).\n\ -Gros Bibi, un gentil\n\ -dragon, vit ici.\n\ -Faites l'Attaque Rodéo\n\ -sur son dos pour qu'il\n\ -baisse la tête...")) - -DEFINE_DIALOG(DIALOG_128, 1, 5, 95, 200, _("\ -Tu dois te battre avec\n\ -honneur! Il est interdit\n\ -de jeter une personnalité\n\ -royale hors de la surface\n\ -de combat!")) - -DEFINE_DIALOG(DIALOG_129, 1, 5, 30, 200, _("\ -Bienvenue dans\n\ -le niveau des casquettes\n\ -d'invisibilité!!!\n\ -\n\ -\n\ -Si vous marchez sur\n\ -l'interrupteur bleu, tous\n\ -les blocs bleus deviendront\n\ -solides...\n\ -\n\ -Si vous portez une\n\ -casquette d'invisibilité,\n\ -vous pourrez traverser vos\n\ -ennemis et pleins d'autres\n\ -choses...")) - -DEFINE_DIALOG(DIALOG_130, 1, 6, 30, 200, _("\ -Bienvenue dans le niveau\n\ -des casquettes-métal!!!\n\ -Si vous marchez sur\n\ -l'interrupteur vert, tous\n\ -les blocs verts\n\ -deviendront solides...\n\ -Si vous portez une\n\ -casquette-métal, vous\n\ -vous transformerez en\n\ -Métal Mario! Vous pourrez\n\ -alors marcher sous l'eau.\n\ -Faites un essai pour voir!")) - -DEFINE_DIALOG(DIALOG_131, 1, 6, 30, 200, _("\ -Bienvenue dans le niveau\n\ -des casquettes ailées!!!\n\ -Marchez sur l'interrupteur\n\ -rouge au sommet de la\n\ -tour, au centre des\n\ -anneaux arc-en-ciel.\n\ -En actionnant\n\ -l'interrupteur, tous les\n\ -blocs rouges deviendront\n\ -solides...\n\ -\n\ -\n\ -Lorsque vous êtes en\n\ -possession de la casquette\n\ -ailée, faites un Triple\n\ -Saut pour vous envoler et\n\ -appuyez sur [Z] pour\n\ -atterrir.\n\ -Appuyez vers le bas sur le\n\ -stick multidirectionnel\n\ -pour prendre de l'altitude\n\ -et vers le haut pour\n\ -piquer du nez. Imaginez-\n\ -vous à bord d'un 747!!!")) - -DEFINE_DIALOG(DIALOG_132, 1, 1, 30, 200, _("\ -Non, mais?\n\ -Tu...tu...t'es fou?\n\ -Tu triches?\n\ -OK! T'es disqualifié!\n\ -Tu l'auras pas volé!\n\ -Houuuuuu! Le tricheur!")) - -DEFINE_DIALOG(DIALOG_133, 1, 6, 30, 200, _("\ -Mario! C'est toi?\n\ -Comme je suis heureux de\n\ -te voir!\n\ -La Princesse, comme nous\n\ -tous, a été emprisonnée\n\ -dans les murs du château.\n\ -Bowser a volé les étoiles\n\ -du château, et il utilise\n\ -leur puissance pour se\n\ -créer un monde dans les\n\ -tableaux et les murs!\n\ -\n\ -Je t'en prie, retrouve les\n\ -étoiles de puissance!\n\ -Grâce à elles, tu pourras\n\ -ouvrir les portes du\n\ -château que Bowser a\n\ -fermées...\n\ -Il existe quatre pièces\n\ -au rez-de-chaussée.\n\ -Commence par celle dans\n\ -laquelle tu trouveras le\n\ -tableau représentant des\n\ -Bob-ombs...\n\ -Bowser a oublié de fermer\n\ -cette porte. Lorsque tu\n\ -auras récupéré 8 étoiles,\n\ -va ouvrir la porte avec la\n\ -grosse étoile: la Princesse\n\ -doit être de l'autre côté!")) - -DEFINE_DIALOG(DIALOG_134, 1, 4, 30, 200, _("\ -Le nom des étoiles inscrit\n\ -au début de chaque monde\n\ -est un indice!\n\ -\n\ -Tu peux récupérer les\n\ -étoiles dans n'importe\n\ -quel ordre.\n\ -\n\ -Mais la sélection d'une\n\ -étoile peut impliquer\n\ -l'apparition de nouveaux\n\ -décors ou personnages...\n\ -Après avoir récupéré des\n\ -étoiles, tu peux tenter ta\n\ -chance dans d'autres\n\ -niveaux...\n\ -Aide-nous le plus vite\n\ -possible, mon mignon petit\n\ -Mario en sucre...")) - -DEFINE_DIALOG(DIALOG_135, 1, 6, 30, 200, _("\ -Bowser a volé les étoiles!\n\ -Je l'ai vu!\n\ -De mes propres yeux!\n\ -Il faut que tu nous\n\ -viennes en aide, Mario...\n\ -\n\ -Il a caché 6 étoiles dans\n\ -chaque monde, mais tu ne\n\ -pourras pas toutes les\n\ -récupérer sans avoir\n\ -actionné les interrupteurs\n\ -de casquettes...\n\ -Les étoiles que tu as\n\ -récupérées apparaîtront à\n\ -l'écran au début de\n\ -chaque niveau...\n\ -\n\ -\n\ -Si tu désires revoir les\n\ -ennemis que tu as déjà\n\ -vaincu, sélectionne les\n\ -étoiles en relation avec\n\ -ces ennemis...")) - -DEFINE_DIALOG(DIALOG_136, 1, 6, 30, 200, _("\ -Whoa!!! Tu as déjà\n\ -récupéré autant d'étoiles?\n\ -Incroyable! T'es fort, toi!\n\ -Mais fais attention:\n\ -Bowser et ses sbires sont\n\ -des durs à cuire...\n\ -N'oublie pas de récupérer\n\ -des pièces pour regagner\n\ -de l'énergie.\n\ -Les pièces jaunes te\n\ -rempliront une portion de\n\ -ton énergie...\n\ -Les pièces rouges t'en\n\ -donneront deux et les\n\ -pièces bleues, cinq.\n\ -\n\ -\n\ -\n\ -Pour faire apparaître des\n\ -pièces bleues, fais une\n\ -Attaque Rodéo sur un Bloc\n\ -de pièces bleues.\n\ -\n\ -\n\ -D'autre part, tu peux\n\ -te faire moins mal en\n\ -tombant d'une falaise, en\n\ -effectuant une Attaque\n\ -Rodéo juste avant de\n\ -toucher le sol...")) - -DEFINE_DIALOG(DIALOG_137, 1, 5, 30, 200, _("\ -Merci Mario!\n\ -Grâce à tes étoiles de\n\ -puissance, Bowser est allé\n\ -se réfugier dans une\n\ -autre partie du château!\n\ -Au fait, savais-tu qu'une\n\ -étoile de puissance\n\ -apparaît à chaque fois\n\ -que tu récupères 100\n\ -pièces dans un niveau?")) - -DEFINE_DIALOG(DIALOG_138, 1, 6, 30, 200, _("\ --Ascenseur 2-\n\ -Bas://Lac souterrain.\n\ -Gauche: Trou Noir.\n\ -Droite: Labyrinthe\n\ -////toxique\n\ -////(fermé).")) - -DEFINE_DIALOG(DIALOG_139, 1, 4, 30, 200, _("\ -\n\ -Au dessus:\n\ -Chariot automatique.\n\ -\n\ -Le chariot se met en\n\ -route automatiquement et\n\ -suit un chemin pré-\n\ -déterminé...\n\ -Le chariot disparaîtra\n\ -automatiquement lorsque\n\ -vous tomberez...")) - -DEFINE_DIALOG(DIALOG_140, 1, 6, 30, 200, _("\ --Plate-forme de travail-\n\ -Droite: Entrée du\n\ -////Labyrinthe\n\ -////toxique.\n\ -Gauche: Trou Noir.\n\ -////Ascenseur 1.\n\ -Flèche: Votre position\n\ -////actuelle.")) - -DEFINE_DIALOG(DIALOG_141, 1, 4, 150, 200, _("\ -Vous avez récupéré une\n\ -des étoiles du château!\n\ -Vous pouvez désormais\n\ -ouvrir certaines portes!\n\ -Essayez celle de la\n\ -chambre de la Princesse\n\ -Peach, en haut à droite\n\ -dans le hall d'entrée...\n\ -Essayez aussi celle menant\n\ -au tableau de la\n\ -Forteresse de Whomp,\n\ -au rez-de-chaussée...\n\ -Les troupes de Bowser\n\ -sont encore nombreuses!\n\ -Il faut les arrêter à tout\n\ -prix! Courage...")) - -DEFINE_DIALOG(DIALOG_142, 1, 5, 150, 200, _("\ -Vous avez récupéré trois\n\ -étoiles de puissance!\n\ -Désormais, vous pouvez\n\ -ouvrir les portes marquées\n\ -d'un 『3』.\n\ -Vous pouvez aller et venir\n\ -dans les niveaux comme\n\ -bon vous semble...\n\ -\n\ -\n\ -Les ennemis qui vous\n\ -attendent seront de plus\n\ -en plus costauds!\n\ -Alors, prudence...")) - -DEFINE_DIALOG(DIALOG_143, 1, 5, 150, 200, _("\ -Vous avez récupéré huit\n\ -étoiles de puissance!\n\ -Vous pouvez désormais\n\ -ouvrir la porte marquée\n\ -d'une grosse étoile!\n\ -La Princesse est juste de\n\ -l'autre côté...\n\ -Pouvez-vous l'entendre\n\ -crier votre nom?\n\ -『Marioooooo!』")) - -DEFINE_DIALOG(DIALOG_144, 1, 5, 150, 200, _("\ -Vous avez récupéré 30\n\ -étoiles de puissance!\n\ -Vous pouvez désormais\n\ -ouvrir la porte marquée\n\ -d'une grosse étoile!\n\ -Mais avant de foncer\n\ -comme un dingue vers la\n\ -porte, êtes-vous sûr de\n\ -n'avoir rien oublié?\n\ -\n\ -Avez-vous enfoncé les\n\ -deux piliers? Avez-vous\n\ -toujours votre casquette?\n\ -\n\ -\n\ -Si vous l'avez perdue\n\ -dans le desert, allez\n\ -botter le croupion du\n\ -vilain vautour...\n\ -\n\ -On dit que Bowser s'est\n\ -réfugié dans les\n\ -profondeurs de l'océan...\n\ -L'avez-vous rencontré?")) - -DEFINE_DIALOG(DIALOG_145, 1, 6, 150, 200, _("\ -Vous avez récupéré 50\n\ -étoiles de puissance!\n\ -Vous pouvez désormais\n\ -ouvrir la porte marquée\n\ -d'une grosse étoile au\n\ -deuxième étage...\n\ -Avez-vous trouvé les trois\n\ -interrupteurs: rouge, vert\n\ -et bleu?\n\ -Les casquettes provenant\n\ -des blocs de couleur\n\ -peuvent être très utiles...\n\ -Allez, en route Mario...\n\ -Et que la force soit avec\n\ -toi, petit homme.")) - -DEFINE_DIALOG(DIALOG_146, 1, 5, 150, 200, _("\ -Vous avez récupéré 70\n\ -étoiles de puissance!\n\ -Désormais, vous pouvez\n\ -accéder en haut de\n\ -『l'escalier sans fin』...\n\ -Le terrible Bowser vous y\n\ -attend...\n\ -Etes-vous prêt à\n\ -l'affronter?")) - -DEFINE_DIALOG(DIALOG_147, 1, 6, 30, 200, _("\ -Faites-vous bon usage\n\ -des casquettes spéciales?\n\ -Elles peuvent vous être\n\ -très utiles...\n\ -\n\ -\n\ -Vous devez tout d'abord\n\ -rendre les blocs de couleur\n\ -solides en actionnant des\n\ -interrupteurs secrets...\n\ -\n\ -\n\ -Les blocs rouges vous\n\ -fourniront des casquettes\n\ -ailées, les bleus des\n\ -casquettes d'invisibilité,\n\ -et les verts des\n\ -casquettes-métal...")) - -DEFINE_DIALOG(DIALOG_148, 1, 6, 30, 200, _("\ -Montagne du Bonhomme de\n\ -neige.../DANGER!\n\ -Ne pas tenter le Triple\n\ -Saut au-dessus de la\n\ -machine à cracher des\n\ -glaçons...\n\ -Tomber dans le lac gelé\n\ -vous fera vite perdre de\n\ -l'énergie de façon\n\ -permanente.\n\ -Alors, attention!\n\ --Le Bonhomme de neige-")) - -DEFINE_DIALOG(DIALOG_149, 1, 5, 30, 200, _("\ -Voici la Glissade Secrète\n\ -de la Princesse Peach!\n\ -Vous y trouverez une\n\ -étoile secrète que Bowser\n\ -n'a pas pu voler...\n\ -Pendant que vous\n\ -glisserez, appuyez vers\n\ -l'avant pour accélérer, et\n\ -vers l'arrière pour\n\ -ralentir...\n\ -Si vous glissez très vite,\n\ -vous découvrirez une\n\ -des étoiles secrètes du\n\ -château!")) - -DEFINE_DIALOG(DIALOG_150, 1, 4, 30, 200, _("\ -Whoa! Va-z'y, lui!\n\ -T' as inondé ma zon-mé!!!\n\ -Pourquoi t'as fait ça, yo!\n\ -T'es pas cool, toi?\n\ -Regarde! Mon toit est\n\ -fichu, et mon plancher\n\ -est trempé!\n\ -NoOoOoOoOoOoOon!!!\n\ -Ça me rend ouf de voir\n\ -ça! Complètement chtarbé!\n\ -C'est à cause de cette\n\ -étoile...\n\ -Je suis sûr qu'elle me\n\ -porte la poisse...\n\ -Saleté, va!")) - -DEFINE_DIALOG(DIALOG_151, 1, 6, 30, 200, _("\ -Ah non! Ça suffit!\n\ -D'abord tu me mouilles,\n\ -ensuite tu m'écrases la\n\ -face...\n\ -Grrrr! Pas cool, Bob.\n\ -Tu cherches le contact?")) - -DEFINE_DIALOG(DIALOG_152, 1, 2, 30, 200, _("\ -Gnaaaaa! Pov'type, va!\n\ -Tiens, la v'là ton étoile!\n\ -J'm'en fiche...\n\ -J'peux en avoir d'autres.\n\ -Allez, à la prochaine...\n\ -Cool, Abdoul.")) - -DEFINE_DIALOG(DIALOG_153, 1, 1, 30, 200, _("\ -Hé! Qui va là?\n\ -Qui me grimpe dessus?\n\ -Une mouche?\n\ -Un moustique?\n\ -Un cafard?\n\ -T'as intérêt à dégager!\n\ -Sinon j'te souffle dessus!")) - -DEFINE_DIALOG(DIALOG_154, 1, 5, 30, 200, _("\ -Accroche-toi à ta\n\ -casquette! Si jamais tu\n\ -la perds, retourne la\n\ -chercher là où tu l'as\n\ -perdue...\n\ -Sans elle tu peux te faire\n\ -très mal...\n\ -Alors, fais-y attention!\n\ -\n\ -\n\ -Au fait, la Princesse est\n\ -toujours emprisonnée dans\n\ -les murs du château!\n\ -Sauve-la, mon mignon\n\ -Mario rouge et bleu...\n\ -Heu... Tu savais qu'il\n\ -existe aussi des niveaux\n\ -dans les murs, hein?")) - -DEFINE_DIALOG(DIALOG_155, 1, 5, 30, 200, _("\ -Grâce au pouvoir des\n\ -étoiles, le château revient\n\ -peu à peu à la vie...\n\ -Je t'en prie Mario,\n\ -va affronter Bowser!\n\ -Connais-tu la salle du\n\ -miroir? Fais attention à\n\ -tout ce qui n'a pas de\n\ -reflet...\n\ -\n\ -Autre chose: rentre dans\n\ -le niveau Trempé-Séché\n\ -à l'aide d'un grand saut.\n\ -\n\ -Allez, courage camarade!")) - -DEFINE_DIALOG(DIALOG_156, 1, 3, 30, 200, _("\ -Le niveau de la pendule\n\ -est étrange...\n\ -\n\ -Fais attention à la\n\ -grande aiguille lorsque\n\ -tu rentres dans l'horloge.")) - -DEFINE_DIALOG(DIALOG_157, 1, 5, 30, 200, _("\ -Attention aux sables\n\ -mouvants!\n\ -Si vous vous faites\n\ -avaler, tâchez de ne pas\n\ -boire la tasse!\n\ -Les zones sombres sont\n\ -des trous sans fond...\n\ -Alors, prudence jeune\n\ -aventurier...")) - -DEFINE_DIALOG(DIALOG_158, 1, 6, 30, 200, _("\ -1. Si vous sautez de\n\ -façon répétée, vous\n\ -sauterez de plus en plus\n\ -haut. En courant et en\n\ -sautant trois fois, vous\n\ -ferez un Triple Saut.\n\ -2. Sautez contre un mur\n\ -et sautez à nouveau pour\n\ -créer une Impulsion.\n\ -Grâce à cette technique,\n\ -vous pourrez accéder à\n\ -des lieux en hauteur.")) - -DEFINE_DIALOG(DIALOG_159, 1, 4, 30, 200, _("\ -3. En vous arrêtant, en\n\ -appuyant sur [Z] et en\n\ -sautant, vous ferez un\n\ -Saut Périlleux en arrière.\n\ -Pour faire un Saut en\n\ -Longueur, courez, appuyez\n\ -sur [Z], puis sautez.")) - -DEFINE_DIALOG(DIALOG_160, 1, 3, 30, 200, _("\ -Appuyez sur [B] lorsque\n\ -vous courez pour faire\n\ -une attaque en glissade.\n\ -Pour vous remettre\n\ -debout, appuyez sur [A] ou\n\ -sur [B].")) - -DEFINE_DIALOG(DIALOG_161, 1, 4, 30, 200, _("\ -Mario!?!?!\n\ -C'est toi? Vraiment toi?\n\ -Ça fait un bout de temps\n\ -que je ne t'avais pas vu!\n\ -Tu as grossi, non?\n\ -On m'a dit de t'attendre\n\ -ici, mais je commençais\n\ -à perdre espoir...\n\ -Alors c'est vrai? Tu as\n\ -battu Bowser? Encore une\n\ -fois? Il n'abandonne\n\ -jamais ce gros reptile...\n\ -Tu as récupéré toutes les\n\ -étoiles? Tu as sauvé la\n\ -Princesse Peach?\n\ -T'es amoureux, non?\n\ -Tiens...\n\ -J'ai une lettre pour toi...\n\ -C'est peut-être une\n\ -admiratrice, qui sait?\n\ -『Merci d'avoir joué au\n\ -plus beau jeu de toute la\n\ -galaxie:\n\ -MARIO 64!!!\n\ -Il reste sûrement des\n\ -niveaux que vous ne\n\ -connaissez pas par coeur,\n\ -alors...\n\ -Voici quelques munitions!\n\ -A bientôt et merci!\n\ ---Les créateurs de\n\ -/Mario 64...")) - -DEFINE_DIALOG(DIALOG_162, 1, 2, 30, 200, _("\ -Oh, non!\n\ -Encore toi?\n\ -T'es amoureux, ou quoi?\n\ -Tu veux m'épouser?\n\ -Désolé, mais tu n'es pas\n\ -mon type...\n\ -Mon truc à moi, c'est les\n\ -femelles...\n\ -Ah! Tu veux peut-être\n\ -une étoile?\n\ -OK. Mais j'te préviens:\n\ -c'est la dernière fois!\n\ -Ah... Autre chose...\n\ -\n\ -LACHE-MOI!!!!!\n\ -GRANDE BRUTE!!!!!")) - -DEFINE_DIALOG(DIALOG_163, 1, 4, 30, 200, _("\ -NoOoOoOoOoOoOoOon!!!\n\ -Tu...tu...tu m'as battu?\n\ -Moi?!? C'est illogique!\n\ -C'est moi le plus grand!\n\ -Quoi? Il y avait 120\n\ -étoiles en tout?!?\n\ -Heu......\n\ -Je le savais!\n\ -Aaaargh! Le château\n\ -regagne tous ses pouvoirs,\n\ -c'est insupportable!\n\ -GnAaAaAaAaAaAaAaArgh!\n\ -A la prochaine, Mario...\n\ -Tu sais bien que je ne\n\ -suis pas du genre à\n\ -abandonner si facilement!\n\ -BWA HA HA HA HA HA HA!\n\ -GWA HI HA HI HOU HEU!\n\ -..... Atcha!")) - -DEFINE_DIALOG(DIALOG_164, 1, 4, 30, 200, _("\ -Beuuuuuuuu...\n\ -J'ai trop mangé, moi...\n\ -Beuuuuuuuu...\n\ -Mm? Qui es-tu?\n\ -Mario! Te voilà, rigolo!\n\ -Ça te dit une petite\n\ -course?\n\ -A moins que tu aies peur!\n\ -Alors, c'est d'accord?\n\ -Prêt...\n\ -\n\ -//Partez!//Heu, non!")) - -DEFINE_DIALOG(DIALOG_165, 1, 3, 30, 200, _("\ -Tourner autour du poteau\n\ -peut faire tourner les\n\ -têtes...")) - -DEFINE_DIALOG(DIALOG_166, 1, 4, 30, 200, _("\ -Je m'entraîne...\n\ -Je reviens plus tard...\n\ -\n\ --- Koopa-Rapido --")) - -DEFINE_DIALOG(DIALOG_167, 1, 5, 30, 200, _("\ -En route vers le château!\n\ -\n\ -Appuyez sur [A] pour sauter\n\ -et sur [Z] pour vous\n\ -accroupir.\n\ -Appuyez sur [B] pour\n\ -attaquer ou pour attraper\n\ -quelque chose. Appuyez à\n\ -nouveau sur [B] pour lancer\n\ -ce que vous portez.")) - -DEFINE_DIALOG(DIALOG_168, 1, 6, 30, 200, _("\ -Hé! Lâche-moi un peu!\n\ -Ça fait deux fois que tu\n\ -t'essuies les pieds sur\n\ -ma tête!\n\ -Tu m'cherches ou quoi?\n\ -Coup d'boule!!!!")) - -DEFINE_DIALOG(DIALOG_169, 1, 5, 30, 200, _("\ -Dehors les touristes!\n\ -Cette caverne est très\n\ -dangereuse!!!\n\ -Alors... DE-HORS!\n\ -/ -- Le capitaine --")) diff --git a/text/jp/courses.h b/text/jp/courses.h deleted file mode 100644 index 4590c3a7..00000000 --- a/text/jp/courses.h +++ /dev/null @@ -1,80 +0,0 @@ -COURSE_ACTS(COURSE_BOB, _(" 1 ボムへいの せんじょう"), - _("やまのうえの ボムキング") , _("はくねつ ノコノコレース") , _("そらのしままで ぶっとべ"), - _("8まいの あかコイン") , _("そらにはばたけ はねマリオ") , _("ワンワンの いぬごやで")) - -COURSE_ACTS(COURSE_WF, _(" 2 バッタンキングの とりで"), - _("いかりのバッタン キング") , _("とりでの てっぺんへ") , _("たいほうで ひとっとび"), - _("うきしまの 8まいコイン") , _("とりかごへ ストーン") , _("たいほうで ぶっこわせ!")) - -COURSE_ACTS(COURSE_JRB, _(" 3 かいぞくの いりえ"), - _("ちんぼつせんの おたから") , _("でてこい きょだいウツボ") , _("かいていどうくつの おたから"), - _("うかんだフネの あかコイン") , _("いわのはしらへ ひとっとび") , _("ふきだす みずを くぐれ")) - -COURSE_ACTS(COURSE_CCM, _(" 4 さむいさむい マウンテン"), - _("スーパースノースライダー") , _("まいごの こペンギン") , _("ペンギン チャンピオンレース"), - _("すべって 8まいあかコイン") , _("ゴロゴロ ゆきダルマ") , _("かくれ スーパー カベキック")) - -COURSE_ACTS(COURSE_BBH, _(" 5 テレサの ホラーハウス"), - _("おやかたテレサを さがせ") , _("テレサの メリーゴーランド") , _("ほんだなオバケの ナゾ"), - _("8まいコインは どこだ") , _("バルコニーの ボステレサ") , _("かくしべやの おおめだま")) - -COURSE_ACTS(COURSE_HMC, _(" 6 やみにとける どうくつ"), - _("ドッシーのいる ちていこ") , _("そうさリフトの あかコイン") , _("メタルで ダッシュ"), - _("ケムリめいろを ぬけて") , _("ケムリめいろの ひじょうぐち"), _("ゴロゴロいわの ひみつ")) - -COURSE_ACTS(COURSE_LLL, _(" 7 ファイアバブル ランド"), - _("おとせ ボスどんけつ") , _("たたかえ!どんけつたい") , _("15パズルの 8まいコイン"), - _("コロコロ まるたわたり") , _("かざんの パワースター") , _("かざんの リフトツアー")) - -COURSE_ACTS(COURSE_SSL, _(" 8 あっちっち さばく"), - _("いたずらハゲたか ジャンゴ") , _("ピラミッドの てっぺんで") , _("きょだいピラミッドの ないぶ"), - _("4つのはしらに たつものへ") , _("とびまわれ 8まいコイン") , _("きょだいピラミッドのナゾ")) - -COURSE_ACTS(COURSE_DDD, _(" 9 ウォーター ランド"), - _("クッパの せんすいかん") , _("うずしおの たからばこ") , _("にげたクッパの あかコイン"), - _("ふきだす みずを くぐれ") , _("マンタの おくりもの") , _("ボウシが そろったら")) - -COURSE_ACTS(COURSE_SL, _("10 スノーマンズ ランド"), - _("おおゆきダルマの おでこ") , _("こおりのくにの どんけつ") , _("こおりの オブジェ"), - _("つめたい いけを こえて") , _("コウラにのって あかコイン") , _("フワフワさんの おうち")) - -COURSE_ACTS(COURSE_WDW, _("11 みずびたシティー"), - _("ビリビリの まめリフト") , _("トップオブ ザ シティー") , _("あさせと そらのシークレット"), - _("いそげ!かなあみエレベーター"), _("ダウンタウンの あかコイン") , _("ダウンタウンを かけろ")) - -COURSE_ACTS(COURSE_TTM, _("12 たかいたかいマウンテン"), - _("たかいたかい やまのうえ") , _("いたずらザル ウッキィのオリ"), _("おばけキノコの あかコイン"), - _("マウンテン スライダー") , _("はしのうえから みわたせば") , _("ぶっとべ はなれキノコへ")) - -COURSE_ACTS(COURSE_THI, _("13 ちびでか アイランド"), - _("きょだいパックンフラワー") , _("デカじまの てっぺんで") , _("ノコノコ リターンマッチ"), - _("チビじまの 5シークレット") , _("ハナチャンの あかコイン") , _("イカリの ハナチャン")) - -COURSE_ACTS(COURSE_TTC, _("14 チックタックロック"), - _("グルグル かごのなかへ") , _("ふりこの へや") , _("チックタックはりの うえ"), - _("えっへん てっぺん ドッスン"), _("つきだしを のりこえて") , _("00ふんの あかコイン")) - -COURSE_ACTS(COURSE_RR, _("15 レインボー クルーズ"), - _("にじを わたる ふね") , _("てんくうの おやしき") , _("タテめいろの あかコイン"), - _("カゼきる きょだいブランコ") , _("おおぞら アスレチック") , _("にじの かなたの しま")) - -SECRET_STAR(COURSE_BITDW, _("   やみの せかいの クッパ")) -SECRET_STAR(COURSE_BITFS, _("   ほのおの うみの クッパ")) -SECRET_STAR(COURSE_BITS, _("   てんくうの たたかい!")) -SECRET_STAR(COURSE_PSS, _("   ピーチのかくれスライダー")) -SECRET_STAR(COURSE_COTMC, _("   メタルスイッチの たき")) -SECRET_STAR(COURSE_TOTWC, _("   はばたけ!はねスイッチへ")) -SECRET_STAR(COURSE_VCUTM, _("   おほりのとうめいスイッチ")) -SECRET_STAR(COURSE_WMOTR, _("   にじ かける はねマリオ")) -SECRET_STAR(COURSE_SA, _("   おさかなと いっしょ")) -SECRET_STAR(COURSE_CAKE_END, _("   おいしいケーキ")) - -CASTLE_SECRET_STARS(_("   おしろのかくれスター")) - -EXTRA_TEXT(0, _("おしろのかくれスター")) -EXTRA_TEXT(1, _("100まいコインの スター")) -EXTRA_TEXT(2, _("マウンテンのへやが ひらく!")) -EXTRA_TEXT(3, _("みずとゆき2つのへやが ひらく!")) -EXTRA_TEXT(4, _("おおきなほしの ドアがひらく!")) -EXTRA_TEXT(5, _("クッパへの とびらがひらく!")) -EXTRA_TEXT(6, _("3がいへの とびらがひらく!")) diff --git a/text/jp/dialogs.h b/text/jp/dialogs.h deleted file mode 100644 index 014cb931..00000000 --- a/text/jp/dialogs.h +++ /dev/null @@ -1,1922 +0,0 @@ -// Parameters: dialog enum ID, (unused), lines per box, left offset, width - -#ifdef VERSION_JP -#define HOW_TO_READ_SIGNS_1 "\ -カンバンを よむときも\n\ -たちどまって Bボタン!\n\ -AかBボタンですすめる!\n\ -まえにたつだけで はなし\n\ -かける、どうぶつもいます。" -#else -#define HOW_TO_READ_SIGNS_1 "\ -カンバンは まえにたって\n\ -AかBボタンでよめます。\n\ -まえにたつだけで はなし\n\ -かけてくれる どうぶつも\n\ -います。" -#endif - -DEFINE_DIALOG(DIALOG_000, 1, 5, 30, 200, _("\ -おおっと、ここはキケンな\n\ -せんじょうの どまんなか。\n\ -『え』のなかのせかいには\n\ -クッパが ぬすんだ\n\ -パワースターがある。\n\ -まずは、あかいボムへいに\n\ -はなしかけてみるといい!\n\ -Bボタンではなしができる。\n\ -きっと、ちからになって\n\ -くれるはずだ。\n"\ -HOW_TO_READ_SIGNS_1)) - -DEFINE_DIALOG(DIALOG_001, 1, 4, 95, 200, _("\ -あぶない あぶない!!\n\ -こんなところを うろうろ\n\ -してると、みずばくだんが\n\ -ふってきますよ。\n\ -くろいボムへいたちは\n\ -たたかいが だいすきで、\n\ -いつも ぼくらを\n\ -こうげきしてきます。\n\ -ボムキングという ボスが\n\ -スターを てにいれてから\n\ -ここは せんじょうに\n\ -なってしまいました。\n\ -ボムキングから スターを\n\ -とりあげてくれませんか?\n\ -このさきの はしをわたり\n\ -みちぞいにひだりにいけば、\n\ -ボムとりでの いりぐちに\n\ -つきます。キングのスター\n\ -を とりもどしたら また\n\ -あいに きてください。")) - -DEFINE_DIALOG(DIALOG_002, 1, 4, 95, 200, _("\ -ちょっと あなた!\n\ -このさきはキケンですよ!\n\ -\n\ -そこで、アドバイスです。\n\ -そらから ふってくる\n\ -みずばくだんをよけて、\n\ -はしを『2つ』わたると\n\ -あちらの『じんち』です。\n\ -やまのうえのボムキングは\n\ -すごく ちからもちです。\n\ -かつぎあげられないように\n\ -きをつけてください。\n\ -ぼくら あかボムへいは\n\ -あなたのみかたです。\n\ -いつでも はなしかけて\n\ -きてくださいね!")) - -DEFINE_DIALOG(DIALOG_003, 1, 5, 95, 200, _("\ -おかげで ボムキングは\n\ -おとなしくなりました!\n\ -でも、たたかいは おわり\n\ -ません。 かいぶつたちが\n\ -まだスターをもっています。\n\ -スターをいくつかとったら\n\ -あたらしい へやのドアを\n\ -ひらくことが できます。\n\ -つぎのへやの せかいへと\n\ -すすんでください!\n\ -ぼくらのなかまが\n\ -おまちしています。\n\ -はなしかけて くださいね。\n\ -いつでも たいほうを\n\ -じゅんびしますよ。")) - -DEFINE_DIALOG(DIALOG_004, 1, 3, 95, 200, _("\ -ぼくたちは へいわを\n\ -ねがっています。 だから\n\ -たいほうは つかいません。\n\ -けれど あなたをどこかに\n\ -とばすなら へいきです。\n\ -どうぞ つかってください。\n\ -このコースにあるすべての\n\ -あかボムぐん たいほうを\n\ -つかえるように します。")) - -DEFINE_DIALOG(DIALOG_005, 1, 4, 30, 200, _("\ -なーんだ、マリオさんじゃ\n\ -ないッスか!\n\ -ボムキングやっつけたって\n\ -ほんとーッスか?\n\ -いやー すごいッス!\n\ -さっすが つよいし、\n\ -オイラほどではないけど、\n\ -あしも はやいッスよね!\n\ -ひとつオイラと、\n\ -ボムキングのヤツがいた\n\ -おやまのちょうじょうまで\n\ -かけっこでもしませんか?\n\ -それでは オイラが、\n\ -『ドン!』といったら\n\ -スタート ッスよ。\n\ -\n\ - ヨーーーイ!\n\ -\n\ -   ドン!  やめる")) - -DEFINE_DIALOG(DIALOG_006, 1, 4, 30, 200, _("\ -ははっ ズルッコは\n\ -なしッス! マリオさん。\n\ -またこんど\n\ -あそびましょうね。")) - -DEFINE_DIALOG(DIALOG_007, 1, 6, 30, 200, _("\ -ハア ハア ハア\n\ -いやーまいったッス!\n\ -ほんと はえーッスね!\n\ -オイラに かったきねんに、\n\ -これ、あげるッス。\n\ -ホイ!")) - -DEFINE_DIALOG(DIALOG_008, 1, 5, 30, 200, _("\ -もうけんワンワン キケン\n\ -Cボタンの うえをおして\n\ -『マリオのちかく』から\n\ -ながめて ください。\n\ -とても コワイです。\n\ -クイのうえの あかコイン。\n\ -おなじコインを さがして\n\ -8まいあつめると、はしを\n\ -わたったひだりのはやしに\n\ -スターがでます。")) - -DEFINE_DIALOG(DIALOG_009, 1, 5, 30, 200, _("\ -ひっさしぶりッス! いま\n\ -ちょーどかえったとこッス。\n\ -パワースターのせいか\n\ -いちだんと はやくなった\n\ -ようッスね!\n\ -このまえは まけちゃって\n\ -ほーんと くやしいッス。\n\ -ここは オイラのホーム\n\ -グランド!じしんあるッス。\n\ -もいちどやりましょうよ!\n\ -ゴールはカゼふきのたに!\n\ -しってるッスよね!?\n\ -そんじゃ\n\ - ヨーーーイ!\n\ -   ドン!  やめる")) - -DEFINE_DIALOG(DIALOG_010, 1, 3, 30, 200, _("\ -そらを じゆうにとべる\n\ -『はねのぼうし』の\n\ -スイッチを ふみました。\n\ -せかいじゅうにある\n\ -あかブロックから、はねの\n\ -ぼうしがとびだします。\n\ -ここまでをセーブする?\n\ -\n\ -   はい   いいえ")) - -DEFINE_DIALOG(DIALOG_011, 1, 3, 30, 200, _("\ -むてきの からだになれる\n\ -『メタルのぼうし』の\n\ -スイッチを ふみました。\n\ -せかいじゅうの みどりの\n\ -ブロックから、メタルの\n\ -ぼうしが とびだします。\n\ -ここまでをセーブする?\n\ -\n\ -   はい   いいえ")) - -DEFINE_DIALOG(DIALOG_012, 1, 3, 30, 200, _("\ -すがたをけせる まほうの\n\ -『とうめいのぼうし』の\n\ -スイッチを ふみました。\n\ -せかいじゅうの あおい\n\ -ブロックから、とうめい\n\ -ぼうしが とびだします。\n\ -ここまでをセーブする?\n\ -\n\ -   はい   いいえ")) - -DEFINE_DIALOG(DIALOG_013, 1, 5, 30, 200, _("\ -100まいコインの\n\ -スターを てにいれた!\n\ -おしろのパワーが\n\ -またひとつマリオに\n\ -  ちからを あたえた。\n\ -\n\ -ここまでセーブしますか?\n\ -\n\ -   はい   いいえ")) - -DEFINE_DIALOG(DIALOG_014, 1, 5, 30, 200, _("\ -おもわぬところで\n\ -スターをてにいれた。\n\ -そして おしろのパワーが\n\ -またひとつ マリオに\n\ -  ゆうきを あたえた。\n\ -\n\ -ここまでセーブしますか?\n\ -\n\ -   はい   いいえ")) - -DEFINE_DIALOG(DIALOG_015, 1, 4, 30, 200, _("\ -てきはパンチでたおせるよ。\n\ -Aボタンは『ジャンプ』\n\ -Bボタンは『パンチ』です。\n\ -AとBボタンで『キック』。\n\ -『ものをもつ』ときも\n\ -       Bボタン!\n\ -『なげる』は もういちど\n\ -Bボタンをおしてください。")) - -DEFINE_DIALOG(DIALOG_016, 1, 4, 30, 200, _("\ -キラキラひかったコウラに\n\ -のると、どんなところも\n\ -スイスイすすめる!\n\ -てきをけちらし すすめ!")) - -DEFINE_DIALOG(DIALOG_017, 1, 4, 30, 200, _("\ -ワシがボムキング、つまり\n\ -ばくだんの おうさまだ。\n\ -よくここまできた。その\n\ -ゆうきは ほめてやろう。\n\ -とはいえ、おまえにタダで\n\ -だいじな パワースターを\n\ -やるわけには いかん。\n\ -そこで チャンスをやろう。\n\ -パワースターがほしければ\n\ -ワシを なげとばしてみろ。\n\ -うしろから かつげるか?\n\ -さあ、かかってこい!")) - -DEFINE_DIALOG(DIALOG_018, 1, 4, 30, 200, _("\ -ねむいので、ねています。\n\ -おこすと おこります。\n\ -\n\ -しずかに あるきましょう。")) - -DEFINE_DIALOG(DIALOG_019, 1, 2, 30, 200, _("\ -ろうかは しずかに\n\ -あるきましょう。")) - -DEFINE_DIALOG(DIALOG_020, 1, 5, 95, 150, _("\ -おしろへ あそびに\n\ -きてください。\n\ -ケーキを つくって\n\ -まってます。\n\ -     -ピーチより-")) - -DEFINE_DIALOG(DIALOG_021, 1, 5, 95, 200, _("\ -ようこそいらっしゃいませ\n\ -・・だれも いませんので\n\ -とっとと\n\ -  おかえりください。\n\ -ガハハハッ!")) - -DEFINE_DIALOG(DIALOG_022, 1, 3, 95, 200, _("\ -カギが かかっている・・")) - -DEFINE_DIALOG(DIALOG_023, 1, 3, 95, 200, _("\ -・・・カギがあわない!\n\ -このカギは『ちか』への\n\ -カギのようだ。")) - -DEFINE_DIALOG(DIALOG_024, 1, 3, 95, 200, _("\ -クッパがとじたこのドアを\n\ -ひらくには、スターの\n\ -パワーが ひつようです。\n\ -どこかのへやの『え』の\n\ -なかの モンスターから\n\ -とりもどしてきてください")) - -DEFINE_DIALOG(DIALOG_025, 1, 3, 95, 200, _("\ -このドアを ひらくには\n\ -スター3まいの パワーが\n\ -ひつようです。\n\ -あと[%]まいの スターが\n\ -ひつようです。")) - -DEFINE_DIALOG(DIALOG_026, 1, 3, 95, 200, _("\ -このドアを ひらくには\n\ -スター8まいの パワーが\n\ -ひつようです。\n\ -あと[%]まいの スターが\n\ -ひつようです。")) - -DEFINE_DIALOG(DIALOG_027, 1, 3, 95, 200, _("\ -このドアを ひらくには\n\ -スター30まいのパワーが\n\ -ひつようです。\n\ -スターがあと\n\ -[%]まいひつようです。")) - -DEFINE_DIALOG(DIALOG_028, 1, 3, 95, 200, _("\ -このドアを ひらくには\n\ -スター50まいのパワーが\n\ -ひつようです。\n\ -あと[%]まいの スターが\n\ -ひつようです。")) - -DEFINE_DIALOG(DIALOG_029, 1, 4, 95, 200, _("\ -はてしない かいだんの\n\ -ドアを ひらくには\n\ -スター70まいのパワーが\n\ -ひつようです・・・・・\n\ -あと[%]まいの スターが\n\ -たりません・・・\n\ -ガハハッ!")) - -DEFINE_DIALOG(DIALOG_030, 1, 4, 30, 200, _("\ -カメラマンのジュゲムです。\n\ -ちょっと アドバイス!\n\ -しずかにあるきたいときは\n\ -ゆっくり あるくことです。\n\ -まわりを みたいときは\n\ -Cボタンのみぎとひだりで\n\ -カメラをすこしまわせます。\n\ -Cのしたで とおくから。\n\ -できないところでは\n\ -『ブーッ!』といいます。\n\ -よろしく!! \n\ -      -ジュゲム")) - -DEFINE_DIALOG(DIALOG_031, 1, 3, 30, 200, _("\ -またまた まけちゃったよ。\n\ -こんどはスッゴい じしん\n\ -あったんッスけどね・・・\n\ -ほんと すごいッスね!\n\ -このスターも\n\ -あげちゃいます!")) - -DEFINE_DIALOG(DIALOG_032, 1, 4, 30, 200, _("\ -はねぼうしの あるひとは\n\ -3かいれんぞくでジャンプ\n\ -しよう。 おおぞらたかく\n\ -とびあがれます。\n\ -たいほうでとぶと\n\ -さらに たかくとべます。\n\ -まわりをみるのはCボタン。\n\ -おりたいときはZボタン。")) - -DEFINE_DIALOG(DIALOG_033, 1, 4, 30, 200, _("\ -ワープどかんを\n\ -くぐりぬけ、\n\ -ピーチの おしろに\n\ -つきました。\n\ -そうさは カンタン。\n\ -Aボタンが ジャンプ!\n\ -Bボタンで こうげき!\n\ -カンバンも よめます。\n\ -マリオを うごかすのは\n\ -まんなかに ついてる\n\ -『3Dスティック』。\n\ -まずはおしろへ すすめ!")) - -DEFINE_DIALOG(DIALOG_034, 1, 5, 30, 200, _("\ -こんにちは! \n\ -ぼくたちカメラマンの\n\ -ジュゲムブラザーズです。\n\ -これから、カメラをもって\n\ -あなたに ついていきます。\n\ -カメラは おすすめのいち\n\ -から さつえいしてます。\n\ -むきをかえるのはCボタン、\n\ -かえられない ときは\n\ -『ブーッ!』といいます。\n\ -ちょっと たちどまったら\n\ -Cボタンのうえ!\n\ -まわりを ながめられます。\n\ -ゲームに もどすときは\n\ -『Aボタン』です。\n\ -『Rボタン』をつかうと\n\ -いろんなカメラモードに\n\ -きりかえられます。\n\ -また、かんばんなどをみて\n\ -おぼえてください!\n\ -いじょう!! カメラマン\n\ -ジュゲムブラザーズからの\n\ -おしらせでした。\n\ -それじゃ、きをつけて!")) - -DEFINE_DIALOG(DIALOG_035, 1, 4, 30, 200, _("\ -きいろい4つの Cボタン。\n\ -『うえ』をおすと\n\ -3Dスティックで\n\ -まわりを みわたせます。\n\ -ふだんマリオをみてるのは\n\ -おすすめのジュゲムカメラ。\n\ -Cボタンで すこし、\n\ -かくどが かえられます。\n\ -Rボタンをおすと\n\ -マリオの うしろからみる\n\ -マリオカメラに なります。\n\ -もどすときはもういちどR。\n\ -『ジュゲムカメラ』と\n\ -『マリオカメラ』どちらも\n\ -Cボタンの したをおすと、\n\ -とおくへ はなれます。\n\ -いまつかっている\n\ -カメラを しりたいときは、\n\ -がめん みぎしたの\n\ -アイコンを みてください。")) - -DEFINE_DIALOG(DIALOG_036, 1, 5, 30, 200, _("\ - 『てんぼうだい』\n\ -Cボタンの うえをおすと、\n\ -まわりを みわたせます。\n\ -みえないところは よーく\n\ -たしかめてからすすめー!\n\ -Rボタンはマリオのカメラ。\n\ -いつも マリオのうしろを\n\ -ついていくぞ。ジュゲムに\n\ -もどすときは もういちど\n\ -Rボタンをおすこと。\n\ -ポーズがめんで モードを\n\ -かえると、Rボタンを\n\ -おしてるあいだ カメラを\n\ -『とめる』こともできる!\n\ -ためしてみよう。\n\ -つかってるカメラモードは\n\ -みぎしたのアイコンで\n\ -たしかめよう。\n\ -マリオとの きょりは\n\ -きいろやじるしを みよう。")) - -DEFINE_DIALOG(DIALOG_037, 1, 3, 30, 200, _("\ -あたしの『かち』です。\n\ -あなたの『まけ』です。\n\ -ははははは!!!\n\ -マリオさん、とーっても\n\ -おしかったですね。\n\ -また あそびましょう!")) - -DEFINE_DIALOG(DIALOG_038, 1, 3, 95, 200, _("\ -パワースターの ちからで\n\ -つぎの せかいへのドアは\n\ -しずかにひらいた。")) - -DEFINE_DIALOG(DIALOG_039, 1, 5, 30, 200, _("\ --ボムとりで いりぐち-\n\ -  だれも はいるな!\n\ -\n\ -ワシのパワースターは\n\ -だれにも わたさぬ。\n\ -クッパどのからいただいた\n\ -だいじな だいじな\n\ -たからものだ。\n\ -なんまいか かくしたが\n\ -ばしょは おしえぬ。\n\ -コースはじめの スターの\n\ -なまえを、ヒントにする\n\ -ぐらいなら ゆるす。\n\ -\n\ -おやまのうえのボムキング")) - -DEFINE_DIALOG(DIALOG_040, 1, 3, 30, 200, _("\ -このさき キケン!\n\ -リフトのたにぞこ です。")) - -DEFINE_DIALOG(DIALOG_041, 1, 4, 30, 200, _("\ -オイラがかっちゃいました。\n\ -ハッハッハッ\n\ -たいしたことないッスね!\n\ -じゃ、またこんどね!")) - -DEFINE_DIALOG(DIALOG_042, 1, 5, 30, 200, _("\ -この『はし』せまい。\n\ -ゆっくりわたろう!\n\ -ガケのカドにとびついたり\n\ -ゆっくりと おりると\n\ -ぶらさがれます。\n\ -『て』を はなすときは\n\ -Zボタンか スティックを\n\ -マリオのうしろへ。\n\ -のぼるときには まえへ\n\ -たおしてください。\n\ -ぶらさがって すぐに\n\ -Aボタンをおすと\n\ -すばやく あがれます。")) - -DEFINE_DIALOG(DIALOG_043, 1, 4, 30, 200, _("\ -ジャンプしてAボタンを\n\ -おしっぱなしに すると\n\ -ぶらさがれる ところが\n\ -あります。\n\ -『とり』につかまるとき\n\ -と おなじです。")) - -DEFINE_DIALOG(DIALOG_044, 1, 5, 95, 200, _("\ -だれだい!  せっかく\n\ -いいきもちで ねてたのに。\n\ -あー カラダがおもいなー\n\ -ちょーどいいや!わたしと\n\ -ひとーっとび しません?\n\ -ジャンプボタンを\n\ -おしているあいだ\n\ -ぶらさがれますよー。\n\ -おりたいときに\n\ -はなせばいーです。\n\ -おーすきなところへ\n\ -おつれしまーす。\n\ -かげを よーくみて\n\ -Aボタンで つかまって\n\ -くださいねー!")) - -DEFINE_DIALOG(DIALOG_045, 1, 5, 95, 200, _("\ -あーあ、つかれたー・・\n\ -やーっぱり おもいなー。\n\ -きょうは このあたりで!\n\ -『もういちどAボタンを\n\ -おしなおしてください。』\n\ -もうすこし とんだら\n\ -ほんとに てをはなしてね\n\ -\n\ -じゃあ、さよならー!")) - -DEFINE_DIALOG(DIALOG_046, 1, 5, 30, 200, _("\ -ジャンプのワザ まとめて\n\ -せいりしておきます。\n\ -とてもだいじな3つのワザ。\n\ -おぼえて つかって\n\ -みてください。\n\ -タイミングよく つづけて\n\ -とぶと たかくとべます。\n\ -はやく はしっていると\n\ -さらに たかくとべます。\n\ -『3だんとび』です。\n\ -はしりながら Zボタンで\n\ -しゃがんでジャンプすると\n\ -とおくへ とべます。\n\ -『はばとび』です。\n\ -とてもべんりです。\n\ -まっすぐたった カベに\n\ -むかって ジャンプして、\n\ -ぶつかった ところから\n\ -また ジャンプできます。\n\ -『カベキック』といいます。\n\ -だいじな テクニック\n\ -『3だんとび』\n\ -『はばとび』\n\ -『カベキック』\n\ -     わかった?")) - -DEFINE_DIALOG(DIALOG_047, 1, 3, 95, 200, _("\ -こんにちは!\n\ -たいほうの じゅんびに\n\ -かかります!・・・・・")) - -DEFINE_DIALOG(DIALOG_048, 1, 4, 30, 200, _("\ -ここは ツルツルすべる\n\ -ゆきやまの ちょうじょう。\n\ -まずはそこの\n\ -やまごやへ どうぞ。")) - -DEFINE_DIALOG(DIALOG_049, 1, 5, 30, 200, _("\ -ジャンプわざカベキックを\n\ -おぼえていますか?\n\ -たかいところへ あがる\n\ -とてもだいじなテクニック。\n\ -カベからカベへジャンプ!\n\ -スティックをつかって\n\ -はねかえったほうに\n\ -かそくする。\n\ -よーく\n\ -れんしゅう しておこう!")) - -DEFINE_DIALOG(DIALOG_050, 1, 4, 30, 200, _("\ -Zボタンで しゃがめます。\n\ -『さか』では すべれます。\n\ -ジャンプの とちゅうなら\n\ -『ヒップドロップ』!!\n\ -とまって しゃがんでから\n\ -ジャンプすると\n\ -『バックちゅう』できる!\n\ -わかった? まだあります。\n\ -はしりながら しゃがんで\n\ -ジャンプで『はばとび』!\n\ -しゃがんでから あるくと\n\ -・・・ひみつです。")) - -DEFINE_DIALOG(DIALOG_051, 1, 5, 30, 200, _("\ -『き』や『ぼう』には\n\ -ジャンプで つかまれます。\n\ -『のぼる』『おりる』は\n\ -スティックで、やめるのは\n\ -Zボタンで『て』をはなす。\n\ -『むきをかえる』ときは\n\ - 3Dスティックの\n\ -   みぎ と ひだり。\n\ -Aボタンで『せなか』の\n\ -ほうこうにジャンプします。\n\ -テッペンで もういちど\n\ -スティックを うえにいれ、\n\ -『さかだち』ができる。\n\ -むきをきめて せなかの\n\ -ほうこうに ジャンプだ!")) - -DEFINE_DIALOG(DIALOG_052, 1, 4, 30, 200, _("\ -Zボタンで しゃがめます。\n\ -とまって しゃがんでから\n\ -ジャンプすると、\n\ -『バックちゅう』できる!\n\ -すばやくユーターンを\n\ -しながら、ジャンプすると\n\ -『ちゅうがえり』!\n\ -どちらも たかくとべます。")) - -DEFINE_DIALOG(DIALOG_053, 1, 6, 30, 200, _("\ -コインリングや かくれた\n\ -シークレットポイントを\n\ -とおると あかいすうじが\n\ -でてきます。5こつづけて\n\ -とおると ひみつのスター\n\ -が あらわれます。")) - -DEFINE_DIALOG(DIALOG_054, 1, 4, 30, 200, _("\ -スライダーへようこそ!!\n\ -さかを すべりはじめたら\n\ -スティックまえで かそく、\n\ -うしろで げんそくできる。")) - -DEFINE_DIALOG(DIALOG_055, 1, 5, 30, 200, _("\ -あたし、このスライダーの\n\ -せかいチャンピオン!!!\n\ -からだ、デカイけど\n\ -とっても はやいよ!\n\ -あなたチャレンジします?\n\ -それでは!\n\ -\n\ - レディーーー・・・!\n\ -  ・・・ \n\ -   ゴー!! やめとく")) - -DEFINE_DIALOG(DIALOG_056, 1, 3, 30, 200, _("\ -ヒエーーーッ!!!\n\ -セカイきろくだよ!\n\ -スゴイよ!あなた!!\n\ -きんメダルの かわりに\n\ -コレ あげます!\n\ -いやーースゴイスゴイ!!")) - -DEFINE_DIALOG(DIALOG_057, 1, 4, 30, 200, _("\ -どこかで うちのこどもを\n\ -みかけません でしたか?\n\ -・・・わたしんち こども\n\ -いっぱい いましてね・・\n\ -なんびき いたのかも\n\ -おぼえてなくて・・・・\n\ -ほんとに・・\n\ -どこへ いったんでしょう。\n\ -だいてやると\n\ -とても いいこえで\n\ -なくんですけどね・・・\n\ -ヤレヤレ・・・・・")) - -DEFINE_DIALOG(DIALOG_058, 1, 5, 30, 200, _("\ -ああーーっ!!たしかに\n\ -うちの こどもです・・・\n\ -『こらっ! いつも\n\ -ちかくで あそびなさいと\n\ -いってるだろ!』\n\ -あなた とっても\n\ -いいひとです。 おれいに\n\ -これを さしあげます。\n\ -あったかくって とても\n\ -げんきに なりますよ。")) - -DEFINE_DIALOG(DIALOG_059, 1, 5, 30, 200, _("\ -このこは うちのこじゃー\n\ -ないようだなあ・・・\n\ -かわいそうに・・・\n\ -おやはいったい\n\ -なにをしてるんだろう・・")) - -DEFINE_DIALOG(DIALOG_060, 1, 4, 30, 200, _("\ --みずにはいるちゅうい-\n\ -\n\ -もぐっていると しぬほど\n\ -くるしくなってきます。\n\ -すいめんに あがるか\n\ -アブクをみつけて\n\ -さわってください。\n\ -ひといき つけます。\n\ -およぐときは Aボタン!\n\ -おしてるだけでも すすみ\n\ -タイミングよく おすと\n\ -スピードがでます。\n\ -もぐるときはスティックを\n\ -まえにたおして Aボタン。\n\ -うかぶときはスティックを\n\ -てまえにひいて Aボタン。\n\ -すいめんに いるときは\n\ -ジャンプします。\n\ - 『じゅんびたいそう\n\ -    わすれずに!!』")) - -DEFINE_DIALOG(DIALOG_061, 1, 6, 30, 200, _("\ -つめたいみず キケン!!\n\ -およいでは いけません!\n\ -この こおりのいけは\n\ -とびあがるぐらい\n\ -つめたいです!\n\ -        ペンギン")) - -DEFINE_DIALOG(DIALOG_062, 1, 5, 30, 200, _("\ -みどりの ブロックに\n\ -かくされている\n\ -ふしぎな ふしぎな\n\ -『メタルのぼうし』。\n\ -\n\ -ひをつけたってもえないし\n\ -てきのたまも はねかえす。\n\ -いきを とめても\n\ -へいきです。\n\ -こまったことにおよげない。")) - -DEFINE_DIALOG(DIALOG_063, 1, 4, 30, 200, _("\ -あおいブロックには\n\ -『とうめいぼうし』。\n\ -メダマも ビックリ\n\ -すがたをけせる。\n\ -テレサも まっさお\n\ -『ひみつのカベ』を\n\ -とおりぬけるぞ。")) - -DEFINE_DIALOG(DIALOG_064, 1, 4, 30, 200, _("\ -あかいブロックのなかの\n\ -はねのぼうしを かぶると、\n\ -3かいジャンプで\n\ -そらたかく とびあがれる。\n\ -そうさはスティックで!\n\ -てまえにひくと あがる。\n\ -まえにたおすと さがる。\n\ -やめるときはZボタンで!")) - -DEFINE_DIALOG(DIALOG_065, 1, 5, 30, 200, _("\ -およぎかた おしえます。\n\ -\n\ -みずにはいるとおよげます。\n\ -ながいあいだ『もぐる』と\n\ -くるしくなります。\n\ -すすむためには Aボタン。\n\ -タイミングよく おすと\n\ -スピードが でます。\n\ -3Dスティックを まえに\n\ -たおすと もぐります。\n\ -すいめんに もどったり、\n\ -みずから あがるときは\n\ -てまえにひいて Aボタン。\n\ -すいめんでジャンプだ!\n\ -\n\ -Aボタン おしっぱなしに\n\ -していても、およげます。\n\ -らくちんです。\n\ -およいでいるあいだは\n\ -ドアを あけられません。")) - -DEFINE_DIALOG(DIALOG_066, 1, 5, 30, 200, _("\ -マリオ!  クッパのはく\n\ -ほのおに きをつけて!\n\ -クッパを こらしめるには\n\ -うしろにまわりBボタンで\n\ -シッポをつかむのよ!\n\ -なげとばす まえには\n\ -3Dスティックで\n\ -グリグリふりまわすの。\n\ -はやく まわすほど\n\ -とおくまで とぶわ!\n\ -Cボタンで まわりを\n\ -よーくみて!\n\ -なげとばした クッパは\n\ -4すみの バクダンに\n\ -ぶつけてやるの!\n\ -ねらいを\n\ -よーくさだめて・・・\n\ -\n\ -もういちどBボタンよ!")) - -DEFINE_DIALOG(DIALOG_067, 1, 4, 30, 200, _("\ -ざんねんだったなマリオ!\n\ -ここには ピーチちゃんは\n\ -いませんでした。\n\ -    ガハハッ!!\n\ -わがはいの うしろに\n\ -まわりこんで シッポを\n\ -つかめるものなら\n\ -つかんでみるんだな。\n\ -スティックでグリグリ\n\ -まわして なげるなど\n\ -できるわけが ない!!\n\ -  ガハハッ!!")) - -DEFINE_DIALOG(DIALOG_068, 1, 5, 30, 200, _("\ -ここは しゃくねつの\n\ -ファイアバブル ランド!\n\ -からだに ひがついても\n\ -おちないように あわてず\n\ -そうさしよう。\n\ -ほのおのいけに おちると\n\ -はねあがる!  そうさは\n\ -できるので、おちついて。\n\ -あまりうごきまわらないで\n\ -ガンバレ!")) - -DEFINE_DIALOG(DIALOG_069, 1, 3, 30, 200, _("\ -『え』のなかのカイブツの\n\ -せかいには、せかいの\n\ -はてがあります。\n\ -みえないカベにあたったら\n\ -きっと そこが\n\ -『え』のせかいのはてです。\n\ -そらを とんでいるときも\n\ -そこから さきには\n\ -すすめません。")) - -DEFINE_DIALOG(DIALOG_070, 1, 5, 30, 200, _("\ -かいぶつたちの すんでる\n\ -『え』のなかのせかいから、\n\ -おしろの いりぐちの\n\ -メインホールに\n\ -いつでも もどれます。\n\ -かならず きちんと\n\ -たちどまってから!\n\ -スタートボタンでポーズし、\n\ -『コースからでる』を\n\ -えらんでください。\n\ -ひとつのせかいのスターは\n\ -ぜんぶ とらなくても、\n\ -つぎのせかいにすすめます。\n\ -じょうずになったら、また\n\ -もどってきてください。\n\ -スターを1つ とるごとに\n\ -つぎのスターのヒントが\n\ -スタートがめんに でます。\n\ -えらんだヒントいがいの\n\ -スターをとってもOKです。")) - -DEFINE_DIALOG(DIALOG_071, 1, 4, 30, 200, _("\ - -このさきキケン-\n\ -  あやしいケムリに\n\ -  ちゅうい!\n\ - いきができません!\n\ -くるしくなったら\n\ -たかいところへ!\n\ -まる・・・・・ひなんじょ\n\ -やじるし・・・でいりぐち")) - -DEFINE_DIALOG(DIALOG_072, 1, 5, 30, 200, _("\ -カゼつよし!  ぼうしは\n\ -しっかり かぶりましょう。\n\ -もし ぼうしをなくしても\n\ -ここでなくした ぼうしは\n\ -このやまで みつかります。")) - -DEFINE_DIALOG(DIALOG_073, 1, 5, 95, 200, _("\ -ただしい じゅんばんで\n\ -はこを ひらくこと。\n\ -こたえは だれにも\n\ -おしえてやらない。\n\ -   --せんちょう--")) - -DEFINE_DIALOG(DIALOG_074, 1, 5, 30, 200, _("\ -ガケのカドに とびつくと\n\ -ぶらさがれます。\n\ -おりるときはスティックを\n\ -マリオのうしろへいれるか、\n\ -Zボタンをおしてください。\n\ -のぼるときはスティックを\n\ -まえに たおしてください。\n\ -ぶらさがって\n\ -すぐに Aボタンをおすと\n\ -すばやく のぼれます!")) - -DEFINE_DIALOG(DIALOG_075, 1, 5, 30, 200, _("\ -マリオ!!たいへんです。\n\ -クッパがまた・・・・\n\ -おしろの パワースターを\n\ -ぬすんで カベのなかへ!\n\ -わたしたちも・・・\n\ -みんなカベのなかへ・・・\n\ -すいこまれていくわ・・・\n\ -『カベ』や『え』のなか\n\ -から パワースターを\n\ -とりもどして!\n\ -クッパの ふさいだドアは\n\ -パワースターの ちからで\n\ -ひらくことが できるわ!\n\ -このへやには ひみつの\n\ -つうろがあるの。\n\ -クッパにみつからなかった\n\ -かくしつうろの ひとつよ。\n\ -そこには おしろの\n\ -かくれスターが あるわ!\n\ -きっと やくにたつはずよ。")) - -DEFINE_DIALOG(DIALOG_076, 1, 5, 30, 200, _("\ -パワースターのおかげで\n\ -おしろに、げんきが\n\ -もどってきました。\n\ -クッパなんか\n\ -おいはらってください。\n\ -おやくに たつなら\n\ -おしろの はなしをします。\n\ -『カガミのへや』では\n\ -カガミにうつらないものを\n\ -よくみてください。\n\ -みずのまちへ いくときは、\n\ -『え』にとびこむ たかさ\n\ -によって、まちをすっかり\n\ -みずびたしに できます。\n\ -アッ、これ みつけました。")) - -DEFINE_DIALOG(DIALOG_077, 1, 3, 150, 200, _("\ -とびらを ひらくまえに\n\ -2つの はしらを\n\ -おしさげて おくこと。")) - -DEFINE_DIALOG(DIALOG_078, 1, 5, 30, 200, _("\ -あおコインのブロックを\n\ -ジャンプちゅうにZボタン\n\ -『ヒップドロップ』で\n\ -      ぶっつぶすと\n\ -あおコインがでてきます。\n\ -あおコイン1まいで\n\ -きいろコイン5まいぶん\n\ -とてもラッキー!\n\ -でも じかんがたつと\n\ -きえてしまう・・ザンネン")) - -DEFINE_DIALOG(DIALOG_079, 1, 5, 30, 200, _("\ -いててて!\n\ -はなしてくれよ。\n\ -ウッキッキー!\n\ -チョットからかった\n\ -だけなのに!\n\ -はなしてくれたら、\n\ -いいもの あげるからさ。\n\ -ネーネー はなしてくれよ。\n\ -\n\ -   はなす  いやだ")) - -DEFINE_DIALOG(DIALOG_080, 1, 3, 30, 200, _("\ -ヘッヘッヘッ!")) - -DEFINE_DIALOG(DIALOG_081, 1, 6, 30, 200, _("\ -ここは みずにみちたまち。\n\ -このまちは、あなたが\n\ -ここを おとずれるときの\n\ -たかさと、おなじだけの\n\ -みずをもって\n\ -あなたをむかえる。")) - -DEFINE_DIALOG(DIALOG_082, 1, 5, 30, 200, _("\ -ぼうしを なくすと\n\ -ダメージがおおくなるので\n\ -だいじに してください。\n\ -なくしたら、なくした\n\ -コースで みつかります。\n\ -アアーどうしよう・・・\n\ -ピーチひめは、カベに\n\ -ひきこまれた ままだし。\n\ -はやく クッパを\n\ -やっつけてください。\n\ -えのほかにカベのなかにも\n\ -モンスターの せかいが\n\ -あります。  あっ!これ\n\ -もっていって ください。\n\ -かくして もってました。")) - -DEFINE_DIALOG(DIALOG_083, 1, 4, 30, 200, _("\ -とけいがとても へんです。\n\ -とけいに はいるとき、\n\ -ながいはりの ばしょに\n\ -ちゅういしてください!\n\ -これ、とりもどしました。\n\ -もっていって ください。\n\ -かっこよく\n\ -うけとってくださいね!")) - -DEFINE_DIALOG(DIALOG_084, 1, 5, 30, 200, _("\ -イテテ らんぼうなひとだ。\n\ -このスターは クッパって\n\ -ヤツが くれたんだよ。\n\ -あんたのものだ なんて\n\ -しらなかったよ。\n\ -かえすって、かえすってば、\n\ -かえせば いいんでしょ。\n\ -はなしてくれたら\n\ -スターぐらい かえすから。\n\ -ホイ!!")) - -DEFINE_DIALOG(DIALOG_085, 1, 4, 30, 200, _("\ -この やかたから\n\ -  ぶじにでられたら\n\ -\n\ -・・・エライ。・・")) - -DEFINE_DIALOG(DIALOG_086, 1, 3, 30, 200, _("\ -まわりをクルクルまわると\n\ -めをまわす ヤツがいます。")) - -DEFINE_DIALOG(DIALOG_087, 1, 5, 30, 200, _("\ -えんとつから はいるのは\n\ -サンタだけではありません。\n\ -  ごえんりょなく\n\ -  おはいりください。\n\ -スノーマンハウスおーなー")) - -DEFINE_DIALOG(DIALOG_088, 1, 5, 30, 200, _("\ --さぎょうリフトじょう-\n\ -\n\ -ここから おりるひとは\n\ -ひだりのぼうにつかまって、\n\ -きをつけて おりること。")) - -DEFINE_DIALOG(DIALOG_089, 1, 4, 95, 200, _("\ -どちらのみちも キケン!\n\ -くらいあしもとにチュウイ。\n\ -はばとび できないひとは\n\ -みぎのみちを すすめ。\n\ -みぎ・・さぎょうリフト\n\ -    ケムリめいろ\n\ -ひだり・・やみのおおあな\n\ -     ちていこ ヘ\n\ -あかまる\n\ - ・・2ごうエレベーター\n\ -      ちていこ へ\n\ -やじるし・・げんざいち")) - -DEFINE_DIALOG(DIALOG_090, 1, 6, 30, 200, _("\ -ガハハッ!\n\ -ワナにはまったなマリオ!\n\ -また ジャマをしにきた\n\ -ようだが、ともだちからの\n\ -ちゅうこくだ。\n\ -あしもとには きをつけな。")) - -DEFINE_DIALOG(DIALOG_091, 1, 3, 30, 200, _("\ -つよいカゼに チュウイ!\n\ -でも、カゼにのると\n\ -フワフワきもちいいです。")) - -DEFINE_DIALOG(DIALOG_092, 1, 3, 30, 200, _("\ -いいかげんにしろマリオ!\n\ -いつもいつも、わがはいの\n\ -ジャマをしおって!\n\ -せっかく かいぶつたちと\n\ -たのしくやっているのに。\n\ -スターをかえすんだ!\n\ -カベのなかのヤツらには、\n\ -そいつが いるんだよ!!\n\ -ガハハッ!!")) - -DEFINE_DIALOG(DIALOG_093, 1, 4, 30, 200, _("\ -アララ!いつのまにきた?\n\ -・・・・・・ムム\n\ -どちらにしろ わがはいの\n\ -ほのおの えじきだっ!\n\ -どれだけスターのちからを\n\ -かりても、わがはいには\n\ -かなうわけがないわ!\n\ -ガハハッ!! マリオ!\n\ -キサマの おともだちも\n\ -みーんな カベのなかさ。\n\ -ピーチちゃんも わたさん\n\ -もんね!  いくぞ!!")) - -DEFINE_DIALOG(DIALOG_094, 1, 3, 30, 200, _("\ -のぼりにくい さかみちは\n\ -じょそうをつけて\n\ -げんきよく のぼる!\n\ -はばとび おぼえてるか?\n\ -はしりながら Zボタンで\n\ -しゃがんで ジャンプだ!")) - -#ifdef VERSION_JP -#define HOW_TO_READ_SIGNS_2 " Bボタンをおすと" -#else -#define HOW_TO_READ_SIGNS_2 "AかBボタンをおし" -#endif - -DEFINE_DIALOG(DIALOG_095, 1, 3, 30, 200, _("\ -このように カンバンの\n\ -まえで" HOW_TO_READ_SIGNS_2 "\n\ -よむことができます。\n\ -ノコノコや どうぶつたち\n\ -と はなすときは、まえに\n\ -たちどまってください。\n\ -このコースにあるクッパに\n\ -ぬすまれたパワースターを\n\ -とりかえしてください。")) - -DEFINE_DIALOG(DIALOG_096, 1, 5, 30, 200, _("\ -このあたり みちせまし。\n\ -ゆっくり あるこう!\n\ -だれも ちょうじょうまで\n\ -たどりつかせない。\n\ -フフフ。\n\ -きもちよくねているひとを\n\ -おこすと、とっても\n\ -ふきげんに なります。\n\ -ゆっくりと しずかに\n\ -あるきましょう。フフフ。")) - -DEFINE_DIALOG(DIALOG_097, 1, 4, 30, 200, _("\ -たいあたり されたら\n\ -たいあたりで かえせ!\n\ -ほのおのうみにつきおとす\n\ -1たい1のデスマッチだ!")) - -DEFINE_DIALOG(DIALOG_098, 1, 3, 95, 200, _("\ -ここまでおいで・・・・\n\ -ケッケッケ・・")) - -DEFINE_DIALOG(DIALOG_099, 1, 3, 95, 200, _("\ -クックック・・\n\ - とりついてやる。\n\ -    ヒッヒッヒ!\n\ -カベも とおりぬけてやる。\n\ -こんなこと できるか?\n\ -     ケッケッケ!")) - -DEFINE_DIALOG(DIALOG_100, 1, 4, 95, 200, _("\ -ウッキッキー\n\ - ワッキッキー!\n\ -   ホヨホヨ。\n\ -いっただきー。")) - -DEFINE_DIALOG(DIALOG_101, 1, 5, 95, 200, _("\ -ヘッヘッヘッ!\n\ -つかまっちゃいました。\n\ -きにいってたのになあ・・\n\ -かえしますよ。\n\ - ウッキッキー!!")) - -DEFINE_DIALOG(DIALOG_102, 1, 4, 30, 200, _("\ -テレサの たおしかた\n\ -おしえます。\n\ -はずかしがりやの\n\ -テレサです。\n\ -『めとめがあう』と\n\ -すがたをけします。\n\ -『とうめいのとき』は\n\ -あたりません。\n\ -『せなかをむける』と\n\ -あらわれます。\n\ -うしろにまわって\n\ -なぐると よわい。")) - -DEFINE_DIALOG(DIALOG_103, 1, 4, 95, 200, _("\ -4ほんの はしらのうえに\n\ -たつものに、わたしは、\n\ -このやかたを おとずれる\n\ -しかくを あたえよう。")) - -DEFINE_DIALOG(DIALOG_104, 1, 6, 30, 200, _("\ -めのまえのブルーグレーの\n\ -はんとうめいの ほしは\n\ -『パワースターのだい』だ。\n\ -あかコインを みつけて\n\ -8まいぜんぶ あつめると、\n\ -スターが あらわれる。")) - -DEFINE_DIALOG(DIALOG_105, 1, 3, 95, 200, _("\ -じゅんび かんりょう!\n\ -そこの あなに\n\ -はいってみてください。\n\ -4つのたいほうをつかって\n\ -そらのしまにあるスターを\n\ -とれるはずです。\n\ -スティックでねらいをつけ、\n\ -Aではっしゃ!とびながら\n\ -『き』にも つかまれます。")) - -DEFINE_DIALOG(DIALOG_106, 1, 3, 95, 200, _("\ -じゅんびが\n\ -かんりょう しました!\n\ -それでは、おきをつけて!")) - -DEFINE_DIALOG(DIALOG_107, 1, 3, 95, 200, _("\ -おばけは し な な い\n\ -ケッケッケ・・\n\ -ぶじに でられるかな?")) - -DEFINE_DIALOG(DIALOG_108, 1, 3, 95, 200, _("\ -ぼよよーん\n\ -おやかたの おでましだ。\n\ -カッカッカ・・")) - -DEFINE_DIALOG(DIALOG_109, 1, 4, 95, 200, _("\ -カラダが とけちゃったヨ。\n\ -いいカラダ いないかなー\n\ -なにか おちつかなくてネ。\n\ -アー かおがつめたいなー")) - -DEFINE_DIALOG(DIALOG_110, 1, 3, 95, 200, _("\ -しょうらい きっと\n\ -りっぱなカラダになろうと\n\ -おもってまーす!\n\ -いいアタマ いないかなー\n\ -もししっていたら そこへ\n\ -つれてってくれませんか?\n\ -まえを すべってくれれば\n\ -うしろをついていきまーす。\n\ - ヨロシクー!")) - -DEFINE_DIALOG(DIALOG_111, 1, 3, 95, 200, _("\ -ヤッリー!\n\ -きぶんスッキリ!りっぱな\n\ -カラダが みつかった!\n\ -おれいに これあげます!\n\ -もっていって ください。\n\ -とってもアッタカイですよ。")) - -DEFINE_DIALOG(DIALOG_112, 1, 4, 30, 200, _("\ -コインいっぱいあつめよう。\n\ -ちからが かいふくする。\n\ -えのなかの15コースでは\n\ -きろくにも のこるよ。\n\ -あかいハートにさわっても\n\ -ちからが かいふくする。\n\ -はやく かけぬけるほど\n\ -たくさん かいふくする!")) - -DEFINE_DIALOG(DIALOG_113, 1, 6, 30, 200, _("\ -あか・あお・みどりの\n\ -ブロックには アイテムの\n\ -『ぼうし』が はいってる。\n\ -おしろの どこかにある\n\ -スイッチを ふんでくると\n\ -つかえるように なります。")) - -DEFINE_DIALOG(DIALOG_114, 1, 4, 95, 200, _("\ -ああ~ きにいらねえ!\n\ -おれたち、いしのおかげで\n\ -『いえ』も『しろ』も\n\ -できてるってーのに。\n\ -いつも ふみつけるばっか\n\ -りで、 ちったーありがた\n\ -がったら どうなんでぃ!\n\ -おうおうっ!\n\ -おい! そこのニイサン!\n\ -ふらふらしてんじゃねーや。\n\ -きげんが わるいんでぃ!\n\ -おしつぶしちまうぞぉ!!\n\ -もんくが あんなら\n\ -ヒップドロップで この\n\ -バッタンキングさまを\n\ -ふみつけて みやがれっ!")) - -DEFINE_DIALOG(DIALOG_115, 1, 5, 95, 200, _("\ -ああ くやしいぞ!\n\ -またまた\n\ -ふみつけられちまった!\n\ -しょせん いしは\n\ -    いしなのか・・・\n\ -おめぇの かちでぇ!\n\ -これ もっていきやがれ!\n\ -ガクッ!")) - -DEFINE_DIALOG(DIALOG_116, 1, 5, 95, 200, _("\ -おおっ!いてて! まわり\n\ -こみのはやさは まだまだ\n\ -だが、なかなか つよいな。\n\ -おまえのような けらいが\n\ -ほしかったぞ・・\n\ -はじめの やくそくどおり\n\ -パワースターをやろう。\n\ -また ワシにあいたいとき\n\ -このスターをメニューから\n\ -えらぶがよい。さらばじゃ")) - -DEFINE_DIALOG(DIALOG_117, 1, 3, 95, 200, _("\ -ジャジャジャーン!\n\ -どうだ!\n\ -おどろいたか??・・・\n\ -ムム・・・・ ならば\n\ -もっとオドロカセテやる!\n\ -イクゾ! カカッテコイ!")) - -DEFINE_DIALOG(DIALOG_118, 1, 5, 95, 200, _("\ -オオオッ・・・\n\ -オマエ、いがいとツヨイ!\n\ -このヤカタは、きょうから\n\ -オマエのものダッ・・\n\ -ジユウニつかエ。ガクッ!")) - -DEFINE_DIALOG(DIALOG_119, 1, 4, 30, 200, _("\ -グウウッ!  ちょっと\n\ -ゆだん しておったわ!\n\ -せっかくのケイカクが\n\ -ぶちこわしだ・・・しかし\n\ -パワースターもピーチも\n\ -わがはいの てのなかに\n\ -あるのだ。ガハハハ!\n\ -まだまだ まけてはおらん。\n\ -これいじょうスターは\n\ -わたさんぞ。きょうはここ\n\ -らで かんべんしてやる!\n\ -おおぉ、おぼえてろよ!!")) - -DEFINE_DIALOG(DIALOG_120, 1, 4, 30, 200, _("\ -グググッワッ!\n\ -こうも かんたんに\n\ -やられるとは、スターの\n\ -ちからが たりんのかな?\n\ -わがはいがゼッコーチョー\n\ -のときなら、キサマなんか\n\ -てきではない。\n\ -こんかいは ひきわけだっ\n\ -ピーチに あいたければ、\n\ -とうのてっぺんまで\n\ -のぼってきてみろ。\n\ -まってるぞ!ガハハッ!!")) - -DEFINE_DIALOG(DIALOG_121, 1, 5, 30, 200, _("\ -あああっ・・またこんども\n\ -キサマのかちか マリオ!\n\ -キサマはな、わがはいが\n\ -せかいで いーちばん\n\ -まけたくないヤツなのに!\n\ -せっかく なかまにした\n\ -モンスターたちのちからも\n\ -なくなり このままでは\n\ -またまた、わがはいの\n\ -だーいきらいな\n\ -へいわが もどってしまう\n\ -ではないか! \n\ -ムムムッ・・・・\n\ -しかし、このゲームは\n\ -まだまだ おわらんぞ。\n\ -みんなで あつまって、\n\ -なかよくエンディングでも\n\ -みるんだな!\n\ -\n\ -ガハハハッ!")) - -DEFINE_DIALOG(DIALOG_122, 1, 6, 30, 200, _("\ --やみにとけるおおあな-\n\ -\n\ -みぎ・・・さぎょうリフト\n\ -     ケムリめいろ\n\ -ひだり・・ちていこ")) - -DEFINE_DIALOG(DIALOG_123, 1, 5, 30, 200, _("\ - -メタルのどうくつ-\n\ -\n\ -みぎ・・・ちじょうへ\n\ -ひだり・・メタルスイッチ")) - -DEFINE_DIALOG(DIALOG_124, 1, 5, 30, 200, _("\ --さぎょうようリフト-\n\ -\n\ -   キケン!!\n\ - そうさほうほうを\n\ - よく よむこと。\n\ -ふんだ、やじるしのほうに\n\ -すすみつづけます。\n\ -\n\ -おりると もとのばしょに\n\ -もどります。")) - -DEFINE_DIALOG(DIALOG_125, 1, 5, 30, 200, _("\ --ケムリめいろ・でぐち-\n\ -\n\ -キケン! ヘイサちゅう。\n\ -ここからは はいれません。")) - -DEFINE_DIALOG(DIALOG_126, 1, 6, 30, 200, _("\ -・1ごうエレベーター・\n\ -\n\ -うえ・・やみのおおあな\n\ -みぎ・・さぎょうリフト\n\ -    ケムリめいろ")) - -DEFINE_DIALOG(DIALOG_127, 1, 5, 30, 200, _("\ -  -ちていこ-\n\ -\n\ -みぎ・・メタルのどうくつ\n\ -ひだり・・はいこう\n\ -     へいさちゅう\n\ -おとなしい かいりゅう\n\ -ドッシーが すんでます\n\ -せなかでヒップドロップを\n\ -すると、あたまをさげます。\n\ -エサにならないでください。")) - -DEFINE_DIALOG(DIALOG_128, 1, 4, 95, 200, _("\ -おっとっと!じょうがいに\n\ -なげるのは はんそくだ!\n\ -リングのうえでフェアーに\n\ -たたかおうでは ないか!")) - -DEFINE_DIALOG(DIALOG_129, 1, 5, 30, 200, _("\ -とうめいスイッチの\n\ -  コースへ ようこそ!\n\ -あおいスイッチを ふむと\n\ -すべての あおブロックが\n\ -『じったい』になる。\n\ -とうめいぼうしで\n\ -とうめいに なると\n\ -いろんな ものを\n\ -とおりぬけられます。\n\ -まずは おためしください。")) - -DEFINE_DIALOG(DIALOG_130, 1, 5, 30, 200, _("\ -メタルのスイッチの\n\ -  コースヘ ようこそ!\n\ -みどりのスイッチを\n\ -ふめば みどりブロックが\n\ -『じったい』になる。\n\ -メタルのぼうしで\n\ -メタルになれば、\n\ -みずのなかでも\n\ -あるけてしまう。\n\ -まずは おためしください。")) - -DEFINE_DIALOG(DIALOG_131, 1, 5, 30, 200, _("\ -はねのスイッチの\n\ -  コースヘ ようこそ!\n\ -にじのリングのまんなかの\n\ -とうの うえにある\n\ -あかいスイッチを ふもう。\n\ -このせかいの すべての\n\ -あかいブロックが\n\ -『じったい』になる。\n\ -3だんとびで そらへとび、\n\ -Zボタンで ランディング。\n\ -そうさは ひこうきの\n\ -そうじゅうかん のように\n\ -まえにたおすと『さがる』\n\ -てまえにひくと『あがる』\n\ -まずは おためしを!")) - -DEFINE_DIALOG(DIALOG_132, 1, 5, 30, 200, _("\ -ダメダメ!\n\ -それは きていいはんです。\n\ -『しっかーく!』\n\ -こんどはフェアーに\n\ -いきましょう。")) - -DEFINE_DIALOG(DIALOG_133, 1, 5, 30, 200, _("\ -ああよかった。\n\ -きてくれたんですね!\n\ -ピーチひめも ぼくたちも\n\ -みんな『カベ』のなかに\n\ -とじこめられちゃいました。\n\ -クッパは パワースターを\n\ -つかって『カベ』や『え』\n\ -のなかにカイブツのくにを\n\ -つくろうと しています。\n\ -スターをとりかえして!\n\ -『スター』をいくつか\n\ -とりかえしたら、クッパの\n\ -とじたドアが ひらきます。\n\ -1かいの 4つのへやを\n\ -さがし、すすんでください。\n\ -まずは、ヒダリがわの\n\ -ボムへいの『え』の\n\ -へやに はいれます。\n\ -このへやだけは クッパの\n\ -ふういんを のがれました。\n\ -8まい たまったら\n\ -おおきな ほしのドアを\n\ -ひらくことが できます。\n\ -きっと ピーチひめは\n\ -そのなかです!")) - -DEFINE_DIALOG(DIALOG_134, 1, 4, 30, 200, _("\ -コースのはじめにえらべる\n\ -スターのなまえは、\n\ -つぎに みつけられそうな\n\ -スターのヒントです。\n\ -ヒントにでてくる\n\ -じゅんばんと、ちがう\n\ -スターを とりもどしても\n\ -かまわないですよ。\n\ -『スター』や『てき』や\n\ -『アイテム』のなかには\n\ -そのスターをえらばないと\n\ -でないものも あります。\n\ -いくつか とりかえしたら\n\ -つぎのコースのドアへと\n\ -すすんでください。みんな\n\ -たすけを まっています!")) - -DEFINE_DIALOG(DIALOG_135, 1, 5, 30, 200, _("\ -クッパがスターをもって\n\ -いっちゃいました。\n\ -ここにかくれてみてました。\n\ -スターはひとつのコースに\n\ -6こあるはずです。\n\ -でも アイテムスイッチを\n\ -ぜんぶおしてからでないと\n\ -とれないスターもあります。\n\ -どんどん さきのコースへ\n\ -すすんでください。\n\ -スタートがめんでスターの\n\ -なまえが みられます。\n\ -むかしのてきに あいたい\n\ -とき、そのほしをえらぶと\n\ -またあえる てきもいます。")) - -DEFINE_DIALOG(DIALOG_136, 1, 4, 30, 200, _("\ -ワァすごい!もうそんなに\n\ -スターをもってるんですね。\n\ -もうすぐ ぼくらのことも\n\ -たすけだしてくれますね!\n\ -クッパたちは ひっしです。\n\ -きをつけてください。\n\ -コインをとると ちからが\n\ -かいふくします。\n\ -あかコインは2まいぶん。\n\ -あおコインは5まいぶん。\n\ -あおコインのブロックを\n\ -こわすと でてきます。\n\ -たかいところからおちても\n\ -ちじょうの ちかくで\n\ -『ヒップドロップ』すると\n\ -ダメージを ふせげます。")) - -DEFINE_DIALOG(DIALOG_137, 1, 5, 30, 200, _("\ -パワースターが もどって、\n\ -おしろのちからが\n\ -かいふく してきました!\n\ -ありがとう。 クッパは\n\ -このさきに にげました。\n\ -そうだ!コインをあつめて\n\ -ますか?15のコースでは\n\ -コイン100まい とると\n\ -スペシャルスターが\n\ -あらわれます。")) - -DEFINE_DIALOG(DIALOG_138, 1, 5, 30, 200, _("\ -・2ごうエレベーター・\n\ -した・・ちていこ\n\ -ひだり・・やみのおおあな\n\ -みぎ・・・ケムリめいろ\n\ -     へいさちゅう!")) - -DEFINE_DIALOG(DIALOG_139, 1, 6, 30, 200, _("\ -このうえ・・じどうリフト\n\ -じどうリフトは のると\n\ -じどうてきに うごきだし、\n\ -コースにそってすすみます。\n\ -おりて ほうっておくと\n\ -きえてしまいます。")) - -DEFINE_DIALOG(DIALOG_140, 1, 6, 30, 200, _("\ --そうさリフトじょう-\n\ -みぎ・・・ケムリめいろ\n\ -     いりぐち\n\ -ひだり・・やみのおおあな\n\ -  1ごうエレベーターへ\n\ -やじるし・・げんざいち")) - -DEFINE_DIALOG(DIALOG_141, 1, 5, 150, 200, _("\ -ぬすまれたパワースターを\n\ -とりかえした!\n\ -クッパが とじてしまった\n\ -ドアを あけられるように\n\ -なったぞ!\n\ -2かいの ピーチのへや、\n\ -1かいの とりでのへや、\n\ -2つのへやのドアがひらく。\n\ -つぎのスターをとりかえし\n\ -おしろのみんなをすくえ!\n\ -モンスターたちはどんどん\n\ -ちからを つけてきている。\n\ -いそげ マリオ!!\n\ -おしろの いちだいじだ!")) - -DEFINE_DIALOG(DIALOG_142, 1, 5, 150, 200, _("\ -3このスターを\n\ -とりもどしたぞ! \n\ -そして スターに『3』の\n\ -すうじが ついたドアを\n\ -ひらけるように なった!\n\ -4つのへやの せかいを\n\ -じゆうに いききできる。\n\ -あたらしいカイブツたちは\n\ -もっと てごわいぞ。\n\ -きをつけて すすめ!")) - -DEFINE_DIALOG(DIALOG_143, 1, 6, 150, 200, _("\ -8このパワースターを\n\ -ぶじ とりもどし、\n\ -おおきな ほしのドアが\n\ -ひらくようになった。\n\ -クッパは すぐそこだ!\n\ -ピーチのこえがきこえる。")) - -DEFINE_DIALOG(DIALOG_144, 1, 5, 150, 200, _("\ -30この パワースターを\n\ -とりもどし、\n\ -おおきなスターのドアが\n\ -ひらくようになった!\n\ -ここですこし てんけんだ。\n\ -2ほんのはしらを ヒップ\n\ -ドロップしてみたか?\n\ -ぼうしはなくしてないか?\n\ -さばくで なくしたなら\n\ -ハゲたかジャンゴをさがせ。\n\ -クッパは うみから\n\ -このちかにせんにゅう\n\ -したらしい。\n\ -とうとうやつを\n\ -おいつめたぞ!")) - -DEFINE_DIALOG(DIALOG_145, 1, 4, 150, 200, _("\ -50このパワースターを\n\ -とりもどした!\n\ -3かいへの ほしのドアが\n\ -ひらくぞ!\n\ -クッパはすぐそこだ!\n\ -アイテムスイッチは\n\ -ぜんぶおしてきたか?\n\ -かくにん しておこう。\n\ -あか・あお・みどりの\n\ -3つのアイテムブロックは\n\ -とてもだいじな みかただ。\n\ -さあ『3かい』へすすめ!")) - -DEFINE_DIALOG(DIALOG_146, 1, 6, 150, 200, _("\ -70このパワースターを\n\ -とりもどした!\n\ -はてしない かいだんの\n\ -ナゾがとかれた。\n\ -クッパはかなりあせってる。\n\ -さあ!さいごのたたかいだ。")) - -DEFINE_DIALOG(DIALOG_147, 1, 5, 30, 200, _("\ -あか・あお・みどりの\n\ -『アイテムブロック』を\n\ -つかっていますか?\n\ -スターをとりもどすと\n\ -いりぐちがみつかる、\n\ -おしろのかくしコースで、\n\ -3つのスイッチを おすと\n\ -そのいろのブロックが\n\ -『じったい』となり、\n\ -つかえるようになります。\n\ -あかは はねのぼうし\n\ -みどりは メタルのぼうし\n\ -あおは とうめいのぼうし\n\ -\n\ -とてもつよい みかたです。")) - -DEFINE_DIALOG(DIALOG_148, 1, 5, 30, 200, _("\ -このさきスノーマンのやま\n\ -だれも はいるな!\n\ -アイスブロックシューター\n\ -を 3だんとびなどして\n\ -とびこえては イケマセン。\n\ -つめたい いけでは\n\ -はやく たいりょくが\n\ -へります!\n\ -かいふくも しません。\n\ -      スノーマン")) - -DEFINE_DIALOG(DIALOG_149, 1, 5, 30, 200, _("\ -ピーチのかくれスライダー\n\ -へ ようこそ!\n\ -ここには クッパにみつけ\n\ -られなかった おしろの\n\ -かくれスターがのこってる。\n\ -さかを すべりはじめたら\n\ -スティックまえで かそく、\n\ -うしろで げんそくできる。\n\ -はやくすべれば スターが\n\ -みつかるはずだ!")) - -DEFINE_DIALOG(DIALOG_150, 1, 5, 30, 200, _("\ -あーーん、だれだい?\n\ -とつぜん ビショぬれに\n\ -なっちゃいました!\n\ -キチンと てんじょう\n\ -なおしてもらうです。")) - -DEFINE_DIALOG(DIALOG_151, 1, 4, 30, 200, _("\ -みずをかけられた つぎは\n\ -ふんづけられました。\n\ -もう ほんとーに\n\ -おこったです!")) - -DEFINE_DIALOG(DIALOG_152, 1, 5, 30, 200, _("\ -いててて!!!\n\ -らんぼうなひとだなあ。\n\ -なぜかイライラしてたけど、\n\ -まあ、そらがみえるのも\n\ -わるくはないです。\n\ -よるには いっぱいほしが\n\ -みえるしね!\n\ -このほしは かえします。\n\ -あー、なんだか きもちが\n\ -おちついてきたです。")) - -DEFINE_DIALOG(DIALOG_153, 1, 4, 30, 200, _("\ -わしの カラダに\n\ -のぼっては いかーん!\n\ -そういうヤツは みんな\n\ -ふきっとばしちまうぞー!")) - -DEFINE_DIALOG(DIALOG_154, 1, 5, 30, 200, _("\ -ぼうしを なくすと\n\ -ダメージがおおくなるので\n\ -だいじに してください。\n\ -なくしたら、なくした\n\ -コースで みつかります。\n\ -アアーどうしよう・・・\n\ -ピーチひめは、カベに\n\ -ひきこまれたままだし。\n\ -はやく クッパを\n\ -やっつけてください。\n\ -ああ、そうだ!\n\ -えのほかにカベのなかにも\n\ -モンスターの せかいが\n\ -あります。\n\ -よーく、しらべてください。")) - -DEFINE_DIALOG(DIALOG_155, 1, 5, 30, 200, _("\ -パワースターのおかげで\n\ -おしろに、げんきが\n\ -もどってきました。\n\ -クッパなんか\n\ -おいはらってください。\n\ -おやくに たつなら\n\ -おしろの はなしをします。\n\ -『カガミのへや』では\n\ -カガミにうつらないものを\n\ -よくみてください。\n\ -みずのまちへ いくときは、\n\ -『え』にとびこむ たかさ\n\ -によって、まちをすっかり\n\ -みずびたしに できます。")) - -DEFINE_DIALOG(DIALOG_156, 1, 4, 30, 200, _("\ -とけいがとても へんです。\n\ -とけいに はいるとき、\n\ -ながいはりの ばしょに\n\ -ちゅういしてください!")) - -DEFINE_DIALOG(DIALOG_157, 1, 5, 30, 200, _("\ -ながれる『すな』に\n\ -ながされないように\n\ -きをつけて!\n\ -からだが しずんで\n\ -ジャンプできません。\n\ -あたままでしずむと\n\ -いきが できません。\n\ -くらいいろの ところは\n\ -とくに キケン!!\n\ -そこなしの じごくです!")) - -DEFINE_DIALOG(DIALOG_158, 1, 5, 30, 200, _("\ -ジャンプのテクニック\n\ -その1\n\ -タイミングよく、\n\ -れんぞくでジャンプすると\n\ -だんだん たかくとべる。\n\ -スピードがはやいほど\n\ -たかく とびあがれる。\n\ -れんぞく3かいめに\n\ -たかくとべるわざを\n\ -『3だんとび』といいます。\n\ -その2  カベにむかって\n\ -ジャンプして、そこから\n\ -もういちどジャンプできる。\n\ -『カベキック』といって、\n\ -たかいところにのぼれます。")) - -DEFINE_DIALOG(DIALOG_159, 1, 5, 30, 200, _("\ -ジャンプのテクニック\n\ -その3  Zボタンわざ\n\ -たちどまって しゃがんで\n\ -から ジャンプすると、\n\ -『バックちゅう』できます。\n\ -はやくはしりながら\n\ -しゃがんでジャンプすると\n\ -とおくまで とべる。\n\ -『はばとび』です。")) - -DEFINE_DIALOG(DIALOG_160, 1, 4, 30, 200, _("\ -はやく はしりながら\n\ -Bボタンをおすと\n\ -『ボディアタック』が\n\ -できます。\n\ -おなかで\n\ -すべっているあいだは、\n\ -A・Bどちらのボタンでも\n\ -おきあがることができます。")) - -DEFINE_DIALOG(DIALOG_161, 1, 5, 30, 200, _("\ -いやー すごいです!!\n\ -ここにいれば あえると\n\ -きいてたけど、ほんとに\n\ -あえてしまいました!!\n\ -でんごんが あります。\n\ -『これで、おしまいですが\n\ -もっとあそんでほしいので\n\ -つまらないものですが\n\ -うけとって ください。』\n\ --マリオ・スタッフより-")) - -DEFINE_DIALOG(DIALOG_162, 1, 5, 30, 200, _("\ -イテテ あいかわらず\n\ -らんぼうなひとだな。\n\ -このスターは べつに\n\ -かくしてたわけじゃ\n\ -ないんだってば!\n\ -かえせば いいんでしょ。\n\ -はなしてくれたら\n\ -スターぐらい かえすから。\n\ -これで ほんとに\n\ -さいごだよ!  ホイ!")) - -DEFINE_DIALOG(DIALOG_163, 1, 5, 30, 200, _("\ -あああっ・・またこんども\n\ -キサマのかちか マリオ!\n\ -キサマはな、わがはいが\n\ -せかいで いーちばん\n\ -まけたくないヤツなのに!\n\ -ほんとうに やくにたたぬ\n\ -カイブツどもだ!\n\ -キサマごときに\n\ -パワースターをぜーんぶ\n\ -とりもどされるとは・・・\n\ -ぜんぶで『120こ』も\n\ -あったのか!?\n\ -『しろ』に わがはいも\n\ -きづかなかったスターが\n\ -のこって おったとは・・\n\ -またまた わがはいの\n\ -だーいきらいな へいわが、\n\ -もどってしまうではないか。\n\ -わがはいは くやしーぞ!\n\ -きょうは ひきあげてやる。\n\ -だが、こんどあうときは\n\ -ぜーったい まけないぞ!\n\ -3Dスティックをみがいて\n\ -まってろよ!\n\ - ガハハッ!")) - -DEFINE_DIALOG(DIALOG_164, 1, 4, 30, 200, _("\ -しばらく やすんでたので\n\ -こんなにみごとに、\n\ -ふとっちゃいました。\n\ -ひさしぶりに やります?\n\ -では! いつものように、\n\ -レディー!\n\ -\n\ -   ゴー!! やめとく")) - -DEFINE_DIALOG(DIALOG_165, 1, 4, 30, 200, _("\ -このクイの まわりを\n\ -クルクルまわって\n\ -めをまわしても\n\ -しりません。")) - -DEFINE_DIALOG(DIALOG_166, 1, 6, 30, 200, _("\ -きょうは トレーニングで\n\ -るすに してるッス!\n\ -オイラに ちょーせん\n\ -したいひとは、またこんど\n\ -くるといいッス!\n\ -       ノコノコ")) - -#ifdef VERSION_JP -#define A_BUTTON_ACT "\ -Aボタン『ジャンプ』\n" -#define B_BUTTON_ACT "\ -Bボタン『カンバンよむ』\n\ -    『パンチ』\n\ -    『ものをもつ』\n\ -もういちどおす『なげる』" -#else -#define A_BUTTON_ACT "\ -Aボタン『ジャンプ』\n\ -    『カンバンよむ』\n" -#define B_BUTTON_ACT "\ -Bボタン『パンチ』\n\ -    『カンバンよむ』\n\ -    『ものをもつ』\n\ - もういちどおすと\n\ -    『なげる』" -#endif - -DEFINE_DIALOG(DIALOG_167, 1, 4, 30, 200, _("\ -『ピーチの おしろ』\n\ -     すぐそこ\n"\ -A_BUTTON_ACT \ -"Zボタン『しゃがむ』\n"\ -B_BUTTON_ACT)) - -DEFINE_DIALOG(DIALOG_168, 1, 4, 30, 200, _("\ -アーン、またまた \n\ -ふんづけられちゃいました。\n\ -ハナチャン かんぜんに\n\ -おこったです!")) - -DEFINE_DIALOG(DIALOG_169, 1, 5, 30, 200, _("\ -かってに はいるな!\n\ -この『どうくつ』に\n\ -むだんで はいるものには、\n\ -わざわいが おとずれる!\n\ -  --せんちょうより")) diff --git a/text/us/courses.h b/text/us/courses.h deleted file mode 100644 index 34dc2543..00000000 --- a/text/us/courses.h +++ /dev/null @@ -1,80 +0,0 @@ -COURSE_ACTS(COURSE_BOB, _(" 1 BOB-OMB BATTLEFIELD"), - _("BIG BOB-OMB ON THE SUMMIT") , _("FOOTRACE WITH KOOPA THE QUICK") , _("SHOOT TO THE ISLAND IN THE SKY"), - _("FIND THE 8 RED COINS") , _("MARIO WINGS TO THE SKY") , _("BEHIND CHAIN CHOMP'S GATE")) - -COURSE_ACTS(COURSE_WF, _(" 2 WHOMP'S FORTRESS"), - _("CHIP OFF WHOMP'S BLOCK") , _("TO THE TOP OF THE FORTRESS") , _("SHOOT INTO THE WILD BLUE"), - _("RED COINS ON THE FLOATING ISLE"), _("FALL ONTO THE CAGED ISLAND") , _("BLAST AWAY THE WALL")) - -COURSE_ACTS(COURSE_JRB, _(" 3 JOLLY ROGER BAY"), - _("PLUNDER IN THE SUNKEN SHIP") , _("CAN THE EEL COME OUT TO PLAY?") , _("TREASURE OF THE OCEAN CAVE"), - _("RED COINS ON THE SHIP AFLOAT") , _("BLAST TO THE STONE PILLAR") , _("THROUGH THE JET STREAM")) - -COURSE_ACTS(COURSE_CCM, _(" 4 COOL, COOL MOUNTAIN"), - _("SLIP SLIDIN' AWAY") , _("LI'L PENGUIN LOST") , _("BIG PENGUIN RACE"), - _("FROSTY SLIDE FOR 8 RED COINS") , _("SNOWMAN'S LOST HIS HEAD") , _("WALL KICKS WILL WORK")) - -COURSE_ACTS(COURSE_BBH, _(" 5 BIG BOO'S HAUNT"), - _("GO ON A GHOST HUNT") , _("RIDE BIG BOO'S MERRY-GO-ROUND") , _("SECRET OF THE HAUNTED BOOKS"), - _("SEEK THE 8 RED COINS") , _("BIG BOO'S BALCONY") , _("EYE TO EYE IN THE SECRET ROOM")) - -COURSE_ACTS(COURSE_HMC, _(" 6 HAZY MAZE CAVE"), - _("SWIMMING BEAST IN THE CAVERN") , _("ELEVATE FOR 8 RED COINS") , _("METAL-HEAD MARIO CAN MOVE!"), - _("NAVIGATING THE TOXIC MAZE") , _("A-MAZE-ING EMERGENCY EXIT") , _("WATCH FOR ROLLING ROCKS")) - -COURSE_ACTS(COURSE_LLL, _(" 7 LETHAL LAVA LAND"), - _("BOIL THE BIG BULLY") , _("BULLY THE BULLIES") , _("8-COIN PUZZLE WITH 15 PIECES"), - _("RED-HOT LOG ROLLING") , _("HOT-FOOT-IT INTO THE VOLCANO") , _("ELEVATOR TOUR IN THE VOLCANO")) - -COURSE_ACTS(COURSE_SSL, _(" 8 SHIFTING SAND LAND"), - _("IN THE TALONS OF THE BIG BIRD") , _("SHINING ATOP THE PYRAMID") , _("INSIDE THE ANCIENT PYRAMID"), - _("STAND TALL ON THE FOUR PILLARS"), _("FREE FLYING FOR 8 RED COINS") , _("PYRAMID PUZZLE")) - -COURSE_ACTS(COURSE_DDD, _(" 9 DIRE, DIRE DOCKS"), - _("BOARD BOWSER'S SUB") , _("CHESTS IN THE CURRENT") , _("POLE-JUMPING FOR RED COINS"), - _("THROUGH THE JET STREAM") , _("THE MANTA RAY'S REWARD") , _("COLLECT THE CAPS...")) - -COURSE_ACTS(COURSE_SL, _("10 SNOWMAN'S LAND"), - _("SNOWMAN'S BIG HEAD") , _("CHILL WITH THE BULLY") , _("IN THE DEEP FREEZE"), - _("WHIRL FROM THE FREEZING POND") , _("SHELL SHREDDIN' FOR RED COINS") , _("INTO THE IGLOO")) - -COURSE_ACTS(COURSE_WDW, _("11 WET-DRY WORLD"), - _("SHOCKING ARROW LIFTS!") , _("TOP O' THE TOWN") , _("SECRETS IN THE SHALLOWS & SKY"), - _("EXPRESS ELEVATOR--HURRY UP!") , _("GO TO TOWN FOR RED COINS") , _("QUICK RACE THROUGH DOWNTOWN!")) - -COURSE_ACTS(COURSE_TTM, _("12 TALL, TALL MOUNTAIN"), - _("SCALE THE MOUNTAIN") , _("MYSTERY OF THE MONKEY CAGE") , _("SCARY 'SHROOMS, RED COINS"), - _("MYSTERIOUS MOUNTAINSIDE") , _("BREATHTAKING VIEW FROM BRIDGE") , _("BLAST TO THE LONELY MUSHROOM")) - -COURSE_ACTS(COURSE_THI, _("13 TINY-HUGE ISLAND"), - _("PLUCK THE PIRANHA FLOWER") , _("THE TIP TOP OF THE HUGE ISLAND"), _("REMATCH WITH KOOPA THE QUICK"), - _("FIVE ITTY BITTY SECRETS") , _("WIGGLER'S RED COINS") , _("MAKE WIGGLER SQUIRM")) - -COURSE_ACTS(COURSE_TTC, _("14 TICK TOCK CLOCK"), - _("ROLL INTO THE CAGE") , _("THE PIT AND THE PENDULUMS") , _("GET A HAND"), - _("STOMP ON THE THWOMP") , _("TIMED JUMPS ON MOVING BARS") , _("STOP TIME FOR RED COINS")) - -COURSE_ACTS(COURSE_RR, _("15 RAINBOW RIDE"), - _("CRUISER CROSSING THE RAINBOW") , _("THE BIG HOUSE IN THE SKY") , _("COINS AMASSED IN A MAZE"), - _("SWINGIN' IN THE BREEZE") , _("TRICKY TRIANGLES!") , _("SOMEWHERE OVER THE RAINBOW")) - -SECRET_STAR(COURSE_BITDW, _(" BOWSER IN THE DARK WORLD")) -SECRET_STAR(COURSE_BITFS, _(" BOWSER IN THE FIRE SEA")) -SECRET_STAR(COURSE_BITS, _(" BOWSER IN THE SKY")) -SECRET_STAR(COURSE_PSS, _(" THE PRINCESS'S SECRET SLIDE")) -SECRET_STAR(COURSE_COTMC, _(" CAVERN OF THE METAL CAP")) -SECRET_STAR(COURSE_TOTWC, _(" TOWER OF THE WING CAP")) -SECRET_STAR(COURSE_VCUTM, _(" VANISH CAP UNDER THE MOAT")) -SECRET_STAR(COURSE_WMOTR, _(" WING MARIO OVER THE RAINBOW")) -SECRET_STAR(COURSE_SA, _(" THE SECRET AQUARIUM")) -SECRET_STAR(COURSE_CAKE_END, _("")) - -CASTLE_SECRET_STARS(_(" CASTLE SECRET STARS")) - -EXTRA_TEXT(0, _("ONE OF THE CASTLE'S SECRET STARS!")) -EXTRA_TEXT(1, _("")) -EXTRA_TEXT(2, _("")) -EXTRA_TEXT(3, _("")) -EXTRA_TEXT(4, _("")) -EXTRA_TEXT(5, _("")) -EXTRA_TEXT(6, _("")) diff --git a/text/us/dialogs.h b/text/us/dialogs.h deleted file mode 100644 index 34a18b20..00000000 --- a/text/us/dialogs.h +++ /dev/null @@ -1,2102 +0,0 @@ -// Parameters: dialog enum ID, (unused), lines per box, left offset, width - -#ifdef VERSION_EU -#define COMRADES "friends" -#define PLASTERED "splattered" -#define SCAM_ME "cheat!\n" -#define SCRAM "get lost" -#define YOU_CANT_SWIM_IN_IT "Its too heavy to swim\nwith." -#define GIVE_UP "give up" -#else -#define COMRADES "comrades" -#define PLASTERED "plastered" -#define SCAM_ME "scam\nME. " -#define SCRAM "scram--" -#define YOU_CANT_SWIM_IN_IT "You can't swim in it." -#define GIVE_UP "give" -#endif - -DEFINE_DIALOG(DIALOG_000, 1, 6, 30, 200, _("\ -Wow! You're smack in the\n\ -middle of the battlefield.\n\ -You'll find the Power\n\ -Stars that Bowser stole\n\ -inside the painting\n\ -worlds.\n\ -First, talk to the\n\ -Bob-omb Buddy. (Press [B]\n\ -to talk.) He'll certainly\n\ -help you out, and so will\n\ -his " COMRADES " in other\n\ -areas.\n\ -To read signs, stop, face\n\ -them and press [B]. Press [A]\n\ -or [B] to scroll ahead. You\n\ -can talk to some other\n\ -characters by facing them\n\ -and pressing [B].")) - -DEFINE_DIALOG(DIALOG_001, 1, 4, 95, 200, _("\ -Watch out! If you wander\n\ -around here, you're liable\n\ -to be " PLASTERED " by a\n\ -water bomb!\n\ -Those enemy Bob-ombs love\n\ -to fight, and they're\n\ -always finding ways to\n\ -attack.\n\ -This meadow has become\n\ -a battlefield ever since\n\ -the Big Bob-omb got his\n\ -paws on the Power Star.\n\ -Can you recover the Star\n\ -for us? Cross the bridge\n\ -and go left up the path\n\ -to find the Big Bob-omb.\n\ -Please come back to see\n\ -me after you've retrieved\n\ -the Power Star!")) - -DEFINE_DIALOG(DIALOG_002, 1, 4, 95, 200, _("\ -Hey, you! It's dangerous\n\ -ahead, so listen up! Take\n\ -my advice.\n\ -\n\ -Cross the two\n\ -bridges ahead, then\n\ -watch for falling\n\ -water bombs.\n\ -The Big Bob-omb at the\n\ -top of the mountain is\n\ -very powerful--don't let\n\ -him grab you!\n\ -We're Bob-omb Buddies,\n\ -and we're on your side.\n\ -You can talk to us\n\ -whenever you'd like to!")) - -DEFINE_DIALOG(DIALOG_003, 1, 5, 95, 200, _("\ -Thank you, Mario! The Big\n\ -Bob-omb is nothing but a\n\ -big dud now! But the\n\ -battle for the castle has\n\ -just begun.\n\ -Other enemies are holding\n\ -the other Power Stars. If\n\ -you recover more Stars,\n\ -you can open new doors\n\ -that lead to new worlds!\n\ -My Bob-omb Buddies are\n\ -waiting for you. Be sure\n\ -to talk to them--they'll\n\ -set up cannons for you.")) - -DEFINE_DIALOG(DIALOG_004, 1, 3, 95, 200, _("\ -We're peace-loving\n\ -Bob-ombs, so we don't use\n\ -cannons.\n\ -But if you'd like\n\ -to blast off, we don't\n\ -mind. Help yourself.\n\ -We'll prepare all of the\n\ -cannons in this course for\n\ -you to use. Bon Voyage!")) - -DEFINE_DIALOG(DIALOG_005, 1, 3, 30, 200, _("\ -Hey, Mario! Is it true\n\ -that you beat the Big\n\ -Bob-omb? Cool!\n\ -You must be strong. And\n\ -pretty fast. So, how fast\n\ -are you, anyway?\n\ -Fast enough to beat me...\n\ -Koopa the Quick? I don't\n\ -think so. Just try me.\n\ -How about a race to the\n\ -mountaintop, where the\n\ -Big Bob-omb was?\n\ -Whaddya say? When I say\n\ -『Go,』 let the race begin!\n\ -\n\ -Ready....\n\ -\n\ -//Go!////Don't Go")) - -DEFINE_DIALOG(DIALOG_006, 1, 3, 30, 200, _("\ -Hey!!! Don't try to " SCAM_ME -"You've gotta run\n\ -the whole course.\n\ -Later. Look me up when\n\ -you want to race for\n\ -real.")) - -DEFINE_DIALOG(DIALOG_007, 1, 5, 30, 200, _("\ -Hufff...fff...pufff...\n\ -Whoa! You...really...are...\n\ -fast! A human blur!\n\ -Here you go--you've won\n\ -it, fair and square!")) - -DEFINE_DIALOG(DIALOG_008, 1, 4, 30, 200, _("\ -BEWARE OF CHAIN CHOMP\n\ -Extreme Danger!\n\ -Get close and press [C]^\n\ -for a better look.\n\ -Scary, huh?\n\ -See the Red Coin on top\n\ -of the stake?\n\ -\n\ -When you collect eight of\n\ -them, a Power Star will\n\ -appear in the meadow\n\ -across the bridge.")) - -DEFINE_DIALOG(DIALOG_009, 1, 5, 30, 200, _("\ -Long time, no see! Wow,\n\ -have you gotten fast!\n\ -Have you been training\n\ -on the sly, or is it the\n\ -power of the Stars?\n\ -I've been feeling down\n\ -about losing the last\n\ -race. This is my home\n\ -course--how about a\n\ -rematch?\n\ -The goal is in\n\ -Windswept Valley.\n\ -Ready?\n\ -\n\ -//Go//// Don't Go")) - -DEFINE_DIALOG(DIALOG_010, 1, 4, 30, 200, _("\ -You've stepped on the\n\ -Wing Cap Switch. Wearing\n\ -the Wing Cap, you can\n\ -soar through the sky.\n\ -Now Wing Caps will pop\n\ -out of all the red blocks\n\ -you find.\n\ -\n\ -Would you like to Save?\n\ -\n\ -//Yes////No")) - -DEFINE_DIALOG(DIALOG_011, 1, 4, 30, 200, _("\ -You've just stepped on\n\ -the Metal Cap Switch!\n\ -The Metal Cap makes\n\ -Mario invincible.\n\ -Now Metal Caps will\n\ -pop out of all of the\n\ -green blocks you find.\n\ -\n\ -Would you like to Save?\n\ -\n\ -//Yes////No")) - -DEFINE_DIALOG(DIALOG_012, 1, 4, 30, 200, _("\ -You've just stepped on\n\ -the Vanish Cap Switch.\n\ -The Vanish Cap makes\n\ -Mario disappear.\n\ -Now Vanish Caps will pop\n\ -from all of the blue\n\ -blocks you find.\n\ -\n\ -Would you like to Save?\n\ -\n\ -//Yes////No")) - -DEFINE_DIALOG(DIALOG_013, 1, 5, 30, 200, _("\ -You've collected 100\n\ -coins! Mario gains more\n\ -power from the castle.\n\ -Do you want to Save?\n\ -//Yes////No")) - -DEFINE_DIALOG(DIALOG_014, 1, 4, 30, 200, _("\ -Wow! Another Power Star!\n\ -Mario gains more courage\n\ -from the power of the\n\ -castle.\n\ -Do you want to Save?\n\ -\n\ -//You Bet//Not Now")) - -DEFINE_DIALOG(DIALOG_015, 1, 4, 30, 200, _("\ -You can punch enemies to\n\ -knock them down. Press [A]\n\ -to jump, [B] to punch.\n\ -Press [A] then [B] to Kick.\n\ -To pick something up,\n\ -press [B], too. To throw\n\ -something you're holding,\n\ -press [B] again.")) - -DEFINE_DIALOG(DIALOG_016, 1, 3, 30, 200, _("\ -Hop on the shiny shell and\n\ -ride wherever you want to\n\ -go! Shred those enemies!")) - -DEFINE_DIALOG(DIALOG_017, 1, 4, 30, 200, _("\ -I'm the Big Bob-omb, lord\n\ -of all blasting matter,\n\ -king of ka-booms the\n\ -world over!\n\ -How dare you scale my\n\ -mountain? By what right\n\ -do you set foot on my\n\ -imperial mountaintop?\n\ -You may have eluded my\n\ -guards, but you'll never\n\ -escape my grasp...\n\ -\n\ -...and you'll never take\n\ -away my Power Star. I\n\ -hereby challenge you,\n\ -Mario!\n\ -If you want the Star I\n\ -hold, you must prove\n\ -yourself in battle.\n\ -\n\ -Can you pick me up from\n\ -the back and hurl me to\n\ -this royal turf? I think\n\ -that you cannot!")) - -DEFINE_DIALOG(DIALOG_018, 1, 4, 30, 200, _("\ -I'm sleeping because...\n\ -...I'm sleepy. I don't\n\ -like being disturbed.\n\ -Please walk quietly.")) - -DEFINE_DIALOG(DIALOG_019, 1, 2, 30, 200, _("\ -Shhh! Please walk\n\ -quietly in the hallway!")) - -DEFINE_DIALOG(DIALOG_020, 1, 6, 95, 150, _("\ -Dear Mario:\n\ -Please come to the\n\ -castle. I've baked\n\ -a cake for you.\n\ -Yours truly--\n\ -Princess Toadstool")) - -DEFINE_DIALOG(DIALOG_021, 1, 5, 95, 200, _("\ -Welcome.\n\ -No one's home!\n\ -Now " SCRAM "\n\ -and don't come back!\n\ -Gwa ha ha!")) - -DEFINE_DIALOG(DIALOG_022, 1, 2, 95, 200, _("\ -You need a key to open\n\ -this door.")) - -DEFINE_DIALOG(DIALOG_023, 1, 3, 95, 200, _("\ -This key doesn't fit!\n\ -Maybe it's for the\n\ -basement...")) - -DEFINE_DIALOG(DIALOG_024, 1, 5, 95, 200, _("\ -You need Star power to\n\ -open this door. Recover a\n\ -Power Star from an enemy\n\ -inside one of the castle's\n\ -paintings.")) - -DEFINE_DIALOG(DIALOG_025, 1, 4, 95, 200, _("\ -It takes the power of\n\ -3 Stars to open this\n\ -door. You need [%] more\n\ -Stars.")) - -DEFINE_DIALOG(DIALOG_026, 1, 4, 95, 200, _("\ -It takes the power of\n\ -8 Stars to open this\n\ -door. You need [%] more\n\ -Stars.")) - -DEFINE_DIALOG(DIALOG_027, 1, 4, 95, 200, _("\ -It takes the power of\n\ -30 Stars to open this\n\ -door. You need [%] more\n\ -Stars.")) - -DEFINE_DIALOG(DIALOG_028, 1, 4, 95, 200, _("\ -It takes the power of\n\ -50 Stars to open this\n\ -door. You need [%] more\n\ -Stars.")) - -DEFINE_DIALOG(DIALOG_029, 1, 5, 95, 200, _("\ -To open the door that\n\ -leads to the 『endless』\n\ -stairs, you need 70\n\ -Stars.\n\ -Bwa ha ha!")) - -DEFINE_DIALOG(DIALOG_030, 1, 6, 30, 200, _("\ -Hello! The Lakitu Bros.,\n\ -cutting in with a live\n\ -update on Mario's\n\ -progress. He's about to\n\ -learn a technique for\n\ -sneaking up on enemies.\n\ -The trick is this: He has\n\ -to walk very slowly in\n\ -order to walk quietly.\n\ -\n\ -\n\ -\n\ -And wrapping up filming\n\ -techniques reported on\n\ -earlier, you can take a\n\ -look around using [C]> and\n\ -[C]<. Press [C]| to view the\n\ -action from a distance.\n\ -When you can't move the\n\ -camera any farther, the\n\ -buzzer will sound. This is\n\ -the Lakitu Bros.,\n\ -signing off.")) - -DEFINE_DIALOG(DIALOG_031, 1, 5, 30, 200, _("\ -No way! You beat me...\n\ -again!! And I just spent\n\ -my entire savings on\n\ -these new Koopa\n\ -Mach 1 Sprint shoes!\n\ -Here, I guess I have to\n\ -hand over this Star to\n\ -the winner of the race.\n\ -Congrats, Mario!")) - -DEFINE_DIALOG(DIALOG_032, 1, 5, 30, 200, _("\ -If you get the Wing Cap,\n\ -you can fly! Put the cap\n\ -on, then do a Triple\n\ -Jump--jump three times\n\ -in a row--to take off.\n\ -You can fly even higher\n\ -if you blast out of a\n\ -cannon wearing the\n\ -Wing Cap!\n\ -\n\ -Use the [C] Buttons to look\n\ -around while flying, and\n\ -press [Z] to land.")) - -DEFINE_DIALOG(DIALOG_033, 1, 6, 30, 200, _("\ -Ciao! You've reached\n\ -Princess Toadstool's\n\ -castle via a warp pipe.\n\ -Using the controller is a\n\ -piece of cake. Press [A] to\n\ -jump and [B] to attack.\n\ -Press [B] to read signs,\n\ -too. Use the Control Stick\n\ -in the center of the\n\ -controller to move Mario\n\ -around. Now, head for\n\ -the castle.")) - -DEFINE_DIALOG(DIALOG_034, 1, 6, 30, 200, _("\ -Good afternoon. The\n\ -Lakitu Bros., here,\n\ -reporting live from just\n\ -outside the Princess's\n\ -castle.\n\ -\n\ -Mario has just arrived\n\ -on the scene, and we'll\n\ -be filming the action live\n\ -as he enters the castle\n\ -and pursues the missing\n\ -Power Stars.\n\ -As seasoned cameramen,\n\ -we'll be shooting from the\n\ -recommended angle, but\n\ -you can change the\n\ -camera angle by pressing\n\ -the [C] Buttons.\n\ -If we can't adjust the\n\ -view any further, we'll\n\ -buzz. To take a look at\n\ -the surroundings, stop\n\ -and press [C]^.\n\ -\n\ -Press [A] to resume play.\n\ -Switch camera modes with\n\ -the [R] Button. Signs along\n\ -the way will review these\n\ -instructions.\n\ -\n\ -For now, reporting live,\n\ -this has been the\n\ -Lakitu Bros.")) - -DEFINE_DIALOG(DIALOG_035, 1, 5, 30, 200, _("\ -There are four camera, or\n\ -『[C],』 Buttons. Press [C]^\n\ -to look around using the\n\ -Control Stick.\n\ -\n\ -You'll usually see Mario\n\ -through Lakitu's camera.\n\ -It is the camera\n\ -recommended for normal\n\ -play.\n\ -You can change angles by\n\ -pressing [C]>. If you press\n\ -[R], the view switches to\n\ -Mario's camera, which\n\ -is directly behind him.\n\ -Press [R] again to return\n\ -to Lakitu's camera. Press\n\ -[C]| to see Mario from\n\ -afar, using either\n\ -Lakitu's or Mario's view.")) - -DEFINE_DIALOG(DIALOG_036, 1, 5, 30, 200, _("\ -OBSERVATION PLATFORM\n\ -Press [C]^ to take a look\n\ -around. Don't miss\n\ -anything!\n\ -\n\ -Press [R] to switch to\n\ -Mario's camera. It\n\ -always follows Mario.\n\ -Press [R] again to switch\n\ -to Lakitu's camera.\n\ -Pause the game and\n\ -switch the mode to 『fix』\n\ -the camera in place while\n\ -holding [R]. Give it a try!")) - -DEFINE_DIALOG(DIALOG_037, 1, 2, 30, 200, _("\ -I win! You lose!\n\ -Ha ha ha ha!\n\ -You're no slouch, but I'm\n\ -a better sledder!\n\ -Better luck next time!")) - -DEFINE_DIALOG(DIALOG_038, 1, 3, 95, 200, _("\ -Reacting to the Star\n\ -power, the door slowly\n\ -opens.")) - -DEFINE_DIALOG(DIALOG_039, 1, 4, 30, 200, _("\ -No visitors allowed,\n\ -by decree of\n\ -the Big Bob-omb\n\ -\n\ -I shall never surrender my\n\ -Stars, for they hold the\n\ -power of the castle in\n\ -their glow.\n\ -They were a gift from\n\ -Bowser, the Koopa King\n\ -himself, and they lie well\n\ -hidden within my realm.\n\ -Not a whisper of their\n\ -whereabouts shall leave\n\ -my lips. Oh, all right,\n\ -perhaps one hint:\n\ -Heed the Star names at\n\ -the beginning of the\n\ -course.\n\ -//--The Big Bob-omb")) - -DEFINE_DIALOG(DIALOG_040, 1, 3, 30, 200, _("\ -Warning!\n\ -Cold, Cold Crevasse\n\ -Below!")) - -DEFINE_DIALOG(DIALOG_041, 1, 3, 30, 200, _("\ -I win! You lose!\n\ -Ha ha ha!\n\ -\n\ -That's what you get for\n\ -messin' with Koopa the\n\ -Quick.\n\ -Better luck next time!")) - -DEFINE_DIALOG(DIALOG_042, 1, 4, 30, 200, _("\ -Caution! Narrow Bridge!\n\ -Cross slowly!\n\ -\n\ -\n\ -You can jump to the edge\n\ -of the cliff and hang on,\n\ -and you can climb off the\n\ -edge if you move slowly.\n\ -When you want to let go,\n\ -either press [Z] or press\n\ -the Control Stick in the\n\ -direction of Mario's back.\n\ -To climb up, press Up on\n\ -the Control Stick. To\n\ -scurry up quickly, press\n\ -the [A] Button.")) - -DEFINE_DIALOG(DIALOG_043, 1, 5, 30, 200, _("\ -If you jump and hold the\n\ -[A] Button, you can hang on\n\ -to some objects overhead.\n\ -It's the same as grabbing\n\ -a flying bird!")) - -DEFINE_DIALOG(DIALOG_044, 1, 5, 95, 200, _("\ -Whooo's there? Whooo\n\ -woke me up? It's still\n\ -daylight--I should be\n\ -sleeping!\n\ -\n\ -Hey, as long as I'm\n\ -awake, why not take a\n\ -short flight with me?\n\ -Press and hold [A] to grab\n\ -on. Release [A] to let go.\n\ -I'll take you wherever\n\ -you want to go, as long\n\ -as my wings hold out.\n\ -Watch my shadow, and\n\ -grab on.")) - -DEFINE_DIALOG(DIALOG_045, 1, 6, 95, 200, _("\ -Whew! I'm just about\n\ -flapped out. You should\n\ -lay off the pasta, Mario!\n\ -That's it for now. Press\n\ -[A] to let go. Okay,\n\ -bye byyyyyyeeee!")) - -DEFINE_DIALOG(DIALOG_046, 1, 5, 30, 200, _("\ -You have to master three\n\ -important jumping\n\ -techniques.\n\ -First try the Triple Jump.\n\ -\n\ -Run fast, then jump three\n\ -times, one, two, three.\n\ -If you time the jumps\n\ -right, you'll hop, skip,\n\ -then jump really high.\n\ -Next, go for distance\n\ -with the Long Jump. Run,\n\ -press [Z] to crouch then [A]\n\ -to jump really far.\n\ -\n\ -To do the Wall Kick, press\n\ -[A] to jump at a wall, then\n\ -jump again when you hit\n\ -the wall.\n\ -\n\ -Got that? Triple Jump,\n\ -Long Jump, Wall Kick.\n\ -Practice, practice,\n\ -practice. You don't stand\n\ -a chance without them.")) - -DEFINE_DIALOG(DIALOG_047, 1, 2, 95, 200, _("\ -Hi! I'll prepare the\n\ -cannon for you!")) - -DEFINE_DIALOG(DIALOG_048, 1, 4, 30, 200, _("\ -Snow Mountain Summit\n\ -Watch for slippery\n\ -conditions! Please enter\n\ -the cottage first.")) - -DEFINE_DIALOG(DIALOG_049, 1, 5, 30, 200, _("\ -Remember that tricky Wall\n\ -Kick jump? It's a\n\ -technique you'll have to\n\ -master in order to reach\n\ -high places.\n\ -Use it to jump from wall\n\ -to wall. Press the\n\ -Control Stick in the\n\ -direction you want to\n\ -bounce to gain momentum.\n\ -Practice makes perfect!")) - -DEFINE_DIALOG(DIALOG_050, 1, 4, 30, 200, _("\ -Hold [Z] to crouch and\n\ -slide down a slope.\n\ -Or press [Z] while in the\n\ -air to Pound the Ground!\n\ -If you stop, crouch, then\n\ -jump, you'll do a\n\ -Backward Somersault!\n\ -Got that?\n\ -There's more. Crouch and\n\ -then jump to do a\n\ -Long Jump! Or crouch and\n\ -walk to...never mind.")) - -DEFINE_DIALOG(DIALOG_051, 1, 6, 30, 200, _("\ -Climbing's easy! When you\n\ -jump at trees, poles or\n\ -pillars, you'll grab them\n\ -automatically. Press [A] to\n\ -jump off backward.\n\ -\n\ -To rotate around the\n\ -object, press Right or\n\ -Left on the Control Stick.\n\ -When you reach the top,\n\ -press Up to do a\n\ -handstand!\n\ -Jump off from the\n\ -handstand for a high,\n\ -stylin' dismount.")) - -DEFINE_DIALOG(DIALOG_052, 1, 5, 30, 200, _("\ -Stop and press [Z] to\n\ -crouch, then press [A]\n\ -to do a high, Backward\n\ -Somersault!\n\ -\n\ -To perform a Side\n\ -Somersault, run, do a\n\ -sharp U-turn and jump.\n\ -You can catch lots of\n\ -air with both jumps.")) - -DEFINE_DIALOG(DIALOG_053, 1, 5, 30, 200, _("\ -Sometimes, if you pass\n\ -through a coin ring or\n\ -find a secret point in a\n\ -course, a red number will\n\ -appear.\n\ -If you trigger five red\n\ -numbers, a secret Star\n\ -will show up.")) - -DEFINE_DIALOG(DIALOG_054, 1, 5, 30, 200, _("\ -Welcome to the snow\n\ -slide! Hop on! To speed\n\ -up, press forward on the\n\ -Control Stick. To slow\n\ -down, pull back.")) - -DEFINE_DIALOG(DIALOG_055, 1, 4, 30, 200, _("\ -Hey-ey, Mario, buddy,\n\ -howzit goin'? Step right\n\ -up. You look like a fast\n\ -sleddin' kind of guy.\n\ -I know speed when I see\n\ -it, yes siree--I'm the\n\ -world champion sledder,\n\ -you know. Whaddya say?\n\ -How about a race?\n\ -Ready...\n\ -\n\ -//Go//// Don't Go")) - -DEFINE_DIALOG(DIALOG_056, 1, 6, 30, 200, _("\ -You brrrr-oke my record!\n\ -Unbelievable! I knew\n\ -that you were the coolest.\n\ -Now you've proven\n\ -that you're also the\n\ -fastest!\n\ -I can't award you a gold\n\ -medal, but here, take this\n\ -Star instead. You've\n\ -earned it!")) - -DEFINE_DIALOG(DIALOG_057, 1, 4, 30, 200, _("\ -Egad! My baby!! Have you\n\ -seen my baby??? She's\n\ -the most precious baby in\n\ -the whole wide world.\n\ -(They say she has my\n\ -beak...) I just can't\n\ -remember where I left\n\ -her.\n\ -Let's see...I stopped\n\ -for herring and ice cubes,\n\ -then I...oohh! I just\n\ -don't know!")) - -DEFINE_DIALOG(DIALOG_058, 1, 4, 30, 200, _("\ -You found my precious,\n\ -precious baby! Where\n\ -have you been? How can\n\ -I ever thank you, Mario?\n\ -Oh, I do have this...\n\ -...Star. Here, take it\n\ -with my eternal\n\ -gratitude.")) - -DEFINE_DIALOG(DIALOG_059, 1, 4, 30, 200, _("\ -That's not my baby! She\n\ -looks nothing like me!\n\ -Her parents must be\n\ -worried sick!")) - -DEFINE_DIALOG(DIALOG_060, 1, 4, 30, 200, _("\ -ATTENTION!\n\ -Read Before Diving In!\n\ -\n\ -\n\ -If you stay under the\n\ -water for too long, you'll\n\ -run out of oxygen.\n\ -\n\ -Return to the surface for\n\ -air or find an air bubble\n\ -or coins to breathe while\n\ -underwater.\n\ -Press [A] to swim. Hold [A]\n\ -to swim slow and steady.\n\ -Tap [A] with smooth timing\n\ -to gain speed.\n\ -Press Up on the\n\ -Control Stick and press [A]\n\ -to dive.\n\ -\n\ -Press Down on the Control\n\ -Stick and press [A] to\n\ -return to the surface.\n\ -\n\ -Hold Down and press [A]\n\ -while on the surface near\n\ -the edge of the water to\n\ -jump out.")) - -DEFINE_DIALOG(DIALOG_061, 1, 4, 30, 200, _("\ -BRRR! Frostbite Danger!\n\ -Do not swim here.\n\ -I'm serious.\n\ -/--The Penguin")) - -DEFINE_DIALOG(DIALOG_062, 1, 3, 30, 200, _("\ -Hidden inside the green\n\ -block is the amazing\n\ -Metal Cap.\n\ -Wearing it, you won't\n\ -catch fire or be hurt\n\ -by enemy attacks.\n\ -You don't even have to\n\ -breathe while wearing it.\n\ -\n\ -The only problem:\n" -YOU_CANT_SWIM_IN_IT)) - -DEFINE_DIALOG(DIALOG_063, 1, 5, 30, 200, _("\ -The Vanish Cap is inside\n\ -the blue block. Mr. I.\n\ -will be surprised, since\n\ -you'll be invisible when\n\ -you wear it!\n\ -Even the Big Boo will be\n\ -fooled--and you can walk\n\ -through secret walls, too.")) - -DEFINE_DIALOG(DIALOG_064, 1, 5, 30, 200, _("\ -When you put on the Wing\n\ -Cap that comes from a\n\ -red block, do the Triple\n\ -Jump to soar high into\n\ -the sky.\n\ -Use the Control Stick to\n\ -guide Mario. Pull back to\n\ -to fly up, press forward\n\ -to nose down, and press [Z]\n\ -to land.")) - -DEFINE_DIALOG(DIALOG_065, 1, 6, 30, 200, _("\ -Swimming Lessons!\n\ -Tap [A] to do the breast\n\ -stroke. If you time the\n\ -taps right, you'll swim\n\ -fast.\n\ -\n\ -Press and hold [A] to do a\n\ -slow, steady flutter kick.\n\ -Press Up on the Control\n\ -Stick to dive, and pull\n\ -back on the stick to head\n\ -for the surface.\n\ -To jump out of the water,\n\ -hold Down on the Control\n\ -Stick, then press [A].\n\ -Easy as pie, right?\n\ -\n\ -\n\ -But remember:\n\ -Mario can't breathe under\n\ -the water! Return to the\n\ -surface for air when the\n\ -Power Meter runs low.\n\ -\n\ -And one last thing: You\n\ -can't open doors that\n\ -are underwater.")) - -DEFINE_DIALOG(DIALOG_066, 1, 5, 30, 200, _("\ -Mario, it's Peach!\n\ -Please be careful! Bowser\n\ -is so wicked! He will try\n\ -to burn you with his\n\ -horrible flame breath.\n\ -Run around behind and\n\ -grab him by the tail with\n\ -the [B] Button. Once you\n\ -grab hold, swing him\n\ -around in great circles.\n\ -Rotate the Control Stick\n\ -to go faster and faster.\n\ -The faster you swing him,\n\ -the farther he'll fly.\n\ -\n\ -Use the [C] Buttons to look\n\ -around, Mario. You have\n\ -to throw Bowser into one\n\ -of the bombs in the four\n\ -corners.\n\ -Aim well, then press [B]\n\ -again to launch Bowser.\n\ -Good luck, Mario! Our\n\ -fate is in your hands.")) - -DEFINE_DIALOG(DIALOG_067, 1, 5, 30, 200, _("\ -Tough luck, Mario!\n\ -Princess Toadstool isn't\n\ -here...Gwa ha ha!! Go\n\ -ahead--just try to grab\n\ -me by the tail!\n\ -You'll never be able to\n\ -swing ME around! A wimp\n\ -like you won't throw me\n\ -out of here! Never! Ha!")) - -DEFINE_DIALOG(DIALOG_068, 1, 5, 30, 200, _("\ -It's Lethal Lava Land!\n\ -If you catch fire or fall\n\ -into a pool of flames,\n\ -you'll be hopping mad, but\n\ -don't lose your cool.\n\ -You can still control\n\ -Mario--just try to keep\n\ -calm!")) - -DEFINE_DIALOG(DIALOG_069, 1, 6, 30, 200, _("\ -Sometimes you'll bump into\n\ -invisible walls at the\n\ -edges of the painting\n\ -worlds. If you hit a wall\n\ -while flying, you'll bounce\n\ -back.")) - -DEFINE_DIALOG(DIALOG_070, 1, 5, 30, 200, _("\ -You can return to the\n\ -castle's main hall at any\n\ -time from the painting\n\ -worlds where the enemies\n\ -live.\n\ -Just stop, stand still,\n\ -press Start to pause the\n\ -game, then select\n\ -『Exit Course.』\n\ -\n\ -You don't have to collect\n\ -all Power Stars in one\n\ -course before going on to\n\ -the next.\n\ -\n\ -Return later, when you're\n\ -more experienced, to pick\n\ -up difficult ones.\n\ -\n\ -\n\ -Whenever you find a Star,\n\ -a hint for finding the\n\ -next one will appear on\n\ -the course's start screen.\n\ -\n\ -You can, however, collect\n\ -any of the remaining\n\ -Stars next. You don't\n\ -have to recover the one\n\ -described by the hint.")) - -DEFINE_DIALOG(DIALOG_071, 1, 3, 30, 200, _("\ -Danger Ahead!\n\ -Beware of the strange\n\ -cloud! Don't inhale!\n\ -If you feel faint, run for\n\ -higher ground and fresh\n\ -air!\n\ -Circle: Shelter\n\ -Arrow: Entrance-Exit")) - -DEFINE_DIALOG(DIALOG_072, 1, 5, 30, 200, _("\ -High winds ahead!\n\ -Pull your Cap down tight.\n\ -If it blows off, you'll\n\ -have to find it on this\n\ -mountain.")) - -DEFINE_DIALOG(DIALOG_073, 1, 4, 95, 200, _("\ -Aarrgh! Ahoy, matey. I\n\ -have sunken treasure,\n\ -here, I do.\n\ -\n\ -But to pluck the plunder,\n\ -you must open the\n\ -Treasure Chests in the\n\ -right order.\n\ -What order is that,\n\ -ye say?\n\ -\n\ -\n\ -I'll never tell!\n\ -\n\ -//--The Cap'n")) - -DEFINE_DIALOG(DIALOG_074, 1, 5, 30, 200, _("\ -You can grab on to the\n\ -edge of a cliff or ledge\n\ -with your fingertips and\n\ -hang down from it.\n\ -\n\ -To drop from the edge,\n\ -either press the Control\n\ -Stick in the direction of\n\ -Mario's back or press the\n\ -[Z] Button.\n\ -To get up onto the ledge,\n\ -either press Up on the\n\ -Control Stick or press [A]\n\ -as soon as you grab the\n\ -ledge to climb up quickly.")) - -DEFINE_DIALOG(DIALOG_075, 1, 5, 30, 200, _("\ -Mario!! My castle is in\n\ -great peril. I know that\n\ -Bowser is the cause...and\n\ -I know that only you can\n\ -stop him!\n\ -The doors in the castle\n\ -that have been sealed by\n\ -Bowser can be opened only\n\ -with Star Power.\n\ -\n\ -But there are secret\n\ -paths in the castle,\n\ -paths that Bowser hasn't\n\ -found.\n\ -\n\ -One of those paths is in\n\ -this room, and it holds\n\ -one of the castle's Secret\n\ -Stars!\n\ -\n\ -Find that Secret Star,\n\ -Mario! It will help you\n\ -on your quest. Please,\n\ -Mario, you have to\n\ -help us!\n\ -Retrieve all of the\n\ -Power Stars in the castle\n\ -and free us from this\n\ -awful prison!\n\ -Please!")) - -DEFINE_DIALOG(DIALOG_076, 1, 6, 30, 200, _("\ -Thanks to the power of\n\ -the Stars, life is\n\ -returning to the castle.\n\ -Please, Mario, you have\n\ -to give Bowser the boot!\n\ -\n\ -Here, let me tell you a\n\ -little something about the\n\ -castle. In the room with\n\ -the mirrors, look carefully\n\ -for anything that's not\n\ -reflected in the mirror.\n\ -And when you go to the\n\ -water town, you can flood\n\ -it with a high jump into\n\ -the painting. Oh, by the\n\ -way, look what I found!")) - -DEFINE_DIALOG(DIALOG_077, 1, 2, 150, 200, _("\ -It is decreed that one\n\ -shall pound the pillars.")) - -DEFINE_DIALOG(DIALOG_078, 1, 5, 30, 200, _("\ -Break open the Blue Coin\n\ -Block by Pounding the\n\ -Ground with the [Z] Button.\n\ -One Blue Coin is worth\n\ -five Yellow Coins.\n\ -But you have to hurry!\n\ -The coins will disappear\n\ -if you're not quick to\n\ -collect them! Too bad.")) - -DEFINE_DIALOG(DIALOG_079, 1, 4, 30, 200, _("\ -Owwwuu! Let me go!\n\ -Uukee-kee! I was only\n\ -teasing! Can't you take\n\ -a joke?\n\ -I'll tell you what, let's\n\ -trade. If you let me go,\n\ -I'll give you something\n\ -really good.\n\ -So, how about it?\n\ -\n\ -//Free him/ Hold on")) - -DEFINE_DIALOG(DIALOG_080, 1, 1, 30, 200, _("\ -Eeeh hee hee hee!")) - -DEFINE_DIALOG(DIALOG_081, 1, 4, 30, 200, _("\ -The mystery is of Wet\n\ -or Dry.\n\ -And where does the\n\ -solution lie?\n\ -The city welcomes visitors\n\ -with the depth they bring\n\ -as they enter.")) - -DEFINE_DIALOG(DIALOG_082, 1, 4, 30, 200, _("\ -Hold on to your hat! If\n\ -you lose it, you'll be\n\ -injured easily.\n\ -\n\ -If you do lose your Cap,\n\ -you'll have to find it in\n\ -the course where you\n\ -lost it.\n\ -Oh, boy, it's not looking\n\ -good for Peach. She's\n\ -still trapped somewhere\n\ -inside the walls.\n\ -Please, Mario, you have\n\ -to help her! Did you know\n\ -that there are enemy\n\ -worlds inside the walls?\n\ -Yup. It's true. Bowser's\n\ -troops are there, too.\n\ -Oh, here, take this. I've\n\ -been keeping it for you.")) - -DEFINE_DIALOG(DIALOG_083, 1, 6, 30, 200, _("\ -There's something strange\n\ -about that clock. As you\n\ -jump inside, watch the\n\ -position of the big hand.\n\ -Oh, look what I found!\n\ -Here, Mario, catch!")) - -DEFINE_DIALOG(DIALOG_084, 1, 3, 30, 200, _("\ -Yeeoww! Unhand me,\n\ -brute! I'm late, so late,\n\ -I must make haste!\n\ -This shiny thing? Mine!\n\ -It's mine. Finders,\n\ -keepers, losers...\n\ -Late, late, late...\n\ -Ouch! Take it then! A\n\ -gift from Bowser, it was.\n\ -Now let me be! I have a\n\ -date! I cannot be late\n\ -for tea!")) - -DEFINE_DIALOG(DIALOG_085, 1, 5, 30, 200, _("\ -You don't stand a ghost\n\ -of a chance in this house.\n\ -If you walk out of here,\n\ -you deserve...\n\ -...a Ghoul Medal...")) - -DEFINE_DIALOG(DIALOG_086, 1, 3, 30, 200, _("\ -Running around in circles\n\ -makes some bad guys roll\n\ -their eyes.")) - -DEFINE_DIALOG(DIALOG_087, 1, 4, 30, 200, _("\ -Santa Claus isn't the only\n\ -one who can go down a\n\ -chimney! Come on in!\n\ -/--Cabin Proprietor")) - -DEFINE_DIALOG(DIALOG_088, 1, 5, 30, 200, _("\ -Work Elevator\n\ -For those who get off\n\ -here: Grab the pole to the\n\ -left and slide carefully\n\ -down.")) - -DEFINE_DIALOG(DIALOG_089, 1, 5, 95, 200, _("\ -Both ways fraught with\n\ -danger! Watch your feet!\n\ -Those who can't do the\n\ -Long Jump, tsk, tsk. Make\n\ -your way to the right.\n\ -Right: Work Elevator\n\ -/// Cloudy Maze\n\ -Left: Black Hole\n\ -///Underground Lake\n\ -\n\ -Red Circle: Elevator 2\n\ -//// Underground Lake\n\ -Arrow: You are here")) - -DEFINE_DIALOG(DIALOG_090, 1, 6, 30, 200, _("\ -Bwa ha ha ha!\n\ -You've stepped right into\n\ -my trap, just as I knew\n\ -you would! I warn you,\n\ -『Friend,』 watch your\n\ -step!")) - -DEFINE_DIALOG(DIALOG_091, 2, 2, 30, 200, _("\ -Danger!\n\ -Strong Gusts!\n\ -But the wind makes a\n\ -comfy ride.")) - -DEFINE_DIALOG(DIALOG_092, 1, 5, 30, 200, _("\ -Pestering me again, are\n\ -you, Mario? Can't you see\n\ -that I'm having a merry\n\ -little time, making\n\ -mischief with my minions?\n\ -Now, return those Stars!\n\ -My troops in the walls\n\ -need them! Bwa ha ha!")) - -DEFINE_DIALOG(DIALOG_093, 1, 5, 30, 200, _("\ -Mario! You again! Well\n\ -that's just fine--I've\n\ -been looking for something\n\ -to fry with my fire\n\ -breath!\n\ -Your Star Power is\n\ -useless against me!\n\ -Your friends are all\n\ -trapped within the\n\ -walls...\n\ -And you'll never see the\n\ -Princess again!\n\ -Bwa ha ha ha!")) - -DEFINE_DIALOG(DIALOG_094, 1, 4, 30, 200, _("\ -Get a good run up the\n\ -slope! Do you remember\n\ -the Long Jump? Run, press\n\ -[Z], then jump!")) - -DEFINE_DIALOG(DIALOG_095, 1, 4, 30, 200, _("\ -To read a sign, stand in\n\ -front of it and press [B],\n\ -like you did just now.\n\ -\n\ -When you want to talk to\n\ -a Koopa Troopa or other\n\ -animal, stand right in\n\ -front of it.\n\ -Please recover the Stars\n\ -that were stolen by\n\ -Bowser in this course.")) - -DEFINE_DIALOG(DIALOG_096, 1, 4, 30, 200, _("\ -The path is narrow here.\n\ -Easy does it! No one is\n\ -allowed on top of the\n\ -mountain!\n\ -And if you know what's\n\ -good for you, you won't\n\ -wake anyone who's\n\ -sleeping!\n\ -Move slowly,\n\ -tread lightly.")) - -DEFINE_DIALOG(DIALOG_097, 1, 5, 30, 200, _("\ -Don't be a pushover!\n\ -If anyone tries to shove\n\ -you around, push back!\n\ -It's one-on-one, with a\n\ -fiery finish for the loser!")) - -DEFINE_DIALOG(DIALOG_098, 1, 2, 95, 200, _("\ -Come on in here...\n\ -...heh, heh, heh...")) - -// unused -DEFINE_DIALOG(DIALOG_099, 1, 5, 95, 200, _("\ -Eh he he...\n\ -You're mine, now, hee hee!\n\ -I'll pass right through\n\ -this wall. Can you do\n\ -that? Heh, heh, heh!")) - -DEFINE_DIALOG(DIALOG_100, 1, 3, 95, 200, _("\ -Ukkiki...Wakkiki...kee kee!\n\ -Ha! I snagged it!\n\ -It's mine! Heeheeheeee!")) - -DEFINE_DIALOG(DIALOG_101, 1, 3, 95, 200, _("\ -Ackk! Let...go...\n\ -You're...choking...me...\n\ -Cough...I've been framed!\n\ -This Cap? Oh, all right,\n\ -take it. It's a cool Cap,\n\ -but I'll give it back.\n\ -I think it looks better on\n\ -me than it does on you,\n\ -though! Eeeee! Kee keee!")) - -DEFINE_DIALOG(DIALOG_102, 1, 5, 30, 200, _("\ -Pssst! The Boos are super\n\ -shy. If you look them\n\ -in the eyes, they fade\n\ -away, but if you turn\n\ -your back, they reappear.\n\ -It's no use trying to hit\n\ -them when they're fading\n\ -away. Instead, sneak up\n\ -behind them and punch.")) - -DEFINE_DIALOG(DIALOG_103, 1, 4, 95, 200, _("\ -Upon four towers\n\ -one must alight...\n\ -Then at the peak\n\ -shall shine the light...")) - -DEFINE_DIALOG(DIALOG_104, 1, 5, 30, 200, _("\ -The shadowy star in front\n\ -of you is a 『Star\n\ -Marker.』 When you collect\n\ -all 8 Red Coins, the Star\n\ -will appear here.")) - -DEFINE_DIALOG(DIALOG_105, 1, 3, 95, 200, _("\ -Ready for blastoff! Come\n\ -on, hop into the cannon!\n\ -\n\ -You can reach the Star on\n\ -the floating island by\n\ -using the four cannons.\n\ -Use the Control Stick to\n\ -aim, then press [A] to fire.\n\ -\n\ -If you're handy, you can\n\ -grab on to trees or poles\n\ -to land.")) - -DEFINE_DIALOG(DIALOG_106, 1, 2, 95, 200, _("\ -Ready for blastoff! Come\n\ -on, hop into the cannon!")) - -DEFINE_DIALOG(DIALOG_107, 1, 3, 95, 200, _("\ -Ghosts...\n\ -...don't...\n\ -...DIE!\n\ -Heh, heh, heh!\n\ -Can you get out of here...\n\ -...alive?")) - -DEFINE_DIALOG(DIALOG_108, 1, 2, 95, 200, _("\ -Boooooo-m! Here comes\n\ -the master of mischief,\n\ -the tower of terror,\n\ -the Big Boo!\n\ -Ka ha ha ha...")) - -DEFINE_DIALOG(DIALOG_109, 1, 4, 95, 200, _("\ -Ooooo Nooooo!\n\ -Talk about out-of-body\n\ -experiences--my body\n\ -has melted away!\n\ -Have you run in to any\n\ -headhunters lately??\n\ -I could sure use a new\n\ -body!\n\ -Brrr! My face might\n\ -freeze like this!")) - -DEFINE_DIALOG(DIALOG_110, 1, 5, 95, 200, _("\ -I need a good head on my\n\ -shoulders. Do you know of\n\ -anybody in need of a good\n\ -body? Please! I'll follow\n\ -you if you do!")) - -DEFINE_DIALOG(DIALOG_111, 1, 4, 95, 200, _("\ -Perfect! What a great\n\ -new body! Here--this is a\n\ -present for you. It's sure\n\ -to warm you up.")) - -DEFINE_DIALOG(DIALOG_112, 1, 4, 30, 200, _("\ -Collect as many coins as\n\ -possible! They'll refill\n\ -your Power Meter.\n\ -\n\ -You can check to see how\n\ -many coins you've\n\ -collected in each of the\n\ -15 enemy worlds.\n\ -You can also recover\n\ -power by touching the\n\ -Spinning Heart.\n\ -\n\ -The faster you run\n\ -through the heart, the\n\ -more power you'll recover.")) - -DEFINE_DIALOG(DIALOG_113, 1, 6, 30, 200, _("\ -There are special Caps in\n\ -the red, green and blue\n\ -blocks. Step on the\n\ -switches in the hidden\n\ -courses to activate the\n\ -Cap Blocks.")) - -DEFINE_DIALOG(DIALOG_114, 1, 5, 95, 200, _("\ -It makes me so mad! We\n\ -build your houses, your\n\ -castles. We pave your\n\ -roads, and still you\n\ -walk all over us.\n\ -Do you ever say thank\n\ -you? No! Well, you're not\n\ -going to wipe your feet\n\ -on me! I think I'll crush\n\ -you just for fun!\n\ -Do you have a problem\n\ -with that? Just try to\n\ -pound me, wimp! Ha!")) - -DEFINE_DIALOG(DIALOG_115, 1, 5, 95, 200, _("\ -No! Crushed again!\n\ -I'm just a stepping stone,\n\ -after all. I won't gravel,\n\ -er, grovel. Here, you win.\n\ -Take this with you!")) - -DEFINE_DIALOG(DIALOG_116, 1, 5, 95, 200, _("\ -Whaaa....Whaaat?\n\ -Can it be that a\n\ -pipsqueak like you has\n\ -defused the Bob-omb\n\ -king????\n\ -You might be fast enough\n\ -to ground me, but you'll\n\ -have to pick up the pace\n\ -if you want to take King\n\ -Bowser by the tail.\n\ -Methinks my troops could\n\ -learn a lesson from you!\n\ -Here is your Star, as I\n\ -promised, Mario.\n\ -\n\ -If you want to see me\n\ -again, select this Star\n\ -from the menu. For now,\n\ -farewell.")) - -DEFINE_DIALOG(DIALOG_117, 1, 1, 95, 200, _("\ -Who...walk...here?\n\ -Who...break...seal?\n\ -Wake..ancient..ones?\n\ -We no like light...\n\ -Rrrrummbbble...\n\ -We no like...intruders!\n\ -Now battle...\n\ -...hand...\n\ -...to...\n\ -...hand!")) - -DEFINE_DIALOG(DIALOG_118, 1, 6, 95, 200, _("\ -Grrrrumbbble!\n\ -What...happen?\n\ -We...crushed like pebble.\n\ -You so strong!\n\ -You rule ancient pyramid!\n\ -For today...\n\ -Now, take Star of Power.\n\ -We...sleep...darkness.")) - -DEFINE_DIALOG(DIALOG_119, 1, 6, 30, 200, _("\ -Grrr! I was a bit\n\ -careless. This is not as I\n\ -had planned...but I still\n\ -hold the power of the\n\ -Stars, and I still have\n\ -Peach.\n\ -Bwa ha ha! You'll get no\n\ -more Stars from me! I'm\n\ -not finished with you yet,\n\ -but I'll let you go for\n\ -now. You'll pay for this...\n\ -later!")) - -DEFINE_DIALOG(DIALOG_120, 1, 4, 30, 200, _("\ -Ooowaah! Can it be that\n\ -I've lost??? The power of\n\ -the Stars has failed me...\n\ -this time.\n\ -Consider this a draw.\n\ -Next time, I'll be in\n\ -perfect condition.\n\ -\n\ -Now, if you want to see\n\ -your precious Princess,\n\ -come to the top of the\n\ -tower.\n\ -I'll be waiting!\n\ -Gwa ha ha ha!")) - -DEFINE_DIALOG(DIALOG_121, 1, 5, 30, 200, _("\ -Nooo! It can't be!\n\ -You've really beaten me,\n\ -Mario?!! I gave those\n\ -troops power, but now\n\ -it's fading away!\n\ -Arrgghh! I can see peace\n\ -returning to the world! I\n\ -can't stand it! Hmmm...\n\ -It's not over yet...\n\ -\n\ -C'mon troops! Let's watch\n\ -the ending together!\n\ -Bwa ha ha!")) - -DEFINE_DIALOG(DIALOG_122, 1, 4, 30, 200, _("\ -The Black Hole\n\ -Right: Work Elevator\n\ -/// Cloudy Maze\n\ -Left: Underground Lake")) - -DEFINE_DIALOG(DIALOG_123, 1, 4, 30, 200, _("\ -Metal Cavern\n\ -Right: To Waterfall\n\ -Left: Metal Cap Switch")) - -DEFINE_DIALOG(DIALOG_124, 1, 4, 30, 200, _("\ -Work Elevator\n\ -Danger!!\n\ -Read instructions\n\ -thoroughly!\n\ -Elevator continues in the\n\ -direction of the arrow\n\ -activated.")) - -DEFINE_DIALOG(DIALOG_125, 1, 3, 30, 200, _("\ -Hazy Maze-Exit\n\ -Danger! Closed.\n\ -Turn back now.")) - -DEFINE_DIALOG(DIALOG_126, 2, 3, 30, 200, _("\ -Up: Black Hole\n\ -Right: Work Elevator\n\ -/// Hazy Maze")) - -DEFINE_DIALOG(DIALOG_127, 3, 4, 30, 200, _("\ -Underground Lake\n\ -Right: Metal Cave\n\ -Left: Abandoned Mine\n\ -///(Closed)\n\ -A gentle sea dragon lives\n\ -here. Pound on his back to\n\ -make him lower his head.\n\ -Don't become his lunch.")) - -DEFINE_DIALOG(DIALOG_128, 1, 4, 95, 200, _("\ -You must fight with\n\ -honor! It is against the\n\ -royal rules to throw the\n\ -king out of the ring!")) - -DEFINE_DIALOG(DIALOG_129, 1, 5, 30, 200, _("\ -Welcome to the Vanish\n\ -Cap Switch Course! All of\n\ -the blue blocks you find\n\ -will become solid once you\n\ -step on the Cap Switch.\n\ -You'll disappear when you\n\ -put on the Vanish Cap, so\n\ -you'll be able to elude\n\ -enemies and walk through\n\ -many things. Try it out!")) - -DEFINE_DIALOG(DIALOG_130, 1, 5, 30, 200, _("\ -Welcome to the Metal Cap\n\ -Switch Course! Once you\n\ -step on the Cap Switch,\n\ -the green blocks will\n\ -become solid.\n\ -When you turn your body\n\ -into metal with the Metal\n\ -Cap, you can walk\n\ -underwater! Try it!")) - -DEFINE_DIALOG(DIALOG_131, 1, 5, 30, 200, _("\ -Welcome to the Wing Cap\n\ -Course! Step on the red\n\ -switch at the top of the\n\ -tower, in the center of\n\ -the rainbow ring.\n\ -When you trigger the\n\ -switch, all of the red\n\ -blocks you find will\n\ -become solid.\n\ -\n\ -Try out the Wing Cap! Do\n\ -the Triple Jump to take\n\ -off and press [Z] to land.\n\ -\n\ -\n\ -Pull back on the Control\n\ -Stick to go up and push\n\ -forward to nose down,\n\ -just as you would when\n\ -flying an airplane.")) - -DEFINE_DIALOG(DIALOG_132, 1, 4, 30, 200, _("\ -Whoa, Mario, pal, you\n\ -aren't trying to cheat,\n\ -are you? Shortcuts aren't\n\ -allowed.\n\ -Now, I know that you\n\ -know better. You're\n\ -disqualified! Next time,\n\ -play fair!")) - -DEFINE_DIALOG(DIALOG_133, 1, 6, 30, 200, _("\ -Am I glad to see you! The\n\ -Princess...and I...and,\n\ -well, everybody...we're all\n\ -trapped inside the castle\n\ -walls.\n\ -\n\ -Bowser has stolen the\n\ -castle's Stars, and he's\n\ -using their power to\n\ -create his own world in\n\ -the paintings and walls.\n\ -\n\ -Please recover the Power\n\ -Stars! As you find them,\n\ -you can use their power\n\ -to open the doors that\n\ -Bowser has sealed.\n\ -\n\ -There are four rooms on\n\ -the first floor. Start in\n\ -the one with the painting\n\ -of Bob-omb inside. It's\n\ -the only room that Bowser\n\ -hasn't sealed.\n\ -When you collect eight\n\ -Power Stars, you'll be\n\ -able to open the door\n\ -with the big star. The\n\ -Princess must be inside!")) - -DEFINE_DIALOG(DIALOG_134, 1, 5, 30, 200, _("\ -The names of the Stars\n\ -are also hints for\n\ -finding them. They are\n\ -displayed at the beginning\n\ -of each course.\n\ -You can collect the Stars\n\ -in any order. You won't\n\ -find some Stars, enemies\n\ -or items unless you select\n\ -a specific Star.\n\ -After you collect some\n\ -Stars, you can try\n\ -another course.\n\ -We're all waiting for\n\ -your help!")) - -DEFINE_DIALOG(DIALOG_135, 1, 5, 30, 200, _("\ -It was Bowser who stole\n\ -the Stars. I saw him with\n\ -my own eyes!\n\ -\n\ -\n\ -He's hidden six Stars in\n\ -each course, but you\n\ -won't find all of them in\n\ -some courses until you\n\ -press the Cap Switches.\n\ -The Stars you've found\n\ -will show on each course's\n\ -starting screen.\n\ -\n\ -\n\ -If you want to see some\n\ -of the enemies you've\n\ -already defeated, select\n\ -the Stars you recovered\n\ -from them.")) - -DEFINE_DIALOG(DIALOG_136, 1, 6, 30, 200, _("\ -Wow! You've already\n\ -recovered that many\n\ -Stars? Way to go, Mario!\n\ -I'll bet you'll have us out\n\ -of here in no time!\n\ -\n\ -Be careful, though.\n\ -Bowser and his band\n\ -wrote the book on 『bad.』\n\ -Take my advice: When you\n\ -need to recover from\n\ -injuries, collect coins.\n\ -Yellow Coins refill one\n\ -piece of the Power Meter,\n\ -Red Coins refill two\n\ -pieces, and Blue Coins\n\ -refill five.\n\ -\n\ -To make Blue Coins\n\ -appear, pound on Blue\n\ -Coin Blocks.\n\ -\n\ -\n\ -\n\ -Also, if you fall from\n\ -high places, you'll\n\ -minimize damage if you\n\ -Pound the Ground as you\n\ -land.")) - -DEFINE_DIALOG(DIALOG_137, 1, 6, 30, 200, _("\ -Thanks, Mario! The castle\n\ -is recovering its energy\n\ -as you retrieve Power\n\ -Stars, and you've chased\n\ -Bowser right out of here,\n\ -on to some area ahead.\n\ -Oh, by the by, are you\n\ -collecting coins? Special\n\ -Stars appear when you\n\ -collect 100 coins in each\n\ -of the 15 courses!")) - -DEFINE_DIALOG(DIALOG_138, 1, 3, 30, 200, _("\ -Down: Underground Lake\n\ -Left: Black Hole\n\ -Right: Hazy Maze (Closed)")) - -DEFINE_DIALOG(DIALOG_139, 1, 6, 30, 200, _("\ -Above: Automatic Elevator\n\ -Elevator begins\n\ -automatically and follows\n\ -pre-set course.\n\ -It disappears\n\ -automatically, too.")) - -DEFINE_DIALOG(DIALOG_140, 1, 6, 30, 200, _("\ -Elevator Area\n\ -Right: Hazy Maze\n\ -/// Entrance\n\ -Left: Black Hole\n\ -///Elevator 1\n\ -Arrow: You are here")) - -DEFINE_DIALOG(DIALOG_141, 1, 5, 150, 200, _("\ -You've recovered one of\n\ -the stolen Power Stars!\n\ -Now you can open some of\n\ -the sealed doors in the\n\ -castle.\n\ -Try the Princess's room\n\ -on the second floor and\n\ -the room with the\n\ -painting of Whomp's\n\ -Fortress on Floor 1.\n\ -Bowser's troops are still\n\ -gaining power, so you\n\ -can't give up. Save us,\n\ -Mario! Keep searching for\n\ -Stars!")) - -DEFINE_DIALOG(DIALOG_142, 1, 5, 150, 200, _("\ -You've recovered three\n\ -Power Stars! Now you can\n\ -open any door with a 3\n\ -on its star.\n\ -\n\ -You can come and go from\n\ -the open courses as you\n\ -please. The enemies ahead\n\ -are even meaner, so be\n\ -careful!")) - -DEFINE_DIALOG(DIALOG_143, 1, 6, 150, 200, _("\ -You've recovered eight of\n\ -the Power Stars! Now you\n\ -can open the door with\n\ -the big Star! But Bowser\n\ -is just ahead...can you\n\ -hear the Princess calling?")) - -DEFINE_DIALOG(DIALOG_144, 1, 6, 150, 200, _("\ -You've recovered 30\n\ -Power Stars! Now you can\n\ -open the door with the\n\ -big Star! But before you\n\ -move on, how's it going\n\ -otherwise?\n\ -Did you pound the two\n\ -columns down? You didn't\n\ -lose your hat, did you?\n\ -If you did, you'll have to\n\ -stomp on the condor to\n\ -get it back!\n\ -They say that Bowser has\n\ -sneaked out of the sea\n\ -and into the underground.\n\ -Have you finally\n\ -cornered him?")) - -DEFINE_DIALOG(DIALOG_145, 1, 6, 150, 200, _("\ -You've recovered 50\n\ -Power Stars! Now you can\n\ -open the Star Door on the\n\ -third floor. Bowser's\n\ -there, you know.\n\ -\n\ -Oh! You've found all of\n\ -the Cap Switches, haven't\n\ -you? Red, green and blue?\n\ -The Caps you get from the\n\ -colored blocks are really\n\ -helpful.\n\ -Hurry along, now. The\n\ -third floor is just ahead.")) - -DEFINE_DIALOG(DIALOG_146, 1, 6, 150, 200, _("\ -You've found 70 Power\n\ -Stars! The mystery of the\n\ -endless stairs is solved,\n\ -thanks to you--and is\n\ -Bowser ever upset! Now,\n\ -on to the final bout!")) - -DEFINE_DIALOG(DIALOG_147, 1, 5, 30, 200, _("\ -Are you using the Cap\n\ -Blocks? You really should,\n\ -you know.\n\ -\n\ -\n\ -To make them solid so you\n\ -can break them, you have\n\ -to press the colored Cap\n\ -Switches in the castle's\n\ -hidden courses.\n\ -You'll find the hidden\n\ -courses only after\n\ -regaining some of the\n\ -Power Stars.\n\ -\n\ -The Cap Blocks are a big\n\ -help! Red for the Wing\n\ -Cap, green for the Metal\n\ -Cap, blue for the Vanish\n\ -Cap.")) - -DEFINE_DIALOG(DIALOG_148, 1, 6, 30, 200, _("\ -Snowman Mountain ahead.\n\ -Keep out! And don't try\n\ -the Triple Jump over the\n\ -ice block shooter.\n\ -\n\ -\n\ -If you fall into the\n\ -freezing pond, your power\n\ -decreases quickly, and\n\ -you won't recover\n\ -automatically.\n\ -//--The Snowman")) - -DEFINE_DIALOG(DIALOG_149, 1, 3, 30, 200, _("\ -Welcome to\n\ -Princess Toadstool's\n\ -secret slide!\n\ -There's a Star hidden\n\ -here that Bowser couldn't\n\ -find.\n\ -When you slide, press\n\ -forward to speed up,\n\ -pull back to slow down.\n\ -If you slide really\n\ -fast, you'll win the Star!")) - -DEFINE_DIALOG(DIALOG_150, 1, 5, 30, 200, _("\ -Waaaa! You've flooded my\n\ -house! Wh-why?? Look at\n\ -this mess! What am I\n\ -going to do now?\n\ -\n\ -The ceiling's ruined, the\n\ -floor is soaked...what to\n\ -do, what to do? Huff...\n\ -huff...it makes me so...\n\ -MAD!!!\n\ -Everything's been going\n\ -wrong ever since I got\n\ -this Star...It's so shiny,\n\ -but it makes me feel...\n\ -strange...")) - -DEFINE_DIALOG(DIALOG_151, 1, 4, 30, 200, _("\ -I can't take this\n\ -anymore! First you get\n\ -me all wet, then you\n\ -stomp on me!\n\ -Now I'm really, really,\n\ -REALLY mad!\n\ -Waaaaaaaaaaaaaaaaa!!!")) - -DEFINE_DIALOG(DIALOG_152, 1, 3, 30, 200, _("\ -Owwch! Uncle! Uncle!\n\ -Okay, I " GIVE_UP ". Take this\n\ -Star!\n\ -Whew! I feel better now.\n\ -I don't really need it\n\ -anymore, anyway--\n\ -I can see the stars\n\ -through my ceiling at\n\ -night.\n\ -They make me feel...\n\ -...peaceful. Please, come\n\ -back and visit anytime.")) - -DEFINE_DIALOG(DIALOG_153, 1, 4, 30, 200, _("\ -Hey! Who's there?\n\ -What's climbing on me?\n\ -Is it an ice ant?\n\ -A snow flea?\n\ -Whatever it is, it's\n\ -bugging me! I think I'll\n\ -blow it away!")) - -DEFINE_DIALOG(DIALOG_154, 1, 5, 30, 200, _("\ -Hold on to your hat! If\n\ -you lose it, you'll be\n\ -easily injured. If you\n\ -lose it, look for it in the\n\ -course where you lost it.\n\ -Speaking of lost, the\n\ -Princess is still stuck in\n\ -the walls somewhere.\n\ -Please help, Mario!\n\ -\n\ -Oh, you know that there\n\ -are secret worlds in the\n\ -walls as well as in the\n\ -paintings, right?")) - -DEFINE_DIALOG(DIALOG_155, 1, 6, 30, 200, _("\ -Thanks to the power of\n\ -the Stars, life is\n\ -returning to the castle.\n\ -Please, Mario, you have\n\ -to give Bowser the boot!\n\ -\n\ -Here, let me tell you a\n\ -little something about the\n\ -castle. In the room with\n\ -the mirrors, look carefully\n\ -for anything that's not\n\ -reflected in the mirror.\n\ -And when you go to the\n\ -water town, you can flood\n\ -it with a high jump into\n\ -the painting.")) - -DEFINE_DIALOG(DIALOG_156, 1, 5, 30, 200, _("\ -The world inside the\n\ -clock is so strange!\n\ -When you jump inside,\n\ -watch the position of\n\ -the big hand!")) - -DEFINE_DIALOG(DIALOG_157, 1, 5, 30, 200, _("\ -Watch out! Don't let\n\ -yourself be swallowed by\n\ -quicksand.\n\ -\n\ -\n\ -If you sink into the sand,\n\ -you won't be able to\n\ -jump, and if your head\n\ -goes under, you'll be\n\ -smothered.\n\ -The dark areas are\n\ -bottomless pits.")) - -DEFINE_DIALOG(DIALOG_158, 1, 6, 30, 200, _("\ -1. If you jump repeatedly\n\ -and time it right, you'll\n\ -jump higher and higher.\n\ -If you run really fast and\n\ -time three jumps right,\n\ -you can do a Triple Jump.\n\ -2. Jump into a solid wall,\n\ -then jump again when you\n\ -hit the wall. You can\n\ -bounce to a higher level\n\ -using this Wall Kick.")) - -DEFINE_DIALOG(DIALOG_159, 1, 6, 30, 200, _("\ -3. If you stop, press [Z]\n\ -to crouch, then jump, you\n\ -can perform a Backward\n\ -Somersault. To do a Long\n\ -Jump, run fast, press [Z],\n\ -then jump.")) - -DEFINE_DIALOG(DIALOG_160, 1, 4, 30, 200, _("\ -Press [B] while running\n\ -fast to do a Body Slide\n\ -attack. To stand while\n\ -sliding, press [A] or [B].")) - -#ifdef VERSION_EU -#define KEEP_ON_PLAYING ".." -#else -#define KEEP_ON_PLAYING "\n\ -We want you to keep on\n\ -playing, so we have a\n\ -little something for you.\n\ -We hope that you like it!\n\ -Enjoy!!!" -#endif - -DEFINE_DIALOG(DIALOG_161, 1, 4, 30, 200, _("\ -Mario!!!\n\ -It that really you???\n\ -It has been so long since\n\ -our last adventure!\n\ -They told me that I might\n\ -see you if I waited here,\n\ -but I'd just about given\n\ -up hope!\n\ -Is it true? Have you\n\ -really beaten Bowser? And\n\ -restored the Stars to the\n\ -castle?\n\ -And saved the Princess?\n\ -I knew you could do it!\n\ -Now I have a very special\n\ -message for you.\n\ -『Thanks for playing Super\n\ -Mario 64! This is the\n\ -end of the game, but not\n\ -the end of the fun." \ -KEEP_ON_PLAYING "』\n\ -\n\ -The Super Mario 64 Team")) - -DEFINE_DIALOG(DIALOG_162, 1, 4, 30, 200, _("\ -No, no, no! Not you\n\ -again! I'm in a great\n\ -hurry, can't you see?\n\ -\n\ -I've no time to squabble\n\ -over Stars. Here, have it.\n\ -I never meant to hide it\n\ -from you...\n\ -It's just that I'm in such\n\ -a rush. That's it, that's\n\ -all. Now, I must be off.\n\ -Owww! Let me go!")) - -DEFINE_DIALOG(DIALOG_163, 1, 5, 30, 200, _("\ -Noooo! You've really\n\ -beaten me this time,\n\ -Mario! I can't stand\n\ -losing to you!\n\ -\n\ -My troops...worthless!\n\ -They've turned over all\n\ -the Power Stars! What?!\n\ -There are 120 in all???\n\ -\n\ -Amazing! There were some\n\ -in the castle that I\n\ -missed??!!\n\ -\n\ -\n\ -Now I see peace\n\ -returning to the world...\n\ -Oooo! I really hate that!\n\ -I can't watch--\n\ -I'm outta here!\n\ -Just you wait until next\n\ -time. Until then, keep\n\ -that Control Stick\n\ -smokin'!\n\ -Buwaa ha ha!")) - -DEFINE_DIALOG(DIALOG_164, 1, 4, 30, 200, _("\ -Mario! What's up, pal?\n\ -I haven't been on the\n\ -slide lately, so I'm out\n\ -of shape.\n\ -Still, I'm always up for a\n\ -good race, especially\n\ -against an old sleddin'\n\ -buddy.\n\ -Whaddya say?\n\ -Ready...set...\n\ -\n\ -//Go//// Don't Go")) - -DEFINE_DIALOG(DIALOG_165, 1, 5, 30, 200, _("\ -I take no responsibility\n\ -whatsoever for those who\n\ -get dizzy and pass out\n\ -from running around\n\ -this post.")) - -DEFINE_DIALOG(DIALOG_166, 1, 4, 30, 200, _("\ -I'll be back soon.\n\ -I'm out training now,\n\ -so come back later.\n\ -//--Koopa the Quick")) - -DEFINE_DIALOG(DIALOG_167, 1, 4, 30, 200, _("\ -Princess Toadstool's\n\ -castle is just ahead.\n\ -\n\ -\n\ -Press [A] to jump, [Z] to\n\ -crouch, and [B] to punch,\n\ -read a sign, or grab\n\ -something.\n\ -Press [B] again to throw\n\ -something you're holding.")) - -DEFINE_DIALOG(DIALOG_168, 1, 5, 30, 200, _("\ -Hey! Knock it off! That's\n\ -the second time you've\n\ -nailed me. Now you're\n\ -asking for it, linguine\n\ -breath!")) - -DEFINE_DIALOG(DIALOG_169, 1, 4, 30, 200, _("\ -Keep out!\n\ -That means you!\n\ -Arrgghh!\n\ -\n\ -Anyone entering this cave\n\ -without permission will\n\ -meet certain disaster.")) diff --git a/tools/.gitignore b/tools/.gitignore deleted file mode 100644 index 7be0668f..00000000 --- a/tools/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -/aifc_decode -/aiff_extract_codebook -/armips -/extract_data_for_mio -/mio0 -/n64cksum -/n64graphics -/n64graphics_ci -/patch_elf_32bit -/skyconv -/tabledesign -/textconv -/vadpcm_enc -!/ido5.3_compiler/lib/*.so -!/ido5.3_compiler/usr/lib/*.so -!/ido5.3_compiler/usr/lib/*.so.1 -!/ido5.3_compiler/**/*.o diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt deleted file mode 100644 index 1118d31d..00000000 --- a/tools/CMakeLists.txt +++ /dev/null @@ -1,87 +0,0 @@ -cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) - -set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE) -set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") - -set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") - -project(sm64-tmp VERSION 0.1.0 LANGUAGES C CXX) - -if (MSVC) -find_path(DIRENT_INCLUDE_DIRS "dirent.h") -include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${DIRENT_INCLUDE_DIRS}) -else() -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -endif() - -if (MSVC) -set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) -set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) -set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) -foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) - string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG ) - set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_SOURCE_DIR} ) - set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_SOURCE_DIR} ) - set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_CURRENT_SOURCE_DIR} ) -endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES ) -endif() - -set(mio0_SOURCES libmio0.c) -add_executable(mio0 ${mio0_SOURCES}) -target_compile_definitions(mio0 PUBLIC MIO0_STANDALONE) - -set(n64cksum_SOURCES n64cksum.c utils.c) -add_executable(n64cksum ${n64cksum_SOURCES}) -target_compile_definitions(n64cksum PUBLIC N64CKSUM_STANDALONE) - -set(textconv_SOURCES textconv.c utf8.c hashtable.c) -add_executable(textconv ${textconv_SOURCES}) - -set(patch_elf_32bit_SOURCES patch_elf_32bit.c) -add_executable(patch_elf_32bit ${patch_elf_32bit_SOURCES}) - -set(aifc_decode_SOURCES aifc_decode.c) -add_executable(aifc_decode ${aifc_decode_SOURCES}) - -set(aiff_extract_codebook_SOURCES aiff_extract_codebook.c) -add_executable(aiff_extract_cookbook ${aiff_extract_codebook_SOURCES}) - -add_dependencies(aiff_extract_cookbook tabledesign) - -file(GLOB_RECURSE AUDIOFILE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} audiofile/*.cpp audiofile/*.h) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/audiofile) -add_library(audiofile STATIC ${AUDIOFILE_FILES}) -set_target_properties(audiofile PROPERTIES CXX_STANDARD 11) - -#tabledesign: $(LIBAUDIOFILE) -set(tabledesign_SOURCES sdk-tools/tabledesign/codebook.c sdk-tools/tabledesign/estimate.c sdk-tools/tabledesign/print.c sdk-tools/tabledesign/getopt.c sdk-tools/tabledesign/tabledesign.c) -#tabledesign_CFLAGS := -Iaudiofile -Wno-uninitialized -#tabledesign_LDFLAGS := -Laudiofile -laudiofile -lstdc++ -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/audiofile) -if (MSVC) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/audiofile/include-windows) -endif() -add_executable(tabledesign ${tabledesign_SOURCES}) -target_link_libraries(tabledesign PUBLIC audiofile) - -if(MSVC) -find_path(GETOPT_INCLUDE_DIR getopt.h) -find_library(GETOPT_LIB getopt) -set(WINLIBS ${GETOPT_LIB} ) -endif() - -set(vadpcm_enc_SOURCES sdk-tools/adpcm/vadpcm_enc.c sdk-tools/adpcm/vpredictor.c sdk-tools/adpcm/quant.c sdk-tools/adpcm/util.c sdk-tools/adpcm/vencode.c) -#vadpcm_enc_CFLAGS := -Wno-unused-result -Wno-uninitialized -Wno-sign-compare -Wno-absolute-value -add_executable(vadpcm_enc ${vadpcm_enc_SOURCES}) -target_link_libraries(vadpcm_enc PRIVATE ${WINLIBS}) -target_include_directories(vadpcm_enc PRIVATE ${GETOPT_INCLUDE_DIR}) - -set(extract_data_for_mio_SOURCES extract_data_for_mio.c) -add_executable(extract_data_for_mio ${extract_data_for_mio_SOURCES}) - -# tools required for extract_assets.py -add_custom_target(Tools - DEPENDS - aifc_decode - mio0 - ) diff --git a/tools/Makefile b/tools/Makefile deleted file mode 100644 index 92a39168..00000000 --- a/tools/Makefile +++ /dev/null @@ -1,83 +0,0 @@ -include ../util.mk - -HOST_ENV := $(shell uname 2>/dev/null || echo Unknown) -HOST_ENV := $(patsubst MINGW%,MinGW,$(HOST_ENV)) - -CC := gcc -CXX := g++ -CFLAGS := -I . -Wall -Wextra -Wno-unused-parameter -pedantic -O2 -s -LDFLAGS := -lm -ALL_PROGRAMS := armips n64graphics n64graphics_ci mio0 n64cksum textconv patch_elf_32bit aifc_decode aiff_extract_codebook vadpcm_enc tabledesign extract_data_for_mio skyconv -LIBAUDIOFILE := audiofile/libaudiofile.a - -# Only build armips from tools if it is not found on the system -ifeq ($(call find-command,armips),) - BUILD_PROGRAMS := $(ALL_PROGRAMS) -else - BUILD_PROGRAMS := $(filter-out armips,$(ALL_PROGRAMS)) -endif - -default: all - -n64graphics_SOURCES := n64graphics.c utils.c -n64graphics_CFLAGS := -DN64GRAPHICS_STANDALONE - -n64graphics_ci_SOURCES := n64graphics_ci_dir/n64graphics_ci.c n64graphics_ci_dir/exoquant/exoquant.c n64graphics_ci_dir/utils.c - -mio0_SOURCES := libmio0.c -mio0_CFLAGS := -DMIO0_STANDALONE - -n64cksum_SOURCES := n64cksum.c utils.c -n64cksum_CFLAGS := -DN64CKSUM_STANDALONE - -textconv_SOURCES := textconv.c utf8.c hashtable.c - -patch_elf_32bit_SOURCES := patch_elf_32bit.c - -aifc_decode_SOURCES := aifc_decode.c - -aiff_extract_codebook_SOURCES := aiff_extract_codebook.c - -tabledesign: $(LIBAUDIOFILE) -tabledesign_SOURCES := sdk-tools/tabledesign/codebook.c sdk-tools/tabledesign/estimate.c sdk-tools/tabledesign/print.c sdk-tools/tabledesign/tabledesign.c -tabledesign_CFLAGS := -Iaudiofile -Wno-uninitialized -tabledesign_LDFLAGS := -Laudiofile -laudiofile -lstdc++ - -vadpcm_enc_SOURCES := sdk-tools/adpcm/vadpcm_enc.c sdk-tools/adpcm/vpredictor.c sdk-tools/adpcm/quant.c sdk-tools/adpcm/util.c sdk-tools/adpcm/vencode.c -vadpcm_enc_CFLAGS := -Wno-unused-result -Wno-uninitialized -Wno-sign-compare -Wno-absolute-value - -extract_data_for_mio_SOURCES := extract_data_for_mio.c - -skyconv_SOURCES := skyconv.c n64graphics.c utils.c - -armips: CC := $(CXX) -armips_SOURCES := armips.cpp -armips_CFLAGS := -std=c++11 -fno-exceptions -fno-rtti -pipe -armips_LDFLAGS := -pthread -ifeq ($(HOST_ENV),MinGW) - armips_LDFLAGS += -municode -endif - -all-except-recomp: $(LIBAUDIOFILE) $(BUILD_PROGRAMS) - -all: all-except-recomp ido5.3_recomp - -clean: - $(RM) $(ALL_PROGRAMS) - $(MAKE) -C audiofile clean - $(MAKE) -C ido5.3_recomp clean - -define COMPILE -$(1): $($1_SOURCES) - $$(CC) $(CFLAGS) $($1_CFLAGS) $$^ -o $$@ $($1_LDFLAGS) $(LDFLAGS) -endef - -ido5.3_recomp: - $(MAKE) -C ido5.3_recomp - -$(foreach p,$(BUILD_PROGRAMS),$(eval $(call COMPILE,$(p)))) - -$(LIBAUDIOFILE): - @$(MAKE) -C audiofile - -.PHONY: all all-except-recomp clean default ido5.3_recomp diff --git a/tools/aifc_decode.c b/tools/aifc_decode.c deleted file mode 100644 index e34841d4..00000000 --- a/tools/aifc_decode.c +++ /dev/null @@ -1,681 +0,0 @@ -/** - * Bruteforcing decoder for converting ADPCM-encoded AIFC into AIFF, in a way - * that roundtrips with vadpcm_enc. - */ -#ifndef WIN32 -#include -#endif -#include -#include -#include -#include -#include -#include - -typedef signed char s8; -typedef short s16; -typedef int s32; -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long long u64; -typedef float f32; - -#ifdef _MSC_VER -#define __builtin_bswap16 _byteswap_ushort -#define __builtin_bswap32 _byteswap_ulong -#endif - -#define bswap16(x) __builtin_bswap16(x) -#define bswap32(x) __builtin_bswap32(x) -#define BSWAP16(x) x = __builtin_bswap16(x) -#define BSWAP32(x) x = __builtin_bswap32(x) -#define BSWAP16_MANY(x, n) for (s32 _i = 0; _i < n; _i++) BSWAP16((x)[_i]) - -#ifndef WIN32 -#define NORETURN __attribute__((noreturn)) -#define UNUSED __attribute__((unused)) -#else -#define NORETURN -#define UNUSED -#endif - -typedef struct { - u32 ckID; - u32 ckSize; -} ChunkHeader; - -typedef struct { - u32 ckID; - u32 ckSize; - u32 formType; -} Chunk; - -typedef struct { - s16 numChannels; - u16 numFramesH; - u16 numFramesL; - s16 sampleSize; - s16 sampleRate[5]; // 80-bit float - u16 compressionTypeH; - u16 compressionTypeL; -} CommonChunk; - -typedef struct { - s16 MarkerID; - u16 positionH; - u16 positionL; -} Marker; - -typedef struct { - s16 playMode; - s16 beginLoop; - s16 endLoop; -} Loop; - -typedef struct { - s8 baseNote; - s8 detune; - s8 lowNote; - s8 highNote; - s8 lowVelocity; - s8 highVelocity; - s16 gain; - Loop sustainLoop; - Loop releaseLoop; -} InstrumentChunk; - -typedef struct { - s32 offset; - s32 blockSize; -} SoundDataChunk; - -typedef struct { - s16 version; - s16 order; - s16 nEntries; -} CodeChunk; - -typedef struct -{ - u32 start; - u32 end; - u32 count; - s16 state[16]; -} ALADPCMloop; - - -static char usage[] = "input.aifc output.aiff"; -static const char *progname, *infilename; - -#define checked_fread(a, b, c, d) if (fread(a, b, c, d) != c) fail_parse("error parsing file") - -NORETURN -void fail_parse(const char *fmt, ...) -{ - char *formatted = NULL; - va_list ap; - va_start(ap, fmt); - int size = vsnprintf(NULL, 0, fmt, ap); - va_end(ap); - if (size >= 0) { - size++; - formatted = malloc(size); - if (formatted != NULL) { - va_start(ap, fmt); - size = vsnprintf(formatted, size, fmt, ap); - va_end(ap); - if (size < 0) { - free(formatted); - formatted = NULL; - } - } - } - - if (formatted != NULL) { - fprintf(stderr, "%s: %s [%s]\n", progname, formatted, infilename); - free(formatted); - } - exit(1); -} - -s32 myrand() -{ - static u64 state = 1619236481962341ULL; - state *= 3123692312231ULL; - state++; - return state >> 33; -} - -s16 qsample(s32 x, s32 scale) -{ - // Compute x / 2^scale rounded to the nearest integer, breaking ties towards zero. - if (scale == 0) return x; - return (x + (1 << (scale - 1)) - (x > 0)) >> scale; -} - -s16 clamp_to_s16(s32 x) -{ - if (x < -0x8000) return -0x8000; - if (x > 0x7fff) return 0x7fff; - return (s16) x; -} - -s32 toi4(s32 x) -{ - if (x >= 8) return x - 16; - return x; -} - -s32 readaifccodebook(FILE *fhandle, s32 ****table, s16 *order, s16 *npredictors) -{ - checked_fread(order, sizeof(s16), 1, fhandle); - BSWAP16(*order); - checked_fread(npredictors, sizeof(s16), 1, fhandle); - BSWAP16(*npredictors); - *table = malloc(*npredictors * sizeof(s32 **)); - for (s32 i = 0; i < *npredictors; i++) { - (*table)[i] = malloc(8 * sizeof(s32 *)); - for (s32 j = 0; j < 8; j++) { - (*table)[i][j] = malloc((*order + 8) * sizeof(s32)); - } - } - - for (s32 i = 0; i < *npredictors; i++) { - s32 **table_entry = (*table)[i]; - for (s32 j = 0; j < *order; j++) { - for (s32 k = 0; k < 8; k++) { - s16 ts; - checked_fread(&ts, sizeof(s16), 1, fhandle); - BSWAP16(ts); - table_entry[k][j] = ts; - } - } - - for (s32 k = 1; k < 8; k++) { - table_entry[k][*order] = table_entry[k - 1][*order - 1]; - } - - table_entry[0][*order] = 1 << 11; - - for (s32 k = 1; k < 8; k++) { - s32 j = 0; - for (; j < k; j++) { - table_entry[j][k + *order] = 0; - } - - for (; j < 8; j++) { - table_entry[j][k + *order] = table_entry[j - k][*order]; - } - } - } - return 0; -} - -ALADPCMloop *readlooppoints(FILE *ifile, s16 *nloops) -{ - checked_fread(nloops, sizeof(s16), 1, ifile); - BSWAP16(*nloops); - ALADPCMloop *al = malloc(*nloops * sizeof(ALADPCMloop)); - for (s32 i = 0; i < *nloops; i++) { - checked_fread(&al[i], sizeof(ALADPCMloop), 1, ifile); - BSWAP32(al[i].start); - BSWAP32(al[i].end); - BSWAP32(al[i].count); - BSWAP16_MANY(al[i].state, 16); - } - return al; -} - -s32 inner_product(s32 length, s32 *v1, s32 *v2) -{ - s32 out = 0; - for (s32 i = 0; i < length; i++) { - out += v1[i] * v2[i]; - } - - // Compute "out / 2^11", rounded down. - s32 dout = out / (1 << 11); - s32 fiout = dout * (1 << 11); - return dout - (out - fiout < 0); -} - -void my_decodeframe(u8 *frame, s32 *state, s32 order, s32 ***coefTable) -{ - s32 ix[16]; - - u8 header = frame[0]; - s32 scale = 1 << (header >> 4); - s32 optimalp = header & 0xf; - - for (s32 i = 0; i < 16; i += 2) { - u8 c = frame[1 + i/2]; - ix[i] = c >> 4; - ix[i + 1] = c & 0xf; - } - - for (s32 i = 0; i < 16; i++) { - if (ix[i] >= 8) ix[i] -= 16; - ix[i] *= scale; - } - - for (s32 j = 0; j < 2; j++) { - s32 in_vec[16]; - if (j == 0) { - for (s32 i = 0; i < order; i++) { - in_vec[i] = state[16 - order + i]; - } - } else { - for (s32 i = 0; i < order; i++) { - in_vec[i] = state[8 - order + i]; - } - } - - for (s32 i = 0; i < 8; i++) { - s32 ind = j * 8 + i; - in_vec[order + i] = ix[ind]; - state[ind] = inner_product(order + i, coefTable[optimalp][i], in_vec) + ix[ind]; - } - } -} - -void my_encodeframe(u8 *out, s16 *inBuffer, s32 *state, s32 ***coefTable, s32 order, s32 npredictors) -{ - s16 ix[16]; - s32 prediction[16]; - s32 inVector[16]; - s32 saveState[16]; - s32 optimalp = 0; - s32 scale; - s32 ie[16]; - s32 e[16]; - f32 min = 1e30; - - for (s32 k = 0; k < npredictors; k++) { - for (s32 j = 0; j < 2; j++) { - for (s32 i = 0; i < order; i++) { - inVector[i] = (j == 0 ? state[16 - order + i] : inBuffer[8 - order + i]); - } - - for (s32 i = 0; i < 8; i++) { - prediction[j * 8 + i] = inner_product(order + i, coefTable[k][i], inVector); - e[j * 8 + i] = inVector[i + order] = inBuffer[j * 8 + i] - prediction[j * 8 + i]; - } - } - - f32 se = 0.0f; - for (s32 j = 0; j < 16; j++) { - se += (f32) e[j] * (f32) e[j]; - } - - if (se < min) { - min = se; - optimalp = k; - } - } - - for (s32 j = 0; j < 2; j++) { - for (s32 i = 0; i < order; i++) { - inVector[i] = (j == 0 ? state[16 - order + i] : inBuffer[8 - order + i]); - } - - for (s32 i = 0; i < 8; i++) { - prediction[j * 8 + i] = inner_product(order + i, coefTable[optimalp][i], inVector); - e[j * 8 + i] = inVector[i + order] = inBuffer[j * 8 + i] - prediction[j * 8 + i]; - } - } - - for (s32 i = 0; i < 16; i++) { - ie[i] = clamp_to_s16(e[i]); - } - - s32 max = 0; - for (s32 i = 0; i < 16; i++) { - if (abs(ie[i]) > abs(max)) { - max = ie[i]; - } - } - - for (scale = 0; scale <= 12; scale++) { - if (max <= 7 && max >= -8) break; - max /= 2; - } - - for (s32 i = 0; i < 16; i++) { - saveState[i] = state[i]; - } - - for (s32 nIter = 0, again = 1; nIter < 2 && again; nIter++) { - again = 0; - if (nIter == 1) scale++; - if (scale > 12) { - scale = 12; - } - - for (s32 j = 0; j < 2; j++) { - s32 base = j * 8; - for (s32 i = 0; i < order; i++) { - inVector[i] = (j == 0 ? - saveState[16 - order + i] : state[8 - order + i]); - } - - for (s32 i = 0; i < 8; i++) { - prediction[base + i] = inner_product(order + i, coefTable[optimalp][i], inVector); - s32 se = inBuffer[base + i] - prediction[base + i]; - ix[base + i] = qsample(se, scale); - s32 cV = clamp_to_s16(ix[base + i]) - ix[base + i]; - if (cV > 1 || cV < -1) again = 1; - ix[base + i] += cV; - inVector[i + order] = ix[base + i] * (1 << scale); - state[base + i] = prediction[base + i] + inVector[i + order]; - } - } - } - - u8 header = (scale << 4) | (optimalp & 0xf); - out[0] = header; - for (s32 i = 0; i < 16; i += 2) { - u8 c = ((ix[i] & 0xf) << 4) | (ix[i + 1] & 0xf); - out[1 + i/2] = c; - } -} - -void permute(s16 *out, s32 *in, s32 scale) -{ - for (s32 i = 0; i < 16; i++) { - out[i] = clamp_to_s16(in[i] - scale / 2 + myrand() % (scale + 1)); - } -} - -void write_header(FILE *ofile, const char *id, s32 size) -{ - fwrite(id, 4, 1, ofile); - BSWAP32(size); - fwrite(&size, sizeof(s32), 1, ofile); -} - -int main(int argc, char **argv) -{ - s16 order = -1; - s16 nloops = 0; - ALADPCMloop *aloops = NULL; - s16 npredictors = -1; - s32 ***coefTable = NULL; - s32 state[16]; - s32 soundPointer = -1; - s32 currPos = 0; - s32 nSamples = 0; - Chunk FormChunk; - ChunkHeader Header; - CommonChunk CommChunk; - InstrumentChunk InstChunk; - SoundDataChunk SndDChunk; - FILE *ifile; - FILE *ofile; - progname = argv[0]; - - if (argc < 3) { - fprintf(stderr, "%s %s\n", progname, usage); - exit(1); - } - - infilename = argv[1]; - - if ((ifile = fopen(infilename, "rb")) == NULL) { - fail_parse("AIFF-C file could not be opened"); - exit(1); - } - - if ((ofile = fopen(argv[2], "wb")) == NULL) { - fprintf(stderr, "%s: output file could not be opened [%s]\n", progname, argv[2]); - exit(1); - } - - memset(&InstChunk, 0, sizeof(InstChunk)); - - checked_fread(&FormChunk, sizeof(FormChunk), 1, ifile); - BSWAP32(FormChunk.ckID); - BSWAP32(FormChunk.formType); - if ((FormChunk.ckID != 0x464f524d) || (FormChunk.formType != 0x41494643)) { // FORM, AIFC - fail_parse("not an AIFF-C file"); - } - - for (;;) { - s32 num = fread(&Header, sizeof(Header), 1, ifile); - u32 ts; - if (num <= 0) break; - BSWAP32(Header.ckID); - BSWAP32(Header.ckSize); - - Header.ckSize++; - Header.ckSize &= ~1; - s32 offset = ftell(ifile); - - switch (Header.ckID) { - case 0x434f4d4d: // COMM - checked_fread(&CommChunk, sizeof(CommChunk), 1, ifile); - BSWAP16(CommChunk.numChannels); - BSWAP16(CommChunk.numFramesH); - BSWAP16(CommChunk.numFramesL); - BSWAP16(CommChunk.sampleSize); - BSWAP16(CommChunk.compressionTypeH); - BSWAP16(CommChunk.compressionTypeL); - s32 cType = (CommChunk.compressionTypeH << 16) + CommChunk.compressionTypeL; - if (cType != 0x56415043) { // VAPC - fail_parse("file is of the wrong compression type"); - } - if (CommChunk.numChannels != 1) { - fail_parse("file contains %d channels, only 1 channel supported", CommChunk.numChannels); - } - if (CommChunk.sampleSize != 16) { - fail_parse("file contains %d bit samples, only 16 bit samples supported", CommChunk.sampleSize); - } - - nSamples = (CommChunk.numFramesH << 16) + CommChunk.numFramesL; - - // Allow broken input lengths - if (nSamples % 16) { - nSamples--; - } - - if (nSamples % 16 != 0) { - fail_parse("number of chunks must be a multiple of 16, found %d", nSamples); - } - break; - - case 0x53534e44: // SSND - checked_fread(&SndDChunk, sizeof(SndDChunk), 1, ifile); - BSWAP32(SndDChunk.offset); - BSWAP32(SndDChunk.blockSize); - assert(SndDChunk.offset == 0); - assert(SndDChunk.blockSize == 0); - soundPointer = ftell(ifile); - break; - - case 0x4150504c: // APPL - checked_fread(&ts, sizeof(u32), 1, ifile); - BSWAP32(ts); - if (ts == 0x73746f63) { // stoc - u8 len; - checked_fread(&len, 1, 1, ifile); - if (len == 11) { - char ChunkName[12]; - s16 version; - checked_fread(ChunkName, 11, 1, ifile); - ChunkName[11] = '\0'; - if (strcmp("VADPCMCODES", ChunkName) == 0) { - checked_fread(&version, sizeof(s16), 1, ifile); - BSWAP16(version); - if (version != 1) { - fail_parse("Unknown codebook chunk version"); - } - readaifccodebook(ifile, &coefTable, &order, &npredictors); - } - else if (strcmp("VADPCMLOOPS", ChunkName) == 0) { - checked_fread(&version, sizeof(s16), 1, ifile); - BSWAP16(version); - if (version != 1) { - fail_parse("Unknown loop chunk version"); - } - aloops = readlooppoints(ifile, &nloops); - if (nloops != 1) { - fail_parse("Only a single loop supported"); - } - } - } - } - break; - } - - fseek(ifile, offset + Header.ckSize, SEEK_SET); - } - - if (coefTable == NULL) { - fail_parse("Codebook missing from bitstream"); - } - - for (s32 i = 0; i < order; i++) { - state[15 - i] = 0; - } - - u32 outputBytes = nSamples * sizeof(s16); - u8 *outputBuf = malloc(outputBytes); - - fseek(ifile, soundPointer, SEEK_SET); - while (currPos < nSamples) { - u8 input[9]; - u8 encoded[9]; - s32 lastState[16]; - s32 decoded[16]; - s16 guess[16]; - s16 origGuess[16]; - - memcpy(lastState, state, sizeof(lastState)); - checked_fread(input, 9, 1, ifile); - - // Decode for real - my_decodeframe(input, state, order, coefTable); - memcpy(decoded, state, sizeof(lastState)); - - // Create a guess from that, by clamping to 16 bits - for (s32 i = 0; i < 16; i++) { - origGuess[i] = clamp_to_s16(state[i]); - } - - // Encode the guess - memcpy(state, lastState, sizeof(lastState)); - memcpy(guess, origGuess, sizeof(guess)); - my_encodeframe(encoded, guess, state, coefTable, order, npredictors); - - // If it doesn't match, randomly round numbers until it does. - if (memcmp(input, encoded, 9) != 0) { - s32 scale = 1 << (input[0] >> 4); - do { - permute(guess, decoded, scale); - memcpy(state, lastState, sizeof(lastState)); - my_encodeframe(encoded, guess, state, coefTable, order, npredictors); - } while (memcmp(input, encoded, 9) != 0); - - // Bring the matching closer to the original decode (not strictly - // necessary, but it will move us closer to the target on average). - for (s32 failures = 0; failures < 50; failures++) { - s32 ind = myrand() % 16; - s32 old = guess[ind]; - if (old == origGuess[ind]) continue; - guess[ind] = origGuess[ind]; - if (myrand() % 2) guess[ind] += (old - origGuess[ind]) / 2; - memcpy(state, lastState, sizeof(lastState)); - my_encodeframe(encoded, guess, state, coefTable, order, npredictors); - if (memcmp(input, encoded, 9) == 0) { - failures = -1; - } - else { - guess[ind] = old; - } - } - } - - memcpy(state, decoded, sizeof(lastState)); - BSWAP16_MANY(guess, 16); - memcpy(outputBuf + currPos * 2, guess, sizeof(guess)); - currPos += 16; - } - - // Write an incomplete file header. We'll fill in the size later. - fwrite("FORM\0\0\0\0AIFF", 12, 1, ofile); - - // Subtract 4 from the COMM size to skip the compression field. - write_header(ofile, "COMM", sizeof(CommonChunk) - 4); - CommChunk.numFramesH = nSamples >> 16; - CommChunk.numFramesL = nSamples & 0xffff; - BSWAP16(CommChunk.numChannels); - BSWAP16(CommChunk.numFramesH); - BSWAP16(CommChunk.numFramesL); - BSWAP16(CommChunk.sampleSize); - fwrite(&CommChunk, sizeof(CommonChunk) - 4, 1, ofile); - - if (nloops > 0) { - s32 startPos = aloops[0].start, endPos = aloops[0].end; - const char *markerNames[2] = {"start", "end"}; - Marker markers[2] = { - {1, startPos >> 16, startPos & 0xffff}, - {2, endPos >> 16, endPos & 0xffff} - }; - write_header(ofile, "MARK", 2 + 2 * sizeof(Marker) + 1 + 5 + 1 + 3); - s16 numMarkers = bswap16(2); - fwrite(&numMarkers, sizeof(s16), 1, ofile); - for (s32 i = 0; i < 2; i++) { - u8 len = (u8) strlen(markerNames[i]); - BSWAP16(markers[i].MarkerID); - BSWAP16(markers[i].positionH); - BSWAP16(markers[i].positionL); - fwrite(&markers[i], sizeof(Marker), 1, ofile); - fwrite(&len, 1, 1, ofile); - fwrite(markerNames[i], len, 1, ofile); - } - - write_header(ofile, "INST", sizeof(InstrumentChunk)); - InstChunk.sustainLoop.playMode = bswap16(1); - InstChunk.sustainLoop.beginLoop = bswap16(1); - InstChunk.sustainLoop.endLoop = bswap16(2); - InstChunk.releaseLoop.playMode = 0; - InstChunk.releaseLoop.beginLoop = 0; - InstChunk.releaseLoop.endLoop = 0; - fwrite(&InstChunk, sizeof(InstrumentChunk), 1, ofile); - } - - // Save the coefficient table for use when encoding. Ideally this wouldn't - // be needed and "tabledesign -s 1" would generate the right table, but in - // practice it's difficult to adjust samples to make that happen. - write_header(ofile, "APPL", 4 + 12 + sizeof(CodeChunk) + npredictors * order * 8 * 2); - fwrite("stoc", 4, 1, ofile); - CodeChunk cChunk; - cChunk.version = bswap16(1); - cChunk.order = bswap16(order); - cChunk.nEntries = bswap16(npredictors); - fwrite("\x0bVADPCMCODES", 12, 1, ofile); - fwrite(&cChunk, sizeof(CodeChunk), 1, ofile); - for (s32 i = 0; i < npredictors; i++) { - for (s32 j = 0; j < order; j++) { - for (s32 k = 0; k < 8; k++) { - s16 ts = bswap16(coefTable[i][k][j]); - fwrite(&ts, sizeof(s16), 1, ofile); - } - } - } - - write_header(ofile, "SSND", outputBytes + 8); - SndDChunk.offset = 0; - SndDChunk.blockSize = 0; - fwrite(&SndDChunk, sizeof(SoundDataChunk), 1, ofile); - fwrite(outputBuf, outputBytes, 1, ofile); - - // Fix the size in the header - s32 fileSize = bswap32(ftell(ofile) - 8); - fseek(ofile, 4, SEEK_SET); - fwrite(&fileSize, 4, 1, ofile); - - fclose(ifile); - fclose(ofile); - return 0; -} diff --git a/tools/aiff_extract_codebook.c b/tools/aiff_extract_codebook.c deleted file mode 100644 index 38173bab..00000000 --- a/tools/aiff_extract_codebook.c +++ /dev/null @@ -1,191 +0,0 @@ -/** - * Create an ADPCM codebook either by extracting it from an AIFF section, or - * by executing tabledesign. - */ -#include -#include -#include -#include -#include -#include - -typedef short s16; -typedef int s32; -typedef unsigned char u8; -typedef unsigned int u32; - -#ifdef _MSC_VER -#define __builtin_bswap16 _byteswap_ushort -#define __builtin_bswap32 _byteswap_ulong -#define NORETURN -#define UNUSED -#else -#define NORETURN __attribute__((noreturn)) -#define UNUSED __attribute__((unused)) -#endif - -#define BSWAP16(x) x = __builtin_bswap16(x) -#define BSWAP32(x) x = __builtin_bswap32(x) - -typedef struct -{ - u32 start; - u32 end; - u32 count; - s16 state[16]; -} ALADPCMloop; - -static const char usage[] = "input.aiff"; -static const char *progname, *infilename; - -#define checked_fread(a, b, c, d) if (fread(a, b, c, d) != c) fail_parse("error parsing file") - -NORETURN -void fail_parse(const char *fmt, ...) -{ - char *formatted = NULL; - va_list ap; - va_start(ap, fmt); - int size = vsnprintf(NULL, 0, fmt, ap); - va_end(ap); - if (size >= 0) { - size++; - formatted = malloc(size); - if (formatted != NULL) { - va_start(ap, fmt); - size = vsnprintf(formatted, size, fmt, ap); - va_end(ap); - if (size < 0) { - free(formatted); - formatted = NULL; - } - } - } - - if (formatted != NULL) { - fprintf(stderr, "%s: %s [%s]\n", progname, formatted, infilename); - free(formatted); - } - exit(1); -} - -s32 readaifccodebook(FILE *fhandle, s32 ****table, s16 *order, s16 *npredictors) -{ - checked_fread(order, sizeof(s16), 1, fhandle); - BSWAP16(*order); - checked_fread(npredictors, sizeof(s16), 1, fhandle); - BSWAP16(*npredictors); - *table = malloc(*npredictors * sizeof(s32 **)); - for (s32 i = 0; i < *npredictors; i++) { - (*table)[i] = malloc(8 * sizeof(s32 *)); - for (s32 j = 0; j < 8; j++) { - (*table)[i][j] = malloc((*order + 8) * sizeof(s32)); - } - } - - for (s32 i = 0; i < *npredictors; i++) { - s32 **table_entry = (*table)[i]; - for (s32 j = 0; j < *order; j++) { - for (s32 k = 0; k < 8; k++) { - s16 ts; - checked_fread(&ts, sizeof(s16), 1, fhandle); - BSWAP16(ts); - table_entry[k][j] = ts; - } - } - - for (s32 k = 1; k < 8; k++) { - table_entry[k][*order] = table_entry[k - 1][*order - 1]; - } - - table_entry[0][*order] = 1 << 11; - - for (s32 k = 1; k < 8; k++) { - s32 j = 0; - for (; j < k; j++) { - table_entry[j][k + *order] = 0; - } - - for (; j < 8; j++) { - table_entry[j][k + *order] = table_entry[j - k][*order]; - } - } - } - return 0; -} - -int main(int argc, char **argv) -{ - s16 order = -1; - s16 npredictors = -1; - s32 ***coefTable = NULL; - FILE *ifile; - progname = argv[0]; - - if (argc < 2) { - fprintf(stderr, "%s %s\n", progname, usage); - exit(1); - } - - infilename = argv[1]; - - if ((ifile = fopen(infilename, "rb")) == NULL) { - fail_parse("AIFF file could not be opened"); - exit(1); - } - - char buf[5] = {0}; - checked_fread(buf, 4, 1, ifile); - if (strcmp(buf, "FORM") != 0) fail_parse("not an AIFF file"); - checked_fread(buf, 4, 1, ifile); - checked_fread(buf, 4, 1, ifile); - if (strcmp(buf, "AIFF") != 0 && strcmp(buf, "AIFC") != 0) { - fail_parse("not an AIFF file"); - } - - for (;;) { - s32 size; - if (!fread(buf, 4, 1, ifile) || !fread(&size, 4, 1, ifile)) break; - BSWAP32(size); - s32 nextOffset = ftell(ifile) + ((size + 1) & ~1); - - if (strcmp(buf, "APPL") == 0) { - checked_fread(buf, 4, 1, ifile); - if (strcmp(buf, "stoc") == 0) { - u8 len; - checked_fread(&len, 1, 1, ifile); - if (len == 11) { - char chunkName[12]; - s16 version; - checked_fread(chunkName, 11, 1, ifile); - chunkName[11] = '\0'; - if (strcmp(chunkName, "VADPCMCODES") == 0) { - checked_fread(&version, sizeof(s16), 1, ifile); - BSWAP16(version); - if (version == 1) { - readaifccodebook(ifile, &coefTable, &order, &npredictors); - } - } - } - } - } - - fseek(ifile, nextOffset, SEEK_SET); - } - fclose(ifile); - - if (coefTable == NULL) { - execl("./tools/tabledesign", "tabledesign", "-s", "1", infilename, NULL); - } else { - printf("%d\n%d\n", order, npredictors); - for (s32 i = 0; i < npredictors; i++) { - for (s32 j = 0; j < order; j++) { - for (s32 k = 0; k < 8; k++) { - printf("% 5d ", coefTable[i][k][j]); - } - puts(""); - } - } - } - return 0; -} diff --git a/tools/apply_patch.sh b/tools/apply_patch.sh deleted file mode 100755 index 1ab8ed23..00000000 --- a/tools/apply_patch.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh -# -# apply_patch.sh - Applies an enhancement patch -# - -if [ "$#" -ne 1 ] -then - echo "Usage: $0 patch_file" - echo ' Applies a patch file to the current directory' - exit 1 -fi - -read -p "Do you wish to apply the patch '$1'? [Y/N] " response -case "$response" in - Y|y) - patch -p1 < "$1" - ;; - N|n) - echo 'Quit' - exit 1 - ;; - *) - echo "Invalid response '$response'." - exit 1 - ;; -esac - diff --git a/tools/armips.cpp b/tools/armips.cpp deleted file mode 100644 index 271bf558..00000000 --- a/tools/armips.cpp +++ /dev/null @@ -1,19906 +0,0 @@ -// armips assembler v0.11 -// https://github.com/Kingcom/armips/ -// To simplify compilation, all files have been concatenated into one. -// MIPS only, ARM is not included. - -/* -The MIT License (MIT) - -Copyright (c) 2009-2020 Kingcom - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -// file: stdafx.h - - -#define _CRT_SECURE_NO_WARNINGS -#undef __STRICT_ANSI__ - -#if defined(__clang__) -#if __has_feature(cxx_exceptions) -#define ARMIPS_EXCEPTIONS 1 -#else -#define ARMIPS_EXCEPTIONS 0 -#endif -#elif defined(_MSC_VER) && defined(_CPPUNWIND) -#define ARMIPS_EXCEPTIONS 1 -#elif defined(__EXCEPTIONS) || defined(__cpp_exceptions) -#define ARMIPS_EXCEPTIONS 1 -#else -#define ARMIPS_EXCEPTIONS 0 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#define formatString tfm::format - -// Custom make_unique so that C++14 support will not be necessary for compilation -template -std::unique_ptr make_unique(Args&&... args) -{ - return std::unique_ptr(new T(std::forward(args)...)); -} - -// file: ext/tinyformat/tinyformat.h -// tinyformat.h -// Copyright (C) 2011, Chris Foster [chris42f (at) gmail (d0t) com] -// -// Boost Software License - Version 1.0 -// -// Permission is hereby granted, free of charge, to any person or organization -// obtaining a copy of the software and accompanying documentation covered by -// this license (the "Software") to use, reproduce, display, distribute, -// execute, and transmit the Software, and to prepare derivative works of the -// Software, and to permit third-parties to whom the Software is furnished to -// do so, all subject to the following: -// -// The copyright notices in the Software and this entire statement, including -// the above license grant, this restriction and the following disclaimer, -// must be included in all copies of the Software, in whole or in part, and -// all derivative works of the Software, unless such copies or derivative -// works are solely in the form of machine-executable object code generated by -// a source language processor. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. - -//------------------------------------------------------------------------------ -// Tinyformat: A minimal type safe printf replacement -// -// tinyformat.h is a type safe printf replacement library in a single C++ -// header file. Design goals include: -// -// * Type safety and extensibility for user defined types. -// * C99 printf() compatibility, to the extent possible using std::wostream -// * Simplicity and minimalism. A single header file to include and distribute -// with your projects. -// * Augment rather than replace the standard stream formatting mechanism -// * C++98 support, with optional C++11 niceties -// -// -// Main interface example usage -// ---------------------------- -// -// To print a date to std::wcout: -// -// std::wstring weekday = L"Wednesday"; -// const wchar_t* month = L"July"; -// size_t day = 27; -// long hour = 14; -// int min = 44; -// -// tfm::printf("%s, %s %d, %.2d:%.2d\n", weekday, month, day, hour, min); -// -// The strange types here emphasize the type safety of the interface; it is -// possible to print a std::wstring using the "%s" conversion, and a -// size_t using the "%d" conversion. A similar result could be achieved -// using either of the tfm::format() functions. One prints on a user provided -// stream: -// -// tfm::format(std::cerr, L"%s, %s %d, %.2d:%.2d\n", -// weekday, month, day, hour, min); -// -// The other returns a std::wstring: -// -// std::wstring date = tfm::format(L"%s, %s %d, %.2d:%.2d\n", -// weekday, month, day, hour, min); -// std::wcout << date; -// -// These are the three primary interface functions. There is also a -// convenience function printfln() which appends a newline to the usual result -// of printf() for super simple logging. -// -// -// User defined format functions -// ----------------------------- -// -// Simulating variadic templates in C++98 is pretty painful since it requires -// writing out the same function for each desired number of arguments. To make -// this bearable tinyformat comes with a set of macros which are used -// internally to generate the API, but which may also be used in user code. -// -// The three macros TINYFORMAT_ARGTYPES(n), TINYFORMAT_VARARGS(n) and -// TINYFORMAT_PASSARGS(n) will generate a list of n argument types, -// type/name pairs and argument names respectively when called with an integer -// n between 1 and 16. We can use these to define a macro which generates the -// desired user defined function with n arguments. To generate all 16 user -// defined function bodies, use the macro TINYFORMAT_FOREACH_ARGNUM. For an -// example, see the implementation of printf() at the end of the source file. -// -// Sometimes it's useful to be able to pass a list of format arguments through -// to a non-template function. The FormatList class is provided as a way to do -// this by storing the argument list in a type-opaque way. Continuing the -// example from above, we construct a FormatList using makeFormatList(): -// -// FormatListRef formatList = tfm::makeFormatList(weekday, month, day, hour, min); -// -// The format list can now be passed into any non-template function and used -// via a call to the vformat() function: -// -// tfm::vformat(std::wcout, L"%s, %s %d, %.2d:%.2d\n", formatList); -// -// -// Additional API information -// -------------------------- -// -// Error handling: Define TINYFORMAT_ERROR to customize the error handling for -// format strings which are unsupported or have the wrong number of format -// specifiers (calls assert() by default). -// -// User defined types: Uses operator<< for user defined types by default. -// Overload formatValue() for more control. - - -#ifndef TINYFORMAT_H_INCLUDED -#define TINYFORMAT_H_INCLUDED - -namespace tinyformat {} -//------------------------------------------------------------------------------ -// Config section. Customize to your liking! - -// Namespace alias to encourage brevity -namespace tfm = tinyformat; - -// Error handling; calls assert() by default. -// #define TINYFORMAT_ERROR(reasonString) your_error_handler(reasonString) - -// Define for C++11 variadic templates which make the code shorter & more -// general. If you don't define this, C++11 support is autodetected below. -// #define TINYFORMAT_USE_VARIADIC_TEMPLATES - - -//------------------------------------------------------------------------------ -// Implementation details. -#include -#include -#include - -#ifndef TINYFORMAT_ASSERT -# include -# define TINYFORMAT_ASSERT(cond) assert(cond) -#endif - -#define TINYFORMAT_ALLOW_WCHAR_STRINGS -#define TINYFORMAT_USE_VARIADIC_TEMPLATES - -#ifndef TINYFORMAT_ERROR -# include -# define TINYFORMAT_ERROR(reason) assert(0 && reason) -#endif - -#if !defined(TINYFORMAT_USE_VARIADIC_TEMPLATES) && !defined(TINYFORMAT_NO_VARIADIC_TEMPLATES) -# ifdef __GXX_EXPERIMENTAL_CXX0X__ -# define TINYFORMAT_USE_VARIADIC_TEMPLATES -# endif -#endif - -#if defined(__GLIBCXX__) && __GLIBCXX__ < 20080201 -// std::showpos is broken on old libstdc++ as provided with OSX. See -// http://gcc.gnu.org/ml/libstdc++/2007-11/msg00075.html -# define TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND -#endif - -#ifdef __APPLE__ -// Workaround OSX linker warning: xcode uses different default symbol -// visibilities for static libs vs executables (see issue #25) -# define TINYFORMAT_HIDDEN __attribute__((visibility("hidden"))) -#else -# define TINYFORMAT_HIDDEN -#endif - -namespace tinyformat { - -//------------------------------------------------------------------------------ -namespace detail { - -// Test whether type T1 is convertible to type T2 -template -struct is_convertible -{ - private: - // two types of different size - struct fail { wchar_t dummy[2]; }; - struct succeed { wchar_t dummy; }; - // Try to convert a T1 to a T2 by plugging into tryConvert - static fail tryConvert(...); - static succeed tryConvert(const T2&); - static const T1& makeT1(); - public: -# ifdef _MSC_VER - // Disable spurious loss of precision warnings in tryConvert(makeT1()) -# pragma warning(push) -# pragma warning(disable:4244) -# pragma warning(disable:4267) -# endif - // Standard trick: the (...) version of tryConvert will be chosen from - // the overload set only if the version taking a T2 doesn't match. - // Then we compare the sizes of the return types to check which - // function matched. Very neat, in a disgusting kind of way :) - static const bool value = - sizeof(tryConvert(makeT1())) == sizeof(succeed); -# ifdef _MSC_VER -# pragma warning(pop) -# endif -}; - - -// Detect when a type is not a wchar_t string -template struct is_wchar { typedef int tinyformat_wchar_is_not_supported; }; -template<> struct is_wchar {}; -template<> struct is_wchar {}; -template struct is_wchar {}; -template struct is_wchar {}; - - -// Format the value by casting to type fmtT. This default implementation -// should never be called. -template::value> -struct formatValueAsType -{ - static void invoke(std::wostream& /*out*/, const T& /*value*/) { TINYFORMAT_ASSERT(0); } -}; -// Specialized version for types that can actually be converted to fmtT, as -// indicated by the "convertible" template parameter. -template -struct formatValueAsType -{ - static void invoke(std::wostream& out, const T& value) - { out << static_cast(value); } -}; - -#ifdef TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND -template::value> -struct formatZeroIntegerWorkaround -{ - static bool invoke(std::wostream& /**/, const T& /**/) { return false; } -}; -template -struct formatZeroIntegerWorkaround -{ - static bool invoke(std::wostream& out, const T& value) - { - if (static_cast(value) == 0 && out.flags() & std::ios::showpos) - { - out << "+0"; - return true; - } - return false; - } -}; -#endif // TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND - -// Convert an arbitrary type to integer. The version with convertible=false -// throws an error. -template::value> -struct convertToInt -{ - static int invoke(const T& /*value*/) - { - TINYFORMAT_ERROR("tinyformat: Cannot convert from argument type to " - "integer for use as variable width or precision"); - return 0; - } -}; -// Specialization for convertToInt when conversion is possible -template -struct convertToInt -{ - static int invoke(const T& value) { return static_cast(value); } -}; - -// Format at most ntrunc wchar_tacters to the given stream. -template -inline void formatTruncated(std::wostream& out, const T& value, int ntrunc) -{ - std::wostringstream tmp; - tmp << value; - std::wstring result = tmp.str(); - out.write(result.c_str(), (std::min)(ntrunc, static_cast(result.size()))); -} -#define TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(type) \ -inline void formatTruncated(std::wostream& out, type* value, int ntrunc) \ -{ \ - std::streamsize len = 0; \ - while(len < ntrunc && value[len] != 0) \ - ++len; \ - out.write(value, len); \ -} -// Overload for const wchar_t* and wchar_t*. Could overload for signed & unsigned -// wchar_t too, but these are technically unneeded for printf compatibility. -TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(const wchar_t) -TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(wchar_t) -#undef TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR - -} // namespace detail - - -//------------------------------------------------------------------------------ -// Variable formatting functions. May be overridden for user-defined types if -// desired. - - -/// Format a value into a stream, delegating to operator<< by default. -/// -/// Users may override this for their own types. When this function is called, -/// the stream flags will have been modified according to the format string. -/// The format specification is provided in the range [fmtBegin, fmtEnd). For -/// truncating conversions, ntrunc is set to the desired maximum number of -/// characters, for example "%.7s" calls formatValue with ntrunc = 7. -/// -/// By default, formatValue() uses the usual stream insertion operator -/// operator<< to format the type T, with special cases for the %c and %p -/// conversions. -template -inline void formatValue(std::wostream& out, const wchar_t* /*fmtBegin*/, - const wchar_t* fmtEnd, int ntrunc, const T& value) -{ -#ifndef TINYFORMAT_ALLOW_WCHAR_STRINGS - // Since we don't support printing of wchar_t using "%ls", make it fail at - // compile time in preference to printing as a void* at runtime. - typedef typename detail::is_wchar::tinyformat_wchar_is_not_supported DummyType; - (void) DummyType(); // avoid unused type warning with gcc-4.8 -#endif - // The mess here is to support the %c and %p conversions: if these - // conversions are active we try to convert the type to a wchar_t or const - // void* respectively and format that instead of the value itself. For the - // %p conversion it's important to avoid dereferencing the pointer, which - // could otherwise lead to a crash when printing a dangling (const wchar_t*). - const bool canConvertToChar = detail::is_convertible::value; - const bool canConvertToVoidPtr = detail::is_convertible::value; - if(canConvertToChar && *(fmtEnd-1) == 'c') - detail::formatValueAsType::invoke(out, value); - else if(canConvertToVoidPtr && *(fmtEnd-1) == 'p') - detail::formatValueAsType::invoke(out, value); -#ifdef TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND - else if(detail::formatZeroIntegerWorkaround::invoke(out, value)) /**/; -#endif - else if(ntrunc >= 0) - { - // Take care not to overread C strings in truncating conversions like - // "%.4s" where at most 4 wchar_tacters may be read. - detail::formatTruncated(out, value, ntrunc); - } - else - out << value; -} - - -// Overloaded version for wchar_t types to support printing as an integer -#define TINYFORMAT_DEFINE_FORMATVALUE_CHAR(wchar_tType) \ -inline void formatValue(std::wostream& out, const wchar_t* /*fmtBegin*/, \ - const wchar_t* fmtEnd, int /**/, wchar_tType value) \ -{ \ - switch(*(fmtEnd-1)) \ - { \ - case 'u': case 'd': case 'i': case 'o': case 'X': case 'x': \ - out << static_cast(value); break; \ - default: \ - out << value; break; \ - } \ -} -// per 3.9.1: char, signed char and unsigned char are all distinct types -TINYFORMAT_DEFINE_FORMATVALUE_CHAR(char) -TINYFORMAT_DEFINE_FORMATVALUE_CHAR(signed char) -TINYFORMAT_DEFINE_FORMATVALUE_CHAR(unsigned char) -#undef TINYFORMAT_DEFINE_FORMATVALUE_CHAR - - -//------------------------------------------------------------------------------ -// Tools for emulating variadic templates in C++98. The basic idea here is -// stolen from the boost preprocessor metaprogramming library and cut down to -// be just general enough for what we need. - -#define TINYFORMAT_ARGTYPES(n) TINYFORMAT_ARGTYPES_ ## n -#define TINYFORMAT_VARARGS(n) TINYFORMAT_VARARGS_ ## n -#define TINYFORMAT_PASSARGS(n) TINYFORMAT_PASSARGS_ ## n -#define TINYFORMAT_PASSARGS_TAIL(n) TINYFORMAT_PASSARGS_TAIL_ ## n - -// To keep it as transparent as possible, the macros below have been generated -// using python via the excellent cog.py code generation script. This avoids -// the need for a bunch of complex (but more general) preprocessor tricks as -// used in boost.preprocessor. -// -// To rerun the code generation in place, use `cog.py -r tinyformat.h` -// (see http://nedbatchelder.com/code/cog). Alternatively you can just create -// extra versions by hand. - -/*[[[cog -maxParams = 16 - -def makeCommaSepLists(lineTemplate, elemTemplate, startInd=1): - for j in range(startInd,maxParams+1): - list = ', '.join([elemTemplate % {'i':i} for i in range(startInd,j+1)]) - cog.outl(lineTemplate % {'j':j, 'list':list}) - -makeCommaSepLists('#define TINYFORMAT_ARGTYPES_%(j)d %(list)s', - 'class T%(i)d') - -cog.outl() -makeCommaSepLists('#define TINYFORMAT_VARARGS_%(j)d %(list)s', - 'const T%(i)d& v%(i)d') - -cog.outl() -makeCommaSepLists('#define TINYFORMAT_PASSARGS_%(j)d %(list)s', 'v%(i)d') - -cog.outl() -cog.outl('#define TINYFORMAT_PASSARGS_TAIL_1') -makeCommaSepLists('#define TINYFORMAT_PASSARGS_TAIL_%(j)d , %(list)s', - 'v%(i)d', startInd = 2) - -cog.outl() -cog.outl('#define TINYFORMAT_FOREACH_ARGNUM(m) \\\n ' + - ' '.join(['m(%d)' % (j,) for j in range(1,maxParams+1)])) -]]]*/ -#define TINYFORMAT_ARGTYPES_1 class T1 -#define TINYFORMAT_ARGTYPES_2 class T1, class T2 -#define TINYFORMAT_ARGTYPES_3 class T1, class T2, class T3 -#define TINYFORMAT_ARGTYPES_4 class T1, class T2, class T3, class T4 -#define TINYFORMAT_ARGTYPES_5 class T1, class T2, class T3, class T4, class T5 -#define TINYFORMAT_ARGTYPES_6 class T1, class T2, class T3, class T4, class T5, class T6 -#define TINYFORMAT_ARGTYPES_7 class T1, class T2, class T3, class T4, class T5, class T6, class T7 -#define TINYFORMAT_ARGTYPES_8 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8 -#define TINYFORMAT_ARGTYPES_9 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9 -#define TINYFORMAT_ARGTYPES_10 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10 -#define TINYFORMAT_ARGTYPES_11 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11 -#define TINYFORMAT_ARGTYPES_12 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12 -#define TINYFORMAT_ARGTYPES_13 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13 -#define TINYFORMAT_ARGTYPES_14 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14 -#define TINYFORMAT_ARGTYPES_15 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15 -#define TINYFORMAT_ARGTYPES_16 class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15, class T16 - -#define TINYFORMAT_VARARGS_1 const T1& v1 -#define TINYFORMAT_VARARGS_2 const T1& v1, const T2& v2 -#define TINYFORMAT_VARARGS_3 const T1& v1, const T2& v2, const T3& v3 -#define TINYFORMAT_VARARGS_4 const T1& v1, const T2& v2, const T3& v3, const T4& v4 -#define TINYFORMAT_VARARGS_5 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5 -#define TINYFORMAT_VARARGS_6 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6 -#define TINYFORMAT_VARARGS_7 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7 -#define TINYFORMAT_VARARGS_8 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8 -#define TINYFORMAT_VARARGS_9 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9 -#define TINYFORMAT_VARARGS_10 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10 -#define TINYFORMAT_VARARGS_11 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11 -#define TINYFORMAT_VARARGS_12 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11, const T12& v12 -#define TINYFORMAT_VARARGS_13 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11, const T12& v12, const T13& v13 -#define TINYFORMAT_VARARGS_14 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11, const T12& v12, const T13& v13, const T14& v14 -#define TINYFORMAT_VARARGS_15 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11, const T12& v12, const T13& v13, const T14& v14, const T15& v15 -#define TINYFORMAT_VARARGS_16 const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8, const T9& v9, const T10& v10, const T11& v11, const T12& v12, const T13& v13, const T14& v14, const T15& v15, const T16& v16 - -#define TINYFORMAT_PASSARGS_1 v1 -#define TINYFORMAT_PASSARGS_2 v1, v2 -#define TINYFORMAT_PASSARGS_3 v1, v2, v3 -#define TINYFORMAT_PASSARGS_4 v1, v2, v3, v4 -#define TINYFORMAT_PASSARGS_5 v1, v2, v3, v4, v5 -#define TINYFORMAT_PASSARGS_6 v1, v2, v3, v4, v5, v6 -#define TINYFORMAT_PASSARGS_7 v1, v2, v3, v4, v5, v6, v7 -#define TINYFORMAT_PASSARGS_8 v1, v2, v3, v4, v5, v6, v7, v8 -#define TINYFORMAT_PASSARGS_9 v1, v2, v3, v4, v5, v6, v7, v8, v9 -#define TINYFORMAT_PASSARGS_10 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 -#define TINYFORMAT_PASSARGS_11 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11 -#define TINYFORMAT_PASSARGS_12 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12 -#define TINYFORMAT_PASSARGS_13 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13 -#define TINYFORMAT_PASSARGS_14 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14 -#define TINYFORMAT_PASSARGS_15 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 -#define TINYFORMAT_PASSARGS_16 v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16 - -#define TINYFORMAT_PASSARGS_TAIL_1 -#define TINYFORMAT_PASSARGS_TAIL_2 , v2 -#define TINYFORMAT_PASSARGS_TAIL_3 , v2, v3 -#define TINYFORMAT_PASSARGS_TAIL_4 , v2, v3, v4 -#define TINYFORMAT_PASSARGS_TAIL_5 , v2, v3, v4, v5 -#define TINYFORMAT_PASSARGS_TAIL_6 , v2, v3, v4, v5, v6 -#define TINYFORMAT_PASSARGS_TAIL_7 , v2, v3, v4, v5, v6, v7 -#define TINYFORMAT_PASSARGS_TAIL_8 , v2, v3, v4, v5, v6, v7, v8 -#define TINYFORMAT_PASSARGS_TAIL_9 , v2, v3, v4, v5, v6, v7, v8, v9 -#define TINYFORMAT_PASSARGS_TAIL_10 , v2, v3, v4, v5, v6, v7, v8, v9, v10 -#define TINYFORMAT_PASSARGS_TAIL_11 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11 -#define TINYFORMAT_PASSARGS_TAIL_12 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12 -#define TINYFORMAT_PASSARGS_TAIL_13 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13 -#define TINYFORMAT_PASSARGS_TAIL_14 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14 -#define TINYFORMAT_PASSARGS_TAIL_15 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 -#define TINYFORMAT_PASSARGS_TAIL_16 , v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16 - -#define TINYFORMAT_FOREACH_ARGNUM(m) \ - m(1) m(2) m(3) m(4) m(5) m(6) m(7) m(8) m(9) m(10) m(11) m(12) m(13) m(14) m(15) m(16) -//[[[end]]] - - - -namespace detail { - -// Type-opaque holder for an argument to format(), with associated actions on -// the type held as explicit function pointers. This allows FormatArg's for -// each argument to be allocated as a homogenous array inside FormatList -// whereas a naive implementation based on inheritance does not. -class FormatArg -{ - public: - FormatArg() - : m_value(NULL), - m_formatImpl(NULL), - m_toIntImpl(NULL) - { } - - template - FormatArg(const T& value) - : m_value(static_cast(&value)), - m_formatImpl(&formatImpl), - m_toIntImpl(&toIntImpl) - { } - - void format(std::wostream& out, const wchar_t* fmtBegin, - const wchar_t* fmtEnd, int ntrunc) const - { - TINYFORMAT_ASSERT(m_value); - TINYFORMAT_ASSERT(m_formatImpl); - m_formatImpl(out, fmtBegin, fmtEnd, ntrunc, m_value); - } - - int toInt() const - { - TINYFORMAT_ASSERT(m_value); - TINYFORMAT_ASSERT(m_toIntImpl); - return m_toIntImpl(m_value); - } - - private: - template - TINYFORMAT_HIDDEN static void formatImpl(std::wostream& out, const wchar_t* fmtBegin, - const wchar_t* fmtEnd, int ntrunc, const void* value) - { - formatValue(out, fmtBegin, fmtEnd, ntrunc, *static_cast(value)); - } - - template - TINYFORMAT_HIDDEN static int toIntImpl(const void* value) - { - return convertToInt::invoke(*static_cast(value)); - } - - const void* m_value; - void (*m_formatImpl)(std::wostream& out, const wchar_t* fmtBegin, - const wchar_t* fmtEnd, int ntrunc, const void* value); - int (*m_toIntImpl)(const void* value); -}; - - -// Parse and return an integer from the string c, as atoi() -// On return, c is set to one past the end of the integer. -inline int parseIntAndAdvance(const wchar_t*& c) -{ - int i = 0; - for(;*c >= '0' && *c <= '9'; ++c) - i = 10*i + (*c - '0'); - return i; -} - -// Print literal part of format string and return next format spec -// position. -// -// Skips over any occurrences of '%%', printing a literal '%' to the -// output. The position of the first % character of the next -// nontrivial format spec is returned, or the end of string. -inline const wchar_t* printFormatStringLiteral(std::wostream& out, const wchar_t* fmt) -{ - const wchar_t* c = fmt; - for(;; ++c) - { - switch(*c) - { - case '\0': - out.write(fmt, c - fmt); - return c; - case '%': - out.write(fmt, c - fmt); - if(*(c+1) != '%') - return c; - // for "%%", tack trailing % onto next literal section. - fmt = ++c; - break; - default: - break; - } - } -} - - -// Parse a format string and set the stream state accordingly. -// -// The format mini-language recognized here is meant to be the one from C99, -// with the form "%[flags][width][.precision][length]type". -// -// Formatting options which can't be natively represented using the ostream -// state are returned in spacePadPositive (for space padded positive numbers) -// and ntrunc (for truncating conversions). argIndex is incremented if -// necessary to pull out variable width and precision . The function returns a -// pointer to the wchar_tacter after the end of the current format spec. -inline const wchar_t* streamStateFromFormat(std::wostream& out, bool& spacePadPositive, - int& ntrunc, const wchar_t* fmtStart, - const detail::FormatArg* formatters, - int& argIndex, int numFormatters) -{ - if(*fmtStart != '%') - { - TINYFORMAT_ERROR("tinyformat: Not enough conversion specifiers in format string"); - return fmtStart; - } - // Reset stream state to defaults. - out.width(0); - out.precision(6); - out.fill(' '); - // Reset most flags; ignore irrelevant unitbuf & skipws. - out.unsetf(std::ios::adjustfield | std::ios::basefield | - std::ios::floatfield | std::ios::showbase | std::ios::boolalpha | - std::ios::showpoint | std::ios::showpos | std::ios::uppercase); - bool precisionSet = false; - bool widthSet = false; - int widthExtra = 0; - const wchar_t* c = fmtStart + 1; - // 1) Parse flags - for(;; ++c) - { - switch(*c) - { - case '#': - out.setf(std::ios::showpoint | std::ios::showbase); - continue; - case '0': - // overridden by left alignment ('-' flag) - if(!(out.flags() & std::ios::left)) - { - // Use internal padding so that numeric values are - // formatted correctly, eg -00010 rather than 000-10 - out.fill('0'); - out.setf(std::ios::internal, std::ios::adjustfield); - } - continue; - case '-': - out.fill(' '); - out.setf(std::ios::left, std::ios::adjustfield); - continue; - case ' ': - // overridden by show positive sign, '+' flag. - if(!(out.flags() & std::ios::showpos)) - spacePadPositive = true; - continue; - case '+': - out.setf(std::ios::showpos); - spacePadPositive = false; - widthExtra = 1; - continue; - default: - break; - } - break; - } - // 2) Parse width - if(*c >= '0' && *c <= '9') - { - widthSet = true; - out.width(parseIntAndAdvance(c)); - } - if(*c == '*') - { - widthSet = true; - int width = 0; - if(argIndex < numFormatters) - width = formatters[argIndex++].toInt(); - else - TINYFORMAT_ERROR("tinyformat: Not enough arguments to read variable width"); - if(width < 0) - { - // negative widths correspond to '-' flag set - out.fill(' '); - out.setf(std::ios::left, std::ios::adjustfield); - width = -width; - } - out.width(width); - ++c; - } - // 3) Parse precision - if(*c == '.') - { - ++c; - int precision = 0; - if(*c == '*') - { - ++c; - if(argIndex < numFormatters) - precision = formatters[argIndex++].toInt(); - else - TINYFORMAT_ERROR("tinyformat: Not enough arguments to read variable precision"); - } - else - { - if(*c >= '0' && *c <= '9') - precision = parseIntAndAdvance(c); - else if(*c == '-') // negative precisions ignored, treated as zero. - parseIntAndAdvance(++c); - } - out.precision(precision); - precisionSet = true; - } - // 4) Ignore any C99 length modifier - while(*c == 'l' || *c == 'h' || *c == 'L' || - *c == 'j' || *c == 'z' || *c == 't') - ++c; - // 5) We're up to the conversion specifier character. - // Set stream flags based on conversion specifier (thanks to the - // boost::format class for forging the way here). - bool intConversion = false; - switch(*c) - { - case 'u': case 'd': case 'i': - out.setf(std::ios::dec, std::ios::basefield); - intConversion = true; - break; - case 'o': - out.setf(std::ios::oct, std::ios::basefield); - intConversion = true; - break; - case 'X': - out.setf(std::ios::uppercase); - // Falls through - case 'x': case 'p': - out.setf(std::ios::hex, std::ios::basefield); - intConversion = true; - break; - case 'E': - out.setf(std::ios::uppercase); - // Falls through - case 'e': - out.setf(std::ios::scientific, std::ios::floatfield); - out.setf(std::ios::dec, std::ios::basefield); - break; - case 'F': - out.setf(std::ios::uppercase); - // Falls through - case 'f': - out.setf(std::ios::fixed, std::ios::floatfield); - break; - case 'G': - out.setf(std::ios::uppercase); - // Falls through - case 'g': - out.setf(std::ios::dec, std::ios::basefield); - // As in boost::format, let stream decide float format. - out.flags(out.flags() & ~std::ios::floatfield); - break; - case 'a': case 'A': - TINYFORMAT_ERROR("tinyformat: the %a and %A conversion specs " - "are not supported"); - break; - case 'c': - // Handled as special case inside formatValue() - break; - case 's': - if(precisionSet) - ntrunc = static_cast(out.precision()); - // Make %s print booleans as "true" and "false" - out.setf(std::ios::boolalpha); - break; - case 'n': - // Not supported - will cause problems! - TINYFORMAT_ERROR("tinyformat: %n conversion spec not supported"); - break; - case '\0': - TINYFORMAT_ERROR("tinyformat: Conversion spec incorrectly " - "terminated by end of string"); - return c; - default: - break; - } - if(intConversion && precisionSet && !widthSet) - { - // "precision" for integers gives the minimum number of digits (to be - // padded with zeros on the left). This isn't really supported by the - // iostreams, but we can approximately simulate it with the width if - // the width isn't otherwise used. - out.width(out.precision() + widthExtra); - out.setf(std::ios::internal, std::ios::adjustfield); - out.fill('0'); - } - return c+1; -} - - -//------------------------------------------------------------------------------ -inline void formatImpl(std::wostream& out, const wchar_t* fmt, - const detail::FormatArg* formatters, - int numFormatters) -{ - // Saved stream state - std::streamsize origWidth = out.width(); - std::streamsize origPrecision = out.precision(); - std::ios::fmtflags origFlags = out.flags(); - wchar_t origFill = out.fill(); - - for (int argIndex = 0; argIndex < numFormatters; ++argIndex) - { - // Parse the format string - fmt = printFormatStringLiteral(out, fmt); - bool spacePadPositive = false; - int ntrunc = -1; - const wchar_t* fmtEnd = streamStateFromFormat(out, spacePadPositive, ntrunc, fmt, - formatters, argIndex, numFormatters); - if (argIndex >= numFormatters) - { - // Check args remain after reading any variable width/precision - TINYFORMAT_ERROR("tinyformat: Not enough format arguments"); - return; - } - const FormatArg& arg = formatters[argIndex]; - // Format the arg into the stream. - if(!spacePadPositive) - arg.format(out, fmt, fmtEnd, ntrunc); - else - { - // The following is a special case with no direct correspondence - // between stream formatting and the printf() behaviour. Simulate - // it crudely by formatting into a temporary string stream and - // munging the resulting string. - std::wostringstream tmpStream; - tmpStream.copyfmt(out); - tmpStream.setf(std::ios::showpos); - arg.format(tmpStream, fmt, fmtEnd, ntrunc); - std::wstring result = tmpStream.str(); // allocates... yuck. - for(size_t i = 0, iend = result.size(); i < iend; ++i) - if(result[i] == '+') result[i] = ' '; - out << result; - } - fmt = fmtEnd; - } - - // Print remaining part of format string. - fmt = printFormatStringLiteral(out, fmt); - if(*fmt != '\0') - TINYFORMAT_ERROR("tinyformat: Too many conversion specifiers in format string"); - - // Restore stream state - out.width(origWidth); - out.precision(origPrecision); - out.flags(origFlags); - out.fill(origFill); -} - -} // namespace detail - - -/// List of template arguments format(), held in a type-opaque way. -/// -/// A const reference to FormatList (typedef'd as FormatListRef) may be -/// conveniently used to pass arguments to non-template functions: All type -/// information has been stripped from the arguments, leaving just enough of a -/// common interface to perform formatting as required. -class FormatList -{ - public: - FormatList(detail::FormatArg* formatters, int N) - : m_formatters(formatters), m_N(N) { } - - friend void vformat(std::wostream& out, const wchar_t* fmt, - const FormatList& list); - - private: - const detail::FormatArg* m_formatters; - int m_N; -}; - -/// Reference to type-opaque format list for passing to vformat() -typedef const FormatList& FormatListRef; - - -namespace detail { - -// Format list subclass with fixed storage to avoid dynamic allocation -template -class FormatListN : public FormatList -{ - public: -#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES - template - FormatListN(const Args&... args) - : FormatList(&m_formatterStore[0], N), - m_formatterStore { FormatArg(args)... } - { static_assert(sizeof...(args) == N, "Number of args must be N"); } -#else // C++98 version - void init(int) {} -# define TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR(n) \ - \ - template \ - FormatListN(TINYFORMAT_VARARGS(n)) \ - : FormatList(&m_formatterStore[0], n) \ - { TINYFORMAT_ASSERT(n == N); init(0, TINYFORMAT_PASSARGS(n)); } \ - \ - template \ - void init(int i, TINYFORMAT_VARARGS(n)) \ - { \ - m_formatterStore[i] = FormatArg(v1); \ - init(i+1 TINYFORMAT_PASSARGS_TAIL(n)); \ - } - - TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR) -# undef TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR -#endif - - private: - FormatArg m_formatterStore[N]; -}; - -// Special 0-arg version - MSVC says zero-sized C array in struct is nonstandard -template<> class FormatListN<0> : public FormatList -{ - public: FormatListN() : FormatList(0, 0) {} -}; - -} // namespace detail - - -//------------------------------------------------------------------------------ -// Primary API functions - -#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES - -/// Make type-agnostic format list from list of template arguments. -/// -/// The exact return type of this function is an implementation detail and -/// shouldn't be relied upon. Instead it should be stored as a FormatListRef: -/// -/// FormatListRef formatList = makeFormatList( /*...*/ ); -template -detail::FormatListN makeFormatList(const Args&... args) -{ - return detail::FormatListN(args...); -} - -#else // C++98 version - -inline detail::FormatListN<0> makeFormatList() -{ - return detail::FormatListN<0>(); -} -#define TINYFORMAT_MAKE_MAKEFORMATLIST(n) \ -template \ -detail::FormatListN makeFormatList(TINYFORMAT_VARARGS(n)) \ -{ \ - return detail::FormatListN(TINYFORMAT_PASSARGS(n)); \ -} -TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_MAKEFORMATLIST) -#undef TINYFORMAT_MAKE_MAKEFORMATLIST - -#endif - -/// Format list of arguments to the stream according to the given format string. -/// -/// The name vformat() is chosen for the semantic similarity to vprintf(): the -/// list of format arguments is held in a single function argument. -inline void vformat(std::wostream& out, const wchar_t* fmt, FormatListRef list) -{ - detail::formatImpl(out, fmt, list.m_formatters, list.m_N); -} - - -#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES - -/// Format list of arguments to the stream according to given format string. -template -void format(std::wostream& out, const wchar_t* fmt, const Args&... args) -{ - vformat(out, fmt, makeFormatList(args...)); -} - -/// Format list of arguments according to the given format string and return -/// the result as a string. -template -std::wstring format(const wchar_t* fmt, const Args&... args) -{ - std::wostringstream oss; - format(oss, fmt, args...); - return oss.str(); -} - -/// Format list of arguments to std::wcout, according to the given format string -template -void printf(const wchar_t* fmt, const Args&... args) -{ - format(std::wcout, fmt, args...); -} - -template -void printfln(const wchar_t* fmt, const Args&... args) -{ - format(std::wcout, fmt, args...); - std::wcout << '\n'; -} - - -#else // C++98 version - -inline void format(std::wostream& out, const wchar_t* fmt) -{ - vformat(out, fmt, makeFormatList()); -} - -inline std::wstring format(const wchar_t* fmt) -{ - std::wostringstream oss; - format(oss, fmt); - return oss.str(); -} - -inline void printf(const wchar_t* fmt) -{ - format(std::wcout, fmt); -} - -inline void printfln(const wchar_t* fmt) -{ - format(std::wcout, fmt); - std::wcout << '\n'; -} - -#define TINYFORMAT_MAKE_FORMAT_FUNCS(n) \ - \ -template \ -void format(std::wostream& out, const wchar_t* fmt, TINYFORMAT_VARARGS(n)) \ -{ \ - vformat(out, fmt, makeFormatList(TINYFORMAT_PASSARGS(n))); \ -} \ - \ -template \ -std::wstring format(const wchar_t* fmt, TINYFORMAT_VARARGS(n)) \ -{ \ - std::wostringstream oss; \ - format(oss, fmt, TINYFORMAT_PASSARGS(n)); \ - return oss.str(); \ -} \ - \ -template \ -void printf(const wchar_t* fmt, TINYFORMAT_VARARGS(n)) \ -{ \ - format(std::wcout, fmt, TINYFORMAT_PASSARGS(n)); \ -} \ - \ -template \ -void printfln(const wchar_t* fmt, TINYFORMAT_VARARGS(n)) \ -{ \ - format(std::wcout, fmt, TINYFORMAT_PASSARGS(n)); \ - std::wcout << '\n'; \ -} - -TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMAT_FUNCS) -#undef TINYFORMAT_MAKE_FORMAT_FUNCS - -#endif - - -} // namespace tinyformat - -#endif // TINYFORMAT_H_INCLUDED - -// file: Commands/CAssemblerCommand.h - -class TempData; -class SymbolData; - -class CAssemblerCommand -{ -public: - CAssemblerCommand(); - virtual ~CAssemblerCommand() { }; - virtual bool Validate() = 0; - virtual void Encode() const = 0; - virtual void writeTempData(TempData& tempData) const = 0; - virtual void writeSymData(SymbolData& symData) const { }; - void applyFileInfo(); - int getSection() { return section; } - void updateSection(int num) { section = num; } -protected: - int FileNum; - int FileLine; -private: - int section; -}; - -class DummyCommand: public CAssemblerCommand -{ -public: - virtual bool Validate() { return false; }; - virtual void Encode() const { }; - virtual void writeTempData(TempData& tempData) const { }; - virtual void writeSymData(SymbolData& symData) const { }; -}; - -class InvalidCommand: public CAssemblerCommand -{ -public: - virtual bool Validate() { return false; }; - virtual void Encode() const { }; - virtual void writeTempData(TempData& tempData) const { }; - virtual void writeSymData(SymbolData& symData) const { }; -}; - -// file: Core/Expression.h -#include - -inline std::wstring to_wstring(int64_t value) -{ - return formatString(L"%d", value); -} - -inline std::wstring to_wstring(double value) -{ - return formatString(L"%#.17g", value); -} - -enum class OperatorType -{ - Invalid, - Integer, - Float, - Identifier, - String, - MemoryPos, - Add, - Sub, - Mult, - Div, - Mod, - Neg, - LogNot, - BitNot, - LeftShift, - RightShift, - Less, - Greater, - LessEqual, - GreaterEqual, - Equal, - NotEqual, - BitAnd, - Xor, - BitOr, - LogAnd, - LogOr, - TertiaryIf, - ToString, - FunctionCall -}; - -enum class ExpressionValueType { Invalid, Integer, Float, String}; - -struct ExpressionValue -{ - ExpressionValueType type; - - ExpressionValue() - { - type = ExpressionValueType::Invalid; - } - - ExpressionValue(int64_t value) - { - type = ExpressionValueType::Integer; - intValue = value; - } - - ExpressionValue(double value) - { - type = ExpressionValueType::Float; - floatValue = value; - } - - ExpressionValue(const std::wstring& value) - { - type = ExpressionValueType::String; - strValue = value; - } - - bool isFloat() const - { - return type == ExpressionValueType::Float; - } - - bool isInt() const - { - return type == ExpressionValueType::Integer; - } - - bool isString() const - { - return type == ExpressionValueType::String; - } - - bool isValid() const - { - return type != ExpressionValueType::Invalid; - } - - struct - { - int64_t intValue; - double floatValue; - }; - - std::wstring strValue; - - ExpressionValue operator!() const; - ExpressionValue operator~() const; - bool operator<(const ExpressionValue& other) const; - bool operator<=(const ExpressionValue& other) const; - bool operator>(const ExpressionValue& other) const; - bool operator>=(const ExpressionValue& other) const; - bool operator==(const ExpressionValue& other) const; - bool operator!=(const ExpressionValue& other) const; - ExpressionValue operator+(const ExpressionValue& other) const; - ExpressionValue operator-(const ExpressionValue& other) const; - ExpressionValue operator*(const ExpressionValue& other) const; - ExpressionValue operator/(const ExpressionValue& other) const; - ExpressionValue operator%(const ExpressionValue& other) const; - ExpressionValue operator<<(const ExpressionValue& other) const; - ExpressionValue operator>>(const ExpressionValue& other) const; - ExpressionValue operator&(const ExpressionValue& other) const; - ExpressionValue operator|(const ExpressionValue& other) const; - ExpressionValue operator&&(const ExpressionValue& other) const; - ExpressionValue operator||(const ExpressionValue& other) const; - ExpressionValue operator^(const ExpressionValue& other) const; -}; - -class Label; - -struct ExpressionFunctionEntry; -struct ExpressionLabelFunctionEntry; - -class ExpressionInternal -{ -public: - ExpressionInternal(); - ~ExpressionInternal(); - ExpressionInternal(int64_t value); - ExpressionInternal(double value); - ExpressionInternal(const std::wstring& value, OperatorType type); - ExpressionInternal(OperatorType op, ExpressionInternal* a = nullptr, - ExpressionInternal* b = nullptr, ExpressionInternal* c = nullptr); - ExpressionInternal(const std::wstring& name, const std::vector& parameters); - ExpressionValue evaluate(); - std::wstring toString(); - bool isIdentifier() { return type == OperatorType::Identifier; } - std::wstring getStringValue() { return strValue; } - void replaceMemoryPos(const std::wstring& identifierName); - bool simplify(bool inUnknownOrFalseBlock); - unsigned int getFileNum() { return fileNum; } - unsigned int getSection() { return section; } -private: - void allocate(size_t count); - void deallocate(); - std::wstring formatFunctionCall(); - ExpressionValue executeExpressionFunctionCall(const ExpressionFunctionEntry& entry); - ExpressionValue executeExpressionLabelFunctionCall(const ExpressionLabelFunctionEntry& entry); - ExpressionValue executeFunctionCall(); - bool checkParameterCount(size_t min, size_t max); - - OperatorType type; - ExpressionInternal** children; - size_t childrenCount; - - union - { - int64_t intValue; - double floatValue; - }; - std::wstring strValue; - - unsigned int fileNum, section; -}; - -class Expression -{ -public: - Expression(); - ExpressionValue evaluate(); - bool isLoaded() const { return expression != nullptr; } - void setExpression(ExpressionInternal* exp, bool inUnknownOrFalseBlock); - void replaceMemoryPos(const std::wstring& identifierName); - bool isConstExpression() { return constExpression; } - - template - bool evaluateInteger(T& dest) - { - if (expression == nullptr) - return false; - - ExpressionValue value = expression->evaluate(); - if (value.isInt() == false) - return false; - - dest = (T) value.intValue; - return true; - } - - bool evaluateString(std::wstring& dest, bool convert) - { - if (expression == nullptr) - return false; - - ExpressionValue value = expression->evaluate(); - if (convert && value.isInt()) - { - dest = to_wstring(value.intValue); - return true; - } - - if (convert && value.isFloat()) - { - dest = to_wstring(value.floatValue); - return true; - } - - if (value.isString() == false) - return false; - - dest = value.strValue; - return true; - } - - bool evaluateIdentifier(std::wstring& dest) - { - if (expression == nullptr || expression->isIdentifier() == false) - return false; - - dest = expression->getStringValue(); - return true; - } - - std::wstring toString() { return expression != nullptr ? expression->toString() : L""; }; -private: - std::shared_ptr expression; - std::wstring originalText; - bool constExpression; -}; - -Expression createConstExpression(int64_t value); - -// file: Core/ExpressionFunctions.h -#include - -bool getExpFuncParameter(const std::vector& parameters, size_t index, int64_t& dest, - const std::wstring& funcName, bool optional); - -bool getExpFuncParameter(const std::vector& parameters, size_t index, const std::wstring*& dest, - const std::wstring& funcName, bool optional); - -using ExpressionFunction = ExpressionValue (*)(const std::wstring& funcName, const std::vector&); -using ExpressionLabelFunction = ExpressionValue (*)(const std::wstring& funcName, const std::vector> &); - -enum class ExpFuncSafety -{ - // Result may depend entirely on the internal state - Unsafe, - // Result is unsafe in conditional blocks, safe otherwise - ConditionalUnsafe, - // Result is completely independent of the internal state - Safe, -}; - -struct ExpressionFunctionEntry -{ - ExpressionFunction function; - size_t minParams; - size_t maxParams; - ExpFuncSafety safety; -}; - -struct ExpressionLabelFunctionEntry -{ - ExpressionLabelFunction function; - size_t minParams; - size_t maxParams; - ExpFuncSafety safety; -}; - - -using ExpressionFunctionMap = std::map; -using ExpressionLabelFunctionMap = std::map; - -extern const ExpressionFunctionMap expressionFunctions; -extern const ExpressionLabelFunctionMap expressionLabelFunctions; - -// file: Core/SymbolData.h -#include - -class AssemblerFile; - -struct SymDataSymbol -{ - std::wstring name; - int64_t address; - - bool operator<(const SymDataSymbol& other) const - { - return address < other.address; - } -}; - -struct SymDataAddressInfo -{ - int64_t address; - size_t fileIndex; - size_t lineNumber; - - bool operator<(const SymDataAddressInfo& other) const - { - return address < other.address; - } -}; - -struct SymDataFunction -{ - int64_t address; - size_t size; - - bool operator<(const SymDataFunction& other) const - { - return address < other.address; - } -}; - -struct SymDataData -{ - int64_t address; - size_t size; - int type; - - bool operator<(const SymDataData& other) const - { - if (address != other.address) - return address < other.address; - - if (size != other.size) - return size < other.size; - - return type < other.type; - } -}; - -struct SymDataModule -{ - AssemblerFile* file; - std::vector symbols; - std::vector functions; - std::set data; -}; - -struct SymDataModuleInfo -{ - unsigned int crc32; -}; - -class SymbolData -{ -public: - enum DataType { Data8, Data16, Data32, Data64, DataAscii }; - - SymbolData(); - void clear(); - void setNocashSymFileName(const std::wstring& name, int version) { nocashSymFileName = name; nocashSymVersion = version; }; - void write(); - void setEnabled(bool b) { enabled = b; }; - - void addLabel(int64_t address, const std::wstring& name); - void addData(int64_t address, size_t size, DataType type); - void startModule(AssemblerFile* file); - void endModule(AssemblerFile* file); - void startFunction(int64_t address); - void endFunction(int64_t address); -private: - void writeNocashSym(); - size_t addFileName(const std::wstring& fileName); - - std::wstring nocashSymFileName; - bool enabled; - int nocashSymVersion; - - // entry 0 is for data without parent modules - std::vector modules; - std::vector files; - int currentModule; - int currentFunction; -}; - -// file: Util/Util.h -#include -#include - - -typedef std::vector StringList; - -std::wstring convertUtf8ToWString(const char* source); -std::string convertWCharToUtf8(wchar_t character); -;std::string convertWStringToUtf8(const std::wstring& source); - -std::wstring intToHexString(unsigned int value, int digits, bool prefix = false); -std::wstring intToString(unsigned int value, int digits); -bool stringToInt(const std::wstring& line, size_t start, size_t end, int64_t& result); -int32_t getFloatBits(float value); -float bitsToFloat(int32_t value); -int64_t getDoubleBits(double value); - -StringList getStringListFromArray(wchar_t** source, int count); -StringList splitString(const std::wstring& str, const wchar_t delim, bool skipEmpty); - -int64_t fileSize(const std::wstring& fileName); -bool fileExists(const std::wstring& strFilename); -bool copyFile(const std::wstring& existingFile, const std::wstring& newFile); -bool deleteFile(const std::wstring& fileName);; - -std::wstring toWLowercase(const std::string& str); -std::wstring getFileNameFromPath(const std::wstring& path); -size_t replaceAll(std::wstring& str, const wchar_t* oldValue,const std::wstring& newValue); -bool startsWith(const std::wstring& str, const wchar_t* value, size_t stringPos = 0); - -enum class OpenFileMode { ReadBinary, WriteBinary, ReadWriteBinary }; -FILE* openFile(const std::wstring& fileName, OpenFileMode mode); -std::wstring getCurrentDirectory(); -bool changeDirectory(const std::wstring& dir); -bool isAbsolutePath(const std::wstring& path); - -#ifndef ARRAY_SIZE -#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0])) -#endif - -// file: Util/FileClasses.h -#include - -class BinaryFile -{ -public: - enum Mode { Read, Write, ReadWrite }; - - BinaryFile(); - ~BinaryFile(); - - bool open(const std::wstring& fileName, Mode mode); - bool open(Mode mode); - bool isOpen() { return handle != nullptr; }; - bool atEnd() { return isOpen() && mode != Write && ftell(handle) == size_; }; - void setPos(long pos) { if (isOpen()) fseek(handle,pos,SEEK_SET); }; - long pos() { return isOpen() ? ftell(handle) : -1; } - long size() { return size_; }; - void close(); - - void setFileName(const std::wstring& name) { fileName = name; }; - const std::wstring& getFileName() { return fileName; }; - - size_t read(void* dest, size_t length); - size_t write(void* source, size_t length); -private: - FILE* handle; - std::wstring fileName; - Mode mode; - long size_; -}; - -class TextFile -{ -public: - enum Encoding { ASCII, UTF8, UTF16LE, UTF16BE, SJIS, GUESS }; - enum Mode { Read, Write }; - - TextFile(); - ~TextFile(); - void openMemory(const std::wstring& content); - bool open(const std::wstring& fileName, Mode mode, Encoding defaultEncoding = GUESS); - bool open(Mode mode, Encoding defaultEncoding = GUESS); - bool isOpen() { return fromMemory || handle != nullptr; }; - bool atEnd() { return isOpen() && mode == Read && tell() >= size_; }; - long size() { return size_; }; - void close(); - - bool hasGuessedEncoding() { return guessedEncoding; }; - bool isFromMemory() { return fromMemory; } - int getNumLines() { return lineCount; } - - void setFileName(const std::wstring& name) { fileName = name; }; - const std::wstring& getFileName() { return fileName; }; - - wchar_t readCharacter(); - std::wstring readLine(); - StringList readAll(); - void writeCharacter(wchar_t character); - void write(const wchar_t* line); - void write(const std::wstring& line); - void write(const char* value); - void write(const std::string& value); - void writeLine(const wchar_t* line); - void writeLine(const std::wstring& line); - void writeLine(const char* line); - void writeLine(const std::string& line); - void writeLines(StringList& list); - - template - void writeFormat(const wchar_t* text, const Args&... args) - { - std::wstring message = formatString(text,args...); - write(message); - } - - bool hasError() { return errorText.size() != 0 && !errorRetrieved; }; - const std::wstring& getErrorText() { errorRetrieved = true; return errorText; }; -private: - long tell(); - void seek(long pos); - - FILE* handle; - std::wstring fileName; - Encoding encoding; - Mode mode; - bool recursion; - bool guessedEncoding; - long size_; - std::wstring errorText; - bool errorRetrieved; - bool fromMemory; - std::wstring content; - size_t contentPos; - int lineCount; - - std::string buf; - size_t bufPos; - - inline unsigned char bufGetChar() - { - if (buf.size() <= bufPos) - { - bufFillRead(); - if (buf.size() == 0) - return 0; - } - return buf[bufPos++]; - } - inline unsigned short bufGet16LE() - { - char c1 = bufGetChar(); - char c2 = bufGetChar(); - return c1 | (c2 << 8); - } - inline unsigned short bufGet16BE() - { - char c1 = bufGetChar(); - char c2 = bufGetChar(); - return c2 | (c1 << 8); - } - - void bufPut(const void *p, const size_t len); - void bufPut(const char c); - - void bufFillRead(); - void bufDrainWrite(); -}; - -wchar_t sjisToUnicode(unsigned short); -TextFile::Encoding getEncodingFromString(const std::wstring& str); - -// file: Util/ByteArray.h - -#include - -#if defined(_MSC_VER) && !defined(ssize_t) -typedef intptr_t ssize_t; -#endif - -typedef unsigned char byte; - -enum class Endianness { Big, Little }; - -class ByteArray -{ -public: - ByteArray(); - ByteArray(const ByteArray& other); - ByteArray(byte* data, size_t size); - ByteArray(ByteArray&& other); - ~ByteArray(); - ByteArray& operator=(ByteArray& other); - ByteArray& operator=(ByteArray&& other); - - size_t append(const ByteArray& other); - size_t append(void* data, size_t size); - size_t appendByte(byte b) { return append(&b,1); }; - void replaceByte(size_t pos, byte b) { data_[pos] = b; }; - void replaceBytes(size_t pos, byte* data, size_t size); - void reserveBytes(size_t count, byte value = 0); - void alignSize(size_t alignment); - - int getWord(size_t pos, Endianness endianness = Endianness::Little) const - { - if (pos+1 >= this->size()) return -1; - unsigned char* d = (unsigned char*) this->data(); - - if (endianness == Endianness::Little) - { - return d[pos+0] | (d[pos+1] << 8); - } else { - return d[pos+1] | (d[pos+0] << 8); - } - } - - int getDoubleWord(size_t pos, Endianness endianness = Endianness::Little) const - { - if (pos+3 >= this->size()) return -1; - unsigned char* d = (unsigned char*) this->data(); - - if (endianness == Endianness::Little) - { - return d[pos+0] | (d[pos+1] << 8) | (d[pos+2] << 16) | (d[pos+3] << 24); - } else { - return d[pos+3] | (d[pos+2] << 8) | (d[pos+1] << 16) | (d[pos+0] << 24); - } - } - - void replaceWord(size_t pos, unsigned int w, Endianness endianness = Endianness::Little) - { - if (pos+1 >= this->size()) return; - unsigned char* d = (unsigned char*) this->data(); - - if (endianness == Endianness::Little) - { - d[pos+0] = w & 0xFF; - d[pos+1] = (w >> 8) & 0xFF; - } else { - d[pos+0] = (w >> 8) & 0xFF; - d[pos+1] = w & 0xFF; - } - } - - void replaceDoubleWord(size_t pos, unsigned int w, Endianness endianness = Endianness::Little) - { - if (pos+3 >= this->size()) return; - unsigned char* d = (unsigned char*) this->data(); - - if (endianness == Endianness::Little) - { - d[pos+0] = w & 0xFF; - d[pos+1] = (w >> 8) & 0xFF; - d[pos+2] = (w >> 16) & 0xFF; - d[pos+3] = (w >> 24) & 0xFF; - } else { - d[pos+0] = (w >> 24) & 0xFF; - d[pos+1] = (w >> 16) & 0xFF; - d[pos+2] = (w >> 8) & 0xFF; - d[pos+3] = w & 0xFF; - } - } - - byte& operator [](size_t index) - { - return data_[index]; - }; - - const byte& operator [](size_t index) const - { - return data_[index]; - }; - - size_t size() const { return size_; }; - byte* data(size_t pos = 0) const { return &data_[pos]; }; - void clear() { size_ = 0; }; - void resize(size_t newSize); - ByteArray mid(size_t start, ssize_t length = 0); - ByteArray left(size_t length) { return mid(0,length); }; - ByteArray right(size_t length) { return mid(size_-length,length); }; - - static ByteArray fromFile(const std::wstring& fileName, long start = 0, size_t size = 0); - bool toFile(const std::wstring& fileName); -private: - void grow(size_t neededSize); - byte* data_; - size_t size_; - size_t allocatedSize_; -}; - -// file: Core/FileManager.h -#include - -class AssemblerFile -{ -public: - virtual ~AssemblerFile() { }; - - virtual bool open(bool onlyCheck) = 0; - virtual void close() = 0; - virtual bool isOpen() = 0; - virtual bool write(void* data, size_t length) = 0; - virtual int64_t getVirtualAddress() = 0; - virtual int64_t getPhysicalAddress() = 0; - virtual int64_t getHeaderSize() = 0; - virtual bool seekVirtual(int64_t virtualAddress) = 0; - virtual bool seekPhysical(int64_t physicalAddress) = 0; - virtual bool getModuleInfo(SymDataModuleInfo& info) { return false; }; - virtual bool hasFixedVirtualAddress() { return false; }; - virtual void beginSymData(SymbolData& symData) { }; - virtual void endSymData(SymbolData& symData) { }; - virtual const std::wstring& getFileName() = 0; -}; - -class GenericAssemblerFile: public AssemblerFile -{ -public: - GenericAssemblerFile(const std::wstring& fileName, int64_t headerSize, bool overwrite); - GenericAssemblerFile(const std::wstring& fileName, const std::wstring& originalFileName, int64_t headerSize); - - virtual bool open(bool onlyCheck); - virtual void close() { if (handle.isOpen()) handle.close(); }; - virtual bool isOpen() { return handle.isOpen(); }; - virtual bool write(void* data, size_t length); - virtual int64_t getVirtualAddress() { return virtualAddress; }; - virtual int64_t getPhysicalAddress() { return virtualAddress-headerSize; }; - virtual int64_t getHeaderSize() { return headerSize; }; - virtual bool seekVirtual(int64_t virtualAddress); - virtual bool seekPhysical(int64_t physicalAddress); - virtual bool hasFixedVirtualAddress() { return true; }; - - virtual const std::wstring& getFileName() { return fileName; }; - const std::wstring& getOriginalFileName() { return originalName; }; - int64_t getOriginalHeaderSize() { return originalHeaderSize; }; - void setHeaderSize(int64_t size) { headerSize = size; }; - -private: - enum Mode { Open, Create, Copy }; - - Mode mode; - int64_t originalHeaderSize; - int64_t headerSize; - int64_t virtualAddress; - BinaryFile handle; - std::wstring fileName; - std::wstring originalName; -}; - - -class FileManager -{ -public: - FileManager(); - ~FileManager(); - void reset(); - bool openFile(std::shared_ptr file, bool onlyCheck); - void addFile(std::shared_ptr file); - bool hasOpenFile() { return activeFile != nullptr; }; - void closeFile(); - bool write(void* data, size_t length); - bool writeU8(uint8_t data); - bool writeU16(uint16_t data); - bool writeU32(uint32_t data); - bool writeU64(uint64_t data); - int64_t getVirtualAddress(); - int64_t getPhysicalAddress(); - int64_t getHeaderSize(); - bool seekVirtual(int64_t virtualAddress); - bool seekPhysical(int64_t physicalAddress); - bool advanceMemory(size_t bytes); - std::shared_ptr getOpenFile() { return activeFile; }; - void setEndianness(Endianness endianness) { this->endianness = endianness; }; - Endianness getEndianness() { return endianness; } -private: - bool checkActiveFile(); - std::vector> files; - std::shared_ptr activeFile; - Endianness endianness; - Endianness ownEndianness; -}; - -// file: Core/ELF/ElfTypes.h - -/////////////////////// -// ELF Header Constants - -// File type -enum ElfType -{ - ET_NONE =0, - ET_REL =1, - ET_EXEC =2, - ET_DYN =3, - ET_CORE =4, - ET_LOPROC =0xFF00, - ET_HIPROC =0xFFFF, -}; - -// Machine/Architecture -enum ElfMachine -{ - EM_NONE =0, - EM_MIPS =8, - EM_ARM =40, -}; - -// File version -#define EV_NONE 0 -#define EV_CURRENT 1 - -// Identification index -#define EI_MAG0 0 -#define EI_MAG1 1 -#define EI_MAG2 2 -#define EI_MAG3 3 -#define EI_CLASS 4 -#define EI_DATA 5 -#define EI_VERSION 6 -#define EI_PAD 7 -#define EI_NIDENT 16 - -// Magic number -#define ELFMAG0 0x7F -#define ELFMAG1 'E' -#define ELFMAG2 'L' -#define ELFMAG3 'F' - -// File class -#define ELFCLASSNONE 0 -#define ELFCLASS32 1 -#define ELFCLASS64 2 - -// Encoding -#define ELFDATANONE 0 -#define ELFDATA2LSB 1 -#define ELFDATA2MSB 2 - - -///////////////////// -// Sections constants - -// Section indexes -#define SHN_UNDEF 0 -#define SHN_LORESERVE 0xFF00 -#define SHN_LOPROC 0xFF00 -#define SHN_HIPROC 0xFF1F -#define SHN_ABS 0xFFF1 -#define SHN_COMMON 0xFFF2 -#define SHN_HIRESERVE 0xFFFF - -// Section types -#define SHT_NULL 0 -#define SHT_PROGBITS 1 -#define SHT_SYMTAB 2 -#define SHT_STRTAB 3 -#define SHT_RELA 4 -#define SHT_HASH 5 -#define SHT_DYNAMIC 6 -#define SHT_NOTE 7 -#define SHT_NOBITS 8 -#define SHT_REL 9 -#define SHT_SHLIB 10 -#define SHT_DYNSYM 11 -#define SHT_INIT_ARRAY 14 -#define SHT_LOPROC 0x70000000 -#define SHT_HIPROC 0x7FFFFFFF -#define SHT_LOUSER 0x80000000 -#define SHT_HIUSER 0xFFFFFFFF - -// Custom section types -#define SHT_PSPREL 0x700000a0 - - -// Section flags -enum ElfSectionFlags -{ - SHF_WRITE =0x1, - SHF_ALLOC =0x2, - SHF_EXECINSTR =0x4, - SHF_MASKPROC =0xF0000000, -}; - -// Symbol binding -#define STB_LOCAL 0 -#define STB_GLOBAL 1 -#define STB_WEAK 2 -#define STB_LOPROC 13 -#define STB_HIPROC 15 - -// Symbol types -#define STT_NOTYPE 0 -#define STT_OBJECT 1 -#define STT_FUNC 2 -#define STT_SECTION 3 -#define STT_FILE 4 -#define STT_LOPROC 13 -#define STT_HIPROC 15 - -// Undefined name -#define STN_UNDEF 0 - -// Relocation types -#define R_386_NONE 0 -#define R_386_32 1 -#define R_386_PC32 2 -#define R_386_GOT32 3 -#define R_386_PLT32 4 -#define R_386_COPY 5 -#define R_386_GLOB_DAT 6 -#define R_386_JMP_SLOT 7 -#define R_386_RELATIVE 8 -#define R_386_GOTOFF 9 -#define R_386_GOTPC 10 - -// Segment types -#define PT_NULL 0 -#define PT_LOAD 1 -#define PT_DYNAMIC 2 -#define PT_INTERP 3 -#define PT_NOTE 4 -#define PT_SHLIB 5 -#define PT_PHDR 6 -#define PT_LOPROC 0x70000000 -#define PT_HIPROC 0x7FFFFFFF - -// Segment flags -#define PF_X 1 -#define PF_W 2 -#define PF_R 4 - -// Dynamic Array Tags -#define DT_NULL 0 -#define DT_NEEDED 1 -#define DT_PLTRELSZ 2 -#define DT_PLTGOT 3 -#define DT_HASH 4 -#define DT_STRTAB 5 -#define DT_SYMTAB 6 -#define DT_RELA 7 -#define DT_RELASZ 8 -#define DT_RELAENT 9 -#define DT_STRSZ 10 -#define DT_SYMENT 11 -#define DT_INIT 12 -#define DT_FINI 13 -#define DT_SONAME 14 -#define DT_RPATH 15 -#define DT_SYMBOLIC 16 -#define DT_REL 17 -#define DT_RELSZ 18 -#define DT_RELENT 19 -#define DT_PLTREL 20 -#define DT_DEBUG 21 -#define DT_TEXTREL 22 -#define DT_JMPREL 23 -#define DT_LOPROC 0x70000000 -#define DT_HIPROC 0x7FFFFFFF - -typedef unsigned int Elf32_Addr; -typedef unsigned short Elf32_Half; -typedef unsigned int Elf32_Off; -typedef signed int Elf32_Sword; -typedef unsigned int Elf32_Word; - - -// ELF file header -struct Elf32_Ehdr -{ - unsigned char e_ident[EI_NIDENT]; - Elf32_Half e_type; - Elf32_Half e_machine; - Elf32_Word e_version; - Elf32_Addr e_entry; - Elf32_Off e_phoff; - Elf32_Off e_shoff; - Elf32_Word e_flags; - Elf32_Half e_ehsize; - Elf32_Half e_phentsize; - Elf32_Half e_phnum; - Elf32_Half e_shentsize; - Elf32_Half e_shnum; - Elf32_Half e_shstrndx; -}; - -// Section header -struct Elf32_Shdr -{ - Elf32_Word sh_name; - Elf32_Word sh_type; - Elf32_Word sh_flags; - Elf32_Addr sh_addr; - Elf32_Off sh_offset; - Elf32_Word sh_size; - Elf32_Word sh_link; - Elf32_Word sh_info; - Elf32_Word sh_addralign; - Elf32_Word sh_entsize; -}; - -// Segment header -struct Elf32_Phdr -{ - Elf32_Word p_type; - Elf32_Off p_offset; - Elf32_Addr p_vaddr; - Elf32_Addr p_paddr; - Elf32_Word p_filesz; - Elf32_Word p_memsz; - Elf32_Word p_flags; - Elf32_Word p_align; -}; - -// Symbol table entry -struct Elf32_Sym -{ - Elf32_Word st_name; - Elf32_Addr st_value; - Elf32_Word st_size; - unsigned char st_info; - unsigned char st_other; - Elf32_Half st_shndx; -}; - -#define ELF32_ST_BIND(i) ((i)>>4) -#define ELF32_ST_TYPE(i) ((i)&0xf) -#define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) - -// Relocation entries -struct Elf32_Rel -{ - Elf32_Addr r_offset; - Elf32_Word r_info; - - unsigned char getType() - { - return r_info & 0xFF; - } - - Elf32_Word getSymbolNum() - { - return r_info >> 8; - } -}; - -struct Elf32_Rela -{ - Elf32_Addr r_offset; - Elf32_Word r_info; - Elf32_Sword r_addend; -}; - -#define ELF32_R_SYM(i) ((i)>>8) -#define ELF32_R_TYPE(i) ((unsigned char)(i)) -#define ELF32_R_INFO(s,t) (((s)<<8 )+(unsigned char)(t)) - -// file: Core/ELF/ElfFile.h - -#include - -enum ElfPart { ELFPART_SEGMENTTABLE, ELFPART_SECTIONTABLE, ELFPART_SEGMENTS, ELFPART_SEGMENTLESSSECTIONS }; - -class ElfSegment; -class ElfSection; - -class ElfFile -{ -public: - - bool load(const std::wstring&fileName, bool sort); - bool load(ByteArray& data, bool sort); - void save(const std::wstring&fileName); - - Elf32_Half getType() { return fileHeader.e_type; }; - Elf32_Half getMachine() { return fileHeader.e_machine; }; - Endianness getEndianness() - { - return fileHeader.e_ident[EI_DATA] == ELFDATA2MSB ? Endianness::Big : Endianness::Little; - } - size_t getSegmentCount() { return segments.size(); }; - ElfSegment* getSegment(size_t index) { return segments[index]; }; - - int findSegmentlessSection(const std::string& name); - ElfSection* getSegmentlessSection(size_t index) { return segmentlessSections[index]; }; - size_t getSegmentlessSectionCount() { return segmentlessSections.size(); }; - ByteArray& getFileData() { return fileData; } - - int getSymbolCount(); - bool getSymbol(Elf32_Sym& symbol, size_t index); - const char* getStrTableString(size_t pos); -private: - void loadElfHeader(); - void writeHeader(ByteArray& data, int pos, Endianness endianness); - void loadProgramHeader(Elf32_Phdr& header, ByteArray& data, int pos); - void loadSectionHeader(Elf32_Shdr& header, ByteArray& data, int pos); - void loadSectionNames(); - void determinePartOrder(); - - Elf32_Ehdr fileHeader; - std::vector segments; - std::vector sections; - std::vector segmentlessSections; - ByteArray fileData; - ElfPart partsOrder[4]; - - ElfSection* symTab; - ElfSection* strTab; -}; - - -class ElfSection -{ -public: - ElfSection(Elf32_Shdr header); - void setName(std::string& name) { this->name = name; }; - const std::string& getName() { return name; }; - void setData(ByteArray& data) { this->data = data; }; - void setOwner(ElfSegment* segment); - bool hasOwner() { return owner != nullptr; }; - void writeHeader(ByteArray& data, int pos, Endianness endianness); - void writeData(ByteArray& output); - void setOffsetBase(int base); - ByteArray& getData() { return data; }; - - Elf32_Word getType() { return header.sh_type; }; - Elf32_Off getOffset() { return header.sh_offset; }; - Elf32_Word getSize() { return header.sh_size; }; - Elf32_Word getNameOffset() { return header.sh_name; }; - Elf32_Word getAlignment() { return header.sh_addralign; }; - Elf32_Addr getAddress() { return header.sh_addr; }; - Elf32_Half getInfo() { return header.sh_info; }; - Elf32_Word getFlags() { return header.sh_flags; }; -private: - Elf32_Shdr header; - std::string name; - ByteArray data; - ElfSegment* owner; -}; - -class ElfSegment -{ -public: - ElfSegment(Elf32_Phdr header, ByteArray& segmentData); - bool isSectionPartOf(ElfSection* section); - void addSection(ElfSection* section); - Elf32_Off getOffset() { return header.p_offset; }; - Elf32_Word getPhysSize() { return header.p_filesz; }; - Elf32_Word getType() { return header.p_type; }; - Elf32_Addr getVirtualAddress() { return header.p_vaddr; }; - size_t getSectionCount() { return sections.size(); }; - void writeHeader(ByteArray& data, int pos, Endianness endianness); - void writeData(ByteArray& output); - void splitSections(); - - int findSection(const std::string& name); - ElfSection* getSection(size_t index) { return sections[index]; }; - void writeToData(size_t offset, void* data, size_t size); - void sortSections(); -private: - Elf32_Phdr header; - ByteArray data; - std::vector sections; - ElfSection* paddrSection; -}; - -struct RelocationData -{ - int64_t opcodeOffset; - int64_t relocationBase; - uint32_t opcode; - - int64_t symbolAddress; - int targetSymbolType; - int targetSymbolInfo; -}; - -// file: Core/ELF/ElfRelocator.h - -struct ElfRelocatorCtor -{ - std::wstring symbolName; - size_t size; -}; - -struct RelocationAction -{ - RelocationAction(int64_t offset, uint32_t newValue) : offset(offset), newValue(newValue) {} - int64_t offset; - uint32_t newValue; -}; - -class CAssemblerCommand; -class Parser; - -class IElfRelocator -{ -public: - virtual ~IElfRelocator() {}; - virtual int expectedMachine() const = 0; - virtual bool isDummyRelocationType(int type) const { return false; } - virtual bool relocateOpcode(int type, const RelocationData& data, std::vector& actions, std::vector& errors) = 0; - virtual bool finish(std::vector& actions, std::vector& errors) { return true; } - virtual void setSymbolAddress(RelocationData& data, int64_t symbolAddress, int symbolType) = 0; - - virtual std::unique_ptr generateCtorStub(std::vector& ctors) { return nullptr; } -}; - - -class Label; - -struct ElfRelocatorSection -{ - ElfSection* section; - size_t index; - ElfSection* relSection; - std::shared_ptr