commit 0194ae131582302316cdf74cdba241810896c592 Author: Phantop Date: Sun Dec 6 11:53:00 2020 -0500 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a9299ca --- /dev/null +++ b/.gitattributes @@ -0,0 +1,13 @@ +# Automatically normalize line endings. +* text=auto + +# MSVC files have to be CRLF +*.vcproj text eol=crlf +*.sln text eol=crlf + +# Do not change external files +external/** -text +DoConfig/fltk/** -text + +# TSC files are not text, but 'git diff' likes to think they are +*.tsc binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a1b2da --- /dev/null +++ b/.gitignore @@ -0,0 +1,143 @@ +# Exclude obj directory (object files for Makefile build) +/obj + +# Exclude the (recommended) CMake build directory +/build* + +# Exclude game directories +/game_english +/game_japanese +/game_spanish +# Exclude executables +/game_english/CSE2_debug.exe +/game_english/DoConfig_debug.exe +/game_english/CSE2.exe +/game_english/DoConfig.exe +/game_english/CSE2_debug +/game_english/DoConfig_debug +/game_english/CSE2 +/game_english/DoConfig +/game_english/CSE2_debug.rpx +/game_english/CSE2.rpx +/game_english/CSE2.3dsx +/game_english/\!CSE2 +/game_japanese/CSE2_debug.exe +/game_japanese/DoConfig_debug.exe +/game_japanese/CSE2.exe +/game_japanese/DoConfig.exe +/game_japanese/CSE2_debug +/game_japanese/DoConfig_debug +/game_japanese/CSE2 +/game_japanese/DoConfig +/game_japanese/CSE2_debug.rpx +/game_japanese/CSE2.rpx +/game_japanese/CSE2.3dsx +/game_japanese/\!CSE2 + +# Exclude MSVC debug data +/game_english/CSE2_debug.ilk +/game_english/CSE2_debug.pdb +/game_english/DoConfig_debug.ilk +/game_english/DoConfig_debug.pdb +/game_english/CSE2.ilk +/game_english/CSE2.pdb +/game_english/DoConfig.ilk +/game_english/DoConfig.pdb +/game_japanese/CSE2_debug.ilk +/game_japanese/CSE2_debug.pdb +/game_japanese/DoConfig_debug.ilk +/game_japanese/DoConfig_debug.pdb +/game_japanese/CSE2.ilk +/game_japanese/CSE2.pdb +/game_japanese/DoConfig.ilk +/game_japanese/DoConfig.pdb + +# Exclude misc. MSVC junk +/.vs +/out +/CMakeSettings.json + +# Exclude save data +/game_english/Config.dat +/game_english/Profile.dat +/game_english/290.rec +/game_english/window.rect +/game_japanese/Config.dat +/game_japanese/Profile.dat +/game_japanese/290.rec +/game_japanese/window.rect + +# Exclude configuration files +/game_english/fps +/game_english/mute +/game_english/save +/game_english/s_reverse +/game_japanese/fps +/game_japanese/mute +/game_japanese/save +/game_japanese/s_reverse + +# Exclude error logs +/game_english/error.log +/game_japanese/error.log + +################### +# Accurate branch # +################### + +# Exclude devilution-comparer assembly output +/devilution/orig.asm +/devilution/compare.asm + +# Exclude MSVC IntelliSense database +/vs2003/CSE2.ncb + +# Exclude MSVC Solution User Options file +/vs2003/CSE2.suo + +# Exclude MSVC build folders +/vs2003/Debug +/vs2003/Release +/vs2003/Debug (Japanese) +/vs2003/Release (Japanese) + +################### +# Portable branch # +################### + +# Exclude converted resource files +/src/Resource + +######################## +# Enhanced-lite branch # +######################## + +################### +# Enhanced branch # +################### + +#### +# Tweaks Branck +#### + +# Exclude build data +/build/ +/build_linux/ + +# Exclude wine stuff +winehq.key + +# Exclude Compilation info +CmakeCache.txt +/CmakeFiles/ + +# Exclude zip files +game_english/*.zip +game_english/error.log + +# Exclude Visual Studio Code stuff +/.vscode/ + +# Exclude soundtracks +*.ogg +bannertool \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..87a1c55 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,139 @@ +# Optimize git clone +git: + depth: 5 + +# Bionic is the most recent version of Ubuntu I can get to work properly +dist: bionic + +# Enable C++ language support +language: cpp + +osx_image: xcode11.3 + +compiler: + - gcc + - clang + +os: + - linux + - osx + +addons: + apt: + sources: + - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-9 main' + key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key' + - sourceline: 'ppa:ubuntu-toolchain-r/test' + packages: + - make + - cmake + - gcc-9 + - g++-9 + - clang-9 + - libsdl1.2-dev + - libsdl2-dev + - libglfw3-dev + - libfreetype6-dev + homebrew: + packages: + - make + - cmake + - gcc@9 + - llvm@9 + - sdl + - sdl2 + - glfw + - freetype + +env: + - PLATFORM=SDL2 AUDIO=SDL2 RENDERER=Software + - PLATFORM=SDL2 AUDIO=SDL2 RENDERER=SDLTexture + - PLATFORM=SDL2 AUDIO=SDL2 RENDERER=OpenGL3 + - PLATFORM=SDL2 AUDIO=SDL2 RENDERER=OpenGLES2 + - PLATFORM=SDL1 AUDIO=SDL1 RENDERER=Software + - PLATFORM=SDL1 AUDIO=SDL1 RENDERER=OpenGL3 + - PLATFORM=GLFW3 AUDIO=miniaudio RENDERER=Software + - PLATFORM=GLFW3 AUDIO=miniaudio RENDERER=OpenGL3 + - PLATFORM=GLFW3 AUDIO=miniaudio RENDERER=OpenGLES2 + - PLATFORM=Null AUDIO=Null RENDERER=Software + +jobs: + exclude: + # macOS doesn't support OpenGLES2, apparently + - os: osx + env: PLATFORM=SDL2 AUDIO=SDL2 RENDERER=OpenGLES2 + - os: osx + env: PLATFORM=GLFW3 AUDIO=miniaudio RENDERER=OpenGLES2 + # GCC is mysteriously broken when trying to parse macOS headers for miniaudio + - os: osx + compiler: gcc + env: PLATFORM=GLFW3 AUDIO=miniaudio RENDERER=OpenGL3 + - os: osx + compiler: gcc + env: PLATFORM=GLFW3 AUDIO=miniaudio RENDERER=Software + +before_install: + # Set URL for Discord send script + - DISCORD_SEND_SCRIPT_URL=https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh + - DISCORD_SEND_SCRIPT_FILENAME=discordSendNotification.sh + + # Display available disk space + - df -h + + # Display Travis OS name + - echo $TRAVIS_OS_NAME + + # The following Homebrew packages aren't linked by default, and need to be prepended to the path explicitly. + - if [ "$TRAVIS_OS_NAME" = "osx" ]; then + export PATH="$(brew --prefix llvm)/bin:$PATH"; + fi + + # /usr/bin/gcc points to an older compiler on both Linux and macOS. + - if [ "$CXX" = "g++" ]; then export CXX="g++-9" CC="gcc-9"; fi + + # /usr/bin/clang points to an older compiler on both Linux and macOS. + # + # Homebrew's llvm package doesn't ship a versioned clang++ binary, so the values + # below don't work on macOS. Fortunately, the path change above makes the + # default values (clang and clang++) resolve to the correct compiler on macOS. + - if [ "$TRAVIS_OS_NAME" = "linux" ]; then + if [ "$CXX" = "clang++" ]; then export CXX="clang++-9" CC="clang-9"; fi; + fi + + # Display compilers/cmake name/version + - echo ${CC} + - echo ${CXX} + - ${CC} --version + - ${CXX} --version + - cmake --version + +install: + # Get number of cores (or 2 by default if somehow none of these are available somehow) + - JOBS=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null || echo 2) + - echo $JOBS + + # Recommanded build directory + - CMAKE_BUILD_DIR=build + +before_script: + # Make build directory and generate CMake build files + - mkdir -p ${CMAKE_BUILD_DIR} && cd ${CMAKE_BUILD_DIR} + - cmake .. -DCMAKE_BUILD_TYPE=Release -DFIX_BUGS=ON -DBACKEND_PLATFORM=$PLATFORM -DBACKEND_AUDIO=$AUDIO -DBACKEND_RENDERER=$RENDERER -DCMAKE_C_FLAGS="-Wall -Wextra -pedantic" -DCMAKE_CXX_FLAGS="-Wall -Wextra -pedantic" + - cd .. + +script: + - cd ${CMAKE_BUILD_DIR} + - cmake --build . --config Release --parallel $JOBS + - cd .. + +after_success: + # Send success notification to Discord through DISCORD_WEBHOOK_URL + - travis_retry wget ${DISCORD_SEND_SCRIPT_URL} -O ${DISCORD_SEND_SCRIPT_FILENAME} + - chmod +x ${DISCORD_SEND_SCRIPT_FILENAME} + - ./${DISCORD_SEND_SCRIPT_FILENAME} success $DISCORD_WEBHOOK_URL + +after_failure: + # Send failure notification to Discord through DISCORD_WEBHOOK_URL + - travis_retry wget ${DISCORD_SEND_SCRIPT_URL} -O ${DISCORD_SEND_SCRIPT_FILENAME} + - chmod +x ${DISCORD_SEND_SCRIPT_FILENAME} + - ./${DISCORD_SEND_SCRIPT_FILENAME} failure $DISCORD_WEBHOOK_URL diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ddcec8c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,733 @@ +cmake_minimum_required(VERSION 3.12) + + +############# +# Constants # +############# + +set(ASSETS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/assets") + + +########### +# Options # +########### + +set(GAMELANG "EN" CACHE STRING "Compile the game for a different language instead of using the unofficial Aeon Genesis English translation. Alternatives are 'JP', or 'ES'" ) +option(FIX_BUGS "Fix various bugs in the game" ON) +option(FIX_MAJOR_BUGS "Fix bugs that invoke undefined behaviour or cause memory leaks" ON) +option(DEBUG_SAVE "Re-enable the ability to drag-and-drop save files onto the window" OFF) +option(LANCZOS_RESAMPLER "Use Lanczos filtering for audio resampling instead of linear-interpolation (Lanczos is more performance-intensive, but higher quality)" OFF) +option(FREETYPE_FONTS "Use FreeType2 to render fonts" OFF) +option(EXTRA_SOUND_FORMATS "Adds support for extra music/SFX formats using the clownaudio library (use the CLOWNAUDIO options to toggle specific formats)" ON) + +set(BACKEND_RENDERER "SDLTexture" CACHE STRING "Which renderer the game should use: 'OpenGL3' for an OpenGL 3.2 renderer, 'OpenGLES2' for an OpenGL ES 2.0 renderer, 'SDLTexture' for SDL2's hardware-accelerated Texture API, 'Wii U' for the Wii U's hardware-accelerated GX2 API, '3DS' for the 3DS's hardware accelerated Citro2D/Citro3D API, or 'Software' for a handwritten software renderer") +set(BACKEND_AUDIO "SDL2" CACHE STRING "Which audio backend the game should use: 'SDL2', 'SDL1', 'miniaudio', 'WiiU-Hardware', 'WiiU-Software', '3DS-Hardware', '3DS-Software', or 'Null'") +set(BACKEND_PLATFORM "SDL2" CACHE STRING "Which platform backend the game should use: 'SDL2', 'SDL1', 'GLFW3', 'WiiU', '3DS', or 'Null'") + +option(LTO "Enable link-time optimisation" OFF) +option(PKG_CONFIG_STATIC_LIBS "On platforms with pkg-config, static-link the dependencies (good for Windows builds, so you don't need to bundle DLL files)" OFF) +option(MSVC_LINK_STATIC_RUNTIME "Link the static MSVC runtime library (Visual Studio only)" OFF) + +option(FORCE_LOCAL_LIBS "Compile the built-in versions of SDL2, GLFW3, and FreeType instead of using the system-provided ones" OFF) + + +######### +# Setup # +######### + +project(CSE2 LANGUAGES C CXX) + +add_executable(CSE2 WIN32 + "${ASSETS_DIRECTORY}/resources/CSE2.rc" + "${ASSETS_DIRECTORY}/resources/CSE2.manifest" + "src/ArmsItem.cpp" + "src/ArmsItem.h" + "src/Back.cpp" + "src/Back.h" + "src/Bitmap.cpp" + "src/Bitmap.h" + "src/Boss.cpp" + "src/Boss.h" + "src/BossAlmo1.cpp" + "src/BossAlmo1.h" + "src/BossAlmo2.cpp" + "src/BossAlmo2.h" + "src/BossBallos.cpp" + "src/BossBallos.h" + "src/BossFrog.cpp" + "src/BossFrog.h" + "src/BossIronH.cpp" + "src/BossIronH.h" + "src/BossLife.cpp" + "src/BossLife.h" + "src/BossOhm.cpp" + "src/BossOhm.h" + "src/BossPress.cpp" + "src/BossPress.h" + "src/BossTwinD.cpp" + "src/BossTwinD.h" + "src/BossX.cpp" + "src/BossX.h" + "src/BulHit.cpp" + "src/BulHit.h" + "src/Bullet.cpp" + "src/Bullet.h" + "src/Caret.cpp" + "src/Caret.h" + "src/CommonDefines.h" + "src/Config.cpp" + "src/Config.h" + "src/Draw.cpp" + "src/Draw.h" + "src/Ending.cpp" + "src/Ending.h" + "src/Escape.cpp" + "src/Escape.h" + "src/Fade.cpp" + "src/Fade.h" + "src/File.cpp" + "src/File.h" + "src/Flags.cpp" + "src/Flags.h" + "src/Flash.cpp" + "src/Flash.h" + "src/Font.cpp" + "src/Font.h" + "src/Frame.cpp" + "src/Frame.h" + "src/Game.cpp" + "src/Game.h" + "src/Generic.cpp" + "src/Generic.h" + "src/GenericLoad.cpp" + "src/GenericLoad.h" + "src/Input.cpp" + "src/Input.h" + "src/KeyControl.cpp" + "src/KeyControl.h" + "src/Main.cpp" + "src/Main.h" + "src/Map.cpp" + "src/Map.h" + "src/MapName.cpp" + "src/MapName.h" + "src/MiniMap.cpp" + "src/MiniMap.h" + "src/MyChar.cpp" + "src/MyChar.h" + "src/MycHit.cpp" + "src/MycHit.h" + "src/MycParam.cpp" + "src/MycParam.h" + "src/NpcAct.h" + "src/NpcAct000.cpp" + "src/NpcAct020.cpp" + "src/NpcAct040.cpp" + "src/NpcAct060.cpp" + "src/NpcAct080.cpp" + "src/NpcAct100.cpp" + "src/NpcAct120.cpp" + "src/NpcAct140.cpp" + "src/NpcAct160.cpp" + "src/NpcAct180.cpp" + "src/NpcAct200.cpp" + "src/NpcAct220.cpp" + "src/NpcAct240.cpp" + "src/NpcAct260.cpp" + "src/NpcAct280.cpp" + "src/NpcAct300.cpp" + "src/NpcAct320.cpp" + "src/NpcAct340.cpp" + "src/NpChar.cpp" + "src/NpChar.h" + "src/NpcHit.cpp" + "src/NpcHit.h" + "src/NpcTbl.cpp" + "src/NpcTbl.h" + "src/Organya.cpp" + "src/Organya.h" + "src/Pause.cpp" + "src/Pause.h" + "src/PixTone.cpp" + "src/PixTone.h" + "src/Profile.cpp" + "src/Profile.h" + "src/Random.cpp" + "src/Random.h" + "src/Resource.cpp" + "src/Resource.h" + "src/SelStage.cpp" + "src/SelStage.h" + "src/Shoot.cpp" + "src/Shoot.h" + "src/Sound.cpp" + "src/Sound.h" + "src/Stage.cpp" + "src/Stage.h" + "src/Star.cpp" + "src/Star.h" + "src/TextScr.cpp" + "src/TextScr.h" + "src/Triangle.cpp" + "src/Triangle.h" + "src/ValueView.cpp" + "src/ValueView.h" + "src/WindowsWrapper.h" + "src/Backends/Audio.h" + "src/Backends/Controller.h" + "src/Backends/Misc.h" + "src/Backends/Rendering.h" +) + +set(RESOURCES +) + +list(APPEND CMAKE_MODULE_PATH + "${CMAKE_SOURCE_DIR}/cmake" +) + + +################### +# Option handling # +################### + +if(GAMELANG MATCHES "JP") + if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/game_japanese") + message(STATUS "Creating game_japanese directory") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/game_japanese") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/res/universal/" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/game_japanese") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/res/jp/" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/game_japanese") + else() + message(STATUS "Detected game_japanese directory") + endif() + set(BUILD_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/game_japanese") + target_compile_definitions(CSE2 PRIVATE JAPANESE) +elseif(GAMELANG MATCHES "ES") + if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/game_spanish") + message(STATUS "Creating game_spanish directory") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/game_spanish") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/res/universal/" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/game_spanish") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/res/es/" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/game_spanish") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/res/font_latin/" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/game_spanish") + else() + message(STATUS "Detected game_spanish directory") + endif() + set(BUILD_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/game_spanish") + target_compile_definitions(CSE2 PRIVATE SPANISH) +else() + if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/game_english") + message(STATUS "Creating game_english directory") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/game_english") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/res/universal/" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/game_english") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/res/en/" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/game_english") + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/res/font_latin/" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/game_english") + else() + message(STATUS "Detected game_english directory") + endif() + set(BUILD_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/game_english") +endif() + +if(FIX_BUGS) + target_compile_definitions(CSE2 PRIVATE FIX_BUGS) +endif() + +if(FIX_BUGS OR FIX_MAJOR_BUGS) + target_compile_definitions(CSE2 PRIVATE FIX_MAJOR_BUGS) +endif() + +if(DEBUG_SAVE) + target_compile_definitions(CSE2 PRIVATE DEBUG_SAVE) +endif() + +if(LANCZOS_RESAMPLER) + target_compile_definitions(CSE2 PRIVATE LANCZOS_RESAMPLER) +endif() + +if(FREETYPE_FONTS) + target_compile_definitions(CSE2 PRIVATE FREETYPE_FONTS) +endif() + +if(PKG_CONFIG_STATIC_LIBS) + target_link_options(CSE2 PRIVATE "-static") +endif() + +if(LTO) + include(CheckIPOSupported) + + check_ipo_supported(RESULT result) + + if(result) + set_target_properties(CSE2 PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() +endif() + +# This is messy as hell, and has been replaced by CMAKE_MSVC_RUNTIME_LIBRARY, +# but that's a very recent CMake addition, so we're still doing it this way for now +if(MSVC AND MSVC_LINK_STATIC_RUNTIME) + # Statically-link the CRT (vcpkg static libs do this) + foreach(flag_var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + if(${flag_var} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + endif() + endforeach() +endif() + +if(BACKEND_RENDERER MATCHES "OpenGL3") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/OpenGL3.cpp") +elseif(BACKEND_RENDERER MATCHES "OpenGLES2") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/OpenGLES2.cpp") +elseif(BACKEND_RENDERER MATCHES "SDLTexture") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/SDLTexture.cpp") +elseif(BACKEND_RENDERER MATCHES "WiiU") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/WiiU.cpp") +elseif(BACKEND_RENDERER MATCHES "3DS") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/3DS.cpp") + target_link_libraries(CSE2 PRIVATE "${CTRU_ROOT}/lib/libcitro2d.a" "${CTRU_ROOT}/lib/libcitro3d.a") +elseif(BACKEND_RENDERER MATCHES "Software") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Software.cpp") +else() + message(FATAL_ERROR "Invalid BACKEND_RENDERER selected") +endif() + +if(BACKEND_AUDIO MATCHES "SDL2") + target_sources(CSE2 PRIVATE + "src/Backends/Audio/SoftwareMixer.cpp" + "src/Backends/Audio/SoftwareMixer/Mixer.cpp" + "src/Backends/Audio/SoftwareMixer/Mixer.h" + "src/Backends/Audio/SoftwareMixer/Backend.h" + "src/Backends/Audio/SoftwareMixer/SDL2.cpp" + ) +elseif(BACKEND_AUDIO MATCHES "SDL1") + target_sources(CSE2 PRIVATE + "src/Backends/Audio/SoftwareMixer.cpp" + "src/Backends/Audio/SoftwareMixer/Mixer.cpp" + "src/Backends/Audio/SoftwareMixer/Mixer.h" + "src/Backends/Audio/SoftwareMixer/Backend.h" + "src/Backends/Audio/SoftwareMixer/SDL1.cpp" + ) +elseif(BACKEND_AUDIO MATCHES "miniaudio") + target_sources(CSE2 PRIVATE + "src/Backends/Audio/SoftwareMixer.cpp" + "src/Backends/Audio/SoftwareMixer/Mixer.cpp" + "src/Backends/Audio/SoftwareMixer/Mixer.h" + "src/Backends/Audio/SoftwareMixer/Backend.h" + "src/Backends/Audio/SoftwareMixer/miniaudio.cpp" + ) + + # Link libdl, libm, and libpthread + include(CheckLibraryExists) + + check_library_exists(m pow "" LIBM) + if(LIBM) + target_link_libraries(CSE2 PRIVATE m) + endif() + + check_library_exists(pthread pthread_create "" LIBPTHREAD) + if(LIBPTHREAD) + target_link_libraries(CSE2 PRIVATE pthread) + endif() + + target_link_libraries(CSE2 PRIVATE ${CMAKE_DL_LIBS}) +elseif(BACKEND_AUDIO MATCHES "WiiU-Hardware") + target_sources(CSE2 PRIVATE + "src/Backends/Audio/WiiU.cpp" + ) +elseif(BACKEND_AUDIO MATCHES "WiiU-Software") + target_sources(CSE2 PRIVATE + "src/Backends/Audio/SoftwareMixer.cpp" + "src/Backends/Audio/SoftwareMixer/Mixer.cpp" + "src/Backends/Audio/SoftwareMixer/Mixer.h" + "src/Backends/Audio/SoftwareMixer/Backend.h" + "src/Backends/Audio/SoftwareMixer/WiiU.cpp" + ) +elseif(BACKEND_AUDIO MATCHES "3DS-Hardware") + target_sources(CSE2 PRIVATE + "src/Backends/Audio/3DS.cpp" + ) +elseif(BACKEND_AUDIO MATCHES "3DS-Software") + target_sources(CSE2 PRIVATE + "src/Backends/Audio/SoftwareMixer.cpp" + "src/Backends/Audio/SoftwareMixer/Mixer.cpp" + "src/Backends/Audio/SoftwareMixer/Mixer.h" + "src/Backends/Audio/SoftwareMixer/Backend.h" + "src/Backends/Audio/SoftwareMixer/3DS.cpp" + ) +elseif(BACKEND_AUDIO MATCHES "Null") + target_sources(CSE2 PRIVATE + "src/Backends/Audio/Null.cpp" + ) +else() + message(FATAL_ERROR "Invalid BACKEND_AUDIO selected") +endif() + +if(BACKEND_PLATFORM MATCHES "SDL2") + target_sources(CSE2 PRIVATE + "src/Backends/Controller/SDL.cpp" + "src/Backends/Platform/SDL2.cpp" + "src/Backends/Shared/SDL.h" + ) +elseif(BACKEND_PLATFORM MATCHES "SDL1") + target_sources(CSE2 PRIVATE + "src/Backends/Controller/SDL.cpp" + "src/Backends/Platform/SDL1.cpp" + "src/Backends/Shared/SDL.h" + ) +elseif(BACKEND_PLATFORM MATCHES "GLFW3") + target_sources(CSE2 PRIVATE + "src/Backends/Controller/GLFW3.cpp" + "src/Backends/Platform/GLFW3.cpp" + "src/Backends/Shared/GLFW3.h" + ) +elseif(BACKEND_PLATFORM MATCHES "WiiU") + target_sources(CSE2 PRIVATE + "src/Backends/Controller/WiiU.cpp" + "src/Backends/Platform/WiiU.cpp" + ) +elseif(BACKEND_PLATFORM MATCHES "3DS") + target_sources(CSE2 PRIVATE + "src/Backends/Controller/3DS.cpp" + "src/Backends/Platform/3DS.cpp" + ) +elseif(BACKEND_PLATFORM MATCHES "Null") + target_sources(CSE2 PRIVATE + "src/Backends/Controller/Null.cpp" + "src/Backends/Platform/Null.cpp" + ) +endif() + +if(BACKEND_PLATFORM MATCHES "SDL2" AND BACKEND_RENDERER MATCHES "OpenGL3") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/OpenGL3/SDL2.cpp") +elseif(BACKEND_PLATFORM MATCHES "SDL2" AND BACKEND_RENDERER MATCHES "OpenGLES2") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/OpenGLES2/SDL2.cpp") +elseif(BACKEND_PLATFORM MATCHES "SDL2" AND BACKEND_RENDERER MATCHES "SDLTexture") +elseif(BACKEND_PLATFORM MATCHES "SDL2" AND BACKEND_RENDERER MATCHES "Software") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/Software/SDL2.cpp") +elseif(BACKEND_PLATFORM MATCHES "SDL1" AND BACKEND_RENDERER MATCHES "OpenGL3") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/OpenGL3/SDL1.cpp") +elseif(BACKEND_PLATFORM MATCHES "SDL1" AND BACKEND_RENDERER MATCHES "Software") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/Software/SDL1.cpp") +elseif(BACKEND_PLATFORM MATCHES "GLFW3" AND BACKEND_RENDERER MATCHES "OpenGL3") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/OpenGL3/GLFW3.cpp") +elseif(BACKEND_PLATFORM MATCHES "GLFW3" AND BACKEND_RENDERER MATCHES "OpenGLES2") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/OpenGLES2/GLFW3.cpp") +elseif(BACKEND_PLATFORM MATCHES "GLFW3" AND BACKEND_RENDERER MATCHES "Software") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/Software/GLFW3.cpp") +elseif(BACKEND_PLATFORM MATCHES "WiiU" AND BACKEND_RENDERER MATCHES "WiiU") +elseif(BACKEND_PLATFORM MATCHES "WiiU" AND BACKEND_RENDERER MATCHES "Software") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/Software/WiiU.cpp") +elseif(BACKEND_PLATFORM MATCHES "3DS" AND BACKEND_RENDERER MATCHES "3DS") +elseif(BACKEND_PLATFORM MATCHES "3DS" AND BACKEND_RENDERER MATCHES "Software") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/Software/3DS.cpp") +elseif(BACKEND_PLATFORM MATCHES "Null" AND BACKEND_RENDERER MATCHES "Software") + target_sources(CSE2 PRIVATE "src/Backends/Rendering/Window/Software/Null.cpp") +else() + message(FATAL_ERROR "Invalid BACKEND_PLATFORM/BACKEND_RENDERER combination") +endif() + +if(EXTRA_SOUND_FORMATS) + target_sources(CSE2 PRIVATE + "src/ExtraSoundFormats.cpp" + "src/ExtraSoundFormats.h" + ) + + target_compile_definitions(CSE2 PRIVATE EXTRA_SOUND_FORMATS) + + # Link clownaudio + set(CLOWNAUDIO_MIXER_ONLY ON CACHE INTERNAL "") # Disable clownaudio's playback capabilities (we use CSE2's instead) + set(CLOWNAUDIO_DR_FLAC OFF CACHE BOOL "") # Disable FLAC support by default + set(CLOWNAUDIO_DR_MP3 OFF CACHE BOOL "") # Disable MP3 support by default + set(CLOWNAUDIO_DR_WAV OFF CACHE BOOL "") # Disable WAV support by default + add_subdirectory("external/clownaudio" EXCLUDE_FROM_ALL) + target_link_libraries(CSE2 PRIVATE clownaudio) +endif() + + +########## +# Tweaks # +########## + +# Make some tweaks if we're using MSVC +if(MSVC) + # Disable warnings that normally fire up on MSVC when using "unsafe" functions instead of using MSVC's "safe" _s functions + target_compile_definitions(CSE2 PRIVATE _CRT_SECURE_NO_WARNINGS) + + # Make it so source files are recognized as UTF-8 by MSVC + target_compile_options(CSE2 PRIVATE "/utf-8") + + # Use `main` instead of `WinMain` + set_target_properties(CSE2 PROPERTIES LINK_FLAGS "/ENTRY:mainCRTStartup") +endif() + +# On Windows, we use native icons instead +if(NOT WIN32) + list(APPEND RESOURCES "ICON/ICON_MINI.png") +endif() + + +################## +# Misc. settings # +################## + +# Force strict C99 +set_target_properties(CSE2 PROPERTIES + C_STANDARD 99 + C_STANDARD_REQUIRED ON + C_EXTENSIONS OFF +) + +if(NOT BACKEND_PLATFORM MATCHES "WiiU" AND NOT BACKEND_PLATFORM MATCHES "3DS") + # Force strict C++98 + set_target_properties(CSE2 PROPERTIES + CXX_STANDARD 98 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS OFF + ) +endif() + +# Name debug builds "CSE2_debug", to distinguish them +set_target_properties(CSE2 PROPERTIES DEBUG_OUTPUT_NAME "CSE2_debug") + +# Send executable to the build_en/build_jp directory +set_target_properties(CSE2 PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${BUILD_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${BUILD_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${BUILD_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${BUILD_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${BUILD_DIRECTORY} +) + + +################ +# Dependencies # +################ + +if(NOT FORCE_LOCAL_LIBS) + find_package(PkgConfig QUIET) +endif() + +if(BACKEND_PLATFORM MATCHES "GLFW3") + if(NOT FORCE_LOCAL_LIBS) + find_package(glfw3) + + if (PKG_CONFIG_FOUND) + pkg_check_modules(glfw3 QUIET IMPORTED_TARGET glfw3) + endif() + endif() + + if(TARGET PkgConfig::glfw3) + # pkg-config + if (PKG_CONFIG_STATIC_LIBS) + message(STATUS "Using system GLFW3 (pkg-config, static)") + target_compile_options(CSE2 PRIVATE ${glfw3_STATIC_CFLAGS}) + target_link_libraries(CSE2 PRIVATE ${glfw3_STATIC_LDFLAGS}) + else() + message(STATUS "Using system GLFW3 (pkg-config, dynamic)") + target_compile_options(CSE2 PRIVATE ${glfw3_CFLAGS}) + target_link_libraries(CSE2 PRIVATE ${glfw3_LDFLAGS}) + endif() + elseif(TARGET glfw) + # CMake + message(STATUS "Using system GLFW3 (CMake)") + target_link_libraries(CSE2 PRIVATE glfw) + else() + # Compile it ourselves + message(STATUS "Using local GLFW3") + set(GLFW_BUILD_EXAMPLES OFF CACHE INTERNAL "" FORCE) + set(GLFW_BUILD_TESTS OFF CACHE INTERNAL "" FORCE) + set(GLFW_BUILD_DOCS OFF CACHE INTERNAL "" FORCE) + set(GLFW_INSTALL OFF CACHE INTERNAL "" FORCE) + add_subdirectory("external/glfw" EXCLUDE_FROM_ALL) + target_link_libraries(CSE2 PRIVATE glfw) + endif() +endif() + +if(BACKEND_PLATFORM MATCHES "SDL2" OR BACKEND_AUDIO MATCHES "SDL2") + if(NOT FORCE_LOCAL_LIBS) + find_package(SDL2) + + if (PKG_CONFIG_FOUND) + pkg_check_modules(sdl2 QUIET IMPORTED_TARGET sdl2) + endif() + endif() + + if(TARGET PkgConfig::sdl2) + # pkg-config + if (PKG_CONFIG_STATIC_LIBS) + message(STATUS "Using system SDL2 (pkg-config, static)") + # Do not link libSDL2main.a, otherwise we get weird linker errors about SDL_main not being found. + # We don't need SDL2's WinMain->main shim anyway, so we can just ignore it. + list(REMOVE_ITEM sdl2_STATIC_CFLAGS "-Dmain=SDL_main") + list(REMOVE_ITEM sdl2_STATIC_LDFLAGS "-lSDL2main") + target_compile_options(CSE2 PRIVATE ${sdl2_STATIC_CFLAGS}) + target_link_libraries(CSE2 PRIVATE ${sdl2_STATIC_LDFLAGS}) + else() + message(STATUS "Using system SDL2 (pkg-config, dynamic)") + # Do not link libSDL2main.a, otherwise we get weird linker errors about SDL_main not being found. + # We don't need SDL2's WinMain->main shim anyway, so we can just ignore it. + list(REMOVE_ITEM sdl2_CFLAGS "-Dmain=SDL_main") + list(REMOVE_ITEM sdl2_LDFLAGS "-lSDL2main") + target_compile_options(CSE2 PRIVATE ${sdl2_CFLAGS}) + target_link_libraries(CSE2 PRIVATE ${sdl2_LDFLAGS}) + endif() + elseif(TARGET SDL2::SDL2) + # CMake-generated config (Arch, vcpkg, Raspbian) + message(STATUS "Using system SDL2 (CMake, dynamic)") + target_link_libraries(CSE2 PRIVATE SDL2::SDL2) + elseif(TARGET SDL2::SDL2-static) + # CMake-generated config (Arch, vcpkg, Raspbian) + message(STATUS "Using system SDL2 (CMake, static)") + target_link_libraries(CSE2 PRIVATE SDL2::SDL2-static) + elseif(SDL2_FOUND) + # Autotools-generated config (MSYS2) + message(STATUS "Using system SDL2 (Autotools)") + target_include_directories(CSE2 PRIVATE ${SDL2_INCLUDE_DIRS}) + target_link_libraries(CSE2 PRIVATE ${SDL2_LIBRARIES}) + else() + # Compile it ourselves + message(STATUS "Using local SDL2") + set(SDL_SHARED_ENABLED_BY_DEFAULT OFF) + if(MSVC) + set(LIBC ON CACHE INTERNAL "" FORCE) # Needed to prevent possible 'symbol already defined' errors + endif() + add_subdirectory("external/SDL2" EXCLUDE_FROM_ALL) + target_link_libraries(CSE2 PRIVATE SDL2-static) + endif() +endif() + +if(BACKEND_PLATFORM MATCHES "SDL1" OR BACKEND_AUDIO MATCHES "SDL1") + if(BACKEND_PLATFORM MATCHES "SDL2" OR BACKEND_AUDIO MATCHES "SDL2") + message(FATAL_ERROR "SDL1 and SDL2 cannot be used simultaneously!") + endif() + + find_package(SDL 1.2.15) + + if (PKG_CONFIG_FOUND) + pkg_check_modules(sdl QUIET IMPORTED_TARGET sdl) + endif() + + if(TARGET PkgConfig::sdl) + # pkg-config + if (PKG_CONFIG_STATIC_LIBS) + message(STATUS "Using system SDL1 (pkg-config, static)") + # Do not link libSDLmain.a, otherwise we get weird linker errors about SDL_main not being found. + # We don't need SDL's WinMain->main shim anyway, so we can just ignore it. + list(REMOVE_ITEM sdl_STATIC_CFLAGS "-Dmain=SDL_main") + list(REMOVE_ITEM sdl_STATIC_LDFLAGS "-lSDLmain") + target_compile_options(CSE2 PRIVATE ${sdl_STATIC_CFLAGS}) + target_link_libraries(CSE2 PRIVATE ${sdl_STATIC_LDFLAGS}) + else() + message(STATUS "Using system SDL1 (pkg-config, dynamic)") + # Do not link libSDLmain.a, otherwise we get weird linker errors about SDL_main not being found. + # We don't need SDL's WinMain->main shim anyway, so we can just ignore it. + list(REMOVE_ITEM sdl_CFLAGS "-Dmain=SDL_main") + list(REMOVE_ITEM sdl_LDFLAGS "-lSDLmain") + target_compile_options(CSE2 PRIVATE ${sdl_CFLAGS}) + target_link_libraries(CSE2 PRIVATE ${sdl_LDFLAGS}) + endif() + elseif(SDL_FOUND) + message(STATUS "Using system SDL1 (CMake)") + target_include_directories(CSE2 PRIVATE ${SDL_INCLUDE_DIR}) + target_link_libraries(CSE2 PRIVATE ${SDL_LIBRARY}) + else() + message(FATAL_ERROR "SDL1 not installed!") + endif() +endif() + +if(FREETYPE_FONTS) + if(NOT FORCE_LOCAL_LIBS) + find_package(Freetype) + + if (PKG_CONFIG_FOUND) + pkg_check_modules(freetype2 QUIET IMPORTED_TARGET freetype2) + endif() + endif() + + if(TARGET PkgConfig::freetype2) + # pkg-config + if (PKG_CONFIG_STATIC_LIBS) + message(STATUS "Using system FreeType (pkg-config, static)") + target_compile_options(CSE2 PRIVATE ${freetype2_STATIC_CFLAGS}) + target_link_libraries(CSE2 PRIVATE ${freetype2_STATIC_LDFLAGS}) + else() + message(STATUS "Using system FreeType (pkg-config, dynamic)") + target_compile_options(CSE2 PRIVATE ${freetype2_CFLAGS}) + target_link_libraries(CSE2 PRIVATE ${freetype2_LDFLAGS}) + endif() + elseif(FREETYPE_FOUND) + message(STATUS "Using system FreeType (CMake)") + target_include_directories(CSE2 PRIVATE ${FREETYPE_INCLUDE_DIRS}) + target_link_libraries(CSE2 PRIVATE ${FREETYPE_LIBRARIES}) + else() + # Compile it ourselves + message(STATUS "Using local FreeType") + if(FORCE_LOCAL_LIBS) + set(CMAKE_DISABLE_FIND_PACKAGE_HarfBuzz ON CACHE INTERNAL "" FORCE) + set(CMAKE_DISABLE_FIND_PACKAGE_ZLIB ON CACHE INTERNAL "" FORCE) + set(CMAKE_DISABLE_FIND_PACKAGE_PNG ON CACHE INTERNAL "" FORCE) + set(CMAKE_DISABLE_FIND_PACKAGE_BZip2 ON CACHE INTERNAL "" FORCE) + set(CMAKE_DISABLE_FIND_PACKAGE_BrotliDec ON CACHE INTERNAL "" FORCE) + endif() + add_subdirectory("external/freetype" EXCLUDE_FROM_ALL) + target_link_libraries(CSE2 PRIVATE freetype) + endif() +endif() + +if(BACKEND_RENDERER MATCHES "OpenGL3") + add_subdirectory("external/glad" EXCLUDE_FROM_ALL) + target_link_libraries(CSE2 PRIVATE glad) +endif() + +if(BACKEND_RENDERER MATCHES "OpenGLES2") + find_package(OpenGLES2 REQUIRED) + target_include_directories(CSE2 PRIVATE ${OPENGLES2_INCLUDE_DIR}) + target_link_libraries(CSE2 PRIVATE ${OPENGLES2_LIBRARIES}) +endif() + +if(BACKEND_RENDERER MATCHES "OpenGL3" OR (BACKEND_PLATFORM MATCHES "GLFW3" AND BACKEND_RENDERER MATCHES "Software")) + if (CMAKE_VERSION GREATER_EQUAL 3.11) + cmake_policy(SET CMP0072 NEW) + endif() + + find_package(OpenGL REQUIRED) + target_link_libraries(CSE2 PRIVATE OpenGL::GL) +endif() + + +####################### +# Resource conversion # +####################### + +# Build bin2h externally, so it isn't cross-compiled when CSE2 is (Emscripten, cross-GCC, MinGW on Linux, etc.) +include(ExternalProject) + +ExternalProject_Add(bin2h + SOURCE_DIR "${CMAKE_SOURCE_DIR}/bin2h" + DOWNLOAD_COMMAND "" + UPDATE_COMMAND "" + BUILD_BYPRODUCTS "/bin/bin2h" + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX= + -DCMAKE_BUILD_TYPE=Release + INSTALL_COMMAND + ${CMAKE_COMMAND} --build . --config Release --target install +) + +ExternalProject_Get_Property(bin2h INSTALL_DIR) + +add_executable(bin2h_tool IMPORTED) +add_dependencies(bin2h_tool bin2h) +set_target_properties(bin2h_tool PROPERTIES IMPORTED_LOCATION "${INSTALL_DIR}/bin/bin2h") + +# Convert resources to header files +foreach(FILENAME IN LISTS RESOURCES) + set(IN_DIR "${ASSETS_DIRECTORY}/resources") + set(OUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/Resource") + get_filename_component(DIRECTORY "${FILENAME}" DIRECTORY) + add_custom_command( + OUTPUT "${OUT_DIR}/${FILENAME}.h" + COMMAND ${CMAKE_COMMAND} -E make_directory "${OUT_DIR}/${DIRECTORY}" + COMMAND bin2h_tool "${IN_DIR}/${FILENAME}" "${OUT_DIR}/${FILENAME}.h" + DEPENDS bin2h_tool "${IN_DIR}/${FILENAME}" + ) + target_sources(CSE2 PRIVATE "${OUT_DIR}/${FILENAME}.h") +endforeach() diff --git a/LICENCE.txt b/LICENCE.txt new file mode 100644 index 0000000..80d150d --- /dev/null +++ b/LICENCE.txt @@ -0,0 +1,32 @@ +THIS PROJECT CONTAINS PROPRIETARY CODE AND ASSETS. +THIS IS NOT FREE/LIBRE SOFTWARE OR OPEN-SOURCE SOFTWARE. +USE AT YOUR OWN RISK. + +The original code and assets belongs to Daisuke "Pixel" Amaya. + +Modifications and custom code are under the following licence: + +MIT License + +Copyright (c) 2019 Regan "cuckydev" Green +Copyright (c) 2019-2020 Clownacy +Copyright (c) 2019-2020 Gabriel Ravier +Copyright (c) 2020 Cameron Cawley + +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. diff --git a/PHILOSOPHY.md b/PHILOSOPHY.md new file mode 100644 index 0000000..eee5cf6 --- /dev/null +++ b/PHILOSOPHY.md @@ -0,0 +1,68 @@ +# `accurate` branch +Being a pure, plain decompilation of the original `Doukutsu.exe` file (v1.0.0.6), +there should not be much to say about this branch's philosophies: + +## Goal +The end-goal is for the project to be able to produce an `.exe` file that is +identical to the original. This means that there should be no custom code, +decompiled code should ideally be made to produce the same assembly code as the +original, bugs should be left intact, etc. + +Another goal of the project is to document Cave Story's inner-working, so code +should be reasonably-annotated. Likewise, bugs should be documented, and fixes +provided wrapped in `#ifdef FIX_BUGS` conditions. + +## Accuracy to the original source code +Personally, I do aim to make the decompiled code _functionally_-accurate to the +original, down to generating the same assembly code, but I do not aim for +_visually_-accurate code. + +Despite this, I do try to preserve the original function/variable names, +variable-declaration locations, and source file naming. + +Part of the reason why I do not aim for visually-accurate source code is that we +know from the [Organya source code release](https://github.com/shbow/organya/) +what Pixel's code-style looked like, and I find it **extremely** hard to read. + +## Language +Cave Story's developer (Pixel) primarily speaks Japanese, but his code's +variable/function names are mostly written in English (with a few rare instances +of Romanised Japanese). + +The Organya source code release indicates that Pixel wrote his comments in +Japanese, however, in this project, I prefer them to be written in English. + +The English employed in this project is a mix of American English, Canadian +English, and British English. + + + +# `portable` branch +This branch takes a different direction to the `accurate` branch, but they still +share many core philosophies: + +## Goal +While accurately-reproducing Cave Story's original code is still a priority, the +main focus of this branch is to port the game to other platforms, while also +preserving the game the way it was experienced back in 2004. + +Essentially, this branch exists to provide a purist Cave Story experience +without requiring an old Windows XP computer. + +Notably, this means that bugs should still be left intact. However, bugs and +other coding errors that affect portability should be fixed. + +For comparison, I believe this branch shares many parallels with the +Chocolate Doom project. Follow the link below to see that project's list of +philosophies, which may be applicable here: + +https://github.com/chocolate-doom/chocolate-doom/blob/master/PHILOSOPHY.md + +## Custom code +Cave Story's original source code was written in C++, but stylised like C89 +(with a number of exceptions). Custom code added to the project should follow +suit, but the C-style doesn't have to be C89 - personally, I prefer to write in +the subset of C99 that C++98 allows. + +I prefer compiler-specific code to be avoided, since more-portable code benefits +all compilers, and keeps the codebase free of clutter. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fa113f8 --- /dev/null +++ b/README.md @@ -0,0 +1,217 @@ + + +# Cave Story: Tweaked + +Cave Story: Tweaked (also known as Tweaks) is a project to add accessibility and Quality of Life options to Cave Story. + +![Screenshot](screenshot.gif) + +This project has been forked from [CSE2](https://githubcom/Clownacy/CSE2), specifically the now-defunct `enhanced` branch, adding several enhancements: +* Revamped Map System, partially based off of Cave Story 3D +* Strafing, as seen in Cave Story+ for Nintendo Switch +* Options menu: + * Improved user interface + * Option to disable screen shake + * Option to disable or tone down screen flashing + * Option to change the ingame font between [Monogram](https://datagoblin.itch.io/monogram), [OpenDyslexic](https://opendyslexic.org/) for improved readability, Lekton and Courier New + * Option to tone down or disable screen flashing + * Several color filters aimed at different kinds of colorblindness, as well as filters inspired by retro video game consoles + * Option to extend the default UI with new features (such as a Booster fuel level) + +The main new addition of the fork is the Tweaks menu, which lets players to tweak several gameplay elements in real time to improve their experience. This Menu draws heavy inspiration from Celeste's Assist and Variants Modes, allowing allowing each player to make the game either more challenging, more accessible, or more enjoyable. Currently available options include: +* Autofire: Off, Hold (hold shoot button to fire), Switch (tap shoot button to fire nonstop, tap again to stop firing) +* Infinite Ammo +* Default Booster (None, 0.8 or 2.0. The game will equip the booster without giving you the item) +* Infinite Booster (Booster fuel never runs out) +* Damage Received Modifier +* Disable Experience Drops from enemies. +* Enable Grace Jumps (giving you 6 frames to jump after walking off a ledge) +* Boss Health Modifier +* Game speed toggle (from 50% to 150%) + +The fork retains the spirit of CSE2 and as such, it is fully compatible with all modding options provided in CSE2. + +Supported platforms include +* Windows +* Linux +* macOS +* Wii U +* 3DS +* RISC OS + +## Dependencies + +* SDL2 (if `BACKEND_AUDIO` or `BACKEND_PLATFORM` are set to `SDL2`) +* GLFW3 (if `BACKEND_PLATFORM` is set to `GLFW3`) +* FreeType (if `FREETYPE_FONTS` is enabled) + +If these are not found, they will be built locally. + +In addition, `pkg-config` is required for builds that require static-linkage. + +A list of dependencies for specific platforms can be found [on the wiki](https://github.com/Clownacy/CSE2/wiki/Dependency-lists). + +## Building + +This project uses CMake, allowing it to be built with a range of compilers. + +Switch to the terminal (Visual Studio users should open the [Developer Command Prompt](https://docs.microsoft.com/en-us/dotnet/framework/tools/developer-command-prompt-for-vs)) +and `cd` into this folder. After that, generate the files for your build system +with: + +``` +cmake -B build -DCMAKE_BUILD_TYPE=Release +``` + +MSYS2 users should append `-G"MSYS Makefiles" -DPKG_CONFIG_STATIC_LIBS=ON` to +this command, also. + +You can also add the following flags: + +Name | Function +--------|-------- +`-DGAMELANG=EN` | (Default) Use the unofficial Aeon Genesis English translation +`-DGAMELANG=JP` | Use the original Japanese-language build +`-DGAMELANG=ES` | Use the unofficial Vagrant Traducciones Spanish translation +`-DFIX_BUGS=ON` | Enabled by default - Fix various bugs in the game +`-DDEBUG_SAVE=ON` | Re-enable the ability to drag-and-drop save files onto the window +`-DLANCZOS_RESAMPLER=ON` | Use Lanczos filtering for audio resampling instead of linear-interpolation (Lanczos is more performance-intensive, but higher quality) +`-DFREETYPE_FONTS=ON` | Use FreeType2 to render fonts, instead of using pre-rendered copies +`-DBACKEND_RENDERER=OpenGL3` | Render with OpenGL 3.2 (hardware-accelerated) +`-DBACKEND_RENDERER=OpenGLES2` | Render with OpenGL ES 2.0 (hardware-accelerated) +`-DBACKEND_RENDERER=SDLTexture` | (Default) Render with SDL2's Texture API (hardware-accelerated) (note: requires `-DBACKEND_PLATFORM=SDL2`) +`-DBACKEND_RENDERER=WiiU` | Render with the Wii U's GX2 API (hardware-accelerated) +`-DBACKEND_RENDERER=3DS` | Render with the 3DS's Citro2D/Citro3D API (hardware-accelerated) +`-DBACKEND_RENDERER=Software` | Render with a handwritten software-renderer +`-DBACKEND_AUDIO=SDL2` | (Default) Deliver audio with SDL2 (software-mixer) +`-DBACKEND_AUDIO=miniaudio` | Deliver audio with miniaudio (software-mixer) +`-DBACKEND_AUDIO=WiiU-Hardware` | Deliver audio with Wii U's AXVoice API (hardware-accelerated) (WARNING - currently broken: voices randomly disappear for unknown reasons) +`-DBACKEND_AUDIO=WiiU-Software` | Deliver audio with Wii U's AXVoice API (software-mixer) +`-DBACKEND_AUDIO=3DS-Hardware` | Deliver audio with 3DS's NDSP API (hardware-accelerated) +`-DBACKEND_AUDIO=3DS-Software` | Deliver audio with 3DS's NDSP API (software-mixer) +`-DBACKEND_AUDIO=Null` | Don't deliver audio at all (WARNING - game will have no audio) +`-DBACKEND_PLATFORM=SDL2` | (Default) Use SDL2 for miscellaneous platform-dependant operations +`-DBACKEND_PLATFORM=GLFW3` | Use GLFW3 for miscellaneous platform-dependant operations +`-DBACKEND_PLATFORM=WiiU` | Use the Wii U's native APIs for miscellaneous platform-dependant operations +`-DBACKEND_PLATFORM=3DS` | Use the 3DS's native APIs for miscellaneous platform-dependant operations +`-DBACKEND_PLATFORM=Null` | Don't do platform-dependant operations at all (WARNING - game will have no video or input) +`-DLTO=ON` | Enable link-time optimisation +`-DPKG_CONFIG_STATIC_LIBS=ON` | On platforms with pkg-config, static-link the dependencies (good for Windows builds, so you don't need to bundle DLL files) +`-DMSVC_LINK_STATIC_RUNTIME=ON` | Link the static MSVC runtime library, to reduce the number of required DLL files (Visual Studio only) +`-DFORCE_LOCAL_LIBS=ON` | Compile the built-in versions of SDL2, GLFW3, and FreeType instead of using the system-provided ones +`-DEXTRA_SOUND_FORMATS=ON` | Enable support for alternate music/SFX formats, include Ogg Vorbis, FLAC, and PxTone (not to be confused with PixTone) +`-DCLOWNAUDIO_STB_VORBIS=ON` | Enable support for Ogg Vorbis music/SFX +`-DCLOWNAUDIO_DR_FLAC=ON` | Enable support for FLAC music/SFX +`-DCLOWNAUDIO_LIBXMPLITE=ON` | Enable support for .it, .xm, .mod, .s3m music/SFX +`-DCLOWNAUDIO_PXTONE=ON` | Enable support for PxTone music/SFX (not to be confused with PixTone) + +You can pass your own compiler flags with `-DCMAKE_C_FLAGS` and `-DCMAKE_CXX_FLAGS`. + +You can then compile CSE2 with this command: + +``` +cmake --build build --config Release +``` + +If you're a Visual Studio user, you can open the generated `CSE2.sln` file +instead, which can be found in the `build` folder. + +Once built, the executables can be found in the `game_english`/`game_japanese` +folder, depending on the selected language. + +### Building for the Wii U + +To target the Wii U, you'll need devkitPro, devkitPPC, and WUT. + +First, add the devkitPPC tools directory to your PATH (because WUT's CMake +support is broken, as of writing): + +``` +PATH=$PATH:$DEVKITPPC/bin +``` + +Then, generate the build files with this command: + +``` +cmake -B buildwiiu -DCMAKE_BUILD_TYPE=Release -DFORCE_LOCAL_LIBS=ON -DBACKEND_PLATFORM=WiiU -DBACKEND_RENDERER=WiiU -DBACKEND_AUDIO=WiiU-Software -DCMAKE_TOOLCHAIN_FILE=$DEVKITPRO/wut/share/wut.toolchain.cmake +``` + +Finally, build the game with this command: + +``` +cmake --build buildwiiu +``` + +This will build a binary, but you still need to convert it to an `.rpx` file +that can be ran on your Wii U. + +First, we need to strip the binary: + +``` +powerpc-eabi-strip -g game_english/CSE2 +``` + +Then, we convert it to an `.rpx`: +``` +elf2rpl game_english/CSE2 game_english/CSE2.rpx +``` + +`game_english/CSE2.rpx` is now ready to be ran on your Wii U. This port expects +the data folder to be in a folder called `CSE2-enhanced-en`/`CSE2-enhanced-jp` +on the root of your SD card. + +### Building for the 3DS + +To target the 3DS, you'll need devkitPro, devkitARM, Citro2D, Citro3D, libctru, +and bannertool, along with the `3dstools` and `devkitpro-pkgbuild-helpers` +packages. + +Open a terminal, and `cd` into the CSE2 directory. Then execute this command: + +``` +cmake -B build3ds -DCMAKE_BUILD_TYPE=Release -DFORCE_LOCAL_LIBS=ON -DBACKEND_PLATFORM=3DS -DBACKEND_RENDERER=3DS -DBACKEND_AUDIO=3DS-Software -DFREETYPE_FONTS=ON -DCMAKE_TOOLCHAIN_FILE=$DEVKITPRO/3ds.cmake +``` + +(Note that `FREETYPE_FONTS` is enabled. If you're creating a Japanese build, +it's best to disable this, as the FreeType font is unreadable at 320x240). + +This will create the build files. To build CSE2, run: + +``` +cmake --build build3ds +``` + +This will create an elf file. Before we can create a `.3dsx` file from it, we +need to make an `.smdh` file: + +``` +bannertool makesmdh -i $DEVKITPRO/libctru/default_icon.png -s "CSE2" -l "Port of Cave Story" -p "Clownacy" -o build3ds/smdh.smdh +``` + +We can finally generate a `.3dsx` file: + +``` +3dsxtool game_english/CSE2 game_english/CSE2.3dsx --romfs=game_english/data --smdh=build3ds/smdh.smdh +``` +## Licensing + +Being a decompilation, the majority of the code in this project belongs to Daisuke "Pixel" Amaya - not us. We've yet to agree on a licence for our own code. + +Monogram is used under the CC0 1.0 License, and it is part of the Public Domain. +OpenDyslexic is distributed under the SIL-OFL License. + +## Contributors + +* Clownacy, CuckyDev, GabrielR - CSE2 development +* ikuyo - Main developer +* Pummelator - Developer +* BLink - Additional coding +* halfcoordinated - Accessibility testing and guidance +* Onyx - Additional art assets +* Kayo, Tert, SebasContre, Varin, excogs, kalarse, Amber - playtesting +* DynamiteMan.EXE, vince94, DM DOKURO - Music + +## Contact + +For pull requests and issues, please use this repository's issues page. +For bug reports, feature ideas and general feedback, feel free to send me an email to tweaks@oneninefour.cl or join the Discord server mentioned above. diff --git a/assets/3ds/3DSTweaked-Banner.png b/assets/3ds/3DSTweaked-Banner.png new file mode 100644 index 0000000..434a4b2 Binary files /dev/null and b/assets/3ds/3DSTweaked-Banner.png differ diff --git a/assets/3ds/Tweaked3DS.wav b/assets/3ds/Tweaked3DS.wav new file mode 100644 index 0000000..af202a7 Binary files /dev/null and b/assets/3ds/Tweaked3DS.wav differ diff --git a/assets/resources/CSE2.manifest b/assets/resources/CSE2.manifest new file mode 100644 index 0000000..9f500fd --- /dev/null +++ b/assets/resources/CSE2.manifest @@ -0,0 +1,9 @@ + + + + + true/pm + permonitorv2,permonitor + + + diff --git a/assets/resources/CSE2.rc b/assets/resources/CSE2.rc new file mode 100644 index 0000000..02239a9 --- /dev/null +++ b/assets/resources/CSE2.rc @@ -0,0 +1,84 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource1.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Japanese resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,6 + PRODUCTVERSION 1,0,0,6 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "041104b0" + BEGIN + VALUE "FileDescription", "Doukutsu" + VALUE "FileVersion", "1, 0, 0, 6" + VALUE "InternalName", "Doukutsu Monogatari" + VALUE "LegalCopyright", "I can't get MSVC2003 to understand Japanese so here's a placeholder" + VALUE "OriginalFilename", "Doukutsu.exe" + VALUE "ProductName", "I can't get MSVC2003 to understand Japanese so here's a placeholder" + VALUE "ProductVersion", "1, 0, 0, 6" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x411, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +GLFW_ICON ICON "ICON/GLFW_ICON.ico" +#endif // Japanese resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/assets/resources/CURSOR/CURSOR_IKA.png b/assets/resources/CURSOR/CURSOR_IKA.png new file mode 100644 index 0000000..c389298 Binary files /dev/null and b/assets/resources/CURSOR/CURSOR_IKA.png differ diff --git a/assets/resources/CURSOR/CURSOR_NORMAL.png b/assets/resources/CURSOR/CURSOR_NORMAL.png new file mode 100644 index 0000000..83e6d54 Binary files /dev/null and b/assets/resources/CURSOR/CURSOR_NORMAL.png differ diff --git a/assets/resources/ICON/GLFW_ICON.ico b/assets/resources/ICON/GLFW_ICON.ico new file mode 100644 index 0000000..4139b41 Binary files /dev/null and b/assets/resources/ICON/GLFW_ICON.ico differ diff --git a/assets/resources/ICON/ICON_3DS.png b/assets/resources/ICON/ICON_3DS.png new file mode 100644 index 0000000..cccb746 Binary files /dev/null and b/assets/resources/ICON/ICON_3DS.png differ diff --git a/assets/resources/ICON/ICON_MINI.png b/assets/resources/ICON/ICON_MINI.png new file mode 100644 index 0000000..7bb9f9a Binary files /dev/null and b/assets/resources/ICON/ICON_MINI.png differ diff --git a/assets/resources/afxres.h b/assets/resources/afxres.h new file mode 100644 index 0000000..4c082f7 --- /dev/null +++ b/assets/resources/afxres.h @@ -0,0 +1,3 @@ +// Quick-and-dirty shim to make CSE2.rc work in newer versions of Visual Studio + +#include "windows.h" diff --git a/assets/resources/resource1.h b/assets/resources/resource1.h new file mode 100644 index 0000000..d53bca0 --- /dev/null +++ b/assets/resources/resource1.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by CSE2.rc +// + +// Next default values for new objects +// + +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 172 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/assets/riscos/!Boot,feb b/assets/riscos/!Boot,feb new file mode 100644 index 0000000..c156eda --- /dev/null +++ b/assets/riscos/!Boot,feb @@ -0,0 +1,2 @@ +Set CSE2$Dir +IconSprites .!Sprites diff --git a/assets/riscos/!Run,feb b/assets/riscos/!Run,feb new file mode 100644 index 0000000..9cab7e0 --- /dev/null +++ b/assets/riscos/!Run,feb @@ -0,0 +1,2 @@ +Set CSE2$Dir +Run .CSE2 >.Log 2>&1 diff --git a/assets/riscos/!Sprites,ff9 b/assets/riscos/!Sprites,ff9 new file mode 100644 index 0000000..631ddd2 Binary files /dev/null and b/assets/riscos/!Sprites,ff9 differ diff --git a/bin2h/CMakeLists.txt b/bin2h/CMakeLists.txt new file mode 100644 index 0000000..d0a6aaf --- /dev/null +++ b/bin2h/CMakeLists.txt @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 3.8) + +option(LTO "Enable link-time optimisation" OFF) + +project(bin2h LANGUAGES C) + +add_executable(bin2h "bin2h.c") + +set_target_properties(bin2h PROPERTIES + C_STANDARD 90 + C_STANDARD_REQUIRED ON + C_EXTENSIONS OFF +) + +# Make some tweaks if we're using MSVC +if(MSVC) + # Disable warnings that normally fire up on MSVC when using "unsafe" functions instead of using MSVC's "safe" _s functions + target_compile_definitions(bin2h PRIVATE _CRT_SECURE_NO_WARNINGS) + + # Make it so source files are recognized as UTF-8 by MSVC + target_compile_options(bin2h PRIVATE "/utf-8") +endif() + +if(LTO) + include(CheckIPOSupported) + + check_ipo_supported(RESULT result) + + if(result) + set_target_properties(bin2h PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() +endif() + +install(TARGETS bin2h RUNTIME DESTINATION bin) diff --git a/bin2h/bin2h.c b/bin2h/bin2h.c new file mode 100644 index 0000000..6688a1d --- /dev/null +++ b/bin2h/bin2h.c @@ -0,0 +1,59 @@ +/* bin2h - converts binary files to C header files */ + +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + int result = 1; + + if (argc > 2) + { + FILE *in_file = fopen(argv[1], "rb"); + FILE *out_file = fopen(argv[2], "w"); + + if (in_file == NULL) + { + printf("Couldn't open '%s'\n", argv[1]); + } + else if (out_file == NULL) + { + printf("Couldn't open '%s'\n", argv[2]); + } + else + { + long in_file_size; + unsigned char *in_file_buffer; + unsigned char *in_file_pointer; + long i; + + fseek(in_file, 0, SEEK_END); + in_file_size = ftell(in_file); + rewind(in_file); + in_file_buffer = malloc(in_file_size); + fread(in_file_buffer, 1, in_file_size, in_file); + fclose(in_file); + in_file_pointer = in_file_buffer; + + setvbuf(out_file, NULL, _IOFBF, 0x10000); + + for (i = 0; i < in_file_size - 1; ++i) + { + if (i % 64 == 64-1) + fprintf(out_file, "%d,\n", *in_file_pointer++); + else + fprintf(out_file, "%d,", *in_file_pointer++); + } + + fprintf(out_file, "%d\n", *in_file_pointer++); + + fclose(out_file); + free(in_file_buffer); + result = 0; + } + } + + return result; +} diff --git a/cmake/FindOpenGLES2.cmake b/cmake/FindOpenGLES2.cmake new file mode 100644 index 0000000..c79b9b0 --- /dev/null +++ b/cmake/FindOpenGLES2.cmake @@ -0,0 +1,170 @@ +#------------------------------------------------------------------- +# This file is stolen from part of the CMake build system for OGRE (Object-oriented Graphics Rendering Engine) http://www.ogre3d.org/ +# +# The contents of this file are placed in the public domain. Feel +# free to make use of it in any way you like. +#------------------------------------------------------------------- + +# - Try to find OpenGLES and EGL +# Once done this will define +# +# OPENGLES2_FOUND - system has OpenGLES +# OPENGLES2_INCLUDE_DIR - the GL include directory +# OPENGLES2_LIBRARIES - Link these to use OpenGLES +# +# EGL_FOUND - system has EGL +# EGL_INCLUDE_DIR - the EGL include directory +# EGL_LIBRARIES - Link these to use EGL + +# Win32, Apple, and Android are not tested! +# Linux tested and works + +# Slightly customised framework finder +macro(findpkg_framework fwk) + if(APPLE) + set(${fwk}_FRAMEWORK_PATH + ${${fwk}_FRAMEWORK_SEARCH_PATH} + ${CMAKE_FRAMEWORK_PATH} + ~/Library/Frameworks + /Library/Frameworks + /System/Library/Frameworks + /Network/Library/Frameworks + ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx/Release + ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx/Debug + ) + # These could be arrays of paths, add each individually to the search paths + foreach(i ${OGRE_PREFIX_PATH}) + set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/macosx/Release ${i}/lib/macosx/Debug) + endforeach(i) + + foreach(i ${OGRE_PREFIX_BUILD}) + set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/macosx/Release ${i}/lib/macosx/Debug) + endforeach(i) + + foreach(dir ${${fwk}_FRAMEWORK_PATH}) + set(fwkpath ${dir}/${fwk}.framework) + if(EXISTS ${fwkpath}) + set(${fwk}_FRAMEWORK_INCLUDES ${${fwk}_FRAMEWORK_INCLUDES} + ${fwkpath}/Headers ${fwkpath}/PrivateHeaders) + set(${fwk}_FRAMEWORK_PATH ${dir}) + if (NOT ${fwk}_LIBRARY_FWK) + set(${fwk}_LIBRARY_FWK "-framework ${fwk}") + endif () + endif(EXISTS ${fwkpath}) + endforeach(dir) + endif(APPLE) +endmacro(findpkg_framework) + +macro(create_search_paths PREFIX) + foreach(dir ${${PREFIX}_PREFIX_PATH}) + set(${PREFIX}_INC_SEARCH_PATH ${${PREFIX}_INC_SEARCH_PATH} + ${dir}/include ${dir}/Include ${dir}/include/${PREFIX} ${dir}/Headers) + set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH} + ${dir}/lib ${dir}/Lib ${dir}/lib/${PREFIX} ${dir}/Libs) + set(${PREFIX}_BIN_SEARCH_PATH ${${PREFIX}_BIN_SEARCH_PATH} + ${dir}/bin) + endforeach(dir) + if(ANDROID) + set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH} ${OGRE_DEPENDENCIES_DIR}/lib/${ANDROID_ABI}) + endif() + set(${PREFIX}_FRAMEWORK_SEARCH_PATH ${${PREFIX}_PREFIX_PATH}) +endmacro(create_search_paths) + +if(WIN32) + if(CYGWIN) + find_path(OPENGLES2_INCLUDE_DIR GLES2/gl2.h) + find_library(OPENGLES2_LIBRARY libGLESv2) + else() + if(BORLAND) + set(OPENGLES2_LIBRARY import32 CACHE STRING "OpenGL ES 2.x library for Win32") + else() + # TODO + # set(OPENGLES_LIBRARY ${SOURCE_DIR}/Dependencies/lib/release/libGLESv2.lib CACHE STRING "OpenGL ES 2.x library for win32" + endif() + endif() +elseif(APPLE) + create_search_paths(/Developer/Platforms) + findpkg_framework(OpenGLES2) + set(OPENGLES2_LIBRARY "-framework OpenGLES") +else() + find_path(OPENGLES2_INCLUDE_DIR GLES2/gl2.h + PATHS /usr/openwin/share/include + /opt/graphics/OpenGL/include + /opt/vc/include + /usr/X11R6/include + /usr/include + ) + + find_library(OPENGLES2_LIBRARY + NAMES GLESv2 + PATHS /opt/graphics/OpenGL/lib + /usr/openwin/lib + /usr/shlib /usr/X11R6/lib + /opt/vc/lib + /usr/lib/aarch64-linux-gnu + /usr/lib/arm-linux-gnueabihf + /usr/lib + ) + + if(NOT BUILD_ANDROID) + find_path(EGL_INCLUDE_DIR EGL/egl.h + PATHS /usr/openwin/share/include + /opt/graphics/OpenGL/include + /opt/vc/include + /usr/X11R6/include + /usr/include + ) + + find_library(EGL_LIBRARY + NAMES EGL + PATHS /opt/graphics/OpenGL/lib + /usr/openwin/lib + /usr/shlib + /usr/X11R6/lib + /opt/vc/lib + /usr/lib/aarch64-linux-gnu + /usr/lib/arm-linux-gnueabihf + /usr/lib + ) + + # On Unix OpenGL usually requires X11. + # It doesn't require X11 on OSX. + + if(OPENGLES2_LIBRARY) + if(NOT X11_FOUND) + include(FindX11) + endif() + if(X11_FOUND) + set(OPENGLES2_LIBRARIES ${X11_LIBRARIES}) + endif() + endif() + endif() +endif() + +set(OPENGLES2_LIBRARIES ${OPENGLES2_LIBRARIES} ${OPENGLES2_LIBRARY}) + +if(BUILD_ANDROID) + if(OPENGLES2_LIBRARY) + set(EGL_LIBRARIES) + set(OPENGLES2_FOUND TRUE) + endif() +else() + if(OPENGLES2_LIBRARY AND EGL_LIBRARY) + set(EGL_LIBRARIES ${EGL_LIBRARY} ${EGL_LIBRARIES}) + set(OPENGLES2_FOUND TRUE) + endif() +endif() + +mark_as_advanced( + OPENGLES2_INCLUDE_DIR + OPENGLES2_LIBRARY + EGL_INCLUDE_DIR + EGL_LIBRARY +) + +if(OPENGLES2_FOUND) + message(STATUS "Found system OpenGL ES 2 library: ${OPENGLES2_LIBRARIES}") +else() + set(OPENGLES2_LIBRARIES "") +endif() + diff --git a/cmake/RISCOSApp.cmake b/cmake/RISCOSApp.cmake new file mode 100644 index 0000000..803df9b --- /dev/null +++ b/cmake/RISCOSApp.cmake @@ -0,0 +1,22 @@ +# Use the following commands to build for RISC OS: +# cmake -B build-riscos -DCMAKE_BUILD_TYPE=Release -DBACKEND_PLATFORM=SDL1 -DBACKEND_RENDERER=Software -DBACKEND_AUDIO=SDL1 -DDOCONFIG=OFF -DCMAKE_TOOLCHAIN_FILE=$GCCSDK_INSTALL_ENV/toolchain-riscos.cmake -DRISCOS=ON -DPKG_CONFIG_STATIC_LIBS=ON +# cmake --build build-riscos +# (cd game_english && $GCCSDK_INSTALL_ENV/bin/zip -,9r cse2-riscos.zip \!CSE2) + +function(elf_to_aif) + cmake_parse_arguments(ELFTOAIF "" "TARGET;OUTPUT" "" ${ARGN}) + get_filename_component(ELFTOAIF_OUTPUT_DIR "${ELFTOAIF_OUTPUT}" DIRECTORY) + add_custom_command(OUTPUT "${ELFTOAIF_OUTPUT}" + COMMAND ${CMAKE_COMMAND} -E make_directory ${ELFTOAIF_OUTPUT_DIR} + COMMAND elf2aif $ ${ELFTOAIF_OUTPUT} + DEPENDS ${ELFTOAIF_TARGET}) + add_custom_target(${ELFTOAIF_TARGET}-aif ALL DEPENDS ${ELFTOAIF_OUTPUT}) +endfunction(elf_to_aif) + +elf_to_aif(TARGET CSE2 OUTPUT ${BUILD_DIRECTORY}/!CSE2/CSE2,ff8) + +configure_file(${ASSETS_DIRECTORY}/riscos/!Boot,feb ${BUILD_DIRECTORY}/!CSE2/!Boot,feb COPYONLY) +configure_file(${ASSETS_DIRECTORY}/riscos/!Run,feb ${BUILD_DIRECTORY}/!CSE2/!Run,feb COPYONLY) +configure_file(${ASSETS_DIRECTORY}/riscos/!Sprites,ff9 ${BUILD_DIRECTORY}/!CSE2/!Sprites,ff9 COPYONLY) +configure_file(${BUILD_DIRECTORY}/licence.txt ${BUILD_DIRECTORY}/!CSE2/Licence COPYONLY) +file(COPY ${BUILD_DIRECTORY}/data DESTINATION ${BUILD_DIRECTORY}/!CSE2) diff --git a/export/clownaudio_export.h b/export/clownaudio_export.h new file mode 100644 index 0000000..aaa41f9 --- /dev/null +++ b/export/clownaudio_export.h @@ -0,0 +1,42 @@ + +#ifndef CLOWNAUDIO_EXPORT_H +#define CLOWNAUDIO_EXPORT_H + +#ifdef CLOWNAUDIO_STATIC_DEFINE +# define CLOWNAUDIO_EXPORT +# define CLOWNAUDIO_NO_EXPORT +#else +# ifndef CLOWNAUDIO_EXPORT +# ifdef clownaudio_EXPORTS + /* We are building this library */ +# define CLOWNAUDIO_EXPORT +# else + /* We are using this library */ +# define CLOWNAUDIO_EXPORT +# endif +# endif + +# ifndef CLOWNAUDIO_NO_EXPORT +# define CLOWNAUDIO_NO_EXPORT +# endif +#endif + +#ifndef CLOWNAUDIO_DEPRECATED +# define CLOWNAUDIO_DEPRECATED __declspec(deprecated) +#endif + +#ifndef CLOWNAUDIO_DEPRECATED_EXPORT +# define CLOWNAUDIO_DEPRECATED_EXPORT CLOWNAUDIO_EXPORT CLOWNAUDIO_DEPRECATED +#endif + +#ifndef CLOWNAUDIO_DEPRECATED_NO_EXPORT +# define CLOWNAUDIO_DEPRECATED_NO_EXPORT CLOWNAUDIO_NO_EXPORT CLOWNAUDIO_DEPRECATED +#endif + +#if 0 /* DEFINE_NO_DEPRECATED */ +# ifndef CLOWNAUDIO_NO_DEPRECATED +# define CLOWNAUDIO_NO_DEPRECATED +# endif +#endif + +#endif /* CLOWNAUDIO_EXPORT_H */ diff --git a/res/en/data/ArmsItem.tsc b/res/en/data/ArmsItem.tsc new file mode 100644 index 0000000..defb090 --- /dev/null +++ b/res/en/data/ArmsItem.tsc @@ -0,0 +1 @@ +CPPPP-*\fre\waiYYYY\end-*-*CQPPP-*\msg\turn@N\waiYYYY\end-*CQPPQ-*\msg\turM@s@M-*p@@N-*m@@c@@@lN\waiYYYY\end-*CQPPR-*\msg\turM@p@s@M-*t@@@N-*i@@@@@pN-*\waiYYYY\end-*CQPPS-*\msg\turM@f@M-*b@@@N-*r@@@@N\waiYYYY\end-*CQPPT-*\msg\turM@m@g@M-*a@@M@N-*a@@@N\waiYYYY\end-*CQPPU-*\msg\turM@m@l@M-*w@@@@N-*hL@@@@N\waiYYYY\end-*CQPPW-*\msg\turM@b@M-*f@@a@hG@N-*h@@@@@@@N\waiYYYY\end-*CQPPY-*\msg\turM@b@M-*a@ML@M@N-*kG@@@N\waiYYYY\end-*CQPQP-*\msg\turM@s@m@M-*a@@@@N-*i@@@N\waiYYYY\end-*CQPQR-*\msg\turM@n@M-*l@@@gN-*f@@N\waiYYYY\end-*CQPQS-*\msg\turM@s@M-*h@@@@-*@@N\waiYYYY\end-*-*CQQPP-*\msg\turh\waiYYYY\end-*CQQPQ-*\msg\turm\waiYYYY\end-*CQQPR-*\msg\turs\waiYYYY\end-*CQQPS-*\msg\turk\waiYYYY\end-*CQQPT-*\msg\turn\waiYYYY\end-*-*CQRPP-*\msg\turjG@@@@@@N-*w@@@@L@-*@@@@@@@cN\waiYYYY\end-*CQRPQ-*\msg\turjG@N@l@MN-*o@@JJL@L@-*@@@@@@N\waiYYYY\end-*CQRPR-*\msg\turjG@N@l@@N@d-*@@L@@@@-*@@@@N\waiYYYY\end-*CQRPS-*\msg\turjG@N@a@@@-*@@@@L-*@@@@@@N\waiYYYY\end-*CQRPT-*\msg\turjG@N@s@@@@-*L@@@@@-*@@@@N\waiYYYY\end-*-*CUPPP-*\msg\turn@N\waiYYYY\end-*CUPPQ-*\msg\turaG@k\waiYYYY\end-*CUPPR-*\msg\turm@s\waiYYYY\end-*CUPPS-*\msg\tursG@k\waiYYYY\end-*CUPPT-*\msg\turs@l\waiYYYY\end-*CUPPU-*\msg\turb@f\waiYYYY\end-*CUPPV-*\msg\turl@c\waiYYYY\end-*CUPPW-*\msg\turid@c\waiYYYY\end-*CUPPX-*\msg\turj@j\waiYYYY\end-*CUPPY-*\msg\turr@k\waiYYYY\end-*CUPQP-*\msg\turg@k\waiYYYY\end-*CUPQQ-*\msg\turg@b\waiYYYY\end-*CUPQR-*\msg\turc\waiYYYY\end-*CUPQS-*\msg\ture\waiYYYY\end-*CUPQT-*\fljSPPPZQQPP-*\fljSPPQZQQPQ-*\fljSPPRZQQPR-*\fljSPPSZQQPS-*\fljSPPTZQQPT-*\msg\turp\waiYYYY\end-*CUPQU-*\msg\turl@p\waiYYYY\end-*CUPQV-*\msg\turcMa\waiYYYY\end-*CUPQW-*\msg\turc@k\waiYYYY\end-*CUPQX-*\msg\turb@PNX\waiYYYY\end-*CUPQY-*\msg\tura@b\waiYYYY\end-*CUPRP-*\msg\turt\waiYYYY\end-*CUPRQ-*\msg\turcG@a@t\waiYYYY\end-*CUPRR-*\msg\turn@c\waiYYYY\end-*CUPRS-*\msg\turb@RNP\waiYYYY\end-*CUPRT-*\msg\turm@m\waiYYYY\end-*CUPRU-*\msg\turt@r@k\waiYYYY\end-*CUPRV-*\msg\tursG@l\waiYYYY\end-*CUPRW-*\msg\turc\waiYYYY\end-*CUPRX-*\msg\turb@s\waiYYYY\end-*CUPRY-*\msg\turs\waiYYYY\end-*CUPSP-*\msg\turt@r\waiYYYY\end-*CUPSQ-*\msg\turc@f@m\waiYYYY\end-*CUPSR-*\msg\turl@m\waiYYYY\end-*CUPSS-*\msg\turm@b\waiYYYY\end-*CUPST-*\msg\turm@p\waiYYYY\end-*CUPSU-*\msg\turcG@u\waiYYYY\end-*CUPSV-*\msg\tura@m\waiYYYY\end-*CUPSW-*\msg\turcG@l\waiYYYY\end-*CUPSX-*\msg\turw@s\waiYYYY\end-*CUPSY-*\msg\turi@b\waiYYYY\end-*-*CVPPP-*\msg\turn@N\waiYYYY\end-*CVPPQ-*\msg\turt@@@aG@N-*i@@@@aG-*N\waiYYYY\end-*CVPPR-*\pri\eveWPPR\mpjWPPR\msgn@@@@N\nod\clr\end-*CVPPS-*\msg\turt@@@sG@N\waiYYYY\end-*CVPPT-*\msg\tura@@@@@@@@N-*f@@@G@L@@-*@G@@@@N\waiYYYY\end-*CVPPU-*\msg\tura@@@@@-*y@fN@i@@@-*NNN_\waiYYYY\end-*CVPPV-*\msg\tura@@N\waiYYYY\end-*CVPPW-*\msg\tura@id@c@@@e@nN@PVN\waiYYYY\end-*CVPPX-*\msg\tura@@@@-*N\waiYYYY\end-*CVPPY-*\msg\tura@@N\waiYYYY\end-*CVPQP-*\msg\tura@@@BgBN\waiYYYY\end-*CVPQQ-*\msg\tura@@@N\waiYYYY\end-*CVPQR-*\msg\turt@@@N\waiYYYY\end-*CVPQS-*\msg\tura@@@@@-*@N\waiYYYY\end-*CVPQT-*\fljSPPPZQRPP-*\fljSPPQZQRPQ-*\fljSPPRZQRPR-*\fljSPPSZQRPS-*\fljSPPTZQRPT-*\msg\turjG@ N\waiYYYY\end-*CVPQU-*\key\msgt@@@@L-*@@N@w@@@_\ynjPPPP\liKQPPP\souPPRP\itMPPQU\msg-*l@N\fre\waiYYYY\end-*CVPQV-*\msg\tura@@-*@@NNN\waiYYYY\end-*CVPQW-*\msg\turi@@Bl@cBN\waiYYYY\end-*CVPQX-*\fljPWTRZWPQX-*\key\msgp@@@@@-*@@@@N\nod\clr-*d@@@@@_\ynjPPPP\eqKPPPQ\flKPWTR\eqMPPSR\flMPWTS\msg-*b@N\nod\waiPPPS\fre\eveUPQX-*CVPQY-*\msg\turw@@@L@@-*@@@@@@N\waiYYYY\end-*CVPRP-*\msg\turi@@@@@-*@@@N\waiYYYY\end-*CVPRQ-*\msg\tury@@@@-*N@c@@@@N\waiYYYY\end-*CVPRR-*\msg\tura@@@N-*y@G@@@N\waiYYYY\end-*CVPRS-*\fljPWTSZWPRS-*\key\msgp@@@@@@-*@@@@@N\nod\clr-*d@@@@@_\ynjPPPP\eqKPPSR\flKPWTS\eqMPPPQ\flMPWTR\msg-*e@b@RNPN\nod\waiPPPS\fre\eveUPRS-*CVPRT-*\msg\tura@m@@sG@@N-*iG@@@NNN\waiYYYY\end-*CVPRU-*\msg\tura@@@@@@-*mN\waiYYYY\end-*CVPRV-*\key\msgw@@@_\ynjPPPP\msg\tur-*t@@sN\nod\clri@G@@i@@-*@@@@@N\nod\clrw@@@@@-*@@@@@N\nod\clrpN@b@@@-*L@@@@-*L@@L\nod\clr@NNN-*t@d@@N\nod\clrh@@@@@-*@L@@@NNN\nod\clra@L@@@-*@d@cNNN\waiPPRP\nod\clrt@L@@@-*@@@@@L\nod\clr@@-*@@@NNN\nod\clrt@d@@@-*@@@@L\nod\clr@@@@@-*@@@@@-*@N\nod\clro@@@@c@-*@L@@@-*@@@N\nod\clrw@@@@@-*@@@@-*@@@N\nod\clrt@d@@@@-*eG@@@-*@@@N\nod\clri@@@@@-*@@@-*@m@@N\nod\clraL@i@@@@@-*L@@i@@@-*@@NNN\nod\clrnL@G@@@-*m@@@@-*@@N\nod\clro@@@@@L@@-*@@m@@@-*@@@N\nod\clru@@@L-*@@@@@@-*@m@@@@N\nod\clr-*a@@@iL@L@NNN\nod\clri@@@@@@-*L@@@@@-*@@N\nod\clri@@@@@L-*G@@L@@-*@@N\nod\clrpN@h@@N\nod\clrt@@-*Bl@mBN\nod\clr\flKQPRT\fre\msgt@@@NNN\waiYYYY\end-*CVPRW-*\msg\turn@@@@N-*p@@iL@@@N\waiYYYY\end-*CVPRX-*\msg\tura@@@N\waiYYYY\end-*CVPRY-*\msg\turiG@MN@NNNpN\waiYYYY\end-*CVPSP-*\msg\tura@@@@N\waiYYYY\end-*CVPSQ-*\msg\turs@@@N-*i@@@N\waiYYYY\end-*-*CVPSR-*\msg\turhA@w@@_\waiYYYY\end-*CVPSS-*\msg\turt@@@@@@-*N@i@@@@N@t@-*L@@G@@@NNN\flKQUVS\waiYYYY\end-*CVPST-*\msg\turaL@@@@@-*@NNN\waiYYYY\end-*CVPSU-*\msg\turr@@@@N-*yM@@@@-*@N@t@@@N\waiYYYY\end-*CVPSV-*\msg\ture@@@@@-*N@i@@@N\waiYYYY\end-*CVPSW-*\msg\turr@N-*i@@@N\waiYYYY\end-*CVPSX-*\key\msga@@@@@-*c@@@N-*a@@N\nod\fljPWRRZWPSX\clr-*w@@@_\ynjPPPP\eqKPQRX\flKPWRR\msg-*e@@w@sN\nod\waiPPPS\fre\eveUPSX-*CVPSY-*\msg\tury@@@c@bL@@-*@@@@@@N-*s@@@@@@NNN\waiYYYY\end-*-*CWPPR-*\mlp\end-*-*CWPQX-*\key\msgd@@@@@_\ynjPPPP\eqMPPPQ\flMPWTR\msg-*d@bN\nod\waiPPPS\fre\eveUPQX-*CWPRS-*\key\msgd@@@@@_\ynjPPPP\eqMPPSR\flMPWTS\msg-*d@b@RNPN\nod\waiPPPS\fre\eveUPRS-*-*CWPSX-*\key\msgd@@@@@_\ynjPPPP\eqMPQRX\flMPWRR\msg-*d@@w@sN\nod\waiPPPS\fre\eveUPSX-*-* \ No newline at end of file diff --git a/res/en/data/Credit.tsc b/res/en/data/Credit.tsc new file mode 100644 index 0000000..1ca0d1c --- /dev/null +++ b/res/en/data/Credit.tsc @@ -0,0 +1 @@ +||͒ƒϢ||͟ג咟Ϣ|랒Ϣ|͒Ϣ|͒גϢ|ͺϢ|͒גϢ|͒ӒϢ|יϢ|͒Ϣ|יϢ|͒Ϣ|͒Ϣ|גӟϢ|͒Ϣ|͒Ϣ||͟ӒגϢ|֒Ϣ|͒Ϣ|גגϢ|͒Ϣ|גϢ|͒Ϣ|Ϣ|͒Ϣ|;Ϣ|͒Ϣ|ͿגϢ|͒Ϣ||͟Ϣ|;Ϣ|͒Ϣ|ג֒Ϣ|͒Ϣ|ߒϢ|͒Ϣ||֒͟גϢ|ͳؒגϢ|͒Ϣ|֒뒵Ϣ|͒גϢ|ޒϢ|͒ג֒Ϣ|͒Ϣ||ͼәϢ|͒Ϣ|͒Ϣ|͒Ϣ|͒Ϣ|͒Ϣ||͟ڒϢ|גڙϢ|͒Ϣ|͒Ϣ|גڙϢ|͒Ϣ|͒䠒Ϣ|ͻߒӒדϢ|͒גϢ||͟Ϣ|גޒϢ|͒Ϣ|גӒϢ|͒Ϣ|Ϣ|͒Ϣ|ʹϢ|͒Ϣ|͒גޒϢ|||ؤ|͟咟Ϣ|גϢ|͒Ϣ|͒גϢ|גϢ|͒Ϣ|ͿْϢ|͒Ϣ||͟ӒϢ|ג撹Ϣ|͒璽Ϣ|גϢ|͒Ϣ|͒ӒϢ|גْϢ|͒גϢ|͒גϢ|גϢ|͒גϢ|͒Ϣ|גגϢ|͒Ϣ|ܢ||ޢ|͟咟Ϣ|ͷ֒גϢ|͒גϢ|͵֒גϢ|͒Ϣ|ӒϢ|͒Ϣ||͟咟Ϣ|ג撹Ϣ|͒璽Ϣ|גϢ|͒Ϣ|͒ӒϢ|גْϢ|͒גϢ|͒גϢ|גϢ|͒גϢ|͒Ϣ|גגϢ|͒Ϣ||͟뒺뒾֒Ϣ|ͼәϢ|͒Ϣ|͒Ϣ|ޢ||||||͒咯Ϣ||͒֒嬒Ϣ|͒גӬϢ|͒֒٬גϢ|͒֬Ϣ|͒ג߬Ϣ|͒ڒ٬Ϣ|͒י׬Ϣ|͒⬒Ϣ|ْ͒ڬϢ|͒ޒ欒Ϣ|͒גْ䬒Ϣ|͒ג䬒䒵Ϣ|͒ג֒欒Ϣ|͒٬Ϣ|ْ͒rϢ|͒欒Ϣ|͒묒Ϣ|͒撿ӬϢ|͒⬒Ϣ|͒䬒Ϣ|ْ͒ެϢ|͒֒䬒Ϣ|͒ג׬Ϣ|͒֒ג䬒Ϣ|͒ڒ׬Ϣ|͒ߒמ묒Ϣ|ْ͒׬Ϣ|͒ߒ֒ᬒϢ|͒ڒ䬒Ϣ|͒ڒ䬒Ϣ|͒ڒ묒ےϢ|͒଒גϢ|͒߬ᒴϢ|͒֬Ϣ|͒ے欒Ϣ|͒⬒쒵Ϣ|͒֒֬גϢ|ْ͒׬Ϣ|͒֒׬䒴Ϣ|͒ޒ䬒Ϣ|͒嬒Ϣ|͒Ւ䬒Ϣ|͒ؒڬϢ|ْ͒׬Ϣ|͒欒Ϣ|͒묒Ϣ||ؤܢޢ||͒ޙ䬒Ϣ|͒ޙ䬒Ϣ|͒଒Ϣ|ْ͒ג嬒Ϣ|͒׬Ϣ|ޢ|||͒咯Ϣ||͸֒ӒϢ|͒֒Ϣ|͒Ϣ|ͿϢ|ْ͒Ϣ|͒Ϣ|ͿןϢ|͒גϢ|͒Ϣ|Ͷ֒ڒ֒Ϣ|͒ᒝϢ|͹֒Ϣ|͒Ϣ|͒ڒϢ|ʹْגϢ|͒Ϣ|ͺؒגϢ|͒Ϣ|ʹْڒג֙Ϣ|͒Ϣ|͒Ϣ|Ϣ|͒Ϣ|͒Ϣ|גϢ|͒֒Ϣ|ג֒ޒϢ|͒Ϣ|͒גϢ|ג֒֒Ϣ|͒֙Ϣ|͒֒Ϣ|ؤܢޢ||גϢ|͒Ϣ|ͺג֒Ϣ|͒Ϣ|͒Ϣ|ޢ|||͒Ϣ||ͳϢ|͹Ϣ|ͿӒϢ|Ϣ|ʹٙϢ||͹Ϣ|͵Ϣ|Ϣ|ͿϢ|Ϣ||ᒹϢ|ͷؒϢ|ͿϢ|Ϣ|Ϣ||ͼӒϢ|ͼӒϢ|;ڒϢ|͹Ϣ|Ϣ||;ْϢ|Ϣ|ْϢ|ͿϢ|ͺ咷Ϣ||͵גϢ|;撵Ϣ|ʹϢ|͵Ϣ|Ϣ||;撴Ϣ|ʹݒϢ|ْϢ|ޒϢ|ג뒴ݒϢ|||ͯޒ咯Ϣ|||ےϢ|璒Ϣ|ͽϢ|ʹϢ|ےϢ|ᒒϢ|ڒ璒Ϣ|͹Ϣ|ͳ֒Ϣ||ݒڠϢ|||͵גגϢ|||||| \ No newline at end of file diff --git a/res/en/data/Head.tsc b/res/en/data/Head.tsc new file mode 100644 index 0000000..e1561b1 --- /dev/null +++ b/res/en/data/Head.tsc @@ -0,0 +1 @@ +gttttQNQNQNgtttuQNrQNQNgttuzQNQNddddttttotxwudrQNQNgttu{QNtvtu~ttu|QNoutttttvtoQNdrQNgttu|QNQNoutttttvtoQNdddrQNQNgttu}QNQNddddtttttttxttttttvtrrrrrQNttytQNoutttttvttttvQNdrtttxQNQNgttwtQNtvtv~ttwvtvtu~ttwuotvtutttyottty~ttutQNttutdddetuztdddddQNpdddddrQNddddQNddddrDQNgttwuQNottty~tttyQNtttzddddtttteQNgttwvQNottut~tttyQNttuuddddtttteQNQNgttxtQNttttttxtttxttttwQNQNddrddttx}QNtttuttyttxwu~ttx|QNQNgttxuQNttttttxtttxttttwQNQNddrddttx}QNtttuttyttxwu~ttx|QNQNgttxvQNttttttxtttxttttwQNQNddddrrrddttx}QNtttuttyttxwu~ttx|QNQNgttx|QNQNQNgttx}QNtttxQNQNQN~drdddxtttdqdxt}}QNxttt~3QN \ No newline at end of file diff --git a/res/en/data/Stage/0.tsc b/res/en/data/Stage/0.tsc new file mode 100644 index 0000000..be08b99 --- /dev/null +++ b/res/en/data/Stage/0.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_idlSSSU_hqg0-FSS\V0-_pqd_fpxSST[_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_idlSSSW_hqg0-0-0-0-0-0-0-0-FSTSS0-_nh|_irpSSTY_zdlSTSS_htPSUXY_fuh_zdlSVWS0-0-_iomUSSS]STTS0-_iomTSUS]STST0-0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-FSTST0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-0-FSTSU0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSY_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSU[S_hyhSUSS0-0-FSTTS0-_vloSSTU_zdlSVXS_flo_zdlSSUS0-_vloSST[_zdlSVXS_flo_zdlSSUS0-_vloSSTW_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSSUS_hyhSUSS0-0-FSUSS0-0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSYTS_idrSSST0-_wudSSZW]STSS]SSST]SSST0-0-FSWSS0-0-FSXSS0-FSXST0-FSXSU0-FSXSV0-FSXSW0-FSXSX0-FSXSY0-0-FSXSZ0-FSXS[0-FSXS\0-FSXTS0-FSXTT0-FSXTU0-FSXTV0-0-#SYSS0-0-0-FTSTS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZX]STSS]SSUS]SSST0-FTSUSp0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZY]STSS]SSST]SSST0-FTSVS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZZ]STSS]SSST]SSST0-FTSWS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZ[]STSS]SSST]SSST0-FTSXS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS[\]STSS]SSST]SSST0-FTSYS0-_iomUSSS]TSYT_hyhTS\S0-FTSYT0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS\V]STSS]SSST]SSST0-0-FTS\S0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]STSS]SSSS0-_idlSSST0-_iomUSSS]TUSS_hyhTTSS0-0-FTTSS0-_zdlSZVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXSV]SVXU]SVSS_zdlSSUS0-_fqsSXSW]SVXU]SWSS_zdlSSUS0-_fqsSXSU]SVXU]SUSS_zdlSSUS0-_fqsSXSX]SVXU]SXSS_zdlSSUS0-_fqsSXST]SVXU]STSS_zdlSSUS0-_fqsSXSY]SVXU]SYSS_zdlSSUS0-_fqsSXSS]SVXU]SSSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTY0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0-0-FTUSS0-_zdlSWVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXTS]SVXU]TSSS_zdlSSUS0-_fqsSXTT]SVXU]TTSS_zdlSSUS0-_fqsSXS\]SVXU]S\SS_zdlSSUS0-_fqsSXTU]SVXU]TUSS_zdlSSUS0-_fqsSXS[]SVXU]S[SS_zdlSSUS0-_fqsSXTV]SVXU]TVSS_zdlSSUS0-_fqsSXSZ]SVXU]SZSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTX0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0- \ No newline at end of file diff --git a/res/en/data/Stage/Almond.tsc b/res/en/data/Stage/Almond.tsc new file mode 100644 index 0000000..2eedf96 --- /dev/null +++ b/res/en/data/Stage/Almond.tsc @@ -0,0 +1 @@ +0==F=IZ[NIPZb==?@ISNV====IR[Q0==F>IZ[NIPZb==?@ISNV===>IR[Q0==F?IZ[NIPZb==?@ISNV===?ISYW=E?FG==FEISYW=E??G==FDIR[Q0==F@IZ[NIPZb==?@ISNV===@IR[Q0==FAIZ[NIPZb==?@ISNV===AIR[Q0==FDIN[]=?B@G==?=G====IR[Q0==FEIP[]=@=CG=>>DG====IN[]=@=CG==@?G===?IR[Q0=>==IXRfISYW=E@FG=>=>I`\b==>>IN[]=>==G====G===?ISN\====Ia_N==ACG==F=G==>DG===F0=>=>IXRfIZ`TV-|{4-|}r{;;;I[\QIR[Q0=?==IXRfISYW=E@?G=?=AISYW=E?AG=?=@ISYW=E?@G=?=?ISYW=E?>G=?=>IZ`T\]R[-`UbaaR_LIf[W====IPY_\]R[V[T-`UbaaR_I[\QIPY\IZfQ====IdNV==@=IN[]=?B=G==>=G===>IdNV==>=IN[]=@==G===>G===?IdNV==??IN[]=?B>G==>=G===>IN[]=@==G===@G===?IdNV==@?IN[]=?B?G==>=G===>IdNV==@?IN[]=?B@G==>=G===>IdNV==@?IN[]=?BAG==>=G===>IQ[]=?B=IdNV==@?IQ[]=?B>IdNV==@?IQ[]=?B?IN[]=?B@G===>G====IdNV==@?IQ[]=@==IP[]=@=>G=>>DG====IN[]=@=>G==?>G===?ISY:=E?=ISY8=E?>ISY8=E??IZ`TNO[\_ZNYVaf-QRaRPaRQ-V[`UbaaR_-[\;-AI[\QIR[Q0=?=>IXRfIZ`TNO[\_ZNYVaf-QRaRPaRQ-V[`UbaaR_-[\;-AI[\QIR[Q0=?=?IXRfIZ`TY\dR_-YVSaLIf[W====IPY_ISY8=E?AY\dR_V[T-YVSaI[\QIPY\IS\[=?BDG==>CIdNV==B=IN[]=?BDG==>=G===@IdNV=>F?IN[]=?BDG====G====IdNV==B=IS\Z==>CIZ`TYVSa-Y\dR_RQI[\QIR[Q0=?=@IXRfIZ`TYVSa-V`-Y\dR_RQI[\QIR[Q0=?=AIXRfIZ`TR__\_I[\QIR[Q0=?>=IXRfISYW=E@=G=?>?ISYW=E?BG=?>>IZ`T\]R[-`UbaaR_LIf[W====IPY_ISY8=E?B\]R[V[T-`UbaaR_I[\QIPY\IdNV==A=IN[]=?BCG==>=G===>IdNV=>?EIQ[]=?BCIZ`T`UbaaR_-\]R[RQI[\QIR[Q0=?>>IXRfIZ`T`UbaaR_-\]R[RQI[\QIR[Q0=?>?IXRfIZ`TR__\_I[\QIR[Q0=?A=I]_VISYW=E?EG=?A>IZ`T`|zruv{t-v-p|vyrq-n|{qur-o|xr{-|o|4-nz;I[\QIPY_dvyy-|-nxr-vLIf[W====IPY_ITVa>=@=IQ[]=?A=IVa8==@=ISY8=E@FIPY_IPZb==>=T|-ur-Ja|-_|}rJ;IdNV=>C=I[\QI_ZbIR[Q0=?A>I]_VIZ`T;;;LI[\QIR[Q0=?A?I]_VIZ`TV4-n{tyrq-};f|-pn{4-tr-v-y||r;;;I[\QIR[Q0=?B=0=?B>0=?B?0=?B@0=?BA0=?BBI]_VIZ`TN-o|xr{-|o|;I[\QV4-rrry-qnzntrq;I[\QIR[Q0=?BC0=?BD0=?BE0=@==IXRfIZ`TISNP==>Fdrvq-}ynpr9-ruLI[\QV-|{qr-vs-uv-n|zr-|-|s-onr;I[\QIR[Q0=@=>IXRfISYW=E?@G=@=?IZ`TISNP==?Bauv-ur4-|{yznqr-v-unysn-|}r{;I[\QIPY_Y||x-yvxr-v4-pntu|{-|zruv{t;;;I[\QIR[Q0=@=?IXRfIZ`TISNP==>FW-ur-nsrur;I[\QNyy-uv-rpv-znxrzr-|{qr-w-un4-q|{urr;I[\QQ|{4-|-uv{xLI[\QIR[Q0=@=AI]_VIZ`TV;;;I[\QIR[Q0=@=BI]_VIZ`TX{|pxrq-|LI[\QIR[Q0=@=CI]_VIZ`Taurr-v-{|-r}y;;;I[\QIVaW==@=G=@=DIR[Q0=@=DI]_VIZ`T`ur-v{4-z|v{t9-o-v-y||xyvxr-ur4-vyy-nyvr;I[\QIPY_ITVa>=@=dvyy-|-r-ur-Ja|-_|}rJLIf[W====IPY\ITVa====IP[]=@=CG=?BFG====ISY8=E@BISY8=E@CISY:=E?FIZ`Tavrq-ur-|}r-|-ur-o|q;I[\QIR[Q0=@A=IXRfIQ[]=@A=IdNV==>=I`\b==??IdNV==>=IZ`Tf|-urn-|zruv{t-tvr;I[\QIPY\IdNV==B=IN[]=?B@G==>=G===>IdNV==AEIQ[]=?B@IN[]=@=>G===@G===?IdNV=>?EIN[]=@=>G===>G===?ISY:=E??ISY8=E?@ISY8=E?CIR[Q0=@B=ISYW=E?BG=@B>IR[Q0=@B>IQ[]=@B=IQ[]=@=>IQ[]=@=?ISY:=E??ISY:=E?CISY8=E?DIP[]=AB=G=>>DG===?IR[Q0=@C=ISYW=E@=G=@C>IR[Q0=@C>IXRfIZfQ===?IQ[]=@C=IN[]=?BEG==>=G===@IdNV=>==IN[]=?BEG==?=G====IPZb==?@IR[Q0=A==0=A=>0=A=?0=A>=0=AB=IXRfI`XW===CG=AB>I`X8===CIRcR=AB?0=AB> I`NaIRcR=AB?0=AB?IXRfISYW=E@DG=@=AISYW=E?EG=@=BIZfO===?IdNV==@=IZfQ===?IZ`TISNP==>FY||x;I[\QIPY_auv-v-n-|yqvr-s|zur-snpr;I[\QV4-nyy-on{trq-};I[\QIPY\ISNP====IS\[=?BAG==>CIN[]=AB=G===>G====IdNV==A=IZ`TISNP==?Baurr4-n-|{-z|r-yvxrv9-||;I[\Qdun-|{-rnu-p|yq4r;;;I[\QIPY_[|-n-Zvzvtn;[|9-|-q|-uv-zpuqnzntr;;;I[\QIPY\IPZb====IN[]=?BBG==?=G====IdNV==?=IS\Z==>CIN[]=AB=G===>G===?IZ`TISNP==?B...IdNV==B=IPY\ISNP====IdNV==@=IN[]=AB=G===>G===?IZ`TISNP==>FV4-vyy-nyvr..I[\QIPY_ISNP==?A7Oooo7I[\QIPY_aRNZ-F-N[[VUVYNaRQI[\QSNVYRQ-a\-QR`a_\f-aN_TRaI[\QIPY_Pb__R[a-S\_PR`V[`bSSVPVR[aI[\QIPY__Ra_RNaI[\Q_Ra_RNa..I[\QIPY\IS\[=?BEG==>CISY8=E?EISY:=E?AIZ[]=?BDG===DG==>EG====IPZ]==A=G==>BG==@=IPZ]==A=G==>CG==@=IP[]=?BEG=>EAG====IN[]=?BEG==>=G===@IdNV=>?EIN[]=?BEG==?=G====IS\Z==>CIdNV==?=IN[]=?BBG==>=G====IN[]=AB=G==@=G===?IdNV==A=IQ[]=B==IO\N=?==IPZb==??IO`Y====IP[]=AB=G=>E=G===?IN[]=AB=G==A=G===?IN[]=A>=G==?=G====IR[Q0=B==IQ[]=B==IO\N=?==IPZb==??IO`Y====IR[Q0>===IXRfIO\N=B==IZfQ=A=>ISY:=E?EIN[]=A>=G==>=G====IP[]=AB=G=>>DG===AIdNV==>==IZ`TISNP==>Fdr-qvq-vL.IdNV=>==I[\QIPY\ISNP====IS\[=A=>G==>CIP[]=A==G==CDG===?IdNV==B=IZ`TISNP==?CUz}u.I[\QIPY_]yyrq-v-|ss9-V-rr.I[\QIPY_ISNP==>Ff|.I[\QIPY_f|4r-un-vpu-u||rq-zr-q|{-urr.I[\QIPY_au|r-puvyqr{-unq-orror-nsr.I[\QIPY_ISNP==>CUn.-Or-vyr{.I[\QIPY_f|4r-{|-z|ur.I[\QQ|-|-rr{-x{|-unuv-vL.I[\QIPY_ISNP==>FdunLI[\QIPY_ISNP==>CUz}u;-auv-v-un-Vunr-no|-|o|;I[\QIPY_auv-v-ur-urn-|s-urvyn{q.I[\QIPY_Vs-|-|}-v9-ur-vyn{qvyy-snyy-|-ur-rnu.I[\QIPY_V-un-|-tn{q-}yn{LI[\QIPY_a|-nxr-ur-vyn{q-q|{vu-|-v{-n-oynr-|sty|L.I[\QIPY_S||y..I[\QIPY\ISNP====IP[]=A=?G=>@FG====IN[]=A=?G==A=G====IdNV=>==IZ`TISNP==?>Ur.I[\QIPY_dun-nr-|-q|v{tLOv{t-ur-p|r-|-uryno|n|-n-|{pr.I[\QIPY_aurr4-vyy-vzr.I[\QIPY\ISNP====IN[]=A==G==>@G===?IdNV==B=IP[]=A==G==E?G===?IdNV==?=IN[]=A==G==?BG===?ISZbIZ`TU||||||\\\\\\\\U..IdNV==B=I[\QIPY\IO\N=C==IdNV==@=IN[]=A==G==?=G===?IN[]=A=?G==@=G====IN[]=A>=G==@=G====IN[]=AB=G==?=G===?IQ[N=>E>IQ[N=>E?IPZ]==A=G==>BG==ADIPZ]==A=G==>CG==ADIdNV=>==IPZb====IS\Z==>CISY8A===ISY8=E@?ISY8=@A>ISY8=DE@ISY8=E@DIR[Q0>>==IXRfISY:A===ISN\===AIdNV==B=IZ`Tf|-r{r-qvz9-n{q-ur-|yqt|-qnx;;;I[\QIPY\IQ[]=AB=ISY8=E@=ISY:=E?BISY8=E?FISY:=E?DISY8=E==ISY8=E=>ISY8=@D?ISY8=A>>ISY8=@A=ISY8=>BFISY8=E@EISY:>CA?ISY8>CA@ISY:=E@FIQ[]=?A=IVaW==@=G>>=>IRcR>>>=0>>=>IdNV=>B=IXRfIZ`?Qvq-|-x{|-un-ur-vpu:|zn{Wr{xn-|{pr-unq-n-o|urLI[\QUv-{nzr-n-Onyy|;I[\QYvxr-uv-vr9-ur-vryqrq}|r-sn-or|{q-u|r-|sz|ny;;;I[\QIPY\IRcR>>>=0>>>=IP[]=@=CG=>>DG===?IN[]=@=CG==@?G===?IN[]=?BEG==>=G===>IdNV==FCIN[]=?BEG===>G====IdNV==B=IZ\c==BBG==>EIQ[N=>E@IVa8==?>IR^8==>CIZ`T;;;;;;LI[\QIPY_;;;f|-pn{-ornur;I[\QISNV===AIdNV==B=IR[Q0>?==IXRfIN[]>?==G==?=G===?ISYW=E?FG>?=>IRcR>?=?0>?=>IP[]=@=CG=>>DG====IN[]=@=CG==@?G===?IRcR>?=?0>?=?IS\[>?==G==>CISNV===>IdNV=>==ISN\===>Ia_N==BCG>?==G==CFG==DC \ No newline at end of file diff --git a/res/en/data/Stage/Ballo1.tsc b/res/en/data/Stage/Ballo1.tsc new file mode 100644 index 0000000..72aac38 --- /dev/null +++ b/res/en/data/Stage/Ballo1.tsc @@ -0,0 +1 @@ +96O\\e\96hyzmhoy\\\\hrmu\\\\hqzp96O\\e]96hyzmhoy\\\\hrmu\\\]hqzp96O\\e^96hyzmhoy\\\\hrmu\\\^hqzp96O\\e_96hyzmhoy\\\\hrmu\\\_hqzp96O\\e`96hyzmhoy\\\\hrmu\\\`hqzp9696O\\ea96hyzmhyp\\\^h|~u96hoy\\_ehrmu\\\^hwq96hmz|\]\\f\\\\f\\\\hmhqzp9696hoy|\\\]f\\\cf\\]dh{\\]^9696O\`\\96O\`\]96O\`\^9696969696O\a\\96hpz|\a\\hyp\\\^96hwqhysZhz{phox~96hrmo\\^euLLnZhz{phox~mLLLX96LLL96LXhz{phox~uLLLL96LZZZhz{phox~LLLL96LLSL96LLLZhz{phox~mLuLLXL96LLLLXhz{phox~LLLLL96XLLXL96LZZZhz{phox~LLL96LLLZhz{phox~uLLLL96,LLuLL96LLZZZhz{phox~xZZZhz{phox~vLLLX96LLLLL96LLLZhz{phox~xXLLLuLZZZhz{phox~LLLL96LLL96SLZZZhz{phox~zXLLMhz{p96{LuYYhz{pLL{MMhz{phox{96hoy\\\`96hmz|\`\^f\]\\f\e\\hr{z\`\^f\\]b96hnx\e\\hmz|\e\\f\\]\f\\\\hqzp9696969696O\e\\96hmz|\e\\f]\\\f\\\a96hr{z\e\\f\\]b96hoz|\`\\f\__ef\\\^96hoz|\`\]f\__ef\\\\96hoy\\\\hmu\_\\96hr{y\\]bhmu\\a\96hn{m\]\\hmu\^\\96hmz|\`\^f\]\\f\\\\96hr{z\`\^f\\]b96hn{m\^\\96hoy\\\chnx\\\\96hqzp969696O]\\\96hrxv]b\\f]\\]96hrxW]b\\96hoy\\\\hn{m\^^\hmu\^\\96hoy\\_^hn{m\_\\hmu\\a\96hn{m\_]]hnx\\\\hqzp9696O]\\]96hwqhr{n\\\\f\\]b96hn{m]\\\hmu\^\\96hoh~m\\e]f\]]\f\\\\f\\\\9696 \ No newline at end of file diff --git a/res/en/data/Stage/Ballo2.tsc b/res/en/data/Stage/Ballo2.tsc new file mode 100644 index 0000000..8e0a888 --- /dev/null +++ b/res/en/data/Stage/Ballo2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMsssssssvPMfss|wPMssssssswPMPMfswssPMfswstPMfswsuPMfswtsPMfswttPMfswtuPMPMPMPMfsxssPMsstysssussssssxsssstPMstxsPMssuxcqqqsst|cjcPMdcccPMcccPMccssuxqqqqqoccoccPMccccPMcqssssPMuccccqqqssxsPMssuxssssPMstssucccccqqqccqqqqqPMswts}ssts}ssssswtt}ssts}sssussxscccccccccqqqPMstssdssxsssssPMssvwstssPMswss}ssss}ssssssusPMswst}ssss}sssuss{sPMssuxcddCssssPMstssPMswss}ssss}sssussusPMswst}sszs}sssussvuPMswst}ssss}ssssssusPMucccccqqqssxsPMccccccqqqssxsPMcccccccqqqqqssxsPMssuxjcccdssxsPMssssvdPMswsu}sss|}ssssstxsPMsssxccdPMcccqPMsst|ccccdsssxccddssssPMPMswst}ssus}sssssstsPMswss}ss{s}sssusssuPMsssxjcdssssPMswsu}sstyPMswsu}sstu}sssusssuPMswsu}stss}sssustssPMPMddstssssxsssstPMssxsssssPMssuxccccPMssuvjccqqqPMsszt}stus}ssss}ssssPMPMPMPM \ No newline at end of file diff --git a/res/en/data/Stage/Barr.tsc b/res/en/data/Stage/Barr.tsc new file mode 100644 index 0000000..e47a9a3 --- /dev/null +++ b/res/en/data/Stage/Barr.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:=:=:=:S`a``=:lv|z`cfaj`a`c=:lv|z`cfbj`a`a=:lv|z`cf`j`a`b=:l{ul``aalq~`a``j````j```b=:lvq```dlq``aaj``idj``dbj``eb=:S`a`a=:lyl}wyPWPQl~tlu~t=:S`a`b=:l{ulvq```dlq``aaj``idj``dbj``eb=:S`a`c=:lyl}wPWPQl~tlu~t=:=:S`ae`=:S`aea=:S`aeb=:S`aec=:S`aed=:=:S`bi`=:lv|z`cg`j`bialu~t=:S`bia=:lv|z`cf`j````lyl}wlvqs```h\PQQl~tlt~`bi`ls~a```j``fcj```blu~t=:=:S`d``=:l{ulv|]`cfalv|]`cfb=:l}sls~`d``j``abj````lq~`d``j``b`j```dlqy`ad`=:lyl}wlvqs```ezPPQl~tlvqs````l{uls|=:lqy`a``ls}``ae=:l}w=:vPPrQlqy`ad`l~t=:l``dels~`ae`j```aj````lqy```d=:l``dels~`aeaj```aj````lqy```d=:l``dels~`aebj```aj````lqy```d=:l``dels~`aecj```aj````lqy```d=:l``dels~`aedj```aj````=:ls}```hlu~t=:=:S`e``=:=:Sa```=:l{ulv|[`cf`lv|[`cfalv|[`dd`lv|]`cbfl}wuQl~tls|P\PPQQl~tls|^^^^^l~txol~tl}r```blqy``c`l}t```bls~a```j``f`j```dls|lvqs```fW^^^WP=:PPtol~tls|QPyWP^l~t=:PPP^=:PtWPP=:P^l~t=:PPPP=:PPP\l~t=:PP=:^^^l~tls||PP^=:xPPP^l~tls|Ql~t=:PQlwya``dl~tls|PPPPol~t=:PPPPQl~tls|^^^^^l~tls|^^^PyPWP=:P^l~t=:lwy````{PPPP=:PPPPP=:PPyPP^^^l~t=:PPP^l~tls|=:lvqs```0ls}````=:lq``c`l``bf=:lq~a```j```hj````=:lq~`a``j```aj````=:lqy``a`=:l}t````=:ls~a```j``f`j````=:lqy`a``=:lq``c`l``bf=:lq~a```j```hj````=:lq~`a``j```aj````=:lqy``g`=:lq``c`l``bf=:lq~a```j```hj````=:ls~`d``j``aij```b=:ls~`a``j``ahj```b=:ls}```dj```hj``h`=:ls}```ej```hj``ha=:ls}```fj```hj``hb=:ls}```dj```ij``if=:ls}```ej```ij``ig=:ls}```fj```ij``ih=:=:=:l}wxQlqy``e`ls~`d``j``abj```blq~`d``j``c`j```bls|l{uls}``aalvqs``adPPQl~tls|lvqs```ePWP\PPQl~t=:yWPPPPP=:Ql~tlvqs````ls|yPP^l~t=:ls~`e``j``fgj```blqy`a``lq~`e``j``acj```blqy``e`lq~a```j```hj````l}wlvqs``aeP\PPyP=:PPPP^l~tls|lvqs```e}Ql~tls|yPPPQl~tls|lvqs```h]]PWP=:Pt\PWPQl~tls|lvqs``ae^^^^^l~tls|lvqs``afPWP\Po=:PtPP=:P^l~t=:sP\P^l~tls|lvqs```f^^^ol~tls|=:yWPP^l~tlvqs````ls|=:lq~`e``j``aej```blqy`aa`=:lyl}wlvqs```huQl~tlvqs``aels|r^l~t=:yPPPPP^l~tls|=:lq~`e``j``b`j```blvqs````ls|=:l{ulqy``e`l}wlvqs```h~\P\PWPP=:]]Ql~tlvqs````ls|=:lqy``e`=:lvqs```el}w~Pqwqy~Ql~t=:yPPPPPQl~t=:qPPyPP=:vyQl~tls|^^^^^l~tls|PWPPol~t=:PPPP=:Pol~za``alq~`d``j``c`j```bls|=:lvqs``adyPPQl~tls|=:lv|[`cfals}```dls~`d``j``fhj```blr|`d``lu~t=:=:Sa``a=:l{ulv|]`cfblv|]`cfals}```hl}wlvqs```ex^l~t=:qP\PPP^l~tls|lq~`d``j``a`j```blu~t=:=: \ No newline at end of file diff --git a/res/en/data/Stage/Blcny1.tsc b/res/en/data/Stage/Blcny1.tsc new file mode 100644 index 0000000..3f41969 --- /dev/null +++ b/res/en/data/Stage/Blcny1.tsc @@ -0,0 +1 @@ +FSS\S0-_nh|_ioPTT\S_ioPTT\T_ioNTT\U_pqd_fpxSSVS_idlSSSS_hqg0-FSS\T0-_nh|_ioNTT\S_ioPTT\T_ioPTT\U_pqd_fpxSSVS_idlSSST_hqg0-FSS\U0-_nh|_pqd_fpxSSVS_idlSSSU_hqg0-FSS\V0-_nh|_pqd_fpxSSVS_idlSSSV_hqg0-FSS\W0-_nh|_ioPTT\S_ioNTT\T_ioPTT\U_pqd_fpxSSVS_idlSSSW_hqg0-0-FSS\X0-_nh|_idlSSSW_hqg0-0-0-FSTSS0-_nh|_vrxSSTT_dqsSTSS]SSSS]SSSU_idrSSSV0-_lwmSSUV]STST_wudSSYV]SS\V]SSS\]SSSW0-0-FSTST0-_nh|_wudSSYZ]SS\V]SSS\]SSSW0-0-0-0-FSTTS0-_sul_idrSSSU_wudSSYW]SS\U]SSST]SSTT0-0-FSTUS0-_nh|_dqsSTUS]SSSS]SSSU_vrxSSTT_idrSSSW_wudSSYY]SS\W]SSTS]SSS[0-0-#STVS0-_sul_pvjwCCCC0-vCCCCCCQQQ_qrg_hqg0-0-FST\\0-_sul_pvjqCQ_qrg_hqg0-_idrSSSWhQ_qrg_for_fpxSSVV_fuh_zdl\\\\_hqg0-0-FSUSS0-_nh|_p|gSSSS_gqsSUSS_zdv_pvjdCCCJ0-CCD_qrg_hqg0-0-FSUST0-_sul_pvj_wxu0-CCCCCCCCCCCCwkdwJvCdooOCironvD_qrg_hqg0-0-FSUTS0-_sul_iomTT\T]SUTT_iomTT\U]SUTU0-_sul_idrSSSW_p|gSSSU_zdlSSXS_wudSSYU]SS\X]SSSZ]SSZW0-FSUTT0-_sul_idrSSSW_p|gSSSU_zdlSSXS_wudSSYU]SS\X]SSZ\]SSZV0-FSUTU0-_sul_idrSSSW_p|gSSSS_zdlSSXS_wudSSYU]SS\X]STTZ]SSYU0-0- \ No newline at end of file diff --git a/res/en/data/Stage/Blcny2.tsc b/res/en/data/Stage/Blcny2.tsc new file mode 100644 index 0000000..0c9ee66 --- /dev/null +++ b/res/en/data/Stage/Blcny2.tsc @@ -0,0 +1 @@ +_llulIFxximmulximmumxgmmunxllmtx}llllxIF_llumIFxxgmmulximmumximmunxllmtx}lllmxIF_llunIFxxllmtx}lllnxIF_lluoIFxxllmtx}llloxIF_llupIFxximmulxgmmumximmunxllmtx}lllpxIF_lluqIFxx}lntlvllmlvllllxlntlvllmrIFx}llqlx}lllpxIFIF_lmllIFxxllmmx}lmllvllllvlllnx}llloIFxllnovlmlmx}llrovlluovllluvlllpIFIF_lmlmIFxx}llrsvlluovllluvlllpIFIFIFIF_lmmlIFxx}lllnx}llrpvllunvlllmvllmmIFIFIFIF_lmnlIFxxmouovlmnmx\c\]xxIF_lmnmIFxx}lllpxllmrx}llsuvllupvllmlvllltIFIFIF_lmuuIFxxlloox\\\]IF\\\\IF\jjjxxxIFIF_lnllIFxxllllxlnllx}\\\cIF\\]xxIFIF_lnlmIFxxxIF}c\}h\]xxIFIF_lnmlIFxxmmumvlnmmxmmunvlnmnIFxx}lllpxlllnx}llqlx}llslvlluqvlllsvllspIF_lnmmIFxx}lllpxlllnx}llqlx}llslvlluqvllsuvllsoIF_lnmnIFxx}lllpxllllx}llqlx}llslvlluqvlmmsvllrnIFIF_lntlIFIF_lnulIF_lnumIF_lnunIF_lnuoIF_lnupIF_lnuuIFIFIFIFIF_lollIFxxxlollvllmrIFx}lltlx}lnuuvllnlvlllnIFxx}llnlIFxc\]xxx}lllmx}llqlIFxlnumvlnmsvllllx}lnumvllplvllllx}llqlIFx}lnulvllllvllllx}llnlIFxx}llntc\\\]IFc\\\\IF\jxxjjj\\\IFc\\\IF\\\jjjxx<}llllIFx}lnumvllqlvllllx}llmrIFxx}llnn\\\cIF\jjjxxIFx}llllx}llmrIFx}llmlIFx}lnulvlllovllllIFx}lnumvllmlvllllIFxlnunvlnsuvllllIFxlnuovlnsuvllllIFxlnupvlnsuvlllnx}lmllIFx}lnumvllpnvllllIFx}lnulvllllvllllIFxx}llnt}\jjj{xxx}llnn\jjj{IF\c\]xxIFx}llloxllmrxxlllnx}llrtvlrllvllnpvllmoIFxIFIF_lolqIF_lolrIF_lolsIF_lomlIFxxllllxllmtximmulximmumxgmmunx}llllIFx}lolqvllmmvlllnIFx}lntlvllmlvllllIFxlolqvllmrxox}lllo\]xIF\\\\hIF\c\\IF]]xxlntlvllmrxIFx}lolqvllolvllllx}llrlIFxlolqximoumxIF_lonlinIFIF_loolIFxxloolxllllx}lonlvllllvlllnIFx}x}llqlIFxlonlvllmrxx}lllmc\\\IFj\c\\\IF\jxIFc\\\\IF\\\\IF\]xx\{xIF\\\\\]xxxIFx}lonlvllllvllllx}llqlIFx}lonlvllolvllllx}llmnIFx}lonlvllplvllllx}llqlIFximounxllmrxIFIF_lpllIFxxxlpllx}llolxx}llllIFxlqllvlnqpvllllx}lllmIFx}lqllvllnlvlllnx}lllmIFx}lqllvllolvlllnx}lllmIFxlqllvllmrxllnlvllolIFxlolsxlntlIFx}lmllx}lllpIFxx}llnnIF\c\jjjxxx}llntc\\jIFc\\\\]xxx}lllpIFxlloqx}llpuvmnllvllutvlllrIFIF_lqllIFIF \ No newline at end of file diff --git a/res/en/data/Stage/Cave.tsc b/res/en/data/Stage/Cave.tsc new file mode 100644 index 0000000..e2fc191 --- /dev/null +++ b/res/en/data/Stage/Cave.tsc @@ -0,0 +1 @@ +?FWXKFMW_::FOXN-::C?-::CCFUOcFWXKFMW_::FMXZ:=:;D:;;F^\K:::;D::CCD:::?D:::B-:;:;FZ\SFPKY:::>F^\K::?;D::C>D:::>D:::>-:;:<FZ\SFPKY:::>F^\K::?;D::C>D::;BD:::B-:;:=FZ\SFPKY:::>F^\K:::?D::C>D::;:D:::B-:;:?FZ\SFPKY:::>F^\K::?:D::C>D::;F^\K::?:D::C>D::;;D::;<-:;:BFZ\SFPVT:;:=D:;:CFW]QS~*yx1~*yzox+FXYNFOXN-:;:CFUOcF]Y_::;;FKXZ:;:BD::::D:::F^\K::?D:::>D::;:-:;;:FUOcFPKY:::>F^\K::?>D::C>D::;:D:::C-:;;;-:<::FZ\SFW]Q^ro*mk|mk}}*yp*k*]u*N|kqyx888FXYNFOXN-:<:;FKXZ:<:;D::::D::: \ No newline at end of file diff --git a/res/en/data/Stage/Fall.tsc b/res/en/data/Stage/Fall.tsc new file mode 100644 index 0000000..c653bb8 --- /dev/null +++ b/res/en/data/Stage/Fall.tsc @@ -0,0 +1 @@ +rorororororororororororororororororororororororoمޅƆܓׅمڌroޅхم˓̅Յʅʓё܅ʅɅroԅʅʅ҅ޅro؅˅ʅדroʅ؅ӅɆroٌܑ؅ԅʓrororororororororo܆ٓ؅ʓم؅roх؅ʅroʓro؅ʅʅroڅׅʓro͑ӌمЅʓro؅م̅roޅɅʅԅԓޤڅӑroمͤroٌ؅ٓمʅroׅؓroБمroɅׅؓڅمؑ٤ӅڅɅّroمɅׅʓro܅ׅ˅؅roԅe؅roʆمڅ؅roمؑroم؅م؅roʅӌ؅نёڅՅroڅܓroׅёތ؅roʅԅɅ҅ʅroӅӅʅمʓ͓roڅӌمޓԅޓroroԆroԤԅمʅڅroԅԅܤroӅʅڅroڅʓґڌʅׅٓӅ؅בroɅ܅ممroʅمޅءroʅʅro݅Ʌޅroхܓro͑څܓroҤɅمʅхro˅Ʌڅʤroʆroٌ؅ʅʅro˅؅׆roޤхمڅЅroٓroمɅ؅ƅroʑޤroڅمنхمӑro͡ơӡ̡ԡӡ١Ρ̡͡١rorororoӌمڅro̤rorororororororo \ No newline at end of file diff --git a/res/en/data/Stage/Frog.tsc b/res/en/data/Stage/Frog.tsc new file mode 100644 index 0000000..da13082 --- /dev/null +++ b/res/en/data/Stage/Frog.tsc @@ -0,0 +1 @@ +yvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvړڍyvyvyvŨyvЌььyvьٌѩíyvíŰíyvԫyvíyvьښyvیތѫИڌьyvњړЌјyvړ͌lyvٌьѫړьyvьyvíŰíyvyv卨Ԍѓyv͌ލތڌ͌͘yvڍړ嚨yvííyvߌьŻ嚨yvíь׌ڌyvѓߌڌߚyvíyvyv׍yvyvyvyvyvyvyvŨíyvyvҌӍíyvyvyv \ No newline at end of file diff --git a/res/en/data/Stage/Gard.tsc b/res/en/data/Stage/Gard.tsc new file mode 100644 index 0000000..95bb3c6 --- /dev/null +++ b/res/en/data/Stage/Gard.tsc @@ -0,0 +1 @@ +YVo|||YV||||||||YVo||}YV|||||||}YVo||~YV|||||||~YVo||YV|||||||YVo||YV|||||||YVYVo|}||YV|~|}|~|~}|}|}YVw|~YV||||||||||||}YVo|}|}YVlsl±mYVo|}|~YV|||||}||||~~||YVYVYVo|||YV|||||}w|||||~YVo||}YV||~YVo||~YV|||~YVw|w|y||}y|~YVw|~|w|~}||}||||}|||YV|||||}lzYVl±lllYVllŻlzYV||~}lzllzzzYVlñllYVzYV|||||~|||||||||||YVlllYVñ||||YV|||||~|||||||~YV||}z||~}xlzzzsllYVl±llYVzzz||}lzzzYVlllllYV||~}zzzxllllYVzYVzzzzzzzzYVxlllYVllllz||}xllz||||YV||~||||||||||YV|||}|||||}}|YVm|||||||||||||||zzzzzlzzz||||YV||||||||||||~|||m||||YV|||||||||||||||||~|}||YV||||}~|||~||||}||||~YV||||||||~YV||}yzYVllŻlYVŻsl||||}||}zYVllllñz||}||||||||~YVllz||||YV||||||||~||~YV||||||||~|||YV|||mlmYV|||lzllmYV||||||||lŻlllmmLYV||||}|||||}YV||||}|||~||||~||||~||||||YV||||}||||~||~YV||||||||~||~YV||||~||||||||YV||||||||~||~||YV|||mYVlŻlŋm||}}zzzzzzzzzzzzYVzzzlzzz|||YVmmmm||}||}mlslYVm||||YV|||||~}zzzzzxlűzYVlllzlllxllYVŻllzlllŻYVzxlôlĭlYVlŻllllõYVlûyyzzz|||sllŻmm||||YV||||}||||~|||YV||~||~|||||||}YV||}||}|||||YV|||}|||~||}YV|||||||||||||}YV|}|||||}|YV||~}xlllYVlllYVll||||||YVmsllYVllm||}||}||}||~|||||s±lllYVlzYVxlsllŻmxlxlxYVsllzYV±lxlŻlz||}||||||||}|||||YV|||}||||~||YV||}YVYVYVYVo||}YVo||~YVo||YVw|~|}}|}~YV||||}|||}|||||YV|||||||YVYVlƵlz|||YV|||}|||||}|||}YVo||YVo||YV|~~||}YV|~|||YVzzzzzzYVo||YVo||YVYVo|||YVw|~~|||zzzsllllzYVlŻzzz±lzzzYV|||||||||||||}||YVo||}YVy|~}||w|||||||YV|||||}|YVllz|}|YVYV \ No newline at end of file diff --git a/res/en/data/Stage/Hell1.tsc b/res/en/data/Stage/Hell1.tsc new file mode 100644 index 0000000..6989da1 --- /dev/null +++ b/res/en/data/Stage/Hell1.tsc @@ -0,0 +1 @@ +rororororororororororororororoׅɓrororoڅхƅЅɅroͅړroх؅Ʌԅхrorororororororororororororororoʅԅцrororororoمƅʅʢro݅eͅɅޅrorororororororororo͓roɅׅޅԅroͅʅʓrororororoɅڅ܅مʅ͒roƅʅɅƅפro؅ʅ؅ؓroʅ؅בʅro؅ׅɅʅroؓrorororoʅɅ؅х؅roՅɅʅʑroɅʅʅɅɅro҅ӅӓӅʅӅޅɅroӅ̓roro \ No newline at end of file diff --git a/res/en/data/Stage/Hell2.tsc b/res/en/data/Stage/Hell2.tsc new file mode 100644 index 0000000..6b82149 --- /dev/null +++ b/res/en/data/Stage/Hell2.tsc @@ -0,0 +1 @@ +ururururururururururururururururururururururururur͏ۈ׈ψӖurururururur͈ۈψ̈urḧ̈ֈur֔ur͈ۈ܈urԈ̈Ԗurۈֈ͈urۈ̖ururururڈ͈͈ur͈͔ۏۈurۈֈ̖ur͈ψۈ̈ur͈ԈΈˈur̈ֈֈܖurֈɈ͈ܔ͈ur܈ۈ׈̈ۈur׈ֈۖurur \ No newline at end of file diff --git a/res/en/data/Stage/Hell3.tsc b/res/en/data/Stage/Hell3.tsc new file mode 100644 index 0000000..965cef6 --- /dev/null +++ b/res/en/data/Stage/Hell3.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFPKS::::FOXN-::C;FWXKFPKS:::;FOXN-::C<FWXKFPKS:::FWXKFPKS:::>FOXN-::C?FUOcFPVT;?=D:;;;F^\K::B>D::C?D::;:D:::<-:;;;F^\K::B?D::C?D::;:D:::<-:<::FMXZ:<::D:=<:D::::FPV7;?=D:::;FMWZ:::BD::;>D:::;FMWZ:::CD::;>D:::;FMWZ::;:D::;>D:::;FMWZ::;;D::;>D:::;FMWZ::;D:::;FMWZ::;=D::;>D:::;FOXN-:<>:-:<>;FNXZ:<>;FKXZ:<>:D::;:D:::=FOXN-:<><-:<>=FNXZ:<>=FKXZ:<>>-:<>?FNXZ:<>?FKXZ:<>>D::;:D:::=FOXN-:-:D::;:D:::;FOXN-:D::::-:>::FZ\SFPVT:<:::;FPV5:<:;FQS^:::?FKW5:::?D:;::FMW_::;:Qy~*~ro*GWs}}svo*Vkxmro|G+FaKS:;@:FXYNF\W_FMV\^ro*Ws}}svo*Vkxmro|*s}*k*zyo|pvokzyx6*l~*s~}*kwwy*s}*vsws~on8FXYNFMV\cy*mkx*|ozvoxs}r*y|*}~ymuzsvos~r*s~ow}*n|yzzon*l*oxowso}8FXYNFOXN-:>:;FZ\SFKW5:::?D::=:<FZ\SFKW5::;:D::<>FW]QFQS^::;;Wk*ws}}svo}*sxm|ok}on*l*FX_W::::+FXYNFOXN-:C::FNXZ:C::F]UT::<>D::::F]U5::<>FZ\SFW]=Toxuk6*}oosxq*ro|*l|y~ro|1}wknxo}}6*myxpsxon*rsw*~y*~rs}pvyk~sxq*s}vkxn8FXYN^rk~*k}*~ro*wy}~*}ro*myvn*ny8FXYNOox*k}*ro*k}6*}ro*myvn*xy~l|sxq*ro|}ovp*~y*usvv*ro|*yxl|y~ro|888FXYNFOXN-:C:;FNXZ:C:;F]UT::IZ[NIPZb===EISNV===>IR[Q0==F?IZ[NIPZb===EISNV===?IR[Q0==F@IZ[NIPZb===EISNV===@IR[Q0==FAIXRfISYW>===G==FBIZ[NIPZb===EISNV===AIRcR=?==0==FBIZ[NIPZb===EISNV===AIR[Q0=>==IXRfI`\b==>>IN[]=>==G====G===?ISN\===AIa_N==B@G==FAG==DBG===B0=>>=IXRfI`\b==>>IN[]=>>=G====G===?ISN\====Ia_N==BCG==F=G=>>EG==E@0=?==IXRfISY8>===ISY8>=?BISY8>=@EIZfQ===?IdNV==B=IN[]=A==G==>=G====IZ`Tbnu.I[\QIPY\IN[]=A==G==?=G====IdNV==B=IR[Q0=A==IXRfISYW>==@G=A=AISYW>>=?G=A=@ISYW>==?G=A=?ISYW>==>G=A=>ISY8>==>ISY8>=@EIN[]=A==G==>=G====IZ`TRnnuu.IZfO===?I[\QIPY_Q|{4-xvyy-zr.I[\QV4z-n-uzn{.-V-w-t|zntvpnyy-{rq-v{|n-Zvzvtn.-V4z-uzn{.I[\QIPY_UuLI[\QIPY_;;;;;I[\QIPY_IN[]=A==G====G====ISNP==?Edun4-uvLf|4r-{|-|{r-|s-u|rxvyyr-|o|LI[\Qdryy9-|-pnrq-ur}n{-|ss-zr9-wz}v{t|-yvxr-un.I[\QIPY_f|-|yq{4-or-unnv|9-|yq-|LI[\QIR[Q0=A=>IXRfISY8>==?IZ`TISNP==?EV4z-V|u9-|{r-|s-ur uzn{-u|-pnzr-|-uvvyn{q-|-q|-rrnpu;I[\Qaun-vpu-Zvr-{rqzr-v{|-uv;;;I[\QV-zn{ntrq-|-tr-nn9o;;;w-y||x-n-zr;I[\QIPY_N{q-{|-V4z-px-urr.I[\QIPY_f|-pyvzorq-}-s|z-ur|vqr9-qvq{4-|;I[\QV4z-n{-r{tv{rr-|sp|{vqrnoyr-nyr{9I[\Qo-V4z-qrnuy-nsnvq|s-urvtu;;;I[\QIPY_\u9-|r9-|r-v-zr;;;I[\QIPY_V-{rr-u|yq4r-p|zr|-uv-vyn{q-v{-ursv-}ynpr;I[\QIR[Q0=A=?IXRfIZ`TISNP==?E[|9-{|9-ry-|-unr{|-r-s|-pu-n-}nurvp9n{qrq-yvyr-zn{;I[\QIR[Q0=A=@IXRfIZ`TISY8>==@ISNP==?EV|uLI[\Q-fr9-un4-zr;I[\QIPY_dun4-unLI[\Q`nxnz||4-|xv{t-|{n-|pxrLI[\QIPY_`|-ur4-vyy-nyvr;;;I[\QN-svrpr-|{r9-ur-v;I[\Q[|uv{t-yvxr-zr9-un4s|-r;;;I[\QIPY_Nyy-vtu9-ur{;I[\Qanxr-uv;I[\QISNP====ITVa>=?DIVa8==?DIPY_IPZb==>=T|-ur-JP|{|yyrJ;IdNV=>C=I[\QI_ZbIPY_ISNP==?EV-uv{x-un4-unur4-nsr;I[\QITVa====IRcR=A=A0=A=AIXRfIZ`TISNP==?ETvr-Z;-`nxnz||-zrtnq;I[\QIR[Q \ No newline at end of file diff --git a/res/en/data/Stage/Jail1.tsc b/res/en/data/Stage/Jail1.tsc new file mode 100644 index 0000000..e61798b --- /dev/null +++ b/res/en/data/Stage/Jail1.tsc @@ -0,0 +1 @@ +[Xq~~~[X~~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[X[Xq~~~[X~~~~~~~~~~~~~[X[Xq~~[X~~~~~~~~~~~~~~~~~~~~~~~~[X[X[Xq~~~[X[X~~~[X~~~~[Xxnx|||o[X~~~~~~~~~~~~~~~~~~~~y~~{~y~[XznnŶunů|õnǽnnn|[Xnunnn³[Xnn·nónnǽ|nn¶n|[XnŶnn½nn¶n½[Xn¶żnn|[Xnnðnn[Xƾ||||||unŶnón|Nnnnn[Xunnn½n³|[Xnn½nnnnŷ¶n|nůnnnǽn¶[XŶn·|[XnnnºnŶnz[X¶nnn½nnů|~~[X[Xq~~[Xy~ndz|nn¶núnnz[Xnnnn¶n½[Xǽn|~~~~~~~~[X[Xq~~[Xnůnznnijn³~~~~~~~~[X[Xq~~[X~~~~~~~~~~[X[X[Xq~~[X~~~~~~~~~~~~~~~~[X~~~o[X~~~uo[X[XunnznnǽÍ|||||[X~~~y~~~~~~~~~~~~~~~[Xq~[X[X \ No newline at end of file diff --git a/res/en/data/Stage/Jail2.tsc b/res/en/data/Stage/Jail2.tsc new file mode 100644 index 0000000..2183673 --- /dev/null +++ b/res/en/data/Stage/Jail2.tsc @@ -0,0 +1 @@ +TQjwwwTQwwwwwwwTQjwwxTQwwwwwwxTQjwwyTQwwwwwwyTQjwwzTQwwwwwwzTQjww{TQwwwwww{TQTQjwwTQwwwTQwywwwwwxwwwwwww{TQwzwxwxxywwwywxwwTQwywwwwwwwwwwTQwwwywzwxTQTQjwxwwTQwwwyww|}wwywwwww{TQTQjwywwTQggguTQgggggwwwwrw|y{TQwzwwwxxxwwwwww}wwywwwwwxwwwwTQwxwwwww{wwxwwwwx|wwxwTQTQTQjw{wwTQGsgggggggggTQjw{wxTQghTQjw{wyTQggggghTQTQjw{wzTQgggggTQgggghgnggggTQghTQjw{w{TQggggiiTQnggggTQgggguuuTQjw{w|TQggggggTQggsgggngTQguuuTQgggguTQTQ \ No newline at end of file diff --git a/res/en/data/Stage/Jenka1.tsc b/res/en/data/Stage/Jenka1.tsc new file mode 100644 index 0000000..121c82f --- /dev/null +++ b/res/en/data/Stage/Jenka1.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPQY\faiPPPP\end-*CPPYQ-*\mna\cmuPPQY\faiPPPQ\end-*CPPYR-*\mna\cmuPPQY\faiPPPR\end-*CPPYS-*\mna\cmuPPQY\faiPPPS\end-*CPPYT-*\mna\cmuPPQY\faiPPPT\end-*-*CPQPP-*\pri\souPPQQ\dnpPQPP\faoPPPT\traPPQPZPPYTZPPSUZPPRV-*-*-*CPRPP-*\key-*\itjPPQTZPRPQ-*\fljPUYTZPRQT-*\fljPUYSZPRQS-*\fljPUYRZPRQR-*\fljPUYQZPRQQ-*\fljPUYPZPRQP-*\key\msg\facPPQSw@@NNN_\nod-*iG@@@-*@N\nod\end-*-*CPRPQ-*\itMPPQT-*\fljPUYTZPRRT-*\fljPUYSZPRRS-*\fljPUYRZPRRR-*\fljPUYQZPRRQ-*\fljPUYPZPRRP-*\key\msg\facPPQSoL@A\nod\clr\gitQPQTm@@A\nod\clr-*\gitPPPP\facPPPPg@@@]p]N\nod\clr\cnpPSPPZPQSPZPPPP\dnpPTPQ\flMPRWT\facPPQSy@@@L-*i@@_\nod-*m@N\nod\clrwG@_\nod-*]r@]_\nod\facPPPP\clr\cmuPPPP\msghA\nod\clo-*\cnpPTPPZPPPYZPPPP\waiPPQP\mydPPPR\cnpPSPPZPQSRZPPPR\anpPSPPZPQPPZPPPR\waiPQRP\cmuPPQQ-*\cnpPTPPZPPQRZPPPP-*\msg\facPPPUhG@@L@j_\nod\clr\facPPQSaL@bN\nod\anpPSPPZPQRPZPPPR-*yG@@L@i@N\nod-*a@@@@@-*@@_\nod\clr\facPPQThMMA\nod-*h_@y@@m_\nod-*sG@L@@N\nod\clra@@@@N\nod-*t@L@@-*@@A\nod\clr\facPPQSs@@@@-*@NNN\nod\clr\facPPPUiG@@@@-*@@N\nod-*i@@@@@-*@@@N\nod\clrt@@@@-*@@A\nod\clr\facPPQSNNNNN\nod\clrmNNN\nod-*w@@@@-*@_\nod\clr-*\anpPTPPZPPSPZPPPP\facPPQThA\nod\clrp@@L@-*_A\nod\clr\facPPPUNNNNN\nod\clri@@@@N\nod-*s@G@@-*@N\nod\clo\cmuPPPP-*\waiPPUP\facPPPU\msgyG@@N\nod\clo-*\facPPPP\anpPTPPZPPQPZPPPP\waiPRPP\cmuPPQY-*\msg\facPPQS\cnpPSPPZPQSPZPPPPa@@NNN\nod-*t@MMN\nod\mydPRPP\clrNNNNN\nod\clrt@@@-*N\nod-*f@@-*@NNN\nod\clra@@@@@N\nod\clrc@@@-*@@@@-*@@@_\nod\flKPUYP\end-*-*CPRQP-*\key\msg\facPPQSs@@NNN\nod-*c@@@-*@@@@-*@@@_\nod\end-*-*CPRQQ-*\key\msg\facPPQSt@@N\nod-*g@N\nod\end-*-*CPRQR-*\key\msg\facPPQSi@@@-*@@@-*@N\nod\clrt@@@NNN\nod\end-*-*CPRQS-*\key\msg\facPPQSo@@@NNN\nod-*i@@@@-*@@@N\nod\end-*-*-*CPRRP-*\key\msg\facPPQSm@L@@N\nod\clr\gitQPQTt@@ @-*@@N\nod\clr-*\gitPPPP\cnpPSPQZPQSPZPPPP\dnpPTPQ\facPPPPg@@@]p]N\nod\clr\flMPRWT\facPPQShNNN\nod-*yG@@@-*@L@G@N\nod\clrNNNNN\nod\clri@G@@@-*@@@-*@@@@N\nod-*c@m@-*@@N\nod-*a@@@@-*@@@N\nod\clrcL@@m-*@@-*@@L\nod-*@@@-*@@@-*@@@N\nod\clrh@@@@-*L@@m@-*@@\nod-*@@NNN\nod\clrt@@N\nodg@N\nod\flKPUYQ\end-*-*CPRRQ-*\key\msg\facPPQSoN\nod\clr\gitQPQTyL@N\nod-*t@@@@-*@@N\nod\clr-*\gitPPPP\cnpPSPRZPQSPZPPPP\dnpPTPQ\facPPPPg@@@]p]N\nod\clr\flMPRWT\facPPQSt@@N-*wG@@@@NNN\nod\clrNNNNN\nod\clrh@@@@-*@m_\nod\clrt@@m@-*@@@-*@@@N\nod-*t@@L@@-*@@@N\nod\clr-*hNNN\nod\clrd@@@-*@@-*_\nod\clrNNNNN\nod\clri@@@@NNN\nod-*t@@mL-*@@@-*@@L\nod-*@@-*N\nod-*i@@@@-*L@@-*@@L\nod-*@@N\nod\clra@@@-*m@@-*@NNN\nod-*i@@@NNN\nod\clrd@@@_\nod-*d@@@-*@@-*@_\nod\clrNNNNN\nod\clrt@@@NNN\nod\flKPUYR\end-*-*CPRRR-*\key\msg\facPPQSt@@@-*@N\nod-*m@@G@-*@@-*@N\nod\clr\gitQPQTm@NNN\nod\clr-*\gitPPPP\facPPPPg@@@]p]N\nod\clr\cnpPSPSZPQSPZPPPP\dnpPTPQ\flMPRWT-*\facPPQSNNNNN\nod\clryG@@-*@L@G-*N\nod-*w@@@@-*@@NNN\nod\clri@G@@@-*L@G@@-*@N\nod-*t@@@-*@@@-*@@@NNN\nod\clroL@L@NNN\nod\clrtG@@-*N\nod\flKPUYS\end-*-*CPSPP-*\fljPUYPZPSQP\end-*CPSPQ-*\fljPUYQZPSQQ\end-*CPSPR-*\fljPUYRZPSQR\end-*CPSPS-*\fljPUYSZPSQS\end-*CPSPT-*\fljPUYTZPSQT\end-*-*CPSQP-*\key\msgaA\nod\end-*CPSQQ-*\key\msga@A\nod\end-*CPSQR-*\key\msga@@A\nod\end-*CPSQS-*\key\msgbN\nod\end-*CPSQT-*\key\msgfA\nod\end-*-*-*CPTPP-*CPTPQ-*-* \ No newline at end of file diff --git a/res/en/data/Stage/Jenka2.tsc b/res/en/data/Stage/Jenka2.tsc new file mode 100644 index 0000000..f0a9ebf --- /dev/null +++ b/res/en/data/Stage/Jenka2.tsc @@ -0,0 +1 @@ +ǺΩ©ǽǺΩ©ǽǺΩ©ǽǺΩ©ǽǺéľҵΩ©ϾǺΩ©ǽµΩɩȩ˺ľҵҽɩޙޙ򸆃ęޚȽ뚵Ƚˆ횚ȽȆɩк©ɩŤŤк©Ωǽľ҆鍍ͦ᧧ȽȽȆк©ɩк©ͪޙޙ򶧵ȽͩɩɩŦˆޙ򧧧Ƚޙޙ򧧧Ƚާ槵Ƚyޙކݙޙ憃ޙާȽᥙ짧Ƚ짧ȽͪͤˆΩڙޙк©Ƚε˵ޙޥޥ膃ޙ᧵ȽǽľҵéޚȽ暵Ƚޙކݙޙ憃ޙޚȽǽľҵéᥙޙچݙާȽͪͤˆݙڙޙк©Ƚͩ˵ޙߙ놃ݙާȽޙ솃ݙ觧Ƚǽľҵڙޙކݙݙ姧Ƚ™솃ޙȽǽľҵޣȽǽ \ No newline at end of file diff --git a/res/en/data/Stage/Kings.tsc b/res/en/data/Stage/Kings.tsc new file mode 100644 index 0000000..9ed7131 --- /dev/null +++ b/res/en/data/Stage/Kings.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlvqy````lu~t=:S``ia=:l}~qlvqy```alu~t=:S``ib=:l}~qlvqy```blu~t=:S``ic=:l}~qlvqy```clu~t=:S``id=:l}~qlvqy```dlu~t=:=:S`a``=:l{ul}~qlqy``e`lvqy```a=:lq~`c``j``a`j```0lqy``ig=:lq~`c``j```aj````lqy``e`=:lq~`c``j``b`j````lqy``fd=:lq~`c``j```aj````lqy``af=:lq~`c``j``c`j````lqy``e`=:lq~`c``j``d`j````lqy``ig=:lvq```alqyiiii=:=:S`c``=:=: \ No newline at end of file diff --git a/res/en/data/Stage/Little.tsc b/res/en/data/Stage/Little.tsc new file mode 100644 index 0000000..878e11b --- /dev/null +++ b/res/en/data/Stage/Little.tsc @@ -0,0 +1 @@ +TQjwwwTQwwwywwwwTQjwwxTQwwwywwwxTQjwwyTQwwwywwwyTQjwwzTQwwwywwwzTQjww{TQwwwywww{TQTQjwxwwTQwwxxwxwwwwwwwwwywwwyww|zwwywwwywx~zTQTQTQTQjwywwTQTQxz~zwyw}TQxz~ywywyTQsgnggggusgggnggtTQggngTQuTQggggggTQwywxrxz~yTQwwwwwxywwwwwwwggguTQwwxwwwxygghwx}wTQjwywxTQgguTQTQjwywyTQGsggggggTQggggwywzhTQggguTQjwywzTQtxz~yTQgsgngggTQuTQgngggggTQgggguwwxywwwwwwwTQwwxyggguTQwwxwwwwggghwx}wTQTQjwyxwTQxz~wwyxxrxz~xTQgggggTQguuugngggsTQgTQjwyxxTQgggguTQjwyywTQngsgTQTQjw|wwTQwy|wwwwwTQTQ \ No newline at end of file diff --git a/res/en/data/Stage/Lounge.tsc b/res/en/data/Stage/Lounge.tsc new file mode 100644 index 0000000..cf55ccd --- /dev/null +++ b/res/en/data/Stage/Lounge.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{xǪÞ{x{x{x{x{xij{x{x{x{x{x¸{xӎӎᜪ{xَڎӎӚӜ{xݎӕӎώӎ{xԎ眪{x{x{xǪӜŸ›Ҏӎ{x૜ž{xǪӎӎݎӜŸ™{xÞӎ૜ůê{x{x{xǪӎ{xՎӎҏ{xӎӎҎ{x᜜{x{x{x{x{x{x{xij{x{x{xӎ{xӎӎӎ{xҎ܎ӎ✪{xҎԎ{xҜ{xӎՎӎ{xnҎ֜{xӎ皎ݚҎ᜜{x{x{xӎ⎲ՎՎ{xԎ֎ۏ{x֚Ԏ玷ӎώ{x{x֎ώӜ{x{x{xǪ{xij{x{xܕӎώҎ{xᏪ᭎֏{xӎҎݎӎӜ{x{x{xǪ{xij{x{xێݎҜ{x{x{xǪǰ֚眪ܕӎӭ{xَ֚ӎ{xӜ{xӎҎ琎{xӎގҎӎӜ{xܚӎ՜Վݎ{xՎώӎԎӜݎӎݎ֭{xښӎҎ{xůDzů{xů{xÞů{xÞ{x{x{x{x{x{x{x \ No newline at end of file diff --git a/res/en/data/Stage/Malco.tsc b/res/en/data/Stage/Malco.tsc new file mode 100644 index 0000000..5ae31c2 --- /dev/null +++ b/res/en/data/Stage/Malco.tsc @@ -0,0 +1 @@ +@=Vcclc@=otovccckoyt|ccccoxw@=Vccld@=otovccckoyt|cccdoxw@=Vccle@=otovccckoyt|ccceoxw@=Vcclf@=otovccckoyt|cccfoxw@=Vcclg@=otovccck@=oy}ckfcmccli@=oy}cgkdmcclh@=oyt|cccgoxw@=Vcclh@=ovcecdmcdcemcccc@=otcfccmccccmccce@=oyt|cccgoxw@=Vccli@=ovccddmcccimccid@=ovccddmcccjmccjj@=ovcecdmcdcemcccc@=otcfccmccccmccce@=oyt|cccgoxw@=Vcdcc@=oy}cgkcmcdcd@=o|occddowcdccoytcccgotcccimcclgmcdjdmccdj@=Vcdcd@=o|oz|SZSTowoxw@=Vcecc@=oy}cgkdmcece@=o~xozySSyyaow@=tvSSyyaowovSSSro}ccccov@=occgfoy^cgkdovcecdmcdcemccccSaowov@=o~xovccccotcfccmccdcmccccot|ccecowccceot|cghc@=ovcccgoz|wxStxTow@=vxvxSwxv|TTowovot|cchc@=oz{Towov@=ovcecfmccclmccccot|cchc@=ovccccotcfccmccedmccccot|cckcovccdd@=ovcecfmccdemcccc@=ozoytvccchwSSSS@=S|SSZ@=ro}cecgovZSTowoxxcecg@=Vcecd@=Vcece@=o|ozo@=SSaowoxw@=Vcecf@=o~xovcecfmccdemccccotcecfmccecmcccgot|cdgc@=o|ozoytvccchStxSrTowoytvcccco~xov@=ot|cdccovccdh@=oz@=ySSuTot|cdgcow@=ovccckoy`cgkcoy^cgkeoxw@=Vcecg@=o~xozStZTTowovSwSS@={zxSaow@=SS@=Saow@=oytvccdgotcecfmccfcmccccS_SZS@=rowovoytvccchuSS_SSZ@=SSaow@=SSSaowovt_S|ZSS@=SSaow@=wZS_S@=aow@=Srowov@=ovcccgovcecfmccfimccccoucecfoy^cgkcoxw@=Vcehc@=o~xozoSaaaowoxw@=Vcfcc@=oy}cgkfmcfcf@=oy}cgkdmcfcd@=o~xoztSaaarow@=|SZSSSS@=aowoxw@=Vcfcd@=o|ozaaaaaowoy}cgkemcfce@=|SSSSaowoxw@=Vcfce@=o~xoz|SSSSS@=Saow@=wSSSSSSro}ccccovot|cchc@=ovcfccmcdclmcccg@=otc3ccmccdcmcccg@=oucfccot|cchcowcfccoy^cgkfoy^cgkh@=oz{taaaow{t~SaaaowovZxStS|vxSxaow@=twSSzTowov{t~SySt|zSxTowov|ZwS|~xSStSSutv~@=x{_owovuStS|S~S{SSwS|@=t~xSx|xaaaowoy}cedimcfcgoxw@=Vcfcf@=oy}ckfcmcfdh@=oy}checmcfdg@=oy}cgkimcfdf@=o|}ccddmcfdc@=oy}cgkgmcfch@=o~xoz|ZwS|~xSStSSutv~@=x{_owovuStS|S~S{SSwS|@=t~xSx|xaaaowoy}cedimcfcgoxw@=Vcfcg@={row@={xSwZSxwStwSSvtZ@=zxS|Sxrowov{trTow@=tS{tS|StxwS||wxrTowov@=SStxStSzwSxTowovwxwTow@=|ZSt~xStSwxySuu@=ySTow@=xZSuS{tSwS@=|{xxxTowoy^cgkgoxxcfch@=Vcfch@=o~xoz|ZSxxwSSSvxv@=uu`t~|zStx|taow@=pv{tvtp_ow@=p}xy|{S}|vxp_@=twSpzSutxpaowov|ZSt~xSSuuStSSt@=Su|zSxStS{xStx|tTowoy}ceidmccccov{r@=x_S{xS}xy|{Sw@={txS{xS}|vx_SStS{tx@=|xwS{xaowoy^ceidoxw@=Vcfdc@=o|}ccckmcfddoxxcfch@=Vcfdd@=o|}ccdemcfdeoxxcfch@=Vcfde@=o~xoy^cgkio|`cccko|`ccddo|`ccde@=oz{txSSywStS{xStx|t@=xrowovoz|dcde{TowS{xSpv{tvtpTow@=oz|dcck{TowS{xSp}xy|{S}|vxpTow@=oz|dcdd{TowSxxS{xSpzSutxpTowov{xSxSSuxz|TTowoz|ccccov@=oytcccdot|cdccoyt|cccd@=oz|S|Sy||{xwTowoz|dcdfo|^ccdfoy^ceedov@=ovccdczSSpxpTot|cdicowoovzSTow@=uS{tSwSTowoxw@=Vcfdf@=o~xozzSTow@={StwSuS{tSwSTowoxw@=Vcfdg@=o~xozvxStwS||Stzt|Sx|xaow@=|ZwSyyxSSxSxt_Suaaaowoxw@=Vcfdh@=o~xoz{txZSxxSS|StS{|xTowov|ZSzwSSxxSaow@=|ZSSxS{xxS|{S@=xSSt~Saaaow@=|ZxSuxxS{|~|zSx{tS|@=z{SStv|txSxStx@=u_StuxS{StStaaaowovaaaaaowov@=|ZwSyyxSSxSxt_Suaaaowoxw \ No newline at end of file diff --git a/res/en/data/Stage/Mapi.tsc b/res/en/data/Stage/Mapi.tsc new file mode 100644 index 0000000..28e1969 --- /dev/null +++ b/res/en/data/Stage/Mapi.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIFIFIFxmqrovlmlmIFIF_lmllIFxxmqrpvlmlmxllmmx}lmllvllllvlllnIFx}lllpx}llmrvllupvllonvlllnIF_lmlmIFxx\c\]xxIFIFIF_lpllIFxx~lllnx}llnlIFxmqrovlpnlIFxmqrnvlpmmIFxmqrmvlplox\\\\\{xlplmxmlppvlplnx]xIF\\jxxIFIF_lplmIFxxiij\~h\jxxIFIF_lplnIFxxgmqrmx{x\}{xIF\jxxlploIF_lploIFxxh\j\\\\\IF\\\\~{xlpltxlplpxIFIF_lplpIFxx~\\h\\cIF\\h\{xlplqxlpltIF_lplqIFxx\\\\{xlpluxlplrIF_lplrIFxx\\\\IF\\{xlpluWddmdA>pupwddempzu}ddddpyxA>WddmeA>pupwddempzu}dddepyxA>WddmfA>pupwddempzu}dddfpyxA>WddmgA>pupwddempzu}dddgpyxA>WddmhA>pupwddempzu}ddd4pyxA>A>WdeddA>p}pzudddfpudddmnddmfnddefnddjhA>A>WdedeA>p}pzudddepuddgmnddmendddhnddejA>A>WdfddA>p}p{}[TTbT[TTTbpxpyxA>A> \ No newline at end of file diff --git a/res/en/data/Stage/MazeI.tsc b/res/en/data/Stage/MazeI.tsc new file mode 100644 index 0000000..d5109f9 --- /dev/null +++ b/res/en/data/Stage/MazeI.tsc @@ -0,0 +1 @@ +[Xq~~~[X~~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[X[Xq~~~[X~~~~~~~~~~~[X[Xq~~[X~~~nŽun|||[Xq~~[X~~~~~~~~~~~~~[Xq~~[Xq~~[X[Xq~~~[X~~~~~~~[X~~nnnúo~~y~~~[Xn¶nnno[X[X[X[Xq~~~[X~~~~~~~~~~~~oo|||||nnnǽnn¶[Xü|nn¶n[X~~~[X~~~~~~~~~~~~~[X[Xq~~[X~~~nǽnůn½nn¶n~~~~[Xy~[XN~~~~~~~~[X~~~~~~~~~~~~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~~~~~~~~[X~~~~[X~~~~~[X~~[X~~~~~~~~~[X[Xq~~[Xnnn|[X[Xq~~[X[X[Xq~~~[Xnnn½nǽ[Xżn|[Xnn¶|||[Xnn¶nunn|[Xnǽnnz[Xǽnijnn|||[X[Xq~~[X[Xq~~[Xnŷ±n¶nn¶[Xnnþn½nnþn½[XŶ|[Xn¶n·unnþ[X¶|[Xnnijnnijn[Xü·nnnn|[X[Xq~~[Xnnn|[X[Xnȳnnnnnn~~n{n~[X~~[X~.ؘ[X~ёјѨ[X[X \ No newline at end of file diff --git a/res/en/data/Stage/MazeM.tsc b/res/en/data/Stage/MazeM.tsc new file mode 100644 index 0000000..05becb1 --- /dev/null +++ b/res/en/data/Stage/MazeM.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``b`lq~`d``j``b`j```blvqy````lv|z`ghbj``iilu~t=:S``ia=:l}~qls}``b`lvqy```alu~t=:S``ib=:l}~qls}``b`lq~`d``j``b`j```blvqy```blv|z`ghbj``iilu~t=:S``ic=:l}~qls}``b`lvqy```clv|z`gh`j``iilu~t=:S``id=:l}~qls}``b`lvqy```dlv|z`gh`j``iilu~t=:=:=:=:S``ii=:ls}```gj``cej````=:ls}```hj``cej````=:ls}``bfj``caj`aaa=:lu~t=:=:S`a``=:lylvq````lq``ddj``idj``a`j``ad=:=:S`aa`=:l{ulv|z`ghcj`aablv|z`ghaj`aaa=:l``aalq~`aa`j````j```blvq```blq``dfj``ibj```cj```i=:S`aaa=:lv|[`gh`lv|]`gha=:l``aalq~`aa`j````j```blvq```blq``dfj`ae`j```cj``0i=:S`aab=:lyl}wyPWP^^^l~tlu~t=:=:S`c``=:S`c`a=:l{ul}~qls}``b`=:lq~`ca`j```aj````lvqy```d=:ls~`c`aj`aabj```blqy`a``=:lq~`ca`j````j````=:l}t```blt~`c`al}s=:lq~`d``j``b`j```blv|z`ghbj``iilu~t=:S`ca`=:l{ulv|[`gb`ls~`c``j`aaaj````lx}slqy``f`lq~`ca`j```aj````=:lqy`a``lvq```dlq``dbj`c`aj``bfj```e=:=:=:S`cc`=:lylv|z`ghbj`ccal}wPPP^l~tl``dcls|l}wP^l~tls|=:lv|[`ghb=:lqy``e`=:l``ga=:ls}```gj``cej````=:ls}```hj``cej````=:ls}``bfj``caj`aaa=:lqy``e`lu~t=:S`cca=:lyl}w^^^l~tlu~t=:=:S`d``=:=: \ No newline at end of file diff --git a/res/en/data/Stage/MazeO.tsc b/res/en/data/Stage/MazeO.tsc new file mode 100644 index 0000000..7cabed3 --- /dev/null +++ b/res/en/data/Stage/MazeO.tsc @@ -0,0 +1 @@ +VSlyyyVSyyy{yyyyVSlyyzVSyyy{yyyzVSlyy{VSyyy{yyy{VSlyy|VSyyy{yyy|VSlyy}VSyyy{yyy}VSVSVSVSVSlyzyyVSyyzzyzyyyyyyyyy{yyyyyyyyVSyy|yzyzVSyy|yy}yy}yyz~VSlyzyzVStyy}yy|yy}yy}yyz~VSVSlyzy~VSyyy}yy|yy}yyzyyz{VSVSly{yyVSi¼iuVSiwwwVSiiiVSiiiiwVSVSVSly|yyVSpii¼wVSuiiii¸iwtzyyyyy{yVSyy}y|y}VSyy{y|y|VSyyzy|y{VSyyyy|yztyyyyy~yVSuiuiiuipiwiuiuipVSipiiiii¸wpiiiiiwVSiiiiipVSiiiiwVSzyztyyziii†wyyyyVSly|yzVSiipiiwVSiiiiiVSiwVSly|y{VSvyyztyy{VSzyziiivwyyyyui¸iijVSiwVSiiiiiwVSly|y|VSiwVSiiiiiwVSly|y}VSiiipVSwVSpiiiiiVSiwVSiii¸uiiwVSVSly|zyVSyy}y|z|VSyy{y|z{VSyyzy|zzVSpiiwVSiiiiiiVSiuVSiiiîiiuVSiIiiwVSly|zzVSi¸iiiiVSi¸iiiuipVSi¸iiiiiVS¼wVSly|z{VSiwVSipiiiuVSi¸VSly|z|VSuii¸iiiVSiiiiiiiVSkikwVSVSly|{yVSyy{y|{{VSyyzy|{ztyyzVSyyzuijpiiiVSiwVSpiijiii¸VSiiuiVSiijyy{yi¸ipiiVSiiiwwwVSpiiiiVSi¸uiwwwiuiiwVSuiiwVSiiiiVSiwwwwwwiiiwVSiiuiipVSiiiVSwVSiipiiuVSipiiVS½iwwwVSly|{zVSyy{yiui®uiVSiipiiVSiiiiwwwVSly|{{VSyy{yiiiVS»wVSipiiiiuVSipiiVSiiiiwpiiiVSwVSiiiiVSiiiiVSiwpiii¸uVSiiiipVSuipiiiVS¸iwwwtyytyy|VSVSVSly}yyVSyy~yyyztyy~yy{{y}yyyy{zyyyyVSiiiwzyztyyztyyy}VSyyzyiiijyzyVSVS \ No newline at end of file diff --git a/res/en/data/Stage/MazeS.tsc b/res/en/data/Stage/MazeS.tsc new file mode 100644 index 0000000..990c0f2 --- /dev/null +++ b/res/en/data/Stage/MazeS.tsc @@ -0,0 +1 @@ +?FWXKFMW_::=AFPKS:::>FOXN-:;::FZ\SFPKY:::F^\K::>:D::CD:::?-:;:=FPVT:@B;D:;:?FS^T::;AD:;:>FZ\SFW]QVymuon8FXYNFOXN-:;:>FZ\SF]Y_::<;D::C:D::;?D:::C-:;:@FUOcF]Y_::;;FKXZ:;:@D::::D:::F^\K::>D:::?D:::C +-:;;:FPVT:A>:D:;;;FUOcF]Y_::;;FKXZ:;;:D::::D:::=D:?::D:::>D::;=-:;;;FUOcF]Y_::;;FKXZ:;;:D::::D:::=D::CD::;=-:;<:FUOcFPKY:::>F^\K::>:D::C>D::;AD;<::D::=BD::;@ \ No newline at end of file diff --git a/res/en/data/Stage/MiBox.tsc b/res/en/data/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/en/data/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/en/data/Stage/Mimi.tsc b/res/en/data/Stage/Mimi.tsc new file mode 100644 index 0000000..de5e265 --- /dev/null +++ b/res/en/data/Stage/Mimi.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|z`cdaj``iels}```ilvqy````lu~t=:S``ia=:l}~qlv|z`cdaj``ifls}```ilvqy```alu~t=:S``ib=:l}~qlv|z`cdaj``igls}```ilvqy```blu~t=:S``ic=:l}~qlv|z`cdaj``ihls}```ilvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```ilvqy```dlu~t=:=:S``ie=:ls}``bhlvqy````lu~t=:S``if=:ls}``bhlvqy```alu~t=:S``ig=:ls}``bhlvqy```blu~t=:S``ih=:ls}``bhlvqy```clu~t=:S``ii=:ls}``bhlvqy```dlu~t=:=:=:S`a``=:lylv|z`cbdj`a`b=:lyz```aj`a`a=:l}w|^l~tlu~t=:S`a`a=:l``bblwya``alv|[`cbdlv|[`dda=:l}wPmqWP{m^l~tlwy````ls|luu`a`b=:S`a`b=:l``aals~`a``j````j````lvq```dlq```aj``idj``agj```h=:=:=:S`a`c=:lylvq````lq``aej``i`j``cfj``ad=:S`a`d=:lv|z`cbgj`aab=:lv|z`cf`j`aaa=:l{ul}wlvqs```iyWPz\l~t=:P]PP^l~tls|PPPP=:}P\PP=:PqP^l~tls|\PPPyP\=:Pol~tls|\PP=:PPPP=:\l~t=:PyWPPP=:PPPPW=:P^l~tlu~t=:=:S`a`e=:l{ulv|z`cf`j`a`fl``aalq~`a`ej````j```bluu`a`f=:S`a`f=:l{ulvq```dlq``adj``idj```ej```i=:=:S`a`g=:lyl``aals~`a`gj````j````lvq```dlq``aij``idj```gj``a`=:=:S`a`h=:lylvq```blq``agj``ibj```bj``aa=:=:S`a`i=:lylvq```dlq``b`j``idj``a`j```i=:=:S`aa`=:lylvq````lq``abj``i`j``eej```i=:=:S`aaa=:l{ulv|[`cbglv|[`ddcl}wlvqs```ioQl~t=:WPPol~t=:\PQl~t=:yWPPPP{=:PQl~tls|=:l}t````=:lq~`aaaj```hj````lqy`b`h=:lq~`aaaj````j```blqy``a`=:l``aalq~`a`gj````j```blqy``c`=:lt~`aaa=:l``aalq~`a`gj````j````lu~t=:=:S`aab=:lylvq```blq``afj``ibj```bj``ab=:=:=:=:S`b``=:lylv|z`cbbj`b`alv|[`cbbl``bbls~`b``j``baj````=:l}wPP^l~tlwya``bly[```blu[```bls|=:ls}``a`wPPm}PmQlqy`af`l~tl}luu`b`a=:S`b`a=:lyl}wWPP^^^l~tls|lPPPPPP=:P\PPP=:PPP^PPyP^l~tlu~t=:=:S`c``=:S`c`a=:l{ulv|z`cbcj`c`elv|[`cb`lv|[`cbc=:l}w^^^^^l~tls|=:l}r````lqy``e`l}t````ls~`c`aj``faj```blqy```hls~`c`aj``faj```d=:l}wlvqs```goPWPPPol~t=:yPPPP=:P^^^l~tls|yWP{^l~t=:yWPP]P=:P^l~t=:~PPP=:PP\PP=:PPP^l~tls|\PPP^l~tls|WPPPP\=:^l~t=:WPPP=:PPP^l~tlu~t=:=:S`c`b=:l{ulv|[`cb`lv|[`cbalv~`c`bj``afl}~qlvqy```dls}````lqy`a``=:l}wlvqs```gxPPPQl~tls|lvqs```h~QPyPWQl~tls|lvqs```gqPPP=:Pol~t=:WPPQ=:WPPPPQl~tls|lvqs```fWPPP^l~t=:yWPPPQl~tls|lvqs```g^^^l~t=:PPtP\=:PPWP=:PP^^^l~t=:yPPWPP=:\PPPP=:PP^l~tls|lvqs```fr^^^Pr^^^l~tls|lvqs```gP\PQl~t=:lvqs````ls|=:l}``acj``bb=:lqy``gelx}sls~`c`ij`ae`j```blq~`c`ij``a`j```blq``c`=:l}woQl~tls|=:lqy``a`=:lq~`c``j```fj```b=:lq~`c`aj```fj````=:lqy`a``=:lq~`c``j```fj```b=:lqy``h`=:lt~`c``=:ls}```i=:lv}``afl}slt~`c`ilu~t=:=:=:S`c`e=:l{ul}wlvqs```grPP^^^l~t=:PPPP=:P^l~tlu~t=:S`c`f=:l{ul}wlvqs```gwQl~tls|Ql~t=:WPPP=:PQl~tlu~t=:S`c`g=:S`c`h=:l{ul}t```blvqy```bls}````lqy``b`=:l}wlvqs```gwPPPQl~tls|lvqs```h~Ql~tls|=:lq~`c`gj```fj```blqy`0f`=:lq~`c`fj```fj```bl``aflqy`a``lt~`c`glv|]`cgals}```ilu~t=:S`c`i=:=:=:S`caa=:l{ul}wZPZl~tls|Ql~tls|=:l}r````lq~`caaj```bj```dlqy``c`l}t````=:lv|z`aefj`cac=:lv|z`ab`j`cab=:lv|z`cf`j`cad=:l}wQPPP^^^l~tls|ol~t=:\P^l~tls|PPPqWP\Pol~t=:WPPP^l~tls|P\P^l~t=:PWPPP=:RPtR^^^l~t=:tPPPP^^^=:tPPPP=:ol~tlq~`caaj````j```blu~t=:S`cab=:l}w\PP^l~tls|PPPP^l~t=:PPWPPP=:P^l~tlq~`caaj````j```blu~t=:S`cac=:l{ul}wyPPPPP=:qWP^^^l~tls|qPPPPP=:ol~tlq~`caaj````j```blu~t=:S`cad=:l{ul}wol~t=:WPPol~tls|\PWPP^l~t=:~PPPPPP=:PP^^^l~tlq~`caaj````j```blu~t=:=:S`d``=:l{ulv|]`aeelv~`d``j``aflvqy```dl}~qls}````lqy`a``lq~`f``j``aaj```b=:l}wlvqs```c|PPPPQl~tlq~`f``j````j```bls|lq~`fa`j````j````lvqs```gxPPQl~tls|WuPPP=:PQl~tls|PPPP=:PPPPP=:PPP^l~tlq~`f``j``aaj```bls|lvqs```cP]PQl~tlq~`f``j````j```bls|lvqs```gyPPWPPP=:\PyPPyWP=:PPPQl~tls|ls}```i=:lv}``aflqy``e`lu~t=:=:=:S`da`=:S`daa=:S`db`=:l{ulx}sls}````=:ls~`da`j``dbj```b=:ls~`daaj``gdj````=:lq~`fa`j````j````lqy`a``l}wlvqs```gPW^^^ol~tls}```ilvqy```dls|lvqs```bWP^l~tls|PtPPP=:PPPP=:PPP^l~tls|lvqs```i]]PPP=:PPoQl~tls|lvqs```bPP^^^=:^^^PPP^l~tls|lvqs```iqPWPPP=:PPPol~tls|lvqs```bqPPPyPP\=:WPPP=:^l~tls|PPPP=:WPP^l~tls|lvqs```iy^^^l~tls|yPPP=:\P^^^l~tls|lvqs```bPPP^^^=:qPPP^^^l~tls|lvqs```gyWPPP=:PQl~tls|=:lv|]`aedlv|[`aeg=:lvq```dlq```aj`fb`j```ej```h=:=:=:S`e``=:l{ul}wlPPPPPPPPPPPPjPPv=:PPPP|jPPPPjPw=:PPPPPPPPPPPtjPqWPxl~t=:lu~t=:=:S`e`a=:l{ul}wl=:PPPPPPPPPPPPPPPvl~tlu~t=:S`e`b=:l{ul}wl=:PPPPPPPPPPPPPPPPPl~tlu~t=:S`e`c=:l{ul}wl=:PPPPPPPPPPPPP}Pw=:PPPPPPPPPPPPPtQP~Pul~tlu~t=:S`e`d=:l{ul}wl=:PPPPPPPPPPPPPPqWPxl~tlu~t=:S`e`e=:l{ul}wl=:PPPPPPPPPPPPPPPqPxl~tlu~t=:=:=:S`f``=:lv|z`bbdj`f`b=:lv|z`cbej`f`a=:l{ulv|[`cbel[```bjf``b=:l}wlvqs```a\PyWP^^^l~tls|PWP=:PP}\=:PPP^l~t=:xPWP\l~t=:PPPP=:P}PP=:PPPP\l~t=:PPP=:P^l~tls|^^^^^l~tls|yP^l~tls|PWPPP=:Pol~tls|}PWPP=:P=:w^l~t=:vPPPP=:^l~tlu~t=:=:=:S`f`a=:l{ul}wlvqs```avPPP=:PP^l~t=:PPPPw=:PPP=:qWP^l~tlu~t=:S`f`b=:l{ul}wlvqs```axPPP=:Pol~tlu~t=:=:S`fa`=:lv|z`bbdj`faa=:l{ul}wlvqs```gPPPPP=:PPPP=:P^l~tlu~t=:S`faa=:l{ul}wlvqs```gP^^^l~tlu~t=:=: \ No newline at end of file diff --git a/res/en/data/Stage/Momo.tsc b/res/en/data/Stage/Momo.tsc new file mode 100644 index 0000000..bad33d1 --- /dev/null +++ b/res/en/data/Stage/Momo.tsc @@ -0,0 +1 @@ +nknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknkЁցƁƁnkƁƁǏnkɍ́ԏ΁ρЏnkƈԁӏnkŁЁƁnkԁȁՁnkӈԁƏnkՁƁƁŁnkԍƁŁЁnkƁӁƏnkЁƁŁƁŁnkƁƁǁƁŏځԁōnkՁƁ́֏ՁՈԁӁnkӁƏՁ؁΁nkρȁՍnkƁՁ́ՁnkЁƁӈԁƏnkψՁƁƁnkƁԁՍɏnknknknknkՁŁՁnkԁӏnk؍ЁŁƁnkǁƏnknknkՁŁnk؁ԏnkӁבϏ́ŁnkԁЁɁnkՏnknknknknknkՁŁnk؁ԏnkӁדϏ́ŁnkԁЁɁnkՏnknknknknknkƁցځՁؠڠnkӁōϏnknknkɍŁӏnkӁӁŏƍՁԁnkӁ؏nknkՁƁ̞nkȍƁȏnkԁՈԁnkȍՏƁԁȁnkԁψՁnkЁ́ɁԏnkՁɁaՁ́ύnkցŁƁƁnḱЁΏƁցɁƁЁӠnknknkŁցЁ́nkρŁɏƈԁԁōnkЁՁƈԁnkӏnknknkЁƁƁՍnḱŁځnḱӏnkǁցŁՁŁnkƁǁƁnkځƁՁƍnḱՁƁnkЁ́ɁՏƁȁƁ́nkӞnknknkЁƁƁՍnḱŁځnḱӏnkƁԁnkρƁԁՁnkƁ̏ƁȁƁ́nkӞnknknkƁ̏ŁӁnkρӞΏԁӈnkԁƁρՏnkψՁЁnkɁԏnknknkƁ̏nkŁӁƁӞՈԁƏځǁƁnkƁԏnḱԁځ̏nkՍŁցЁnkρρŁɏƈԁρӁnkƁՃnkЁƁԁρԏՁƈԁЁƁnkƁՁŁρnkӁՏnkƁŁ΁ƁnkՁǁƁՍnkƁψՁƁρӏnknknkƁ̏ŁցŁɠnkŁӁƁӞԁԁՍ́ՏnkԁԁƁnkƈԁЁŁǏΏƁԁŁnkՁӁǁځnkƁځƏ͍́nk؏nknknknḱցځɏՈ́ƁƁnkƁ΁ōnkЁځψՁցnkӁρՁŠnknknknknkЁցՁЁՠnknkɁŏnknknknknknkցρӁȁяnknknknkՏnknk \ No newline at end of file diff --git a/res/en/data/Stage/Oside.tsc b/res/en/data/Stage/Oside.tsc new file mode 100644 index 0000000..5572988 --- /dev/null +++ b/res/en/data/Stage/Oside.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``belvqy````lu~t=:S``ia=:l}~qls}``belvqy```alu~t=:S``ib=:l}~qls}``belvqy```blu~t=:S``ic=:l}~qls}``belvqy```clu~t=:S``id=:l}~qls}``belvqy```dlu~t=:=:S`a``=:l{ulvq````lq``ebj``i`j``agj``a`=:=:S`ab`=:l{ul``aalq~`ab`j````j```blvq```dlq``eej``idj```ij```i=:l}wWP^^^l~tlu~t=:=:S`ac`=:l{ulyz``cbj`acal``aalq~`ac`j````j```blvq````lq``fij``i`j``aej```h=:S`aca=:l{uls}````l``aalq~`ac`j````j```b=:lwya`cbly]``cblv|[acg`l}wyWPQl~tls|=:lvq````lq``fij``i`j``aej```h=:=:S`ad`=:l{ulvq````l}t````lq``idj``i`j``adj```g=:=:S`b``=:lyl}wqPol~tlu~t=:=:S`d``=:l{ulv|z`if`j`d`al}wlvqs``a`yPWPP=:PPP\=:WPP^l~tlu~t=:S`d`a=:l{uls|lv~`da`j``aflqy``e`=:l}wlvqs``a`wPl}t````^l~tls|=:ls~`db`j`ae`j````lx}s=:lq~`d``j```cj````lqy``cb=:lq~`d``j````j```blqy``cb=:lq~`db`j``e`j````lqy``cb=:lq~`db`j````j```blqy``cb=:lt~`d``lt~0db`=:lq~`da`j``a`j```blqy`b``=:l}wlvqs``a`xPP^l~tls|lvqs````=:lq~`da`j``b`j```blqy`be`=:lq~`da`j``a`j```blqy`b``=:l}wqPPPPP=:PP^lqy`b``ls|rP\PPtP=:PPPP\P=:PPPPP^lqy`b``ls|PPPPP=:PPPPtW=:olqy`b``ls|lvq```buP\PPP=:PP^lqy`b``ls|\PPPP=:PP\PP=:PtWP\lqy`b``ls|PP{PP=:PPPPP^^^lqy`b``ls|ls}``bf=:lPPPPPPPPPPPPPPPP]PPuP]lqyiiii=:lu~t=:=:=:S`da`=:l{ul}ww^^^l~tlu~t=:S`db`=:=:=:S`f``=:l{ul}wPPPP=:^l~t=:PPPPPPP=:P^l~t=:yWPPyWPPP=:PPP^l~t=:PPPyPPP=:PP^^^l~tlu~t=:=: \ No newline at end of file diff --git a/res/en/data/Stage/Ostep.tsc b/res/en/data/Stage/Ostep.tsc new file mode 100644 index 0000000..80e6ef0 --- /dev/null +++ b/res/en/data/Stage/Ostep.tsc @@ -0,0 +1 @@ +0==F=IZ[NISNV====IR[Q0==F>IZ[NISNV===>IR[Q0==F?IZ[NISNV===?IR[Q0==F@IZ[NISNV===@IR[Q0==FAIZ[NISNV===AIR[Q0=>==IXRfI`\b==>>IN[]=>==G====G===?ISN\====Ia_N==EBG==FCG==>FG==?F0=>>=IXRfI`\b==>>IN[]=>>=G====G===?ISN\===?Ia_N==EDG==FBG===AG==>>0=?==0=?=>0=F== IQ[]=F==IXRfIZfQ===?IZ`T]yrnr-xvyy-z-znr;I[\Qaun-v-ur-|{y-n-Zvrpn{-or-srrq;;;I[\Q;;;aur-|{y-n-|-n|vq-nr}rvv|{-|s-uv-ntrq;I[\QIPY_Z-znr4-{nzr-v-Onyy|;I[\QIPY_Uv-zntvp-}|r-unr-t|{r-vyq9n{q-{|-ur-pn{{|-rr{-qvr;;;I[\QIN[]=?=>G==>=G====ISY8>C?=IR[Q \ No newline at end of file diff --git a/res/en/data/Stage/Pens1.tsc b/res/en/data/Stage/Pens1.tsc new file mode 100644 index 0000000..8c7acfc --- /dev/null +++ b/res/en/data/Stage/Pens1.tsc @@ -0,0 +1 @@ +öʥùöʥùöʥùöʥùöʥùʥùʥťť̶ťι¸ťùαöʥťť̶ťι¸ťùǾĥǶǾĥǶǾʥťĥǶǾʥʥťĥǶαȼڕ㣣ĹDZǗەڕ䡕ݡᣣĹDZȼڕܕ紱ÿٕ蕺܂磱ĹȠùαȼڕ㣣ĹǂǸܕ䕼㣣Ĺùαȼǂٕ䕼㣱Ĺùαȼǂ٣ĹùαȼǂٕٕڣĹùαȼڕ㣣ĹDZǂٕڕܕֱĹùαȼ裣Ĺùαȼ磱ĹűĹùαȼڕࣱĹڜࣱĹڜٕڕڕڣĹڕڡڜڕܕࣱĹڕڡڣĹǾڡ졂ڕە裱ĹڣĹùαȼڕڣĹùαʥť̶ť̶ťť̶ȼݣĹDZڕĹı̶ťȼ⣱Ĺڕٕڂ裱ĹDZĹıť̶ťʥťȼ֖ĹťǶٕ畷疱ĹDZݖĹıť̶ťȼڕ顕㴖ĹDZᡕڕ裱Ĺıťť̶ť̶ťʥť̶ťȼĹDZִĹı̶ť̶ť̶ť̶ȼܣĹǶٕەڕڕڕڣĹڕٕڕۂڣĹە⡂ݡڕقڕ裱ĹǺܕ裣ĹĂʥťť̶ťι¸ťùαȼڕڂܕڣĹەڕ܂㣣Ĺùαȼ壱Ĺڡڕ٣Ĺùαȼ݂֕㣣Ĺ䖕閱Ĺùαη̶ιťȼڕĹڕڕڣĹݕ塱ĹڕٕڕڕٕڕٕܣĹıť̶ťȼ疱ĹǸڕڕڂݕڕ䴱Ĺıť̶ťȼʥĹǂ磱ĹDZĹDZڡ磣ĹڕڕٕڣĹڕقڕٕ裱ĹťǂĹDZ鴱ĹDZڕڕuٕ⡕֕ەڣĹڕڕقڣĹڕڕڕٕڕڕٕڣĹǂڕٕڴĹ㡕ڂڜٕڕ紱ĹDZᡱĹڕڂە裱Ĺەڕڂڕ⣣Ĺǽ硕ڕٕڕ裱Ĺܕڕڕڂ塱ĹڜڕڕٕڣĹǂڕܕ崱ĹDZĹڜڕە֕ݕףĹıťť̶ť̶ťȼ꣱Ĺǂʥ䕾ȕڴĹDZ飣ĹڕەڕقڂٕٱĹ䣱ĹDZ鴖ĹDZٕٕ顱ťĹ镾ڂ裱ĹڕڕەٕڣĹDZ磱ĹڕٕڕقڣĹDZڣĹıť̶ťť̶ȼڕڕقܕ٣Ĺڣڕ٣ĹȠùαȼݕڕقڕ֕ڕ磱Ĺٕڕٕقڕڕۂ⣱ĹùαȼڕڕەڣĹǾ٣Ĺڂ飱ĹùαȼڕٕڣĹùαȼەٕەڂ衕ڜڕڕڕ죱ĹǾ֕ܕĹùαȼڕڕݕقڕ٣Ĺܕ꣣Ĺùťαιť̶ťťť̶ťť̶ť̶ťȼĹıť̶ȼꡕڣĹǣڕقڕٕ裱Ĺǣڕٜڕ裱ĹڕڂڣĹǾٕڕقڕڂ㕾ٕڕڣĹıť̶ťɠɦȼڕ맣̶Ĺıɥťȼڕٕ飱ĹǾەڕڕ㡱Ĺڕٕڕ٣Ĺ硱ĹٕڕٕڕڕڕڣĹڕڕڂٕڡĹڕٕڕڕܕݕ裱Ĺǂܕ꣱ĹڕݕٕڣĹĂȠùαȼڕڕݕقڕ٣Ĺܕ꣣Ĺùαȼڂ٣ĹڕڕڂڣĹùαʥĥǶǾȼڂܕ紱ÿĂαť¸̶ť̶ĥǶǾȼ䕼㴱ÿĂαť¸̶ť̶ĥǶǾȼڂٕڴÿĂαť¸̶ť̶ĥǶǾȼڂݴÿĂαť¸̶ť̶ĥǶǾȼڂ㴱ÿĂαť¸̶ť̶ĥǶαǶ \ No newline at end of file diff --git a/res/en/data/Stage/Pens2.tsc b/res/en/data/Stage/Pens2.tsc new file mode 100644 index 0000000..6a2043a --- /dev/null +++ b/res/en/data/Stage/Pens2.tsc @@ -0,0 +1 @@ +~~µɤ¸~~µɤ¸~~µɤ¸~~µɤ¸~~µɤ¸~~~~~~Ͱɤ~ǻƷ۔ߢ˵~ؔ⢰˵~ƹ۔ᢰ˵Ɓ~ǻբø~ٔٳø~øäƵ~~Ͱǻ٢ø~ٔ㢰ø㠔⳰ø~ٔٔ볰ø~ؔٔ碰ø~ܔ鳰øäƵ~~Ͱǻٔڔ碰ø~ؔ܁~Քآø~ہ~賰øư۔~Ֆ˵ưƷ٢~⮔tٔø~۔碰ø۔~攖▢øƁ~ǻࠔہ~颰ø~٢øäƵ~~ͰĤǻø~~۔٢øƁ~ɤĤ˵ɤĤø~ðĤ˵Ĥ~ǻٔߢø~ٔ۔~颢øưܳ볰ø~Քøư؁~ٔ⢰øư賕øưؔٛٔ۔Ɂ~ٕøÁ~Ĥ˵äǻ~ٔ㕰øưܔ㠔蕰øƵ~¸~¸~~~~~~~ \ No newline at end of file diff --git a/res/en/data/Stage/Pixel.tsc b/res/en/data/Stage/Pixel.tsc new file mode 100644 index 0000000..fded528 --- /dev/null +++ b/res/en/data/Stage/Pixel.tsc @@ -0,0 +1 @@ +QNgtt}tQNttuxttttQNgtt}uQNttuxtttuQNgtt}vQNttuxtttvQNgtt}wQNttuxtttwQNgtt}xQNttuxtttxQNgtt}yQNtttuQNQNgtuttQNtutt~tttt~tttvttuuQNtttxttx|~tt}x~tuyw~ttuzQNQNgtvttQNQNuxxu~tvtwQNuxxt~tvtvQNt|wy~tvtuQNddddrQNtxqt|qt|dddrQNQNgtvtuQNddddrQNdkddddQNQNgtvtvQNouxxyddddrdpddddQNddddrrrQNQNgtvtwQNddddrQNddddrQNQNgtvutQNQNgtvvtQNddddrrrQNgtvvuQNkddpdQNdrrruxxu~tvvwuxxy~tvvvQNgtvvvQNQNddddddttttouxxuqddQNdddQNrddddddQNdpdddQNdddqrdddddQNddddddQNdrQNrttutrttutrttutrttutrttutrttutrttutrttutttutddddQNetuztDddddddQNddpdddQNdddrttwtQNgtvvwQNdddQNdrrrQNQNgtvytQNQNuxxx~tvy{QNuxxw~tvyyQNuxxv~tvyxQNuxxu~tvywQNuxxt~tvyvQNt|wz~tvyuttu}QNgtvyuQNQNddddtttttttxttttttvtQNrrrrrQNtuttoutttQNtvutqt|wzouxxttttvQNtt{w~tt}y~ttuv~ttt}QNgtvyvQNdkdpdddQNdkddrQNgtvywQNddddddQNdttttQNouxxvtttutttttvtttttuQNtuytttvtQNrrrttuxttvyrrrrrtvzt~tttu~tttvttu}kdepdkddrrrttvydkdddQNdddrQNdddpQNdkdddQNdrrrddddQNdddkQNrQNttvtrrrtttttvzt~tttu~ttttQNttytQNdddrQNQNgtvyxQNdddddQNddrouxxwQNgtvyyQNQNddddddtvyzQNgtvyzQNtvzt~tvy}~ttttot|wzquxxtouxxxQNgtvy{QNdkddrQNQNgtvztQNQN \ No newline at end of file diff --git a/res/en/data/Stage/Plant.tsc b/res/en/data/Stage/Plant.tsc new file mode 100644 index 0000000..3117832 --- /dev/null +++ b/res/en/data/Stage/Plant.tsc @@ -0,0 +1 @@ +YVo|||YV|}||||}||||YVo||}YV|}||||}|||}YVo||~YV|}||||}|||~YVo||YV|}||||}|||YVo||YV|}||||}|||YVYVo||YV||~||||YVo||YV||~|||}YVo||YV||~|||~YVo||YV||~|||YVo||YV||~|||YVYVo|}||YV||||||}}|||||||~}YVYVYVo|}|YVll±||||l±zYVo|}|YVw}|||||~|wlzYVYVo|~||YVlllzYVllñlzYVllllíl±llzLlllllñYVlzlñxlxlllÿzlŻllllñxYVllŻlllYVxlllŻll±lmllñlsl±lYVllõlzYVYVYVo|~~|YV}|~||~~}lzYVo|~~}YVslıllllmYVYVo|||YVYVw|}|YV|||YVlllzzz||}|}||w|||YVlllz|}|YVYVYVo|||YV||~~|||||}YV}||lllm|}|w|||YVllllmYVYV \ No newline at end of file diff --git a/res/en/data/Stage/Pole.tsc b/res/en/data/Stage/Pole.tsc new file mode 100644 index 0000000..d3da595 --- /dev/null +++ b/res/en/data/Stage/Pole.tsc @@ -0,0 +1 @@ +CPPYP-*\mna\cmuPPPX\faiPPPP\end-*CPPYQ-*\mna\cmuPPPX\faiPPPQ\end-*CPPYR-*\mna\cmuPPPX\faiPPPR\end-*CPPYS-*\mna\cmuPPPX\faiPPPS\end-*CPPYT-*\mna\cmuPPPX\faiPPPT\end-*-*CPPYU-*\cmuPPPX\faiPPPQ\end-*-*CPQPP-*\pri\faoPPPP\traPPQRZPPYTZPPUSZPPSV-*-*-*-*CPRPP-*\key\fljQVTPZPRPQ\flKQVTP\souPPRR\cnpPRPPZPPRQZPPPP-*\msgo@@N\nod\gitPPPR\amKPPPRZPPPP\clr-*\cmuPPQPg@@]p@s]A\waiPQVP\nod\gitPPPP\clo\rmu-*\msg-*f@L@@NNN\faoPPPT\nod\traPPQXZPUPQZPPPRZPPPP-*-*CPRPQ-*\pri\msgeN\nod\end-*-*CPRQP-*-*-*CPSPP-*\key\msgJJ\nod\end-*-*CPSPQ-*\fljQVTTZPSPS-*\key\msgy@G@@@@i@L-*@_\nod-*s@@@@@-*i@@A\nod-*dL@@@@i@G@-*@@@@@-*i@NNN\nod\amjPPPRZPSPR\clri@G@@@A\nod-*j@@@@@@i-*G@@@@@-*@@@@@N\nod\clr-*aL@@@L@@@NNN\nod\end-*-*CPSPR-*\key\msg\cmuPPPP\mybPPPR-*heyAA\nod\clriG@that@@_A\nod\clr\gitPPPRw@@you@@@_A-*i@G@@@@A\nod\clrg@@A\nod\clr\cnpPRQPZPQUPZPPQR\waiPPQR\gitPPPP\hmc-*]p@s]@NNN\nod\clrpA\nod-*i@@G@@-* @@@N\nod\clr-*NNNNN\nod\clry@L\nod-*iG@@@@G-*@@@@-*N\nod-*t@@@@@G-*@@@@-*@@@N\nod-*t@@@@@@-*@@@@@-*@@@N\nod\clr-*\cmuPPPXhNNN\waiPPUP\clrw@i@@@@@@-*@@@@L-*@@@@@N\nod-*t@@@@@-*@@@@G-*NNN\nod\clr-*hNNN\nod\clri@@@@N\nod\clr-*y@@@@N\nod\cmuPPPP\faoPPPQ-*a@i@@L@@N\nod\clo-*\waiPQUP\faiPPPQ-*\fla\waiPPUP\tamPPPRZPPQSZPPPP\flKQVTT\flKPSPS\msg-*\cmuPPQP\msg\gitPPQS-*]p@s]@@@]s]A\smc\dnpPRQP\waiPQVP\nod\cmuPPPX\end-*-*CPSPS-*\key\msgi@@L@@@-*@@@@-*@@@@@N\nod\clri@@L@@L@-*@@@@@@-*@@N\nod-*f@@L@i@@@-*@@@@@N\nod-*t@@@@-*@i@@@@@-*@@@@@@N\nod\end-*-*CPSQP-*\key\msg\tur-*BoNB\nod\end-*-*-* \ No newline at end of file diff --git a/res/en/data/Stage/Pool.tsc b/res/en/data/Stage/Pool.tsc new file mode 100644 index 0000000..c2347f1 --- /dev/null +++ b/res/en/data/Stage/Pool.tsc @@ -0,0 +1 @@ +tqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtq̦ϓއٕtqێڇ̇̇ӇևtqˇׇՇَڇtqӇ̇̓ۦtq̇ˇׇ̇ۇtq·g֕tq̇ˇهˇׇtq̇Շٕ̇tq̇Վۇԇև̇tqϕtqՎۇއ̇̎tqȇȇۇ̇ڕtqtqtqtqtqtqtq·ڇՇ̇ەtqۇ̇هۤtqtqtqtqtqtqtqψtqtqtqtqtqtqtqtqtqtqtq \ No newline at end of file diff --git a/res/en/data/Stage/Prefa1.tsc b/res/en/data/Stage/Prefa1.tsc new file mode 100644 index 0000000..a01d1b7 --- /dev/null +++ b/res/en/data/Stage/Prefa1.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{xǪÞ{x{x{x{xǪ{x{x{x{x{xǪҎώӎ܎{x{xҎӎݎҎ⭪Ǽ܎Ԏӎҕ{xҎӎӎ{xҚ⚪Ҏӎnݎ{xڎ✪ᚎӎ{x܎ӎԎՎ{xڎӎӎ܎ݎ{x᎞Ҏڎ䞜ݎ{xӎҎݎ{x܎Ԏ՜ێӎ܎ӎ䠜{xҎӎՎ֜ݎӎ܎܎{xڎۜ{xů{xҎӜů{x{x{x \ No newline at end of file diff --git a/res/en/data/Stage/Prefa2.tsc b/res/en/data/Stage/Prefa2.tsc new file mode 100644 index 0000000..fd0ddf2 --- /dev/null +++ b/res/en/data/Stage/Prefa2.tsc @@ -0,0 +1 @@ +YVo|||YV||||||||YVo||}YV|||||||}YVo||~YV|||||||~YVo||YV|||||||YVo||YV|||||||YVYVo|}||YVslzzzYV|}|||||||||~||}}|||||~||||||YVYVo|}}|YV|||YVw}}Lw}w}|YV|||||||}|||}YVYVYVYVYVYVo|~||YVlŻslll±lxYVll±lŻllllzlŻlíll±l||||YVw}|w}}w}~|||||||}|}||YV||||}||}}||~YVYVo|~|YVYVlsllzzzYVYV \ No newline at end of file diff --git a/res/en/data/Stage/Priso1.tsc b/res/en/data/Stage/Priso1.tsc new file mode 100644 index 0000000..eeda7f0 --- /dev/null +++ b/res/en/data/Stage/Priso1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``bilvqy````lu~t=:S``ia=:l}~qls}``bilvqy```alu~t=:S``ib=:l}~qls}``bilvqy```blu~t=:S``ic=:l}~qls}``bilvqy```clu~t=:S``id=:l}~qls}``bilvqy```dlu~t=:=:S`a``=:l{ul``aalt~`a``lvq````lq0`efj``i`j``h`j```i=:S`aa`=:l{ul``aalt~`aa`lvq```alq``fbj``iaj```gj``gd=:=:S`b``=:lq~`b``j```bj```blu~t=:S`b`a=:lq~`b`aj```bj```blu~t=:S`b`b=:lq~`b`bj```bj```blu~t=:S`b`c=:lq~`b`cj```bj```blu~t=:=: \ No newline at end of file diff --git a/res/en/data/Stage/Priso2.tsc b/res/en/data/Stage/Priso2.tsc new file mode 100644 index 0000000..b14b583 --- /dev/null +++ b/res/en/data/Stage/Priso2.tsc @@ -0,0 +1 @@ +?IZ[NIPZb==?@ISNV===>IR[Q0==F?IZ[NIPZb==?@ISNV===?ISYW=E?FG==FEISYW=E??G==FDIR[Q0==F@IZ[NIPZb==?@ISNV===@IR[Q0==FAIZ[NIPZb==?@ISNV===AIR[Q0==FDIN[]=?B@G==?=G====IR[Q0==FEIP[]=@=CG=>>DG====IN[]=@=CG==@?G===?IR[Q0=>==IXRfISYW=E@FG=>=>I`\b==>>IN[]=>==G====G===?ISN\====Ia_N==ACG==F=G==>DG===F0=>=>IXRfIZ`TV-|{4-|}r{;;;I[\QIR[Q0=?==IXRfISYW=E@?G=?=AISYW=E?AG=?=@ISYW=E?@G=?=?ISYW=E?>G=?=>IZ`T\]R[-`UbaaR_LIf[W====IPY_\]R[V[T-`UbaaR_I[\QIPY\IZfQ====IdNV==@=IN[]=?B=G==>=G===>IdNV==>=IN[]=@==G===>G===?IdNV==??IN[]=?B>G==>=G===>IN[]=@==G===@G===?IdNV==@?IN[]=?B?G==>=G===>IdNV==@?IN[]=?B@G==>=G===>IdNV==@?IN[]=?BAG==>=G===>IQ[]=?B=IdNV==@?IQ[]=?B>IdNV==@?IQ[]=?B?IN[]=?B@G===>G====IdNV==@?IQ[]=@==IP[]=@=>G=>>DG====IN[]=@=>G==?>G===?ISY:=E?=ISY8=E?>ISY8=E??IZ`TNO[\_ZNYVaf-QRaRPaRQ-V[`UbaaR_-[\;-AI[\QIR[Q0=?=>IXRfIZ`TNO[\_ZNYVaf-QRaRPaRQ-V[`UbaaR_-[\;-AI[\QIR[Q0=?=?IXRfIZ`TY\dR_-YVSaLIf[W====IPY_ISY8=E?AY\dR_V[T-YVSaI[\QIPY\IS\[=?BDG==>CIdNV==B=IN[]=?BDG==>=G===@IdNV=>F?IN[]=?BDG====G====IdNV==B=IS\Z==>CIZ`TYVSa-Y\dR_RQI[\QIR[Q0=?=@IXRfIZ`TYVSa-V`-Y\dR_RQI[\QIR[Q0=?=AIXRfIZ`TR__\_I[\QIR[Q0=?>=IXRfISYW=E@=G=?>?ISYW=E?BG=?>>IZ`T\]R[-`UbaaR_LIf[W====IPY_ISY8=E?B\]R[V[T-`UbaaR_I[\QIPY\IdNV==A=IN[]=?BCG==>=G===>IdNV=>?EIQ[]=?BCIZ`T`UbaaR_-\]R[RQI[\QIR[Q0=?>>IXRfIZ`T`UbaaR_-\]R[RQI[\QIR[Q0=?>?IXRfIZ`TR__\_I[\QIR[Q0=?A=I]_VISYW=E?EG=?A>IZ`T`|zruv{t-v-p|vyrq-n|{qur-o|xr{-|o|4-nz;I[\QIPY_dvyy-|-nxr-vLIf[W====IPY_ITVa>=@=IQ[]=?A=IVa8==@=ISY8=E@FIPY_IPZb==>=T|-ur-Ja|-_|}rJ;IdNV=>C=I[\QI_ZbIR[Q0=?A>I]_VIZ`T;;;LI[\QIR[Q0=?A?I]_VIZ`TV4-n{tyrq-};f|-pn{4-tr-v-y||r;;;I[\QIR[Q0=?B=0=?B>0=?B?0=?B@0=?BA0=?BBI]_VIZ`TN-o|xr{-|o|;I[\QV4-rrry-qnzntrq;I[\QIR[Q0=?BC0=?BD0=?BE0=@==IXRfIZ`TISNP==>Fdrvq-}ynpr9-ruLI[\QV-|{qr-vs-uv-n|zr-|-|s-onr;I[\QIR[Q0=@=>IXRfISYW=E?@G=@=?IZ`TISNP==?Bauv-ur4-|{yznqr-v-unysn-|}r{;I[\QIPY_Y||x-yvxr-v4-pntu|{-|zruv{t;;;I[\QIR[Q0=@=?IXRfIZ`TISNP==>FW-ur-nsrur;I[\QNyy-uv-rpv-znxrzr-|{qr-w-un4-q|{urr;I[\QQ|{4-|-uv{xLI[\QIR[Q0=@=AI]_VIZ`TV;;;I[\QIR[Q0=@=BI]_VIZ`TX{|pxrq-|LI[\QIR[Q0=@=CI]_VIZ`Taurr-v-{|-r}y;;;I[\QIVaW==@=G=@=DIR[Q0=@=DI]_VIZ`T`ur-v{4-z|v{t9-o-v-y||xyvxr-ur4-vyy-nyvr;I[\QIPY_ITVa>=@=dvyy-|-r-ur-Ja|-_|}rJLIf[W====IPY\ITVa====IP[]=@=CG=?BFG====ISY8=E@BISY8=E@CISY:=E?FIZ`Tavrq-ur-|}r-|-ur-o|q;I[\QIR[Q0=@A=IXRfIQ[]=@A=IdNV==>=I`\b==??IdNV==>=IZ`Tf|-urn-|zruv{t-tvr;I[\QIPY\IdNV==B=IN[]=?B@G==>=G===>IdNV==AEIQ[]=?B@IN[]=@=>G===@G===?IdNV=>?EIN[]=@=>G===>G===?ISY:=E??ISY8=E?@ISY8=E?CIR[Q0=@B=ISYW=E?BG=@B>IR[Q0=@B>IQ[]=@B=IQ[]=@=>IQ[]=@=?ISY:=E??ISY:=E?CISY8=E?DIP[]=AB=G=>>DG===?IR[Q0=@C=ISYW=E@=G=@C>IR[Q0=@C>IXRfIZfQ===?IQ[]=@C=IN[]=?BEG==>=G===@IdNV=>==IN[]=?BEG==?=G====IPZb==?@IR[Q0=A==0=A=>0=A=?0=A>=0=AB=IXRfI`XW===CG=AB>I`X8===CIRcR=AB?0=AB> I`NaIRcR=AB?0=AB?IXRfISYW=E@DG=@=AISYW=E?EG=@=BIZfO===?IdNV==@=IZfQ===?IZ`TISNP==>FY||x;I[\QIPY_auv-v-n-|yqvr-s|zur-snpr;I[\QV4-nyy-on{trq-};I[\QIPY\ISNP====IS\[=?BAG==>CIN[]=AB=G===>G====IdNV==A=IZ`TISNP==?Baurr4-n-|{-z|r-yvxrv9-||;I[\Qdun-|{-rnu-p|yq4r;;;I[\QIPY_[|-n-Zvzvtn;[|9-|-q|-uv-zpuqnzntr;;;I[\QIPY\IPZb====IN[]=?BBG==?=G====IdNV==?=IS\Z==>CIN[]=AB=G===>G===?IZ`TISNP==?B...IdNV==B=IPY\ISNP====IdNV==@=IN[]=AB=G===>G===?IZ`TISNP==>FV4-vyy-nyvr..I[\QIPY_ISNP==?A7Oooo7I[\QIPY_aRNZ-F-N[[VUVYNaRQI[\QSNVYRQ-a\-QR`a_\f-aN_TRaI[\QIPY_Pb__R[a-S\_PR`V[`bSSVPVR[aI[\QIPY__Ra_RNaI[\Q_Ra_RNa..I[\QIPY\IS\[=?BEG==>CISY8=E?EISY:=E?AIZ[]=?BDG===DG==>EG====IPZ]==A=G==>BG==@=IPZ]==A=G==>CG==@=IP[]=?BEG=>EAG====IN[]=?BEG==>=G===@IdNV=>?EIN[]=?BEG==?=G====IS\Z==>CIdNV==?=IN[]=?BBG==>=G====IN[]=AB=G==@=G===?IdNV==A=IQ[]=B==IO\N=?==IPZb==??IO`Y====IP[]=AB=G=>E=G===?IN[]=AB=G==A=G===?IN[]=A>=G==?=G====IR[Q0=B==IQ[]=B==IO\N=?==IPZb==??IO`Y====IR[Q0>===IXRfIO\N=B==IZfQ=A=>ISY:=E?EIN[]=A>=G==>=G====IP[]=AB=G=>>DG===AIdNV==>==IZ`TISNP==>Fdr-qvq-vL.IdNV=>==I[\QIPY\ISNP====IS\[=A=>G==>CIP[]=A==G==CDG===?IdNV==B=IZ`TISNP==?CUz}u.I[\QIPY_]yyrq-v-|ss9-V-rr.I[\QIPY_ISNP==>Ff|.I[\QIPY_f|4r-un-vpu-u||rq-zr-q|{-urr.I[\QIPY_au|r-puvyqr{-unq-orror-nsr.I[\QIPY_ISNP==>CUn.-Or-vyr{.I[\QIPY_f|4r-{|-z|ur.I[\QQ|-|-rr{-x{|-unuv-vL.I[\QIPY_ISNP==>FdunLI[\QIPY_ISNP==>CUz}u;-auv-v-un-Vunr-no|-|o|;I[\QIPY_auv-v-ur-urn-|s-urvyn{q.I[\QIPY_Vs-|-|}-v9-ur-vyn{qvyy-snyy-|-ur-rnu.I[\QIPY_V-un-|-tn{q-}yn{LI[\QIPY_a|-nxr-ur-vyn{q-q|{vu-|-v{-n-oynr-|sty|L.I[\QIPY_S||y..I[\QIPY\ISNP====IP[]=A=?G=>@FG====IN[]=A=?G==A=G====IdNV=>==IZ`TISNP==?>Ur.I[\QIPY_dun-nr-|-q|v{tLOv{t-ur-p|r-|-uryno|n|-n-|{pr.I[\QIPY_aurr4-vyy-vzr.I[\QIPY\ISNP====IN[]=A==G==>@G===?IdNV==B=IP[]=A==G==E?G===?IdNV==?=IN[]=A==G==?BG===?ISZbIZ`TU||||||\\\\\\\\U..IdNV==B=I[\QIPY\IO\N=C==IdNV==@=IN[]=A==G==?=G===?IN[]=A=?G==@=G====IN[]=A>=G==@=G====IN[]=AB=G==?=G===?IQ[N=>E>IQ[N=>E?IPZ]==A=G==>BG==ADIPZ]==A=G==>CG==ADIdNV=>==IPZb====IS\Z==>CISY8A===ISY8=E@?ISY8=@A>ISY8=DE@ISY8=E@DIR[Q0>>==IXRfISY:A===ISN\===AIdNV==B=IZ`Tf|-r{r-qvz9-n{q-ur-|yqt|-qnx;;;I[\QIPY\IQ[]=AB=ISY8=E@=ISY:=E?BISY8=E?FISY:=E?DISY8=E==ISY8=E=>ISY8=@D?ISY8=A>>ISY8=@A=ISY8=>BFISY8=E@EISY:>CA?ISY8>CA@ISY:=E@FIQ[]=?A=IVaW==@=G>>=>IRcR>>>=0>>=>IdNV=>B=IXRfIZ`?Qvq-|-x{|-un-ur-vpu:|zn{Wr{xn-|{pr-unq-n-o|urLI[\QUv-{nzr-n-Onyy|;I[\QYvxr-uv-vr9-ur-vryqrq}|r-sn-or|{q-u|r-|sz|ny;;;I[\QIPY\IRcR>>>=0>>>=IP[]=@=CG=>>DG===?IN[]=@=CG==@?G===?IN[]=?BEG==>=G===>IdNV==FCIN[]=?BEG===>G====IdNV==B=IZ\c==BBG==>EIQ[N=>E@IVa8==?>IR^8==>CIZ`T;;;;;;LI[\QIPY_;;;f|-pn{-ornur;I[\QISNV===AIdNV==B=IR[Q0>?==IXRfIN[]>?==G==?=G===?ISYW=E?FG>?=>IRcR>?=?0>?=>IP[]=@=CG=>>DG====IN[]=@=CG==@?G===?IRcR>?=?0>?=?IS\[>?==G==>CISNV===>IdNV=>==ISN\===>Ia_N==BCG>?==G==CFG==DC \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Ballo1.tsc b/res/en/data/sprites_og/Stage/Ballo1.tsc new file mode 100644 index 0000000..72aac38 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Ballo1.tsc @@ -0,0 +1 @@ +96O\\e\96hyzmhoy\\\\hrmu\\\\hqzp96O\\e]96hyzmhoy\\\\hrmu\\\]hqzp96O\\e^96hyzmhoy\\\\hrmu\\\^hqzp96O\\e_96hyzmhoy\\\\hrmu\\\_hqzp96O\\e`96hyzmhoy\\\\hrmu\\\`hqzp9696O\\ea96hyzmhyp\\\^h|~u96hoy\\_ehrmu\\\^hwq96hmz|\]\\f\\\\f\\\\hmhqzp9696hoy|\\\]f\\\cf\\]dh{\\]^9696O\`\\96O\`\]96O\`\^9696969696O\a\\96hpz|\a\\hyp\\\^96hwqhysZhz{phox~96hrmo\\^euLLnZhz{phox~mLLLX96LLL96LXhz{phox~uLLLL96LZZZhz{phox~LLLL96LLSL96LLLZhz{phox~mLuLLXL96LLLLXhz{phox~LLLLL96XLLXL96LZZZhz{phox~LLL96LLLZhz{phox~uLLLL96,LLuLL96LLZZZhz{phox~xZZZhz{phox~vLLLX96LLLLL96LLLZhz{phox~xXLLLuLZZZhz{phox~LLLL96LLL96SLZZZhz{phox~zXLLMhz{p96{LuYYhz{pLL{MMhz{phox{96hoy\\\`96hmz|\`\^f\]\\f\e\\hr{z\`\^f\\]b96hnx\e\\hmz|\e\\f\\]\f\\\\hqzp9696969696O\e\\96hmz|\e\\f]\\\f\\\a96hr{z\e\\f\\]b96hoz|\`\\f\__ef\\\^96hoz|\`\]f\__ef\\\\96hoy\\\\hmu\_\\96hr{y\\]bhmu\\a\96hn{m\]\\hmu\^\\96hmz|\`\^f\]\\f\\\\96hr{z\`\^f\\]b96hn{m\^\\96hoy\\\chnx\\\\96hqzp969696O]\\\96hrxv]b\\f]\\]96hrxW]b\\96hoy\\\\hn{m\^^\hmu\^\\96hoy\\_^hn{m\_\\hmu\\a\96hn{m\_]]hnx\\\\hqzp9696O]\\]96hwqhr{n\\\\f\\]b96hn{m]\\\hmu\^\\96hoh~m\\e]f\]]\f\\\\f\\\\9696 \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Ballo2.tsc b/res/en/data/sprites_og/Stage/Ballo2.tsc new file mode 100644 index 0000000..8e0a888 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Ballo2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMsssssssvPMfss|wPMssssssswPMPMfswssPMfswstPMfswsuPMfswtsPMfswttPMfswtuPMPMPMPMfsxssPMsstysssussssssxsssstPMstxsPMssuxcqqqsst|cjcPMdcccPMcccPMccssuxqqqqqoccoccPMccccPMcqssssPMuccccqqqssxsPMssuxssssPMstssucccccqqqccqqqqqPMswts}ssts}ssssswtt}ssts}sssussxscccccccccqqqPMstssdssxsssssPMssvwstssPMswss}ssss}ssssssusPMswst}ssss}sssuss{sPMssuxcddCssssPMstssPMswss}ssss}sssussusPMswst}sszs}sssussvuPMswst}ssss}ssssssusPMucccccqqqssxsPMccccccqqqssxsPMcccccccqqqqqssxsPMssuxjcccdssxsPMssssvdPMswsu}sss|}ssssstxsPMsssxccdPMcccqPMsst|ccccdsssxccddssssPMPMswst}ssus}sssssstsPMswss}ss{s}sssusssuPMsssxjcdssssPMswsu}sstyPMswsu}sstu}sssusssuPMswsu}stss}sssustssPMPMddstssssxsssstPMssxsssssPMssuxccccPMssuvjccqqqPMsszt}stus}ssss}ssssPMPMPMPM \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Barr.tsc b/res/en/data/sprites_og/Stage/Barr.tsc new file mode 100644 index 0000000..e47a9a3 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Barr.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:=:=:=:S`a``=:lv|z`cfaj`a`c=:lv|z`cfbj`a`a=:lv|z`cf`j`a`b=:l{ul``aalq~`a``j````j```b=:lvq```dlq``aaj``idj``dbj``eb=:S`a`a=:lyl}wyPWPQl~tlu~t=:S`a`b=:l{ulvq```dlq``aaj``idj``dbj``eb=:S`a`c=:lyl}wPWPQl~tlu~t=:=:S`ae`=:S`aea=:S`aeb=:S`aec=:S`aed=:=:S`bi`=:lv|z`cg`j`bialu~t=:S`bia=:lv|z`cf`j````lyl}wlvqs```h\PQQl~tlt~`bi`ls~a```j``fcj```blu~t=:=:S`d``=:l{ulv|]`cfalv|]`cfb=:l}sls~`d``j``abj````lq~`d``j``b`j```dlqy`ad`=:lyl}wlvqs```ezPPQl~tlvqs````l{uls|=:lqy`a``ls}``ae=:l}w=:vPPrQlqy`ad`l~t=:l``dels~`ae`j```aj````lqy```d=:l``dels~`aeaj```aj````lqy```d=:l``dels~`aebj```aj````lqy```d=:l``dels~`aecj```aj````lqy```d=:l``dels~`aedj```aj````=:ls}```hlu~t=:=:S`e``=:=:Sa```=:l{ulv|[`cf`lv|[`cfalv|[`dd`lv|]`cbfl}wuQl~tls|P\PPQQl~tls|^^^^^l~txol~tl}r```blqy``c`l}t```bls~a```j``f`j```dls|lvqs```fW^^^WP=:PPtol~tls|QPyWP^l~t=:PPP^=:PtWPP=:P^l~t=:PPPP=:PPP\l~t=:PP=:^^^l~tls||PP^=:xPPP^l~tls|Ql~t=:PQlwya``dl~tls|PPPPol~t=:PPPPQl~tls|^^^^^l~tls|^^^PyPWP=:P^l~t=:lwy````{PPPP=:PPPPP=:PPyPP^^^l~t=:PPP^l~tls|=:lvqs```0ls}````=:lq``c`l``bf=:lq~a```j```hj````=:lq~`a``j```aj````=:lqy``a`=:l}t````=:ls~a```j``f`j````=:lqy`a``=:lq``c`l``bf=:lq~a```j```hj````=:lq~`a``j```aj````=:lqy``g`=:lq``c`l``bf=:lq~a```j```hj````=:ls~`d``j``aij```b=:ls~`a``j``ahj```b=:ls}```dj```hj``h`=:ls}```ej```hj``ha=:ls}```fj```hj``hb=:ls}```dj```ij``if=:ls}```ej```ij``ig=:ls}```fj```ij``ih=:=:=:l}wxQlqy``e`ls~`d``j``abj```blq~`d``j``c`j```bls|l{uls}``aalvqs``adPPQl~tls|lvqs```ePWP\PPQl~t=:yWPPPPP=:Ql~tlvqs````ls|yPP^l~t=:ls~`e``j``fgj```blqy`a``lq~`e``j``acj```blqy``e`lq~a```j```hj````l}wlvqs``aeP\PPyP=:PPPP^l~tls|lvqs```e}Ql~tls|yPPPQl~tls|lvqs```h]]PWP=:Pt\PWPQl~tls|lvqs``ae^^^^^l~tls|lvqs``afPWP\Po=:PtPP=:P^l~t=:sP\P^l~tls|lvqs```f^^^ol~tls|=:yWPP^l~tlvqs````ls|=:lq~`e``j``aej```blqy`aa`=:lyl}wlvqs```huQl~tlvqs``aels|r^l~t=:yPPPPP^l~tls|=:lq~`e``j``b`j```blvqs````ls|=:l{ulqy``e`l}wlvqs```h~\P\PWPP=:]]Ql~tlvqs````ls|=:lqy``e`=:lvqs```el}w~Pqwqy~Ql~t=:yPPPPPQl~t=:qPPyPP=:vyQl~tls|^^^^^l~tls|PWPPol~t=:PPPP=:Pol~za``alq~`d``j``c`j```bls|=:lvqs``adyPPQl~tls|=:lv|[`cfals}```dls~`d``j``fhj```blr|`d``lu~t=:=:Sa``a=:l{ulv|]`cfblv|]`cfals}```hl}wlvqs```ex^l~t=:qP\PPP^l~tls|lq~`d``j``a`j```blu~t=:=: \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Blcny1.tsc b/res/en/data/sprites_og/Stage/Blcny1.tsc new file mode 100644 index 0000000..3f41969 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Blcny1.tsc @@ -0,0 +1 @@ +FSS\S0-_nh|_ioPTT\S_ioPTT\T_ioNTT\U_pqd_fpxSSVS_idlSSSS_hqg0-FSS\T0-_nh|_ioNTT\S_ioPTT\T_ioPTT\U_pqd_fpxSSVS_idlSSST_hqg0-FSS\U0-_nh|_pqd_fpxSSVS_idlSSSU_hqg0-FSS\V0-_nh|_pqd_fpxSSVS_idlSSSV_hqg0-FSS\W0-_nh|_ioPTT\S_ioNTT\T_ioPTT\U_pqd_fpxSSVS_idlSSSW_hqg0-0-FSS\X0-_nh|_idlSSSW_hqg0-0-0-FSTSS0-_nh|_vrxSSTT_dqsSTSS]SSSS]SSSU_idrSSSV0-_lwmSSUV]STST_wudSSYV]SS\V]SSS\]SSSW0-0-FSTST0-_nh|_wudSSYZ]SS\V]SSS\]SSSW0-0-0-0-FSTTS0-_sul_idrSSSU_wudSSYW]SS\U]SSST]SSTT0-0-FSTUS0-_nh|_dqsSTUS]SSSS]SSSU_vrxSSTT_idrSSSW_wudSSYY]SS\W]SSTS]SSS[0-0-#STVS0-_sul_pvjwCCCC0-vCCCCCCQQQ_qrg_hqg0-0-FST\\0-_sul_pvjqCQ_qrg_hqg0-_idrSSSWhQ_qrg_for_fpxSSVV_fuh_zdl\\\\_hqg0-0-FSUSS0-_nh|_p|gSSSS_gqsSUSS_zdv_pvjdCCCJ0-CCD_qrg_hqg0-0-FSUST0-_sul_pvj_wxu0-CCCCCCCCCCCCwkdwJvCdooOCironvD_qrg_hqg0-0-FSUTS0-_sul_iomTT\T]SUTT_iomTT\U]SUTU0-_sul_idrSSSW_p|gSSSU_zdlSSXS_wudSSYU]SS\X]SSSZ]SSZW0-FSUTT0-_sul_idrSSSW_p|gSSSU_zdlSSXS_wudSSYU]SS\X]SSZ\]SSZV0-FSUTU0-_sul_idrSSSW_p|gSSSS_zdlSSXS_wudSSYU]SS\X]STTZ]SSYU0-0- \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Blcny2.tsc b/res/en/data/sprites_og/Stage/Blcny2.tsc new file mode 100644 index 0000000..0c9ee66 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Blcny2.tsc @@ -0,0 +1 @@ +_llulIFxximmulximmumxgmmunxllmtx}llllxIF_llumIFxxgmmulximmumximmunxllmtx}lllmxIF_llunIFxxllmtx}lllnxIF_lluoIFxxllmtx}llloxIF_llupIFxximmulxgmmumximmunxllmtx}lllpxIF_lluqIFxx}lntlvllmlvllllxlntlvllmrIFx}llqlx}lllpxIFIF_lmllIFxxllmmx}lmllvllllvlllnx}llloIFxllnovlmlmx}llrovlluovllluvlllpIFIF_lmlmIFxx}llrsvlluovllluvlllpIFIFIFIF_lmmlIFxx}lllnx}llrpvllunvlllmvllmmIFIFIFIF_lmnlIFxxmouovlmnmx\c\]xxIF_lmnmIFxx}lllpxllmrx}llsuvllupvllmlvllltIFIFIF_lmuuIFxxlloox\\\]IF\\\\IF\jjjxxxIFIF_lnllIFxxllllxlnllx}\\\cIF\\]xxIFIF_lnlmIFxxxIF}c\}h\]xxIFIF_lnmlIFxxmmumvlnmmxmmunvlnmnIFxx}lllpxlllnx}llqlx}llslvlluqvlllsvllspIF_lnmmIFxx}lllpxlllnx}llqlx}llslvlluqvllsuvllsoIF_lnmnIFxx}lllpxllllx}llqlx}llslvlluqvlmmsvllrnIFIF_lntlIFIF_lnulIF_lnumIF_lnunIF_lnuoIF_lnupIF_lnuuIFIFIFIFIF_lollIFxxxlollvllmrIFx}lltlx}lnuuvllnlvlllnIFxx}llnlIFxc\]xxx}lllmx}llqlIFxlnumvlnmsvllllx}lnumvllplvllllx}llqlIFx}lnulvllllvllllx}llnlIFxx}llntc\\\]IFc\\\\IF\jxxjjj\\\IFc\\\IF\\\jjjxx<}llllIFx}lnumvllqlvllllx}llmrIFxx}llnn\\\cIF\jjjxxIFx}llllx}llmrIFx}llmlIFx}lnulvlllovllllIFx}lnumvllmlvllllIFxlnunvlnsuvllllIFxlnuovlnsuvllllIFxlnupvlnsuvlllnx}lmllIFx}lnumvllpnvllllIFx}lnulvllllvllllIFxx}llnt}\jjj{xxx}llnn\jjj{IF\c\]xxIFx}llloxllmrxxlllnx}llrtvlrllvllnpvllmoIFxIFIF_lolqIF_lolrIF_lolsIF_lomlIFxxllllxllmtximmulximmumxgmmunx}llllIFx}lolqvllmmvlllnIFx}lntlvllmlvllllIFxlolqvllmrxox}lllo\]xIF\\\\hIF\c\\IF]]xxlntlvllmrxIFx}lolqvllolvllllx}llrlIFxlolqximoumxIF_lonlinIFIF_loolIFxxloolxllllx}lonlvllllvlllnIFx}x}llqlIFxlonlvllmrxx}lllmc\\\IFj\c\\\IF\jxIFc\\\\IF\\\\IF\]xx\{xIF\\\\\]xxxIFx}lonlvllllvllllx}llqlIFx}lonlvllolvllllx}llmnIFx}lonlvllplvllllx}llqlIFximounxllmrxIFIF_lpllIFxxxlpllx}llolxx}llllIFxlqllvlnqpvllllx}lllmIFx}lqllvllnlvlllnx}lllmIFx}lqllvllolvlllnx}lllmIFxlqllvllmrxllnlvllolIFxlolsxlntlIFx}lmllx}lllpIFxx}llnnIF\c\jjjxxx}llntc\\jIFc\\\\]xxx}lllpIFxlloqx}llpuvmnllvllutvlllrIFIF_lqllIFIF \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Cave.tsc b/res/en/data/sprites_og/Stage/Cave.tsc new file mode 100644 index 0000000..e2fc191 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Cave.tsc @@ -0,0 +1 @@ +?FWXKFMW_::FOXN-::C?-::CCFUOcFWXKFMW_::FMXZ:=:;D:;;F^\K:::;D::CCD:::?D:::B-:;:;FZ\SFPKY:::>F^\K::?;D::C>D:::>D:::>-:;:<FZ\SFPKY:::>F^\K::?;D::C>D::;BD:::B-:;:=FZ\SFPKY:::>F^\K:::?D::C>D::;:D:::B-:;:?FZ\SFPKY:::>F^\K::?:D::C>D::;F^\K::?:D::C>D::;;D::;<-:;:BFZ\SFPVT:;:=D:;:CFW]QS~*yx1~*yzox+FXYNFOXN-:;:CFUOcF]Y_::;;FKXZ:;:BD::::D:::F^\K::?D:::>D::;:-:;;:FUOcFPKY:::>F^\K::?>D::C>D::;:D:::C-:;;;-:<::FZ\SFW]Q^ro*mk|mk}}*yp*k*]u*N|kqyx888FXYNFOXN-:<:;FKXZ:<:;D::::D::: \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Fall.tsc b/res/en/data/sprites_og/Stage/Fall.tsc new file mode 100644 index 0000000..c653bb8 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Fall.tsc @@ -0,0 +1 @@ +rorororororororororororororororororororororororoمޅƆܓׅمڌroޅхم˓̅Յʅʓё܅ʅɅroԅʅʅ҅ޅro؅˅ʅדroʅ؅ӅɆroٌܑ؅ԅʓrororororororororo܆ٓ؅ʓم؅roх؅ʅroʓro؅ʅʅroڅׅʓro͑ӌمЅʓro؅م̅roޅɅʅԅԓޤڅӑroمͤroٌ؅ٓمʅroׅؓroБمroɅׅؓڅمؑ٤ӅڅɅّroمɅׅʓro܅ׅ˅؅roԅe؅roʆمڅ؅roمؑroم؅م؅roʅӌ؅نёڅՅroڅܓroׅёތ؅roʅԅɅ҅ʅroӅӅʅمʓ͓roڅӌمޓԅޓroroԆroԤԅمʅڅroԅԅܤroӅʅڅroڅʓґڌʅׅٓӅ؅בroɅ܅ممroʅمޅءroʅʅro݅Ʌޅroхܓro͑څܓroҤɅمʅхro˅Ʌڅʤroʆroٌ؅ʅʅro˅؅׆roޤхمڅЅroٓroمɅ؅ƅroʑޤroڅمنхمӑro͡ơӡ̡ԡӡ١Ρ̡͡١rorororoӌمڅro̤rorororororororo \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Frog.tsc b/res/en/data/sprites_og/Stage/Frog.tsc new file mode 100644 index 0000000..da13082 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Frog.tsc @@ -0,0 +1 @@ +yvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvړڍyvyvyvŨyvЌььyvьٌѩíyvíŰíyvԫyvíyvьښyvیތѫИڌьyvњړЌјyvړ͌lyvٌьѫړьyvьyvíŰíyvyv卨Ԍѓyv͌ލތڌ͌͘yvڍړ嚨yvííyvߌьŻ嚨yvíь׌ڌyvѓߌڌߚyvíyvyv׍yvyvyvyvyvyvyvŨíyvyvҌӍíyvyvyv \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Gard.tsc b/res/en/data/sprites_og/Stage/Gard.tsc new file mode 100644 index 0000000..95bb3c6 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Gard.tsc @@ -0,0 +1 @@ +YVo|||YV||||||||YVo||}YV|||||||}YVo||~YV|||||||~YVo||YV|||||||YVo||YV|||||||YVYVo|}||YV|~|}|~|~}|}|}YVw|~YV||||||||||||}YVo|}|}YVlsl±mYVo|}|~YV|||||}||||~~||YVYVYVo|||YV|||||}w|||||~YVo||}YV||~YVo||~YV|||~YVw|w|y||}y|~YVw|~|w|~}||}||||}|||YV|||||}lzYVl±lllYVllŻlzYV||~}lzllzzzYVlñllYVzYV|||||~|||||||||||YVlllYVñ||||YV|||||~|||||||~YV||}z||~}xlzzzsllYVl±llYVzzz||}lzzzYVlllllYV||~}zzzxllllYVzYVzzzzzzzzYVxlllYVllllz||}xllz||||YV||~||||||||||YV|||}|||||}}|YVm|||||||||||||||zzzzzlzzz||||YV||||||||||||~|||m||||YV|||||||||||||||||~|}||YV||||}~|||~||||}||||~YV||||||||~YV||}yzYVllŻlYVŻsl||||}||}zYVllllñz||}||||||||~YVllz||||YV||||||||~||~YV||||||||~|||YV|||mlmYV|||lzllmYV||||||||lŻlllmmLYV||||}|||||}YV||||}|||~||||~||||~||||||YV||||}||||~||~YV||||||||~||~YV||||~||||||||YV||||||||~||~||YV|||mYVlŻlŋm||}}zzzzzzzzzzzzYVzzzlzzz|||YVmmmm||}||}mlslYVm||||YV|||||~}zzzzzxlűzYVlllzlllxllYVŻllzlllŻYVzxlôlĭlYVlŻllllõYVlûyyzzz|||sllŻmm||||YV||||}||||~|||YV||~||~|||||||}YV||}||}|||||YV|||}|||~||}YV|||||||||||||}YV|}|||||}|YV||~}xlllYVlllYVll||||||YVmsllYVllm||}||}||}||~|||||s±lllYVlzYVxlsllŻmxlxlxYVsllzYV±lxlŻlz||}||||||||}|||||YV|||}||||~||YV||}YVYVYVYVo||}YVo||~YVo||YVw|~|}}|}~YV||||}|||}|||||YV|||||||YVYVlƵlz|||YV|||}|||||}|||}YVo||YVo||YV|~~||}YV|~|||YVzzzzzzYVo||YVo||YVYVo|||YVw|~~|||zzzsllllzYVlŻzzz±lzzzYV|||||||||||||}||YVo||}YVy|~}||w|||||||YV|||||}|YVllz|}|YVYV \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Hell1.tsc b/res/en/data/sprites_og/Stage/Hell1.tsc new file mode 100644 index 0000000..6989da1 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Hell1.tsc @@ -0,0 +1 @@ +rororororororororororororororoׅɓrororoڅхƅЅɅroͅړroх؅Ʌԅхrorororororororororororororororoʅԅцrororororoمƅʅʢro݅eͅɅޅrorororororororororo͓roɅׅޅԅroͅʅʓrororororoɅڅ܅مʅ͒roƅʅɅƅפro؅ʅ؅ؓroʅ؅בʅro؅ׅɅʅroؓrorororoʅɅ؅х؅roՅɅʅʑroɅʅʅɅɅro҅ӅӓӅʅӅޅɅroӅ̓roro \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Hell2.tsc b/res/en/data/sprites_og/Stage/Hell2.tsc new file mode 100644 index 0000000..6b82149 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Hell2.tsc @@ -0,0 +1 @@ +ururururururururururururururururururururururururur͏ۈ׈ψӖurururururur͈ۈψ̈urḧ̈ֈur֔ur͈ۈ܈urԈ̈Ԗurۈֈ͈urۈ̖ururururڈ͈͈ur͈͔ۏۈurۈֈ̖ur͈ψۈ̈ur͈ԈΈˈur̈ֈֈܖurֈɈ͈ܔ͈ur܈ۈ׈̈ۈur׈ֈۖurur \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Hell3.tsc b/res/en/data/sprites_og/Stage/Hell3.tsc new file mode 100644 index 0000000..965cef6 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Hell3.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFPKS::::FOXN-::C;FWXKFPKS:::;FOXN-::C<FWXKFPKS:::FWXKFPKS:::>FOXN-::C?FUOcFPVT;?=D:;;;F^\K::B>D::C?D::;:D:::<-:;;;F^\K::B?D::C?D::;:D:::<-:<::FMXZ:<::D:=<:D::::FPV7;?=D:::;FMWZ:::BD::;>D:::;FMWZ:::CD::;>D:::;FMWZ::;:D::;>D:::;FMWZ::;;D::;>D:::;FMWZ::;D:::;FMWZ::;=D::;>D:::;FOXN-:<>:-:<>;FNXZ:<>;FKXZ:<>:D::;:D:::=FOXN-:<><-:<>=FNXZ:<>=FKXZ:<>>-:<>?FNXZ:<>?FKXZ:<>>D::;:D:::=FOXN-:-:D::;:D:::;FOXN-:D::::-:>::FZ\SFPVT:<:::;FPV5:<:;FQS^:::?FKW5:::?D:;::FMW_::;:Qy~*~ro*GWs}}svo*Vkxmro|G+FaKS:;@:FXYNF\W_FMV\^ro*Ws}}svo*Vkxmro|*s}*k*zyo|pvokzyx6*l~*s~}*kwwy*s}*vsws~on8FXYNFMV\cy*mkx*|ozvoxs}r*y|*}~ymuzsvos~r*s~ow}*n|yzzon*l*oxowso}8FXYNFOXN-:>:;FZ\SFKW5:::?D::=:<FZ\SFKW5::;:D::<>FW]QFQS^::;;Wk*ws}}svo}*sxm|ok}on*l*FX_W::::+FXYNFOXN-:C::FNXZ:C::F]UT::<>D::::F]U5::<>FZ\SFW]=Toxuk6*}oosxq*ro|*l|y~ro|1}wknxo}}6*myxpsxon*rsw*~y*~rs}pvyk~sxq*s}vkxn8FXYN^rk~*k}*~ro*wy}~*}ro*myvn*ny8FXYNOox*k}*ro*k}6*}ro*myvn*xy~l|sxq*ro|}ovp*~y*usvv*ro|*yxl|y~ro|888FXYNFOXN-:C:;FNXZ:C:;F]UT::IZ[NIPZb===EISNV===>IR[Q0==F?IZ[NIPZb===EISNV===?IR[Q0==F@IZ[NIPZb===EISNV===@IR[Q0==FAIXRfISYW>===G==FBIZ[NIPZb===EISNV===AIRcR=?==0==FBIZ[NIPZb===EISNV===AIR[Q0=>==IXRfI`\b==>>IN[]=>==G====G===?ISN\===AIa_N==B@G==FAG==DBG===B0=>>=IXRfI`\b==>>IN[]=>>=G====G===?ISN\====Ia_N==BCG==F=G=>>EG==E@0=?==IXRfISY8>===ISY8>=?BISY8>=@EIZfQ===?IdNV==B=IN[]=A==G==>=G====IZ`Tbnu.I[\QIPY\IN[]=A==G==?=G====IdNV==B=IR[Q0=A==IXRfISYW>==@G=A=AISYW>>=?G=A=@ISYW>==?G=A=?ISYW>==>G=A=>ISY8>==>ISY8>=@EIN[]=A==G==>=G====IZ`TRnnuu.IZfO===?I[\QIPY_Q|{4-xvyy-zr.I[\QV4z-n-uzn{.-V-w-t|zntvpnyy-{rq-v{|n-Zvzvtn.-V4z-uzn{.I[\QIPY_UuLI[\QIPY_;;;;;I[\QIPY_IN[]=A==G====G====ISNP==?Edun4-uvLf|4r-{|-|{r-|s-u|rxvyyr-|o|LI[\Qdryy9-|-pnrq-ur}n{-|ss-zr9-wz}v{t|-yvxr-un.I[\QIPY_f|-|yq{4-or-unnv|9-|yq-|LI[\QIR[Q0=A=>IXRfISY8>==?IZ`TISNP==?EV4z-V|u9-|{r-|s-ur uzn{-u|-pnzr-|-uvvyn{q-|-q|-rrnpu;I[\Qaun-vpu-Zvr-{rqzr-v{|-uv;;;I[\QV-zn{ntrq-|-tr-nn9o;;;w-y||x-n-zr;I[\QIPY_N{q-{|-V4z-px-urr.I[\QIPY_f|-pyvzorq-}-s|z-ur|vqr9-qvq{4-|;I[\QV4z-n{-r{tv{rr-|sp|{vqrnoyr-nyr{9I[\Qo-V4z-qrnuy-nsnvq|s-urvtu;;;I[\QIPY_\u9-|r9-|r-v-zr;;;I[\QIPY_V-{rr-u|yq4r-p|zr|-uv-vyn{q-v{-ursv-}ynpr;I[\QIR[Q0=A=?IXRfIZ`TISNP==?E[|9-{|9-ry-|-unr{|-r-s|-pu-n-}nurvp9n{qrq-yvyr-zn{;I[\QIR[Q0=A=@IXRfIZ`TISY8>==@ISNP==?EV|uLI[\Q-fr9-un4-zr;I[\QIPY_dun4-unLI[\Q`nxnz||4-|xv{t-|{n-|pxrLI[\QIPY_`|-ur4-vyy-nyvr;;;I[\QN-svrpr-|{r9-ur-v;I[\Q[|uv{t-yvxr-zr9-un4s|-r;;;I[\QIPY_Nyy-vtu9-ur{;I[\Qanxr-uv;I[\QISNP====ITVa>=?DIVa8==?DIPY_IPZb==>=T|-ur-JP|{|yyrJ;IdNV=>C=I[\QI_ZbIPY_ISNP==?EV-uv{x-un4-unur4-nsr;I[\QITVa====IRcR=A=A0=A=AIXRfIZ`TISNP==?ETvr-Z;-`nxnz||-zrtnq;I[\QIR[Q \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Jail1.tsc b/res/en/data/sprites_og/Stage/Jail1.tsc new file mode 100644 index 0000000..e61798b --- /dev/null +++ b/res/en/data/sprites_og/Stage/Jail1.tsc @@ -0,0 +1 @@ +[Xq~~~[X~~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[X[Xq~~~[X~~~~~~~~~~~~~[X[Xq~~[X~~~~~~~~~~~~~~~~~~~~~~~~[X[X[Xq~~~[X[X~~~[X~~~~[Xxnx|||o[X~~~~~~~~~~~~~~~~~~~~y~~{~y~[XznnŶunů|õnǽnnn|[Xnunnn³[Xnn·nónnǽ|nn¶n|[XnŶnn½nn¶n½[Xn¶żnn|[Xnnðnn[Xƾ||||||unŶnón|Nnnnn[Xunnn½n³|[Xnn½nnnnŷ¶n|nůnnnǽn¶[XŶn·|[XnnnºnŶnz[X¶nnn½nnů|~~[X[Xq~~[Xy~ndz|nn¶núnnz[Xnnnn¶n½[Xǽn|~~~~~~~~[X[Xq~~[Xnůnznnijn³~~~~~~~~[X[Xq~~[X~~~~~~~~~~[X[X[Xq~~[X~~~~~~~~~~~~~~~~[X~~~o[X~~~uo[X[XunnznnǽÍ|||||[X~~~y~~~~~~~~~~~~~~~[Xq~[X[X \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Jail2.tsc b/res/en/data/sprites_og/Stage/Jail2.tsc new file mode 100644 index 0000000..2183673 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Jail2.tsc @@ -0,0 +1 @@ +TQjwwwTQwwwwwwwTQjwwxTQwwwwwwxTQjwwyTQwwwwwwyTQjwwzTQwwwwwwzTQjww{TQwwwwww{TQTQjwwTQwwwTQwywwwwwxwwwwwww{TQwzwxwxxywwwywxwwTQwywwwwwwwwwwTQwwwywzwxTQTQjwxwwTQwwwyww|}wwywwwww{TQTQjwywwTQggguTQgggggwwwwrw|y{TQwzwwwxxxwwwwww}wwywwwwwxwwwwTQwxwwwww{wwxwwwwx|wwxwTQTQTQjw{wwTQGsgggggggggTQjw{wxTQghTQjw{wyTQggggghTQTQjw{wzTQgggggTQgggghgnggggTQghTQjw{w{TQggggiiTQnggggTQgggguuuTQjw{w|TQggggggTQggsgggngTQguuuTQgggguTQTQ \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Jenka1.tsc b/res/en/data/sprites_og/Stage/Jenka1.tsc new file mode 100644 index 0000000..121c82f --- /dev/null +++ b/res/en/data/sprites_og/Stage/Jenka1.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPQY\faiPPPP\end-*CPPYQ-*\mna\cmuPPQY\faiPPPQ\end-*CPPYR-*\mna\cmuPPQY\faiPPPR\end-*CPPYS-*\mna\cmuPPQY\faiPPPS\end-*CPPYT-*\mna\cmuPPQY\faiPPPT\end-*-*CPQPP-*\pri\souPPQQ\dnpPQPP\faoPPPT\traPPQPZPPYTZPPSUZPPRV-*-*-*CPRPP-*\key-*\itjPPQTZPRPQ-*\fljPUYTZPRQT-*\fljPUYSZPRQS-*\fljPUYRZPRQR-*\fljPUYQZPRQQ-*\fljPUYPZPRQP-*\key\msg\facPPQSw@@NNN_\nod-*iG@@@-*@N\nod\end-*-*CPRPQ-*\itMPPQT-*\fljPUYTZPRRT-*\fljPUYSZPRRS-*\fljPUYRZPRRR-*\fljPUYQZPRRQ-*\fljPUYPZPRRP-*\key\msg\facPPQSoL@A\nod\clr\gitQPQTm@@A\nod\clr-*\gitPPPP\facPPPPg@@@]p]N\nod\clr\cnpPSPPZPQSPZPPPP\dnpPTPQ\flMPRWT\facPPQSy@@@L-*i@@_\nod-*m@N\nod\clrwG@_\nod-*]r@]_\nod\facPPPP\clr\cmuPPPP\msghA\nod\clo-*\cnpPTPPZPPPYZPPPP\waiPPQP\mydPPPR\cnpPSPPZPQSRZPPPR\anpPSPPZPQPPZPPPR\waiPQRP\cmuPPQQ-*\cnpPTPPZPPQRZPPPP-*\msg\facPPPUhG@@L@j_\nod\clr\facPPQSaL@bN\nod\anpPSPPZPQRPZPPPR-*yG@@L@i@N\nod-*a@@@@@-*@@_\nod\clr\facPPQThMMA\nod-*h_@y@@m_\nod-*sG@L@@N\nod\clra@@@@N\nod-*t@L@@-*@@A\nod\clr\facPPQSs@@@@-*@NNN\nod\clr\facPPPUiG@@@@-*@@N\nod-*i@@@@@-*@@@N\nod\clrt@@@@-*@@A\nod\clr\facPPQSNNNNN\nod\clrmNNN\nod-*w@@@@-*@_\nod\clr-*\anpPTPPZPPSPZPPPP\facPPQThA\nod\clrp@@L@-*_A\nod\clr\facPPPUNNNNN\nod\clri@@@@N\nod-*s@G@@-*@N\nod\clo\cmuPPPP-*\waiPPUP\facPPPU\msgyG@@N\nod\clo-*\facPPPP\anpPTPPZPPQPZPPPP\waiPRPP\cmuPPQY-*\msg\facPPQS\cnpPSPPZPQSPZPPPPa@@NNN\nod-*t@MMN\nod\mydPRPP\clrNNNNN\nod\clrt@@@-*N\nod-*f@@-*@NNN\nod\clra@@@@@N\nod\clrc@@@-*@@@@-*@@@_\nod\flKPUYP\end-*-*CPRQP-*\key\msg\facPPQSs@@NNN\nod-*c@@@-*@@@@-*@@@_\nod\end-*-*CPRQQ-*\key\msg\facPPQSt@@N\nod-*g@N\nod\end-*-*CPRQR-*\key\msg\facPPQSi@@@-*@@@-*@N\nod\clrt@@@NNN\nod\end-*-*CPRQS-*\key\msg\facPPQSo@@@NNN\nod-*i@@@@-*@@@N\nod\end-*-*-*CPRRP-*\key\msg\facPPQSm@L@@N\nod\clr\gitQPQTt@@ @-*@@N\nod\clr-*\gitPPPP\cnpPSPQZPQSPZPPPP\dnpPTPQ\facPPPPg@@@]p]N\nod\clr\flMPRWT\facPPQShNNN\nod-*yG@@@-*@L@G@N\nod\clrNNNNN\nod\clri@G@@@-*@@@-*@@@@N\nod-*c@m@-*@@N\nod-*a@@@@-*@@@N\nod\clrcL@@m-*@@-*@@L\nod-*@@@-*@@@-*@@@N\nod\clrh@@@@-*L@@m@-*@@\nod-*@@NNN\nod\clrt@@N\nodg@N\nod\flKPUYQ\end-*-*CPRRQ-*\key\msg\facPPQSoN\nod\clr\gitQPQTyL@N\nod-*t@@@@-*@@N\nod\clr-*\gitPPPP\cnpPSPRZPQSPZPPPP\dnpPTPQ\facPPPPg@@@]p]N\nod\clr\flMPRWT\facPPQSt@@N-*wG@@@@NNN\nod\clrNNNNN\nod\clrh@@@@-*@m_\nod\clrt@@m@-*@@@-*@@@N\nod-*t@@L@@-*@@@N\nod\clr-*hNNN\nod\clrd@@@-*@@-*_\nod\clrNNNNN\nod\clri@@@@NNN\nod-*t@@mL-*@@@-*@@L\nod-*@@-*N\nod-*i@@@@-*L@@-*@@L\nod-*@@N\nod\clra@@@-*m@@-*@NNN\nod-*i@@@NNN\nod\clrd@@@_\nod-*d@@@-*@@-*@_\nod\clrNNNNN\nod\clrt@@@NNN\nod\flKPUYR\end-*-*CPRRR-*\key\msg\facPPQSt@@@-*@N\nod-*m@@G@-*@@-*@N\nod\clr\gitQPQTm@NNN\nod\clr-*\gitPPPP\facPPPPg@@@]p]N\nod\clr\cnpPSPSZPQSPZPPPP\dnpPTPQ\flMPRWT-*\facPPQSNNNNN\nod\clryG@@-*@L@G-*N\nod-*w@@@@-*@@NNN\nod\clri@G@@@-*L@G@@-*@N\nod-*t@@@-*@@@-*@@@NNN\nod\clroL@L@NNN\nod\clrtG@@-*N\nod\flKPUYS\end-*-*CPSPP-*\fljPUYPZPSQP\end-*CPSPQ-*\fljPUYQZPSQQ\end-*CPSPR-*\fljPUYRZPSQR\end-*CPSPS-*\fljPUYSZPSQS\end-*CPSPT-*\fljPUYTZPSQT\end-*-*CPSQP-*\key\msgaA\nod\end-*CPSQQ-*\key\msga@A\nod\end-*CPSQR-*\key\msga@@A\nod\end-*CPSQS-*\key\msgbN\nod\end-*CPSQT-*\key\msgfA\nod\end-*-*-*CPTPP-*CPTPQ-*-* \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Jenka2.tsc b/res/en/data/sprites_og/Stage/Jenka2.tsc new file mode 100644 index 0000000..f0a9ebf --- /dev/null +++ b/res/en/data/sprites_og/Stage/Jenka2.tsc @@ -0,0 +1 @@ +ǺΩ©ǽǺΩ©ǽǺΩ©ǽǺΩ©ǽǺéľҵΩ©ϾǺΩ©ǽµΩɩȩ˺ľҵҽɩޙޙ򸆃ęޚȽ뚵Ƚˆ횚ȽȆɩк©ɩŤŤк©Ωǽľ҆鍍ͦ᧧ȽȽȆк©ɩк©ͪޙޙ򶧵ȽͩɩɩŦˆޙ򧧧Ƚޙޙ򧧧Ƚާ槵Ƚyޙކݙޙ憃ޙާȽᥙ짧Ƚ짧ȽͪͤˆΩڙޙк©Ƚε˵ޙޥޥ膃ޙ᧵ȽǽľҵéޚȽ暵Ƚޙކݙޙ憃ޙޚȽǽľҵéᥙޙچݙާȽͪͤˆݙڙޙк©Ƚͩ˵ޙߙ놃ݙާȽޙ솃ݙ觧Ƚǽľҵڙޙކݙݙ姧Ƚ™솃ޙȽǽľҵޣȽǽ \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Kings.tsc b/res/en/data/sprites_og/Stage/Kings.tsc new file mode 100644 index 0000000..9ed7131 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Kings.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlvqy````lu~t=:S``ia=:l}~qlvqy```alu~t=:S``ib=:l}~qlvqy```blu~t=:S``ic=:l}~qlvqy```clu~t=:S``id=:l}~qlvqy```dlu~t=:=:S`a``=:l{ul}~qlqy``e`lvqy```a=:lq~`c``j``a`j```0lqy``ig=:lq~`c``j```aj````lqy``e`=:lq~`c``j``b`j````lqy``fd=:lq~`c``j```aj````lqy``af=:lq~`c``j``c`j````lqy``e`=:lq~`c``j``d`j````lqy``ig=:lvq```alqyiiii=:=:S`c``=:=: \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Little.tsc b/res/en/data/sprites_og/Stage/Little.tsc new file mode 100644 index 0000000..878e11b --- /dev/null +++ b/res/en/data/sprites_og/Stage/Little.tsc @@ -0,0 +1 @@ +TQjwwwTQwwwywwwwTQjwwxTQwwwywwwxTQjwwyTQwwwywwwyTQjwwzTQwwwywwwzTQjww{TQwwwywww{TQTQjwxwwTQwwxxwxwwwwwwwwwywwwyww|zwwywwwywx~zTQTQTQTQjwywwTQTQxz~zwyw}TQxz~ywywyTQsgnggggusgggnggtTQggngTQuTQggggggTQwywxrxz~yTQwwwwwxywwwwwwwggguTQwwxwwwxygghwx}wTQjwywxTQgguTQTQjwywyTQGsggggggTQggggwywzhTQggguTQjwywzTQtxz~yTQgsgngggTQuTQgngggggTQgggguwwxywwwwwwwTQwwxyggguTQwwxwwwwggghwx}wTQTQjwyxwTQxz~wwyxxrxz~xTQgggggTQguuugngggsTQgTQjwyxxTQgggguTQjwyywTQngsgTQTQjw|wwTQwy|wwwwwTQTQ \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Lounge.tsc b/res/en/data/sprites_og/Stage/Lounge.tsc new file mode 100644 index 0000000..cf55ccd --- /dev/null +++ b/res/en/data/sprites_og/Stage/Lounge.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{xǪÞ{x{x{x{x{xij{x{x{x{x{x¸{xӎӎᜪ{xَڎӎӚӜ{xݎӕӎώӎ{xԎ眪{x{x{xǪӜŸ›Ҏӎ{x૜ž{xǪӎӎݎӜŸ™{xÞӎ૜ůê{x{x{xǪӎ{xՎӎҏ{xӎӎҎ{x᜜{x{x{x{x{x{x{xij{x{x{xӎ{xӎӎӎ{xҎ܎ӎ✪{xҎԎ{xҜ{xӎՎӎ{xnҎ֜{xӎ皎ݚҎ᜜{x{x{xӎ⎲ՎՎ{xԎ֎ۏ{x֚Ԏ玷ӎώ{x{x֎ώӜ{x{x{xǪ{xij{x{xܕӎώҎ{xᏪ᭎֏{xӎҎݎӎӜ{x{x{xǪ{xij{x{xێݎҜ{x{x{xǪǰ֚眪ܕӎӭ{xَ֚ӎ{xӜ{xӎҎ琎{xӎގҎӎӜ{xܚӎ՜Վݎ{xՎώӎԎӜݎӎݎ֭{xښӎҎ{xůDzů{xů{xÞů{xÞ{x{x{x{x{x{x{x \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Malco.tsc b/res/en/data/sprites_og/Stage/Malco.tsc new file mode 100644 index 0000000..5ae31c2 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Malco.tsc @@ -0,0 +1 @@ +@=Vcclc@=otovccckoyt|ccccoxw@=Vccld@=otovccckoyt|cccdoxw@=Vccle@=otovccckoyt|ccceoxw@=Vcclf@=otovccckoyt|cccfoxw@=Vcclg@=otovccck@=oy}ckfcmccli@=oy}cgkdmcclh@=oyt|cccgoxw@=Vcclh@=ovcecdmcdcemcccc@=otcfccmccccmccce@=oyt|cccgoxw@=Vccli@=ovccddmcccimccid@=ovccddmcccjmccjj@=ovcecdmcdcemcccc@=otcfccmccccmccce@=oyt|cccgoxw@=Vcdcc@=oy}cgkcmcdcd@=o|occddowcdccoytcccgotcccimcclgmcdjdmccdj@=Vcdcd@=o|oz|SZSTowoxw@=Vcecc@=oy}cgkdmcece@=o~xozySSyyaow@=tvSSyyaowovSSSro}ccccov@=occgfoy^cgkdovcecdmcdcemccccSaowov@=o~xovccccotcfccmccdcmccccot|ccecowccceot|cghc@=ovcccgoz|wxStxTow@=vxvxSwxv|TTowovot|cchc@=oz{Towov@=ovcecfmccclmccccot|cchc@=ovccccotcfccmccedmccccot|cckcovccdd@=ovcecfmccdemcccc@=ozoytvccchwSSSS@=S|SSZ@=ro}cecgovZSTowoxxcecg@=Vcecd@=Vcece@=o|ozo@=SSaowoxw@=Vcecf@=o~xovcecfmccdemccccotcecfmccecmcccgot|cdgc@=o|ozoytvccchStxSrTowoytvcccco~xov@=ot|cdccovccdh@=oz@=ySSuTot|cdgcow@=ovccckoy`cgkcoy^cgkeoxw@=Vcecg@=o~xozStZTTowovSwSS@={zxSaow@=SS@=Saow@=oytvccdgotcecfmccfcmccccS_SZS@=rowovoytvccchuSS_SSZ@=SSaow@=SSSaowovt_S|ZSS@=SSaow@=wZS_S@=aow@=Srowov@=ovcccgovcecfmccfimccccoucecfoy^cgkcoxw@=Vcehc@=o~xozoSaaaowoxw@=Vcfcc@=oy}cgkfmcfcf@=oy}cgkdmcfcd@=o~xoztSaaarow@=|SZSSSS@=aowoxw@=Vcfcd@=o|ozaaaaaowoy}cgkemcfce@=|SSSSaowoxw@=Vcfce@=o~xoz|SSSSS@=Saow@=wSSSSSSro}ccccovot|cchc@=ovcfccmcdclmcccg@=otc3ccmccdcmcccg@=oucfccot|cchcowcfccoy^cgkfoy^cgkh@=oz{taaaow{t~SaaaowovZxStS|vxSxaow@=twSSzTowov{t~SySt|zSxTowov|ZwS|~xSStSSutv~@=x{_owovuStS|S~S{SSwS|@=t~xSx|xaaaowoy}cedimcfcgoxw@=Vcfcf@=oy}ckfcmcfdh@=oy}checmcfdg@=oy}cgkimcfdf@=o|}ccddmcfdc@=oy}cgkgmcfch@=o~xoz|ZwS|~xSStSSutv~@=x{_owovuStS|S~S{SSwS|@=t~xSx|xaaaowoy}cedimcfcgoxw@=Vcfcg@={row@={xSwZSxwStwSSvtZ@=zxS|Sxrowov{trTow@=tS{tS|StxwS||wxrTowov@=SStxStSzwSxTowovwxwTow@=|ZSt~xStSwxySuu@=ySTow@=xZSuS{tSwS@=|{xxxTowoy^cgkgoxxcfch@=Vcfch@=o~xoz|ZSxxwSSSvxv@=uu`t~|zStx|taow@=pv{tvtp_ow@=p}xy|{S}|vxp_@=twSpzSutxpaowov|ZSt~xSSuuStSSt@=Su|zSxStS{xStx|tTowoy}ceidmccccov{r@=x_S{xS}xy|{Sw@={txS{xS}|vx_SStS{tx@=|xwS{xaowoy^ceidoxw@=Vcfdc@=o|}ccckmcfddoxxcfch@=Vcfdd@=o|}ccdemcfdeoxxcfch@=Vcfde@=o~xoy^cgkio|`cccko|`ccddo|`ccde@=oz{txSSywStS{xStx|t@=xrowovoz|dcde{TowS{xSpv{tvtpTow@=oz|dcck{TowS{xSp}xy|{S}|vxpTow@=oz|dcdd{TowSxxS{xSpzSutxpTowov{xSxSSuxz|TTowoz|ccccov@=oytcccdot|cdccoyt|cccd@=oz|S|Sy||{xwTowoz|dcdfo|^ccdfoy^ceedov@=ovccdczSSpxpTot|cdicowoovzSTow@=uS{tSwSTowoxw@=Vcfdf@=o~xozzSTow@={StwSuS{tSwSTowoxw@=Vcfdg@=o~xozvxStwS||Stzt|Sx|xaow@=|ZwSyyxSSxSxt_Suaaaowoxw@=Vcfdh@=o~xoz{txZSxxSS|StS{|xTowov|ZSzwSSxxSaow@=|ZSSxS{xxS|{S@=xSSt~Saaaow@=|ZxSuxxS{|~|zSx{tS|@=z{SStv|txSxStx@=u_StuxS{StStaaaowovaaaaaowov@=|ZwSyyxSSxSxt_Suaaaowoxw \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Mapi.tsc b/res/en/data/sprites_og/Stage/Mapi.tsc new file mode 100644 index 0000000..28e1969 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Mapi.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIFIFIFxmqrovlmlmIFIF_lmllIFxxmqrpvlmlmxllmmx}lmllvllllvlllnIFx}lllpx}llmrvllupvllonvlllnIF_lmlmIFxx\c\]xxIFIFIF_lpllIFxx~lllnx}llnlIFxmqrovlpnlIFxmqrnvlpmmIFxmqrmvlplox\\\\\{xlplmxmlppvlplnx]xIF\\jxxIFIF_lplmIFxxiij\~h\jxxIFIF_lplnIFxxgmqrmx{x\}{xIF\jxxlploIF_lploIFxxh\j\\\\\IF\\\\~{xlpltxlplpxIFIF_lplpIFxx~\\h\\cIF\\h\{xlplqxlpltIF_lplqIFxx\\\\{xlpluxlplrIF_lplrIFxx\\\\IF\\{xlpluWddmdA>pupwddempzu}ddddpyxA>WddmeA>pupwddempzu}dddepyxA>WddmfA>pupwddempzu}dddfpyxA>WddmgA>pupwddempzu}dddgpyxA>WddmhA>pupwddempzu}ddd4pyxA>A>WdeddA>p}pzudddfpudddmnddmfnddefnddjhA>A>WdedeA>p}pzudddepuddgmnddmendddhnddejA>A>WdfddA>p}p{}[TTbT[TTTbpxpyxA>A> \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/MazeI.tsc b/res/en/data/sprites_og/Stage/MazeI.tsc new file mode 100644 index 0000000..d5109f9 --- /dev/null +++ b/res/en/data/sprites_og/Stage/MazeI.tsc @@ -0,0 +1 @@ +[Xq~~~[X~~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[X[Xq~~~[X~~~~~~~~~~~[X[Xq~~[X~~~nŽun|||[Xq~~[X~~~~~~~~~~~~~[Xq~~[Xq~~[X[Xq~~~[X~~~~~~~[X~~nnnúo~~y~~~[Xn¶nnno[X[X[X[Xq~~~[X~~~~~~~~~~~~oo|||||nnnǽnn¶[Xü|nn¶n[X~~~[X~~~~~~~~~~~~~[X[Xq~~[X~~~nǽnůn½nn¶n~~~~[Xy~[XN~~~~~~~~[X~~~~~~~~~~~~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~~~~~~~~[X~~~~[X~~~~~[X~~[X~~~~~~~~~[X[Xq~~[Xnnn|[X[Xq~~[X[X[Xq~~~[Xnnn½nǽ[Xżn|[Xnn¶|||[Xnn¶nunn|[Xnǽnnz[Xǽnijnn|||[X[Xq~~[X[Xq~~[Xnŷ±n¶nn¶[Xnnþn½nnþn½[XŶ|[Xn¶n·unnþ[X¶|[Xnnijnnijn[Xü·nnnn|[X[Xq~~[Xnnn|[X[Xnȳnnnnnn~~n{n~[X~~[X~.ؘ[X~ёјѨ[X[X \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/MazeM.tsc b/res/en/data/sprites_og/Stage/MazeM.tsc new file mode 100644 index 0000000..05becb1 --- /dev/null +++ b/res/en/data/sprites_og/Stage/MazeM.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``b`lq~`d``j``b`j```blvqy````lv|z`ghbj``iilu~t=:S``ia=:l}~qls}``b`lvqy```alu~t=:S``ib=:l}~qls}``b`lq~`d``j``b`j```blvqy```blv|z`ghbj``iilu~t=:S``ic=:l}~qls}``b`lvqy```clv|z`gh`j``iilu~t=:S``id=:l}~qls}``b`lvqy```dlv|z`gh`j``iilu~t=:=:=:=:S``ii=:ls}```gj``cej````=:ls}```hj``cej````=:ls}``bfj``caj`aaa=:lu~t=:=:S`a``=:lylvq````lq``ddj``idj``a`j``ad=:=:S`aa`=:l{ulv|z`ghcj`aablv|z`ghaj`aaa=:l``aalq~`aa`j````j```blvq```blq``dfj``ibj```cj```i=:S`aaa=:lv|[`gh`lv|]`gha=:l``aalq~`aa`j````j```blvq```blq``dfj`ae`j```cj``0i=:S`aab=:lyl}wyPWP^^^l~tlu~t=:=:S`c``=:S`c`a=:l{ul}~qls}``b`=:lq~`ca`j```aj````lvqy```d=:ls~`c`aj`aabj```blqy`a``=:lq~`ca`j````j````=:l}t```blt~`c`al}s=:lq~`d``j``b`j```blv|z`ghbj``iilu~t=:S`ca`=:l{ulv|[`gb`ls~`c``j`aaaj````lx}slqy``f`lq~`ca`j```aj````=:lqy`a``lvq```dlq``dbj`c`aj``bfj```e=:=:=:S`cc`=:lylv|z`ghbj`ccal}wPPP^l~tl``dcls|l}wP^l~tls|=:lv|[`ghb=:lqy``e`=:l``ga=:ls}```gj``cej````=:ls}```hj``cej````=:ls}``bfj``caj`aaa=:lqy``e`lu~t=:S`cca=:lyl}w^^^l~tlu~t=:=:S`d``=:=: \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/MazeO.tsc b/res/en/data/sprites_og/Stage/MazeO.tsc new file mode 100644 index 0000000..7cabed3 --- /dev/null +++ b/res/en/data/sprites_og/Stage/MazeO.tsc @@ -0,0 +1 @@ +VSlyyyVSyyy{yyyyVSlyyzVSyyy{yyyzVSlyy{VSyyy{yyy{VSlyy|VSyyy{yyy|VSlyy}VSyyy{yyy}VSVSVSVSVSlyzyyVSyyzzyzyyyyyyyyy{yyyyyyyyVSyy|yzyzVSyy|yy}yy}yyz~VSlyzyzVStyy}yy|yy}yy}yyz~VSVSlyzy~VSyyy}yy|yy}yyzyyz{VSVSly{yyVSi¼iuVSiwwwVSiiiVSiiiiwVSVSVSly|yyVSpii¼wVSuiiii¸iwtzyyyyy{yVSyy}y|y}VSyy{y|y|VSyyzy|y{VSyyyy|yztyyyyy~yVSuiuiiuipiwiuiuipVSipiiiii¸wpiiiiiwVSiiiiipVSiiiiwVSzyztyyziii†wyyyyVSly|yzVSiipiiwVSiiiiiVSiwVSly|y{VSvyyztyy{VSzyziiivwyyyyui¸iijVSiwVSiiiiiwVSly|y|VSiwVSiiiiiwVSly|y}VSiiipVSwVSpiiiiiVSiwVSiii¸uiiwVSVSly|zyVSyy}y|z|VSyy{y|z{VSyyzy|zzVSpiiwVSiiiiiiVSiuVSiiiîiiuVSiIiiwVSly|zzVSi¸iiiiVSi¸iiiuipVSi¸iiiiiVS¼wVSly|z{VSiwVSipiiiuVSi¸VSly|z|VSuii¸iiiVSiiiiiiiVSkikwVSVSly|{yVSyy{y|{{VSyyzy|{ztyyzVSyyzuijpiiiVSiwVSpiijiii¸VSiiuiVSiijyy{yi¸ipiiVSiiiwwwVSpiiiiVSi¸uiwwwiuiiwVSuiiwVSiiiiVSiwwwwwwiiiwVSiiuiipVSiiiVSwVSiipiiuVSipiiVS½iwwwVSly|{zVSyy{yiui®uiVSiipiiVSiiiiwwwVSly|{{VSyy{yiiiVS»wVSipiiiiuVSipiiVSiiiiwpiiiVSwVSiiiiVSiiiiVSiwpiii¸uVSiiiipVSuipiiiVS¸iwwwtyytyy|VSVSVSly}yyVSyy~yyyztyy~yy{{y}yyyy{zyyyyVSiiiwzyztyyztyyy}VSyyzyiiijyzyVSVS \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/MazeS.tsc b/res/en/data/sprites_og/Stage/MazeS.tsc new file mode 100644 index 0000000..990c0f2 --- /dev/null +++ b/res/en/data/sprites_og/Stage/MazeS.tsc @@ -0,0 +1 @@ +?FWXKFMW_::=AFPKS:::>FOXN-:;::FZ\SFPKY:::F^\K::>:D::CD:::?-:;:=FPVT:@B;D:;:?FS^T::;AD:;:>FZ\SFW]QVymuon8FXYNFOXN-:;:>FZ\SF]Y_::<;D::C:D::;?D:::C-:;:@FUOcF]Y_::;;FKXZ:;:@D::::D:::F^\K::>D:::?D:::C +-:;;:FPVT:A>:D:;;;FUOcF]Y_::;;FKXZ:;;:D::::D:::=D:?::D:::>D::;=-:;;;FUOcF]Y_::;;FKXZ:;;:D::::D:::=D::CD::;=-:;<:FUOcFPKY:::>F^\K::>:D::C>D::;AD;<::D::=BD::;@ \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/MiBox.tsc b/res/en/data/sprites_og/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/en/data/sprites_og/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Mimi.tsc b/res/en/data/sprites_og/Stage/Mimi.tsc new file mode 100644 index 0000000..de5e265 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Mimi.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|z`cdaj``iels}```ilvqy````lu~t=:S``ia=:l}~qlv|z`cdaj``ifls}```ilvqy```alu~t=:S``ib=:l}~qlv|z`cdaj``igls}```ilvqy```blu~t=:S``ic=:l}~qlv|z`cdaj``ihls}```ilvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```ilvqy```dlu~t=:=:S``ie=:ls}``bhlvqy````lu~t=:S``if=:ls}``bhlvqy```alu~t=:S``ig=:ls}``bhlvqy```blu~t=:S``ih=:ls}``bhlvqy```clu~t=:S``ii=:ls}``bhlvqy```dlu~t=:=:=:S`a``=:lylv|z`cbdj`a`b=:lyz```aj`a`a=:l}w|^l~tlu~t=:S`a`a=:l``bblwya``alv|[`cbdlv|[`dda=:l}wPmqWP{m^l~tlwy````ls|luu`a`b=:S`a`b=:l``aals~`a``j````j````lvq```dlq```aj``idj``agj```h=:=:=:S`a`c=:lylvq````lq``aej``i`j``cfj``ad=:S`a`d=:lv|z`cbgj`aab=:lv|z`cf`j`aaa=:l{ul}wlvqs```iyWPz\l~t=:P]PP^l~tls|PPPP=:}P\PP=:PqP^l~tls|\PPPyP\=:Pol~tls|\PP=:PPPP=:\l~t=:PyWPPP=:PPPPW=:P^l~tlu~t=:=:S`a`e=:l{ulv|z`cf`j`a`fl``aalq~`a`ej````j```bluu`a`f=:S`a`f=:l{ulvq```dlq``adj``idj```ej```i=:=:S`a`g=:lyl``aals~`a`gj````j````lvq```dlq``aij``idj```gj``a`=:=:S`a`h=:lylvq```blq``agj``ibj```bj``aa=:=:S`a`i=:lylvq```dlq``b`j``idj``a`j```i=:=:S`aa`=:lylvq````lq``abj``i`j``eej```i=:=:S`aaa=:l{ulv|[`cbglv|[`ddcl}wlvqs```ioQl~t=:WPPol~t=:\PQl~t=:yWPPPP{=:PQl~tls|=:l}t````=:lq~`aaaj```hj````lqy`b`h=:lq~`aaaj````j```blqy``a`=:l``aalq~`a`gj````j```blqy``c`=:lt~`aaa=:l``aalq~`a`gj````j````lu~t=:=:S`aab=:lylvq```blq``afj``ibj```bj``ab=:=:=:=:S`b``=:lylv|z`cbbj`b`alv|[`cbbl``bbls~`b``j``baj````=:l}wPP^l~tlwya``bly[```blu[```bls|=:ls}``a`wPPm}PmQlqy`af`l~tl}luu`b`a=:S`b`a=:lyl}wWPP^^^l~tls|lPPPPPP=:P\PPP=:PPP^PPyP^l~tlu~t=:=:S`c``=:S`c`a=:l{ulv|z`cbcj`c`elv|[`cb`lv|[`cbc=:l}w^^^^^l~tls|=:l}r````lqy``e`l}t````ls~`c`aj``faj```blqy```hls~`c`aj``faj```d=:l}wlvqs```goPWPPPol~t=:yPPPP=:P^^^l~tls|yWP{^l~t=:yWPP]P=:P^l~t=:~PPP=:PP\PP=:PPP^l~tls|\PPP^l~tls|WPPPP\=:^l~t=:WPPP=:PPP^l~tlu~t=:=:S`c`b=:l{ulv|[`cb`lv|[`cbalv~`c`bj``afl}~qlvqy```dls}````lqy`a``=:l}wlvqs```gxPPPQl~tls|lvqs```h~QPyPWQl~tls|lvqs```gqPPP=:Pol~t=:WPPQ=:WPPPPQl~tls|lvqs```fWPPP^l~t=:yWPPPQl~tls|lvqs```g^^^l~t=:PPtP\=:PPWP=:PP^^^l~t=:yPPWPP=:\PPPP=:PP^l~tls|lvqs```fr^^^Pr^^^l~tls|lvqs```gP\PQl~t=:lvqs````ls|=:l}``acj``bb=:lqy``gelx}sls~`c`ij`ae`j```blq~`c`ij``a`j```blq``c`=:l}woQl~tls|=:lqy``a`=:lq~`c``j```fj```b=:lq~`c`aj```fj````=:lqy`a``=:lq~`c``j```fj```b=:lqy``h`=:lt~`c``=:ls}```i=:lv}``afl}slt~`c`ilu~t=:=:=:S`c`e=:l{ul}wlvqs```grPP^^^l~t=:PPPP=:P^l~tlu~t=:S`c`f=:l{ul}wlvqs```gwQl~tls|Ql~t=:WPPP=:PQl~tlu~t=:S`c`g=:S`c`h=:l{ul}t```blvqy```bls}````lqy``b`=:l}wlvqs```gwPPPQl~tls|lvqs```h~Ql~tls|=:lq~`c`gj```fj```blqy`0f`=:lq~`c`fj```fj```bl``aflqy`a``lt~`c`glv|]`cgals}```ilu~t=:S`c`i=:=:=:S`caa=:l{ul}wZPZl~tls|Ql~tls|=:l}r````lq~`caaj```bj```dlqy``c`l}t````=:lv|z`aefj`cac=:lv|z`ab`j`cab=:lv|z`cf`j`cad=:l}wQPPP^^^l~tls|ol~t=:\P^l~tls|PPPqWP\Pol~t=:WPPP^l~tls|P\P^l~t=:PWPPP=:RPtR^^^l~t=:tPPPP^^^=:tPPPP=:ol~tlq~`caaj````j```blu~t=:S`cab=:l}w\PP^l~tls|PPPP^l~t=:PPWPPP=:P^l~tlq~`caaj````j```blu~t=:S`cac=:l{ul}wyPPPPP=:qWP^^^l~tls|qPPPPP=:ol~tlq~`caaj````j```blu~t=:S`cad=:l{ul}wol~t=:WPPol~tls|\PWPP^l~t=:~PPPPPP=:PP^^^l~tlq~`caaj````j```blu~t=:=:S`d``=:l{ulv|]`aeelv~`d``j``aflvqy```dl}~qls}````lqy`a``lq~`f``j``aaj```b=:l}wlvqs```c|PPPPQl~tlq~`f``j````j```bls|lq~`fa`j````j````lvqs```gxPPQl~tls|WuPPP=:PQl~tls|PPPP=:PPPPP=:PPP^l~tlq~`f``j``aaj```bls|lvqs```cP]PQl~tlq~`f``j````j```bls|lvqs```gyPPWPPP=:\PyPPyWP=:PPPQl~tls|ls}```i=:lv}``aflqy``e`lu~t=:=:=:S`da`=:S`daa=:S`db`=:l{ulx}sls}````=:ls~`da`j``dbj```b=:ls~`daaj``gdj````=:lq~`fa`j````j````lqy`a``l}wlvqs```gPW^^^ol~tls}```ilvqy```dls|lvqs```bWP^l~tls|PtPPP=:PPPP=:PPP^l~tls|lvqs```i]]PPP=:PPoQl~tls|lvqs```bPP^^^=:^^^PPP^l~tls|lvqs```iqPWPPP=:PPPol~tls|lvqs```bqPPPyPP\=:WPPP=:^l~tls|PPPP=:WPP^l~tls|lvqs```iy^^^l~tls|yPPP=:\P^^^l~tls|lvqs```bPPP^^^=:qPPP^^^l~tls|lvqs```gyWPPP=:PQl~tls|=:lv|]`aedlv|[`aeg=:lvq```dlq```aj`fb`j```ej```h=:=:=:S`e``=:l{ul}wlPPPPPPPPPPPPjPPv=:PPPP|jPPPPjPw=:PPPPPPPPPPPtjPqWPxl~t=:lu~t=:=:S`e`a=:l{ul}wl=:PPPPPPPPPPPPPPPvl~tlu~t=:S`e`b=:l{ul}wl=:PPPPPPPPPPPPPPPPPl~tlu~t=:S`e`c=:l{ul}wl=:PPPPPPPPPPPPP}Pw=:PPPPPPPPPPPPPtQP~Pul~tlu~t=:S`e`d=:l{ul}wl=:PPPPPPPPPPPPPPqWPxl~tlu~t=:S`e`e=:l{ul}wl=:PPPPPPPPPPPPPPPqPxl~tlu~t=:=:=:S`f``=:lv|z`bbdj`f`b=:lv|z`cbej`f`a=:l{ulv|[`cbel[```bjf``b=:l}wlvqs```a\PyWP^^^l~tls|PWP=:PP}\=:PPP^l~t=:xPWP\l~t=:PPPP=:P}PP=:PPPP\l~t=:PPP=:P^l~tls|^^^^^l~tls|yP^l~tls|PWPPP=:Pol~tls|}PWPP=:P=:w^l~t=:vPPPP=:^l~tlu~t=:=:=:S`f`a=:l{ul}wlvqs```avPPP=:PP^l~t=:PPPPw=:PPP=:qWP^l~tlu~t=:S`f`b=:l{ul}wlvqs```axPPP=:Pol~tlu~t=:=:S`fa`=:lv|z`bbdj`faa=:l{ul}wlvqs```gPPPPP=:PPPP=:P^l~tlu~t=:S`faa=:l{ul}wlvqs```gP^^^l~tlu~t=:=: \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Momo.tsc b/res/en/data/sprites_og/Stage/Momo.tsc new file mode 100644 index 0000000..bad33d1 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Momo.tsc @@ -0,0 +1 @@ +nknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknkЁցƁƁnkƁƁǏnkɍ́ԏ΁ρЏnkƈԁӏnkŁЁƁnkԁȁՁnkӈԁƏnkՁƁƁŁnkԍƁŁЁnkƁӁƏnkЁƁŁƁŁnkƁƁǁƁŏځԁōnkՁƁ́֏ՁՈԁӁnkӁƏՁ؁΁nkρȁՍnkƁՁ́ՁnkЁƁӈԁƏnkψՁƁƁnkƁԁՍɏnknknknknkՁŁՁnkԁӏnk؍ЁŁƁnkǁƏnknknkՁŁnk؁ԏnkӁבϏ́ŁnkԁЁɁnkՏnknknknknknkՁŁnk؁ԏnkӁדϏ́ŁnkԁЁɁnkՏnknknknknknkƁցځՁؠڠnkӁōϏnknknkɍŁӏnkӁӁŏƍՁԁnkӁ؏nknkՁƁ̞nkȍƁȏnkԁՈԁnkȍՏƁԁȁnkԁψՁnkЁ́ɁԏnkՁɁaՁ́ύnkցŁƁƁnḱЁΏƁցɁƁЁӠnknknkŁցЁ́nkρŁɏƈԁԁōnkЁՁƈԁnkӏnknknkЁƁƁՍnḱŁځnḱӏnkǁցŁՁŁnkƁǁƁnkځƁՁƍnḱՁƁnkЁ́ɁՏƁȁƁ́nkӞnknknkЁƁƁՍnḱŁځnḱӏnkƁԁnkρƁԁՁnkƁ̏ƁȁƁ́nkӞnknknkƁ̏ŁӁnkρӞΏԁӈnkԁƁρՏnkψՁЁnkɁԏnknknkƁ̏nkŁӁƁӞՈԁƏځǁƁnkƁԏnḱԁځ̏nkՍŁցЁnkρρŁɏƈԁρӁnkƁՃnkЁƁԁρԏՁƈԁЁƁnkƁՁŁρnkӁՏnkƁŁ΁ƁnkՁǁƁՍnkƁψՁƁρӏnknknkƁ̏ŁցŁɠnkŁӁƁӞԁԁՍ́ՏnkԁԁƁnkƈԁЁŁǏΏƁԁŁnkՁӁǁځnkƁځƏ͍́nk؏nknknknḱցځɏՈ́ƁƁnkƁ΁ōnkЁځψՁցnkӁρՁŠnknknknknkЁցՁЁՠnknkɁŏnknknknknknkցρӁȁяnknknknkՏnknk \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Oside.tsc b/res/en/data/sprites_og/Stage/Oside.tsc new file mode 100644 index 0000000..5572988 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Oside.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``belvqy````lu~t=:S``ia=:l}~qls}``belvqy```alu~t=:S``ib=:l}~qls}``belvqy```blu~t=:S``ic=:l}~qls}``belvqy```clu~t=:S``id=:l}~qls}``belvqy```dlu~t=:=:S`a``=:l{ulvq````lq``ebj``i`j``agj``a`=:=:S`ab`=:l{ul``aalq~`ab`j````j```blvq```dlq``eej``idj```ij```i=:l}wWP^^^l~tlu~t=:=:S`ac`=:l{ulyz``cbj`acal``aalq~`ac`j````j```blvq````lq``fij``i`j``aej```h=:S`aca=:l{uls}````l``aalq~`ac`j````j```b=:lwya`cbly]``cblv|[acg`l}wyWPQl~tls|=:lvq````lq``fij``i`j``aej```h=:=:S`ad`=:l{ulvq````l}t````lq``idj``i`j``adj```g=:=:S`b``=:lyl}wqPol~tlu~t=:=:S`d``=:l{ulv|z`if`j`d`al}wlvqs``a`yPWPP=:PPP\=:WPP^l~tlu~t=:S`d`a=:l{uls|lv~`da`j``aflqy``e`=:l}wlvqs``a`wPl}t````^l~tls|=:ls~`db`j`ae`j````lx}s=:lq~`d``j```cj````lqy``cb=:lq~`d``j````j```blqy``cb=:lq~`db`j``e`j````lqy``cb=:lq~`db`j````j```blqy``cb=:lt~`d``lt~0db`=:lq~`da`j``a`j```blqy`b``=:l}wlvqs``a`xPP^l~tls|lvqs````=:lq~`da`j``b`j```blqy`be`=:lq~`da`j``a`j```blqy`b``=:l}wqPPPPP=:PP^lqy`b``ls|rP\PPtP=:PPPP\P=:PPPPP^lqy`b``ls|PPPPP=:PPPPtW=:olqy`b``ls|lvq```buP\PPP=:PP^lqy`b``ls|\PPPP=:PP\PP=:PtWP\lqy`b``ls|PP{PP=:PPPPP^^^lqy`b``ls|ls}``bf=:lPPPPPPPPPPPPPPPP]PPuP]lqyiiii=:lu~t=:=:=:S`da`=:l{ul}ww^^^l~tlu~t=:S`db`=:=:=:S`f``=:l{ul}wPPPP=:^l~t=:PPPPPPP=:P^l~t=:yWPPyWPPP=:PPP^l~t=:PPPyPPP=:PP^^^l~tlu~t=:=: \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Ostep.tsc b/res/en/data/sprites_og/Stage/Ostep.tsc new file mode 100644 index 0000000..80e6ef0 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Ostep.tsc @@ -0,0 +1 @@ +0==F=IZ[NISNV====IR[Q0==F>IZ[NISNV===>IR[Q0==F?IZ[NISNV===?IR[Q0==F@IZ[NISNV===@IR[Q0==FAIZ[NISNV===AIR[Q0=>==IXRfI`\b==>>IN[]=>==G====G===?ISN\====Ia_N==EBG==FCG==>FG==?F0=>>=IXRfI`\b==>>IN[]=>>=G====G===?ISN\===?Ia_N==EDG==FBG===AG==>>0=?==0=?=>0=F== IQ[]=F==IXRfIZfQ===?IZ`T]yrnr-xvyy-z-znr;I[\Qaun-v-ur-|{y-n-Zvrpn{-or-srrq;;;I[\Q;;;aur-|{y-n-|-n|vq-nr}rvv|{-|s-uv-ntrq;I[\QIPY_Z-znr4-{nzr-v-Onyy|;I[\QIPY_Uv-zntvp-}|r-unr-t|{r-vyq9n{q-{|-ur-pn{{|-rr{-qvr;;;I[\QIN[]=?=>G==>=G====ISY8>C?=IR[Q \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Pens1.tsc b/res/en/data/sprites_og/Stage/Pens1.tsc new file mode 100644 index 0000000..8c7acfc --- /dev/null +++ b/res/en/data/sprites_og/Stage/Pens1.tsc @@ -0,0 +1 @@ +öʥùöʥùöʥùöʥùöʥùʥùʥťť̶ťι¸ťùαöʥťť̶ťι¸ťùǾĥǶǾĥǶǾʥťĥǶǾʥʥťĥǶαȼڕ㣣ĹDZǗەڕ䡕ݡᣣĹDZȼڕܕ紱ÿٕ蕺܂磱ĹȠùαȼڕ㣣ĹǂǸܕ䕼㣣Ĺùαȼǂٕ䕼㣱Ĺùαȼǂ٣ĹùαȼǂٕٕڣĹùαȼڕ㣣ĹDZǂٕڕܕֱĹùαȼ裣Ĺùαȼ磱ĹűĹùαȼڕࣱĹڜࣱĹڜٕڕڕڣĹڕڡڜڕܕࣱĹڕڡڣĹǾڡ졂ڕە裱ĹڣĹùαȼڕڣĹùαʥť̶ť̶ťť̶ȼݣĹDZڕĹı̶ťȼ⣱Ĺڕٕڂ裱ĹDZĹıť̶ťʥťȼ֖ĹťǶٕ畷疱ĹDZݖĹıť̶ťȼڕ顕㴖ĹDZᡕڕ裱Ĺıťť̶ť̶ťʥť̶ťȼĹDZִĹı̶ť̶ť̶ť̶ȼܣĹǶٕەڕڕڕڣĹڕٕڕۂڣĹە⡂ݡڕقڕ裱ĹǺܕ裣ĹĂʥťť̶ťι¸ťùαȼڕڂܕڣĹەڕ܂㣣Ĺùαȼ壱Ĺڡڕ٣Ĺùαȼ݂֕㣣Ĺ䖕閱Ĺùαη̶ιťȼڕĹڕڕڣĹݕ塱ĹڕٕڕڕٕڕٕܣĹıť̶ťȼ疱ĹǸڕڕڂݕڕ䴱Ĺıť̶ťȼʥĹǂ磱ĹDZĹDZڡ磣ĹڕڕٕڣĹڕقڕٕ裱ĹťǂĹDZ鴱ĹDZڕڕuٕ⡕֕ەڣĹڕڕقڣĹڕڕڕٕڕڕٕڣĹǂڕٕڴĹ㡕ڂڜٕڕ紱ĹDZᡱĹڕڂە裱Ĺەڕڂڕ⣣Ĺǽ硕ڕٕڕ裱Ĺܕڕڕڂ塱ĹڜڕڕٕڣĹǂڕܕ崱ĹDZĹڜڕە֕ݕףĹıťť̶ť̶ťȼ꣱Ĺǂʥ䕾ȕڴĹDZ飣ĹڕەڕقڂٕٱĹ䣱ĹDZ鴖ĹDZٕٕ顱ťĹ镾ڂ裱ĹڕڕەٕڣĹDZ磱ĹڕٕڕقڣĹDZڣĹıť̶ťť̶ȼڕڕقܕ٣Ĺڣڕ٣ĹȠùαȼݕڕقڕ֕ڕ磱Ĺٕڕٕقڕڕۂ⣱ĹùαȼڕڕەڣĹǾ٣Ĺڂ飱ĹùαȼڕٕڣĹùαȼەٕەڂ衕ڜڕڕڕ죱ĹǾ֕ܕĹùαȼڕڕݕقڕ٣Ĺܕ꣣Ĺùťαιť̶ťťť̶ťť̶ť̶ťȼĹıť̶ȼꡕڣĹǣڕقڕٕ裱Ĺǣڕٜڕ裱ĹڕڂڣĹǾٕڕقڕڂ㕾ٕڕڣĹıť̶ťɠɦȼڕ맣̶Ĺıɥťȼڕٕ飱ĹǾەڕڕ㡱Ĺڕٕڕ٣Ĺ硱ĹٕڕٕڕڕڕڣĹڕڕڂٕڡĹڕٕڕڕܕݕ裱Ĺǂܕ꣱ĹڕݕٕڣĹĂȠùαȼڕڕݕقڕ٣Ĺܕ꣣Ĺùαȼڂ٣ĹڕڕڂڣĹùαʥĥǶǾȼڂܕ紱ÿĂαť¸̶ť̶ĥǶǾȼ䕼㴱ÿĂαť¸̶ť̶ĥǶǾȼڂٕڴÿĂαť¸̶ť̶ĥǶǾȼڂݴÿĂαť¸̶ť̶ĥǶǾȼڂ㴱ÿĂαť¸̶ť̶ĥǶαǶ \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Pens2.tsc b/res/en/data/sprites_og/Stage/Pens2.tsc new file mode 100644 index 0000000..6a2043a --- /dev/null +++ b/res/en/data/sprites_og/Stage/Pens2.tsc @@ -0,0 +1 @@ +~~µɤ¸~~µɤ¸~~µɤ¸~~µɤ¸~~µɤ¸~~~~~~Ͱɤ~ǻƷ۔ߢ˵~ؔ⢰˵~ƹ۔ᢰ˵Ɓ~ǻբø~ٔٳø~øäƵ~~Ͱǻ٢ø~ٔ㢰ø㠔⳰ø~ٔٔ볰ø~ؔٔ碰ø~ܔ鳰øäƵ~~Ͱǻٔڔ碰ø~ؔ܁~Քآø~ہ~賰øư۔~Ֆ˵ưƷ٢~⮔tٔø~۔碰ø۔~攖▢øƁ~ǻࠔہ~颰ø~٢øäƵ~~ͰĤǻø~~۔٢øƁ~ɤĤ˵ɤĤø~ðĤ˵Ĥ~ǻٔߢø~ٔ۔~颢øưܳ볰ø~Քøư؁~ٔ⢰øư賕øưؔٛٔ۔Ɂ~ٕøÁ~Ĥ˵äǻ~ٔ㕰øưܔ㠔蕰øƵ~¸~¸~~~~~~~ \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Pixel.tsc b/res/en/data/sprites_og/Stage/Pixel.tsc new file mode 100644 index 0000000..fded528 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Pixel.tsc @@ -0,0 +1 @@ +QNgtt}tQNttuxttttQNgtt}uQNttuxtttuQNgtt}vQNttuxtttvQNgtt}wQNttuxtttwQNgtt}xQNttuxtttxQNgtt}yQNtttuQNQNgtuttQNtutt~tttt~tttvttuuQNtttxttx|~tt}x~tuyw~ttuzQNQNgtvttQNQNuxxu~tvtwQNuxxt~tvtvQNt|wy~tvtuQNddddrQNtxqt|qt|dddrQNQNgtvtuQNddddrQNdkddddQNQNgtvtvQNouxxyddddrdpddddQNddddrrrQNQNgtvtwQNddddrQNddddrQNQNgtvutQNQNgtvvtQNddddrrrQNgtvvuQNkddpdQNdrrruxxu~tvvwuxxy~tvvvQNgtvvvQNQNddddddttttouxxuqddQNdddQNrddddddQNdpdddQNdddqrdddddQNddddddQNdrQNrttutrttutrttutrttutrttutrttutrttutrttutttutddddQNetuztDddddddQNddpdddQNdddrttwtQNgtvvwQNdddQNdrrrQNQNgtvytQNQNuxxx~tvy{QNuxxw~tvyyQNuxxv~tvyxQNuxxu~tvywQNuxxt~tvyvQNt|wz~tvyuttu}QNgtvyuQNQNddddtttttttxttttttvtQNrrrrrQNtuttoutttQNtvutqt|wzouxxttttvQNtt{w~tt}y~ttuv~ttt}QNgtvyvQNdkdpdddQNdkddrQNgtvywQNddddddQNdttttQNouxxvtttutttttvtttttuQNtuytttvtQNrrrttuxttvyrrrrrtvzt~tttu~tttvttu}kdepdkddrrrttvydkdddQNdddrQNdddpQNdkdddQNdrrrddddQNdddkQNrQNttvtrrrtttttvzt~tttu~ttttQNttytQNdddrQNQNgtvyxQNdddddQNddrouxxwQNgtvyyQNQNddddddtvyzQNgtvyzQNtvzt~tvy}~ttttot|wzquxxtouxxxQNgtvy{QNdkddrQNQNgtvztQNQN \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Plant.tsc b/res/en/data/sprites_og/Stage/Plant.tsc new file mode 100644 index 0000000..3117832 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Plant.tsc @@ -0,0 +1 @@ +YVo|||YV|}||||}||||YVo||}YV|}||||}|||}YVo||~YV|}||||}|||~YVo||YV|}||||}|||YVo||YV|}||||}|||YVYVo||YV||~||||YVo||YV||~|||}YVo||YV||~|||~YVo||YV||~|||YVo||YV||~|||YVYVo|}||YV||||||}}|||||||~}YVYVYVo|}|YVll±||||l±zYVo|}|YVw}|||||~|wlzYVYVo|~||YVlllzYVllñlzYVllllíl±llzLlllllñYVlzlñxlxlllÿzlŻllllñxYVllŻlllYVxlllŻll±lmllñlsl±lYVllõlzYVYVYVo|~~|YV}|~||~~}lzYVo|~~}YVslıllllmYVYVo|||YVYVw|}|YV|||YVlllzzz||}|}||w|||YVlllz|}|YVYVYVo|||YV||~~|||||}YV}||lllm|}|w|||YVllllmYVYV \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Pole.tsc b/res/en/data/sprites_og/Stage/Pole.tsc new file mode 100644 index 0000000..d3da595 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Pole.tsc @@ -0,0 +1 @@ +CPPYP-*\mna\cmuPPPX\faiPPPP\end-*CPPYQ-*\mna\cmuPPPX\faiPPPQ\end-*CPPYR-*\mna\cmuPPPX\faiPPPR\end-*CPPYS-*\mna\cmuPPPX\faiPPPS\end-*CPPYT-*\mna\cmuPPPX\faiPPPT\end-*-*CPPYU-*\cmuPPPX\faiPPPQ\end-*-*CPQPP-*\pri\faoPPPP\traPPQRZPPYTZPPUSZPPSV-*-*-*-*CPRPP-*\key\fljQVTPZPRPQ\flKQVTP\souPPRR\cnpPRPPZPPRQZPPPP-*\msgo@@N\nod\gitPPPR\amKPPPRZPPPP\clr-*\cmuPPQPg@@]p@s]A\waiPQVP\nod\gitPPPP\clo\rmu-*\msg-*f@L@@NNN\faoPPPT\nod\traPPQXZPUPQZPPPRZPPPP-*-*CPRPQ-*\pri\msgeN\nod\end-*-*CPRQP-*-*-*CPSPP-*\key\msgJJ\nod\end-*-*CPSPQ-*\fljQVTTZPSPS-*\key\msgy@G@@@@i@L-*@_\nod-*s@@@@@-*i@@A\nod-*dL@@@@i@G@-*@@@@@-*i@NNN\nod\amjPPPRZPSPR\clri@G@@@A\nod-*j@@@@@@i-*G@@@@@-*@@@@@N\nod\clr-*aL@@@L@@@NNN\nod\end-*-*CPSPR-*\key\msg\cmuPPPP\mybPPPR-*heyAA\nod\clriG@that@@_A\nod\clr\gitPPPRw@@you@@@_A-*i@G@@@@A\nod\clrg@@A\nod\clr\cnpPRQPZPQUPZPPQR\waiPPQR\gitPPPP\hmc-*]p@s]@NNN\nod\clrpA\nod-*i@@G@@-* @@@N\nod\clr-*NNNNN\nod\clry@L\nod-*iG@@@@G-*@@@@-*N\nod-*t@@@@@G-*@@@@-*@@@N\nod-*t@@@@@@-*@@@@@-*@@@N\nod\clr-*\cmuPPPXhNNN\waiPPUP\clrw@i@@@@@@-*@@@@L-*@@@@@N\nod-*t@@@@@-*@@@@G-*NNN\nod\clr-*hNNN\nod\clri@@@@N\nod\clr-*y@@@@N\nod\cmuPPPP\faoPPPQ-*a@i@@L@@N\nod\clo-*\waiPQUP\faiPPPQ-*\fla\waiPPUP\tamPPPRZPPQSZPPPP\flKQVTT\flKPSPS\msg-*\cmuPPQP\msg\gitPPQS-*]p@s]@@@]s]A\smc\dnpPRQP\waiPQVP\nod\cmuPPPX\end-*-*CPSPS-*\key\msgi@@L@@@-*@@@@-*@@@@@N\nod\clri@@L@@L@-*@@@@@@-*@@N\nod-*f@@L@i@@@-*@@@@@N\nod-*t@@@@-*@i@@@@@-*@@@@@@N\nod\end-*-*CPSQP-*\key\msg\tur-*BoNB\nod\end-*-*-* \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Pool.tsc b/res/en/data/sprites_og/Stage/Pool.tsc new file mode 100644 index 0000000..c2347f1 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Pool.tsc @@ -0,0 +1 @@ +tqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtq̦ϓއٕtqێڇ̇̇ӇևtqˇׇՇَڇtqӇ̇̓ۦtq̇ˇׇ̇ۇtq·g֕tq̇ˇهˇׇtq̇Շٕ̇tq̇Վۇԇև̇tqϕtqՎۇއ̇̎tqȇȇۇ̇ڕtqtqtqtqtqtqtq·ڇՇ̇ەtqۇ̇هۤtqtqtqtqtqtqtqψtqtqtqtqtqtqtqtqtqtqtq \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Prefa1.tsc b/res/en/data/sprites_og/Stage/Prefa1.tsc new file mode 100644 index 0000000..a01d1b7 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Prefa1.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{xǪÞ{x{x{x{xǪ{x{x{x{x{xǪҎώӎ܎{x{xҎӎݎҎ⭪Ǽ܎Ԏӎҕ{xҎӎӎ{xҚ⚪Ҏӎnݎ{xڎ✪ᚎӎ{x܎ӎԎՎ{xڎӎӎ܎ݎ{x᎞Ҏڎ䞜ݎ{xӎҎݎ{x܎Ԏ՜ێӎ܎ӎ䠜{xҎӎՎ֜ݎӎ܎܎{xڎۜ{xů{xҎӜů{x{x{x \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Prefa2.tsc b/res/en/data/sprites_og/Stage/Prefa2.tsc new file mode 100644 index 0000000..fd0ddf2 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Prefa2.tsc @@ -0,0 +1 @@ +YVo|||YV||||||||YVo||}YV|||||||}YVo||~YV|||||||~YVo||YV|||||||YVo||YV|||||||YVYVo|}||YVslzzzYV|}|||||||||~||}}|||||~||||||YVYVo|}}|YV|||YVw}}Lw}w}|YV|||||||}|||}YVYVYVYVYVYVo|~||YVlŻslll±lxYVll±lŻllllzlŻlíll±l||||YVw}|w}}w}~|||||||}|}||YV||||}||}}||~YVYVo|~|YVYVlsllzzzYVYV \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Priso1.tsc b/res/en/data/sprites_og/Stage/Priso1.tsc new file mode 100644 index 0000000..eeda7f0 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Priso1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``bilvqy````lu~t=:S``ia=:l}~qls}``bilvqy```alu~t=:S``ib=:l}~qls}``bilvqy```blu~t=:S``ic=:l}~qls}``bilvqy```clu~t=:S``id=:l}~qls}``bilvqy```dlu~t=:=:S`a``=:l{ul``aalt~`a``lvq````lq0`efj``i`j``h`j```i=:S`aa`=:l{ul``aalt~`aa`lvq```alq``fbj``iaj```gj``gd=:=:S`b``=:lq~`b``j```bj```blu~t=:S`b`a=:lq~`b`aj```bj```blu~t=:S`b`b=:lq~`b`bj```bj```blu~t=:S`b`c=:lq~`b`cj```bj```blu~t=:=: \ No newline at end of file diff --git a/res/en/data/sprites_og/Stage/Priso2.tsc b/res/en/data/sprites_og/Stage/Priso2.tsc new file mode 100644 index 0000000..b14b583 --- /dev/null +++ b/res/en/data/sprites_og/Stage/Priso2.tsc @@ -0,0 +1 @@ +?IZ[NIPZb==?@ISNV===>IR[Q0==F?IZ[NIPZb==?@ISNV===?ISYW=E?FG==FEISYW=E??G==FDIR[Q0==F@IZ[NIPZb==?@ISNV===@IR[Q0==FAIZ[NIPZb==?@ISNV===AIR[Q0==FDIN[]=?B@G==?=G====IR[Q0==FEIP[]=@=CG=>>DG====IN[]=@=CG==@?G===?IR[Q0=>==IXRfISYW=E@FG=>=>I`\b==>>IN[]=>==G====G===?ISN\====Ia_N==ACG==F=G==>DG===F0=>=>IXRfIZ`TV-|{4-|}r{;;;I[\QIR[Q0=?==IXRfISYW=E@?G=?=AISYW=E?AG=?=@ISYW=E?@G=?=?ISYW=E?>G=?=>IZ`T\]R[-`UbaaR_LIf[W====IPY_\]R[V[T-`UbaaR_I[\QIPY\IZfQ====IdNV==@=IN[]=?B=G==>=G===>IdNV==>=IN[]=@==G===>G===?IdNV==??IN[]=?B>G==>=G===>IN[]=@==G===@G===?IdNV==@?IN[]=?B?G==>=G===>IdNV==@?IN[]=?B@G==>=G===>IdNV==@?IN[]=?BAG==>=G===>IQ[]=?B=IdNV==@?IQ[]=?B>IdNV==@?IQ[]=?B?IN[]=?B@G===>G====IdNV==@?IQ[]=@==IP[]=@=>G=>>DG====IN[]=@=>G==?>G===?ISY:=E?=ISY8=E?>ISY8=E??IZ`TNO[\_ZNYVaf-QRaRPaRQ-V[`UbaaR_-[\;-AI[\QIR[Q0=?=>IXRfIZ`TNO[\_ZNYVaf-QRaRPaRQ-V[`UbaaR_-[\;-AI[\QIR[Q0=?=?IXRfIZ`TY\dR_-YVSaLIf[W====IPY_ISY8=E?AY\dR_V[T-YVSaI[\QIPY\IS\[=?BDG==>CIdNV==B=IN[]=?BDG==>=G===@IdNV=>F?IN[]=?BDG====G====IdNV==B=IS\Z==>CIZ`TYVSa-Y\dR_RQI[\QIR[Q0=?=@IXRfIZ`TYVSa-V`-Y\dR_RQI[\QIR[Q0=?=AIXRfIZ`TR__\_I[\QIR[Q0=?>=IXRfISYW=E@=G=?>?ISYW=E?BG=?>>IZ`T\]R[-`UbaaR_LIf[W====IPY_ISY8=E?B\]R[V[T-`UbaaR_I[\QIPY\IdNV==A=IN[]=?BCG==>=G===>IdNV=>?EIQ[]=?BCIZ`T`UbaaR_-\]R[RQI[\QIR[Q0=?>>IXRfIZ`T`UbaaR_-\]R[RQI[\QIR[Q0=?>?IXRfIZ`TR__\_I[\QIR[Q0=?A=I]_VISYW=E?EG=?A>IZ`T`|zruv{t-v-p|vyrq-n|{qur-o|xr{-|o|4-nz;I[\QIPY_dvyy-|-nxr-vLIf[W====IPY_ITVa>=@=IQ[]=?A=IVa8==@=ISY8=E@FIPY_IPZb==>=T|-ur-Ja|-_|}rJ;IdNV=>C=I[\QI_ZbIR[Q0=?A>I]_VIZ`T;;;LI[\QIR[Q0=?A?I]_VIZ`TV4-n{tyrq-};f|-pn{4-tr-v-y||r;;;I[\QIR[Q0=?B=0=?B>0=?B?0=?B@0=?BA0=?BBI]_VIZ`TN-o|xr{-|o|;I[\QV4-rrry-qnzntrq;I[\QIR[Q0=?BC0=?BD0=?BE0=@==IXRfIZ`TISNP==>Fdrvq-}ynpr9-ruLI[\QV-|{qr-vs-uv-n|zr-|-|s-onr;I[\QIR[Q0=@=>IXRfISYW=E?@G=@=?IZ`TISNP==?Bauv-ur4-|{yznqr-v-unysn-|}r{;I[\QIPY_Y||x-yvxr-v4-pntu|{-|zruv{t;;;I[\QIR[Q0=@=?IXRfIZ`TISNP==>FW-ur-nsrur;I[\QNyy-uv-rpv-znxrzr-|{qr-w-un4-q|{urr;I[\QQ|{4-|-uv{xLI[\QIR[Q0=@=AI]_VIZ`TV;;;I[\QIR[Q0=@=BI]_VIZ`TX{|pxrq-|LI[\QIR[Q0=@=CI]_VIZ`Taurr-v-{|-r}y;;;I[\QIVaW==@=G=@=DIR[Q0=@=DI]_VIZ`T`ur-v{4-z|v{t9-o-v-y||xyvxr-ur4-vyy-nyvr;I[\QIPY_ITVa>=@=dvyy-|-r-ur-Ja|-_|}rJLIf[W====IPY\ITVa====IP[]=@=CG=?BFG====ISY8=E@BISY8=E@CISY:=E?FIZ`Tavrq-ur-|}r-|-ur-o|q;I[\QIR[Q0=@A=IXRfIQ[]=@A=IdNV==>=I`\b==??IdNV==>=IZ`Tf|-urn-|zruv{t-tvr;I[\QIPY\IdNV==B=IN[]=?B@G==>=G===>IdNV==AEIQ[]=?B@IN[]=@=>G===@G===?IdNV=>?EIN[]=@=>G===>G===?ISY:=E??ISY8=E?@ISY8=E?CIR[Q0=@B=ISYW=E?BG=@B>IR[Q0=@B>IQ[]=@B=IQ[]=@=>IQ[]=@=?ISY:=E??ISY:=E?CISY8=E?DIP[]=AB=G=>>DG===?IR[Q0=@C=ISYW=E@=G=@C>IR[Q0=@C>IXRfIZfQ===?IQ[]=@C=IN[]=?BEG==>=G===@IdNV=>==IN[]=?BEG==?=G====IPZb==?@IR[Q0=A==0=A=>0=A=?0=A>=0=AB=IXRfI`XW===CG=AB>I`X8===CIRcR=AB?0=AB> I`NaIRcR=AB?0=AB?IXRfISYW=E@DG=@=AISYW=E?EG=@=BIZfO===?IdNV==@=IZfQ===?IZ`TISNP==>FY||x;I[\QIPY_auv-v-n-|yqvr-s|zur-snpr;I[\QV4-nyy-on{trq-};I[\QIPY\ISNP====IS\[=?BAG==>CIN[]=AB=G===>G====IdNV==A=IZ`TISNP==?Baurr4-n-|{-z|r-yvxrv9-||;I[\Qdun-|{-rnu-p|yq4r;;;I[\QIPY_[|-n-Zvzvtn;[|9-|-q|-uv-zpuqnzntr;;;I[\QIPY\IPZb====IN[]=?BBG==?=G====IdNV==?=IS\Z==>CIN[]=AB=G===>G===?IZ`TISNP==?B...IdNV==B=IPY\ISNP====IdNV==@=IN[]=AB=G===>G===?IZ`TISNP==>FV4-vyy-nyvr..I[\QIPY_ISNP==?A7Oooo7I[\QIPY_aRNZ-F-N[[VUVYNaRQI[\QSNVYRQ-a\-QR`a_\f-aN_TRaI[\QIPY_Pb__R[a-S\_PR`V[`bSSVPVR[aI[\QIPY__Ra_RNaI[\Q_Ra_RNa..I[\QIPY\IS\[=?BEG==>CISY8=E?EISY:=E?AIZ[]=?BDG===DG==>EG====IPZ]==A=G==>BG==@=IPZ]==A=G==>CG==@=IP[]=?BEG=>EAG====IN[]=?BEG==>=G===@IdNV=>?EIN[]=?BEG==?=G====IS\Z==>CIdNV==?=IN[]=?BBG==>=G====IN[]=AB=G==@=G===?IdNV==A=IQ[]=B==IO\N=?==IPZb==??IO`Y====IP[]=AB=G=>E=G===?IN[]=AB=G==A=G===?IN[]=A>=G==?=G====IR[Q0=B==IQ[]=B==IO\N=?==IPZb==??IO`Y====IR[Q0>===IXRfIO\N=B==IZfQ=A=>ISY:=E?EIN[]=A>=G==>=G====IP[]=AB=G=>>DG===AIdNV==>==IZ`TISNP==>Fdr-qvq-vL.IdNV=>==I[\QIPY\ISNP====IS\[=A=>G==>CIP[]=A==G==CDG===?IdNV==B=IZ`TISNP==?CUz}u.I[\QIPY_]yyrq-v-|ss9-V-rr.I[\QIPY_ISNP==>Ff|.I[\QIPY_f|4r-un-vpu-u||rq-zr-q|{-urr.I[\QIPY_au|r-puvyqr{-unq-orror-nsr.I[\QIPY_ISNP==>CUn.-Or-vyr{.I[\QIPY_f|4r-{|-z|ur.I[\QQ|-|-rr{-x{|-unuv-vL.I[\QIPY_ISNP==>FdunLI[\QIPY_ISNP==>CUz}u;-auv-v-un-Vunr-no|-|o|;I[\QIPY_auv-v-ur-urn-|s-urvyn{q.I[\QIPY_Vs-|-|}-v9-ur-vyn{qvyy-snyy-|-ur-rnu.I[\QIPY_V-un-|-tn{q-}yn{LI[\QIPY_a|-nxr-ur-vyn{q-q|{vu-|-v{-n-oynr-|sty|L.I[\QIPY_S||y..I[\QIPY\ISNP====IP[]=A=?G=>@FG====IN[]=A=?G==A=G====IdNV=>==IZ`TISNP==?>Ur.I[\QIPY_dun-nr-|-q|v{tLOv{t-ur-p|r-|-uryno|n|-n-|{pr.I[\QIPY_aurr4-vyy-vzr.I[\QIPY\ISNP====IN[]=A==G==>@G===?IdNV==B=IP[]=A==G==E?G===?IdNV==?=IN[]=A==G==?BG===?ISZbIZ`TU||||||\\\\\\\\U..IdNV==B=I[\QIPY\IO\N=C==IdNV==@=IN[]=A==G==?=G===?IN[]=A=?G==@=G====IN[]=A>=G==@=G====IN[]=AB=G==?=G===?IQ[N=>E>IQ[N=>E?IPZ]==A=G==>BG==ADIPZ]==A=G==>CG==ADIdNV=>==IPZb====IS\Z==>CISY8A===ISY8=E@?ISY8=@A>ISY8=DE@ISY8=E@DIR[Q0>>==IXRfISY:A===ISN\===AIdNV==B=IZ`Tf|-r{r-qvz9-n{q-ur-|yqt|-qnx;;;I[\QIPY\IQ[]=AB=ISY8=E@=ISY:=E?BISY8=E?FISY:=E?DISY8=E==ISY8=E=>ISY8=@D?ISY8=A>>ISY8=@A=ISY8=>BFISY8=E@EISY:>CA?ISY8>CA@ISY:=E@FIQ[]=?A=IVaW==@=G>>=>IRcR>>>=0>>=>IdNV=>B=IXRfIZ`?Qvq-|-x{|-un-ur-vpu:|zn{Wr{xn-|{pr-unq-n-o|urLI[\QUv-{nzr-n-Onyy|;I[\QYvxr-uv-vr9-ur-vryqrq}|r-sn-or|{q-u|r-|sz|ny;;;I[\QIPY\IRcR>>>=0>>>=IP[]=@=CG=>>DG===?IN[]=@=CG==@?G===?IN[]=?BEG==>=G===>IdNV==FCIN[]=?BEG===>G====IdNV==B=IZ\c==BBG==>EIQ[N=>E@IVa8==?>IR^8==>CIZ`T;;;;;;LI[\QIPY_;;;f|-pn{-ornur;I[\QISNV===AIdNV==B=IR[Q0>?==IXRfIN[]>?==G==?=G===?ISYW=E?FG>?=>IRcR>?=?0>?=>IP[]=@=CG=>>DG====IN[]=@=CG==@?G===?IRcR>?=?0>?=?IS\[>?==G==>CISNV===>IdNV=>==ISN\===>Ia_N==BCG>?==G==CFG==DC \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Ballo1.pxe b/res/en/data/sprites_up/Stage/Ballo1.pxe new file mode 100644 index 0000000..4cf30f9 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Ballo1.pxe differ diff --git a/res/en/data/sprites_up/Stage/Ballo1.pxm b/res/en/data/sprites_up/Stage/Ballo1.pxm new file mode 100644 index 0000000..50cf723 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Ballo1.pxm differ diff --git a/res/en/data/sprites_up/Stage/Ballo1.tsc b/res/en/data/sprites_up/Stage/Ballo1.tsc new file mode 100644 index 0000000..72aac38 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Ballo1.tsc @@ -0,0 +1 @@ +96O\\e\96hyzmhoy\\\\hrmu\\\\hqzp96O\\e]96hyzmhoy\\\\hrmu\\\]hqzp96O\\e^96hyzmhoy\\\\hrmu\\\^hqzp96O\\e_96hyzmhoy\\\\hrmu\\\_hqzp96O\\e`96hyzmhoy\\\\hrmu\\\`hqzp9696O\\ea96hyzmhyp\\\^h|~u96hoy\\_ehrmu\\\^hwq96hmz|\]\\f\\\\f\\\\hmhqzp9696hoy|\\\]f\\\cf\\]dh{\\]^9696O\`\\96O\`\]96O\`\^9696969696O\a\\96hpz|\a\\hyp\\\^96hwqhysZhz{phox~96hrmo\\^euLLnZhz{phox~mLLLX96LLL96LXhz{phox~uLLLL96LZZZhz{phox~LLLL96LLSL96LLLZhz{phox~mLuLLXL96LLLLXhz{phox~LLLLL96XLLXL96LZZZhz{phox~LLL96LLLZhz{phox~uLLLL96,LLuLL96LLZZZhz{phox~xZZZhz{phox~vLLLX96LLLLL96LLLZhz{phox~xXLLLuLZZZhz{phox~LLLL96LLL96SLZZZhz{phox~zXLLMhz{p96{LuYYhz{pLL{MMhz{phox{96hoy\\\`96hmz|\`\^f\]\\f\e\\hr{z\`\^f\\]b96hnx\e\\hmz|\e\\f\\]\f\\\\hqzp9696969696O\e\\96hmz|\e\\f]\\\f\\\a96hr{z\e\\f\\]b96hoz|\`\\f\__ef\\\^96hoz|\`\]f\__ef\\\\96hoy\\\\hmu\_\\96hr{y\\]bhmu\\a\96hn{m\]\\hmu\^\\96hmz|\`\^f\]\\f\\\\96hr{z\`\^f\\]b96hn{m\^\\96hoy\\\chnx\\\\96hqzp969696O]\\\96hrxv]b\\f]\\]96hrxW]b\\96hoy\\\\hn{m\^^\hmu\^\\96hoy\\_^hn{m\_\\hmu\\a\96hn{m\_]]hnx\\\\hqzp9696O]\\]96hwqhr{n\\\\f\\]b96hn{m]\\\hmu\^\\96hoh~m\\e]f\]]\f\\\\f\\\\9696 \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Ballo2.pxe b/res/en/data/sprites_up/Stage/Ballo2.pxe new file mode 100644 index 0000000..6938d23 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Ballo2.pxe differ diff --git a/res/en/data/sprites_up/Stage/Ballo2.pxm b/res/en/data/sprites_up/Stage/Ballo2.pxm new file mode 100644 index 0000000..178e955 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Ballo2.pxm differ diff --git a/res/en/data/sprites_up/Stage/Ballo2.tsc b/res/en/data/sprites_up/Stage/Ballo2.tsc new file mode 100644 index 0000000..8e0a888 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Ballo2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMsssssssvPMfss|wPMssssssswPMPMfswssPMfswstPMfswsuPMfswtsPMfswttPMfswtuPMPMPMPMfsxssPMsstysssussssssxsssstPMstxsPMssuxcqqqsst|cjcPMdcccPMcccPMccssuxqqqqqoccoccPMccccPMcqssssPMuccccqqqssxsPMssuxssssPMstssucccccqqqccqqqqqPMswts}ssts}ssssswtt}ssts}sssussxscccccccccqqqPMstssdssxsssssPMssvwstssPMswss}ssss}ssssssusPMswst}ssss}sssuss{sPMssuxcddCssssPMstssPMswss}ssss}sssussusPMswst}sszs}sssussvuPMswst}ssss}ssssssusPMucccccqqqssxsPMccccccqqqssxsPMcccccccqqqqqssxsPMssuxjcccdssxsPMssssvdPMswsu}sss|}ssssstxsPMsssxccdPMcccqPMsst|ccccdsssxccddssssPMPMswst}ssus}sssssstsPMswss}ss{s}sssusssuPMsssxjcdssssPMswsu}sstyPMswsu}sstu}sssusssuPMswsu}stss}sssustssPMPMddstssssxsssstPMssxsssssPMssuxccccPMssuvjccqqqPMsszt}stus}ssss}ssssPMPMPMPM \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Barr.pxa b/res/en/data/sprites_up/Stage/Barr.pxa new file mode 100644 index 0000000..a05c866 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Barr.pxa differ diff --git a/res/en/data/sprites_up/Stage/Barr.pxe b/res/en/data/sprites_up/Stage/Barr.pxe new file mode 100644 index 0000000..196bb42 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Barr.pxe differ diff --git a/res/en/data/sprites_up/Stage/Barr.pxm b/res/en/data/sprites_up/Stage/Barr.pxm new file mode 100644 index 0000000..db181fb Binary files /dev/null and b/res/en/data/sprites_up/Stage/Barr.pxm differ diff --git a/res/en/data/sprites_up/Stage/Barr.tsc b/res/en/data/sprites_up/Stage/Barr.tsc new file mode 100644 index 0000000..e47a9a3 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Barr.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:=:=:=:S`a``=:lv|z`cfaj`a`c=:lv|z`cfbj`a`a=:lv|z`cf`j`a`b=:l{ul``aalq~`a``j````j```b=:lvq```dlq``aaj``idj``dbj``eb=:S`a`a=:lyl}wyPWPQl~tlu~t=:S`a`b=:l{ulvq```dlq``aaj``idj``dbj``eb=:S`a`c=:lyl}wPWPQl~tlu~t=:=:S`ae`=:S`aea=:S`aeb=:S`aec=:S`aed=:=:S`bi`=:lv|z`cg`j`bialu~t=:S`bia=:lv|z`cf`j````lyl}wlvqs```h\PQQl~tlt~`bi`ls~a```j``fcj```blu~t=:=:S`d``=:l{ulv|]`cfalv|]`cfb=:l}sls~`d``j``abj````lq~`d``j``b`j```dlqy`ad`=:lyl}wlvqs```ezPPQl~tlvqs````l{uls|=:lqy`a``ls}``ae=:l}w=:vPPrQlqy`ad`l~t=:l``dels~`ae`j```aj````lqy```d=:l``dels~`aeaj```aj````lqy```d=:l``dels~`aebj```aj````lqy```d=:l``dels~`aecj```aj````lqy```d=:l``dels~`aedj```aj````=:ls}```hlu~t=:=:S`e``=:=:Sa```=:l{ulv|[`cf`lv|[`cfalv|[`dd`lv|]`cbfl}wuQl~tls|P\PPQQl~tls|^^^^^l~txol~tl}r```blqy``c`l}t```bls~a```j``f`j```dls|lvqs```fW^^^WP=:PPtol~tls|QPyWP^l~t=:PPP^=:PtWPP=:P^l~t=:PPPP=:PPP\l~t=:PP=:^^^l~tls||PP^=:xPPP^l~tls|Ql~t=:PQlwya``dl~tls|PPPPol~t=:PPPPQl~tls|^^^^^l~tls|^^^PyPWP=:P^l~t=:lwy````{PPPP=:PPPPP=:PPyPP^^^l~t=:PPP^l~tls|=:lvqs```0ls}````=:lq``c`l``bf=:lq~a```j```hj````=:lq~`a``j```aj````=:lqy``a`=:l}t````=:ls~a```j``f`j````=:lqy`a``=:lq``c`l``bf=:lq~a```j```hj````=:lq~`a``j```aj````=:lqy``g`=:lq``c`l``bf=:lq~a```j```hj````=:ls~`d``j``aij```b=:ls~`a``j``ahj```b=:ls}```dj```hj``h`=:ls}```ej```hj``ha=:ls}```fj```hj``hb=:ls}```dj```ij``if=:ls}```ej```ij``ig=:ls}```fj```ij``ih=:=:=:l}wxQlqy``e`ls~`d``j``abj```blq~`d``j``c`j```bls|l{uls}``aalvqs``adPPQl~tls|lvqs```ePWP\PPQl~t=:yWPPPPP=:Ql~tlvqs````ls|yPP^l~t=:ls~`e``j``fgj```blqy`a``lq~`e``j``acj```blqy``e`lq~a```j```hj````l}wlvqs``aeP\PPyP=:PPPP^l~tls|lvqs```e}Ql~tls|yPPPQl~tls|lvqs```h]]PWP=:Pt\PWPQl~tls|lvqs``ae^^^^^l~tls|lvqs``afPWP\Po=:PtPP=:P^l~t=:sP\P^l~tls|lvqs```f^^^ol~tls|=:yWPP^l~tlvqs````ls|=:lq~`e``j``aej```blqy`aa`=:lyl}wlvqs```huQl~tlvqs``aels|r^l~t=:yPPPPP^l~tls|=:lq~`e``j``b`j```blvqs````ls|=:l{ulqy``e`l}wlvqs```h~\P\PWPP=:]]Ql~tlvqs````ls|=:lqy``e`=:lvqs```el}w~Pqwqy~Ql~t=:yPPPPPQl~t=:qPPyPP=:vyQl~tls|^^^^^l~tls|PWPPol~t=:PPPP=:Pol~za``alq~`d``j``c`j```bls|=:lvqs``adyPPQl~tls|=:lv|[`cfals}```dls~`d``j``fhj```blr|`d``lu~t=:=:Sa``a=:l{ulv|]`cfblv|]`cfals}```hl}wlvqs```ex^l~t=:qP\PPP^l~tls|lq~`d``j``a`j```blu~t=:=: \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Blcny1.pxe b/res/en/data/sprites_up/Stage/Blcny1.pxe new file mode 100644 index 0000000..b3bcec5 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Blcny1.pxe differ diff --git a/res/en/data/sprites_up/Stage/Blcny1.pxm b/res/en/data/sprites_up/Stage/Blcny1.pxm new file mode 100644 index 0000000..93bb4dc Binary files /dev/null and b/res/en/data/sprites_up/Stage/Blcny1.pxm differ diff --git a/res/en/data/sprites_up/Stage/Blcny1.tsc b/res/en/data/sprites_up/Stage/Blcny1.tsc new file mode 100644 index 0000000..3f41969 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Blcny1.tsc @@ -0,0 +1 @@ +FSS\S0-_nh|_ioPTT\S_ioPTT\T_ioNTT\U_pqd_fpxSSVS_idlSSSS_hqg0-FSS\T0-_nh|_ioNTT\S_ioPTT\T_ioPTT\U_pqd_fpxSSVS_idlSSST_hqg0-FSS\U0-_nh|_pqd_fpxSSVS_idlSSSU_hqg0-FSS\V0-_nh|_pqd_fpxSSVS_idlSSSV_hqg0-FSS\W0-_nh|_ioPTT\S_ioNTT\T_ioPTT\U_pqd_fpxSSVS_idlSSSW_hqg0-0-FSS\X0-_nh|_idlSSSW_hqg0-0-0-FSTSS0-_nh|_vrxSSTT_dqsSTSS]SSSS]SSSU_idrSSSV0-_lwmSSUV]STST_wudSSYV]SS\V]SSS\]SSSW0-0-FSTST0-_nh|_wudSSYZ]SS\V]SSS\]SSSW0-0-0-0-FSTTS0-_sul_idrSSSU_wudSSYW]SS\U]SSST]SSTT0-0-FSTUS0-_nh|_dqsSTUS]SSSS]SSSU_vrxSSTT_idrSSSW_wudSSYY]SS\W]SSTS]SSS[0-0-#STVS0-_sul_pvjwCCCC0-vCCCCCCQQQ_qrg_hqg0-0-FST\\0-_sul_pvjqCQ_qrg_hqg0-_idrSSSWhQ_qrg_for_fpxSSVV_fuh_zdl\\\\_hqg0-0-FSUSS0-_nh|_p|gSSSS_gqsSUSS_zdv_pvjdCCCJ0-CCD_qrg_hqg0-0-FSUST0-_sul_pvj_wxu0-CCCCCCCCCCCCwkdwJvCdooOCironvD_qrg_hqg0-0-FSUTS0-_sul_iomTT\T]SUTT_iomTT\U]SUTU0-_sul_idrSSSW_p|gSSSU_zdlSSXS_wudSSYU]SS\X]SSSZ]SSZW0-FSUTT0-_sul_idrSSSW_p|gSSSU_zdlSSXS_wudSSYU]SS\X]SSZ\]SSZV0-FSUTU0-_sul_idrSSSW_p|gSSSS_zdlSSXS_wudSSYU]SS\X]STTZ]SSYU0-0- \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Blcny2.pxe b/res/en/data/sprites_up/Stage/Blcny2.pxe new file mode 100644 index 0000000..394d1c6 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Blcny2.pxe differ diff --git a/res/en/data/sprites_up/Stage/Blcny2.pxm b/res/en/data/sprites_up/Stage/Blcny2.pxm new file mode 100644 index 0000000..f229389 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Blcny2.pxm differ diff --git a/res/en/data/sprites_up/Stage/Blcny2.tsc b/res/en/data/sprites_up/Stage/Blcny2.tsc new file mode 100644 index 0000000..0c9ee66 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Blcny2.tsc @@ -0,0 +1 @@ +_llulIFxximmulximmumxgmmunxllmtx}llllxIF_llumIFxxgmmulximmumximmunxllmtx}lllmxIF_llunIFxxllmtx}lllnxIF_lluoIFxxllmtx}llloxIF_llupIFxximmulxgmmumximmunxllmtx}lllpxIF_lluqIFxx}lntlvllmlvllllxlntlvllmrIFx}llqlx}lllpxIFIF_lmllIFxxllmmx}lmllvllllvlllnx}llloIFxllnovlmlmx}llrovlluovllluvlllpIFIF_lmlmIFxx}llrsvlluovllluvlllpIFIFIFIF_lmmlIFxx}lllnx}llrpvllunvlllmvllmmIFIFIFIF_lmnlIFxxmouovlmnmx\c\]xxIF_lmnmIFxx}lllpxllmrx}llsuvllupvllmlvllltIFIFIF_lmuuIFxxlloox\\\]IF\\\\IF\jjjxxxIFIF_lnllIFxxllllxlnllx}\\\cIF\\]xxIFIF_lnlmIFxxxIF}c\}h\]xxIFIF_lnmlIFxxmmumvlnmmxmmunvlnmnIFxx}lllpxlllnx}llqlx}llslvlluqvlllsvllspIF_lnmmIFxx}lllpxlllnx}llqlx}llslvlluqvllsuvllsoIF_lnmnIFxx}lllpxllllx}llqlx}llslvlluqvlmmsvllrnIFIF_lntlIFIF_lnulIF_lnumIF_lnunIF_lnuoIF_lnupIF_lnuuIFIFIFIFIF_lollIFxxxlollvllmrIFx}lltlx}lnuuvllnlvlllnIFxx}llnlIFxc\]xxx}lllmx}llqlIFxlnumvlnmsvllllx}lnumvllplvllllx}llqlIFx}lnulvllllvllllx}llnlIFxx}llntc\\\]IFc\\\\IF\jxxjjj\\\IFc\\\IF\\\jjjxx<}llllIFx}lnumvllqlvllllx}llmrIFxx}llnn\\\cIF\jjjxxIFx}llllx}llmrIFx}llmlIFx}lnulvlllovllllIFx}lnumvllmlvllllIFxlnunvlnsuvllllIFxlnuovlnsuvllllIFxlnupvlnsuvlllnx}lmllIFx}lnumvllpnvllllIFx}lnulvllllvllllIFxx}llnt}\jjj{xxx}llnn\jjj{IF\c\]xxIFx}llloxllmrxxlllnx}llrtvlrllvllnpvllmoIFxIFIF_lolqIF_lolrIF_lolsIF_lomlIFxxllllxllmtximmulximmumxgmmunx}llllIFx}lolqvllmmvlllnIFx}lntlvllmlvllllIFxlolqvllmrxox}lllo\]xIF\\\\hIF\c\\IF]]xxlntlvllmrxIFx}lolqvllolvllllx}llrlIFxlolqximoumxIF_lonlinIFIF_loolIFxxloolxllllx}lonlvllllvlllnIFx}x}llqlIFxlonlvllmrxx}lllmc\\\IFj\c\\\IF\jxIFc\\\\IF\\\\IF\]xx\{xIF\\\\\]xxxIFx}lonlvllllvllllx}llqlIFx}lonlvllolvllllx}llmnIFx}lonlvllplvllllx}llqlIFximounxllmrxIFIF_lpllIFxxxlpllx}llolxx}llllIFxlqllvlnqpvllllx}lllmIFx}lqllvllnlvlllnx}lllmIFx}lqllvllolvlllnx}lllmIFxlqllvllmrxllnlvllolIFxlolsxlntlIFx}lmllx}lllpIFxx}llnnIF\c\jjjxxx}llntc\\jIFc\\\\]xxx}lllpIFxlloqx}llpuvmnllvllutvlllrIFIF_lqllIFIF \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Cave.pxa b/res/en/data/sprites_up/Stage/Cave.pxa new file mode 100644 index 0000000..c30cbaa Binary files /dev/null and b/res/en/data/sprites_up/Stage/Cave.pxa differ diff --git a/res/en/data/sprites_up/Stage/Cave.pxe b/res/en/data/sprites_up/Stage/Cave.pxe new file mode 100644 index 0000000..d117d5d Binary files /dev/null and b/res/en/data/sprites_up/Stage/Cave.pxe differ diff --git a/res/en/data/sprites_up/Stage/Cave.pxm b/res/en/data/sprites_up/Stage/Cave.pxm new file mode 100644 index 0000000..fcbf014 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Cave.pxm differ diff --git a/res/en/data/sprites_up/Stage/Cave.tsc b/res/en/data/sprites_up/Stage/Cave.tsc new file mode 100644 index 0000000..e2fc191 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Cave.tsc @@ -0,0 +1 @@ +?FWXKFMW_::FOXN-::C?-::CCFUOcFWXKFMW_::FMXZ:=:;D:;;F^\K:::;D::CCD:::?D:::B-:;:;FZ\SFPKY:::>F^\K::?;D::C>D:::>D:::>-:;:<FZ\SFPKY:::>F^\K::?;D::C>D::;BD:::B-:;:=FZ\SFPKY:::>F^\K:::?D::C>D::;:D:::B-:;:?FZ\SFPKY:::>F^\K::?:D::C>D::;F^\K::?:D::C>D::;;D::;<-:;:BFZ\SFPVT:;:=D:;:CFW]QS~*yx1~*yzox+FXYNFOXN-:;:CFUOcF]Y_::;;FKXZ:;:BD::::D:::F^\K::?D:::>D::;:-:;;:FUOcFPKY:::>F^\K::?>D::C>D::;:D:::C-:;;;-:<::FZ\SFW]Q^ro*mk|mk}}*yp*k*]u*N|kqyx888FXYNFOXN-:<:;FKXZ:<:;D::::D::: \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Fall.pxa b/res/en/data/sprites_up/Stage/Fall.pxa new file mode 100644 index 0000000..2267b9f Binary files /dev/null and b/res/en/data/sprites_up/Stage/Fall.pxa differ diff --git a/res/en/data/sprites_up/Stage/Fall.pxe b/res/en/data/sprites_up/Stage/Fall.pxe new file mode 100644 index 0000000..f4e11db Binary files /dev/null and b/res/en/data/sprites_up/Stage/Fall.pxe differ diff --git a/res/en/data/sprites_up/Stage/Fall.pxm b/res/en/data/sprites_up/Stage/Fall.pxm new file mode 100644 index 0000000..6376edc Binary files /dev/null and b/res/en/data/sprites_up/Stage/Fall.pxm differ diff --git a/res/en/data/sprites_up/Stage/Fall.tsc b/res/en/data/sprites_up/Stage/Fall.tsc new file mode 100644 index 0000000..c653bb8 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Fall.tsc @@ -0,0 +1 @@ +rorororororororororororororororororororororororoمޅƆܓׅمڌroޅхم˓̅Յʅʓё܅ʅɅroԅʅʅ҅ޅro؅˅ʅדroʅ؅ӅɆroٌܑ؅ԅʓrororororororororo܆ٓ؅ʓم؅roх؅ʅroʓro؅ʅʅroڅׅʓro͑ӌمЅʓro؅م̅roޅɅʅԅԓޤڅӑroمͤroٌ؅ٓمʅroׅؓroБمroɅׅؓڅمؑ٤ӅڅɅّroمɅׅʓro܅ׅ˅؅roԅe؅roʆمڅ؅roمؑroم؅م؅roʅӌ؅نёڅՅroڅܓroׅёތ؅roʅԅɅ҅ʅroӅӅʅمʓ͓roڅӌمޓԅޓroroԆroԤԅمʅڅroԅԅܤroӅʅڅroڅʓґڌʅׅٓӅ؅בroɅ܅ممroʅمޅءroʅʅro݅Ʌޅroхܓro͑څܓroҤɅمʅхro˅Ʌڅʤroʆroٌ؅ʅʅro˅؅׆roޤхمڅЅroٓroمɅ؅ƅroʑޤroڅمنхمӑro͡ơӡ̡ԡӡ١Ρ̡͡١rorororoӌمڅro̤rorororororororo \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Frog.pxe b/res/en/data/sprites_up/Stage/Frog.pxe new file mode 100644 index 0000000..11d3986 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Frog.pxe differ diff --git a/res/en/data/sprites_up/Stage/Frog.pxm b/res/en/data/sprites_up/Stage/Frog.pxm new file mode 100644 index 0000000..2dfeab4 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Frog.pxm differ diff --git a/res/en/data/sprites_up/Stage/Frog.tsc b/res/en/data/sprites_up/Stage/Frog.tsc new file mode 100644 index 0000000..da13082 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Frog.tsc @@ -0,0 +1 @@ +yvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvړڍyvyvyvŨyvЌььyvьٌѩíyvíŰíyvԫyvíyvьښyvیތѫИڌьyvњړЌјyvړ͌lyvٌьѫړьyvьyvíŰíyvyv卨Ԍѓyv͌ލތڌ͌͘yvڍړ嚨yvííyvߌьŻ嚨yvíь׌ڌyvѓߌڌߚyvíyvyv׍yvyvyvyvyvyvyvŨíyvyvҌӍíyvyvyv \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Gard.pxa b/res/en/data/sprites_up/Stage/Gard.pxa new file mode 100644 index 0000000..907d106 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Gard.pxa differ diff --git a/res/en/data/sprites_up/Stage/Gard.pxe b/res/en/data/sprites_up/Stage/Gard.pxe new file mode 100644 index 0000000..a28bb97 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Gard.pxe differ diff --git a/res/en/data/sprites_up/Stage/Gard.pxm b/res/en/data/sprites_up/Stage/Gard.pxm new file mode 100644 index 0000000..7a4c0de Binary files /dev/null and b/res/en/data/sprites_up/Stage/Gard.pxm differ diff --git a/res/en/data/sprites_up/Stage/Gard.tsc b/res/en/data/sprites_up/Stage/Gard.tsc new file mode 100644 index 0000000..95bb3c6 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Gard.tsc @@ -0,0 +1 @@ +YVo|||YV||||||||YVo||}YV|||||||}YVo||~YV|||||||~YVo||YV|||||||YVo||YV|||||||YVYVo|}||YV|~|}|~|~}|}|}YVw|~YV||||||||||||}YVo|}|}YVlsl±mYVo|}|~YV|||||}||||~~||YVYVYVo|||YV|||||}w|||||~YVo||}YV||~YVo||~YV|||~YVw|w|y||}y|~YVw|~|w|~}||}||||}|||YV|||||}lzYVl±lllYVllŻlzYV||~}lzllzzzYVlñllYVzYV|||||~|||||||||||YVlllYVñ||||YV|||||~|||||||~YV||}z||~}xlzzzsllYVl±llYVzzz||}lzzzYVlllllYV||~}zzzxllllYVzYVzzzzzzzzYVxlllYVllllz||}xllz||||YV||~||||||||||YV|||}|||||}}|YVm|||||||||||||||zzzzzlzzz||||YV||||||||||||~|||m||||YV|||||||||||||||||~|}||YV||||}~|||~||||}||||~YV||||||||~YV||}yzYVllŻlYVŻsl||||}||}zYVllllñz||}||||||||~YVllz||||YV||||||||~||~YV||||||||~|||YV|||mlmYV|||lzllmYV||||||||lŻlllmmLYV||||}|||||}YV||||}|||~||||~||||~||||||YV||||}||||~||~YV||||||||~||~YV||||~||||||||YV||||||||~||~||YV|||mYVlŻlŋm||}}zzzzzzzzzzzzYVzzzlzzz|||YVmmmm||}||}mlslYVm||||YV|||||~}zzzzzxlűzYVlllzlllxllYVŻllzlllŻYVzxlôlĭlYVlŻllllõYVlûyyzzz|||sllŻmm||||YV||||}||||~|||YV||~||~|||||||}YV||}||}|||||YV|||}|||~||}YV|||||||||||||}YV|}|||||}|YV||~}xlllYVlllYVll||||||YVmsllYVllm||}||}||}||~|||||s±lllYVlzYVxlsllŻmxlxlxYVsllzYV±lxlŻlz||}||||||||}|||||YV|||}||||~||YV||}YVYVYVYVo||}YVo||~YVo||YVw|~|}}|}~YV||||}|||}|||||YV|||||||YVYVlƵlz|||YV|||}|||||}|||}YVo||YVo||YV|~~||}YV|~|||YVzzzzzzYVo||YVo||YVYVo|||YVw|~~|||zzzsllllzYVlŻzzz±lzzzYV|||||||||||||}||YVo||}YVy|~}||w|||||||YV|||||}|YVllz|}|YVYV \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Hell.pxa b/res/en/data/sprites_up/Stage/Hell.pxa new file mode 100644 index 0000000..8ab7b2e Binary files /dev/null and b/res/en/data/sprites_up/Stage/Hell.pxa differ diff --git a/res/en/data/sprites_up/Stage/Hell1.pxe b/res/en/data/sprites_up/Stage/Hell1.pxe new file mode 100644 index 0000000..acdd610 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Hell1.pxe differ diff --git a/res/en/data/sprites_up/Stage/Hell1.pxm b/res/en/data/sprites_up/Stage/Hell1.pxm new file mode 100644 index 0000000..3b31311 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Hell1.pxm differ diff --git a/res/en/data/sprites_up/Stage/Hell1.tsc b/res/en/data/sprites_up/Stage/Hell1.tsc new file mode 100644 index 0000000..6989da1 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Hell1.tsc @@ -0,0 +1 @@ +rororororororororororororororoׅɓrororoڅхƅЅɅroͅړroх؅Ʌԅхrorororororororororororororororoʅԅцrororororoمƅʅʢro݅eͅɅޅrorororororororororo͓roɅׅޅԅroͅʅʓrororororoɅڅ܅مʅ͒roƅʅɅƅפro؅ʅ؅ؓroʅ؅בʅro؅ׅɅʅroؓrorororoʅɅ؅х؅roՅɅʅʑroɅʅʅɅɅro҅ӅӓӅʅӅޅɅroӅ̓roro \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Hell2.pxe b/res/en/data/sprites_up/Stage/Hell2.pxe new file mode 100644 index 0000000..a27137b Binary files /dev/null and b/res/en/data/sprites_up/Stage/Hell2.pxe differ diff --git a/res/en/data/sprites_up/Stage/Hell2.pxm b/res/en/data/sprites_up/Stage/Hell2.pxm new file mode 100644 index 0000000..4c25708 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Hell2.pxm differ diff --git a/res/en/data/sprites_up/Stage/Hell2.tsc b/res/en/data/sprites_up/Stage/Hell2.tsc new file mode 100644 index 0000000..6b82149 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Hell2.tsc @@ -0,0 +1 @@ +ururururururururururururururururururururururururur͏ۈ׈ψӖurururururur͈ۈψ̈urḧ̈ֈur֔ur͈ۈ܈urԈ̈Ԗurۈֈ͈urۈ̖ururururڈ͈͈ur͈͔ۏۈurۈֈ̖ur͈ψۈ̈ur͈ԈΈˈur̈ֈֈܖurֈɈ͈ܔ͈ur܈ۈ׈̈ۈur׈ֈۖurur \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Hell3.pxe b/res/en/data/sprites_up/Stage/Hell3.pxe new file mode 100644 index 0000000..5cbdd52 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Hell3.pxe differ diff --git a/res/en/data/sprites_up/Stage/Hell3.pxm b/res/en/data/sprites_up/Stage/Hell3.pxm new file mode 100644 index 0000000..a0cb2a3 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Hell3.pxm differ diff --git a/res/en/data/sprites_up/Stage/Hell3.tsc b/res/en/data/sprites_up/Stage/Hell3.tsc new file mode 100644 index 0000000..965cef6 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Hell3.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFPKS::::FOXN-::C;FWXKFPKS:::;FOXN-::C<FWXKFPKS:::FWXKFPKS:::>FOXN-::C?FUOcFPVT;?=D:;;;F^\K::B>D::C?D::;:D:::<-:;;;F^\K::B?D::C?D::;:D:::<-:<::FMXZ:<::D:=<:D::::FPV7;?=D:::;FMWZ:::BD::;>D:::;FMWZ:::CD::;>D:::;FMWZ::;:D::;>D:::;FMWZ::;;D::;>D:::;FMWZ::;D:::;FMWZ::;=D::;>D:::;FOXN-:<>:-:<>;FNXZ:<>;FKXZ:<>:D::;:D:::=FOXN-:<><-:<>=FNXZ:<>=FKXZ:<>>-:<>?FNXZ:<>?FKXZ:<>>D::;:D:::=FOXN-:-:D::;:D:::;FOXN-:D::::-:>::FZ\SFPVT:<:::;FPV5:<:;FQS^:::?FKW5:::?D:;::FMW_::;:Qy~*~ro*GWs}}svo*Vkxmro|G+FaKS:;@:FXYNF\W_FMV\^ro*Ws}}svo*Vkxmro|*s}*k*zyo|pvokzyx6*l~*s~}*kwwy*s}*vsws~on8FXYNFMV\cy*mkx*|ozvoxs}r*y|*}~ymuzsvos~r*s~ow}*n|yzzon*l*oxowso}8FXYNFOXN-:>:;FZ\SFKW5:::?D::=:<FZ\SFKW5::;:D::<>FW]QFQS^::;;Wk*ws}}svo}*sxm|ok}on*l*FX_W::::+FXYNFOXN-:C::FNXZ:C::F]UT::<>D::::F]U5::<>FZ\SFW]=Toxuk6*}oosxq*ro|*l|y~ro|1}wknxo}}6*myxpsxon*rsw*~y*~rs}pvyk~sxq*s}vkxn8FXYN^rk~*k}*~ro*wy}~*}ro*myvn*ny8FXYNOox*k}*ro*k}6*}ro*myvn*xy~l|sxq*ro|}ovp*~y*usvv*ro|*yxl|y~ro|888FXYNFOXN-:C:;FNXZ:C:;F]UT::IZ[NIPZb===EISNV===>IR[Q0==F?IZ[NIPZb===EISNV===?IR[Q0==F@IZ[NIPZb===EISNV===@IR[Q0==FAIXRfISYW>===G==FBIZ[NIPZb===EISNV===AIRcR=?==0==FBIZ[NIPZb===EISNV===AIR[Q0=>==IXRfI`\b==>>IN[]=>==G====G===?ISN\===AIa_N==B@G==FAG==DBG===B0=>>=IXRfI`\b==>>IN[]=>>=G====G===?ISN\====Ia_N==BCG==F=G=>>EG==E@0=?==IXRfISY8>===ISY8>=?BISY8>=@EIZfQ===?IdNV==B=IN[]=A==G==>=G====IZ`Tbnu.I[\QIPY\IN[]=A==G==?=G====IdNV==B=IR[Q0=A==IXRfISYW>==@G=A=AISYW>>=?G=A=@ISYW>==?G=A=?ISYW>==>G=A=>ISY8>==>ISY8>=@EIN[]=A==G==>=G====IZ`TRnnuu.IZfO===?I[\QIPY_Q|{4-xvyy-zr.I[\QV4z-n-uzn{.-V-w-t|zntvpnyy-{rq-v{|n-Zvzvtn.-V4z-uzn{.I[\QIPY_UuLI[\QIPY_;;;;;I[\QIPY_IN[]=A==G====G====ISNP==?Edun4-uvLf|4r-{|-|{r-|s-u|rxvyyr-|o|LI[\Qdryy9-|-pnrq-ur}n{-|ss-zr9-wz}v{t|-yvxr-un.I[\QIPY_f|-|yq{4-or-unnv|9-|yq-|LI[\QIR[Q0=A=>IXRfISY8>==?IZ`TISNP==?EV4z-V|u9-|{r-|s-ur uzn{-u|-pnzr-|-uvvyn{q-|-q|-rrnpu;I[\Qaun-vpu-Zvr-{rqzr-v{|-uv;;;I[\QV-zn{ntrq-|-tr-nn9o;;;w-y||x-n-zr;I[\QIPY_N{q-{|-V4z-px-urr.I[\QIPY_f|-pyvzorq-}-s|z-ur|vqr9-qvq{4-|;I[\QV4z-n{-r{tv{rr-|sp|{vqrnoyr-nyr{9I[\Qo-V4z-qrnuy-nsnvq|s-urvtu;;;I[\QIPY_\u9-|r9-|r-v-zr;;;I[\QIPY_V-{rr-u|yq4r-p|zr|-uv-vyn{q-v{-ursv-}ynpr;I[\QIR[Q0=A=?IXRfIZ`TISNP==?E[|9-{|9-ry-|-unr{|-r-s|-pu-n-}nurvp9n{qrq-yvyr-zn{;I[\QIR[Q0=A=@IXRfIZ`TISY8>==@ISNP==?EV|uLI[\Q-fr9-un4-zr;I[\QIPY_dun4-unLI[\Q`nxnz||4-|xv{t-|{n-|pxrLI[\QIPY_`|-ur4-vyy-nyvr;;;I[\QN-svrpr-|{r9-ur-v;I[\Q[|uv{t-yvxr-zr9-un4s|-r;;;I[\QIPY_Nyy-vtu9-ur{;I[\Qanxr-uv;I[\QISNP====ITVa>=?DIVa8==?DIPY_IPZb==>=T|-ur-JP|{|yyrJ;IdNV=>C=I[\QI_ZbIPY_ISNP==?EV-uv{x-un4-unur4-nsr;I[\QITVa====IRcR=A=A0=A=AIXRfIZ`TISNP==?ETvr-Z;-`nxnz||-zrtnq;I[\QIR[Q \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Jail.pxa b/res/en/data/sprites_up/Stage/Jail.pxa new file mode 100644 index 0000000..a92f3fe Binary files /dev/null and b/res/en/data/sprites_up/Stage/Jail.pxa differ diff --git a/res/en/data/sprites_up/Stage/Jail1.pxe b/res/en/data/sprites_up/Stage/Jail1.pxe new file mode 100644 index 0000000..bb4def6 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Jail1.pxe differ diff --git a/res/en/data/sprites_up/Stage/Jail1.pxm b/res/en/data/sprites_up/Stage/Jail1.pxm new file mode 100644 index 0000000..4d543fc Binary files /dev/null and b/res/en/data/sprites_up/Stage/Jail1.pxm differ diff --git a/res/en/data/sprites_up/Stage/Jail1.tsc b/res/en/data/sprites_up/Stage/Jail1.tsc new file mode 100644 index 0000000..e61798b --- /dev/null +++ b/res/en/data/sprites_up/Stage/Jail1.tsc @@ -0,0 +1 @@ +[Xq~~~[X~~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[X[Xq~~~[X~~~~~~~~~~~~~[X[Xq~~[X~~~~~~~~~~~~~~~~~~~~~~~~[X[X[Xq~~~[X[X~~~[X~~~~[Xxnx|||o[X~~~~~~~~~~~~~~~~~~~~y~~{~y~[XznnŶunů|õnǽnnn|[Xnunnn³[Xnn·nónnǽ|nn¶n|[XnŶnn½nn¶n½[Xn¶żnn|[Xnnðnn[Xƾ||||||unŶnón|Nnnnn[Xunnn½n³|[Xnn½nnnnŷ¶n|nůnnnǽn¶[XŶn·|[XnnnºnŶnz[X¶nnn½nnů|~~[X[Xq~~[Xy~ndz|nn¶núnnz[Xnnnn¶n½[Xǽn|~~~~~~~~[X[Xq~~[Xnůnznnijn³~~~~~~~~[X[Xq~~[X~~~~~~~~~~[X[X[Xq~~[X~~~~~~~~~~~~~~~~[X~~~o[X~~~uo[X[XunnznnǽÍ|||||[X~~~y~~~~~~~~~~~~~~~[Xq~[X[X \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Jail2.pxe b/res/en/data/sprites_up/Stage/Jail2.pxe new file mode 100644 index 0000000..a79a22c Binary files /dev/null and b/res/en/data/sprites_up/Stage/Jail2.pxe differ diff --git a/res/en/data/sprites_up/Stage/Jail2.pxm b/res/en/data/sprites_up/Stage/Jail2.pxm new file mode 100644 index 0000000..24af892 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Jail2.pxm differ diff --git a/res/en/data/sprites_up/Stage/Jail2.tsc b/res/en/data/sprites_up/Stage/Jail2.tsc new file mode 100644 index 0000000..2183673 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Jail2.tsc @@ -0,0 +1 @@ +TQjwwwTQwwwwwwwTQjwwxTQwwwwwwxTQjwwyTQwwwwwwyTQjwwzTQwwwwwwzTQjww{TQwwwwww{TQTQjwwTQwwwTQwywwwwwxwwwwwww{TQwzwxwxxywwwywxwwTQwywwwwwwwwwwTQwwwywzwxTQTQjwxwwTQwwwyww|}wwywwwww{TQTQjwywwTQggguTQgggggwwwwrw|y{TQwzwwwxxxwwwwww}wwywwwwwxwwwwTQwxwwwww{wwxwwwwx|wwxwTQTQTQjw{wwTQGsgggggggggTQjw{wxTQghTQjw{wyTQggggghTQTQjw{wzTQgggggTQgggghgnggggTQghTQjw{w{TQggggiiTQnggggTQgggguuuTQjw{w|TQggggggTQggsgggngTQguuuTQgggguTQTQ \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Jenka1.pxe b/res/en/data/sprites_up/Stage/Jenka1.pxe new file mode 100644 index 0000000..6f94c55 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Jenka1.pxe differ diff --git a/res/en/data/sprites_up/Stage/Jenka1.pxm b/res/en/data/sprites_up/Stage/Jenka1.pxm new file mode 100644 index 0000000..83dbd6b Binary files /dev/null and b/res/en/data/sprites_up/Stage/Jenka1.pxm differ diff --git a/res/en/data/sprites_up/Stage/Jenka1.tsc b/res/en/data/sprites_up/Stage/Jenka1.tsc new file mode 100644 index 0000000..121c82f --- /dev/null +++ b/res/en/data/sprites_up/Stage/Jenka1.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPQY\faiPPPP\end-*CPPYQ-*\mna\cmuPPQY\faiPPPQ\end-*CPPYR-*\mna\cmuPPQY\faiPPPR\end-*CPPYS-*\mna\cmuPPQY\faiPPPS\end-*CPPYT-*\mna\cmuPPQY\faiPPPT\end-*-*CPQPP-*\pri\souPPQQ\dnpPQPP\faoPPPT\traPPQPZPPYTZPPSUZPPRV-*-*-*CPRPP-*\key-*\itjPPQTZPRPQ-*\fljPUYTZPRQT-*\fljPUYSZPRQS-*\fljPUYRZPRQR-*\fljPUYQZPRQQ-*\fljPUYPZPRQP-*\key\msg\facPPQSw@@NNN_\nod-*iG@@@-*@N\nod\end-*-*CPRPQ-*\itMPPQT-*\fljPUYTZPRRT-*\fljPUYSZPRRS-*\fljPUYRZPRRR-*\fljPUYQZPRRQ-*\fljPUYPZPRRP-*\key\msg\facPPQSoL@A\nod\clr\gitQPQTm@@A\nod\clr-*\gitPPPP\facPPPPg@@@]p]N\nod\clr\cnpPSPPZPQSPZPPPP\dnpPTPQ\flMPRWT\facPPQSy@@@L-*i@@_\nod-*m@N\nod\clrwG@_\nod-*]r@]_\nod\facPPPP\clr\cmuPPPP\msghA\nod\clo-*\cnpPTPPZPPPYZPPPP\waiPPQP\mydPPPR\cnpPSPPZPQSRZPPPR\anpPSPPZPQPPZPPPR\waiPQRP\cmuPPQQ-*\cnpPTPPZPPQRZPPPP-*\msg\facPPPUhG@@L@j_\nod\clr\facPPQSaL@bN\nod\anpPSPPZPQRPZPPPR-*yG@@L@i@N\nod-*a@@@@@-*@@_\nod\clr\facPPQThMMA\nod-*h_@y@@m_\nod-*sG@L@@N\nod\clra@@@@N\nod-*t@L@@-*@@A\nod\clr\facPPQSs@@@@-*@NNN\nod\clr\facPPPUiG@@@@-*@@N\nod-*i@@@@@-*@@@N\nod\clrt@@@@-*@@A\nod\clr\facPPQSNNNNN\nod\clrmNNN\nod-*w@@@@-*@_\nod\clr-*\anpPTPPZPPSPZPPPP\facPPQThA\nod\clrp@@L@-*_A\nod\clr\facPPPUNNNNN\nod\clri@@@@N\nod-*s@G@@-*@N\nod\clo\cmuPPPP-*\waiPPUP\facPPPU\msgyG@@N\nod\clo-*\facPPPP\anpPTPPZPPQPZPPPP\waiPRPP\cmuPPQY-*\msg\facPPQS\cnpPSPPZPQSPZPPPPa@@NNN\nod-*t@MMN\nod\mydPRPP\clrNNNNN\nod\clrt@@@-*N\nod-*f@@-*@NNN\nod\clra@@@@@N\nod\clrc@@@-*@@@@-*@@@_\nod\flKPUYP\end-*-*CPRQP-*\key\msg\facPPQSs@@NNN\nod-*c@@@-*@@@@-*@@@_\nod\end-*-*CPRQQ-*\key\msg\facPPQSt@@N\nod-*g@N\nod\end-*-*CPRQR-*\key\msg\facPPQSi@@@-*@@@-*@N\nod\clrt@@@NNN\nod\end-*-*CPRQS-*\key\msg\facPPQSo@@@NNN\nod-*i@@@@-*@@@N\nod\end-*-*-*CPRRP-*\key\msg\facPPQSm@L@@N\nod\clr\gitQPQTt@@ @-*@@N\nod\clr-*\gitPPPP\cnpPSPQZPQSPZPPPP\dnpPTPQ\facPPPPg@@@]p]N\nod\clr\flMPRWT\facPPQShNNN\nod-*yG@@@-*@L@G@N\nod\clrNNNNN\nod\clri@G@@@-*@@@-*@@@@N\nod-*c@m@-*@@N\nod-*a@@@@-*@@@N\nod\clrcL@@m-*@@-*@@L\nod-*@@@-*@@@-*@@@N\nod\clrh@@@@-*L@@m@-*@@\nod-*@@NNN\nod\clrt@@N\nodg@N\nod\flKPUYQ\end-*-*CPRRQ-*\key\msg\facPPQSoN\nod\clr\gitQPQTyL@N\nod-*t@@@@-*@@N\nod\clr-*\gitPPPP\cnpPSPRZPQSPZPPPP\dnpPTPQ\facPPPPg@@@]p]N\nod\clr\flMPRWT\facPPQSt@@N-*wG@@@@NNN\nod\clrNNNNN\nod\clrh@@@@-*@m_\nod\clrt@@m@-*@@@-*@@@N\nod-*t@@L@@-*@@@N\nod\clr-*hNNN\nod\clrd@@@-*@@-*_\nod\clrNNNNN\nod\clri@@@@NNN\nod-*t@@mL-*@@@-*@@L\nod-*@@-*N\nod-*i@@@@-*L@@-*@@L\nod-*@@N\nod\clra@@@-*m@@-*@NNN\nod-*i@@@NNN\nod\clrd@@@_\nod-*d@@@-*@@-*@_\nod\clrNNNNN\nod\clrt@@@NNN\nod\flKPUYR\end-*-*CPRRR-*\key\msg\facPPQSt@@@-*@N\nod-*m@@G@-*@@-*@N\nod\clr\gitQPQTm@NNN\nod\clr-*\gitPPPP\facPPPPg@@@]p]N\nod\clr\cnpPSPSZPQSPZPPPP\dnpPTPQ\flMPRWT-*\facPPQSNNNNN\nod\clryG@@-*@L@G-*N\nod-*w@@@@-*@@NNN\nod\clri@G@@@-*L@G@@-*@N\nod-*t@@@-*@@@-*@@@NNN\nod\clroL@L@NNN\nod\clrtG@@-*N\nod\flKPUYS\end-*-*CPSPP-*\fljPUYPZPSQP\end-*CPSPQ-*\fljPUYQZPSQQ\end-*CPSPR-*\fljPUYRZPSQR\end-*CPSPS-*\fljPUYSZPSQS\end-*CPSPT-*\fljPUYTZPSQT\end-*-*CPSQP-*\key\msgaA\nod\end-*CPSQQ-*\key\msga@A\nod\end-*CPSQR-*\key\msga@@A\nod\end-*CPSQS-*\key\msgbN\nod\end-*CPSQT-*\key\msgfA\nod\end-*-*-*CPTPP-*CPTPQ-*-* \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Jenka2.pxe b/res/en/data/sprites_up/Stage/Jenka2.pxe new file mode 100644 index 0000000..94b30aa Binary files /dev/null and b/res/en/data/sprites_up/Stage/Jenka2.pxe differ diff --git a/res/en/data/sprites_up/Stage/Jenka2.pxm b/res/en/data/sprites_up/Stage/Jenka2.pxm new file mode 100644 index 0000000..83dbd6b Binary files /dev/null and b/res/en/data/sprites_up/Stage/Jenka2.pxm differ diff --git a/res/en/data/sprites_up/Stage/Jenka2.tsc b/res/en/data/sprites_up/Stage/Jenka2.tsc new file mode 100644 index 0000000..f0a9ebf --- /dev/null +++ b/res/en/data/sprites_up/Stage/Jenka2.tsc @@ -0,0 +1 @@ +ǺΩ©ǽǺΩ©ǽǺΩ©ǽǺΩ©ǽǺéľҵΩ©ϾǺΩ©ǽµΩɩȩ˺ľҵҽɩޙޙ򸆃ęޚȽ뚵Ƚˆ횚ȽȆɩк©ɩŤŤк©Ωǽľ҆鍍ͦ᧧ȽȽȆк©ɩк©ͪޙޙ򶧵ȽͩɩɩŦˆޙ򧧧Ƚޙޙ򧧧Ƚާ槵Ƚyޙކݙޙ憃ޙާȽᥙ짧Ƚ짧ȽͪͤˆΩڙޙк©Ƚε˵ޙޥޥ膃ޙ᧵ȽǽľҵéޚȽ暵Ƚޙކݙޙ憃ޙޚȽǽľҵéᥙޙچݙާȽͪͤˆݙڙޙк©Ƚͩ˵ޙߙ놃ݙާȽޙ솃ݙ觧Ƚǽľҵڙޙކݙݙ姧Ƚ™솃ޙȽǽľҵޣȽǽ \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Kings.pxe b/res/en/data/sprites_up/Stage/Kings.pxe new file mode 100644 index 0000000..b6665ff Binary files /dev/null and b/res/en/data/sprites_up/Stage/Kings.pxe differ diff --git a/res/en/data/sprites_up/Stage/Kings.pxm b/res/en/data/sprites_up/Stage/Kings.pxm new file mode 100644 index 0000000..c8342b2 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Kings.pxm differ diff --git a/res/en/data/sprites_up/Stage/Kings.tsc b/res/en/data/sprites_up/Stage/Kings.tsc new file mode 100644 index 0000000..9ed7131 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Kings.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlvqy````lu~t=:S``ia=:l}~qlvqy```alu~t=:S``ib=:l}~qlvqy```blu~t=:S``ic=:l}~qlvqy```clu~t=:S``id=:l}~qlvqy```dlu~t=:=:S`a``=:l{ul}~qlqy``e`lvqy```a=:lq~`c``j``a`j```0lqy``ig=:lq~`c``j```aj````lqy``e`=:lq~`c``j``b`j````lqy``fd=:lq~`c``j```aj````lqy``af=:lq~`c``j``c`j````lqy``e`=:lq~`c``j``d`j````lqy``ig=:lvq```alqyiiii=:=:S`c``=:=: \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Labo.pxa b/res/en/data/sprites_up/Stage/Labo.pxa new file mode 100644 index 0000000..9b5a39a Binary files /dev/null and b/res/en/data/sprites_up/Stage/Labo.pxa differ diff --git a/res/en/data/sprites_up/Stage/Little.pxe b/res/en/data/sprites_up/Stage/Little.pxe new file mode 100644 index 0000000..14d8dd0 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Little.pxe differ diff --git a/res/en/data/sprites_up/Stage/Little.pxm b/res/en/data/sprites_up/Stage/Little.pxm new file mode 100644 index 0000000..b50449c Binary files /dev/null and b/res/en/data/sprites_up/Stage/Little.pxm differ diff --git a/res/en/data/sprites_up/Stage/Little.tsc b/res/en/data/sprites_up/Stage/Little.tsc new file mode 100644 index 0000000..878e11b --- /dev/null +++ b/res/en/data/sprites_up/Stage/Little.tsc @@ -0,0 +1 @@ +TQjwwwTQwwwywwwwTQjwwxTQwwwywwwxTQjwwyTQwwwywwwyTQjwwzTQwwwywwwzTQjww{TQwwwywww{TQTQjwxwwTQwwxxwxwwwwwwwwwywwwyww|zwwywwwywx~zTQTQTQTQjwywwTQTQxz~zwyw}TQxz~ywywyTQsgnggggusgggnggtTQggngTQuTQggggggTQwywxrxz~yTQwwwwwxywwwwwwwggguTQwwxwwwxygghwx}wTQjwywxTQgguTQTQjwywyTQGsggggggTQggggwywzhTQggguTQjwywzTQtxz~yTQgsgngggTQuTQgngggggTQgggguwwxywwwwwwwTQwwxyggguTQwwxwwwwggghwx}wTQTQjwyxwTQxz~wwyxxrxz~xTQgggggTQguuugngggsTQgTQjwyxxTQgggguTQjwyywTQngsgTQTQjw|wwTQwy|wwwwwTQTQ \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Lounge.pxe b/res/en/data/sprites_up/Stage/Lounge.pxe new file mode 100644 index 0000000..0198c46 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Lounge.pxe differ diff --git a/res/en/data/sprites_up/Stage/Lounge.pxm b/res/en/data/sprites_up/Stage/Lounge.pxm new file mode 100644 index 0000000..2dce2ee Binary files /dev/null and b/res/en/data/sprites_up/Stage/Lounge.pxm differ diff --git a/res/en/data/sprites_up/Stage/Lounge.tsc b/res/en/data/sprites_up/Stage/Lounge.tsc new file mode 100644 index 0000000..cf55ccd --- /dev/null +++ b/res/en/data/sprites_up/Stage/Lounge.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{xǪÞ{x{x{x{x{xij{x{x{x{x{x¸{xӎӎᜪ{xَڎӎӚӜ{xݎӕӎώӎ{xԎ眪{x{x{xǪӜŸ›Ҏӎ{x૜ž{xǪӎӎݎӜŸ™{xÞӎ૜ůê{x{x{xǪӎ{xՎӎҏ{xӎӎҎ{x᜜{x{x{x{x{x{x{xij{x{x{xӎ{xӎӎӎ{xҎ܎ӎ✪{xҎԎ{xҜ{xӎՎӎ{xnҎ֜{xӎ皎ݚҎ᜜{x{x{xӎ⎲ՎՎ{xԎ֎ۏ{x֚Ԏ玷ӎώ{x{x֎ώӜ{x{x{xǪ{xij{x{xܕӎώҎ{xᏪ᭎֏{xӎҎݎӎӜ{x{x{xǪ{xij{x{xێݎҜ{x{x{xǪǰ֚眪ܕӎӭ{xَ֚ӎ{xӜ{xӎҎ琎{xӎގҎӎӜ{xܚӎ՜Վݎ{xՎώӎԎӜݎӎݎ֭{xښӎҎ{xůDzů{xů{xÞů{xÞ{x{x{x{x{x{x{x \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Malco.pxe b/res/en/data/sprites_up/Stage/Malco.pxe new file mode 100644 index 0000000..d720f4f Binary files /dev/null and b/res/en/data/sprites_up/Stage/Malco.pxe differ diff --git a/res/en/data/sprites_up/Stage/Malco.pxm b/res/en/data/sprites_up/Stage/Malco.pxm new file mode 100644 index 0000000..afdc84f Binary files /dev/null and b/res/en/data/sprites_up/Stage/Malco.pxm differ diff --git a/res/en/data/sprites_up/Stage/Malco.tsc b/res/en/data/sprites_up/Stage/Malco.tsc new file mode 100644 index 0000000..5ae31c2 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Malco.tsc @@ -0,0 +1 @@ +@=Vcclc@=otovccckoyt|ccccoxw@=Vccld@=otovccckoyt|cccdoxw@=Vccle@=otovccckoyt|ccceoxw@=Vcclf@=otovccckoyt|cccfoxw@=Vcclg@=otovccck@=oy}ckfcmccli@=oy}cgkdmcclh@=oyt|cccgoxw@=Vcclh@=ovcecdmcdcemcccc@=otcfccmccccmccce@=oyt|cccgoxw@=Vccli@=ovccddmcccimccid@=ovccddmcccjmccjj@=ovcecdmcdcemcccc@=otcfccmccccmccce@=oyt|cccgoxw@=Vcdcc@=oy}cgkcmcdcd@=o|occddowcdccoytcccgotcccimcclgmcdjdmccdj@=Vcdcd@=o|oz|SZSTowoxw@=Vcecc@=oy}cgkdmcece@=o~xozySSyyaow@=tvSSyyaowovSSSro}ccccov@=occgfoy^cgkdovcecdmcdcemccccSaowov@=o~xovccccotcfccmccdcmccccot|ccecowccceot|cghc@=ovcccgoz|wxStxTow@=vxvxSwxv|TTowovot|cchc@=oz{Towov@=ovcecfmccclmccccot|cchc@=ovccccotcfccmccedmccccot|cckcovccdd@=ovcecfmccdemcccc@=ozoytvccchwSSSS@=S|SSZ@=ro}cecgovZSTowoxxcecg@=Vcecd@=Vcece@=o|ozo@=SSaowoxw@=Vcecf@=o~xovcecfmccdemccccotcecfmccecmcccgot|cdgc@=o|ozoytvccchStxSrTowoytvcccco~xov@=ot|cdccovccdh@=oz@=ySSuTot|cdgcow@=ovccckoy`cgkcoy^cgkeoxw@=Vcecg@=o~xozStZTTowovSwSS@={zxSaow@=SS@=Saow@=oytvccdgotcecfmccfcmccccS_SZS@=rowovoytvccchuSS_SSZ@=SSaow@=SSSaowovt_S|ZSS@=SSaow@=wZS_S@=aow@=Srowov@=ovcccgovcecfmccfimccccoucecfoy^cgkcoxw@=Vcehc@=o~xozoSaaaowoxw@=Vcfcc@=oy}cgkfmcfcf@=oy}cgkdmcfcd@=o~xoztSaaarow@=|SZSSSS@=aowoxw@=Vcfcd@=o|ozaaaaaowoy}cgkemcfce@=|SSSSaowoxw@=Vcfce@=o~xoz|SSSSS@=Saow@=wSSSSSSro}ccccovot|cchc@=ovcfccmcdclmcccg@=otc3ccmccdcmcccg@=oucfccot|cchcowcfccoy^cgkfoy^cgkh@=oz{taaaow{t~SaaaowovZxStS|vxSxaow@=twSSzTowov{t~SySt|zSxTowov|ZwS|~xSStSSutv~@=x{_owovuStS|S~S{SSwS|@=t~xSx|xaaaowoy}cedimcfcgoxw@=Vcfcf@=oy}ckfcmcfdh@=oy}checmcfdg@=oy}cgkimcfdf@=o|}ccddmcfdc@=oy}cgkgmcfch@=o~xoz|ZwS|~xSStSSutv~@=x{_owovuStS|S~S{SSwS|@=t~xSx|xaaaowoy}cedimcfcgoxw@=Vcfcg@={row@={xSwZSxwStwSSvtZ@=zxS|Sxrowov{trTow@=tS{tS|StxwS||wxrTowov@=SStxStSzwSxTowovwxwTow@=|ZSt~xStSwxySuu@=ySTow@=xZSuS{tSwS@=|{xxxTowoy^cgkgoxxcfch@=Vcfch@=o~xoz|ZSxxwSSSvxv@=uu`t~|zStx|taow@=pv{tvtp_ow@=p}xy|{S}|vxp_@=twSpzSutxpaowov|ZSt~xSSuuStSSt@=Su|zSxStS{xStx|tTowoy}ceidmccccov{r@=x_S{xS}xy|{Sw@={txS{xS}|vx_SStS{tx@=|xwS{xaowoy^ceidoxw@=Vcfdc@=o|}ccckmcfddoxxcfch@=Vcfdd@=o|}ccdemcfdeoxxcfch@=Vcfde@=o~xoy^cgkio|`cccko|`ccddo|`ccde@=oz{txSSywStS{xStx|t@=xrowovoz|dcde{TowS{xSpv{tvtpTow@=oz|dcck{TowS{xSp}xy|{S}|vxpTow@=oz|dcdd{TowSxxS{xSpzSutxpTowov{xSxSSuxz|TTowoz|ccccov@=oytcccdot|cdccoyt|cccd@=oz|S|Sy||{xwTowoz|dcdfo|^ccdfoy^ceedov@=ovccdczSSpxpTot|cdicowoovzSTow@=uS{tSwSTowoxw@=Vcfdf@=o~xozzSTow@={StwSuS{tSwSTowoxw@=Vcfdg@=o~xozvxStwS||Stzt|Sx|xaow@=|ZwSyyxSSxSxt_Suaaaowoxw@=Vcfdh@=o~xoz{txZSxxSS|StS{|xTowov|ZSzwSSxxSaow@=|ZSSxS{xxS|{S@=xSSt~Saaaow@=|ZxSuxxS{|~|zSx{tS|@=z{SStv|txSxStx@=u_StuxS{StStaaaowovaaaaaowov@=|ZwSyyxSSxSxt_Suaaaowoxw \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Mapi.pxe b/res/en/data/sprites_up/Stage/Mapi.pxe new file mode 100644 index 0000000..02be92f Binary files /dev/null and b/res/en/data/sprites_up/Stage/Mapi.pxe differ diff --git a/res/en/data/sprites_up/Stage/Mapi.pxm b/res/en/data/sprites_up/Stage/Mapi.pxm new file mode 100644 index 0000000..4cb4e3e Binary files /dev/null and b/res/en/data/sprites_up/Stage/Mapi.pxm differ diff --git a/res/en/data/sprites_up/Stage/Mapi.tsc b/res/en/data/sprites_up/Stage/Mapi.tsc new file mode 100644 index 0000000..28e1969 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Mapi.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIFIFIFxmqrovlmlmIFIF_lmllIFxxmqrpvlmlmxllmmx}lmllvllllvlllnIFx}lllpx}llmrvllupvllonvlllnIF_lmlmIFxx\c\]xxIFIFIF_lpllIFxx~lllnx}llnlIFxmqrovlpnlIFxmqrnvlpmmIFxmqrmvlplox\\\\\{xlplmxmlppvlplnx]xIF\\jxxIFIF_lplmIFxxiij\~h\jxxIFIF_lplnIFxxgmqrmx{x\}{xIF\jxxlploIF_lploIFxxh\j\\\\\IF\\\\~{xlpltxlplpxIFIF_lplpIFxx~\\h\\cIF\\h\{xlplqxlpltIF_lplqIFxx\\\\{xlpluxlplrIF_lplrIFxx\\\\IF\\{xlpluWddmdA>pupwddempzu}ddddpyxA>WddmeA>pupwddempzu}dddepyxA>WddmfA>pupwddempzu}dddfpyxA>WddmgA>pupwddempzu}dddgpyxA>WddmhA>pupwddempzu}ddd4pyxA>A>WdeddA>p}pzudddfpudddmnddmfnddefnddjhA>A>WdedeA>p}pzudddepuddgmnddmendddhnddejA>A>WdfddA>p}p{}[TTbT[TTTbpxpyxA>A> \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/MazeI.pxe b/res/en/data/sprites_up/Stage/MazeI.pxe new file mode 100644 index 0000000..d301a2f Binary files /dev/null and b/res/en/data/sprites_up/Stage/MazeI.pxe differ diff --git a/res/en/data/sprites_up/Stage/MazeI.pxm b/res/en/data/sprites_up/Stage/MazeI.pxm new file mode 100644 index 0000000..ec76fcc Binary files /dev/null and b/res/en/data/sprites_up/Stage/MazeI.pxm differ diff --git a/res/en/data/sprites_up/Stage/MazeI.tsc b/res/en/data/sprites_up/Stage/MazeI.tsc new file mode 100644 index 0000000..d5109f9 --- /dev/null +++ b/res/en/data/sprites_up/Stage/MazeI.tsc @@ -0,0 +1 @@ +[Xq~~~[X~~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[X[Xq~~~[X~~~~~~~~~~~[X[Xq~~[X~~~nŽun|||[Xq~~[X~~~~~~~~~~~~~[Xq~~[Xq~~[X[Xq~~~[X~~~~~~~[X~~nnnúo~~y~~~[Xn¶nnno[X[X[X[Xq~~~[X~~~~~~~~~~~~oo|||||nnnǽnn¶[Xü|nn¶n[X~~~[X~~~~~~~~~~~~~[X[Xq~~[X~~~nǽnůn½nn¶n~~~~[Xy~[XN~~~~~~~~[X~~~~~~~~~~~~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~~~~~~~~[X~~~~[X~~~~~[X~~[X~~~~~~~~~[X[Xq~~[Xnnn|[X[Xq~~[X[X[Xq~~~[Xnnn½nǽ[Xżn|[Xnn¶|||[Xnn¶nunn|[Xnǽnnz[Xǽnijnn|||[X[Xq~~[X[Xq~~[Xnŷ±n¶nn¶[Xnnþn½nnþn½[XŶ|[Xn¶n·unnþ[X¶|[Xnnijnnijn[Xü·nnnn|[X[Xq~~[Xnnn|[X[Xnȳnnnnnn~~n{n~[X~~[X~.ؘ[X~ёјѨ[X[X \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/MazeM.pxe b/res/en/data/sprites_up/Stage/MazeM.pxe new file mode 100644 index 0000000..d7eda37 Binary files /dev/null and b/res/en/data/sprites_up/Stage/MazeM.pxe differ diff --git a/res/en/data/sprites_up/Stage/MazeM.pxm b/res/en/data/sprites_up/Stage/MazeM.pxm new file mode 100644 index 0000000..cdda771 Binary files /dev/null and b/res/en/data/sprites_up/Stage/MazeM.pxm differ diff --git a/res/en/data/sprites_up/Stage/MazeM.tsc b/res/en/data/sprites_up/Stage/MazeM.tsc new file mode 100644 index 0000000..05becb1 --- /dev/null +++ b/res/en/data/sprites_up/Stage/MazeM.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``b`lq~`d``j``b`j```blvqy````lv|z`ghbj``iilu~t=:S``ia=:l}~qls}``b`lvqy```alu~t=:S``ib=:l}~qls}``b`lq~`d``j``b`j```blvqy```blv|z`ghbj``iilu~t=:S``ic=:l}~qls}``b`lvqy```clv|z`gh`j``iilu~t=:S``id=:l}~qls}``b`lvqy```dlv|z`gh`j``iilu~t=:=:=:=:S``ii=:ls}```gj``cej````=:ls}```hj``cej````=:ls}``bfj``caj`aaa=:lu~t=:=:S`a``=:lylvq````lq``ddj``idj``a`j``ad=:=:S`aa`=:l{ulv|z`ghcj`aablv|z`ghaj`aaa=:l``aalq~`aa`j````j```blvq```blq``dfj``ibj```cj```i=:S`aaa=:lv|[`gh`lv|]`gha=:l``aalq~`aa`j````j```blvq```blq``dfj`ae`j```cj``0i=:S`aab=:lyl}wyPWP^^^l~tlu~t=:=:S`c``=:S`c`a=:l{ul}~qls}``b`=:lq~`ca`j```aj````lvqy```d=:ls~`c`aj`aabj```blqy`a``=:lq~`ca`j````j````=:l}t```blt~`c`al}s=:lq~`d``j``b`j```blv|z`ghbj``iilu~t=:S`ca`=:l{ulv|[`gb`ls~`c``j`aaaj````lx}slqy``f`lq~`ca`j```aj````=:lqy`a``lvq```dlq``dbj`c`aj``bfj```e=:=:=:S`cc`=:lylv|z`ghbj`ccal}wPPP^l~tl``dcls|l}wP^l~tls|=:lv|[`ghb=:lqy``e`=:l``ga=:ls}```gj``cej````=:ls}```hj``cej````=:ls}``bfj``caj`aaa=:lqy``e`lu~t=:S`cca=:lyl}w^^^l~tlu~t=:=:S`d``=:=: \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/MazeO.pxe b/res/en/data/sprites_up/Stage/MazeO.pxe new file mode 100644 index 0000000..3537a2c Binary files /dev/null and b/res/en/data/sprites_up/Stage/MazeO.pxe differ diff --git a/res/en/data/sprites_up/Stage/MazeO.pxm b/res/en/data/sprites_up/Stage/MazeO.pxm new file mode 100644 index 0000000..61edc26 Binary files /dev/null and b/res/en/data/sprites_up/Stage/MazeO.pxm differ diff --git a/res/en/data/sprites_up/Stage/MazeO.tsc b/res/en/data/sprites_up/Stage/MazeO.tsc new file mode 100644 index 0000000..7cabed3 --- /dev/null +++ b/res/en/data/sprites_up/Stage/MazeO.tsc @@ -0,0 +1 @@ +VSlyyyVSyyy{yyyyVSlyyzVSyyy{yyyzVSlyy{VSyyy{yyy{VSlyy|VSyyy{yyy|VSlyy}VSyyy{yyy}VSVSVSVSVSlyzyyVSyyzzyzyyyyyyyyy{yyyyyyyyVSyy|yzyzVSyy|yy}yy}yyz~VSlyzyzVStyy}yy|yy}yy}yyz~VSVSlyzy~VSyyy}yy|yy}yyzyyz{VSVSly{yyVSi¼iuVSiwwwVSiiiVSiiiiwVSVSVSly|yyVSpii¼wVSuiiii¸iwtzyyyyy{yVSyy}y|y}VSyy{y|y|VSyyzy|y{VSyyyy|yztyyyyy~yVSuiuiiuipiwiuiuipVSipiiiii¸wpiiiiiwVSiiiiipVSiiiiwVSzyztyyziii†wyyyyVSly|yzVSiipiiwVSiiiiiVSiwVSly|y{VSvyyztyy{VSzyziiivwyyyyui¸iijVSiwVSiiiiiwVSly|y|VSiwVSiiiiiwVSly|y}VSiiipVSwVSpiiiiiVSiwVSiii¸uiiwVSVSly|zyVSyy}y|z|VSyy{y|z{VSyyzy|zzVSpiiwVSiiiiiiVSiuVSiiiîiiuVSiIiiwVSly|zzVSi¸iiiiVSi¸iiiuipVSi¸iiiiiVS¼wVSly|z{VSiwVSipiiiuVSi¸VSly|z|VSuii¸iiiVSiiiiiiiVSkikwVSVSly|{yVSyy{y|{{VSyyzy|{ztyyzVSyyzuijpiiiVSiwVSpiijiii¸VSiiuiVSiijyy{yi¸ipiiVSiiiwwwVSpiiiiVSi¸uiwwwiuiiwVSuiiwVSiiiiVSiwwwwwwiiiwVSiiuiipVSiiiVSwVSiipiiuVSipiiVS½iwwwVSly|{zVSyy{yiui®uiVSiipiiVSiiiiwwwVSly|{{VSyy{yiiiVS»wVSipiiiiuVSipiiVSiiiiwpiiiVSwVSiiiiVSiiiiVSiwpiii¸uVSiiiipVSuipiiiVS¸iwwwtyytyy|VSVSVSly}yyVSyy~yyyztyy~yy{{y}yyyy{zyyyyVSiiiwzyztyyztyyy}VSyyzyiiijyzyVSVS \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/MazeS.pxe b/res/en/data/sprites_up/Stage/MazeS.pxe new file mode 100644 index 0000000..5103bc8 Binary files /dev/null and b/res/en/data/sprites_up/Stage/MazeS.pxe differ diff --git a/res/en/data/sprites_up/Stage/MazeS.pxm b/res/en/data/sprites_up/Stage/MazeS.pxm new file mode 100644 index 0000000..786595f Binary files /dev/null and b/res/en/data/sprites_up/Stage/MazeS.pxm differ diff --git a/res/en/data/sprites_up/Stage/MazeS.tsc b/res/en/data/sprites_up/Stage/MazeS.tsc new file mode 100644 index 0000000..990c0f2 --- /dev/null +++ b/res/en/data/sprites_up/Stage/MazeS.tsc @@ -0,0 +1 @@ +?FWXKFMW_::=AFPKS:::>FOXN-:;::FZ\SFPKY:::F^\K::>:D::CD:::?-:;:=FPVT:@B;D:;:?FS^T::;AD:;:>FZ\SFW]QVymuon8FXYNFOXN-:;:>FZ\SF]Y_::<;D::C:D::;?D:::C-:;:@FUOcF]Y_::;;FKXZ:;:@D::::D:::F^\K::>D:::?D:::C +-:;;:FPVT:A>:D:;;;FUOcF]Y_::;;FKXZ:;;:D::::D:::=D:?::D:::>D::;=-:;;;FUOcF]Y_::;;FKXZ:;;:D::::D:::=D::CD::;=-:;<:FUOcFPKY:::>F^\K::>:D::C>D::;AD;<::D::=BD::;@ \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/MiBox.pxe b/res/en/data/sprites_up/Stage/MiBox.pxe new file mode 100644 index 0000000..3fb5faf Binary files /dev/null and b/res/en/data/sprites_up/Stage/MiBox.pxe differ diff --git a/res/en/data/sprites_up/Stage/MiBox.pxm b/res/en/data/sprites_up/Stage/MiBox.pxm new file mode 100644 index 0000000..35422ed Binary files /dev/null and b/res/en/data/sprites_up/Stage/MiBox.pxm differ diff --git a/res/en/data/sprites_up/Stage/MiBox.tsc b/res/en/data/sprites_up/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/en/data/sprites_up/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Mimi.pxa b/res/en/data/sprites_up/Stage/Mimi.pxa new file mode 100644 index 0000000..94e8fc0 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Mimi.pxa differ diff --git a/res/en/data/sprites_up/Stage/Mimi.pxe b/res/en/data/sprites_up/Stage/Mimi.pxe new file mode 100644 index 0000000..5b68f62 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Mimi.pxe differ diff --git a/res/en/data/sprites_up/Stage/Mimi.pxm b/res/en/data/sprites_up/Stage/Mimi.pxm new file mode 100644 index 0000000..7fc90d8 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Mimi.pxm differ diff --git a/res/en/data/sprites_up/Stage/Mimi.tsc b/res/en/data/sprites_up/Stage/Mimi.tsc new file mode 100644 index 0000000..de5e265 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Mimi.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|z`cdaj``iels}```ilvqy````lu~t=:S``ia=:l}~qlv|z`cdaj``ifls}```ilvqy```alu~t=:S``ib=:l}~qlv|z`cdaj``igls}```ilvqy```blu~t=:S``ic=:l}~qlv|z`cdaj``ihls}```ilvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```ilvqy```dlu~t=:=:S``ie=:ls}``bhlvqy````lu~t=:S``if=:ls}``bhlvqy```alu~t=:S``ig=:ls}``bhlvqy```blu~t=:S``ih=:ls}``bhlvqy```clu~t=:S``ii=:ls}``bhlvqy```dlu~t=:=:=:S`a``=:lylv|z`cbdj`a`b=:lyz```aj`a`a=:l}w|^l~tlu~t=:S`a`a=:l``bblwya``alv|[`cbdlv|[`dda=:l}wPmqWP{m^l~tlwy````ls|luu`a`b=:S`a`b=:l``aals~`a``j````j````lvq```dlq```aj``idj``agj```h=:=:=:S`a`c=:lylvq````lq``aej``i`j``cfj``ad=:S`a`d=:lv|z`cbgj`aab=:lv|z`cf`j`aaa=:l{ul}wlvqs```iyWPz\l~t=:P]PP^l~tls|PPPP=:}P\PP=:PqP^l~tls|\PPPyP\=:Pol~tls|\PP=:PPPP=:\l~t=:PyWPPP=:PPPPW=:P^l~tlu~t=:=:S`a`e=:l{ulv|z`cf`j`a`fl``aalq~`a`ej````j```bluu`a`f=:S`a`f=:l{ulvq```dlq``adj``idj```ej```i=:=:S`a`g=:lyl``aals~`a`gj````j````lvq```dlq``aij``idj```gj``a`=:=:S`a`h=:lylvq```blq``agj``ibj```bj``aa=:=:S`a`i=:lylvq```dlq``b`j``idj``a`j```i=:=:S`aa`=:lylvq````lq``abj``i`j``eej```i=:=:S`aaa=:l{ulv|[`cbglv|[`ddcl}wlvqs```ioQl~t=:WPPol~t=:\PQl~t=:yWPPPP{=:PQl~tls|=:l}t````=:lq~`aaaj```hj````lqy`b`h=:lq~`aaaj````j```blqy``a`=:l``aalq~`a`gj````j```blqy``c`=:lt~`aaa=:l``aalq~`a`gj````j````lu~t=:=:S`aab=:lylvq```blq``afj``ibj```bj``ab=:=:=:=:S`b``=:lylv|z`cbbj`b`alv|[`cbbl``bbls~`b``j``baj````=:l}wPP^l~tlwya``bly[```blu[```bls|=:ls}``a`wPPm}PmQlqy`af`l~tl}luu`b`a=:S`b`a=:lyl}wWPP^^^l~tls|lPPPPPP=:P\PPP=:PPP^PPyP^l~tlu~t=:=:S`c``=:S`c`a=:l{ulv|z`cbcj`c`elv|[`cb`lv|[`cbc=:l}w^^^^^l~tls|=:l}r````lqy``e`l}t````ls~`c`aj``faj```blqy```hls~`c`aj``faj```d=:l}wlvqs```goPWPPPol~t=:yPPPP=:P^^^l~tls|yWP{^l~t=:yWPP]P=:P^l~t=:~PPP=:PP\PP=:PPP^l~tls|\PPP^l~tls|WPPPP\=:^l~t=:WPPP=:PPP^l~tlu~t=:=:S`c`b=:l{ulv|[`cb`lv|[`cbalv~`c`bj``afl}~qlvqy```dls}````lqy`a``=:l}wlvqs```gxPPPQl~tls|lvqs```h~QPyPWQl~tls|lvqs```gqPPP=:Pol~t=:WPPQ=:WPPPPQl~tls|lvqs```fWPPP^l~t=:yWPPPQl~tls|lvqs```g^^^l~t=:PPtP\=:PPWP=:PP^^^l~t=:yPPWPP=:\PPPP=:PP^l~tls|lvqs```fr^^^Pr^^^l~tls|lvqs```gP\PQl~t=:lvqs````ls|=:l}``acj``bb=:lqy``gelx}sls~`c`ij`ae`j```blq~`c`ij``a`j```blq``c`=:l}woQl~tls|=:lqy``a`=:lq~`c``j```fj```b=:lq~`c`aj```fj````=:lqy`a``=:lq~`c``j```fj```b=:lqy``h`=:lt~`c``=:ls}```i=:lv}``afl}slt~`c`ilu~t=:=:=:S`c`e=:l{ul}wlvqs```grPP^^^l~t=:PPPP=:P^l~tlu~t=:S`c`f=:l{ul}wlvqs```gwQl~tls|Ql~t=:WPPP=:PQl~tlu~t=:S`c`g=:S`c`h=:l{ul}t```blvqy```bls}````lqy``b`=:l}wlvqs```gwPPPQl~tls|lvqs```h~Ql~tls|=:lq~`c`gj```fj```blqy`0f`=:lq~`c`fj```fj```bl``aflqy`a``lt~`c`glv|]`cgals}```ilu~t=:S`c`i=:=:=:S`caa=:l{ul}wZPZl~tls|Ql~tls|=:l}r````lq~`caaj```bj```dlqy``c`l}t````=:lv|z`aefj`cac=:lv|z`ab`j`cab=:lv|z`cf`j`cad=:l}wQPPP^^^l~tls|ol~t=:\P^l~tls|PPPqWP\Pol~t=:WPPP^l~tls|P\P^l~t=:PWPPP=:RPtR^^^l~t=:tPPPP^^^=:tPPPP=:ol~tlq~`caaj````j```blu~t=:S`cab=:l}w\PP^l~tls|PPPP^l~t=:PPWPPP=:P^l~tlq~`caaj````j```blu~t=:S`cac=:l{ul}wyPPPPP=:qWP^^^l~tls|qPPPPP=:ol~tlq~`caaj````j```blu~t=:S`cad=:l{ul}wol~t=:WPPol~tls|\PWPP^l~t=:~PPPPPP=:PP^^^l~tlq~`caaj````j```blu~t=:=:S`d``=:l{ulv|]`aeelv~`d``j``aflvqy```dl}~qls}````lqy`a``lq~`f``j``aaj```b=:l}wlvqs```c|PPPPQl~tlq~`f``j````j```bls|lq~`fa`j````j````lvqs```gxPPQl~tls|WuPPP=:PQl~tls|PPPP=:PPPPP=:PPP^l~tlq~`f``j``aaj```bls|lvqs```cP]PQl~tlq~`f``j````j```bls|lvqs```gyPPWPPP=:\PyPPyWP=:PPPQl~tls|ls}```i=:lv}``aflqy``e`lu~t=:=:=:S`da`=:S`daa=:S`db`=:l{ulx}sls}````=:ls~`da`j``dbj```b=:ls~`daaj``gdj````=:lq~`fa`j````j````lqy`a``l}wlvqs```gPW^^^ol~tls}```ilvqy```dls|lvqs```bWP^l~tls|PtPPP=:PPPP=:PPP^l~tls|lvqs```i]]PPP=:PPoQl~tls|lvqs```bPP^^^=:^^^PPP^l~tls|lvqs```iqPWPPP=:PPPol~tls|lvqs```bqPPPyPP\=:WPPP=:^l~tls|PPPP=:WPP^l~tls|lvqs```iy^^^l~tls|yPPP=:\P^^^l~tls|lvqs```bPPP^^^=:qPPP^^^l~tls|lvqs```gyWPPP=:PQl~tls|=:lv|]`aedlv|[`aeg=:lvq```dlq```aj`fb`j```ej```h=:=:=:S`e``=:l{ul}wlPPPPPPPPPPPPjPPv=:PPPP|jPPPPjPw=:PPPPPPPPPPPtjPqWPxl~t=:lu~t=:=:S`e`a=:l{ul}wl=:PPPPPPPPPPPPPPPvl~tlu~t=:S`e`b=:l{ul}wl=:PPPPPPPPPPPPPPPPPl~tlu~t=:S`e`c=:l{ul}wl=:PPPPPPPPPPPPP}Pw=:PPPPPPPPPPPPPtQP~Pul~tlu~t=:S`e`d=:l{ul}wl=:PPPPPPPPPPPPPPqWPxl~tlu~t=:S`e`e=:l{ul}wl=:PPPPPPPPPPPPPPPqPxl~tlu~t=:=:=:S`f``=:lv|z`bbdj`f`b=:lv|z`cbej`f`a=:l{ulv|[`cbel[```bjf``b=:l}wlvqs```a\PyWP^^^l~tls|PWP=:PP}\=:PPP^l~t=:xPWP\l~t=:PPPP=:P}PP=:PPPP\l~t=:PPP=:P^l~tls|^^^^^l~tls|yP^l~tls|PWPPP=:Pol~tls|}PWPP=:P=:w^l~t=:vPPPP=:^l~tlu~t=:=:=:S`f`a=:l{ul}wlvqs```avPPP=:PP^l~t=:PPPPw=:PPP=:qWP^l~tlu~t=:S`f`b=:l{ul}wlvqs```axPPP=:Pol~tlu~t=:=:S`fa`=:lv|z`bbdj`faa=:l{ul}wlvqs```gPPPPP=:PPPP=:P^l~tlu~t=:S`faa=:l{ul}wlvqs```gP^^^l~tlu~t=:=: \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Momo.pxe b/res/en/data/sprites_up/Stage/Momo.pxe new file mode 100644 index 0000000..67cd58c Binary files /dev/null and b/res/en/data/sprites_up/Stage/Momo.pxe differ diff --git a/res/en/data/sprites_up/Stage/Momo.pxm b/res/en/data/sprites_up/Stage/Momo.pxm new file mode 100644 index 0000000..e58b14d Binary files /dev/null and b/res/en/data/sprites_up/Stage/Momo.pxm differ diff --git a/res/en/data/sprites_up/Stage/Momo.tsc b/res/en/data/sprites_up/Stage/Momo.tsc new file mode 100644 index 0000000..bad33d1 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Momo.tsc @@ -0,0 +1 @@ +nknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknkЁցƁƁnkƁƁǏnkɍ́ԏ΁ρЏnkƈԁӏnkŁЁƁnkԁȁՁnkӈԁƏnkՁƁƁŁnkԍƁŁЁnkƁӁƏnkЁƁŁƁŁnkƁƁǁƁŏځԁōnkՁƁ́֏ՁՈԁӁnkӁƏՁ؁΁nkρȁՍnkƁՁ́ՁnkЁƁӈԁƏnkψՁƁƁnkƁԁՍɏnknknknknkՁŁՁnkԁӏnk؍ЁŁƁnkǁƏnknknkՁŁnk؁ԏnkӁבϏ́ŁnkԁЁɁnkՏnknknknknknkՁŁnk؁ԏnkӁדϏ́ŁnkԁЁɁnkՏnknknknknknkƁցځՁؠڠnkӁōϏnknknkɍŁӏnkӁӁŏƍՁԁnkӁ؏nknkՁƁ̞nkȍƁȏnkԁՈԁnkȍՏƁԁȁnkԁψՁnkЁ́ɁԏnkՁɁaՁ́ύnkցŁƁƁnḱЁΏƁցɁƁЁӠnknknkŁցЁ́nkρŁɏƈԁԁōnkЁՁƈԁnkӏnknknkЁƁƁՍnḱŁځnḱӏnkǁցŁՁŁnkƁǁƁnkځƁՁƍnḱՁƁnkЁ́ɁՏƁȁƁ́nkӞnknknkЁƁƁՍnḱŁځnḱӏnkƁԁnkρƁԁՁnkƁ̏ƁȁƁ́nkӞnknknkƁ̏ŁӁnkρӞΏԁӈnkԁƁρՏnkψՁЁnkɁԏnknknkƁ̏nkŁӁƁӞՈԁƏځǁƁnkƁԏnḱԁځ̏nkՍŁցЁnkρρŁɏƈԁρӁnkƁՃnkЁƁԁρԏՁƈԁЁƁnkƁՁŁρnkӁՏnkƁŁ΁ƁnkՁǁƁՍnkƁψՁƁρӏnknknkƁ̏ŁցŁɠnkŁӁƁӞԁԁՍ́ՏnkԁԁƁnkƈԁЁŁǏΏƁԁŁnkՁӁǁځnkƁځƏ͍́nk؏nknknknḱցځɏՈ́ƁƁnkƁ΁ōnkЁځψՁցnkӁρՁŠnknknknknkЁցՁЁՠnknkɁŏnknknknknknkցρӁȁяnknknknkՏnknk \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/New.pxe b/res/en/data/sprites_up/Stage/New.pxe new file mode 100644 index 0000000..6407ae9 Binary files /dev/null and b/res/en/data/sprites_up/Stage/New.pxe differ diff --git a/res/en/data/sprites_up/Stage/Oside.pxa b/res/en/data/sprites_up/Stage/Oside.pxa new file mode 100644 index 0000000..d141dad Binary files /dev/null and b/res/en/data/sprites_up/Stage/Oside.pxa differ diff --git a/res/en/data/sprites_up/Stage/Oside.pxe b/res/en/data/sprites_up/Stage/Oside.pxe new file mode 100644 index 0000000..38e3b5d Binary files /dev/null and b/res/en/data/sprites_up/Stage/Oside.pxe differ diff --git a/res/en/data/sprites_up/Stage/Oside.pxm b/res/en/data/sprites_up/Stage/Oside.pxm new file mode 100644 index 0000000..03adc62 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Oside.pxm differ diff --git a/res/en/data/sprites_up/Stage/Oside.tsc b/res/en/data/sprites_up/Stage/Oside.tsc new file mode 100644 index 0000000..5572988 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Oside.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``belvqy````lu~t=:S``ia=:l}~qls}``belvqy```alu~t=:S``ib=:l}~qls}``belvqy```blu~t=:S``ic=:l}~qls}``belvqy```clu~t=:S``id=:l}~qls}``belvqy```dlu~t=:=:S`a``=:l{ulvq````lq``ebj``i`j``agj``a`=:=:S`ab`=:l{ul``aalq~`ab`j````j```blvq```dlq``eej``idj```ij```i=:l}wWP^^^l~tlu~t=:=:S`ac`=:l{ulyz``cbj`acal``aalq~`ac`j````j```blvq````lq``fij``i`j``aej```h=:S`aca=:l{uls}````l``aalq~`ac`j````j```b=:lwya`cbly]``cblv|[acg`l}wyWPQl~tls|=:lvq````lq``fij``i`j``aej```h=:=:S`ad`=:l{ulvq````l}t````lq``idj``i`j``adj```g=:=:S`b``=:lyl}wqPol~tlu~t=:=:S`d``=:l{ulv|z`if`j`d`al}wlvqs``a`yPWPP=:PPP\=:WPP^l~tlu~t=:S`d`a=:l{uls|lv~`da`j``aflqy``e`=:l}wlvqs``a`wPl}t````^l~tls|=:ls~`db`j`ae`j````lx}s=:lq~`d``j```cj````lqy``cb=:lq~`d``j````j```blqy``cb=:lq~`db`j``e`j````lqy``cb=:lq~`db`j````j```blqy``cb=:lt~`d``lt~0db`=:lq~`da`j``a`j```blqy`b``=:l}wlvqs``a`xPP^l~tls|lvqs````=:lq~`da`j``b`j```blqy`be`=:lq~`da`j``a`j```blqy`b``=:l}wqPPPPP=:PP^lqy`b``ls|rP\PPtP=:PPPP\P=:PPPPP^lqy`b``ls|PPPPP=:PPPPtW=:olqy`b``ls|lvq```buP\PPP=:PP^lqy`b``ls|\PPPP=:PP\PP=:PtWP\lqy`b``ls|PP{PP=:PPPPP^^^lqy`b``ls|ls}``bf=:lPPPPPPPPPPPPPPPP]PPuP]lqyiiii=:lu~t=:=:=:S`da`=:l{ul}ww^^^l~tlu~t=:S`db`=:=:=:S`f``=:l{ul}wPPPP=:^l~t=:PPPPPPP=:P^l~t=:yWPPyWPPP=:PPP^l~t=:PPPyPPP=:PP^^^l~tlu~t=:=: \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Ostep.pxe b/res/en/data/sprites_up/Stage/Ostep.pxe new file mode 100644 index 0000000..0d1e91e Binary files /dev/null and b/res/en/data/sprites_up/Stage/Ostep.pxe differ diff --git a/res/en/data/sprites_up/Stage/Ostep.pxm b/res/en/data/sprites_up/Stage/Ostep.pxm new file mode 100644 index 0000000..1732069 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Ostep.pxm differ diff --git a/res/en/data/sprites_up/Stage/Ostep.tsc b/res/en/data/sprites_up/Stage/Ostep.tsc new file mode 100644 index 0000000..80e6ef0 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Ostep.tsc @@ -0,0 +1 @@ +0==F=IZ[NISNV====IR[Q0==F>IZ[NISNV===>IR[Q0==F?IZ[NISNV===?IR[Q0==F@IZ[NISNV===@IR[Q0==FAIZ[NISNV===AIR[Q0=>==IXRfI`\b==>>IN[]=>==G====G===?ISN\====Ia_N==EBG==FCG==>FG==?F0=>>=IXRfI`\b==>>IN[]=>>=G====G===?ISN\===?Ia_N==EDG==FBG===AG==>>0=?==0=?=>0=F== IQ[]=F==IXRfIZfQ===?IZ`T]yrnr-xvyy-z-znr;I[\Qaun-v-ur-|{y-n-Zvrpn{-or-srrq;;;I[\Q;;;aur-|{y-n-|-n|vq-nr}rvv|{-|s-uv-ntrq;I[\QIPY_Z-znr4-{nzr-v-Onyy|;I[\QIPY_Uv-zntvp-}|r-unr-t|{r-vyq9n{q-{|-ur-pn{{|-rr{-qvr;;;I[\QIN[]=?=>G==>=G====ISY8>C?=IR[Q \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Pens.pxa b/res/en/data/sprites_up/Stage/Pens.pxa new file mode 100644 index 0000000..9afb486 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pens.pxa differ diff --git a/res/en/data/sprites_up/Stage/Pens1.pxe b/res/en/data/sprites_up/Stage/Pens1.pxe new file mode 100644 index 0000000..84e8440 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pens1.pxe differ diff --git a/res/en/data/sprites_up/Stage/Pens1.pxm b/res/en/data/sprites_up/Stage/Pens1.pxm new file mode 100644 index 0000000..04545f6 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pens1.pxm differ diff --git a/res/en/data/sprites_up/Stage/Pens1.tsc b/res/en/data/sprites_up/Stage/Pens1.tsc new file mode 100644 index 0000000..8c7acfc --- /dev/null +++ b/res/en/data/sprites_up/Stage/Pens1.tsc @@ -0,0 +1 @@ +öʥùöʥùöʥùöʥùöʥùʥùʥťť̶ťι¸ťùαöʥťť̶ťι¸ťùǾĥǶǾĥǶǾʥťĥǶǾʥʥťĥǶαȼڕ㣣ĹDZǗەڕ䡕ݡᣣĹDZȼڕܕ紱ÿٕ蕺܂磱ĹȠùαȼڕ㣣ĹǂǸܕ䕼㣣Ĺùαȼǂٕ䕼㣱Ĺùαȼǂ٣ĹùαȼǂٕٕڣĹùαȼڕ㣣ĹDZǂٕڕܕֱĹùαȼ裣Ĺùαȼ磱ĹűĹùαȼڕࣱĹڜࣱĹڜٕڕڕڣĹڕڡڜڕܕࣱĹڕڡڣĹǾڡ졂ڕە裱ĹڣĹùαȼڕڣĹùαʥť̶ť̶ťť̶ȼݣĹDZڕĹı̶ťȼ⣱Ĺڕٕڂ裱ĹDZĹıť̶ťʥťȼ֖ĹťǶٕ畷疱ĹDZݖĹıť̶ťȼڕ顕㴖ĹDZᡕڕ裱Ĺıťť̶ť̶ťʥť̶ťȼĹDZִĹı̶ť̶ť̶ť̶ȼܣĹǶٕەڕڕڕڣĹڕٕڕۂڣĹە⡂ݡڕقڕ裱ĹǺܕ裣ĹĂʥťť̶ťι¸ťùαȼڕڂܕڣĹەڕ܂㣣Ĺùαȼ壱Ĺڡڕ٣Ĺùαȼ݂֕㣣Ĺ䖕閱Ĺùαη̶ιťȼڕĹڕڕڣĹݕ塱ĹڕٕڕڕٕڕٕܣĹıť̶ťȼ疱ĹǸڕڕڂݕڕ䴱Ĺıť̶ťȼʥĹǂ磱ĹDZĹDZڡ磣ĹڕڕٕڣĹڕقڕٕ裱ĹťǂĹDZ鴱ĹDZڕڕuٕ⡕֕ەڣĹڕڕقڣĹڕڕڕٕڕڕٕڣĹǂڕٕڴĹ㡕ڂڜٕڕ紱ĹDZᡱĹڕڂە裱Ĺەڕڂڕ⣣Ĺǽ硕ڕٕڕ裱Ĺܕڕڕڂ塱ĹڜڕڕٕڣĹǂڕܕ崱ĹDZĹڜڕە֕ݕףĹıťť̶ť̶ťȼ꣱Ĺǂʥ䕾ȕڴĹDZ飣ĹڕەڕقڂٕٱĹ䣱ĹDZ鴖ĹDZٕٕ顱ťĹ镾ڂ裱ĹڕڕەٕڣĹDZ磱ĹڕٕڕقڣĹDZڣĹıť̶ťť̶ȼڕڕقܕ٣Ĺڣڕ٣ĹȠùαȼݕڕقڕ֕ڕ磱Ĺٕڕٕقڕڕۂ⣱ĹùαȼڕڕەڣĹǾ٣Ĺڂ飱ĹùαȼڕٕڣĹùαȼەٕەڂ衕ڜڕڕڕ죱ĹǾ֕ܕĹùαȼڕڕݕقڕ٣Ĺܕ꣣Ĺùťαιť̶ťťť̶ťť̶ť̶ťȼĹıť̶ȼꡕڣĹǣڕقڕٕ裱Ĺǣڕٜڕ裱ĹڕڂڣĹǾٕڕقڕڂ㕾ٕڕڣĹıť̶ťɠɦȼڕ맣̶Ĺıɥťȼڕٕ飱ĹǾەڕڕ㡱Ĺڕٕڕ٣Ĺ硱ĹٕڕٕڕڕڕڣĹڕڕڂٕڡĹڕٕڕڕܕݕ裱Ĺǂܕ꣱ĹڕݕٕڣĹĂȠùαȼڕڕݕقڕ٣Ĺܕ꣣Ĺùαȼڂ٣ĹڕڕڂڣĹùαʥĥǶǾȼڂܕ紱ÿĂαť¸̶ť̶ĥǶǾȼ䕼㴱ÿĂαť¸̶ť̶ĥǶǾȼڂٕڴÿĂαť¸̶ť̶ĥǶǾȼڂݴÿĂαť¸̶ť̶ĥǶǾȼڂ㴱ÿĂαť¸̶ť̶ĥǶαǶ \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Pens2.pxe b/res/en/data/sprites_up/Stage/Pens2.pxe new file mode 100644 index 0000000..b62ccd1 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pens2.pxe differ diff --git a/res/en/data/sprites_up/Stage/Pens2.pxm b/res/en/data/sprites_up/Stage/Pens2.pxm new file mode 100644 index 0000000..04545f6 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pens2.pxm differ diff --git a/res/en/data/sprites_up/Stage/Pens2.tsc b/res/en/data/sprites_up/Stage/Pens2.tsc new file mode 100644 index 0000000..6a2043a --- /dev/null +++ b/res/en/data/sprites_up/Stage/Pens2.tsc @@ -0,0 +1 @@ +~~µɤ¸~~µɤ¸~~µɤ¸~~µɤ¸~~µɤ¸~~~~~~Ͱɤ~ǻƷ۔ߢ˵~ؔ⢰˵~ƹ۔ᢰ˵Ɓ~ǻբø~ٔٳø~øäƵ~~Ͱǻ٢ø~ٔ㢰ø㠔⳰ø~ٔٔ볰ø~ؔٔ碰ø~ܔ鳰øäƵ~~Ͱǻٔڔ碰ø~ؔ܁~Քآø~ہ~賰øư۔~Ֆ˵ưƷ٢~⮔tٔø~۔碰ø۔~攖▢øƁ~ǻࠔہ~颰ø~٢øäƵ~~ͰĤǻø~~۔٢øƁ~ɤĤ˵ɤĤø~ðĤ˵Ĥ~ǻٔߢø~ٔ۔~颢øưܳ볰ø~Քøư؁~ٔ⢰øư賕øưؔٛٔ۔Ɂ~ٕøÁ~Ĥ˵äǻ~ٔ㕰øưܔ㠔蕰øƵ~¸~¸~~~~~~~ \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Pixel.pxe b/res/en/data/sprites_up/Stage/Pixel.pxe new file mode 100644 index 0000000..3364dd5 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pixel.pxe differ diff --git a/res/en/data/sprites_up/Stage/Pixel.pxm b/res/en/data/sprites_up/Stage/Pixel.pxm new file mode 100644 index 0000000..575bee6 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pixel.pxm differ diff --git a/res/en/data/sprites_up/Stage/Pixel.tsc b/res/en/data/sprites_up/Stage/Pixel.tsc new file mode 100644 index 0000000..fded528 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Pixel.tsc @@ -0,0 +1 @@ +QNgtt}tQNttuxttttQNgtt}uQNttuxtttuQNgtt}vQNttuxtttvQNgtt}wQNttuxtttwQNgtt}xQNttuxtttxQNgtt}yQNtttuQNQNgtuttQNtutt~tttt~tttvttuuQNtttxttx|~tt}x~tuyw~ttuzQNQNgtvttQNQNuxxu~tvtwQNuxxt~tvtvQNt|wy~tvtuQNddddrQNtxqt|qt|dddrQNQNgtvtuQNddddrQNdkddddQNQNgtvtvQNouxxyddddrdpddddQNddddrrrQNQNgtvtwQNddddrQNddddrQNQNgtvutQNQNgtvvtQNddddrrrQNgtvvuQNkddpdQNdrrruxxu~tvvwuxxy~tvvvQNgtvvvQNQNddddddttttouxxuqddQNdddQNrddddddQNdpdddQNdddqrdddddQNddddddQNdrQNrttutrttutrttutrttutrttutrttutrttutrttutttutddddQNetuztDddddddQNddpdddQNdddrttwtQNgtvvwQNdddQNdrrrQNQNgtvytQNQNuxxx~tvy{QNuxxw~tvyyQNuxxv~tvyxQNuxxu~tvywQNuxxt~tvyvQNt|wz~tvyuttu}QNgtvyuQNQNddddtttttttxttttttvtQNrrrrrQNtuttoutttQNtvutqt|wzouxxttttvQNtt{w~tt}y~ttuv~ttt}QNgtvyvQNdkdpdddQNdkddrQNgtvywQNddddddQNdttttQNouxxvtttutttttvtttttuQNtuytttvtQNrrrttuxttvyrrrrrtvzt~tttu~tttvttu}kdepdkddrrrttvydkdddQNdddrQNdddpQNdkdddQNdrrrddddQNdddkQNrQNttvtrrrtttttvzt~tttu~ttttQNttytQNdddrQNQNgtvyxQNdddddQNddrouxxwQNgtvyyQNQNddddddtvyzQNgtvyzQNtvzt~tvy}~ttttot|wzquxxtouxxxQNgtvy{QNdkddrQNQNgtvztQNQN \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Plant.pxe b/res/en/data/sprites_up/Stage/Plant.pxe new file mode 100644 index 0000000..2fe9f5b Binary files /dev/null and b/res/en/data/sprites_up/Stage/Plant.pxe differ diff --git a/res/en/data/sprites_up/Stage/Plant.pxm b/res/en/data/sprites_up/Stage/Plant.pxm new file mode 100644 index 0000000..2fe59c1 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Plant.pxm differ diff --git a/res/en/data/sprites_up/Stage/Plant.tsc b/res/en/data/sprites_up/Stage/Plant.tsc new file mode 100644 index 0000000..3117832 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Plant.tsc @@ -0,0 +1 @@ +YVo|||YV|}||||}||||YVo||}YV|}||||}|||}YVo||~YV|}||||}|||~YVo||YV|}||||}|||YVo||YV|}||||}|||YVYVo||YV||~||||YVo||YV||~|||}YVo||YV||~|||~YVo||YV||~|||YVo||YV||~|||YVYVo|}||YV||||||}}|||||||~}YVYVYVo|}|YVll±||||l±zYVo|}|YVw}|||||~|wlzYVYVo|~||YVlllzYVllñlzYVllllíl±llzLlllllñYVlzlñxlxlllÿzlŻllllñxYVllŻlllYVxlllŻll±lmllñlsl±lYVllõlzYVYVYVo|~~|YV}|~||~~}lzYVo|~~}YVslıllllmYVYVo|||YVYVw|}|YV|||YVlllzzz||}|}||w|||YVlllz|}|YVYVYVo|||YV||~~|||||}YV}||lllm|}|w|||YVllllmYVYV \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Pole.pxe b/res/en/data/sprites_up/Stage/Pole.pxe new file mode 100644 index 0000000..df67329 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pole.pxe differ diff --git a/res/en/data/sprites_up/Stage/Pole.pxm b/res/en/data/sprites_up/Stage/Pole.pxm new file mode 100644 index 0000000..e0b3f54 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pole.pxm differ diff --git a/res/en/data/sprites_up/Stage/Pole.tsc b/res/en/data/sprites_up/Stage/Pole.tsc new file mode 100644 index 0000000..d3da595 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Pole.tsc @@ -0,0 +1 @@ +CPPYP-*\mna\cmuPPPX\faiPPPP\end-*CPPYQ-*\mna\cmuPPPX\faiPPPQ\end-*CPPYR-*\mna\cmuPPPX\faiPPPR\end-*CPPYS-*\mna\cmuPPPX\faiPPPS\end-*CPPYT-*\mna\cmuPPPX\faiPPPT\end-*-*CPPYU-*\cmuPPPX\faiPPPQ\end-*-*CPQPP-*\pri\faoPPPP\traPPQRZPPYTZPPUSZPPSV-*-*-*-*CPRPP-*\key\fljQVTPZPRPQ\flKQVTP\souPPRR\cnpPRPPZPPRQZPPPP-*\msgo@@N\nod\gitPPPR\amKPPPRZPPPP\clr-*\cmuPPQPg@@]p@s]A\waiPQVP\nod\gitPPPP\clo\rmu-*\msg-*f@L@@NNN\faoPPPT\nod\traPPQXZPUPQZPPPRZPPPP-*-*CPRPQ-*\pri\msgeN\nod\end-*-*CPRQP-*-*-*CPSPP-*\key\msgJJ\nod\end-*-*CPSPQ-*\fljQVTTZPSPS-*\key\msgy@G@@@@i@L-*@_\nod-*s@@@@@-*i@@A\nod-*dL@@@@i@G@-*@@@@@-*i@NNN\nod\amjPPPRZPSPR\clri@G@@@A\nod-*j@@@@@@i-*G@@@@@-*@@@@@N\nod\clr-*aL@@@L@@@NNN\nod\end-*-*CPSPR-*\key\msg\cmuPPPP\mybPPPR-*heyAA\nod\clriG@that@@_A\nod\clr\gitPPPRw@@you@@@_A-*i@G@@@@A\nod\clrg@@A\nod\clr\cnpPRQPZPQUPZPPQR\waiPPQR\gitPPPP\hmc-*]p@s]@NNN\nod\clrpA\nod-*i@@G@@-* @@@N\nod\clr-*NNNNN\nod\clry@L\nod-*iG@@@@G-*@@@@-*N\nod-*t@@@@@G-*@@@@-*@@@N\nod-*t@@@@@@-*@@@@@-*@@@N\nod\clr-*\cmuPPPXhNNN\waiPPUP\clrw@i@@@@@@-*@@@@L-*@@@@@N\nod-*t@@@@@-*@@@@G-*NNN\nod\clr-*hNNN\nod\clri@@@@N\nod\clr-*y@@@@N\nod\cmuPPPP\faoPPPQ-*a@i@@L@@N\nod\clo-*\waiPQUP\faiPPPQ-*\fla\waiPPUP\tamPPPRZPPQSZPPPP\flKQVTT\flKPSPS\msg-*\cmuPPQP\msg\gitPPQS-*]p@s]@@@]s]A\smc\dnpPRQP\waiPQVP\nod\cmuPPPX\end-*-*CPSPS-*\key\msgi@@L@@@-*@@@@-*@@@@@N\nod\clri@@L@@L@-*@@@@@@-*@@N\nod-*f@@L@i@@@-*@@@@@N\nod-*t@@@@-*@i@@@@@-*@@@@@@N\nod\end-*-*CPSQP-*\key\msg\tur-*BoNB\nod\end-*-*-* \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Pool.pxe b/res/en/data/sprites_up/Stage/Pool.pxe new file mode 100644 index 0000000..86f833b Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pool.pxe differ diff --git a/res/en/data/sprites_up/Stage/Pool.pxm b/res/en/data/sprites_up/Stage/Pool.pxm new file mode 100644 index 0000000..5501c2d Binary files /dev/null and b/res/en/data/sprites_up/Stage/Pool.pxm differ diff --git a/res/en/data/sprites_up/Stage/Pool.tsc b/res/en/data/sprites_up/Stage/Pool.tsc new file mode 100644 index 0000000..c2347f1 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Pool.tsc @@ -0,0 +1 @@ +tqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtq̦ϓއٕtqێڇ̇̇ӇևtqˇׇՇَڇtqӇ̇̓ۦtq̇ˇׇ̇ۇtq·g֕tq̇ˇهˇׇtq̇Շٕ̇tq̇Վۇԇև̇tqϕtqՎۇއ̇̎tqȇȇۇ̇ڕtqtqtqtqtqtqtq·ڇՇ̇ەtqۇ̇هۤtqtqtqtqtqtqtqψtqtqtqtqtqtqtqtqtqtqtq \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Prefa1.pxe b/res/en/data/sprites_up/Stage/Prefa1.pxe new file mode 100644 index 0000000..2de6026 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Prefa1.pxe differ diff --git a/res/en/data/sprites_up/Stage/Prefa1.pxm b/res/en/data/sprites_up/Stage/Prefa1.pxm new file mode 100644 index 0000000..8c91db8 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Prefa1.pxm differ diff --git a/res/en/data/sprites_up/Stage/Prefa1.tsc b/res/en/data/sprites_up/Stage/Prefa1.tsc new file mode 100644 index 0000000..a01d1b7 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Prefa1.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{xǪÞ{x{x{x{xǪ{x{x{x{x{xǪҎώӎ܎{x{xҎӎݎҎ⭪Ǽ܎Ԏӎҕ{xҎӎӎ{xҚ⚪Ҏӎnݎ{xڎ✪ᚎӎ{x܎ӎԎՎ{xڎӎӎ܎ݎ{x᎞Ҏڎ䞜ݎ{xӎҎݎ{x܎Ԏ՜ێӎ܎ӎ䠜{xҎӎՎ֜ݎӎ܎܎{xڎۜ{xů{xҎӜů{x{x{x \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Prefa2.pxe b/res/en/data/sprites_up/Stage/Prefa2.pxe new file mode 100644 index 0000000..1e0eba9 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Prefa2.pxe differ diff --git a/res/en/data/sprites_up/Stage/Prefa2.pxm b/res/en/data/sprites_up/Stage/Prefa2.pxm new file mode 100644 index 0000000..674ad60 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Prefa2.pxm differ diff --git a/res/en/data/sprites_up/Stage/Prefa2.tsc b/res/en/data/sprites_up/Stage/Prefa2.tsc new file mode 100644 index 0000000..fd0ddf2 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Prefa2.tsc @@ -0,0 +1 @@ +YVo|||YV||||||||YVo||}YV|||||||}YVo||~YV|||||||~YVo||YV|||||||YVo||YV|||||||YVYVo|}||YVslzzzYV|}|||||||||~||}}|||||~||||||YVYVo|}}|YV|||YVw}}Lw}w}|YV|||||||}|||}YVYVYVYVYVYVo|~||YVlŻslll±lxYVll±lŻllllzlŻlíll±l||||YVw}|w}}w}~|||||||}|}||YV||||}||}}||~YVYVo|~|YVYVlsllzzzYVYV \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Priso1.pxe b/res/en/data/sprites_up/Stage/Priso1.pxe new file mode 100644 index 0000000..c28cec5 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Priso1.pxe differ diff --git a/res/en/data/sprites_up/Stage/Priso1.pxm b/res/en/data/sprites_up/Stage/Priso1.pxm new file mode 100644 index 0000000..6cc6e54 Binary files /dev/null and b/res/en/data/sprites_up/Stage/Priso1.pxm differ diff --git a/res/en/data/sprites_up/Stage/Priso1.tsc b/res/en/data/sprites_up/Stage/Priso1.tsc new file mode 100644 index 0000000..eeda7f0 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Priso1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``bilvqy````lu~t=:S``ia=:l}~qls}``bilvqy```alu~t=:S``ib=:l}~qls}``bilvqy```blu~t=:S``ic=:l}~qls}``bilvqy```clu~t=:S``id=:l}~qls}``bilvqy```dlu~t=:=:S`a``=:l{ul``aalt~`a``lvq````lq0`efj``i`j``h`j```i=:S`aa`=:l{ul``aalt~`aa`lvq```alq``fbj``iaj```gj``gd=:=:S`b``=:lq~`b``j```bj```blu~t=:S`b`a=:lq~`b`aj```bj```blu~t=:S`b`b=:lq~`b`bj```bj```blu~t=:S`b`c=:lq~`b`cj```bj```blu~t=:=: \ No newline at end of file diff --git a/res/en/data/sprites_up/Stage/Priso2.pxe b/res/en/data/sprites_up/Stage/Priso2.pxe new file mode 100644 index 0000000..31a9bcf Binary files /dev/null and b/res/en/data/sprites_up/Stage/Priso2.pxe differ diff --git a/res/en/data/sprites_up/Stage/Priso2.pxm b/res/en/data/sprites_up/Stage/Priso2.pxm new file mode 100644 index 0000000..445c3cd Binary files /dev/null and b/res/en/data/sprites_up/Stage/Priso2.pxm differ diff --git a/res/en/data/sprites_up/Stage/Priso2.tsc b/res/en/data/sprites_up/Stage/Priso2.tsc new file mode 100644 index 0000000..b14b583 --- /dev/null +++ b/res/en/data/sprites_up/Stage/Priso2.tsc @@ -0,0 +1 @@ +?kx{{{{x{{XUk{{{{x{{|XUk{{{{x{{|XUkkk{{x{{XUkkk{{{{x{{|XUkkkkÿ{{{{x{{|XUkkk<{{~|x{{XUk{{{{x{{|XUkk{{{{x{{|XUkk{{~}x{{XUkkk{{{{x{{~}XUkk{{x{{XU{|{{XUXU{{{XUxkkx{{{{x{{XUkkk{{{{x{{~}XUkkk{{{x{{XUkkk{{{{x{{~}XUkkĨ{{||x{{XUkk{{{{x{{~}XUkk{{|}x{{XUx{{~XUxkkx{{{{x{{XUkk<{{{{x{{~}XUkkźk{{~x{{XUk<>k{{{{x{{|XUkk{{{{x{{|XUkkk{{x{{XUkkk{{{{x{{|XUkkkkÿ{{{{x{{|XUkkk<{{~|x{{XUk{{{{x{{|XUkk{{{{x{{|XUkk{{~}x{{XUkkk{{{{x{{~}XUkk{{x{{XUx{{~XUxkkkx{{{{x{{XUkk{{{{x{{|XUkkk{{}x{{XUkkkk{{~x{{XUk>kkkŨ{{~x{{XUkk,k{{x{{XUkkk{{x{{XUkkkk{{x{{XUkkkk{{x{{XUkkk8k{{{x{{XUkkkk{{|x{{XUkkk{{x{{XUkkk{{x{{XUkkk8k{{}x{{XUkkkK{{~x{{XUkkk{{x{{XUkk,k{{x{{XUkkk{{|x{{XUkkk{{~x{{XUkk4k{{x{{XUkkk>{{}x{{XUkŬkk{{x{{XUkkkk{{{x{{XUkkwkk{{x{{XUkkkk{{x{{XUkkkk{{x{{XUkkkk{{x{{XUkkkk{{x{{XUk4kkkkk{{x{{XUkkŅkk{{|x{{XUkkkkĺĺ{{~x{{XUkkĺĺ{{}x{{XUk8kk{{x{{XUk8kźkE{{x{{XUkkkkk8{{x{{XUk>kk>k{{x{{XUkk,kûk{{x{{XUk>kk8k{{|x{{XUkk{{}x{{XUkk4k{{x{{XUkkkkk{{x{{XUkkk{{x{{XUkk4k{{~x{{XUk4kkk>k8{{x{{XUXU}{{{{|{{}{{{|{XUx{{{}XUkkkk{{x{{XUkkkk{{x{{XUkkkk{|{{x{{XUkkkkk{{x{{XUkkk{{x{{XU{}{{XUx{|{{XUv{{XUkkkk{{{{x{{~}XUx{{~XUk{{{{x{{|XUkk>kk{{{{x{{|XUkk{{|x{{XUk>{{{{x{{|XUkkk{{{{x{{|XUkk{|{x{{XUx,k{{{{x{{|XUkkkk{{{{x{{|XUkk{|{x{{XUkkkk{{{{x{{~}XUkkkv{|{x{{XUkk>k{{{{x{{|XUk8{{{{x{{|XUkkk{{~{x{{XUkkk{{{{x{{~}XUkkk{{{x{{XU>kkk{{{{x{{~}XUkkE{|{x{{XUkkkk{{{{x{{|XUkkk{{{{x{{|XUkkŬk4{{x{{XUkk{{{{x{{|XUkkk{{{{x{{|XUkk{{{x{{XUkk4kkk{{{{x{{~}XUkkk{{x{{XUkkk{{{{x{{|XUk{{{{x{{|XUkkkv{|{x{{XUkkkk{{{{x{{|XUk>kkk{{{{x{{|XUkkE{|{x{{XU}{{{{}{{~{{{}{XUx{{{}XUkk{{{{x{{~}XUkkk{|||x{{XUkkk{{{{x{{|XUkkk{{{{x{{|XUkk{||{x{|}XU{~{{XUx{{{XUv{{{XUkkkk{{{{x{{~}XUx{{~|XU{{~x{{~}XU{{~x{{~}XUk{{~x{{~}XU{{~x{{~}XUrk{{~x{{~}XUx{{~|XUĨ{{~x{{~}XUĨ{{~x{{~}XUĨ{{~x{{~}XUk{{~x{{~}XU{{~x{{~}XUx{{~|XUkk¹{{~x{{~}XUİkk{{~x{{~}XU¹k}{{~x{{~}XUĽ{{~x{{~}XUl{{~x{{~}XUx{{~|XUk|{{~x{{~}XUk}{{~x{{~}XUĽk{{~x{{~}XU{{~x{{~}XU{{~x{{~}XUx{{~|XUk¬Ĩ{{~x{{~}XU{{~x{{~}XUk{{~x{{~}XU{{~x{{~}XUrk{{~x{{~}XUx{{~|XUkĨ{{~x{{~}XUk{{~x{{~}XUĨ{{~x{{~}XU{{~x{{~}XU{{~x{{~}XUx{{~|XUk{{~x{{~}XUk¹{{~x{{~}XUk{{~x{{~}XUk{{~x{{~}XUkkk{{~x{{~}XUx{|{{XUv{{{XUkkk{{{{x{{~}XUv{{XUx{{~}XUkkkkkk{{~x{{{XUkkkk{|}}x{{{XU{||x{{{XU}kkkkkkk{{~~x{{{XUkkkkkk{|}{x{{{XUkkkkkkk{||x{{{XUkkk{|}~x{{{XUk{|}x{{{XUkk,{{{{x{{{XUx{{~XUkkky{|}x{{~}XUx{}{XUv{|}{XUkkk{{{{XUx{}{XUzXUXUXU}{{{Ε̦̦Βα΍ΚXU \ No newline at end of file diff --git a/res/es/data/Head.tsc b/res/es/data/Head.tsc new file mode 100644 index 0000000..c22f224 --- /dev/null +++ b/res/es/data/Head.tsc @@ -0,0 +1 @@ +}}}}żƺ`⡯·}}}żƺ}2岯ïԓԡ·}}}ż}ȣƺ}דԡ·}}ż}ȣƺ}דߓT⡯·}}}̯ƺ}2岯£ȣʴš·€}ʴ}ȣ̷ƺ}דԡ·¯ȯ}}}żǣ}ȣؓߓ气ʴ·ȯŸߓԀ}ԟf}ԡ·f}s·}}żƺ}ǣT擞·}}żƺ}ǣ`T擞·}}}̯ȣʴżʴȣ}ƺ}⡯·2岯€}£ʴ}}}̯ȣʴżʴȣ}ƺ}ؓ⡯·2岯€}£ʴ}}}̯ȣʴżʴȣ}ƺ}ؓfԓء·2岯€}£ʴ}}}ï}}}¯£ƶ}}}˭ס֓}b} \ No newline at end of file diff --git a/res/es/data/Stage/0.tsc b/res/es/data/Stage/0.tsc new file mode 100644 index 0000000..be08b99 --- /dev/null +++ b/res/es/data/Stage/0.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_idlSSSU_hqg0-FSS\V0-_pqd_fpxSST[_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_idlSSSW_hqg0-0-0-0-0-0-0-0-FSTSS0-_nh|_irpSSTY_zdlSTSS_htPSUXY_fuh_zdlSVWS0-0-_iomUSSS]STTS0-_iomTSUS]STST0-0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-FSTST0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-0-FSTSU0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSY_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSU[S_hyhSUSS0-0-FSTTS0-_vloSSTU_zdlSVXS_flo_zdlSSUS0-_vloSST[_zdlSVXS_flo_zdlSSUS0-_vloSSTW_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSSUS_hyhSUSS0-0-FSUSS0-0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSYTS_idrSSST0-_wudSSZW]STSS]SSST]SSST0-0-FSWSS0-0-FSXSS0-FSXST0-FSXSU0-FSXSV0-FSXSW0-FSXSX0-FSXSY0-0-FSXSZ0-FSXS[0-FSXS\0-FSXTS0-FSXTT0-FSXTU0-FSXTV0-0-#SYSS0-0-0-FTSTS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZX]STSS]SSUS]SSST0-FTSUSp0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZY]STSS]SSST]SSST0-FTSVS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZZ]STSS]SSST]SSST0-FTSWS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZ[]STSS]SSST]SSST0-FTSXS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS[\]STSS]SSST]SSST0-FTSYS0-_iomUSSS]TSYT_hyhTS\S0-FTSYT0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS\V]STSS]SSST]SSST0-0-FTS\S0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]STSS]SSSS0-_idlSSST0-_iomUSSS]TUSS_hyhTTSS0-0-FTTSS0-_zdlSZVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXSV]SVXU]SVSS_zdlSSUS0-_fqsSXSW]SVXU]SWSS_zdlSSUS0-_fqsSXSU]SVXU]SUSS_zdlSSUS0-_fqsSXSX]SVXU]SXSS_zdlSSUS0-_fqsSXST]SVXU]STSS_zdlSSUS0-_fqsSXSY]SVXU]SYSS_zdlSSUS0-_fqsSXSS]SVXU]SSSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTY0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0-0-FTUSS0-_zdlSWVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXTS]SVXU]TSSS_zdlSSUS0-_fqsSXTT]SVXU]TTSS_zdlSSUS0-_fqsSXS\]SVXU]S\SS_zdlSSUS0-_fqsSXTU]SVXU]TUSS_zdlSSUS0-_fqsSXS[]SVXU]S[SS_zdlSSUS0-_fqsSXTV]SVXU]TVSS_zdlSSUS0-_fqsSXSZ]SVXU]SZSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTX0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0- \ No newline at end of file diff --git a/res/es/data/Stage/Almond.tsc b/res/es/data/Stage/Almond.tsc new file mode 100644 index 0000000..104795c Binary files /dev/null and b/res/es/data/Stage/Almond.tsc differ diff --git a/res/es/data/Stage/Ballo1.tsc b/res/es/data/Stage/Ballo1.tsc new file mode 100644 index 0000000..79bf4ea --- /dev/null +++ b/res/es/data/Stage/Ballo1.tsc @@ -0,0 +1 @@ +||Ǣ||Ǣ||Ǣ||Ǣ||Ǣ|||˶Ļ|Ǣ|¢ɳŮ||¢Ǣ||||||||||¢˶|ˮŹᠮ|뒴堮ĺגc|גӒ|ג䞮_גے|גנľӒӒגe|Ӓגے|_|Ӡធ|ےӞגe|Ӓג|垒垮|ےӒ䠠ג_|ג_Ӓ[|堮_ӒrӞ|_גג[|ӒӠᠠļӒגe_|ےӒ|Ӡĺגג|ᠠķӒޒ|ӒӒ|ӒגےӠ˒ӞSד|ᠠ[|גӒƻ|Ǣ|¢|ž¢||||||¢||¢|¢|Ǣɳ|ɳ|ɳ|¢|||Ǣž|||||||Ǣɳ|Ǣɳ|ž|||ˮ|ɳ|Ƶij|| \ No newline at end of file diff --git a/res/es/data/Stage/Ballo2.tsc b/res/es/data/Stage/Ballo2.tsc new file mode 100644 index 0000000..96e8bcb --- /dev/null +++ b/res/es/data/Stage/Ballo2.tsc @@ -0,0 +1 @@ +qnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnɄńӒńńńqnɄɅ#EńńQqnńɄWqnɣӐӄӄMqnɄɄӄqnQńӒqnɒqn#MqnҒӒqnЄ֒qnqnqnqnqnńdqnqnqnqnqnɒqnɒqnӒqnׄńքׅqn̅qnqnQEׅqnЄ݄ӄӄݒqnׄӄńׅׄɅqnqnqnqnׅqnqnqnqnqn̅qnqn#ɄׄңqnӄӄMqnqnqnqnqn \ No newline at end of file diff --git a/res/es/data/Stage/Barr.tsc b/res/es/data/Stage/Barr.tsc new file mode 100644 index 0000000..87e9e4a --- /dev/null +++ b/res/es/data/Stage/Barr.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllltx}llllxIF_llumIFx}xllltx}lllmxIF_llunIFx}xllltx}lllnxIF_lluoIFx}xllltx}llloxIF_llupIFx}xllltx}lllpxIFIFIFIFIF_lmllIFxlormvlmloIFxlornvlmlmIFxlorlvlmlnIFxxllmmx}lmllvllllvlllnIFx}lllpx}llmmvllupvllpnvllqnIF_lmlmIFxx݊\\]xxIF_lmlnIFxx}lllpx}llmmvllupvllpnvllqnIF_lmloIFxx݊\\]xxIFIF_lmqlIF_lmqmIF_lmqnIF_lmqoIF_lmqpIFIF_lnulIFxloslvlnumxIF_lnumIFxlorlvllllxxx}lllt݌\%h\6]]xxlnulxmlllvllrovlllnxIFIF_lpllIFxxilormxilornIFxxlpllvllmnvllllx}lpllvllnlvlllpx}lmplIFxxx}lllq݁\\]xx}llllxxIFx}lmllxllmqIFxIF݀\\~]x}lmplxIFxllpqxlmqlvlllmvllllx}lllpIFxllpqxlmqmvlllmvllllx}lllpIFxllpqxlmqnvlllmvllllx}lllpIFxllpqxlmqovlllmvllllx}lllpIFxllpqxlmqpvlllmvllllIFxllltxIFIF_lqllIFIF_mlllIFxxglorlxglormxglpplxilonrx}]xxݏh\]]xxjjjjjx{xx~lllnx}llolxlllnxmlllvllrlvlllpxx}lllrjjj\\\IF\{xx݋]\\jxIF\)\jIF\\\\IFjxIF}\\\IF\\jIF}\\\\jjjxx\\\jIF\/\\\jxx݋]xIF݁\]xmllpxx\\\\){xIFݏ\\\]xxjjjjjxx~jjj\\\)IFjxIFxllll\\\IF\\\\\\IF\)\jjjxIF\\\jxxIFx}llllxllllIFx}llolxllnrIF<}mlllvllltvllllIFx}lmllvlllmvllllIFx}llmlIFxllllIFxmlllvllrlvllllIFx}lmllIFx}llolxllnrIFx}mlllvllltvllllIFx}lmllvlllmvllllIFx}llslIFx}llolxllnrIFx}mlllvllltvllllIFxlpllvllmuvlllnIFxlmllvllmtvlllnIFxlllpvllltvlltlIFxlllqvllltvlltmIFxlllrvllltvlltnIFxlllpvllluvllurIFxlllqvllluvllusIFxlllrvllluvllutIFIFIFx݄]x}llqlxlpllvllmnvlllnx}lpllvllolvlllnxxxllmmx}llmp})\]xxx}lllq݊\\\hIF\]xIFݐ\\\\IF]xx}llllx\\\\jxIFxlqllvllrsvlllnx}lmllx}lqllvllmovlllnx}llqlx}mlllvllltvllllxx}llmq\h\\)\IF\\%jxxx}lllq݉]xxݕ\\%\]xxx}llltݒii\IF\\h\\\)]xxx}llmqjjjjjxxx}llmr})\\6\\h\{IF\\\IFjxIF\\h\jxxx}lllrjjj\%{xxIF\\jxx}llllxIFx}lqllvllmqvlllnx}lmmlIFxxx}lllt}]xx}llmqx~jxIF\\\\\\jxxIFx}lqllvllnlvlllnx}llllxIFxx}llqlxx}lllt݊h\h\\ii]xx}llllxIFx}llqlIFx}lllqx݊\}\]xIFݏ\\\\IF\]xIFݕ\\\\\%\IF]xxjjjjjxx\\\\\{xIF\\\\)\IF\{xmllmx}lpllvllolvlllnxIFx}llmp݈\)]xxIFxglormxlllpxlpllvllrtvlllnx~lpllxIFIF_mllmIFxxilornxilormxllltxx}lllqjxIF~h\\\jxxx}lpllvllmlvlllnxIFIF \ No newline at end of file diff --git a/res/es/data/Stage/Blcny1.tsc b/res/es/data/Stage/Blcny1.tsc new file mode 100644 index 0000000..a40fde0 --- /dev/null +++ b/res/es/data/Stage/Blcny1.tsc @@ -0,0 +1 @@ +Taaja>;m|vmw}^bbjamw}^bbjbmw}\bbjcm~rmt~aadamwrzaaaamvu>;Taajb>;m|vmw}\bbjamw}^bbjbmw}^bbjcm~rmt~aadamwrzaaabmvu>;Taajc>;m|vm~rmt~aadamwrzaaacmvu>;Taajd>;m|vm~rmt~aadamwrzaaadmvu>;Taaje>;m|vmw}^bbjamw}\bbjbmw}^bbjcm~rmt~aadamwrzaaaemvu>;>;Taajf>;m|vmwrzaaaemvu>;>;>;Tabaa>;m|vmaabbmrabaakaaaakaaacmwraaad>;mz{aacdkababmraagdkaajdkaaajkaaae>;>;Tabab>;m|vmraaghkaajdkaaajkaaae>;>;>;>;Tabba>;mzmwraaacmraagekaajckaaabkaabb>;>;Tabca>;m|vmrabcakaaaakaaacmaabbmwraaaemraaggkaajekaabakaaai>;>;Ta1da>;mzm~xQQQQQ>;QQQQQQ___mumvu>;>;Tabjj>;mzm~xsQ_mumvu>;mwraaaew_mumt}mt~aaddmtvmrzjjjjmvu>;>;Tacaa>;m|vm~uaaaamuacaamrm~x҄QQQQQRmumvu>;>;Tacab>;mzm~xm>;QQQQQQQQQvQvQu]Qr~zxRmumvu>;>;Tacba>;mzmw}{bbjbkacbbmw}{bbjckacbc>;mzmwraaaem~uaaacmrzaafamraagckaajfkaaahkaahe>;Tacbb>;mzmwraaaem~uaaacmrzaafamraagckaajfkaahjkaahd>;Tacbc>;mzmwraaaem~uaaaamrzaafamraagckaajfkabbhkaagc>;>; \ No newline at end of file diff --git a/res/es/data/Stage/Blcny2.tsc b/res/es/data/Stage/Blcny2.tsc new file mode 100644 index 0000000..127566b --- /dev/null +++ b/res/es/data/Stage/Blcny2.tsc @@ -0,0 +1 @@ +fss|sPMptt|sptt|tntt|usst{ssssPMfss|tPMntt|sptt|tptt|usst{ssstPMfss|uPMsst{sssuPMfss|vPMsst{sssvPMfss|wPMptt|sntt|tptt|usst{ssswPMfss|xPMsu{s}ssts}sssssu{s}sstyPMssxsssswPMPMfstssPMssttstss}ssss}sssusssvPMssuv}ststssyv}ss|v}sss|}ssswPMPMfststPMssyz}ss|v}sss|}ssswPMPMPMPMfsttsPMsssussyw}ss|u}ssst}ssttPMPMPMPMfstusPMtv|v}stut䑲ccdPMfstutPMssswsstyssz|}ss|w}ssts}sss{PMPMPMfst||PMssvvcccdPMccccPMcqqqPMPMfsussPMsssssuss䖬ccc$cc$dPMPMfsustPMPM䈖ccocdPMPMfsutsPMtt|t}sutttt|u}sutuPMssswsssussxssszs}ss|x}sssz}sszwPMfsuttPMssswsssussxssszs}ss|x}ssz|}sszvPMfsutuPMssswssssssxssszs}ss|x}sttz}ssyuPMPMfsu{sPMPMfsu|sPMfsu|tPMfsu|uPMfsu|vPMfsu|wPMfsu||PMPMPMPMPMfsvssPMsvss}sstyPMss{ssu||}ssus}sssuPMssusPM䉸dssstssxsPMsu|t}sutz}sssssu|t}ssws}ssssssxsPMsu|s}ssss}ssssssusPMssu{䗨cPMdPMcccqqqqcc,cPM0ccPMqqqqCssssPMsu|t}ssxs}sssssstyPMssuucc6c$PMc$qqqPMsssssstyPMsstsPMsu|s}sssv}ssssPMsu|t}ssts}ssssPMsu|u}suz|}ssssPMsu|v}suz|}ssssPMsu|w}suz|}sssustssPMsu|t}sswu}ssssPMsu|s}ssss}ssssPMssu{cqqqssuuc=qqqPM䑲ccdPMsssvsstysssussy{}syss}ssuw}sstvPMPMPMfsvsxPMfsvsyPMfsvszPMfsvtsPMsssssst{ptt|sptt|tntt|ussssPMsvsx}sstt}sssuPMsu{s}ssts}ssssPMsvsx}sstyvsssv䓲c0dPM䆲ccccPMc$cddsu{s}sstyPMsvsx}ssvs}ssssssysPMsvsxptv|tPMfsvuspuPMPMfsvvsPMsvvssssssvus}ssss}sssuPMssxsPMsvus}sstyssstccc$cqPMccqPMccoccPMcc$d$cPM䖤ccccdPMsvus}ssss}ssssssxsPMsvus}ssvs}sssssstuPMsvus}ssws}ssssssxsPMptv|usstyPMPMfswssPMswssssvsssssPMsxss}suxw}ssssssstPMsxss}ssus}sssussstPMsxss}ssvs}sssussstPMsxss}sstyssus}ssvsPMsvszsu{sPMstssssswPMssuuPMccc$cqqqssu{ccqPM䗨cccc0dssswPMssvxssw|}tuss}ss|{}sssyPMPMfsxssPMPM \ No newline at end of file diff --git a/res/es/data/Stage/Cave.tsc b/res/es/data/Stage/Cave.tsc new file mode 100644 index 0000000..d2ff6d6 --- /dev/null +++ b/res/es/data/Stage/Cave.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:S``ii=:ls}```hlvqy```dlu~t=:=:=:S`a`a=:lyls~`a`aj````j````l``aalvq```clq``acj``icj``a`j```c=:=:S`a`b=:lylv|z`c`bj`a`dlv|z`c`aj`a`cl}woQl~tlu~t=:S`a`c=:lylvq```b=:lv|[`c`blv|[afdalv|[afdb=:l}t```blq``ahj`e`bj``0bj````=:S`a`d=:l{ulvq```blq``aaj``idj```hj```f=:S`aa`=:l{ulvq```dlq``i`j``ibj```gj```i=:=:=:S`ae`=:l{ul}t````ls}```hlvqy```d=:lqy``c`=:l``abls}``e`j``cej``fglqy``b`=:l``abls}``e`j``cfj``fglqy``b`=:lu~t=:=:S`b``=:lu~t=:S`b`a=:lu~t=:=:S`d``=:lyl``bblt~`d``ls}``af=:l}wlwya``fsP=:msPPumQlqy`af`l~tl}l}|[```c=:уPP[cQl~tlu~t=:=: \ No newline at end of file diff --git a/res/es/data/Stage/Cemet.tsc b/res/es/data/Stage/Cemet.tsc new file mode 100644 index 0000000..1ea18a8 --- /dev/null +++ b/res/es/data/Stage/Cemet.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{x{x{x{xǪÞ{x{x{x{x{x{x{x-[-ݭ{x{x-ӎ׎{xOݭӚnaܚ{xݎ܎ݎώӎϜ{xݚώӎӜŸ™-ώӎhݭ{x{x{x{xώώӎ{xݎݎ܎ώOϨ[ώڎӎ{xڎ܎ݎϜ{xޟ™ӎώӎӎ૏ů{xê{x{x \ No newline at end of file diff --git a/res/es/data/Stage/Cent.tsc b/res/es/data/Stage/Cent.tsc new file mode 100644 index 0000000..cc64241 --- /dev/null +++ b/res/es/data/Stage/Cent.tsc @@ -0,0 +1 @@ +\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y\Yr\Y\Y\Yr\Y0ooo´@\Yr\Y\Yqðo²ijq}\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y\Y\Y\YWddmdA>pupzadfjgpwdddfpzu}ddddpyxA>WddmeA>pupzadfjgpwdddfpzu}dddepyxA>WddmfA>pupzadfjgpwdddfpzu}dddfpyxA>WddmgA>pupzadfjgpwdddfpzu}dddgpyxA>WddmhA>pupzadfjgpz~dghenddmmpwdddfpzu}dddhpyxA>A>WddmmA>pwddflpzu}dddhpyxA>A>WdeddA>p}pddeepxdeddpzudddhpudddjnddmhndeemnddekA>A>A>A>WdfddA>p}~dddlndfdfA>pyp{TTTA>TTbpxpz~dfhendfdepyxA>WdfdeA>p{TTTTTA>TbbbpxpwA>pz~dfjenddddpu}ddgdpz_dfjepz_dfjgA>pudgddndddgndddfpu}ddhipudgddnddddndddfpxddddA>p{`TT!TA>TTspxpwTT!TTA>qTTqTTA>TTTbpxpyxA>WdfdfA>pyp{}eddlp{󅩝TTTqTTqsp~ddddpwA>pz_dfegp}adddlA>pudfddnddednddddpu}ddgdpzudddhA>pudddjnddmmndef4nddeeA>A>WdfedA>p}p}~ddgknddempz~dfjgndfeepyyddemA>WdfeeA>pyp{A>󅩝Tsp~ddddpzudddhpwddddpu}ddfdpwbbbbbp}_ddgkpxpwA>pdgddnddefndddjnddddpudgddnddednddddA>pu}ddidA>p}_edddpddfdpxdddfp{A>Tbpxpwppzu}dddhpyxA>A>A>WdgddA>p}~dddlndgdfA>pz~dfjendgdeA>pz~dfhendgdgA>pyp{|Upxpw|TTTT`A>TTspxpyxA>WdgdeA>pyp{TTTA>TqTTqbpxpwTTqTTqA>TTbpxA>vTTTTUpxpyxA>WdgdfA>pyp{|TA>qTTqsUpxA>}!Upxpw'TTTTTA>`TTTA>TTTbpxpyxA>WdgdgA>pyp{|UpxpwT!`TTTA>TTTbpxA>yTTspxpyxA>A> \ No newline at end of file diff --git a/res/es/data/Stage/Clock.tsc b/res/es/data/Stage/Clock.tsc new file mode 100644 index 0000000..a1c2f57 --- /dev/null +++ b/res/es/data/Stage/Clock.tsc @@ -0,0 +1 @@ +b_xb_b_xb_b_xb_b_xb_b_xb_b_b_xb_b_b_xb_b_uȺuǺb_xb_Ub_uuuĻǺȺʾɺub_Hºu¶ʒvb_xb_BuuuȸǾăɺuķuuuǾuub_ɺ¾öHÃuǾuuĹub_źɾǺuȾɶvb_b_ \ No newline at end of file diff --git a/res/es/data/Stage/Comu.tsc b/res/es/data/Stage/Comu.tsc new file mode 100644 index 0000000..7cbdadb --- /dev/null +++ b/res/es/data/Stage/Comu.tsc @@ -0,0 +1 @@ +öʥùöʥùöʥùöʥùöʥùʥùʥùʥùʥùʥùǾʥťĥǶαȼ֕ڕڕ֕֕ڂ磣Ĺڕ֣Ĺ֕䡕ޕ裣ĹǷ䡕Vւhڕ֣Ĺùαȼ䣣ڕ磣Ĺڕ䡂硕֕䣱Ĺڕڕᕹ磱ĹΕ֡䣣ڂ֣Ĺùαȼڕւ֕ڕ磱Ĺڕu֣Ĺ֕֕V֣֕Ĺùαȼ硕ڂ䡕h֕ڣĹǺbڂ֕֕ڕڕւڕ裱Ĺᕹ硕裣֣֕Ĺڕ֕֕֕ڕ裱Ĺb֕䡱Ĺ䕶h^䣱Ĺڕւ֣֕Ĺ֕^Ĺڕڕᕹ֕䡕ڂ^ڣĹùɿαȼ䟕ؖĹ裱Ĺùαɦȼ4ᕲڕֲÿıɥɢť̶ȼ裣ĹDZɥ ʥ̶ֲ֕Ĺıʱťùαťù \ No newline at end of file diff --git a/res/es/data/Stage/Cthu.tsc b/res/es/data/Stage/Cthu.tsc new file mode 100644 index 0000000..acf830e --- /dev/null +++ b/res/es/data/Stage/Cthu.tsc @@ -0,0 +1 @@ +>;Taaja>;m~rmt~aaaimwrzaaaamvu>;Taajb>;m~rmt~aaaimwrzaaabmvu>;Taajc>;m~rmt~aaaimwrzaaacmvu>;Taajd>;m~rmt~aaaimwrzaaadmvu>;Taaje>;m~rmt~aaaimwrzaaaemvu>;>;Tabaa>;mzmwraaaemraaackaajekabcfkaaac>;Tabab>;mzmaabbmuababmwraaaemraaackaajekabcfkaabc>;>;>;>;Tacaa>;m|vmw}{1cjakacabmw}\bcjam~x_mumt}QQQQp>;QQQ___mu>;u$QQQpmumt}_____mumt}Qp>;yQQQpmu>;{QQ___mumvu>;Tacab>;m|vm~xs]QQQQ>;Q]QQ_mumvu>;>; \ No newline at end of file diff --git a/res/es/data/Stage/Cthu2.tsc b/res/es/data/Stage/Cthu2.tsc new file mode 100644 index 0000000..a928112 --- /dev/null +++ b/res/es/data/Stage/Cthu2.tsc @@ -0,0 +1 @@ +ROhuu~uROuuu}uuuuROhuu~vROuuu}uuuvROhuu~wROuuu}uuuwROhuu~xROuuu}uuuxEROhuu~yROuuu}uuuyROROhuvuuROuuuyuuy~uu~yuvw{uuuwROhuvuvROuuuyuuy~uu~yuvw{uuvwRORO \ No newline at end of file diff --git a/res/es/data/Stage/Curly.tsc b/res/es/data/Stage/Curly.tsc new file mode 100644 index 0000000..15b86b2 --- /dev/null +++ b/res/es/data/Stage/Curly.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|z`cdaj``iels}```blvqy````lu~t=:S``ia=:l}~qls}```blvqy```alu~t=:S``ib=:l}~qls}```blvqy```blu~t=:S``ic=:l}~qls}```blvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```blvqy```dlu~t=:=:S``ie=:ls}``bhlvqy````lu~t=:S``ii=:ls}``bhlvqy```dlu~t=:=:S`a``=:l{ulv|z`efaj`a`bl``aalq~`a``j````j```b=:lvq```blq``a`j``ibj```cj``ab=:S`a`a=:l{ulv|z`efaj`a`bl``aalq~`a`aj````j```b=:lvq```dlq``cbj``idj```hj```i=:S`a`b=:lyl}w~PPQl~tlu~t=:=:=:=:=:S`b``=:l{u=:lv|z`efdj`b`d=:lv|z`efbj`b`f=:l}w~PPPP^l~tlu~t=:S`b`a=:l{ul}wPPPPs^l~t=:PPP\P=:PPP^l~t=:щPPP}sxQl~tlu~t=:S`b`b=:lv|z`bgcj`b`e=:l{ul}wPPPP\=:PPP^^^l~tlu~t=:S`b`c=:l{ul}w^^^l~tls|^^^=:P^^^P^^^l~tlu~t=:S`b`d=:l}w|PPzP=:PPPt^l~t=:uPPP^l~tls|PP^^^l~tls|^^^l~tls|^^^uP*PPP=:Pt^^^ol~tlu~t=:S`b`e=:l{ul}w~PP=:PPP^l~tls|q*PPPP^^^l~t=:PsPPPP=:PP^l~tlu~t=:S`b`f=:l{ul}wuPPPol~t=:xPPPPz=:PPP^l~tls|\PP^l~tls|PPPPP\=:PPP=:PPPPPPP^l~tlv|[`efdlu~t=:=:=:=:S`c``=:l{ult~`c``l}}`l}t````ls}````=:lv|[`efal}wqQl~tls|l{u=:lq~`e``j```cj```blqy``gilq~`e``j````j```b=:l}wlvqs``aiQl~tls|=:ls~`ca`j`abbj```blt~`b``lqy``a`=:ls~`caaj`abbj```blt~`b`alqy``a`=:ls~`cabj`abbj```blt~`b`blqy``a`=:ls~`cacj`abbj```blt~`b`cl}wфPPyyq~uQl~tls|щPPPP=:PPQl~t=:рPQl~t=:|P}PPP=:Ql~t=:|P}P=:QQl~tls||PPP\P^^^l~tls|=:lqy``b`l```dls~`d``j`aahj```blt~`e``=:lqy``a`=:l}wuPPPQl~tls|рPPQQl~tls|=:lr|`d``=:ls}```d=:lq~`d``j``a`j```b=:lq~`ca`j``a`j```b=:lq~`caaj``a`j```b=:lq~`cabj``a`j```b=:lq~`cacj``a`j```b=:lu~t=:=:=:S`ca`=:S`caa=:S`cab=:S`cac=:=:=:=:S`d``=:l{ul}t`d``=:lv|]`efalv|]`efe=:lq~`ca`j``b`j```e=:lq~`caaj``b`j```e=:lq~`cabj``b`j```e=:lq~`cacj``b`j```e=:ls~`d``j`aagj```e=:lq~`d``j```ej```elqy```b=:lq~`d``j``c`j``0dl``g`=:lqy`a``lyls}``ael}w=:цQlqy`ad`ls}````l~tls|=:l{ulq~`d``j```fj```elqy```bly=:lqy``e`ls}```b=:l}wlvqs``b`*P^^^l~t=:~PPP^^^l~tls|PPPP=:PPP}\l~t=:PPP^l~z`da`ls|P^^^l~tls|P^^^l~tlyls|=:lvq```dlq``bij``i`j``abj```i=:=:S`da`=:l{ulv|[`efbl}wlvqs``aiQl~tlvqs````ls|=:lq~`d``j``a`j````lqy``e`=:l}wlvqs``aiPPP=:PP}ol~tls|uPP\Pў=:PPPQl~tls|Ps^=:sPr^l~t=:sPP\=:PPP!^l~tls|lvqs``be~PP=:PP^^^l~t=:P\PPP^l~tls|lvqs``b`u^^^P=:P]}P=:PP^^^l~tls|=:luu`dae=:=:S`dae=:l{ul}wlvqs``ai\P^l~tls|uPuPP=:PPP!=:^l~t=:}PPP=:Pol~z`db`lv|[`efclvqs````ls|=:lq}```bj```dj`a``lwy```buPPmuPm^l~tls|=:ls}``a`lwy```dsPPmqmQlqy`af`l~tl}ls|=:lvq```dlq``bij``i`j``abj```i=:=:S`db`=:l{ul}wlvqs``aitPol~tls|r\PPP=:#\PP^l~tlyls|l}t````=:lvq```dlq``bij``i`j``abj```i=:=:=:=:=:S`e``=:l{u=:lv|z`efcj`ec`=:lv|z`efbj`eae=:l}wlvqs``aixol~tls|\PPPP=:^P}Pq^l~tls|PP=:PP}ol~z`ea`ls|lvqs``b`P^^^l~tls|P^^^l~tlu~t=:=:S`ea`=:l{ulv|[`efbl}wlvqs``aiQl~tls|PPP=:PP}ol~tls|uPP\Pў=:PPPQl~tls|Ps^=:sPr^l~t=:sPP\=:PPP!^l~tls|lvqs``be~PP=:PP^^^l~t=:P\PPP^l~tls|lvqs``b`u^^^P=:P]}P=:PP^^^l~tls|=:luu`eae=:=:S`eae=:l{ul}wlvqs``ai\P^l~tls|uPuPP=:PPP!=:^l~t=:}PPP=:Pol~z`eb`lv|[`efclvqs````ls|=:lq}```bj```dj`a``lwy```buPPmuPm^l~tls|=:ls}``a`lwy```dsPPmqmQlqy`af`l~tl}lu~t=:=:S`eb`=:l{ul}wlvqs``aitPol~tls|r\PPP=:#\PP^l~tlu~t=:=:S`ec`=:l{ul}wlvqs``be|PPP=:PQl~t=:|P}P#P=:PP^l~tlu~t=:=: \ No newline at end of file diff --git a/res/es/data/Stage/CurlyS.tsc b/res/es/data/Stage/CurlyS.tsc new file mode 100644 index 0000000..2349b89 --- /dev/null +++ b/res/es/data/Stage/CurlyS.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPPP\faiPPPP\end-*CPPYQ-*\mna\cmuPPPP\faiPPPQ\end-*CPPYR-*\mna\cmuPPPP\faiPPPR\end-*CPPYS-*\mna\cmuPPPP\faiPPPS\end-*CPPYT-*\mna\cmuPPPP\faiPPPT\end-*-*CPQPP-*\pri\souPPQQ\dnpPQPP\faoPPPT\traPPRYZPPYTZPPPVZPPPY-*-*-*CPTPP-*\key\souPQPU\msgaA\nod\fljPUVTZPTPQ\end-*CPTPQ-*\itjPPQTZPTQP\clrq @-*@_\ynjPPPP\clr-*\cnpPTPPZPQSVZPPPP\flKPUXP\gitQPQT\itKPPQTc@@]m]N\nod\clo-*\flKSPPP\flMSPPQ\flMSPPR\flMSPPS\flMSPPT-*\flKPRWT\end-*CPTQP-*\pri\msgs@@@N\nod\end-*-*CPTRP-*\key\dnpPTRP\msg\gitQPSU\itKPPSUe@-*]b@@c]N\nod\end-*-*-* \ No newline at end of file diff --git a/res/es/data/Stage/Dark.tsc b/res/es/data/Stage/Dark.tsc new file mode 100644 index 0000000..2a953ed --- /dev/null +++ b/res/es/data/Stage/Dark.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq``a`j``idj``gcj``bg=:=:S`d``=:lyl}wl`a`ewQPl`a`ewQPl0a`ewQl~tlyz``adj`da`ls|PP=:Pol~z````ls|=:ls~`d``j`acfj````lv|[`fa`lwya`adly[``adsPPm}m^l~tlv|[`bgdls|=:lv|]c```lv|]c``alv|[c``blv|]c``clv|]c``d=:lu~t=:S`da`=:lyl}w#PPP^l~tlu~t=:=: \ No newline at end of file diff --git a/res/es/data/Stage/Drain.tsc b/res/es/data/Stage/Drain.tsc new file mode 100644 index 0000000..a55167a --- /dev/null +++ b/res/es/data/Stage/Drain.tsc @@ -0,0 +1 @@ +b_xb_b_xb_b_xb_b_xb_b_xb_b_b_xb_b_b_xb_b_xb_uȺuǺb_b_xb_b_b_xb_ȸʸuuþuuʶb_κùuuăb_uuʺǶuuuɺȁb_ķºɺuĹBuŶȶǃb_xb_b_b_b_xb_Ub_b_b_b_ʾuuuǾĔb_b_b_b_uĹuŶȶuuBb_úuʺuȺʾb_˶϶ùăb_b_b_b_b_b_b_xb_b_xb_uuHÃuȶȃb_b_b_b_b_b_b_b_b_ \ No newline at end of file diff --git a/res/es/data/Stage/EgEnd1.tsc b/res/es/data/Stage/EgEnd1.tsc new file mode 100644 index 0000000..f196b79 --- /dev/null +++ b/res/es/data/Stage/EgEnd1.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswsssu}ss|w}su|z}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/es/data/Stage/EgEnd2.tsc b/res/es/data/Stage/EgEnd2.tsc new file mode 100644 index 0000000..c6570d7 --- /dev/null +++ b/res/es/data/Stage/EgEnd2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswssw|}ss|w}su|y}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/es/data/Stage/Egg1.tsc b/res/es/data/Stage/Egg1.tsc new file mode 100644 index 0000000..69a64a0 --- /dev/null +++ b/res/es/data/Stage/Egg1.tsc @@ -0,0 +1 @@ +_\u_\_\u_\_\u_\_\u_\_\u_\_\_\u_\_\_\u_\RļƳrrƻrųĻ_\³ijrųƻȳrrŵǶ_\u_\}ŷƳƷr_\ļƳrrƻ_\ŵǶrųƻȳ_\u_\rŵǶr3rųƻȳ_\_\ \ No newline at end of file diff --git a/res/es/data/Stage/Egg6.tsc b/res/es/data/Stage/Egg6.tsc new file mode 100644 index 0000000..ebedf2c --- /dev/null +++ b/res/es/data/Stage/Egg6.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq```bj0`idj`agij``a`=:=:S`b``=:lylv|z`ad`j```alv|[`ad`l``bbls~`b``j``baj````=:l}wxPPP^l~tlwya``gly[```gls|ls}``a`sP=:mPPym^lqy`af`l~tl}lu~t=:=: \ No newline at end of file diff --git a/res/es/data/Stage/EggR.tsc b/res/es/data/Stage/EggR.tsc new file mode 100644 index 0000000..932a451 --- /dev/null +++ b/res/es/data/Stage/EggR.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPPX\faiPPPP\end-*CPPYQ-*\mna\cmuPPPX\faiPPPQ\end-*CPPYR-*\mna\cmuPPPX\faiPPPR\end-*CPPYS-*\mna\cmuPPPX\faiPPPS\end-*CPPYT-*\mna\cmuPPPX\faiPPPT\end-*-*CPQPP-*\pri\faoPPPT\traPPPRZPPYTZPRRPZPPPW-*-*CPQUP-*\key\msgh@ @@N\nod\end-*-*CPRPP-*\key\msge@@N\nod\clr\turc@@@L@@-*@@@@@nN@PPN\nod\clr\turc@@@@@@ -*@@@@@NNN\nod\end-*-*CPSPP-*\pri\fljPRPPZPPPQ\flKPRPP-*\souPPRR\cnpPSPPZPPRQZPPPP-*\msgh@@@N\nod\clr\evePPSP-*-*-*CPUPP-*-*CPUPQ-*\pri\msS\turh@@d@c@nN@PQ-*eZ@c@@@N-*s@@N\nod\end-*CPUPR-*\pri\msS\turh@@d@c@nN@PR-*c@N\nod\end-*CPUPS-*\pri\msS\turh@@d@c@nN@PS-*c@N\nod\end-*CPUPT-*\pri\msS\turh@@d@c@nN@PT-*c@N\nod\end-*CPUPU-*\pri\msS\turh@ d@c@nN@PU-*c@N\nod\end-*CPUPV-*\pri\msS\turh@@d@c@nN@PV-*eZ@c@@@N-*s@@N\nod\end-*CPUPW-*\pri\msS\turh@@d@c@nN@PW-*c@N\nod\end-*CPUPX-*\pri\msg\turh@@d@c@nN@PX-*c@N\nod\end-*CPUPY-*\pri\msg\turh@@d@c@nN@PY-*c@N\nod\end-*CPUQP-*\pri\msg\turh@@d@c@nN@QP-*c@N\nod\end-*CPUQQ-*\pri\msg\turh@@d@c@nN@QQ-*c@N\nod\end-*CPUQR-*\pri\msg\turh@@d@c@nN@QR-*c@N\nod\end-*CPUQS-*\pri\msg\turh@@d@c@nN@QS-*c@N\nod\end-*CPUQT-*\pri\msg\turh@@d@c@nN@QT-*c@N\nod\end-*CPUQU-*\pri\msg\turh@@d@c@nN@QU-*c@N\nod\end-*CPUQV-*\pri\msg\turh@@d@c@nN@QV-*c@N\nod\end-*-* \ No newline at end of file diff --git a/res/es/data/Stage/EggR2.tsc b/res/es/data/Stage/EggR2.tsc new file mode 100644 index 0000000..19c2b2d --- /dev/null +++ b/res/es/data/Stage/EggR2.tsc @@ -0,0 +1 @@ +?FWXKFPVT:?C?D::C?FUOcFMW_::;;FPKS:::>FO`O:<::-::C?FWXKFMW_::;CFPKS:::>FOXN-:;::FZ\SF]Y_::;;FNXZ:;::FPKY:::>F^\K::;:D::C>D::=?D::<@-:<::FUOcFWcN::::FKXZ:>::D::=:D::::FW]QFPKM::;>Vk*vvko*nov*kvwkmxIFXYN`kk6*Q\KMSK]6*xy~oxk}*zy|*{*wyvo}~k|~o+FXYNck*yvo|owy}*k*o|xy}+FXYNFMV\FPKM::;=O}zo|k++FXYNFMVYFKXZ:>::D::=:D:::::D::;:D:::FS^7::;>FW]QFPKM::;=Yyrrr888FXYN*888^IFXYNFPKM::::FMVYFaKS::?:FMXZ:<<:D:;==D::::FaKS::?:FW]QFQS^;:;>FPKM::::Vo*ns}~o*vk*GWk}my~kG8FXYNFQS^::::FMXZ:=::D:;=:D::::FNXZ:>:;FPV7:FMV\FPKM::;=Vk*vvko888FXYNWo*rkx*|ylkny*vk*vvko888FXYNZy|*pky|8Nolo}*no~oxo|vy}8FXYNFMV\Zvkxokx*oxp|omo|*k*vy} +Wswsqk}**}yv~k|vy}ox*vk*}zo|psmso8FXYNFMV\Yr6*}888FXYN[s*~o*sx~o|o}o*vvok|~oo}~y888FXYNFQS^;:;?FS^5::;?FMV\FPKM::::FMW_::;:Myx}oqs}~o*x*GP|k}my*no*]kvnG+FaKS:;@:FXYNF\W_FMV\FPKM::;=Zono}*}k|*o}~y*xk6zo|y*}vy*xk*o6*zk|k|o}~k|k|*~*oxo|qk8FXYNFOXN-:<=:FUOcFPVT:B=:D:<=;FW]QFPKM::;=Zy|*pky|+FXYNNolo}*no~oxo|vy}+FXYNFMV\Zvkxokx*oxp|omo|*k*vy}Wswsqk}**}yv~k|vy}ox*vk*}zo|psmso+FXYNFOXN-:<=;FUOcFS^T::;?D:<=<FW]QFPKM::;=Kr6*soxo}*ox*xlox*wywox~y8FXYNFQS^;:;?FS^5::;?FMV\FPKM::::\omsls}~o*x*GP|k}my*no*]kvnG+FaKS::=:FXYNFQS^::::FMV\FPKM::;=`ovo*}s*kvqxko*xomo}s~k}*y~|y8FXYNO}*vy*woxy}*{o*o}~kkxmskxk*zono*rkmo|888FXYNFOXN-:<=<FUOcFW]QFPKM::;=Sxmv}y*xk*l|tk*mywy*yoxotomo**}o*nolsvs~k888FXYNVy*xsmy*{o*zony*rkmo|kry|k*o}*zy}k|*~ynk}ws}*o}zo|kxk}*ox*~s888FXYNFOXN-:=::FUOcFW]Q4qswy~oy4888FXYNFOXN-:>::-:>:; \ No newline at end of file diff --git a/res/es/data/Stage/Kings.tsc b/res/es/data/Stage/Kings.tsc new file mode 100644 index 0000000..9ed7131 --- /dev/null +++ b/res/es/data/Stage/Kings.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlvqy````lu~t=:S``ia=:l}~qlvqy```alu~t=:S``ib=:l}~qlvqy```blu~t=:S``ic=:l}~qlvqy```clu~t=:S``id=:l}~qlvqy```dlu~t=:=:S`a``=:l{ul}~qlqy``e`lvqy```a=:lq~`c``j``a`j```0lqy``ig=:lq~`c``j```aj````lqy``e`=:lq~`c``j``b`j````lqy``fd=:lq~`c``j```aj````lqy``af=:lq~`c``j``c`j````lqy``e`=:lq~`c``j``d`j````lqy``ig=:lvq```alqyiiii=:=:S`c``=:=: \ No newline at end of file diff --git a/res/es/data/Stage/Little.tsc b/res/es/data/Stage/Little.tsc new file mode 100644 index 0000000..456ef9a --- /dev/null +++ b/res/es/data/Stage/Little.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_:::FWXKFMW_:::FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::FWXKFMW_::;CFPKS:::>FOXN +-:;::FZ\SFPKY:::-:;:;FZ\SFPKY:::;F^\K::=CD::C;D:::>D::;@-:<::FZ\SFW]QO}*x*|yly~8Y*kv*woxy}*vy*{o*{onk*no*v8FXYNFOXN \ No newline at end of file diff --git a/res/es/data/Stage/MazeI.tsc b/res/es/data/Stage/MazeI.tsc new file mode 100644 index 0000000..86fc6b0 --- /dev/null +++ b/res/es/data/Stage/MazeI.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_::;CFPKS::::FOXN-::C;FWXKFMW_::;CFPKS:::;FOXN-::C<FWXKFMW_::;CFPKS:::FWXKFMW_::;CFPKS:::>FOXN-:;::FZ\SFPKY:::>F^\K::;:D::C>D:<<;D:<:=FZ\SFW]QXy*}o*kl|o888FXYNFOXN-:<:=FZ\SFPKY::::F^\K::=BD::C:D::=?D::;=-:<:>-:<:?-:=::FZ\SF]Y_::<::FUOcFKXZ:?:;D::;:D::::<FUOcFPVT:@>;D:>:=FW]Q[so|o}*kl|s|*vk*zo|~kIFcXT::::FMVY +FPV5:@>;FPYX:<:FaKS:;?:F]Y_::>=FKXZ:<:>D::;:D::::FaKS:::BFKXZ:?:FNXZ:<:?FPYW::=:=FUOcFW]QZo|~k*klso|~k8FXYNFOXN-:>;:-:?::FZ\SFW]Q]oq|y*{o*Ws}o|*~o*rk*~s|knyk{8FXYNZyl|oms~y888FXYN}~o*o}*ov*o|~ono|y*no*vk*s}vk8FXYN_xk*o*ox~|k}6xxmk*ovo}*k*}kvs|888FXYNFOXN-:?:;-:?:<FZ\SFW]QOv*sx~o||z~y|*{o*kl|o*o}~kzo|~k*nolo*o}~k|*kvv*k||slk8FXYNZo|y*ov*mkwsxy*o}*kvqy*mywzvsmkny8FXYNWo*ro*mkny*k*~kx~k}*omo}{o*wo*ro*|y~y*vk}*zso|xk}8FXYNFOXN-:?:=FZ\SFW]QXy*rk*|o}zo}~k8FXYNFOXN=AD*WkoS******:@>:*7*:@?C:@>:D:@>;DT:@>**3+6GH;6=GO***26@;C***+6?H>**3,6GH;6=GO***26@FD*10+4**3/6@;C***,6?H>**3-6GH;6=GO***26@;C***-6?H>**3.6GH;6=GO***26@;C***.6?H>**3/6;HJ*-**4**,*4****6@;C***,6?H>*+**6E?S6@FD*10-4*+*+6MIO**++6;HJ*+**4****4***,6@;I****6GS>****6NL;**.-4**3*4**+04**+-*+*+6JLC6GMAHim_[\l_6HI>6?H>*++*6@FD*10.4*+++6?H>*+++6E?S6@;I***.6GS>***,6NL;**./4**3,4***,4***/*,**6JLC6@FD*,*+4*,*+6GMA;faoc_hf_b[jo_mnioh_h][hni(Him_[\l_(((6HI>6?H>*,*+6@FD*1004***+6@F%*1006@F'*10/6@F%*,*,6MIO**,,6=HJ*,**4**,+4****6GMAB[m[\c_lni_f]i`l_(6HI>6=FL6N;G***/4**+*4****6=GO**+*6ACN**+*NomGcmcf_mb[hmc^ijin_h]c[^im6Q;C*+0*6HI>6LGO6?H>*-**6E?S6@FD*10.4*-*-6@FD*10,4*-*,6@FD*10+4*-*+6@F%*10+6GMA6@;=**+3;d6HI>G_jl_aohn[\[]oh^ip_h^l[m(6HI>6=FLMc]ihm_aocgimgip_l_mn[al[hli][&ji^l_gimff_a[l[f[m[fc^[(6HI>6=FLMch_g\[lai&b[slogil_m^_ko_nl[m_ff[_mn_fhc^i^_ohgihmnloi(((6HI>;mko_^_\_l[m_mn[ljl_j[l[^i(6HI>6=FL>_ni^[m`ilg[m&^_mb[agihim^__mn[]im[^_oh[p_t(6HI>?gjod[jil_m_f[^i(6HI>6=FI6;HJ*-**4**,*4****6?H>*-*+6E?S6;HJ*-**4****4****6GMA6@;=**+3I]oll_[fai96HI>Hi_mn[lm[momn[^i&p_l^[^96HI>6=FL>o^iko_fi_mnm(6HI>P_ha[&_gjod[jil_m_f[^i(6HI>6;HJ*-**4**,*4****6?H>*-*,6JLC6GMAHcm_b[chgon[^i(6HI>6?H>*-*-6JLC6GMA6@;=**+3P[gim6HI>6=FLB[sohhc^iff_hi^_gihmnloim_mj_lh^ihim6HI>6?H>*-+*6E?S6=HJ*-+*4**+,4***.46;HJ*-+*4**2*4***/6MG=6=GO**+/6GMA>_llin[mn_[<[flia6Q;C*+.*6HI>6=FI6@;=****6=GO***26@;I***.6GS>***,6NL;**..4*0**4***34**+.6?H>*-,*6E?S6@FD*10,4*-,,6@FD*10+4*-,+6?P?*/***-,+6E?S6GHJ*-,*4****4****4****6GS>***,6GS>***-6GMA6@;=**+3Jl_j[l[^i9?gjod[6HI>6=FI6@;=****6;HJ*-**4**,*4****6Q;C**/*6GMALLLLAB6HI>6=FI6@;=****6=HJ*/+*4*--.4****6=HJ*/++4*--.4***,6Q;C*+**6GMA6@;=**,*(((((6HI>6=FI6@;=****6;HJ*-**4****4****6Q;C**/*6GS>***,6GMA6@;=**,/Him_b[gipc^ih[^[(6HI>Hi]l_iko_[faohi^_fim^imm_[][j[t^_gip_lf[(((6HI>6@;=****6=FI6Q;C**/*6GMABott[b6=GO****6HI>6=FI6=HJ*-+*4***34***,6Q;C*+**6=HJ*-+*4**+,4***,6;HJ*-+*4**-*4***,6=GO**++6GS>****6GMA6@;=**+3N6HI>6=FL6@;=**+.Dididi6HI>6=FL;mko_m_aompcpim6HI>6=FLHimfi_mi&mchiko_n[g\chchn_hncmm[fcl^_fF[\_lchni6HI>6=FLHi^_\_l[cmko_^[lim]igifib[l[oh\o_hli\in96HI>6=FLHchaohi^_himinlimjo_^_b[]_l`l_hn_[f>i]nil&sgo]big_himpiminlim(6HI>6=FLA_hc[f&jo_m6HI>Pis[jih_lf_`ch[_mni6HI>6=FL?mj_liko_hiimcgjiln_ko_im]ihpc_ln[_h]b[n[ll[6HI>6=FL6@;=**+3Domni[koc_h_mn\[gim\om][h^i6HI>Jo_^_m_gjod[ljil_f]_hnli&jil`[pil96HI>6@;=****6=FI6=GO****6Q;C*+**6;HJ*-+*4**0*4***,6Q;C**.26;HJ*-+*4**/*4***,6Q;C**,*6;HJ*-**4**,*4****6Q;C**,*6GS>***,6GS>***-6GMA6@;=**+3Jl_j[l[^i9Ohi&^im(((6HI>6;HJ*-+*4**2*4****6GS<***,6;HJ*-**4**-*4****6MIO**1,6=FL6@;=**,-;=;MIG??MNCM?M=O=B;H>I96HI>6;HJ*-+*4****4****6=GO***.6=HJ*-+*4*+034****6*-,,6JLC6?H>*--**/**6E?S6@FD*10,4*/*,6@FD*10+4*/*+6GMA?moh[al[hsj_m[^[li][(6HI>Nl[m_ff[jo_^_mm_hncl_fpc_hnimijf[h^i(6HI>J[l_]_ko_m_h_]_mcn[l[h[fg_him^imj_lmih[mj[l[gip_lf[(6HI>6?H>*/*+6E?S6Q;C**+*6;HJ*-**4****4****6GMA6@;=**,*Ji^l[m_gjod[lf[^_m^_gm[f_rnl_gi96HI>6=FI6;HJ*-**4**,*4****6?H>*/*,6JLC6GMA?moh[al[hsj_m[^[li][(6HI>6?H>*/+**/++*0**6E?S6@F'*10-6@F%*10.6@F'*10*6MG=6=GO***26=HJ*--*4**+,4***,6;HJ*-**4****4***,6GHJ*-,*4****4****4****6@;C***.6GMA6@;=***/Na[h[m(((6HI>6=FLIm[so^[l[gip_lf[li][(6HI>J_lil_]il^[^(((6HI>6;HJ*--*4****4****6=FLHif_^cacm[H;>C?ko_imb_[so^[^i(6HI>6=FL6@;=**+3Nom_]l_ni_mn[m[fpi]ihhiminlim6HI>6@;=****6=FI6;HJ*--*4**0*4****6Q;C**.*6;HJ*--*4**/*4***,6Q;C**,*6GS>***-6;HJ*-**4**,*4****6GMA6@;=**+3Jl_j[l[^i9?gjod[6HI>6=FI6@;=****6;HJ*/**4**+*4****6Q;C*+**6;HJ*--*4**2*4***,6;HJ*-**4****4***,6;HJ*/**4**,*4****6GS>***,6GMA6@;=**,-A[[[[bbbb6Q;C**/*6=FI6@;=****6;HJ*--*4****4***,6Q;C*+**6GMA6@;=***/;bil[&l_]il^[^(6;HJ*-**4****4****6HI>Hif_^cacm[h[^c_&j_lih[^c_&h[^c_&ko_imb_[so^[^i(6HI>6=FL6@;=**+3Hifib[l_gim6HI>6=FI6@;=****6;HJ*--*4**+*4****6Q;C*+0*6=HJ*,**4**+/4***,6Q;C**.*6GMA6@;=**+3Hi]l_iko_m_[n[hg[fi^_mjom^_ni^i(6HI>6=FI6@F%*12+6@F%*10/6=HJ**+04**+04***,6?H> \ No newline at end of file diff --git a/res/es/data/Stage/MazeW.tsc b/res/es/data/Stage/MazeW.tsc new file mode 100644 index 0000000..f85658d --- /dev/null +++ b/res/es/data/Stage/MazeW.tsc @@ -0,0 +1 @@ +FC\iiriFCuzu|iilpuziiiiu~}FC\iirjFCuzu|iilpuziiiju~}FC\iirkFCuzu|iilpuziiiku~}FC\iirlFCuzu|iilpuziiilu~}FC\iirmFCuzu|iilpuziiimu~}FCFC\ijiiFCuuziiikuziilqsiirksiiinsiiilFCFC\ijijFCFC\ijikFCuuiijju}ijikuziiimuziimisiirksiiimsiiinFCFC\ijilFCuioqjsijinFCuiijpsijimFCuugu}u~}FC\ijimFCuuiikkujijpudioqjFCuYYvYYY|&vgu}u|u~~ijinFC\ijinFCuuiijju}ijiluziiiiuziimjsiirisiijnsiiirFCFC\ijioFCu~uiijjuzijiosiiiisiiikuziiimuziimksiirmsiiinsiii9FCFC\ijjiFCuipmisijjjFCu~uiijjuzijjisiiiisiiikuziiikuziimlsiniisiiimsiijlFC\ijjjFCu~uiijjuzijjisiiiisiiikuziiikuziimlsiirksiiimsiijlFCFC\ijkiFCu~uziiimuziimisiirmsiijksiiikFCFCFCFC\iliiFC\ilijFCu}iliju{ziiijufioqiu~}FC\ilikFCu}iliku|iiipu{ziijiu|iliisiijlsiiiiu{iiiiu~}FCFC\jiiiFCu~u{iiiisiijouzikniu|iiiiFCulu|iijnFC}YYYguiijouzijoiu}u|u|iilpFCu|iliisiiiisiiiiudioqiu~}FCFCFC\jkiiFCu~uzjkiisiikisiiikFCujkiisiijouziiijFCuzijiiuziiijuziimpsjkiisiilqsiijoFCFC \ No newline at end of file diff --git a/res/es/data/Stage/MiBox.tsc b/res/es/data/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/es/data/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/es/data/Stage/Mimi.tsc b/res/es/data/Stage/Mimi.tsc new file mode 100644 index 0000000..d4e8bae --- /dev/null +++ b/res/es/data/Stage/Mimi.tsc @@ -0,0 +1 @@ +`]v`]`]v`]`]v`]`]v`]`]v`]`]`]v`]`]v`]`]v`]`]v`]`]v`]`]`]`]v`]`]`]Ŵ`]v`]~~`]ƴǸssɸssǻŐ`]v`]`]`]`]v`]`]v`]`]`]s`]sƸsss@ǴsȸǴsɴs`]Ǹżsss`]<¸sǻsƶƴs`]ốsȸsyyyv{~{{{|{{{{{{}{{{{XUXUn{~{{XUzzyyXU>kkkĞyXUxkkk}{|{kxXUXUXUn|{{{XUXU \ No newline at end of file diff --git a/res/es/data/Stage/Statue.tsc b/res/es/data/Stage/Statue.tsc new file mode 100644 index 0000000..9c01cd0 --- /dev/null +++ b/res/es/data/Stage/Statue.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSSSS_idlSSSS_hqg0-FSS\T0-_pqd_fpxSSSS_idlSSST_hqg0-FSS\U0-_pqd0-_dqsSUSS]SSSS]SSWS0-_dqsSUST]SSSS]SSVS0-_dqsSUSU]SSSS]SSUS0-_iomTXVW]SS\X0-_dqsSUSV]SSSS]SSSS0-_fpxSSSS_idlSSSU_hqg0-FSS\V0-_pqd_fpxSSSS_idlSSSV_hqg0-FSS\W0-_pqd_fpxSSSS_idlSSSW_hqg0-0-FSS\X0-_dqsSUSV]SSSS]SSTS_zdlSSST0-_dqsSUSS]SSTS]SSWS0-_dqsSUST]SSTS]SSVS0-_dqsSUSU]SSTS]SSUS0-_dqsSUSV]SSTS]SSTS0-_idlSSSU_hqg0-0-0-FSTSS0-_nh|_vrxSSTT_dqsSTSS]SSSS]SSSU0-_idrSSSS_iomTXVW]STST0-_fpxSSUW_wudSS[W]SS\S]SST\]SSUT0-#STST0-_wudSS[X]SS\Y]SST\]SSUT0-0-FSUSS0-FSUST0-FSUSU0-FSUSV0-0-FSUTS0-_nh|_iomTX\S]SUUS_pvj_wxu0-~CkC_qrg_hqg0-FSUTT0-_nh|_iomTX\T]SUUT_pvj_wxu0-~CdC_qrg_hqg0-FSUTU0-_nh|_iomTX\U]SUUU_pvj_wxu0-~CpC_qrg_hqg0-FSUTV0-_nh|_iomTX\V]SUUV_pvj_wxu0-~CiCgC_qrg_hqg0-0-FSUUS0-_nh|_pvj_wxu0-~CtC_qrg_hqg0-FSUUT0-_nh|_pvj_wxu0-~CwC_qrg_hqg0-FSUUU0-_nh|_pvj_wxu0-~CnC_qrg_hqg0-FSUUV0-_nh|_pvj_wxu0-~CfCeC_qrg_hqg0-0-0-FSVSS0-_nh|_pvjQQQQQ_qrg_hqg0-0- \ No newline at end of file diff --git a/res/es/data/Stage/Stream.tsc b/res/es/data/Stage/Stream.tsc new file mode 100644 index 0000000..645dbd8 --- /dev/null +++ b/res/es/data/Stage/Stream.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_xqlSSST_p|gSSSU_idlSSSU_evoSSSS_hqg0-FSS\V0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSW_hqg0-0-FSS\X0-_fpxSSUV_idlSSSS_hqg0-0-FSTSS0-_nh|_idrSSST_fvv_wudSSWZ]SS\T]SSS[]SSS\0-0-FSUSS0-#SUTS0-0-0-FTSSS0-_nh|_erdTSSS0-_dqsSUSS]SSTS]SSSS0-_dqsSUTS]SSTS]SSSS0-_zdlSVSS_idrSSSU0-_xqlSSSS_fvv_hyhTSST0-0-FTSST0-_lwmSST[]TSTS_ioNSTYS_hyhTSSU0-0-FTSSU0-_fpxSSSS_iomS[VY]TSSV_hyhTSTS0-0-FTSSV0-_ioPS[VY_iomS[XT]TSTS_ioNTSWU0-_hyhTSTS0-0-FTSTS0-_qfmSVVY]TSTT0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0-FTSTT0-_lwNSSVY0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0- \ No newline at end of file diff --git a/res/es/data/Stage/Weed.tsc b/res/es/data/Stage/Weed.tsc new file mode 100644 index 0000000..37f84ab --- /dev/null +++ b/res/es/data/Stage/Weed.tsc @@ -0,0 +1 @@ +nknknknknknknknknknknknknknknknknknknknknknknknknknknknk ԁӁƁӠnknknknknkBЏnknknknknknknknknknkBЏnknkƁƁžnknknknknknknknknknknknknknknknkƁƁBЏnkƃBnkρnknkƁƁƁƞnknknknknknknknknknknknknknknkƁnknknk́ӝnknknknknknknknknknkƁƁƁžnknknknkЏ ρЁƁƠnkNƁNnkЏЍ͏nknknknknknkԁЁ́ƏnkƁЁƁžnknknknknknknknkԁԁЁϏnkρЁnkƁnkʁԁӁƁρnkӍBԁƁnk́ӏnknkJƁƁρЏʁԁ́TρƁnkԁρӁƁnkBԁBԁԏnknknkʁԁӁӁNnkρЁρԁNԁnkЁƁρƏnknknkЁƁNnkƁƁЁnknknknknknknkЁƁƏnknknknknknknknkNԁρJԁnḱЏnkڂNԁρρЏnk ԁƠnkƁNӁƁNԂƁЏnkԁЁƁaJЁρ́Џnk ԁӁځӁnkρ nknk ƁŠnknknkӁӏnk"Ɓnknk J ЁƁnk nk͏nknknkЁƁnkƁӁnknkʁЁƁnkƁӁnkTЁӁTЁnkԏnknknk J ԠNNӏnk NƁBԁnkԁԠ ԁЁƁƁƠnkρЏnkƁЏnkƁƁƁƞρŏnkρƁƃnkƁƁӁTϏnkNЁρʍЂnknk N ԁ nknknknkЁƏnknknkЁƏnknknknkƁ́ОnknknknknknknkԁЁ́ƏnknknknkƁnkBƁNžnkŁBnknknknknknk РnknknknknknknknknkʁƁԁЁnkЁƁƁʁnkӁԏnkƁʁЁʁnkNƁӁ́ЏځЁƁnknknkρʁƍځnknkJnknknknknknknkɂԁƁƁʁ‚nkԁЁƁƁžԂnknknkρЏnkЁЁʏnknknknknknkԍЍnk ԁԁnk nknk NRӠnknk ԁӁРnknknknknknkЁƁNnknknknknkЁЁnknknknknknknknknk \ No newline at end of file diff --git a/res/es/data/Stage/WeedB.tsc b/res/es/data/Stage/WeedB.tsc new file mode 100644 index 0000000..3db9db0 --- /dev/null +++ b/res/es/data/Stage/WeedB.tsc @@ -0,0 +1 @@ +|y|yğ|y|yğ|y|yğ|y|yğ|y|yğ|y|y|y¾ğ|y|y|yğ|y|y¶Xo|yݏۏޝ|y|y¶ݏ\ޝ|y|y¶Н|y|y|y|y¾ğ|y¶ޏۏԝŴ|y|y|yğ|y|y \ No newline at end of file diff --git a/res/es/data/Stage/WeedD.tsc b/res/es/data/Stage/WeedD.tsc new file mode 100644 index 0000000..b7a9dfa --- /dev/null +++ b/res/es/data/Stage/WeedD.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIF_lmllIFxxllmm;m|vmw}^bbjamw}^bbjbmw}\bbjcm~rmt~aadamwrzaaaamvu>;Taajb>;m|vmw}\bbjamw}^bbjbmw}^bbjcm~rmt~aadamwrzaaabmvu>;Taajc>;m|vm~rmt~aadamwrzaaacmvu>;Taajd>;m|vm~rmt~aadamwrzaaadmvu>;Taaje>;m|vmw}^bbjamw}\bbjbmw}^bbjcm~rmt~aadamwrzaaaemvu>;>;Taajf>;m|vmwrzaaaemvu>;>;>;Tabaa>;m|vmaabbmrabaakaaaakaaacmwraaad>;mz{aacdkababmraagdkaajdkaaajkaaae>;>;Tabab>;m|vmraaghkaajdkaaajkaaae>;>;>;>;Tabba>;mzmwraaacmraagekaajckaaabkaabb>;>;Tabca>;m|vmrabcakaaaakaaacmaabbmwraaaemraaggkaajekaabakaaai>;>;Ta1da>;mzm~xQQQQQ>;QQQQQQ___mumvu>;>;Tabjj>;mzm~xsQ_mumvu>;mwraaaew_mumt}mt~aaddmtvmrzjjjjmvu>;>;Tacaa>;m|vm~uaaaamuacaamrm~x҄QQQQQRmumvu>;>;Tacab>;mzm~xm>;QQQQQQQQQvQvQu]Qr~zxRmumvu>;>;Tacba>;mzmw}{bbjbkacbbmw}{bbjckacbc>;mzmwraaaem~uaaacmrzaafamraagckaajfkaaahkaahe>;Tacbb>;mzmwraaaem~uaaacmrzaafamraagckaajfkaahjkaahd>;Tacbc>;mzmwraaaem~uaaaamrzaafamraagckaajfkabbhkaagc>;>; \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Blcny2.tsc b/res/es/data/sprites_og/Stage/Blcny2.tsc new file mode 100644 index 0000000..127566b --- /dev/null +++ b/res/es/data/sprites_og/Stage/Blcny2.tsc @@ -0,0 +1 @@ +fss|sPMptt|sptt|tntt|usst{ssssPMfss|tPMntt|sptt|tptt|usst{ssstPMfss|uPMsst{sssuPMfss|vPMsst{sssvPMfss|wPMptt|sntt|tptt|usst{ssswPMfss|xPMsu{s}ssts}sssssu{s}sstyPMssxsssswPMPMfstssPMssttstss}ssss}sssusssvPMssuv}ststssyv}ss|v}sss|}ssswPMPMfststPMssyz}ss|v}sss|}ssswPMPMPMPMfsttsPMsssussyw}ss|u}ssst}ssttPMPMPMPMfstusPMtv|v}stut䑲ccdPMfstutPMssswsstyssz|}ss|w}ssts}sss{PMPMPMfst||PMssvvcccdPMccccPMcqqqPMPMfsussPMsssssuss䖬ccc$cc$dPMPMfsustPMPM䈖ccocdPMPMfsutsPMtt|t}sutttt|u}sutuPMssswsssussxssszs}ss|x}sssz}sszwPMfsuttPMssswsssussxssszs}ss|x}ssz|}sszvPMfsutuPMssswssssssxssszs}ss|x}sttz}ssyuPMPMfsu{sPMPMfsu|sPMfsu|tPMfsu|uPMfsu|vPMfsu|wPMfsu||PMPMPMPMPMfsvssPMsvss}sstyPMss{ssu||}ssus}sssuPMssusPM䉸dssstssxsPMsu|t}sutz}sssssu|t}ssws}ssssssxsPMsu|s}ssss}ssssssusPMssu{䗨cPMdPMcccqqqqcc,cPM0ccPMqqqqCssssPMsu|t}ssxs}sssssstyPMssuucc6c$PMc$qqqPMsssssstyPMsstsPMsu|s}sssv}ssssPMsu|t}ssts}ssssPMsu|u}suz|}ssssPMsu|v}suz|}ssssPMsu|w}suz|}sssustssPMsu|t}sswu}ssssPMsu|s}ssss}ssssPMssu{cqqqssuuc=qqqPM䑲ccdPMsssvsstysssussy{}syss}ssuw}sstvPMPMPMfsvsxPMfsvsyPMfsvszPMfsvtsPMsssssst{ptt|sptt|tntt|ussssPMsvsx}sstt}sssuPMsu{s}ssts}ssssPMsvsx}sstyvsssv䓲c0dPM䆲ccccPMc$cddsu{s}sstyPMsvsx}ssvs}ssssssysPMsvsxptv|tPMfsvuspuPMPMfsvvsPMsvvssssssvus}ssss}sssuPMssxsPMsvus}sstyssstccc$cqPMccqPMccoccPMcc$d$cPM䖤ccccdPMsvus}ssss}ssssssxsPMsvus}ssvs}sssssstuPMsvus}ssws}ssssssxsPMptv|usstyPMPMfswssPMswssssvsssssPMsxss}suxw}ssssssstPMsxss}ssus}sssussstPMsxss}ssvs}sssussstPMsxss}sstyssus}ssvsPMsvszsu{sPMstssssswPMssuuPMccc$cqqqssu{ccqPM䗨cccc0dssswPMssvxssw|}tuss}ss|{}sssyPMPMfsxssPMPM \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Cave.tsc b/res/es/data/sprites_og/Stage/Cave.tsc new file mode 100644 index 0000000..d2ff6d6 --- /dev/null +++ b/res/es/data/sprites_og/Stage/Cave.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:S``ii=:ls}```hlvqy```dlu~t=:=:=:S`a`a=:lyls~`a`aj````j````l``aalvq```clq``acj``icj``a`j```c=:=:S`a`b=:lylv|z`c`bj`a`dlv|z`c`aj`a`cl}woQl~tlu~t=:S`a`c=:lylvq```b=:lv|[`c`blv|[afdalv|[afdb=:l}t```blq``ahj`e`bj``0bj````=:S`a`d=:l{ulvq```blq``aaj``idj```hj```f=:S`aa`=:l{ulvq```dlq``i`j``ibj```gj```i=:=:=:S`ae`=:l{ul}t````ls}```hlvqy```d=:lqy``c`=:l``abls}``e`j``cej``fglqy``b`=:l``abls}``e`j``cfj``fglqy``b`=:lu~t=:=:S`b``=:lu~t=:S`b`a=:lu~t=:=:S`d``=:lyl``bblt~`d``ls}``af=:l}wlwya``fsP=:msPPumQlqy`af`l~tl}l}|[```c=:уPP[cQl~tlu~t=:=: \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Cemet.tsc b/res/es/data/sprites_og/Stage/Cemet.tsc new file mode 100644 index 0000000..1ea18a8 --- /dev/null +++ b/res/es/data/sprites_og/Stage/Cemet.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{x{x{x{xǪÞ{x{x{x{x{x{x{x-[-ݭ{x{x-ӎ׎{xOݭӚnaܚ{xݎ܎ݎώӎϜ{xݚώӎӜŸ™-ώӎhݭ{x{x{x{xώώӎ{xݎݎ܎ώOϨ[ώڎӎ{xڎ܎ݎϜ{xޟ™ӎώӎӎ૏ů{xê{x{x \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Cent.tsc b/res/es/data/sprites_og/Stage/Cent.tsc new file mode 100644 index 0000000..cc64241 --- /dev/null +++ b/res/es/data/sprites_og/Stage/Cent.tsc @@ -0,0 +1 @@ +\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y\Yr\Y\Y\Yr\Y0ooo´@\Yr\Y\Yqðo²ijq}\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y\Y\Y\YWddmdA>pupzadfjgpwdddfpzu}ddddpyxA>WddmeA>pupzadfjgpwdddfpzu}dddepyxA>WddmfA>pupzadfjgpwdddfpzu}dddfpyxA>WddmgA>pupzadfjgpwdddfpzu}dddgpyxA>WddmhA>pupzadfjgpz~dghenddmmpwdddfpzu}dddhpyxA>A>WddmmA>pwddflpzu}dddhpyxA>A>WdeddA>p}pddeepxdeddpzudddhpudddjnddmhndeemnddekA>A>A>A>WdfddA>p}~dddlndfdfA>pyp{TTTA>TTbpxpz~dfhendfdepyxA>WdfdeA>p{TTTTTA>TbbbpxpwA>pz~dfjenddddpu}ddgdpz_dfjepz_dfjgA>pudgddndddgndddfpu}ddhipudgddnddddndddfpxddddA>p{`TT!TA>TTspxpwTT!TTA>qTTqTTA>TTTbpxpyxA>WdfdfA>pyp{}eddlp{󅩝TTTqTTqsp~ddddpwA>pz_dfegp}adddlA>pudfddnddednddddpu}ddgdpzudddhA>pudddjnddmmndef4nddeeA>A>WdfedA>p}p}~ddgknddempz~dfjgndfeepyyddemA>WdfeeA>pyp{A>󅩝Tsp~ddddpzudddhpwddddpu}ddfdpwbbbbbp}_ddgkpxpwA>pdgddnddefndddjnddddpudgddnddednddddA>pu}ddidA>p}_edddpddfdpxdddfp{A>Tbpxpwppzu}dddhpyxA>A>A>WdgddA>p}~dddlndgdfA>pz~dfjendgdeA>pz~dfhendgdgA>pyp{|Upxpw|TTTT`A>TTspxpyxA>WdgdeA>pyp{TTTA>TqTTqbpxpwTTqTTqA>TTbpxA>vTTTTUpxpyxA>WdgdfA>pyp{|TA>qTTqsUpxA>}!Upxpw'TTTTTA>`TTTA>TTTbpxpyxA>WdgdgA>pyp{|UpxpwT!`TTTA>TTTbpxA>yTTspxpyxA>A> \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Clock.tsc b/res/es/data/sprites_og/Stage/Clock.tsc new file mode 100644 index 0000000..a1c2f57 --- /dev/null +++ b/res/es/data/sprites_og/Stage/Clock.tsc @@ -0,0 +1 @@ +b_xb_b_xb_b_xb_b_xb_b_xb_b_b_xb_b_b_xb_b_uȺuǺb_xb_Ub_uuuĻǺȺʾɺub_Hºu¶ʒvb_xb_BuuuȸǾăɺuķuuuǾuub_ɺ¾öHÃuǾuuĹub_źɾǺuȾɶvb_b_ \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Comu.tsc b/res/es/data/sprites_og/Stage/Comu.tsc new file mode 100644 index 0000000..7cbdadb --- /dev/null +++ b/res/es/data/sprites_og/Stage/Comu.tsc @@ -0,0 +1 @@ +öʥùöʥùöʥùöʥùöʥùʥùʥùʥùʥùʥùǾʥťĥǶαȼ֕ڕڕ֕֕ڂ磣Ĺڕ֣Ĺ֕䡕ޕ裣ĹǷ䡕Vւhڕ֣Ĺùαȼ䣣ڕ磣Ĺڕ䡂硕֕䣱Ĺڕڕᕹ磱ĹΕ֡䣣ڂ֣Ĺùαȼڕւ֕ڕ磱Ĺڕu֣Ĺ֕֕V֣֕Ĺùαȼ硕ڂ䡕h֕ڣĹǺbڂ֕֕ڕڕւڕ裱Ĺᕹ硕裣֣֕Ĺڕ֕֕֕ڕ裱Ĺb֕䡱Ĺ䕶h^䣱Ĺڕւ֣֕Ĺ֕^Ĺڕڕᕹ֕䡕ڂ^ڣĹùɿαȼ䟕ؖĹ裱Ĺùαɦȼ4ᕲڕֲÿıɥɢť̶ȼ裣ĹDZɥ ʥ̶ֲ֕Ĺıʱťùαťù \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Cthu.tsc b/res/es/data/sprites_og/Stage/Cthu.tsc new file mode 100644 index 0000000..acf830e --- /dev/null +++ b/res/es/data/sprites_og/Stage/Cthu.tsc @@ -0,0 +1 @@ +>;Taaja>;m~rmt~aaaimwrzaaaamvu>;Taajb>;m~rmt~aaaimwrzaaabmvu>;Taajc>;m~rmt~aaaimwrzaaacmvu>;Taajd>;m~rmt~aaaimwrzaaadmvu>;Taaje>;m~rmt~aaaimwrzaaaemvu>;>;Tabaa>;mzmwraaaemraaackaajekabcfkaaac>;Tabab>;mzmaabbmuababmwraaaemraaackaajekabcfkaabc>;>;>;>;Tacaa>;m|vmw}{1cjakacabmw}\bcjam~x_mumt}QQQQp>;QQQ___mu>;u$QQQpmumt}_____mumt}Qp>;yQQQpmu>;{QQ___mumvu>;Tacab>;m|vm~xs]QQQQ>;Q]QQ_mumvu>;>; \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Cthu2.tsc b/res/es/data/sprites_og/Stage/Cthu2.tsc new file mode 100644 index 0000000..a928112 --- /dev/null +++ b/res/es/data/sprites_og/Stage/Cthu2.tsc @@ -0,0 +1 @@ +ROhuu~uROuuu}uuuuROhuu~vROuuu}uuuvROhuu~wROuuu}uuuwROhuu~xROuuu}uuuxEROhuu~yROuuu}uuuyROROhuvuuROuuuyuuy~uu~yuvw{uuuwROhuvuvROuuuyuuy~uu~yuvw{uuvwRORO \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Curly.tsc b/res/es/data/sprites_og/Stage/Curly.tsc new file mode 100644 index 0000000..15b86b2 --- /dev/null +++ b/res/es/data/sprites_og/Stage/Curly.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|z`cdaj``iels}```blvqy````lu~t=:S``ia=:l}~qls}```blvqy```alu~t=:S``ib=:l}~qls}```blvqy```blu~t=:S``ic=:l}~qls}```blvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```blvqy```dlu~t=:=:S``ie=:ls}``bhlvqy````lu~t=:S``ii=:ls}``bhlvqy```dlu~t=:=:S`a``=:l{ulv|z`efaj`a`bl``aalq~`a``j````j```b=:lvq```blq``a`j``ibj```cj``ab=:S`a`a=:l{ulv|z`efaj`a`bl``aalq~`a`aj````j```b=:lvq```dlq``cbj``idj```hj```i=:S`a`b=:lyl}w~PPQl~tlu~t=:=:=:=:=:S`b``=:l{u=:lv|z`efdj`b`d=:lv|z`efbj`b`f=:l}w~PPPP^l~tlu~t=:S`b`a=:l{ul}wPPPPs^l~t=:PPP\P=:PPP^l~t=:щPPP}sxQl~tlu~t=:S`b`b=:lv|z`bgcj`b`e=:l{ul}wPPPP\=:PPP^^^l~tlu~t=:S`b`c=:l{ul}w^^^l~tls|^^^=:P^^^P^^^l~tlu~t=:S`b`d=:l}w|PPzP=:PPPt^l~t=:uPPP^l~tls|PP^^^l~tls|^^^l~tls|^^^uP*PPP=:Pt^^^ol~tlu~t=:S`b`e=:l{ul}w~PP=:PPP^l~tls|q*PPPP^^^l~t=:PsPPPP=:PP^l~tlu~t=:S`b`f=:l{ul}wuPPPol~t=:xPPPPz=:PPP^l~tls|\PP^l~tls|PPPPP\=:PPP=:PPPPPPP^l~tlv|[`efdlu~t=:=:=:=:S`c``=:l{ult~`c``l}}`l}t````ls}````=:lv|[`efal}wqQl~tls|l{u=:lq~`e``j```cj```blqy``gilq~`e``j````j```b=:l}wlvqs``aiQl~tls|=:ls~`ca`j`abbj```blt~`b``lqy``a`=:ls~`caaj`abbj```blt~`b`alqy``a`=:ls~`cabj`abbj```blt~`b`blqy``a`=:ls~`cacj`abbj```blt~`b`cl}wфPPyyq~uQl~tls|щPPPP=:PPQl~t=:рPQl~t=:|P}PPP=:Ql~t=:|P}P=:QQl~tls||PPP\P^^^l~tls|=:lqy``b`l```dls~`d``j`aahj```blt~`e``=:lqy``a`=:l}wuPPPQl~tls|рPPQQl~tls|=:lr|`d``=:ls}```d=:lq~`d``j``a`j```b=:lq~`ca`j``a`j```b=:lq~`caaj``a`j```b=:lq~`cabj``a`j```b=:lq~`cacj``a`j```b=:lu~t=:=:=:S`ca`=:S`caa=:S`cab=:S`cac=:=:=:=:S`d``=:l{ul}t`d``=:lv|]`efalv|]`efe=:lq~`ca`j``b`j```e=:lq~`caaj``b`j```e=:lq~`cabj``b`j```e=:lq~`cacj``b`j```e=:ls~`d``j`aagj```e=:lq~`d``j```ej```elqy```b=:lq~`d``j``c`j``0dl``g`=:lqy`a``lyls}``ael}w=:цQlqy`ad`ls}````l~tls|=:l{ulq~`d``j```fj```elqy```bly=:lqy``e`ls}```b=:l}wlvqs``b`*P^^^l~t=:~PPP^^^l~tls|PPPP=:PPP}\l~t=:PPP^l~z`da`ls|P^^^l~tls|P^^^l~tlyls|=:lvq```dlq``bij``i`j``abj```i=:=:S`da`=:l{ulv|[`efbl}wlvqs``aiQl~tlvqs````ls|=:lq~`d``j``a`j````lqy``e`=:l}wlvqs``aiPPP=:PP}ol~tls|uPP\Pў=:PPPQl~tls|Ps^=:sPr^l~t=:sPP\=:PPP!^l~tls|lvqs``be~PP=:PP^^^l~t=:P\PPP^l~tls|lvqs``b`u^^^P=:P]}P=:PP^^^l~tls|=:luu`dae=:=:S`dae=:l{ul}wlvqs``ai\P^l~tls|uPuPP=:PPP!=:^l~t=:}PPP=:Pol~z`db`lv|[`efclvqs````ls|=:lq}```bj```dj`a``lwy```buPPmuPm^l~tls|=:ls}``a`lwy```dsPPmqmQlqy`af`l~tl}ls|=:lvq```dlq``bij``i`j``abj```i=:=:S`db`=:l{ul}wlvqs``aitPol~tls|r\PPP=:#\PP^l~tlyls|l}t````=:lvq```dlq``bij``i`j``abj```i=:=:=:=:=:S`e``=:l{u=:lv|z`efcj`ec`=:lv|z`efbj`eae=:l}wlvqs``aixol~tls|\PPPP=:^P}Pq^l~tls|PP=:PP}ol~z`ea`ls|lvqs``b`P^^^l~tls|P^^^l~tlu~t=:=:S`ea`=:l{ulv|[`efbl}wlvqs``aiQl~tls|PPP=:PP}ol~tls|uPP\Pў=:PPPQl~tls|Ps^=:sPr^l~t=:sPP\=:PPP!^l~tls|lvqs``be~PP=:PP^^^l~t=:P\PPP^l~tls|lvqs``b`u^^^P=:P]}P=:PP^^^l~tls|=:luu`eae=:=:S`eae=:l{ul}wlvqs``ai\P^l~tls|uPuPP=:PPP!=:^l~t=:}PPP=:Pol~z`eb`lv|[`efclvqs````ls|=:lq}```bj```dj`a``lwy```buPPmuPm^l~tls|=:ls}``a`lwy```dsPPmqmQlqy`af`l~tl}lu~t=:=:S`eb`=:l{ul}wlvqs``aitPol~tls|r\PPP=:#\PP^l~tlu~t=:=:S`ec`=:l{ul}wlvqs``be|PPP=:PQl~t=:|P}P#P=:PP^l~tlu~t=:=: \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/CurlyS.tsc b/res/es/data/sprites_og/Stage/CurlyS.tsc new file mode 100644 index 0000000..2349b89 --- /dev/null +++ b/res/es/data/sprites_og/Stage/CurlyS.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPPP\faiPPPP\end-*CPPYQ-*\mna\cmuPPPP\faiPPPQ\end-*CPPYR-*\mna\cmuPPPP\faiPPPR\end-*CPPYS-*\mna\cmuPPPP\faiPPPS\end-*CPPYT-*\mna\cmuPPPP\faiPPPT\end-*-*CPQPP-*\pri\souPPQQ\dnpPQPP\faoPPPT\traPPRYZPPYTZPPPVZPPPY-*-*-*CPTPP-*\key\souPQPU\msgaA\nod\fljPUVTZPTPQ\end-*CPTPQ-*\itjPPQTZPTQP\clrq @-*@_\ynjPPPP\clr-*\cnpPTPPZPQSVZPPPP\flKPUXP\gitQPQT\itKPPQTc@@]m]N\nod\clo-*\flKSPPP\flMSPPQ\flMSPPR\flMSPPS\flMSPPT-*\flKPRWT\end-*CPTQP-*\pri\msgs@@@N\nod\end-*-*CPTRP-*\key\dnpPTRP\msg\gitQPSU\itKPPSUe@-*]b@@c]N\nod\end-*-*-* \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Dark.tsc b/res/es/data/sprites_og/Stage/Dark.tsc new file mode 100644 index 0000000..2a953ed --- /dev/null +++ b/res/es/data/sprites_og/Stage/Dark.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq``a`j``idj``gcj``bg=:=:S`d``=:lyl}wl`a`ewQPl`a`ewQPl0a`ewQl~tlyz``adj`da`ls|PP=:Pol~z````ls|=:ls~`d``j`acfj````lv|[`fa`lwya`adly[``adsPPm}m^l~tlv|[`bgdls|=:lv|]c```lv|]c``alv|[c``blv|]c``clv|]c``d=:lu~t=:S`da`=:lyl}w#PPP^l~tlu~t=:=: \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Drain.tsc b/res/es/data/sprites_og/Stage/Drain.tsc new file mode 100644 index 0000000..a55167a --- /dev/null +++ b/res/es/data/sprites_og/Stage/Drain.tsc @@ -0,0 +1 @@ +b_xb_b_xb_b_xb_b_xb_b_xb_b_b_xb_b_b_xb_b_xb_uȺuǺb_b_xb_b_b_xb_ȸʸuuþuuʶb_κùuuăb_uuʺǶuuuɺȁb_ķºɺuĹBuŶȶǃb_xb_b_b_b_xb_Ub_b_b_b_ʾuuuǾĔb_b_b_b_uĹuŶȶuuBb_úuʺuȺʾb_˶϶ùăb_b_b_b_b_b_b_xb_b_xb_uuHÃuȶȃb_b_b_b_b_b_b_b_b_ \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/EgEnd1.tsc b/res/es/data/sprites_og/Stage/EgEnd1.tsc new file mode 100644 index 0000000..f196b79 --- /dev/null +++ b/res/es/data/sprites_og/Stage/EgEnd1.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswsssu}ss|w}su|z}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/EgEnd2.tsc b/res/es/data/sprites_og/Stage/EgEnd2.tsc new file mode 100644 index 0000000..c6570d7 --- /dev/null +++ b/res/es/data/sprites_og/Stage/EgEnd2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswssw|}ss|w}su|y}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Egg1.tsc b/res/es/data/sprites_og/Stage/Egg1.tsc new file mode 100644 index 0000000..69a64a0 --- /dev/null +++ b/res/es/data/sprites_og/Stage/Egg1.tsc @@ -0,0 +1 @@ +_\u_\_\u_\_\u_\_\u_\_\u_\_\_\u_\_\_\u_\RļƳrrƻrųĻ_\³ijrųƻȳrrŵǶ_\u_\}ŷƳƷr_\ļƳrrƻ_\ŵǶrųƻȳ_\u_\rŵǶr3rųƻȳ_\_\ \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Egg6.tsc b/res/es/data/sprites_og/Stage/Egg6.tsc new file mode 100644 index 0000000..ebedf2c --- /dev/null +++ b/res/es/data/sprites_og/Stage/Egg6.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq```bj0`idj`agij``a`=:=:S`b``=:lylv|z`ad`j```alv|[`ad`l``bbls~`b``j``baj````=:l}wxPPP^l~tlwya``gly[```gls|ls}``a`sP=:mPPym^lqy`af`l~tl}lu~t=:=: \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/EggR.tsc b/res/es/data/sprites_og/Stage/EggR.tsc new file mode 100644 index 0000000..932a451 --- /dev/null +++ b/res/es/data/sprites_og/Stage/EggR.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPPX\faiPPPP\end-*CPPYQ-*\mna\cmuPPPX\faiPPPQ\end-*CPPYR-*\mna\cmuPPPX\faiPPPR\end-*CPPYS-*\mna\cmuPPPX\faiPPPS\end-*CPPYT-*\mna\cmuPPPX\faiPPPT\end-*-*CPQPP-*\pri\faoPPPT\traPPPRZPPYTZPRRPZPPPW-*-*CPQUP-*\key\msgh@ @@N\nod\end-*-*CPRPP-*\key\msge@@N\nod\clr\turc@@@L@@-*@@@@@nN@PPN\nod\clr\turc@@@@@@ -*@@@@@NNN\nod\end-*-*CPSPP-*\pri\fljPRPPZPPPQ\flKPRPP-*\souPPRR\cnpPSPPZPPRQZPPPP-*\msgh@@@N\nod\clr\evePPSP-*-*-*CPUPP-*-*CPUPQ-*\pri\msS\turh@@d@c@nN@PQ-*eZ@c@@@N-*s@@N\nod\end-*CPUPR-*\pri\msS\turh@@d@c@nN@PR-*c@N\nod\end-*CPUPS-*\pri\msS\turh@@d@c@nN@PS-*c@N\nod\end-*CPUPT-*\pri\msS\turh@@d@c@nN@PT-*c@N\nod\end-*CPUPU-*\pri\msS\turh@ d@c@nN@PU-*c@N\nod\end-*CPUPV-*\pri\msS\turh@@d@c@nN@PV-*eZ@c@@@N-*s@@N\nod\end-*CPUPW-*\pri\msS\turh@@d@c@nN@PW-*c@N\nod\end-*CPUPX-*\pri\msg\turh@@d@c@nN@PX-*c@N\nod\end-*CPUPY-*\pri\msg\turh@@d@c@nN@PY-*c@N\nod\end-*CPUQP-*\pri\msg\turh@@d@c@nN@QP-*c@N\nod\end-*CPUQQ-*\pri\msg\turh@@d@c@nN@QQ-*c@N\nod\end-*CPUQR-*\pri\msg\turh@@d@c@nN@QR-*c@N\nod\end-*CPUQS-*\pri\msg\turh@@d@c@nN@QS-*c@N\nod\end-*CPUQT-*\pri\msg\turh@@d@c@nN@QT-*c@N\nod\end-*CPUQU-*\pri\msg\turh@@d@c@nN@QU-*c@N\nod\end-*CPUQV-*\pri\msg\turh@@d@c@nN@QV-*c@N\nod\end-*-* \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/EggR2.tsc b/res/es/data/sprites_og/Stage/EggR2.tsc new file mode 100644 index 0000000..19c2b2d --- /dev/null +++ b/res/es/data/sprites_og/Stage/EggR2.tsc @@ -0,0 +1 @@ +?FWXKFPVT:?C?D::C?FUOcFMW_::;;FPKS:::>FO`O:<::-::C?FWXKFMW_::;CFPKS:::>FOXN-:;::FZ\SF]Y_::;;FNXZ:;::FPKY:::>F^\K::;:D::C>D::=?D::<@-:<::FUOcFWcN::::FKXZ:>::D::=:D::::FW]QFPKM::;>Vk*vvko*nov*kvwkmxIFXYN`kk6*Q\KMSK]6*xy~oxk}*zy|*{*wyvo}~k|~o+FXYNck*yvo|owy}*k*o|xy}+FXYNFMV\FPKM::;=O}zo|k++FXYNFMVYFKXZ:>::D::=:D:::::D::;:D:::FS^7::;>FW]QFPKM::;=Yyrrr888FXYN*888^IFXYNFPKM::::FMVYFaKS::?:FMXZ:<<:D:;==D::::FaKS::?:FW]QFQS^;:;>FPKM::::Vo*ns}~o*vk*GWk}my~kG8FXYNFQS^::::FMXZ:=::D:;=:D::::FNXZ:>:;FPV7:FMV\FPKM::;=Vk*vvko888FXYNWo*rkx*|ylkny*vk*vvko888FXYNZy|*pky|8Nolo}*no~oxo|vy}8FXYNFMV\Zvkxokx*oxp|omo|*k*vy} +Wswsqk}**}yv~k|vy}ox*vk*}zo|psmso8FXYNFMV\Yr6*}888FXYN[s*~o*sx~o|o}o*vvok|~oo}~y888FXYNFQS^;:;?FS^5::;?FMV\FPKM::::FMW_::;:Myx}oqs}~o*x*GP|k}my*no*]kvnG+FaKS:;@:FXYNF\W_FMV\FPKM::;=Zono}*}k|*o}~y*xk6zo|y*}vy*xk*o6*zk|k|o}~k|k|*~*oxo|qk8FXYNFOXN-:<=:FUOcFPVT:B=:D:<=;FW]QFPKM::;=Zy|*pky|+FXYNNolo}*no~oxo|vy}+FXYNFMV\Zvkxokx*oxp|omo|*k*vy}Wswsqk}**}yv~k|vy}ox*vk*}zo|psmso+FXYNFOXN-:<=;FUOcFS^T::;?D:<=<FW]QFPKM::;=Kr6*soxo}*ox*xlox*wywox~y8FXYNFQS^;:;?FS^5::;?FMV\FPKM::::\omsls}~o*x*GP|k}my*no*]kvnG+FaKS::=:FXYNFQS^::::FMV\FPKM::;=`ovo*}s*kvqxko*xomo}s~k}*y~|y8FXYNO}*vy*woxy}*{o*o}~kkxmskxk*zono*rkmo|888FXYNFOXN-:<=<FUOcFW]QFPKM::;=Sxmv}y*xk*l|tk*mywy*yoxotomo**}o*nolsvs~k888FXYNVy*xsmy*{o*zony*rkmo|kry|k*o}*zy}k|*~ynk}ws}*o}zo|kxk}*ox*~s888FXYNFOXN-:=::FUOcFW]Q4qswy~oy4888FXYNFOXN-:>::-:>:; \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Kings.tsc b/res/es/data/sprites_og/Stage/Kings.tsc new file mode 100644 index 0000000..9ed7131 --- /dev/null +++ b/res/es/data/sprites_og/Stage/Kings.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlvqy````lu~t=:S``ia=:l}~qlvqy```alu~t=:S``ib=:l}~qlvqy```blu~t=:S``ic=:l}~qlvqy```clu~t=:S``id=:l}~qlvqy```dlu~t=:=:S`a``=:l{ul}~qlqy``e`lvqy```a=:lq~`c``j``a`j```0lqy``ig=:lq~`c``j```aj````lqy``e`=:lq~`c``j``b`j````lqy``fd=:lq~`c``j```aj````lqy``af=:lq~`c``j``c`j````lqy``e`=:lq~`c``j``d`j````lqy``ig=:lvq```alqyiiii=:=:S`c``=:=: \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Little.tsc b/res/es/data/sprites_og/Stage/Little.tsc new file mode 100644 index 0000000..456ef9a --- /dev/null +++ b/res/es/data/sprites_og/Stage/Little.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_:::FWXKFMW_:::FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::FWXKFMW_::;CFPKS:::>FOXN +-:;::FZ\SFPKY:::-:;:;FZ\SFPKY:::;F^\K::=CD::C;D:::>D::;@-:<::FZ\SFW]QO}*x*|yly~8Y*kv*woxy}*vy*{o*{onk*no*v8FXYNFOXN \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/MazeI.tsc b/res/es/data/sprites_og/Stage/MazeI.tsc new file mode 100644 index 0000000..86fc6b0 --- /dev/null +++ b/res/es/data/sprites_og/Stage/MazeI.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_::;CFPKS::::FOXN-::C;FWXKFMW_::;CFPKS:::;FOXN-::C<FWXKFMW_::;CFPKS:::FWXKFMW_::;CFPKS:::>FOXN-:;::FZ\SFPKY:::>F^\K::;:D::C>D:<<;D:<:=FZ\SFW]QXy*}o*kl|o888FXYNFOXN-:<:=FZ\SFPKY::::F^\K::=BD::C:D::=?D::;=-:<:>-:<:?-:=::FZ\SF]Y_::<::FUOcFKXZ:?:;D::;:D::::<FUOcFPVT:@>;D:>:=FW]Q[so|o}*kl|s|*vk*zo|~kIFcXT::::FMVY +FPV5:@>;FPYX:<:FaKS:;?:F]Y_::>=FKXZ:<:>D::;:D::::FaKS:::BFKXZ:?:FNXZ:<:?FPYW::=:=FUOcFW]QZo|~k*klso|~k8FXYNFOXN-:>;:-:?::FZ\SFW]Q]oq|y*{o*Ws}o|*~o*rk*~s|knyk{8FXYNZyl|oms~y888FXYN}~o*o}*ov*o|~ono|y*no*vk*s}vk8FXYN_xk*o*ox~|k}6xxmk*ovo}*k*}kvs|888FXYNFOXN-:?:;-:?:<FZ\SFW]QOv*sx~o||z~y|*{o*kl|o*o}~kzo|~k*nolo*o}~k|*kvv*k||slk8FXYNZo|y*ov*mkwsxy*o}*kvqy*mywzvsmkny8FXYNWo*ro*mkny*k*~kx~k}*omo}{o*wo*ro*|y~y*vk}*zso|xk}8FXYNFOXN-:?:=FZ\SFW]QXy*rk*|o}zo}~k8FXYNFOXN=AD*WkoS******:@>:*7*:@?C:@>:D:@>;DT:@>**3+6GH;6=GO***26@;C***+6?H>**3,6GH;6=GO***26@FD*10+4**3/6@;C***,6?H>**3-6GH;6=GO***26@;C***-6?H>**3.6GH;6=GO***26@;C***.6?H>**3/6;HJ*-**4**,*4****6@;C***,6?H>*+**6E?S6@FD*10-4*+*+6MIO**++6;HJ*+**4****4***,6@;I****6GS>****6NL;**.-4**3*4**+04**+-*+*+6JLC6GMAHim_[\l_6HI>6?H>*++*6@FD*10.4*+++6?H>*+++6E?S6@;I***.6GS>***,6NL;**./4**3,4***,4***/*,**6JLC6@FD*,*+4*,*+6GMA;faoc_hf_b[jo_mnioh_h][hni(Him_[\l_(((6HI>6?H>*,*+6@FD*1004***+6@F%*1006@F'*10/6@F%*,*,6MIO**,,6=HJ*,**4**,+4****6GMAB[m[\c_lni_f]i`l_(6HI>6=FL6N;G***/4**+*4****6=GO**+*6ACN**+*NomGcmcf_mb[hmc^ijin_h]c[^im6Q;C*+0*6HI>6LGO6?H>*-**6E?S6@FD*10.4*-*-6@FD*10,4*-*,6@FD*10+4*-*+6@F%*10+6GMA6@;=**+3;d6HI>G_jl_aohn[\[]oh^ip_h^l[m(6HI>6=FLMc]ihm_aocgimgip_l_mn[al[hli][&ji^l_gimff_a[l[f[m[fc^[(6HI>6=FLMch_g\[lai&b[slogil_m^_ko_nl[m_ff[_mn_fhc^i^_ohgihmnloi(((6HI>;mko_^_\_l[m_mn[ljl_j[l[^i(6HI>6=FL>_ni^[m`ilg[m&^_mb[agihim^__mn[]im[^_oh[p_t(6HI>?gjod[jil_m_f[^i(6HI>6=FI6;HJ*-**4**,*4****6?H>*-*+6E?S6;HJ*-**4****4****6GMA6@;=**+3I]oll_[fai96HI>Hi_mn[lm[momn[^i&p_l^[^96HI>6=FL>o^iko_fi_mnm(6HI>P_ha[&_gjod[jil_m_f[^i(6HI>6;HJ*-**4**,*4****6?H>*-*,6JLC6GMAHcm_b[chgon[^i(6HI>6?H>*-*-6JLC6GMA6@;=**+3P[gim6HI>6=FLB[sohhc^iff_hi^_gihmnloim_mj_lh^ihim6HI>6?H>*-+*6E?S6=HJ*-+*4**+,4***.46;HJ*-+*4**2*4***/6MG=6=GO**+/6GMA>_llin[mn_[<[flia6Q;C*+.*6HI>6=FI6@;=****6=GO***26@;I***.6GS>***,6NL;**..4*0**4***34**+.6?H>*-,*6E?S6@FD*10,4*-,,6@FD*10+4*-,+6?P?*/***-,+6E?S6GHJ*-,*4****4****4****6GS>***,6GS>***-6GMA6@;=**+3Jl_j[l[^i9?gjod[6HI>6=FI6@;=****6;HJ*-**4**,*4****6Q;C**/*6GMALLLLAB6HI>6=FI6@;=****6=HJ*/+*4*--.4****6=HJ*/++4*--.4***,6Q;C*+**6GMA6@;=**,*(((((6HI>6=FI6@;=****6;HJ*-**4****4****6Q;C**/*6GS>***,6GMA6@;=**,/Him_b[gipc^ih[^[(6HI>Hi]l_iko_[faohi^_fim^imm_[][j[t^_gip_lf[(((6HI>6@;=****6=FI6Q;C**/*6GMABott[b6=GO****6HI>6=FI6=HJ*-+*4***34***,6Q;C*+**6=HJ*-+*4**+,4***,6;HJ*-+*4**-*4***,6=GO**++6GS>****6GMA6@;=**+3N6HI>6=FL6@;=**+.Dididi6HI>6=FL;mko_m_aompcpim6HI>6=FLHimfi_mi&mchiko_n[g\chchn_hncmm[fcl^_fF[\_lchni6HI>6=FLHi^_\_l[cmko_^[lim]igifib[l[oh\o_hli\in96HI>6=FLHchaohi^_himinlimjo_^_b[]_l`l_hn_[f>i]nil&sgo]big_himpiminlim(6HI>6=FLA_hc[f&jo_m6HI>Pis[jih_lf_`ch[_mni6HI>6=FL?mj_liko_hiimcgjiln_ko_im]ihpc_ln[_h]b[n[ll[6HI>6=FL6@;=**+3Domni[koc_h_mn\[gim\om][h^i6HI>Jo_^_m_gjod[ljil_f]_hnli&jil`[pil96HI>6@;=****6=FI6=GO****6Q;C*+**6;HJ*-+*4**0*4***,6Q;C**.26;HJ*-+*4**/*4***,6Q;C**,*6;HJ*-**4**,*4****6Q;C**,*6GS>***,6GS>***-6GMA6@;=**+3Jl_j[l[^i9Ohi&^im(((6HI>6;HJ*-+*4**2*4****6GS<***,6;HJ*-**4**-*4****6MIO**1,6=FL6@;=**,-;=;MIG??MNCM?M=O=B;H>I96HI>6;HJ*-+*4****4****6=GO***.6=HJ*-+*4*+034****6*-,,6JLC6?H>*--**/**6E?S6@FD*10,4*/*,6@FD*10+4*/*+6GMA?moh[al[hsj_m[^[li][(6HI>Nl[m_ff[jo_^_mm_hncl_fpc_hnimijf[h^i(6HI>J[l_]_ko_m_h_]_mcn[l[h[fg_him^imj_lmih[mj[l[gip_lf[(6HI>6?H>*/*+6E?S6Q;C**+*6;HJ*-**4****4****6GMA6@;=**,*Ji^l[m_gjod[lf[^_m^_gm[f_rnl_gi96HI>6=FI6;HJ*-**4**,*4****6?H>*/*,6JLC6GMA?moh[al[hsj_m[^[li][(6HI>6?H>*/+**/++*0**6E?S6@F'*10-6@F%*10.6@F'*10*6MG=6=GO***26=HJ*--*4**+,4***,6;HJ*-**4****4***,6GHJ*-,*4****4****4****6@;C***.6GMA6@;=***/Na[h[m(((6HI>6=FLIm[so^[l[gip_lf[li][(6HI>J_lil_]il^[^(((6HI>6;HJ*--*4****4****6=FLHif_^cacm[H;>C?ko_imb_[so^[^i(6HI>6=FL6@;=**+3Nom_]l_ni_mn[m[fpi]ihhiminlim6HI>6@;=****6=FI6;HJ*--*4**0*4****6Q;C**.*6;HJ*--*4**/*4***,6Q;C**,*6GS>***-6;HJ*-**4**,*4****6GMA6@;=**+3Jl_j[l[^i9?gjod[6HI>6=FI6@;=****6;HJ*/**4**+*4****6Q;C*+**6;HJ*--*4**2*4***,6;HJ*-**4****4***,6;HJ*/**4**,*4****6GS>***,6GMA6@;=**,-A[[[[bbbb6Q;C**/*6=FI6@;=****6;HJ*--*4****4***,6Q;C*+**6GMA6@;=***/;bil[&l_]il^[^(6;HJ*-**4****4****6HI>Hif_^cacm[h[^c_&j_lih[^c_&h[^c_&ko_imb_[so^[^i(6HI>6=FL6@;=**+3Hifib[l_gim6HI>6=FI6@;=****6;HJ*--*4**+*4****6Q;C*+0*6=HJ*,**4**+/4***,6Q;C**.*6GMA6@;=**+3Hi]l_iko_m_[n[hg[fi^_mjom^_ni^i(6HI>6=FI6@F%*12+6@F%*10/6=HJ**+04**+04***,6?H> \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/MazeW.tsc b/res/es/data/sprites_og/Stage/MazeW.tsc new file mode 100644 index 0000000..f85658d --- /dev/null +++ b/res/es/data/sprites_og/Stage/MazeW.tsc @@ -0,0 +1 @@ +FC\iiriFCuzu|iilpuziiiiu~}FC\iirjFCuzu|iilpuziiiju~}FC\iirkFCuzu|iilpuziiiku~}FC\iirlFCuzu|iilpuziiilu~}FC\iirmFCuzu|iilpuziiimu~}FCFC\ijiiFCuuziiikuziilqsiirksiiinsiiilFCFC\ijijFCFC\ijikFCuuiijju}ijikuziiimuziimisiirksiiimsiiinFCFC\ijilFCuioqjsijinFCuiijpsijimFCuugu}u~}FC\ijimFCuuiikkujijpudioqjFCuYYvYYY|&vgu}u|u~~ijinFC\ijinFCuuiijju}ijiluziiiiuziimjsiirisiijnsiiirFCFC\ijioFCu~uiijjuzijiosiiiisiiikuziiimuziimksiirmsiiinsiii9FCFC\ijjiFCuipmisijjjFCu~uiijjuzijjisiiiisiiikuziiikuziimlsiniisiiimsiijlFC\ijjjFCu~uiijjuzijjisiiiisiiikuziiikuziimlsiirksiiimsiijlFCFC\ijkiFCu~uziiimuziimisiirmsiijksiiikFCFCFCFC\iliiFC\ilijFCu}iliju{ziiijufioqiu~}FC\ilikFCu}iliku|iiipu{ziijiu|iliisiijlsiiiiu{iiiiu~}FCFC\jiiiFCu~u{iiiisiijouzikniu|iiiiFCulu|iijnFC}YYYguiijouzijoiu}u|u|iilpFCu|iliisiiiisiiiiudioqiu~}FCFCFC\jkiiFCu~uzjkiisiikisiiikFCujkiisiijouziiijFCuzijiiuziiijuziimpsjkiisiilqsiijoFCFC \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/MiBox.tsc b/res/es/data/sprites_og/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/es/data/sprites_og/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Mimi.tsc b/res/es/data/sprites_og/Stage/Mimi.tsc new file mode 100644 index 0000000..d4e8bae --- /dev/null +++ b/res/es/data/sprites_og/Stage/Mimi.tsc @@ -0,0 +1 @@ +`]v`]`]v`]`]v`]`]v`]`]v`]`]`]v`]`]v`]`]v`]`]v`]`]v`]`]`]`]v`]`]`]Ŵ`]v`]~~`]ƴǸssɸssǻŐ`]v`]`]`]`]v`]`]v`]`]`]s`]sƸsss@ǴsȸǴsɴs`]Ǹżsss`]<¸sǻsƶƴs`]ốsȸsyyyv{~{{{|{{{{{{}{{{{XUXUn{~{{XUzzyyXU>kkkĞyXUxkkk}{|{kxXUXUXUn|{{{XUXU \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Statue.tsc b/res/es/data/sprites_og/Stage/Statue.tsc new file mode 100644 index 0000000..9c01cd0 --- /dev/null +++ b/res/es/data/sprites_og/Stage/Statue.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSSSS_idlSSSS_hqg0-FSS\T0-_pqd_fpxSSSS_idlSSST_hqg0-FSS\U0-_pqd0-_dqsSUSS]SSSS]SSWS0-_dqsSUST]SSSS]SSVS0-_dqsSUSU]SSSS]SSUS0-_iomTXVW]SS\X0-_dqsSUSV]SSSS]SSSS0-_fpxSSSS_idlSSSU_hqg0-FSS\V0-_pqd_fpxSSSS_idlSSSV_hqg0-FSS\W0-_pqd_fpxSSSS_idlSSSW_hqg0-0-FSS\X0-_dqsSUSV]SSSS]SSTS_zdlSSST0-_dqsSUSS]SSTS]SSWS0-_dqsSUST]SSTS]SSVS0-_dqsSUSU]SSTS]SSUS0-_dqsSUSV]SSTS]SSTS0-_idlSSSU_hqg0-0-0-FSTSS0-_nh|_vrxSSTT_dqsSTSS]SSSS]SSSU0-_idrSSSS_iomTXVW]STST0-_fpxSSUW_wudSS[W]SS\S]SST\]SSUT0-#STST0-_wudSS[X]SS\Y]SST\]SSUT0-0-FSUSS0-FSUST0-FSUSU0-FSUSV0-0-FSUTS0-_nh|_iomTX\S]SUUS_pvj_wxu0-~CkC_qrg_hqg0-FSUTT0-_nh|_iomTX\T]SUUT_pvj_wxu0-~CdC_qrg_hqg0-FSUTU0-_nh|_iomTX\U]SUUU_pvj_wxu0-~CpC_qrg_hqg0-FSUTV0-_nh|_iomTX\V]SUUV_pvj_wxu0-~CiCgC_qrg_hqg0-0-FSUUS0-_nh|_pvj_wxu0-~CtC_qrg_hqg0-FSUUT0-_nh|_pvj_wxu0-~CwC_qrg_hqg0-FSUUU0-_nh|_pvj_wxu0-~CnC_qrg_hqg0-FSUUV0-_nh|_pvj_wxu0-~CfCeC_qrg_hqg0-0-0-FSVSS0-_nh|_pvjQQQQQ_qrg_hqg0-0- \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Stream.tsc b/res/es/data/sprites_og/Stage/Stream.tsc new file mode 100644 index 0000000..645dbd8 --- /dev/null +++ b/res/es/data/sprites_og/Stage/Stream.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_xqlSSST_p|gSSSU_idlSSSU_evoSSSS_hqg0-FSS\V0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSW_hqg0-0-FSS\X0-_fpxSSUV_idlSSSS_hqg0-0-FSTSS0-_nh|_idrSSST_fvv_wudSSWZ]SS\T]SSS[]SSS\0-0-FSUSS0-#SUTS0-0-0-FTSSS0-_nh|_erdTSSS0-_dqsSUSS]SSTS]SSSS0-_dqsSUTS]SSTS]SSSS0-_zdlSVSS_idrSSSU0-_xqlSSSS_fvv_hyhTSST0-0-FTSST0-_lwmSST[]TSTS_ioNSTYS_hyhTSSU0-0-FTSSU0-_fpxSSSS_iomS[VY]TSSV_hyhTSTS0-0-FTSSV0-_ioPS[VY_iomS[XT]TSTS_ioNTSWU0-_hyhTSTS0-0-FTSTS0-_qfmSVVY]TSTT0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0-FTSTT0-_lwNSSVY0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0- \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/Weed.tsc b/res/es/data/sprites_og/Stage/Weed.tsc new file mode 100644 index 0000000..37f84ab --- /dev/null +++ b/res/es/data/sprites_og/Stage/Weed.tsc @@ -0,0 +1 @@ +nknknknknknknknknknknknknknknknknknknknknknknknknknknknk ԁӁƁӠnknknknknkBЏnknknknknknknknknknkBЏnknkƁƁžnknknknknknknknknknknknknknknknkƁƁBЏnkƃBnkρnknkƁƁƁƞnknknknknknknknknknknknknknknkƁnknknk́ӝnknknknknknknknknknkƁƁƁžnknknknkЏ ρЁƁƠnkNƁNnkЏЍ͏nknknknknknkԁЁ́ƏnkƁЁƁžnknknknknknknknkԁԁЁϏnkρЁnkƁnkʁԁӁƁρnkӍBԁƁnk́ӏnknkJƁƁρЏʁԁ́TρƁnkԁρӁƁnkBԁBԁԏnknknkʁԁӁӁNnkρЁρԁNԁnkЁƁρƏnknknkЁƁNnkƁƁЁnknknknknknknkЁƁƏnknknknknknknknkNԁρJԁnḱЏnkڂNԁρρЏnk ԁƠnkƁNӁƁNԂƁЏnkԁЁƁaJЁρ́Џnk ԁӁځӁnkρ nknk ƁŠnknknkӁӏnk"Ɓnknk J ЁƁnk nk͏nknknkЁƁnkƁӁnknkʁЁƁnkƁӁnkTЁӁTЁnkԏnknknk J ԠNNӏnk NƁBԁnkԁԠ ԁЁƁƁƠnkρЏnkƁЏnkƁƁƁƞρŏnkρƁƃnkƁƁӁTϏnkNЁρʍЂnknk N ԁ nknknknkЁƏnknknkЁƏnknknknkƁ́ОnknknknknknknkԁЁ́ƏnknknknkƁnkBƁNžnkŁBnknknknknknk РnknknknknknknknknkʁƁԁЁnkЁƁƁʁnkӁԏnkƁʁЁʁnkNƁӁ́ЏځЁƁnknknkρʁƍځnknkJnknknknknknknkɂԁƁƁʁ‚nkԁЁƁƁžԂnknknkρЏnkЁЁʏnknknknknknkԍЍnk ԁԁnk nknk NRӠnknk ԁӁРnknknknknknkЁƁNnknknknknkЁЁnknknknknknknknknk \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/WeedB.tsc b/res/es/data/sprites_og/Stage/WeedB.tsc new file mode 100644 index 0000000..3db9db0 --- /dev/null +++ b/res/es/data/sprites_og/Stage/WeedB.tsc @@ -0,0 +1 @@ +|y|yğ|y|yğ|y|yğ|y|yğ|y|yğ|y|y|y¾ğ|y|y|yğ|y|y¶Xo|yݏۏޝ|y|y¶ݏ\ޝ|y|y¶Н|y|y|y|y¾ğ|y¶ޏۏԝŴ|y|y|yğ|y|y \ No newline at end of file diff --git a/res/es/data/sprites_og/Stage/WeedD.tsc b/res/es/data/sprites_og/Stage/WeedD.tsc new file mode 100644 index 0000000..b7a9dfa --- /dev/null +++ b/res/es/data/sprites_og/Stage/WeedD.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIF_lmllIFxxllmm;m|vmw}^bbjamw}^bbjbmw}\bbjcm~rmt~aadamwrzaaaamvu>;Taajb>;m|vmw}\bbjamw}^bbjbmw}^bbjcm~rmt~aadamwrzaaabmvu>;Taajc>;m|vm~rmt~aadamwrzaaacmvu>;Taajd>;m|vm~rmt~aadamwrzaaadmvu>;Taaje>;m|vmw}^bbjamw}\bbjbmw}^bbjcm~rmt~aadamwrzaaaemvu>;>;Taajf>;m|vmwrzaaaemvu>;>;>;Tabaa>;m|vmaabbmrabaakaaaakaaacmwraaad>;mz{aacdkababmraagdkaajdkaaajkaaae>;>;Tabab>;m|vmraaghkaajdkaaajkaaae>;>;>;>;Tabba>;mzmwraaacmraagekaajckaaabkaabb>;>;Tabca>;m|vmrabcakaaaakaaacmaabbmwraaaemraaggkaajekaabakaaai>;>;Ta1da>;mzm~xQQQQQ>;QQQQQQ___mumvu>;>;Tabjj>;mzm~xsQ_mumvu>;mwraaaew_mumt}mt~aaddmtvmrzjjjjmvu>;>;Tacaa>;m|vm~uaaaamuacaamrm~x҄QQQQQRmumvu>;>;Tacab>;mzm~xm>;QQQQQQQQQvQvQu]Qr~zxRmumvu>;>;Tacba>;mzmw}{bbjbkacbbmw}{bbjckacbc>;mzmwraaaem~uaaacmrzaafamraagckaajfkaaahkaahe>;Tacbb>;mzmwraaaem~uaaacmrzaafamraagckaajfkaahjkaahd>;Tacbc>;mzmwraaaem~uaaaamrzaafamraagckaajfkabbhkaagc>;>; \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Blcny2.pxe b/res/es/data/sprites_up/Stage/Blcny2.pxe new file mode 100644 index 0000000..394d1c6 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Blcny2.pxe differ diff --git a/res/es/data/sprites_up/Stage/Blcny2.pxm b/res/es/data/sprites_up/Stage/Blcny2.pxm new file mode 100644 index 0000000..f229389 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Blcny2.pxm differ diff --git a/res/es/data/sprites_up/Stage/Blcny2.tsc b/res/es/data/sprites_up/Stage/Blcny2.tsc new file mode 100644 index 0000000..127566b --- /dev/null +++ b/res/es/data/sprites_up/Stage/Blcny2.tsc @@ -0,0 +1 @@ +fss|sPMptt|sptt|tntt|usst{ssssPMfss|tPMntt|sptt|tptt|usst{ssstPMfss|uPMsst{sssuPMfss|vPMsst{sssvPMfss|wPMptt|sntt|tptt|usst{ssswPMfss|xPMsu{s}ssts}sssssu{s}sstyPMssxsssswPMPMfstssPMssttstss}ssss}sssusssvPMssuv}ststssyv}ss|v}sss|}ssswPMPMfststPMssyz}ss|v}sss|}ssswPMPMPMPMfsttsPMsssussyw}ss|u}ssst}ssttPMPMPMPMfstusPMtv|v}stut䑲ccdPMfstutPMssswsstyssz|}ss|w}ssts}sss{PMPMPMfst||PMssvvcccdPMccccPMcqqqPMPMfsussPMsssssuss䖬ccc$cc$dPMPMfsustPMPM䈖ccocdPMPMfsutsPMtt|t}sutttt|u}sutuPMssswsssussxssszs}ss|x}sssz}sszwPMfsuttPMssswsssussxssszs}ss|x}ssz|}sszvPMfsutuPMssswssssssxssszs}ss|x}sttz}ssyuPMPMfsu{sPMPMfsu|sPMfsu|tPMfsu|uPMfsu|vPMfsu|wPMfsu||PMPMPMPMPMfsvssPMsvss}sstyPMss{ssu||}ssus}sssuPMssusPM䉸dssstssxsPMsu|t}sutz}sssssu|t}ssws}ssssssxsPMsu|s}ssss}ssssssusPMssu{䗨cPMdPMcccqqqqcc,cPM0ccPMqqqqCssssPMsu|t}ssxs}sssssstyPMssuucc6c$PMc$qqqPMsssssstyPMsstsPMsu|s}sssv}ssssPMsu|t}ssts}ssssPMsu|u}suz|}ssssPMsu|v}suz|}ssssPMsu|w}suz|}sssustssPMsu|t}sswu}ssssPMsu|s}ssss}ssssPMssu{cqqqssuuc=qqqPM䑲ccdPMsssvsstysssussy{}syss}ssuw}sstvPMPMPMfsvsxPMfsvsyPMfsvszPMfsvtsPMsssssst{ptt|sptt|tntt|ussssPMsvsx}sstt}sssuPMsu{s}ssts}ssssPMsvsx}sstyvsssv䓲c0dPM䆲ccccPMc$cddsu{s}sstyPMsvsx}ssvs}ssssssysPMsvsxptv|tPMfsvuspuPMPMfsvvsPMsvvssssssvus}ssss}sssuPMssxsPMsvus}sstyssstccc$cqPMccqPMccoccPMcc$d$cPM䖤ccccdPMsvus}ssss}ssssssxsPMsvus}ssvs}sssssstuPMsvus}ssws}ssssssxsPMptv|usstyPMPMfswssPMswssssvsssssPMsxss}suxw}ssssssstPMsxss}ssus}sssussstPMsxss}ssvs}sssussstPMsxss}sstyssus}ssvsPMsvszsu{sPMstssssswPMssuuPMccc$cqqqssu{ccqPM䗨cccc0dssswPMssvxssw|}tuss}ss|{}sssyPMPMfsxssPMPM \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Cave.pxa b/res/es/data/sprites_up/Stage/Cave.pxa new file mode 100644 index 0000000..c30cbaa Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cave.pxa differ diff --git a/res/es/data/sprites_up/Stage/Cave.pxe b/res/es/data/sprites_up/Stage/Cave.pxe new file mode 100644 index 0000000..d117d5d Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cave.pxe differ diff --git a/res/es/data/sprites_up/Stage/Cave.pxm b/res/es/data/sprites_up/Stage/Cave.pxm new file mode 100644 index 0000000..fcbf014 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cave.pxm differ diff --git a/res/es/data/sprites_up/Stage/Cave.tsc b/res/es/data/sprites_up/Stage/Cave.tsc new file mode 100644 index 0000000..d2ff6d6 --- /dev/null +++ b/res/es/data/sprites_up/Stage/Cave.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:S``ii=:ls}```hlvqy```dlu~t=:=:=:S`a`a=:lyls~`a`aj````j````l``aalvq```clq``acj``icj``a`j```c=:=:S`a`b=:lylv|z`c`bj`a`dlv|z`c`aj`a`cl}woQl~tlu~t=:S`a`c=:lylvq```b=:lv|[`c`blv|[afdalv|[afdb=:l}t```blq``ahj`e`bj``0bj````=:S`a`d=:l{ulvq```blq``aaj``idj```hj```f=:S`aa`=:l{ulvq```dlq``i`j``ibj```gj```i=:=:=:S`ae`=:l{ul}t````ls}```hlvqy```d=:lqy``c`=:l``abls}``e`j``cej``fglqy``b`=:l``abls}``e`j``cfj``fglqy``b`=:lu~t=:=:S`b``=:lu~t=:S`b`a=:lu~t=:=:S`d``=:lyl``bblt~`d``ls}``af=:l}wlwya``fsP=:msPPumQlqy`af`l~tl}l}|[```c=:уPP[cQl~tlu~t=:=: \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Cemet.pxe b/res/es/data/sprites_up/Stage/Cemet.pxe new file mode 100644 index 0000000..62ace93 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cemet.pxe differ diff --git a/res/es/data/sprites_up/Stage/Cemet.pxm b/res/es/data/sprites_up/Stage/Cemet.pxm new file mode 100644 index 0000000..279529a Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cemet.pxm differ diff --git a/res/es/data/sprites_up/Stage/Cemet.tsc b/res/es/data/sprites_up/Stage/Cemet.tsc new file mode 100644 index 0000000..1ea18a8 --- /dev/null +++ b/res/es/data/sprites_up/Stage/Cemet.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{x{x{x{xǪÞ{x{x{x{x{x{x{x-[-ݭ{x{x-ӎ׎{xOݭӚnaܚ{xݎ܎ݎώӎϜ{xݚώӎӜŸ™-ώӎhݭ{x{x{x{xώώӎ{xݎݎ܎ώOϨ[ώڎӎ{xڎ܎ݎϜ{xޟ™ӎώӎӎ૏ů{xê{x{x \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Cent.pxa b/res/es/data/sprites_up/Stage/Cent.pxa new file mode 100644 index 0000000..c2a1486 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cent.pxa differ diff --git a/res/es/data/sprites_up/Stage/Cent.pxe b/res/es/data/sprites_up/Stage/Cent.pxe new file mode 100644 index 0000000..d12eaa7 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cent.pxe differ diff --git a/res/es/data/sprites_up/Stage/Cent.pxm b/res/es/data/sprites_up/Stage/Cent.pxm new file mode 100644 index 0000000..5220599 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cent.pxm differ diff --git a/res/es/data/sprites_up/Stage/Cent.tsc b/res/es/data/sprites_up/Stage/Cent.tsc new file mode 100644 index 0000000..cc64241 --- /dev/null +++ b/res/es/data/sprites_up/Stage/Cent.tsc @@ -0,0 +1 @@ +\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y\Yr\Y\Y\Yr\Y0ooo´@\Yr\Y\Yqðo²ijq}\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y\Y\Y\YWddmdA>pupzadfjgpwdddfpzu}ddddpyxA>WddmeA>pupzadfjgpwdddfpzu}dddepyxA>WddmfA>pupzadfjgpwdddfpzu}dddfpyxA>WddmgA>pupzadfjgpwdddfpzu}dddgpyxA>WddmhA>pupzadfjgpz~dghenddmmpwdddfpzu}dddhpyxA>A>WddmmA>pwddflpzu}dddhpyxA>A>WdeddA>p}pddeepxdeddpzudddhpudddjnddmhndeemnddekA>A>A>A>WdfddA>p}~dddlndfdfA>pyp{TTTA>TTbpxpz~dfhendfdepyxA>WdfdeA>p{TTTTTA>TbbbpxpwA>pz~dfjenddddpu}ddgdpz_dfjepz_dfjgA>pudgddndddgndddfpu}ddhipudgddnddddndddfpxddddA>p{`TT!TA>TTspxpwTT!TTA>qTTqTTA>TTTbpxpyxA>WdfdfA>pyp{}eddlp{󅩝TTTqTTqsp~ddddpwA>pz_dfegp}adddlA>pudfddnddednddddpu}ddgdpzudddhA>pudddjnddmmndef4nddeeA>A>WdfedA>p}p}~ddgknddempz~dfjgndfeepyyddemA>WdfeeA>pyp{A>󅩝Tsp~ddddpzudddhpwddddpu}ddfdpwbbbbbp}_ddgkpxpwA>pdgddnddefndddjnddddpudgddnddednddddA>pu}ddidA>p}_edddpddfdpxdddfp{A>Tbpxpwppzu}dddhpyxA>A>A>WdgddA>p}~dddlndgdfA>pz~dfjendgdeA>pz~dfhendgdgA>pyp{|Upxpw|TTTT`A>TTspxpyxA>WdgdeA>pyp{TTTA>TqTTqbpxpwTTqTTqA>TTbpxA>vTTTTUpxpyxA>WdgdfA>pyp{|TA>qTTqsUpxA>}!Upxpw'TTTTTA>`TTTA>TTTbpxpyxA>WdgdgA>pyp{|UpxpwT!`TTTA>TTTbpxA>yTTspxpyxA>A> \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Clock.pxe b/res/es/data/sprites_up/Stage/Clock.pxe new file mode 100644 index 0000000..7af0ce4 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Clock.pxe differ diff --git a/res/es/data/sprites_up/Stage/Clock.pxm b/res/es/data/sprites_up/Stage/Clock.pxm new file mode 100644 index 0000000..0cf567b Binary files /dev/null and b/res/es/data/sprites_up/Stage/Clock.pxm differ diff --git a/res/es/data/sprites_up/Stage/Clock.tsc b/res/es/data/sprites_up/Stage/Clock.tsc new file mode 100644 index 0000000..a1c2f57 --- /dev/null +++ b/res/es/data/sprites_up/Stage/Clock.tsc @@ -0,0 +1 @@ +b_xb_b_xb_b_xb_b_xb_b_xb_b_b_xb_b_b_xb_b_uȺuǺb_xb_Ub_uuuĻǺȺʾɺub_Hºu¶ʒvb_xb_BuuuȸǾăɺuķuuuǾuub_ɺ¾öHÃuǾuuĹub_źɾǺuȾɶvb_b_ \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Comu.pxe b/res/es/data/sprites_up/Stage/Comu.pxe new file mode 100644 index 0000000..3504173 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Comu.pxe differ diff --git a/res/es/data/sprites_up/Stage/Comu.pxm b/res/es/data/sprites_up/Stage/Comu.pxm new file mode 100644 index 0000000..8bb823e Binary files /dev/null and b/res/es/data/sprites_up/Stage/Comu.pxm differ diff --git a/res/es/data/sprites_up/Stage/Comu.tsc b/res/es/data/sprites_up/Stage/Comu.tsc new file mode 100644 index 0000000..7cbdadb --- /dev/null +++ b/res/es/data/sprites_up/Stage/Comu.tsc @@ -0,0 +1 @@ +öʥùöʥùöʥùöʥùöʥùʥùʥùʥùʥùʥùǾʥťĥǶαȼ֕ڕڕ֕֕ڂ磣Ĺڕ֣Ĺ֕䡕ޕ裣ĹǷ䡕Vւhڕ֣Ĺùαȼ䣣ڕ磣Ĺڕ䡂硕֕䣱Ĺڕڕᕹ磱ĹΕ֡䣣ڂ֣Ĺùαȼڕւ֕ڕ磱Ĺڕu֣Ĺ֕֕V֣֕Ĺùαȼ硕ڂ䡕h֕ڣĹǺbڂ֕֕ڕڕւڕ裱Ĺᕹ硕裣֣֕Ĺڕ֕֕֕ڕ裱Ĺb֕䡱Ĺ䕶h^䣱Ĺڕւ֣֕Ĺ֕^Ĺڕڕᕹ֕䡕ڂ^ڣĹùɿαȼ䟕ؖĹ裱Ĺùαɦȼ4ᕲڕֲÿıɥɢť̶ȼ裣ĹDZɥ ʥ̶ֲ֕Ĺıʱťùαťù \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Cook.pxm b/res/es/data/sprites_up/Stage/Cook.pxm new file mode 100644 index 0000000..69be87c Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cook.pxm differ diff --git a/res/es/data/sprites_up/Stage/Cthu.pxe b/res/es/data/sprites_up/Stage/Cthu.pxe new file mode 100644 index 0000000..bcd8fbf Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cthu.pxe differ diff --git a/res/es/data/sprites_up/Stage/Cthu.pxm b/res/es/data/sprites_up/Stage/Cthu.pxm new file mode 100644 index 0000000..aad0d13 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cthu.pxm differ diff --git a/res/es/data/sprites_up/Stage/Cthu.tsc b/res/es/data/sprites_up/Stage/Cthu.tsc new file mode 100644 index 0000000..acf830e --- /dev/null +++ b/res/es/data/sprites_up/Stage/Cthu.tsc @@ -0,0 +1 @@ +>;Taaja>;m~rmt~aaaimwrzaaaamvu>;Taajb>;m~rmt~aaaimwrzaaabmvu>;Taajc>;m~rmt~aaaimwrzaaacmvu>;Taajd>;m~rmt~aaaimwrzaaadmvu>;Taaje>;m~rmt~aaaimwrzaaaemvu>;>;Tabaa>;mzmwraaaemraaackaajekabcfkaaac>;Tabab>;mzmaabbmuababmwraaaemraaackaajekabcfkaabc>;>;>;>;Tacaa>;m|vmw}{1cjakacabmw}\bcjam~x_mumt}QQQQp>;QQQ___mu>;u$QQQpmumt}_____mumt}Qp>;yQQQpmu>;{QQ___mumvu>;Tacab>;m|vm~xs]QQQQ>;Q]QQ_mumvu>;>; \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Cthu2.pxe b/res/es/data/sprites_up/Stage/Cthu2.pxe new file mode 100644 index 0000000..0b00baf Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cthu2.pxe differ diff --git a/res/es/data/sprites_up/Stage/Cthu2.pxm b/res/es/data/sprites_up/Stage/Cthu2.pxm new file mode 100644 index 0000000..5ec1a61 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Cthu2.pxm differ diff --git a/res/es/data/sprites_up/Stage/Cthu2.tsc b/res/es/data/sprites_up/Stage/Cthu2.tsc new file mode 100644 index 0000000..a928112 --- /dev/null +++ b/res/es/data/sprites_up/Stage/Cthu2.tsc @@ -0,0 +1 @@ +ROhuu~uROuuu}uuuuROhuu~vROuuu}uuuvROhuu~wROuuu}uuuwROhuu~xROuuu}uuuxEROhuu~yROuuu}uuuyROROhuvuuROuuuyuuy~uu~yuvw{uuuwROhuvuvROuuuyuuy~uu~yuvw{uuvwRORO \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Curly.pxe b/res/es/data/sprites_up/Stage/Curly.pxe new file mode 100644 index 0000000..8c37273 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Curly.pxe differ diff --git a/res/es/data/sprites_up/Stage/Curly.pxm b/res/es/data/sprites_up/Stage/Curly.pxm new file mode 100644 index 0000000..2094a2a Binary files /dev/null and b/res/es/data/sprites_up/Stage/Curly.pxm differ diff --git a/res/es/data/sprites_up/Stage/Curly.tsc b/res/es/data/sprites_up/Stage/Curly.tsc new file mode 100644 index 0000000..15b86b2 --- /dev/null +++ b/res/es/data/sprites_up/Stage/Curly.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|z`cdaj``iels}```blvqy````lu~t=:S``ia=:l}~qls}```blvqy```alu~t=:S``ib=:l}~qls}```blvqy```blu~t=:S``ic=:l}~qls}```blvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```blvqy```dlu~t=:=:S``ie=:ls}``bhlvqy````lu~t=:S``ii=:ls}``bhlvqy```dlu~t=:=:S`a``=:l{ulv|z`efaj`a`bl``aalq~`a``j````j```b=:lvq```blq``a`j``ibj```cj``ab=:S`a`a=:l{ulv|z`efaj`a`bl``aalq~`a`aj````j```b=:lvq```dlq``cbj``idj```hj```i=:S`a`b=:lyl}w~PPQl~tlu~t=:=:=:=:=:S`b``=:l{u=:lv|z`efdj`b`d=:lv|z`efbj`b`f=:l}w~PPPP^l~tlu~t=:S`b`a=:l{ul}wPPPPs^l~t=:PPP\P=:PPP^l~t=:щPPP}sxQl~tlu~t=:S`b`b=:lv|z`bgcj`b`e=:l{ul}wPPPP\=:PPP^^^l~tlu~t=:S`b`c=:l{ul}w^^^l~tls|^^^=:P^^^P^^^l~tlu~t=:S`b`d=:l}w|PPzP=:PPPt^l~t=:uPPP^l~tls|PP^^^l~tls|^^^l~tls|^^^uP*PPP=:Pt^^^ol~tlu~t=:S`b`e=:l{ul}w~PP=:PPP^l~tls|q*PPPP^^^l~t=:PsPPPP=:PP^l~tlu~t=:S`b`f=:l{ul}wuPPPol~t=:xPPPPz=:PPP^l~tls|\PP^l~tls|PPPPP\=:PPP=:PPPPPPP^l~tlv|[`efdlu~t=:=:=:=:S`c``=:l{ult~`c``l}}`l}t````ls}````=:lv|[`efal}wqQl~tls|l{u=:lq~`e``j```cj```blqy``gilq~`e``j````j```b=:l}wlvqs``aiQl~tls|=:ls~`ca`j`abbj```blt~`b``lqy``a`=:ls~`caaj`abbj```blt~`b`alqy``a`=:ls~`cabj`abbj```blt~`b`blqy``a`=:ls~`cacj`abbj```blt~`b`cl}wфPPyyq~uQl~tls|щPPPP=:PPQl~t=:рPQl~t=:|P}PPP=:Ql~t=:|P}P=:QQl~tls||PPP\P^^^l~tls|=:lqy``b`l```dls~`d``j`aahj```blt~`e``=:lqy``a`=:l}wuPPPQl~tls|рPPQQl~tls|=:lr|`d``=:ls}```d=:lq~`d``j``a`j```b=:lq~`ca`j``a`j```b=:lq~`caaj``a`j```b=:lq~`cabj``a`j```b=:lq~`cacj``a`j```b=:lu~t=:=:=:S`ca`=:S`caa=:S`cab=:S`cac=:=:=:=:S`d``=:l{ul}t`d``=:lv|]`efalv|]`efe=:lq~`ca`j``b`j```e=:lq~`caaj``b`j```e=:lq~`cabj``b`j```e=:lq~`cacj``b`j```e=:ls~`d``j`aagj```e=:lq~`d``j```ej```elqy```b=:lq~`d``j``c`j``0dl``g`=:lqy`a``lyls}``ael}w=:цQlqy`ad`ls}````l~tls|=:l{ulq~`d``j```fj```elqy```bly=:lqy``e`ls}```b=:l}wlvqs``b`*P^^^l~t=:~PPP^^^l~tls|PPPP=:PPP}\l~t=:PPP^l~z`da`ls|P^^^l~tls|P^^^l~tlyls|=:lvq```dlq``bij``i`j``abj```i=:=:S`da`=:l{ulv|[`efbl}wlvqs``aiQl~tlvqs````ls|=:lq~`d``j``a`j````lqy``e`=:l}wlvqs``aiPPP=:PP}ol~tls|uPP\Pў=:PPPQl~tls|Ps^=:sPr^l~t=:sPP\=:PPP!^l~tls|lvqs``be~PP=:PP^^^l~t=:P\PPP^l~tls|lvqs``b`u^^^P=:P]}P=:PP^^^l~tls|=:luu`dae=:=:S`dae=:l{ul}wlvqs``ai\P^l~tls|uPuPP=:PPP!=:^l~t=:}PPP=:Pol~z`db`lv|[`efclvqs````ls|=:lq}```bj```dj`a``lwy```buPPmuPm^l~tls|=:ls}``a`lwy```dsPPmqmQlqy`af`l~tl}ls|=:lvq```dlq``bij``i`j``abj```i=:=:S`db`=:l{ul}wlvqs``aitPol~tls|r\PPP=:#\PP^l~tlyls|l}t````=:lvq```dlq``bij``i`j``abj```i=:=:=:=:=:S`e``=:l{u=:lv|z`efcj`ec`=:lv|z`efbj`eae=:l}wlvqs``aixol~tls|\PPPP=:^P}Pq^l~tls|PP=:PP}ol~z`ea`ls|lvqs``b`P^^^l~tls|P^^^l~tlu~t=:=:S`ea`=:l{ulv|[`efbl}wlvqs``aiQl~tls|PPP=:PP}ol~tls|uPP\Pў=:PPPQl~tls|Ps^=:sPr^l~t=:sPP\=:PPP!^l~tls|lvqs``be~PP=:PP^^^l~t=:P\PPP^l~tls|lvqs``b`u^^^P=:P]}P=:PP^^^l~tls|=:luu`eae=:=:S`eae=:l{ul}wlvqs``ai\P^l~tls|uPuPP=:PPP!=:^l~t=:}PPP=:Pol~z`eb`lv|[`efclvqs````ls|=:lq}```bj```dj`a``lwy```buPPmuPm^l~tls|=:ls}``a`lwy```dsPPmqmQlqy`af`l~tl}lu~t=:=:S`eb`=:l{ul}wlvqs``aitPol~tls|r\PPP=:#\PP^l~tlu~t=:=:S`ec`=:l{ul}wlvqs``be|PPP=:PQl~t=:|P}P#P=:PP^l~tlu~t=:=: \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/CurlyS.pxe b/res/es/data/sprites_up/Stage/CurlyS.pxe new file mode 100644 index 0000000..12a9956 Binary files /dev/null and b/res/es/data/sprites_up/Stage/CurlyS.pxe differ diff --git a/res/es/data/sprites_up/Stage/CurlyS.pxm b/res/es/data/sprites_up/Stage/CurlyS.pxm new file mode 100644 index 0000000..fb4c33b Binary files /dev/null and b/res/es/data/sprites_up/Stage/CurlyS.pxm differ diff --git a/res/es/data/sprites_up/Stage/CurlyS.tsc b/res/es/data/sprites_up/Stage/CurlyS.tsc new file mode 100644 index 0000000..2349b89 --- /dev/null +++ b/res/es/data/sprites_up/Stage/CurlyS.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPPP\faiPPPP\end-*CPPYQ-*\mna\cmuPPPP\faiPPPQ\end-*CPPYR-*\mna\cmuPPPP\faiPPPR\end-*CPPYS-*\mna\cmuPPPP\faiPPPS\end-*CPPYT-*\mna\cmuPPPP\faiPPPT\end-*-*CPQPP-*\pri\souPPQQ\dnpPQPP\faoPPPT\traPPRYZPPYTZPPPVZPPPY-*-*-*CPTPP-*\key\souPQPU\msgaA\nod\fljPUVTZPTPQ\end-*CPTPQ-*\itjPPQTZPTQP\clrq @-*@_\ynjPPPP\clr-*\cnpPTPPZPQSVZPPPP\flKPUXP\gitQPQT\itKPPQTc@@]m]N\nod\clo-*\flKSPPP\flMSPPQ\flMSPPR\flMSPPS\flMSPPT-*\flKPRWT\end-*CPTQP-*\pri\msgs@@@N\nod\end-*-*CPTRP-*\key\dnpPTRP\msg\gitQPSU\itKPPSUe@-*]b@@c]N\nod\end-*-*-* \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Dark.pxe b/res/es/data/sprites_up/Stage/Dark.pxe new file mode 100644 index 0000000..ae9cadb Binary files /dev/null and b/res/es/data/sprites_up/Stage/Dark.pxe differ diff --git a/res/es/data/sprites_up/Stage/Dark.pxm b/res/es/data/sprites_up/Stage/Dark.pxm new file mode 100644 index 0000000..2e82562 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Dark.pxm differ diff --git a/res/es/data/sprites_up/Stage/Dark.tsc b/res/es/data/sprites_up/Stage/Dark.tsc new file mode 100644 index 0000000..2a953ed --- /dev/null +++ b/res/es/data/sprites_up/Stage/Dark.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq``a`j``idj``gcj``bg=:=:S`d``=:lyl}wl`a`ewQPl`a`ewQPl0a`ewQl~tlyz``adj`da`ls|PP=:Pol~z````ls|=:ls~`d``j`acfj````lv|[`fa`lwya`adly[``adsPPm}m^l~tlv|[`bgdls|=:lv|]c```lv|]c``alv|[c``blv|]c``clv|]c``d=:lu~t=:S`da`=:lyl}w#PPP^l~tlu~t=:=: \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Drain.pxe b/res/es/data/sprites_up/Stage/Drain.pxe new file mode 100644 index 0000000..89e445b Binary files /dev/null and b/res/es/data/sprites_up/Stage/Drain.pxe differ diff --git a/res/es/data/sprites_up/Stage/Drain.pxm b/res/es/data/sprites_up/Stage/Drain.pxm new file mode 100644 index 0000000..8958a07 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Drain.pxm differ diff --git a/res/es/data/sprites_up/Stage/Drain.tsc b/res/es/data/sprites_up/Stage/Drain.tsc new file mode 100644 index 0000000..a55167a --- /dev/null +++ b/res/es/data/sprites_up/Stage/Drain.tsc @@ -0,0 +1 @@ +b_xb_b_xb_b_xb_b_xb_b_xb_b_b_xb_b_b_xb_b_xb_uȺuǺb_b_xb_b_b_xb_ȸʸuuþuuʶb_κùuuăb_uuʺǶuuuɺȁb_ķºɺuĹBuŶȶǃb_xb_b_b_b_xb_Ub_b_b_b_ʾuuuǾĔb_b_b_b_uĹuŶȶuuBb_úuʺuȺʾb_˶϶ùăb_b_b_b_b_b_b_xb_b_xb_uuHÃuȶȃb_b_b_b_b_b_b_b_b_ \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/EgEnd1.pxe b/res/es/data/sprites_up/Stage/EgEnd1.pxe new file mode 100644 index 0000000..1eb67ab Binary files /dev/null and b/res/es/data/sprites_up/Stage/EgEnd1.pxe differ diff --git a/res/es/data/sprites_up/Stage/EgEnd1.pxm b/res/es/data/sprites_up/Stage/EgEnd1.pxm new file mode 100644 index 0000000..fc1dad5 Binary files /dev/null and b/res/es/data/sprites_up/Stage/EgEnd1.pxm differ diff --git a/res/es/data/sprites_up/Stage/EgEnd1.tsc b/res/es/data/sprites_up/Stage/EgEnd1.tsc new file mode 100644 index 0000000..f196b79 --- /dev/null +++ b/res/es/data/sprites_up/Stage/EgEnd1.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswsssu}ss|w}su|z}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/EgEnd2.pxe b/res/es/data/sprites_up/Stage/EgEnd2.pxe new file mode 100644 index 0000000..1eb67ab Binary files /dev/null and b/res/es/data/sprites_up/Stage/EgEnd2.pxe differ diff --git a/res/es/data/sprites_up/Stage/EgEnd2.pxm b/res/es/data/sprites_up/Stage/EgEnd2.pxm new file mode 100644 index 0000000..fc1dad5 Binary files /dev/null and b/res/es/data/sprites_up/Stage/EgEnd2.pxm differ diff --git a/res/es/data/sprites_up/Stage/EgEnd2.tsc b/res/es/data/sprites_up/Stage/EgEnd2.tsc new file mode 100644 index 0000000..c6570d7 --- /dev/null +++ b/res/es/data/sprites_up/Stage/EgEnd2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswssw|}ss|w}su|y}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Egg1.pxe b/res/es/data/sprites_up/Stage/Egg1.pxe new file mode 100644 index 0000000..e8969fb Binary files /dev/null and b/res/es/data/sprites_up/Stage/Egg1.pxe differ diff --git a/res/es/data/sprites_up/Stage/Egg1.pxm b/res/es/data/sprites_up/Stage/Egg1.pxm new file mode 100644 index 0000000..3195bb8 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Egg1.pxm differ diff --git a/res/es/data/sprites_up/Stage/Egg1.tsc b/res/es/data/sprites_up/Stage/Egg1.tsc new file mode 100644 index 0000000..69a64a0 --- /dev/null +++ b/res/es/data/sprites_up/Stage/Egg1.tsc @@ -0,0 +1 @@ +_\u_\_\u_\_\u_\_\u_\_\u_\_\_\u_\_\_\u_\RļƳrrƻrųĻ_\³ijrųƻȳrrŵǶ_\u_\}ŷƳƷr_\ļƳrrƻ_\ŵǶrųƻȳ_\u_\rŵǶr3rųƻȳ_\_\ \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Egg6.pxe b/res/es/data/sprites_up/Stage/Egg6.pxe new file mode 100644 index 0000000..38b8916 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Egg6.pxe differ diff --git a/res/es/data/sprites_up/Stage/Egg6.pxm b/res/es/data/sprites_up/Stage/Egg6.pxm new file mode 100644 index 0000000..3195bb8 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Egg6.pxm differ diff --git a/res/es/data/sprites_up/Stage/Egg6.tsc b/res/es/data/sprites_up/Stage/Egg6.tsc new file mode 100644 index 0000000..ebedf2c --- /dev/null +++ b/res/es/data/sprites_up/Stage/Egg6.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq```bj0`idj`agij``a`=:=:S`b``=:lylv|z`ad`j```alv|[`ad`l``bbls~`b``j``baj````=:l}wxPPP^l~tlwya``gly[```gls|ls}``a`sP=:mPPym^lqy`af`l~tl}lu~t=:=: \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/EggIn.pxa b/res/es/data/sprites_up/Stage/EggIn.pxa new file mode 100644 index 0000000..e3f5673 Binary files /dev/null and b/res/es/data/sprites_up/Stage/EggIn.pxa differ diff --git a/res/es/data/sprites_up/Stage/EggR.pxe b/res/es/data/sprites_up/Stage/EggR.pxe new file mode 100644 index 0000000..02765f1 Binary files /dev/null and b/res/es/data/sprites_up/Stage/EggR.pxe differ diff --git a/res/es/data/sprites_up/Stage/EggR.pxm b/res/es/data/sprites_up/Stage/EggR.pxm new file mode 100644 index 0000000..bd58185 Binary files /dev/null and b/res/es/data/sprites_up/Stage/EggR.pxm differ diff --git a/res/es/data/sprites_up/Stage/EggR.tsc b/res/es/data/sprites_up/Stage/EggR.tsc new file mode 100644 index 0000000..932a451 --- /dev/null +++ b/res/es/data/sprites_up/Stage/EggR.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPPX\faiPPPP\end-*CPPYQ-*\mna\cmuPPPX\faiPPPQ\end-*CPPYR-*\mna\cmuPPPX\faiPPPR\end-*CPPYS-*\mna\cmuPPPX\faiPPPS\end-*CPPYT-*\mna\cmuPPPX\faiPPPT\end-*-*CPQPP-*\pri\faoPPPT\traPPPRZPPYTZPRRPZPPPW-*-*CPQUP-*\key\msgh@ @@N\nod\end-*-*CPRPP-*\key\msge@@N\nod\clr\turc@@@L@@-*@@@@@nN@PPN\nod\clr\turc@@@@@@ -*@@@@@NNN\nod\end-*-*CPSPP-*\pri\fljPRPPZPPPQ\flKPRPP-*\souPPRR\cnpPSPPZPPRQZPPPP-*\msgh@@@N\nod\clr\evePPSP-*-*-*CPUPP-*-*CPUPQ-*\pri\msS\turh@@d@c@nN@PQ-*eZ@c@@@N-*s@@N\nod\end-*CPUPR-*\pri\msS\turh@@d@c@nN@PR-*c@N\nod\end-*CPUPS-*\pri\msS\turh@@d@c@nN@PS-*c@N\nod\end-*CPUPT-*\pri\msS\turh@@d@c@nN@PT-*c@N\nod\end-*CPUPU-*\pri\msS\turh@ d@c@nN@PU-*c@N\nod\end-*CPUPV-*\pri\msS\turh@@d@c@nN@PV-*eZ@c@@@N-*s@@N\nod\end-*CPUPW-*\pri\msS\turh@@d@c@nN@PW-*c@N\nod\end-*CPUPX-*\pri\msg\turh@@d@c@nN@PX-*c@N\nod\end-*CPUPY-*\pri\msg\turh@@d@c@nN@PY-*c@N\nod\end-*CPUQP-*\pri\msg\turh@@d@c@nN@QP-*c@N\nod\end-*CPUQQ-*\pri\msg\turh@@d@c@nN@QQ-*c@N\nod\end-*CPUQR-*\pri\msg\turh@@d@c@nN@QR-*c@N\nod\end-*CPUQS-*\pri\msg\turh@@d@c@nN@QS-*c@N\nod\end-*CPUQT-*\pri\msg\turh@@d@c@nN@QT-*c@N\nod\end-*CPUQU-*\pri\msg\turh@@d@c@nN@QU-*c@N\nod\end-*CPUQV-*\pri\msg\turh@@d@c@nN@QV-*c@N\nod\end-*-* \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/EggR2.pxe b/res/es/data/sprites_up/Stage/EggR2.pxe new file mode 100644 index 0000000..f463640 Binary files /dev/null and b/res/es/data/sprites_up/Stage/EggR2.pxe differ diff --git a/res/es/data/sprites_up/Stage/EggR2.pxm b/res/es/data/sprites_up/Stage/EggR2.pxm new file mode 100644 index 0000000..df704ac Binary files /dev/null and b/res/es/data/sprites_up/Stage/EggR2.pxm differ diff --git a/res/es/data/sprites_up/Stage/EggR2.tsc b/res/es/data/sprites_up/Stage/EggR2.tsc new file mode 100644 index 0000000..19c2b2d --- /dev/null +++ b/res/es/data/sprites_up/Stage/EggR2.tsc @@ -0,0 +1 @@ +?FWXKFPVT:?C?D::C?FUOcFMW_::;;FPKS:::>FO`O:<::-::C?FWXKFMW_::;CFPKS:::>FOXN-:;::FZ\SF]Y_::;;FNXZ:;::FPKY:::>F^\K::;:D::C>D::=?D::<@-:<::FUOcFWcN::::FKXZ:>::D::=:D::::FW]QFPKM::;>Vk*vvko*nov*kvwkmxIFXYN`kk6*Q\KMSK]6*xy~oxk}*zy|*{*wyvo}~k|~o+FXYNck*yvo|owy}*k*o|xy}+FXYNFMV\FPKM::;=O}zo|k++FXYNFMVYFKXZ:>::D::=:D:::::D::;:D:::FS^7::;>FW]QFPKM::;=Yyrrr888FXYN*888^IFXYNFPKM::::FMVYFaKS::?:FMXZ:<<:D:;==D::::FaKS::?:FW]QFQS^;:;>FPKM::::Vo*ns}~o*vk*GWk}my~kG8FXYNFQS^::::FMXZ:=::D:;=:D::::FNXZ:>:;FPV7:FMV\FPKM::;=Vk*vvko888FXYNWo*rkx*|ylkny*vk*vvko888FXYNZy|*pky|8Nolo}*no~oxo|vy}8FXYNFMV\Zvkxokx*oxp|omo|*k*vy} +Wswsqk}**}yv~k|vy}ox*vk*}zo|psmso8FXYNFMV\Yr6*}888FXYN[s*~o*sx~o|o}o*vvok|~oo}~y888FXYNFQS^;:;?FS^5::;?FMV\FPKM::::FMW_::;:Myx}oqs}~o*x*GP|k}my*no*]kvnG+FaKS:;@:FXYNF\W_FMV\FPKM::;=Zono}*}k|*o}~y*xk6zo|y*}vy*xk*o6*zk|k|o}~k|k|*~*oxo|qk8FXYNFOXN-:<=:FUOcFPVT:B=:D:<=;FW]QFPKM::;=Zy|*pky|+FXYNNolo}*no~oxo|vy}+FXYNFMV\Zvkxokx*oxp|omo|*k*vy}Wswsqk}**}yv~k|vy}ox*vk*}zo|psmso+FXYNFOXN-:<=;FUOcFS^T::;?D:<=<FW]QFPKM::;=Kr6*soxo}*ox*xlox*wywox~y8FXYNFQS^;:;?FS^5::;?FMV\FPKM::::\omsls}~o*x*GP|k}my*no*]kvnG+FaKS::=:FXYNFQS^::::FMV\FPKM::;=`ovo*}s*kvqxko*xomo}s~k}*y~|y8FXYNO}*vy*woxy}*{o*o}~kkxmskxk*zono*rkmo|888FXYNFOXN-:<=<FUOcFW]QFPKM::;=Sxmv}y*xk*l|tk*mywy*yoxotomo**}o*nolsvs~k888FXYNVy*xsmy*{o*zony*rkmo|kry|k*o}*zy}k|*~ynk}ws}*o}zo|kxk}*ox*~s888FXYNFOXN-:=::FUOcFW]Q4qswy~oy4888FXYNFOXN-:>::-:>:; \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Kings.pxe b/res/es/data/sprites_up/Stage/Kings.pxe new file mode 100644 index 0000000..b6665ff Binary files /dev/null and b/res/es/data/sprites_up/Stage/Kings.pxe differ diff --git a/res/es/data/sprites_up/Stage/Kings.pxm b/res/es/data/sprites_up/Stage/Kings.pxm new file mode 100644 index 0000000..c8342b2 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Kings.pxm differ diff --git a/res/es/data/sprites_up/Stage/Kings.tsc b/res/es/data/sprites_up/Stage/Kings.tsc new file mode 100644 index 0000000..9ed7131 --- /dev/null +++ b/res/es/data/sprites_up/Stage/Kings.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlvqy````lu~t=:S``ia=:l}~qlvqy```alu~t=:S``ib=:l}~qlvqy```blu~t=:S``ic=:l}~qlvqy```clu~t=:S``id=:l}~qlvqy```dlu~t=:=:S`a``=:l{ul}~qlqy``e`lvqy```a=:lq~`c``j``a`j```0lqy``ig=:lq~`c``j```aj````lqy``e`=:lq~`c``j``b`j````lqy``fd=:lq~`c``j```aj````lqy``af=:lq~`c``j``c`j````lqy``e`=:lq~`c``j``d`j````lqy``ig=:lvq```alqyiiii=:=:S`c``=:=: \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Labo.pxa b/res/es/data/sprites_up/Stage/Labo.pxa new file mode 100644 index 0000000..9b5a39a Binary files /dev/null and b/res/es/data/sprites_up/Stage/Labo.pxa differ diff --git a/res/es/data/sprites_up/Stage/Little.pxe b/res/es/data/sprites_up/Stage/Little.pxe new file mode 100644 index 0000000..14d8dd0 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Little.pxe differ diff --git a/res/es/data/sprites_up/Stage/Little.pxm b/res/es/data/sprites_up/Stage/Little.pxm new file mode 100644 index 0000000..b50449c Binary files /dev/null and b/res/es/data/sprites_up/Stage/Little.pxm differ diff --git a/res/es/data/sprites_up/Stage/Little.tsc b/res/es/data/sprites_up/Stage/Little.tsc new file mode 100644 index 0000000..456ef9a --- /dev/null +++ b/res/es/data/sprites_up/Stage/Little.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_:::FWXKFMW_:::FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::FWXKFMW_::;CFPKS:::>FOXN +-:;::FZ\SFPKY:::-:;:;FZ\SFPKY:::;F^\K::=CD::C;D:::>D::;@-:<::FZ\SFW]QO}*x*|yly~8Y*kv*woxy}*vy*{o*{onk*no*v8FXYNFOXN \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/MazeI.pxe b/res/es/data/sprites_up/Stage/MazeI.pxe new file mode 100644 index 0000000..d301a2f Binary files /dev/null and b/res/es/data/sprites_up/Stage/MazeI.pxe differ diff --git a/res/es/data/sprites_up/Stage/MazeI.pxm b/res/es/data/sprites_up/Stage/MazeI.pxm new file mode 100644 index 0000000..ec76fcc Binary files /dev/null and b/res/es/data/sprites_up/Stage/MazeI.pxm differ diff --git a/res/es/data/sprites_up/Stage/MazeI.tsc b/res/es/data/sprites_up/Stage/MazeI.tsc new file mode 100644 index 0000000..86fc6b0 --- /dev/null +++ b/res/es/data/sprites_up/Stage/MazeI.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_::;CFPKS::::FOXN-::C;FWXKFMW_::;CFPKS:::;FOXN-::C<FWXKFMW_::;CFPKS:::FWXKFMW_::;CFPKS:::>FOXN-:;::FZ\SFPKY:::>F^\K::;:D::C>D:<<;D:<:=FZ\SFW]QXy*}o*kl|o888FXYNFOXN-:<:=FZ\SFPKY::::F^\K::=BD::C:D::=?D::;=-:<:>-:<:?-:=::FZ\SF]Y_::<::FUOcFKXZ:?:;D::;:D::::<FUOcFPVT:@>;D:>:=FW]Q[so|o}*kl|s|*vk*zo|~kIFcXT::::FMVY +FPV5:@>;FPYX:<:FaKS:;?:F]Y_::>=FKXZ:<:>D::;:D::::FaKS:::BFKXZ:?:FNXZ:<:?FPYW::=:=FUOcFW]QZo|~k*klso|~k8FXYNFOXN-:>;:-:?::FZ\SFW]Q]oq|y*{o*Ws}o|*~o*rk*~s|knyk{8FXYNZyl|oms~y888FXYN}~o*o}*ov*o|~ono|y*no*vk*s}vk8FXYN_xk*o*ox~|k}6xxmk*ovo}*k*}kvs|888FXYNFOXN-:?:;-:?:<FZ\SFW]QOv*sx~o||z~y|*{o*kl|o*o}~kzo|~k*nolo*o}~k|*kvv*k||slk8FXYNZo|y*ov*mkwsxy*o}*kvqy*mywzvsmkny8FXYNWo*ro*mkny*k*~kx~k}*omo}{o*wo*ro*|y~y*vk}*zso|xk}8FXYNFOXN-:?:=FZ\SFW]QXy*rk*|o}zo}~k8FXYNFOXN=AD*WkoS******:@>:*7*:@?C:@>:D:@>;DT:@>**3+6GH;6=GO***26@;C***+6?H>**3,6GH;6=GO***26@FD*10+4**3/6@;C***,6?H>**3-6GH;6=GO***26@;C***-6?H>**3.6GH;6=GO***26@;C***.6?H>**3/6;HJ*-**4**,*4****6@;C***,6?H>*+**6E?S6@FD*10-4*+*+6MIO**++6;HJ*+**4****4***,6@;I****6GS>****6NL;**.-4**3*4**+04**+-*+*+6JLC6GMAHim_[\l_6HI>6?H>*++*6@FD*10.4*+++6?H>*+++6E?S6@;I***.6GS>***,6NL;**./4**3,4***,4***/*,**6JLC6@FD*,*+4*,*+6GMA;faoc_hf_b[jo_mnioh_h][hni(Him_[\l_(((6HI>6?H>*,*+6@FD*1004***+6@F%*1006@F'*10/6@F%*,*,6MIO**,,6=HJ*,**4**,+4****6GMAB[m[\c_lni_f]i`l_(6HI>6=FL6N;G***/4**+*4****6=GO**+*6ACN**+*NomGcmcf_mb[hmc^ijin_h]c[^im6Q;C*+0*6HI>6LGO6?H>*-**6E?S6@FD*10.4*-*-6@FD*10,4*-*,6@FD*10+4*-*+6@F%*10+6GMA6@;=**+3;d6HI>G_jl_aohn[\[]oh^ip_h^l[m(6HI>6=FLMc]ihm_aocgimgip_l_mn[al[hli][&ji^l_gimff_a[l[f[m[fc^[(6HI>6=FLMch_g\[lai&b[slogil_m^_ko_nl[m_ff[_mn_fhc^i^_ohgihmnloi(((6HI>;mko_^_\_l[m_mn[ljl_j[l[^i(6HI>6=FL>_ni^[m`ilg[m&^_mb[agihim^__mn[]im[^_oh[p_t(6HI>?gjod[jil_m_f[^i(6HI>6=FI6;HJ*-**4**,*4****6?H>*-*+6E?S6;HJ*-**4****4****6GMA6@;=**+3I]oll_[fai96HI>Hi_mn[lm[momn[^i&p_l^[^96HI>6=FL>o^iko_fi_mnm(6HI>P_ha[&_gjod[jil_m_f[^i(6HI>6;HJ*-**4**,*4****6?H>*-*,6JLC6GMAHcm_b[chgon[^i(6HI>6?H>*-*-6JLC6GMA6@;=**+3P[gim6HI>6=FLB[sohhc^iff_hi^_gihmnloim_mj_lh^ihim6HI>6?H>*-+*6E?S6=HJ*-+*4**+,4***.46;HJ*-+*4**2*4***/6MG=6=GO**+/6GMA>_llin[mn_[<[flia6Q;C*+.*6HI>6=FI6@;=****6=GO***26@;I***.6GS>***,6NL;**..4*0**4***34**+.6?H>*-,*6E?S6@FD*10,4*-,,6@FD*10+4*-,+6?P?*/***-,+6E?S6GHJ*-,*4****4****4****6GS>***,6GS>***-6GMA6@;=**+3Jl_j[l[^i9?gjod[6HI>6=FI6@;=****6;HJ*-**4**,*4****6Q;C**/*6GMALLLLAB6HI>6=FI6@;=****6=HJ*/+*4*--.4****6=HJ*/++4*--.4***,6Q;C*+**6GMA6@;=**,*(((((6HI>6=FI6@;=****6;HJ*-**4****4****6Q;C**/*6GS>***,6GMA6@;=**,/Him_b[gipc^ih[^[(6HI>Hi]l_iko_[faohi^_fim^imm_[][j[t^_gip_lf[(((6HI>6@;=****6=FI6Q;C**/*6GMABott[b6=GO****6HI>6=FI6=HJ*-+*4***34***,6Q;C*+**6=HJ*-+*4**+,4***,6;HJ*-+*4**-*4***,6=GO**++6GS>****6GMA6@;=**+3N6HI>6=FL6@;=**+.Dididi6HI>6=FL;mko_m_aompcpim6HI>6=FLHimfi_mi&mchiko_n[g\chchn_hncmm[fcl^_fF[\_lchni6HI>6=FLHi^_\_l[cmko_^[lim]igifib[l[oh\o_hli\in96HI>6=FLHchaohi^_himinlimjo_^_b[]_l`l_hn_[f>i]nil&sgo]big_himpiminlim(6HI>6=FLA_hc[f&jo_m6HI>Pis[jih_lf_`ch[_mni6HI>6=FL?mj_liko_hiimcgjiln_ko_im]ihpc_ln[_h]b[n[ll[6HI>6=FL6@;=**+3Domni[koc_h_mn\[gim\om][h^i6HI>Jo_^_m_gjod[ljil_f]_hnli&jil`[pil96HI>6@;=****6=FI6=GO****6Q;C*+**6;HJ*-+*4**0*4***,6Q;C**.26;HJ*-+*4**/*4***,6Q;C**,*6;HJ*-**4**,*4****6Q;C**,*6GS>***,6GS>***-6GMA6@;=**+3Jl_j[l[^i9Ohi&^im(((6HI>6;HJ*-+*4**2*4****6GS<***,6;HJ*-**4**-*4****6MIO**1,6=FL6@;=**,-;=;MIG??MNCM?M=O=B;H>I96HI>6;HJ*-+*4****4****6=GO***.6=HJ*-+*4*+034****6*-,,6JLC6?H>*--**/**6E?S6@FD*10,4*/*,6@FD*10+4*/*+6GMA?moh[al[hsj_m[^[li][(6HI>Nl[m_ff[jo_^_mm_hncl_fpc_hnimijf[h^i(6HI>J[l_]_ko_m_h_]_mcn[l[h[fg_him^imj_lmih[mj[l[gip_lf[(6HI>6?H>*/*+6E?S6Q;C**+*6;HJ*-**4****4****6GMA6@;=**,*Ji^l[m_gjod[lf[^_m^_gm[f_rnl_gi96HI>6=FI6;HJ*-**4**,*4****6?H>*/*,6JLC6GMA?moh[al[hsj_m[^[li][(6HI>6?H>*/+**/++*0**6E?S6@F'*10-6@F%*10.6@F'*10*6MG=6=GO***26=HJ*--*4**+,4***,6;HJ*-**4****4***,6GHJ*-,*4****4****4****6@;C***.6GMA6@;=***/Na[h[m(((6HI>6=FLIm[so^[l[gip_lf[li][(6HI>J_lil_]il^[^(((6HI>6;HJ*--*4****4****6=FLHif_^cacm[H;>C?ko_imb_[so^[^i(6HI>6=FL6@;=**+3Nom_]l_ni_mn[m[fpi]ihhiminlim6HI>6@;=****6=FI6;HJ*--*4**0*4****6Q;C**.*6;HJ*--*4**/*4***,6Q;C**,*6GS>***-6;HJ*-**4**,*4****6GMA6@;=**+3Jl_j[l[^i9?gjod[6HI>6=FI6@;=****6;HJ*/**4**+*4****6Q;C*+**6;HJ*--*4**2*4***,6;HJ*-**4****4***,6;HJ*/**4**,*4****6GS>***,6GMA6@;=**,-A[[[[bbbb6Q;C**/*6=FI6@;=****6;HJ*--*4****4***,6Q;C*+**6GMA6@;=***/;bil[&l_]il^[^(6;HJ*-**4****4****6HI>Hif_^cacm[h[^c_&j_lih[^c_&h[^c_&ko_imb_[so^[^i(6HI>6=FL6@;=**+3Hifib[l_gim6HI>6=FI6@;=****6;HJ*--*4**+*4****6Q;C*+0*6=HJ*,**4**+/4***,6Q;C**.*6GMA6@;=**+3Hi]l_iko_m_[n[hg[fi^_mjom^_ni^i(6HI>6=FI6@F%*12+6@F%*10/6=HJ**+04**+04***,6?H> \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/MazeW.pxe b/res/es/data/sprites_up/Stage/MazeW.pxe new file mode 100644 index 0000000..63818ec Binary files /dev/null and b/res/es/data/sprites_up/Stage/MazeW.pxe differ diff --git a/res/es/data/sprites_up/Stage/MazeW.pxm b/res/es/data/sprites_up/Stage/MazeW.pxm new file mode 100644 index 0000000..21559a0 Binary files /dev/null and b/res/es/data/sprites_up/Stage/MazeW.pxm differ diff --git a/res/es/data/sprites_up/Stage/MazeW.tsc b/res/es/data/sprites_up/Stage/MazeW.tsc new file mode 100644 index 0000000..f85658d --- /dev/null +++ b/res/es/data/sprites_up/Stage/MazeW.tsc @@ -0,0 +1 @@ +FC\iiriFCuzu|iilpuziiiiu~}FC\iirjFCuzu|iilpuziiiju~}FC\iirkFCuzu|iilpuziiiku~}FC\iirlFCuzu|iilpuziiilu~}FC\iirmFCuzu|iilpuziiimu~}FCFC\ijiiFCuuziiikuziilqsiirksiiinsiiilFCFC\ijijFCFC\ijikFCuuiijju}ijikuziiimuziimisiirksiiimsiiinFCFC\ijilFCuioqjsijinFCuiijpsijimFCuugu}u~}FC\ijimFCuuiikkujijpudioqjFCuYYvYYY|&vgu}u|u~~ijinFC\ijinFCuuiijju}ijiluziiiiuziimjsiirisiijnsiiirFCFC\ijioFCu~uiijjuzijiosiiiisiiikuziiimuziimksiirmsiiinsiii9FCFC\ijjiFCuipmisijjjFCu~uiijjuzijjisiiiisiiikuziiikuziimlsiniisiiimsiijlFC\ijjjFCu~uiijjuzijjisiiiisiiikuziiikuziimlsiirksiiimsiijlFCFC\ijkiFCu~uziiimuziimisiirmsiijksiiikFCFCFCFC\iliiFC\ilijFCu}iliju{ziiijufioqiu~}FC\ilikFCu}iliku|iiipu{ziijiu|iliisiijlsiiiiu{iiiiu~}FCFC\jiiiFCu~u{iiiisiijouzikniu|iiiiFCulu|iijnFC}YYYguiijouzijoiu}u|u|iilpFCu|iliisiiiisiiiiudioqiu~}FCFCFC\jkiiFCu~uzjkiisiikisiiikFCujkiisiijouziiijFCuzijiiuziiijuziimpsjkiisiilqsiijoFCFC \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/MiBox.pxe b/res/es/data/sprites_up/Stage/MiBox.pxe new file mode 100644 index 0000000..3fb5faf Binary files /dev/null and b/res/es/data/sprites_up/Stage/MiBox.pxe differ diff --git a/res/es/data/sprites_up/Stage/MiBox.pxm b/res/es/data/sprites_up/Stage/MiBox.pxm new file mode 100644 index 0000000..35422ed Binary files /dev/null and b/res/es/data/sprites_up/Stage/MiBox.pxm differ diff --git a/res/es/data/sprites_up/Stage/MiBox.tsc b/res/es/data/sprites_up/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/es/data/sprites_up/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Mimi.pxa b/res/es/data/sprites_up/Stage/Mimi.pxa new file mode 100644 index 0000000..94e8fc0 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Mimi.pxa differ diff --git a/res/es/data/sprites_up/Stage/Mimi.pxe b/res/es/data/sprites_up/Stage/Mimi.pxe new file mode 100644 index 0000000..5b68f62 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Mimi.pxe differ diff --git a/res/es/data/sprites_up/Stage/Mimi.pxm b/res/es/data/sprites_up/Stage/Mimi.pxm new file mode 100644 index 0000000..7fc90d8 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Mimi.pxm differ diff --git a/res/es/data/sprites_up/Stage/Mimi.tsc b/res/es/data/sprites_up/Stage/Mimi.tsc new file mode 100644 index 0000000..d4e8bae --- /dev/null +++ b/res/es/data/sprites_up/Stage/Mimi.tsc @@ -0,0 +1 @@ +`]v`]`]v`]`]v`]`]v`]`]v`]`]`]v`]`]v`]`]v`]`]v`]`]v`]`]`]`]v`]`]`]Ŵ`]v`]~~`]ƴǸssɸssǻŐ`]v`]`]`]`]v`]`]v`]`]`]s`]sƸsss@ǴsȸǴsɴs`]Ǹżsss`]<¸sǻsƶƴs`]ốsȸsyyyv{~{{{|{{{{{{}{{{{XUXUn{~{{XUzzyyXU>kkkĞyXUxkkk}{|{kxXUXUXUn|{{{XUXU \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Statue.pxe b/res/es/data/sprites_up/Stage/Statue.pxe new file mode 100644 index 0000000..4bb689c Binary files /dev/null and b/res/es/data/sprites_up/Stage/Statue.pxe differ diff --git a/res/es/data/sprites_up/Stage/Statue.pxm b/res/es/data/sprites_up/Stage/Statue.pxm new file mode 100644 index 0000000..8474794 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Statue.pxm differ diff --git a/res/es/data/sprites_up/Stage/Statue.tsc b/res/es/data/sprites_up/Stage/Statue.tsc new file mode 100644 index 0000000..9c01cd0 --- /dev/null +++ b/res/es/data/sprites_up/Stage/Statue.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSSSS_idlSSSS_hqg0-FSS\T0-_pqd_fpxSSSS_idlSSST_hqg0-FSS\U0-_pqd0-_dqsSUSS]SSSS]SSWS0-_dqsSUST]SSSS]SSVS0-_dqsSUSU]SSSS]SSUS0-_iomTXVW]SS\X0-_dqsSUSV]SSSS]SSSS0-_fpxSSSS_idlSSSU_hqg0-FSS\V0-_pqd_fpxSSSS_idlSSSV_hqg0-FSS\W0-_pqd_fpxSSSS_idlSSSW_hqg0-0-FSS\X0-_dqsSUSV]SSSS]SSTS_zdlSSST0-_dqsSUSS]SSTS]SSWS0-_dqsSUST]SSTS]SSVS0-_dqsSUSU]SSTS]SSUS0-_dqsSUSV]SSTS]SSTS0-_idlSSSU_hqg0-0-0-FSTSS0-_nh|_vrxSSTT_dqsSTSS]SSSS]SSSU0-_idrSSSS_iomTXVW]STST0-_fpxSSUW_wudSS[W]SS\S]SST\]SSUT0-#STST0-_wudSS[X]SS\Y]SST\]SSUT0-0-FSUSS0-FSUST0-FSUSU0-FSUSV0-0-FSUTS0-_nh|_iomTX\S]SUUS_pvj_wxu0-~CkC_qrg_hqg0-FSUTT0-_nh|_iomTX\T]SUUT_pvj_wxu0-~CdC_qrg_hqg0-FSUTU0-_nh|_iomTX\U]SUUU_pvj_wxu0-~CpC_qrg_hqg0-FSUTV0-_nh|_iomTX\V]SUUV_pvj_wxu0-~CiCgC_qrg_hqg0-0-FSUUS0-_nh|_pvj_wxu0-~CtC_qrg_hqg0-FSUUT0-_nh|_pvj_wxu0-~CwC_qrg_hqg0-FSUUU0-_nh|_pvj_wxu0-~CnC_qrg_hqg0-FSUUV0-_nh|_pvj_wxu0-~CfCeC_qrg_hqg0-0-0-FSVSS0-_nh|_pvjQQQQQ_qrg_hqg0-0- \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Store.pxa b/res/es/data/sprites_up/Stage/Store.pxa new file mode 100644 index 0000000..df5d94d Binary files /dev/null and b/res/es/data/sprites_up/Stage/Store.pxa differ diff --git a/res/es/data/sprites_up/Stage/Stream.pxe b/res/es/data/sprites_up/Stage/Stream.pxe new file mode 100644 index 0000000..3484411 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Stream.pxe differ diff --git a/res/es/data/sprites_up/Stage/Stream.pxm b/res/es/data/sprites_up/Stage/Stream.pxm new file mode 100644 index 0000000..9f85eb3 Binary files /dev/null and b/res/es/data/sprites_up/Stage/Stream.pxm differ diff --git a/res/es/data/sprites_up/Stage/Stream.tsc b/res/es/data/sprites_up/Stage/Stream.tsc new file mode 100644 index 0000000..645dbd8 --- /dev/null +++ b/res/es/data/sprites_up/Stage/Stream.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_xqlSSST_p|gSSSU_idlSSSU_evoSSSS_hqg0-FSS\V0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSW_hqg0-0-FSS\X0-_fpxSSUV_idlSSSS_hqg0-0-FSTSS0-_nh|_idrSSST_fvv_wudSSWZ]SS\T]SSS[]SSS\0-0-FSUSS0-#SUTS0-0-0-FTSSS0-_nh|_erdTSSS0-_dqsSUSS]SSTS]SSSS0-_dqsSUTS]SSTS]SSSS0-_zdlSVSS_idrSSSU0-_xqlSSSS_fvv_hyhTSST0-0-FTSST0-_lwmSST[]TSTS_ioNSTYS_hyhTSSU0-0-FTSSU0-_fpxSSSS_iomS[VY]TSSV_hyhTSTS0-0-FTSSV0-_ioPS[VY_iomS[XT]TSTS_ioNTSWU0-_hyhTSTS0-0-FTSTS0-_qfmSVVY]TSTT0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0-FTSTT0-_lwNSSVY0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0- \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/Weed.pxa b/res/es/data/sprites_up/Stage/Weed.pxa new file mode 100644 index 0000000..303184c Binary files /dev/null and b/res/es/data/sprites_up/Stage/Weed.pxa differ diff --git a/res/es/data/sprites_up/Stage/Weed.pxe b/res/es/data/sprites_up/Stage/Weed.pxe new file mode 100644 index 0000000..d28877e Binary files /dev/null and b/res/es/data/sprites_up/Stage/Weed.pxe differ diff --git a/res/es/data/sprites_up/Stage/Weed.pxm b/res/es/data/sprites_up/Stage/Weed.pxm new file mode 100644 index 0000000..6e3e85d Binary files /dev/null and b/res/es/data/sprites_up/Stage/Weed.pxm differ diff --git a/res/es/data/sprites_up/Stage/Weed.tsc b/res/es/data/sprites_up/Stage/Weed.tsc new file mode 100644 index 0000000..37f84ab --- /dev/null +++ b/res/es/data/sprites_up/Stage/Weed.tsc @@ -0,0 +1 @@ +nknknknknknknknknknknknknknknknknknknknknknknknknknknknk ԁӁƁӠnknknknknkBЏnknknknknknknknknknkBЏnknkƁƁžnknknknknknknknknknknknknknknknkƁƁBЏnkƃBnkρnknkƁƁƁƞnknknknknknknknknknknknknknknkƁnknknk́ӝnknknknknknknknknknkƁƁƁžnknknknkЏ ρЁƁƠnkNƁNnkЏЍ͏nknknknknknkԁЁ́ƏnkƁЁƁžnknknknknknknknkԁԁЁϏnkρЁnkƁnkʁԁӁƁρnkӍBԁƁnk́ӏnknkJƁƁρЏʁԁ́TρƁnkԁρӁƁnkBԁBԁԏnknknkʁԁӁӁNnkρЁρԁNԁnkЁƁρƏnknknkЁƁNnkƁƁЁnknknknknknknkЁƁƏnknknknknknknknkNԁρJԁnḱЏnkڂNԁρρЏnk ԁƠnkƁNӁƁNԂƁЏnkԁЁƁaJЁρ́Џnk ԁӁځӁnkρ nknk ƁŠnknknkӁӏnk"Ɓnknk J ЁƁnk nk͏nknknkЁƁnkƁӁnknkʁЁƁnkƁӁnkTЁӁTЁnkԏnknknk J ԠNNӏnk NƁBԁnkԁԠ ԁЁƁƁƠnkρЏnkƁЏnkƁƁƁƞρŏnkρƁƃnkƁƁӁTϏnkNЁρʍЂnknk N ԁ nknknknkЁƏnknknkЁƏnknknknkƁ́ОnknknknknknknkԁЁ́ƏnknknknkƁnkBƁNžnkŁBnknknknknknk РnknknknknknknknknkʁƁԁЁnkЁƁƁʁnkӁԏnkƁʁЁʁnkNƁӁ́ЏځЁƁnknknkρʁƍځnknkJnknknknknknknkɂԁƁƁʁ‚nkԁЁƁƁžԂnknknkρЏnkЁЁʏnknknknknknkԍЍnk ԁԁnk nknk NRӠnknk ԁӁРnknknknknknkЁƁNnknknknknkЁЁnknknknknknknknknk \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/WeedB.pxe b/res/es/data/sprites_up/Stage/WeedB.pxe new file mode 100644 index 0000000..b2a1ca6 Binary files /dev/null and b/res/es/data/sprites_up/Stage/WeedB.pxe differ diff --git a/res/es/data/sprites_up/Stage/WeedB.pxm b/res/es/data/sprites_up/Stage/WeedB.pxm new file mode 100644 index 0000000..d5dcf5b Binary files /dev/null and b/res/es/data/sprites_up/Stage/WeedB.pxm differ diff --git a/res/es/data/sprites_up/Stage/WeedB.tsc b/res/es/data/sprites_up/Stage/WeedB.tsc new file mode 100644 index 0000000..3db9db0 --- /dev/null +++ b/res/es/data/sprites_up/Stage/WeedB.tsc @@ -0,0 +1 @@ +|y|yğ|y|yğ|y|yğ|y|yğ|y|yğ|y|y|y¾ğ|y|y|yğ|y|y¶Xo|yݏۏޝ|y|y¶ݏ\ޝ|y|y¶Н|y|y|y|y¾ğ|y¶ޏۏԝŴ|y|y|yğ|y|y \ No newline at end of file diff --git a/res/es/data/sprites_up/Stage/WeedD.pxe b/res/es/data/sprites_up/Stage/WeedD.pxe new file mode 100644 index 0000000..1807ed7 Binary files /dev/null and b/res/es/data/sprites_up/Stage/WeedD.pxe differ diff --git a/res/es/data/sprites_up/Stage/WeedD.pxm b/res/es/data/sprites_up/Stage/WeedD.pxm new file mode 100644 index 0000000..3d5bab0 Binary files /dev/null and b/res/es/data/sprites_up/Stage/WeedD.pxm differ diff --git a/res/es/data/sprites_up/Stage/WeedD.tsc b/res/es/data/sprites_up/Stage/WeedD.tsc new file mode 100644 index 0000000..b7a9dfa --- /dev/null +++ b/res/es/data/sprites_up/Stage/WeedD.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIF_lmllIFxxllmm +-------------------------------------------------- + +IPAフォントライセンスv1.0 + +許諾者は、この使用許諾(以下「本契約」といいます。)に定める条件の下で、許諾プログラム(1条に定義するところによります。)を提供します。受領者(1条に定義するところによります。)が、許諾プログラムを使用し、複製し、または頒布する行為、その他、本契約に定める権利の利用を行った場合、受領者は本契約に同意したものと見なします。 + + +第1条 用語の定義 + +本契約において、次の各号に掲げる用語は、当該各号に定めるところによります。 + +1.「デジタル・フォント・プログラム」とは、フォントを含み、レンダリングしまたは表示するために用いられるコンピュータ・プログラムをいいます。 +2.「許諾プログラム」とは、許諾者が本契約の下で許諾するデジタル・フォント・プログラムをいいます。 +3.「派生プログラム」とは、許諾プログラムの一部または全部を、改変し、加除修正等し、入れ替え、その他翻案したデジタル・フォント・プログラムをいい、許諾プログラムの一部もしくは全部から文字情報を取り出し、またはデジタル・ドキュメント・ファイルからエンベッドされたフォントを取り出し、取り出された文字情報をそのまま、または改変をなして新たなデジタル・フォント・プログラムとして製作されたものを含みます。 +4.「デジタル・コンテンツ」とは、デジタル・データ形式によってエンド・ユーザに提供される制作物のことをいい、動画・静止画等の映像コンテンツおよびテレビ番組等の放送コンテンツ、ならびに文字テキスト、画像、図形等を含んで構成された制作物を含みます。 +5.「デジタル・ドキュメント・ファイル」とは、PDFファイルその他、各種ソフトウェア・プログラムによって製作されたデジタル・コンテンツであって、その中にフォントを表示するために許諾プログラムの全部または一部が埋め込まれた(エンベッドされた)ものをいいます。フォントが「エンベッドされた」とは、当該フォントが埋め込まれた特定の「デジタル・ドキュメント・ファイル」においてのみ表示されるために使用されている状態を指し、その特定の「デジタル・ドキュメント・ファイル」以外でフォントを表示するために使用できるデジタル・フォント・プログラムに含まれている場合と区別されます。 +6.「コンピュータ」とは、本契約においては、サーバを含みます。 +7.「複製その他の利用」とは、複製、譲渡、頒布、貸与、公衆送信、上映、展示、翻案その他の利用をいいます。 +8.「受領者」とは、許諾プログラムを本契約の下で受領した人をいい、受領者から許諾プログラムを受領した人を含みます。 + +第2条 使用許諾の付与 + +許諾者は受領者に対し、本契約の条項に従い、すべての国で、許諾プログラムを使用することを許諾します。ただし、許諾プログラムに存在する一切の権利はすべて許諾者が保有しています。本契約は、本契約で明示的に定められている場合を除き、いかなる意味においても、許諾者が保有する許諾プログラムに関する一切の権利および、いかなる商標、商号、もしくはサービス・マークに関する権利をも受領者に移転するものではありません。 + +1.受領者は本契約に定める条件に従い、許諾プログラムを任意の数のコンピュータにインストールし、当該コンピュータで使用することができます。 +2.受領者はコンピュータにインストールされた許諾プログラムをそのまま、または改変を行ったうえで、印刷物およびデジタル・コンテンツにおいて、文字テキスト表現等として使用することができます。 +3.受領者は前項の定めに従い作成した印刷物およびデジタル・コンテンツにつき、その商用・非商用の別、および放送、通信、各種記録メディアなどの媒体の形式を問わず、複製その他の利用をすることができます。 +4.受領者がデジタル・ドキュメント・ファイルからエンベッドされたフォントを取り出して派生プログラムを作成した場合には、かかる派生プログラムは本契約に定める条件に従う必要があります。 +5.許諾プログラムのエンベッドされたフォントがデジタル・ドキュメント・ファイル内のデジタル・コンテンツをレンダリングするためにのみ使用される場合において、受領者が当該デジタル・ドキュメント・ファイルを複製その他の利用をする場合には、受領者はかかる行為に関しては本契約の下ではいかなる義務をも負いません。 +6.受領者は、3条2項の定めに従い、商用・非商用を問わず、許諾プログラムをそのままの状態で改変することなく複製して第三者への譲渡し、公衆送信し、その他の方法で再配布することができます(以下、「再配布」といいます。)。 +7.受領者は、上記の許諾プログラムについて定められた条件と同様の条件に従って、派生プログラムを作成し、使用し、複製し、再配布することができます。ただし、受領者が派生プログラムを再配布する場合には、3条1項の定めに従うものとします。 + +第3条 制限 + +前条により付与された使用許諾は、以下の制限に服します。 + +1.派生プログラムが前条4項及び7項に基づき再配布される場合には、以下の全ての条件を満たさなければなりません。 + (1)派生プログラムを再配布する際には、下記もまた、当該派生プログラムと一緒に再配布され、オンラインで提供され、または、郵送費・媒体及び取扱手数料の合計を超えない実費と引き換えに媒体を郵送する方法により提供されなければなりません。 +  (a)派生プログラムの写し; および +  (b)派生プログラムを作成する過程でフォント開発プログラムによって作成された追加のファイルであって派生プログラムをさらに加工するにあたって利用できるファイルが存在すれば、当該ファイル + (2)派生プログラムの受領者が、派生プログラムを、このライセンスの下で最初にリリースされた許諾プログラム(以下、「オリジナル・プログラム」といいます。)に置き換えることができる方法を再配布するものとします。かかる方法は、オリジナル・ファイルからの差分ファイルの提供、または、派生プログラムをオリジナル・プログラムに置き換える方法を示す指示の提供などが考えられます。 + (3)派生プログラムを、本契約書に定められた条件の下でライセンスしなければなりません。 + (4)派生プログラムのプログラム名、フォント名またはファイル名として、許諾プログラムが用いているのと同一の名称、またはこれを含む名称を使用してはなりません。 + (5)本項の要件を満たすためにオンラインで提供し、または媒体を郵送する方法で提供されるものは、その提供を希望するいかなる者によっても提供が可能です。 +2.受領者が前条6項に基づき許諾プログラムを再配布する場合には、以下の全ての条件を満たさなければなりません。 + (1)許諾プログラムの名称を変更してはなりません。 + (2)許諾プログラムに加工その他の改変を加えてはなりません。 + (3)本契約の写しを許諾プログラムに添付しなければなりません。 +3.許諾プログラムは、現状有姿で提供されており、許諾プログラムまたは派生プログラムについて、許諾者は一切の明示または黙示の保証(権利の所在、非侵害、商品性、特定目的への適合性を含むがこれに限られません)を行いません。いかなる場合にも、その原因を問わず、契約上の責任か厳格責任か過失その他の不法行為責任かにかかわらず、また事前に通知されたか否かにかかわらず、許諾者は、許諾プログラムまたは派生プログラムのインストール、使用、複製その他の利用または本契約上の権利の行使によって生じた一切の損害(直接・間接・付随的・特別・拡大・懲罰的または結果的損害)(商品またはサービスの代替品の調達、システム障害から生じた損害、現存するデータまたはプログラムの紛失または破損、逸失利益を含むがこれに限られません)について責任を負いません。 +4.許諾プログラムまたは派生プログラムのインストール、使用、複製その他の利用に関して、許諾者は技術的な質問や問い合わせ等に対する対応その他、いかなるユーザ・サポートをも行う義務を負いません。 + +第4条 契約の終了 + +1.本契約の有効期間は、受領者が許諾プログラムを受領した時に開始し、受領者が許諾プログラムを何らかの方法で保持する限り続くものとします。 +2.前項の定めにかかわらず、受領者が本契約に定める各条項に違反したときは、本契約は、何らの催告を要することなく、自動的に終了し、当該受領者はそれ以後、許諾プログラムおよび派生プログラムを一切使用しまたは複製その他の利用をすることができないものとします。ただし、かかる契約の終了は、当該違反した受領者から許諾プログラムまたは派生プログラムの配布を受けた受領者の権利に影響を及ぼすものではありません。 + +第5条 準拠法 + +1.IPAは、本契約の変更バージョンまたは新しいバージョンを公表することができます。その場合には、受領者は、許諾プログラムまたは派生プログラムの使用、複製その他の利用または再配布にあたり、本契約または変更後の契約のいずれかを選択することができます。その他、上記に記載されていない条項に関しては日本の著作権法および関連法規に従うものとします。 +2.本契約は、日本法に基づき解釈されます。 + + +---------- + +IPA Font License Agreement v1.0 + +The Licensor provides the Licensed Program (as defined in Article 1 below) under the terms of this license agreement (“Agreement”). Any use, reproduction or distribution of the Licensed Program, or any exercise of rights under this Agreement by a Recipient (as defined in Article 1 below) constitutes the Recipient's acceptance of this Agreement. + +Article 1 (Definitions) +1.“Digital Font Program” shall mean a computer program containing, or used to render or display fonts. +2.“Licensed Program” shall mean a Digital Font Program licensed by the Licensor under this Agreement. +3.“Derived Program” shall mean a Digital Font Program created as a result of a modification, addition, deletion, replacement or any other adaptation to or of a part or all of the Licensed Program, and includes a case where a Digital Font Program newly created by retrieving font information from a part or all of the Licensed Program or Embedded Fonts from a Digital Document File with or without modification of the retrieved font information. +4.“Digital Content” shall mean products provided to end users in the form of digital data, including video content, motion and/or still pictures, TV programs or other broadcasting content and products consisting of character text, pictures, photographic images, graphic symbols and/or the like. +5.“Digital Document File” shall mean a PDF file or other Digital Content created by various software programs in which a part or all of the Licensed Program becomes embedded or contained in the file for the display of the font (“Embedded Fonts”). Embedded Fonts are used only in the display of characters in the particular Digital Document File within which they are embedded, and shall be distinguished from those in any Digital Font Program, which may be used for display of characters outside that particular Digital Document File. +6.“Computer” shall include a server in this Agreement. +7.“Reproduction and Other Exploitation” shall mean reproduction, transfer, distribution, lease, public transmission, presentation, exhibition, adaptation and any other exploitation. +8.“Recipient” shall mean anyone who receives the Licensed Program under this Agreement, including one that receives the Licensed Program from a Recipient. + +Article 2 (Grant of License) +The Licensor grants to the Recipient a license to use the Licensed Program in any and all countries in accordance with each of the provisions set forth in this Agreement. However, any and all rights underlying in the Licensed Program shall be held by the Licensor. In no sense is this Agreement intended to transfer any right relating to the Licensed Program held by the Licensor except as specifically set forth herein or any right relating to any trademark, trade name, or service mark to the Recipient. + +1.The Recipient may install the Licensed Program on any number of Computers and use the same in accordance with the provisions set forth in this Agreement. +2.The Recipient may use the Licensed Program, with or without modification in printed materials or in Digital Content as an expression of character texts or the like. +3.The Recipient may conduct Reproduction and Other Exploitation of the printed materials and Digital Content created in accordance with the preceding Paragraph, for commercial or non-commercial purposes and in any form of media including but not limited to broadcasting, communication and various recording media. +4.If any Recipient extracts Embedded Fonts from a Digital Document File to create a Derived Program, such Derived Program shall be subject to the terms of this agreement. +5.If any Recipient performs Reproduction or Other Exploitation of a Digital Document File in which Embedded Fonts of the Licensed Program are used only for rendering the Digital Content within such Digital Document File then such Recipient shall have no further obligations under this Agreement in relation to such actions. +6.The Recipient may reproduce the Licensed Program as is without modification and transfer such copies, publicly transmit or otherwise redistribute the Licensed Program to a third party for commercial or non-commercial purposes (“Redistribute”), in accordance with the provisions set forth in Article 3 Paragraph 2. +7.The Recipient may create, use, reproduce and/or Redistribute a Derived Program under the terms stated above for the Licensed Program: provided, that the Recipient shall follow the provisions set forth in Article 3 Paragraph 1 when Redistributing the Derived Program. + +Article 3 (Restriction) +The license granted in the preceding Article shall be subject to the following restrictions: + +1.If a Derived Program is Redistributed pursuant to Paragraph 4 and 7 of the preceding Article, the following conditions must be met : + (1)The following must be also Redistributed together with the Derived Program, or be made available online or by means of mailing mechanisms in exchange for a cost which does not exceed the total costs of postage, storage medium and handling fees: +  (a)a copy of the Derived Program; and +  (b)any additional file created by the font developing program in the course of creating the Derived Program that can be used for further modification of the Derived Program, if any. + (2)It is required to also Redistribute means to enable recipients of the Derived Program to replace the Derived Program with the Licensed Program first released under this License (the “Original Program”). Such means may be to provide a difference file from the Original Program, or instructions setting out a method to replace the Derived Program with the Original Program. + (3)The Recipient must license the Derived Program under the terms and conditions of this Agreement. + (4)No one may use or include the name of the Licensed Program as a program name, font name or file name of the Derived Program. + (5)Any material to be made available online or by means of mailing a medium to satisfy the requirements of this paragraph may be provided, verbatim, by any party wishing to do so. +2.If the Recipient Redistributes the Licensed Program pursuant to Paragraph 6 of the preceding Article, the Recipient shall meet all of the following conditions: + (1)The Recipient may not change the name of the Licensed Program. + (2)The Recipient may not alter or otherwise modify the Licensed Program. + (3)The Recipient must attach a copy of this Agreement to the Licensed Program. +3.THIS LICENSED PROGRAM IS PROVIDED BY THE LICENSOR “AS IS” AND ANY EXPRESSED OR IMPLIED WARRANTY AS TO THE LICENSED PROGRAM OR ANY DERIVED PROGRAM, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXTENDED, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO; PROCUREMENT OF SUBSTITUTED GOODS OR SERVICE; DAMAGES ARISING FROM SYSTEM FAILURE; LOSS OR CORRUPTION OF EXISTING DATA OR PROGRAM; LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE INSTALLATION, USE, THE REPRODUCTION OR OTHER EXPLOITATION OF THE LICENSED PROGRAM OR ANY DERIVED PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +4.The Licensor is under no obligation to respond to any technical questions or inquiries, or provide any other user support in connection with the installation, use or the Reproduction and Other Exploitation of the Licensed Program or Derived Programs thereof. + +Article 4 (Termination of Agreement) +1.The term of this Agreement shall begin from the time of receipt of the Licensed Program by the Recipient and shall continue as long as the Recipient retains any such Licensed Program in any way. +2.Notwithstanding the provision set forth in the preceding Paragraph, in the event of the breach of any of the provisions set forth in this Agreement by the Recipient, this Agreement shall automatically terminate without any notice. In the case of such termination, the Recipient may not use or conduct Reproduction and Other Exploitation of the Licensed Program or a Derived Program: provided that such termination shall not affect any rights of any other Recipient receiving the Licensed Program or the Derived Program from such Recipient who breached this Agreement. + +Article 5 (Governing Law) +1.IPA may publish revised and/or new versions of this License. In such an event, the Recipient may select either this Agreement or any subsequent version of the Agreement in using, conducting the Reproduction and Other Exploitation of, or Redistributing the Licensed Program or a Derived Program. Other matters not specified above shall be subject to the Copyright Law of Japan and other related laws and regulations of Japan. +2.This Agreement shall be construed under the laws of Japan. + diff --git a/res/jp/data/Font/Zpix b/res/jp/data/Font/Zpix new file mode 100644 index 0000000..06ac2f9 Binary files /dev/null and b/res/jp/data/Font/Zpix differ diff --git a/res/jp/data/Font/font_bitmap_10x20.dat b/res/jp/data/Font/font_bitmap_10x20.dat new file mode 100644 index 0000000..194fc0b Binary files /dev/null and b/res/jp/data/Font/font_bitmap_10x20.dat differ diff --git a/res/jp/data/Font/font_bitmap_10x20.png b/res/jp/data/Font/font_bitmap_10x20.png new file mode 100644 index 0000000..ae239df Binary files /dev/null and b/res/jp/data/Font/font_bitmap_10x20.png differ diff --git a/res/jp/data/Font/font_bitmap_6x12.dat b/res/jp/data/Font/font_bitmap_6x12.dat new file mode 100644 index 0000000..6af06d4 Binary files /dev/null and b/res/jp/data/Font/font_bitmap_6x12.dat differ diff --git a/res/jp/data/Font/font_bitmap_6x12.png b/res/jp/data/Font/font_bitmap_6x12.png new file mode 100644 index 0000000..0493054 Binary files /dev/null and b/res/jp/data/Font/font_bitmap_6x12.png differ diff --git a/res/jp/data/Head.tsc b/res/jp/data/Head.tsc new file mode 100644 index 0000000..b75847d Binary files /dev/null and b/res/jp/data/Head.tsc differ diff --git a/res/jp/data/Stage/0.tsc b/res/jp/data/Stage/0.tsc new file mode 100644 index 0000000..be08b99 --- /dev/null +++ b/res/jp/data/Stage/0.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_idlSSSU_hqg0-FSS\V0-_pqd_fpxSST[_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_idlSSSW_hqg0-0-0-0-0-0-0-0-FSTSS0-_nh|_irpSSTY_zdlSTSS_htPSUXY_fuh_zdlSVWS0-0-_iomUSSS]STTS0-_iomTSUS]STST0-0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-FSTST0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-0-FSTSU0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSY_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSU[S_hyhSUSS0-0-FSTTS0-_vloSSTU_zdlSVXS_flo_zdlSSUS0-_vloSST[_zdlSVXS_flo_zdlSSUS0-_vloSSTW_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSSUS_hyhSUSS0-0-FSUSS0-0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSYTS_idrSSST0-_wudSSZW]STSS]SSST]SSST0-0-FSWSS0-0-FSXSS0-FSXST0-FSXSU0-FSXSV0-FSXSW0-FSXSX0-FSXSY0-0-FSXSZ0-FSXS[0-FSXS\0-FSXTS0-FSXTT0-FSXTU0-FSXTV0-0-#SYSS0-0-0-FTSTS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZX]STSS]SSUS]SSST0-FTSUSp0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZY]STSS]SSST]SSST0-FTSVS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZZ]STSS]SSST]SSST0-FTSWS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZ[]STSS]SSST]SSST0-FTSXS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS[\]STSS]SSST]SSST0-FTSYS0-_iomUSSS]TSYT_hyhTS\S0-FTSYT0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS\V]STSS]SSST]SSST0-0-FTS\S0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]STSS]SSSS0-_idlSSST0-_iomUSSS]TUSS_hyhTTSS0-0-FTTSS0-_zdlSZVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXSV]SVXU]SVSS_zdlSSUS0-_fqsSXSW]SVXU]SWSS_zdlSSUS0-_fqsSXSU]SVXU]SUSS_zdlSSUS0-_fqsSXSX]SVXU]SXSS_zdlSSUS0-_fqsSXST]SVXU]STSS_zdlSSUS0-_fqsSXSY]SVXU]SYSS_zdlSSUS0-_fqsSXSS]SVXU]SSSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTY0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0-0-FTUSS0-_zdlSWVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXTS]SVXU]TSSS_zdlSSUS0-_fqsSXTT]SVXU]TTSS_zdlSSUS0-_fqsSXS\]SVXU]S\SS_zdlSSUS0-_fqsSXTU]SVXU]TUSS_zdlSSUS0-_fqsSXS[]SVXU]S[SS_zdlSSUS0-_fqsSXTV]SVXU]TVSS_zdlSSUS0-_fqsSXSZ]SVXU]SZSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTX0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0- \ No newline at end of file diff --git a/res/jp/data/Stage/Almond.tsc b/res/jp/data/Stage/Almond.tsc new file mode 100644 index 0000000..cd68dde Binary files /dev/null and b/res/jp/data/Stage/Almond.tsc differ diff --git a/res/jp/data/Stage/Ballo1.tsc b/res/jp/data/Stage/Ballo1.tsc new file mode 100644 index 0000000..02307f0 Binary files /dev/null and b/res/jp/data/Stage/Ballo1.tsc differ diff --git a/res/jp/data/Stage/Ballo2.tsc b/res/jp/data/Stage/Ballo2.tsc new file mode 100644 index 0000000..f7a84ea --- /dev/null +++ b/res/jp/data/Stage/Ballo2.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`d``=:S`d`a=:S`d`b=:S`da`=:S`daa=:S`dab=:=:=:=:S`e``=:l{ulx}slv}``afl}t```bls}````lq``e`lvqy```a=:lqy`ae`=:l}wlvqs``be l~tls|lvqs``ai=:÷Ǿھ yl~tls|вҲ ìٲ=:Źھ ٲxl~tls|=:lvqs``be=:uuurl~tls|ݲٲҲ߲q=:вֲ辴Ʋ=:y Ҳrl~tls|lvqs````=:l}blpppݲұlqy``e`=:l}wlvqs``beֱxl~tls|lvqs````=:lqy`a``l}blppppвҲӱ=:lq~`da`j``a`j````lq~`daaj``a`j```blqy``e`pppppҲҲӱ=:lqy`a``lyl}wxylqy``e`l~tls|lvqs````l{u=:ls}``cdlqy`a``=:lq~`d``j````j````lqy``b`=:lq~`d`aj````j```blqy``h`=:lyl}wlvqs``beڱyyl~tls|lvqs````l{u=:lqy0a``=:lq~`d``j````j```blqy``b`=:lq~`d`aj``g`j```blqy``cb=:lq~`d`aj````j````lqy``b`=:l}blppp߲lqy``e`=:ppppݲұlqy``e`=:pppppвҲӱlqy``e`ls|ls|=:lyl}wlvqs``be =:Բyl~tls|l{ulqy``e`=:lylvqs````l}csyl~tls|=:l{uls~`d`bj```ij````lqy`ae`=:lyl}wlvqs```e!rl~t=:زrl~tls|=:lvqs``aiŲ߲۲ݲyl~tls|lvqs```eٲٲ yyl~tls|lvqs````=:l{u=:lq~`d`aj``b`j````lqy``a`=:lq~`d``j``h`j```blqy```b=:lyl}wlvqs```eݲyyl~tls|lvqs````=:l{ulv~`d`bj``af=:ls~`d`bj``abj```blqy```b=:lq~`d`bj`a``j```blqy`a``=:lv}l}wl=:yyyyyyyyylqy`a``ls|lqy``e`lv}lvq```a=:lqy``e`lyls}````=:l}wlvqs``beŦxl~tls|=:lvqs``bcԱl~t=:lq``gaj`ab`j````j````=:lu~t=:=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/Barr.tsc b/res/jp/data/Stage/Barr.tsc new file mode 100644 index 0000000..a54d830 --- /dev/null +++ b/res/jp/data/Stage/Barr.tsc @@ -0,0 +1 @@ +0==F=IZ[NIPZb===EISNV====IR[Q0==F>IZ[NIPZb===EISNV===>IR[Q0==F?IZ[NIPZb===EISNV===?IR[Q0==F@IZ[NIPZb===EISNV===@IR[Q0==FAIZ[NIPZb===EISNV===AIR[Q0=>==ISYW=@C>G=>=@ISYW=@C?G=>=>ISYW=@C=G=>=?IXRfI`\b==>>IN[]=>==G====G===?ISN\===AIa_N==>>G==FAG==A?G==B?0=>=>I]_VIZ`TWՏVI[\QIR[Q0=>=?IXRfISN\===AIa_N==>>G==FAG==A?G==B?0=>=@I]_VIZ`TՏVI[\QIR[Q0=>B=0=>B>0=>B?0=>B@0=>BA0=?F=ISYW=@D=G=?F>IR[Q0=?F>ISYW=@C=G====I]_VIZ`TISNP===EُVVI[\QIQ[]=?F=IP[]>===G==C@G===?IR[Q0=A==IXRfISY:=@C>ISY:=@C?I`ZPIP[]=A==G==>?G====IN[]=A==G==?=G===AIdNV=>A=I]_VIZ`TISNP===B珳яVI[\QISNP====IXRfIPY\IdNV=>==IPZb==>BIZ`T|\ʎVIdNV=>A=I[\QI`\b==ABIP[]=>B=G===>G====IdNV===AI`\b==ABIP[]=>B>G===>G====IdNV===AI`\b==ABIP[]=>B?G===>G====IdNV===AI`\b==ABIP[]=>B@G===>G====IdNV===AI`\b==ABIP[]=>BAG===>G====IPZb===EIR[Q0=B==0>===IXRfISY8=@C=ISY8=@C>ISY8=AA=ISY:=@?CIZ`TݏVI[\QIPY_vPlhvPlhVI[\QIPY_RRRI[\QUI[\QIZfO===?IdNV==@=IZfQ===?IP[]>===G==C=G===AIPY_ISNP===CՏʐu[khӕUI[\QIPY_ȏڏďҏĎOI[\Qu[khڏݏԏϏҏՎOI[\Q؞_ٞǏ֙ȏюNʏʏ̏Ώʏ֏ڛRʏpI[\QIPY_ʏڙgZR͏ΏʏُOI[\QIPY_VI[\QȏِltVITVa>==AI[\QIPY_RΏяʏUI[\QehʏЏˎVI[\QIPY_RRROI[\QIPY_ˏԎN폱؎OI[\QITVa====ʏehӟԏďΏY\MďΏOI[\QՏʏΏяюOI[\QIPY\ISNP====IPZb==== I^bN==@=I`\b==?CIN[]>===G===EG====IN[]=>==G===>G====IdNV==>=IZfQ====IP[]>===G==C=G====IdNV=>==I^bN==@=I`\b==?CIN[]>===G===EG====IN[]=>==G===>G====IdNV==D=I^bN==@=I`\b==?CIN[]>===G===EG====IP[]=A==G==>FG===?IP[]=>==G==>EG===?IPZ]===AG===EG==E=IPZ]===BG===EG==E>IPZ]===CG===EG==E?IPZ]===AG===FG==FCIPZ]===BG===FG==FDIPZ]===CG===FG==FEIZ`TԏVVIdNV==B=IP[]=A==G==>?G===?IN[]=A==G==@=G===?IPY_IXRfIPZb==>>ISNP==>AOϏʎVI[\QIPY_ISNP===BOʏΏѣ׏ːOI[\Q[٢MڙՏՏُOI[\QISNP====IPY_ȏُӏOI[\QIP[]=B==G==CDG===?IdNV=>==IN[]=B==G==>@G===?IdNV==B=IN[]>===G===EG====IZ`TISNP==>BϏ٢MӐNkՏՏˎOI[\QIPY_ISNP===BbhVI[\QIPY_[֙ϏʏˏVI[\QIPY_ISNP===E鏳Nu[khٟˏՎVVI[\QIPY_ISNP==>BRRROI[\QIPY_ISNP==>C鏳ehOI[\Qu[khyяޏˎOI[\Q֤я􏱎OI[\QIPY_ISNP===CUI[\QIPY_ʏڐehÏՏOI[\QISNP====IPY\IN[]=B==G==>BG===?IdNV=>>=I]_VIZ`TISNP===EUVI[\QISNP==>BIPY_|\NI[\Qӏڏ鏶ƏʎOI[\QIPY\IN[]=B==G==?=G===?ISNP====IPY\IXRfIdNV==B=IZ`TISNP===EyˏΏяVI[\QISNP====IPY\IdNV==B=ISNP===BIZ`Tʐ_ˏVI[\Q{ۏΏVI[\QϏʏُڐ[Տُ֎VI[\QIPY_RRROI[\QIPY_ҎNYږʎUI[\Qȏ٢Ґ[ӝَUIf[W>==>IN[]=A==G==@=G===?IPY_ISNP==>AՏԏ؎VI[\QIPY\ISY8=@C>IPZb===AIP[]=A==G==CEG===?IO`Y=A==IR[Q0>==>IXRfISY:=@C?ISY:=@C>IPZb===EIZ`TISNP===BȏOI[\QȏÏ[NOI[\QIPY\IN[]=A==G==>=G===?IR[Q \ No newline at end of file diff --git a/res/jp/data/Stage/Blcny1.tsc b/res/jp/data/Stage/Blcny1.tsc new file mode 100644 index 0000000..e1dc5dc --- /dev/null +++ b/res/jp/data/Stage/Blcny1.tsc @@ -0,0 +1,2 @@ +WddmdA>pypzaeemdpzaeemepz_eemfpupwddgdpzu}ddddpyxA>WddmeA>pypz_eemdpzaeemepzaeemfpupwddgdpzu}dddepyxA>WddmfA>pypupwddgdpzu}dddfpyxA>WddmgA>pypupwddgdpzu}dddgpyxA>WddmhA>pypzaeemdpz_eemepzaeemfpupwddgdpzu}dddhpyxA>A>WddmiA>pypzu}dddhpyxA>A>A>WdeddA>pypddeepudeddnddddndddfpzudddgA>p}~ddfgndedepuddjgnddmgndddmndddhA>A>WdedeA>pypuddjknddmgndddmndddhA>A>A>A>WdeedA>p}pzudddfpuddjhnddmfndddenddeeA>A>WdefdA>pypudefdnddddndddfpddeepzudddhpuddjjnddm4nddedndddlA>A>WdegdA>p}p{v߶A>ضݵpxpyxA>A>WdemmA>p}p{~ˠvpxpyxA>pzudddh{ǷvǷvpxpwpwddggpwypu}mmmmpyxA>A>WdfddA>pypxddddpxdfddpup{A>0ض +¶}pxpyxA>A>WdfdeA>p}p{pA>}}xuUUpxpyxA>A>WdfedA>p}pz~eemendfeepz~eemfndfefA>p}pzudddhpxdddfpu}ddidpuddjfnddmindddknddkhA>WdfeeA>p}pzudddhpxdddfpu}ddidpuddjfnddminddkmnddkgA>WdfefA>p}pzudddhpxddddpu}ddidpuddjfnddmindeeknddjfA>A> \ No newline at end of file diff --git a/res/jp/data/Stage/Blcny2.tsc b/res/jp/data/Stage/Blcny2.tsc new file mode 100644 index 0000000..b45cf8e Binary files /dev/null and b/res/jp/data/Stage/Blcny2.tsc differ diff --git a/res/jp/data/Stage/Cave.tsc b/res/jp/data/Stage/Cave.tsc new file mode 100644 index 0000000..2d883fc --- /dev/null +++ b/res/jp/data/Stage/Cave.tsc @@ -0,0 +1 @@ +GD]jjsjGDv{v}jjjrv{jjjjv~GD]jjskGDv{v}jjjrv{jjjkv~GD]jjslGDv{v}jjjrv{jjjlv~GD]jjsmGDv{v}jjjrv{jjjmv~GD]jjsnGDv{v}jjjrv{jjjnv~GDGD]jjssGDv}jjjrv{jjjnv~GDGDGD]jkjkGDvv}jkjktjjjjtjjjjvjjkkv{jjjmv{jjkmtjjsmtjjkjtjjjmGDGD]jkjlGDvvjmjltjkjnvjmjktjkjmvv~v~GD]jkjmGDvv{jjjlGDvejmjlvekpnkvekpnlGDv~jjjlv{jjkrtjojl:jjjltjjjjGD]jkjnGDvv{jjjlv{jjkktjjsntjjjrtjjjpGD]jkkjGDvv{jjjnv{jjsjtjjsltjjjqtjjjsGDGDGD]jkojGDvv~jjjjv}jjjrv{jjjnGDv{jjmjGDvjjklv}jjojtjjmotjjpqv{jjljGDvjjklv}jjojtjjmptjjpqv{jjljGDv~GDGD]jljjGDv~GD]jljkGDv~GDGD]jnjjGDvvjjllv~jnjjv}jjkpGDvvkjjpwý}wZ*"6$v{jkpjv~vvejjjmGDZmZ׼v~v~GDGD \ No newline at end of file diff --git a/res/jp/data/Stage/Cemet.tsc b/res/jp/data/Stage/Cemet.tsc new file mode 100644 index 0000000..3029522 Binary files /dev/null and b/res/jp/data/Stage/Cemet.tsc differ diff --git a/res/jp/data/Stage/Cent.tsc b/res/jp/data/Stage/Cent.tsc new file mode 100644 index 0000000..eadef34 Binary files /dev/null and b/res/jp/data/Stage/Cent.tsc differ diff --git a/res/jp/data/Stage/CentW.tsc b/res/jp/data/Stage/CentW.tsc new file mode 100644 index 0000000..13b9ab1 --- /dev/null +++ b/res/jp/data/Stage/CentW.tsc @@ -0,0 +1 @@ +B?B?XeeneB?qvqxeeeeq{v~eeeeqzyB?XeenfB?qvqxeeeeq{v~eeefqzyB?XeengB?qvqxeeeeq{v~eeegqzyB?XeenhB?qvqxeeeeq{v~eeehqzyB?XeeniB?qvqxeeeeq{v~eeeiqzyB?XeenjB?B?XeennB?qzqvqxeeeeB?qvefjeoeeefoeeeeq{v~eeeiB?qxehefoeffgoeeegqv~efeeB?qvefjeoeeeeoeeeeB?qyeeegqyehefqxqzyB?B?B?XefeeB?qzqeeffqvefeeoeeeeoeeegq{veeegqveejkoeengoeeefoefehB?B?B?XefjeB?qzq{ffieoefjgB?q|v¨޶}qeeeeqxB?q{`femgq{`ffieq`eeejokee5B?qv~eejeq|B?¸vȶ~qyqxB?qyeeegB?qvegjeoeefeoeeeeqv~eekeB?qxegkeoefjeoeeeeq}xB?qvegkeoeefeoeeeeqv~eejeB?q{veeehqv~efeeqxq{ffifoefjgq{`ffifqveejloeggeoeeffoeefiB?B?B?XefjgB?q~q|v¨޶}qeeeeqxq`eeejokeejB?qzqxeheeoefffoeeegq}xqv~eekeqvefjeoeeefoeeeeB?qv~efeeq{veeeiqveeefoeennoeeejoeeemB?B?XefjgB?qveejloeenioeeffoeefiB?B?XegjeB?qzq|zzzwqyqzyB?B?XegkeB?B?B?B?B?B?XeheeB?XehefB?B? \ No newline at end of file diff --git a/res/jp/data/Stage/Chako.tsc b/res/jp/data/Stage/Chako.tsc new file mode 100644 index 0000000..d98a4a9 --- /dev/null +++ b/res/jp/data/Stage/Chako.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|]`bfcls}```blvqy````lu~t=:S``ia=:l}~qlv|]`bfcls}```blvqy```alu~t=:S``ib=:l}~qlv|]`bfcls}```blvqy```blu~t=:S``ic=:l}~qlv|]`bfcls}```blvqy```clu~t=:S``id=:l}~qlv|]`bfclv|z`cdaj``iils}```blvqy```dlu~t=:=:S``ii=:ls}``bhlvqy```dlu~t=:=:S`a``=:lyl``aalt~`a``lvq```dlq```fj``idj`aaij``ag=:=:=:=:S`b``=:lyz```hj`b`b=:l{ul}w,Բڼٲֲrl~tlv|z`bdaj`b`alu~t=:S`b`a=:l}wھƲұl~tls|=:lv|z`bfaj````lqy``c`lv|[`bfalv|[`bfc=:lq~`c``j```cj```blqy``delq~`c``j````j```bl}t````=:l}w=:—v Ҳxl~tls|~ھͲҲ=:m~mP{Ǧrl~tlu~t=:S`b`b=:l{ulwya``hl}wm~mP Ҳ ٱxl~z````ls|=:lv|[`bacly]```h=:lq~`b``j``a`j````lqy``c`lvq```d=:lq```fj``iij`abdj``aa=:=:S`ba0=:lylyz``cgj``ailv|z`bfcj`baaluu``ai=:S`baa=:l{ul}w=: ٱxl~z````lvq```dls}````lqy``b`ls|uuuuurly[``cgl~tls|=:l}~`c``j``abj```fj````lq~`c``j``a`j````=:lqy``e`=:l|y[a```l``b`l}t```bl}w=:ڹ!̲rl~tls|l}lvqy```dlu~t=:=:=:S`c``=:lyz```hj`c`b=:lv|z`bfaj`c`a=:lv|z`bdaj`c`c=:l{ul}wҲұrl~tls|=:¾ó~xl~tlu~t=:S`c`a=:l{ul}w—v =:m~mP{Ǧrl~tls|m~mPq=:~ھͲҲrl~t=:۲ҳ~ Բrl~tlu~t=:S`c`b=:l{ul}wm~mP ,xyl~t=:yl~tls|=:m~mP=:ͲҲ߲l~t=:èrl~tlu~t=:S`c`c=:l{ul}wҲұrl~tls|˲Ͳrl~t=:ٲxl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/Clock.tsc b/res/jp/data/Stage/Clock.tsc new file mode 100644 index 0000000..33719bf --- /dev/null +++ b/res/jp/data/Stage/Clock.tsc @@ -0,0 +1 @@ +?FWXKFMW_:::BFPKS:::>FOXN-:;::FZ\SFPKY:::>F^\K:::D:;F^\K:::D:;ϐ[X 1>.ߠ+7ϐ[Xѭϩѥ.Ѵјϐ[Xq~~[X~~~[X >Ϗ[XpBp>>ϱ[Xq~~[X,/,/ϱޖ% /Ϯϐ[Xq~~[Xѥєј?Ϗ 4> ? ϐ[X >8ϐѥєј?ϱϐϮϱϐ 4 ϱϐ[Xq~~[X5Ϗ[XѰѵܓ8 ? ϐ* (.ؘ5>Ϗ[X58 ,ϐ[Xq~~[X"">7ϖ[Xѥєј ?5Ϗ[X7?/ϐ[XϏ ϐ?$5Ϗ[XѰѶ7>[X8ϐy~[X[X[X[Xq~~~[X~~~~~~~~~~~~[Xy~[Xϗϗ[X~~~~~~~~~~~~~~~~~~~~~[X~~ϩϗϗ[X~~~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~[X"6ٿϗϗ? (7;4ϗ[X (>ؽ*ϗϗ[Xљϩ/ϗ[Xљϩ؟ϗ? ܱ Ϗ[X~~~~~~~~~~~~~~~~[X~~~[X[XљϩIϗ[X? ;ϗϗ[X~~~[X~~~[X~~~~~~~~~[X~~~~~~~~[X~~~~~~~[X~~~~~~~[X~~~~~~~[X[X[X[Xq~~[Xq~[Xq~[Xq~[X[X[X[Xq~~~[X~~~[X{~{~[X~~~~~~~~[X~~~~~~~[X~~~~~~~[X~~~~~~~[X~~~~~~~[XN~~~~~~~~~~~~[X~~~~~~~~~~~~[X~~~~~[X ϗ~~~~~~[X~~~~~~~~~~~~[X~~~~~~[X~~~07;ϱ[X 4ϱ06? .Ϗ[X +Ѱѵ4Ϗ[Xљϩ>ܓ.ϖ~~[X ϱ[Xܱϱ[X~~~~~~~~~~~~~[X[Xq~~[Xy~~~ϗ~~~~[X~~~~~~~~~~~~~[X~~[X? .љϩIϖ 4ϐ[XљϩϐјϩϩёѦϐ[Xّ 5ܿ[X8 ϐ~~ 846ߝٚ;ϐ[X;27ٚϐ~~~. 5Ϗ[X +Ѱѵ4[Xљϩ>ܓ .ϱ[X~[X[Xq~[X~~[X5ϖ? ϩѦѬϩϏ[X"??7;4ϐ[XѤљ[X>4ϖ~~y~~~~~[X~~~~~~~~~~~~ϩѦѬϩn> ϐ[X~~~~~~Ѥљn>A4 ϐ~~[X~~~~~~~~~~~~~[X[Xq~~[X~~[XϏ ϖّ; 5Ϗ[X.ϐ~~~~[X~~~~~~~~~~~~~[X[X[X[X[Xq~~~[X[X~~~[X~~[X~~5ϖк|њϩѤϩ[X? ϐ* љϩ>ܓّϖ~~[X~~~[XϏ ϱܱϱ[X[Xq~~[Xy~~~ϗ[X? .љϩIϖ 4ϐ[XљϩϐјϩϩёѦϐ[Xّ 5ܿ[X8 ϐ~~ 846ߝٚ;ϐ[X;27ٚϐ~~~. 5Ϗ[X +Ѱѵ4[Xљϩ>ܓ .ϱ[X~[X[Xq~[X~~[X?ϖ? ϩѦѬϩϏ[X"??7;4ϐ[XѤљ[X>4ϖ~~y~~~~~[X~~~~~~~~~~~~ϩѦѬϩn> ϐ[X~~~~~~Ѥљn>A4 ϐ~~[X[Xq~~[X~~[XϏ ϖّ; 5Ϗ[X.ϐ[X[Xq~~[X~~+?޺"4ϐ[Xљϩ8 ϐ[X[X \ No newline at end of file diff --git a/res/jp/data/Stage/CurlyS.tsc b/res/jp/data/Stage/CurlyS.tsc new file mode 100644 index 0000000..143259e --- /dev/null +++ b/res/jp/data/Stage/CurlyS.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lyl``aalt~`a``lvq```dlq``bij``idj```fj```i=:=:=:S`d``=:l{ul`a`el}wñyl~tlv|z`efdj`d`alu~t=:S`d`a=:lyz``adj0da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d``j`acfj````lv|[`eh`lwya`adly[``admҲmP ,rl~tls|=:lv|[c```lv|]c``alv|]c``blv|]c``clv|]c``d=:lv|[`bgdlu~t=:S`da`=:lyl}wsͲrl~tlu~t=:=:S`db`=:l{ult~`db`l}wlwya`cely[``ce=:mzómP ٲ߲rl~tlu~t=:=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/Dark.tsc b/res/jp/data/Stage/Dark.tsc new file mode 100644 index 0000000..9b1fa2d --- /dev/null +++ b/res/jp/data/Stage/Dark.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq``a`j``idj``gcj``bg=:=:S`d``=:lyl}wl`a`el`a0el`a`eñyl~tlyz``adj`da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d``j`acfj````lv|[`fa`lwya`adly[``admҲmP ,rl~tlv|[`bgdls|=:lv|]c```lv|]c``alv|[c``blv|]c``clv|]c``d=:lu~t=:S`da`=:lyl}wsͲrl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/Drain.tsc b/res/jp/data/Stage/Drain.tsc new file mode 100644 index 0000000..07c9fbb --- /dev/null +++ b/res/jp/data/Stage/Drain.tsc @@ -0,0 +1 @@ +]Zs]Z]Zs]Z]Zs]Z]Zs]Z]Zs]Z]Z]Zs]Z]Z]Zs]Z]Zs]Zښђ]Z]Zs]Z]Z]Zs]Z7:9 9ђ]Z:: ђ]Zs]Z]Z]Z]Zs]ZP]Z]Z]Z]Z,7ѳ]Z]Z]Z]Z:=ђ]Z.=ђ]Z]Z]Z]Z]Z{]Z]Zs]Z]Zs]ZӮ9ђ ђ]Z]Z]Z]Z]Z]Z]Z]Z]Z \ No newline at end of file diff --git a/res/jp/data/Stage/EgEnd1.tsc b/res/jp/data/Stage/EgEnd1.tsc new file mode 100644 index 0000000..f196b79 --- /dev/null +++ b/res/jp/data/Stage/EgEnd1.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswsssu}ss|w}su|z}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/jp/data/Stage/EgEnd2.tsc b/res/jp/data/Stage/EgEnd2.tsc new file mode 100644 index 0000000..c6570d7 --- /dev/null +++ b/res/jp/data/Stage/EgEnd2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswssw|}ss|w}su|y}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/jp/data/Stage/Egg1.tsc b/res/jp/data/Stage/Egg1.tsc new file mode 100644 index 0000000..3220c73 --- /dev/null +++ b/res/jp/data/Stage/Egg1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq```bj``idj`beij``aa=:=:S`b``=:l{ulv|z`dg`j`b`blyz`0`gj`b`all}w ̲=:ytz{Ǧrl~tlu~t=:S`b`a=:l{ulv|[`dg`l}wlwya``gmytzmP β!rl~tlwy````ls|=:l``dc ̲ rl~tlu~t=:S`b`b=:l{ul}wl ̲Ҳ rl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/Egg6.tsc b/res/jp/data/Stage/Egg6.tsc new file mode 100644 index 0000000..bf4a0a1 --- /dev/null +++ b/res/jp/data/Stage/Egg6.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIF_lmllIFxx}lllp<}lllnvllupvlmsuvllmlIFIF_lnllIFxxlmplvlllmxglmplxllnnxlnllvllnmvllllIFx/ܾ,Ɔ~xxmllsxglllsxIFxllmlyy\,$8&~x}lmrlxxxIFIF \ No newline at end of file diff --git a/res/jp/data/Stage/EggR.tsc b/res/jp/data/Stage/EggR.tsc new file mode 100644 index 0000000..d0c1755 Binary files /dev/null and b/res/jp/data/Stage/EggR.tsc differ diff --git a/res/jp/data/Stage/EggR2.tsc b/res/jp/data/Stage/EggR2.tsc new file mode 100644 index 0000000..ed57122 --- /dev/null +++ b/res/jp/data/Stage/EggR2.tsc @@ -0,0 +1 @@ +\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y޾69ИИ\Y\Yr\Y\Y\Y\Y\Y\Yr\YzO\YB?ٙ Б\Y\Yr\Y\Y\YݔڒЗz\Y\Yr\Y\Y\YҥҧҭЪҨ? Б\Y\Y|\Y\Y \ No newline at end of file diff --git a/res/jp/data/Stage/EggX.tsc b/res/jp/data/Stage/EggX.tsc new file mode 100644 index 0000000..19961ce --- /dev/null +++ b/res/jp/data/Stage/EggX.tsc @@ -0,0 +1,4 @@ +;8Q^^g^;8j{|ojq{^^_bjtow^^^^js|r;8Q^^g_;8j{|ojq{^^_bjtow^^^_js|r;8Q^^g`;8j{|ojq{^^_bjtow^^^`js|r;8Q^^ga;8j{|ojq{^^_bjtow^^^ajs|r;8Q^^gb;8jtzx^_`^h^^gcjo|~^`^^h^^_^h^^^`jss^^gc;8Q^^gc;8j{|ojq{^^_bjtow^^^bjs|r;8;8Q^_^^;8j~wj}^^__jr|~^_^^jto}^^^bjo^^^`h^^gbh^`g_h^^^f;8;8Q^__^;8jysj{uŰؾٻ̰۰j|}rjs|r;8;8;8Q^`^^;8jtzx^_`^h^`_^;8jys;8jtzY^_`^jtzY^_^cjtzY^_cbjtzY^_ccjtzY^a`gjtzY^_^d;8j{upj|}rjqz};8j{p^^^`jow^^c^j{r^^^`;8j{u;8аj|}rjo|~^`^^h^^__h^^^`jqzjtoq^^^aְְw;8 +÷ݰаwwj|}r;8ĩqװwwj|}rjtoq^^^^jqz};8jow^^c^jo|~^`^^h^^^^h^^^`;8j{ujtoq^^^_ΰvjow^^c^j|}r;8o~Ѱjo|~^`^^h^^^^h^^^^j|}rjqzssspj|}r;8ΰؽðݰ۰vj|x^`^`jss^`^_;8Q^`^_;8jtoq^^^aݰа߰аwwj|}rjqzΰ𼲶;8װװwwj|}r;8ְ߰߰;8ǰЯwwj|}rjtoq^^^^jqz}jss^`^a;8Q^`^`;8jtoq^^^`ssspj|}rjqz +ΰааpj|}rjtoq^^^^jqz}jss^`^a;8Q^`^a;8jow^^c^j{ujo|~^`^^h^^^ch^^^`jtoq^^^_ίwj|}rj{r^^^ajqz;8߰װN|.^^Nwj|}rjqz߰ſذΰ;8߰װsٰwj|}rjqz}jtoq^^^^j{r^^^`;8jo|~^`^^h^^^ah^^^`jow^^a^;8jo|~^`^^h^^^ch^^^`jow^^c^;8j{ujtoq^^^_ſ!wj|}r;8Ұwj|}rjqz}jow^^c^j}^^bajow^^`^jtoq^^^^;8j{ujtoq^^^`oj|}rvj|}rjtoq^^^^jqz};8jow^^c^;8jo|~^`^^h^^^^h^^^^jow^^c^;8j{ujtoq^^^_߰ſװ԰o;8yŤ Яpj|}rjqz;8jtoq^^^`ίίpj|}rjqzֺ԰а;8װͯpj|}rjqzssspj|}rjqz;8jtoq^^^_)Яoٰΰްpj|}rjqz};8jo|~^`^^h^^^ah^^^^jow^_`d;8jo|~^`^^h^^^^h^^^`jow^^`^;8j{u|o߰j{r^^^^vj|}rjqzΰҰpj|}r;8ĆȰ;8߰Ţаpj|}rjqz;8װvj|}rjqzааpj|}r;8ΰްpj|}r;8߰װspj|}r;8װpj|}rjqz};8jo|~^`^^h^^^ch^^^`jow^^`^;8j}^^__jo|~^_^^h^^^^h^^^`jow^^`^;8jo|~^_^^h^^^^h^^^^jr|~^`^^j}^^`ajs|r;8;8Q^a^^;8jysj{uj ſN|\^^;8ɨ#ذٰа +j|}rjqz*۰j|}rjs|r;8Q^a^^;8j~wjto}^^^bjo^^^_h^^gbh^^^ch^^^e;8;8;8Q^b^^;8;8 \ No newline at end of file diff --git a/res/jp/data/Stage/EggX2.tsc b/res/jp/data/Stage/EggX2.tsc new file mode 100644 index 0000000..270052b Binary files /dev/null and b/res/jp/data/Stage/EggX2.tsc differ diff --git a/res/jp/data/Stage/Eggs.tsc b/res/jp/data/Stage/Eggs.tsc new file mode 100644 index 0000000..47d90f3 --- /dev/null +++ b/res/jp/data/Stage/Eggs.tsc @@ -0,0 +1 @@ + !$56)$+5=$.)1$-6, !$56)$+5=$.)1$-6, !$56)$+5=$.)1$-6, !$56)$+5=$.)1$-6, !$.42"!$56)$+5=$.)1$-6, !$56)$)68""$+5=$.)1$-6, !!$3-A$56)$+5=$)68""$.)1$+68""$?)1$)68""$5A,$,68$;5+$-6, $8:1$5;/k)iCkýŽӎı3 k?B>IýŽG2lFŎ<2Jh#E#j +UýŽЎʱѱʱ<k+ ,M +U*ɽŽıЎʱѱȽı<%F8ýŽӽıT_Ž {SN6E#I*B>+ "I +U?IŽӽıŎ6JXE^]8*ɽŽӽı#cc`E).ýŽӎýŽ<%?IŎF<%*ýŽӽı*62]i]6>ýŽıЎѱʱѱʱ/ʽʱŽӽѱıýŽ22NɽŽıЎʱѱȽı%!ʽŽıЎѱѱʱѱѱѱȽı)BGýŎH2J. ɽŽϱӽı ýŎ<#CJ +UqX4:IýŽӽıѱif%*#ýŽıЎѱʱѱʱȽıc`F&ʽŽӎı''ýŽӎֱıc`lʽŽЎϱʱֱѱѱʱűѱʱѱʱѱʱѱʱȽıfe*ʽŽӽıɽŽ%%%Ŏ!>]+ŽӽıʽŽʽŽϱ)+?I ʽŽıЎʱȽıýŽ#*JaýŎNýŎM6#2S?ýŽ2k*ha ýŎG2lF<M F +>*8jM*IɽŎŽӽıU@6EcjʽŽıЎѱʱѱʱѱѱʱѱϱ±ֱʱȽı & +<6I0kO2rIJd#M*ŽнʱĽʱ))ʽŎ NdM;?IʽŽϱѱ##G2lJ >LýŎ2#Chq Jcl%ʽŽI!JÎhJN)gOr4ýŎ:#;# +C %+BE.kýŽнѱʱֱѱͱαŎŎڽͬ±±ϱѱʱֱȎ 7 +<q6>ýʱŽЎѱʱαŎ˱˱ʽŽŎڽͬȽıŽ +5Na%K[?ýŎ GBE.kL&*ɽŽЎѱñʱŎڽͮѱάȽձֱ 龡qiJ}k>ýʱŽֽŎ \ No newline at end of file diff --git a/res/jp/data/Stage/Hell1.tsc b/res/jp/data/Stage/Hell1.tsc new file mode 100644 index 0000000..4295a7d Binary files /dev/null and b/res/jp/data/Stage/Hell1.tsc differ diff --git a/res/jp/data/Stage/Hell2.tsc b/res/jp/data/Stage/Hell2.tsc new file mode 100644 index 0000000..427fcb1 Binary files /dev/null and b/res/jp/data/Stage/Hell2.tsc differ diff --git a/res/jp/data/Stage/Hell3.tsc b/res/jp/data/Stage/Hell3.tsc new file mode 100644 index 0000000..5e95ec7 Binary files /dev/null and b/res/jp/data/Stage/Hell3.tsc differ diff --git a/res/jp/data/Stage/Hell4.tsc b/res/jp/data/Stage/Hell4.tsc new file mode 100644 index 0000000..3ea1d01 --- /dev/null +++ b/res/jp/data/Stage/Hell4.tsc @@ -0,0 +1 @@ +OLerr{rOL~~rtrr|rrrs~rrrr~OLerr{sOL~~rtrr|rrrs~rrrs~OLerr{tOL~~rtrr|rrrs~rrrt~OLerr{uOL~~rtrr|rrrs~rrru~OLerr{vOL~~rtrr|rrrs~rrrv~OLOLOLerr{wOL~~rrrt~rtrr|rrrs~Brrtr~rrru~OLOLOLersrrOL~~rrrs~rrsx~rrzt|rr{x|rrrz|rrsvOLOLerssrOL~~rrrr~rrsx~rrwx|rr{r|rssz|rrxtOLOLerstrOL~~rrss~rstr|rrrr|rrrtOL~rrrt~rrsx~rrzx|rr{t|rrrt|rrsrOLOLOLOLertrrOLOLOL \ No newline at end of file diff --git a/res/jp/data/Stage/Hell42.tsc b/res/jp/data/Stage/Hell42.tsc new file mode 100644 index 0000000..08257f0 --- /dev/null +++ b/res/jp/data/Stage/Hell42.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_::::FPYX:<::D:::;FaKS:::FWXKFMW_::::FPYX:<::D:::;FaKS:::FOXN-::C?FUOcFRWMFaKS:::D::::FMWZ:::CD::<>D::::FMWZ::;:D::<>D::::FMWZ::;;D::<>D::::FMWZ::;D::::FaKS:::@F]Y_::;<FMWZ:::BD::<@D::::FMWZ:::CD::<@D::::FMWZ::;:D::<@D::::FMWZ::;;D::<@D::::FMWZ::;D::::FMWZ:::CD::<>D::::FMWZ::;:D::<>D::::FMWZ::;;D::<>D::::FMWZ::;D::::FMWZ:::BD::<@D::::FMWZ:::CD::<@D::::FMWZ::;:D::<@D::::FMWZ::;;D::<@D::::FMWZ::;-:;;:FZ\SFW]QTҌLFXYNFOXN-:;<:FUOcF]Y_::;;FKXZ:;<:D::::D:::<FPKY:::-:<::-:=::FZ\SFPKY:::FUOcFPVT;:::D::C?FWXKFMW_:::BFPKS:::>FO`O:<::-::C?FWXKFMW_:::BFPKS:::>FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::F^\K::?=D::C>D::A?D:::?-:;;:FUOcF]Y_::;;FKXZ:;;:D::::D:::::D::;:D::::FW]QSSFXYNFMVYFKXZ:>::D::<:D::::FaKS::?:FOXN-:>::FUOcFPVT;::=D:>:>FPVT;;::=FPVT;:::<FPVT;::;D:>:;FPV5;::;FPV5;:=BFKXZ:>::D::;:D::::FW]QڌSSFWcL:::::D::::D::::FPKM:::;FUOcFPV5;::<FW]QFPKM:::<FUOcFW]QFPKM:::=FUOcFW]QFPV5;::=FPKM:::>-:>:>FUOcFW]QFPKM::FWXKFMW_:::FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::;Taaja>;m~rmt~aaaimwrzaaaamvu>;Taajb>;m~rmt~aaaimwrzaaabmvu>;Taajc>;m~rmt~aaaimwrzaaacmvu>;Taajd>;m~rmt~aaaimwrzaaadmvu>;Taaje>;m~rmt~aaaimwrzaaaemvu>;>;>;>;>;Tabaa>;m|vmaabbmrabaakaaaakaaacmwraaaemraadjkaajekaaddkaaaj>;>;>;Tacaa>;mzm~xsmumt}dzȳ۳ĸ"smu>;dzȳ۳񼬳!"smu>;ǝ|vs!ϳsmumvu>;Tacba>;mzm~x񼬳,ѳsmu>;,y>;ܳ۳ӳӳsmumt}!ڳr>;,ڳճڲmumvu>;Tacca>;mzmw}{bacakaccbm~xѳв|#ӳֲmumt}ĴIJmumt}ѳ"޳>;|}ӳ۳smumvu>;Taccb>;mzm~xmumt}>;ѳ"óӴsmumvu>;Tacda>;mzm~x>;ĸѳڲymumt}ĸ$÷Ƴڳ"ӳ"smu>;ճ$÷Ƴڳ"ӳڲmu>;س񼬳ѳ"smumvu>;Tacea>;mzmw}{ahcakaceb>;m~xѳĎærmu>;€ ߳ӳӳ"smu>; ߳ӳr>;Ď񼬳÷"mumvu>;Taceb>;m~xĎæ߳smumt}>;ճ꾤񼬳÷"ymumvu>;>;>;Tadaa>;Tadab>;m|vm~rmt~aaai>;mradbakaaabkaaaamwrzaaae>;mtadabkabbckaaaamrzabaa>;mradbakaaaakaaaa>;m~uaaaamuadabm~tmvu>;Tadba>;m|vmw}{ahcakadbb>;m|vm~xĎæsmumt}ĕ-ӳӲsmumvu>;Tadbb>;mtadaakabbbkaaacmy~tmrzaagamrad1akaaabkaaaa>;mrzabaamwraaaemraaefkadabkaaackaafd>;>;>;Taeaa>;m|vmw}{ahcbkaebam~xٳղsmumt}񼬳ĉsmu>;ŀ۳uǐ-smu>;ŵճ„ƒ׳"smu>; "mumt}mr~{aaackaeabmr~{aabdkaeaemvvaeac>;Taeab>;m|vm~x>;"ymumt}€ӳӳγsmumt}>;qtr׳ڲsmumt}ڳ޳׳ڲym{aeadmt}>;mr~^aaad>;mrzaacam~xmxzaaac!ğsmu>;mxzaaadqtr!ğsmumxzaaaamt}>;maaee"zzmumt}mw}\ahcbmxzaaabmt}>;mr~aaackaaabkaaaamt~aabannQۻݳzmrzabgamum~mvu>;Taeac>;m|vmw}\ahcbm~xѲsmumt}s!ղsmumt}mxzbacamt}>;mt~aabamz\aacamv\aaainnQ!smrzabgamum~mxzaaaamt}ӳӳsmu>;ճγӳ"ymumvu>;Taead>;m|vm~xmt}(smumvu>;Taeae>;m|vmw}\ahcbm~xѲsmumt}s!ղsmumt}mxzbadimt}>;mt~aabamz\aadint ߳nQ!smrzabgamv\abcimw}\ahccmum~mxzaaaamt} вr{'ĩij۲rmu>;޳!- >;€smumvu>;Taeba>;m|vm~x!ϳr>;wĴ{dzȳsmumt}smu>;۽ʳ>;ӳsmu>;񼬳ӳr>;񼬳ѳڳ!"smumt}׳۳޳>;!"NJ ۳вzmumvu>;>; \ No newline at end of file diff --git a/res/jp/data/Stage/MazeB.tsc b/res/jp/data/Stage/MazeB.tsc new file mode 100644 index 0000000..64502c8 Binary files /dev/null and b/res/jp/data/Stage/MazeB.tsc differ diff --git a/res/jp/data/Stage/MazeD.tsc b/res/jp/data/Stage/MazeD.tsc new file mode 100644 index 0000000..cfbd0e4 --- /dev/null +++ b/res/jp/data/Stage/MazeD.tsc @@ -0,0 +1 @@ +þײ˲Əþײ˲Əþײ˲Əþײ˲Əþײ˲Ə۾̲ײҲѲƲò˾ +J$˾ƾƽ˾̲έέײҲu"r 1?ľƾԾֳײԏɾ֭trjK~l?˲ƾяֲ׾ײҲβƏҲײίƏ \ No newline at end of file diff --git a/res/jp/data/Stage/MazeH.tsc b/res/jp/data/Stage/MazeH.tsc new file mode 100644 index 0000000..77a3f1e --- /dev/null +++ b/res/jp/data/Stage/MazeH.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ailvqy````lu~t=:S``ia=:l}~qls}``ailvqy```alu~t=:S``ib=:l}~qls}``ailvqy```blu~t=:S``ic=:l}~qls}``ailvqy```clu~t=:S``id=:l}~qls}``ailvqy`0`dlu~t=:=:S`a``=:lylvq```blq```ij``ibj``abj``fd=:=:S`a`a=:lylvq```alq``cij``iaj```dj``af=:=:S`b``=:lyl}wrl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/MazeI.tsc b/res/jp/data/Stage/MazeI.tsc new file mode 100644 index 0000000..11977c9 --- /dev/null +++ b/res/jp/data/Stage/MazeI.tsc @@ -0,0 +1,8 @@ +fc|fcfc|fcfc|fcfc|fcfc|fcfcfc|fcfcfc|fc!ڼfc|fcfc|fc|fcfc|fcfcܜܣܳyIA"UCڢfc>%&yyڢfcfcfcfc|fcڢڢڞڞڞfc#"@C@ڛ + +& +Dڡfcfcfcfc|fc9I5ڡYfcfcfcfcfcfcfcfcfcfcfc|fc9&C5ڛfcfc|fcfcfc|fc9ܮڴ"K' CDڛfcF"ڼfc + +& +%%ܬ8 ڛfcCU!@fcJ@C!ڼfcfc|fcfc|fc +%9%ܱܜܻܹښfc<"B@J $ڛfc!"DC ڛfc9 ښfcLC5ڼfcfc|fc-!ڛfcfcyӾyyyyyyyyfcfc9fcܜܣܳfcfc \ No newline at end of file diff --git a/res/jp/data/Stage/MazeM.tsc b/res/jp/data/Stage/MazeM.tsc new file mode 100644 index 0000000..db25650 Binary files /dev/null and b/res/jp/data/Stage/MazeM.tsc differ diff --git a/res/jp/data/Stage/MazeO.tsc b/res/jp/data/Stage/MazeO.tsc new file mode 100644 index 0000000..dffedfc Binary files /dev/null and b/res/jp/data/Stage/MazeO.tsc differ diff --git a/res/jp/data/Stage/MazeS.tsc b/res/jp/data/Stage/MazeS.tsc new file mode 100644 index 0000000..8060f44 --- /dev/null +++ b/res/jp/data/Stage/MazeS.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlv|z`gfaj``ielvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:S``ie=:lq~`c``j``b`j````lvqy```blu~t=:=:=:S`a``=:l{ulv|z`gfcj`a`a=:l``aalq~`a``j````j```blvq````l}t````lq``dcj``i`j``afj``ac=:S`a`a=:lyl}wzٲұyl~tlu~t=:=:S`aa`=:lv|z`gfdj`aaalu~t=:S`aaa=:l{ulvq```dl}t```blq``dej``ibj```bj```e=:=:=:=:S`b``=:lylv|z`b`aj`b`al}w$ҲںٲҲzٲұl~tlu~t=:S`b`a=:lv|z`gffj```alv|[`gfflv|]`gfelv|[`b`b=:l``bbls~`b``j``baj````=:l}w#в z߲rl~tls|lq}```ej``a`j````=:ls}``a`lwy``a`msmPPqyylqy`af`l~tl}lu~t=:=:S`c``=:l{u=:lv|z`gfdj`c`c=:lv|z`gfbj`c`b=:lv|z`gfaj`c`a=:lv|[`gfal}wlvqs``aiǸrl~t=:rl~tls| ߲q=:+߲rl~tls|=:߲l~tls|Բq=:ƲزqҲrl~t=:rl~tls|!q=:ٲ rl~t=: Ͳrl~tls|=:lq~`c``j``b`j````lu~t=:S`c`a=:l{ulq~`c``j````j````=:l}wlvqs``aiԲxl~t=:ٲŬݲxl~tls|!Ҳձrl~t=:бq Ͳrl~tlq~`c``j``b`j````lu~t=:S`c`b=:lyl}ws Ҳrl~tlu~t=:S`c`c=:lyl}wlvqs``aiϱyl~tls|=:ҲƲزqyyl~tlu~t=:=:=:S`ca`=:l{uls~`ca`j``abj```djlq~`ca`j``h`j```el}s=:ls}``ael}w=:Ȳylqy`ad`l~tls|lvqs````=:ls}```hlvq```dl}t```blq``ddj`f``j```ij``ad=:lu~t=:=:S`cb`=:l{u=:lv|z`gfbj`cbb=:lv|z`gfaj`cbaluu`e``=:S`cba=:l{u=:l}~`cb`j````j````j````=:l}t```bl}t```c=:l}wlvqs``ai!qҲݲrl~tls|lvqs````=:lq~`c``j``b`j````lqy``e`l}w!yl~tls|lvqs````=:ls~`ea`j`ccdj````=:ls~`eaaj`ccdj```blqy`a``=:l}wlvqs``b`uuurl~tls|lvqs````=:lq~`c``j````j````lqy``e`l}t```b=:l}wlvqs``be޲ٲҲrl~t=:!Ͳٲl~tlvqs````ls|=:lqy``e`=:l}wsyls}````l~tls|=:ls~`ca`j```ij```blqy`a``=:ls~`ca`j0`abj```b=:lq~`ca`j``c`j```bls}``aa=:l}t````=:l}wlvqs``ai=:ywyyl~tls|lvqs``ad=:yl~tls|۲yl~tls|ٲq𻫲ٲ=:Բyl~tls|زݲ=:ҲҲyl~tls|~Ɯ߲=:ֲҲrl~tls|Բyl~t=:ƜھвԱyl~tls|·Ã~=:!yyl~tls|lvqs``aièٲyl~t=:qó!¶Ͳұrl~tlvqs````ls|ls}````=:lqy`a``=:lq~`ca`j``f`j```blqy``dh=:lq~`ca`j``e`j```blqy``b`=:lq~`c``j``b`j````lqy``b`=:l}t```bl}t```cl}wlvqs``ai=:鱋yl~tlq~`ca`j``h`j````l}r```blq~`c``j``c`j````l``gbls|lvqs``bcҲ!ٱyyl~t=:lq~`ca`j````j````ls}```dls~`ca`j`afij````lr|`ca`=:lv|[`gfblv|[`gfc=:lu~t=:S`cbb=:lylu~t=:=:S`cc`=:=:=:=:S`e``=:l{u=:lv|z`gfbj`e`b=:lv|z`gfaj`e`a=:l}w۲ݲrl~t=:ԲٲDzܲݲrl~t=:ٲ޲ٲԲұrl~tlu~t=:S`e`a=:l{ulqy``a`=:lq~`c``j````j````=:l}wlvqs``b`+=:Ͳݲ!Ҳٲϱrl~tls|=:lq~`c``j``b`j````lu~t=:S`e`b=:lyl}w۲ݲrl~tlu~t=:=:S`ea`=:S`eaa=:=:=:S`f``=:l{ulv|]`gfclv|[`gfdlv|]`gf`=:l}sls}```hls~`cc`j``abj```blq~`c``j````j```b=:l}~`cb`j````j````j````=:lvqy```d=:l}wlvqs```e~Ź߲l~tls| ٲrl~t=:ٲl~tlq~`cc`j````j````ls|Ðq=:ٲrl~tls|=:lvqs``ai ٲҲrl~tlvqs````ls|=:lq~`cc`j``f`j````lqy``d`=:lq~`cc`j``e`j```blqy``b`=:l}t```clq~`c``j``b`j````=:l}wlvqs``ai!qҲݲrl~tls|lvqs````=:lq~`e``j``a`j````lqy`a``=:lq~`cc`j``h`j```b=:lq~`c``j````j```b=:lq~`e``j``b`j````l}t```bl}w=:lvqs``bcpyyylqy``e`ls|lvqs````=:lq~`cc`j````j```b=:lqy`a``l}wlvqs```eҲҲٱrlq~`c``j````j````l~t=:~ Ð=:ٲrl~tls|=:lvqs``aiԲ!yl~tls|lvqs````lq~`cc`j``a`j````=:lqy`af`ls~`b``j``aej```blqy``d`=:l}w=:lvqs``aiƫƲssٲrl~tls|=:lv|[`ghalv|[`gfels~``afj``afj```blu~t=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/MazeW.tsc b/res/jp/data/Stage/MazeW.tsc new file mode 100644 index 0000000..ea91da9 --- /dev/null +++ b/res/jp/data/Stage/MazeW.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``cglvqy````lu~t=:S``ia=:l}~qls}``cglvqy```alu~t=:S``ib=:l}~qls}``cglvqy```blu~t=:S``ic=:l}~qls}``cglvqy```clu~t=:S``id=:l}~qls}``cglvqy```dlu~t=:=:S`a``=:lylvq```blq``chj``ibj```ej```c=:=:S`a`a=:=:S`a`b=:lyl``aalt~`a`blvq```dlq``d`j``ibj```dj```e=:=:S`a`c=:lv|z`fhaj`a`e=:lyz``agj`a`d=:lyl}w޲ڲٲٲҲrl~tlu~t=:S`a`d=:lyl``bblwya`aglv|[`fha=:l}wm󿺲z}mP rl~tls|luu`a`e=:S`a`e=:lyl``aalt~`a`clvq````lq``daj``i`j``aej```i=:=:S`a`f=:l{ul``aalq~`a`fj````j```blvq```dlq``dbj``idj```ej0``i=:=:S`aa`=:lv|z`gd`j`aaa=:l{ul``aalq~`aa`j````j```blvq```blq``dcj`e``j```dj``ac=:S`aaa=:l{ul``aalq~`aa`j````j```blvq```blq``dcj``ibj```dj``ac=:=:S`ab`=:l{ulvq```dlq``d`j``idj``abj```b=:=:=:=:S`c``=:S`c`a=:lt~`c`alrq```alv|]`fh`lu~t=:S`c`b=:lt~`c`bls}```glrq``a`ls~`c``j``acj````lr|````lu~t=:=:Sa```=:l{ulvr````j``aflqy`be`ls}````=:l}cls}``ae=:ó ìrlv}``aflqy`af`l~tls|ls}``cg=:ls~`c``j````j````lv|[`fh`lu~t=:=:=:Sab``=:l{ulq~ab``j``b`j```b=:lv~ab``j``aflvqy```a=:lqy`a``lvq```alq``dgjab``j``chj``af=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/MiBox.tsc b/res/jp/data/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/jp/data/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/jp/data/Stage/Mimi.tsc b/res/jp/data/Stage/Mimi.tsc new file mode 100644 index 0000000..032a48b Binary files /dev/null and b/res/jp/data/Stage/Mimi.tsc differ diff --git a/res/jp/data/Stage/Momo.tsc b/res/jp/data/Stage/Momo.tsc new file mode 100644 index 0000000..538f21e --- /dev/null +++ b/res/jp/data/Stage/Momo.tsc @@ -0,0 +1,15 @@ +½ֱʱŎ½ֱʱŎ½ֱʱŎ½ֱʱŎ½ֱʱŎڽֱѱб±ڎֱѱʱĎѱױʱֱѱűĽʱѱŎڎֱѱʱĎѱױʱֱѱűĽʱѱŎڎ˲˱˲˱˱˲˲˲ѱʱѱʱȽͬͬı!I>++ ?BE> #fLýŽӎH*B>ŽNcýŎMkgýŎMFq%*+BE>r?0HLýŎ +UMn+ *C*B>G>rNI6ýŎ*hL,G4k>MýŽqfJF,I#NLýŽӎ]!<kN#G#EýŽ"qmBEjMýŎ!I>qM +%AJj>`MgýŎ]?+,iI.ELýŽЎ˱˱Ʊ˱˱ȽıGi!'9+IMýŎ?k*BEI#*6hŽŎȽýŽ!½<kYijnLýŽӎıղqghk>ýŽձӽıM /-JN]?+,iI#MýŽЎծҮͮͬƱȽýŽ!½<kYijnLýŽӎıղqghk>ýŽձӽıM /-JN]?+,iI#MýŽЎծҮͮͬƱڽȽı"6#ɽ˱<%ɽŎIh##F8ŽŎڽͬ##ULýŎ48+ #fýŽGi!'9 q*UBEýŽıղլҬͬȎֱMϾqiJ}k>ýʱŽֽнձȽı%nýŎ.6f,#0HŽ +MN UGjq W4kEjMgýŎ<M Ih6 iJIkjýŽ##ɽŽƱڽȽı N J"BEq6E@f%?#ýŽ +1I?*h +.JBEI#gýŽŎȽͬͬıM /-JN+I :+IMýŎkFBEj], ½Ŏ!kq keiJ}kkOIrG*IjG%ýŽIrG*6E], qiJ}kE,E9VýŽŎڽȽı /-JN+I :+IMýŎ2MTF :G ?B>h +M], LýŽIrG*6E], qiJ}kE9VýŽŎڽȽı)*'iI4#ýŽӽıղ +tk], q *:>ýŽӽırŽ2M], Ž + tLýŽձ2k7b'I#nýŽŎڽͬͬȽı)*'iI4#ýŽӽıղծ], q *:>ýŽӽı'GŽ N+ýŎ2kIh#0jG%nýŽձֱѱнʱ N J"BEq6E@f%?#ýŽ J"NŽ*MI SýŽ?0H +1IFLýŎBgJ*h'1?6>r?0HŽ +.JBEI#ýŽŎȽͬı)*'iýŽ J"N *C*B>ɽŽӎıղծ +q6>ýŽӽı U b#I#nýŎ J"M*m +ýŽձ%rŽ+#I#G +qN+fPIMgL&ýŽ] IrG*8jnýŽƱڽȽı3 kýŽ /-JN U+**j*h +MF rFEýŽŎڽ ^]8*ɽ˱бֱʱýŽЎʱ˲ʬֱűMN+ +r6>ýŽнֱʱŎͮͬͬͬͬͬͬͮͬͮͬýŽнѱѱʬֱűg. r?ýŽнֱʱŎڽ?l%*ŽŎ \ No newline at end of file diff --git a/res/jp/data/Stage/Oside.tsc b/res/jp/data/Stage/Oside.tsc new file mode 100644 index 0000000..24224ef --- /dev/null +++ b/res/jp/data/Stage/Oside.tsc @@ -0,0 +1,5 @@ +NKdqqzqNK}}qqsv}qqqq}NKdqqzrNK}}qqsv}qqqr}NKdqqzsNK}}qqsv}qqqs}NKdqqztNK}}qqsv}qqqt}NKdqqzuNK}}qqsv}qqqu}NKNKdqrqqNK}}qqqq}qqvs{qqzq{qqrx{qqrqNKNKdqrsqNK}}qqrr}qrsq{qqqq{qqqs}qqqu}qqvv{qqzu{qqqz{qqqzNK}¤}}NKNKdqrtqNK}}qqts{qrtr}qqrr}qrtq{qqqq{qqqs}qqqq}qqwz{qqzq{qqrv{qqqyNKdqrtrNK}}qqqq}qqrr}qrtq{qqqq{qqqsNK}rqts}nqqts}lrtxq}NK¶œƒ}}NK}qqqq}qqwz{qqzq{qqrv{qqqyNKNKdqruqNK}}qqqq}qqqq}qqzu{qqzq{qqru{qqqxNKNKdqsqqNK}}‰}}NKNKdquqqNK}}qzwq{quqr}}qqrqēĂ1ӕ (NK̾<ƒ}}NKdquqrNK}}}qurq{qqrw}qqvqNK}}qqrq +'*}qqqq2ƒ}}NK}qusq{qrvq{qqqq}NK}quqq{qqqt{qqqq}qqtsNK}quqq{qqqq{qqqs}qqtsNK}Aqusq{qqvq{qqqq}qqtsNK}qusq{qqqq{qqqs}qqtsNK}quqq}qusqNK}qurq{qqrq{qqqs}qsqqNK}}qqrq),'ƒ}}}qqqqNK}qurq{qqsq{qqqs}qsvqNK}qurq{qqrq{qqqs}qsqqNK} NK +1ӆа*ƒ}qsqq}#ĩďğœ 1ԠNKӯ$ Ζ1ˋϯ*,ƒ}qsqq}ӯ$ ™ĩďğœ Ζ1NKщϿ (+*,ƒ}qsqq}NK}qqqs2 !'¤}qsqq} $ ċĚľÒѭ‚NKĩďğœ ) ̺ ϓ‚NKѕ*( ƒ}qsqq}}qqswNK}¡.)¡}zzzzNK}NKNKNKdqurqNK}}Đ}}NKdqusqNKNKNKdqwqqNK}}ħİģĐ+ًحƒ}NK- ƒ}NK ' +-*ęĦœĘ1NKЊęĦœĘ +'Ϸƒ}NK2NK*#(¤}}NKNK \ No newline at end of file diff --git a/res/jp/data/Stage/Ostep.tsc b/res/jp/data/Stage/Ostep.tsc new file mode 100644 index 0000000..66aaf78 --- /dev/null +++ b/res/jp/data/Stage/Ostep.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFPKS::::FOXN-::C;FWXKFPKS:::;FOXN-::C<FWXKFPKS:::FWXKFPKS:::>FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::<FPKY::::F^\K::B?D::C@D::;CD::D::;; +-:<::-:<:;-:C::FNXZ:C::FUOcFWcN:::[5堝_"(!y&Q%"(!yQHoHP" p-$5(;נ &A%_&$*$(%2 HoJ&$*$(%͠ \#m$D"'%堝Y\<@"(B\ @yנNDXITYHWWàƠנ3_%_!oQ<[堝נà;<9{נ$eTW5Py 4& `Pנ!)H5QBZ !=_!{#y\+}W5<}P堝9̠#f'YTWsz7<z[⠝ڠ`[L&9=FˠננǠàĠ \ No newline at end of file diff --git a/res/jp/data/Stage/Pixel.tsc b/res/jp/data/Stage/Pixel.tsc new file mode 100644 index 0000000..b63e968 Binary files /dev/null and b/res/jp/data/Stage/Pixel.tsc differ diff --git a/res/jp/data/Stage/Plant.tsc b/res/jp/data/Stage/Plant.tsc new file mode 100644 index 0000000..26edcf3 --- /dev/null +++ b/res/jp/data/Stage/Plant.tsc @@ -0,0 +1,2 @@ +ƣڣǣڣȣڣɣڣʣڣˣڣ̣ڣͣڣΣڣϣڣƣǣˣ KrM? KrKSڣ̣!+x!!KrKSڣƣ GGcj}Z*ڣGb*$}b@b$$,jc,SUb'{&n^&-\^T裠TE]&j8jc8E^8vK&j8j&mS^}ףss""@iW\:KZףMD_$[Kr:}K8I88Gb*_c&j8jc#}?^8Tڣƣ&rA!Tڣǣ(,`_KW?~\"[(~IZ8ڣƣߣƣƣS?"WZ8ˣ,h%b{Ӷ$~_)S壠ڣƣ̣ + !Ӷ$~_)Sɣ#['{'b-c@ɶ'3<Sڣ \ No newline at end of file diff --git a/res/jp/data/Stage/Pole.tsc b/res/jp/data/Stage/Pole.tsc new file mode 100644 index 0000000..f9bb55a Binary files /dev/null and b/res/jp/data/Stage/Pole.tsc differ diff --git a/res/jp/data/Stage/Pool.tsc b/res/jp/data/Stage/Pool.tsc new file mode 100644 index 0000000..86598d4 Binary files /dev/null and b/res/jp/data/Stage/Pool.tsc differ diff --git a/res/jp/data/Stage/Prefa1.tsc b/res/jp/data/Stage/Prefa1.tsc new file mode 100644 index 0000000..ba4a1f9 --- /dev/null +++ b/res/jp/data/Stage/Prefa1.tsc @@ -0,0 +1,2 @@ +þײ˲Əþײ˲Əþײ˲Əþײ˲Əþײ˲Ə۾ҲײѲò۾ҲҲƏ۾N,"kľƏI_^9+ʾ̲Ծ Nbrw9kKO ur +\09k?aN,z@H(ilkľƾhCFON /rakľƾ3N utVOHNs rbCF /rak3HKJkľƾjGOG DGÏ"kxN, D@ľƾ,sG7^oJ1lP:O 0.7ÏhjXJHJk@m&ľƾя̲˲մ5(JJ1lP˲ƾƏ \ No newline at end of file diff --git a/res/jp/data/Stage/Prefa2.tsc b/res/jp/data/Stage/Prefa2.tsc new file mode 100644 index 0000000..12bedd3 --- /dev/null +++ b/res/jp/data/Stage/Prefa2.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lyl}wβl~tlu~t=:lq~`a``j````j```bl``aalvq```dlq``fbj``idj``gij``gc=:=:S`aa`=:lylvq`0`c=:lv|[aecalv|[aecdlv|[aee`=:lq``h`j``icj``agj```a=:=:=:=:=:=:S`b``=:lyl}w*=:ݲ߾κ rl~tls|* ٱxl~z````ls|=:lv|[aci`lv|[acialv|[acibls}````lvq```alqy`a``=:lq``g`j`ca`j`aahj``fb=:=:S`be`=:lyl}w=:ھҲl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/Priso1.tsc b/res/jp/data/Stage/Priso1.tsc new file mode 100644 index 0000000..eeda7f0 --- /dev/null +++ b/res/jp/data/Stage/Priso1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``bilvqy````lu~t=:S``ia=:l}~qls}``bilvqy```alu~t=:S``ib=:l}~qls}``bilvqy```blu~t=:S``ic=:l}~qls}``bilvqy```clu~t=:S``id=:l}~qls}``bilvqy```dlu~t=:=:S`a``=:l{ul``aalt~`a``lvq````lq0`efj``i`j``h`j```i=:S`aa`=:l{ul``aalt~`aa`lvq```alq``fbj``iaj```gj``gd=:=:S`b``=:lq~`b``j```bj```blu~t=:S`b`a=:lq~`b`aj```bj```blu~t=:S`b`b=:lq~`b`bj```bj```blu~t=:S`b`c=:lq~`b`cj```bj```blu~t=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/Priso2.tsc b/res/jp/data/Stage/Priso2.tsc new file mode 100644 index 0000000..5ce497e Binary files /dev/null and b/res/jp/data/Stage/Priso2.tsc differ diff --git a/res/jp/data/Stage/Ring1.tsc b/res/jp/data/Stage/Ring1.tsc new file mode 100644 index 0000000..17c366a Binary files /dev/null and b/res/jp/data/Stage/Ring1.tsc differ diff --git a/res/jp/data/Stage/Ring2.tsc b/res/jp/data/Stage/Ring2.tsc new file mode 100644 index 0000000..9c51f51 --- /dev/null +++ b/res/jp/data/Stage/Ring2.tsc @@ -0,0 +1,3 @@ +S``i`=:l{ul}~qls}``c`lvqy````lu~t=:S``ia=:l{ul}r```blqy```bly=:l}~qls}``c`lvqy```alu~t=:S``ib=:l{ul}~qls}``c`lvqy```blu~t=:S``ic=:l{ulv|zacdaj``iilv|zabg`j``ih=:l}~qls}``c`lvqy```clu~t=:S``id=:l{ul}~qls}``c`lvqy```dlu~t=:=:S``ih=:l{u=:ls}```cj``acj``ba=:ls}```cj```ij``ba=:ls}```cj```fj``ba=:ls}```cj```cj``ba=:ls}```cj````j````=:l}~qls}``c`lvqy```clu~t=:=:S``ii=:l{u=:ls}```cj```ij``ba=:ls}```cj```fj``ba=:ls}```cj```cj``ba=:ls}``ahlvqy```clu~t=:=:=:=:S`a``=:lylvq```clq``fdj``icj```cj```a=:S`aa`=:lylvq```al}t```blq``fhj``iaj```cj``ad=:=:S`b``=:l{u=:lv|zabgbj`b`d=:lv|zabg`j`b`b=:lv|zabgaj`b`al}w=:бqҲٲrl~tlv|za`b`j`b`els| Ų߲Ǹݲxl~tlu~t=:S`b`a=:lyl}w=:ڲ!yl~tlu~t=:S`b`b=:l{ul}wrl~tls|sûsڲrl~tls|=:xl~tls|бrrl~t=:вq{߲=:ƫƲ!xl~t=: q +Ҳ߲rl~t=:ҲҲrl~tls|=:lv|[abgblu~t=:S`b`c=:S`b`d=:l{ul}wвݲҲrl~t=: ljq ұrl~tlv|zabgdj````lv|[abgdls|=:uñl~tls|=:lq~`be`j``a`j```e=:lq~`beaj``a`j```e=:lq~`bebj``a`j```e=:lq~`becj``a`j```e=:lq~`bedj``a`j```e=:lq~`beej``a`j```e=:lu~t=:S`b`e=:l{ul}w!zu=: +Ҳrl~tlu~t=:=:S`ba`=:lylv|zabg`j`bab=:lv|zabgaj`baa=:l}w~ŬҲrl~t=:ٲȃ޲,rl~t=:Ҳ!ٲϱrl~tlu~t=:S`baa=:lyl}w=:ǍDŽrl~tlu~t=:S`bab=:lyl}wٲٲ!yl~tlu~t=:=:S`bb`=:lylv|zabg`j`bbb=:lv|zabgaj`bba=:l}wбql~t~Ҳٲuuurl~tlu~t=:S`bba=:lyl}w=:Ҽyl~tlu~t=:S`bbb=:l{ul}wƜֲxl~t=:~z} ݲl~tlv|za`b`j`bbcls| вҲҲl~tls|=:~۲ê!l~tlu~t=:S`bbc=:l{ul}w=:!{yyl~tlu~t=:=:S`be`=:S0bea=:S`beb=:S`bec=:S`bed=:S`bee=:=:S`d``=:S`d`a=:=:S`da`=:l{ulv~`da`j``aflq~`da`j`e``j```dlqy``e`=:ls}````l}cܲвϱyl}r`da`l~tls|ﱓlqy``b`ﱓlqy``b`ls|=:ƌƲyyyl~tls|=:lqy``e`ls~`db`j`bfgj```dlqy`a``=:lv}``af=:lq~`db`j```gj```dlr|`db`lt~`da`lv|]abg`ls}``calu~t=:=:S`db`=:l{ulv~`db`j``aflv|[abg`=:lq~`db`j`e``j```dlqy`a``=:l}c{pyyl}r`db`l~tls|=:lq~`db`j`ea`j```dlqy`de`ls}``ae=:lv}``aflq~`db`j`eb`j````l}c=:~ ìylqy`ad`l~tls}````ls|=:lv~`de`j``aflqy``e`=:ls}```cj```ij``bal``ablqy``b`=:ls}```cj```fj``bal``ablqy``b`=:ls}```cj```cj``bal``ablqy``b`=:ls}```cj````j````l``ablqy``b`=:lqy``e`=:lv}``afls}``c`lt~`db`lu~t=:S`de`=:=:=:S`e``=:l{ult~`e``l{z```aj`e`al{[```aluu`e`b=:S`e`a=:l{ulqluu`e`b=:S`e`b=:ls}``agl}t```b=:ls}```cj``acj``ba=:l}clvqs``balq~`d``j``a`j````l~tls|=:Ҳܲrl~tls|lvqs````=:lqy``b`lq~`d``j``b`j````lqy``c`=:l}clvqs``baҹ úǎ=:{ƌl~t=:&€rl~tls|ҹq=:& Č (ۿ=:ؾ߲l~tls|۲ Ě#ؾ=: Ҳrl~tls| ̲Ҳ=:󿛲ܼ'rl~t=:ڲl~tls|lvqs````=:lqy``b`lt~`d`alq~`d``j``d`j````lqy``b`=:l}clvqs``baҼrlqy``c`l~tls|=:Ҽql~t=:|(rl~tls|lq~`d``j``e`j````~~~l~tls|ұyl~tls|=:~ڲٲٱxyl~t=: ҲԱxyl~tls|l~tls|=:Աyyl~tls|=:ls~`da`j`bfcj````lqy```e=:lq~`da`j```bj````lqy``e`=:ls}```cj``acj``balt~`d``=:lv|]abg`lv|[abgalqy``e`lr|`da`ls}```glu~t=:=:S`e`a=:l{ult~`e``ls}``agl}t```b=:ls}```cj``acj``ba=:lt~`d`alq~`d``j``d`j````=:ls~`da`j`bfcj````lqy```e=:lq~`da`j```bj````lqy``e`=:ls}```cj``acj``balt~`d``=:lv|]abg`lv|[abgalqy``e`lr|`da`ls}```glu~t=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/Ring3.tsc b/res/jp/data/Stage/Ring3.tsc new file mode 100644 index 0000000..25f4936 Binary files /dev/null and b/res/jp/data/Stage/Ring3.tsc differ diff --git a/res/jp/data/Stage/River.tsc b/res/jp/data/Stage/River.tsc new file mode 100644 index 0000000..181ec47 --- /dev/null +++ b/res/jp/data/Stage/River.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_::=BF]]]:>::FPKS::::FOXN-::C;FWXKFMW_::=BF]]]:>::FPKS:::;FOXN-::C<FWXKFMW_::=BF]]]:>::FPKS:::::FPKS:::=FOXN-::C>FWXKFMW_::=BF]]]:>::FPKS:::>FOXN-::C?FMW_::=BFPKS::::FOXN-:;::FUOcFPKY:::;FM]]F^\K::>AD::C;D:::BD:::C-:;;:FUOcFPYX:<::D::;@FaKS::;:FPKY::::FPYW::;@FPVT:B?:D:;;; +FPV5:B?:FW]QnjSSFXYNFWcN::::F^\K::=;D::CD:::;-:;;@-:;<:FUOcFKXZ:;<:D::::D:::FM]]F^\K::A=D::C>D:::@D:::C-:<::-:<<:FUOcFNXZ:<<:FPVT;>>>D::::FPVT:B=@D:<<;FOXN-:<<;FZ\SFaKS::::FUOcFPV5:B?;FaK]FaKS::?:FZ\SFW]QTee֚ǞǓˌNjmFXYNFOXN \ No newline at end of file diff --git a/res/jp/data/Stage/Sand.tsc b/res/jp/data/Stage/Sand.tsc new file mode 100644 index 0000000..65a163f --- /dev/null +++ b/res/jp/data/Stage/Sand.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```flvqy````lu~t=:S``ia=:l}~qls}```flvqy```alu~t=:S``ib=:l}~qls}```flvqy```blu~t=:S``ic=:l}~qls}```flvqy```clu~t=:S``id=:l}~qls}```flvqy```dlu~t=:=:S``ii=:l{ul}~qls}```f=:lq~`a``j```aj````lvqy```d=:ls~`c`aj`aabj```blqy`a``=:lq~`a``j````j````=:l}t````lt~`c`al}slu~t=:=:S`a``=:l{ul}wq۲ ٱxl~z````ls|=:ls~`c``j`aaaj```blx}slqy``f`lq~`a``j```aj````=:lqy`a``lvq```dlq```aj``iij```ej```h=:=:l{uls~`c``j`aaaj```blx}slqy``f`lq~`a``j```aj````=:lqy`a``lvq```dlq``ahj``iij``aej``a`=:lqy`a``lvq```dlq```aj``iij```ej```h=:=:S`a`a=:lyl``aalt~`a`alvq````lq``bij``i`j``ahj```i=:=:lv|z`ef`j`a`b=:S`a`b=:lyl``aalt~`a`alvq````lq``caj``i`j``ahj```i=:=:S`a`c=:lyl``aalt~`a`clvq```dlv|z`bh`j`a`elq``ccj``idj``abj``a`=:=:S`a`d=:lylvq```dlq``cdj``idj```ej``ab=:=:S`a`e=:lylq``cfj``idj``abj``a`=:=:S`a`f=:lylvq```dlq```ij``idj```cj``ei=:=:=:S`ae`=:lyl}wl=:vózl~tlu~t=:=:S`aea=:lyl}wl=:Pl~tlu~t=:=:=:=:S`b``=:l{ul{z```gj`b`al{[```gluu`b`b=:S`b`a=:lqluu`b`b=:S`b`b=:l{ul}t```blt~`b``lv}lv~`b`aj``aflqy`a``=:l}c=:ݲڲls}````l~tls|=:ls~`b`fj``fgj````lqy``a`lqy``i`=:lq~`b`fj``acj````=:l}clvqs``ae=:!l~tls|sԲҲٱrl~t=:ٲ!Ǹ=:ٲҲrl~tls|=:lvqs``af Բٱxl~tls|lvqs````=:lq``e`lqy``b`=:l}c=:xylqy``e`l~tls|lvqs``aeھ ݲ =:ٲrl~tls|lq~`b`fj``b`j````=:lrq``b`ls}```glr|````=:l}`ba`j``a`l}`ba`j``aalu~t=:S`b`a=:S`b`b=:S`b`c=:S`b`d=:S`b`e=:S`b`f=:=:=:=:S`ba`=:l{ulqy`be`ls}````=:l}cls}``ae=:y{ ìylqy`af`l~tls|Ǫ$Ҳڹ ߲rl~tls|=:lv}``afls}```f=:l}`ba`j``a`l}`ba`j``aalu~t=:lu~t=:=:S`bb`=:lv|z`bgbj`bbalu~t=:S`bba=:l{ult~`bb`l}t````lqy``e`=:lq~`b`bj``a`j````lqy``dd=:lq~`b`cj``a`j```blqy0abh=:lt~`b`blt~`b`clv|[`bgclu~t=:=:S`bc`=:lv|z`fb`j`bcc=:lv|z`bghj`bcb=:lyl}wz}ڲٲٲҲl~tlu~t=:=:S`bca=:lqy``e`=:lq~`b`dj``a`j````lqy```h=:lq~`b`ej``a`j```blqy`abh=:lt~`b`dlt~`b`eluu`bcb=:S`bcb=:lylvq```dlq``cej`e``j```ej```i=:S`bcc=:lylvq```dlq``cej``idj```ej```i=:=:S`c``=:S`c`a=:S`ca`=:=:S`cb`=:l{ult~`cb`ls}````l}t````lqy``e`=:lq~`ca`j```aj```bl}wlvqs``be=:yyl~tls|=:lq~`ca`j```cj````lqy`ae`=:lt~`ca`l}lu~t=:=:S`cd`=:lv|z`eicj`cdalu~t=:S`cda=:lv|z`bgdj`cdblu~t=:S`cdb=:lv|[`bh`lt~`cd`lu~t=:=:=:=:S`ce`=:lyl}w$ҲڲٲٲҲl~tlu~t=:=:S`cf`=:lyl}wlRRq=:߲ڲҲݲвq=:~Ť߲Ҳrl~tlu~t=:=:S`d`a=:lyl}wʲʲʲʱl~tlyz``adj`da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d`aj`acfj````lv|[`bgelwya`adly[``admҲmP ,rl~tlv|[`bgdls|=:lv|]c```lv|]c``alv|]c``blv|]c``clv|[c``d=:lu~t=:S`d`b=:lyl}wl`a`eñyl~tlyz``adj`da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d`bj`acfj````lv|[`bgflwya`adly[``admҲmP ,rl~tlv|[`bgdls|=:lv|]c```lv|]c``alv|]c``blv|[c``clv|]c``d=:lu~t=:S`da`=:lyl}wsͲrl~tlu~t=:S`daa=:lt~`daalu~t=:S`dab=:lyl``bbls~`dabj``baj````=:l}w#в z߲rl~tlwya`adls~`dabj`ac`j````ls|=:Ҳl~tlyz``adj`dacls|=:ls~`dabj`acfj````lv|[`bgilwya`adly[``adls}``a`mҲmP ,rlqy`af`l~tl}ls|=:lv|]c```lv|[c``alv|]c``blv|]c``clv|]c``d=:lv|[`bgdlu~t=:S`dac=:lyl}wsͲrl~tls~`dabj``aej````lu~t=:=:=:=:S`e``=:lylt~`e``l``bbls}``af=:l}wlwya``fmszmP ,ylqy`af`l~tl}l}|[```e=:PePͲֲyl~tlu~t=:=:S`e`a=:lylt~`e`al``bbls}``af=:l}wlwya``fmszmP ,ylqy`af`l~tl}l}|[```e=:PePͲֲyl~tlu~t=:=:=:Sab``=:l{ulq~ab``j``b`j```a=:lv~ab``j``aflvqy```a=:lqy`a``lvq```alq``cijab``j``faj``ab=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/SandE.tsc b/res/jp/data/Stage/SandE.tsc new file mode 100644 index 0000000..9d32635 Binary files /dev/null and b/res/jp/data/Stage/SandE.tsc differ diff --git a/res/jp/data/Stage/Santa.tsc b/res/jp/data/Stage/Santa.tsc new file mode 100644 index 0000000..9c18c0e --- /dev/null +++ b/res/jp/data/Stage/Santa.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```blvqy````lu~t=:S``ia=:l}~qls}```blvqy```alu~t=:S``ib=:l}~qls}```blvqy```blu~t=:S``ic=:l}~qls}```blvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```blvqy```dlu~t=:=:S``ii=:ls}``bhlvqy```dlu~t=:=:S`a``=:lyl``aalt~`a``lvq```dlq```fj``idj```dj``ab=:=:=:=:S`ab`=:l{ul}wlٲr=:w־qǦ½yl~tlu~t=:=:=:S`c``=:lyz```hj`c`a=:l{ul}wl~tlv|z`bdbj````=:‰ĂֲҲrl~tlu~t=:S`c`a=:l{ulwya``hl}wm~mP Ҳ ٱxl~z````ls|lwy````=:ly]```hlq~`c``j``a`j````lqy``c`lv|z`bdbj`c`blv|[`bdb=:l}wt¶ٲвl~tls|lwya`ably[``ab=:ls}``a`m‰mP ,rlqy`af`l~tls|l}lt~`c``lu~t=:=:S`c`b=:l{ult~`c`0lu~t=:=:=:S`e``=:lv|z`bbfj`e`f=:lv|z`bdbj`e`e=:lv|z`dhdj`e`d=:lv|z`bdaj`e`c=:lv|z`bd`j`e`b=:l{ulv|[`bd`l}w۲вڲԱrl~t=: вrl~tlwy```clq}[```cj````ls|=:ls}``a`mpsqmP ,rlqy`af`l~tl}lwy````ls| „xl~t=:ٲҲprl~t=:̲ݲ!q=:—v Ҳl~tlv|[`bdalu~t=:S`e`c=:l{ul}w—v q=:~ž߲rl~tlu~t=:S`e`d=:l{ul}wm‰mPǮҲxl~t=:—vв‰q=:ͲҲҲҲrl~tlu~t=:S`e`e=:l{ul}w‰!qԲxl~tlu~t=:S`e`f=:l{ul}w۹ٲٲڲrl~t=:ٲ}qql~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/Shelt.tsc b/res/jp/data/Stage/Shelt.tsc new file mode 100644 index 0000000..33cfd9e Binary files /dev/null and b/res/jp/data/Stage/Shelt.tsc differ diff --git a/res/jp/data/Stage/Start.tsc b/res/jp/data/Stage/Start.tsc new file mode 100644 index 0000000..3f627e4 --- /dev/null +++ b/res/jp/data/Stage/Start.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:S`a``=:lyls~0a``j````j````=:l``aalvq```a=:lq``abj``iaj``cgj``aa=:=:=:S`b``=:l{ul{z```ej``ialyls}````l}w=:~ٲ}ֲl~tls|lv|[`dc`lq``ahj`e``j```bj````=:=:=:Sa```=:lu~t=: \ No newline at end of file diff --git a/res/jp/data/Stage/Statue.tsc b/res/jp/data/Stage/Statue.tsc new file mode 100644 index 0000000..fc82012 --- /dev/null +++ b/res/jp/data/Stage/Statue.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~q=:lq~`b``j````j``d`=:lq~`b`aj````j``c`=:lq~`b`bj````j``b`=:lv|zaecdj``ie=:lq~`b`cj````j````=:ls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S``ie=:lq~`b`cj````j``a`lqy```a=:lq~`b``j``a`j``d`=:lq~`b`aj``a`j``c`=:lq~`b`bj``a`j``b`=:lq~`b`cj``a`j``a`=:lvqy```blu~t=:=:=:S`a``=:l{ul``aalq~`a``j````j```b=:lvq````lv|zaecdj`a`a=:ls}``bdlq``hdj``i`j``aij``ba=:S`a`a=:lq`0hej``ifj``aij``ba=:=:S`b``=:S`b`a=:S`b`b=:S`b`c=:=:S`ba`=:l{ulv|zaei`j`bb`l}wl=:tl~tlu~t=:S`baa=:l{ulv|zaeiaj`bbal}wl=:tqól~tlu~t=:S`bab=:l{ulv|zaeibj`bbbl}wl=:tq|l~tlu~t=:S`bac=:l{ulv|zaeicj`bbcl}wl=:tPl~tlu~t=:=:S`bb`=:l{ul}wl=:t~xl~tlu~t=:S`bba=:l{ul}wl=:tl~tlu~t=:S`bbb=:l{ul}wl=:t|ól~tlu~t=:S`bbc=:l{ul}wl=:tzsl~tlu~t=:=:=:S`c``=:l{ul}wuuurl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/Stream.tsc b/res/jp/data/Stage/Stream.tsc new file mode 100644 index 0000000..645dbd8 --- /dev/null +++ b/res/jp/data/Stage/Stream.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_xqlSSST_p|gSSSU_idlSSSU_evoSSSS_hqg0-FSS\V0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSW_hqg0-0-FSS\X0-_fpxSSUV_idlSSSS_hqg0-0-FSTSS0-_nh|_idrSSST_fvv_wudSSWZ]SS\T]SSS[]SSS\0-0-FSUSS0-#SUTS0-0-0-FTSSS0-_nh|_erdTSSS0-_dqsSUSS]SSTS]SSSS0-_dqsSUTS]SSTS]SSSS0-_zdlSVSS_idrSSSU0-_xqlSSSS_fvv_hyhTSST0-0-FTSST0-_lwmSST[]TSTS_ioNSTYS_hyhTSSU0-0-FTSSU0-_fpxSSSS_iomS[VY]TSSV_hyhTSTS0-0-FTSSV0-_ioPS[VY_iomS[XT]TSTS_ioNTSWU0-_hyhTSTS0-0-FTSTS0-_qfmSVVY]TSTT0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0-FTSTT0-_lwNSSVY0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0- \ No newline at end of file diff --git a/res/jp/data/Stage/Weed.tsc b/res/jp/data/Stage/Weed.tsc new file mode 100644 index 0000000..e43f30f --- /dev/null +++ b/res/jp/data/Stage/Weed.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```elvqy````lu~t=:S``ia=:l}~qls}```elvqy```alu~t=:S``ib=:l}~qls}```elvqy```blu~t=:S``ic=:l}~qls}```elvqy```clu~t=:S``id=:l}~qls}```elvqy```dlu~t=:=:S``ih=:l{ul}~qls}```elv|[`bbd=:lq~`a``j```aj````lvqy```d=:ls~`d`aj`aabj```blqy`a``=:lq~`a``j````j````=:l}t```bl}slt~`d`alu~t=:=:=:S``ii=:l{ul}~qls}```e=:lq~``iij``a`j````=:lvqy```dlqy``g`=:lq~``iij````j````lqy``c`lu~t=:=:=:S`a``=:l{ul}wq۲ ٱxlv|]`bbgl~z````ls|=:ls~`d``j`aaaj```blx}slqy``f`lq~`a``j```aj````=:lqy`a``lvq```dlv|z`baij`ac`lq```aj``iij```ej```h=:=:S`a`a=:lylv|]`bbglv|z`babj`a`bl}wz}ڲٲٲҲrl~tlu~t=:S`a`b=:lyl``aalt~`a`alvq```dlq```gj``idj``aej```h=:S`a`c=:lyl``aalt~`a`clvq```dlq```hj``idj```ij``aa=:=:S`a`d=:ly=:lv|z`badj`a`f=:lyz```ij`a`e=:l}wz}ڲٲٲҲrl~tlu~t=:S`a`e=:l``bbl}wlwya``imz}mP rl~tls|=:lwy````lv|[`badluu`a`f=:S`a`f=:lyl``aalt~`a`dlvq```dlq``bej``idj``afj```g=:=:=:S`a`g=:lyl``aalt~`a`glvq```dlq``bfj``idj``a`j```g=:S`a`h=:lyl``aalt~`a`hlvq```dlq``bgj``idj``a`j```i=:=:=:S`a`i=:ly=:lv|z`bbbj`aaa=:lyz``a`j`aa`=:l}wz}ڲٲٲҲԲrl~t=:{ٲҲrl~tlu~t=:S`aa`=:l``bbl}wlwya`a`m{z}mP rl~tls|=:lwy````lv|[`bbbluu`aaa=:S`aaa=:lyl``aalt~`a`ilvq```dlq``bhj``idj```fj``ac=:=:S`aab=:lylvq```dlq``ahj``idj```fj``a`=:=:S`aac=:lyl``aalt~`aaclvq```dlq``c`j``idj```gj```i=:=:=:=:S`aba=:lyl}wl=:ól~tlu~t=:S`abc=:lyl}wl=:Ô걦l~tlu~t=:=:S`ac`=:l{ulv|]`cbilv|]`bail}t```blq``aaj`db`j``bdj``bi=:=:=:=:S`b``=:lylt~`b``lv|[`ba`=:ls}``a`lwya``cly[```cl}w=:móz}mP ,rlqy`af`l~tls|=:lwy````l}lu~t=:=:S`b`a=:lylv|z`bbhj`b`glv|[`bbhl}wزrl~tls|~žҲٱrl~t=:Կy!Ҳxl~tls| вҲҲrl~tls|luu`b`g=:=:=:S`b`b=:lyz```hj`b`dl~sz``idj`b`c=:lyl``bbls~`b`bj``baj````=:l}w#в z߲rl~tlwya``hly[```hls|=:ls}``a`m~mP ,rlqy`af`l~tlt~`b`bl}lu~t=:S`b`c=:l``gbls~`b`bj``aej```blu~t=:S`b`d=:ls~`b`bj```aj````lu~t=:=:S`b`e=:lv|z`dhaj`b`f=:lyl}wǻpľ Ҳrl~t=:~ٲڲÔ !rl~t=:޲ٲٲÔ „rl~tlu~t=:S`b`f=:lyl}wҲҲ ֲԱrl~tls|óò ϲ =:ǻp"ql~t=:ݿڲ!rl~tlu~t=:=:S`b`g=:lyl}w!=:~s ߲rl~t=:ղ Ҳrl~tlu~t=:=:S`ba`=:lyl}wzÍs~=:㾓Ҳl~tlu~t=:=:S`bb`=:lyz``acj`be`=:lv|z`bbaj`bd`=:lv|z`dhdj`bci=:lv|z`baej`bcd=:lyl}wzٲұl~tls|=:ls~`bc`j`a`fj````l}t```blu~t=:S`bc`=:lv|z`bbaj`bcg=:lv|z`dhdj`bcf=:lv|z`bbcj`bce=:lv|z`bafj`bcc=:lv|z`baej`bcb=:lyl}w۲ ,Բ~ٲҲl~tls| Ͳ~rl~t=:ٲҲ!߲q=:ݲҲٱxl~z`bcals|=:вڲԱyl~tls| #߾ݲrl~tlwya``ily[```ilv|[`baels|=:ls}`0a`mz}mP #߾rlqy`af`l~tl}ls|Ĺ޲¶Ǿ!rl~t=:ݲrl~tlu~t=:S`bca=:lyl}wбqԱl~t=:l~tlu~t=:S`bcb=:lyl}wǺrl~t=: в߲ݲrl~tlu~t=:S`bcc=:lyl}wֱxl~tz}Ҳٱxyl~t=: Ҳl~tls|uuurl~tlv|[`bbcluu`bce=:=:S`bcd=:lylv|[`bafl}w޼ұrl~t=:ԲҲԲrl~tlu~t=:S`bce=:lyl}w޼Ҳq=:#ٲҲl~t=:ٲҲ+pl~tlu~t=:=:S`bcf=:lyl}wֱq• xl~tls|=:ql~t=: „ٱrl~tls|uuurl~tls|{xl~t=: rl~tls|lqy`a``=:l}w#߾ݲrl~tlwya`a`ly[``a`lv|[`bbals|=:ls}``a`m{z}mP #߾rlqy`af`l~tl}ls|ٲ߲в!rl~t=:{Ҳвrl~t=:۲вrl~t=:Ǻr~yl~tlu~t=:S`bcg=:lyl}w•Ǹٱxl~tlu~t=:=:=:S`bci=:lyl}w賄ҲҲl~tls|=:ls~`bc`j`a`fj````l}t```blu~t=:S`bd`=:lyl}w賄ҲҲl~tlu~t=:=:S`be`=:lylv|[`ebalv|[`ebbly]``ac=:l}wlwya`acm•mP rl~tls|=:lvq```dlq``ahj`b``j```fj````=:=:=:S`c`b=:lylv|z`bahj```alv|[`bah=:l``bbls~`c`bj``baj````=:l}w#в z߲rl~tluu``c`=:=:S`c`e=:lylt~`c`el``bbls}``af=:l}wlwya``fmszmP ,ylqy`af`l~tl}l}|[```e=:PePͲֲyl~tlu~t=:=:S`d``=:S`d`a=:=:S`de`=:lyl}ws~Բٱxl~tlu~t=:S`dea=:S`deb=:=:S`e``=:ly=:lv|z`baaj`e`a=:lv|[`baa=:l}wбql~t=:Ɯórl~tls| ݲ q=:órl~t=:ֲq۲!߲q=:z} Ǿ rl~tls|ڲ,ұrl~tlu~t=:S`e`a=:lyl}wz}Ҳ,ұl~t=:ԲԱl~tlu~t=:=:=:S`e`b=:lyz```cj`e`clu~t=:S`e`c=:l{ulv|[`babl}}`l}t````lqy``c`ly=:l}wбql~tls|Ɯz}yl~tly]```clwya``cls|=:móz}mP Þrl~tlwy````ls|вڲԱyl~tls|=:l{ulq~`e``j```cj````lqy`agflq~`e``j````j```b=:l``aals~`a`aj````j````lqy``a`=:lyl}wٲuǸrl~t=:ҲҲвrl~tls|l{u=:lq~`e``j```ej```blqy``a`lt~`e``=:l``aals~`a`aj``ahj````lt~`e`bl``bclu~t=:=:S`f``=:l{ulv|[`bails}````lvqy```dl}t```b=:l}wlvqs``a`rl~tls|lvqs````=:lq~`debj````j````lqy``a`=:l}wlvqs``ahz~rl~tlqy``a`lq~`deaj````j```bls|lvqs``a`ұxl~tls|lvqs````=:lvqs````lqy``a`lq~`debj````j```blv~`de`j``aflqy``e`=:l}wlvqs``ah۲ٱxl~tls|lvqs````=:lq~`deaj```cj```blqy``d`=:lq~`debj```cj```blqy``d`=:lq~`deaj```ej````lqy``cf=:lq~`debj````j````lqy``e`=:lq~`deaj````j```b=:l}wlvqs``a`Ҳ߲Բrl~tls|lvqs````=:lq~`deaj```ej````=:lq~`debj```ej````lqy``b`=:lq~`de`j``a`j````lt~`dealt~`deblqy``c`=:lq~`de`j``b`j````lqy``f`lv}``afl}r````=:lqy`b``l}w !ղֱֲֲֲyylqy``e`l~tls}```e=:lt~`de`lv|]`ebclv|[`bbelu~t=:=:=:Sab``=:l{ulq~ab``j``b`j```b=:lv~ab``j``aflvqy```a=:lqy`a``lvq```alq``a`jab``j``e`j``cd=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/WeedB.tsc b/res/jp/data/Stage/WeedB.tsc new file mode 100644 index 0000000..cb5ea63 --- /dev/null +++ b/res/jp/data/Stage/WeedB.tsc @@ -0,0 +1 @@ +ǤۤȤۤɤۤʤۤˤۤǤΤǤۤȤ'k9 kh~A%V[9ۤɤ T@"+ANۤʤ Tw_9ۤǤǤǤ,+7!FTǤɤۤ \ No newline at end of file diff --git a/res/jp/data/Stage/WeedD.tsc b/res/jp/data/Stage/WeedD.tsc new file mode 100644 index 0000000..0b59058 --- /dev/null +++ b/res/jp/data/Stage/WeedD.tsc @@ -0,0 +1 @@ +>;Taaja>;m~rmt~aaaamwrzaaaamvu>;Taajb>;m~rmt~aaaamwrzaaabmvu>;Taajc>;m~rmt~aaaamwrzaaacmvu>;Taajd>;m~rmt~aaaamwrzaaadmvu>;Taaje>;m~rmt~aaaamwrzaaaemvu>;>;Tabaa>;mzmaa1bmuabaamwraaaemraaagkaajekacddkaabh>;>;>;Tadae>;mzmuadaemaaccmt~aabg>;m~xmxzbaagnt{nQ!-zmrzabgamum~m~}\aaaf>;QfQγ׳zmumvu>;>; \ No newline at end of file diff --git a/res/jp/data/Stage/WeedS.tsc b/res/jp/data/Stage/WeedS.tsc new file mode 100644 index 0000000..f08a0db --- /dev/null +++ b/res/jp/data/Stage/WeedS.tsc @@ -0,0 +1 @@ +b_xb_b_xb_b_xb_b_xb_Ub_xb_b_b_xb_b_b_ \ No newline at end of file diff --git a/res/jp/data/Stage/e_Blcn.tsc b/res/jp/data/Stage/e_Blcn.tsc new file mode 100644 index 0000000..313fb2c --- /dev/null +++ b/res/jp/data/Stage/e_Blcn.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S`0id=:l}~qls}``ahlvqy```dlu~t=:=:S`a``=:l{ulvqy```alqy`b``=:lq~`b``j``a`j````=:lqy`a``=:lvq```alq````ja`i`j```aj``ae=:=:S`b``=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/e_Ceme.tsc b/res/jp/data/Stage/e_Ceme.tsc new file mode 100644 index 0000000..07d7398 --- /dev/null +++ b/res/jp/data/Stage/e_Ceme.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}0`ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:S`a``=:l{ulvqy```alqy`c``=:lvq```alq````ja`d`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/e_Jenk.tsc b/res/jp/data/Stage/e_Jenk.tsc new file mode 100644 index 0000000..f935134 --- /dev/null +++ b/res/jp/data/Stage/e_Jenk.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulvqy```alqy0b``lv|z`afbj`aa`=:lqy`a``=:lvq```alq````ja`b`j```aj``ae=:S`aa`=:l{u=:ls~`aa`j````j````lqy``b`=:ls~`aa`j`aacj````lqy``b`=:lq~`aaaj````j```blqy``f`=:lvq```alq````ja`b`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/e_Labo.tsc b/res/jp/data/Stage/e_Labo.tsc new file mode 100644 index 0000000..ff726e3 --- /dev/null +++ b/res/jp/data/Stage/e_Labo.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}`0ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulvqy```alqy`d``=:lvq```alq````ja`f`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/e_Malc.tsc b/res/jp/data/Stage/e_Malc.tsc new file mode 100644 index 0000000..f4faf39 --- /dev/null +++ b/res/jp/data/Stage/e_Malc.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulvqy``0a=:lqy``e`lq~`ba`j`a``j````=:lqy``e`lq~`bb`j`a``j````=:lqy``e`lq~`bc`j`a``j````=:lqy``e`lq~`bd`j`a``j````=:lqy``e`lq~`bd`j`aa`j````=:lqy`a``=:lvq```alq````ja`c`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/e_Maze.tsc b/res/jp/data/Stage/e_Maze.tsc new file mode 100644 index 0000000..23cb89f --- /dev/null +++ b/res/jp/data/Stage/e_Maze.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulqy```b=:lq~`b``j``a0j````=:lq~`bb`j``b`j````=:lq~`bc`j``a`j````=:lv|zb```j`a`aluu`aa`=:S`a`a=:lq~`c``j```aj```bluu`aa`=:=:S`aa`=:lvqy```alqy`c``=:lvq```alq````ja`a`j```aj``ae=:=:S`b``=:S`ba`=:S`bb`=:S`bc`=:S`c``=:=: \ No newline at end of file diff --git a/res/jp/data/Stage/e_Sky.tsc b/res/jp/data/Stage/e_Sky.tsc new file mode 100644 index 0000000..1a7a445 --- /dev/null +++ b/res/jp/data/Stage/e_Sky.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqry}qqqq}NKdqqzrNK}}qqry}qqqr}NKdqqzsNK}}qqry}qqqs}NKdqqztNK}}qqry}qqqt}NKdqqzuNK}}qqry}qqqu}NKNKNKdqrqqNK}}sqqq{qrqr}qqqsNK}qsqq{qqsq{qqqsNK}Aqsrq{qqtq{qqqq}qqqsNK}qsqq{qquq{qqqsNK}qsrq{qqrq{qqqq}qrrqNKdqrqrNK}qsqq{qqqq{qqqq}qqqsNK}qsrq{qtvw{qqqsNK}qrrqNKdqrrqNK}qqvqNK}qqqr}qtqqNK}qqqr}qqqq{rqvq{qqqr{qqrvNKNKdqsqqNKdqsrqNKNK \ No newline at end of file diff --git a/res/jp/data/StageSelect.tsc b/res/jp/data/StageSelect.tsc new file mode 100644 index 0000000..9c3347a --- /dev/null +++ b/res/jp/data/StageSelect.tsc @@ -0,0 +1 @@ +drqqqNK}}}Ԟ)2ƒ}zzzz}NKdrqqrNK}}}ğľĔ2ٍ}zzzz}NKdrqqsNK}}}ďĕ}Azzzz}NKdrqqtNK}}}'}zzzz}NKdrqquNK}}}̼}zzzz}NKdrqqvNK}}}&ՠ}zzzz}NKNK \ No newline at end of file diff --git a/res/jp/data/mrmap.bin b/res/jp/data/mrmap.bin new file mode 100644 index 0000000..b594b47 Binary files /dev/null and b/res/jp/data/mrmap.bin differ diff --git a/res/jp/data/npc.tbl b/res/jp/data/npc.tbl new file mode 100644 index 0000000..637426f Binary files /dev/null and b/res/jp/data/npc.tbl differ diff --git a/res/jp/data/sprites_og/Caret.png b/res/jp/data/sprites_og/Caret.png new file mode 100644 index 0000000..95ed15c Binary files /dev/null and b/res/jp/data/sprites_og/Caret.png differ diff --git a/res/jp/data/sprites_og/Resource/BITMAP/pixel.png b/res/jp/data/sprites_og/Resource/BITMAP/pixel.png new file mode 100644 index 0000000..561a050 Binary files /dev/null and b/res/jp/data/sprites_og/Resource/BITMAP/pixel.png differ diff --git a/res/jp/data/sprites_og/Stage/0.tsc b/res/jp/data/sprites_og/Stage/0.tsc new file mode 100644 index 0000000..be08b99 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/0.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_idlSSSU_hqg0-FSS\V0-_pqd_fpxSST[_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_idlSSSW_hqg0-0-0-0-0-0-0-0-FSTSS0-_nh|_irpSSTY_zdlSTSS_htPSUXY_fuh_zdlSVWS0-0-_iomUSSS]STTS0-_iomTSUS]STST0-0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-FSTST0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-0-FSTSU0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSY_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSU[S_hyhSUSS0-0-FSTTS0-_vloSSTU_zdlSVXS_flo_zdlSSUS0-_vloSST[_zdlSVXS_flo_zdlSSUS0-_vloSSTW_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSSUS_hyhSUSS0-0-FSUSS0-0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSYTS_idrSSST0-_wudSSZW]STSS]SSST]SSST0-0-FSWSS0-0-FSXSS0-FSXST0-FSXSU0-FSXSV0-FSXSW0-FSXSX0-FSXSY0-0-FSXSZ0-FSXS[0-FSXS\0-FSXTS0-FSXTT0-FSXTU0-FSXTV0-0-#SYSS0-0-0-FTSTS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZX]STSS]SSUS]SSST0-FTSUSp0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZY]STSS]SSST]SSST0-FTSVS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZZ]STSS]SSST]SSST0-FTSWS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZ[]STSS]SSST]SSST0-FTSXS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS[\]STSS]SSST]SSST0-FTSYS0-_iomUSSS]TSYT_hyhTS\S0-FTSYT0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS\V]STSS]SSST]SSST0-0-FTS\S0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]STSS]SSSS0-_idlSSST0-_iomUSSS]TUSS_hyhTTSS0-0-FTTSS0-_zdlSZVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXSV]SVXU]SVSS_zdlSSUS0-_fqsSXSW]SVXU]SWSS_zdlSSUS0-_fqsSXSU]SVXU]SUSS_zdlSSUS0-_fqsSXSX]SVXU]SXSS_zdlSSUS0-_fqsSXST]SVXU]STSS_zdlSSUS0-_fqsSXSY]SVXU]SYSS_zdlSSUS0-_fqsSXSS]SVXU]SSSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTY0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0-0-FTUSS0-_zdlSWVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXTS]SVXU]TSSS_zdlSSUS0-_fqsSXTT]SVXU]TTSS_zdlSSUS0-_fqsSXS\]SVXU]S\SS_zdlSSUS0-_fqsSXTU]SVXU]TUSS_zdlSSUS0-_fqsSXS[]SVXU]S[SS_zdlSSUS0-_fqsSXTV]SVXU]TVSS_zdlSSUS0-_fqsSXSZ]SVXU]SZSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTX0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0- \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Almond.tsc b/res/jp/data/sprites_og/Stage/Almond.tsc new file mode 100644 index 0000000..cd68dde Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Almond.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Ballo1.tsc b/res/jp/data/sprites_og/Stage/Ballo1.tsc new file mode 100644 index 0000000..02307f0 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Ballo1.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Ballo2.tsc b/res/jp/data/sprites_og/Stage/Ballo2.tsc new file mode 100644 index 0000000..f7a84ea --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Ballo2.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`d``=:S`d`a=:S`d`b=:S`da`=:S`daa=:S`dab=:=:=:=:S`e``=:l{ulx}slv}``afl}t```bls}````lq``e`lvqy```a=:lqy`ae`=:l}wlvqs``be l~tls|lvqs``ai=:÷Ǿھ yl~tls|вҲ ìٲ=:Źھ ٲxl~tls|=:lvqs``be=:uuurl~tls|ݲٲҲ߲q=:вֲ辴Ʋ=:y Ҳrl~tls|lvqs````=:l}blpppݲұlqy``e`=:l}wlvqs``beֱxl~tls|lvqs````=:lqy`a``l}blppppвҲӱ=:lq~`da`j``a`j````lq~`daaj``a`j```blqy``e`pppppҲҲӱ=:lqy`a``lyl}wxylqy``e`l~tls|lvqs````l{u=:ls}``cdlqy`a``=:lq~`d``j````j````lqy``b`=:lq~`d`aj````j```blqy``h`=:lyl}wlvqs``beڱyyl~tls|lvqs````l{u=:lqy0a``=:lq~`d``j````j```blqy``b`=:lq~`d`aj``g`j```blqy``cb=:lq~`d`aj````j````lqy``b`=:l}blppp߲lqy``e`=:ppppݲұlqy``e`=:pppppвҲӱlqy``e`ls|ls|=:lyl}wlvqs``be =:Բyl~tls|l{ulqy``e`=:lylvqs````l}csyl~tls|=:l{uls~`d`bj```ij````lqy`ae`=:lyl}wlvqs```e!rl~t=:زrl~tls|=:lvqs``aiŲ߲۲ݲyl~tls|lvqs```eٲٲ yyl~tls|lvqs````=:l{u=:lq~`d`aj``b`j````lqy``a`=:lq~`d``j``h`j```blqy```b=:lyl}wlvqs```eݲyyl~tls|lvqs````=:l{ulv~`d`bj``af=:ls~`d`bj``abj```blqy```b=:lq~`d`bj`a``j```blqy`a``=:lv}l}wl=:yyyyyyyyylqy`a``ls|lqy``e`lv}lvq```a=:lqy``e`lyls}````=:l}wlvqs``beŦxl~tls|=:lvqs``bcԱl~t=:lq``gaj`ab`j````j````=:lu~t=:=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Barr.tsc b/res/jp/data/sprites_og/Stage/Barr.tsc new file mode 100644 index 0000000..a54d830 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Barr.tsc @@ -0,0 +1 @@ +0==F=IZ[NIPZb===EISNV====IR[Q0==F>IZ[NIPZb===EISNV===>IR[Q0==F?IZ[NIPZb===EISNV===?IR[Q0==F@IZ[NIPZb===EISNV===@IR[Q0==FAIZ[NIPZb===EISNV===AIR[Q0=>==ISYW=@C>G=>=@ISYW=@C?G=>=>ISYW=@C=G=>=?IXRfI`\b==>>IN[]=>==G====G===?ISN\===AIa_N==>>G==FAG==A?G==B?0=>=>I]_VIZ`TWՏVI[\QIR[Q0=>=?IXRfISN\===AIa_N==>>G==FAG==A?G==B?0=>=@I]_VIZ`TՏVI[\QIR[Q0=>B=0=>B>0=>B?0=>B@0=>BA0=?F=ISYW=@D=G=?F>IR[Q0=?F>ISYW=@C=G====I]_VIZ`TISNP===EُVVI[\QIQ[]=?F=IP[]>===G==C@G===?IR[Q0=A==IXRfISY:=@C>ISY:=@C?I`ZPIP[]=A==G==>?G====IN[]=A==G==?=G===AIdNV=>A=I]_VIZ`TISNP===B珳яVI[\QISNP====IXRfIPY\IdNV=>==IPZb==>BIZ`T|\ʎVIdNV=>A=I[\QI`\b==ABIP[]=>B=G===>G====IdNV===AI`\b==ABIP[]=>B>G===>G====IdNV===AI`\b==ABIP[]=>B?G===>G====IdNV===AI`\b==ABIP[]=>B@G===>G====IdNV===AI`\b==ABIP[]=>BAG===>G====IPZb===EIR[Q0=B==0>===IXRfISY8=@C=ISY8=@C>ISY8=AA=ISY:=@?CIZ`TݏVI[\QIPY_vPlhvPlhVI[\QIPY_RRRI[\QUI[\QIZfO===?IdNV==@=IZfQ===?IP[]>===G==C=G===AIPY_ISNP===CՏʐu[khӕUI[\QIPY_ȏڏďҏĎOI[\Qu[khڏݏԏϏҏՎOI[\Q؞_ٞǏ֙ȏюNʏʏ̏Ώʏ֏ڛRʏpI[\QIPY_ʏڙgZR͏ΏʏُOI[\QIPY_VI[\QȏِltVITVa>==AI[\QIPY_RΏяʏUI[\QehʏЏˎVI[\QIPY_RRROI[\QIPY_ˏԎN폱؎OI[\QITVa====ʏehӟԏďΏY\MďΏOI[\QՏʏΏяюOI[\QIPY\ISNP====IPZb==== I^bN==@=I`\b==?CIN[]>===G===EG====IN[]=>==G===>G====IdNV==>=IZfQ====IP[]>===G==C=G====IdNV=>==I^bN==@=I`\b==?CIN[]>===G===EG====IN[]=>==G===>G====IdNV==D=I^bN==@=I`\b==?CIN[]>===G===EG====IP[]=A==G==>FG===?IP[]=>==G==>EG===?IPZ]===AG===EG==E=IPZ]===BG===EG==E>IPZ]===CG===EG==E?IPZ]===AG===FG==FCIPZ]===BG===FG==FDIPZ]===CG===FG==FEIZ`TԏVVIdNV==B=IP[]=A==G==>?G===?IN[]=A==G==@=G===?IPY_IXRfIPZb==>>ISNP==>AOϏʎVI[\QIPY_ISNP===BOʏΏѣ׏ːOI[\Q[٢MڙՏՏُOI[\QISNP====IPY_ȏُӏOI[\QIP[]=B==G==CDG===?IdNV=>==IN[]=B==G==>@G===?IdNV==B=IN[]>===G===EG====IZ`TISNP==>BϏ٢MӐNkՏՏˎOI[\QIPY_ISNP===BbhVI[\QIPY_[֙ϏʏˏVI[\QIPY_ISNP===E鏳Nu[khٟˏՎVVI[\QIPY_ISNP==>BRRROI[\QIPY_ISNP==>C鏳ehOI[\Qu[khyяޏˎOI[\Q֤я􏱎OI[\QIPY_ISNP===CUI[\QIPY_ʏڐehÏՏOI[\QISNP====IPY\IN[]=B==G==>BG===?IdNV=>>=I]_VIZ`TISNP===EUVI[\QISNP==>BIPY_|\NI[\Qӏڏ鏶ƏʎOI[\QIPY\IN[]=B==G==?=G===?ISNP====IPY\IXRfIdNV==B=IZ`TISNP===EyˏΏяVI[\QISNP====IPY\IdNV==B=ISNP===BIZ`Tʐ_ˏVI[\Q{ۏΏVI[\QϏʏُڐ[Տُ֎VI[\QIPY_RRROI[\QIPY_ҎNYږʎUI[\Qȏ٢Ґ[ӝَUIf[W>==>IN[]=A==G==@=G===?IPY_ISNP==>AՏԏ؎VI[\QIPY\ISY8=@C>IPZb===AIP[]=A==G==CEG===?IO`Y=A==IR[Q0>==>IXRfISY:=@C?ISY:=@C>IPZb===EIZ`TISNP===BȏOI[\QȏÏ[NOI[\QIPY\IN[]=A==G==>=G===?IR[Q \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Blcny1.tsc b/res/jp/data/sprites_og/Stage/Blcny1.tsc new file mode 100644 index 0000000..e1dc5dc --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Blcny1.tsc @@ -0,0 +1,2 @@ +WddmdA>pypzaeemdpzaeemepz_eemfpupwddgdpzu}ddddpyxA>WddmeA>pypz_eemdpzaeemepzaeemfpupwddgdpzu}dddepyxA>WddmfA>pypupwddgdpzu}dddfpyxA>WddmgA>pypupwddgdpzu}dddgpyxA>WddmhA>pypzaeemdpz_eemepzaeemfpupwddgdpzu}dddhpyxA>A>WddmiA>pypzu}dddhpyxA>A>A>WdeddA>pypddeepudeddnddddndddfpzudddgA>p}~ddfgndedepuddjgnddmgndddmndddhA>A>WdedeA>pypuddjknddmgndddmndddhA>A>A>A>WdeedA>p}pzudddfpuddjhnddmfndddenddeeA>A>WdefdA>pypudefdnddddndddfpddeepzudddhpuddjjnddm4nddedndddlA>A>WdegdA>p}p{v߶A>ضݵpxpyxA>A>WdemmA>p}p{~ˠvpxpyxA>pzudddh{ǷvǷvpxpwpwddggpwypu}mmmmpyxA>A>WdfddA>pypxddddpxdfddpup{A>0ض +¶}pxpyxA>A>WdfdeA>p}p{pA>}}xuUUpxpyxA>A>WdfedA>p}pz~eemendfeepz~eemfndfefA>p}pzudddhpxdddfpu}ddidpuddjfnddmindddknddkhA>WdfeeA>p}pzudddhpxdddfpu}ddidpuddjfnddminddkmnddkgA>WdfefA>p}pzudddhpxddddpu}ddidpuddjfnddmindeeknddjfA>A> \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Blcny2.tsc b/res/jp/data/sprites_og/Stage/Blcny2.tsc new file mode 100644 index 0000000..b45cf8e Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Blcny2.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Cave.tsc b/res/jp/data/sprites_og/Stage/Cave.tsc new file mode 100644 index 0000000..2d883fc --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Cave.tsc @@ -0,0 +1 @@ +GD]jjsjGDv{v}jjjrv{jjjjv~GD]jjskGDv{v}jjjrv{jjjkv~GD]jjslGDv{v}jjjrv{jjjlv~GD]jjsmGDv{v}jjjrv{jjjmv~GD]jjsnGDv{v}jjjrv{jjjnv~GDGD]jjssGDv}jjjrv{jjjnv~GDGDGD]jkjkGDvv}jkjktjjjjtjjjjvjjkkv{jjjmv{jjkmtjjsmtjjkjtjjjmGDGD]jkjlGDvvjmjltjkjnvjmjktjkjmvv~v~GD]jkjmGDvv{jjjlGDvejmjlvekpnkvekpnlGDv~jjjlv{jjkrtjojl:jjjltjjjjGD]jkjnGDvv{jjjlv{jjkktjjsntjjjrtjjjpGD]jkkjGDvv{jjjnv{jjsjtjjsltjjjqtjjjsGDGDGD]jkojGDvv~jjjjv}jjjrv{jjjnGDv{jjmjGDvjjklv}jjojtjjmotjjpqv{jjljGDvjjklv}jjojtjjmptjjpqv{jjljGDv~GDGD]jljjGDv~GD]jljkGDv~GDGD]jnjjGDvvjjllv~jnjjv}jjkpGDvvkjjpwý}wZ*"6$v{jkpjv~vvejjjmGDZmZ׼v~v~GDGD \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Cemet.tsc b/res/jp/data/sprites_og/Stage/Cemet.tsc new file mode 100644 index 0000000..3029522 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Cemet.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Cent.tsc b/res/jp/data/sprites_og/Stage/Cent.tsc new file mode 100644 index 0000000..eadef34 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Cent.tsc differ diff --git a/res/jp/data/sprites_og/Stage/CentW.tsc b/res/jp/data/sprites_og/Stage/CentW.tsc new file mode 100644 index 0000000..13b9ab1 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/CentW.tsc @@ -0,0 +1 @@ +B?B?XeeneB?qvqxeeeeq{v~eeeeqzyB?XeenfB?qvqxeeeeq{v~eeefqzyB?XeengB?qvqxeeeeq{v~eeegqzyB?XeenhB?qvqxeeeeq{v~eeehqzyB?XeeniB?qvqxeeeeq{v~eeeiqzyB?XeenjB?B?XeennB?qzqvqxeeeeB?qvefjeoeeefoeeeeq{v~eeeiB?qxehefoeffgoeeegqv~efeeB?qvefjeoeeeeoeeeeB?qyeeegqyehefqxqzyB?B?B?XefeeB?qzqeeffqvefeeoeeeeoeeegq{veeegqveejkoeengoeeefoefehB?B?B?XefjeB?qzq{ffieoefjgB?q|v¨޶}qeeeeqxB?q{`femgq{`ffieq`eeejokee5B?qv~eejeq|B?¸vȶ~qyqxB?qyeeegB?qvegjeoeefeoeeeeqv~eekeB?qxegkeoefjeoeeeeq}xB?qvegkeoeefeoeeeeqv~eejeB?q{veeehqv~efeeqxq{ffifoefjgq{`ffifqveejloeggeoeeffoeefiB?B?B?XefjgB?q~q|v¨޶}qeeeeqxq`eeejokeejB?qzqxeheeoefffoeeegq}xqv~eekeqvefjeoeeefoeeeeB?qv~efeeq{veeeiqveeefoeennoeeejoeeemB?B?XefjgB?qveejloeenioeeffoeefiB?B?XegjeB?qzq|zzzwqyqzyB?B?XegkeB?B?B?B?B?B?XeheeB?XehefB?B? \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Chako.tsc b/res/jp/data/sprites_og/Stage/Chako.tsc new file mode 100644 index 0000000..d98a4a9 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Chako.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|]`bfcls}```blvqy````lu~t=:S``ia=:l}~qlv|]`bfcls}```blvqy```alu~t=:S``ib=:l}~qlv|]`bfcls}```blvqy```blu~t=:S``ic=:l}~qlv|]`bfcls}```blvqy```clu~t=:S``id=:l}~qlv|]`bfclv|z`cdaj``iils}```blvqy```dlu~t=:=:S``ii=:ls}``bhlvqy```dlu~t=:=:S`a``=:lyl``aalt~`a``lvq```dlq```fj``idj`aaij``ag=:=:=:=:S`b``=:lyz```hj`b`b=:l{ul}w,Բڼٲֲrl~tlv|z`bdaj`b`alu~t=:S`b`a=:l}wھƲұl~tls|=:lv|z`bfaj````lqy``c`lv|[`bfalv|[`bfc=:lq~`c``j```cj```blqy``delq~`c``j````j```bl}t````=:l}w=:—v Ҳxl~tls|~ھͲҲ=:m~mP{Ǧrl~tlu~t=:S`b`b=:l{ulwya``hl}wm~mP Ҳ ٱxl~z````ls|=:lv|[`bacly]```h=:lq~`b``j``a`j````lqy``c`lvq```d=:lq```fj``iij`abdj``aa=:=:S`ba0=:lylyz``cgj``ailv|z`bfcj`baaluu``ai=:S`baa=:l{ul}w=: ٱxl~z````lvq```dls}````lqy``b`ls|uuuuurly[``cgl~tls|=:l}~`c``j``abj```fj````lq~`c``j``a`j````=:lqy``e`=:l|y[a```l``b`l}t```bl}w=:ڹ!̲rl~tls|l}lvqy```dlu~t=:=:=:S`c``=:lyz```hj`c`b=:lv|z`bfaj`c`a=:lv|z`bdaj`c`c=:l{ul}wҲұrl~tls|=:¾ó~xl~tlu~t=:S`c`a=:l{ul}w—v =:m~mP{Ǧrl~tls|m~mPq=:~ھͲҲrl~t=:۲ҳ~ Բrl~tlu~t=:S`c`b=:l{ul}wm~mP ,xyl~t=:yl~tls|=:m~mP=:ͲҲ߲l~t=:èrl~tlu~t=:S`c`c=:l{ul}wҲұrl~tls|˲Ͳrl~t=:ٲxl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Clock.tsc b/res/jp/data/sprites_og/Stage/Clock.tsc new file mode 100644 index 0000000..33719bf --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Clock.tsc @@ -0,0 +1 @@ +?FWXKFMW_:::BFPKS:::>FOXN-:;::FZ\SFPKY:::>F^\K:::D:;F^\K:::D:;ϐ[X 1>.ߠ+7ϐ[Xѭϩѥ.Ѵјϐ[Xq~~[X~~~[X >Ϗ[XpBp>>ϱ[Xq~~[X,/,/ϱޖ% /Ϯϐ[Xq~~[Xѥєј?Ϗ 4> ? ϐ[X >8ϐѥєј?ϱϐϮϱϐ 4 ϱϐ[Xq~~[X5Ϗ[XѰѵܓ8 ? ϐ* (.ؘ5>Ϗ[X58 ,ϐ[Xq~~[X"">7ϖ[Xѥєј ?5Ϗ[X7?/ϐ[XϏ ϐ?$5Ϗ[XѰѶ7>[X8ϐy~[X[X[X[Xq~~~[X~~~~~~~~~~~~[Xy~[Xϗϗ[X~~~~~~~~~~~~~~~~~~~~~[X~~ϩϗϗ[X~~~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~[X"6ٿϗϗ? (7;4ϗ[X (>ؽ*ϗϗ[Xљϩ/ϗ[Xљϩ؟ϗ? ܱ Ϗ[X~~~~~~~~~~~~~~~~[X~~~[X[XљϩIϗ[X? ;ϗϗ[X~~~[X~~~[X~~~~~~~~~[X~~~~~~~~[X~~~~~~~[X~~~~~~~[X~~~~~~~[X[X[X[Xq~~[Xq~[Xq~[Xq~[X[X[X[Xq~~~[X~~~[X{~{~[X~~~~~~~~[X~~~~~~~[X~~~~~~~[X~~~~~~~[X~~~~~~~[XN~~~~~~~~~~~~[X~~~~~~~~~~~~[X~~~~~[X ϗ~~~~~~[X~~~~~~~~~~~~[X~~~~~~[X~~~07;ϱ[X 4ϱ06? .Ϗ[X +Ѱѵ4Ϗ[Xљϩ>ܓ.ϖ~~[X ϱ[Xܱϱ[X~~~~~~~~~~~~~[X[Xq~~[Xy~~~ϗ~~~~[X~~~~~~~~~~~~~[X~~[X? .љϩIϖ 4ϐ[XљϩϐјϩϩёѦϐ[Xّ 5ܿ[X8 ϐ~~ 846ߝٚ;ϐ[X;27ٚϐ~~~. 5Ϗ[X +Ѱѵ4[Xљϩ>ܓ .ϱ[X~[X[Xq~[X~~[X5ϖ? ϩѦѬϩϏ[X"??7;4ϐ[XѤљ[X>4ϖ~~y~~~~~[X~~~~~~~~~~~~ϩѦѬϩn> ϐ[X~~~~~~Ѥљn>A4 ϐ~~[X~~~~~~~~~~~~~[X[Xq~~[X~~[XϏ ϖّ; 5Ϗ[X.ϐ~~~~[X~~~~~~~~~~~~~[X[X[X[X[Xq~~~[X[X~~~[X~~[X~~5ϖк|њϩѤϩ[X? ϐ* љϩ>ܓّϖ~~[X~~~[XϏ ϱܱϱ[X[Xq~~[Xy~~~ϗ[X? .љϩIϖ 4ϐ[XљϩϐјϩϩёѦϐ[Xّ 5ܿ[X8 ϐ~~ 846ߝٚ;ϐ[X;27ٚϐ~~~. 5Ϗ[X +Ѱѵ4[Xљϩ>ܓ .ϱ[X~[X[Xq~[X~~[X?ϖ? ϩѦѬϩϏ[X"??7;4ϐ[XѤљ[X>4ϖ~~y~~~~~[X~~~~~~~~~~~~ϩѦѬϩn> ϐ[X~~~~~~Ѥљn>A4 ϐ~~[X[Xq~~[X~~[XϏ ϖّ; 5Ϗ[X.ϐ[X[Xq~~[X~~+?޺"4ϐ[Xљϩ8 ϐ[X[X \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/CurlyS.tsc b/res/jp/data/sprites_og/Stage/CurlyS.tsc new file mode 100644 index 0000000..143259e --- /dev/null +++ b/res/jp/data/sprites_og/Stage/CurlyS.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lyl``aalt~`a``lvq```dlq``bij``idj```fj```i=:=:=:S`d``=:l{ul`a`el}wñyl~tlv|z`efdj`d`alu~t=:S`d`a=:lyz``adj0da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d``j`acfj````lv|[`eh`lwya`adly[``admҲmP ,rl~tls|=:lv|[c```lv|]c``alv|]c``blv|]c``clv|]c``d=:lv|[`bgdlu~t=:S`da`=:lyl}wsͲrl~tlu~t=:=:S`db`=:l{ult~`db`l}wlwya`cely[``ce=:mzómP ٲ߲rl~tlu~t=:=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Dark.tsc b/res/jp/data/sprites_og/Stage/Dark.tsc new file mode 100644 index 0000000..9b1fa2d --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Dark.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq``a`j``idj``gcj``bg=:=:S`d``=:lyl}wl`a`el`a0el`a`eñyl~tlyz``adj`da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d``j`acfj````lv|[`fa`lwya`adly[``admҲmP ,rl~tlv|[`bgdls|=:lv|]c```lv|]c``alv|[c``blv|]c``clv|]c``d=:lu~t=:S`da`=:lyl}wsͲrl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Drain.tsc b/res/jp/data/sprites_og/Stage/Drain.tsc new file mode 100644 index 0000000..07c9fbb --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Drain.tsc @@ -0,0 +1 @@ +]Zs]Z]Zs]Z]Zs]Z]Zs]Z]Zs]Z]Z]Zs]Z]Z]Zs]Z]Zs]Zښђ]Z]Zs]Z]Z]Zs]Z7:9 9ђ]Z:: ђ]Zs]Z]Z]Z]Zs]ZP]Z]Z]Z]Z,7ѳ]Z]Z]Z]Z:=ђ]Z.=ђ]Z]Z]Z]Z]Z{]Z]Zs]Z]Zs]ZӮ9ђ ђ]Z]Z]Z]Z]Z]Z]Z]Z]Z \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/EgEnd1.tsc b/res/jp/data/sprites_og/Stage/EgEnd1.tsc new file mode 100644 index 0000000..f196b79 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/EgEnd1.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswsssu}ss|w}su|z}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/EgEnd2.tsc b/res/jp/data/sprites_og/Stage/EgEnd2.tsc new file mode 100644 index 0000000..c6570d7 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/EgEnd2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswssw|}ss|w}su|y}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Egg1.tsc b/res/jp/data/sprites_og/Stage/Egg1.tsc new file mode 100644 index 0000000..3220c73 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Egg1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq```bj``idj`beij``aa=:=:S`b``=:l{ulv|z`dg`j`b`blyz`0`gj`b`all}w ̲=:ytz{Ǧrl~tlu~t=:S`b`a=:l{ulv|[`dg`l}wlwya``gmytzmP β!rl~tlwy````ls|=:l``dc ̲ rl~tlu~t=:S`b`b=:l{ul}wl ̲Ҳ rl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Egg6.tsc b/res/jp/data/sprites_og/Stage/Egg6.tsc new file mode 100644 index 0000000..bf4a0a1 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Egg6.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIF_lmllIFxx}lllp<}lllnvllupvlmsuvllmlIFIF_lnllIFxxlmplvlllmxglmplxllnnxlnllvllnmvllllIFx/ܾ,Ɔ~xxmllsxglllsxIFxllmlyy\,$8&~x}lmrlxxxIFIF \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/EggR.tsc b/res/jp/data/sprites_og/Stage/EggR.tsc new file mode 100644 index 0000000..d0c1755 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/EggR.tsc differ diff --git a/res/jp/data/sprites_og/Stage/EggR2.tsc b/res/jp/data/sprites_og/Stage/EggR2.tsc new file mode 100644 index 0000000..ed57122 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/EggR2.tsc @@ -0,0 +1 @@ +\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y޾69ИИ\Y\Yr\Y\Y\Y\Y\Y\Yr\YzO\YB?ٙ Б\Y\Yr\Y\Y\YݔڒЗz\Y\Yr\Y\Y\YҥҧҭЪҨ? Б\Y\Y|\Y\Y \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/EggX.tsc b/res/jp/data/sprites_og/Stage/EggX.tsc new file mode 100644 index 0000000..19961ce --- /dev/null +++ b/res/jp/data/sprites_og/Stage/EggX.tsc @@ -0,0 +1,4 @@ +;8Q^^g^;8j{|ojq{^^_bjtow^^^^js|r;8Q^^g_;8j{|ojq{^^_bjtow^^^_js|r;8Q^^g`;8j{|ojq{^^_bjtow^^^`js|r;8Q^^ga;8j{|ojq{^^_bjtow^^^ajs|r;8Q^^gb;8jtzx^_`^h^^gcjo|~^`^^h^^_^h^^^`jss^^gc;8Q^^gc;8j{|ojq{^^_bjtow^^^bjs|r;8;8Q^_^^;8j~wj}^^__jr|~^_^^jto}^^^bjo^^^`h^^gbh^`g_h^^^f;8;8Q^__^;8jysj{uŰؾٻ̰۰j|}rjs|r;8;8;8Q^`^^;8jtzx^_`^h^`_^;8jys;8jtzY^_`^jtzY^_^cjtzY^_cbjtzY^_ccjtzY^a`gjtzY^_^d;8j{upj|}rjqz};8j{p^^^`jow^^c^j{r^^^`;8j{u;8аj|}rjo|~^`^^h^^__h^^^`jqzjtoq^^^aְְw;8 +÷ݰаwwj|}r;8ĩqװwwj|}rjtoq^^^^jqz};8jow^^c^jo|~^`^^h^^^^h^^^`;8j{ujtoq^^^_ΰvjow^^c^j|}r;8o~Ѱjo|~^`^^h^^^^h^^^^j|}rjqzssspj|}r;8ΰؽðݰ۰vj|x^`^`jss^`^_;8Q^`^_;8jtoq^^^aݰа߰аwwj|}rjqzΰ𼲶;8װװwwj|}r;8ְ߰߰;8ǰЯwwj|}rjtoq^^^^jqz}jss^`^a;8Q^`^`;8jtoq^^^`ssspj|}rjqz +ΰааpj|}rjtoq^^^^jqz}jss^`^a;8Q^`^a;8jow^^c^j{ujo|~^`^^h^^^ch^^^`jtoq^^^_ίwj|}rj{r^^^ajqz;8߰װN|.^^Nwj|}rjqz߰ſذΰ;8߰װsٰwj|}rjqz}jtoq^^^^j{r^^^`;8jo|~^`^^h^^^ah^^^`jow^^a^;8jo|~^`^^h^^^ch^^^`jow^^c^;8j{ujtoq^^^_ſ!wj|}r;8Ұwj|}rjqz}jow^^c^j}^^bajow^^`^jtoq^^^^;8j{ujtoq^^^`oj|}rvj|}rjtoq^^^^jqz};8jow^^c^;8jo|~^`^^h^^^^h^^^^jow^^c^;8j{ujtoq^^^_߰ſװ԰o;8yŤ Яpj|}rjqz;8jtoq^^^`ίίpj|}rjqzֺ԰а;8װͯpj|}rjqzssspj|}rjqz;8jtoq^^^_)Яoٰΰްpj|}rjqz};8jo|~^`^^h^^^ah^^^^jow^_`d;8jo|~^`^^h^^^^h^^^`jow^^`^;8j{u|o߰j{r^^^^vj|}rjqzΰҰpj|}r;8ĆȰ;8߰Ţаpj|}rjqz;8װvj|}rjqzааpj|}r;8ΰްpj|}r;8߰װspj|}r;8װpj|}rjqz};8jo|~^`^^h^^^ch^^^`jow^^`^;8j}^^__jo|~^_^^h^^^^h^^^`jow^^`^;8jo|~^_^^h^^^^h^^^^jr|~^`^^j}^^`ajs|r;8;8Q^a^^;8jysj{uj ſN|\^^;8ɨ#ذٰа +j|}rjqz*۰j|}rjs|r;8Q^a^^;8j~wjto}^^^bjo^^^_h^^gbh^^^ch^^^e;8;8;8Q^b^^;8;8 \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/EggX2.tsc b/res/jp/data/sprites_og/Stage/EggX2.tsc new file mode 100644 index 0000000..270052b Binary files /dev/null and b/res/jp/data/sprites_og/Stage/EggX2.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Eggs.tsc b/res/jp/data/sprites_og/Stage/Eggs.tsc new file mode 100644 index 0000000..47d90f3 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Eggs.tsc @@ -0,0 +1 @@ + !$56)$+5=$.)1$-6, !$56)$+5=$.)1$-6, !$56)$+5=$.)1$-6, !$56)$+5=$.)1$-6, !$.42"!$56)$+5=$.)1$-6, !$56)$)68""$+5=$.)1$-6, !!$3-A$56)$+5=$)68""$.)1$+68""$?)1$)68""$5A,$,68$;5+$-6, $8:1$5;/k)iCkýŽӎı3 k?B>IýŽG2lFŎ<2Jh#E#j +UýŽЎʱѱʱ<k+ ,M +U*ɽŽıЎʱѱȽı<%F8ýŽӽıT_Ž {SN6E#I*B>+ "I +U?IŽӽıŎ6JXE^]8*ɽŽӽı#cc`E).ýŽӎýŽ<%?IŎF<%*ýŽӽı*62]i]6>ýŽıЎѱʱѱʱ/ʽʱŽӽѱıýŽ22NɽŽıЎʱѱȽı%!ʽŽıЎѱѱʱѱѱѱȽı)BGýŎH2J. ɽŽϱӽı ýŎ<#CJ +UqX4:IýŽӽıѱif%*#ýŽıЎѱʱѱʱȽıc`F&ʽŽӎı''ýŽӎֱıc`lʽŽЎϱʱֱѱѱʱűѱʱѱʱѱʱѱʱȽıfe*ʽŽӽıɽŽ%%%Ŏ!>]+ŽӽıʽŽʽŽϱ)+?I ʽŽıЎʱȽıýŽ#*JaýŎNýŎM6#2S?ýŽ2k*ha ýŎG2lF<M F +>*8jM*IɽŎŽӽıU@6EcjʽŽıЎѱʱѱʱѱѱʱѱϱ±ֱʱȽı & +<6I0kO2rIJd#M*ŽнʱĽʱ))ʽŎ NdM;?IʽŽϱѱ##G2lJ >LýŎ2#Chq Jcl%ʽŽI!JÎhJN)gOr4ýŎ:#;# +C %+BE.kýŽнѱʱֱѱͱαŎŎڽͬ±±ϱѱʱֱȎ 7 +<q6>ýʱŽЎѱʱαŎ˱˱ʽŽŎڽͬȽıŽ +5Na%K[?ýŎ GBE.kL&*ɽŽЎѱñʱŎڽͮѱάȽձֱ 龡qiJ}k>ýʱŽֽŎ \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Hell1.tsc b/res/jp/data/sprites_og/Stage/Hell1.tsc new file mode 100644 index 0000000..4295a7d Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Hell1.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Hell2.tsc b/res/jp/data/sprites_og/Stage/Hell2.tsc new file mode 100644 index 0000000..427fcb1 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Hell2.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Hell3.tsc b/res/jp/data/sprites_og/Stage/Hell3.tsc new file mode 100644 index 0000000..5e95ec7 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Hell3.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Hell4.tsc b/res/jp/data/sprites_og/Stage/Hell4.tsc new file mode 100644 index 0000000..3ea1d01 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Hell4.tsc @@ -0,0 +1 @@ +OLerr{rOL~~rtrr|rrrs~rrrr~OLerr{sOL~~rtrr|rrrs~rrrs~OLerr{tOL~~rtrr|rrrs~rrrt~OLerr{uOL~~rtrr|rrrs~rrru~OLerr{vOL~~rtrr|rrrs~rrrv~OLOLOLerr{wOL~~rrrt~rtrr|rrrs~Brrtr~rrru~OLOLOLersrrOL~~rrrs~rrsx~rrzt|rr{x|rrrz|rrsvOLOLerssrOL~~rrrr~rrsx~rrwx|rr{r|rssz|rrxtOLOLerstrOL~~rrss~rstr|rrrr|rrrtOL~rrrt~rrsx~rrzx|rr{t|rrrt|rrsrOLOLOLOLertrrOLOLOL \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Hell42.tsc b/res/jp/data/sprites_og/Stage/Hell42.tsc new file mode 100644 index 0000000..08257f0 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Hell42.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_::::FPYX:<::D:::;FaKS:::FWXKFMW_::::FPYX:<::D:::;FaKS:::FOXN-::C?FUOcFRWMFaKS:::D::::FMWZ:::CD::<>D::::FMWZ::;:D::<>D::::FMWZ::;;D::<>D::::FMWZ::;D::::FaKS:::@F]Y_::;<FMWZ:::BD::<@D::::FMWZ:::CD::<@D::::FMWZ::;:D::<@D::::FMWZ::;;D::<@D::::FMWZ::;D::::FMWZ:::CD::<>D::::FMWZ::;:D::<>D::::FMWZ::;;D::<>D::::FMWZ::;D::::FMWZ:::BD::<@D::::FMWZ:::CD::<@D::::FMWZ::;:D::<@D::::FMWZ::;;D::<@D::::FMWZ::;-:;;:FZ\SFW]QTҌLFXYNFOXN-:;<:FUOcF]Y_::;;FKXZ:;<:D::::D:::<FPKY:::-:<::-:=::FZ\SFPKY:::FUOcFPVT;:::D::C?FWXKFMW_:::BFPKS:::>FO`O:<::-::C?FWXKFMW_:::BFPKS:::>FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::F^\K::?=D::C>D::A?D:::?-:;;:FUOcF]Y_::;;FKXZ:;;:D::::D:::::D::;:D::::FW]QSSFXYNFMVYFKXZ:>::D::<:D::::FaKS::?:FOXN-:>::FUOcFPVT;::=D:>:>FPVT;;::=FPVT;:::<FPVT;::;D:>:;FPV5;::;FPV5;:=BFKXZ:>::D::;:D::::FW]QڌSSFWcL:::::D::::D::::FPKM:::;FUOcFPV5;::<FW]QFPKM:::<FUOcFW]QFPKM:::=FUOcFW]QFPV5;::=FPKM:::>-:>:>FUOcFW]QFPKM::FWXKFMW_:::FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::;Taaja>;m~rmt~aaaimwrzaaaamvu>;Taajb>;m~rmt~aaaimwrzaaabmvu>;Taajc>;m~rmt~aaaimwrzaaacmvu>;Taajd>;m~rmt~aaaimwrzaaadmvu>;Taaje>;m~rmt~aaaimwrzaaaemvu>;>;>;>;>;Tabaa>;m|vmaabbmrabaakaaaakaaacmwraaaemraadjkaajekaaddkaaaj>;>;>;Tacaa>;mzm~xsmumt}dzȳ۳ĸ"smu>;dzȳ۳񼬳!"smu>;ǝ|vs!ϳsmumvu>;Tacba>;mzm~x񼬳,ѳsmu>;,y>;ܳ۳ӳӳsmumt}!ڳr>;,ڳճڲmumvu>;Tacca>;mzmw}{bacakaccbm~xѳв|#ӳֲmumt}ĴIJmumt}ѳ"޳>;|}ӳ۳smumvu>;Taccb>;mzm~xmumt}>;ѳ"óӴsmumvu>;Tacda>;mzm~x>;ĸѳڲymumt}ĸ$÷Ƴڳ"ӳ"smu>;ճ$÷Ƴڳ"ӳڲmu>;س񼬳ѳ"smumvu>;Tacea>;mzmw}{ahcakaceb>;m~xѳĎærmu>;€ ߳ӳӳ"smu>; ߳ӳr>;Ď񼬳÷"mumvu>;Taceb>;m~xĎæ߳smumt}>;ճ꾤񼬳÷"ymumvu>;>;>;Tadaa>;Tadab>;m|vm~rmt~aaai>;mradbakaaabkaaaamwrzaaae>;mtadabkabbckaaaamrzabaa>;mradbakaaaakaaaa>;m~uaaaamuadabm~tmvu>;Tadba>;m|vmw}{ahcakadbb>;m|vm~xĎæsmumt}ĕ-ӳӲsmumvu>;Tadbb>;mtadaakabbbkaaacmy~tmrzaagamrad1akaaabkaaaa>;mrzabaamwraaaemraaefkadabkaaackaafd>;>;>;Taeaa>;m|vmw}{ahcbkaebam~xٳղsmumt}񼬳ĉsmu>;ŀ۳uǐ-smu>;ŵճ„ƒ׳"smu>; "mumt}mr~{aaackaeabmr~{aabdkaeaemvvaeac>;Taeab>;m|vm~x>;"ymumt}€ӳӳγsmumt}>;qtr׳ڲsmumt}ڳ޳׳ڲym{aeadmt}>;mr~^aaad>;mrzaacam~xmxzaaac!ğsmu>;mxzaaadqtr!ğsmumxzaaaamt}>;maaee"zzmumt}mw}\ahcbmxzaaabmt}>;mr~aaackaaabkaaaamt~aabannQۻݳzmrzabgamum~mvu>;Taeac>;m|vmw}\ahcbm~xѲsmumt}s!ղsmumt}mxzbacamt}>;mt~aabamz\aacamv\aaainnQ!smrzabgamum~mxzaaaamt}ӳӳsmu>;ճγӳ"ymumvu>;Taead>;m|vm~xmt}(smumvu>;Taeae>;m|vmw}\ahcbm~xѲsmumt}s!ղsmumt}mxzbadimt}>;mt~aabamz\aadint ߳nQ!smrzabgamv\abcimw}\ahccmum~mxzaaaamt} вr{'ĩij۲rmu>;޳!- >;€smumvu>;Taeba>;m|vm~x!ϳr>;wĴ{dzȳsmumt}smu>;۽ʳ>;ӳsmu>;񼬳ӳr>;񼬳ѳڳ!"smumt}׳۳޳>;!"NJ ۳вzmumvu>;>; \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/MazeB.tsc b/res/jp/data/sprites_og/Stage/MazeB.tsc new file mode 100644 index 0000000..64502c8 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/MazeB.tsc differ diff --git a/res/jp/data/sprites_og/Stage/MazeD.tsc b/res/jp/data/sprites_og/Stage/MazeD.tsc new file mode 100644 index 0000000..cfbd0e4 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/MazeD.tsc @@ -0,0 +1 @@ +þײ˲Əþײ˲Əþײ˲Əþײ˲Əþײ˲Ə۾̲ײҲѲƲò˾ +J$˾ƾƽ˾̲έέײҲu"r 1?ľƾԾֳײԏɾ֭trjK~l?˲ƾяֲ׾ײҲβƏҲײίƏ \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/MazeH.tsc b/res/jp/data/sprites_og/Stage/MazeH.tsc new file mode 100644 index 0000000..77a3f1e --- /dev/null +++ b/res/jp/data/sprites_og/Stage/MazeH.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ailvqy````lu~t=:S``ia=:l}~qls}``ailvqy```alu~t=:S``ib=:l}~qls}``ailvqy```blu~t=:S``ic=:l}~qls}``ailvqy```clu~t=:S``id=:l}~qls}``ailvqy`0`dlu~t=:=:S`a``=:lylvq```blq```ij``ibj``abj``fd=:=:S`a`a=:lylvq```alq``cij``iaj```dj``af=:=:S`b``=:lyl}wrl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/MazeI.tsc b/res/jp/data/sprites_og/Stage/MazeI.tsc new file mode 100644 index 0000000..11977c9 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/MazeI.tsc @@ -0,0 +1,8 @@ +fc|fcfc|fcfc|fcfc|fcfc|fcfcfc|fcfcfc|fc!ڼfc|fcfc|fc|fcfc|fcfcܜܣܳyIA"UCڢfc>%&yyڢfcfcfcfc|fcڢڢڞڞڞfc#"@C@ڛ + +& +Dڡfcfcfcfc|fc9I5ڡYfcfcfcfcfcfcfcfcfcfcfc|fc9&C5ڛfcfc|fcfcfc|fc9ܮڴ"K' CDڛfcF"ڼfc + +& +%%ܬ8 ڛfcCU!@fcJ@C!ڼfcfc|fcfc|fc +%9%ܱܜܻܹښfc<"B@J $ڛfc!"DC ڛfc9 ښfcLC5ڼfcfc|fc-!ڛfcfcyӾyyyyyyyyfcfc9fcܜܣܳfcfc \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/MazeM.tsc b/res/jp/data/sprites_og/Stage/MazeM.tsc new file mode 100644 index 0000000..db25650 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/MazeM.tsc differ diff --git a/res/jp/data/sprites_og/Stage/MazeO.tsc b/res/jp/data/sprites_og/Stage/MazeO.tsc new file mode 100644 index 0000000..dffedfc Binary files /dev/null and b/res/jp/data/sprites_og/Stage/MazeO.tsc differ diff --git a/res/jp/data/sprites_og/Stage/MazeS.tsc b/res/jp/data/sprites_og/Stage/MazeS.tsc new file mode 100644 index 0000000..8060f44 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/MazeS.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlv|z`gfaj``ielvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:S``ie=:lq~`c``j``b`j````lvqy```blu~t=:=:=:S`a``=:l{ulv|z`gfcj`a`a=:l``aalq~`a``j````j```blvq````l}t````lq``dcj``i`j``afj``ac=:S`a`a=:lyl}wzٲұyl~tlu~t=:=:S`aa`=:lv|z`gfdj`aaalu~t=:S`aaa=:l{ulvq```dl}t```blq``dej``ibj```bj```e=:=:=:=:S`b``=:lylv|z`b`aj`b`al}w$ҲںٲҲzٲұl~tlu~t=:S`b`a=:lv|z`gffj```alv|[`gfflv|]`gfelv|[`b`b=:l``bbls~`b``j``baj````=:l}w#в z߲rl~tls|lq}```ej``a`j````=:ls}``a`lwy``a`msmPPqyylqy`af`l~tl}lu~t=:=:S`c``=:l{u=:lv|z`gfdj`c`c=:lv|z`gfbj`c`b=:lv|z`gfaj`c`a=:lv|[`gfal}wlvqs``aiǸrl~t=:rl~tls| ߲q=:+߲rl~tls|=:߲l~tls|Բq=:ƲزqҲrl~t=:rl~tls|!q=:ٲ rl~t=: Ͳrl~tls|=:lq~`c``j``b`j````lu~t=:S`c`a=:l{ulq~`c``j````j````=:l}wlvqs``aiԲxl~t=:ٲŬݲxl~tls|!Ҳձrl~t=:бq Ͳrl~tlq~`c``j``b`j````lu~t=:S`c`b=:lyl}ws Ҳrl~tlu~t=:S`c`c=:lyl}wlvqs``aiϱyl~tls|=:ҲƲزqyyl~tlu~t=:=:=:S`ca`=:l{uls~`ca`j``abj```djlq~`ca`j``h`j```el}s=:ls}``ael}w=:Ȳylqy`ad`l~tls|lvqs````=:ls}```hlvq```dl}t```blq``ddj`f``j```ij``ad=:lu~t=:=:S`cb`=:l{u=:lv|z`gfbj`cbb=:lv|z`gfaj`cbaluu`e``=:S`cba=:l{u=:l}~`cb`j````j````j````=:l}t```bl}t```c=:l}wlvqs``ai!qҲݲrl~tls|lvqs````=:lq~`c``j``b`j````lqy``e`l}w!yl~tls|lvqs````=:ls~`ea`j`ccdj````=:ls~`eaaj`ccdj```blqy`a``=:l}wlvqs``b`uuurl~tls|lvqs````=:lq~`c``j````j````lqy``e`l}t```b=:l}wlvqs``be޲ٲҲrl~t=:!Ͳٲl~tlvqs````ls|=:lqy``e`=:l}wsyls}````l~tls|=:ls~`ca`j```ij```blqy`a``=:ls~`ca`j0`abj```b=:lq~`ca`j``c`j```bls}``aa=:l}t````=:l}wlvqs``ai=:ywyyl~tls|lvqs``ad=:yl~tls|۲yl~tls|ٲq𻫲ٲ=:Բyl~tls|زݲ=:ҲҲyl~tls|~Ɯ߲=:ֲҲrl~tls|Բyl~t=:ƜھвԱyl~tls|·Ã~=:!yyl~tls|lvqs``aièٲyl~t=:qó!¶Ͳұrl~tlvqs````ls|ls}````=:lqy`a``=:lq~`ca`j``f`j```blqy``dh=:lq~`ca`j``e`j```blqy``b`=:lq~`c``j``b`j````lqy``b`=:l}t```bl}t```cl}wlvqs``ai=:鱋yl~tlq~`ca`j``h`j````l}r```blq~`c``j``c`j````l``gbls|lvqs``bcҲ!ٱyyl~t=:lq~`ca`j````j````ls}```dls~`ca`j`afij````lr|`ca`=:lv|[`gfblv|[`gfc=:lu~t=:S`cbb=:lylu~t=:=:S`cc`=:=:=:=:S`e``=:l{u=:lv|z`gfbj`e`b=:lv|z`gfaj`e`a=:l}w۲ݲrl~t=:ԲٲDzܲݲrl~t=:ٲ޲ٲԲұrl~tlu~t=:S`e`a=:l{ulqy``a`=:lq~`c``j````j````=:l}wlvqs``b`+=:Ͳݲ!Ҳٲϱrl~tls|=:lq~`c``j``b`j````lu~t=:S`e`b=:lyl}w۲ݲrl~tlu~t=:=:S`ea`=:S`eaa=:=:=:S`f``=:l{ulv|]`gfclv|[`gfdlv|]`gf`=:l}sls}```hls~`cc`j``abj```blq~`c``j````j```b=:l}~`cb`j````j````j````=:lvqy```d=:l}wlvqs```e~Ź߲l~tls| ٲrl~t=:ٲl~tlq~`cc`j````j````ls|Ðq=:ٲrl~tls|=:lvqs``ai ٲҲrl~tlvqs````ls|=:lq~`cc`j``f`j````lqy``d`=:lq~`cc`j``e`j```blqy``b`=:l}t```clq~`c``j``b`j````=:l}wlvqs``ai!qҲݲrl~tls|lvqs````=:lq~`e``j``a`j````lqy`a``=:lq~`cc`j``h`j```b=:lq~`c``j````j```b=:lq~`e``j``b`j````l}t```bl}w=:lvqs``bcpyyylqy``e`ls|lvqs````=:lq~`cc`j````j```b=:lqy`a``l}wlvqs```eҲҲٱrlq~`c``j````j````l~t=:~ Ð=:ٲrl~tls|=:lvqs``aiԲ!yl~tls|lvqs````lq~`cc`j``a`j````=:lqy`af`ls~`b``j``aej```blqy``d`=:l}w=:lvqs``aiƫƲssٲrl~tls|=:lv|[`ghalv|[`gfels~``afj``afj```blu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/MazeW.tsc b/res/jp/data/sprites_og/Stage/MazeW.tsc new file mode 100644 index 0000000..ea91da9 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/MazeW.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``cglvqy````lu~t=:S``ia=:l}~qls}``cglvqy```alu~t=:S``ib=:l}~qls}``cglvqy```blu~t=:S``ic=:l}~qls}``cglvqy```clu~t=:S``id=:l}~qls}``cglvqy```dlu~t=:=:S`a``=:lylvq```blq``chj``ibj```ej```c=:=:S`a`a=:=:S`a`b=:lyl``aalt~`a`blvq```dlq``d`j``ibj```dj```e=:=:S`a`c=:lv|z`fhaj`a`e=:lyz``agj`a`d=:lyl}w޲ڲٲٲҲrl~tlu~t=:S`a`d=:lyl``bblwya`aglv|[`fha=:l}wm󿺲z}mP rl~tls|luu`a`e=:S`a`e=:lyl``aalt~`a`clvq````lq``daj``i`j``aej```i=:=:S`a`f=:l{ul``aalq~`a`fj````j```blvq```dlq``dbj``idj```ej0``i=:=:S`aa`=:lv|z`gd`j`aaa=:l{ul``aalq~`aa`j````j```blvq```blq``dcj`e``j```dj``ac=:S`aaa=:l{ul``aalq~`aa`j````j```blvq```blq``dcj``ibj```dj``ac=:=:S`ab`=:l{ulvq```dlq``d`j``idj``abj```b=:=:=:=:S`c``=:S`c`a=:lt~`c`alrq```alv|]`fh`lu~t=:S`c`b=:lt~`c`bls}```glrq``a`ls~`c``j``acj````lr|````lu~t=:=:Sa```=:l{ulvr````j``aflqy`be`ls}````=:l}cls}``ae=:ó ìrlv}``aflqy`af`l~tls|ls}``cg=:ls~`c``j````j````lv|[`fh`lu~t=:=:=:Sab``=:l{ulq~ab``j``b`j```b=:lv~ab``j``aflvqy```a=:lqy`a``lvq```alq``dgjab``j``chj``af=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/MiBox.tsc b/res/jp/data/sprites_og/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Mimi.tsc b/res/jp/data/sprites_og/Stage/Mimi.tsc new file mode 100644 index 0000000..032a48b Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Mimi.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Momo.tsc b/res/jp/data/sprites_og/Stage/Momo.tsc new file mode 100644 index 0000000..538f21e --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Momo.tsc @@ -0,0 +1,15 @@ +½ֱʱŎ½ֱʱŎ½ֱʱŎ½ֱʱŎ½ֱʱŎڽֱѱб±ڎֱѱʱĎѱױʱֱѱűĽʱѱŎڎֱѱʱĎѱױʱֱѱűĽʱѱŎڎ˲˱˲˱˱˲˲˲ѱʱѱʱȽͬͬı!I>++ ?BE> #fLýŽӎH*B>ŽNcýŎMkgýŎMFq%*+BE>r?0HLýŎ +UMn+ *C*B>G>rNI6ýŎ*hL,G4k>MýŽqfJF,I#NLýŽӎ]!<kN#G#EýŽ"qmBEjMýŎ!I>qM +%AJj>`MgýŎ]?+,iI.ELýŽЎ˱˱Ʊ˱˱ȽıGi!'9+IMýŎ?k*BEI#*6hŽŎȽýŽ!½<kYijnLýŽӎıղqghk>ýŽձӽıM /-JN]?+,iI#MýŽЎծҮͮͬƱȽýŽ!½<kYijnLýŽӎıղqghk>ýŽձӽıM /-JN]?+,iI#MýŽЎծҮͮͬƱڽȽı"6#ɽ˱<%ɽŎIh##F8ŽŎڽͬ##ULýŎ48+ #fýŽGi!'9 q*UBEýŽıղլҬͬȎֱMϾqiJ}k>ýʱŽֽнձȽı%nýŎ.6f,#0HŽ +MN UGjq W4kEjMgýŎ<M Ih6 iJIkjýŽ##ɽŽƱڽȽı N J"BEq6E@f%?#ýŽ +1I?*h +.JBEI#gýŽŎȽͬͬıM /-JN+I :+IMýŎkFBEj], ½Ŏ!kq keiJ}kkOIrG*IjG%ýŽIrG*6E], qiJ}kE,E9VýŽŎڽȽı /-JN+I :+IMýŎ2MTF :G ?B>h +M], LýŽIrG*6E], qiJ}kE9VýŽŎڽȽı)*'iI4#ýŽӽıղ +tk], q *:>ýŽӽırŽ2M], Ž + tLýŽձ2k7b'I#nýŽŎڽͬͬȽı)*'iI4#ýŽӽıղծ], q *:>ýŽӽı'GŽ N+ýŎ2kIh#0jG%nýŽձֱѱнʱ N J"BEq6E@f%?#ýŽ J"NŽ*MI SýŽ?0H +1IFLýŎBgJ*h'1?6>r?0HŽ +.JBEI#ýŽŎȽͬı)*'iýŽ J"N *C*B>ɽŽӎıղծ +q6>ýŽӽı U b#I#nýŎ J"M*m +ýŽձ%rŽ+#I#G +qN+fPIMgL&ýŽ] IrG*8jnýŽƱڽȽı3 kýŽ /-JN U+**j*h +MF rFEýŽŎڽ ^]8*ɽ˱бֱʱýŽЎʱ˲ʬֱűMN+ +r6>ýŽнֱʱŎͮͬͬͬͬͬͬͮͬͮͬýŽнѱѱʬֱűg. r?ýŽнֱʱŎڽ?l%*ŽŎ \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Oside.tsc b/res/jp/data/sprites_og/Stage/Oside.tsc new file mode 100644 index 0000000..24224ef --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Oside.tsc @@ -0,0 +1,5 @@ +NKdqqzqNK}}qqsv}qqqq}NKdqqzrNK}}qqsv}qqqr}NKdqqzsNK}}qqsv}qqqs}NKdqqztNK}}qqsv}qqqt}NKdqqzuNK}}qqsv}qqqu}NKNKdqrqqNK}}qqqq}qqvs{qqzq{qqrx{qqrqNKNKdqrsqNK}}qqrr}qrsq{qqqq{qqqs}qqqu}qqvv{qqzu{qqqz{qqqzNK}¤}}NKNKdqrtqNK}}qqts{qrtr}qqrr}qrtq{qqqq{qqqs}qqqq}qqwz{qqzq{qqrv{qqqyNKdqrtrNK}}qqqq}qqrr}qrtq{qqqq{qqqsNK}rqts}nqqts}lrtxq}NK¶œƒ}}NK}qqqq}qqwz{qqzq{qqrv{qqqyNKNKdqruqNK}}qqqq}qqqq}qqzu{qqzq{qqru{qqqxNKNKdqsqqNK}}‰}}NKNKdquqqNK}}qzwq{quqr}}qqrqēĂ1ӕ (NK̾<ƒ}}NKdquqrNK}}}qurq{qqrw}qqvqNK}}qqrq +'*}qqqq2ƒ}}NK}qusq{qrvq{qqqq}NK}quqq{qqqt{qqqq}qqtsNK}quqq{qqqq{qqqs}qqtsNK}Aqusq{qqvq{qqqq}qqtsNK}qusq{qqqq{qqqs}qqtsNK}quqq}qusqNK}qurq{qqrq{qqqs}qsqqNK}}qqrq),'ƒ}}}qqqqNK}qurq{qqsq{qqqs}qsvqNK}qurq{qqrq{qqqs}qsqqNK} NK +1ӆа*ƒ}qsqq}#ĩďğœ 1ԠNKӯ$ Ζ1ˋϯ*,ƒ}qsqq}ӯ$ ™ĩďğœ Ζ1NKщϿ (+*,ƒ}qsqq}NK}qqqs2 !'¤}qsqq} $ ċĚľÒѭ‚NKĩďğœ ) ̺ ϓ‚NKѕ*( ƒ}qsqq}}qqswNK}¡.)¡}zzzzNK}NKNKNKdqurqNK}}Đ}}NKdqusqNKNKNKdqwqqNK}}ħİģĐ+ًحƒ}NK- ƒ}NK ' +-*ęĦœĘ1NKЊęĦœĘ +'Ϸƒ}NK2NK*#(¤}}NKNK \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Ostep.tsc b/res/jp/data/sprites_og/Stage/Ostep.tsc new file mode 100644 index 0000000..66aaf78 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Ostep.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFPKS::::FOXN-::C;FWXKFPKS:::;FOXN-::C<FWXKFPKS:::FWXKFPKS:::>FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::<FPKY::::F^\K::B?D::C@D::;CD::D::;; +-:<::-:<:;-:C::FNXZ:C::FUOcFWcN:::[5堝_"(!y&Q%"(!yQHoHP" p-$5(;נ &A%_&$*$(%2 HoJ&$*$(%͠ \#m$D"'%堝Y\<@"(B\ @yנNDXITYHWWàƠנ3_%_!oQ<[堝נà;<9{נ$eTW5Py 4& `Pנ!)H5QBZ !=_!{#y\+}W5<}P堝9̠#f'YTWsz7<z[⠝ڠ`[L&9=FˠננǠàĠ \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Pixel.tsc b/res/jp/data/sprites_og/Stage/Pixel.tsc new file mode 100644 index 0000000..b63e968 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Pixel.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Plant.tsc b/res/jp/data/sprites_og/Stage/Plant.tsc new file mode 100644 index 0000000..26edcf3 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Plant.tsc @@ -0,0 +1,2 @@ +ƣڣǣڣȣڣɣڣʣڣˣڣ̣ڣͣڣΣڣϣڣƣǣˣ KrM? KrKSڣ̣!+x!!KrKSڣƣ GGcj}Z*ڣGb*$}b@b$$,jc,SUb'{&n^&-\^T裠TE]&j8jc8E^8vK&j8j&mS^}ףss""@iW\:KZףMD_$[Kr:}K8I88Gb*_c&j8jc#}?^8Tڣƣ&rA!Tڣǣ(,`_KW?~\"[(~IZ8ڣƣߣƣƣS?"WZ8ˣ,h%b{Ӷ$~_)S壠ڣƣ̣ + !Ӷ$~_)Sɣ#['{'b-c@ɶ'3<Sڣ \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Pole.tsc b/res/jp/data/sprites_og/Stage/Pole.tsc new file mode 100644 index 0000000..f9bb55a Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Pole.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Pool.tsc b/res/jp/data/sprites_og/Stage/Pool.tsc new file mode 100644 index 0000000..86598d4 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Pool.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Prefa1.tsc b/res/jp/data/sprites_og/Stage/Prefa1.tsc new file mode 100644 index 0000000..ba4a1f9 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Prefa1.tsc @@ -0,0 +1,2 @@ +þײ˲Əþײ˲Əþײ˲Əþײ˲Əþײ˲Ə۾ҲײѲò۾ҲҲƏ۾N,"kľƏI_^9+ʾ̲Ծ Nbrw9kKO ur +\09k?aN,z@H(ilkľƾhCFON /rakľƾ3N utVOHNs rbCF /rak3HKJkľƾjGOG DGÏ"kxN, D@ľƾ,sG7^oJ1lP:O 0.7ÏhjXJHJk@m&ľƾя̲˲մ5(JJ1lP˲ƾƏ \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Prefa2.tsc b/res/jp/data/sprites_og/Stage/Prefa2.tsc new file mode 100644 index 0000000..12bedd3 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Prefa2.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lyl}wβl~tlu~t=:lq~`a``j````j```bl``aalvq```dlq``fbj``idj``gij``gc=:=:S`aa`=:lylvq`0`c=:lv|[aecalv|[aecdlv|[aee`=:lq``h`j``icj``agj```a=:=:=:=:=:=:S`b``=:lyl}w*=:ݲ߾κ rl~tls|* ٱxl~z````ls|=:lv|[aci`lv|[acialv|[acibls}````lvq```alqy`a``=:lq``g`j`ca`j`aahj``fb=:=:S`be`=:lyl}w=:ھҲl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Priso1.tsc b/res/jp/data/sprites_og/Stage/Priso1.tsc new file mode 100644 index 0000000..eeda7f0 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Priso1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``bilvqy````lu~t=:S``ia=:l}~qls}``bilvqy```alu~t=:S``ib=:l}~qls}``bilvqy```blu~t=:S``ic=:l}~qls}``bilvqy```clu~t=:S``id=:l}~qls}``bilvqy```dlu~t=:=:S`a``=:l{ul``aalt~`a``lvq````lq0`efj``i`j``h`j```i=:S`aa`=:l{ul``aalt~`aa`lvq```alq``fbj``iaj```gj``gd=:=:S`b``=:lq~`b``j```bj```blu~t=:S`b`a=:lq~`b`aj```bj```blu~t=:S`b`b=:lq~`b`bj```bj```blu~t=:S`b`c=:lq~`b`cj```bj```blu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Priso2.tsc b/res/jp/data/sprites_og/Stage/Priso2.tsc new file mode 100644 index 0000000..5ce497e Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Priso2.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Ring1.tsc b/res/jp/data/sprites_og/Stage/Ring1.tsc new file mode 100644 index 0000000..17c366a Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Ring1.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Ring2.tsc b/res/jp/data/sprites_og/Stage/Ring2.tsc new file mode 100644 index 0000000..9c51f51 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Ring2.tsc @@ -0,0 +1,3 @@ +S``i`=:l{ul}~qls}``c`lvqy````lu~t=:S``ia=:l{ul}r```blqy```bly=:l}~qls}``c`lvqy```alu~t=:S``ib=:l{ul}~qls}``c`lvqy```blu~t=:S``ic=:l{ulv|zacdaj``iilv|zabg`j``ih=:l}~qls}``c`lvqy```clu~t=:S``id=:l{ul}~qls}``c`lvqy```dlu~t=:=:S``ih=:l{u=:ls}```cj``acj``ba=:ls}```cj```ij``ba=:ls}```cj```fj``ba=:ls}```cj```cj``ba=:ls}```cj````j````=:l}~qls}``c`lvqy```clu~t=:=:S``ii=:l{u=:ls}```cj```ij``ba=:ls}```cj```fj``ba=:ls}```cj```cj``ba=:ls}``ahlvqy```clu~t=:=:=:=:S`a``=:lylvq```clq``fdj``icj```cj```a=:S`aa`=:lylvq```al}t```blq``fhj``iaj```cj``ad=:=:S`b``=:l{u=:lv|zabgbj`b`d=:lv|zabg`j`b`b=:lv|zabgaj`b`al}w=:бqҲٲrl~tlv|za`b`j`b`els| Ų߲Ǹݲxl~tlu~t=:S`b`a=:lyl}w=:ڲ!yl~tlu~t=:S`b`b=:l{ul}wrl~tls|sûsڲrl~tls|=:xl~tls|бrrl~t=:вq{߲=:ƫƲ!xl~t=: q +Ҳ߲rl~t=:ҲҲrl~tls|=:lv|[abgblu~t=:S`b`c=:S`b`d=:l{ul}wвݲҲrl~t=: ljq ұrl~tlv|zabgdj````lv|[abgdls|=:uñl~tls|=:lq~`be`j``a`j```e=:lq~`beaj``a`j```e=:lq~`bebj``a`j```e=:lq~`becj``a`j```e=:lq~`bedj``a`j```e=:lq~`beej``a`j```e=:lu~t=:S`b`e=:l{ul}w!zu=: +Ҳrl~tlu~t=:=:S`ba`=:lylv|zabg`j`bab=:lv|zabgaj`baa=:l}w~ŬҲrl~t=:ٲȃ޲,rl~t=:Ҳ!ٲϱrl~tlu~t=:S`baa=:lyl}w=:ǍDŽrl~tlu~t=:S`bab=:lyl}wٲٲ!yl~tlu~t=:=:S`bb`=:lylv|zabg`j`bbb=:lv|zabgaj`bba=:l}wбql~t~Ҳٲuuurl~tlu~t=:S`bba=:lyl}w=:Ҽyl~tlu~t=:S`bbb=:l{ul}wƜֲxl~t=:~z} ݲl~tlv|za`b`j`bbcls| вҲҲl~tls|=:~۲ê!l~tlu~t=:S`bbc=:l{ul}w=:!{yyl~tlu~t=:=:S`be`=:S0bea=:S`beb=:S`bec=:S`bed=:S`bee=:=:S`d``=:S`d`a=:=:S`da`=:l{ulv~`da`j``aflq~`da`j`e``j```dlqy``e`=:ls}````l}cܲвϱyl}r`da`l~tls|ﱓlqy``b`ﱓlqy``b`ls|=:ƌƲyyyl~tls|=:lqy``e`ls~`db`j`bfgj```dlqy`a``=:lv}``af=:lq~`db`j```gj```dlr|`db`lt~`da`lv|]abg`ls}``calu~t=:=:S`db`=:l{ulv~`db`j``aflv|[abg`=:lq~`db`j`e``j```dlqy`a``=:l}c{pyyl}r`db`l~tls|=:lq~`db`j`ea`j```dlqy`de`ls}``ae=:lv}``aflq~`db`j`eb`j````l}c=:~ ìylqy`ad`l~tls}````ls|=:lv~`de`j``aflqy``e`=:ls}```cj```ij``bal``ablqy``b`=:ls}```cj```fj``bal``ablqy``b`=:ls}```cj```cj``bal``ablqy``b`=:ls}```cj````j````l``ablqy``b`=:lqy``e`=:lv}``afls}``c`lt~`db`lu~t=:S`de`=:=:=:S`e``=:l{ult~`e``l{z```aj`e`al{[```aluu`e`b=:S`e`a=:l{ulqluu`e`b=:S`e`b=:ls}``agl}t```b=:ls}```cj``acj``ba=:l}clvqs``balq~`d``j``a`j````l~tls|=:Ҳܲrl~tls|lvqs````=:lqy``b`lq~`d``j``b`j````lqy``c`=:l}clvqs``baҹ úǎ=:{ƌl~t=:&€rl~tls|ҹq=:& Č (ۿ=:ؾ߲l~tls|۲ Ě#ؾ=: Ҳrl~tls| ̲Ҳ=:󿛲ܼ'rl~t=:ڲl~tls|lvqs````=:lqy``b`lt~`d`alq~`d``j``d`j````lqy``b`=:l}clvqs``baҼrlqy``c`l~tls|=:Ҽql~t=:|(rl~tls|lq~`d``j``e`j````~~~l~tls|ұyl~tls|=:~ڲٲٱxyl~t=: ҲԱxyl~tls|l~tls|=:Աyyl~tls|=:ls~`da`j`bfcj````lqy```e=:lq~`da`j```bj````lqy``e`=:ls}```cj``acj``balt~`d``=:lv|]abg`lv|[abgalqy``e`lr|`da`ls}```glu~t=:=:S`e`a=:l{ult~`e``ls}``agl}t```b=:ls}```cj``acj``ba=:lt~`d`alq~`d``j``d`j````=:ls~`da`j`bfcj````lqy```e=:lq~`da`j```bj````lqy``e`=:ls}```cj``acj``balt~`d``=:lv|]abg`lv|[abgalqy``e`lr|`da`ls}```glu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Ring3.tsc b/res/jp/data/sprites_og/Stage/Ring3.tsc new file mode 100644 index 0000000..25f4936 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Ring3.tsc differ diff --git a/res/jp/data/sprites_og/Stage/River.tsc b/res/jp/data/sprites_og/Stage/River.tsc new file mode 100644 index 0000000..181ec47 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/River.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_::=BF]]]:>::FPKS::::FOXN-::C;FWXKFMW_::=BF]]]:>::FPKS:::;FOXN-::C<FWXKFMW_::=BF]]]:>::FPKS:::::FPKS:::=FOXN-::C>FWXKFMW_::=BF]]]:>::FPKS:::>FOXN-::C?FMW_::=BFPKS::::FOXN-:;::FUOcFPKY:::;FM]]F^\K::>AD::C;D:::BD:::C-:;;:FUOcFPYX:<::D::;@FaKS::;:FPKY::::FPYW::;@FPVT:B?:D:;;; +FPV5:B?:FW]QnjSSFXYNFWcN::::F^\K::=;D::CD:::;-:;;@-:;<:FUOcFKXZ:;<:D::::D:::FM]]F^\K::A=D::C>D:::@D:::C-:<::-:<<:FUOcFNXZ:<<:FPVT;>>>D::::FPVT:B=@D:<<;FOXN-:<<;FZ\SFaKS::::FUOcFPV5:B?;FaK]FaKS::?:FZ\SFW]QTee֚ǞǓˌNjmFXYNFOXN \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Sand.tsc b/res/jp/data/sprites_og/Stage/Sand.tsc new file mode 100644 index 0000000..65a163f --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Sand.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```flvqy````lu~t=:S``ia=:l}~qls}```flvqy```alu~t=:S``ib=:l}~qls}```flvqy```blu~t=:S``ic=:l}~qls}```flvqy```clu~t=:S``id=:l}~qls}```flvqy```dlu~t=:=:S``ii=:l{ul}~qls}```f=:lq~`a``j```aj````lvqy```d=:ls~`c`aj`aabj```blqy`a``=:lq~`a``j````j````=:l}t````lt~`c`al}slu~t=:=:S`a``=:l{ul}wq۲ ٱxl~z````ls|=:ls~`c``j`aaaj```blx}slqy``f`lq~`a``j```aj````=:lqy`a``lvq```dlq```aj``iij```ej```h=:=:l{uls~`c``j`aaaj```blx}slqy``f`lq~`a``j```aj````=:lqy`a``lvq```dlq``ahj``iij``aej``a`=:lqy`a``lvq```dlq```aj``iij```ej```h=:=:S`a`a=:lyl``aalt~`a`alvq````lq``bij``i`j``ahj```i=:=:lv|z`ef`j`a`b=:S`a`b=:lyl``aalt~`a`alvq````lq``caj``i`j``ahj```i=:=:S`a`c=:lyl``aalt~`a`clvq```dlv|z`bh`j`a`elq``ccj``idj``abj``a`=:=:S`a`d=:lylvq```dlq``cdj``idj```ej``ab=:=:S`a`e=:lylq``cfj``idj``abj``a`=:=:S`a`f=:lylvq```dlq```ij``idj```cj``ei=:=:=:S`ae`=:lyl}wl=:vózl~tlu~t=:=:S`aea=:lyl}wl=:Pl~tlu~t=:=:=:=:S`b``=:l{ul{z```gj`b`al{[```gluu`b`b=:S`b`a=:lqluu`b`b=:S`b`b=:l{ul}t```blt~`b``lv}lv~`b`aj``aflqy`a``=:l}c=:ݲڲls}````l~tls|=:ls~`b`fj``fgj````lqy``a`lqy``i`=:lq~`b`fj``acj````=:l}clvqs``ae=:!l~tls|sԲҲٱrl~t=:ٲ!Ǹ=:ٲҲrl~tls|=:lvqs``af Բٱxl~tls|lvqs````=:lq``e`lqy``b`=:l}c=:xylqy``e`l~tls|lvqs``aeھ ݲ =:ٲrl~tls|lq~`b`fj``b`j````=:lrq``b`ls}```glr|````=:l}`ba`j``a`l}`ba`j``aalu~t=:S`b`a=:S`b`b=:S`b`c=:S`b`d=:S`b`e=:S`b`f=:=:=:=:S`ba`=:l{ulqy`be`ls}````=:l}cls}``ae=:y{ ìylqy`af`l~tls|Ǫ$Ҳڹ ߲rl~tls|=:lv}``afls}```f=:l}`ba`j``a`l}`ba`j``aalu~t=:lu~t=:=:S`bb`=:lv|z`bgbj`bbalu~t=:S`bba=:l{ult~`bb`l}t````lqy``e`=:lq~`b`bj``a`j````lqy``dd=:lq~`b`cj``a`j```blqy0abh=:lt~`b`blt~`b`clv|[`bgclu~t=:=:S`bc`=:lv|z`fb`j`bcc=:lv|z`bghj`bcb=:lyl}wz}ڲٲٲҲl~tlu~t=:=:S`bca=:lqy``e`=:lq~`b`dj``a`j````lqy```h=:lq~`b`ej``a`j```blqy`abh=:lt~`b`dlt~`b`eluu`bcb=:S`bcb=:lylvq```dlq``cej`e``j```ej```i=:S`bcc=:lylvq```dlq``cej``idj```ej```i=:=:S`c``=:S`c`a=:S`ca`=:=:S`cb`=:l{ult~`cb`ls}````l}t````lqy``e`=:lq~`ca`j```aj```bl}wlvqs``be=:yyl~tls|=:lq~`ca`j```cj````lqy`ae`=:lt~`ca`l}lu~t=:=:S`cd`=:lv|z`eicj`cdalu~t=:S`cda=:lv|z`bgdj`cdblu~t=:S`cdb=:lv|[`bh`lt~`cd`lu~t=:=:=:=:S`ce`=:lyl}w$ҲڲٲٲҲl~tlu~t=:=:S`cf`=:lyl}wlRRq=:߲ڲҲݲвq=:~Ť߲Ҳrl~tlu~t=:=:S`d`a=:lyl}wʲʲʲʱl~tlyz``adj`da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d`aj`acfj````lv|[`bgelwya`adly[``admҲmP ,rl~tlv|[`bgdls|=:lv|]c```lv|]c``alv|]c``blv|]c``clv|[c``d=:lu~t=:S`d`b=:lyl}wl`a`eñyl~tlyz``adj`da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d`bj`acfj````lv|[`bgflwya`adly[``admҲmP ,rl~tlv|[`bgdls|=:lv|]c```lv|]c``alv|]c``blv|[c``clv|]c``d=:lu~t=:S`da`=:lyl}wsͲrl~tlu~t=:S`daa=:lt~`daalu~t=:S`dab=:lyl``bbls~`dabj``baj````=:l}w#в z߲rl~tlwya`adls~`dabj`ac`j````ls|=:Ҳl~tlyz``adj`dacls|=:ls~`dabj`acfj````lv|[`bgilwya`adly[``adls}``a`mҲmP ,rlqy`af`l~tl}ls|=:lv|]c```lv|[c``alv|]c``blv|]c``clv|]c``d=:lv|[`bgdlu~t=:S`dac=:lyl}wsͲrl~tls~`dabj``aej````lu~t=:=:=:=:S`e``=:lylt~`e``l``bbls}``af=:l}wlwya``fmszmP ,ylqy`af`l~tl}l}|[```e=:PePͲֲyl~tlu~t=:=:S`e`a=:lylt~`e`al``bbls}``af=:l}wlwya``fmszmP ,ylqy`af`l~tl}l}|[```e=:PePͲֲyl~tlu~t=:=:=:Sab``=:l{ulq~ab``j``b`j```a=:lv~ab``j``aflvqy```a=:lqy`a``lvq```alq``cijab``j``faj``ab=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/SandE.tsc b/res/jp/data/sprites_og/Stage/SandE.tsc new file mode 100644 index 0000000..9d32635 Binary files /dev/null and b/res/jp/data/sprites_og/Stage/SandE.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Santa.tsc b/res/jp/data/sprites_og/Stage/Santa.tsc new file mode 100644 index 0000000..9c18c0e --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Santa.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```blvqy````lu~t=:S``ia=:l}~qls}```blvqy```alu~t=:S``ib=:l}~qls}```blvqy```blu~t=:S``ic=:l}~qls}```blvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```blvqy```dlu~t=:=:S``ii=:ls}``bhlvqy```dlu~t=:=:S`a``=:lyl``aalt~`a``lvq```dlq```fj``idj```dj``ab=:=:=:=:S`ab`=:l{ul}wlٲr=:w־qǦ½yl~tlu~t=:=:=:S`c``=:lyz```hj`c`a=:l{ul}wl~tlv|z`bdbj````=:‰ĂֲҲrl~tlu~t=:S`c`a=:l{ulwya``hl}wm~mP Ҳ ٱxl~z````ls|lwy````=:ly]```hlq~`c``j``a`j````lqy``c`lv|z`bdbj`c`blv|[`bdb=:l}wt¶ٲвl~tls|lwya`ably[``ab=:ls}``a`m‰mP ,rlqy`af`l~tls|l}lt~`c``lu~t=:=:S`c`b=:l{ult~`c`0lu~t=:=:=:S`e``=:lv|z`bbfj`e`f=:lv|z`bdbj`e`e=:lv|z`dhdj`e`d=:lv|z`bdaj`e`c=:lv|z`bd`j`e`b=:l{ulv|[`bd`l}w۲вڲԱrl~t=: вrl~tlwy```clq}[```cj````ls|=:ls}``a`mpsqmP ,rlqy`af`l~tl}lwy````ls| „xl~t=:ٲҲprl~t=:̲ݲ!q=:—v Ҳl~tlv|[`bdalu~t=:S`e`c=:l{ul}w—v q=:~ž߲rl~tlu~t=:S`e`d=:l{ul}wm‰mPǮҲxl~t=:—vв‰q=:ͲҲҲҲrl~tlu~t=:S`e`e=:l{ul}w‰!qԲxl~tlu~t=:S`e`f=:l{ul}w۹ٲٲڲrl~t=:ٲ}qql~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Shelt.tsc b/res/jp/data/sprites_og/Stage/Shelt.tsc new file mode 100644 index 0000000..33cfd9e Binary files /dev/null and b/res/jp/data/sprites_og/Stage/Shelt.tsc differ diff --git a/res/jp/data/sprites_og/Stage/Start.tsc b/res/jp/data/sprites_og/Stage/Start.tsc new file mode 100644 index 0000000..3f627e4 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Start.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:S`a``=:lyls~0a``j````j````=:l``aalvq```a=:lq``abj``iaj``cgj``aa=:=:=:S`b``=:l{ul{z```ej``ialyls}````l}w=:~ٲ}ֲl~tls|lv|[`dc`lq``ahj`e``j```bj````=:=:=:Sa```=:lu~t=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Statue.tsc b/res/jp/data/sprites_og/Stage/Statue.tsc new file mode 100644 index 0000000..fc82012 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Statue.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~q=:lq~`b``j````j``d`=:lq~`b`aj````j``c`=:lq~`b`bj````j``b`=:lv|zaecdj``ie=:lq~`b`cj````j````=:ls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S``ie=:lq~`b`cj````j``a`lqy```a=:lq~`b``j``a`j``d`=:lq~`b`aj``a`j``c`=:lq~`b`bj``a`j``b`=:lq~`b`cj``a`j``a`=:lvqy```blu~t=:=:=:S`a``=:l{ul``aalq~`a``j````j```b=:lvq````lv|zaecdj`a`a=:ls}``bdlq``hdj``i`j``aij``ba=:S`a`a=:lq`0hej``ifj``aij``ba=:=:S`b``=:S`b`a=:S`b`b=:S`b`c=:=:S`ba`=:l{ulv|zaei`j`bb`l}wl=:tl~tlu~t=:S`baa=:l{ulv|zaeiaj`bbal}wl=:tqól~tlu~t=:S`bab=:l{ulv|zaeibj`bbbl}wl=:tq|l~tlu~t=:S`bac=:l{ulv|zaeicj`bbcl}wl=:tPl~tlu~t=:=:S`bb`=:l{ul}wl=:t~xl~tlu~t=:S`bba=:l{ul}wl=:tl~tlu~t=:S`bbb=:l{ul}wl=:t|ól~tlu~t=:S`bbc=:l{ul}wl=:tzsl~tlu~t=:=:=:S`c``=:l{ul}wuuurl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Stream.tsc b/res/jp/data/sprites_og/Stage/Stream.tsc new file mode 100644 index 0000000..645dbd8 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Stream.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_xqlSSST_p|gSSSU_idlSSSU_evoSSSS_hqg0-FSS\V0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSW_hqg0-0-FSS\X0-_fpxSSUV_idlSSSS_hqg0-0-FSTSS0-_nh|_idrSSST_fvv_wudSSWZ]SS\T]SSS[]SSS\0-0-FSUSS0-#SUTS0-0-0-FTSSS0-_nh|_erdTSSS0-_dqsSUSS]SSTS]SSSS0-_dqsSUTS]SSTS]SSSS0-_zdlSVSS_idrSSSU0-_xqlSSSS_fvv_hyhTSST0-0-FTSST0-_lwmSST[]TSTS_ioNSTYS_hyhTSSU0-0-FTSSU0-_fpxSSSS_iomS[VY]TSSV_hyhTSTS0-0-FTSSV0-_ioPS[VY_iomS[XT]TSTS_ioNTSWU0-_hyhTSTS0-0-FTSTS0-_qfmSVVY]TSTT0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0-FTSTT0-_lwNSSVY0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0- \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/Weed.tsc b/res/jp/data/sprites_og/Stage/Weed.tsc new file mode 100644 index 0000000..e43f30f --- /dev/null +++ b/res/jp/data/sprites_og/Stage/Weed.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```elvqy````lu~t=:S``ia=:l}~qls}```elvqy```alu~t=:S``ib=:l}~qls}```elvqy```blu~t=:S``ic=:l}~qls}```elvqy```clu~t=:S``id=:l}~qls}```elvqy```dlu~t=:=:S``ih=:l{ul}~qls}```elv|[`bbd=:lq~`a``j```aj````lvqy```d=:ls~`d`aj`aabj```blqy`a``=:lq~`a``j````j````=:l}t```bl}slt~`d`alu~t=:=:=:S``ii=:l{ul}~qls}```e=:lq~``iij``a`j````=:lvqy```dlqy``g`=:lq~``iij````j````lqy``c`lu~t=:=:=:S`a``=:l{ul}wq۲ ٱxlv|]`bbgl~z````ls|=:ls~`d``j`aaaj```blx}slqy``f`lq~`a``j```aj````=:lqy`a``lvq```dlv|z`baij`ac`lq```aj``iij```ej```h=:=:S`a`a=:lylv|]`bbglv|z`babj`a`bl}wz}ڲٲٲҲrl~tlu~t=:S`a`b=:lyl``aalt~`a`alvq```dlq```gj``idj``aej```h=:S`a`c=:lyl``aalt~`a`clvq```dlq```hj``idj```ij``aa=:=:S`a`d=:ly=:lv|z`badj`a`f=:lyz```ij`a`e=:l}wz}ڲٲٲҲrl~tlu~t=:S`a`e=:l``bbl}wlwya``imz}mP rl~tls|=:lwy````lv|[`badluu`a`f=:S`a`f=:lyl``aalt~`a`dlvq```dlq``bej``idj``afj```g=:=:=:S`a`g=:lyl``aalt~`a`glvq```dlq``bfj``idj``a`j```g=:S`a`h=:lyl``aalt~`a`hlvq```dlq``bgj``idj``a`j```i=:=:=:S`a`i=:ly=:lv|z`bbbj`aaa=:lyz``a`j`aa`=:l}wz}ڲٲٲҲԲrl~t=:{ٲҲrl~tlu~t=:S`aa`=:l``bbl}wlwya`a`m{z}mP rl~tls|=:lwy````lv|[`bbbluu`aaa=:S`aaa=:lyl``aalt~`a`ilvq```dlq``bhj``idj```fj``ac=:=:S`aab=:lylvq```dlq``ahj``idj```fj``a`=:=:S`aac=:lyl``aalt~`aaclvq```dlq``c`j``idj```gj```i=:=:=:=:S`aba=:lyl}wl=:ól~tlu~t=:S`abc=:lyl}wl=:Ô걦l~tlu~t=:=:S`ac`=:l{ulv|]`cbilv|]`bail}t```blq``aaj`db`j``bdj``bi=:=:=:=:S`b``=:lylt~`b``lv|[`ba`=:ls}``a`lwya``cly[```cl}w=:móz}mP ,rlqy`af`l~tls|=:lwy````l}lu~t=:=:S`b`a=:lylv|z`bbhj`b`glv|[`bbhl}wزrl~tls|~žҲٱrl~t=:Կy!Ҳxl~tls| вҲҲrl~tls|luu`b`g=:=:=:S`b`b=:lyz```hj`b`dl~sz``idj`b`c=:lyl``bbls~`b`bj``baj````=:l}w#в z߲rl~tlwya``hly[```hls|=:ls}``a`m~mP ,rlqy`af`l~tlt~`b`bl}lu~t=:S`b`c=:l``gbls~`b`bj``aej```blu~t=:S`b`d=:ls~`b`bj```aj````lu~t=:=:S`b`e=:lv|z`dhaj`b`f=:lyl}wǻpľ Ҳrl~t=:~ٲڲÔ !rl~t=:޲ٲٲÔ „rl~tlu~t=:S`b`f=:lyl}wҲҲ ֲԱrl~tls|óò ϲ =:ǻp"ql~t=:ݿڲ!rl~tlu~t=:=:S`b`g=:lyl}w!=:~s ߲rl~t=:ղ Ҳrl~tlu~t=:=:S`ba`=:lyl}wzÍs~=:㾓Ҳl~tlu~t=:=:S`bb`=:lyz``acj`be`=:lv|z`bbaj`bd`=:lv|z`dhdj`bci=:lv|z`baej`bcd=:lyl}wzٲұl~tls|=:ls~`bc`j`a`fj````l}t```blu~t=:S`bc`=:lv|z`bbaj`bcg=:lv|z`dhdj`bcf=:lv|z`bbcj`bce=:lv|z`bafj`bcc=:lv|z`baej`bcb=:lyl}w۲ ,Բ~ٲҲl~tls| Ͳ~rl~t=:ٲҲ!߲q=:ݲҲٱxl~z`bcals|=:вڲԱyl~tls| #߾ݲrl~tlwya``ily[```ilv|[`baels|=:ls}`0a`mz}mP #߾rlqy`af`l~tl}ls|Ĺ޲¶Ǿ!rl~t=:ݲrl~tlu~t=:S`bca=:lyl}wбqԱl~t=:l~tlu~t=:S`bcb=:lyl}wǺrl~t=: в߲ݲrl~tlu~t=:S`bcc=:lyl}wֱxl~tz}Ҳٱxyl~t=: Ҳl~tls|uuurl~tlv|[`bbcluu`bce=:=:S`bcd=:lylv|[`bafl}w޼ұrl~t=:ԲҲԲrl~tlu~t=:S`bce=:lyl}w޼Ҳq=:#ٲҲl~t=:ٲҲ+pl~tlu~t=:=:S`bcf=:lyl}wֱq• xl~tls|=:ql~t=: „ٱrl~tls|uuurl~tls|{xl~t=: rl~tls|lqy`a``=:l}w#߾ݲrl~tlwya`a`ly[``a`lv|[`bbals|=:ls}``a`m{z}mP #߾rlqy`af`l~tl}ls|ٲ߲в!rl~t=:{Ҳвrl~t=:۲вrl~t=:Ǻr~yl~tlu~t=:S`bcg=:lyl}w•Ǹٱxl~tlu~t=:=:=:S`bci=:lyl}w賄ҲҲl~tls|=:ls~`bc`j`a`fj````l}t```blu~t=:S`bd`=:lyl}w賄ҲҲl~tlu~t=:=:S`be`=:lylv|[`ebalv|[`ebbly]``ac=:l}wlwya`acm•mP rl~tls|=:lvq```dlq``ahj`b``j```fj````=:=:=:S`c`b=:lylv|z`bahj```alv|[`bah=:l``bbls~`c`bj``baj````=:l}w#в z߲rl~tluu``c`=:=:S`c`e=:lylt~`c`el``bbls}``af=:l}wlwya``fmszmP ,ylqy`af`l~tl}l}|[```e=:PePͲֲyl~tlu~t=:=:S`d``=:S`d`a=:=:S`de`=:lyl}ws~Բٱxl~tlu~t=:S`dea=:S`deb=:=:S`e``=:ly=:lv|z`baaj`e`a=:lv|[`baa=:l}wбql~t=:Ɯórl~tls| ݲ q=:órl~t=:ֲq۲!߲q=:z} Ǿ rl~tls|ڲ,ұrl~tlu~t=:S`e`a=:lyl}wz}Ҳ,ұl~t=:ԲԱl~tlu~t=:=:=:S`e`b=:lyz```cj`e`clu~t=:S`e`c=:l{ulv|[`babl}}`l}t````lqy``c`ly=:l}wбql~tls|Ɯz}yl~tly]```clwya``cls|=:móz}mP Þrl~tlwy````ls|вڲԱyl~tls|=:l{ulq~`e``j```cj````lqy`agflq~`e``j````j```b=:l``aals~`a`aj````j````lqy``a`=:lyl}wٲuǸrl~t=:ҲҲвrl~tls|l{u=:lq~`e``j```ej```blqy``a`lt~`e``=:l``aals~`a`aj``ahj````lt~`e`bl``bclu~t=:=:S`f``=:l{ulv|[`bails}````lvqy```dl}t```b=:l}wlvqs``a`rl~tls|lvqs````=:lq~`debj````j````lqy``a`=:l}wlvqs``ahz~rl~tlqy``a`lq~`deaj````j```bls|lvqs``a`ұxl~tls|lvqs````=:lvqs````lqy``a`lq~`debj````j```blv~`de`j``aflqy``e`=:l}wlvqs``ah۲ٱxl~tls|lvqs````=:lq~`deaj```cj```blqy``d`=:lq~`debj```cj```blqy``d`=:lq~`deaj```ej````lqy``cf=:lq~`debj````j````lqy``e`=:lq~`deaj````j```b=:l}wlvqs``a`Ҳ߲Բrl~tls|lvqs````=:lq~`deaj```ej````=:lq~`debj```ej````lqy``b`=:lq~`de`j``a`j````lt~`dealt~`deblqy``c`=:lq~`de`j``b`j````lqy``f`lv}``afl}r````=:lqy`b``l}w !ղֱֲֲֲyylqy``e`l~tls}```e=:lt~`de`lv|]`ebclv|[`bbelu~t=:=:=:Sab``=:l{ulq~ab``j``b`j```b=:lv~ab``j``aflvqy```a=:lqy`a``lvq```alq``a`jab``j``e`j``cd=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/WeedB.tsc b/res/jp/data/sprites_og/Stage/WeedB.tsc new file mode 100644 index 0000000..cb5ea63 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/WeedB.tsc @@ -0,0 +1 @@ +ǤۤȤۤɤۤʤۤˤۤǤΤǤۤȤ'k9 kh~A%V[9ۤɤ T@"+ANۤʤ Tw_9ۤǤǤǤ,+7!FTǤɤۤ \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/WeedD.tsc b/res/jp/data/sprites_og/Stage/WeedD.tsc new file mode 100644 index 0000000..0b59058 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/WeedD.tsc @@ -0,0 +1 @@ +>;Taaja>;m~rmt~aaaamwrzaaaamvu>;Taajb>;m~rmt~aaaamwrzaaabmvu>;Taajc>;m~rmt~aaaamwrzaaacmvu>;Taajd>;m~rmt~aaaamwrzaaadmvu>;Taaje>;m~rmt~aaaamwrzaaaemvu>;>;Tabaa>;mzmaa1bmuabaamwraaaemraaagkaajekacddkaabh>;>;>;Tadae>;mzmuadaemaaccmt~aabg>;m~xmxzbaagnt{nQ!-zmrzabgamum~m~}\aaaf>;QfQγ׳zmumvu>;>; \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/WeedS.tsc b/res/jp/data/sprites_og/Stage/WeedS.tsc new file mode 100644 index 0000000..f08a0db --- /dev/null +++ b/res/jp/data/sprites_og/Stage/WeedS.tsc @@ -0,0 +1 @@ +b_xb_b_xb_b_xb_b_xb_Ub_xb_b_b_xb_b_b_ \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/e_Blcn.tsc b/res/jp/data/sprites_og/Stage/e_Blcn.tsc new file mode 100644 index 0000000..313fb2c --- /dev/null +++ b/res/jp/data/sprites_og/Stage/e_Blcn.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S`0id=:l}~qls}``ahlvqy```dlu~t=:=:S`a``=:l{ulvqy```alqy`b``=:lq~`b``j``a`j````=:lqy`a``=:lvq```alq````ja`i`j```aj``ae=:=:S`b``=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/e_Ceme.tsc b/res/jp/data/sprites_og/Stage/e_Ceme.tsc new file mode 100644 index 0000000..07d7398 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/e_Ceme.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}0`ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:S`a``=:l{ulvqy```alqy`c``=:lvq```alq````ja`d`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/e_Jenk.tsc b/res/jp/data/sprites_og/Stage/e_Jenk.tsc new file mode 100644 index 0000000..f935134 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/e_Jenk.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulvqy```alqy0b``lv|z`afbj`aa`=:lqy`a``=:lvq```alq````ja`b`j```aj``ae=:S`aa`=:l{u=:ls~`aa`j````j````lqy``b`=:ls~`aa`j`aacj````lqy``b`=:lq~`aaaj````j```blqy``f`=:lvq```alq````ja`b`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/e_Labo.tsc b/res/jp/data/sprites_og/Stage/e_Labo.tsc new file mode 100644 index 0000000..ff726e3 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/e_Labo.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}`0ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulvqy```alqy`d``=:lvq```alq````ja`f`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/e_Malc.tsc b/res/jp/data/sprites_og/Stage/e_Malc.tsc new file mode 100644 index 0000000..f4faf39 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/e_Malc.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulvqy``0a=:lqy``e`lq~`ba`j`a``j````=:lqy``e`lq~`bb`j`a``j````=:lqy``e`lq~`bc`j`a``j````=:lqy``e`lq~`bd`j`a``j````=:lqy``e`lq~`bd`j`aa`j````=:lqy`a``=:lvq```alq````ja`c`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/e_Maze.tsc b/res/jp/data/sprites_og/Stage/e_Maze.tsc new file mode 100644 index 0000000..23cb89f --- /dev/null +++ b/res/jp/data/sprites_og/Stage/e_Maze.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulqy```b=:lq~`b``j``a0j````=:lq~`bb`j``b`j````=:lq~`bc`j``a`j````=:lv|zb```j`a`aluu`aa`=:S`a`a=:lq~`c``j```aj```bluu`aa`=:=:S`aa`=:lvqy```alqy`c``=:lvq```alq````ja`a`j```aj``ae=:=:S`b``=:S`ba`=:S`bb`=:S`bc`=:S`c``=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_og/Stage/e_Sky.tsc b/res/jp/data/sprites_og/Stage/e_Sky.tsc new file mode 100644 index 0000000..1a7a445 --- /dev/null +++ b/res/jp/data/sprites_og/Stage/e_Sky.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqry}qqqq}NKdqqzrNK}}qqry}qqqr}NKdqqzsNK}}qqry}qqqs}NKdqqztNK}}qqry}qqqt}NKdqqzuNK}}qqry}qqqu}NKNKNKdqrqqNK}}sqqq{qrqr}qqqsNK}qsqq{qqsq{qqqsNK}Aqsrq{qqtq{qqqq}qqqsNK}qsqq{qquq{qqqsNK}qsrq{qqrq{qqqq}qrrqNKdqrqrNK}qsqq{qqqq{qqqq}qqqsNK}qsrq{qtvw{qqqsNK}qrrqNKdqrrqNK}qqvqNK}qqqr}qtqqNK}qqqr}qqqq{rqvq{qqqr{qqrvNKNKdqsqqNKdqsrqNKNK \ No newline at end of file diff --git a/res/jp/data/sprites_og/TextBox.png b/res/jp/data/sprites_og/TextBox.png new file mode 100644 index 0000000..3afb02b Binary files /dev/null and b/res/jp/data/sprites_og/TextBox.png differ diff --git a/res/jp/data/sprites_og/Title.png b/res/jp/data/sprites_og/Title.png new file mode 100644 index 0000000..e0c9991 Binary files /dev/null and b/res/jp/data/sprites_og/Title.png differ diff --git a/res/jp/data/sprites_up/Stage/0.pxa b/res/jp/data/sprites_up/Stage/0.pxa new file mode 100644 index 0000000..6c69bb8 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/0.pxa differ diff --git a/res/jp/data/sprites_up/Stage/0.pxe b/res/jp/data/sprites_up/Stage/0.pxe new file mode 100644 index 0000000..d31a268 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/0.pxe differ diff --git a/res/jp/data/sprites_up/Stage/0.pxm b/res/jp/data/sprites_up/Stage/0.pxm new file mode 100644 index 0000000..e7c762e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/0.pxm differ diff --git a/res/jp/data/sprites_up/Stage/0.tsc b/res/jp/data/sprites_up/Stage/0.tsc new file mode 100644 index 0000000..be08b99 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/0.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_idlSSSU_hqg0-FSS\V0-_pqd_fpxSST[_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_idlSSSW_hqg0-0-0-0-0-0-0-0-FSTSS0-_nh|_irpSSTY_zdlSTSS_htPSUXY_fuh_zdlSVWS0-0-_iomUSSS]STTS0-_iomTSUS]STST0-0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-FSTST0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-0-FSTSU0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSY_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSU[S_hyhSUSS0-0-FSTTS0-_vloSSTU_zdlSVXS_flo_zdlSSUS0-_vloSST[_zdlSVXS_flo_zdlSSUS0-_vloSSTW_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSSUS_hyhSUSS0-0-FSUSS0-0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSYTS_idrSSST0-_wudSSZW]STSS]SSST]SSST0-0-FSWSS0-0-FSXSS0-FSXST0-FSXSU0-FSXSV0-FSXSW0-FSXSX0-FSXSY0-0-FSXSZ0-FSXS[0-FSXS\0-FSXTS0-FSXTT0-FSXTU0-FSXTV0-0-#SYSS0-0-0-FTSTS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZX]STSS]SSUS]SSST0-FTSUSp0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZY]STSS]SSST]SSST0-FTSVS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZZ]STSS]SSST]SSST0-FTSWS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZ[]STSS]SSST]SSST0-FTSXS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS[\]STSS]SSST]SSST0-FTSYS0-_iomUSSS]TSYT_hyhTS\S0-FTSYT0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS\V]STSS]SSST]SSST0-0-FTS\S0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]STSS]SSSS0-_idlSSST0-_iomUSSS]TUSS_hyhTTSS0-0-FTTSS0-_zdlSZVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXSV]SVXU]SVSS_zdlSSUS0-_fqsSXSW]SVXU]SWSS_zdlSSUS0-_fqsSXSU]SVXU]SUSS_zdlSSUS0-_fqsSXSX]SVXU]SXSS_zdlSSUS0-_fqsSXST]SVXU]STSS_zdlSSUS0-_fqsSXSY]SVXU]SYSS_zdlSSUS0-_fqsSXSS]SVXU]SSSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTY0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0-0-FTUSS0-_zdlSWVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXTS]SVXU]TSSS_zdlSSUS0-_fqsSXTT]SVXU]TTSS_zdlSSUS0-_fqsSXS\]SVXU]S\SS_zdlSSUS0-_fqsSXTU]SVXU]TUSS_zdlSSUS0-_fqsSXS[]SVXU]S[SS_zdlSSUS0-_fqsSXTV]SVXU]TVSS_zdlSSUS0-_fqsSXSZ]SVXU]SZSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTX0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0- \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/555.pxe b/res/jp/data/sprites_up/Stage/555.pxe new file mode 100644 index 0000000..7164051 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/555.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Almond.pxa b/res/jp/data/sprites_up/Stage/Almond.pxa new file mode 100644 index 0000000..35b783d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Almond.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Almond.pxe b/res/jp/data/sprites_up/Stage/Almond.pxe new file mode 100644 index 0000000..d17814a Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Almond.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Almond.pxm b/res/jp/data/sprites_up/Stage/Almond.pxm new file mode 100644 index 0000000..4772196 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Almond.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Almond.tsc b/res/jp/data/sprites_up/Stage/Almond.tsc new file mode 100644 index 0000000..cd68dde Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Almond.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Ballo1.pxe b/res/jp/data/sprites_up/Stage/Ballo1.pxe new file mode 100644 index 0000000..4cf30f9 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ballo1.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Ballo1.pxm b/res/jp/data/sprites_up/Stage/Ballo1.pxm new file mode 100644 index 0000000..50cf723 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ballo1.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Ballo1.tsc b/res/jp/data/sprites_up/Stage/Ballo1.tsc new file mode 100644 index 0000000..02307f0 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ballo1.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Ballo2.pxe b/res/jp/data/sprites_up/Stage/Ballo2.pxe new file mode 100644 index 0000000..6938d23 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ballo2.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Ballo2.pxm b/res/jp/data/sprites_up/Stage/Ballo2.pxm new file mode 100644 index 0000000..178e955 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ballo2.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Ballo2.tsc b/res/jp/data/sprites_up/Stage/Ballo2.tsc new file mode 100644 index 0000000..f7a84ea --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Ballo2.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`d``=:S`d`a=:S`d`b=:S`da`=:S`daa=:S`dab=:=:=:=:S`e``=:l{ulx}slv}``afl}t```bls}````lq``e`lvqy```a=:lqy`ae`=:l}wlvqs``be l~tls|lvqs``ai=:÷Ǿھ yl~tls|вҲ ìٲ=:Źھ ٲxl~tls|=:lvqs``be=:uuurl~tls|ݲٲҲ߲q=:вֲ辴Ʋ=:y Ҳrl~tls|lvqs````=:l}blpppݲұlqy``e`=:l}wlvqs``beֱxl~tls|lvqs````=:lqy`a``l}blppppвҲӱ=:lq~`da`j``a`j````lq~`daaj``a`j```blqy``e`pppppҲҲӱ=:lqy`a``lyl}wxylqy``e`l~tls|lvqs````l{u=:ls}``cdlqy`a``=:lq~`d``j````j````lqy``b`=:lq~`d`aj````j```blqy``h`=:lyl}wlvqs``beڱyyl~tls|lvqs````l{u=:lqy0a``=:lq~`d``j````j```blqy``b`=:lq~`d`aj``g`j```blqy``cb=:lq~`d`aj````j````lqy``b`=:l}blppp߲lqy``e`=:ppppݲұlqy``e`=:pppppвҲӱlqy``e`ls|ls|=:lyl}wlvqs``be =:Բyl~tls|l{ulqy``e`=:lylvqs````l}csyl~tls|=:l{uls~`d`bj```ij````lqy`ae`=:lyl}wlvqs```e!rl~t=:زrl~tls|=:lvqs``aiŲ߲۲ݲyl~tls|lvqs```eٲٲ yyl~tls|lvqs````=:l{u=:lq~`d`aj``b`j````lqy``a`=:lq~`d``j``h`j```blqy```b=:lyl}wlvqs```eݲyyl~tls|lvqs````=:l{ulv~`d`bj``af=:ls~`d`bj``abj```blqy```b=:lq~`d`bj`a``j```blqy`a``=:lv}l}wl=:yyyyyyyyylqy`a``ls|lqy``e`lv}lvq```a=:lqy``e`lyls}````=:l}wlvqs``beŦxl~tls|=:lvqs``bcԱl~t=:lq``gaj`ab`j````j````=:lu~t=:=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Barr.pxa b/res/jp/data/sprites_up/Stage/Barr.pxa new file mode 100644 index 0000000..a05c866 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Barr.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Barr.pxe b/res/jp/data/sprites_up/Stage/Barr.pxe new file mode 100644 index 0000000..196bb42 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Barr.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Barr.pxm b/res/jp/data/sprites_up/Stage/Barr.pxm new file mode 100644 index 0000000..db181fb Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Barr.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Barr.tsc b/res/jp/data/sprites_up/Stage/Barr.tsc new file mode 100644 index 0000000..a54d830 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Barr.tsc @@ -0,0 +1 @@ +0==F=IZ[NIPZb===EISNV====IR[Q0==F>IZ[NIPZb===EISNV===>IR[Q0==F?IZ[NIPZb===EISNV===?IR[Q0==F@IZ[NIPZb===EISNV===@IR[Q0==FAIZ[NIPZb===EISNV===AIR[Q0=>==ISYW=@C>G=>=@ISYW=@C?G=>=>ISYW=@C=G=>=?IXRfI`\b==>>IN[]=>==G====G===?ISN\===AIa_N==>>G==FAG==A?G==B?0=>=>I]_VIZ`TWՏVI[\QIR[Q0=>=?IXRfISN\===AIa_N==>>G==FAG==A?G==B?0=>=@I]_VIZ`TՏVI[\QIR[Q0=>B=0=>B>0=>B?0=>B@0=>BA0=?F=ISYW=@D=G=?F>IR[Q0=?F>ISYW=@C=G====I]_VIZ`TISNP===EُVVI[\QIQ[]=?F=IP[]>===G==C@G===?IR[Q0=A==IXRfISY:=@C>ISY:=@C?I`ZPIP[]=A==G==>?G====IN[]=A==G==?=G===AIdNV=>A=I]_VIZ`TISNP===B珳яVI[\QISNP====IXRfIPY\IdNV=>==IPZb==>BIZ`T|\ʎVIdNV=>A=I[\QI`\b==ABIP[]=>B=G===>G====IdNV===AI`\b==ABIP[]=>B>G===>G====IdNV===AI`\b==ABIP[]=>B?G===>G====IdNV===AI`\b==ABIP[]=>B@G===>G====IdNV===AI`\b==ABIP[]=>BAG===>G====IPZb===EIR[Q0=B==0>===IXRfISY8=@C=ISY8=@C>ISY8=AA=ISY:=@?CIZ`TݏVI[\QIPY_vPlhvPlhVI[\QIPY_RRRI[\QUI[\QIZfO===?IdNV==@=IZfQ===?IP[]>===G==C=G===AIPY_ISNP===CՏʐu[khӕUI[\QIPY_ȏڏďҏĎOI[\Qu[khڏݏԏϏҏՎOI[\Q؞_ٞǏ֙ȏюNʏʏ̏Ώʏ֏ڛRʏpI[\QIPY_ʏڙgZR͏ΏʏُOI[\QIPY_VI[\QȏِltVITVa>==AI[\QIPY_RΏяʏUI[\QehʏЏˎVI[\QIPY_RRROI[\QIPY_ˏԎN폱؎OI[\QITVa====ʏehӟԏďΏY\MďΏOI[\QՏʏΏяюOI[\QIPY\ISNP====IPZb==== I^bN==@=I`\b==?CIN[]>===G===EG====IN[]=>==G===>G====IdNV==>=IZfQ====IP[]>===G==C=G====IdNV=>==I^bN==@=I`\b==?CIN[]>===G===EG====IN[]=>==G===>G====IdNV==D=I^bN==@=I`\b==?CIN[]>===G===EG====IP[]=A==G==>FG===?IP[]=>==G==>EG===?IPZ]===AG===EG==E=IPZ]===BG===EG==E>IPZ]===CG===EG==E?IPZ]===AG===FG==FCIPZ]===BG===FG==FDIPZ]===CG===FG==FEIZ`TԏVVIdNV==B=IP[]=A==G==>?G===?IN[]=A==G==@=G===?IPY_IXRfIPZb==>>ISNP==>AOϏʎVI[\QIPY_ISNP===BOʏΏѣ׏ːOI[\Q[٢MڙՏՏُOI[\QISNP====IPY_ȏُӏOI[\QIP[]=B==G==CDG===?IdNV=>==IN[]=B==G==>@G===?IdNV==B=IN[]>===G===EG====IZ`TISNP==>BϏ٢MӐNkՏՏˎOI[\QIPY_ISNP===BbhVI[\QIPY_[֙ϏʏˏVI[\QIPY_ISNP===E鏳Nu[khٟˏՎVVI[\QIPY_ISNP==>BRRROI[\QIPY_ISNP==>C鏳ehOI[\Qu[khyяޏˎOI[\Q֤я􏱎OI[\QIPY_ISNP===CUI[\QIPY_ʏڐehÏՏOI[\QISNP====IPY\IN[]=B==G==>BG===?IdNV=>>=I]_VIZ`TISNP===EUVI[\QISNP==>BIPY_|\NI[\Qӏڏ鏶ƏʎOI[\QIPY\IN[]=B==G==?=G===?ISNP====IPY\IXRfIdNV==B=IZ`TISNP===EyˏΏяVI[\QISNP====IPY\IdNV==B=ISNP===BIZ`Tʐ_ˏVI[\Q{ۏΏVI[\QϏʏُڐ[Տُ֎VI[\QIPY_RRROI[\QIPY_ҎNYږʎUI[\Qȏ٢Ґ[ӝَUIf[W>==>IN[]=A==G==@=G===?IPY_ISNP==>AՏԏ؎VI[\QIPY\ISY8=@C>IPZb===AIP[]=A==G==CEG===?IO`Y=A==IR[Q0>==>IXRfISY:=@C?ISY:=@C>IPZb===EIZ`TISNP===BȏOI[\QȏÏ[NOI[\QIPY\IN[]=A==G==>=G===?IR[Q \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Blcny1.pxe b/res/jp/data/sprites_up/Stage/Blcny1.pxe new file mode 100644 index 0000000..b3bcec5 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Blcny1.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Blcny1.pxm b/res/jp/data/sprites_up/Stage/Blcny1.pxm new file mode 100644 index 0000000..93bb4dc Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Blcny1.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Blcny1.tsc b/res/jp/data/sprites_up/Stage/Blcny1.tsc new file mode 100644 index 0000000..e1dc5dc --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Blcny1.tsc @@ -0,0 +1,2 @@ +WddmdA>pypzaeemdpzaeemepz_eemfpupwddgdpzu}ddddpyxA>WddmeA>pypz_eemdpzaeemepzaeemfpupwddgdpzu}dddepyxA>WddmfA>pypupwddgdpzu}dddfpyxA>WddmgA>pypupwddgdpzu}dddgpyxA>WddmhA>pypzaeemdpz_eemepzaeemfpupwddgdpzu}dddhpyxA>A>WddmiA>pypzu}dddhpyxA>A>A>WdeddA>pypddeepudeddnddddndddfpzudddgA>p}~ddfgndedepuddjgnddmgndddmndddhA>A>WdedeA>pypuddjknddmgndddmndddhA>A>A>A>WdeedA>p}pzudddfpuddjhnddmfndddenddeeA>A>WdefdA>pypudefdnddddndddfpddeepzudddhpuddjjnddm4nddedndddlA>A>WdegdA>p}p{v߶A>ضݵpxpyxA>A>WdemmA>p}p{~ˠvpxpyxA>pzudddh{ǷvǷvpxpwpwddggpwypu}mmmmpyxA>A>WdfddA>pypxddddpxdfddpup{A>0ض +¶}pxpyxA>A>WdfdeA>p}p{pA>}}xuUUpxpyxA>A>WdfedA>p}pz~eemendfeepz~eemfndfefA>p}pzudddhpxdddfpu}ddidpuddjfnddmindddknddkhA>WdfeeA>p}pzudddhpxdddfpu}ddidpuddjfnddminddkmnddkgA>WdfefA>p}pzudddhpxddddpu}ddidpuddjfnddmindeeknddjfA>A> \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Blcny2.pxe b/res/jp/data/sprites_up/Stage/Blcny2.pxe new file mode 100644 index 0000000..394d1c6 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Blcny2.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Blcny2.pxm b/res/jp/data/sprites_up/Stage/Blcny2.pxm new file mode 100644 index 0000000..f229389 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Blcny2.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Blcny2.tsc b/res/jp/data/sprites_up/Stage/Blcny2.tsc new file mode 100644 index 0000000..b45cf8e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Blcny2.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Cave.pxa b/res/jp/data/sprites_up/Stage/Cave.pxa new file mode 100644 index 0000000..c30cbaa Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Cave.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Cave.pxe b/res/jp/data/sprites_up/Stage/Cave.pxe new file mode 100644 index 0000000..d117d5d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Cave.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Cave.pxm b/res/jp/data/sprites_up/Stage/Cave.pxm new file mode 100644 index 0000000..fcbf014 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Cave.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Cave.tsc b/res/jp/data/sprites_up/Stage/Cave.tsc new file mode 100644 index 0000000..2d883fc --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Cave.tsc @@ -0,0 +1 @@ +GD]jjsjGDv{v}jjjrv{jjjjv~GD]jjskGDv{v}jjjrv{jjjkv~GD]jjslGDv{v}jjjrv{jjjlv~GD]jjsmGDv{v}jjjrv{jjjmv~GD]jjsnGDv{v}jjjrv{jjjnv~GDGD]jjssGDv}jjjrv{jjjnv~GDGDGD]jkjkGDvv}jkjktjjjjtjjjjvjjkkv{jjjmv{jjkmtjjsmtjjkjtjjjmGDGD]jkjlGDvvjmjltjkjnvjmjktjkjmvv~v~GD]jkjmGDvv{jjjlGDvejmjlvekpnkvekpnlGDv~jjjlv{jjkrtjojl:jjjltjjjjGD]jkjnGDvv{jjjlv{jjkktjjsntjjjrtjjjpGD]jkkjGDvv{jjjnv{jjsjtjjsltjjjqtjjjsGDGDGD]jkojGDvv~jjjjv}jjjrv{jjjnGDv{jjmjGDvjjklv}jjojtjjmotjjpqv{jjljGDvjjklv}jjojtjjmptjjpqv{jjljGDv~GDGD]jljjGDv~GD]jljkGDv~GDGD]jnjjGDvvjjllv~jnjjv}jjkpGDvvkjjpwý}wZ*"6$v{jkpjv~vvejjjmGDZmZ׼v~v~GDGD \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Cemet.pxe b/res/jp/data/sprites_up/Stage/Cemet.pxe new file mode 100644 index 0000000..62ace93 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Cemet.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Cemet.pxm b/res/jp/data/sprites_up/Stage/Cemet.pxm new file mode 100644 index 0000000..279529a Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Cemet.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Cemet.tsc b/res/jp/data/sprites_up/Stage/Cemet.tsc new file mode 100644 index 0000000..3029522 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Cemet.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Cent.pxa b/res/jp/data/sprites_up/Stage/Cent.pxa new file mode 100644 index 0000000..c2a1486 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Cent.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Cent.pxe b/res/jp/data/sprites_up/Stage/Cent.pxe new file mode 100644 index 0000000..d12eaa7 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Cent.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Cent.pxm b/res/jp/data/sprites_up/Stage/Cent.pxm new file mode 100644 index 0000000..5220599 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Cent.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Cent.tsc b/res/jp/data/sprites_up/Stage/Cent.tsc new file mode 100644 index 0000000..eadef34 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Cent.tsc differ diff --git a/res/jp/data/sprites_up/Stage/CentW.pxe b/res/jp/data/sprites_up/Stage/CentW.pxe new file mode 100644 index 0000000..a728e3d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/CentW.pxe differ diff --git a/res/jp/data/sprites_up/Stage/CentW.pxm b/res/jp/data/sprites_up/Stage/CentW.pxm new file mode 100644 index 0000000..ab0318a Binary files /dev/null and b/res/jp/data/sprites_up/Stage/CentW.pxm differ diff --git a/res/jp/data/sprites_up/Stage/CentW.tsc b/res/jp/data/sprites_up/Stage/CentW.tsc new file mode 100644 index 0000000..13b9ab1 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/CentW.tsc @@ -0,0 +1 @@ +B?B?XeeneB?qvqxeeeeq{v~eeeeqzyB?XeenfB?qvqxeeeeq{v~eeefqzyB?XeengB?qvqxeeeeq{v~eeegqzyB?XeenhB?qvqxeeeeq{v~eeehqzyB?XeeniB?qvqxeeeeq{v~eeeiqzyB?XeenjB?B?XeennB?qzqvqxeeeeB?qvefjeoeeefoeeeeq{v~eeeiB?qxehefoeffgoeeegqv~efeeB?qvefjeoeeeeoeeeeB?qyeeegqyehefqxqzyB?B?B?XefeeB?qzqeeffqvefeeoeeeeoeeegq{veeegqveejkoeengoeeefoefehB?B?B?XefjeB?qzq{ffieoefjgB?q|v¨޶}qeeeeqxB?q{`femgq{`ffieq`eeejokee5B?qv~eejeq|B?¸vȶ~qyqxB?qyeeegB?qvegjeoeefeoeeeeqv~eekeB?qxegkeoefjeoeeeeq}xB?qvegkeoeefeoeeeeqv~eejeB?q{veeehqv~efeeqxq{ffifoefjgq{`ffifqveejloeggeoeeffoeefiB?B?B?XefjgB?q~q|v¨޶}qeeeeqxq`eeejokeejB?qzqxeheeoefffoeeegq}xqv~eekeqvefjeoeeefoeeeeB?qv~efeeq{veeeiqveeefoeennoeeejoeeemB?B?XefjgB?qveejloeenioeeffoeefiB?B?XegjeB?qzq|zzzwqyqzyB?B?XegkeB?B?B?B?B?B?XeheeB?XehefB?B? \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Chako.pxe b/res/jp/data/sprites_up/Stage/Chako.pxe new file mode 100644 index 0000000..6ba6273 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Chako.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Chako.pxm b/res/jp/data/sprites_up/Stage/Chako.pxm new file mode 100644 index 0000000..2a510dd Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Chako.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Chako.tsc b/res/jp/data/sprites_up/Stage/Chako.tsc new file mode 100644 index 0000000..d98a4a9 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Chako.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|]`bfcls}```blvqy````lu~t=:S``ia=:l}~qlv|]`bfcls}```blvqy```alu~t=:S``ib=:l}~qlv|]`bfcls}```blvqy```blu~t=:S``ic=:l}~qlv|]`bfcls}```blvqy```clu~t=:S``id=:l}~qlv|]`bfclv|z`cdaj``iils}```blvqy```dlu~t=:=:S``ii=:ls}``bhlvqy```dlu~t=:=:S`a``=:lyl``aalt~`a``lvq```dlq```fj``idj`aaij``ag=:=:=:=:S`b``=:lyz```hj`b`b=:l{ul}w,Բڼٲֲrl~tlv|z`bdaj`b`alu~t=:S`b`a=:l}wھƲұl~tls|=:lv|z`bfaj````lqy``c`lv|[`bfalv|[`bfc=:lq~`c``j```cj```blqy``delq~`c``j````j```bl}t````=:l}w=:—v Ҳxl~tls|~ھͲҲ=:m~mP{Ǧrl~tlu~t=:S`b`b=:l{ulwya``hl}wm~mP Ҳ ٱxl~z````ls|=:lv|[`bacly]```h=:lq~`b``j``a`j````lqy``c`lvq```d=:lq```fj``iij`abdj``aa=:=:S`ba0=:lylyz``cgj``ailv|z`bfcj`baaluu``ai=:S`baa=:l{ul}w=: ٱxl~z````lvq```dls}````lqy``b`ls|uuuuurly[``cgl~tls|=:l}~`c``j``abj```fj````lq~`c``j``a`j````=:lqy``e`=:l|y[a```l``b`l}t```bl}w=:ڹ!̲rl~tls|l}lvqy```dlu~t=:=:=:S`c``=:lyz```hj`c`b=:lv|z`bfaj`c`a=:lv|z`bdaj`c`c=:l{ul}wҲұrl~tls|=:¾ó~xl~tlu~t=:S`c`a=:l{ul}w—v =:m~mP{Ǧrl~tls|m~mPq=:~ھͲҲrl~t=:۲ҳ~ Բrl~tlu~t=:S`c`b=:l{ul}wm~mP ,xyl~t=:yl~tls|=:m~mP=:ͲҲ߲l~t=:èrl~tlu~t=:S`c`c=:l{ul}wҲұrl~tls|˲Ͳrl~t=:ٲxl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Clock.pxe b/res/jp/data/sprites_up/Stage/Clock.pxe new file mode 100644 index 0000000..7af0ce4 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Clock.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Clock.pxm b/res/jp/data/sprites_up/Stage/Clock.pxm new file mode 100644 index 0000000..0cf567b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Clock.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Clock.tsc b/res/jp/data/sprites_up/Stage/Clock.tsc new file mode 100644 index 0000000..33719bf --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Clock.tsc @@ -0,0 +1 @@ +?FWXKFMW_:::BFPKS:::>FOXN-:;::FZ\SFPKY:::>F^\K:::D:;F^\K:::D:;ϐ[X 1>.ߠ+7ϐ[Xѭϩѥ.Ѵјϐ[Xq~~[X~~~[X >Ϗ[XpBp>>ϱ[Xq~~[X,/,/ϱޖ% /Ϯϐ[Xq~~[Xѥєј?Ϗ 4> ? ϐ[X >8ϐѥєј?ϱϐϮϱϐ 4 ϱϐ[Xq~~[X5Ϗ[XѰѵܓ8 ? ϐ* (.ؘ5>Ϗ[X58 ,ϐ[Xq~~[X"">7ϖ[Xѥєј ?5Ϗ[X7?/ϐ[XϏ ϐ?$5Ϗ[XѰѶ7>[X8ϐy~[X[X[X[Xq~~~[X~~~~~~~~~~~~[Xy~[Xϗϗ[X~~~~~~~~~~~~~~~~~~~~~[X~~ϩϗϗ[X~~~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~[X"6ٿϗϗ? (7;4ϗ[X (>ؽ*ϗϗ[Xљϩ/ϗ[Xљϩ؟ϗ? ܱ Ϗ[X~~~~~~~~~~~~~~~~[X~~~[X[XљϩIϗ[X? ;ϗϗ[X~~~[X~~~[X~~~~~~~~~[X~~~~~~~~[X~~~~~~~[X~~~~~~~[X~~~~~~~[X[X[X[Xq~~[Xq~[Xq~[Xq~[X[X[X[Xq~~~[X~~~[X{~{~[X~~~~~~~~[X~~~~~~~[X~~~~~~~[X~~~~~~~[X~~~~~~~[XN~~~~~~~~~~~~[X~~~~~~~~~~~~[X~~~~~[X ϗ~~~~~~[X~~~~~~~~~~~~[X~~~~~~[X~~~07;ϱ[X 4ϱ06? .Ϗ[X +Ѱѵ4Ϗ[Xљϩ>ܓ.ϖ~~[X ϱ[Xܱϱ[X~~~~~~~~~~~~~[X[Xq~~[Xy~~~ϗ~~~~[X~~~~~~~~~~~~~[X~~[X? .љϩIϖ 4ϐ[XљϩϐјϩϩёѦϐ[Xّ 5ܿ[X8 ϐ~~ 846ߝٚ;ϐ[X;27ٚϐ~~~. 5Ϗ[X +Ѱѵ4[Xљϩ>ܓ .ϱ[X~[X[Xq~[X~~[X5ϖ? ϩѦѬϩϏ[X"??7;4ϐ[XѤљ[X>4ϖ~~y~~~~~[X~~~~~~~~~~~~ϩѦѬϩn> ϐ[X~~~~~~Ѥљn>A4 ϐ~~[X~~~~~~~~~~~~~[X[Xq~~[X~~[XϏ ϖّ; 5Ϗ[X.ϐ~~~~[X~~~~~~~~~~~~~[X[X[X[X[Xq~~~[X[X~~~[X~~[X~~5ϖк|њϩѤϩ[X? ϐ* љϩ>ܓّϖ~~[X~~~[XϏ ϱܱϱ[X[Xq~~[Xy~~~ϗ[X? .љϩIϖ 4ϐ[XљϩϐјϩϩёѦϐ[Xّ 5ܿ[X8 ϐ~~ 846ߝٚ;ϐ[X;27ٚϐ~~~. 5Ϗ[X +Ѱѵ4[Xљϩ>ܓ .ϱ[X~[X[Xq~[X~~[X?ϖ? ϩѦѬϩϏ[X"??7;4ϐ[XѤљ[X>4ϖ~~y~~~~~[X~~~~~~~~~~~~ϩѦѬϩn> ϐ[X~~~~~~Ѥљn>A4 ϐ~~[X[Xq~~[X~~[XϏ ϖّ; 5Ϗ[X.ϐ[X[Xq~~[X~~+?޺"4ϐ[Xљϩ8 ϐ[X[X \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/CurlyS.pxe b/res/jp/data/sprites_up/Stage/CurlyS.pxe new file mode 100644 index 0000000..12a9956 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/CurlyS.pxe differ diff --git a/res/jp/data/sprites_up/Stage/CurlyS.pxm b/res/jp/data/sprites_up/Stage/CurlyS.pxm new file mode 100644 index 0000000..fb4c33b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/CurlyS.pxm differ diff --git a/res/jp/data/sprites_up/Stage/CurlyS.tsc b/res/jp/data/sprites_up/Stage/CurlyS.tsc new file mode 100644 index 0000000..143259e --- /dev/null +++ b/res/jp/data/sprites_up/Stage/CurlyS.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lyl``aalt~`a``lvq```dlq``bij``idj```fj```i=:=:=:S`d``=:l{ul`a`el}wñyl~tlv|z`efdj`d`alu~t=:S`d`a=:lyz``adj0da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d``j`acfj````lv|[`eh`lwya`adly[``admҲmP ,rl~tls|=:lv|[c```lv|]c``alv|]c``blv|]c``clv|]c``d=:lv|[`bgdlu~t=:S`da`=:lyl}wsͲrl~tlu~t=:=:S`db`=:l{ult~`db`l}wlwya`cely[``ce=:mzómP ٲ߲rl~tlu~t=:=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Dark.pxe b/res/jp/data/sprites_up/Stage/Dark.pxe new file mode 100644 index 0000000..ae9cadb Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Dark.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Dark.pxm b/res/jp/data/sprites_up/Stage/Dark.pxm new file mode 100644 index 0000000..2e82562 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Dark.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Dark.tsc b/res/jp/data/sprites_up/Stage/Dark.tsc new file mode 100644 index 0000000..9b1fa2d --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Dark.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq``a`j``idj``gcj``bg=:=:S`d``=:lyl}wl`a`el`a0el`a`eñyl~tlyz``adj`da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d``j`acfj````lv|[`fa`lwya`adly[``admҲmP ,rl~tlv|[`bgdls|=:lv|]c```lv|]c``alv|[c``blv|]c``clv|]c``d=:lu~t=:S`da`=:lyl}wsͲrl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Drain.pxe b/res/jp/data/sprites_up/Stage/Drain.pxe new file mode 100644 index 0000000..89e445b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Drain.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Drain.pxm b/res/jp/data/sprites_up/Stage/Drain.pxm new file mode 100644 index 0000000..8958a07 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Drain.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Drain.tsc b/res/jp/data/sprites_up/Stage/Drain.tsc new file mode 100644 index 0000000..07c9fbb --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Drain.tsc @@ -0,0 +1 @@ +]Zs]Z]Zs]Z]Zs]Z]Zs]Z]Zs]Z]Z]Zs]Z]Z]Zs]Z]Zs]Zښђ]Z]Zs]Z]Z]Zs]Z7:9 9ђ]Z:: ђ]Zs]Z]Z]Z]Zs]ZP]Z]Z]Z]Z,7ѳ]Z]Z]Z]Z:=ђ]Z.=ђ]Z]Z]Z]Z]Z{]Z]Zs]Z]Zs]ZӮ9ђ ђ]Z]Z]Z]Z]Z]Z]Z]Z]Z \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/EgEnd1.pxe b/res/jp/data/sprites_up/Stage/EgEnd1.pxe new file mode 100644 index 0000000..1eb67ab Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EgEnd1.pxe differ diff --git a/res/jp/data/sprites_up/Stage/EgEnd1.pxm b/res/jp/data/sprites_up/Stage/EgEnd1.pxm new file mode 100644 index 0000000..fc1dad5 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EgEnd1.pxm differ diff --git a/res/jp/data/sprites_up/Stage/EgEnd1.tsc b/res/jp/data/sprites_up/Stage/EgEnd1.tsc new file mode 100644 index 0000000..f196b79 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/EgEnd1.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswsssu}ss|w}su|z}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/EgEnd2.pxe b/res/jp/data/sprites_up/Stage/EgEnd2.pxe new file mode 100644 index 0000000..1eb67ab Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EgEnd2.pxe differ diff --git a/res/jp/data/sprites_up/Stage/EgEnd2.pxm b/res/jp/data/sprites_up/Stage/EgEnd2.pxm new file mode 100644 index 0000000..fc1dad5 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EgEnd2.pxm differ diff --git a/res/jp/data/sprites_up/Stage/EgEnd2.tsc b/res/jp/data/sprites_up/Stage/EgEnd2.tsc new file mode 100644 index 0000000..c6570d7 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/EgEnd2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMCsssssssvPMfss|wPMssssssswPMPMfstssPMssswssw|}ss|w}su|y}sss{PMPMPMfswssPMPM \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Egg1.pxe b/res/jp/data/sprites_up/Stage/Egg1.pxe new file mode 100644 index 0000000..e8969fb Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Egg1.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Egg1.pxm b/res/jp/data/sprites_up/Stage/Egg1.pxm new file mode 100644 index 0000000..3195bb8 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Egg1.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Egg1.tsc b/res/jp/data/sprites_up/Stage/Egg1.tsc new file mode 100644 index 0000000..3220c73 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Egg1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lylvq```dlq```bj``idj`beij``aa=:=:S`b``=:l{ulv|z`dg`j`b`blyz`0`gj`b`all}w ̲=:ytz{Ǧrl~tlu~t=:S`b`a=:l{ulv|[`dg`l}wlwya``gmytzmP β!rl~tlwy````ls|=:l``dc ̲ rl~tlu~t=:S`b`b=:l{ul}wl ̲Ҳ rl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Egg6.pxe b/res/jp/data/sprites_up/Stage/Egg6.pxe new file mode 100644 index 0000000..38b8916 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Egg6.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Egg6.pxm b/res/jp/data/sprites_up/Stage/Egg6.pxm new file mode 100644 index 0000000..3195bb8 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Egg6.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Egg6.tsc b/res/jp/data/sprites_up/Stage/Egg6.tsc new file mode 100644 index 0000000..bf4a0a1 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Egg6.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIF_lmllIFxx}lllp<}lllnvllupvlmsuvllmlIFIF_lnllIFxxlmplvlllmxglmplxllnnxlnllvllnmvllllIFx/ܾ,Ɔ~xxmllsxglllsxIFxllmlyy\,$8&~x}lmrlxxxIFIF \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/EggIn.pxa b/res/jp/data/sprites_up/Stage/EggIn.pxa new file mode 100644 index 0000000..e3f5673 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggIn.pxa differ diff --git a/res/jp/data/sprites_up/Stage/EggR.pxe b/res/jp/data/sprites_up/Stage/EggR.pxe new file mode 100644 index 0000000..02765f1 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggR.pxe differ diff --git a/res/jp/data/sprites_up/Stage/EggR.pxm b/res/jp/data/sprites_up/Stage/EggR.pxm new file mode 100644 index 0000000..bd58185 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggR.pxm differ diff --git a/res/jp/data/sprites_up/Stage/EggR.tsc b/res/jp/data/sprites_up/Stage/EggR.tsc new file mode 100644 index 0000000..d0c1755 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggR.tsc differ diff --git a/res/jp/data/sprites_up/Stage/EggR2.pxe b/res/jp/data/sprites_up/Stage/EggR2.pxe new file mode 100644 index 0000000..f463640 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggR2.pxe differ diff --git a/res/jp/data/sprites_up/Stage/EggR2.pxm b/res/jp/data/sprites_up/Stage/EggR2.pxm new file mode 100644 index 0000000..df704ac Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggR2.pxm differ diff --git a/res/jp/data/sprites_up/Stage/EggR2.tsc b/res/jp/data/sprites_up/Stage/EggR2.tsc new file mode 100644 index 0000000..ed57122 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/EggR2.tsc @@ -0,0 +1 @@ +\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y\Y\Yr\Y޾69ИИ\Y\Yr\Y\Y\Y\Y\Y\Yr\YzO\YB?ٙ Б\Y\Yr\Y\Y\YݔڒЗz\Y\Yr\Y\Y\YҥҧҭЪҨ? Б\Y\Y|\Y\Y \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/EggX.pxa b/res/jp/data/sprites_up/Stage/EggX.pxa new file mode 100644 index 0000000..89f9149 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggX.pxa differ diff --git a/res/jp/data/sprites_up/Stage/EggX.pxe b/res/jp/data/sprites_up/Stage/EggX.pxe new file mode 100644 index 0000000..2f48e79 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggX.pxe differ diff --git a/res/jp/data/sprites_up/Stage/EggX.pxm b/res/jp/data/sprites_up/Stage/EggX.pxm new file mode 100644 index 0000000..2d1c499 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggX.pxm differ diff --git a/res/jp/data/sprites_up/Stage/EggX.tsc b/res/jp/data/sprites_up/Stage/EggX.tsc new file mode 100644 index 0000000..19961ce --- /dev/null +++ b/res/jp/data/sprites_up/Stage/EggX.tsc @@ -0,0 +1,4 @@ +;8Q^^g^;8j{|ojq{^^_bjtow^^^^js|r;8Q^^g_;8j{|ojq{^^_bjtow^^^_js|r;8Q^^g`;8j{|ojq{^^_bjtow^^^`js|r;8Q^^ga;8j{|ojq{^^_bjtow^^^ajs|r;8Q^^gb;8jtzx^_`^h^^gcjo|~^`^^h^^_^h^^^`jss^^gc;8Q^^gc;8j{|ojq{^^_bjtow^^^bjs|r;8;8Q^_^^;8j~wj}^^__jr|~^_^^jto}^^^bjo^^^`h^^gbh^`g_h^^^f;8;8Q^__^;8jysj{uŰؾٻ̰۰j|}rjs|r;8;8;8Q^`^^;8jtzx^_`^h^`_^;8jys;8jtzY^_`^jtzY^_^cjtzY^_cbjtzY^_ccjtzY^a`gjtzY^_^d;8j{upj|}rjqz};8j{p^^^`jow^^c^j{r^^^`;8j{u;8аj|}rjo|~^`^^h^^__h^^^`jqzjtoq^^^aְְw;8 +÷ݰаwwj|}r;8ĩqװwwj|}rjtoq^^^^jqz};8jow^^c^jo|~^`^^h^^^^h^^^`;8j{ujtoq^^^_ΰvjow^^c^j|}r;8o~Ѱjo|~^`^^h^^^^h^^^^j|}rjqzssspj|}r;8ΰؽðݰ۰vj|x^`^`jss^`^_;8Q^`^_;8jtoq^^^aݰа߰аwwj|}rjqzΰ𼲶;8װװwwj|}r;8ְ߰߰;8ǰЯwwj|}rjtoq^^^^jqz}jss^`^a;8Q^`^`;8jtoq^^^`ssspj|}rjqz +ΰааpj|}rjtoq^^^^jqz}jss^`^a;8Q^`^a;8jow^^c^j{ujo|~^`^^h^^^ch^^^`jtoq^^^_ίwj|}rj{r^^^ajqz;8߰װN|.^^Nwj|}rjqz߰ſذΰ;8߰װsٰwj|}rjqz}jtoq^^^^j{r^^^`;8jo|~^`^^h^^^ah^^^`jow^^a^;8jo|~^`^^h^^^ch^^^`jow^^c^;8j{ujtoq^^^_ſ!wj|}r;8Ұwj|}rjqz}jow^^c^j}^^bajow^^`^jtoq^^^^;8j{ujtoq^^^`oj|}rvj|}rjtoq^^^^jqz};8jow^^c^;8jo|~^`^^h^^^^h^^^^jow^^c^;8j{ujtoq^^^_߰ſװ԰o;8yŤ Яpj|}rjqz;8jtoq^^^`ίίpj|}rjqzֺ԰а;8װͯpj|}rjqzssspj|}rjqz;8jtoq^^^_)Яoٰΰްpj|}rjqz};8jo|~^`^^h^^^ah^^^^jow^_`d;8jo|~^`^^h^^^^h^^^`jow^^`^;8j{u|o߰j{r^^^^vj|}rjqzΰҰpj|}r;8ĆȰ;8߰Ţаpj|}rjqz;8װvj|}rjqzааpj|}r;8ΰްpj|}r;8߰װspj|}r;8װpj|}rjqz};8jo|~^`^^h^^^ch^^^`jow^^`^;8j}^^__jo|~^_^^h^^^^h^^^`jow^^`^;8jo|~^_^^h^^^^h^^^^jr|~^`^^j}^^`ajs|r;8;8Q^a^^;8jysj{uj ſN|\^^;8ɨ#ذٰа +j|}rjqz*۰j|}rjs|r;8Q^a^^;8j~wjto}^^^bjo^^^_h^^gbh^^^ch^^^e;8;8;8Q^b^^;8;8 \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/EggX2.pxe b/res/jp/data/sprites_up/Stage/EggX2.pxe new file mode 100644 index 0000000..9de156b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggX2.pxe differ diff --git a/res/jp/data/sprites_up/Stage/EggX2.pxm b/res/jp/data/sprites_up/Stage/EggX2.pxm new file mode 100644 index 0000000..a76ec5e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggX2.pxm differ diff --git a/res/jp/data/sprites_up/Stage/EggX2.tsc b/res/jp/data/sprites_up/Stage/EggX2.tsc new file mode 100644 index 0000000..270052b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/EggX2.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Eggs.pxa b/res/jp/data/sprites_up/Stage/Eggs.pxa new file mode 100644 index 0000000..8b3c8f6 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Eggs.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Eggs.pxe b/res/jp/data/sprites_up/Stage/Eggs.pxe new file mode 100644 index 0000000..f081cc3 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Eggs.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Eggs.pxm b/res/jp/data/sprites_up/Stage/Eggs.pxm new file mode 100644 index 0000000..a3ab7fa Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Eggs.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Eggs.tsc b/res/jp/data/sprites_up/Stage/Eggs.tsc new file mode 100644 index 0000000..47d90f3 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Eggs.tsc @@ -0,0 +1 @@ + !$56)$+5=$.)1$-6, !$56)$+5=$.)1$-6, !$56)$+5=$.)1$-6, !$56)$+5=$.)1$-6, !$.42"!$56)$+5=$.)1$-6, !$56)$)68""$+5=$.)1$-6, !!$3-A$56)$+5=$)68""$.)1$+68""$?)1$)68""$5A,$,68$;5+$-6, $8:1$5;/k)iCkýŽӎı3 k?B>IýŽG2lFŎ<2Jh#E#j +UýŽЎʱѱʱ<k+ ,M +U*ɽŽıЎʱѱȽı<%F8ýŽӽıT_Ž {SN6E#I*B>+ "I +U?IŽӽıŎ6JXE^]8*ɽŽӽı#cc`E).ýŽӎýŽ<%?IŎF<%*ýŽӽı*62]i]6>ýŽıЎѱʱѱʱ/ʽʱŽӽѱıýŽ22NɽŽıЎʱѱȽı%!ʽŽıЎѱѱʱѱѱѱȽı)BGýŎH2J. ɽŽϱӽı ýŎ<#CJ +UqX4:IýŽӽıѱif%*#ýŽıЎѱʱѱʱȽıc`F&ʽŽӎı''ýŽӎֱıc`lʽŽЎϱʱֱѱѱʱűѱʱѱʱѱʱѱʱȽıfe*ʽŽӽıɽŽ%%%Ŏ!>]+ŽӽıʽŽʽŽϱ)+?I ʽŽıЎʱȽıýŽ#*JaýŎNýŎM6#2S?ýŽ2k*ha ýŎG2lF<M F +>*8jM*IɽŎŽӽıU@6EcjʽŽıЎѱʱѱʱѱѱʱѱϱ±ֱʱȽı & +<6I0kO2rIJd#M*ŽнʱĽʱ))ʽŎ NdM;?IʽŽϱѱ##G2lJ >LýŎ2#Chq Jcl%ʽŽI!JÎhJN)gOr4ýŎ:#;# +C %+BE.kýŽнѱʱֱѱͱαŎŎڽͬ±±ϱѱʱֱȎ 7 +<q6>ýʱŽЎѱʱαŎ˱˱ʽŽŎڽͬȽıŽ +5Na%K[?ýŎ GBE.kL&*ɽŽЎѱñʱŎڽͮѱάȽձֱ 龡qiJ}k>ýʱŽֽŎ \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Hell.pxa b/res/jp/data/sprites_up/Stage/Hell.pxa new file mode 100644 index 0000000..8ab7b2e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Hell1.pxe b/res/jp/data/sprites_up/Stage/Hell1.pxe new file mode 100644 index 0000000..acdd610 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell1.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Hell1.pxm b/res/jp/data/sprites_up/Stage/Hell1.pxm new file mode 100644 index 0000000..3b31311 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell1.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Hell1.tsc b/res/jp/data/sprites_up/Stage/Hell1.tsc new file mode 100644 index 0000000..4295a7d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell1.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Hell2.pxe b/res/jp/data/sprites_up/Stage/Hell2.pxe new file mode 100644 index 0000000..a27137b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell2.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Hell2.pxm b/res/jp/data/sprites_up/Stage/Hell2.pxm new file mode 100644 index 0000000..4c25708 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell2.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Hell2.tsc b/res/jp/data/sprites_up/Stage/Hell2.tsc new file mode 100644 index 0000000..427fcb1 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell2.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Hell3.pxe b/res/jp/data/sprites_up/Stage/Hell3.pxe new file mode 100644 index 0000000..5cbdd52 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell3.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Hell3.pxm b/res/jp/data/sprites_up/Stage/Hell3.pxm new file mode 100644 index 0000000..a0cb2a3 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell3.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Hell3.tsc b/res/jp/data/sprites_up/Stage/Hell3.tsc new file mode 100644 index 0000000..5e95ec7 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell3.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Hell4.pxe b/res/jp/data/sprites_up/Stage/Hell4.pxe new file mode 100644 index 0000000..22bb347 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell4.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Hell4.pxm b/res/jp/data/sprites_up/Stage/Hell4.pxm new file mode 100644 index 0000000..8f89450 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell4.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Hell4.tsc b/res/jp/data/sprites_up/Stage/Hell4.tsc new file mode 100644 index 0000000..3ea1d01 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Hell4.tsc @@ -0,0 +1 @@ +OLerr{rOL~~rtrr|rrrs~rrrr~OLerr{sOL~~rtrr|rrrs~rrrs~OLerr{tOL~~rtrr|rrrs~rrrt~OLerr{uOL~~rtrr|rrrs~rrru~OLerr{vOL~~rtrr|rrrs~rrrv~OLOLOLerr{wOL~~rrrt~rtrr|rrrs~Brrtr~rrru~OLOLOLersrrOL~~rrrs~rrsx~rrzt|rr{x|rrrz|rrsvOLOLerssrOL~~rrrr~rrsx~rrwx|rr{r|rssz|rrxtOLOLerstrOL~~rrss~rstr|rrrr|rrrtOL~rrrt~rrsx~rrzx|rr{t|rrrt|rrsrOLOLOLOLertrrOLOLOL \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Hell42.pxe b/res/jp/data/sprites_up/Stage/Hell42.pxe new file mode 100644 index 0000000..347f004 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell42.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Hell42.pxm b/res/jp/data/sprites_up/Stage/Hell42.pxm new file mode 100644 index 0000000..8f89450 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Hell42.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Hell42.tsc b/res/jp/data/sprites_up/Stage/Hell42.tsc new file mode 100644 index 0000000..08257f0 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Hell42.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_::::FPYX:<::D:::;FaKS:::FWXKFMW_::::FPYX:<::D:::;FaKS:::FOXN-::C?FUOcFRWMFaKS:::D::::FMWZ:::CD::<>D::::FMWZ::;:D::<>D::::FMWZ::;;D::<>D::::FMWZ::;D::::FaKS:::@F]Y_::;<FMWZ:::BD::<@D::::FMWZ:::CD::<@D::::FMWZ::;:D::<@D::::FMWZ::;;D::<@D::::FMWZ::;D::::FMWZ:::CD::<>D::::FMWZ::;:D::<>D::::FMWZ::;;D::<>D::::FMWZ::;D::::FMWZ:::BD::<@D::::FMWZ:::CD::<@D::::FMWZ::;:D::<@D::::FMWZ::;;D::<@D::::FMWZ::;-:;;:FZ\SFW]QTҌLFXYNFOXN-:;<:FUOcF]Y_::;;FKXZ:;<:D::::D:::<FPKY:::-:<::-:=::FZ\SFPKY:::FUOcFPVT;:::D::C?FWXKFMW_:::BFPKS:::>FO`O:<::-::C?FWXKFMW_:::BFPKS:::>FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::F^\K::?=D::C>D::A?D:::?-:;;:FUOcF]Y_::;;FKXZ:;;:D::::D:::::D::;:D::::FW]QSSFXYNFMVYFKXZ:>::D::<:D::::FaKS::?:FOXN-:>::FUOcFPVT;::=D:>:>FPVT;;::=FPVT;:::<FPVT;::;D:>:;FPV5;::;FPV5;:=BFKXZ:>::D::;:D::::FW]QڌSSFWcL:::::D::::D::::FPKM:::;FUOcFPV5;::<FW]QFPKM:::<FUOcFW]QFPKM:::=FUOcFW]QFPV5;::=FPKM:::>-:>:>FUOcFW]QFPKM::FWXKFMW_:::FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::;Taaja>;m~rmt~aaaimwrzaaaamvu>;Taajb>;m~rmt~aaaimwrzaaabmvu>;Taajc>;m~rmt~aaaimwrzaaacmvu>;Taajd>;m~rmt~aaaimwrzaaadmvu>;Taaje>;m~rmt~aaaimwrzaaaemvu>;>;>;>;>;Tabaa>;m|vmaabbmrabaakaaaakaaacmwraaaemraadjkaajekaaddkaaaj>;>;>;Tacaa>;mzm~xsmumt}dzȳ۳ĸ"smu>;dzȳ۳񼬳!"smu>;ǝ|vs!ϳsmumvu>;Tacba>;mzm~x񼬳,ѳsmu>;,y>;ܳ۳ӳӳsmumt}!ڳr>;,ڳճڲmumvu>;Tacca>;mzmw}{bacakaccbm~xѳв|#ӳֲmumt}ĴIJmumt}ѳ"޳>;|}ӳ۳smumvu>;Taccb>;mzm~xmumt}>;ѳ"óӴsmumvu>;Tacda>;mzm~x>;ĸѳڲymumt}ĸ$÷Ƴڳ"ӳ"smu>;ճ$÷Ƴڳ"ӳڲmu>;س񼬳ѳ"smumvu>;Tacea>;mzmw}{ahcakaceb>;m~xѳĎærmu>;€ ߳ӳӳ"smu>; ߳ӳr>;Ď񼬳÷"mumvu>;Taceb>;m~xĎæ߳smumt}>;ճ꾤񼬳÷"ymumvu>;>;>;Tadaa>;Tadab>;m|vm~rmt~aaai>;mradbakaaabkaaaamwrzaaae>;mtadabkabbckaaaamrzabaa>;mradbakaaaakaaaa>;m~uaaaamuadabm~tmvu>;Tadba>;m|vmw}{ahcakadbb>;m|vm~xĎæsmumt}ĕ-ӳӲsmumvu>;Tadbb>;mtadaakabbbkaaacmy~tmrzaagamrad1akaaabkaaaa>;mrzabaamwraaaemraaefkadabkaaackaafd>;>;>;Taeaa>;m|vmw}{ahcbkaebam~xٳղsmumt}񼬳ĉsmu>;ŀ۳uǐ-smu>;ŵճ„ƒ׳"smu>; "mumt}mr~{aaackaeabmr~{aabdkaeaemvvaeac>;Taeab>;m|vm~x>;"ymumt}€ӳӳγsmumt}>;qtr׳ڲsmumt}ڳ޳׳ڲym{aeadmt}>;mr~^aaad>;mrzaacam~xmxzaaac!ğsmu>;mxzaaadqtr!ğsmumxzaaaamt}>;maaee"zzmumt}mw}\ahcbmxzaaabmt}>;mr~aaackaaabkaaaamt~aabannQۻݳzmrzabgamum~mvu>;Taeac>;m|vmw}\ahcbm~xѲsmumt}s!ղsmumt}mxzbacamt}>;mt~aabamz\aacamv\aaainnQ!smrzabgamum~mxzaaaamt}ӳӳsmu>;ճγӳ"ymumvu>;Taead>;m|vm~xmt}(smumvu>;Taeae>;m|vmw}\ahcbm~xѲsmumt}s!ղsmumt}mxzbadimt}>;mt~aabamz\aadint ߳nQ!smrzabgamv\abcimw}\ahccmum~mxzaaaamt} вr{'ĩij۲rmu>;޳!- >;€smumvu>;Taeba>;m|vm~x!ϳr>;wĴ{dzȳsmumt}smu>;۽ʳ>;ӳsmu>;񼬳ӳr>;񼬳ѳڳ!"smumt}׳۳޳>;!"NJ ۳вzmumvu>;>; \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/MazeB.pxe b/res/jp/data/sprites_up/Stage/MazeB.pxe new file mode 100644 index 0000000..6d6d0e4 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeB.pxe differ diff --git a/res/jp/data/sprites_up/Stage/MazeB.pxm b/res/jp/data/sprites_up/Stage/MazeB.pxm new file mode 100644 index 0000000..6d2b521 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeB.pxm differ diff --git a/res/jp/data/sprites_up/Stage/MazeB.tsc b/res/jp/data/sprites_up/Stage/MazeB.tsc new file mode 100644 index 0000000..64502c8 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeB.tsc differ diff --git a/res/jp/data/sprites_up/Stage/MazeD.pxe b/res/jp/data/sprites_up/Stage/MazeD.pxe new file mode 100644 index 0000000..e25a888 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeD.pxe differ diff --git a/res/jp/data/sprites_up/Stage/MazeD.pxm b/res/jp/data/sprites_up/Stage/MazeD.pxm new file mode 100644 index 0000000..f22c930 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeD.pxm differ diff --git a/res/jp/data/sprites_up/Stage/MazeD.tsc b/res/jp/data/sprites_up/Stage/MazeD.tsc new file mode 100644 index 0000000..cfbd0e4 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/MazeD.tsc @@ -0,0 +1 @@ +þײ˲Əþײ˲Əþײ˲Əþײ˲Əþײ˲Ə۾̲ײҲѲƲò˾ +J$˾ƾƽ˾̲έέײҲu"r 1?ľƾԾֳײԏɾ֭trjK~l?˲ƾяֲ׾ײҲβƏҲײίƏ \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/MazeH.pxe b/res/jp/data/sprites_up/Stage/MazeH.pxe new file mode 100644 index 0000000..ada7142 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeH.pxe differ diff --git a/res/jp/data/sprites_up/Stage/MazeH.pxm b/res/jp/data/sprites_up/Stage/MazeH.pxm new file mode 100644 index 0000000..ed87e49 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeH.pxm differ diff --git a/res/jp/data/sprites_up/Stage/MazeH.tsc b/res/jp/data/sprites_up/Stage/MazeH.tsc new file mode 100644 index 0000000..77a3f1e --- /dev/null +++ b/res/jp/data/sprites_up/Stage/MazeH.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ailvqy````lu~t=:S``ia=:l}~qls}``ailvqy```alu~t=:S``ib=:l}~qls}``ailvqy```blu~t=:S``ic=:l}~qls}``ailvqy```clu~t=:S``id=:l}~qls}``ailvqy`0`dlu~t=:=:S`a``=:lylvq```blq```ij``ibj``abj``fd=:=:S`a`a=:lylvq```alq``cij``iaj```dj``af=:=:S`b``=:lyl}wrl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/MazeI.pxe b/res/jp/data/sprites_up/Stage/MazeI.pxe new file mode 100644 index 0000000..d301a2f Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeI.pxe differ diff --git a/res/jp/data/sprites_up/Stage/MazeI.pxm b/res/jp/data/sprites_up/Stage/MazeI.pxm new file mode 100644 index 0000000..ec76fcc Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeI.pxm differ diff --git a/res/jp/data/sprites_up/Stage/MazeI.tsc b/res/jp/data/sprites_up/Stage/MazeI.tsc new file mode 100644 index 0000000..11977c9 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/MazeI.tsc @@ -0,0 +1,8 @@ +fc|fcfc|fcfc|fcfc|fcfc|fcfcfc|fcfcfc|fc!ڼfc|fcfc|fc|fcfc|fcfcܜܣܳyIA"UCڢfc>%&yyڢfcfcfcfc|fcڢڢڞڞڞfc#"@C@ڛ + +& +Dڡfcfcfcfc|fc9I5ڡYfcfcfcfcfcfcfcfcfcfcfc|fc9&C5ڛfcfc|fcfcfc|fc9ܮڴ"K' CDڛfcF"ڼfc + +& +%%ܬ8 ڛfcCU!@fcJ@C!ڼfcfc|fcfc|fc +%9%ܱܜܻܹښfc<"B@J $ڛfc!"DC ڛfc9 ښfcLC5ڼfcfc|fc-!ڛfcfcyӾyyyyyyyyfcfc9fcܜܣܳfcfc \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/MazeM.pxe b/res/jp/data/sprites_up/Stage/MazeM.pxe new file mode 100644 index 0000000..d7eda37 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeM.pxe differ diff --git a/res/jp/data/sprites_up/Stage/MazeM.pxm b/res/jp/data/sprites_up/Stage/MazeM.pxm new file mode 100644 index 0000000..cdda771 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeM.pxm differ diff --git a/res/jp/data/sprites_up/Stage/MazeM.tsc b/res/jp/data/sprites_up/Stage/MazeM.tsc new file mode 100644 index 0000000..db25650 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeM.tsc differ diff --git a/res/jp/data/sprites_up/Stage/MazeO.pxe b/res/jp/data/sprites_up/Stage/MazeO.pxe new file mode 100644 index 0000000..3537a2c Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeO.pxe differ diff --git a/res/jp/data/sprites_up/Stage/MazeO.pxm b/res/jp/data/sprites_up/Stage/MazeO.pxm new file mode 100644 index 0000000..61edc26 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeO.pxm differ diff --git a/res/jp/data/sprites_up/Stage/MazeO.tsc b/res/jp/data/sprites_up/Stage/MazeO.tsc new file mode 100644 index 0000000..dffedfc Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeO.tsc differ diff --git a/res/jp/data/sprites_up/Stage/MazeS.pxe b/res/jp/data/sprites_up/Stage/MazeS.pxe new file mode 100644 index 0000000..5103bc8 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeS.pxe differ diff --git a/res/jp/data/sprites_up/Stage/MazeS.pxm b/res/jp/data/sprites_up/Stage/MazeS.pxm new file mode 100644 index 0000000..786595f Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeS.pxm differ diff --git a/res/jp/data/sprites_up/Stage/MazeS.tsc b/res/jp/data/sprites_up/Stage/MazeS.tsc new file mode 100644 index 0000000..8060f44 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/MazeS.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlv|z`gfaj``ielvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:S``ie=:lq~`c``j``b`j````lvqy```blu~t=:=:=:S`a``=:l{ulv|z`gfcj`a`a=:l``aalq~`a``j````j```blvq````l}t````lq``dcj``i`j``afj``ac=:S`a`a=:lyl}wzٲұyl~tlu~t=:=:S`aa`=:lv|z`gfdj`aaalu~t=:S`aaa=:l{ulvq```dl}t```blq``dej``ibj```bj```e=:=:=:=:S`b``=:lylv|z`b`aj`b`al}w$ҲںٲҲzٲұl~tlu~t=:S`b`a=:lv|z`gffj```alv|[`gfflv|]`gfelv|[`b`b=:l``bbls~`b``j``baj````=:l}w#в z߲rl~tls|lq}```ej``a`j````=:ls}``a`lwy``a`msmPPqyylqy`af`l~tl}lu~t=:=:S`c``=:l{u=:lv|z`gfdj`c`c=:lv|z`gfbj`c`b=:lv|z`gfaj`c`a=:lv|[`gfal}wlvqs``aiǸrl~t=:rl~tls| ߲q=:+߲rl~tls|=:߲l~tls|Բq=:ƲزqҲrl~t=:rl~tls|!q=:ٲ rl~t=: Ͳrl~tls|=:lq~`c``j``b`j````lu~t=:S`c`a=:l{ulq~`c``j````j````=:l}wlvqs``aiԲxl~t=:ٲŬݲxl~tls|!Ҳձrl~t=:бq Ͳrl~tlq~`c``j``b`j````lu~t=:S`c`b=:lyl}ws Ҳrl~tlu~t=:S`c`c=:lyl}wlvqs``aiϱyl~tls|=:ҲƲزqyyl~tlu~t=:=:=:S`ca`=:l{uls~`ca`j``abj```djlq~`ca`j``h`j```el}s=:ls}``ael}w=:Ȳylqy`ad`l~tls|lvqs````=:ls}```hlvq```dl}t```blq``ddj`f``j```ij``ad=:lu~t=:=:S`cb`=:l{u=:lv|z`gfbj`cbb=:lv|z`gfaj`cbaluu`e``=:S`cba=:l{u=:l}~`cb`j````j````j````=:l}t```bl}t```c=:l}wlvqs``ai!qҲݲrl~tls|lvqs````=:lq~`c``j``b`j````lqy``e`l}w!yl~tls|lvqs````=:ls~`ea`j`ccdj````=:ls~`eaaj`ccdj```blqy`a``=:l}wlvqs``b`uuurl~tls|lvqs````=:lq~`c``j````j````lqy``e`l}t```b=:l}wlvqs``be޲ٲҲrl~t=:!Ͳٲl~tlvqs````ls|=:lqy``e`=:l}wsyls}````l~tls|=:ls~`ca`j```ij```blqy`a``=:ls~`ca`j0`abj```b=:lq~`ca`j``c`j```bls}``aa=:l}t````=:l}wlvqs``ai=:ywyyl~tls|lvqs``ad=:yl~tls|۲yl~tls|ٲq𻫲ٲ=:Բyl~tls|زݲ=:ҲҲyl~tls|~Ɯ߲=:ֲҲrl~tls|Բyl~t=:ƜھвԱyl~tls|·Ã~=:!yyl~tls|lvqs``aièٲyl~t=:qó!¶Ͳұrl~tlvqs````ls|ls}````=:lqy`a``=:lq~`ca`j``f`j```blqy``dh=:lq~`ca`j``e`j```blqy``b`=:lq~`c``j``b`j````lqy``b`=:l}t```bl}t```cl}wlvqs``ai=:鱋yl~tlq~`ca`j``h`j````l}r```blq~`c``j``c`j````l``gbls|lvqs``bcҲ!ٱyyl~t=:lq~`ca`j````j````ls}```dls~`ca`j`afij````lr|`ca`=:lv|[`gfblv|[`gfc=:lu~t=:S`cbb=:lylu~t=:=:S`cc`=:=:=:=:S`e``=:l{u=:lv|z`gfbj`e`b=:lv|z`gfaj`e`a=:l}w۲ݲrl~t=:ԲٲDzܲݲrl~t=:ٲ޲ٲԲұrl~tlu~t=:S`e`a=:l{ulqy``a`=:lq~`c``j````j````=:l}wlvqs``b`+=:Ͳݲ!Ҳٲϱrl~tls|=:lq~`c``j``b`j````lu~t=:S`e`b=:lyl}w۲ݲrl~tlu~t=:=:S`ea`=:S`eaa=:=:=:S`f``=:l{ulv|]`gfclv|[`gfdlv|]`gf`=:l}sls}```hls~`cc`j``abj```blq~`c``j````j```b=:l}~`cb`j````j````j````=:lvqy```d=:l}wlvqs```e~Ź߲l~tls| ٲrl~t=:ٲl~tlq~`cc`j````j````ls|Ðq=:ٲrl~tls|=:lvqs``ai ٲҲrl~tlvqs````ls|=:lq~`cc`j``f`j````lqy``d`=:lq~`cc`j``e`j```blqy``b`=:l}t```clq~`c``j``b`j````=:l}wlvqs``ai!qҲݲrl~tls|lvqs````=:lq~`e``j``a`j````lqy`a``=:lq~`cc`j``h`j```b=:lq~`c``j````j```b=:lq~`e``j``b`j````l}t```bl}w=:lvqs``bcpyyylqy``e`ls|lvqs````=:lq~`cc`j````j```b=:lqy`a``l}wlvqs```eҲҲٱrlq~`c``j````j````l~t=:~ Ð=:ٲrl~tls|=:lvqs``aiԲ!yl~tls|lvqs````lq~`cc`j``a`j````=:lqy`af`ls~`b``j``aej```blqy``d`=:l}w=:lvqs``aiƫƲssٲrl~tls|=:lv|[`ghalv|[`gfels~``afj``afj```blu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/MazeW.pxe b/res/jp/data/sprites_up/Stage/MazeW.pxe new file mode 100644 index 0000000..63818ec Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeW.pxe differ diff --git a/res/jp/data/sprites_up/Stage/MazeW.pxm b/res/jp/data/sprites_up/Stage/MazeW.pxm new file mode 100644 index 0000000..21559a0 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MazeW.pxm differ diff --git a/res/jp/data/sprites_up/Stage/MazeW.tsc b/res/jp/data/sprites_up/Stage/MazeW.tsc new file mode 100644 index 0000000..ea91da9 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/MazeW.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``cglvqy````lu~t=:S``ia=:l}~qls}``cglvqy```alu~t=:S``ib=:l}~qls}``cglvqy```blu~t=:S``ic=:l}~qls}``cglvqy```clu~t=:S``id=:l}~qls}``cglvqy```dlu~t=:=:S`a``=:lylvq```blq``chj``ibj```ej```c=:=:S`a`a=:=:S`a`b=:lyl``aalt~`a`blvq```dlq``d`j``ibj```dj```e=:=:S`a`c=:lv|z`fhaj`a`e=:lyz``agj`a`d=:lyl}w޲ڲٲٲҲrl~tlu~t=:S`a`d=:lyl``bblwya`aglv|[`fha=:l}wm󿺲z}mP rl~tls|luu`a`e=:S`a`e=:lyl``aalt~`a`clvq````lq``daj``i`j``aej```i=:=:S`a`f=:l{ul``aalq~`a`fj````j```blvq```dlq``dbj``idj```ej0``i=:=:S`aa`=:lv|z`gd`j`aaa=:l{ul``aalq~`aa`j````j```blvq```blq``dcj`e``j```dj``ac=:S`aaa=:l{ul``aalq~`aa`j````j```blvq```blq``dcj``ibj```dj``ac=:=:S`ab`=:l{ulvq```dlq``d`j``idj``abj```b=:=:=:=:S`c``=:S`c`a=:lt~`c`alrq```alv|]`fh`lu~t=:S`c`b=:lt~`c`bls}```glrq``a`ls~`c``j``acj````lr|````lu~t=:=:Sa```=:l{ulvr````j``aflqy`be`ls}````=:l}cls}``ae=:ó ìrlv}``aflqy`af`l~tls|ls}``cg=:ls~`c``j````j````lv|[`fh`lu~t=:=:=:Sab``=:l{ulq~ab``j``b`j```b=:lv~ab``j``aflvqy```a=:lqy`a``lvq```alq``dgjab``j``chj``af=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/MiBox.pxe b/res/jp/data/sprites_up/Stage/MiBox.pxe new file mode 100644 index 0000000..3fb5faf Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MiBox.pxe differ diff --git a/res/jp/data/sprites_up/Stage/MiBox.pxm b/res/jp/data/sprites_up/Stage/MiBox.pxm new file mode 100644 index 0000000..35422ed Binary files /dev/null and b/res/jp/data/sprites_up/Stage/MiBox.pxm differ diff --git a/res/jp/data/sprites_up/Stage/MiBox.tsc b/res/jp/data/sprites_up/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Mimi.pxa b/res/jp/data/sprites_up/Stage/Mimi.pxa new file mode 100644 index 0000000..94e8fc0 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Mimi.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Mimi.pxe b/res/jp/data/sprites_up/Stage/Mimi.pxe new file mode 100644 index 0000000..5b68f62 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Mimi.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Mimi.pxm b/res/jp/data/sprites_up/Stage/Mimi.pxm new file mode 100644 index 0000000..7fc90d8 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Mimi.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Mimi.tsc b/res/jp/data/sprites_up/Stage/Mimi.tsc new file mode 100644 index 0000000..032a48b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Mimi.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Momo.pxe b/res/jp/data/sprites_up/Stage/Momo.pxe new file mode 100644 index 0000000..67cd58c Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Momo.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Momo.pxm b/res/jp/data/sprites_up/Stage/Momo.pxm new file mode 100644 index 0000000..e58b14d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Momo.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Momo.tsc b/res/jp/data/sprites_up/Stage/Momo.tsc new file mode 100644 index 0000000..538f21e --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Momo.tsc @@ -0,0 +1,15 @@ +½ֱʱŎ½ֱʱŎ½ֱʱŎ½ֱʱŎ½ֱʱŎڽֱѱб±ڎֱѱʱĎѱױʱֱѱűĽʱѱŎڎֱѱʱĎѱױʱֱѱűĽʱѱŎڎ˲˱˲˱˱˲˲˲ѱʱѱʱȽͬͬı!I>++ ?BE> #fLýŽӎH*B>ŽNcýŎMkgýŎMFq%*+BE>r?0HLýŎ +UMn+ *C*B>G>rNI6ýŎ*hL,G4k>MýŽqfJF,I#NLýŽӎ]!<kN#G#EýŽ"qmBEjMýŎ!I>qM +%AJj>`MgýŎ]?+,iI.ELýŽЎ˱˱Ʊ˱˱ȽıGi!'9+IMýŎ?k*BEI#*6hŽŎȽýŽ!½<kYijnLýŽӎıղqghk>ýŽձӽıM /-JN]?+,iI#MýŽЎծҮͮͬƱȽýŽ!½<kYijnLýŽӎıղqghk>ýŽձӽıM /-JN]?+,iI#MýŽЎծҮͮͬƱڽȽı"6#ɽ˱<%ɽŎIh##F8ŽŎڽͬ##ULýŎ48+ #fýŽGi!'9 q*UBEýŽıղլҬͬȎֱMϾqiJ}k>ýʱŽֽнձȽı%nýŎ.6f,#0HŽ +MN UGjq W4kEjMgýŎ<M Ih6 iJIkjýŽ##ɽŽƱڽȽı N J"BEq6E@f%?#ýŽ +1I?*h +.JBEI#gýŽŎȽͬͬıM /-JN+I :+IMýŎkFBEj], ½Ŏ!kq keiJ}kkOIrG*IjG%ýŽIrG*6E], qiJ}kE,E9VýŽŎڽȽı /-JN+I :+IMýŎ2MTF :G ?B>h +M], LýŽIrG*6E], qiJ}kE9VýŽŎڽȽı)*'iI4#ýŽӽıղ +tk], q *:>ýŽӽırŽ2M], Ž + tLýŽձ2k7b'I#nýŽŎڽͬͬȽı)*'iI4#ýŽӽıղծ], q *:>ýŽӽı'GŽ N+ýŎ2kIh#0jG%nýŽձֱѱнʱ N J"BEq6E@f%?#ýŽ J"NŽ*MI SýŽ?0H +1IFLýŎBgJ*h'1?6>r?0HŽ +.JBEI#ýŽŎȽͬı)*'iýŽ J"N *C*B>ɽŽӎıղծ +q6>ýŽӽı U b#I#nýŎ J"M*m +ýŽձ%rŽ+#I#G +qN+fPIMgL&ýŽ] IrG*8jnýŽƱڽȽı3 kýŽ /-JN U+**j*h +MF rFEýŽŎڽ ^]8*ɽ˱бֱʱýŽЎʱ˲ʬֱűMN+ +r6>ýŽнֱʱŎͮͬͬͬͬͬͬͮͬͮͬýŽнѱѱʬֱűg. r?ýŽнֱʱŎڽ?l%*ŽŎ \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/New.pxe b/res/jp/data/sprites_up/Stage/New.pxe new file mode 100644 index 0000000..6407ae9 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/New.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Oside.pxa b/res/jp/data/sprites_up/Stage/Oside.pxa new file mode 100644 index 0000000..d141dad Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Oside.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Oside.pxe b/res/jp/data/sprites_up/Stage/Oside.pxe new file mode 100644 index 0000000..38e3b5d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Oside.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Oside.pxm b/res/jp/data/sprites_up/Stage/Oside.pxm new file mode 100644 index 0000000..03adc62 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Oside.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Oside.tsc b/res/jp/data/sprites_up/Stage/Oside.tsc new file mode 100644 index 0000000..24224ef --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Oside.tsc @@ -0,0 +1,5 @@ +NKdqqzqNK}}qqsv}qqqq}NKdqqzrNK}}qqsv}qqqr}NKdqqzsNK}}qqsv}qqqs}NKdqqztNK}}qqsv}qqqt}NKdqqzuNK}}qqsv}qqqu}NKNKdqrqqNK}}qqqq}qqvs{qqzq{qqrx{qqrqNKNKdqrsqNK}}qqrr}qrsq{qqqq{qqqs}qqqu}qqvv{qqzu{qqqz{qqqzNK}¤}}NKNKdqrtqNK}}qqts{qrtr}qqrr}qrtq{qqqq{qqqs}qqqq}qqwz{qqzq{qqrv{qqqyNKdqrtrNK}}qqqq}qqrr}qrtq{qqqq{qqqsNK}rqts}nqqts}lrtxq}NK¶œƒ}}NK}qqqq}qqwz{qqzq{qqrv{qqqyNKNKdqruqNK}}qqqq}qqqq}qqzu{qqzq{qqru{qqqxNKNKdqsqqNK}}‰}}NKNKdquqqNK}}qzwq{quqr}}qqrqēĂ1ӕ (NK̾<ƒ}}NKdquqrNK}}}qurq{qqrw}qqvqNK}}qqrq +'*}qqqq2ƒ}}NK}qusq{qrvq{qqqq}NK}quqq{qqqt{qqqq}qqtsNK}quqq{qqqq{qqqs}qqtsNK}Aqusq{qqvq{qqqq}qqtsNK}qusq{qqqq{qqqs}qqtsNK}quqq}qusqNK}qurq{qqrq{qqqs}qsqqNK}}qqrq),'ƒ}}}qqqqNK}qurq{qqsq{qqqs}qsvqNK}qurq{qqrq{qqqs}qsqqNK} NK +1ӆа*ƒ}qsqq}#ĩďğœ 1ԠNKӯ$ Ζ1ˋϯ*,ƒ}qsqq}ӯ$ ™ĩďğœ Ζ1NKщϿ (+*,ƒ}qsqq}NK}qqqs2 !'¤}qsqq} $ ċĚľÒѭ‚NKĩďğœ ) ̺ ϓ‚NKѕ*( ƒ}qsqq}}qqswNK}¡.)¡}zzzzNK}NKNKNKdqurqNK}}Đ}}NKdqusqNKNKNKdqwqqNK}}ħİģĐ+ًحƒ}NK- ƒ}NK ' +-*ęĦœĘ1NKЊęĦœĘ +'Ϸƒ}NK2NK*#(¤}}NKNK \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Ostep.pxe b/res/jp/data/sprites_up/Stage/Ostep.pxe new file mode 100644 index 0000000..0d1e91e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ostep.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Ostep.pxm b/res/jp/data/sprites_up/Stage/Ostep.pxm new file mode 100644 index 0000000..1732069 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ostep.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Ostep.tsc b/res/jp/data/sprites_up/Stage/Ostep.tsc new file mode 100644 index 0000000..66aaf78 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Ostep.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFPKS::::FOXN-::C;FWXKFPKS:::;FOXN-::C<FWXKFPKS:::FWXKFPKS:::>FOXN-:;::FUOcF]Y_::;;FKXZ:;::D::::D:::<FPKY::::F^\K::B?D::C@D::;CD::D::;; +-:<::-:<:;-:C::FNXZ:C::FUOcFWcN:::[5堝_"(!y&Q%"(!yQHoHP" p-$5(;נ &A%_&$*$(%2 HoJ&$*$(%͠ \#m$D"'%堝Y\<@"(B\ @yנNDXITYHWWàƠנ3_%_!oQ<[堝נà;<9{נ$eTW5Py 4& `Pנ!)H5QBZ !=_!{#y\+}W5<}P堝9̠#f'YTWsz7<z[⠝ڠ`[L&9=FˠננǠàĠ \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Pixel.pxe b/res/jp/data/sprites_up/Stage/Pixel.pxe new file mode 100644 index 0000000..3364dd5 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Pixel.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Pixel.pxm b/res/jp/data/sprites_up/Stage/Pixel.pxm new file mode 100644 index 0000000..575bee6 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Pixel.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Pixel.tsc b/res/jp/data/sprites_up/Stage/Pixel.tsc new file mode 100644 index 0000000..b63e968 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Pixel.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Plant.pxe b/res/jp/data/sprites_up/Stage/Plant.pxe new file mode 100644 index 0000000..2fe9f5b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Plant.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Plant.pxm b/res/jp/data/sprites_up/Stage/Plant.pxm new file mode 100644 index 0000000..2fe59c1 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Plant.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Plant.tsc b/res/jp/data/sprites_up/Stage/Plant.tsc new file mode 100644 index 0000000..26edcf3 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Plant.tsc @@ -0,0 +1,2 @@ +ƣڣǣڣȣڣɣڣʣڣˣڣ̣ڣͣڣΣڣϣڣƣǣˣ KrM? KrKSڣ̣!+x!!KrKSڣƣ GGcj}Z*ڣGb*$}b@b$$,jc,SUb'{&n^&-\^T裠TE]&j8jc8E^8vK&j8j&mS^}ףss""@iW\:KZףMD_$[Kr:}K8I88Gb*_c&j8jc#}?^8Tڣƣ&rA!Tڣǣ(,`_KW?~\"[(~IZ8ڣƣߣƣƣS?"WZ8ˣ,h%b{Ӷ$~_)S壠ڣƣ̣ + !Ӷ$~_)Sɣ#['{'b-c@ɶ'3<Sڣ \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Pole.pxe b/res/jp/data/sprites_up/Stage/Pole.pxe new file mode 100644 index 0000000..df67329 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Pole.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Pole.pxm b/res/jp/data/sprites_up/Stage/Pole.pxm new file mode 100644 index 0000000..e0b3f54 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Pole.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Pole.tsc b/res/jp/data/sprites_up/Stage/Pole.tsc new file mode 100644 index 0000000..f9bb55a Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Pole.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Pool.pxe b/res/jp/data/sprites_up/Stage/Pool.pxe new file mode 100644 index 0000000..86f833b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Pool.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Pool.pxm b/res/jp/data/sprites_up/Stage/Pool.pxm new file mode 100644 index 0000000..5501c2d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Pool.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Pool.tsc b/res/jp/data/sprites_up/Stage/Pool.tsc new file mode 100644 index 0000000..86598d4 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Pool.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Prefa1.pxe b/res/jp/data/sprites_up/Stage/Prefa1.pxe new file mode 100644 index 0000000..2de6026 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Prefa1.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Prefa1.pxm b/res/jp/data/sprites_up/Stage/Prefa1.pxm new file mode 100644 index 0000000..8c91db8 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Prefa1.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Prefa1.tsc b/res/jp/data/sprites_up/Stage/Prefa1.tsc new file mode 100644 index 0000000..ba4a1f9 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Prefa1.tsc @@ -0,0 +1,2 @@ +þײ˲Əþײ˲Əþײ˲Əþײ˲Əþײ˲Ə۾ҲײѲò۾ҲҲƏ۾N,"kľƏI_^9+ʾ̲Ծ Nbrw9kKO ur +\09k?aN,z@H(ilkľƾhCFON /rakľƾ3N utVOHNs rbCF /rak3HKJkľƾjGOG DGÏ"kxN, D@ľƾ,sG7^oJ1lP:O 0.7ÏhjXJHJk@m&ľƾя̲˲մ5(JJ1lP˲ƾƏ \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Prefa2.pxe b/res/jp/data/sprites_up/Stage/Prefa2.pxe new file mode 100644 index 0000000..1e0eba9 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Prefa2.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Prefa2.pxm b/res/jp/data/sprites_up/Stage/Prefa2.pxm new file mode 100644 index 0000000..674ad60 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Prefa2.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Prefa2.tsc b/res/jp/data/sprites_up/Stage/Prefa2.tsc new file mode 100644 index 0000000..12bedd3 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Prefa2.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~qls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S`a``=:lyl}wβl~tlu~t=:lq~`a``j````j```bl``aalvq```dlq``fbj``idj``gij``gc=:=:S`aa`=:lylvq`0`c=:lv|[aecalv|[aecdlv|[aee`=:lq``h`j``icj``agj```a=:=:=:=:=:=:S`b``=:lyl}w*=:ݲ߾κ rl~tls|* ٱxl~z````ls|=:lv|[aci`lv|[acialv|[acibls}````lvq```alqy`a``=:lq``g`j`ca`j`aahj``fb=:=:S`be`=:lyl}w=:ھҲl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Priso1.pxe b/res/jp/data/sprites_up/Stage/Priso1.pxe new file mode 100644 index 0000000..c28cec5 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Priso1.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Priso1.pxm b/res/jp/data/sprites_up/Stage/Priso1.pxm new file mode 100644 index 0000000..6cc6e54 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Priso1.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Priso1.tsc b/res/jp/data/sprites_up/Stage/Priso1.tsc new file mode 100644 index 0000000..eeda7f0 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Priso1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``bilvqy````lu~t=:S``ia=:l}~qls}``bilvqy```alu~t=:S``ib=:l}~qls}``bilvqy```blu~t=:S``ic=:l}~qls}``bilvqy```clu~t=:S``id=:l}~qls}``bilvqy```dlu~t=:=:S`a``=:l{ul``aalt~`a``lvq````lq0`efj``i`j``h`j```i=:S`aa`=:l{ul``aalt~`aa`lvq```alq``fbj``iaj```gj``gd=:=:S`b``=:lq~`b``j```bj```blu~t=:S`b`a=:lq~`b`aj```bj```blu~t=:S`b`b=:lq~`b`bj```bj```blu~t=:S`b`c=:lq~`b`cj```bj```blu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Priso2.pxe b/res/jp/data/sprites_up/Stage/Priso2.pxe new file mode 100644 index 0000000..31a9bcf Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Priso2.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Priso2.pxm b/res/jp/data/sprites_up/Stage/Priso2.pxm new file mode 100644 index 0000000..445c3cd Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Priso2.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Priso2.tsc b/res/jp/data/sprites_up/Stage/Priso2.tsc new file mode 100644 index 0000000..5ce497e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Priso2.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Prt0.png b/res/jp/data/sprites_up/Stage/Prt0.png new file mode 100644 index 0000000..65bc712 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Prt0.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtAlmond.png b/res/jp/data/sprites_up/Stage/PrtAlmond.png new file mode 100644 index 0000000..069c9fa Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtAlmond.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtBarr.png b/res/jp/data/sprites_up/Stage/PrtBarr.png new file mode 100644 index 0000000..fa91d4d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtBarr.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtCave.png b/res/jp/data/sprites_up/Stage/PrtCave.png new file mode 100644 index 0000000..bb163f5 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtCave.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtCent.png b/res/jp/data/sprites_up/Stage/PrtCent.png new file mode 100644 index 0000000..5f9b73c Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtCent.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtEggIn.png b/res/jp/data/sprites_up/Stage/PrtEggIn.png new file mode 100644 index 0000000..fb89e56 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtEggIn.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtEggX.png b/res/jp/data/sprites_up/Stage/PrtEggX.png new file mode 100644 index 0000000..e274d3a Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtEggX.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtEggs.png b/res/jp/data/sprites_up/Stage/PrtEggs.png new file mode 100644 index 0000000..b965f29 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtEggs.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtFall.png b/res/jp/data/sprites_up/Stage/PrtFall.png new file mode 100644 index 0000000..48b2276 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtFall.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtGard.png b/res/jp/data/sprites_up/Stage/PrtGard.png new file mode 100644 index 0000000..1fbf875 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtGard.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtHell.png b/res/jp/data/sprites_up/Stage/PrtHell.png new file mode 100644 index 0000000..d92e0c8 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtHell.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtJail.png b/res/jp/data/sprites_up/Stage/PrtJail.png new file mode 100644 index 0000000..45c9d31 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtJail.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtLabo.png b/res/jp/data/sprites_up/Stage/PrtLabo.png new file mode 100644 index 0000000..f83fe30 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtLabo.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtMaze.png b/res/jp/data/sprites_up/Stage/PrtMaze.png new file mode 100644 index 0000000..cddde32 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtMaze.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtMimi.png b/res/jp/data/sprites_up/Stage/PrtMimi.png new file mode 100644 index 0000000..daa3938 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtMimi.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtOside.png b/res/jp/data/sprites_up/Stage/PrtOside.png new file mode 100644 index 0000000..8ba100f Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtOside.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtPens.png b/res/jp/data/sprites_up/Stage/PrtPens.png new file mode 100644 index 0000000..a704505 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtPens.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtRiver.png b/res/jp/data/sprites_up/Stage/PrtRiver.png new file mode 100644 index 0000000..9a23a3c Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtRiver.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtSand.png b/res/jp/data/sprites_up/Stage/PrtSand.png new file mode 100644 index 0000000..5a67f0e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtSand.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtStore.png b/res/jp/data/sprites_up/Stage/PrtStore.png new file mode 100644 index 0000000..2bb86cf Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtStore.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtWeed.png b/res/jp/data/sprites_up/Stage/PrtWeed.png new file mode 100644 index 0000000..6a918f9 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtWeed.png differ diff --git a/res/jp/data/sprites_up/Stage/PrtWhite.png b/res/jp/data/sprites_up/Stage/PrtWhite.png new file mode 100644 index 0000000..a656e12 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/PrtWhite.png differ diff --git a/res/jp/data/sprites_up/Stage/Ring1.pxe b/res/jp/data/sprites_up/Stage/Ring1.pxe new file mode 100644 index 0000000..8fd0204 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ring1.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Ring1.pxm b/res/jp/data/sprites_up/Stage/Ring1.pxm new file mode 100644 index 0000000..8db7e4b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ring1.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Ring1.tsc b/res/jp/data/sprites_up/Stage/Ring1.tsc new file mode 100644 index 0000000..17c366a Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ring1.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Ring2.pxe b/res/jp/data/sprites_up/Stage/Ring2.pxe new file mode 100644 index 0000000..eeb4591 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ring2.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Ring2.pxm b/res/jp/data/sprites_up/Stage/Ring2.pxm new file mode 100644 index 0000000..2af8376 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ring2.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Ring2.tsc b/res/jp/data/sprites_up/Stage/Ring2.tsc new file mode 100644 index 0000000..9c51f51 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Ring2.tsc @@ -0,0 +1,3 @@ +S``i`=:l{ul}~qls}``c`lvqy````lu~t=:S``ia=:l{ul}r```blqy```bly=:l}~qls}``c`lvqy```alu~t=:S``ib=:l{ul}~qls}``c`lvqy```blu~t=:S``ic=:l{ulv|zacdaj``iilv|zabg`j``ih=:l}~qls}``c`lvqy```clu~t=:S``id=:l{ul}~qls}``c`lvqy```dlu~t=:=:S``ih=:l{u=:ls}```cj``acj``ba=:ls}```cj```ij``ba=:ls}```cj```fj``ba=:ls}```cj```cj``ba=:ls}```cj````j````=:l}~qls}``c`lvqy```clu~t=:=:S``ii=:l{u=:ls}```cj```ij``ba=:ls}```cj```fj``ba=:ls}```cj```cj``ba=:ls}``ahlvqy```clu~t=:=:=:=:S`a``=:lylvq```clq``fdj``icj```cj```a=:S`aa`=:lylvq```al}t```blq``fhj``iaj```cj``ad=:=:S`b``=:l{u=:lv|zabgbj`b`d=:lv|zabg`j`b`b=:lv|zabgaj`b`al}w=:бqҲٲrl~tlv|za`b`j`b`els| Ų߲Ǹݲxl~tlu~t=:S`b`a=:lyl}w=:ڲ!yl~tlu~t=:S`b`b=:l{ul}wrl~tls|sûsڲrl~tls|=:xl~tls|бrrl~t=:вq{߲=:ƫƲ!xl~t=: q +Ҳ߲rl~t=:ҲҲrl~tls|=:lv|[abgblu~t=:S`b`c=:S`b`d=:l{ul}wвݲҲrl~t=: ljq ұrl~tlv|zabgdj````lv|[abgdls|=:uñl~tls|=:lq~`be`j``a`j```e=:lq~`beaj``a`j```e=:lq~`bebj``a`j```e=:lq~`becj``a`j```e=:lq~`bedj``a`j```e=:lq~`beej``a`j```e=:lu~t=:S`b`e=:l{ul}w!zu=: +Ҳrl~tlu~t=:=:S`ba`=:lylv|zabg`j`bab=:lv|zabgaj`baa=:l}w~ŬҲrl~t=:ٲȃ޲,rl~t=:Ҳ!ٲϱrl~tlu~t=:S`baa=:lyl}w=:ǍDŽrl~tlu~t=:S`bab=:lyl}wٲٲ!yl~tlu~t=:=:S`bb`=:lylv|zabg`j`bbb=:lv|zabgaj`bba=:l}wбql~t~Ҳٲuuurl~tlu~t=:S`bba=:lyl}w=:Ҽyl~tlu~t=:S`bbb=:l{ul}wƜֲxl~t=:~z} ݲl~tlv|za`b`j`bbcls| вҲҲl~tls|=:~۲ê!l~tlu~t=:S`bbc=:l{ul}w=:!{yyl~tlu~t=:=:S`be`=:S0bea=:S`beb=:S`bec=:S`bed=:S`bee=:=:S`d``=:S`d`a=:=:S`da`=:l{ulv~`da`j``aflq~`da`j`e``j```dlqy``e`=:ls}````l}cܲвϱyl}r`da`l~tls|ﱓlqy``b`ﱓlqy``b`ls|=:ƌƲyyyl~tls|=:lqy``e`ls~`db`j`bfgj```dlqy`a``=:lv}``af=:lq~`db`j```gj```dlr|`db`lt~`da`lv|]abg`ls}``calu~t=:=:S`db`=:l{ulv~`db`j``aflv|[abg`=:lq~`db`j`e``j```dlqy`a``=:l}c{pyyl}r`db`l~tls|=:lq~`db`j`ea`j```dlqy`de`ls}``ae=:lv}``aflq~`db`j`eb`j````l}c=:~ ìylqy`ad`l~tls}````ls|=:lv~`de`j``aflqy``e`=:ls}```cj```ij``bal``ablqy``b`=:ls}```cj```fj``bal``ablqy``b`=:ls}```cj```cj``bal``ablqy``b`=:ls}```cj````j````l``ablqy``b`=:lqy``e`=:lv}``afls}``c`lt~`db`lu~t=:S`de`=:=:=:S`e``=:l{ult~`e``l{z```aj`e`al{[```aluu`e`b=:S`e`a=:l{ulqluu`e`b=:S`e`b=:ls}``agl}t```b=:ls}```cj``acj``ba=:l}clvqs``balq~`d``j``a`j````l~tls|=:Ҳܲrl~tls|lvqs````=:lqy``b`lq~`d``j``b`j````lqy``c`=:l}clvqs``baҹ úǎ=:{ƌl~t=:&€rl~tls|ҹq=:& Č (ۿ=:ؾ߲l~tls|۲ Ě#ؾ=: Ҳrl~tls| ̲Ҳ=:󿛲ܼ'rl~t=:ڲl~tls|lvqs````=:lqy``b`lt~`d`alq~`d``j``d`j````lqy``b`=:l}clvqs``baҼrlqy``c`l~tls|=:Ҽql~t=:|(rl~tls|lq~`d``j``e`j````~~~l~tls|ұyl~tls|=:~ڲٲٱxyl~t=: ҲԱxyl~tls|l~tls|=:Աyyl~tls|=:ls~`da`j`bfcj````lqy```e=:lq~`da`j```bj````lqy``e`=:ls}```cj``acj``balt~`d``=:lv|]abg`lv|[abgalqy``e`lr|`da`ls}```glu~t=:=:S`e`a=:l{ult~`e``ls}``agl}t```b=:ls}```cj``acj``ba=:lt~`d`alq~`d``j``d`j````=:ls~`da`j`bfcj````lqy```e=:lq~`da`j```bj````lqy``e`=:ls}```cj``acj``balt~`d``=:lv|]abg`lv|[abgalqy``e`lr|`da`ls}```glu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Ring3.pxe b/res/jp/data/sprites_up/Stage/Ring3.pxe new file mode 100644 index 0000000..9c5be83 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ring3.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Ring3.pxm b/res/jp/data/sprites_up/Stage/Ring3.pxm new file mode 100644 index 0000000..6c8b902 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ring3.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Ring3.tsc b/res/jp/data/sprites_up/Stage/Ring3.tsc new file mode 100644 index 0000000..25f4936 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Ring3.tsc differ diff --git a/res/jp/data/sprites_up/Stage/River.pxa b/res/jp/data/sprites_up/Stage/River.pxa new file mode 100644 index 0000000..6a5bdef Binary files /dev/null and b/res/jp/data/sprites_up/Stage/River.pxa differ diff --git a/res/jp/data/sprites_up/Stage/River.pxe b/res/jp/data/sprites_up/Stage/River.pxe new file mode 100644 index 0000000..1ccf3cc Binary files /dev/null and b/res/jp/data/sprites_up/Stage/River.pxe differ diff --git a/res/jp/data/sprites_up/Stage/River.pxm b/res/jp/data/sprites_up/Stage/River.pxm new file mode 100644 index 0000000..26b9dfa Binary files /dev/null and b/res/jp/data/sprites_up/Stage/River.pxm differ diff --git a/res/jp/data/sprites_up/Stage/River.tsc b/res/jp/data/sprites_up/Stage/River.tsc new file mode 100644 index 0000000..181ec47 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/River.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFMW_::=BF]]]:>::FPKS::::FOXN-::C;FWXKFMW_::=BF]]]:>::FPKS:::;FOXN-::C<FWXKFMW_::=BF]]]:>::FPKS:::::FPKS:::=FOXN-::C>FWXKFMW_::=BF]]]:>::FPKS:::>FOXN-::C?FMW_::=BFPKS::::FOXN-:;::FUOcFPKY:::;FM]]F^\K::>AD::C;D:::BD:::C-:;;:FUOcFPYX:<::D::;@FaKS::;:FPKY::::FPYW::;@FPVT:B?:D:;;; +FPV5:B?:FW]QnjSSFXYNFWcN::::F^\K::=;D::CD:::;-:;;@-:;<:FUOcFKXZ:;<:D::::D:::FM]]F^\K::A=D::C>D:::@D:::C-:<::-:<<:FUOcFNXZ:<<:FPVT;>>>D::::FPVT:B=@D:<<;FOXN-:<<;FZ\SFaKS::::FUOcFPV5:B?;FaK]FaKS::?:FZ\SFW]QTee֚ǞǓˌNjmFXYNFOXN \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Sand.pxa b/res/jp/data/sprites_up/Stage/Sand.pxa new file mode 100644 index 0000000..31ad7e0 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Sand.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Sand.pxe b/res/jp/data/sprites_up/Stage/Sand.pxe new file mode 100644 index 0000000..f57a5ae Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Sand.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Sand.pxm b/res/jp/data/sprites_up/Stage/Sand.pxm new file mode 100644 index 0000000..4a2265d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Sand.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Sand.tsc b/res/jp/data/sprites_up/Stage/Sand.tsc new file mode 100644 index 0000000..65a163f --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Sand.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```flvqy````lu~t=:S``ia=:l}~qls}```flvqy```alu~t=:S``ib=:l}~qls}```flvqy```blu~t=:S``ic=:l}~qls}```flvqy```clu~t=:S``id=:l}~qls}```flvqy```dlu~t=:=:S``ii=:l{ul}~qls}```f=:lq~`a``j```aj````lvqy```d=:ls~`c`aj`aabj```blqy`a``=:lq~`a``j````j````=:l}t````lt~`c`al}slu~t=:=:S`a``=:l{ul}wq۲ ٱxl~z````ls|=:ls~`c``j`aaaj```blx}slqy``f`lq~`a``j```aj````=:lqy`a``lvq```dlq```aj``iij```ej```h=:=:l{uls~`c``j`aaaj```blx}slqy``f`lq~`a``j```aj````=:lqy`a``lvq```dlq``ahj``iij``aej``a`=:lqy`a``lvq```dlq```aj``iij```ej```h=:=:S`a`a=:lyl``aalt~`a`alvq````lq``bij``i`j``ahj```i=:=:lv|z`ef`j`a`b=:S`a`b=:lyl``aalt~`a`alvq````lq``caj``i`j``ahj```i=:=:S`a`c=:lyl``aalt~`a`clvq```dlv|z`bh`j`a`elq``ccj``idj``abj``a`=:=:S`a`d=:lylvq```dlq``cdj``idj```ej``ab=:=:S`a`e=:lylq``cfj``idj``abj``a`=:=:S`a`f=:lylvq```dlq```ij``idj```cj``ei=:=:=:S`ae`=:lyl}wl=:vózl~tlu~t=:=:S`aea=:lyl}wl=:Pl~tlu~t=:=:=:=:S`b``=:l{ul{z```gj`b`al{[```gluu`b`b=:S`b`a=:lqluu`b`b=:S`b`b=:l{ul}t```blt~`b``lv}lv~`b`aj``aflqy`a``=:l}c=:ݲڲls}````l~tls|=:ls~`b`fj``fgj````lqy``a`lqy``i`=:lq~`b`fj``acj````=:l}clvqs``ae=:!l~tls|sԲҲٱrl~t=:ٲ!Ǹ=:ٲҲrl~tls|=:lvqs``af Բٱxl~tls|lvqs````=:lq``e`lqy``b`=:l}c=:xylqy``e`l~tls|lvqs``aeھ ݲ =:ٲrl~tls|lq~`b`fj``b`j````=:lrq``b`ls}```glr|````=:l}`ba`j``a`l}`ba`j``aalu~t=:S`b`a=:S`b`b=:S`b`c=:S`b`d=:S`b`e=:S`b`f=:=:=:=:S`ba`=:l{ulqy`be`ls}````=:l}cls}``ae=:y{ ìylqy`af`l~tls|Ǫ$Ҳڹ ߲rl~tls|=:lv}``afls}```f=:l}`ba`j``a`l}`ba`j``aalu~t=:lu~t=:=:S`bb`=:lv|z`bgbj`bbalu~t=:S`bba=:l{ult~`bb`l}t````lqy``e`=:lq~`b`bj``a`j````lqy``dd=:lq~`b`cj``a`j```blqy0abh=:lt~`b`blt~`b`clv|[`bgclu~t=:=:S`bc`=:lv|z`fb`j`bcc=:lv|z`bghj`bcb=:lyl}wz}ڲٲٲҲl~tlu~t=:=:S`bca=:lqy``e`=:lq~`b`dj``a`j````lqy```h=:lq~`b`ej``a`j```blqy`abh=:lt~`b`dlt~`b`eluu`bcb=:S`bcb=:lylvq```dlq``cej`e``j```ej```i=:S`bcc=:lylvq```dlq``cej``idj```ej```i=:=:S`c``=:S`c`a=:S`ca`=:=:S`cb`=:l{ult~`cb`ls}````l}t````lqy``e`=:lq~`ca`j```aj```bl}wlvqs``be=:yyl~tls|=:lq~`ca`j```cj````lqy`ae`=:lt~`ca`l}lu~t=:=:S`cd`=:lv|z`eicj`cdalu~t=:S`cda=:lv|z`bgdj`cdblu~t=:S`cdb=:lv|[`bh`lt~`cd`lu~t=:=:=:=:S`ce`=:lyl}w$ҲڲٲٲҲl~tlu~t=:=:S`cf`=:lyl}wlRRq=:߲ڲҲݲвq=:~Ť߲Ҳrl~tlu~t=:=:S`d`a=:lyl}wʲʲʲʱl~tlyz``adj`da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d`aj`acfj````lv|[`bgelwya`adly[``admҲmP ,rl~tlv|[`bgdls|=:lv|]c```lv|]c``alv|]c``blv|]c``clv|[c``d=:lu~t=:S`d`b=:lyl}wl`a`eñyl~tlyz``adj`da`ls|qҲ۲ ٱxl~z````ls|=:ls~`d`bj`acfj````lv|[`bgflwya`adly[``admҲmP ,rl~tlv|[`bgdls|=:lv|]c```lv|]c``alv|]c``blv|[c``clv|]c``d=:lu~t=:S`da`=:lyl}wsͲrl~tlu~t=:S`daa=:lt~`daalu~t=:S`dab=:lyl``bbls~`dabj``baj````=:l}w#в z߲rl~tlwya`adls~`dabj`ac`j````ls|=:Ҳl~tlyz``adj`dacls|=:ls~`dabj`acfj````lv|[`bgilwya`adly[``adls}``a`mҲmP ,rlqy`af`l~tl}ls|=:lv|]c```lv|[c``alv|]c``blv|]c``clv|]c``d=:lv|[`bgdlu~t=:S`dac=:lyl}wsͲrl~tls~`dabj``aej````lu~t=:=:=:=:S`e``=:lylt~`e``l``bbls}``af=:l}wlwya``fmszmP ,ylqy`af`l~tl}l}|[```e=:PePͲֲyl~tlu~t=:=:S`e`a=:lylt~`e`al``bbls}``af=:l}wlwya``fmszmP ,ylqy`af`l~tl}l}|[```e=:PePͲֲyl~tlu~t=:=:=:Sab``=:l{ulq~ab``j``b`j```a=:lv~ab``j``aflvqy```a=:lqy`a``lvq```alq``cijab``j``faj``ab=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/SandE.pxe b/res/jp/data/sprites_up/Stage/SandE.pxe new file mode 100644 index 0000000..c9cb423 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/SandE.pxe differ diff --git a/res/jp/data/sprites_up/Stage/SandE.pxm b/res/jp/data/sprites_up/Stage/SandE.pxm new file mode 100644 index 0000000..2084edc Binary files /dev/null and b/res/jp/data/sprites_up/Stage/SandE.pxm differ diff --git a/res/jp/data/sprites_up/Stage/SandE.tsc b/res/jp/data/sprites_up/Stage/SandE.tsc new file mode 100644 index 0000000..9d32635 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/SandE.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Santa.pxe b/res/jp/data/sprites_up/Stage/Santa.pxe new file mode 100644 index 0000000..ceaff1f Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Santa.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Santa.pxm b/res/jp/data/sprites_up/Stage/Santa.pxm new file mode 100644 index 0000000..e79422a Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Santa.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Santa.tsc b/res/jp/data/sprites_up/Stage/Santa.tsc new file mode 100644 index 0000000..9c18c0e --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Santa.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```blvqy````lu~t=:S``ia=:l}~qls}```blvqy```alu~t=:S``ib=:l}~qls}```blvqy```blu~t=:S``ic=:l}~qls}```blvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```blvqy```dlu~t=:=:S``ii=:ls}``bhlvqy```dlu~t=:=:S`a``=:lyl``aalt~`a``lvq```dlq```fj``idj```dj``ab=:=:=:=:S`ab`=:l{ul}wlٲr=:w־qǦ½yl~tlu~t=:=:=:S`c``=:lyz```hj`c`a=:l{ul}wl~tlv|z`bdbj````=:‰ĂֲҲrl~tlu~t=:S`c`a=:l{ulwya``hl}wm~mP Ҳ ٱxl~z````ls|lwy````=:ly]```hlq~`c``j``a`j````lqy``c`lv|z`bdbj`c`blv|[`bdb=:l}wt¶ٲвl~tls|lwya`ably[``ab=:ls}``a`m‰mP ,rlqy`af`l~tls|l}lt~`c``lu~t=:=:S`c`b=:l{ult~`c`0lu~t=:=:=:S`e``=:lv|z`bbfj`e`f=:lv|z`bdbj`e`e=:lv|z`dhdj`e`d=:lv|z`bdaj`e`c=:lv|z`bd`j`e`b=:l{ulv|[`bd`l}w۲вڲԱrl~t=: вrl~tlwy```clq}[```cj````ls|=:ls}``a`mpsqmP ,rlqy`af`l~tl}lwy````ls| „xl~t=:ٲҲprl~t=:̲ݲ!q=:—v Ҳl~tlv|[`bdalu~t=:S`e`c=:l{ul}w—v q=:~ž߲rl~tlu~t=:S`e`d=:l{ul}wm‰mPǮҲxl~t=:—vв‰q=:ͲҲҲҲrl~tlu~t=:S`e`e=:l{ul}w‰!qԲxl~tlu~t=:S`e`f=:l{ul}w۹ٲٲڲrl~t=:ٲ}qql~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Shelt.pxa b/res/jp/data/sprites_up/Stage/Shelt.pxa new file mode 100644 index 0000000..5397cc4 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Shelt.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Shelt.pxe b/res/jp/data/sprites_up/Stage/Shelt.pxe new file mode 100644 index 0000000..8d7c612 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Shelt.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Shelt.pxm b/res/jp/data/sprites_up/Stage/Shelt.pxm new file mode 100644 index 0000000..a5e4f80 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Shelt.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Shelt.tsc b/res/jp/data/sprites_up/Stage/Shelt.tsc new file mode 100644 index 0000000..33cfd9e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Shelt.tsc differ diff --git a/res/jp/data/sprites_up/Stage/Start.pxe b/res/jp/data/sprites_up/Stage/Start.pxe new file mode 100644 index 0000000..1e03cc2 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Start.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Start.pxm b/res/jp/data/sprites_up/Stage/Start.pxm new file mode 100644 index 0000000..b6ba11b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Start.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Start.tsc b/res/jp/data/sprites_up/Stage/Start.tsc new file mode 100644 index 0000000..3f627e4 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Start.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:S`a``=:lyls~0a``j````j````=:l``aalvq```a=:lq``abj``iaj``cgj``aa=:=:=:S`b``=:l{ul{z```ej``ialyls}````l}w=:~ٲ}ֲl~tls|lv|[`dc`lq``ahj`e``j```bj````=:=:=:Sa```=:lu~t=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Statue.pxe b/res/jp/data/sprites_up/Stage/Statue.pxe new file mode 100644 index 0000000..4bb689c Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Statue.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Statue.pxm b/res/jp/data/sprites_up/Stage/Statue.pxm new file mode 100644 index 0000000..8474794 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Statue.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Statue.tsc b/res/jp/data/sprites_up/Stage/Statue.tsc new file mode 100644 index 0000000..fc82012 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Statue.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}````lvqy````lu~t=:S``ia=:l}~qls}````lvqy```alu~t=:S``ib=:l}~q=:lq~`b``j````j``d`=:lq~`b`aj````j``c`=:lq~`b`bj````j``b`=:lv|zaecdj``ie=:lq~`b`cj````j````=:ls}````lvqy```blu~t=:S``ic=:l}~qls}````lvqy```clu~t=:S``id=:l}~qls}````lvqy```dlu~t=:=:S``ie=:lq~`b`cj````j``a`lqy```a=:lq~`b``j``a`j``d`=:lq~`b`aj``a`j``c`=:lq~`b`bj``a`j``b`=:lq~`b`cj``a`j``a`=:lvqy```blu~t=:=:=:S`a``=:l{ul``aalq~`a``j````j```b=:lvq````lv|zaecdj`a`a=:ls}``bdlq``hdj``i`j``aij``ba=:S`a`a=:lq`0hej``ifj``aij``ba=:=:S`b``=:S`b`a=:S`b`b=:S`b`c=:=:S`ba`=:l{ulv|zaei`j`bb`l}wl=:tl~tlu~t=:S`baa=:l{ulv|zaeiaj`bbal}wl=:tqól~tlu~t=:S`bab=:l{ulv|zaeibj`bbbl}wl=:tq|l~tlu~t=:S`bac=:l{ulv|zaeicj`bbcl}wl=:tPl~tlu~t=:=:S`bb`=:l{ul}wl=:t~xl~tlu~t=:S`bba=:l{ul}wl=:tl~tlu~t=:S`bbb=:l{ul}wl=:t|ól~tlu~t=:S`bbc=:l{ul}wl=:tzsl~tlu~t=:=:=:S`c``=:l{ul}wuuurl~tlu~t=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Store.pxa b/res/jp/data/sprites_up/Stage/Store.pxa new file mode 100644 index 0000000..df5d94d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Store.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Stream.pxe b/res/jp/data/sprites_up/Stage/Stream.pxe new file mode 100644 index 0000000..3484411 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Stream.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Stream.pxm b/res/jp/data/sprites_up/Stage/Stream.pxm new file mode 100644 index 0000000..9f85eb3 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Stream.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Stream.tsc b/res/jp/data/sprites_up/Stage/Stream.tsc new file mode 100644 index 0000000..645dbd8 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Stream.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_xqlSSST_p|gSSSU_idlSSSU_evoSSSS_hqg0-FSS\V0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_xqlSSST_p|gSSSS_idlSSSW_hqg0-0-FSS\X0-_fpxSSUV_idlSSSS_hqg0-0-FSTSS0-_nh|_idrSSST_fvv_wudSSWZ]SS\T]SSS[]SSS\0-0-FSUSS0-#SUTS0-0-0-FTSSS0-_nh|_erdTSSS0-_dqsSUSS]SSTS]SSSS0-_dqsSUTS]SSTS]SSSS0-_zdlSVSS_idrSSSU0-_xqlSSSS_fvv_hyhTSST0-0-FTSST0-_lwmSST[]TSTS_ioNSTYS_hyhTSSU0-0-FTSSU0-_fpxSSSS_iomS[VY]TSSV_hyhTSTS0-0-FTSSV0-_ioPS[VY_iomS[XT]TSTS_ioNTSWU0-_hyhTSTS0-0-FTSTS0-_qfmSVVY]TSTT0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0-FTSTT0-_lwNSSVY0-_wudSSTX]SWTS]SSTY]SSTU_hqg0-0- \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/Weed.pxa b/res/jp/data/sprites_up/Stage/Weed.pxa new file mode 100644 index 0000000..303184c Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Weed.pxa differ diff --git a/res/jp/data/sprites_up/Stage/Weed.pxe b/res/jp/data/sprites_up/Stage/Weed.pxe new file mode 100644 index 0000000..d28877e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Weed.pxe differ diff --git a/res/jp/data/sprites_up/Stage/Weed.pxm b/res/jp/data/sprites_up/Stage/Weed.pxm new file mode 100644 index 0000000..6e3e85d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/Weed.pxm differ diff --git a/res/jp/data/sprites_up/Stage/Weed.tsc b/res/jp/data/sprites_up/Stage/Weed.tsc new file mode 100644 index 0000000..e43f30f --- /dev/null +++ b/res/jp/data/sprites_up/Stage/Weed.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```elvqy````lu~t=:S``ia=:l}~qls}```elvqy```alu~t=:S``ib=:l}~qls}```elvqy```blu~t=:S``ic=:l}~qls}```elvqy```clu~t=:S``id=:l}~qls}```elvqy```dlu~t=:=:S``ih=:l{ul}~qls}```elv|[`bbd=:lq~`a``j```aj````lvqy```d=:ls~`d`aj`aabj```blqy`a``=:lq~`a``j````j````=:l}t```bl}slt~`d`alu~t=:=:=:S``ii=:l{ul}~qls}```e=:lq~``iij``a`j````=:lvqy```dlqy``g`=:lq~``iij````j````lqy``c`lu~t=:=:=:S`a``=:l{ul}wq۲ ٱxlv|]`bbgl~z````ls|=:ls~`d``j`aaaj```blx}slqy``f`lq~`a``j```aj````=:lqy`a``lvq```dlv|z`baij`ac`lq```aj``iij```ej```h=:=:S`a`a=:lylv|]`bbglv|z`babj`a`bl}wz}ڲٲٲҲrl~tlu~t=:S`a`b=:lyl``aalt~`a`alvq```dlq```gj``idj``aej```h=:S`a`c=:lyl``aalt~`a`clvq```dlq```hj``idj```ij``aa=:=:S`a`d=:ly=:lv|z`badj`a`f=:lyz```ij`a`e=:l}wz}ڲٲٲҲrl~tlu~t=:S`a`e=:l``bbl}wlwya``imz}mP rl~tls|=:lwy````lv|[`badluu`a`f=:S`a`f=:lyl``aalt~`a`dlvq```dlq``bej``idj``afj```g=:=:=:S`a`g=:lyl``aalt~`a`glvq```dlq``bfj``idj``a`j```g=:S`a`h=:lyl``aalt~`a`hlvq```dlq``bgj``idj``a`j```i=:=:=:S`a`i=:ly=:lv|z`bbbj`aaa=:lyz``a`j`aa`=:l}wz}ڲٲٲҲԲrl~t=:{ٲҲrl~tlu~t=:S`aa`=:l``bbl}wlwya`a`m{z}mP rl~tls|=:lwy````lv|[`bbbluu`aaa=:S`aaa=:lyl``aalt~`a`ilvq```dlq``bhj``idj```fj``ac=:=:S`aab=:lylvq```dlq``ahj``idj```fj``a`=:=:S`aac=:lyl``aalt~`aaclvq```dlq``c`j``idj```gj```i=:=:=:=:S`aba=:lyl}wl=:ól~tlu~t=:S`abc=:lyl}wl=:Ô걦l~tlu~t=:=:S`ac`=:l{ulv|]`cbilv|]`bail}t```blq``aaj`db`j``bdj``bi=:=:=:=:S`b``=:lylt~`b``lv|[`ba`=:ls}``a`lwya``cly[```cl}w=:móz}mP ,rlqy`af`l~tls|=:lwy````l}lu~t=:=:S`b`a=:lylv|z`bbhj`b`glv|[`bbhl}wزrl~tls|~žҲٱrl~t=:Կy!Ҳxl~tls| вҲҲrl~tls|luu`b`g=:=:=:S`b`b=:lyz```hj`b`dl~sz``idj`b`c=:lyl``bbls~`b`bj``baj````=:l}w#в z߲rl~tlwya``hly[```hls|=:ls}``a`m~mP ,rlqy`af`l~tlt~`b`bl}lu~t=:S`b`c=:l``gbls~`b`bj``aej```blu~t=:S`b`d=:ls~`b`bj```aj````lu~t=:=:S`b`e=:lv|z`dhaj`b`f=:lyl}wǻpľ Ҳrl~t=:~ٲڲÔ !rl~t=:޲ٲٲÔ „rl~tlu~t=:S`b`f=:lyl}wҲҲ ֲԱrl~tls|óò ϲ =:ǻp"ql~t=:ݿڲ!rl~tlu~t=:=:S`b`g=:lyl}w!=:~s ߲rl~t=:ղ Ҳrl~tlu~t=:=:S`ba`=:lyl}wzÍs~=:㾓Ҳl~tlu~t=:=:S`bb`=:lyz``acj`be`=:lv|z`bbaj`bd`=:lv|z`dhdj`bci=:lv|z`baej`bcd=:lyl}wzٲұl~tls|=:ls~`bc`j`a`fj````l}t```blu~t=:S`bc`=:lv|z`bbaj`bcg=:lv|z`dhdj`bcf=:lv|z`bbcj`bce=:lv|z`bafj`bcc=:lv|z`baej`bcb=:lyl}w۲ ,Բ~ٲҲl~tls| Ͳ~rl~t=:ٲҲ!߲q=:ݲҲٱxl~z`bcals|=:вڲԱyl~tls| #߾ݲrl~tlwya``ily[```ilv|[`baels|=:ls}`0a`mz}mP #߾rlqy`af`l~tl}ls|Ĺ޲¶Ǿ!rl~t=:ݲrl~tlu~t=:S`bca=:lyl}wбqԱl~t=:l~tlu~t=:S`bcb=:lyl}wǺrl~t=: в߲ݲrl~tlu~t=:S`bcc=:lyl}wֱxl~tz}Ҳٱxyl~t=: Ҳl~tls|uuurl~tlv|[`bbcluu`bce=:=:S`bcd=:lylv|[`bafl}w޼ұrl~t=:ԲҲԲrl~tlu~t=:S`bce=:lyl}w޼Ҳq=:#ٲҲl~t=:ٲҲ+pl~tlu~t=:=:S`bcf=:lyl}wֱq• xl~tls|=:ql~t=: „ٱrl~tls|uuurl~tls|{xl~t=: rl~tls|lqy`a``=:l}w#߾ݲrl~tlwya`a`ly[``a`lv|[`bbals|=:ls}``a`m{z}mP #߾rlqy`af`l~tl}ls|ٲ߲в!rl~t=:{Ҳвrl~t=:۲вrl~t=:Ǻr~yl~tlu~t=:S`bcg=:lyl}w•Ǹٱxl~tlu~t=:=:=:S`bci=:lyl}w賄ҲҲl~tls|=:ls~`bc`j`a`fj````l}t```blu~t=:S`bd`=:lyl}w賄ҲҲl~tlu~t=:=:S`be`=:lylv|[`ebalv|[`ebbly]``ac=:l}wlwya`acm•mP rl~tls|=:lvq```dlq``ahj`b``j```fj````=:=:=:S`c`b=:lylv|z`bahj```alv|[`bah=:l``bbls~`c`bj``baj````=:l}w#в z߲rl~tluu``c`=:=:S`c`e=:lylt~`c`el``bbls}``af=:l}wlwya``fmszmP ,ylqy`af`l~tl}l}|[```e=:PePͲֲyl~tlu~t=:=:S`d``=:S`d`a=:=:S`de`=:lyl}ws~Բٱxl~tlu~t=:S`dea=:S`deb=:=:S`e``=:ly=:lv|z`baaj`e`a=:lv|[`baa=:l}wбql~t=:Ɯórl~tls| ݲ q=:órl~t=:ֲq۲!߲q=:z} Ǿ rl~tls|ڲ,ұrl~tlu~t=:S`e`a=:lyl}wz}Ҳ,ұl~t=:ԲԱl~tlu~t=:=:=:S`e`b=:lyz```cj`e`clu~t=:S`e`c=:l{ulv|[`babl}}`l}t````lqy``c`ly=:l}wбql~tls|Ɯz}yl~tly]```clwya``cls|=:móz}mP Þrl~tlwy````ls|вڲԱyl~tls|=:l{ulq~`e``j```cj````lqy`agflq~`e``j````j```b=:l``aals~`a`aj````j````lqy``a`=:lyl}wٲuǸrl~t=:ҲҲвrl~tls|l{u=:lq~`e``j```ej```blqy``a`lt~`e``=:l``aals~`a`aj``ahj````lt~`e`bl``bclu~t=:=:S`f``=:l{ulv|[`bails}````lvqy```dl}t```b=:l}wlvqs``a`rl~tls|lvqs````=:lq~`debj````j````lqy``a`=:l}wlvqs``ahz~rl~tlqy``a`lq~`deaj````j```bls|lvqs``a`ұxl~tls|lvqs````=:lvqs````lqy``a`lq~`debj````j```blv~`de`j``aflqy``e`=:l}wlvqs``ah۲ٱxl~tls|lvqs````=:lq~`deaj```cj```blqy``d`=:lq~`debj```cj```blqy``d`=:lq~`deaj```ej````lqy``cf=:lq~`debj````j````lqy``e`=:lq~`deaj````j```b=:l}wlvqs``a`Ҳ߲Բrl~tls|lvqs````=:lq~`deaj```ej````=:lq~`debj```ej````lqy``b`=:lq~`de`j``a`j````lt~`dealt~`deblqy``c`=:lq~`de`j``b`j````lqy``f`lv}``afl}r````=:lqy`b``l}w !ղֱֲֲֲyylqy``e`l~tls}```e=:lt~`de`lv|]`ebclv|[`bbelu~t=:=:=:Sab``=:l{ulq~ab``j``b`j```b=:lv~ab``j``aflvqy```a=:lqy`a``lvq```alq``a`jab``j``e`j``cd=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/WeedB.pxe b/res/jp/data/sprites_up/Stage/WeedB.pxe new file mode 100644 index 0000000..b2a1ca6 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/WeedB.pxe differ diff --git a/res/jp/data/sprites_up/Stage/WeedB.pxm b/res/jp/data/sprites_up/Stage/WeedB.pxm new file mode 100644 index 0000000..d5dcf5b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/WeedB.pxm differ diff --git a/res/jp/data/sprites_up/Stage/WeedB.tsc b/res/jp/data/sprites_up/Stage/WeedB.tsc new file mode 100644 index 0000000..cb5ea63 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/WeedB.tsc @@ -0,0 +1 @@ +ǤۤȤۤɤۤʤۤˤۤǤΤǤۤȤ'k9 kh~A%V[9ۤɤ T@"+ANۤʤ Tw_9ۤǤǤǤ,+7!FTǤɤۤ \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/WeedD.pxe b/res/jp/data/sprites_up/Stage/WeedD.pxe new file mode 100644 index 0000000..1807ed7 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/WeedD.pxe differ diff --git a/res/jp/data/sprites_up/Stage/WeedD.pxm b/res/jp/data/sprites_up/Stage/WeedD.pxm new file mode 100644 index 0000000..3d5bab0 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/WeedD.pxm differ diff --git a/res/jp/data/sprites_up/Stage/WeedD.tsc b/res/jp/data/sprites_up/Stage/WeedD.tsc new file mode 100644 index 0000000..0b59058 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/WeedD.tsc @@ -0,0 +1 @@ +>;Taaja>;m~rmt~aaaamwrzaaaamvu>;Taajb>;m~rmt~aaaamwrzaaabmvu>;Taajc>;m~rmt~aaaamwrzaaacmvu>;Taajd>;m~rmt~aaaamwrzaaadmvu>;Taaje>;m~rmt~aaaamwrzaaaemvu>;>;Tabaa>;mzmaa1bmuabaamwraaaemraaagkaajekacddkaabh>;>;>;Tadae>;mzmuadaemaaccmt~aabg>;m~xmxzbaagnt{nQ!-zmrzabgamum~m~}\aaaf>;QfQγ׳zmumvu>;>; \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/WeedS.pxe b/res/jp/data/sprites_up/Stage/WeedS.pxe new file mode 100644 index 0000000..62e54d8 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/WeedS.pxe differ diff --git a/res/jp/data/sprites_up/Stage/WeedS.pxm b/res/jp/data/sprites_up/Stage/WeedS.pxm new file mode 100644 index 0000000..06b6f79 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/WeedS.pxm differ diff --git a/res/jp/data/sprites_up/Stage/WeedS.tsc b/res/jp/data/sprites_up/Stage/WeedS.tsc new file mode 100644 index 0000000..f08a0db --- /dev/null +++ b/res/jp/data/sprites_up/Stage/WeedS.tsc @@ -0,0 +1 @@ +b_xb_b_xb_b_xb_b_xb_Ub_xb_b_b_xb_b_b_ \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/White.pxa b/res/jp/data/sprites_up/Stage/White.pxa new file mode 100644 index 0000000..381e014 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/White.pxa differ diff --git a/res/jp/data/sprites_up/Stage/e_Blcn.pxe b/res/jp/data/sprites_up/Stage/e_Blcn.pxe new file mode 100644 index 0000000..6457e91 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Blcn.pxe differ diff --git a/res/jp/data/sprites_up/Stage/e_Blcn.pxm b/res/jp/data/sprites_up/Stage/e_Blcn.pxm new file mode 100644 index 0000000..679c35a Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Blcn.pxm differ diff --git a/res/jp/data/sprites_up/Stage/e_Blcn.tsc b/res/jp/data/sprites_up/Stage/e_Blcn.tsc new file mode 100644 index 0000000..313fb2c --- /dev/null +++ b/res/jp/data/sprites_up/Stage/e_Blcn.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S`0id=:l}~qls}``ahlvqy```dlu~t=:=:S`a``=:l{ulvqy```alqy`b``=:lq~`b``j``a`j````=:lqy`a``=:lvq```alq````ja`i`j```aj``ae=:=:S`b``=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/e_Ceme.pxe b/res/jp/data/sprites_up/Stage/e_Ceme.pxe new file mode 100644 index 0000000..c7f204e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Ceme.pxe differ diff --git a/res/jp/data/sprites_up/Stage/e_Ceme.pxm b/res/jp/data/sprites_up/Stage/e_Ceme.pxm new file mode 100644 index 0000000..2b8f880 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Ceme.pxm differ diff --git a/res/jp/data/sprites_up/Stage/e_Ceme.tsc b/res/jp/data/sprites_up/Stage/e_Ceme.tsc new file mode 100644 index 0000000..07d7398 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/e_Ceme.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}0`ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:S`a``=:l{ulvqy```alqy`c``=:lvq```alq````ja`d`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/e_Jenk.pxe b/res/jp/data/sprites_up/Stage/e_Jenk.pxe new file mode 100644 index 0000000..4eb1d1e Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Jenk.pxe differ diff --git a/res/jp/data/sprites_up/Stage/e_Jenk.pxm b/res/jp/data/sprites_up/Stage/e_Jenk.pxm new file mode 100644 index 0000000..da606ad Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Jenk.pxm differ diff --git a/res/jp/data/sprites_up/Stage/e_Jenk.tsc b/res/jp/data/sprites_up/Stage/e_Jenk.tsc new file mode 100644 index 0000000..f935134 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/e_Jenk.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulvqy```alqy0b``lv|z`afbj`aa`=:lqy`a``=:lvq```alq````ja`b`j```aj``ae=:S`aa`=:l{u=:ls~`aa`j````j````lqy``b`=:ls~`aa`j`aacj````lqy``b`=:lq~`aaaj````j```blqy``f`=:lvq```alq````ja`b`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/e_Labo.pxe b/res/jp/data/sprites_up/Stage/e_Labo.pxe new file mode 100644 index 0000000..cf05d7b Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Labo.pxe differ diff --git a/res/jp/data/sprites_up/Stage/e_Labo.pxm b/res/jp/data/sprites_up/Stage/e_Labo.pxm new file mode 100644 index 0000000..ec419d6 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Labo.pxm differ diff --git a/res/jp/data/sprites_up/Stage/e_Labo.tsc b/res/jp/data/sprites_up/Stage/e_Labo.tsc new file mode 100644 index 0000000..ff726e3 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/e_Labo.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}`0ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulvqy```alqy`d``=:lvq```alq````ja`f`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/e_Malc.pxe b/res/jp/data/sprites_up/Stage/e_Malc.pxe new file mode 100644 index 0000000..56cab9d Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Malc.pxe differ diff --git a/res/jp/data/sprites_up/Stage/e_Malc.pxm b/res/jp/data/sprites_up/Stage/e_Malc.pxm new file mode 100644 index 0000000..73cc752 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Malc.pxm differ diff --git a/res/jp/data/sprites_up/Stage/e_Malc.tsc b/res/jp/data/sprites_up/Stage/e_Malc.tsc new file mode 100644 index 0000000..f4faf39 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/e_Malc.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulvqy``0a=:lqy``e`lq~`ba`j`a``j````=:lqy``e`lq~`bb`j`a``j````=:lqy``e`lq~`bc`j`a``j````=:lqy``e`lq~`bd`j`a``j````=:lqy``e`lq~`bd`j`aa`j````=:lqy`a``=:lvq```alq````ja`c`j```aj``ae=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/e_Maze.pxe b/res/jp/data/sprites_up/Stage/e_Maze.pxe new file mode 100644 index 0000000..340ba34 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Maze.pxe differ diff --git a/res/jp/data/sprites_up/Stage/e_Maze.pxm b/res/jp/data/sprites_up/Stage/e_Maze.pxm new file mode 100644 index 0000000..9e4b942 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Maze.pxm differ diff --git a/res/jp/data/sprites_up/Stage/e_Maze.tsc b/res/jp/data/sprites_up/Stage/e_Maze.tsc new file mode 100644 index 0000000..23cb89f --- /dev/null +++ b/res/jp/data/sprites_up/Stage/e_Maze.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``ahlvqy````lu~t=:S``ia=:l}~qls}``ahlvqy```alu~t=:S``ib=:l}~qls}``ahlvqy```blu~t=:S``ic=:l}~qls}``ahlvqy```clu~t=:S``id=:l}~qls}``ahlvqy```dlu~t=:=:=:S`a``=:l{ulqy```b=:lq~`b``j``a0j````=:lq~`bb`j``b`j````=:lq~`bc`j``a`j````=:lv|zb```j`a`aluu`aa`=:S`a`a=:lq~`c``j```aj```bluu`aa`=:=:S`aa`=:lvqy```alqy`c``=:lvq```alq````ja`a`j```aj``ae=:=:S`b``=:S`ba`=:S`bb`=:S`bc`=:S`c``=:=: \ No newline at end of file diff --git a/res/jp/data/sprites_up/Stage/e_Sky.pxe b/res/jp/data/sprites_up/Stage/e_Sky.pxe new file mode 100644 index 0000000..4a1b6c9 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Sky.pxe differ diff --git a/res/jp/data/sprites_up/Stage/e_Sky.pxm b/res/jp/data/sprites_up/Stage/e_Sky.pxm new file mode 100644 index 0000000..5771f71 Binary files /dev/null and b/res/jp/data/sprites_up/Stage/e_Sky.pxm differ diff --git a/res/jp/data/sprites_up/Stage/e_Sky.tsc b/res/jp/data/sprites_up/Stage/e_Sky.tsc new file mode 100644 index 0000000..1a7a445 --- /dev/null +++ b/res/jp/data/sprites_up/Stage/e_Sky.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqry}qqqq}NKdqqzrNK}}qqry}qqqr}NKdqqzsNK}}qqry}qqqs}NKdqqztNK}}qqry}qqqt}NKdqqzuNK}}qqry}qqqu}NKNKNKdqrqqNK}}sqqq{qrqr}qqqsNK}qsqq{qqsq{qqqsNK}Aqsrq{qqtq{qqqq}qqqsNK}qsqq{qquq{qqqsNK}qsrq{qqrq{qqqq}qrrqNKdqrqrNK}qsqq{qqqq{qqqq}qqqsNK}qsrq{qtvw{qqqsNK}qrrqNKdqrrqNK}qqvqNK}qqqr}qtqqNK}qqqr}qqqq{rqvq{qqqr{qqrvNKNKdqsqqNKdqsrqNKNK \ No newline at end of file diff --git a/res/universal/data/Font/font_bitmap_10x20.dat b/res/universal/data/Font/font_bitmap_10x20.dat new file mode 100644 index 0000000..68ba690 Binary files /dev/null and b/res/universal/data/Font/font_bitmap_10x20.dat differ diff --git a/res/universal/data/Font/font_bitmap_10x20.png b/res/universal/data/Font/font_bitmap_10x20.png new file mode 100644 index 0000000..bbb059c Binary files /dev/null and b/res/universal/data/Font/font_bitmap_10x20.png differ diff --git a/res/universal/data/Font/font_bitmap_6x12.dat b/res/universal/data/Font/font_bitmap_6x12.dat new file mode 100644 index 0000000..74837b8 Binary files /dev/null and b/res/universal/data/Font/font_bitmap_6x12.dat differ diff --git a/res/universal/data/Font/font_bitmap_6x12.png b/res/universal/data/Font/font_bitmap_6x12.png new file mode 100644 index 0000000..1d1eae0 Binary files /dev/null and b/res/universal/data/Font/font_bitmap_6x12.png differ diff --git a/res/universal/data/PixTone/001.pxt b/res/universal/data/PixTone/001.pxt new file mode 100644 index 0000000..c96201d --- /dev/null +++ b/res/universal/data/PixTone/001.pxt @@ -0,0 +1,92 @@ +use :1 +size :3000 +main_model :0 +main_freq :99.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :1.00 +pitch_top :55 +pitch_offset :197 +volume_model :5 +volume_freq :0.00 +volume_top :0 +volume_offset:0 +initialY:63 +ax :0 +ay :63 +bx :164 +by :28 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,3000,0,99.00,32,0,2,1.00,55,197,5,0.00,0,0,63,0,63,164,28,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/002.pxt b/res/universal/data/PixTone/002.pxt new file mode 100644 index 0000000..821e742 --- /dev/null +++ b/res/universal/data/PixTone/002.pxt @@ -0,0 +1,92 @@ +use :1 +size :4000 +main_model :1 +main_freq :54.00 +main_top :32 +main_offset :0 +pitch_model :5 +pitch_freq :0.10 +pitch_top :33 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:53 +ax :57 +ay :44 +bx :128 +by :24 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,4000,1,54.00,32,0,5,0.10,33,0,0,0.00,32,0,53,57,44,128,24,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/003.pxt b/res/universal/data/PixTone/003.pxt new file mode 100644 index 0000000..38c6afd --- /dev/null +++ b/res/universal/data/PixTone/003.pxt @@ -0,0 +1,92 @@ +use :1 +size :3000 +main_model :4 +main_freq :31.00 +main_top :10 +main_offset :0 +pitch_model :3 +pitch_freq :2.00 +pitch_top :40 +pitch_offset :0 +volume_model :4 +volume_freq :1.00 +volume_top :31 +volume_offset:0 +initialY:0 +ax :9 +ay :63 +bx :94 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,3000,4,31.00,10,0,3,2.00,40,0,4,1.00,31,0,0,9,63,94,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/004.pxt b/res/universal/data/PixTone/004.pxt new file mode 100644 index 0000000..ec4db03 --- /dev/null +++ b/res/universal/data/PixTone/004.pxt @@ -0,0 +1,92 @@ +use :1 +size :8000 +main_model :5 +main_freq :10.00 +main_top :15 +main_offset :0 +pitch_model :4 +pitch_freq :0.50 +pitch_top :16 +pitch_offset :239 +volume_model :4 +volume_freq :0.00 +volume_top :50 +volume_offset:0 +initialY:63 +ax :0 +ay :63 +bx :96 +by :17 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,8000,5,10.00,15,0,4,0.50,16,239,4,0.00,50,0,63,0,63,96,17,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/005.pxt b/res/universal/data/PixTone/005.pxt new file mode 100644 index 0000000..a53bb27 --- /dev/null +++ b/res/universal/data/PixTone/005.pxt @@ -0,0 +1,92 @@ +use :1 +size :6000 +main_model :3 +main_freq :123.00 +main_top :32 +main_offset :0 +pitch_model :4 +pitch_freq :1.00 +pitch_top :16 +pitch_offset :222 +volume_model :4 +volume_freq :4.00 +volume_top :37 +volume_offset:0 +initialY:0 +ax :6 +ay :63 +bx :104 +by :25 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,6000,3,123.00,32,0,4,1.00,16,222,4,4.00,37,0,0,6,63,104,25,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/006.pxt b/res/universal/data/PixTone/006.pxt new file mode 100644 index 0000000..41b65cb --- /dev/null +++ b/res/universal/data/PixTone/006.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :2 +main_freq :168.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.50 +pitch_top :29 +pitch_offset :173 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :13 +ay :63 +bx :68 +by :35 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,2,168.00,32,0,0,0.50,29,173,0,0.00,32,0,0,13,63,68,35,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/007.pxt b/res/universal/data/PixTone/007.pxt new file mode 100644 index 0000000..f0544b8 --- /dev/null +++ b/res/universal/data/PixTone/007.pxt @@ -0,0 +1,92 @@ +use :1 +size :1000 +main_model :0 +main_freq :20.00 +main_top :0 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :0 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :0 +volume_offset:0 +initialY:0 +ax :64 +ay :0 +bx :128 +by :0 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,1000,0,20.00,0,0,0,0.00,0,0,0,0.00,0,0,0,64,0,128,0,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/011.pxt b/res/universal/data/PixTone/011.pxt new file mode 100644 index 0000000..597e408 --- /dev/null +++ b/res/universal/data/PixTone/011.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :4 +main_freq :40.00 +main_top :52 +main_offset :0 +pitch_model :2 +pitch_freq :1.00 +pitch_top :63 +pitch_offset :0 +volume_model :3 +volume_freq :10.00 +volume_top :63 +volume_offset:0 +initialY:63 +ax :47 +ay :27 +bx :47 +by :29 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,4,40.00,52,0,2,1.00,63,0,3,10.00,63,0,63,47,27,47,29,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/012.pxt b/res/universal/data/PixTone/012.pxt new file mode 100644 index 0000000..ede2321 --- /dev/null +++ b/res/universal/data/PixTone/012.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :5 +main_freq :7.30 +main_top :32 +main_offset :0 +pitch_model :5 +pitch_freq :0.20 +pitch_top :29 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :91 +ay :63 +bx :149 +by :25 +cx :255 +cy :0 + +use :1 +size :1000 +main_model :0 +main_freq :6.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,5,7.30,32,0,5,0.20,29,0,0,0.00,32,0,63,91,63,149,25,255,0}, +{1,1000,0,6.00,32,0,3,1.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/014.pxt b/res/universal/data/PixTone/014.pxt new file mode 100644 index 0000000..8f4ab03 --- /dev/null +++ b/res/universal/data/PixTone/014.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :1 +main_freq :246.00 +main_top :23 +main_offset :0 +pitch_model :4 +pitch_freq :0.60 +pitch_top :22 +pitch_offset :239 +volume_model :4 +volume_freq :6.00 +volume_top :63 +volume_offset:0 +initialY:0 +ax :11 +ay :63 +bx :13 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,1,246.00,23,0,4,0.60,22,239,4,6.00,63,0,0,11,63,13,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/015.pxt b/res/universal/data/PixTone/015.pxt new file mode 100644 index 0000000..14de524 --- /dev/null +++ b/res/universal/data/PixTone/015.pxt @@ -0,0 +1,92 @@ +use :1 +size :1000 +main_model :5 +main_freq :1.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :63 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :63 +volume_offset:0 +initialY:0 +ax :28 +ay :63 +bx :53 +by :31 +cx :210 +cy :31 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,1000,5,1.00,32,0,3,1.00,63,0,0,0.00,63,0,0,28,63,53,31,210,31}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/016.pxt b/res/universal/data/PixTone/016.pxt new file mode 100644 index 0000000..511c5db --- /dev/null +++ b/res/universal/data/PixTone/016.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :2 +main_freq :50.00 +main_top :39 +main_offset :0 +pitch_model :3 +pitch_freq :0.50 +pitch_top :40 +pitch_offset :217 +volume_model :1 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :34 +cx :198 +cy :32 + +use :1 +size :5000 +main_model :5 +main_freq :10.00 +main_top :39 +main_offset :0 +pitch_model :3 +pitch_freq :0.50 +pitch_top :24 +pitch_offset :217 +volume_model :1 +volume_freq :4.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :4 +ay :63 +bx :128 +by :34 +cx :198 +cy :32 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,2,50.00,39,0,3,0.50,40,217,1,0.00,32,0,63,64,63,128,34,198,32}, +{1,5000,5,10.00,39,0,3,0.50,24,217,1,4.00,32,0,0,4,63,128,34,198,32}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/017.pxt b/res/universal/data/PixTone/017.pxt new file mode 100644 index 0000000..427b645 --- /dev/null +++ b/res/universal/data/PixTone/017.pxt @@ -0,0 +1,92 @@ +use :1 +size :40000 +main_model :5 +main_freq :10.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :241 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :1 +size :40000 +main_model :5 +main_freq :20.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :5 +volume_freq :0.10 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :1 +size :30000 +main_model :2 +main_freq :400.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :0.30 +pitch_top :60 +pitch_offset :250 +volume_model :0 +volume_freq :20.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,40000,5,10.00,32,0,3,1.00,32,241,0,0.00,32,0,63,64,63,128,63,255,0}, +{1,40000,5,20.00,32,0,0,0.00,32,0,5,0.10,32,0,63,64,63,128,63,255,0}, +{1,30000,2,400.00,32,0,3,0.30,60,250,0,20.00,32,0,63,64,63,128,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/018.pxt b/res/universal/data/PixTone/018.pxt new file mode 100644 index 0000000..4814a7e --- /dev/null +++ b/res/universal/data/PixTone/018.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :1 +main_freq :601.00 +main_top :32 +main_offset :0 +pitch_model :4 +pitch_freq :0.50 +pitch_top :15 +pitch_offset :235 +volume_model :0 +volume_freq :10.00 +volume_top :54 +volume_offset:0 +initialY:63 +ax :0 +ay :63 +bx :0 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,1,601.00,32,0,4,0.50,15,235,0,10.00,54,0,63,0,63,0,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/020.pxt b/res/universal/data/PixTone/020.pxt new file mode 100644 index 0000000..cbf060a --- /dev/null +++ b/res/universal/data/PixTone/020.pxt @@ -0,0 +1,92 @@ +use :1 +size :20000 +main_model :1 +main_freq :832.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :1.00 +pitch_top :46 +pitch_offset :0 +volume_model :0 +volume_freq :27.00 +volume_top :63 +volume_offset:0 +initialY:63 +ax :0 +ay :63 +bx :140 +by :10 +cx :255 +cy :0 + +use :1 +size :20000 +main_model :1 +main_freq :918.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :1.00 +pitch_top :46 +pitch_offset :0 +volume_model :0 +volume_freq :21.00 +volume_top :63 +volume_offset:0 +initialY:63 +ax :0 +ay :63 +bx :140 +by :10 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,20000,1,832.00,32,0,2,1.00,46,0,0,27.00,63,0,63,0,63,140,10,255,0}, +{1,20000,1,918.00,32,0,2,1.00,46,0,0,21.00,63,0,63,0,63,140,10,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/021.pxt b/res/universal/data/PixTone/021.pxt new file mode 100644 index 0000000..f4611ce --- /dev/null +++ b/res/universal/data/PixTone/021.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :0 +main_freq :322.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :8.00 +pitch_top :37 +pitch_offset :0 +volume_model :2 +volume_freq :0.00 +volume_top :0 +volume_offset:0 +initialY:0 +ax :13 +ay :63 +bx :106 +by :11 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,0,322.00,32,0,2,8.00,37,0,2,0.00,0,0,0,13,63,106,11,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/022.pxt b/res/universal/data/PixTone/022.pxt new file mode 100644 index 0000000..dbb30ec --- /dev/null +++ b/res/universal/data/PixTone/022.pxt @@ -0,0 +1,92 @@ +use :1 +size :4000 +main_model :5 +main_freq :4.50 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :46 +pitch_offset :102 +volume_model :3 +volume_freq :2.50 +volume_top :47 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,4000,5,4.50,32,0,3,1.00,46,102,3,2.50,47,0,63,64,63,128,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/023.pxt b/res/universal/data/PixTone/023.pxt new file mode 100644 index 0000000..eb23886 --- /dev/null +++ b/res/universal/data/PixTone/023.pxt @@ -0,0 +1,92 @@ +use :1 +size :3000 +main_model :1 +main_freq :17.00 +main_top :34 +main_offset :0 +pitch_model :3 +pitch_freq :2.00 +pitch_top :40 +pitch_offset :0 +volume_model :4 +volume_freq :1.00 +volume_top :31 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :225 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,3000,1,17.00,34,0,3,2.00,40,0,4,1.00,31,0,63,64,63,225,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/024.pxt b/res/universal/data/PixTone/024.pxt new file mode 100644 index 0000000..11d8379 --- /dev/null +++ b/res/universal/data/PixTone/024.pxt @@ -0,0 +1,92 @@ +use :1 +size :1000 +main_model :1 +main_freq :5.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :63 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :0 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :31 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,1000,1,5.00,32,0,3,1.00,63,0,0,0.00,0,0,63,64,63,128,31,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/025.pxt b/res/universal/data/PixTone/025.pxt new file mode 100644 index 0000000..296ec23 --- /dev/null +++ b/res/universal/data/PixTone/025.pxt @@ -0,0 +1,92 @@ +use :1 +size :20000 +main_model :2 +main_freq :186.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :4.00 +pitch_top :13 +pitch_offset :98 +volume_model :3 +volume_freq :4.00 +volume_top :5 +volume_offset:0 +initialY:63 +ax :64 +ay :28 +bx :255 +by :0 +cx :255 +cy :0 + +use :1 +size :20000 +main_model :2 +main_freq :285.00 +main_top :19 +main_offset :0 +pitch_model :3 +pitch_freq :4.00 +pitch_top :21 +pitch_offset :0 +volume_model :3 +volume_freq :4.00 +volume_top :33 +volume_offset:130 +initialY:63 +ax :64 +ay :63 +bx :255 +by :0 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,20000,2,186.00,32,0,0,4.00,13,98,3,4.00,5,0,63,64,28,255,0,255,0}, +{1,20000,2,285.00,19,0,3,4.00,21,0,3,4.00,33,130,63,64,63,255,0,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/026.pxt b/res/universal/data/PixTone/026.pxt new file mode 100644 index 0000000..f1ab912 --- /dev/null +++ b/res/universal/data/PixTone/026.pxt @@ -0,0 +1,92 @@ +use :1 +size :22050 +main_model :0 +main_freq :117.00 +main_top :63 +main_offset :0 +pitch_model :5 +pitch_freq :2.00 +pitch_top :18 +pitch_offset :0 +volume_model :5 +volume_freq :0.00 +volume_top :0 +volume_offset:0 +initialY:63 +ax :0 +ay :63 +bx :64 +by :19 +cx :255 +cy :0 + +use :1 +size :5000 +main_model :0 +main_freq :28.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :3.00 +pitch_top :27 +pitch_offset :0 +volume_model :5 +volume_freq :0.00 +volume_top :0 +volume_offset:0 +initialY:63 +ax :0 +ay :63 +bx :0 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,22050,0,117.00,63,0,5,2.00,18,0,5,0.00,0,0,63,0,63,64,19,255,0}, +{1,5000,0,28.00,32,0,3,3.00,27,0,5,0.00,0,0,63,0,63,0,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/027.pxt b/res/universal/data/PixTone/027.pxt new file mode 100644 index 0000000..cd2a17a --- /dev/null +++ b/res/universal/data/PixTone/027.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :0 +main_freq :970.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :1.00 +pitch_top :35 +pitch_offset :195 +volume_model :0 +volume_freq :31.00 +volume_top :31 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,0,970.00,32,0,2,1.00,35,195,0,31.00,31,0,63,64,63,128,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/028.pxt b/res/universal/data/PixTone/028.pxt new file mode 100644 index 0000000..bef5703 --- /dev/null +++ b/res/universal/data/PixTone/028.pxt @@ -0,0 +1,92 @@ +use :1 +size :3000 +main_model :0 +main_freq :13.00 +main_top :24 +main_offset :0 +pitch_model :3 +pitch_freq :2.00 +pitch_top :40 +pitch_offset :0 +volume_model :4 +volume_freq :1.00 +volume_top :31 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :225 +by :63 +cx :255 +cy :0 + +use :1 +size :3000 +main_model :5 +main_freq :6.00 +main_top :32 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :3 +volume_freq :0.00 +volume_top :0 +volume_offset:0 +initialY:0 +ax :0 +ay :63 +bx :45 +by :23 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,3000,0,13.00,24,0,3,2.00,40,0,4,1.00,31,0,63,64,63,225,63,255,0}, +{1,3000,5,6.00,32,0,5,1.00,32,0,3,0.00,0,0,0,0,63,45,23,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/029.pxt b/res/universal/data/PixTone/029.pxt new file mode 100644 index 0000000..4173b07 --- /dev/null +++ b/res/universal/data/PixTone/029.pxt @@ -0,0 +1,92 @@ +use :1 +size :20000 +main_model :1 +main_freq :477.00 +main_top :40 +main_offset :0 +pitch_model :5 +pitch_freq :93.00 +pitch_top :39 +pitch_offset :0 +volume_model :4 +volume_freq :17.00 +volume_top :19 +volume_offset:0 +initialY:0 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,20000,1,477.00,40,0,5,93.00,39,0,4,17.00,19,0,0,64,63,128,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/030.pxt b/res/universal/data/PixTone/030.pxt new file mode 100644 index 0000000..2776229 --- /dev/null +++ b/res/universal/data/PixTone/030.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :2 +main_freq :168.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.50 +pitch_top :29 +pitch_offset :173 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :13 +ay :63 +bx :68 +by :35 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,2,168.00,32,0,0,0.50,29,173,0,0.00,32,0,0,13,63,68,35,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/031.pxt b/res/universal/data/PixTone/031.pxt new file mode 100644 index 0000000..d559478 --- /dev/null +++ b/res/universal/data/PixTone/031.pxt @@ -0,0 +1,92 @@ +use :1 +size :8000 +main_model :4 +main_freq :2000.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :1.00 +pitch_top :0 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:43 +ax :21 +ay :7 +bx :255 +by :0 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,8000,4,2000.00,32,0,2,1.00,0,0,0,0.00,32,0,43,21,7,255,0,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/032.pxt b/res/universal/data/PixTone/032.pxt new file mode 100644 index 0000000..e3a3174 --- /dev/null +++ b/res/universal/data/PixTone/032.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :5 +main_freq :10.00 +main_top :32 +main_offset :0 +pitch_model :4 +pitch_freq :4.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :63 +volume_offset:0 +initialY:63 +ax :6 +ay :63 +bx :45 +by :8 +cx :119 +cy :46 + +use :1 +size :1000 +main_model :0 +main_freq :4.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :63 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :63 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,5,10.00,32,0,4,4.00,32,0,0,0.00,63,0,63,6,63,45,8,119,46}, +{1,1000,0,4.00,32,0,3,1.00,63,0,0,0.00,63,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/033.pxt b/res/universal/data/PixTone/033.pxt new file mode 100644 index 0000000..7947ebe --- /dev/null +++ b/res/universal/data/PixTone/033.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :0 +main_freq :30.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :63 +volume_offset:0 +initialY:0 +ax :19 +ay :44 +bx :111 +by :13 +cx :198 +cy :9 + +use :1 +size :10000 +main_model :5 +main_freq :2.00 +main_top :31 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :57 +pitch_offset :219 +volume_model :0 +volume_freq :2.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :19 +ay :44 +bx :111 +by :13 +cx :198 +cy :9 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,0,30.00,32,0,3,1.00,32,0,0,0.00,63,0,0,19,44,111,13,198,9}, +{1,10000,5,2.00,31,0,3,1.00,57,219,0,2.00,32,0,0,19,44,111,13,198,9}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/034.pxt b/res/universal/data/PixTone/034.pxt new file mode 100644 index 0000000..211e7c1 --- /dev/null +++ b/res/universal/data/PixTone/034.pxt @@ -0,0 +1,92 @@ +use :1 +size :4000 +main_model :5 +main_freq :0.40 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :53 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :63 +volume_offset:0 +initialY:12 +ax :19 +ay :63 +bx :111 +by :21 +cx :198 +cy :18 + +use :1 +size :1000 +main_model :1 +main_freq :12.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :1.00 +pitch_top :63 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :63 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,4000,5,0.40,32,0,3,1.00,53,0,0,0.00,63,0,12,19,63,111,21,198,18}, +{1,1000,1,12.00,32,0,2,1.00,63,0,0,0.00,63,0,63,64,63,128,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/035.pxt b/res/universal/data/PixTone/035.pxt new file mode 100644 index 0000000..3996296 --- /dev/null +++ b/res/universal/data/PixTone/035.pxt @@ -0,0 +1,92 @@ +use :1 +size :20000 +main_model :5 +main_freq :6.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :54 +pitch_offset :239 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :35 + +use :1 +size :40000 +main_model :5 +main_freq :4.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :230 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :1 +size :40000 +main_model :1 +main_freq :238.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :14 +pitch_offset :0 +volume_model :4 +volume_freq :30.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,20000,5,6.00,32,0,3,1.00,54,239,0,0.00,32,0,63,64,63,128,63,255,35}, +{1,40000,5,4.00,32,0,3,0.00,32,230,0,0.00,32,0,63,64,63,128,63,255,0}, +{1,40000,1,238.00,32,0,3,1.00,14,0,4,30.00,32,0,63,64,63,128,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/037.pxt b/res/universal/data/PixTone/037.pxt new file mode 100644 index 0000000..f07e245 --- /dev/null +++ b/res/universal/data/PixTone/037.pxt @@ -0,0 +1,92 @@ +use :1 +size :4000 +main_model :5 +main_freq :11.00 +main_top :32 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :17 +pitch_offset :197 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:51 +ax :100 +ay :63 +bx :100 +by :0 +cx :255 +cy :0 + +use :1 +size :4000 +main_model :5 +main_freq :21.00 +main_top :32 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :17 +pitch_offset :197 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :119 +ay :0 +bx :117 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,4000,5,11.00,32,0,5,1.00,17,197,0,0.00,32,0,51,100,63,100,0,255,0}, +{1,4000,5,21.00,32,0,5,1.00,17,197,0,0.00,32,0,0,119,0,117,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/038.pxt b/res/universal/data/PixTone/038.pxt new file mode 100644 index 0000000..37ad5ad --- /dev/null +++ b/res/universal/data/PixTone/038.pxt @@ -0,0 +1,92 @@ +use :1 +size :6000 +main_model :5 +main_freq :11.00 +main_top :32 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :3 +volume_freq :3.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :0 +ay :63 +bx :0 +by :63 +cx :255 +cy :0 + +use :1 +size :6000 +main_model :1 +main_freq :329.00 +main_top :20 +main_offset :0 +pitch_model :2 +pitch_freq :2.00 +pitch_top :47 +pitch_offset :77 +volume_model :3 +volume_freq :3.00 +volume_top :63 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,6000,5,11.00,32,0,5,1.00,32,0,3,3.00,32,0,63,0,63,0,63,255,0}, +{1,6000,1,329.00,20,0,2,2.00,47,77,3,3.00,63,0,63,64,63,128,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/039.pxt b/res/universal/data/PixTone/039.pxt new file mode 100644 index 0000000..4149ed0 --- /dev/null +++ b/res/universal/data/PixTone/039.pxt @@ -0,0 +1,92 @@ +use :1 +size :3000 +main_model :2 +main_freq :62.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :3.00 +pitch_top :63 +pitch_offset :0 +volume_model :3 +volume_freq :3.00 +volume_top :14 +volume_offset:0 +initialY:63 +ax :0 +ay :63 +bx :210 +by :32 +cx :255 +cy :0 + +use :1 +size :5000 +main_model :2 +main_freq :58.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :3.00 +pitch_top :63 +pitch_offset :0 +volume_model :2 +volume_freq :3.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :0 +ay :63 +bx :49 +by :27 +cx :255 +cy :0 + +use :1 +size :3000 +main_model :0 +main_freq :13.00 +main_top :24 +main_offset :0 +pitch_model :3 +pitch_freq :2.00 +pitch_top :40 +pitch_offset :0 +volume_model :4 +volume_freq :1.00 +volume_top :31 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :225 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,3000,2,62.00,32,0,2,3.00,63,0,3,3.00,14,0,63,0,63,210,32,255,0}, +{1,5000,2,58.00,32,0,2,3.00,63,0,2,3.00,32,0,63,0,63,49,27,255,0}, +{1,3000,0,13.00,24,0,3,2.00,40,0,4,1.00,31,0,63,64,63,225,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/040.pxt b/res/universal/data/PixTone/040.pxt new file mode 100644 index 0000000..4b8db19 --- /dev/null +++ b/res/universal/data/PixTone/040.pxt @@ -0,0 +1,92 @@ +use :1 +size :44100 +main_model :5 +main_freq :54.00 +main_top :12 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :5 +volume_freq :1.00 +volume_top :27 +volume_offset:0 +initialY:40 +ax :64 +ay :63 +bx :128 +by :38 +cx :255 +cy :63 + +use :1 +size :44100 +main_model :5 +main_freq :119.00 +main_top :9 +main_offset :0 +pitch_model :5 +pitch_freq :2.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:61 +ax :64 +ay :39 +bx :128 +by :60 +cx :255 +cy :28 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,44100,5,54.00,12,0,5,1.00,32,0,5,1.00,27,0,40,64,63,128,38,255,63}, +{1,44100,5,119.00,9,0,5,2.00,32,0,0,0.00,32,0,61,64,39,128,60,255,28}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/041.pxt b/res/universal/data/PixTone/041.pxt new file mode 100644 index 0000000..4b8db19 --- /dev/null +++ b/res/universal/data/PixTone/041.pxt @@ -0,0 +1,92 @@ +use :1 +size :44100 +main_model :5 +main_freq :54.00 +main_top :12 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :5 +volume_freq :1.00 +volume_top :27 +volume_offset:0 +initialY:40 +ax :64 +ay :63 +bx :128 +by :38 +cx :255 +cy :63 + +use :1 +size :44100 +main_model :5 +main_freq :119.00 +main_top :9 +main_offset :0 +pitch_model :5 +pitch_freq :2.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:61 +ax :64 +ay :39 +bx :128 +by :60 +cx :255 +cy :28 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,44100,5,54.00,12,0,5,1.00,32,0,5,1.00,27,0,40,64,63,128,38,255,63}, +{1,44100,5,119.00,9,0,5,2.00,32,0,0,0.00,32,0,61,64,39,128,60,255,28}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/042.pxt b/res/universal/data/PixTone/042.pxt new file mode 100644 index 0000000..480bc9c --- /dev/null +++ b/res/universal/data/PixTone/042.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :1 +main_freq :231.00 +main_top :32 +main_offset :0 +pitch_model :4 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :65 +volume_model :3 +volume_freq :2.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,1,231.00,32,0,4,1.00,32,65,3,2.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/043.pxt b/res/universal/data/PixTone/043.pxt new file mode 100644 index 0000000..f2eb161 --- /dev/null +++ b/res/universal/data/PixTone/043.pxt @@ -0,0 +1,92 @@ +use :1 +size :3000 +main_model :0 +main_freq :107.00 +main_top :32 +main_offset :0 +pitch_model :4 +pitch_freq :1.00 +pitch_top :15 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :17 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,3000,0,107.00,32,0,4,1.00,15,0,0,0.00,17,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/044.pxt b/res/universal/data/PixTone/044.pxt new file mode 100644 index 0000000..6d48f2a --- /dev/null +++ b/res/universal/data/PixTone/044.pxt @@ -0,0 +1,92 @@ +use :1 +size :20000 +main_model :5 +main_freq :4.00 +main_top :32 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :170 +volume_model :5 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :38 +ay :22 +bx :255 +by :0 +cx :255 +cy :0 + +use :1 +size :5000 +main_model :1 +main_freq :16.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :238 +volume_model :0 +volume_freq :0.00 +volume_top :0 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :1 +size :20000 +main_model :5 +main_freq :4.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.70 +pitch_top :61 +pitch_offset :43 +volume_model :3 +volume_freq :1.00 +volume_top :22 +volume_offset:224 +initialY:63 +ax :64 +ay :63 +bx :204 +by :46 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,20000,5,4.00,32,0,5,1.00,32,170,5,0.00,32,0,63,38,22,255,0,255,0}, +{1,5000,1,16.00,32,0,3,1.00,32,238,0,0.00,0,0,63,64,63,128,63,255,63}, +{1,20000,5,4.00,32,0,0,0.70,61,43,3,1.00,22,224,63,64,63,204,46,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/045.pxt b/res/universal/data/PixTone/045.pxt new file mode 100644 index 0000000..ed7f075 --- /dev/null +++ b/res/universal/data/PixTone/045.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :0 +main_freq :880.00 +main_top :19 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :8.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :11 +ay :63 +bx :34 +by :25 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,0,880.00,19,0,0,0.00,32,0,0,8.00,32,0,0,11,63,34,25,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/046.pxt b/res/universal/data/PixTone/046.pxt new file mode 100644 index 0000000..c1f915d --- /dev/null +++ b/res/universal/data/PixTone/046.pxt @@ -0,0 +1,92 @@ +use :1 +size :2000 +main_model :5 +main_freq :3.00 +main_top :16 +main_offset :0 +pitch_model :3 +pitch_freq :2.00 +pitch_top :12 +pitch_offset :0 +volume_model :3 +volume_freq :1.00 +volume_top :37 +volume_offset:0 +initialY:0 +ax :51 +ay :63 +bx :132 +by :24 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,2000,5,3.00,16,0,3,2.00,12,0,3,1.00,37,0,0,51,63,132,24,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/047.pxt b/res/universal/data/PixTone/047.pxt new file mode 100644 index 0000000..391fed4 --- /dev/null +++ b/res/universal/data/PixTone/047.pxt @@ -0,0 +1,92 @@ +use :1 +size :2000 +main_model :5 +main_freq :2.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :3.00 +pitch_top :54 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :17 +ay :63 +bx :98 +by :22 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,2000,5,2.00,32,0,2,3.00,54,0,0,0.00,32,0,0,17,63,98,22,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/048.pxt b/res/universal/data/PixTone/048.pxt new file mode 100644 index 0000000..c0a8ac9 --- /dev/null +++ b/res/universal/data/PixTone/048.pxt @@ -0,0 +1,92 @@ +use :1 +size :8000 +main_model :1 +main_freq :814.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :11.00 +pitch_top :32 +pitch_offset :0 +volume_model :3 +volume_freq :16.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :23 +ay :63 +bx :74 +by :12 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,8000,1,814.00,32,0,2,11.00,32,0,3,16.00,32,0,63,23,63,74,12,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/049.pxt b/res/universal/data/PixTone/049.pxt new file mode 100644 index 0000000..32dacdf --- /dev/null +++ b/res/universal/data/PixTone/049.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :5 +main_freq :21.00 +main_top :21 +main_offset :0 +pitch_model :0 +pitch_freq :5.00 +pitch_top :32 +pitch_offset :178 +volume_model :0 +volume_freq :3.00 +volume_top :33 +volume_offset:181 +initialY:63 +ax :38 +ay :63 +bx :104 +by :20 +cx :255 +cy :0 + +use :1 +size :6000 +main_model :5 +main_freq :1.00 +main_top :28 +main_offset :0 +pitch_model :3 +pitch_freq :6.00 +pitch_top :56 +pitch_offset :0 +volume_model :0 +volume_freq :8.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :57 +ay :63 +bx :98 +by :20 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,5,21.00,21,0,0,5.00,32,178,0,3.00,33,181,63,38,63,104,20,255,0}, +{1,6000,5,1.00,28,0,3,6.00,56,0,0,8.00,32,0,63,57,63,98,20,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/050.pxt b/res/universal/data/PixTone/050.pxt new file mode 100644 index 0000000..37473b7 --- /dev/null +++ b/res/universal/data/PixTone/050.pxt @@ -0,0 +1,92 @@ +use :1 +size :6000 +main_model :1 +main_freq :930.00 +main_top :22 +main_offset :0 +pitch_model :0 +pitch_freq :0.70 +pitch_top :53 +pitch_offset :0 +volume_model :0 +volume_freq :7.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :202 +by :63 +cx :255 +cy :0 + +use :1 +size :6000 +main_model :1 +main_freq :918.00 +main_top :23 +main_offset :0 +pitch_model :0 +pitch_freq :0.70 +pitch_top :53 +pitch_offset :0 +volume_model :0 +volume_freq :7.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :202 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,6000,1,930.00,22,0,0,0.70,53,0,0,7.00,32,0,63,64,63,202,63,255,0}, +{1,6000,1,918.00,23,0,0,0.70,53,0,0,7.00,32,0,63,64,63,202,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/051.pxt b/res/universal/data/PixTone/051.pxt new file mode 100644 index 0000000..edf26ef --- /dev/null +++ b/res/universal/data/PixTone/051.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :2 +main_freq :200.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :1.00 +pitch_top :51 +pitch_offset :0 +volume_model :1 +volume_freq :20.00 +volume_top :31 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :89 +by :30 +cx :208 +cy :28 + +use :1 +size :10000 +main_model :5 +main_freq :23.00 +main_top :16 +main_offset :0 +pitch_model :0 +pitch_freq :1.00 +pitch_top :58 +pitch_offset :0 +volume_model :1 +volume_freq :17.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :96 +by :51 +cx :202 +cy :31 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,2,200.00,32,0,0,1.00,51,0,1,20.00,31,0,63,64,63,89,30,208,28}, +{1,10000,5,23.00,16,0,0,1.00,58,0,1,17.00,32,0,63,64,63,96,51,202,31}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/052.pxt b/res/universal/data/PixTone/052.pxt new file mode 100644 index 0000000..ee8dccb --- /dev/null +++ b/res/universal/data/PixTone/052.pxt @@ -0,0 +1,92 @@ +use :1 +size :20000 +main_model :2 +main_freq :100.00 +main_top :21 +main_offset :0 +pitch_model :0 +pitch_freq :1.00 +pitch_top :46 +pitch_offset :0 +volume_model :1 +volume_freq :40.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :162 +cy :0 + +use :1 +size :20000 +main_model :5 +main_freq :5.00 +main_top :21 +main_offset :0 +pitch_model :0 +pitch_freq :1.00 +pitch_top :51 +pitch_offset :0 +volume_model :1 +volume_freq :40.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :162 +cy :28 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,20000,2,100.00,21,0,0,1.00,46,0,1,40.00,32,0,63,64,63,128,63,162,0}, +{1,20000,5,5.00,21,0,0,1.00,51,0,1,40.00,32,0,63,64,63,128,63,162,28}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/053.pxt b/res/universal/data/PixTone/053.pxt new file mode 100644 index 0000000..54a269e --- /dev/null +++ b/res/universal/data/PixTone/053.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :4 +main_freq :400.00 +main_top :13 +main_offset :0 +pitch_model :0 +pitch_freq :0.80 +pitch_top :63 +pitch_offset :0 +volume_model :4 +volume_freq :8.00 +volume_top :50 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :191 +by :32 +cx :255 +cy :0 + +use :1 +size :10000 +main_model :4 +main_freq :800.00 +main_top :5 +main_offset :0 +pitch_model :0 +pitch_freq :0.80 +pitch_top :63 +pitch_offset :0 +volume_model :4 +volume_freq :8.00 +volume_top :63 +volume_offset:125 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :166 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,4,400.00,13,0,0,0.80,63,0,4,8.00,50,0,63,64,63,191,32,255,0}, +{1,10000,4,800.00,5,0,0,0.80,63,0,4,8.00,63,125,63,64,63,128,63,166,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/054.pxt b/res/universal/data/PixTone/054.pxt new file mode 100644 index 0000000..e534d9d --- /dev/null +++ b/res/universal/data/PixTone/054.pxt @@ -0,0 +1,92 @@ +use :1 +size :8000 +main_model :0 +main_freq :77.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :3.00 +pitch_top :56 +pitch_offset :189 +volume_model :0 +volume_freq :0.00 +volume_top :17 +volume_offset:0 +initialY:0 +ax :38 +ay :63 +bx :140 +by :28 +cx :255 +cy :0 + +use :1 +size :8000 +main_model :5 +main_freq :8.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :3.00 +pitch_top :54 +pitch_offset :189 +volume_model :3 +volume_freq :3.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :38 +ay :42 +bx :140 +by :21 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,8000,0,77.00,32,0,3,3.00,56,189,0,0.00,17,0,0,38,63,140,28,255,0}, +{1,8000,5,8.00,32,0,3,3.00,54,189,3,3.00,32,0,63,38,42,140,21,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/055.pxt b/res/universal/data/PixTone/055.pxt new file mode 100644 index 0000000..8cfafea --- /dev/null +++ b/res/universal/data/PixTone/055.pxt @@ -0,0 +1,92 @@ +use :1 +size :6000 +main_model :3 +main_freq :388.00 +main_top :22 +main_offset :0 +pitch_model :0 +pitch_freq :0.70 +pitch_top :53 +pitch_offset :0 +volume_model :0 +volume_freq :7.00 +volume_top :32 +volume_offset:0 +initialY:25 +ax :64 +ay :63 +bx :202 +by :63 +cx :255 +cy :0 + +use :1 +size :6000 +main_model :1 +main_freq :918.00 +main_top :23 +main_offset :0 +pitch_model :0 +pitch_freq :0.70 +pitch_top :53 +pitch_offset :0 +volume_model :0 +volume_freq :7.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :202 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,6000,3,388.00,22,0,0,0.70,53,0,0,7.00,32,0,25,64,63,202,63,255,0}, +{1,6000,1,918.00,23,0,0,0.70,53,0,0,7.00,32,0,63,64,63,202,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/056.pxt b/res/universal/data/PixTone/056.pxt new file mode 100644 index 0000000..88635de --- /dev/null +++ b/res/universal/data/PixTone/056.pxt @@ -0,0 +1,92 @@ +use :1 +size :22050 +main_model :5 +main_freq :52.00 +main_top :22 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:3 +ax :23 +ay :23 +bx :57 +by :10 +cx :255 +cy :0 + +use :1 +size :22050 +main_model :5 +main_freq :80.00 +main_top :22 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :23 +ay :23 +bx :57 +by :10 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,22050,5,52.00,22,0,5,1.00,32,0,0,0.00,32,0,3,23,23,57,10,255,0}, +{1,22050,5,80.00,22,0,5,1.00,32,0,0,0.00,32,0,63,23,23,57,10,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/057.pxt b/res/universal/data/PixTone/057.pxt new file mode 100644 index 0000000..faadaf2 --- /dev/null +++ b/res/universal/data/PixTone/057.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :2 +main_freq :143.00 +main_top :25 +main_offset :0 +pitch_model :3 +pitch_freq :0.50 +pitch_top :40 +pitch_offset :217 +volume_model :1 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :34 +cx :198 +cy :32 + +use :1 +size :5000 +main_model :5 +main_freq :10.00 +main_top :23 +main_offset :0 +pitch_model :3 +pitch_freq :0.50 +pitch_top :24 +pitch_offset :217 +volume_model :1 +volume_freq :4.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :4 +ay :63 +bx :128 +by :34 +cx :198 +cy :32 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,2,143.00,25,0,3,0.50,40,217,1,0.00,32,0,63,64,63,128,34,198,32}, +{1,5000,5,10.00,23,0,3,0.50,24,217,1,4.00,32,0,0,4,63,128,34,198,32}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/058.pxt b/res/universal/data/PixTone/058.pxt new file mode 100644 index 0000000..d48cb34 --- /dev/null +++ b/res/universal/data/PixTone/058.pxt @@ -0,0 +1,92 @@ +use :1 +size :2000 +main_model :5 +main_freq :1.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :1 +size :2000 +main_model :3 +main_freq :99.00 +main_top :12 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,2000,5,1.00,32,0,0,1.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{1,2000,3,99.00,12,0,3,1.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/059.pxt b/res/universal/data/PixTone/059.pxt new file mode 100644 index 0000000..9b2fdbd --- /dev/null +++ b/res/universal/data/PixTone/059.pxt @@ -0,0 +1,92 @@ +use :1 +size :400 +main_model :1 +main_freq :20.00 +main_top :12 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :43 +ay :63 +bx :193 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,400,1,20.00,12,0,0,0.00,32,0,0,0.00,32,0,0,43,63,193,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/060.pxt b/res/universal/data/PixTone/060.pxt new file mode 100644 index 0000000..d848dd5 --- /dev/null +++ b/res/universal/data/PixTone/060.pxt @@ -0,0 +1,92 @@ +use :1 +size :400 +main_model :1 +main_freq :30.00 +main_top :12 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :43 +ay :63 +bx :193 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,400,1,30.00,12,0,0,0.00,32,0,0,0.00,32,0,0,43,63,193,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/061.pxt b/res/universal/data/PixTone/061.pxt new file mode 100644 index 0000000..3b5b87a --- /dev/null +++ b/res/universal/data/PixTone/061.pxt @@ -0,0 +1,92 @@ +use :1 +size :400 +main_model :1 +main_freq :40.00 +main_top :12 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :43 +ay :63 +bx :193 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,400,1,40.00,12,0,0,0.00,32,0,0,0.00,32,0,0,43,63,193,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/062.pxt b/res/universal/data/PixTone/062.pxt new file mode 100644 index 0000000..96760d7 --- /dev/null +++ b/res/universal/data/PixTone/062.pxt @@ -0,0 +1,92 @@ +use :1 +size :8000 +main_model :3 +main_freq :800.00 +main_top :24 +main_offset :0 +pitch_model :0 +pitch_freq :8.00 +pitch_top :4 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :13 +ay :63 +bx :138 +by :63 +cx :255 +cy :0 + +use :1 +size :8000 +main_model :5 +main_freq :53.00 +main_top :12 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :0 +ay :63 +bx :68 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,8000,3,800.00,24,0,0,8.00,4,0,0,0.00,32,0,0,13,63,138,63,255,0}, +{1,8000,5,53.00,12,0,5,1.00,32,0,0,0.00,32,0,0,0,63,68,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/063.pxt b/res/universal/data/PixTone/063.pxt new file mode 100644 index 0000000..b3f3a15 --- /dev/null +++ b/res/universal/data/PixTone/063.pxt @@ -0,0 +1,92 @@ +use :1 +size :8000 +main_model :3 +main_freq :400.00 +main_top :24 +main_offset :0 +pitch_model :0 +pitch_freq :8.00 +pitch_top :4 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :13 +ay :63 +bx :138 +by :63 +cx :255 +cy :0 + +use :1 +size :8000 +main_model :5 +main_freq :53.00 +main_top :12 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :0 +ay :63 +bx :68 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,8000,3,400.00,24,0,0,8.00,4,0,0,0.00,32,0,0,13,63,138,63,255,0}, +{1,8000,5,53.00,12,0,5,1.00,32,0,0,0.00,32,0,0,0,63,68,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/064.pxt b/res/universal/data/PixTone/064.pxt new file mode 100644 index 0000000..7725132 --- /dev/null +++ b/res/universal/data/PixTone/064.pxt @@ -0,0 +1,92 @@ +use :1 +size :8000 +main_model :3 +main_freq :200.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :8.00 +pitch_top :4 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :13 +ay :63 +bx :138 +by :63 +cx :255 +cy :0 + +use :1 +size :8000 +main_model :5 +main_freq :25.00 +main_top :17 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :0 +ay :63 +bx :68 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,8000,3,200.00,32,0,0,8.00,4,0,0,0.00,32,0,0,13,63,138,63,255,0}, +{1,8000,5,25.00,17,0,3,1.00,32,0,0,0.00,32,0,0,0,63,68,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/065.pxt b/res/universal/data/PixTone/065.pxt new file mode 100644 index 0000000..6f1b883 --- /dev/null +++ b/res/universal/data/PixTone/065.pxt @@ -0,0 +1,92 @@ +use :1 +size :8000 +main_model :4 +main_freq :800.00 +main_top :32 +main_offset :0 +pitch_model :4 +pitch_freq :2.00 +pitch_top :21 +pitch_offset :0 +volume_model :4 +volume_freq :8.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :106 +ay :63 +bx :130 +by :27 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,8000,4,800.00,32,0,4,2.00,21,0,4,8.00,32,0,0,106,63,130,27,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/070.pxt b/res/universal/data/PixTone/070.pxt new file mode 100644 index 0000000..eb9fe14 --- /dev/null +++ b/res/universal/data/PixTone/070.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :5 +main_freq :20.00 +main_top :23 +main_offset :0 +pitch_model :3 +pitch_freq :0.70 +pitch_top :26 +pitch_offset :235 +volume_model :5 +volume_freq :1.00 +volume_top :9 +volume_offset:0 +initialY:63 +ax :38 +ay :55 +bx :87 +by :32 +cx :98 +cy :29 + +use :1 +size :2000 +main_model :1 +main_freq :20.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :2.00 +pitch_top :63 +pitch_offset :0 +volume_model :4 +volume_freq :1.00 +volume_top :29 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,5,20.00,23,0,3,0.70,26,235,5,1.00,9,0,63,38,55,87,32,98,29}, +{1,2000,1,20.00,32,0,3,2.00,63,0,4,1.00,29,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/071.pxt b/res/universal/data/PixTone/071.pxt new file mode 100644 index 0000000..a492fc5 --- /dev/null +++ b/res/universal/data/PixTone/071.pxt @@ -0,0 +1,92 @@ +use :1 +size :15000 +main_model :5 +main_freq :10.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :0.70 +pitch_top :26 +pitch_offset :235 +volume_model :0 +volume_freq :0.00 +volume_top :63 +volume_offset:0 +initialY:63 +ax :38 +ay :55 +bx :187 +by :15 +cx :255 +cy :0 + +use :1 +size :4000 +main_model :1 +main_freq :20.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :2.00 +pitch_top :63 +pitch_offset :0 +volume_model :4 +volume_freq :1.00 +volume_top :29 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,15000,5,10.00,32,0,3,0.70,26,235,0,0.00,63,0,63,38,55,187,15,255,0}, +{1,4000,1,20.00,32,0,3,2.00,63,0,4,1.00,29,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/072.pxt b/res/universal/data/PixTone/072.pxt new file mode 100644 index 0000000..05bbd3e --- /dev/null +++ b/res/universal/data/PixTone/072.pxt @@ -0,0 +1,92 @@ +use :1 +size :22000 +main_model :5 +main_freq :6.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :0.70 +pitch_top :26 +pitch_offset :246 +volume_model :0 +volume_freq :0.00 +volume_top :63 +volume_offset:0 +initialY:63 +ax :38 +ay :55 +bx :187 +by :15 +cx :255 +cy :0 + +use :1 +size :8000 +main_model :0 +main_freq :20.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :2.00 +pitch_top :63 +pitch_offset :0 +volume_model :4 +volume_freq :1.00 +volume_top :29 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,22000,5,6.00,32,0,3,0.70,26,246,0,0.00,63,0,63,38,55,187,15,255,0}, +{1,8000,0,20.00,32,0,3,2.00,63,0,4,1.00,29,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/100.pxt b/res/universal/data/PixTone/100.pxt new file mode 100644 index 0000000..73a576f --- /dev/null +++ b/res/universal/data/PixTone/100.pxt @@ -0,0 +1,92 @@ +use :1 +size :4000 +main_model :5 +main_freq :6.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :2.00 +pitch_top :32 +pitch_offset :0 +volume_model :3 +volume_freq :2.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :26 +ay :30 +bx :66 +by :29 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,4000,5,6.00,32,0,3,2.00,32,0,3,2.00,32,0,63,26,30,66,29,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/101.pxt b/res/universal/data/PixTone/101.pxt new file mode 100644 index 0000000..f7452d2 --- /dev/null +++ b/res/universal/data/PixTone/101.pxt @@ -0,0 +1,92 @@ +use :1 +size :22050 +main_model :5 +main_freq :711.00 +main_top :32 +main_offset :0 +pitch_model :5 +pitch_freq :7.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :13 +ay :0 +bx :17 +by :63 +cx :255 +cy :0 + +use :1 +size :2000 +main_model :5 +main_freq :2.00 +main_top :32 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :1 +size :62050 +main_model :5 +main_freq :40.00 +main_top :32 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :5 +volume_freq :0.00 +volume_top :0 +volume_offset:0 +initialY:0 +ax :17 +ay :63 +bx :36 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,22050,5,711.00,32,0,5,7.00,32,0,0,0.00,32,0,0,13,0,17,63,255,0}, +{1,2000,5,2.00,32,0,5,1.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{1,62050,5,40.00,32,0,5,1.00,32,0,5,0.00,0,0,0,17,63,36,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/102.pxt b/res/universal/data/PixTone/102.pxt new file mode 100644 index 0000000..0177cde --- /dev/null +++ b/res/universal/data/PixTone/102.pxt @@ -0,0 +1,92 @@ +use :1 +size :9050 +main_model :5 +main_freq :9.00 +main_top :26 +main_offset :0 +pitch_model :0 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :209 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :132 +by :63 +cx :255 +cy :0 + +use :1 +size :9050 +main_model :2 +main_freq :43.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :47 +pitch_offset :172 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :198 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,9050,5,9.00,26,0,0,1.00,32,209,0,0.00,32,0,63,64,63,132,63,255,0}, +{1,9050,2,43.00,32,0,3,1.00,47,172,0,0.00,32,0,63,64,63,198,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/103.pxt b/res/universal/data/PixTone/103.pxt new file mode 100644 index 0000000..c8aca49 --- /dev/null +++ b/res/universal/data/PixTone/103.pxt @@ -0,0 +1,92 @@ +use :1 +size :22050 +main_model :1 +main_freq :754.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :0.50 +pitch_top :14 +pitch_offset :126 +volume_model :4 +volume_freq :18.00 +volume_top :17 +volume_offset:0 +initialY:0 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :1 +size :22050 +main_model :0 +main_freq :597.00 +main_top :12 +main_offset :0 +pitch_model :2 +pitch_freq :0.50 +pitch_top :14 +pitch_offset :126 +volume_model :4 +volume_freq :18.00 +volume_top :17 +volume_offset:0 +initialY:0 +ax :64 +ay :40 +bx :128 +by :41 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,22050,1,754.00,32,0,2,0.50,14,126,4,18.00,17,0,0,64,63,128,63,255,0}, +{1,22050,0,597.00,12,0,2,0.50,14,126,4,18.00,17,0,0,64,40,128,41,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/104.pxt b/res/universal/data/PixTone/104.pxt new file mode 100644 index 0000000..b3908d3 --- /dev/null +++ b/res/universal/data/PixTone/104.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :3 +main_freq :621.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :2.00 +pitch_top :22 +pitch_offset :0 +volume_model :3 +volume_freq :6.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :4 +ay :63 +bx :77 +by :30 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,3,621.00,32,0,2,2.00,22,0,3,6.00,32,0,0,4,63,77,30,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/105.pxt b/res/universal/data/PixTone/105.pxt new file mode 100644 index 0000000..d9fea8e --- /dev/null +++ b/res/universal/data/PixTone/105.pxt @@ -0,0 +1,92 @@ +use :1 +size :6000 +main_model :2 +main_freq :217.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.70 +pitch_top :16 +pitch_offset :0 +volume_model :3 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :32 +ay :63 +bx :49 +by :15 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,6000,2,217.00,32,0,0,0.70,16,0,3,0.00,32,0,0,32,63,49,15,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/106.pxt b/res/universal/data/PixTone/106.pxt new file mode 100644 index 0000000..9fc7495 --- /dev/null +++ b/res/universal/data/PixTone/106.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :5 +main_freq :1.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :64 +ay :63 +bx :81 +by :28 +cx :255 +cy :0 + +use :1 +size :10000 +main_model :5 +main_freq :11.00 +main_top :32 +main_offset :0 +pitch_model :2 +pitch_freq :4.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :3.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :64 +ay :63 +bx :128 +by :30 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,5,1.00,32,0,3,1.00,32,0,0,0.00,32,0,0,64,63,81,28,255,0}, +{1,10000,5,11.00,32,0,2,4.00,32,0,0,3.00,32,0,0,64,63,128,30,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/107.pxt b/res/universal/data/PixTone/107.pxt new file mode 100644 index 0000000..6ea5f1e --- /dev/null +++ b/res/universal/data/PixTone/107.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :5 +main_freq :1.00 +main_top :32 +main_offset :0 +pitch_model :4 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :32 +bx :128 +by :33 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,5,1.00,32,0,4,1.00,32,0,0,0.00,32,0,63,64,32,128,33,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/108.pxt b/res/universal/data/PixTone/108.pxt new file mode 100644 index 0000000..bc91459 --- /dev/null +++ b/res/universal/data/PixTone/108.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :2 +main_freq :50.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.50 +pitch_top :29 +pitch_offset :173 +volume_model :2 +volume_freq :100.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :13 +ay :63 +bx :68 +by :35 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,2,50.00,32,0,0,0.50,29,173,2,100.00,32,0,0,13,63,68,35,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/109.pxt b/res/universal/data/PixTone/109.pxt new file mode 100644 index 0000000..f88799d --- /dev/null +++ b/res/universal/data/PixTone/109.pxt @@ -0,0 +1,92 @@ +use :1 +size :4000 +main_model :5 +main_freq :11.00 +main_top :25 +main_offset :0 +pitch_model :3 +pitch_freq :3.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :9 +ay :63 +bx :128 +by :14 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,4000,5,11.00,25,0,3,3.00,32,0,0,0.00,32,0,0,9,63,128,14,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/110.pxt b/res/universal/data/PixTone/110.pxt new file mode 100644 index 0000000..753ecc4 --- /dev/null +++ b/res/universal/data/PixTone/110.pxt @@ -0,0 +1,92 @@ +use :1 +size :4000 +main_model :5 +main_freq :3.00 +main_top :27 +main_offset :0 +pitch_model :3 +pitch_freq :3.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :9 +ay :63 +bx :128 +by :14 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,4000,5,3.00,27,0,3,3.00,32,0,0,0.00,32,0,0,9,63,128,14,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/111.pxt b/res/universal/data/PixTone/111.pxt new file mode 100644 index 0000000..71c5803 --- /dev/null +++ b/res/universal/data/PixTone/111.pxt @@ -0,0 +1,92 @@ +use :1 +size :3000 +main_model :4 +main_freq :9.00 +main_top :20 +main_offset :0 +pitch_model :3 +pitch_freq :3.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,3000,4,9.00,20,0,3,3.00,32,0,0,0.00,32,0,63,64,63,128,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/112.pxt b/res/universal/data/PixTone/112.pxt new file mode 100644 index 0000000..f5d5f79 --- /dev/null +++ b/res/universal/data/PixTone/112.pxt @@ -0,0 +1,92 @@ +use :1 +size :3000 +main_model :4 +main_freq :18.00 +main_top :20 +main_offset :0 +pitch_model :3 +pitch_freq :3.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,3000,4,18.00,20,0,3,3.00,32,0,0,0.00,32,0,63,64,63,128,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/113.pxt b/res/universal/data/PixTone/113.pxt new file mode 100644 index 0000000..ec92cbd --- /dev/null +++ b/res/universal/data/PixTone/113.pxt @@ -0,0 +1,92 @@ +use :1 +size :3000 +main_model :5 +main_freq :4.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,3000,5,4.00,32,0,3,1.00,32,0,0,0.00,32,0,0,64,63,128,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/114.pxt b/res/universal/data/PixTone/114.pxt new file mode 100644 index 0000000..04d8010 --- /dev/null +++ b/res/universal/data/PixTone/114.pxt @@ -0,0 +1,92 @@ +use :1 +size :12000 +main_model :5 +main_freq :2.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.70 +pitch_top :53 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :162 +by :25 +cx :255 +cy :0 + +use :1 +size :12000 +main_model :3 +main_freq :77.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :61 +pitch_offset :200 +volume_model :0 +volume_freq :19.00 +volume_top :22 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :172 +by :25 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,12000,5,2.00,32,0,3,1.70,53,0,0,0.00,32,0,63,64,63,162,25,255,0}, +{1,12000,3,77.00,32,0,3,1.00,61,200,0,19.00,22,0,63,64,63,172,25,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/115.pxt b/res/universal/data/PixTone/115.pxt new file mode 100644 index 0000000..1459602 --- /dev/null +++ b/res/universal/data/PixTone/115.pxt @@ -0,0 +1,92 @@ +use :1 +size :40050 +main_model :4 +main_freq :100.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :8.00 +pitch_top :22 +pitch_offset :0 +volume_model :3 +volume_freq :8.00 +volume_top :8 +volume_offset:0 +initialY:63 +ax :28 +ay :44 +bx :81 +by :23 +cx :255 +cy :0 + +use :1 +size :40050 +main_model :4 +main_freq :150.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :8.00 +pitch_top :22 +pitch_offset :0 +volume_model :3 +volume_freq :8.00 +volume_top :8 +volume_offset:0 +initialY:63 +ax :28 +ay :44 +bx :81 +by :23 +cx :255 +cy :0 + +use :1 +size :40050 +main_model :4 +main_freq :294.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :8.00 +pitch_top :22 +pitch_offset :0 +volume_model :3 +volume_freq :8.00 +volume_top :8 +volume_offset:0 +initialY:63 +ax :28 +ay :44 +bx :81 +by :23 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,40050,4,100.00,32,0,3,8.00,22,0,3,8.00,8,0,63,28,44,81,23,255,0}, +{1,40050,4,150.00,32,0,3,8.00,22,0,3,8.00,8,0,63,28,44,81,23,255,0}, +{1,40050,4,294.00,32,0,3,8.00,22,0,3,8.00,8,0,63,28,44,81,23,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/116.pxt b/res/universal/data/PixTone/116.pxt new file mode 100644 index 0000000..c60def4 --- /dev/null +++ b/res/universal/data/PixTone/116.pxt @@ -0,0 +1,92 @@ +use :1 +size :30000 +main_model :5 +main_freq :28.00 +main_top :44 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :45 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :208 +by :63 +cx :255 +cy :0 + +use :1 +size :30000 +main_model :2 +main_freq :101.00 +main_top :44 +main_offset :0 +pitch_model :2 +pitch_freq :0.50 +pitch_top :63 +pitch_offset :118 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :176 +by :63 +cx :255 +cy :0 + +use :1 +size :30000 +main_model :2 +main_freq :86.00 +main_top :44 +main_offset :0 +pitch_model :2 +pitch_freq :0.50 +pitch_top :63 +pitch_offset :118 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :176 +by :63 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,30000,5,28.00,44,0,3,1.00,45,0,0,0.00,32,0,63,64,63,208,63,255,0}, +{1,30000,2,101.00,44,0,2,0.50,63,118,0,0.00,32,0,63,64,63,176,63,255,0}, +{1,30000,2,86.00,44,0,2,0.50,63,118,0,0.00,32,0,63,64,63,176,63,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/117.pxt b/res/universal/data/PixTone/117.pxt new file mode 100644 index 0000000..e5aa8e7 --- /dev/null +++ b/res/universal/data/PixTone/117.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :5 +main_freq :118.00 +main_top :19 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :63 +pitch_offset :0 +volume_model :0 +volume_freq :3.00 +volume_top :32 +volume_offset:0 +initialY:0 +ax :19 +ay :63 +bx :66 +by :41 +cx :255 +cy :0 + +use :1 +size :10000 +main_model :5 +main_freq :6.00 +main_top :24 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :208 +volume_model :2 +volume_freq :8.00 +volume_top :12 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :38 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,5,118.00,19,0,3,1.00,63,0,0,3.00,32,0,0,19,63,66,41,255,0}, +{1,10000,5,6.00,24,0,3,1.00,32,208,2,8.00,12,0,63,64,63,128,38,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/150.pxt b/res/universal/data/PixTone/150.pxt new file mode 100644 index 0000000..87ea4ed --- /dev/null +++ b/res/universal/data/PixTone/150.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :0 +main_freq :16.00 +main_top :63 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :166 +by :35 +cx :255 +cy :0 + +use :1 +size :1000 +main_model :5 +main_freq :1.00 +main_top :16 +main_offset :0 +pitch_model :0 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :91 +by :28 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,0,16.00,63,0,3,1.00,32,0,0,0.00,32,0,63,64,63,166,35,255,0}, +{1,1000,5,1.00,16,0,0,1.00,32,0,0,0.00,32,0,63,64,63,91,28,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/151.pxt b/res/universal/data/PixTone/151.pxt new file mode 100644 index 0000000..1464fd6 --- /dev/null +++ b/res/universal/data/PixTone/151.pxt @@ -0,0 +1,92 @@ +use :1 +size :5000 +main_model :0 +main_freq :20.00 +main_top :30 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :44 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :111 +by :19 +cx :255 +cy :0 + +use :1 +size :10000 +main_model :5 +main_freq :14.00 +main_top :41 +main_offset :0 +pitch_model :5 +pitch_freq :3.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :18 +bx :91 +by :12 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,5000,0,20.00,30,0,3,1.00,44,0,0,0.00,32,0,63,64,63,111,19,255,0}, +{1,10000,5,14.00,41,0,5,3.00,32,0,0,0.00,32,0,63,64,18,91,12,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/152.pxt b/res/universal/data/PixTone/152.pxt new file mode 100644 index 0000000..06ad4a8 --- /dev/null +++ b/res/universal/data/PixTone/152.pxt @@ -0,0 +1,92 @@ +use :1 +size :1000 +main_model :5 +main_freq :48.00 +main_top :30 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :166 +by :27 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,1000,5,48.00,30,0,5,1.00,32,0,0,0.00,32,0,63,64,63,166,27,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/153.pxt b/res/universal/data/PixTone/153.pxt new file mode 100644 index 0000000..2ddce9c --- /dev/null +++ b/res/universal/data/PixTone/153.pxt @@ -0,0 +1,92 @@ +use :1 +size :10000 +main_model :5 +main_freq :48.00 +main_top :30 +main_offset :0 +pitch_model :5 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :43 +bx :166 +by :41 +cx :255 +cy :7 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,10000,5,48.00,30,0,5,1.00,32,0,0,0.00,32,0,63,64,43,166,41,255,7}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/154.pxt b/res/universal/data/PixTone/154.pxt new file mode 100644 index 0000000..d958f89 --- /dev/null +++ b/res/universal/data/PixTone/154.pxt @@ -0,0 +1,92 @@ +use :1 +size :4000 +main_model :5 +main_freq :35.00 +main_top :30 +main_offset :0 +pitch_model :3 +pitch_freq :35.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :53 +ay :21 +bx :166 +by :13 +cx :255 +cy :0 + +use :1 +size :10000 +main_model :1 +main_freq :63.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :1.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :39 +bx :91 +by :20 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,4000,5,35.00,30,0,3,35.00,32,0,0,0.00,32,0,63,53,21,166,13,255,0}, +{1,10000,1,63.00,32,0,3,1.00,32,0,0,0.00,32,0,63,64,39,91,20,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/PixTone/155.pxt b/res/universal/data/PixTone/155.pxt new file mode 100644 index 0000000..5ed5184 --- /dev/null +++ b/res/universal/data/PixTone/155.pxt @@ -0,0 +1,92 @@ +use :1 +size :4000 +main_model :5 +main_freq :6.00 +main_top :32 +main_offset :0 +pitch_model :3 +pitch_freq :2.00 +pitch_top :32 +pitch_offset :0 +volume_model :3 +volume_freq :2.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :26 +ay :30 +bx :66 +by :29 +cx :255 +cy :0 + +use :1 +size :4000 +main_model :0 +main_freq :150.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :3 +volume_freq :2.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :26 +ay :30 +bx :66 +by :29 +cx :255 +cy :0 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +use :0 +size :22050 +main_model :0 +main_freq :440.00 +main_top :32 +main_offset :0 +pitch_model :0 +pitch_freq :0.00 +pitch_top :32 +pitch_offset :0 +volume_model :0 +volume_freq :0.00 +volume_top :32 +volume_offset:0 +initialY:63 +ax :64 +ay :63 +bx :128 +by :63 +cx :255 +cy :63 + +{1,4000,5,6.00,32,0,3,2.00,32,0,3,2.00,32,0,63,26,30,66,29,255,0}, +{1,4000,0,150.00,32,0,0,0.00,32,0,3,2.00,32,0,63,26,30,66,29,255,0}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, +{0,22050,0,440.00,32,0,0,0.00,32,0,0,0.00,32,0,63,64,63,128,63,255,63}, diff --git a/res/universal/data/Resource/BITMAP/pixel.png b/res/universal/data/Resource/BITMAP/pixel.png new file mode 100644 index 0000000..89d68f5 Binary files /dev/null and b/res/universal/data/Resource/BITMAP/pixel.png differ diff --git a/res/universal/data/Resource/CURSOR/CURSOR_IKA.png b/res/universal/data/Resource/CURSOR/CURSOR_IKA.png new file mode 100644 index 0000000..8090dbb Binary files /dev/null and b/res/universal/data/Resource/CURSOR/CURSOR_IKA.png differ diff --git a/res/universal/data/Resource/CURSOR/CURSOR_NORMAL.png b/res/universal/data/Resource/CURSOR/CURSOR_NORMAL.png new file mode 100644 index 0000000..20654e7 Binary files /dev/null and b/res/universal/data/Resource/CURSOR/CURSOR_NORMAL.png differ diff --git a/res/universal/data/Resource/ORG/Access.org b/res/universal/data/Resource/ORG/Access.org new file mode 100644 index 0000000..86c6e36 Binary files /dev/null and b/res/universal/data/Resource/ORG/Access.org differ diff --git a/res/universal/data/Resource/ORG/Anzen.org b/res/universal/data/Resource/ORG/Anzen.org new file mode 100644 index 0000000..6953f51 Binary files /dev/null and b/res/universal/data/Resource/ORG/Anzen.org differ diff --git a/res/universal/data/Resource/ORG/Balcony.org b/res/universal/data/Resource/ORG/Balcony.org new file mode 100644 index 0000000..f6397dd Binary files /dev/null and b/res/universal/data/Resource/ORG/Balcony.org differ diff --git a/res/universal/data/Resource/ORG/Ballos.org b/res/universal/data/Resource/ORG/Ballos.org new file mode 100644 index 0000000..d8b74a7 Binary files /dev/null and b/res/universal/data/Resource/ORG/Ballos.org differ diff --git a/res/universal/data/Resource/ORG/BreakDown.org b/res/universal/data/Resource/ORG/BreakDown.org new file mode 100644 index 0000000..71dde3d Binary files /dev/null and b/res/universal/data/Resource/ORG/BreakDown.org differ diff --git a/res/universal/data/Resource/ORG/Cemetery.org b/res/universal/data/Resource/ORG/Cemetery.org new file mode 100644 index 0000000..1af127d Binary files /dev/null and b/res/universal/data/Resource/ORG/Cemetery.org differ diff --git a/res/universal/data/Resource/ORG/Curly.org b/res/universal/data/Resource/ORG/Curly.org new file mode 100644 index 0000000..621e7ed Binary files /dev/null and b/res/universal/data/Resource/ORG/Curly.org differ diff --git a/res/universal/data/Resource/ORG/Dr.org b/res/universal/data/Resource/ORG/Dr.org new file mode 100644 index 0000000..bbb0b34 Binary files /dev/null and b/res/universal/data/Resource/ORG/Dr.org differ diff --git a/res/universal/data/Resource/ORG/Ending.org b/res/universal/data/Resource/ORG/Ending.org new file mode 100644 index 0000000..e679dce Binary files /dev/null and b/res/universal/data/Resource/ORG/Ending.org differ diff --git a/res/universal/data/Resource/ORG/Escape.org b/res/universal/data/Resource/ORG/Escape.org new file mode 100644 index 0000000..30f982f Binary files /dev/null and b/res/universal/data/Resource/ORG/Escape.org differ diff --git a/res/universal/data/Resource/ORG/Fanfale1.org b/res/universal/data/Resource/ORG/Fanfale1.org new file mode 100644 index 0000000..30084a9 Binary files /dev/null and b/res/universal/data/Resource/ORG/Fanfale1.org differ diff --git a/res/universal/data/Resource/ORG/Fanfale2.org b/res/universal/data/Resource/ORG/Fanfale2.org new file mode 100644 index 0000000..afdc2d4 Binary files /dev/null and b/res/universal/data/Resource/ORG/Fanfale2.org differ diff --git a/res/universal/data/Resource/ORG/Fanfale3.org b/res/universal/data/Resource/ORG/Fanfale3.org new file mode 100644 index 0000000..da0eb0c Binary files /dev/null and b/res/universal/data/Resource/ORG/Fanfale3.org differ diff --git a/res/universal/data/Resource/ORG/FireEye.org b/res/universal/data/Resource/ORG/FireEye.org new file mode 100644 index 0000000..61b3404 Binary files /dev/null and b/res/universal/data/Resource/ORG/FireEye.org differ diff --git a/res/universal/data/Resource/ORG/Gameover.org b/res/universal/data/Resource/ORG/Gameover.org new file mode 100644 index 0000000..5276ec0 Binary files /dev/null and b/res/universal/data/Resource/ORG/Gameover.org differ diff --git a/res/universal/data/Resource/ORG/Ginsuke.org b/res/universal/data/Resource/ORG/Ginsuke.org new file mode 100644 index 0000000..9737449 Binary files /dev/null and b/res/universal/data/Resource/ORG/Ginsuke.org differ diff --git a/res/universal/data/Resource/ORG/Grand.org b/res/universal/data/Resource/ORG/Grand.org new file mode 100644 index 0000000..5a8e754 Binary files /dev/null and b/res/universal/data/Resource/ORG/Grand.org differ diff --git a/res/universal/data/Resource/ORG/Gravity.org b/res/universal/data/Resource/ORG/Gravity.org new file mode 100644 index 0000000..6625416 Binary files /dev/null and b/res/universal/data/Resource/ORG/Gravity.org differ diff --git a/res/universal/data/Resource/ORG/Hell.org b/res/universal/data/Resource/ORG/Hell.org new file mode 100644 index 0000000..7115b7b Binary files /dev/null and b/res/universal/data/Resource/ORG/Hell.org differ diff --git a/res/universal/data/Resource/ORG/Jenka.org b/res/universal/data/Resource/ORG/Jenka.org new file mode 100644 index 0000000..645719d Binary files /dev/null and b/res/universal/data/Resource/ORG/Jenka.org differ diff --git a/res/universal/data/Resource/ORG/Jenka2.org b/res/universal/data/Resource/ORG/Jenka2.org new file mode 100644 index 0000000..c0ec90c Binary files /dev/null and b/res/universal/data/Resource/ORG/Jenka2.org differ diff --git a/res/universal/data/Resource/ORG/Kodou.org b/res/universal/data/Resource/ORG/Kodou.org new file mode 100644 index 0000000..5a980d6 Binary files /dev/null and b/res/universal/data/Resource/ORG/Kodou.org differ diff --git a/res/universal/data/Resource/ORG/LastBtl.org b/res/universal/data/Resource/ORG/LastBtl.org new file mode 100644 index 0000000..e422161 Binary files /dev/null and b/res/universal/data/Resource/ORG/LastBtl.org differ diff --git a/res/universal/data/Resource/ORG/LastBtl3.org b/res/universal/data/Resource/ORG/LastBtl3.org new file mode 100644 index 0000000..7daf808 Binary files /dev/null and b/res/universal/data/Resource/ORG/LastBtl3.org differ diff --git a/res/universal/data/Resource/ORG/LastCave.org b/res/universal/data/Resource/ORG/LastCave.org new file mode 100644 index 0000000..1e56324 Binary files /dev/null and b/res/universal/data/Resource/ORG/LastCave.org differ diff --git a/res/universal/data/Resource/ORG/MDown2.org b/res/universal/data/Resource/ORG/MDown2.org new file mode 100644 index 0000000..e2b96f9 Binary files /dev/null and b/res/universal/data/Resource/ORG/MDown2.org differ diff --git a/res/universal/data/Resource/ORG/Marine.org b/res/universal/data/Resource/ORG/Marine.org new file mode 100644 index 0000000..d4251c8 Binary files /dev/null and b/res/universal/data/Resource/ORG/Marine.org differ diff --git a/res/universal/data/Resource/ORG/Maze.org b/res/universal/data/Resource/ORG/Maze.org new file mode 100644 index 0000000..169bb20 Binary files /dev/null and b/res/universal/data/Resource/ORG/Maze.org differ diff --git a/res/universal/data/Resource/ORG/Mura.org b/res/universal/data/Resource/ORG/Mura.org new file mode 100644 index 0000000..0af7aed Binary files /dev/null and b/res/universal/data/Resource/ORG/Mura.org differ diff --git a/res/universal/data/Resource/ORG/Oside.org b/res/universal/data/Resource/ORG/Oside.org new file mode 100644 index 0000000..9153d66 Binary files /dev/null and b/res/universal/data/Resource/ORG/Oside.org differ diff --git a/res/universal/data/Resource/ORG/Plant.org b/res/universal/data/Resource/ORG/Plant.org new file mode 100644 index 0000000..26ca085 Binary files /dev/null and b/res/universal/data/Resource/ORG/Plant.org differ diff --git a/res/universal/data/Resource/ORG/Requiem.org b/res/universal/data/Resource/ORG/Requiem.org new file mode 100644 index 0000000..acd9125 Binary files /dev/null and b/res/universal/data/Resource/ORG/Requiem.org differ diff --git a/res/universal/data/Resource/ORG/Toroko.org b/res/universal/data/Resource/ORG/Toroko.org new file mode 100644 index 0000000..cc2ca9b Binary files /dev/null and b/res/universal/data/Resource/ORG/Toroko.org differ diff --git a/res/universal/data/Resource/ORG/Vivi.org b/res/universal/data/Resource/ORG/Vivi.org new file mode 100644 index 0000000..50a7b42 Binary files /dev/null and b/res/universal/data/Resource/ORG/Vivi.org differ diff --git a/res/universal/data/Resource/ORG/Wanpak2.org b/res/universal/data/Resource/ORG/Wanpak2.org new file mode 100644 index 0000000..6de1c19 Binary files /dev/null and b/res/universal/data/Resource/ORG/Wanpak2.org differ diff --git a/res/universal/data/Resource/ORG/Wanpaku.org b/res/universal/data/Resource/ORG/Wanpaku.org new file mode 100644 index 0000000..25349a7 Binary files /dev/null and b/res/universal/data/Resource/ORG/Wanpaku.org differ diff --git a/res/universal/data/Resource/ORG/Weed.org b/res/universal/data/Resource/ORG/Weed.org new file mode 100644 index 0000000..9ed0977 Binary files /dev/null and b/res/universal/data/Resource/ORG/Weed.org differ diff --git a/res/universal/data/Resource/ORG/White.org b/res/universal/data/Resource/ORG/White.org new file mode 100644 index 0000000..172259a Binary files /dev/null and b/res/universal/data/Resource/ORG/White.org differ diff --git a/res/universal/data/Resource/ORG/XXXX.org b/res/universal/data/Resource/ORG/XXXX.org new file mode 100644 index 0000000..64f9c04 Binary files /dev/null and b/res/universal/data/Resource/ORG/XXXX.org differ diff --git a/res/universal/data/Resource/ORG/Zonbie.org b/res/universal/data/Resource/ORG/Zonbie.org new file mode 100644 index 0000000..182c539 Binary files /dev/null and b/res/universal/data/Resource/ORG/Zonbie.org differ diff --git a/res/universal/data/Resource/ORG/ironH.org b/res/universal/data/Resource/ORG/ironH.org new file mode 100644 index 0000000..48e1cf5 Binary files /dev/null and b/res/universal/data/Resource/ORG/ironH.org differ diff --git a/res/universal/data/Resource/ORG/quiet.org b/res/universal/data/Resource/ORG/quiet.org new file mode 100644 index 0000000..0340484 Binary files /dev/null and b/res/universal/data/Resource/ORG/quiet.org differ diff --git a/res/universal/data/Resource/WAVE/Wave.dat b/res/universal/data/Resource/WAVE/Wave.dat new file mode 100644 index 0000000..fb001d3 Binary files /dev/null and b/res/universal/data/Resource/WAVE/Wave.dat differ diff --git a/res/universal/data/Soundtracks/Arranged/where_to_get_the_files.txt b/res/universal/data/Soundtracks/Arranged/where_to_get_the_files.txt new file mode 100644 index 0000000..ad12f09 --- /dev/null +++ b/res/universal/data/Soundtracks/Arranged/where_to_get_the_files.txt @@ -0,0 +1,4 @@ +You can get DM Dokuro's Cave Story Arranged soundtrack here: +https://www.reddit.com/r/cavestory/comments/9rz3p4/im_not_really_sure_where_to_post_this_but_i_made/ + +Extract the contents of the 'music' folder into this folder. diff --git a/res/universal/data/Soundtracks/Famitracks/where_to_get_the_files.txt b/res/universal/data/Soundtracks/Famitracks/where_to_get_the_files.txt new file mode 100644 index 0000000..f1043dc --- /dev/null +++ b/res/universal/data/Soundtracks/Famitracks/where_to_get_the_files.txt @@ -0,0 +1,6 @@ +To obtain these files, you'll have to extract them from Cave Story+ Switch. + +It's been so long since I've done this that I don't remember the steps, but I believe you need SciresM's 'hactool': +https://github.com/SciresM/hactool/ + +Extract the contents of the 'data/base/ogg17' folder into this folder. \ No newline at end of file diff --git a/res/universal/data/Soundtracks/New/where_to_get_the_files.txt b/res/universal/data/Soundtracks/New/where_to_get_the_files.txt new file mode 100644 index 0000000..d6a8800 --- /dev/null +++ b/res/universal/data/Soundtracks/New/where_to_get_the_files.txt @@ -0,0 +1,3 @@ +The easiest way to obtain the files for this soundtrack is to get them from the Steam release of Cave Story+: + +Extract the contents of its 'data/base/Ogg' folder into this folder. \ No newline at end of file diff --git a/res/universal/data/Soundtracks/Remastered/where_to_get_the_files.txt b/res/universal/data/Soundtracks/Remastered/where_to_get_the_files.txt new file mode 100644 index 0000000..d605ba8 --- /dev/null +++ b/res/universal/data/Soundtracks/Remastered/where_to_get_the_files.txt @@ -0,0 +1,3 @@ +The easiest way to obtain the files for this soundtrack is to get them from the Steam release of Cave Story+: + +Extract the contents of its 'data/base/Ogg11' folder into this folder. \ No newline at end of file diff --git a/res/universal/data/Soundtracks/Ridiculon/where_to_get_the_files.txt b/res/universal/data/Soundtracks/Ridiculon/where_to_get_the_files.txt new file mode 100644 index 0000000..0bc6a40 --- /dev/null +++ b/res/universal/data/Soundtracks/Ridiculon/where_to_get_the_files.txt @@ -0,0 +1,12 @@ +Welcome to hell. + +This is the hardest soundtrack to obtain: it requires extracting files from a Cave Story+ Switch update. The process is long and complicated, and it's been so long since I've done it that I honestly can't remember the steps. + +I recall that it involves decrypting a standard CS+ Switch installation package, combining it with the update package, and then extracting its contents. These packages come as '.nsp' files, and can be dumped from a hacked Nintendo Switch. + +Because it involves decryption, this process also requires that you obtain the 'title keys' to CS+ and its update data. + +I think SciresM's 'hactool' is one of the tools you'll need to do this: +https://github.com/SciresM/hactool/ + +When that's all done, extract the contents of the 'data/base/ogg_ridic' folder into this folder. \ No newline at end of file diff --git a/res/universal/data/Soundtracks/SNES/where_to_get_the_files.txt b/res/universal/data/Soundtracks/SNES/where_to_get_the_files.txt new file mode 100644 index 0000000..ce2efd9 --- /dev/null +++ b/res/universal/data/Soundtracks/SNES/where_to_get_the_files.txt @@ -0,0 +1,4 @@ +You can get vince94's SNES soundtrack here: +https://www.cavestory.org/forums/threads/cave-story-snes-soundtrack-mod.14225/ + +Extract the contents of the 'Ogg11' folder into this folder. \ No newline at end of file diff --git a/res/universal/data/mrmap.bin b/res/universal/data/mrmap.bin new file mode 100644 index 0000000..bbfe008 Binary files /dev/null and b/res/universal/data/mrmap.bin differ diff --git a/res/universal/data/sprites_og/Arms.png b/res/universal/data/sprites_og/Arms.png new file mode 100644 index 0000000..3e621c6 Binary files /dev/null and b/res/universal/data/sprites_og/Arms.png differ diff --git a/res/universal/data/sprites_og/ArmsImage.png b/res/universal/data/sprites_og/ArmsImage.png new file mode 100644 index 0000000..3dccbae Binary files /dev/null and b/res/universal/data/sprites_og/ArmsImage.png differ diff --git a/res/universal/data/sprites_og/Bullet.png b/res/universal/data/sprites_og/Bullet.png new file mode 100644 index 0000000..9d67a41 Binary files /dev/null and b/res/universal/data/sprites_og/Bullet.png differ diff --git a/res/universal/data/sprites_og/Caret.png b/res/universal/data/sprites_og/Caret.png new file mode 100644 index 0000000..9d94188 Binary files /dev/null and b/res/universal/data/sprites_og/Caret.png differ diff --git a/res/universal/data/sprites_og/Face.png b/res/universal/data/sprites_og/Face.png new file mode 100644 index 0000000..f303a22 Binary files /dev/null and b/res/universal/data/sprites_og/Face.png differ diff --git a/res/universal/data/sprites_og/Fade.png b/res/universal/data/sprites_og/Fade.png new file mode 100644 index 0000000..9d9b44d Binary files /dev/null and b/res/universal/data/sprites_og/Fade.png differ diff --git a/res/universal/data/sprites_og/ItemImage.png b/res/universal/data/sprites_og/ItemImage.png new file mode 100644 index 0000000..efdf2db Binary files /dev/null and b/res/universal/data/sprites_og/ItemImage.png differ diff --git a/res/universal/data/sprites_og/Loading.png b/res/universal/data/sprites_og/Loading.png new file mode 100644 index 0000000..99c7f24 Binary files /dev/null and b/res/universal/data/sprites_og/Loading.png differ diff --git a/res/universal/data/sprites_og/MyChar.png b/res/universal/data/sprites_og/MyChar.png new file mode 100644 index 0000000..1284e3c Binary files /dev/null and b/res/universal/data/sprites_og/MyChar.png differ diff --git a/res/universal/data/sprites_og/Npc/Npc0.png b/res/universal/data/sprites_og/Npc/Npc0.png new file mode 100644 index 0000000..866cbc0 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/Npc0.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcAlmo1.png b/res/universal/data/sprites_og/Npc/NpcAlmo1.png new file mode 100644 index 0000000..0be7a3f Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcAlmo1.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcAlmo2.png b/res/universal/data/sprites_og/Npc/NpcAlmo2.png new file mode 100644 index 0000000..4b4de84 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcAlmo2.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcBallos.png b/res/universal/data/sprites_og/Npc/NpcBallos.png new file mode 100644 index 0000000..b338a94 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcBallos.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcBllg.png b/res/universal/data/sprites_og/Npc/NpcBllg.png new file mode 100644 index 0000000..d556b87 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcBllg.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcCemet.png b/res/universal/data/sprites_og/Npc/NpcCemet.png new file mode 100644 index 0000000..6f5020c Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcCemet.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcCent.png b/res/universal/data/sprites_og/Npc/NpcCent.png new file mode 100644 index 0000000..25f1521 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcCent.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcCurly.png b/res/universal/data/sprites_og/Npc/NpcCurly.png new file mode 100644 index 0000000..9ff3c22 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcCurly.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcDark.png b/res/universal/data/sprites_og/Npc/NpcDark.png new file mode 100644 index 0000000..9937a6e Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcDark.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcDr.png b/res/universal/data/sprites_og/Npc/NpcDr.png new file mode 100644 index 0000000..4cbf09f Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcDr.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcEggs1.png b/res/universal/data/sprites_og/Npc/NpcEggs1.png new file mode 100644 index 0000000..1628eb0 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcEggs1.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcEggs2.png b/res/universal/data/sprites_og/Npc/NpcEggs2.png new file mode 100644 index 0000000..fba3b98 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcEggs2.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcFrog.png b/res/universal/data/sprites_og/Npc/NpcFrog.png new file mode 100644 index 0000000..cc2e781 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcFrog.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcGuest.png b/res/universal/data/sprites_og/Npc/NpcGuest.png new file mode 100644 index 0000000..deaeb90 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcGuest.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcHell.png b/res/universal/data/sprites_og/Npc/NpcHell.png new file mode 100644 index 0000000..95395f6 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcHell.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcHeri.png b/res/universal/data/sprites_og/Npc/NpcHeri.png new file mode 100644 index 0000000..be46611 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcHeri.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcIronH.png b/res/universal/data/sprites_og/Npc/NpcIronH.png new file mode 100644 index 0000000..7641672 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcIronH.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcIsland.png b/res/universal/data/sprites_og/Npc/NpcIsland.png new file mode 100644 index 0000000..42f85a6 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcIsland.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcKings.png b/res/universal/data/sprites_og/Npc/NpcKings.png new file mode 100644 index 0000000..fb5513e Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcKings.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcMaze.png b/res/universal/data/sprites_og/Npc/NpcMaze.png new file mode 100644 index 0000000..88fc0e2 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcMaze.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcMiza.png b/res/universal/data/sprites_og/Npc/NpcMiza.png new file mode 100644 index 0000000..8a90edb Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcMiza.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcMoon.png b/res/universal/data/sprites_og/Npc/NpcMoon.png new file mode 100644 index 0000000..fb44133 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcMoon.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcOmg.png b/res/universal/data/sprites_og/Npc/NpcOmg.png new file mode 100644 index 0000000..9999303 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcOmg.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcPlant.png b/res/universal/data/sprites_og/Npc/NpcPlant.png new file mode 100644 index 0000000..a0e0fd8 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcPlant.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcPress.png b/res/universal/data/sprites_og/Npc/NpcPress.png new file mode 100644 index 0000000..1ed582d Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcPress.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcPriest.png b/res/universal/data/sprites_og/Npc/NpcPriest.png new file mode 100644 index 0000000..95b0359 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcPriest.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcRavil.png b/res/universal/data/sprites_og/Npc/NpcRavil.png new file mode 100644 index 0000000..b49edb5 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcRavil.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcRed.png b/res/universal/data/sprites_og/Npc/NpcRed.png new file mode 100644 index 0000000..86e2a9a Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcRed.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcRegu.png b/res/universal/data/sprites_og/Npc/NpcRegu.png new file mode 100644 index 0000000..4f46bb9 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcRegu.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcSand.png b/res/universal/data/sprites_og/Npc/NpcSand.png new file mode 100644 index 0000000..381c0e8 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcSand.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcStream.png b/res/universal/data/sprites_og/Npc/NpcStream.png new file mode 100644 index 0000000..b547840 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcStream.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcSym.png b/res/universal/data/sprites_og/Npc/NpcSym.png new file mode 100644 index 0000000..de019e5 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcSym.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcToro.png b/res/universal/data/sprites_og/Npc/NpcToro.png new file mode 100644 index 0000000..ddce484 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcToro.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcTwinD.png b/res/universal/data/sprites_og/Npc/NpcTwinD.png new file mode 100644 index 0000000..09a003d Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcTwinD.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcWeed.png b/res/universal/data/sprites_og/Npc/NpcWeed.png new file mode 100644 index 0000000..4e0c499 Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcWeed.png differ diff --git a/res/universal/data/sprites_og/Npc/NpcX.png b/res/universal/data/sprites_og/Npc/NpcX.png new file mode 100644 index 0000000..11d4dfb Binary files /dev/null and b/res/universal/data/sprites_og/Npc/NpcX.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit01.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit01.png new file mode 100644 index 0000000..2c1367c Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit01.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit02.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit02.png new file mode 100644 index 0000000..174f784 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit02.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit03.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit03.png new file mode 100644 index 0000000..45417bb Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit03.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit04.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit04.png new file mode 100644 index 0000000..61df8c0 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit04.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit05.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit05.png new file mode 100644 index 0000000..a51ff71 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit05.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit06.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit06.png new file mode 100644 index 0000000..b61f3f0 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit06.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit07.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit07.png new file mode 100644 index 0000000..337375b Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit07.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit08.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit08.png new file mode 100644 index 0000000..1438ea6 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit08.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit09.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit09.png new file mode 100644 index 0000000..0e5d995 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit09.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit10.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit10.png new file mode 100644 index 0000000..d044cc4 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit10.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit11.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit11.png new file mode 100644 index 0000000..7efe4a8 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit11.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit12.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit12.png new file mode 100644 index 0000000..477ad2d Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit12.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit14.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit14.png new file mode 100644 index 0000000..9f87f0e Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit14.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit15.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit15.png new file mode 100644 index 0000000..96b86ef Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit15.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit16.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit16.png new file mode 100644 index 0000000..67669a9 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit16.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit17.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit17.png new file mode 100644 index 0000000..4a7e469 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit17.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/Credit18.png b/res/universal/data/sprites_og/Resource/BITMAP/Credit18.png new file mode 100644 index 0000000..ebe7123 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/Credit18.png differ diff --git a/res/universal/data/sprites_og/Resource/BITMAP/pixel.png b/res/universal/data/sprites_og/Resource/BITMAP/pixel.png new file mode 100644 index 0000000..89d68f5 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/BITMAP/pixel.png differ diff --git a/res/universal/data/sprites_og/Resource/CURSOR/CURSOR_IKA.png b/res/universal/data/sprites_og/Resource/CURSOR/CURSOR_IKA.png new file mode 100644 index 0000000..8090dbb Binary files /dev/null and b/res/universal/data/sprites_og/Resource/CURSOR/CURSOR_IKA.png differ diff --git a/res/universal/data/sprites_og/Resource/CURSOR/CURSOR_NORMAL.png b/res/universal/data/sprites_og/Resource/CURSOR/CURSOR_NORMAL.png new file mode 100644 index 0000000..20654e7 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/CURSOR/CURSOR_NORMAL.png differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Access.org b/res/universal/data/sprites_og/Resource/ORG/Access.org new file mode 100644 index 0000000..86c6e36 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Access.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Anzen.org b/res/universal/data/sprites_og/Resource/ORG/Anzen.org new file mode 100644 index 0000000..6953f51 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Anzen.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Balcony.org b/res/universal/data/sprites_og/Resource/ORG/Balcony.org new file mode 100644 index 0000000..f6397dd Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Balcony.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Ballos.org b/res/universal/data/sprites_og/Resource/ORG/Ballos.org new file mode 100644 index 0000000..d8b74a7 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Ballos.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/BreakDown.org b/res/universal/data/sprites_og/Resource/ORG/BreakDown.org new file mode 100644 index 0000000..71dde3d Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/BreakDown.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Cemetery.org b/res/universal/data/sprites_og/Resource/ORG/Cemetery.org new file mode 100644 index 0000000..1af127d Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Cemetery.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Curly.org b/res/universal/data/sprites_og/Resource/ORG/Curly.org new file mode 100644 index 0000000..621e7ed Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Curly.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Dr.org b/res/universal/data/sprites_og/Resource/ORG/Dr.org new file mode 100644 index 0000000..bbb0b34 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Dr.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Ending.org b/res/universal/data/sprites_og/Resource/ORG/Ending.org new file mode 100644 index 0000000..e679dce Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Ending.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Escape.org b/res/universal/data/sprites_og/Resource/ORG/Escape.org new file mode 100644 index 0000000..30f982f Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Escape.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Fanfale1.org b/res/universal/data/sprites_og/Resource/ORG/Fanfale1.org new file mode 100644 index 0000000..30084a9 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Fanfale1.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Fanfale2.org b/res/universal/data/sprites_og/Resource/ORG/Fanfale2.org new file mode 100644 index 0000000..afdc2d4 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Fanfale2.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Fanfale3.org b/res/universal/data/sprites_og/Resource/ORG/Fanfale3.org new file mode 100644 index 0000000..da0eb0c Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Fanfale3.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/FireEye.org b/res/universal/data/sprites_og/Resource/ORG/FireEye.org new file mode 100644 index 0000000..61b3404 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/FireEye.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Gameover.org b/res/universal/data/sprites_og/Resource/ORG/Gameover.org new file mode 100644 index 0000000..5276ec0 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Gameover.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Ginsuke.org b/res/universal/data/sprites_og/Resource/ORG/Ginsuke.org new file mode 100644 index 0000000..9737449 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Ginsuke.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Grand.org b/res/universal/data/sprites_og/Resource/ORG/Grand.org new file mode 100644 index 0000000..5a8e754 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Grand.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Gravity.org b/res/universal/data/sprites_og/Resource/ORG/Gravity.org new file mode 100644 index 0000000..6625416 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Gravity.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Hell.org b/res/universal/data/sprites_og/Resource/ORG/Hell.org new file mode 100644 index 0000000..7115b7b Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Hell.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Jenka.org b/res/universal/data/sprites_og/Resource/ORG/Jenka.org new file mode 100644 index 0000000..645719d Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Jenka.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Jenka2.org b/res/universal/data/sprites_og/Resource/ORG/Jenka2.org new file mode 100644 index 0000000..c0ec90c Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Jenka2.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Kodou.org b/res/universal/data/sprites_og/Resource/ORG/Kodou.org new file mode 100644 index 0000000..5a980d6 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Kodou.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/LastBtl.org b/res/universal/data/sprites_og/Resource/ORG/LastBtl.org new file mode 100644 index 0000000..e422161 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/LastBtl.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/LastBtl3.org b/res/universal/data/sprites_og/Resource/ORG/LastBtl3.org new file mode 100644 index 0000000..7daf808 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/LastBtl3.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/LastCave.org b/res/universal/data/sprites_og/Resource/ORG/LastCave.org new file mode 100644 index 0000000..1e56324 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/LastCave.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/MDown2.org b/res/universal/data/sprites_og/Resource/ORG/MDown2.org new file mode 100644 index 0000000..e2b96f9 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/MDown2.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Marine.org b/res/universal/data/sprites_og/Resource/ORG/Marine.org new file mode 100644 index 0000000..d4251c8 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Marine.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Maze.org b/res/universal/data/sprites_og/Resource/ORG/Maze.org new file mode 100644 index 0000000..169bb20 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Maze.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Mura.org b/res/universal/data/sprites_og/Resource/ORG/Mura.org new file mode 100644 index 0000000..0af7aed Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Mura.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Oside.org b/res/universal/data/sprites_og/Resource/ORG/Oside.org new file mode 100644 index 0000000..9153d66 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Oside.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Plant.org b/res/universal/data/sprites_og/Resource/ORG/Plant.org new file mode 100644 index 0000000..26ca085 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Plant.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Requiem.org b/res/universal/data/sprites_og/Resource/ORG/Requiem.org new file mode 100644 index 0000000..acd9125 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Requiem.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Toroko.org b/res/universal/data/sprites_og/Resource/ORG/Toroko.org new file mode 100644 index 0000000..cc2ca9b Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Toroko.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Vivi.org b/res/universal/data/sprites_og/Resource/ORG/Vivi.org new file mode 100644 index 0000000..50a7b42 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Vivi.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Wanpak2.org b/res/universal/data/sprites_og/Resource/ORG/Wanpak2.org new file mode 100644 index 0000000..6de1c19 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Wanpak2.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Wanpaku.org b/res/universal/data/sprites_og/Resource/ORG/Wanpaku.org new file mode 100644 index 0000000..25349a7 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Wanpaku.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Weed.org b/res/universal/data/sprites_og/Resource/ORG/Weed.org new file mode 100644 index 0000000..9ed0977 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Weed.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/White.org b/res/universal/data/sprites_og/Resource/ORG/White.org new file mode 100644 index 0000000..172259a Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/White.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/XXXX.org b/res/universal/data/sprites_og/Resource/ORG/XXXX.org new file mode 100644 index 0000000..64f9c04 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/XXXX.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/Zonbie.org b/res/universal/data/sprites_og/Resource/ORG/Zonbie.org new file mode 100644 index 0000000..182c539 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/Zonbie.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/ironH.org b/res/universal/data/sprites_og/Resource/ORG/ironH.org new file mode 100644 index 0000000..48e1cf5 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/ironH.org differ diff --git a/res/universal/data/sprites_og/Resource/ORG/quiet.org b/res/universal/data/sprites_og/Resource/ORG/quiet.org new file mode 100644 index 0000000..0340484 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/ORG/quiet.org differ diff --git a/res/universal/data/sprites_og/Resource/WAVE/Wave.dat b/res/universal/data/sprites_og/Resource/WAVE/Wave.dat new file mode 100644 index 0000000..fb001d3 Binary files /dev/null and b/res/universal/data/sprites_og/Resource/WAVE/Wave.dat differ diff --git a/res/universal/data/sprites_og/Stage/0.pxa b/res/universal/data/sprites_og/Stage/0.pxa new file mode 100644 index 0000000..6c69bb8 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/0.pxa differ diff --git a/res/universal/data/sprites_og/Stage/0.pxe b/res/universal/data/sprites_og/Stage/0.pxe new file mode 100644 index 0000000..d31a268 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/0.pxe differ diff --git a/res/universal/data/sprites_og/Stage/0.pxm b/res/universal/data/sprites_og/Stage/0.pxm new file mode 100644 index 0000000..e7c762e Binary files /dev/null and b/res/universal/data/sprites_og/Stage/0.pxm differ diff --git a/res/universal/data/sprites_og/Stage/0.tsc b/res/universal/data/sprites_og/Stage/0.tsc new file mode 100644 index 0000000..be08b99 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/0.tsc @@ -0,0 +1 @@ +0-FSS\S0-_pqd_fpxSST[_idlSSSS_hqg0-FSS\T0-_pqd_fpxSST[_idlSSST_hqg0-FSS\U0-_pqd_fpxSST[_idlSSSU_hqg0-FSS\V0-_pqd_fpxSST[_idlSSSV_hqg0-FSS\W0-_pqd_fpxSST[_idlSSSW_hqg0-0-0-0-0-0-0-0-FSTSS0-_nh|_irpSSTY_zdlSTSS_htPSUXY_fuh_zdlSVWS0-0-_iomUSSS]STTS0-_iomTSUS]STST0-0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-FSTST0-_vloSSST_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_hyhSTSU0-0-FSTSU0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSY_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSU[S_hyhSUSS0-0-FSTTS0-_vloSSTU_zdlSVXS_flo_zdlSSUS0-_vloSST[_zdlSVXS_flo_zdlSSUS0-_vloSSTW_zdlSVXS_flo_zdlSSUS0-_vloSSSU_zdlSVXS_flo_zdlSSUS0-_vloSSSV_zdlSVXS_flo_zdlSSUS0-_vloSSSW_zdlSVXS_flo_zdlSSUS0-_vloSSSX_zdlSVXS_flo_zdlSSUS0-_vloSSSZ_zdlSVXS_flo_zdlSSUS0-_vloSSS[_zdlSVXS_flo_zdlSSUS0-_vloSSS\_zdlSVXS_flo_zdlSSUS0-_vloSSTS_zdlSVXS_flo_zdlSSUS0-_vloSSTT_zdlSVXS_flo_zdlSSUS0-_vloSSTZ_zdlSVXS_flo0-_zdlSSUS_hyhSUSS0-0-FSUSS0-0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSYTS_idrSSST0-_wudSSZW]STSS]SSST]SSST0-0-FSWSS0-0-FSXSS0-FSXST0-FSXSU0-FSXSV0-FSXSW0-FSXSX0-FSXSY0-0-FSXSZ0-FSXS[0-FSXS\0-FSXTS0-FSXTT0-FSXTU0-FSXTV0-0-#SYSS0-0-0-FTSTS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZX]STSS]SSUS]SSST0-FTSUSp0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZY]STSS]SSST]SSST0-FTSVS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZZ]STSS]SSST]SSST0-FTSWS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSSZ[]STSS]SSST]SSST0-FTSXS0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS[\]STSS]SSST]SSST0-FTSYS0-_iomUSSS]TSYT_hyhTS\S0-FTSYT0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]SS\\]SSSS0-_idlSSST_zdlSWSS_idrSSST0-_wudSS\V]STSS]SSST]SSST0-0-FTS\S0-_fqsSWSS]STXS]SSSS0-_dqsSWSS]STSS]SSSS0-_idlSSST0-_iomUSSS]TUSS_hyhTTSS0-0-FTTSS0-_zdlSZVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXSV]SVXU]SVSS_zdlSSUS0-_fqsSXSW]SVXU]SWSS_zdlSSUS0-_fqsSXSU]SVXU]SUSS_zdlSSUS0-_fqsSXSX]SVXU]SXSS_zdlSSUS0-_fqsSXST]SVXU]STSS_zdlSSUS0-_fqsSXSY]SVXU]SYSS_zdlSSUS0-_fqsSXSS]SVXU]SSSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTY0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0-0-FTUSS0-_zdlSWVU0-_dqsSWSS]SSSU]SSSS_zdlSSXS0-_fqsSXTS]SVXU]TSSS_zdlSSUS0-_fqsSXTT]SVXU]TTSS_zdlSSUS0-_fqsSXS\]SVXU]S\SS_zdlSSUS0-_fqsSXTU]SVXU]TUSS_zdlSSUS0-_fqsSXS[]SVXU]S[SS_zdlSSUS0-_fqsSXTV]SVXU]TVSS_zdlSSUS0-_fqsSXSZ]SVXU]SZSS_zdlSSUS0-_dqsSWSS]SSSS]SSSS0-_vloSSTX0-_ipx_zdlSUSS_fpxSSSS0-_fqsSYSS]SVYS]SSSS0-_zdl\\\\_hqg0- \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/555.pxe b/res/universal/data/sprites_og/Stage/555.pxe new file mode 100644 index 0000000..7164051 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/555.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Almond.pxa b/res/universal/data/sprites_og/Stage/Almond.pxa new file mode 100644 index 0000000..35b783d Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Almond.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Almond.pxe b/res/universal/data/sprites_og/Stage/Almond.pxe new file mode 100644 index 0000000..d17814a Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Almond.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Almond.pxm b/res/universal/data/sprites_og/Stage/Almond.pxm new file mode 100644 index 0000000..4772196 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Almond.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Almond.tsc b/res/universal/data/sprites_og/Stage/Almond.tsc new file mode 100644 index 0000000..2eedf96 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Almond.tsc @@ -0,0 +1 @@ +0==F=IZ[NIPZb==?@ISNV====IR[Q0==F>IZ[NIPZb==?@ISNV===>IR[Q0==F?IZ[NIPZb==?@ISNV===?ISYW=E?FG==FEISYW=E??G==FDIR[Q0==F@IZ[NIPZb==?@ISNV===@IR[Q0==FAIZ[NIPZb==?@ISNV===AIR[Q0==FDIN[]=?B@G==?=G====IR[Q0==FEIP[]=@=CG=>>DG====IN[]=@=CG==@?G===?IR[Q0=>==IXRfISYW=E@FG=>=>I`\b==>>IN[]=>==G====G===?ISN\====Ia_N==ACG==F=G==>DG===F0=>=>IXRfIZ`TV-|{4-|}r{;;;I[\QIR[Q0=?==IXRfISYW=E@?G=?=AISYW=E?AG=?=@ISYW=E?@G=?=?ISYW=E?>G=?=>IZ`T\]R[-`UbaaR_LIf[W====IPY_\]R[V[T-`UbaaR_I[\QIPY\IZfQ====IdNV==@=IN[]=?B=G==>=G===>IdNV==>=IN[]=@==G===>G===?IdNV==??IN[]=?B>G==>=G===>IN[]=@==G===@G===?IdNV==@?IN[]=?B?G==>=G===>IdNV==@?IN[]=?B@G==>=G===>IdNV==@?IN[]=?BAG==>=G===>IQ[]=?B=IdNV==@?IQ[]=?B>IdNV==@?IQ[]=?B?IN[]=?B@G===>G====IdNV==@?IQ[]=@==IP[]=@=>G=>>DG====IN[]=@=>G==?>G===?ISY:=E?=ISY8=E?>ISY8=E??IZ`TNO[\_ZNYVaf-QRaRPaRQ-V[`UbaaR_-[\;-AI[\QIR[Q0=?=>IXRfIZ`TNO[\_ZNYVaf-QRaRPaRQ-V[`UbaaR_-[\;-AI[\QIR[Q0=?=?IXRfIZ`TY\dR_-YVSaLIf[W====IPY_ISY8=E?AY\dR_V[T-YVSaI[\QIPY\IS\[=?BDG==>CIdNV==B=IN[]=?BDG==>=G===@IdNV=>F?IN[]=?BDG====G====IdNV==B=IS\Z==>CIZ`TYVSa-Y\dR_RQI[\QIR[Q0=?=@IXRfIZ`TYVSa-V`-Y\dR_RQI[\QIR[Q0=?=AIXRfIZ`TR__\_I[\QIR[Q0=?>=IXRfISYW=E@=G=?>?ISYW=E?BG=?>>IZ`T\]R[-`UbaaR_LIf[W====IPY_ISY8=E?B\]R[V[T-`UbaaR_I[\QIPY\IdNV==A=IN[]=?BCG==>=G===>IdNV=>?EIQ[]=?BCIZ`T`UbaaR_-\]R[RQI[\QIR[Q0=?>>IXRfIZ`T`UbaaR_-\]R[RQI[\QIR[Q0=?>?IXRfIZ`TR__\_I[\QIR[Q0=?A=I]_VISYW=E?EG=?A>IZ`T`|zruv{t-v-p|vyrq-n|{qur-o|xr{-|o|4-nz;I[\QIPY_dvyy-|-nxr-vLIf[W====IPY_ITVa>=@=IQ[]=?A=IVa8==@=ISY8=E@FIPY_IPZb==>=T|-ur-Ja|-_|}rJ;IdNV=>C=I[\QI_ZbIR[Q0=?A>I]_VIZ`T;;;LI[\QIR[Q0=?A?I]_VIZ`TV4-n{tyrq-};f|-pn{4-tr-v-y||r;;;I[\QIR[Q0=?B=0=?B>0=?B?0=?B@0=?BA0=?BBI]_VIZ`TN-o|xr{-|o|;I[\QV4-rrry-qnzntrq;I[\QIR[Q0=?BC0=?BD0=?BE0=@==IXRfIZ`TISNP==>Fdrvq-}ynpr9-ruLI[\QV-|{qr-vs-uv-n|zr-|-|s-onr;I[\QIR[Q0=@=>IXRfISYW=E?@G=@=?IZ`TISNP==?Bauv-ur4-|{yznqr-v-unysn-|}r{;I[\QIPY_Y||x-yvxr-v4-pntu|{-|zruv{t;;;I[\QIR[Q0=@=?IXRfIZ`TISNP==>FW-ur-nsrur;I[\QNyy-uv-rpv-znxrzr-|{qr-w-un4-q|{urr;I[\QQ|{4-|-uv{xLI[\QIR[Q0=@=AI]_VIZ`TV;;;I[\QIR[Q0=@=BI]_VIZ`TX{|pxrq-|LI[\QIR[Q0=@=CI]_VIZ`Taurr-v-{|-r}y;;;I[\QIVaW==@=G=@=DIR[Q0=@=DI]_VIZ`T`ur-v{4-z|v{t9-o-v-y||xyvxr-ur4-vyy-nyvr;I[\QIPY_ITVa>=@=dvyy-|-r-ur-Ja|-_|}rJLIf[W====IPY\ITVa====IP[]=@=CG=?BFG====ISY8=E@BISY8=E@CISY:=E?FIZ`Tavrq-ur-|}r-|-ur-o|q;I[\QIR[Q0=@A=IXRfIQ[]=@A=IdNV==>=I`\b==??IdNV==>=IZ`Tf|-urn-|zruv{t-tvr;I[\QIPY\IdNV==B=IN[]=?B@G==>=G===>IdNV==AEIQ[]=?B@IN[]=@=>G===@G===?IdNV=>?EIN[]=@=>G===>G===?ISY:=E??ISY8=E?@ISY8=E?CIR[Q0=@B=ISYW=E?BG=@B>IR[Q0=@B>IQ[]=@B=IQ[]=@=>IQ[]=@=?ISY:=E??ISY:=E?CISY8=E?DIP[]=AB=G=>>DG===?IR[Q0=@C=ISYW=E@=G=@C>IR[Q0=@C>IXRfIZfQ===?IQ[]=@C=IN[]=?BEG==>=G===@IdNV=>==IN[]=?BEG==?=G====IPZb==?@IR[Q0=A==0=A=>0=A=?0=A>=0=AB=IXRfI`XW===CG=AB>I`X8===CIRcR=AB?0=AB> I`NaIRcR=AB?0=AB?IXRfISYW=E@DG=@=AISYW=E?EG=@=BIZfO===?IdNV==@=IZfQ===?IZ`TISNP==>FY||x;I[\QIPY_auv-v-n-|yqvr-s|zur-snpr;I[\QV4-nyy-on{trq-};I[\QIPY\ISNP====IS\[=?BAG==>CIN[]=AB=G===>G====IdNV==A=IZ`TISNP==?Baurr4-n-|{-z|r-yvxrv9-||;I[\Qdun-|{-rnu-p|yq4r;;;I[\QIPY_[|-n-Zvzvtn;[|9-|-q|-uv-zpuqnzntr;;;I[\QIPY\IPZb====IN[]=?BBG==?=G====IdNV==?=IS\Z==>CIN[]=AB=G===>G===?IZ`TISNP==?B...IdNV==B=IPY\ISNP====IdNV==@=IN[]=AB=G===>G===?IZ`TISNP==>FV4-vyy-nyvr..I[\QIPY_ISNP==?A7Oooo7I[\QIPY_aRNZ-F-N[[VUVYNaRQI[\QSNVYRQ-a\-QR`a_\f-aN_TRaI[\QIPY_Pb__R[a-S\_PR`V[`bSSVPVR[aI[\QIPY__Ra_RNaI[\Q_Ra_RNa..I[\QIPY\IS\[=?BEG==>CISY8=E?EISY:=E?AIZ[]=?BDG===DG==>EG====IPZ]==A=G==>BG==@=IPZ]==A=G==>CG==@=IP[]=?BEG=>EAG====IN[]=?BEG==>=G===@IdNV=>?EIN[]=?BEG==?=G====IS\Z==>CIdNV==?=IN[]=?BBG==>=G====IN[]=AB=G==@=G===?IdNV==A=IQ[]=B==IO\N=?==IPZb==??IO`Y====IP[]=AB=G=>E=G===?IN[]=AB=G==A=G===?IN[]=A>=G==?=G====IR[Q0=B==IQ[]=B==IO\N=?==IPZb==??IO`Y====IR[Q0>===IXRfIO\N=B==IZfQ=A=>ISY:=E?EIN[]=A>=G==>=G====IP[]=AB=G=>>DG===AIdNV==>==IZ`TISNP==>Fdr-qvq-vL.IdNV=>==I[\QIPY\ISNP====IS\[=A=>G==>CIP[]=A==G==CDG===?IdNV==B=IZ`TISNP==?CUz}u.I[\QIPY_]yyrq-v-|ss9-V-rr.I[\QIPY_ISNP==>Ff|.I[\QIPY_f|4r-un-vpu-u||rq-zr-q|{-urr.I[\QIPY_au|r-puvyqr{-unq-orror-nsr.I[\QIPY_ISNP==>CUn.-Or-vyr{.I[\QIPY_f|4r-{|-z|ur.I[\QQ|-|-rr{-x{|-unuv-vL.I[\QIPY_ISNP==>FdunLI[\QIPY_ISNP==>CUz}u;-auv-v-un-Vunr-no|-|o|;I[\QIPY_auv-v-ur-urn-|s-urvyn{q.I[\QIPY_Vs-|-|}-v9-ur-vyn{qvyy-snyy-|-ur-rnu.I[\QIPY_V-un-|-tn{q-}yn{LI[\QIPY_a|-nxr-ur-vyn{q-q|{vu-|-v{-n-oynr-|sty|L.I[\QIPY_S||y..I[\QIPY\ISNP====IP[]=A=?G=>@FG====IN[]=A=?G==A=G====IdNV=>==IZ`TISNP==?>Ur.I[\QIPY_dun-nr-|-q|v{tLOv{t-ur-p|r-|-uryno|n|-n-|{pr.I[\QIPY_aurr4-vyy-vzr.I[\QIPY\ISNP====IN[]=A==G==>@G===?IdNV==B=IP[]=A==G==E?G===?IdNV==?=IN[]=A==G==?BG===?ISZbIZ`TU||||||\\\\\\\\U..IdNV==B=I[\QIPY\IO\N=C==IdNV==@=IN[]=A==G==?=G===?IN[]=A=?G==@=G====IN[]=A>=G==@=G====IN[]=AB=G==?=G===?IQ[N=>E>IQ[N=>E?IPZ]==A=G==>BG==ADIPZ]==A=G==>CG==ADIdNV=>==IPZb====IS\Z==>CISY8A===ISY8=E@?ISY8=@A>ISY8=DE@ISY8=E@DIR[Q0>>==IXRfISY:A===ISN\===AIdNV==B=IZ`Tf|-r{r-qvz9-n{q-ur-|yqt|-qnx;;;I[\QIPY\IQ[]=AB=ISY8=E@=ISY:=E?BISY8=E?FISY:=E?DISY8=E==ISY8=E=>ISY8=@D?ISY8=A>>ISY8=@A=ISY8=>BFISY8=E@EISY:>CA?ISY8>CA@ISY:=E@FIQ[]=?A=IVaW==@=G>>=>IRcR>>>=0>>=>IdNV=>B=IXRfIZ`?Qvq-|-x{|-un-ur-vpu:|zn{Wr{xn-|{pr-unq-n-o|urLI[\QUv-{nzr-n-Onyy|;I[\QYvxr-uv-vr9-ur-vryqrq}|r-sn-or|{q-u|r-|sz|ny;;;I[\QIPY\IRcR>>>=0>>>=IP[]=@=CG=>>DG===?IN[]=@=CG==@?G===?IN[]=?BEG==>=G===>IdNV==FCIN[]=?BEG===>G====IdNV==B=IZ\c==BBG==>EIQ[N=>E@IVa8==?>IR^8==>CIZ`T;;;;;;LI[\QIPY_;;;f|-pn{-ornur;I[\QISNV===AIdNV==B=IR[Q0>?==IXRfIN[]>?==G==?=G===?ISYW=E?FG>?=>IRcR>?=?0>?=>IP[]=@=CG=>>DG====IN[]=@=CG==@?G===?IRcR>?=?0>?=?IS\[>?==G==>CISNV===>IdNV=>==ISN\===>Ia_N==BCG>?==G==CFG==DC \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Ballo1.pxe b/res/universal/data/sprites_og/Stage/Ballo1.pxe new file mode 100644 index 0000000..4cf30f9 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Ballo1.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Ballo1.pxm b/res/universal/data/sprites_og/Stage/Ballo1.pxm new file mode 100644 index 0000000..50cf723 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Ballo1.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Ballo1.tsc b/res/universal/data/sprites_og/Stage/Ballo1.tsc new file mode 100644 index 0000000..72aac38 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Ballo1.tsc @@ -0,0 +1 @@ +96O\\e\96hyzmhoy\\\\hrmu\\\\hqzp96O\\e]96hyzmhoy\\\\hrmu\\\]hqzp96O\\e^96hyzmhoy\\\\hrmu\\\^hqzp96O\\e_96hyzmhoy\\\\hrmu\\\_hqzp96O\\e`96hyzmhoy\\\\hrmu\\\`hqzp9696O\\ea96hyzmhyp\\\^h|~u96hoy\\_ehrmu\\\^hwq96hmz|\]\\f\\\\f\\\\hmhqzp9696hoy|\\\]f\\\cf\\]dh{\\]^9696O\`\\96O\`\]96O\`\^9696969696O\a\\96hpz|\a\\hyp\\\^96hwqhysZhz{phox~96hrmo\\^euLLnZhz{phox~mLLLX96LLL96LXhz{phox~uLLLL96LZZZhz{phox~LLLL96LLSL96LLLZhz{phox~mLuLLXL96LLLLXhz{phox~LLLLL96XLLXL96LZZZhz{phox~LLL96LLLZhz{phox~uLLLL96,LLuLL96LLZZZhz{phox~xZZZhz{phox~vLLLX96LLLLL96LLLZhz{phox~xXLLLuLZZZhz{phox~LLLL96LLL96SLZZZhz{phox~zXLLMhz{p96{LuYYhz{pLL{MMhz{phox{96hoy\\\`96hmz|\`\^f\]\\f\e\\hr{z\`\^f\\]b96hnx\e\\hmz|\e\\f\\]\f\\\\hqzp9696969696O\e\\96hmz|\e\\f]\\\f\\\a96hr{z\e\\f\\]b96hoz|\`\\f\__ef\\\^96hoz|\`\]f\__ef\\\\96hoy\\\\hmu\_\\96hr{y\\]bhmu\\a\96hn{m\]\\hmu\^\\96hmz|\`\^f\]\\f\\\\96hr{z\`\^f\\]b96hn{m\^\\96hoy\\\chnx\\\\96hqzp969696O]\\\96hrxv]b\\f]\\]96hrxW]b\\96hoy\\\\hn{m\^^\hmu\^\\96hoy\\_^hn{m\_\\hmu\\a\96hn{m\_]]hnx\\\\hqzp9696O]\\]96hwqhr{n\\\\f\\]b96hn{m]\\\hmu\^\\96hoh~m\\e]f\]]\f\\\\f\\\\9696 \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Ballo2.pxe b/res/universal/data/sprites_og/Stage/Ballo2.pxe new file mode 100644 index 0000000..6938d23 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Ballo2.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Ballo2.pxm b/res/universal/data/sprites_og/Stage/Ballo2.pxm new file mode 100644 index 0000000..178e955 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Ballo2.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Ballo2.tsc b/res/universal/data/sprites_og/Stage/Ballo2.tsc new file mode 100644 index 0000000..8e0a888 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Ballo2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMsssssssvPMfss|wPMssssssswPMPMfswssPMfswstPMfswsuPMfswtsPMfswttPMfswtuPMPMPMPMfsxssPMsstysssussssssxsssstPMstxsPMssuxcqqqsst|cjcPMdcccPMcccPMccssuxqqqqqoccoccPMccccPMcqssssPMuccccqqqssxsPMssuxssssPMstssucccccqqqccqqqqqPMswts}ssts}ssssswtt}ssts}sssussxscccccccccqqqPMstssdssxsssssPMssvwstssPMswss}ssss}ssssssusPMswst}ssss}sssuss{sPMssuxcddCssssPMstssPMswss}ssss}sssussusPMswst}sszs}sssussvuPMswst}ssss}ssssssusPMucccccqqqssxsPMccccccqqqssxsPMcccccccqqqqqssxsPMssuxjcccdssxsPMssssvdPMswsu}sss|}ssssstxsPMsssxccdPMcccqPMsst|ccccdsssxccddssssPMPMswst}ssus}sssssstsPMswss}ss{s}sssusssuPMsssxjcdssssPMswsu}sstyPMswsu}sstu}sssusssuPMswsu}stss}sssustssPMPMddstssssxsssstPMssxsssssPMssuxccccPMssuvjccqqqPMsszt}stus}ssss}ssssPMPMPMPM \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Barr.pxa b/res/universal/data/sprites_og/Stage/Barr.pxa new file mode 100644 index 0000000..a05c866 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Barr.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Barr.pxe b/res/universal/data/sprites_og/Stage/Barr.pxe new file mode 100644 index 0000000..196bb42 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Barr.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Barr.pxm b/res/universal/data/sprites_og/Stage/Barr.pxm new file mode 100644 index 0000000..db181fb Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Barr.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Barr.tsc b/res/universal/data/sprites_og/Stage/Barr.tsc new file mode 100644 index 0000000..e47a9a3 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Barr.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:=:=:=:S`a``=:lv|z`cfaj`a`c=:lv|z`cfbj`a`a=:lv|z`cf`j`a`b=:l{ul``aalq~`a``j````j```b=:lvq```dlq``aaj``idj``dbj``eb=:S`a`a=:lyl}wyPWPQl~tlu~t=:S`a`b=:l{ulvq```dlq``aaj``idj``dbj``eb=:S`a`c=:lyl}wPWPQl~tlu~t=:=:S`ae`=:S`aea=:S`aeb=:S`aec=:S`aed=:=:S`bi`=:lv|z`cg`j`bialu~t=:S`bia=:lv|z`cf`j````lyl}wlvqs```h\PQQl~tlt~`bi`ls~a```j``fcj```blu~t=:=:S`d``=:l{ulv|]`cfalv|]`cfb=:l}sls~`d``j``abj````lq~`d``j``b`j```dlqy`ad`=:lyl}wlvqs```ezPPQl~tlvqs````l{uls|=:lqy`a``ls}``ae=:l}w=:vPPrQlqy`ad`l~t=:l``dels~`ae`j```aj````lqy```d=:l``dels~`aeaj```aj````lqy```d=:l``dels~`aebj```aj````lqy```d=:l``dels~`aecj```aj````lqy```d=:l``dels~`aedj```aj````=:ls}```hlu~t=:=:S`e``=:=:Sa```=:l{ulv|[`cf`lv|[`cfalv|[`dd`lv|]`cbfl}wuQl~tls|P\PPQQl~tls|^^^^^l~txol~tl}r```blqy``c`l}t```bls~a```j``f`j```dls|lvqs```fW^^^WP=:PPtol~tls|QPyWP^l~t=:PPP^=:PtWPP=:P^l~t=:PPPP=:PPP\l~t=:PP=:^^^l~tls||PP^=:xPPP^l~tls|Ql~t=:PQlwya``dl~tls|PPPPol~t=:PPPPQl~tls|^^^^^l~tls|^^^PyPWP=:P^l~t=:lwy````{PPPP=:PPPPP=:PPyPP^^^l~t=:PPP^l~tls|=:lvqs```0ls}````=:lq``c`l``bf=:lq~a```j```hj````=:lq~`a``j```aj````=:lqy``a`=:l}t````=:ls~a```j``f`j````=:lqy`a``=:lq``c`l``bf=:lq~a```j```hj````=:lq~`a``j```aj````=:lqy``g`=:lq``c`l``bf=:lq~a```j```hj````=:ls~`d``j``aij```b=:ls~`a``j``ahj```b=:ls}```dj```hj``h`=:ls}```ej```hj``ha=:ls}```fj```hj``hb=:ls}```dj```ij``if=:ls}```ej```ij``ig=:ls}```fj```ij``ih=:=:=:l}wxQlqy``e`ls~`d``j``abj```blq~`d``j``c`j```bls|l{uls}``aalvqs``adPPQl~tls|lvqs```ePWP\PPQl~t=:yWPPPPP=:Ql~tlvqs````ls|yPP^l~t=:ls~`e``j``fgj```blqy`a``lq~`e``j``acj```blqy``e`lq~a```j```hj````l}wlvqs``aeP\PPyP=:PPPP^l~tls|lvqs```e}Ql~tls|yPPPQl~tls|lvqs```h]]PWP=:Pt\PWPQl~tls|lvqs``ae^^^^^l~tls|lvqs``afPWP\Po=:PtPP=:P^l~t=:sP\P^l~tls|lvqs```f^^^ol~tls|=:yWPP^l~tlvqs````ls|=:lq~`e``j``aej```blqy`aa`=:lyl}wlvqs```huQl~tlvqs``aels|r^l~t=:yPPPPP^l~tls|=:lq~`e``j``b`j```blvqs````ls|=:l{ulqy``e`l}wlvqs```h~\P\PWPP=:]]Ql~tlvqs````ls|=:lqy``e`=:lvqs```el}w~Pqwqy~Ql~t=:yPPPPPQl~t=:qPPyPP=:vyQl~tls|^^^^^l~tls|PWPPol~t=:PPPP=:Pol~za``alq~`d``j``c`j```bls|=:lvqs``adyPPQl~tls|=:lv|[`cfals}```dls~`d``j``fhj```blr|`d``lu~t=:=:Sa``a=:l{ulv|]`cfblv|]`cfals}```hl}wlvqs```ex^l~t=:qP\PPP^l~tls|lq~`d``j``a`j```blu~t=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Blcny1.pxe b/res/universal/data/sprites_og/Stage/Blcny1.pxe new file mode 100644 index 0000000..b3bcec5 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Blcny1.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Blcny1.pxm b/res/universal/data/sprites_og/Stage/Blcny1.pxm new file mode 100644 index 0000000..93bb4dc Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Blcny1.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Blcny1.tsc b/res/universal/data/sprites_og/Stage/Blcny1.tsc new file mode 100644 index 0000000..3f41969 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Blcny1.tsc @@ -0,0 +1 @@ +FSS\S0-_nh|_ioPTT\S_ioPTT\T_ioNTT\U_pqd_fpxSSVS_idlSSSS_hqg0-FSS\T0-_nh|_ioNTT\S_ioPTT\T_ioPTT\U_pqd_fpxSSVS_idlSSST_hqg0-FSS\U0-_nh|_pqd_fpxSSVS_idlSSSU_hqg0-FSS\V0-_nh|_pqd_fpxSSVS_idlSSSV_hqg0-FSS\W0-_nh|_ioPTT\S_ioNTT\T_ioPTT\U_pqd_fpxSSVS_idlSSSW_hqg0-0-FSS\X0-_nh|_idlSSSW_hqg0-0-0-FSTSS0-_nh|_vrxSSTT_dqsSTSS]SSSS]SSSU_idrSSSV0-_lwmSSUV]STST_wudSSYV]SS\V]SSS\]SSSW0-0-FSTST0-_nh|_wudSSYZ]SS\V]SSS\]SSSW0-0-0-0-FSTTS0-_sul_idrSSSU_wudSSYW]SS\U]SSST]SSTT0-0-FSTUS0-_nh|_dqsSTUS]SSSS]SSSU_vrxSSTT_idrSSSW_wudSSYY]SS\W]SSTS]SSS[0-0-#STVS0-_sul_pvjwCCCC0-vCCCCCCQQQ_qrg_hqg0-0-FST\\0-_sul_pvjqCQ_qrg_hqg0-_idrSSSWhQ_qrg_for_fpxSSVV_fuh_zdl\\\\_hqg0-0-FSUSS0-_nh|_p|gSSSS_gqsSUSS_zdv_pvjdCCCJ0-CCD_qrg_hqg0-0-FSUST0-_sul_pvj_wxu0-CCCCCCCCCCCCwkdwJvCdooOCironvD_qrg_hqg0-0-FSUTS0-_sul_iomTT\T]SUTT_iomTT\U]SUTU0-_sul_idrSSSW_p|gSSSU_zdlSSXS_wudSSYU]SS\X]SSSZ]SSZW0-FSUTT0-_sul_idrSSSW_p|gSSSU_zdlSSXS_wudSSYU]SS\X]SSZ\]SSZV0-FSUTU0-_sul_idrSSSW_p|gSSSS_zdlSSXS_wudSSYU]SS\X]STTZ]SSYU0-0- \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Blcny2.pxe b/res/universal/data/sprites_og/Stage/Blcny2.pxe new file mode 100644 index 0000000..394d1c6 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Blcny2.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Blcny2.pxm b/res/universal/data/sprites_og/Stage/Blcny2.pxm new file mode 100644 index 0000000..f229389 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Blcny2.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Blcny2.tsc b/res/universal/data/sprites_og/Stage/Blcny2.tsc new file mode 100644 index 0000000..0c9ee66 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Blcny2.tsc @@ -0,0 +1 @@ +_llulIFxximmulximmumxgmmunxllmtx}llllxIF_llumIFxxgmmulximmumximmunxllmtx}lllmxIF_llunIFxxllmtx}lllnxIF_lluoIFxxllmtx}llloxIF_llupIFxximmulxgmmumximmunxllmtx}lllpxIF_lluqIFxx}lntlvllmlvllllxlntlvllmrIFx}llqlx}lllpxIFIF_lmllIFxxllmmx}lmllvllllvlllnx}llloIFxllnovlmlmx}llrovlluovllluvlllpIFIF_lmlmIFxx}llrsvlluovllluvlllpIFIFIFIF_lmmlIFxx}lllnx}llrpvllunvlllmvllmmIFIFIFIF_lmnlIFxxmouovlmnmx\c\]xxIF_lmnmIFxx}lllpxllmrx}llsuvllupvllmlvllltIFIFIF_lmuuIFxxlloox\\\]IF\\\\IF\jjjxxxIFIF_lnllIFxxllllxlnllx}\\\cIF\\]xxIFIF_lnlmIFxxxIF}c\}h\]xxIFIF_lnmlIFxxmmumvlnmmxmmunvlnmnIFxx}lllpxlllnx}llqlx}llslvlluqvlllsvllspIF_lnmmIFxx}lllpxlllnx}llqlx}llslvlluqvllsuvllsoIF_lnmnIFxx}lllpxllllx}llqlx}llslvlluqvlmmsvllrnIFIF_lntlIFIF_lnulIF_lnumIF_lnunIF_lnuoIF_lnupIF_lnuuIFIFIFIFIF_lollIFxxxlollvllmrIFx}lltlx}lnuuvllnlvlllnIFxx}llnlIFxc\]xxx}lllmx}llqlIFxlnumvlnmsvllllx}lnumvllplvllllx}llqlIFx}lnulvllllvllllx}llnlIFxx}llntc\\\]IFc\\\\IF\jxxjjj\\\IFc\\\IF\\\jjjxx<}llllIFx}lnumvllqlvllllx}llmrIFxx}llnn\\\cIF\jjjxxIFx}llllx}llmrIFx}llmlIFx}lnulvlllovllllIFx}lnumvllmlvllllIFxlnunvlnsuvllllIFxlnuovlnsuvllllIFxlnupvlnsuvlllnx}lmllIFx}lnumvllpnvllllIFx}lnulvllllvllllIFxx}llnt}\jjj{xxx}llnn\jjj{IF\c\]xxIFx}llloxllmrxxlllnx}llrtvlrllvllnpvllmoIFxIFIF_lolqIF_lolrIF_lolsIF_lomlIFxxllllxllmtximmulximmumxgmmunx}llllIFx}lolqvllmmvlllnIFx}lntlvllmlvllllIFxlolqvllmrxox}lllo\]xIF\\\\hIF\c\\IF]]xxlntlvllmrxIFx}lolqvllolvllllx}llrlIFxlolqximoumxIF_lonlinIFIF_loolIFxxloolxllllx}lonlvllllvlllnIFx}x}llqlIFxlonlvllmrxx}lllmc\\\IFj\c\\\IF\jxIFc\\\\IF\\\\IF\]xx\{xIF\\\\\]xxxIFx}lonlvllllvllllx}llqlIFx}lonlvllolvllllx}llmnIFx}lonlvllplvllllx}llqlIFximounxllmrxIFIF_lpllIFxxxlpllx}llolxx}llllIFxlqllvlnqpvllllx}lllmIFx}lqllvllnlvlllnx}lllmIFx}lqllvllolvlllnx}lllmIFxlqllvllmrxllnlvllolIFxlolsxlntlIFx}lmllx}lllpIFxx}llnnIF\c\jjjxxx}llntc\\jIFc\\\\]xxx}lllpIFxlloqx}llpuvmnllvllutvlllrIFIF_lqllIFIF \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Cave.pxa b/res/universal/data/sprites_og/Stage/Cave.pxa new file mode 100644 index 0000000..c30cbaa Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Cave.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Cave.pxe b/res/universal/data/sprites_og/Stage/Cave.pxe new file mode 100644 index 0000000..d117d5d Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Cave.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Cave.pxm b/res/universal/data/sprites_og/Stage/Cave.pxm new file mode 100644 index 0000000..fcbf014 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Cave.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Cave.tsc b/res/universal/data/sprites_og/Stage/Cave.tsc new file mode 100644 index 0000000..e2fc191 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Cave.tsc @@ -0,0 +1 @@ +?FWXKFMW_::FOXN-::C?-::CCFUOcFWXKFMW_::FMXZ:=:;D:;;F^\K:::;D::CCD:::?D:::B-:;:;FZ\SFPKY:::>F^\K::?;D::C>D:::>D:::>-:;:<FZ\SFPKY:::>F^\K::?;D::C>D::;BD:::B-:;:=FZ\SFPKY:::>F^\K:::?D::C>D::;:D:::B-:;:?FZ\SFPKY:::>F^\K::?:D::C>D::;F^\K::?:D::C>D::;;D::;<-:;:BFZ\SFPVT:;:=D:;:CFW]QS~*yx1~*yzox+FXYNFOXN-:;:CFUOcF]Y_::;;FKXZ:;:BD::::D:::F^\K::?D:::>D::;:-:;;:FUOcFPKY:::>F^\K::?>D::C>D::;:D:::C-:;;;-:<::FZ\SFW]Q^ro*mk|mk}}*yp*k*]u*N|kqyx888FXYNFOXN-:<:;FKXZ:<:;D::::D::: \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Fall.pxa b/res/universal/data/sprites_og/Stage/Fall.pxa new file mode 100644 index 0000000..2267b9f Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Fall.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Fall.pxe b/res/universal/data/sprites_og/Stage/Fall.pxe new file mode 100644 index 0000000..f4e11db Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Fall.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Fall.pxm b/res/universal/data/sprites_og/Stage/Fall.pxm new file mode 100644 index 0000000..6376edc Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Fall.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Fall.tsc b/res/universal/data/sprites_og/Stage/Fall.tsc new file mode 100644 index 0000000..c653bb8 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Fall.tsc @@ -0,0 +1 @@ +rorororororororororororororororororororororororoمޅƆܓׅمڌroޅхم˓̅Յʅʓё܅ʅɅroԅʅʅ҅ޅro؅˅ʅדroʅ؅ӅɆroٌܑ؅ԅʓrororororororororo܆ٓ؅ʓم؅roх؅ʅroʓro؅ʅʅroڅׅʓro͑ӌمЅʓro؅م̅roޅɅʅԅԓޤڅӑroمͤroٌ؅ٓمʅroׅؓroБمroɅׅؓڅمؑ٤ӅڅɅّroمɅׅʓro܅ׅ˅؅roԅe؅roʆمڅ؅roمؑroم؅م؅roʅӌ؅نёڅՅroڅܓroׅёތ؅roʅԅɅ҅ʅroӅӅʅمʓ͓roڅӌمޓԅޓroroԆroԤԅمʅڅroԅԅܤroӅʅڅroڅʓґڌʅׅٓӅ؅בroɅ܅ممroʅمޅءroʅʅro݅Ʌޅroхܓro͑څܓroҤɅمʅхro˅Ʌڅʤroʆroٌ؅ʅʅro˅؅׆roޤхمڅЅroٓroمɅ؅ƅroʑޤroڅمنхمӑro͡ơӡ̡ԡӡ١Ρ̡͡١rorororoӌمڅro̤rorororororororo \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Frog.pxe b/res/universal/data/sprites_og/Stage/Frog.pxe new file mode 100644 index 0000000..11d3986 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Frog.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Frog.pxm b/res/universal/data/sprites_og/Stage/Frog.pxm new file mode 100644 index 0000000..2dfeab4 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Frog.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Frog.tsc b/res/universal/data/sprites_og/Stage/Frog.tsc new file mode 100644 index 0000000..da13082 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Frog.tsc @@ -0,0 +1 @@ +yvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvړڍyvyvyvŨyvЌььyvьٌѩíyvíŰíyvԫyvíyvьښyvیތѫИڌьyvњړЌјyvړ͌lyvٌьѫړьyvьyvíŰíyvyv卨Ԍѓyv͌ލތڌ͌͘yvڍړ嚨yvííyvߌьŻ嚨yvíь׌ڌyvѓߌڌߚyvíyvyv׍yvyvyvyvyvyvyvŨíyvyvҌӍíyvyvyv \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Gard.pxa b/res/universal/data/sprites_og/Stage/Gard.pxa new file mode 100644 index 0000000..907d106 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Gard.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Gard.pxe b/res/universal/data/sprites_og/Stage/Gard.pxe new file mode 100644 index 0000000..a28bb97 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Gard.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Gard.pxm b/res/universal/data/sprites_og/Stage/Gard.pxm new file mode 100644 index 0000000..7a4c0de Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Gard.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Gard.tsc b/res/universal/data/sprites_og/Stage/Gard.tsc new file mode 100644 index 0000000..95bb3c6 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Gard.tsc @@ -0,0 +1 @@ +YVo|||YV||||||||YVo||}YV|||||||}YVo||~YV|||||||~YVo||YV|||||||YVo||YV|||||||YVYVo|}||YV|~|}|~|~}|}|}YVw|~YV||||||||||||}YVo|}|}YVlsl±mYVo|}|~YV|||||}||||~~||YVYVYVo|||YV|||||}w|||||~YVo||}YV||~YVo||~YV|||~YVw|w|y||}y|~YVw|~|w|~}||}||||}|||YV|||||}lzYVl±lllYVllŻlzYV||~}lzllzzzYVlñllYVzYV|||||~|||||||||||YVlllYVñ||||YV|||||~|||||||~YV||}z||~}xlzzzsllYVl±llYVzzz||}lzzzYVlllllYV||~}zzzxllllYVzYVzzzzzzzzYVxlllYVllllz||}xllz||||YV||~||||||||||YV|||}|||||}}|YVm|||||||||||||||zzzzzlzzz||||YV||||||||||||~|||m||||YV|||||||||||||||||~|}||YV||||}~|||~||||}||||~YV||||||||~YV||}yzYVllŻlYVŻsl||||}||}zYVllllñz||}||||||||~YVllz||||YV||||||||~||~YV||||||||~|||YV|||mlmYV|||lzllmYV||||||||lŻlllmmLYV||||}|||||}YV||||}|||~||||~||||~||||||YV||||}||||~||~YV||||||||~||~YV||||~||||||||YV||||||||~||~||YV|||mYVlŻlŋm||}}zzzzzzzzzzzzYVzzzlzzz|||YVmmmm||}||}mlslYVm||||YV|||||~}zzzzzxlűzYVlllzlllxllYVŻllzlllŻYVzxlôlĭlYVlŻllllõYVlûyyzzz|||sllŻmm||||YV||||}||||~|||YV||~||~|||||||}YV||}||}|||||YV|||}|||~||}YV|||||||||||||}YV|}|||||}|YV||~}xlllYVlllYVll||||||YVmsllYVllm||}||}||}||~|||||s±lllYVlzYVxlsllŻmxlxlxYVsllzYV±lxlŻlz||}||||||||}|||||YV|||}||||~||YV||}YVYVYVYVo||}YVo||~YVo||YVw|~|}}|}~YV||||}|||}|||||YV|||||||YVYVlƵlz|||YV|||}|||||}|||}YVo||YVo||YV|~~||}YV|~|||YVzzzzzzYVo||YVo||YVYVo|||YVw|~~|||zzzsllllzYVlŻzzz±lzzzYV|||||||||||||}||YVo||}YVy|~}||w|||||||YV|||||}|YVllz|}|YVYV \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Hell.pxa b/res/universal/data/sprites_og/Stage/Hell.pxa new file mode 100644 index 0000000..8ab7b2e Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Hell.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Hell1.pxe b/res/universal/data/sprites_og/Stage/Hell1.pxe new file mode 100644 index 0000000..acdd610 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Hell1.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Hell1.pxm b/res/universal/data/sprites_og/Stage/Hell1.pxm new file mode 100644 index 0000000..3b31311 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Hell1.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Hell1.tsc b/res/universal/data/sprites_og/Stage/Hell1.tsc new file mode 100644 index 0000000..6989da1 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Hell1.tsc @@ -0,0 +1 @@ +rororororororororororororororoׅɓrororoڅхƅЅɅroͅړroх؅Ʌԅхrorororororororororororororororoʅԅцrororororoمƅʅʢro݅eͅɅޅrorororororororororo͓roɅׅޅԅroͅʅʓrororororoɅڅ܅مʅ͒roƅʅɅƅפro؅ʅ؅ؓroʅ؅בʅro؅ׅɅʅroؓrorororoʅɅ؅х؅roՅɅʅʑroɅʅʅɅɅro҅ӅӓӅʅӅޅɅroӅ̓roro \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Hell2.pxe b/res/universal/data/sprites_og/Stage/Hell2.pxe new file mode 100644 index 0000000..a27137b Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Hell2.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Hell2.pxm b/res/universal/data/sprites_og/Stage/Hell2.pxm new file mode 100644 index 0000000..4c25708 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Hell2.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Hell2.tsc b/res/universal/data/sprites_og/Stage/Hell2.tsc new file mode 100644 index 0000000..6b82149 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Hell2.tsc @@ -0,0 +1 @@ +ururururururururururururururururururururururururur͏ۈ׈ψӖurururururur͈ۈψ̈urḧ̈ֈur֔ur͈ۈ܈urԈ̈Ԗurۈֈ͈urۈ̖ururururڈ͈͈ur͈͔ۏۈurۈֈ̖ur͈ψۈ̈ur͈ԈΈˈur̈ֈֈܖurֈɈ͈ܔ͈ur܈ۈ׈̈ۈur׈ֈۖurur \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Hell3.pxe b/res/universal/data/sprites_og/Stage/Hell3.pxe new file mode 100644 index 0000000..5cbdd52 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Hell3.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Hell3.pxm b/res/universal/data/sprites_og/Stage/Hell3.pxm new file mode 100644 index 0000000..a0cb2a3 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Hell3.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Hell3.tsc b/res/universal/data/sprites_og/Stage/Hell3.tsc new file mode 100644 index 0000000..965cef6 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Hell3.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFPKS::::FOXN-::C;FWXKFPKS:::;FOXN-::C<FWXKFPKS:::FWXKFPKS:::>FOXN-::C?FUOcFPVT;?=D:;;;F^\K::B>D::C?D::;:D:::<-:;;;F^\K::B?D::C?D::;:D:::<-:<::FMXZ:<::D:=<:D::::FPV7;?=D:::;FMWZ:::BD::;>D:::;FMWZ:::CD::;>D:::;FMWZ::;:D::;>D:::;FMWZ::;;D::;>D:::;FMWZ::;D:::;FMWZ::;=D::;>D:::;FOXN-:<>:-:<>;FNXZ:<>;FKXZ:<>:D::;:D:::=FOXN-:<><-:<>=FNXZ:<>=FKXZ:<>>-:<>?FNXZ:<>?FKXZ:<>>D::;:D:::=FOXN-:-:D::;:D:::;FOXN-:D::::-:>::FZ\SFPVT:<:::;FPV5:<:;FQS^:::?FKW5:::?D:;::FMW_::;:Qy~*~ro*GWs}}svo*Vkxmro|G+FaKS:;@:FXYNF\W_FMV\^ro*Ws}}svo*Vkxmro|*s}*k*zyo|pvokzyx6*l~*s~}*kwwy*s}*vsws~on8FXYNFMV\cy*mkx*|ozvoxs}r*y|*}~ymuzsvos~r*s~ow}*n|yzzon*l*oxowso}8FXYNFOXN-:>:;FZ\SFKW5:::?D::=:<FZ\SFKW5::;:D::<>FW]QFQS^::;;Wk*ws}}svo}*sxm|ok}on*l*FX_W::::+FXYNFOXN-:C::FNXZ:C::F]UT::<>D::::F]U5::<>FZ\SFW]=Toxuk6*}oosxq*ro|*l|y~ro|1}wknxo}}6*myxpsxon*rsw*~y*~rs}pvyk~sxq*s}vkxn8FXYN^rk~*k}*~ro*wy}~*}ro*myvn*ny8FXYNOox*k}*ro*k}6*}ro*myvn*xy~l|sxq*ro|}ovp*~y*usvv*ro|*yxl|y~ro|888FXYNFOXN-:C:;FNXZ:C:;F]UT::IZ[NIPZb===EISNV===>IR[Q0==F?IZ[NIPZb===EISNV===?IR[Q0==F@IZ[NIPZb===EISNV===@IR[Q0==FAIXRfISYW>===G==FBIZ[NIPZb===EISNV===AIRcR=?==0==FBIZ[NIPZb===EISNV===AIR[Q0=>==IXRfI`\b==>>IN[]=>==G====G===?ISN\===AIa_N==B@G==FAG==DBG===B0=>>=IXRfI`\b==>>IN[]=>>=G====G===?ISN\====Ia_N==BCG==F=G=>>EG==E@0=?==IXRfISY8>===ISY8>=?BISY8>=@EIZfQ===?IdNV==B=IN[]=A==G==>=G====IZ`Tbnu.I[\QIPY\IN[]=A==G==?=G====IdNV==B=IR[Q0=A==IXRfISYW>==@G=A=AISYW>>=?G=A=@ISYW>==?G=A=?ISYW>==>G=A=>ISY8>==>ISY8>=@EIN[]=A==G==>=G====IZ`TRnnuu.IZfO===?I[\QIPY_Q|{4-xvyy-zr.I[\QV4z-n-uzn{.-V-w-t|zntvpnyy-{rq-v{|n-Zvzvtn.-V4z-uzn{.I[\QIPY_UuLI[\QIPY_;;;;;I[\QIPY_IN[]=A==G====G====ISNP==?Edun4-uvLf|4r-{|-|{r-|s-u|rxvyyr-|o|LI[\Qdryy9-|-pnrq-ur}n{-|ss-zr9-wz}v{t|-yvxr-un.I[\QIPY_f|-|yq{4-or-unnv|9-|yq-|LI[\QIR[Q0=A=>IXRfISY8>==?IZ`TISNP==?EV4z-V|u9-|{r-|s-ur uzn{-u|-pnzr-|-uvvyn{q-|-q|-rrnpu;I[\Qaun-vpu-Zvr-{rqzr-v{|-uv;;;I[\QV-zn{ntrq-|-tr-nn9o;;;w-y||x-n-zr;I[\QIPY_N{q-{|-V4z-px-urr.I[\QIPY_f|-pyvzorq-}-s|z-ur|vqr9-qvq{4-|;I[\QV4z-n{-r{tv{rr-|sp|{vqrnoyr-nyr{9I[\Qo-V4z-qrnuy-nsnvq|s-urvtu;;;I[\QIPY_\u9-|r9-|r-v-zr;;;I[\QIPY_V-{rr-u|yq4r-p|zr|-uv-vyn{q-v{-ursv-}ynpr;I[\QIR[Q0=A=?IXRfIZ`TISNP==?E[|9-{|9-ry-|-unr{|-r-s|-pu-n-}nurvp9n{qrq-yvyr-zn{;I[\QIR[Q0=A=@IXRfIZ`TISY8>==@ISNP==?EV|uLI[\Q-fr9-un4-zr;I[\QIPY_dun4-unLI[\Q`nxnz||4-|xv{t-|{n-|pxrLI[\QIPY_`|-ur4-vyy-nyvr;;;I[\QN-svrpr-|{r9-ur-v;I[\Q[|uv{t-yvxr-zr9-un4s|-r;;;I[\QIPY_Nyy-vtu9-ur{;I[\Qanxr-uv;I[\QISNP====ITVa>=?DIVa8==?DIPY_IPZb==>=T|-ur-JP|{|yyrJ;IdNV=>C=I[\QI_ZbIPY_ISNP==?EV-uv{x-un4-unur4-nsr;I[\QITVa====IRcR=A=A0=A=AIXRfIZ`TISNP==?ETvr-Z;-`nxnz||-zrtnq;I[\QIR[Q \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Jail.pxa b/res/universal/data/sprites_og/Stage/Jail.pxa new file mode 100644 index 0000000..a92f3fe Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Jail.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Jail1.pxe b/res/universal/data/sprites_og/Stage/Jail1.pxe new file mode 100644 index 0000000..bb4def6 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Jail1.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Jail1.pxm b/res/universal/data/sprites_og/Stage/Jail1.pxm new file mode 100644 index 0000000..4d543fc Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Jail1.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Jail1.tsc b/res/universal/data/sprites_og/Stage/Jail1.tsc new file mode 100644 index 0000000..e61798b --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Jail1.tsc @@ -0,0 +1 @@ +[Xq~~~[X~~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[X[Xq~~~[X~~~~~~~~~~~~~[X[Xq~~[X~~~~~~~~~~~~~~~~~~~~~~~~[X[X[Xq~~~[X[X~~~[X~~~~[Xxnx|||o[X~~~~~~~~~~~~~~~~~~~~y~~{~y~[XznnŶunů|õnǽnnn|[Xnunnn³[Xnn·nónnǽ|nn¶n|[XnŶnn½nn¶n½[Xn¶żnn|[Xnnðnn[Xƾ||||||unŶnón|Nnnnn[Xunnn½n³|[Xnn½nnnnŷ¶n|nůnnnǽn¶[XŶn·|[XnnnºnŶnz[X¶nnn½nnů|~~[X[Xq~~[Xy~ndz|nn¶núnnz[Xnnnn¶n½[Xǽn|~~~~~~~~[X[Xq~~[Xnůnznnijn³~~~~~~~~[X[Xq~~[X~~~~~~~~~~[X[X[Xq~~[X~~~~~~~~~~~~~~~~[X~~~o[X~~~uo[X[XunnznnǽÍ|||||[X~~~y~~~~~~~~~~~~~~~[Xq~[X[X \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Jail2.pxe b/res/universal/data/sprites_og/Stage/Jail2.pxe new file mode 100644 index 0000000..a79a22c Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Jail2.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Jail2.pxm b/res/universal/data/sprites_og/Stage/Jail2.pxm new file mode 100644 index 0000000..24af892 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Jail2.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Jail2.tsc b/res/universal/data/sprites_og/Stage/Jail2.tsc new file mode 100644 index 0000000..2183673 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Jail2.tsc @@ -0,0 +1 @@ +TQjwwwTQwwwwwwwTQjwwxTQwwwwwwxTQjwwyTQwwwwwwyTQjwwzTQwwwwwwzTQjww{TQwwwwww{TQTQjwwTQwwwTQwywwwwwxwwwwwww{TQwzwxwxxywwwywxwwTQwywwwwwwwwwwTQwwwywzwxTQTQjwxwwTQwwwyww|}wwywwwww{TQTQjwywwTQggguTQgggggwwwwrw|y{TQwzwwwxxxwwwwww}wwywwwwwxwwwwTQwxwwwww{wwxwwwwx|wwxwTQTQTQjw{wwTQGsgggggggggTQjw{wxTQghTQjw{wyTQggggghTQTQjw{wzTQgggggTQgggghgnggggTQghTQjw{w{TQggggiiTQnggggTQgggguuuTQjw{w|TQggggggTQggsgggngTQguuuTQgggguTQTQ \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Jenka1.pxe b/res/universal/data/sprites_og/Stage/Jenka1.pxe new file mode 100644 index 0000000..6f94c55 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Jenka1.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Jenka1.pxm b/res/universal/data/sprites_og/Stage/Jenka1.pxm new file mode 100644 index 0000000..83dbd6b Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Jenka1.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Jenka1.tsc b/res/universal/data/sprites_og/Stage/Jenka1.tsc new file mode 100644 index 0000000..121c82f --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Jenka1.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPQY\faiPPPP\end-*CPPYQ-*\mna\cmuPPQY\faiPPPQ\end-*CPPYR-*\mna\cmuPPQY\faiPPPR\end-*CPPYS-*\mna\cmuPPQY\faiPPPS\end-*CPPYT-*\mna\cmuPPQY\faiPPPT\end-*-*CPQPP-*\pri\souPPQQ\dnpPQPP\faoPPPT\traPPQPZPPYTZPPSUZPPRV-*-*-*CPRPP-*\key-*\itjPPQTZPRPQ-*\fljPUYTZPRQT-*\fljPUYSZPRQS-*\fljPUYRZPRQR-*\fljPUYQZPRQQ-*\fljPUYPZPRQP-*\key\msg\facPPQSw@@NNN_\nod-*iG@@@-*@N\nod\end-*-*CPRPQ-*\itMPPQT-*\fljPUYTZPRRT-*\fljPUYSZPRRS-*\fljPUYRZPRRR-*\fljPUYQZPRRQ-*\fljPUYPZPRRP-*\key\msg\facPPQSoL@A\nod\clr\gitQPQTm@@A\nod\clr-*\gitPPPP\facPPPPg@@@]p]N\nod\clr\cnpPSPPZPQSPZPPPP\dnpPTPQ\flMPRWT\facPPQSy@@@L-*i@@_\nod-*m@N\nod\clrwG@_\nod-*]r@]_\nod\facPPPP\clr\cmuPPPP\msghA\nod\clo-*\cnpPTPPZPPPYZPPPP\waiPPQP\mydPPPR\cnpPSPPZPQSRZPPPR\anpPSPPZPQPPZPPPR\waiPQRP\cmuPPQQ-*\cnpPTPPZPPQRZPPPP-*\msg\facPPPUhG@@L@j_\nod\clr\facPPQSaL@bN\nod\anpPSPPZPQRPZPPPR-*yG@@L@i@N\nod-*a@@@@@-*@@_\nod\clr\facPPQThMMA\nod-*h_@y@@m_\nod-*sG@L@@N\nod\clra@@@@N\nod-*t@L@@-*@@A\nod\clr\facPPQSs@@@@-*@NNN\nod\clr\facPPPUiG@@@@-*@@N\nod-*i@@@@@-*@@@N\nod\clrt@@@@-*@@A\nod\clr\facPPQSNNNNN\nod\clrmNNN\nod-*w@@@@-*@_\nod\clr-*\anpPTPPZPPSPZPPPP\facPPQThA\nod\clrp@@L@-*_A\nod\clr\facPPPUNNNNN\nod\clri@@@@N\nod-*s@G@@-*@N\nod\clo\cmuPPPP-*\waiPPUP\facPPPU\msgyG@@N\nod\clo-*\facPPPP\anpPTPPZPPQPZPPPP\waiPRPP\cmuPPQY-*\msg\facPPQS\cnpPSPPZPQSPZPPPPa@@NNN\nod-*t@MMN\nod\mydPRPP\clrNNNNN\nod\clrt@@@-*N\nod-*f@@-*@NNN\nod\clra@@@@@N\nod\clrc@@@-*@@@@-*@@@_\nod\flKPUYP\end-*-*CPRQP-*\key\msg\facPPQSs@@NNN\nod-*c@@@-*@@@@-*@@@_\nod\end-*-*CPRQQ-*\key\msg\facPPQSt@@N\nod-*g@N\nod\end-*-*CPRQR-*\key\msg\facPPQSi@@@-*@@@-*@N\nod\clrt@@@NNN\nod\end-*-*CPRQS-*\key\msg\facPPQSo@@@NNN\nod-*i@@@@-*@@@N\nod\end-*-*-*CPRRP-*\key\msg\facPPQSm@L@@N\nod\clr\gitQPQTt@@ @-*@@N\nod\clr-*\gitPPPP\cnpPSPQZPQSPZPPPP\dnpPTPQ\facPPPPg@@@]p]N\nod\clr\flMPRWT\facPPQShNNN\nod-*yG@@@-*@L@G@N\nod\clrNNNNN\nod\clri@G@@@-*@@@-*@@@@N\nod-*c@m@-*@@N\nod-*a@@@@-*@@@N\nod\clrcL@@m-*@@-*@@L\nod-*@@@-*@@@-*@@@N\nod\clrh@@@@-*L@@m@-*@@\nod-*@@NNN\nod\clrt@@N\nodg@N\nod\flKPUYQ\end-*-*CPRRQ-*\key\msg\facPPQSoN\nod\clr\gitQPQTyL@N\nod-*t@@@@-*@@N\nod\clr-*\gitPPPP\cnpPSPRZPQSPZPPPP\dnpPTPQ\facPPPPg@@@]p]N\nod\clr\flMPRWT\facPPQSt@@N-*wG@@@@NNN\nod\clrNNNNN\nod\clrh@@@@-*@m_\nod\clrt@@m@-*@@@-*@@@N\nod-*t@@L@@-*@@@N\nod\clr-*hNNN\nod\clrd@@@-*@@-*_\nod\clrNNNNN\nod\clri@@@@NNN\nod-*t@@mL-*@@@-*@@L\nod-*@@-*N\nod-*i@@@@-*L@@-*@@L\nod-*@@N\nod\clra@@@-*m@@-*@NNN\nod-*i@@@NNN\nod\clrd@@@_\nod-*d@@@-*@@-*@_\nod\clrNNNNN\nod\clrt@@@NNN\nod\flKPUYR\end-*-*CPRRR-*\key\msg\facPPQSt@@@-*@N\nod-*m@@G@-*@@-*@N\nod\clr\gitQPQTm@NNN\nod\clr-*\gitPPPP\facPPPPg@@@]p]N\nod\clr\cnpPSPSZPQSPZPPPP\dnpPTPQ\flMPRWT-*\facPPQSNNNNN\nod\clryG@@-*@L@G-*N\nod-*w@@@@-*@@NNN\nod\clri@G@@@-*L@G@@-*@N\nod-*t@@@-*@@@-*@@@NNN\nod\clroL@L@NNN\nod\clrtG@@-*N\nod\flKPUYS\end-*-*CPSPP-*\fljPUYPZPSQP\end-*CPSPQ-*\fljPUYQZPSQQ\end-*CPSPR-*\fljPUYRZPSQR\end-*CPSPS-*\fljPUYSZPSQS\end-*CPSPT-*\fljPUYTZPSQT\end-*-*CPSQP-*\key\msgaA\nod\end-*CPSQQ-*\key\msga@A\nod\end-*CPSQR-*\key\msga@@A\nod\end-*CPSQS-*\key\msgbN\nod\end-*CPSQT-*\key\msgfA\nod\end-*-*-*CPTPP-*CPTPQ-*-* \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Jenka2.pxe b/res/universal/data/sprites_og/Stage/Jenka2.pxe new file mode 100644 index 0000000..94b30aa Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Jenka2.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Jenka2.pxm b/res/universal/data/sprites_og/Stage/Jenka2.pxm new file mode 100644 index 0000000..83dbd6b Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Jenka2.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Jenka2.tsc b/res/universal/data/sprites_og/Stage/Jenka2.tsc new file mode 100644 index 0000000..f0a9ebf --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Jenka2.tsc @@ -0,0 +1 @@ +ǺΩ©ǽǺΩ©ǽǺΩ©ǽǺΩ©ǽǺéľҵΩ©ϾǺΩ©ǽµΩɩȩ˺ľҵҽɩޙޙ򸆃ęޚȽ뚵Ƚˆ횚ȽȆɩк©ɩŤŤк©Ωǽľ҆鍍ͦ᧧ȽȽȆк©ɩк©ͪޙޙ򶧵ȽͩɩɩŦˆޙ򧧧Ƚޙޙ򧧧Ƚާ槵Ƚyޙކݙޙ憃ޙާȽᥙ짧Ƚ짧ȽͪͤˆΩڙޙк©Ƚε˵ޙޥޥ膃ޙ᧵ȽǽľҵéޚȽ暵Ƚޙކݙޙ憃ޙޚȽǽľҵéᥙޙچݙާȽͪͤˆݙڙޙк©Ƚͩ˵ޙߙ놃ݙާȽޙ솃ݙ觧Ƚǽľҵڙޙކݙݙ姧Ƚ™솃ޙȽǽľҵޣȽǽ \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Kings.pxe b/res/universal/data/sprites_og/Stage/Kings.pxe new file mode 100644 index 0000000..b6665ff Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Kings.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Kings.pxm b/res/universal/data/sprites_og/Stage/Kings.pxm new file mode 100644 index 0000000..c8342b2 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Kings.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Kings.tsc b/res/universal/data/sprites_og/Stage/Kings.tsc new file mode 100644 index 0000000..9ed7131 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Kings.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlvqy````lu~t=:S``ia=:l}~qlvqy```alu~t=:S``ib=:l}~qlvqy```blu~t=:S``ic=:l}~qlvqy```clu~t=:S``id=:l}~qlvqy```dlu~t=:=:S`a``=:l{ul}~qlqy``e`lvqy```a=:lq~`c``j``a`j```0lqy``ig=:lq~`c``j```aj````lqy``e`=:lq~`c``j``b`j````lqy``fd=:lq~`c``j```aj````lqy``af=:lq~`c``j``c`j````lqy``e`=:lq~`c``j``d`j````lqy``ig=:lvq```alqyiiii=:=:S`c``=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Labo.pxa b/res/universal/data/sprites_og/Stage/Labo.pxa new file mode 100644 index 0000000..9b5a39a Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Labo.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Little.pxe b/res/universal/data/sprites_og/Stage/Little.pxe new file mode 100644 index 0000000..14d8dd0 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Little.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Little.pxm b/res/universal/data/sprites_og/Stage/Little.pxm new file mode 100644 index 0000000..b50449c Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Little.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Little.tsc b/res/universal/data/sprites_og/Stage/Little.tsc new file mode 100644 index 0000000..878e11b --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Little.tsc @@ -0,0 +1 @@ +TQjwwwTQwwwywwwwTQjwwxTQwwwywwwxTQjwwyTQwwwywwwyTQjwwzTQwwwywwwzTQjww{TQwwwywww{TQTQjwxwwTQwwxxwxwwwwwwwwwywwwyww|zwwywwwywx~zTQTQTQTQjwywwTQTQxz~zwyw}TQxz~ywywyTQsgnggggusgggnggtTQggngTQuTQggggggTQwywxrxz~yTQwwwwwxywwwwwwwggguTQwwxwwwxygghwx}wTQjwywxTQgguTQTQjwywyTQGsggggggTQggggwywzhTQggguTQjwywzTQtxz~yTQgsgngggTQuTQgngggggTQgggguwwxywwwwwwwTQwwxyggguTQwwxwwwwggghwx}wTQTQjwyxwTQxz~wwyxxrxz~xTQgggggTQguuugngggsTQgTQjwyxxTQgggguTQjwyywTQngsgTQTQjw|wwTQwy|wwwwwTQTQ \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Lounge.pxe b/res/universal/data/sprites_og/Stage/Lounge.pxe new file mode 100644 index 0000000..0198c46 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Lounge.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Lounge.pxm b/res/universal/data/sprites_og/Stage/Lounge.pxm new file mode 100644 index 0000000..2dce2ee Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Lounge.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Lounge.tsc b/res/universal/data/sprites_og/Stage/Lounge.tsc new file mode 100644 index 0000000..cf55ccd --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Lounge.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{xǪÞ{x{x{x{x{xij{x{x{x{x{x¸{xӎӎᜪ{xَڎӎӚӜ{xݎӕӎώӎ{xԎ眪{x{x{xǪӜŸ›Ҏӎ{x૜ž{xǪӎӎݎӜŸ™{xÞӎ૜ůê{x{x{xǪӎ{xՎӎҏ{xӎӎҎ{x᜜{x{x{x{x{x{x{xij{x{x{xӎ{xӎӎӎ{xҎ܎ӎ✪{xҎԎ{xҜ{xӎՎӎ{xnҎ֜{xӎ皎ݚҎ᜜{x{x{xӎ⎲ՎՎ{xԎ֎ۏ{x֚Ԏ玷ӎώ{x{x֎ώӜ{x{x{xǪ{xij{x{xܕӎώҎ{xᏪ᭎֏{xӎҎݎӎӜ{x{x{xǪ{xij{x{xێݎҜ{x{x{xǪǰ֚眪ܕӎӭ{xَ֚ӎ{xӜ{xӎҎ琎{xӎގҎӎӜ{xܚӎ՜Վݎ{xՎώӎԎӜݎӎݎ֭{xښӎҎ{xůDzů{xů{xÞů{xÞ{x{x{x{x{x{x{x \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Malco.pxe b/res/universal/data/sprites_og/Stage/Malco.pxe new file mode 100644 index 0000000..d720f4f Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Malco.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Malco.pxm b/res/universal/data/sprites_og/Stage/Malco.pxm new file mode 100644 index 0000000..afdc84f Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Malco.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Malco.tsc b/res/universal/data/sprites_og/Stage/Malco.tsc new file mode 100644 index 0000000..5ae31c2 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Malco.tsc @@ -0,0 +1 @@ +@=Vcclc@=otovccckoyt|ccccoxw@=Vccld@=otovccckoyt|cccdoxw@=Vccle@=otovccckoyt|ccceoxw@=Vcclf@=otovccckoyt|cccfoxw@=Vcclg@=otovccck@=oy}ckfcmccli@=oy}cgkdmcclh@=oyt|cccgoxw@=Vcclh@=ovcecdmcdcemcccc@=otcfccmccccmccce@=oyt|cccgoxw@=Vccli@=ovccddmcccimccid@=ovccddmcccjmccjj@=ovcecdmcdcemcccc@=otcfccmccccmccce@=oyt|cccgoxw@=Vcdcc@=oy}cgkcmcdcd@=o|occddowcdccoytcccgotcccimcclgmcdjdmccdj@=Vcdcd@=o|oz|SZSTowoxw@=Vcecc@=oy}cgkdmcece@=o~xozySSyyaow@=tvSSyyaowovSSSro}ccccov@=occgfoy^cgkdovcecdmcdcemccccSaowov@=o~xovccccotcfccmccdcmccccot|ccecowccceot|cghc@=ovcccgoz|wxStxTow@=vxvxSwxv|TTowovot|cchc@=oz{Towov@=ovcecfmccclmccccot|cchc@=ovccccotcfccmccedmccccot|cckcovccdd@=ovcecfmccdemcccc@=ozoytvccchwSSSS@=S|SSZ@=ro}cecgovZSTowoxxcecg@=Vcecd@=Vcece@=o|ozo@=SSaowoxw@=Vcecf@=o~xovcecfmccdemccccotcecfmccecmcccgot|cdgc@=o|ozoytvccchStxSrTowoytvcccco~xov@=ot|cdccovccdh@=oz@=ySSuTot|cdgcow@=ovccckoy`cgkcoy^cgkeoxw@=Vcecg@=o~xozStZTTowovSwSS@={zxSaow@=SS@=Saow@=oytvccdgotcecfmccfcmccccS_SZS@=rowovoytvccchuSS_SSZ@=SSaow@=SSSaowovt_S|ZSS@=SSaow@=wZS_S@=aow@=Srowov@=ovcccgovcecfmccfimccccoucecfoy^cgkcoxw@=Vcehc@=o~xozoSaaaowoxw@=Vcfcc@=oy}cgkfmcfcf@=oy}cgkdmcfcd@=o~xoztSaaarow@=|SZSSSS@=aowoxw@=Vcfcd@=o|ozaaaaaowoy}cgkemcfce@=|SSSSaowoxw@=Vcfce@=o~xoz|SSSSS@=Saow@=wSSSSSSro}ccccovot|cchc@=ovcfccmcdclmcccg@=otc3ccmccdcmcccg@=oucfccot|cchcowcfccoy^cgkfoy^cgkh@=oz{taaaow{t~SaaaowovZxStS|vxSxaow@=twSSzTowov{t~SySt|zSxTowov|ZwS|~xSStSSutv~@=x{_owovuStS|S~S{SSwS|@=t~xSx|xaaaowoy}cedimcfcgoxw@=Vcfcf@=oy}ckfcmcfdh@=oy}checmcfdg@=oy}cgkimcfdf@=o|}ccddmcfdc@=oy}cgkgmcfch@=o~xoz|ZwS|~xSStSSutv~@=x{_owovuStS|S~S{SSwS|@=t~xSx|xaaaowoy}cedimcfcgoxw@=Vcfcg@={row@={xSwZSxwStwSSvtZ@=zxS|Sxrowov{trTow@=tS{tS|StxwS||wxrTowov@=SStxStSzwSxTowovwxwTow@=|ZSt~xStSwxySuu@=ySTow@=xZSuS{tSwS@=|{xxxTowoy^cgkgoxxcfch@=Vcfch@=o~xoz|ZSxxwSSSvxv@=uu`t~|zStx|taow@=pv{tvtp_ow@=p}xy|{S}|vxp_@=twSpzSutxpaowov|ZSt~xSSuuStSSt@=Su|zSxStS{xStx|tTowoy}ceidmccccov{r@=x_S{xS}xy|{Sw@={txS{xS}|vx_SStS{tx@=|xwS{xaowoy^ceidoxw@=Vcfdc@=o|}ccckmcfddoxxcfch@=Vcfdd@=o|}ccdemcfdeoxxcfch@=Vcfde@=o~xoy^cgkio|`cccko|`ccddo|`ccde@=oz{txSSywStS{xStx|t@=xrowovoz|dcde{TowS{xSpv{tvtpTow@=oz|dcck{TowS{xSp}xy|{S}|vxpTow@=oz|dcdd{TowSxxS{xSpzSutxpTowov{xSxSSuxz|TTowoz|ccccov@=oytcccdot|cdccoyt|cccd@=oz|S|Sy||{xwTowoz|dcdfo|^ccdfoy^ceedov@=ovccdczSSpxpTot|cdicowoovzSTow@=uS{tSwSTowoxw@=Vcfdf@=o~xozzSTow@={StwSuS{tSwSTowoxw@=Vcfdg@=o~xozvxStwS||Stzt|Sx|xaow@=|ZwSyyxSSxSxt_Suaaaowoxw@=Vcfdh@=o~xoz{txZSxxSS|StS{|xTowov|ZSzwSSxxSaow@=|ZSSxS{xxS|{S@=xSSt~Saaaow@=|ZxSuxxS{|~|zSx{tS|@=z{SStv|txSxStx@=u_StuxS{StStaaaowovaaaaaowov@=|ZwSyyxSSxSxt_Suaaaowoxw \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Mapi.pxe b/res/universal/data/sprites_og/Stage/Mapi.pxe new file mode 100644 index 0000000..02be92f Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Mapi.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Mapi.pxm b/res/universal/data/sprites_og/Stage/Mapi.pxm new file mode 100644 index 0000000..4cb4e3e Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Mapi.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Mapi.tsc b/res/universal/data/sprites_og/Stage/Mapi.tsc new file mode 100644 index 0000000..28e1969 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Mapi.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIFIFIFxmqrovlmlmIFIF_lmllIFxxmqrpvlmlmxllmmx}lmllvllllvlllnIFx}lllpx}llmrvllupvllonvlllnIF_lmlmIFxx\c\]xxIFIFIF_lpllIFxx~lllnx}llnlIFxmqrovlpnlIFxmqrnvlpmmIFxmqrmvlplox\\\\\{xlplmxmlppvlplnx]xIF\\jxxIFIF_lplmIFxxiij\~h\jxxIFIF_lplnIFxxgmqrmx{x\}{xIF\jxxlploIF_lploIFxxh\j\\\\\IF\\\\~{xlpltxlplpxIFIF_lplpIFxx~\\h\\cIF\\h\{xlplqxlpltIF_lplqIFxx\\\\{xlpluxlplrIF_lplrIFxx\\\\IF\\{xlpluWddmdA>pupwddempzu}ddddpyxA>WddmeA>pupwddempzu}dddepyxA>WddmfA>pupwddempzu}dddfpyxA>WddmgA>pupwddempzu}dddgpyxA>WddmhA>pupwddempzu}ddd4pyxA>A>WdeddA>p}pzudddfpudddmnddmfnddefnddjhA>A>WdedeA>p}pzudddepuddgmnddmendddhnddejA>A>WdfddA>p}p{}[TTbT[TTTbpxpyxA>A> \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/MazeI.pxe b/res/universal/data/sprites_og/Stage/MazeI.pxe new file mode 100644 index 0000000..d301a2f Binary files /dev/null and b/res/universal/data/sprites_og/Stage/MazeI.pxe differ diff --git a/res/universal/data/sprites_og/Stage/MazeI.pxm b/res/universal/data/sprites_og/Stage/MazeI.pxm new file mode 100644 index 0000000..ec76fcc Binary files /dev/null and b/res/universal/data/sprites_og/Stage/MazeI.pxm differ diff --git a/res/universal/data/sprites_og/Stage/MazeI.tsc b/res/universal/data/sprites_og/Stage/MazeI.tsc new file mode 100644 index 0000000..d5109f9 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/MazeI.tsc @@ -0,0 +1 @@ +[Xq~~~[X~~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[X[Xq~~~[X~~~~~~~~~~~[X[Xq~~[X~~~nŽun|||[Xq~~[X~~~~~~~~~~~~~[Xq~~[Xq~~[X[Xq~~~[X~~~~~~~[X~~nnnúo~~y~~~[Xn¶nnno[X[X[X[Xq~~~[X~~~~~~~~~~~~oo|||||nnnǽnn¶[Xü|nn¶n[X~~~[X~~~~~~~~~~~~~[X[Xq~~[X~~~nǽnůn½nn¶n~~~~[Xy~[XN~~~~~~~~[X~~~~~~~~~~~~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~~~~~~~~[X~~~~[X~~~~~[X~~[X~~~~~~~~~[X[Xq~~[Xnnn|[X[Xq~~[X[X[Xq~~~[Xnnn½nǽ[Xżn|[Xnn¶|||[Xnn¶nunn|[Xnǽnnz[Xǽnijnn|||[X[Xq~~[X[Xq~~[Xnŷ±n¶nn¶[Xnnþn½nnþn½[XŶ|[Xn¶n·unnþ[X¶|[Xnnijnnijn[Xü·nnnn|[X[Xq~~[Xnnn|[X[Xnȳnnnnnn~~n{n~[X~~[X~.ؘ[X~ёјѨ[X[X \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/MazeM.pxe b/res/universal/data/sprites_og/Stage/MazeM.pxe new file mode 100644 index 0000000..d7eda37 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/MazeM.pxe differ diff --git a/res/universal/data/sprites_og/Stage/MazeM.pxm b/res/universal/data/sprites_og/Stage/MazeM.pxm new file mode 100644 index 0000000..cdda771 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/MazeM.pxm differ diff --git a/res/universal/data/sprites_og/Stage/MazeM.tsc b/res/universal/data/sprites_og/Stage/MazeM.tsc new file mode 100644 index 0000000..05becb1 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/MazeM.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``b`lq~`d``j``b`j```blvqy````lv|z`ghbj``iilu~t=:S``ia=:l}~qls}``b`lvqy```alu~t=:S``ib=:l}~qls}``b`lq~`d``j``b`j```blvqy```blv|z`ghbj``iilu~t=:S``ic=:l}~qls}``b`lvqy```clv|z`gh`j``iilu~t=:S``id=:l}~qls}``b`lvqy```dlv|z`gh`j``iilu~t=:=:=:=:S``ii=:ls}```gj``cej````=:ls}```hj``cej````=:ls}``bfj``caj`aaa=:lu~t=:=:S`a``=:lylvq````lq``ddj``idj``a`j``ad=:=:S`aa`=:l{ulv|z`ghcj`aablv|z`ghaj`aaa=:l``aalq~`aa`j````j```blvq```blq``dfj``ibj```cj```i=:S`aaa=:lv|[`gh`lv|]`gha=:l``aalq~`aa`j````j```blvq```blq``dfj`ae`j```cj``0i=:S`aab=:lyl}wyPWP^^^l~tlu~t=:=:S`c``=:S`c`a=:l{ul}~qls}``b`=:lq~`ca`j```aj````lvqy```d=:ls~`c`aj`aabj```blqy`a``=:lq~`ca`j````j````=:l}t```blt~`c`al}s=:lq~`d``j``b`j```blv|z`ghbj``iilu~t=:S`ca`=:l{ulv|[`gb`ls~`c``j`aaaj````lx}slqy``f`lq~`ca`j```aj````=:lqy`a``lvq```dlq``dbj`c`aj``bfj```e=:=:=:S`cc`=:lylv|z`ghbj`ccal}wPPP^l~tl``dcls|l}wP^l~tls|=:lv|[`ghb=:lqy``e`=:l``ga=:ls}```gj``cej````=:ls}```hj``cej````=:ls}``bfj``caj`aaa=:lqy``e`lu~t=:S`cca=:lyl}w^^^l~tlu~t=:=:S`d``=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/MazeO.pxe b/res/universal/data/sprites_og/Stage/MazeO.pxe new file mode 100644 index 0000000..3537a2c Binary files /dev/null and b/res/universal/data/sprites_og/Stage/MazeO.pxe differ diff --git a/res/universal/data/sprites_og/Stage/MazeO.pxm b/res/universal/data/sprites_og/Stage/MazeO.pxm new file mode 100644 index 0000000..61edc26 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/MazeO.pxm differ diff --git a/res/universal/data/sprites_og/Stage/MazeO.tsc b/res/universal/data/sprites_og/Stage/MazeO.tsc new file mode 100644 index 0000000..7cabed3 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/MazeO.tsc @@ -0,0 +1 @@ +VSlyyyVSyyy{yyyyVSlyyzVSyyy{yyyzVSlyy{VSyyy{yyy{VSlyy|VSyyy{yyy|VSlyy}VSyyy{yyy}VSVSVSVSVSlyzyyVSyyzzyzyyyyyyyyy{yyyyyyyyVSyy|yzyzVSyy|yy}yy}yyz~VSlyzyzVStyy}yy|yy}yy}yyz~VSVSlyzy~VSyyy}yy|yy}yyzyyz{VSVSly{yyVSi¼iuVSiwwwVSiiiVSiiiiwVSVSVSly|yyVSpii¼wVSuiiii¸iwtzyyyyy{yVSyy}y|y}VSyy{y|y|VSyyzy|y{VSyyyy|yztyyyyy~yVSuiuiiuipiwiuiuipVSipiiiii¸wpiiiiiwVSiiiiipVSiiiiwVSzyztyyziii†wyyyyVSly|yzVSiipiiwVSiiiiiVSiwVSly|y{VSvyyztyy{VSzyziiivwyyyyui¸iijVSiwVSiiiiiwVSly|y|VSiwVSiiiiiwVSly|y}VSiiipVSwVSpiiiiiVSiwVSiii¸uiiwVSVSly|zyVSyy}y|z|VSyy{y|z{VSyyzy|zzVSpiiwVSiiiiiiVSiuVSiiiîiiuVSiIiiwVSly|zzVSi¸iiiiVSi¸iiiuipVSi¸iiiiiVS¼wVSly|z{VSiwVSipiiiuVSi¸VSly|z|VSuii¸iiiVSiiiiiiiVSkikwVSVSly|{yVSyy{y|{{VSyyzy|{ztyyzVSyyzuijpiiiVSiwVSpiijiii¸VSiiuiVSiijyy{yi¸ipiiVSiiiwwwVSpiiiiVSi¸uiwwwiuiiwVSuiiwVSiiiiVSiwwwwwwiiiwVSiiuiipVSiiiVSwVSiipiiuVSipiiVS½iwwwVSly|{zVSyy{yiui®uiVSiipiiVSiiiiwwwVSly|{{VSyy{yiiiVS»wVSipiiiiuVSipiiVSiiiiwpiiiVSwVSiiiiVSiiiiVSiwpiii¸uVSiiiipVSuipiiiVS¸iwwwtyytyy|VSVSVSly}yyVSyy~yyyztyy~yy{{y}yyyy{zyyyyVSiiiwzyztyyztyyy}VSyyzyiiijyzyVSVS \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/MazeS.pxe b/res/universal/data/sprites_og/Stage/MazeS.pxe new file mode 100644 index 0000000..5103bc8 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/MazeS.pxe differ diff --git a/res/universal/data/sprites_og/Stage/MazeS.pxm b/res/universal/data/sprites_og/Stage/MazeS.pxm new file mode 100644 index 0000000..786595f Binary files /dev/null and b/res/universal/data/sprites_og/Stage/MazeS.pxm differ diff --git a/res/universal/data/sprites_og/Stage/MazeS.tsc b/res/universal/data/sprites_og/Stage/MazeS.tsc new file mode 100644 index 0000000..990c0f2 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/MazeS.tsc @@ -0,0 +1 @@ +?FWXKFMW_::=AFPKS:::>FOXN-:;::FZ\SFPKY:::F^\K::>:D::CD:::?-:;:=FPVT:@B;D:;:?FS^T::;AD:;:>FZ\SFW]QVymuon8FXYNFOXN-:;:>FZ\SF]Y_::<;D::C:D::;?D:::C-:;:@FUOcF]Y_::;;FKXZ:;:@D::::D:::F^\K::>D:::?D:::C +-:;;:FPVT:A>:D:;;;FUOcF]Y_::;;FKXZ:;;:D::::D:::=D:?::D:::>D::;=-:;;;FUOcF]Y_::;;FKXZ:;;:D::::D:::=D::CD::;=-:;<:FUOcFPKY:::>F^\K::>:D::C>D::;AD;<::D::=BD::;@ \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/MiBox.pxe b/res/universal/data/sprites_og/Stage/MiBox.pxe new file mode 100644 index 0000000..3fb5faf Binary files /dev/null and b/res/universal/data/sprites_og/Stage/MiBox.pxe differ diff --git a/res/universal/data/sprites_og/Stage/MiBox.pxm b/res/universal/data/sprites_og/Stage/MiBox.pxm new file mode 100644 index 0000000..35422ed Binary files /dev/null and b/res/universal/data/sprites_og/Stage/MiBox.pxm differ diff --git a/res/universal/data/sprites_og/Stage/MiBox.tsc b/res/universal/data/sprites_og/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Mimi.pxa b/res/universal/data/sprites_og/Stage/Mimi.pxa new file mode 100644 index 0000000..94e8fc0 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Mimi.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Mimi.pxe b/res/universal/data/sprites_og/Stage/Mimi.pxe new file mode 100644 index 0000000..5b68f62 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Mimi.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Mimi.pxm b/res/universal/data/sprites_og/Stage/Mimi.pxm new file mode 100644 index 0000000..7fc90d8 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Mimi.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Mimi.tsc b/res/universal/data/sprites_og/Stage/Mimi.tsc new file mode 100644 index 0000000..de5e265 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Mimi.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|z`cdaj``iels}```ilvqy````lu~t=:S``ia=:l}~qlv|z`cdaj``ifls}```ilvqy```alu~t=:S``ib=:l}~qlv|z`cdaj``igls}```ilvqy```blu~t=:S``ic=:l}~qlv|z`cdaj``ihls}```ilvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```ilvqy```dlu~t=:=:S``ie=:ls}``bhlvqy````lu~t=:S``if=:ls}``bhlvqy```alu~t=:S``ig=:ls}``bhlvqy```blu~t=:S``ih=:ls}``bhlvqy```clu~t=:S``ii=:ls}``bhlvqy```dlu~t=:=:=:S`a``=:lylv|z`cbdj`a`b=:lyz```aj`a`a=:l}w|^l~tlu~t=:S`a`a=:l``bblwya``alv|[`cbdlv|[`dda=:l}wPmqWP{m^l~tlwy````ls|luu`a`b=:S`a`b=:l``aals~`a``j````j````lvq```dlq```aj``idj``agj```h=:=:=:S`a`c=:lylvq````lq``aej``i`j``cfj``ad=:S`a`d=:lv|z`cbgj`aab=:lv|z`cf`j`aaa=:l{ul}wlvqs```iyWPz\l~t=:P]PP^l~tls|PPPP=:}P\PP=:PqP^l~tls|\PPPyP\=:Pol~tls|\PP=:PPPP=:\l~t=:PyWPPP=:PPPPW=:P^l~tlu~t=:=:S`a`e=:l{ulv|z`cf`j`a`fl``aalq~`a`ej````j```bluu`a`f=:S`a`f=:l{ulvq```dlq``adj``idj```ej```i=:=:S`a`g=:lyl``aals~`a`gj````j````lvq```dlq``aij``idj```gj``a`=:=:S`a`h=:lylvq```blq``agj``ibj```bj``aa=:=:S`a`i=:lylvq```dlq``b`j``idj``a`j```i=:=:S`aa`=:lylvq````lq``abj``i`j``eej```i=:=:S`aaa=:l{ulv|[`cbglv|[`ddcl}wlvqs```ioQl~t=:WPPol~t=:\PQl~t=:yWPPPP{=:PQl~tls|=:l}t````=:lq~`aaaj```hj````lqy`b`h=:lq~`aaaj````j```blqy``a`=:l``aalq~`a`gj````j```blqy``c`=:lt~`aaa=:l``aalq~`a`gj````j````lu~t=:=:S`aab=:lylvq```blq``afj``ibj```bj``ab=:=:=:=:S`b``=:lylv|z`cbbj`b`alv|[`cbbl``bbls~`b``j``baj````=:l}wPP^l~tlwya``bly[```blu[```bls|=:ls}``a`wPPm}PmQlqy`af`l~tl}luu`b`a=:S`b`a=:lyl}wWPP^^^l~tls|lPPPPPP=:P\PPP=:PPP^PPyP^l~tlu~t=:=:S`c``=:S`c`a=:l{ulv|z`cbcj`c`elv|[`cb`lv|[`cbc=:l}w^^^^^l~tls|=:l}r````lqy``e`l}t````ls~`c`aj``faj```blqy```hls~`c`aj``faj```d=:l}wlvqs```goPWPPPol~t=:yPPPP=:P^^^l~tls|yWP{^l~t=:yWPP]P=:P^l~t=:~PPP=:PP\PP=:PPP^l~tls|\PPP^l~tls|WPPPP\=:^l~t=:WPPP=:PPP^l~tlu~t=:=:S`c`b=:l{ulv|[`cb`lv|[`cbalv~`c`bj``afl}~qlvqy```dls}````lqy`a``=:l}wlvqs```gxPPPQl~tls|lvqs```h~QPyPWQl~tls|lvqs```gqPPP=:Pol~t=:WPPQ=:WPPPPQl~tls|lvqs```fWPPP^l~t=:yWPPPQl~tls|lvqs```g^^^l~t=:PPtP\=:PPWP=:PP^^^l~t=:yPPWPP=:\PPPP=:PP^l~tls|lvqs```fr^^^Pr^^^l~tls|lvqs```gP\PQl~t=:lvqs````ls|=:l}``acj``bb=:lqy``gelx}sls~`c`ij`ae`j```blq~`c`ij``a`j```blq``c`=:l}woQl~tls|=:lqy``a`=:lq~`c``j```fj```b=:lq~`c`aj```fj````=:lqy`a``=:lq~`c``j```fj```b=:lqy``h`=:lt~`c``=:ls}```i=:lv}``afl}slt~`c`ilu~t=:=:=:S`c`e=:l{ul}wlvqs```grPP^^^l~t=:PPPP=:P^l~tlu~t=:S`c`f=:l{ul}wlvqs```gwQl~tls|Ql~t=:WPPP=:PQl~tlu~t=:S`c`g=:S`c`h=:l{ul}t```blvqy```bls}````lqy``b`=:l}wlvqs```gwPPPQl~tls|lvqs```h~Ql~tls|=:lq~`c`gj```fj```blqy`0f`=:lq~`c`fj```fj```bl``aflqy`a``lt~`c`glv|]`cgals}```ilu~t=:S`c`i=:=:=:S`caa=:l{ul}wZPZl~tls|Ql~tls|=:l}r````lq~`caaj```bj```dlqy``c`l}t````=:lv|z`aefj`cac=:lv|z`ab`j`cab=:lv|z`cf`j`cad=:l}wQPPP^^^l~tls|ol~t=:\P^l~tls|PPPqWP\Pol~t=:WPPP^l~tls|P\P^l~t=:PWPPP=:RPtR^^^l~t=:tPPPP^^^=:tPPPP=:ol~tlq~`caaj````j```blu~t=:S`cab=:l}w\PP^l~tls|PPPP^l~t=:PPWPPP=:P^l~tlq~`caaj````j```blu~t=:S`cac=:l{ul}wyPPPPP=:qWP^^^l~tls|qPPPPP=:ol~tlq~`caaj````j```blu~t=:S`cad=:l{ul}wol~t=:WPPol~tls|\PWPP^l~t=:~PPPPPP=:PP^^^l~tlq~`caaj````j```blu~t=:=:S`d``=:l{ulv|]`aeelv~`d``j``aflvqy```dl}~qls}````lqy`a``lq~`f``j``aaj```b=:l}wlvqs```c|PPPPQl~tlq~`f``j````j```bls|lq~`fa`j````j````lvqs```gxPPQl~tls|WuPPP=:PQl~tls|PPPP=:PPPPP=:PPP^l~tlq~`f``j``aaj```bls|lvqs```cP]PQl~tlq~`f``j````j```bls|lvqs```gyPPWPPP=:\PyPPyWP=:PPPQl~tls|ls}```i=:lv}``aflqy``e`lu~t=:=:=:S`da`=:S`daa=:S`db`=:l{ulx}sls}````=:ls~`da`j``dbj```b=:ls~`daaj``gdj````=:lq~`fa`j````j````lqy`a``l}wlvqs```gPW^^^ol~tls}```ilvqy```dls|lvqs```bWP^l~tls|PtPPP=:PPPP=:PPP^l~tls|lvqs```i]]PPP=:PPoQl~tls|lvqs```bPP^^^=:^^^PPP^l~tls|lvqs```iqPWPPP=:PPPol~tls|lvqs```bqPPPyPP\=:WPPP=:^l~tls|PPPP=:WPP^l~tls|lvqs```iy^^^l~tls|yPPP=:\P^^^l~tls|lvqs```bPPP^^^=:qPPP^^^l~tls|lvqs```gyWPPP=:PQl~tls|=:lv|]`aedlv|[`aeg=:lvq```dlq```aj`fb`j```ej```h=:=:=:S`e``=:l{ul}wlPPPPPPPPPPPPjPPv=:PPPP|jPPPPjPw=:PPPPPPPPPPPtjPqWPxl~t=:lu~t=:=:S`e`a=:l{ul}wl=:PPPPPPPPPPPPPPPvl~tlu~t=:S`e`b=:l{ul}wl=:PPPPPPPPPPPPPPPPPl~tlu~t=:S`e`c=:l{ul}wl=:PPPPPPPPPPPPP}Pw=:PPPPPPPPPPPPPtQP~Pul~tlu~t=:S`e`d=:l{ul}wl=:PPPPPPPPPPPPPPqWPxl~tlu~t=:S`e`e=:l{ul}wl=:PPPPPPPPPPPPPPPqPxl~tlu~t=:=:=:S`f``=:lv|z`bbdj`f`b=:lv|z`cbej`f`a=:l{ulv|[`cbel[```bjf``b=:l}wlvqs```a\PyWP^^^l~tls|PWP=:PP}\=:PPP^l~t=:xPWP\l~t=:PPPP=:P}PP=:PPPP\l~t=:PPP=:P^l~tls|^^^^^l~tls|yP^l~tls|PWPPP=:Pol~tls|}PWPP=:P=:w^l~t=:vPPPP=:^l~tlu~t=:=:=:S`f`a=:l{ul}wlvqs```avPPP=:PP^l~t=:PPPPw=:PPP=:qWP^l~tlu~t=:S`f`b=:l{ul}wlvqs```axPPP=:Pol~tlu~t=:=:S`fa`=:lv|z`bbdj`faa=:l{ul}wlvqs```gPPPPP=:PPPP=:P^l~tlu~t=:S`faa=:l{ul}wlvqs```gP^^^l~tlu~t=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Momo.pxe b/res/universal/data/sprites_og/Stage/Momo.pxe new file mode 100644 index 0000000..67cd58c Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Momo.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Momo.pxm b/res/universal/data/sprites_og/Stage/Momo.pxm new file mode 100644 index 0000000..e58b14d Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Momo.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Momo.tsc b/res/universal/data/sprites_og/Stage/Momo.tsc new file mode 100644 index 0000000..bad33d1 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Momo.tsc @@ -0,0 +1 @@ +nknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknkЁցƁƁnkƁƁǏnkɍ́ԏ΁ρЏnkƈԁӏnkŁЁƁnkԁȁՁnkӈԁƏnkՁƁƁŁnkԍƁŁЁnkƁӁƏnkЁƁŁƁŁnkƁƁǁƁŏځԁōnkՁƁ́֏ՁՈԁӁnkӁƏՁ؁΁nkρȁՍnkƁՁ́ՁnkЁƁӈԁƏnkψՁƁƁnkƁԁՍɏnknknknknkՁŁՁnkԁӏnk؍ЁŁƁnkǁƏnknknkՁŁnk؁ԏnkӁבϏ́ŁnkԁЁɁnkՏnknknknknknkՁŁnk؁ԏnkӁדϏ́ŁnkԁЁɁnkՏnknknknknknkƁցځՁؠڠnkӁōϏnknknkɍŁӏnkӁӁŏƍՁԁnkӁ؏nknkՁƁ̞nkȍƁȏnkԁՈԁnkȍՏƁԁȁnkԁψՁnkЁ́ɁԏnkՁɁaՁ́ύnkցŁƁƁnḱЁΏƁցɁƁЁӠnknknkŁցЁ́nkρŁɏƈԁԁōnkЁՁƈԁnkӏnknknkЁƁƁՍnḱŁځnḱӏnkǁցŁՁŁnkƁǁƁnkځƁՁƍnḱՁƁnkЁ́ɁՏƁȁƁ́nkӞnknknkЁƁƁՍnḱŁځnḱӏnkƁԁnkρƁԁՁnkƁ̏ƁȁƁ́nkӞnknknkƁ̏ŁӁnkρӞΏԁӈnkԁƁρՏnkψՁЁnkɁԏnknknkƁ̏nkŁӁƁӞՈԁƏځǁƁnkƁԏnḱԁځ̏nkՍŁցЁnkρρŁɏƈԁρӁnkƁՃnkЁƁԁρԏՁƈԁЁƁnkƁՁŁρnkӁՏnkƁŁ΁ƁnkՁǁƁՍnkƁψՁƁρӏnknknkƁ̏ŁցŁɠnkŁӁƁӞԁԁՍ́ՏnkԁԁƁnkƈԁЁŁǏΏƁԁŁnkՁӁǁځnkƁځƏ͍́nk؏nknknknḱցځɏՈ́ƁƁnkƁ΁ōnkЁځψՁցnkӁρՁŠnknknknknkЁցՁЁՠnknkɁŏnknknknknknkցρӁȁяnknknknkՏnknk \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/New.pxe b/res/universal/data/sprites_og/Stage/New.pxe new file mode 100644 index 0000000..6407ae9 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/New.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Oside.pxa b/res/universal/data/sprites_og/Stage/Oside.pxa new file mode 100644 index 0000000..d141dad Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Oside.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Oside.pxe b/res/universal/data/sprites_og/Stage/Oside.pxe new file mode 100644 index 0000000..38e3b5d Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Oside.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Oside.pxm b/res/universal/data/sprites_og/Stage/Oside.pxm new file mode 100644 index 0000000..03adc62 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Oside.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Oside.tsc b/res/universal/data/sprites_og/Stage/Oside.tsc new file mode 100644 index 0000000..5572988 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Oside.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``belvqy````lu~t=:S``ia=:l}~qls}``belvqy```alu~t=:S``ib=:l}~qls}``belvqy```blu~t=:S``ic=:l}~qls}``belvqy```clu~t=:S``id=:l}~qls}``belvqy```dlu~t=:=:S`a``=:l{ulvq````lq``ebj``i`j``agj``a`=:=:S`ab`=:l{ul``aalq~`ab`j````j```blvq```dlq``eej``idj```ij```i=:l}wWP^^^l~tlu~t=:=:S`ac`=:l{ulyz``cbj`acal``aalq~`ac`j````j```blvq````lq``fij``i`j``aej```h=:S`aca=:l{uls}````l``aalq~`ac`j````j```b=:lwya`cbly]``cblv|[acg`l}wyWPQl~tls|=:lvq````lq``fij``i`j``aej```h=:=:S`ad`=:l{ulvq````l}t````lq``idj``i`j``adj```g=:=:S`b``=:lyl}wqPol~tlu~t=:=:S`d``=:l{ulv|z`if`j`d`al}wlvqs``a`yPWPP=:PPP\=:WPP^l~tlu~t=:S`d`a=:l{uls|lv~`da`j``aflqy``e`=:l}wlvqs``a`wPl}t````^l~tls|=:ls~`db`j`ae`j````lx}s=:lq~`d``j```cj````lqy``cb=:lq~`d``j````j```blqy``cb=:lq~`db`j``e`j````lqy``cb=:lq~`db`j````j```blqy``cb=:lt~`d``lt~0db`=:lq~`da`j``a`j```blqy`b``=:l}wlvqs``a`xPP^l~tls|lvqs````=:lq~`da`j``b`j```blqy`be`=:lq~`da`j``a`j```blqy`b``=:l}wqPPPPP=:PP^lqy`b``ls|rP\PPtP=:PPPP\P=:PPPPP^lqy`b``ls|PPPPP=:PPPPtW=:olqy`b``ls|lvq```buP\PPP=:PP^lqy`b``ls|\PPPP=:PP\PP=:PtWP\lqy`b``ls|PP{PP=:PPPPP^^^lqy`b``ls|ls}``bf=:lPPPPPPPPPPPPPPPP]PPuP]lqyiiii=:lu~t=:=:=:S`da`=:l{ul}ww^^^l~tlu~t=:S`db`=:=:=:S`f``=:l{ul}wPPPP=:^l~t=:PPPPPPP=:P^l~t=:yWPPyWPPP=:PPP^l~t=:PPPyPPP=:PP^^^l~tlu~t=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Ostep.pxe b/res/universal/data/sprites_og/Stage/Ostep.pxe new file mode 100644 index 0000000..0d1e91e Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Ostep.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Ostep.pxm b/res/universal/data/sprites_og/Stage/Ostep.pxm new file mode 100644 index 0000000..1732069 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Ostep.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Ostep.tsc b/res/universal/data/sprites_og/Stage/Ostep.tsc new file mode 100644 index 0000000..80e6ef0 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Ostep.tsc @@ -0,0 +1 @@ +0==F=IZ[NISNV====IR[Q0==F>IZ[NISNV===>IR[Q0==F?IZ[NISNV===?IR[Q0==F@IZ[NISNV===@IR[Q0==FAIZ[NISNV===AIR[Q0=>==IXRfI`\b==>>IN[]=>==G====G===?ISN\====Ia_N==EBG==FCG==>FG==?F0=>>=IXRfI`\b==>>IN[]=>>=G====G===?ISN\===?Ia_N==EDG==FBG===AG==>>0=?==0=?=>0=F== IQ[]=F==IXRfIZfQ===?IZ`T]yrnr-xvyy-z-znr;I[\Qaun-v-ur-|{y-n-Zvrpn{-or-srrq;;;I[\Q;;;aur-|{y-n-|-n|vq-nr}rvv|{-|s-uv-ntrq;I[\QIPY_Z-znr4-{nzr-v-Onyy|;I[\QIPY_Uv-zntvp-}|r-unr-t|{r-vyq9n{q-{|-ur-pn{{|-rr{-qvr;;;I[\QIN[]=?=>G==>=G====ISY8>C?=IR[Q \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Pens.pxa b/res/universal/data/sprites_og/Stage/Pens.pxa new file mode 100644 index 0000000..9afb486 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pens.pxa differ diff --git a/res/universal/data/sprites_og/Stage/Pens1.pxe b/res/universal/data/sprites_og/Stage/Pens1.pxe new file mode 100644 index 0000000..84e8440 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pens1.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Pens1.pxm b/res/universal/data/sprites_og/Stage/Pens1.pxm new file mode 100644 index 0000000..04545f6 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pens1.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Pens1.tsc b/res/universal/data/sprites_og/Stage/Pens1.tsc new file mode 100644 index 0000000..8c7acfc --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Pens1.tsc @@ -0,0 +1 @@ +öʥùöʥùöʥùöʥùöʥùʥùʥťť̶ťι¸ťùαöʥťť̶ťι¸ťùǾĥǶǾĥǶǾʥťĥǶǾʥʥťĥǶαȼڕ㣣ĹDZǗەڕ䡕ݡᣣĹDZȼڕܕ紱ÿٕ蕺܂磱ĹȠùαȼڕ㣣ĹǂǸܕ䕼㣣Ĺùαȼǂٕ䕼㣱Ĺùαȼǂ٣ĹùαȼǂٕٕڣĹùαȼڕ㣣ĹDZǂٕڕܕֱĹùαȼ裣Ĺùαȼ磱ĹűĹùαȼڕࣱĹڜࣱĹڜٕڕڕڣĹڕڡڜڕܕࣱĹڕڡڣĹǾڡ졂ڕە裱ĹڣĹùαȼڕڣĹùαʥť̶ť̶ťť̶ȼݣĹDZڕĹı̶ťȼ⣱Ĺڕٕڂ裱ĹDZĹıť̶ťʥťȼ֖ĹťǶٕ畷疱ĹDZݖĹıť̶ťȼڕ顕㴖ĹDZᡕڕ裱Ĺıťť̶ť̶ťʥť̶ťȼĹDZִĹı̶ť̶ť̶ť̶ȼܣĹǶٕەڕڕڕڣĹڕٕڕۂڣĹە⡂ݡڕقڕ裱ĹǺܕ裣ĹĂʥťť̶ťι¸ťùαȼڕڂܕڣĹەڕ܂㣣Ĺùαȼ壱Ĺڡڕ٣Ĺùαȼ݂֕㣣Ĺ䖕閱Ĺùαη̶ιťȼڕĹڕڕڣĹݕ塱ĹڕٕڕڕٕڕٕܣĹıť̶ťȼ疱ĹǸڕڕڂݕڕ䴱Ĺıť̶ťȼʥĹǂ磱ĹDZĹDZڡ磣ĹڕڕٕڣĹڕقڕٕ裱ĹťǂĹDZ鴱ĹDZڕڕuٕ⡕֕ەڣĹڕڕقڣĹڕڕڕٕڕڕٕڣĹǂڕٕڴĹ㡕ڂڜٕڕ紱ĹDZᡱĹڕڂە裱Ĺەڕڂڕ⣣Ĺǽ硕ڕٕڕ裱Ĺܕڕڕڂ塱ĹڜڕڕٕڣĹǂڕܕ崱ĹDZĹڜڕە֕ݕףĹıťť̶ť̶ťȼ꣱Ĺǂʥ䕾ȕڴĹDZ飣ĹڕەڕقڂٕٱĹ䣱ĹDZ鴖ĹDZٕٕ顱ťĹ镾ڂ裱ĹڕڕەٕڣĹDZ磱ĹڕٕڕقڣĹDZڣĹıť̶ťť̶ȼڕڕقܕ٣Ĺڣڕ٣ĹȠùαȼݕڕقڕ֕ڕ磱Ĺٕڕٕقڕڕۂ⣱ĹùαȼڕڕەڣĹǾ٣Ĺڂ飱ĹùαȼڕٕڣĹùαȼەٕەڂ衕ڜڕڕڕ죱ĹǾ֕ܕĹùαȼڕڕݕقڕ٣Ĺܕ꣣Ĺùťαιť̶ťťť̶ťť̶ť̶ťȼĹıť̶ȼꡕڣĹǣڕقڕٕ裱Ĺǣڕٜڕ裱ĹڕڂڣĹǾٕڕقڕڂ㕾ٕڕڣĹıť̶ťɠɦȼڕ맣̶Ĺıɥťȼڕٕ飱ĹǾەڕڕ㡱Ĺڕٕڕ٣Ĺ硱ĹٕڕٕڕڕڕڣĹڕڕڂٕڡĹڕٕڕڕܕݕ裱Ĺǂܕ꣱ĹڕݕٕڣĹĂȠùαȼڕڕݕقڕ٣Ĺܕ꣣Ĺùαȼڂ٣ĹڕڕڂڣĹùαʥĥǶǾȼڂܕ紱ÿĂαť¸̶ť̶ĥǶǾȼ䕼㴱ÿĂαť¸̶ť̶ĥǶǾȼڂٕڴÿĂαť¸̶ť̶ĥǶǾȼڂݴÿĂαť¸̶ť̶ĥǶǾȼڂ㴱ÿĂαť¸̶ť̶ĥǶαǶ \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Pens2.pxe b/res/universal/data/sprites_og/Stage/Pens2.pxe new file mode 100644 index 0000000..b62ccd1 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pens2.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Pens2.pxm b/res/universal/data/sprites_og/Stage/Pens2.pxm new file mode 100644 index 0000000..04545f6 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pens2.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Pens2.tsc b/res/universal/data/sprites_og/Stage/Pens2.tsc new file mode 100644 index 0000000..6a2043a --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Pens2.tsc @@ -0,0 +1 @@ +~~µɤ¸~~µɤ¸~~µɤ¸~~µɤ¸~~µɤ¸~~~~~~Ͱɤ~ǻƷ۔ߢ˵~ؔ⢰˵~ƹ۔ᢰ˵Ɓ~ǻբø~ٔٳø~øäƵ~~Ͱǻ٢ø~ٔ㢰ø㠔⳰ø~ٔٔ볰ø~ؔٔ碰ø~ܔ鳰øäƵ~~Ͱǻٔڔ碰ø~ؔ܁~Քآø~ہ~賰øư۔~Ֆ˵ưƷ٢~⮔tٔø~۔碰ø۔~攖▢øƁ~ǻࠔہ~颰ø~٢øäƵ~~ͰĤǻø~~۔٢øƁ~ɤĤ˵ɤĤø~ðĤ˵Ĥ~ǻٔߢø~ٔ۔~颢øưܳ볰ø~Քøư؁~ٔ⢰øư賕øưؔٛٔ۔Ɂ~ٕøÁ~Ĥ˵äǻ~ٔ㕰øưܔ㠔蕰øƵ~¸~¸~~~~~~~ \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Pixel.pxe b/res/universal/data/sprites_og/Stage/Pixel.pxe new file mode 100644 index 0000000..3364dd5 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pixel.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Pixel.pxm b/res/universal/data/sprites_og/Stage/Pixel.pxm new file mode 100644 index 0000000..575bee6 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pixel.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Pixel.tsc b/res/universal/data/sprites_og/Stage/Pixel.tsc new file mode 100644 index 0000000..fded528 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Pixel.tsc @@ -0,0 +1 @@ +QNgtt}tQNttuxttttQNgtt}uQNttuxtttuQNgtt}vQNttuxtttvQNgtt}wQNttuxtttwQNgtt}xQNttuxtttxQNgtt}yQNtttuQNQNgtuttQNtutt~tttt~tttvttuuQNtttxttx|~tt}x~tuyw~ttuzQNQNgtvttQNQNuxxu~tvtwQNuxxt~tvtvQNt|wy~tvtuQNddddrQNtxqt|qt|dddrQNQNgtvtuQNddddrQNdkddddQNQNgtvtvQNouxxyddddrdpddddQNddddrrrQNQNgtvtwQNddddrQNddddrQNQNgtvutQNQNgtvvtQNddddrrrQNgtvvuQNkddpdQNdrrruxxu~tvvwuxxy~tvvvQNgtvvvQNQNddddddttttouxxuqddQNdddQNrddddddQNdpdddQNdddqrdddddQNddddddQNdrQNrttutrttutrttutrttutrttutrttutrttutrttutttutddddQNetuztDddddddQNddpdddQNdddrttwtQNgtvvwQNdddQNdrrrQNQNgtvytQNQNuxxx~tvy{QNuxxw~tvyyQNuxxv~tvyxQNuxxu~tvywQNuxxt~tvyvQNt|wz~tvyuttu}QNgtvyuQNQNddddtttttttxttttttvtQNrrrrrQNtuttoutttQNtvutqt|wzouxxttttvQNtt{w~tt}y~ttuv~ttt}QNgtvyvQNdkdpdddQNdkddrQNgtvywQNddddddQNdttttQNouxxvtttutttttvtttttuQNtuytttvtQNrrrttuxttvyrrrrrtvzt~tttu~tttvttu}kdepdkddrrrttvydkdddQNdddrQNdddpQNdkdddQNdrrrddddQNdddkQNrQNttvtrrrtttttvzt~tttu~ttttQNttytQNdddrQNQNgtvyxQNdddddQNddrouxxwQNgtvyyQNQNddddddtvyzQNgtvyzQNtvzt~tvy}~ttttot|wzquxxtouxxxQNgtvy{QNdkddrQNQNgtvztQNQN \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Plant.pxe b/res/universal/data/sprites_og/Stage/Plant.pxe new file mode 100644 index 0000000..2fe9f5b Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Plant.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Plant.pxm b/res/universal/data/sprites_og/Stage/Plant.pxm new file mode 100644 index 0000000..2fe59c1 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Plant.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Plant.tsc b/res/universal/data/sprites_og/Stage/Plant.tsc new file mode 100644 index 0000000..3117832 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Plant.tsc @@ -0,0 +1 @@ +YVo|||YV|}||||}||||YVo||}YV|}||||}|||}YVo||~YV|}||||}|||~YVo||YV|}||||}|||YVo||YV|}||||}|||YVYVo||YV||~||||YVo||YV||~|||}YVo||YV||~|||~YVo||YV||~|||YVo||YV||~|||YVYVo|}||YV||||||}}|||||||~}YVYVYVo|}|YVll±||||l±zYVo|}|YVw}|||||~|wlzYVYVo|~||YVlllzYVllñlzYVllllíl±llzLlllllñYVlzlñxlxlllÿzlŻllllñxYVllŻlllYVxlllŻll±lmllñlsl±lYVllõlzYVYVYVo|~~|YV}|~||~~}lzYVo|~~}YVslıllllmYVYVo|||YVYVw|}|YV|||YVlllzzz||}|}||w|||YVlllz|}|YVYVYVo|||YV||~~|||||}YV}||lllm|}|w|||YVllllmYVYV \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Pole.pxe b/res/universal/data/sprites_og/Stage/Pole.pxe new file mode 100644 index 0000000..df67329 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pole.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Pole.pxm b/res/universal/data/sprites_og/Stage/Pole.pxm new file mode 100644 index 0000000..e0b3f54 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pole.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Pole.tsc b/res/universal/data/sprites_og/Stage/Pole.tsc new file mode 100644 index 0000000..d3da595 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Pole.tsc @@ -0,0 +1 @@ +CPPYP-*\mna\cmuPPPX\faiPPPP\end-*CPPYQ-*\mna\cmuPPPX\faiPPPQ\end-*CPPYR-*\mna\cmuPPPX\faiPPPR\end-*CPPYS-*\mna\cmuPPPX\faiPPPS\end-*CPPYT-*\mna\cmuPPPX\faiPPPT\end-*-*CPPYU-*\cmuPPPX\faiPPPQ\end-*-*CPQPP-*\pri\faoPPPP\traPPQRZPPYTZPPUSZPPSV-*-*-*-*CPRPP-*\key\fljQVTPZPRPQ\flKQVTP\souPPRR\cnpPRPPZPPRQZPPPP-*\msgo@@N\nod\gitPPPR\amKPPPRZPPPP\clr-*\cmuPPQPg@@]p@s]A\waiPQVP\nod\gitPPPP\clo\rmu-*\msg-*f@L@@NNN\faoPPPT\nod\traPPQXZPUPQZPPPRZPPPP-*-*CPRPQ-*\pri\msgeN\nod\end-*-*CPRQP-*-*-*CPSPP-*\key\msgJJ\nod\end-*-*CPSPQ-*\fljQVTTZPSPS-*\key\msgy@G@@@@i@L-*@_\nod-*s@@@@@-*i@@A\nod-*dL@@@@i@G@-*@@@@@-*i@NNN\nod\amjPPPRZPSPR\clri@G@@@A\nod-*j@@@@@@i-*G@@@@@-*@@@@@N\nod\clr-*aL@@@L@@@NNN\nod\end-*-*CPSPR-*\key\msg\cmuPPPP\mybPPPR-*heyAA\nod\clriG@that@@_A\nod\clr\gitPPPRw@@you@@@_A-*i@G@@@@A\nod\clrg@@A\nod\clr\cnpPRQPZPQUPZPPQR\waiPPQR\gitPPPP\hmc-*]p@s]@NNN\nod\clrpA\nod-*i@@G@@-* @@@N\nod\clr-*NNNNN\nod\clry@L\nod-*iG@@@@G-*@@@@-*N\nod-*t@@@@@G-*@@@@-*@@@N\nod-*t@@@@@@-*@@@@@-*@@@N\nod\clr-*\cmuPPPXhNNN\waiPPUP\clrw@i@@@@@@-*@@@@L-*@@@@@N\nod-*t@@@@@-*@@@@G-*NNN\nod\clr-*hNNN\nod\clri@@@@N\nod\clr-*y@@@@N\nod\cmuPPPP\faoPPPQ-*a@i@@L@@N\nod\clo-*\waiPQUP\faiPPPQ-*\fla\waiPPUP\tamPPPRZPPQSZPPPP\flKQVTT\flKPSPS\msg-*\cmuPPQP\msg\gitPPQS-*]p@s]@@@]s]A\smc\dnpPRQP\waiPQVP\nod\cmuPPPX\end-*-*CPSPS-*\key\msgi@@L@@@-*@@@@-*@@@@@N\nod\clri@@L@@L@-*@@@@@@-*@@N\nod-*f@@L@i@@@-*@@@@@N\nod-*t@@@@-*@i@@@@@-*@@@@@@N\nod\end-*-*CPSQP-*\key\msg\tur-*BoNB\nod\end-*-*-* \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Pool.pxe b/res/universal/data/sprites_og/Stage/Pool.pxe new file mode 100644 index 0000000..86f833b Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pool.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Pool.pxm b/res/universal/data/sprites_og/Stage/Pool.pxm new file mode 100644 index 0000000..5501c2d Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Pool.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Pool.tsc b/res/universal/data/sprites_og/Stage/Pool.tsc new file mode 100644 index 0000000..c2347f1 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Pool.tsc @@ -0,0 +1 @@ +tqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtq̦ϓއٕtqێڇ̇̇ӇևtqˇׇՇَڇtqӇ̇̓ۦtq̇ˇׇ̇ۇtq·g֕tq̇ˇهˇׇtq̇Շٕ̇tq̇Վۇԇև̇tqϕtqՎۇއ̇̎tqȇȇۇ̇ڕtqtqtqtqtqtqtq·ڇՇ̇ەtqۇ̇هۤtqtqtqtqtqtqtqψtqtqtqtqtqtqtqtqtqtqtq \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Prefa1.pxe b/res/universal/data/sprites_og/Stage/Prefa1.pxe new file mode 100644 index 0000000..2de6026 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Prefa1.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Prefa1.pxm b/res/universal/data/sprites_og/Stage/Prefa1.pxm new file mode 100644 index 0000000..8c91db8 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Prefa1.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Prefa1.tsc b/res/universal/data/sprites_og/Stage/Prefa1.tsc new file mode 100644 index 0000000..a01d1b7 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Prefa1.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{xǪÞ{x{x{x{xǪ{x{x{x{x{xǪҎώӎ܎{x{xҎӎݎҎ⭪Ǽ܎Ԏӎҕ{xҎӎӎ{xҚ⚪Ҏӎnݎ{xڎ✪ᚎӎ{x܎ӎԎՎ{xڎӎӎ܎ݎ{x᎞Ҏڎ䞜ݎ{xӎҎݎ{x܎Ԏ՜ێӎ܎ӎ䠜{xҎӎՎ֜ݎӎ܎܎{xڎۜ{xů{xҎӜů{x{x{x \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Prefa2.pxe b/res/universal/data/sprites_og/Stage/Prefa2.pxe new file mode 100644 index 0000000..1e0eba9 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Prefa2.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Prefa2.pxm b/res/universal/data/sprites_og/Stage/Prefa2.pxm new file mode 100644 index 0000000..674ad60 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Prefa2.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Prefa2.tsc b/res/universal/data/sprites_og/Stage/Prefa2.tsc new file mode 100644 index 0000000..fd0ddf2 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Prefa2.tsc @@ -0,0 +1 @@ +YVo|||YV||||||||YVo||}YV|||||||}YVo||~YV|||||||~YVo||YV|||||||YVo||YV|||||||YVYVo|}||YVslzzzYV|}|||||||||~||}}|||||~||||||YVYVo|}}|YV|||YVw}}Lw}w}|YV|||||||}|||}YVYVYVYVYVYVo|~||YVlŻslll±lxYVll±lŻllllzlŻlíll±l||||YVw}|w}}w}~|||||||}|}||YV||||}||}}||~YVYVo|~|YVYVlsllzzzYVYV \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Priso1.pxe b/res/universal/data/sprites_og/Stage/Priso1.pxe new file mode 100644 index 0000000..c28cec5 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Priso1.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Priso1.pxm b/res/universal/data/sprites_og/Stage/Priso1.pxm new file mode 100644 index 0000000..6cc6e54 Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Priso1.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Priso1.tsc b/res/universal/data/sprites_og/Stage/Priso1.tsc new file mode 100644 index 0000000..eeda7f0 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Priso1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``bilvqy````lu~t=:S``ia=:l}~qls}``bilvqy```alu~t=:S``ib=:l}~qls}``bilvqy```blu~t=:S``ic=:l}~qls}``bilvqy```clu~t=:S``id=:l}~qls}``bilvqy```dlu~t=:=:S`a``=:l{ul``aalt~`a``lvq````lq0`efj``i`j``h`j```i=:S`aa`=:l{ul``aalt~`aa`lvq```alq``fbj``iaj```gj``gd=:=:S`b``=:lq~`b``j```bj```blu~t=:S`b`a=:lq~`b`aj```bj```blu~t=:S`b`b=:lq~`b`bj```bj```blu~t=:S`b`c=:lq~`b`cj```bj```blu~t=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_og/Stage/Priso2.pxe b/res/universal/data/sprites_og/Stage/Priso2.pxe new file mode 100644 index 0000000..31a9bcf Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Priso2.pxe differ diff --git a/res/universal/data/sprites_og/Stage/Priso2.pxm b/res/universal/data/sprites_og/Stage/Priso2.pxm new file mode 100644 index 0000000..445c3cd Binary files /dev/null and b/res/universal/data/sprites_og/Stage/Priso2.pxm differ diff --git a/res/universal/data/sprites_og/Stage/Priso2.tsc b/res/universal/data/sprites_og/Stage/Priso2.tsc new file mode 100644 index 0000000..b14b583 --- /dev/null +++ b/res/universal/data/sprites_og/Stage/Priso2.tsc @@ -0,0 +1 @@ +?IZ[NIPZb==?@ISNV===>IR[Q0==F?IZ[NIPZb==?@ISNV===?ISYW=E?FG==FEISYW=E??G==FDIR[Q0==F@IZ[NIPZb==?@ISNV===@IR[Q0==FAIZ[NIPZb==?@ISNV===AIR[Q0==FDIN[]=?B@G==?=G====IR[Q0==FEIP[]=@=CG=>>DG====IN[]=@=CG==@?G===?IR[Q0=>==IXRfISYW=E@FG=>=>I`\b==>>IN[]=>==G====G===?ISN\====Ia_N==ACG==F=G==>DG===F0=>=>IXRfIZ`TV-|{4-|}r{;;;I[\QIR[Q0=?==IXRfISYW=E@?G=?=AISYW=E?AG=?=@ISYW=E?@G=?=?ISYW=E?>G=?=>IZ`T\]R[-`UbaaR_LIf[W====IPY_\]R[V[T-`UbaaR_I[\QIPY\IZfQ====IdNV==@=IN[]=?B=G==>=G===>IdNV==>=IN[]=@==G===>G===?IdNV==??IN[]=?B>G==>=G===>IN[]=@==G===@G===?IdNV==@?IN[]=?B?G==>=G===>IdNV==@?IN[]=?B@G==>=G===>IdNV==@?IN[]=?BAG==>=G===>IQ[]=?B=IdNV==@?IQ[]=?B>IdNV==@?IQ[]=?B?IN[]=?B@G===>G====IdNV==@?IQ[]=@==IP[]=@=>G=>>DG====IN[]=@=>G==?>G===?ISY:=E?=ISY8=E?>ISY8=E??IZ`TNO[\_ZNYVaf-QRaRPaRQ-V[`UbaaR_-[\;-AI[\QIR[Q0=?=>IXRfIZ`TNO[\_ZNYVaf-QRaRPaRQ-V[`UbaaR_-[\;-AI[\QIR[Q0=?=?IXRfIZ`TY\dR_-YVSaLIf[W====IPY_ISY8=E?AY\dR_V[T-YVSaI[\QIPY\IS\[=?BDG==>CIdNV==B=IN[]=?BDG==>=G===@IdNV=>F?IN[]=?BDG====G====IdNV==B=IS\Z==>CIZ`TYVSa-Y\dR_RQI[\QIR[Q0=?=@IXRfIZ`TYVSa-V`-Y\dR_RQI[\QIR[Q0=?=AIXRfIZ`TR__\_I[\QIR[Q0=?>=IXRfISYW=E@=G=?>?ISYW=E?BG=?>>IZ`T\]R[-`UbaaR_LIf[W====IPY_ISY8=E?B\]R[V[T-`UbaaR_I[\QIPY\IdNV==A=IN[]=?BCG==>=G===>IdNV=>?EIQ[]=?BCIZ`T`UbaaR_-\]R[RQI[\QIR[Q0=?>>IXRfIZ`T`UbaaR_-\]R[RQI[\QIR[Q0=?>?IXRfIZ`TR__\_I[\QIR[Q0=?A=I]_VISYW=E?EG=?A>IZ`T`|zruv{t-v-p|vyrq-n|{qur-o|xr{-|o|4-nz;I[\QIPY_dvyy-|-nxr-vLIf[W====IPY_ITVa>=@=IQ[]=?A=IVa8==@=ISY8=E@FIPY_IPZb==>=T|-ur-Ja|-_|}rJ;IdNV=>C=I[\QI_ZbIR[Q0=?A>I]_VIZ`T;;;LI[\QIR[Q0=?A?I]_VIZ`TV4-n{tyrq-};f|-pn{4-tr-v-y||r;;;I[\QIR[Q0=?B=0=?B>0=?B?0=?B@0=?BA0=?BBI]_VIZ`TN-o|xr{-|o|;I[\QV4-rrry-qnzntrq;I[\QIR[Q0=?BC0=?BD0=?BE0=@==IXRfIZ`TISNP==>Fdrvq-}ynpr9-ruLI[\QV-|{qr-vs-uv-n|zr-|-|s-onr;I[\QIR[Q0=@=>IXRfISYW=E?@G=@=?IZ`TISNP==?Bauv-ur4-|{yznqr-v-unysn-|}r{;I[\QIPY_Y||x-yvxr-v4-pntu|{-|zruv{t;;;I[\QIR[Q0=@=?IXRfIZ`TISNP==>FW-ur-nsrur;I[\QNyy-uv-rpv-znxrzr-|{qr-w-un4-q|{urr;I[\QQ|{4-|-uv{xLI[\QIR[Q0=@=AI]_VIZ`TV;;;I[\QIR[Q0=@=BI]_VIZ`TX{|pxrq-|LI[\QIR[Q0=@=CI]_VIZ`Taurr-v-{|-r}y;;;I[\QIVaW==@=G=@=DIR[Q0=@=DI]_VIZ`T`ur-v{4-z|v{t9-o-v-y||xyvxr-ur4-vyy-nyvr;I[\QIPY_ITVa>=@=dvyy-|-r-ur-Ja|-_|}rJLIf[W====IPY\ITVa====IP[]=@=CG=?BFG====ISY8=E@BISY8=E@CISY:=E?FIZ`Tavrq-ur-|}r-|-ur-o|q;I[\QIR[Q0=@A=IXRfIQ[]=@A=IdNV==>=I`\b==??IdNV==>=IZ`Tf|-urn-|zruv{t-tvr;I[\QIPY\IdNV==B=IN[]=?B@G==>=G===>IdNV==AEIQ[]=?B@IN[]=@=>G===@G===?IdNV=>?EIN[]=@=>G===>G===?ISY:=E??ISY8=E?@ISY8=E?CIR[Q0=@B=ISYW=E?BG=@B>IR[Q0=@B>IQ[]=@B=IQ[]=@=>IQ[]=@=?ISY:=E??ISY:=E?CISY8=E?DIP[]=AB=G=>>DG===?IR[Q0=@C=ISYW=E@=G=@C>IR[Q0=@C>IXRfIZfQ===?IQ[]=@C=IN[]=?BEG==>=G===@IdNV=>==IN[]=?BEG==?=G====IPZb==?@IR[Q0=A==0=A=>0=A=?0=A>=0=AB=IXRfI`XW===CG=AB>I`X8===CIRcR=AB?0=AB> I`NaIRcR=AB?0=AB?IXRfISYW=E@DG=@=AISYW=E?EG=@=BIZfO===?IdNV==@=IZfQ===?IZ`TISNP==>FY||x;I[\QIPY_auv-v-n-|yqvr-s|zur-snpr;I[\QV4-nyy-on{trq-};I[\QIPY\ISNP====IS\[=?BAG==>CIN[]=AB=G===>G====IdNV==A=IZ`TISNP==?Baurr4-n-|{-z|r-yvxrv9-||;I[\Qdun-|{-rnu-p|yq4r;;;I[\QIPY_[|-n-Zvzvtn;[|9-|-q|-uv-zpuqnzntr;;;I[\QIPY\IPZb====IN[]=?BBG==?=G====IdNV==?=IS\Z==>CIN[]=AB=G===>G===?IZ`TISNP==?B...IdNV==B=IPY\ISNP====IdNV==@=IN[]=AB=G===>G===?IZ`TISNP==>FV4-vyy-nyvr..I[\QIPY_ISNP==?A7Oooo7I[\QIPY_aRNZ-F-N[[VUVYNaRQI[\QSNVYRQ-a\-QR`a_\f-aN_TRaI[\QIPY_Pb__R[a-S\_PR`V[`bSSVPVR[aI[\QIPY__Ra_RNaI[\Q_Ra_RNa..I[\QIPY\IS\[=?BEG==>CISY8=E?EISY:=E?AIZ[]=?BDG===DG==>EG====IPZ]==A=G==>BG==@=IPZ]==A=G==>CG==@=IP[]=?BEG=>EAG====IN[]=?BEG==>=G===@IdNV=>?EIN[]=?BEG==?=G====IS\Z==>CIdNV==?=IN[]=?BBG==>=G====IN[]=AB=G==@=G===?IdNV==A=IQ[]=B==IO\N=?==IPZb==??IO`Y====IP[]=AB=G=>E=G===?IN[]=AB=G==A=G===?IN[]=A>=G==?=G====IR[Q0=B==IQ[]=B==IO\N=?==IPZb==??IO`Y====IR[Q0>===IXRfIO\N=B==IZfQ=A=>ISY:=E?EIN[]=A>=G==>=G====IP[]=AB=G=>>DG===AIdNV==>==IZ`TISNP==>Fdr-qvq-vL.IdNV=>==I[\QIPY\ISNP====IS\[=A=>G==>CIP[]=A==G==CDG===?IdNV==B=IZ`TISNP==?CUz}u.I[\QIPY_]yyrq-v-|ss9-V-rr.I[\QIPY_ISNP==>Ff|.I[\QIPY_f|4r-un-vpu-u||rq-zr-q|{-urr.I[\QIPY_au|r-puvyqr{-unq-orror-nsr.I[\QIPY_ISNP==>CUn.-Or-vyr{.I[\QIPY_f|4r-{|-z|ur.I[\QQ|-|-rr{-x{|-unuv-vL.I[\QIPY_ISNP==>FdunLI[\QIPY_ISNP==>CUz}u;-auv-v-un-Vunr-no|-|o|;I[\QIPY_auv-v-ur-urn-|s-urvyn{q.I[\QIPY_Vs-|-|}-v9-ur-vyn{qvyy-snyy-|-ur-rnu.I[\QIPY_V-un-|-tn{q-}yn{LI[\QIPY_a|-nxr-ur-vyn{q-q|{vu-|-v{-n-oynr-|sty|L.I[\QIPY_S||y..I[\QIPY\ISNP====IP[]=A=?G=>@FG====IN[]=A=?G==A=G====IdNV=>==IZ`TISNP==?>Ur.I[\QIPY_dun-nr-|-q|v{tLOv{t-ur-p|r-|-uryno|n|-n-|{pr.I[\QIPY_aurr4-vyy-vzr.I[\QIPY\ISNP====IN[]=A==G==>@G===?IdNV==B=IP[]=A==G==E?G===?IdNV==?=IN[]=A==G==?BG===?ISZbIZ`TU||||||\\\\\\\\U..IdNV==B=I[\QIPY\IO\N=C==IdNV==@=IN[]=A==G==?=G===?IN[]=A=?G==@=G====IN[]=A>=G==@=G====IN[]=AB=G==?=G===?IQ[N=>E>IQ[N=>E?IPZ]==A=G==>BG==ADIPZ]==A=G==>CG==ADIdNV=>==IPZb====IS\Z==>CISY8A===ISY8=E@?ISY8=@A>ISY8=DE@ISY8=E@DIR[Q0>>==IXRfISY:A===ISN\===AIdNV==B=IZ`Tf|-r{r-qvz9-n{q-ur-|yqt|-qnx;;;I[\QIPY\IQ[]=AB=ISY8=E@=ISY:=E?BISY8=E?FISY:=E?DISY8=E==ISY8=E=>ISY8=@D?ISY8=A>>ISY8=@A=ISY8=>BFISY8=E@EISY:>CA?ISY8>CA@ISY:=E@FIQ[]=?A=IVaW==@=G>>=>IRcR>>>=0>>=>IdNV=>B=IXRfIZ`?Qvq-|-x{|-un-ur-vpu:|zn{Wr{xn-|{pr-unq-n-o|urLI[\QUv-{nzr-n-Onyy|;I[\QYvxr-uv-vr9-ur-vryqrq}|r-sn-or|{q-u|r-|sz|ny;;;I[\QIPY\IRcR>>>=0>>>=IP[]=@=CG=>>DG===?IN[]=@=CG==@?G===?IN[]=?BEG==>=G===>IdNV==FCIN[]=?BEG===>G====IdNV==B=IZ\c==BBG==>EIQ[N=>E@IVa8==?>IR^8==>CIZ`T;;;;;;LI[\QIPY_;;;f|-pn{-ornur;I[\QISNV===AIdNV==B=IR[Q0>?==IXRfIN[]>?==G==?=G===?ISYW=E?FG>?=>IRcR>?=?0>?=>IP[]=@=CG=>>DG====IN[]=@=CG==@?G===?IRcR>?=?0>?=?IS\[>?==G==>CISNV===>IdNV=>==ISN\===>Ia_N==BCG>?==G==CFG==DC \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Ballo1.pxe b/res/universal/data/sprites_up/Stage/Ballo1.pxe new file mode 100644 index 0000000..4cf30f9 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Ballo1.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Ballo1.pxm b/res/universal/data/sprites_up/Stage/Ballo1.pxm new file mode 100644 index 0000000..50cf723 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Ballo1.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Ballo1.tsc b/res/universal/data/sprites_up/Stage/Ballo1.tsc new file mode 100644 index 0000000..72aac38 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Ballo1.tsc @@ -0,0 +1 @@ +96O\\e\96hyzmhoy\\\\hrmu\\\\hqzp96O\\e]96hyzmhoy\\\\hrmu\\\]hqzp96O\\e^96hyzmhoy\\\\hrmu\\\^hqzp96O\\e_96hyzmhoy\\\\hrmu\\\_hqzp96O\\e`96hyzmhoy\\\\hrmu\\\`hqzp9696O\\ea96hyzmhyp\\\^h|~u96hoy\\_ehrmu\\\^hwq96hmz|\]\\f\\\\f\\\\hmhqzp9696hoy|\\\]f\\\cf\\]dh{\\]^9696O\`\\96O\`\]96O\`\^9696969696O\a\\96hpz|\a\\hyp\\\^96hwqhysZhz{phox~96hrmo\\^euLLnZhz{phox~mLLLX96LLL96LXhz{phox~uLLLL96LZZZhz{phox~LLLL96LLSL96LLLZhz{phox~mLuLLXL96LLLLXhz{phox~LLLLL96XLLXL96LZZZhz{phox~LLL96LLLZhz{phox~uLLLL96,LLuLL96LLZZZhz{phox~xZZZhz{phox~vLLLX96LLLLL96LLLZhz{phox~xXLLLuLZZZhz{phox~LLLL96LLL96SLZZZhz{phox~zXLLMhz{p96{LuYYhz{pLL{MMhz{phox{96hoy\\\`96hmz|\`\^f\]\\f\e\\hr{z\`\^f\\]b96hnx\e\\hmz|\e\\f\\]\f\\\\hqzp9696969696O\e\\96hmz|\e\\f]\\\f\\\a96hr{z\e\\f\\]b96hoz|\`\\f\__ef\\\^96hoz|\`\]f\__ef\\\\96hoy\\\\hmu\_\\96hr{y\\]bhmu\\a\96hn{m\]\\hmu\^\\96hmz|\`\^f\]\\f\\\\96hr{z\`\^f\\]b96hn{m\^\\96hoy\\\chnx\\\\96hqzp969696O]\\\96hrxv]b\\f]\\]96hrxW]b\\96hoy\\\\hn{m\^^\hmu\^\\96hoy\\_^hn{m\_\\hmu\\a\96hn{m\_]]hnx\\\\hqzp9696O]\\]96hwqhr{n\\\\f\\]b96hn{m]\\\hmu\^\\96hoh~m\\e]f\]]\f\\\\f\\\\9696 \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Ballo2.pxe b/res/universal/data/sprites_up/Stage/Ballo2.pxe new file mode 100644 index 0000000..6938d23 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Ballo2.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Ballo2.pxm b/res/universal/data/sprites_up/Stage/Ballo2.pxm new file mode 100644 index 0000000..178e955 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Ballo2.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Ballo2.tsc b/res/universal/data/sprites_up/Stage/Ballo2.tsc new file mode 100644 index 0000000..8e0a888 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Ballo2.tsc @@ -0,0 +1 @@ +PMfss|sPMssssssssPMfss|tPMssssssstPMfss|uPMsssssssuPMfss|vPMsssssssvPMfss|wPMssssssswPMPMfswssPMfswstPMfswsuPMfswtsPMfswttPMfswtuPMPMPMPMfsxssPMsstysssussssssxsssstPMstxsPMssuxcqqqsst|cjcPMdcccPMcccPMccssuxqqqqqoccoccPMccccPMcqssssPMuccccqqqssxsPMssuxssssPMstssucccccqqqccqqqqqPMswts}ssts}ssssswtt}ssts}sssussxscccccccccqqqPMstssdssxsssssPMssvwstssPMswss}ssss}ssssssusPMswst}ssss}sssuss{sPMssuxcddCssssPMstssPMswss}ssss}sssussusPMswst}sszs}sssussvuPMswst}ssss}ssssssusPMucccccqqqssxsPMccccccqqqssxsPMcccccccqqqqqssxsPMssuxjcccdssxsPMssssvdPMswsu}sss|}ssssstxsPMsssxccdPMcccqPMsst|ccccdsssxccddssssPMPMswst}ssus}sssssstsPMswss}ss{s}sssusssuPMsssxjcdssssPMswsu}sstyPMswsu}sstu}sssusssuPMswsu}stss}sssustssPMPMddstssssxsssstPMssxsssssPMssuxccccPMssuvjccqqqPMsszt}stus}ssss}ssssPMPMPMPM \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Barr.pxa b/res/universal/data/sprites_up/Stage/Barr.pxa new file mode 100644 index 0000000..a05c866 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Barr.pxa differ diff --git a/res/universal/data/sprites_up/Stage/Barr.pxe b/res/universal/data/sprites_up/Stage/Barr.pxe new file mode 100644 index 0000000..196bb42 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Barr.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Barr.pxm b/res/universal/data/sprites_up/Stage/Barr.pxm new file mode 100644 index 0000000..db181fb Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Barr.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Barr.tsc b/res/universal/data/sprites_up/Stage/Barr.tsc new file mode 100644 index 0000000..e47a9a3 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Barr.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}```hlvqy````lu~t=:S``ia=:l}~qls}```hlvqy```alu~t=:S``ib=:l}~qls}```hlvqy```blu~t=:S``ic=:l}~qls}```hlvqy```clu~t=:S``id=:l}~qls}```hlvqy```dlu~t=:=:=:=:=:S`a``=:lv|z`cfaj`a`c=:lv|z`cfbj`a`a=:lv|z`cf`j`a`b=:l{ul``aalq~`a``j````j```b=:lvq```dlq``aaj``idj``dbj``eb=:S`a`a=:lyl}wyPWPQl~tlu~t=:S`a`b=:l{ulvq```dlq``aaj``idj``dbj``eb=:S`a`c=:lyl}wPWPQl~tlu~t=:=:S`ae`=:S`aea=:S`aeb=:S`aec=:S`aed=:=:S`bi`=:lv|z`cg`j`bialu~t=:S`bia=:lv|z`cf`j````lyl}wlvqs```h\PQQl~tlt~`bi`ls~a```j``fcj```blu~t=:=:S`d``=:l{ulv|]`cfalv|]`cfb=:l}sls~`d``j``abj````lq~`d``j``b`j```dlqy`ad`=:lyl}wlvqs```ezPPQl~tlvqs````l{uls|=:lqy`a``ls}``ae=:l}w=:vPPrQlqy`ad`l~t=:l``dels~`ae`j```aj````lqy```d=:l``dels~`aeaj```aj````lqy```d=:l``dels~`aebj```aj````lqy```d=:l``dels~`aecj```aj````lqy```d=:l``dels~`aedj```aj````=:ls}```hlu~t=:=:S`e``=:=:Sa```=:l{ulv|[`cf`lv|[`cfalv|[`dd`lv|]`cbfl}wuQl~tls|P\PPQQl~tls|^^^^^l~txol~tl}r```blqy``c`l}t```bls~a```j``f`j```dls|lvqs```fW^^^WP=:PPtol~tls|QPyWP^l~t=:PPP^=:PtWPP=:P^l~t=:PPPP=:PPP\l~t=:PP=:^^^l~tls||PP^=:xPPP^l~tls|Ql~t=:PQlwya``dl~tls|PPPPol~t=:PPPPQl~tls|^^^^^l~tls|^^^PyPWP=:P^l~t=:lwy````{PPPP=:PPPPP=:PPyPP^^^l~t=:PPP^l~tls|=:lvqs```0ls}````=:lq``c`l``bf=:lq~a```j```hj````=:lq~`a``j```aj````=:lqy``a`=:l}t````=:ls~a```j``f`j````=:lqy`a``=:lq``c`l``bf=:lq~a```j```hj````=:lq~`a``j```aj````=:lqy``g`=:lq``c`l``bf=:lq~a```j```hj````=:ls~`d``j``aij```b=:ls~`a``j``ahj```b=:ls}```dj```hj``h`=:ls}```ej```hj``ha=:ls}```fj```hj``hb=:ls}```dj```ij``if=:ls}```ej```ij``ig=:ls}```fj```ij``ih=:=:=:l}wxQlqy``e`ls~`d``j``abj```blq~`d``j``c`j```bls|l{uls}``aalvqs``adPPQl~tls|lvqs```ePWP\PPQl~t=:yWPPPPP=:Ql~tlvqs````ls|yPP^l~t=:ls~`e``j``fgj```blqy`a``lq~`e``j``acj```blqy``e`lq~a```j```hj````l}wlvqs``aeP\PPyP=:PPPP^l~tls|lvqs```e}Ql~tls|yPPPQl~tls|lvqs```h]]PWP=:Pt\PWPQl~tls|lvqs``ae^^^^^l~tls|lvqs``afPWP\Po=:PtPP=:P^l~t=:sP\P^l~tls|lvqs```f^^^ol~tls|=:yWPP^l~tlvqs````ls|=:lq~`e``j``aej```blqy`aa`=:lyl}wlvqs```huQl~tlvqs``aels|r^l~t=:yPPPPP^l~tls|=:lq~`e``j``b`j```blvqs````ls|=:l{ulqy``e`l}wlvqs```h~\P\PWPP=:]]Ql~tlvqs````ls|=:lqy``e`=:lvqs```el}w~Pqwqy~Ql~t=:yPPPPPQl~t=:qPPyPP=:vyQl~tls|^^^^^l~tls|PWPPol~t=:PPPP=:Pol~za``alq~`d``j``c`j```bls|=:lvqs``adyPPQl~tls|=:lv|[`cfals}```dls~`d``j``fhj```blr|`d``lu~t=:=:Sa``a=:l{ulv|]`cfblv|]`cfals}```hl}wlvqs```ex^l~t=:qP\PPP^l~tls|lq~`d``j``a`j```blu~t=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Blcny1.pxe b/res/universal/data/sprites_up/Stage/Blcny1.pxe new file mode 100644 index 0000000..b3bcec5 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Blcny1.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Blcny1.pxm b/res/universal/data/sprites_up/Stage/Blcny1.pxm new file mode 100644 index 0000000..93bb4dc Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Blcny1.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Blcny1.tsc b/res/universal/data/sprites_up/Stage/Blcny1.tsc new file mode 100644 index 0000000..3f41969 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Blcny1.tsc @@ -0,0 +1 @@ +FSS\S0-_nh|_ioPTT\S_ioPTT\T_ioNTT\U_pqd_fpxSSVS_idlSSSS_hqg0-FSS\T0-_nh|_ioNTT\S_ioPTT\T_ioPTT\U_pqd_fpxSSVS_idlSSST_hqg0-FSS\U0-_nh|_pqd_fpxSSVS_idlSSSU_hqg0-FSS\V0-_nh|_pqd_fpxSSVS_idlSSSV_hqg0-FSS\W0-_nh|_ioPTT\S_ioNTT\T_ioPTT\U_pqd_fpxSSVS_idlSSSW_hqg0-0-FSS\X0-_nh|_idlSSSW_hqg0-0-0-FSTSS0-_nh|_vrxSSTT_dqsSTSS]SSSS]SSSU_idrSSSV0-_lwmSSUV]STST_wudSSYV]SS\V]SSS\]SSSW0-0-FSTST0-_nh|_wudSSYZ]SS\V]SSS\]SSSW0-0-0-0-FSTTS0-_sul_idrSSSU_wudSSYW]SS\U]SSST]SSTT0-0-FSTUS0-_nh|_dqsSTUS]SSSS]SSSU_vrxSSTT_idrSSSW_wudSSYY]SS\W]SSTS]SSS[0-0-#STVS0-_sul_pvjwCCCC0-vCCCCCCQQQ_qrg_hqg0-0-FST\\0-_sul_pvjqCQ_qrg_hqg0-_idrSSSWhQ_qrg_for_fpxSSVV_fuh_zdl\\\\_hqg0-0-FSUSS0-_nh|_p|gSSSS_gqsSUSS_zdv_pvjdCCCJ0-CCD_qrg_hqg0-0-FSUST0-_sul_pvj_wxu0-CCCCCCCCCCCCwkdwJvCdooOCironvD_qrg_hqg0-0-FSUTS0-_sul_iomTT\T]SUTT_iomTT\U]SUTU0-_sul_idrSSSW_p|gSSSU_zdlSSXS_wudSSYU]SS\X]SSSZ]SSZW0-FSUTT0-_sul_idrSSSW_p|gSSSU_zdlSSXS_wudSSYU]SS\X]SSZ\]SSZV0-FSUTU0-_sul_idrSSSW_p|gSSSS_zdlSSXS_wudSSYU]SS\X]STTZ]SSYU0-0- \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Blcny2.pxe b/res/universal/data/sprites_up/Stage/Blcny2.pxe new file mode 100644 index 0000000..394d1c6 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Blcny2.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Blcny2.pxm b/res/universal/data/sprites_up/Stage/Blcny2.pxm new file mode 100644 index 0000000..f229389 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Blcny2.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Blcny2.tsc b/res/universal/data/sprites_up/Stage/Blcny2.tsc new file mode 100644 index 0000000..0c9ee66 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Blcny2.tsc @@ -0,0 +1 @@ +_llulIFxximmulximmumxgmmunxllmtx}llllxIF_llumIFxxgmmulximmumximmunxllmtx}lllmxIF_llunIFxxllmtx}lllnxIF_lluoIFxxllmtx}llloxIF_llupIFxximmulxgmmumximmunxllmtx}lllpxIF_lluqIFxx}lntlvllmlvllllxlntlvllmrIFx}llqlx}lllpxIFIF_lmllIFxxllmmx}lmllvllllvlllnx}llloIFxllnovlmlmx}llrovlluovllluvlllpIFIF_lmlmIFxx}llrsvlluovllluvlllpIFIFIFIF_lmmlIFxx}lllnx}llrpvllunvlllmvllmmIFIFIFIF_lmnlIFxxmouovlmnmx\c\]xxIF_lmnmIFxx}lllpxllmrx}llsuvllupvllmlvllltIFIFIF_lmuuIFxxlloox\\\]IF\\\\IF\jjjxxxIFIF_lnllIFxxllllxlnllx}\\\cIF\\]xxIFIF_lnlmIFxxxIF}c\}h\]xxIFIF_lnmlIFxxmmumvlnmmxmmunvlnmnIFxx}lllpxlllnx}llqlx}llslvlluqvlllsvllspIF_lnmmIFxx}lllpxlllnx}llqlx}llslvlluqvllsuvllsoIF_lnmnIFxx}lllpxllllx}llqlx}llslvlluqvlmmsvllrnIFIF_lntlIFIF_lnulIF_lnumIF_lnunIF_lnuoIF_lnupIF_lnuuIFIFIFIFIF_lollIFxxxlollvllmrIFx}lltlx}lnuuvllnlvlllnIFxx}llnlIFxc\]xxx}lllmx}llqlIFxlnumvlnmsvllllx}lnumvllplvllllx}llqlIFx}lnulvllllvllllx}llnlIFxx}llntc\\\]IFc\\\\IF\jxxjjj\\\IFc\\\IF\\\jjjxx<}llllIFx}lnumvllqlvllllx}llmrIFxx}llnn\\\cIF\jjjxxIFx}llllx}llmrIFx}llmlIFx}lnulvlllovllllIFx}lnumvllmlvllllIFxlnunvlnsuvllllIFxlnuovlnsuvllllIFxlnupvlnsuvlllnx}lmllIFx}lnumvllpnvllllIFx}lnulvllllvllllIFxx}llnt}\jjj{xxx}llnn\jjj{IF\c\]xxIFx}llloxllmrxxlllnx}llrtvlrllvllnpvllmoIFxIFIF_lolqIF_lolrIF_lolsIF_lomlIFxxllllxllmtximmulximmumxgmmunx}llllIFx}lolqvllmmvlllnIFx}lntlvllmlvllllIFxlolqvllmrxox}lllo\]xIF\\\\hIF\c\\IF]]xxlntlvllmrxIFx}lolqvllolvllllx}llrlIFxlolqximoumxIF_lonlinIFIF_loolIFxxloolxllllx}lonlvllllvlllnIFx}x}llqlIFxlonlvllmrxx}lllmc\\\IFj\c\\\IF\jxIFc\\\\IF\\\\IF\]xx\{xIF\\\\\]xxxIFx}lonlvllllvllllx}llqlIFx}lonlvllolvllllx}llmnIFx}lonlvllplvllllx}llqlIFximounxllmrxIFIF_lpllIFxxxlpllx}llolxx}llllIFxlqllvlnqpvllllx}lllmIFx}lqllvllnlvlllnx}lllmIFx}lqllvllolvlllnx}lllmIFxlqllvllmrxllnlvllolIFxlolsxlntlIFx}lmllx}lllpIFxx}llnnIF\c\jjjxxx}llntc\\jIFc\\\\]xxx}lllpIFxlloqx}llpuvmnllvllutvlllrIFIF_lqllIFIF \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Cave.pxa b/res/universal/data/sprites_up/Stage/Cave.pxa new file mode 100644 index 0000000..c30cbaa Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Cave.pxa differ diff --git a/res/universal/data/sprites_up/Stage/Cave.pxe b/res/universal/data/sprites_up/Stage/Cave.pxe new file mode 100644 index 0000000..d117d5d Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Cave.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Cave.pxm b/res/universal/data/sprites_up/Stage/Cave.pxm new file mode 100644 index 0000000..fcbf014 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Cave.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Cave.tsc b/res/universal/data/sprites_up/Stage/Cave.tsc new file mode 100644 index 0000000..e2fc191 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Cave.tsc @@ -0,0 +1 @@ +?FWXKFMW_::FOXN-::C?-::CCFUOcFWXKFMW_::FMXZ:=:;D:;;F^\K:::;D::CCD:::?D:::B-:;:;FZ\SFPKY:::>F^\K::?;D::C>D:::>D:::>-:;:<FZ\SFPKY:::>F^\K::?;D::C>D::;BD:::B-:;:=FZ\SFPKY:::>F^\K:::?D::C>D::;:D:::B-:;:?FZ\SFPKY:::>F^\K::?:D::C>D::;F^\K::?:D::C>D::;;D::;<-:;:BFZ\SFPVT:;:=D:;:CFW]QS~*yx1~*yzox+FXYNFOXN-:;:CFUOcF]Y_::;;FKXZ:;:BD::::D:::F^\K::?D:::>D::;:-:;;:FUOcFPKY:::>F^\K::?>D::C>D::;:D:::C-:;;;-:<::FZ\SFW]Q^ro*mk|mk}}*yp*k*]u*N|kqyx888FXYNFOXN-:<:;FKXZ:<:;D::::D::: \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Fall.pxa b/res/universal/data/sprites_up/Stage/Fall.pxa new file mode 100644 index 0000000..2267b9f Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Fall.pxa differ diff --git a/res/universal/data/sprites_up/Stage/Fall.pxe b/res/universal/data/sprites_up/Stage/Fall.pxe new file mode 100644 index 0000000..f4e11db Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Fall.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Fall.pxm b/res/universal/data/sprites_up/Stage/Fall.pxm new file mode 100644 index 0000000..6376edc Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Fall.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Fall.tsc b/res/universal/data/sprites_up/Stage/Fall.tsc new file mode 100644 index 0000000..c653bb8 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Fall.tsc @@ -0,0 +1 @@ +rorororororororororororororororororororororororoمޅƆܓׅمڌroޅхم˓̅Յʅʓё܅ʅɅroԅʅʅ҅ޅro؅˅ʅדroʅ؅ӅɆroٌܑ؅ԅʓrororororororororo܆ٓ؅ʓم؅roх؅ʅroʓro؅ʅʅroڅׅʓro͑ӌمЅʓro؅م̅roޅɅʅԅԓޤڅӑroمͤroٌ؅ٓمʅroׅؓroБمroɅׅؓڅمؑ٤ӅڅɅّroمɅׅʓro܅ׅ˅؅roԅe؅roʆمڅ؅roمؑroم؅م؅roʅӌ؅نёڅՅroڅܓroׅёތ؅roʅԅɅ҅ʅroӅӅʅمʓ͓roڅӌمޓԅޓroroԆroԤԅمʅڅroԅԅܤroӅʅڅroڅʓґڌʅׅٓӅ؅בroɅ܅ممroʅمޅءroʅʅro݅Ʌޅroхܓro͑څܓroҤɅمʅхro˅Ʌڅʤroʆroٌ؅ʅʅro˅؅׆roޤхمڅЅroٓroمɅ؅ƅroʑޤroڅمنхمӑro͡ơӡ̡ԡӡ١Ρ̡͡١rorororoӌمڅro̤rorororororororo \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Frog.pxe b/res/universal/data/sprites_up/Stage/Frog.pxe new file mode 100644 index 0000000..11d3986 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Frog.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Frog.pxm b/res/universal/data/sprites_up/Stage/Frog.pxm new file mode 100644 index 0000000..2dfeab4 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Frog.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Frog.tsc b/res/universal/data/sprites_up/Stage/Frog.tsc new file mode 100644 index 0000000..da13082 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Frog.tsc @@ -0,0 +1 @@ +yvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvyvړڍyvyvyvŨyvЌььyvьٌѩíyvíŰíyvԫyvíyvьښyvیތѫИڌьyvњړЌјyvړ͌lyvٌьѫړьyvьyvíŰíyvyv卨Ԍѓyv͌ލތڌ͌͘yvڍړ嚨yvííyvߌьŻ嚨yvíь׌ڌyvѓߌڌߚyvíyvyv׍yvyvyvyvyvyvyvŨíyvyvҌӍíyvyvyv \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Gard.pxa b/res/universal/data/sprites_up/Stage/Gard.pxa new file mode 100644 index 0000000..907d106 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Gard.pxa differ diff --git a/res/universal/data/sprites_up/Stage/Gard.pxe b/res/universal/data/sprites_up/Stage/Gard.pxe new file mode 100644 index 0000000..a28bb97 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Gard.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Gard.pxm b/res/universal/data/sprites_up/Stage/Gard.pxm new file mode 100644 index 0000000..7a4c0de Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Gard.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Gard.tsc b/res/universal/data/sprites_up/Stage/Gard.tsc new file mode 100644 index 0000000..95bb3c6 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Gard.tsc @@ -0,0 +1 @@ +YVo|||YV||||||||YVo||}YV|||||||}YVo||~YV|||||||~YVo||YV|||||||YVo||YV|||||||YVYVo|}||YV|~|}|~|~}|}|}YVw|~YV||||||||||||}YVo|}|}YVlsl±mYVo|}|~YV|||||}||||~~||YVYVYVo|||YV|||||}w|||||~YVo||}YV||~YVo||~YV|||~YVw|w|y||}y|~YVw|~|w|~}||}||||}|||YV|||||}lzYVl±lllYVllŻlzYV||~}lzllzzzYVlñllYVzYV|||||~|||||||||||YVlllYVñ||||YV|||||~|||||||~YV||}z||~}xlzzzsllYVl±llYVzzz||}lzzzYVlllllYV||~}zzzxllllYVzYVzzzzzzzzYVxlllYVllllz||}xllz||||YV||~||||||||||YV|||}|||||}}|YVm|||||||||||||||zzzzzlzzz||||YV||||||||||||~|||m||||YV|||||||||||||||||~|}||YV||||}~|||~||||}||||~YV||||||||~YV||}yzYVllŻlYVŻsl||||}||}zYVllllñz||}||||||||~YVllz||||YV||||||||~||~YV||||||||~|||YV|||mlmYV|||lzllmYV||||||||lŻlllmmLYV||||}|||||}YV||||}|||~||||~||||~||||||YV||||}||||~||~YV||||||||~||~YV||||~||||||||YV||||||||~||~||YV|||mYVlŻlŋm||}}zzzzzzzzzzzzYVzzzlzzz|||YVmmmm||}||}mlslYVm||||YV|||||~}zzzzzxlűzYVlllzlllxllYVŻllzlllŻYVzxlôlĭlYVlŻllllõYVlûyyzzz|||sllŻmm||||YV||||}||||~|||YV||~||~|||||||}YV||}||}|||||YV|||}|||~||}YV|||||||||||||}YV|}|||||}|YV||~}xlllYVlllYVll||||||YVmsllYVllm||}||}||}||~|||||s±lllYVlzYVxlsllŻmxlxlxYVsllzYV±lxlŻlz||}||||||||}|||||YV|||}||||~||YV||}YVYVYVYVo||}YVo||~YVo||YVw|~|}}|}~YV||||}|||}|||||YV|||||||YVYVlƵlz|||YV|||}|||||}|||}YVo||YVo||YV|~~||}YV|~|||YVzzzzzzYVo||YVo||YVYVo|||YVw|~~|||zzzsllllzYVlŻzzz±lzzzYV|||||||||||||}||YVo||}YVy|~}||w|||||||YV|||||}|YVllz|}|YVYV \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Hell.pxa b/res/universal/data/sprites_up/Stage/Hell.pxa new file mode 100644 index 0000000..8ab7b2e Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Hell.pxa differ diff --git a/res/universal/data/sprites_up/Stage/Hell1.pxe b/res/universal/data/sprites_up/Stage/Hell1.pxe new file mode 100644 index 0000000..acdd610 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Hell1.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Hell1.pxm b/res/universal/data/sprites_up/Stage/Hell1.pxm new file mode 100644 index 0000000..3b31311 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Hell1.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Hell1.tsc b/res/universal/data/sprites_up/Stage/Hell1.tsc new file mode 100644 index 0000000..6989da1 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Hell1.tsc @@ -0,0 +1 @@ +rororororororororororororororoׅɓrororoڅхƅЅɅroͅړroх؅Ʌԅхrorororororororororororororororoʅԅцrororororoمƅʅʢro݅eͅɅޅrorororororororororo͓roɅׅޅԅroͅʅʓrororororoɅڅ܅مʅ͒roƅʅɅƅפro؅ʅ؅ؓroʅ؅בʅro؅ׅɅʅroؓrorororoʅɅ؅х؅roՅɅʅʑroɅʅʅɅɅro҅ӅӓӅʅӅޅɅroӅ̓roro \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Hell2.pxe b/res/universal/data/sprites_up/Stage/Hell2.pxe new file mode 100644 index 0000000..a27137b Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Hell2.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Hell2.pxm b/res/universal/data/sprites_up/Stage/Hell2.pxm new file mode 100644 index 0000000..4c25708 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Hell2.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Hell2.tsc b/res/universal/data/sprites_up/Stage/Hell2.tsc new file mode 100644 index 0000000..6b82149 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Hell2.tsc @@ -0,0 +1 @@ +ururururururururururururururururururururururururur͏ۈ׈ψӖurururururur͈ۈψ̈urḧ̈ֈur֔ur͈ۈ܈urԈ̈Ԗurۈֈ͈urۈ̖ururururڈ͈͈ur͈͔ۏۈurۈֈ̖ur͈ψۈ̈ur͈ԈΈˈur̈ֈֈܖurֈɈ͈ܔ͈ur܈ۈ׈̈ۈur׈ֈۖurur \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Hell3.pxe b/res/universal/data/sprites_up/Stage/Hell3.pxe new file mode 100644 index 0000000..5cbdd52 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Hell3.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Hell3.pxm b/res/universal/data/sprites_up/Stage/Hell3.pxm new file mode 100644 index 0000000..a0cb2a3 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Hell3.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Hell3.tsc b/res/universal/data/sprites_up/Stage/Hell3.tsc new file mode 100644 index 0000000..965cef6 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Hell3.tsc @@ -0,0 +1,2 @@ +-::C:FWXKFPKS::::FOXN-::C;FWXKFPKS:::;FOXN-::C<FWXKFPKS:::FWXKFPKS:::>FOXN-::C?FUOcFPVT;?=D:;;;F^\K::B>D::C?D::;:D:::<-:;;;F^\K::B?D::C?D::;:D:::<-:<::FMXZ:<::D:=<:D::::FPV7;?=D:::;FMWZ:::BD::;>D:::;FMWZ:::CD::;>D:::;FMWZ::;:D::;>D:::;FMWZ::;;D::;>D:::;FMWZ::;D:::;FMWZ::;=D::;>D:::;FOXN-:<>:-:<>;FNXZ:<>;FKXZ:<>:D::;:D:::=FOXN-:<><-:<>=FNXZ:<>=FKXZ:<>>-:<>?FNXZ:<>?FKXZ:<>>D::;:D:::=FOXN-:-:D::;:D:::;FOXN-:D::::-:>::FZ\SFPVT:<:::;FPV5:<:;FQS^:::?FKW5:::?D:;::FMW_::;:Qy~*~ro*GWs}}svo*Vkxmro|G+FaKS:;@:FXYNF\W_FMV\^ro*Ws}}svo*Vkxmro|*s}*k*zyo|pvokzyx6*l~*s~}*kwwy*s}*vsws~on8FXYNFMV\cy*mkx*|ozvoxs}r*y|*}~ymuzsvos~r*s~ow}*n|yzzon*l*oxowso}8FXYNFOXN-:>:;FZ\SFKW5:::?D::=:<FZ\SFKW5::;:D::<>FW]QFQS^::;;Wk*ws}}svo}*sxm|ok}on*l*FX_W::::+FXYNFOXN-:C::FNXZ:C::F]UT::<>D::::F]U5::<>FZ\SFW]=Toxuk6*}oosxq*ro|*l|y~ro|1}wknxo}}6*myxpsxon*rsw*~y*~rs}pvyk~sxq*s}vkxn8FXYN^rk~*k}*~ro*wy}~*}ro*myvn*ny8FXYNOox*k}*ro*k}6*}ro*myvn*xy~l|sxq*ro|}ovp*~y*usvv*ro|*yxl|y~ro|888FXYNFOXN-:C:;FNXZ:C:;F]UT::IZ[NIPZb===EISNV===>IR[Q0==F?IZ[NIPZb===EISNV===?IR[Q0==F@IZ[NIPZb===EISNV===@IR[Q0==FAIXRfISYW>===G==FBIZ[NIPZb===EISNV===AIRcR=?==0==FBIZ[NIPZb===EISNV===AIR[Q0=>==IXRfI`\b==>>IN[]=>==G====G===?ISN\===AIa_N==B@G==FAG==DBG===B0=>>=IXRfI`\b==>>IN[]=>>=G====G===?ISN\====Ia_N==BCG==F=G=>>EG==E@0=?==IXRfISY8>===ISY8>=?BISY8>=@EIZfQ===?IdNV==B=IN[]=A==G==>=G====IZ`Tbnu.I[\QIPY\IN[]=A==G==?=G====IdNV==B=IR[Q0=A==IXRfISYW>==@G=A=AISYW>>=?G=A=@ISYW>==?G=A=?ISYW>==>G=A=>ISY8>==>ISY8>=@EIN[]=A==G==>=G====IZ`TRnnuu.IZfO===?I[\QIPY_Q|{4-xvyy-zr.I[\QV4z-n-uzn{.-V-w-t|zntvpnyy-{rq-v{|n-Zvzvtn.-V4z-uzn{.I[\QIPY_UuLI[\QIPY_;;;;;I[\QIPY_IN[]=A==G====G====ISNP==?Edun4-uvLf|4r-{|-|{r-|s-u|rxvyyr-|o|LI[\Qdryy9-|-pnrq-ur}n{-|ss-zr9-wz}v{t|-yvxr-un.I[\QIPY_f|-|yq{4-or-unnv|9-|yq-|LI[\QIR[Q0=A=>IXRfISY8>==?IZ`TISNP==?EV4z-V|u9-|{r-|s-ur uzn{-u|-pnzr-|-uvvyn{q-|-q|-rrnpu;I[\Qaun-vpu-Zvr-{rqzr-v{|-uv;;;I[\QV-zn{ntrq-|-tr-nn9o;;;w-y||x-n-zr;I[\QIPY_N{q-{|-V4z-px-urr.I[\QIPY_f|-pyvzorq-}-s|z-ur|vqr9-qvq{4-|;I[\QV4z-n{-r{tv{rr-|sp|{vqrnoyr-nyr{9I[\Qo-V4z-qrnuy-nsnvq|s-urvtu;;;I[\QIPY_\u9-|r9-|r-v-zr;;;I[\QIPY_V-{rr-u|yq4r-p|zr|-uv-vyn{q-v{-ursv-}ynpr;I[\QIR[Q0=A=?IXRfIZ`TISNP==?E[|9-{|9-ry-|-unr{|-r-s|-pu-n-}nurvp9n{qrq-yvyr-zn{;I[\QIR[Q0=A=@IXRfIZ`TISY8>==@ISNP==?EV|uLI[\Q-fr9-un4-zr;I[\QIPY_dun4-unLI[\Q`nxnz||4-|xv{t-|{n-|pxrLI[\QIPY_`|-ur4-vyy-nyvr;;;I[\QN-svrpr-|{r9-ur-v;I[\Q[|uv{t-yvxr-zr9-un4s|-r;;;I[\QIPY_Nyy-vtu9-ur{;I[\Qanxr-uv;I[\QISNP====ITVa>=?DIVa8==?DIPY_IPZb==>=T|-ur-JP|{|yyrJ;IdNV=>C=I[\QI_ZbIPY_ISNP==?EV-uv{x-un4-unur4-nsr;I[\QITVa====IRcR=A=A0=A=AIXRfIZ`TISNP==?ETvr-Z;-`nxnz||-zrtnq;I[\QIR[Q \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Jail.pxa b/res/universal/data/sprites_up/Stage/Jail.pxa new file mode 100644 index 0000000..a92f3fe Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Jail.pxa differ diff --git a/res/universal/data/sprites_up/Stage/Jail1.pxe b/res/universal/data/sprites_up/Stage/Jail1.pxe new file mode 100644 index 0000000..bb4def6 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Jail1.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Jail1.pxm b/res/universal/data/sprites_up/Stage/Jail1.pxm new file mode 100644 index 0000000..4d543fc Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Jail1.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Jail1.tsc b/res/universal/data/sprites_up/Stage/Jail1.tsc new file mode 100644 index 0000000..e61798b --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Jail1.tsc @@ -0,0 +1 @@ +[Xq~~~[X~~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[Xq~~[X~~~~~~[X[Xq~~~[X~~~~~~~~~~~~~[X[Xq~~[X~~~~~~~~~~~~~~~~~~~~~~~~[X[X[Xq~~~[X[X~~~[X~~~~[Xxnx|||o[X~~~~~~~~~~~~~~~~~~~~y~~{~y~[XznnŶunů|õnǽnnn|[Xnunnn³[Xnn·nónnǽ|nn¶n|[XnŶnn½nn¶n½[Xn¶żnn|[Xnnðnn[Xƾ||||||unŶnón|Nnnnn[Xunnn½n³|[Xnn½nnnnŷ¶n|nůnnnǽn¶[XŶn·|[XnnnºnŶnz[X¶nnn½nnů|~~[X[Xq~~[Xy~ndz|nn¶núnnz[Xnnnn¶n½[Xǽn|~~~~~~~~[X[Xq~~[Xnůnznnijn³~~~~~~~~[X[Xq~~[X~~~~~~~~~~[X[X[Xq~~[X~~~~~~~~~~~~~~~~[X~~~o[X~~~uo[X[XunnznnǽÍ|||||[X~~~y~~~~~~~~~~~~~~~[Xq~[X[X \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Jail2.pxe b/res/universal/data/sprites_up/Stage/Jail2.pxe new file mode 100644 index 0000000..a79a22c Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Jail2.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Jail2.pxm b/res/universal/data/sprites_up/Stage/Jail2.pxm new file mode 100644 index 0000000..24af892 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Jail2.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Jail2.tsc b/res/universal/data/sprites_up/Stage/Jail2.tsc new file mode 100644 index 0000000..2183673 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Jail2.tsc @@ -0,0 +1 @@ +TQjwwwTQwwwwwwwTQjwwxTQwwwwwwxTQjwwyTQwwwwwwyTQjwwzTQwwwwwwzTQjww{TQwwwwww{TQTQjwwTQwwwTQwywwwwwxwwwwwww{TQwzwxwxxywwwywxwwTQwywwwwwwwwwwTQwwwywzwxTQTQjwxwwTQwwwyww|}wwywwwww{TQTQjwywwTQggguTQgggggwwwwrw|y{TQwzwwwxxxwwwwww}wwywwwwwxwwwwTQwxwwwww{wwxwwwwx|wwxwTQTQTQjw{wwTQGsgggggggggTQjw{wxTQghTQjw{wyTQggggghTQTQjw{wzTQgggggTQgggghgnggggTQghTQjw{w{TQggggiiTQnggggTQgggguuuTQjw{w|TQggggggTQggsgggngTQguuuTQgggguTQTQ \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Jenka1.pxe b/res/universal/data/sprites_up/Stage/Jenka1.pxe new file mode 100644 index 0000000..6f94c55 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Jenka1.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Jenka1.pxm b/res/universal/data/sprites_up/Stage/Jenka1.pxm new file mode 100644 index 0000000..83dbd6b Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Jenka1.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Jenka1.tsc b/res/universal/data/sprites_up/Stage/Jenka1.tsc new file mode 100644 index 0000000..121c82f --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Jenka1.tsc @@ -0,0 +1 @@ +-*CPPYP-*\mna\cmuPPQY\faiPPPP\end-*CPPYQ-*\mna\cmuPPQY\faiPPPQ\end-*CPPYR-*\mna\cmuPPQY\faiPPPR\end-*CPPYS-*\mna\cmuPPQY\faiPPPS\end-*CPPYT-*\mna\cmuPPQY\faiPPPT\end-*-*CPQPP-*\pri\souPPQQ\dnpPQPP\faoPPPT\traPPQPZPPYTZPPSUZPPRV-*-*-*CPRPP-*\key-*\itjPPQTZPRPQ-*\fljPUYTZPRQT-*\fljPUYSZPRQS-*\fljPUYRZPRQR-*\fljPUYQZPRQQ-*\fljPUYPZPRQP-*\key\msg\facPPQSw@@NNN_\nod-*iG@@@-*@N\nod\end-*-*CPRPQ-*\itMPPQT-*\fljPUYTZPRRT-*\fljPUYSZPRRS-*\fljPUYRZPRRR-*\fljPUYQZPRRQ-*\fljPUYPZPRRP-*\key\msg\facPPQSoL@A\nod\clr\gitQPQTm@@A\nod\clr-*\gitPPPP\facPPPPg@@@]p]N\nod\clr\cnpPSPPZPQSPZPPPP\dnpPTPQ\flMPRWT\facPPQSy@@@L-*i@@_\nod-*m@N\nod\clrwG@_\nod-*]r@]_\nod\facPPPP\clr\cmuPPPP\msghA\nod\clo-*\cnpPTPPZPPPYZPPPP\waiPPQP\mydPPPR\cnpPSPPZPQSRZPPPR\anpPSPPZPQPPZPPPR\waiPQRP\cmuPPQQ-*\cnpPTPPZPPQRZPPPP-*\msg\facPPPUhG@@L@j_\nod\clr\facPPQSaL@bN\nod\anpPSPPZPQRPZPPPR-*yG@@L@i@N\nod-*a@@@@@-*@@_\nod\clr\facPPQThMMA\nod-*h_@y@@m_\nod-*sG@L@@N\nod\clra@@@@N\nod-*t@L@@-*@@A\nod\clr\facPPQSs@@@@-*@NNN\nod\clr\facPPPUiG@@@@-*@@N\nod-*i@@@@@-*@@@N\nod\clrt@@@@-*@@A\nod\clr\facPPQSNNNNN\nod\clrmNNN\nod-*w@@@@-*@_\nod\clr-*\anpPTPPZPPSPZPPPP\facPPQThA\nod\clrp@@L@-*_A\nod\clr\facPPPUNNNNN\nod\clri@@@@N\nod-*s@G@@-*@N\nod\clo\cmuPPPP-*\waiPPUP\facPPPU\msgyG@@N\nod\clo-*\facPPPP\anpPTPPZPPQPZPPPP\waiPRPP\cmuPPQY-*\msg\facPPQS\cnpPSPPZPQSPZPPPPa@@NNN\nod-*t@MMN\nod\mydPRPP\clrNNNNN\nod\clrt@@@-*N\nod-*f@@-*@NNN\nod\clra@@@@@N\nod\clrc@@@-*@@@@-*@@@_\nod\flKPUYP\end-*-*CPRQP-*\key\msg\facPPQSs@@NNN\nod-*c@@@-*@@@@-*@@@_\nod\end-*-*CPRQQ-*\key\msg\facPPQSt@@N\nod-*g@N\nod\end-*-*CPRQR-*\key\msg\facPPQSi@@@-*@@@-*@N\nod\clrt@@@NNN\nod\end-*-*CPRQS-*\key\msg\facPPQSo@@@NNN\nod-*i@@@@-*@@@N\nod\end-*-*-*CPRRP-*\key\msg\facPPQSm@L@@N\nod\clr\gitQPQTt@@ @-*@@N\nod\clr-*\gitPPPP\cnpPSPQZPQSPZPPPP\dnpPTPQ\facPPPPg@@@]p]N\nod\clr\flMPRWT\facPPQShNNN\nod-*yG@@@-*@L@G@N\nod\clrNNNNN\nod\clri@G@@@-*@@@-*@@@@N\nod-*c@m@-*@@N\nod-*a@@@@-*@@@N\nod\clrcL@@m-*@@-*@@L\nod-*@@@-*@@@-*@@@N\nod\clrh@@@@-*L@@m@-*@@\nod-*@@NNN\nod\clrt@@N\nodg@N\nod\flKPUYQ\end-*-*CPRRQ-*\key\msg\facPPQSoN\nod\clr\gitQPQTyL@N\nod-*t@@@@-*@@N\nod\clr-*\gitPPPP\cnpPSPRZPQSPZPPPP\dnpPTPQ\facPPPPg@@@]p]N\nod\clr\flMPRWT\facPPQSt@@N-*wG@@@@NNN\nod\clrNNNNN\nod\clrh@@@@-*@m_\nod\clrt@@m@-*@@@-*@@@N\nod-*t@@L@@-*@@@N\nod\clr-*hNNN\nod\clrd@@@-*@@-*_\nod\clrNNNNN\nod\clri@@@@NNN\nod-*t@@mL-*@@@-*@@L\nod-*@@-*N\nod-*i@@@@-*L@@-*@@L\nod-*@@N\nod\clra@@@-*m@@-*@NNN\nod-*i@@@NNN\nod\clrd@@@_\nod-*d@@@-*@@-*@_\nod\clrNNNNN\nod\clrt@@@NNN\nod\flKPUYR\end-*-*CPRRR-*\key\msg\facPPQSt@@@-*@N\nod-*m@@G@-*@@-*@N\nod\clr\gitQPQTm@NNN\nod\clr-*\gitPPPP\facPPPPg@@@]p]N\nod\clr\cnpPSPSZPQSPZPPPP\dnpPTPQ\flMPRWT-*\facPPQSNNNNN\nod\clryG@@-*@L@G-*N\nod-*w@@@@-*@@NNN\nod\clri@G@@@-*L@G@@-*@N\nod-*t@@@-*@@@-*@@@NNN\nod\clroL@L@NNN\nod\clrtG@@-*N\nod\flKPUYS\end-*-*CPSPP-*\fljPUYPZPSQP\end-*CPSPQ-*\fljPUYQZPSQQ\end-*CPSPR-*\fljPUYRZPSQR\end-*CPSPS-*\fljPUYSZPSQS\end-*CPSPT-*\fljPUYTZPSQT\end-*-*CPSQP-*\key\msgaA\nod\end-*CPSQQ-*\key\msga@A\nod\end-*CPSQR-*\key\msga@@A\nod\end-*CPSQS-*\key\msgbN\nod\end-*CPSQT-*\key\msgfA\nod\end-*-*-*CPTPP-*CPTPQ-*-* \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Jenka2.pxe b/res/universal/data/sprites_up/Stage/Jenka2.pxe new file mode 100644 index 0000000..94b30aa Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Jenka2.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Jenka2.pxm b/res/universal/data/sprites_up/Stage/Jenka2.pxm new file mode 100644 index 0000000..83dbd6b Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Jenka2.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Jenka2.tsc b/res/universal/data/sprites_up/Stage/Jenka2.tsc new file mode 100644 index 0000000..f0a9ebf --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Jenka2.tsc @@ -0,0 +1 @@ +ǺΩ©ǽǺΩ©ǽǺΩ©ǽǺΩ©ǽǺéľҵΩ©ϾǺΩ©ǽµΩɩȩ˺ľҵҽɩޙޙ򸆃ęޚȽ뚵Ƚˆ횚ȽȆɩк©ɩŤŤк©Ωǽľ҆鍍ͦ᧧ȽȽȆк©ɩк©ͪޙޙ򶧵ȽͩɩɩŦˆޙ򧧧Ƚޙޙ򧧧Ƚާ槵Ƚyޙކݙޙ憃ޙާȽᥙ짧Ƚ짧ȽͪͤˆΩڙޙк©Ƚε˵ޙޥޥ膃ޙ᧵ȽǽľҵéޚȽ暵Ƚޙކݙޙ憃ޙޚȽǽľҵéᥙޙچݙާȽͪͤˆݙڙޙк©Ƚͩ˵ޙߙ놃ݙާȽޙ솃ݙ觧Ƚǽľҵڙޙކݙݙ姧Ƚ™솃ޙȽǽľҵޣȽǽ \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Kings.pxe b/res/universal/data/sprites_up/Stage/Kings.pxe new file mode 100644 index 0000000..b6665ff Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Kings.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Kings.pxm b/res/universal/data/sprites_up/Stage/Kings.pxm new file mode 100644 index 0000000..c8342b2 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Kings.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Kings.tsc b/res/universal/data/sprites_up/Stage/Kings.tsc new file mode 100644 index 0000000..9ed7131 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Kings.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlvqy````lu~t=:S``ia=:l}~qlvqy```alu~t=:S``ib=:l}~qlvqy```blu~t=:S``ic=:l}~qlvqy```clu~t=:S``id=:l}~qlvqy```dlu~t=:=:S`a``=:l{ul}~qlqy``e`lvqy```a=:lq~`c``j``a`j```0lqy``ig=:lq~`c``j```aj````lqy``e`=:lq~`c``j``b`j````lqy``fd=:lq~`c``j```aj````lqy``af=:lq~`c``j``c`j````lqy``e`=:lq~`c``j``d`j````lqy``ig=:lvq```alqyiiii=:=:S`c``=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Labo.pxa b/res/universal/data/sprites_up/Stage/Labo.pxa new file mode 100644 index 0000000..9b5a39a Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Labo.pxa differ diff --git a/res/universal/data/sprites_up/Stage/Little.pxe b/res/universal/data/sprites_up/Stage/Little.pxe new file mode 100644 index 0000000..14d8dd0 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Little.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Little.pxm b/res/universal/data/sprites_up/Stage/Little.pxm new file mode 100644 index 0000000..b50449c Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Little.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Little.tsc b/res/universal/data/sprites_up/Stage/Little.tsc new file mode 100644 index 0000000..878e11b --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Little.tsc @@ -0,0 +1 @@ +TQjwwwTQwwwywwwwTQjwwxTQwwwywwwxTQjwwyTQwwwywwwyTQjwwzTQwwwywwwzTQjww{TQwwwywww{TQTQjwxwwTQwwxxwxwwwwwwwwwywwwyww|zwwywwwywx~zTQTQTQTQjwywwTQTQxz~zwyw}TQxz~ywywyTQsgnggggusgggnggtTQggngTQuTQggggggTQwywxrxz~yTQwwwwwxywwwwwwwggguTQwwxwwwxygghwx}wTQjwywxTQgguTQTQjwywyTQGsggggggTQggggwywzhTQggguTQjwywzTQtxz~yTQgsgngggTQuTQgngggggTQgggguwwxywwwwwwwTQwwxyggguTQwwxwwwwggghwx}wTQTQjwyxwTQxz~wwyxxrxz~xTQgggggTQguuugngggsTQgTQjwyxxTQgggguTQjwyywTQngsgTQTQjw|wwTQwy|wwwwwTQTQ \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Lounge.pxe b/res/universal/data/sprites_up/Stage/Lounge.pxe new file mode 100644 index 0000000..0198c46 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Lounge.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Lounge.pxm b/res/universal/data/sprites_up/Stage/Lounge.pxm new file mode 100644 index 0000000..2dce2ee Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Lounge.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Lounge.tsc b/res/universal/data/sprites_up/Stage/Lounge.tsc new file mode 100644 index 0000000..cf55ccd --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Lounge.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{xǪÞ{x{x{x{x{xij{x{x{x{x{x¸{xӎӎᜪ{xَڎӎӚӜ{xݎӕӎώӎ{xԎ眪{x{x{xǪӜŸ›Ҏӎ{x૜ž{xǪӎӎݎӜŸ™{xÞӎ૜ůê{x{x{xǪӎ{xՎӎҏ{xӎӎҎ{x᜜{x{x{x{x{x{x{xij{x{x{xӎ{xӎӎӎ{xҎ܎ӎ✪{xҎԎ{xҜ{xӎՎӎ{xnҎ֜{xӎ皎ݚҎ᜜{x{x{xӎ⎲ՎՎ{xԎ֎ۏ{x֚Ԏ玷ӎώ{x{x֎ώӜ{x{x{xǪ{xij{x{xܕӎώҎ{xᏪ᭎֏{xӎҎݎӎӜ{x{x{xǪ{xij{x{xێݎҜ{x{x{xǪǰ֚眪ܕӎӭ{xَ֚ӎ{xӜ{xӎҎ琎{xӎގҎӎӜ{xܚӎ՜Վݎ{xՎώӎԎӜݎӎݎ֭{xښӎҎ{xůDzů{xů{xÞů{xÞ{x{x{x{x{x{x{x \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Malco.pxe b/res/universal/data/sprites_up/Stage/Malco.pxe new file mode 100644 index 0000000..d720f4f Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Malco.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Malco.pxm b/res/universal/data/sprites_up/Stage/Malco.pxm new file mode 100644 index 0000000..afdc84f Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Malco.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Malco.tsc b/res/universal/data/sprites_up/Stage/Malco.tsc new file mode 100644 index 0000000..5ae31c2 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Malco.tsc @@ -0,0 +1 @@ +@=Vcclc@=otovccckoyt|ccccoxw@=Vccld@=otovccckoyt|cccdoxw@=Vccle@=otovccckoyt|ccceoxw@=Vcclf@=otovccckoyt|cccfoxw@=Vcclg@=otovccck@=oy}ckfcmccli@=oy}cgkdmcclh@=oyt|cccgoxw@=Vcclh@=ovcecdmcdcemcccc@=otcfccmccccmccce@=oyt|cccgoxw@=Vccli@=ovccddmcccimccid@=ovccddmcccjmccjj@=ovcecdmcdcemcccc@=otcfccmccccmccce@=oyt|cccgoxw@=Vcdcc@=oy}cgkcmcdcd@=o|occddowcdccoytcccgotcccimcclgmcdjdmccdj@=Vcdcd@=o|oz|SZSTowoxw@=Vcecc@=oy}cgkdmcece@=o~xozySSyyaow@=tvSSyyaowovSSSro}ccccov@=occgfoy^cgkdovcecdmcdcemccccSaowov@=o~xovccccotcfccmccdcmccccot|ccecowccceot|cghc@=ovcccgoz|wxStxTow@=vxvxSwxv|TTowovot|cchc@=oz{Towov@=ovcecfmccclmccccot|cchc@=ovccccotcfccmccedmccccot|cckcovccdd@=ovcecfmccdemcccc@=ozoytvccchwSSSS@=S|SSZ@=ro}cecgovZSTowoxxcecg@=Vcecd@=Vcece@=o|ozo@=SSaowoxw@=Vcecf@=o~xovcecfmccdemccccotcecfmccecmcccgot|cdgc@=o|ozoytvccchStxSrTowoytvcccco~xov@=ot|cdccovccdh@=oz@=ySSuTot|cdgcow@=ovccckoy`cgkcoy^cgkeoxw@=Vcecg@=o~xozStZTTowovSwSS@={zxSaow@=SS@=Saow@=oytvccdgotcecfmccfcmccccS_SZS@=rowovoytvccchuSS_SSZ@=SSaow@=SSSaowovt_S|ZSS@=SSaow@=wZS_S@=aow@=Srowov@=ovcccgovcecfmccfimccccoucecfoy^cgkcoxw@=Vcehc@=o~xozoSaaaowoxw@=Vcfcc@=oy}cgkfmcfcf@=oy}cgkdmcfcd@=o~xoztSaaarow@=|SZSSSS@=aowoxw@=Vcfcd@=o|ozaaaaaowoy}cgkemcfce@=|SSSSaowoxw@=Vcfce@=o~xoz|SSSSS@=Saow@=wSSSSSSro}ccccovot|cchc@=ovcfccmcdclmcccg@=otc3ccmccdcmcccg@=oucfccot|cchcowcfccoy^cgkfoy^cgkh@=oz{taaaow{t~SaaaowovZxStS|vxSxaow@=twSSzTowov{t~SySt|zSxTowov|ZwS|~xSStSSutv~@=x{_owovuStS|S~S{SSwS|@=t~xSx|xaaaowoy}cedimcfcgoxw@=Vcfcf@=oy}ckfcmcfdh@=oy}checmcfdg@=oy}cgkimcfdf@=o|}ccddmcfdc@=oy}cgkgmcfch@=o~xoz|ZwS|~xSStSSutv~@=x{_owovuStS|S~S{SSwS|@=t~xSx|xaaaowoy}cedimcfcgoxw@=Vcfcg@={row@={xSwZSxwStwSSvtZ@=zxS|Sxrowov{trTow@=tS{tS|StxwS||wxrTowov@=SStxStSzwSxTowovwxwTow@=|ZSt~xStSwxySuu@=ySTow@=xZSuS{tSwS@=|{xxxTowoy^cgkgoxxcfch@=Vcfch@=o~xoz|ZSxxwSSSvxv@=uu`t~|zStx|taow@=pv{tvtp_ow@=p}xy|{S}|vxp_@=twSpzSutxpaowov|ZSt~xSSuuStSSt@=Su|zSxStS{xStx|tTowoy}ceidmccccov{r@=x_S{xS}xy|{Sw@={txS{xS}|vx_SStS{tx@=|xwS{xaowoy^ceidoxw@=Vcfdc@=o|}ccckmcfddoxxcfch@=Vcfdd@=o|}ccdemcfdeoxxcfch@=Vcfde@=o~xoy^cgkio|`cccko|`ccddo|`ccde@=oz{txSSywStS{xStx|t@=xrowovoz|dcde{TowS{xSpv{tvtpTow@=oz|dcck{TowS{xSp}xy|{S}|vxpTow@=oz|dcdd{TowSxxS{xSpzSutxpTowov{xSxSSuxz|TTowoz|ccccov@=oytcccdot|cdccoyt|cccd@=oz|S|Sy||{xwTowoz|dcdfo|^ccdfoy^ceedov@=ovccdczSSpxpTot|cdicowoovzSTow@=uS{tSwSTowoxw@=Vcfdf@=o~xozzSTow@={StwSuS{tSwSTowoxw@=Vcfdg@=o~xozvxStwS||Stzt|Sx|xaow@=|ZwSyyxSSxSxt_Suaaaowoxw@=Vcfdh@=o~xoz{txZSxxSS|StS{|xTowov|ZSzwSSxxSaow@=|ZSSxS{xxS|{S@=xSSt~Saaaow@=|ZxSuxxS{|~|zSx{tS|@=z{SStv|txSxStx@=u_StuxS{StStaaaowovaaaaaowov@=|ZwSyyxSSxSxt_Suaaaowoxw \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Mapi.pxe b/res/universal/data/sprites_up/Stage/Mapi.pxe new file mode 100644 index 0000000..02be92f Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Mapi.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Mapi.pxm b/res/universal/data/sprites_up/Stage/Mapi.pxm new file mode 100644 index 0000000..4cb4e3e Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Mapi.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Mapi.tsc b/res/universal/data/sprites_up/Stage/Mapi.tsc new file mode 100644 index 0000000..28e1969 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Mapi.tsc @@ -0,0 +1 @@ +IF_llulIFx}xllllx}llllxIF_llumIFx}xllllx}lllmxIF_llunIFx}xllllx}lllnxIF_lluoIFx}xllllx}llloxIF_llupIFx}xllllx}lllpxIFIFIFIFxmqrovlmlmIFIF_lmllIFxxmqrpvlmlmxllmmx}lmllvllllvlllnIFx}lllpx}llmrvllupvllonvlllnIF_lmlmIFxx\c\]xxIFIFIF_lpllIFxx~lllnx}llnlIFxmqrovlpnlIFxmqrnvlpmmIFxmqrmvlplox\\\\\{xlplmxmlppvlplnx]xIF\\jxxIFIF_lplmIFxxiij\~h\jxxIFIF_lplnIFxxgmqrmx{x\}{xIF\jxxlploIF_lploIFxxh\j\\\\\IF\\\\~{xlpltxlplpxIFIF_lplpIFxx~\\h\\cIF\\h\{xlplqxlpltIF_lplqIFxx\\\\{xlpluxlplrIF_lplrIFxx\\\\IF\\{xlpluWddmdA>pupwddempzu}ddddpyxA>WddmeA>pupwddempzu}dddepyxA>WddmfA>pupwddempzu}dddfpyxA>WddmgA>pupwddempzu}dddgpyxA>WddmhA>pupwddempzu}ddd4pyxA>A>WdeddA>p}pzudddfpudddmnddmfnddefnddjhA>A>WdedeA>p}pzudddepuddgmnddmendddhnddejA>A>WdfddA>p}p{}[TTbT[TTTbpxpyxA>A> \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/MazeI.pxe b/res/universal/data/sprites_up/Stage/MazeI.pxe new file mode 100644 index 0000000..d301a2f Binary files /dev/null and b/res/universal/data/sprites_up/Stage/MazeI.pxe differ diff --git a/res/universal/data/sprites_up/Stage/MazeI.pxm b/res/universal/data/sprites_up/Stage/MazeI.pxm new file mode 100644 index 0000000..ec76fcc Binary files /dev/null and b/res/universal/data/sprites_up/Stage/MazeI.pxm differ diff --git a/res/universal/data/sprites_up/Stage/MazeI.tsc b/res/universal/data/sprites_up/Stage/MazeI.tsc new file mode 100644 index 0000000..d5109f9 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/MazeI.tsc @@ -0,0 +1 @@ +[Xq~~~[X~~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[Xq~~[X~~~~~[X[Xq~~~[X~~~~~~~~~~~[X[Xq~~[X~~~nŽun|||[Xq~~[X~~~~~~~~~~~~~[Xq~~[Xq~~[X[Xq~~~[X~~~~~~~[X~~nnnúo~~y~~~[Xn¶nnno[X[X[X[Xq~~~[X~~~~~~~~~~~~oo|||||nnnǽnn¶[Xü|nn¶n[X~~~[X~~~~~~~~~~~~~[X[Xq~~[X~~~nǽnůn½nn¶n~~~~[Xy~[XN~~~~~~~~[X~~~~~~~~~~~~~~~~~~~~~[X~~~~~~~~~~[X~~~~~~~~~~~~~~[X~~~~[X~~~~~[X~~[X~~~~~~~~~[X[Xq~~[Xnnn|[X[Xq~~[X[X[Xq~~~[Xnnn½nǽ[Xżn|[Xnn¶|||[Xnn¶nunn|[Xnǽnnz[Xǽnijnn|||[X[Xq~~[X[Xq~~[Xnŷ±n¶nn¶[Xnnþn½nnþn½[XŶ|[Xn¶n·unnþ[X¶|[Xnnijnnijn[Xü·nnnn|[X[Xq~~[Xnnn|[X[Xnȳnnnnnn~~n{n~[X~~[X~.ؘ[X~ёјѨ[X[X \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/MazeM.pxe b/res/universal/data/sprites_up/Stage/MazeM.pxe new file mode 100644 index 0000000..d7eda37 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/MazeM.pxe differ diff --git a/res/universal/data/sprites_up/Stage/MazeM.pxm b/res/universal/data/sprites_up/Stage/MazeM.pxm new file mode 100644 index 0000000..cdda771 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/MazeM.pxm differ diff --git a/res/universal/data/sprites_up/Stage/MazeM.tsc b/res/universal/data/sprites_up/Stage/MazeM.tsc new file mode 100644 index 0000000..05becb1 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/MazeM.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``b`lq~`d``j``b`j```blvqy````lv|z`ghbj``iilu~t=:S``ia=:l}~qls}``b`lvqy```alu~t=:S``ib=:l}~qls}``b`lq~`d``j``b`j```blvqy```blv|z`ghbj``iilu~t=:S``ic=:l}~qls}``b`lvqy```clv|z`gh`j``iilu~t=:S``id=:l}~qls}``b`lvqy```dlv|z`gh`j``iilu~t=:=:=:=:S``ii=:ls}```gj``cej````=:ls}```hj``cej````=:ls}``bfj``caj`aaa=:lu~t=:=:S`a``=:lylvq````lq``ddj``idj``a`j``ad=:=:S`aa`=:l{ulv|z`ghcj`aablv|z`ghaj`aaa=:l``aalq~`aa`j````j```blvq```blq``dfj``ibj```cj```i=:S`aaa=:lv|[`gh`lv|]`gha=:l``aalq~`aa`j````j```blvq```blq``dfj`ae`j```cj``0i=:S`aab=:lyl}wyPWP^^^l~tlu~t=:=:S`c``=:S`c`a=:l{ul}~qls}``b`=:lq~`ca`j```aj````lvqy```d=:ls~`c`aj`aabj```blqy`a``=:lq~`ca`j````j````=:l}t```blt~`c`al}s=:lq~`d``j``b`j```blv|z`ghbj``iilu~t=:S`ca`=:l{ulv|[`gb`ls~`c``j`aaaj````lx}slqy``f`lq~`ca`j```aj````=:lqy`a``lvq```dlq``dbj`c`aj``bfj```e=:=:=:S`cc`=:lylv|z`ghbj`ccal}wPPP^l~tl``dcls|l}wP^l~tls|=:lv|[`ghb=:lqy``e`=:l``ga=:ls}```gj``cej````=:ls}```hj``cej````=:ls}``bfj``caj`aaa=:lqy``e`lu~t=:S`cca=:lyl}w^^^l~tlu~t=:=:S`d``=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/MazeO.pxe b/res/universal/data/sprites_up/Stage/MazeO.pxe new file mode 100644 index 0000000..3537a2c Binary files /dev/null and b/res/universal/data/sprites_up/Stage/MazeO.pxe differ diff --git a/res/universal/data/sprites_up/Stage/MazeO.pxm b/res/universal/data/sprites_up/Stage/MazeO.pxm new file mode 100644 index 0000000..61edc26 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/MazeO.pxm differ diff --git a/res/universal/data/sprites_up/Stage/MazeO.tsc b/res/universal/data/sprites_up/Stage/MazeO.tsc new file mode 100644 index 0000000..7cabed3 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/MazeO.tsc @@ -0,0 +1 @@ +VSlyyyVSyyy{yyyyVSlyyzVSyyy{yyyzVSlyy{VSyyy{yyy{VSlyy|VSyyy{yyy|VSlyy}VSyyy{yyy}VSVSVSVSVSlyzyyVSyyzzyzyyyyyyyyy{yyyyyyyyVSyy|yzyzVSyy|yy}yy}yyz~VSlyzyzVStyy}yy|yy}yy}yyz~VSVSlyzy~VSyyy}yy|yy}yyzyyz{VSVSly{yyVSi¼iuVSiwwwVSiiiVSiiiiwVSVSVSly|yyVSpii¼wVSuiiii¸iwtzyyyyy{yVSyy}y|y}VSyy{y|y|VSyyzy|y{VSyyyy|yztyyyyy~yVSuiuiiuipiwiuiuipVSipiiiii¸wpiiiiiwVSiiiiipVSiiiiwVSzyztyyziii†wyyyyVSly|yzVSiipiiwVSiiiiiVSiwVSly|y{VSvyyztyy{VSzyziiivwyyyyui¸iijVSiwVSiiiiiwVSly|y|VSiwVSiiiiiwVSly|y}VSiiipVSwVSpiiiiiVSiwVSiii¸uiiwVSVSly|zyVSyy}y|z|VSyy{y|z{VSyyzy|zzVSpiiwVSiiiiiiVSiuVSiiiîiiuVSiIiiwVSly|zzVSi¸iiiiVSi¸iiiuipVSi¸iiiiiVS¼wVSly|z{VSiwVSipiiiuVSi¸VSly|z|VSuii¸iiiVSiiiiiiiVSkikwVSVSly|{yVSyy{y|{{VSyyzy|{ztyyzVSyyzuijpiiiVSiwVSpiijiii¸VSiiuiVSiijyy{yi¸ipiiVSiiiwwwVSpiiiiVSi¸uiwwwiuiiwVSuiiwVSiiiiVSiwwwwwwiiiwVSiiuiipVSiiiVSwVSiipiiuVSipiiVS½iwwwVSly|{zVSyy{yiui®uiVSiipiiVSiiiiwwwVSly|{{VSyy{yiiiVS»wVSipiiiiuVSipiiVSiiiiwpiiiVSwVSiiiiVSiiiiVSiwpiii¸uVSiiiipVSuipiiiVS¸iwwwtyytyy|VSVSVSly}yyVSyy~yyyztyy~yy{{y}yyyy{zyyyyVSiiiwzyztyyztyyy}VSyyzyiiijyzyVSVS \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/MazeS.pxe b/res/universal/data/sprites_up/Stage/MazeS.pxe new file mode 100644 index 0000000..5103bc8 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/MazeS.pxe differ diff --git a/res/universal/data/sprites_up/Stage/MazeS.pxm b/res/universal/data/sprites_up/Stage/MazeS.pxm new file mode 100644 index 0000000..786595f Binary files /dev/null and b/res/universal/data/sprites_up/Stage/MazeS.pxm differ diff --git a/res/universal/data/sprites_up/Stage/MazeS.tsc b/res/universal/data/sprites_up/Stage/MazeS.tsc new file mode 100644 index 0000000..990c0f2 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/MazeS.tsc @@ -0,0 +1 @@ +?FWXKFMW_::=AFPKS:::>FOXN-:;::FZ\SFPKY:::F^\K::>:D::CD:::?-:;:=FPVT:@B;D:;:?FS^T::;AD:;:>FZ\SFW]QVymuon8FXYNFOXN-:;:>FZ\SF]Y_::<;D::C:D::;?D:::C-:;:@FUOcF]Y_::;;FKXZ:;:@D::::D:::F^\K::>D:::?D:::C +-:;;:FPVT:A>:D:;;;FUOcF]Y_::;;FKXZ:;;:D::::D:::=D:?::D:::>D::;=-:;;;FUOcF]Y_::;;FKXZ:;;:D::::D:::=D::CD::;=-:;<:FUOcFPKY:::>F^\K::>:D::C>D::;AD;<::D::=BD::;@ \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/MiBox.pxe b/res/universal/data/sprites_up/Stage/MiBox.pxe new file mode 100644 index 0000000..3fb5faf Binary files /dev/null and b/res/universal/data/sprites_up/Stage/MiBox.pxe differ diff --git a/res/universal/data/sprites_up/Stage/MiBox.pxm b/res/universal/data/sprites_up/Stage/MiBox.pxm new file mode 100644 index 0000000..35422ed Binary files /dev/null and b/res/universal/data/sprites_up/Stage/MiBox.pxm differ diff --git a/res/universal/data/sprites_up/Stage/MiBox.tsc b/res/universal/data/sprites_up/Stage/MiBox.tsc new file mode 100644 index 0000000..65d53e2 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/MiBox.tsc @@ -0,0 +1 @@ +NKdqqzqNK}}qqqq}NKdqqzrNK}}qqqr}NKdqqzsNK}}qqqs}NKdqqztNK}A}qqqt}NKdqqzuNK}}qqqu}NKNKdqrqqNK}}qqqu}qqrr{qqzu{qqsu{qqtuNKNK \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Mimi.pxa b/res/universal/data/sprites_up/Stage/Mimi.pxa new file mode 100644 index 0000000..94e8fc0 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Mimi.pxa differ diff --git a/res/universal/data/sprites_up/Stage/Mimi.pxe b/res/universal/data/sprites_up/Stage/Mimi.pxe new file mode 100644 index 0000000..5b68f62 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Mimi.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Mimi.pxm b/res/universal/data/sprites_up/Stage/Mimi.pxm new file mode 100644 index 0000000..7fc90d8 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Mimi.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Mimi.tsc b/res/universal/data/sprites_up/Stage/Mimi.tsc new file mode 100644 index 0000000..de5e265 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Mimi.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qlv|z`cdaj``iels}```ilvqy````lu~t=:S``ia=:l}~qlv|z`cdaj``ifls}```ilvqy```alu~t=:S``ib=:l}~qlv|z`cdaj``igls}```ilvqy```blu~t=:S``ic=:l}~qlv|z`cdaj``ihls}```ilvqy```clu~t=:S``id=:l}~qlv|z`cdaj``iils}```ilvqy```dlu~t=:=:S``ie=:ls}``bhlvqy````lu~t=:S``if=:ls}``bhlvqy```alu~t=:S``ig=:ls}``bhlvqy```blu~t=:S``ih=:ls}``bhlvqy```clu~t=:S``ii=:ls}``bhlvqy```dlu~t=:=:=:S`a``=:lylv|z`cbdj`a`b=:lyz```aj`a`a=:l}w|^l~tlu~t=:S`a`a=:l``bblwya``alv|[`cbdlv|[`dda=:l}wPmqWP{m^l~tlwy````ls|luu`a`b=:S`a`b=:l``aals~`a``j````j````lvq```dlq```aj``idj``agj```h=:=:=:S`a`c=:lylvq````lq``aej``i`j``cfj``ad=:S`a`d=:lv|z`cbgj`aab=:lv|z`cf`j`aaa=:l{ul}wlvqs```iyWPz\l~t=:P]PP^l~tls|PPPP=:}P\PP=:PqP^l~tls|\PPPyP\=:Pol~tls|\PP=:PPPP=:\l~t=:PyWPPP=:PPPPW=:P^l~tlu~t=:=:S`a`e=:l{ulv|z`cf`j`a`fl``aalq~`a`ej````j```bluu`a`f=:S`a`f=:l{ulvq```dlq``adj``idj```ej```i=:=:S`a`g=:lyl``aals~`a`gj````j````lvq```dlq``aij``idj```gj``a`=:=:S`a`h=:lylvq```blq``agj``ibj```bj``aa=:=:S`a`i=:lylvq```dlq``b`j``idj``a`j```i=:=:S`aa`=:lylvq````lq``abj``i`j``eej```i=:=:S`aaa=:l{ulv|[`cbglv|[`ddcl}wlvqs```ioQl~t=:WPPol~t=:\PQl~t=:yWPPPP{=:PQl~tls|=:l}t````=:lq~`aaaj```hj````lqy`b`h=:lq~`aaaj````j```blqy``a`=:l``aalq~`a`gj````j```blqy``c`=:lt~`aaa=:l``aalq~`a`gj````j````lu~t=:=:S`aab=:lylvq```blq``afj``ibj```bj``ab=:=:=:=:S`b``=:lylv|z`cbbj`b`alv|[`cbbl``bbls~`b``j``baj````=:l}wPP^l~tlwya``bly[```blu[```bls|=:ls}``a`wPPm}PmQlqy`af`l~tl}luu`b`a=:S`b`a=:lyl}wWPP^^^l~tls|lPPPPPP=:P\PPP=:PPP^PPyP^l~tlu~t=:=:S`c``=:S`c`a=:l{ulv|z`cbcj`c`elv|[`cb`lv|[`cbc=:l}w^^^^^l~tls|=:l}r````lqy``e`l}t````ls~`c`aj``faj```blqy```hls~`c`aj``faj```d=:l}wlvqs```goPWPPPol~t=:yPPPP=:P^^^l~tls|yWP{^l~t=:yWPP]P=:P^l~t=:~PPP=:PP\PP=:PPP^l~tls|\PPP^l~tls|WPPPP\=:^l~t=:WPPP=:PPP^l~tlu~t=:=:S`c`b=:l{ulv|[`cb`lv|[`cbalv~`c`bj``afl}~qlvqy```dls}````lqy`a``=:l}wlvqs```gxPPPQl~tls|lvqs```h~QPyPWQl~tls|lvqs```gqPPP=:Pol~t=:WPPQ=:WPPPPQl~tls|lvqs```fWPPP^l~t=:yWPPPQl~tls|lvqs```g^^^l~t=:PPtP\=:PPWP=:PP^^^l~t=:yPPWPP=:\PPPP=:PP^l~tls|lvqs```fr^^^Pr^^^l~tls|lvqs```gP\PQl~t=:lvqs````ls|=:l}``acj``bb=:lqy``gelx}sls~`c`ij`ae`j```blq~`c`ij``a`j```blq``c`=:l}woQl~tls|=:lqy``a`=:lq~`c``j```fj```b=:lq~`c`aj```fj````=:lqy`a``=:lq~`c``j```fj```b=:lqy``h`=:lt~`c``=:ls}```i=:lv}``afl}slt~`c`ilu~t=:=:=:S`c`e=:l{ul}wlvqs```grPP^^^l~t=:PPPP=:P^l~tlu~t=:S`c`f=:l{ul}wlvqs```gwQl~tls|Ql~t=:WPPP=:PQl~tlu~t=:S`c`g=:S`c`h=:l{ul}t```blvqy```bls}````lqy``b`=:l}wlvqs```gwPPPQl~tls|lvqs```h~Ql~tls|=:lq~`c`gj```fj```blqy`0f`=:lq~`c`fj```fj```bl``aflqy`a``lt~`c`glv|]`cgals}```ilu~t=:S`c`i=:=:=:S`caa=:l{ul}wZPZl~tls|Ql~tls|=:l}r````lq~`caaj```bj```dlqy``c`l}t````=:lv|z`aefj`cac=:lv|z`ab`j`cab=:lv|z`cf`j`cad=:l}wQPPP^^^l~tls|ol~t=:\P^l~tls|PPPqWP\Pol~t=:WPPP^l~tls|P\P^l~t=:PWPPP=:RPtR^^^l~t=:tPPPP^^^=:tPPPP=:ol~tlq~`caaj````j```blu~t=:S`cab=:l}w\PP^l~tls|PPPP^l~t=:PPWPPP=:P^l~tlq~`caaj````j```blu~t=:S`cac=:l{ul}wyPPPPP=:qWP^^^l~tls|qPPPPP=:ol~tlq~`caaj````j```blu~t=:S`cad=:l{ul}wol~t=:WPPol~tls|\PWPP^l~t=:~PPPPPP=:PP^^^l~tlq~`caaj````j```blu~t=:=:S`d``=:l{ulv|]`aeelv~`d``j``aflvqy```dl}~qls}````lqy`a``lq~`f``j``aaj```b=:l}wlvqs```c|PPPPQl~tlq~`f``j````j```bls|lq~`fa`j````j````lvqs```gxPPQl~tls|WuPPP=:PQl~tls|PPPP=:PPPPP=:PPP^l~tlq~`f``j``aaj```bls|lvqs```cP]PQl~tlq~`f``j````j```bls|lvqs```gyPPWPPP=:\PyPPyWP=:PPPQl~tls|ls}```i=:lv}``aflqy``e`lu~t=:=:=:S`da`=:S`daa=:S`db`=:l{ulx}sls}````=:ls~`da`j``dbj```b=:ls~`daaj``gdj````=:lq~`fa`j````j````lqy`a``l}wlvqs```gPW^^^ol~tls}```ilvqy```dls|lvqs```bWP^l~tls|PtPPP=:PPPP=:PPP^l~tls|lvqs```i]]PPP=:PPoQl~tls|lvqs```bPP^^^=:^^^PPP^l~tls|lvqs```iqPWPPP=:PPPol~tls|lvqs```bqPPPyPP\=:WPPP=:^l~tls|PPPP=:WPP^l~tls|lvqs```iy^^^l~tls|yPPP=:\P^^^l~tls|lvqs```bPPP^^^=:qPPP^^^l~tls|lvqs```gyWPPP=:PQl~tls|=:lv|]`aedlv|[`aeg=:lvq```dlq```aj`fb`j```ej```h=:=:=:S`e``=:l{ul}wlPPPPPPPPPPPPjPPv=:PPPP|jPPPPjPw=:PPPPPPPPPPPtjPqWPxl~t=:lu~t=:=:S`e`a=:l{ul}wl=:PPPPPPPPPPPPPPPvl~tlu~t=:S`e`b=:l{ul}wl=:PPPPPPPPPPPPPPPPPl~tlu~t=:S`e`c=:l{ul}wl=:PPPPPPPPPPPPP}Pw=:PPPPPPPPPPPPPtQP~Pul~tlu~t=:S`e`d=:l{ul}wl=:PPPPPPPPPPPPPPqWPxl~tlu~t=:S`e`e=:l{ul}wl=:PPPPPPPPPPPPPPPqPxl~tlu~t=:=:=:S`f``=:lv|z`bbdj`f`b=:lv|z`cbej`f`a=:l{ulv|[`cbel[```bjf``b=:l}wlvqs```a\PyWP^^^l~tls|PWP=:PP}\=:PPP^l~t=:xPWP\l~t=:PPPP=:P}PP=:PPPP\l~t=:PPP=:P^l~tls|^^^^^l~tls|yP^l~tls|PWPPP=:Pol~tls|}PWPP=:P=:w^l~t=:vPPPP=:^l~tlu~t=:=:=:S`f`a=:l{ul}wlvqs```avPPP=:PP^l~t=:PPPPw=:PPP=:qWP^l~tlu~t=:S`f`b=:l{ul}wlvqs```axPPP=:Pol~tlu~t=:=:S`fa`=:lv|z`bbdj`faa=:l{ul}wlvqs```gPPPPP=:PPPP=:P^l~tlu~t=:S`faa=:l{ul}wlvqs```gP^^^l~tlu~t=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Momo.pxe b/res/universal/data/sprites_up/Stage/Momo.pxe new file mode 100644 index 0000000..67cd58c Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Momo.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Momo.pxm b/res/universal/data/sprites_up/Stage/Momo.pxm new file mode 100644 index 0000000..e58b14d Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Momo.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Momo.tsc b/res/universal/data/sprites_up/Stage/Momo.tsc new file mode 100644 index 0000000..bad33d1 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Momo.tsc @@ -0,0 +1 @@ +nknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknknkЁցƁƁnkƁƁǏnkɍ́ԏ΁ρЏnkƈԁӏnkŁЁƁnkԁȁՁnkӈԁƏnkՁƁƁŁnkԍƁŁЁnkƁӁƏnkЁƁŁƁŁnkƁƁǁƁŏځԁōnkՁƁ́֏ՁՈԁӁnkӁƏՁ؁΁nkρȁՍnkƁՁ́ՁnkЁƁӈԁƏnkψՁƁƁnkƁԁՍɏnknknknknkՁŁՁnkԁӏnk؍ЁŁƁnkǁƏnknknkՁŁnk؁ԏnkӁבϏ́ŁnkԁЁɁnkՏnknknknknknkՁŁnk؁ԏnkӁדϏ́ŁnkԁЁɁnkՏnknknknknknkƁցځՁؠڠnkӁōϏnknknkɍŁӏnkӁӁŏƍՁԁnkӁ؏nknkՁƁ̞nkȍƁȏnkԁՈԁnkȍՏƁԁȁnkԁψՁnkЁ́ɁԏnkՁɁaՁ́ύnkցŁƁƁnḱЁΏƁցɁƁЁӠnknknkŁցЁ́nkρŁɏƈԁԁōnkЁՁƈԁnkӏnknknkЁƁƁՍnḱŁځnḱӏnkǁցŁՁŁnkƁǁƁnkځƁՁƍnḱՁƁnkЁ́ɁՏƁȁƁ́nkӞnknknkЁƁƁՍnḱŁځnḱӏnkƁԁnkρƁԁՁnkƁ̏ƁȁƁ́nkӞnknknkƁ̏ŁӁnkρӞΏԁӈnkԁƁρՏnkψՁЁnkɁԏnknknkƁ̏nkŁӁƁӞՈԁƏځǁƁnkƁԏnḱԁځ̏nkՍŁցЁnkρρŁɏƈԁρӁnkƁՃnkЁƁԁρԏՁƈԁЁƁnkƁՁŁρnkӁՏnkƁŁ΁ƁnkՁǁƁՍnkƁψՁƁρӏnknknkƁ̏ŁցŁɠnkŁӁƁӞԁԁՍ́ՏnkԁԁƁnkƈԁЁŁǏΏƁԁŁnkՁӁǁځnkƁځƏ͍́nk؏nknknknḱցځɏՈ́ƁƁnkƁ΁ōnkЁځψՁցnkӁρՁŠnknknknknkЁցՁЁՠnknkɁŏnknknknknknkցρӁȁяnknknknkՏnknk \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/New.pxe b/res/universal/data/sprites_up/Stage/New.pxe new file mode 100644 index 0000000..6407ae9 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/New.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Oside.pxa b/res/universal/data/sprites_up/Stage/Oside.pxa new file mode 100644 index 0000000..d141dad Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Oside.pxa differ diff --git a/res/universal/data/sprites_up/Stage/Oside.pxe b/res/universal/data/sprites_up/Stage/Oside.pxe new file mode 100644 index 0000000..38e3b5d Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Oside.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Oside.pxm b/res/universal/data/sprites_up/Stage/Oside.pxm new file mode 100644 index 0000000..03adc62 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Oside.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Oside.tsc b/res/universal/data/sprites_up/Stage/Oside.tsc new file mode 100644 index 0000000..5572988 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Oside.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``belvqy````lu~t=:S``ia=:l}~qls}``belvqy```alu~t=:S``ib=:l}~qls}``belvqy```blu~t=:S``ic=:l}~qls}``belvqy```clu~t=:S``id=:l}~qls}``belvqy```dlu~t=:=:S`a``=:l{ulvq````lq``ebj``i`j``agj``a`=:=:S`ab`=:l{ul``aalq~`ab`j````j```blvq```dlq``eej``idj```ij```i=:l}wWP^^^l~tlu~t=:=:S`ac`=:l{ulyz``cbj`acal``aalq~`ac`j````j```blvq````lq``fij``i`j``aej```h=:S`aca=:l{uls}````l``aalq~`ac`j````j```b=:lwya`cbly]``cblv|[acg`l}wyWPQl~tls|=:lvq````lq``fij``i`j``aej```h=:=:S`ad`=:l{ulvq````l}t````lq``idj``i`j``adj```g=:=:S`b``=:lyl}wqPol~tlu~t=:=:S`d``=:l{ulv|z`if`j`d`al}wlvqs``a`yPWPP=:PPP\=:WPP^l~tlu~t=:S`d`a=:l{uls|lv~`da`j``aflqy``e`=:l}wlvqs``a`wPl}t````^l~tls|=:ls~`db`j`ae`j````lx}s=:lq~`d``j```cj````lqy``cb=:lq~`d``j````j```blqy``cb=:lq~`db`j``e`j````lqy``cb=:lq~`db`j````j```blqy``cb=:lt~`d``lt~0db`=:lq~`da`j``a`j```blqy`b``=:l}wlvqs``a`xPP^l~tls|lvqs````=:lq~`da`j``b`j```blqy`be`=:lq~`da`j``a`j```blqy`b``=:l}wqPPPPP=:PP^lqy`b``ls|rP\PPtP=:PPPP\P=:PPPPP^lqy`b``ls|PPPPP=:PPPPtW=:olqy`b``ls|lvq```buP\PPP=:PP^lqy`b``ls|\PPPP=:PP\PP=:PtWP\lqy`b``ls|PP{PP=:PPPPP^^^lqy`b``ls|ls}``bf=:lPPPPPPPPPPPPPPPP]PPuP]lqyiiii=:lu~t=:=:=:S`da`=:l{ul}ww^^^l~tlu~t=:S`db`=:=:=:S`f``=:l{ul}wPPPP=:^l~t=:PPPPPPP=:P^l~t=:yWPPyWPPP=:PPP^l~t=:PPPyPPP=:PP^^^l~tlu~t=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Ostep.pxe b/res/universal/data/sprites_up/Stage/Ostep.pxe new file mode 100644 index 0000000..0d1e91e Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Ostep.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Ostep.pxm b/res/universal/data/sprites_up/Stage/Ostep.pxm new file mode 100644 index 0000000..1732069 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Ostep.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Ostep.tsc b/res/universal/data/sprites_up/Stage/Ostep.tsc new file mode 100644 index 0000000..80e6ef0 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Ostep.tsc @@ -0,0 +1 @@ +0==F=IZ[NISNV====IR[Q0==F>IZ[NISNV===>IR[Q0==F?IZ[NISNV===?IR[Q0==F@IZ[NISNV===@IR[Q0==FAIZ[NISNV===AIR[Q0=>==IXRfI`\b==>>IN[]=>==G====G===?ISN\====Ia_N==EBG==FCG==>FG==?F0=>>=IXRfI`\b==>>IN[]=>>=G====G===?ISN\===?Ia_N==EDG==FBG===AG==>>0=?==0=?=>0=F== IQ[]=F==IXRfIZfQ===?IZ`T]yrnr-xvyy-z-znr;I[\Qaun-v-ur-|{y-n-Zvrpn{-or-srrq;;;I[\Q;;;aur-|{y-n-|-n|vq-nr}rvv|{-|s-uv-ntrq;I[\QIPY_Z-znr4-{nzr-v-Onyy|;I[\QIPY_Uv-zntvp-}|r-unr-t|{r-vyq9n{q-{|-ur-pn{{|-rr{-qvr;;;I[\QIN[]=?=>G==>=G====ISY8>C?=IR[Q \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Pens.pxa b/res/universal/data/sprites_up/Stage/Pens.pxa new file mode 100644 index 0000000..9afb486 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pens.pxa differ diff --git a/res/universal/data/sprites_up/Stage/Pens1.pxe b/res/universal/data/sprites_up/Stage/Pens1.pxe new file mode 100644 index 0000000..84e8440 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pens1.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Pens1.pxm b/res/universal/data/sprites_up/Stage/Pens1.pxm new file mode 100644 index 0000000..04545f6 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pens1.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Pens1.tsc b/res/universal/data/sprites_up/Stage/Pens1.tsc new file mode 100644 index 0000000..8c7acfc --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Pens1.tsc @@ -0,0 +1 @@ +öʥùöʥùöʥùöʥùöʥùʥùʥťť̶ťι¸ťùαöʥťť̶ťι¸ťùǾĥǶǾĥǶǾʥťĥǶǾʥʥťĥǶαȼڕ㣣ĹDZǗەڕ䡕ݡᣣĹDZȼڕܕ紱ÿٕ蕺܂磱ĹȠùαȼڕ㣣ĹǂǸܕ䕼㣣Ĺùαȼǂٕ䕼㣱Ĺùαȼǂ٣ĹùαȼǂٕٕڣĹùαȼڕ㣣ĹDZǂٕڕܕֱĹùαȼ裣Ĺùαȼ磱ĹűĹùαȼڕࣱĹڜࣱĹڜٕڕڕڣĹڕڡڜڕܕࣱĹڕڡڣĹǾڡ졂ڕە裱ĹڣĹùαȼڕڣĹùαʥť̶ť̶ťť̶ȼݣĹDZڕĹı̶ťȼ⣱Ĺڕٕڂ裱ĹDZĹıť̶ťʥťȼ֖ĹťǶٕ畷疱ĹDZݖĹıť̶ťȼڕ顕㴖ĹDZᡕڕ裱Ĺıťť̶ť̶ťʥť̶ťȼĹDZִĹı̶ť̶ť̶ť̶ȼܣĹǶٕەڕڕڕڣĹڕٕڕۂڣĹە⡂ݡڕقڕ裱ĹǺܕ裣ĹĂʥťť̶ťι¸ťùαȼڕڂܕڣĹەڕ܂㣣Ĺùαȼ壱Ĺڡڕ٣Ĺùαȼ݂֕㣣Ĺ䖕閱Ĺùαη̶ιťȼڕĹڕڕڣĹݕ塱ĹڕٕڕڕٕڕٕܣĹıť̶ťȼ疱ĹǸڕڕڂݕڕ䴱Ĺıť̶ťȼʥĹǂ磱ĹDZĹDZڡ磣ĹڕڕٕڣĹڕقڕٕ裱ĹťǂĹDZ鴱ĹDZڕڕuٕ⡕֕ەڣĹڕڕقڣĹڕڕڕٕڕڕٕڣĹǂڕٕڴĹ㡕ڂڜٕڕ紱ĹDZᡱĹڕڂە裱Ĺەڕڂڕ⣣Ĺǽ硕ڕٕڕ裱Ĺܕڕڕڂ塱ĹڜڕڕٕڣĹǂڕܕ崱ĹDZĹڜڕە֕ݕףĹıťť̶ť̶ťȼ꣱Ĺǂʥ䕾ȕڴĹDZ飣ĹڕەڕقڂٕٱĹ䣱ĹDZ鴖ĹDZٕٕ顱ťĹ镾ڂ裱ĹڕڕەٕڣĹDZ磱ĹڕٕڕقڣĹDZڣĹıť̶ťť̶ȼڕڕقܕ٣Ĺڣڕ٣ĹȠùαȼݕڕقڕ֕ڕ磱Ĺٕڕٕقڕڕۂ⣱ĹùαȼڕڕەڣĹǾ٣Ĺڂ飱ĹùαȼڕٕڣĹùαȼەٕەڂ衕ڜڕڕڕ죱ĹǾ֕ܕĹùαȼڕڕݕقڕ٣Ĺܕ꣣Ĺùťαιť̶ťťť̶ťť̶ť̶ťȼĹıť̶ȼꡕڣĹǣڕقڕٕ裱Ĺǣڕٜڕ裱ĹڕڂڣĹǾٕڕقڕڂ㕾ٕڕڣĹıť̶ťɠɦȼڕ맣̶Ĺıɥťȼڕٕ飱ĹǾەڕڕ㡱Ĺڕٕڕ٣Ĺ硱ĹٕڕٕڕڕڕڣĹڕڕڂٕڡĹڕٕڕڕܕݕ裱Ĺǂܕ꣱ĹڕݕٕڣĹĂȠùαȼڕڕݕقڕ٣Ĺܕ꣣Ĺùαȼڂ٣ĹڕڕڂڣĹùαʥĥǶǾȼڂܕ紱ÿĂαť¸̶ť̶ĥǶǾȼ䕼㴱ÿĂαť¸̶ť̶ĥǶǾȼڂٕڴÿĂαť¸̶ť̶ĥǶǾȼڂݴÿĂαť¸̶ť̶ĥǶǾȼڂ㴱ÿĂαť¸̶ť̶ĥǶαǶ \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Pens2.pxe b/res/universal/data/sprites_up/Stage/Pens2.pxe new file mode 100644 index 0000000..b62ccd1 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pens2.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Pens2.pxm b/res/universal/data/sprites_up/Stage/Pens2.pxm new file mode 100644 index 0000000..04545f6 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pens2.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Pens2.tsc b/res/universal/data/sprites_up/Stage/Pens2.tsc new file mode 100644 index 0000000..6a2043a --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Pens2.tsc @@ -0,0 +1 @@ +~~µɤ¸~~µɤ¸~~µɤ¸~~µɤ¸~~µɤ¸~~~~~~Ͱɤ~ǻƷ۔ߢ˵~ؔ⢰˵~ƹ۔ᢰ˵Ɓ~ǻբø~ٔٳø~øäƵ~~Ͱǻ٢ø~ٔ㢰ø㠔⳰ø~ٔٔ볰ø~ؔٔ碰ø~ܔ鳰øäƵ~~Ͱǻٔڔ碰ø~ؔ܁~Քآø~ہ~賰øư۔~Ֆ˵ưƷ٢~⮔tٔø~۔碰ø۔~攖▢øƁ~ǻࠔہ~颰ø~٢øäƵ~~ͰĤǻø~~۔٢øƁ~ɤĤ˵ɤĤø~ðĤ˵Ĥ~ǻٔߢø~ٔ۔~颢øưܳ볰ø~Քøư؁~ٔ⢰øư賕øưؔٛٔ۔Ɂ~ٕøÁ~Ĥ˵äǻ~ٔ㕰øưܔ㠔蕰øƵ~¸~¸~~~~~~~ \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Pixel.pxe b/res/universal/data/sprites_up/Stage/Pixel.pxe new file mode 100644 index 0000000..3364dd5 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pixel.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Pixel.pxm b/res/universal/data/sprites_up/Stage/Pixel.pxm new file mode 100644 index 0000000..575bee6 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pixel.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Pixel.tsc b/res/universal/data/sprites_up/Stage/Pixel.tsc new file mode 100644 index 0000000..fded528 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Pixel.tsc @@ -0,0 +1 @@ +QNgtt}tQNttuxttttQNgtt}uQNttuxtttuQNgtt}vQNttuxtttvQNgtt}wQNttuxtttwQNgtt}xQNttuxtttxQNgtt}yQNtttuQNQNgtuttQNtutt~tttt~tttvttuuQNtttxttx|~tt}x~tuyw~ttuzQNQNgtvttQNQNuxxu~tvtwQNuxxt~tvtvQNt|wy~tvtuQNddddrQNtxqt|qt|dddrQNQNgtvtuQNddddrQNdkddddQNQNgtvtvQNouxxyddddrdpddddQNddddrrrQNQNgtvtwQNddddrQNddddrQNQNgtvutQNQNgtvvtQNddddrrrQNgtvvuQNkddpdQNdrrruxxu~tvvwuxxy~tvvvQNgtvvvQNQNddddddttttouxxuqddQNdddQNrddddddQNdpdddQNdddqrdddddQNddddddQNdrQNrttutrttutrttutrttutrttutrttutrttutrttutttutddddQNetuztDddddddQNddpdddQNdddrttwtQNgtvvwQNdddQNdrrrQNQNgtvytQNQNuxxx~tvy{QNuxxw~tvyyQNuxxv~tvyxQNuxxu~tvywQNuxxt~tvyvQNt|wz~tvyuttu}QNgtvyuQNQNddddtttttttxttttttvtQNrrrrrQNtuttoutttQNtvutqt|wzouxxttttvQNtt{w~tt}y~ttuv~ttt}QNgtvyvQNdkdpdddQNdkddrQNgtvywQNddddddQNdttttQNouxxvtttutttttvtttttuQNtuytttvtQNrrrttuxttvyrrrrrtvzt~tttu~tttvttu}kdepdkddrrrttvydkdddQNdddrQNdddpQNdkdddQNdrrrddddQNdddkQNrQNttvtrrrtttttvzt~tttu~ttttQNttytQNdddrQNQNgtvyxQNdddddQNddrouxxwQNgtvyyQNQNddddddtvyzQNgtvyzQNtvzt~tvy}~ttttot|wzquxxtouxxxQNgtvy{QNdkddrQNQNgtvztQNQN \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Plant.pxe b/res/universal/data/sprites_up/Stage/Plant.pxe new file mode 100644 index 0000000..2fe9f5b Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Plant.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Plant.pxm b/res/universal/data/sprites_up/Stage/Plant.pxm new file mode 100644 index 0000000..2fe59c1 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Plant.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Plant.tsc b/res/universal/data/sprites_up/Stage/Plant.tsc new file mode 100644 index 0000000..3117832 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Plant.tsc @@ -0,0 +1 @@ +YVo|||YV|}||||}||||YVo||}YV|}||||}|||}YVo||~YV|}||||}|||~YVo||YV|}||||}|||YVo||YV|}||||}|||YVYVo||YV||~||||YVo||YV||~|||}YVo||YV||~|||~YVo||YV||~|||YVo||YV||~|||YVYVo|}||YV||||||}}|||||||~}YVYVYVo|}|YVll±||||l±zYVo|}|YVw}|||||~|wlzYVYVo|~||YVlllzYVllñlzYVllllíl±llzLlllllñYVlzlñxlxlllÿzlŻllllñxYVllŻlllYVxlllŻll±lmllñlsl±lYVllõlzYVYVYVo|~~|YV}|~||~~}lzYVo|~~}YVslıllllmYVYVo|||YVYVw|}|YV|||YVlllzzz||}|}||w|||YVlllz|}|YVYVYVo|||YV||~~|||||}YV}||lllm|}|w|||YVllllmYVYV \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Pole.pxe b/res/universal/data/sprites_up/Stage/Pole.pxe new file mode 100644 index 0000000..df67329 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pole.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Pole.pxm b/res/universal/data/sprites_up/Stage/Pole.pxm new file mode 100644 index 0000000..e0b3f54 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pole.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Pole.tsc b/res/universal/data/sprites_up/Stage/Pole.tsc new file mode 100644 index 0000000..d3da595 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Pole.tsc @@ -0,0 +1 @@ +CPPYP-*\mna\cmuPPPX\faiPPPP\end-*CPPYQ-*\mna\cmuPPPX\faiPPPQ\end-*CPPYR-*\mna\cmuPPPX\faiPPPR\end-*CPPYS-*\mna\cmuPPPX\faiPPPS\end-*CPPYT-*\mna\cmuPPPX\faiPPPT\end-*-*CPPYU-*\cmuPPPX\faiPPPQ\end-*-*CPQPP-*\pri\faoPPPP\traPPQRZPPYTZPPUSZPPSV-*-*-*-*CPRPP-*\key\fljQVTPZPRPQ\flKQVTP\souPPRR\cnpPRPPZPPRQZPPPP-*\msgo@@N\nod\gitPPPR\amKPPPRZPPPP\clr-*\cmuPPQPg@@]p@s]A\waiPQVP\nod\gitPPPP\clo\rmu-*\msg-*f@L@@NNN\faoPPPT\nod\traPPQXZPUPQZPPPRZPPPP-*-*CPRPQ-*\pri\msgeN\nod\end-*-*CPRQP-*-*-*CPSPP-*\key\msgJJ\nod\end-*-*CPSPQ-*\fljQVTTZPSPS-*\key\msgy@G@@@@i@L-*@_\nod-*s@@@@@-*i@@A\nod-*dL@@@@i@G@-*@@@@@-*i@NNN\nod\amjPPPRZPSPR\clri@G@@@A\nod-*j@@@@@@i-*G@@@@@-*@@@@@N\nod\clr-*aL@@@L@@@NNN\nod\end-*-*CPSPR-*\key\msg\cmuPPPP\mybPPPR-*heyAA\nod\clriG@that@@_A\nod\clr\gitPPPRw@@you@@@_A-*i@G@@@@A\nod\clrg@@A\nod\clr\cnpPRQPZPQUPZPPQR\waiPPQR\gitPPPP\hmc-*]p@s]@NNN\nod\clrpA\nod-*i@@G@@-* @@@N\nod\clr-*NNNNN\nod\clry@L\nod-*iG@@@@G-*@@@@-*N\nod-*t@@@@@G-*@@@@-*@@@N\nod-*t@@@@@@-*@@@@@-*@@@N\nod\clr-*\cmuPPPXhNNN\waiPPUP\clrw@i@@@@@@-*@@@@L-*@@@@@N\nod-*t@@@@@-*@@@@G-*NNN\nod\clr-*hNNN\nod\clri@@@@N\nod\clr-*y@@@@N\nod\cmuPPPP\faoPPPQ-*a@i@@L@@N\nod\clo-*\waiPQUP\faiPPPQ-*\fla\waiPPUP\tamPPPRZPPQSZPPPP\flKQVTT\flKPSPS\msg-*\cmuPPQP\msg\gitPPQS-*]p@s]@@@]s]A\smc\dnpPRQP\waiPQVP\nod\cmuPPPX\end-*-*CPSPS-*\key\msgi@@L@@@-*@@@@-*@@@@@N\nod\clri@@L@@L@-*@@@@@@-*@@N\nod-*f@@L@i@@@-*@@@@@N\nod-*t@@@@-*@i@@@@@-*@@@@@@N\nod\end-*-*CPSQP-*\key\msg\tur-*BoNB\nod\end-*-*-* \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Pool.pxe b/res/universal/data/sprites_up/Stage/Pool.pxe new file mode 100644 index 0000000..86f833b Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pool.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Pool.pxm b/res/universal/data/sprites_up/Stage/Pool.pxm new file mode 100644 index 0000000..5501c2d Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Pool.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Pool.tsc b/res/universal/data/sprites_up/Stage/Pool.tsc new file mode 100644 index 0000000..c2347f1 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Pool.tsc @@ -0,0 +1 @@ +tqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtq̦ϓއٕtqێڇ̇̇ӇևtqˇׇՇَڇtqӇ̇̓ۦtq̇ˇׇ̇ۇtq·g֕tq̇ˇهˇׇtq̇Շٕ̇tq̇Վۇԇև̇tqϕtqՎۇއ̇̎tqȇȇۇ̇ڕtqtqtqtqtqtqtq·ڇՇ̇ەtqۇ̇هۤtqtqtqtqtqtqtqψtqtqtqtqtqtqtqtqtqtqtq \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Prefa1.pxe b/res/universal/data/sprites_up/Stage/Prefa1.pxe new file mode 100644 index 0000000..2de6026 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Prefa1.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Prefa1.pxm b/res/universal/data/sprites_up/Stage/Prefa1.pxm new file mode 100644 index 0000000..8c91db8 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Prefa1.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Prefa1.tsc b/res/universal/data/sprites_up/Stage/Prefa1.tsc new file mode 100644 index 0000000..a01d1b7 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Prefa1.tsc @@ -0,0 +1 @@ +{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{xÞ{x{x{xǪÞ{x{x{x{xǪ{x{x{x{x{xǪҎώӎ܎{x{xҎӎݎҎ⭪Ǽ܎Ԏӎҕ{xҎӎӎ{xҚ⚪Ҏӎnݎ{xڎ✪ᚎӎ{x܎ӎԎՎ{xڎӎӎ܎ݎ{x᎞Ҏڎ䞜ݎ{xӎҎݎ{x܎Ԏ՜ێӎ܎ӎ䠜{xҎӎՎ֜ݎӎ܎܎{xڎۜ{xů{xҎӜů{x{x{x \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Prefa2.pxe b/res/universal/data/sprites_up/Stage/Prefa2.pxe new file mode 100644 index 0000000..1e0eba9 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Prefa2.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Prefa2.pxm b/res/universal/data/sprites_up/Stage/Prefa2.pxm new file mode 100644 index 0000000..674ad60 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Prefa2.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Prefa2.tsc b/res/universal/data/sprites_up/Stage/Prefa2.tsc new file mode 100644 index 0000000..fd0ddf2 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Prefa2.tsc @@ -0,0 +1 @@ +YVo|||YV||||||||YVo||}YV|||||||}YVo||~YV|||||||~YVo||YV|||||||YVo||YV|||||||YVYVo|}||YVslzzzYV|}|||||||||~||}}|||||~||||||YVYVo|}}|YV|||YVw}}Lw}w}|YV|||||||}|||}YVYVYVYVYVYVo|~||YVlŻslll±lxYVll±lŻllllzlŻlíll±l||||YVw}|w}}w}~|||||||}|}||YV||||}||}}||~YVYVo|~|YVYVlsllzzzYVYV \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Priso1.pxe b/res/universal/data/sprites_up/Stage/Priso1.pxe new file mode 100644 index 0000000..c28cec5 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Priso1.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Priso1.pxm b/res/universal/data/sprites_up/Stage/Priso1.pxm new file mode 100644 index 0000000..6cc6e54 Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Priso1.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Priso1.tsc b/res/universal/data/sprites_up/Stage/Priso1.tsc new file mode 100644 index 0000000..eeda7f0 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Priso1.tsc @@ -0,0 +1 @@ +=:S``i`=:l}~qls}``bilvqy````lu~t=:S``ia=:l}~qls}``bilvqy```alu~t=:S``ib=:l}~qls}``bilvqy```blu~t=:S``ic=:l}~qls}``bilvqy```clu~t=:S``id=:l}~qls}``bilvqy```dlu~t=:=:S`a``=:l{ul``aalt~`a``lvq````lq0`efj``i`j``h`j```i=:S`aa`=:l{ul``aalt~`aa`lvq```alq``fbj``iaj```gj``gd=:=:S`b``=:lq~`b``j```bj```blu~t=:S`b`a=:lq~`b`aj```bj```blu~t=:S`b`b=:lq~`b`bj```bj```blu~t=:S`b`c=:lq~`b`cj```bj```blu~t=:=: \ No newline at end of file diff --git a/res/universal/data/sprites_up/Stage/Priso2.pxe b/res/universal/data/sprites_up/Stage/Priso2.pxe new file mode 100644 index 0000000..31a9bcf Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Priso2.pxe differ diff --git a/res/universal/data/sprites_up/Stage/Priso2.pxm b/res/universal/data/sprites_up/Stage/Priso2.pxm new file mode 100644 index 0000000..445c3cd Binary files /dev/null and b/res/universal/data/sprites_up/Stage/Priso2.pxm differ diff --git a/res/universal/data/sprites_up/Stage/Priso2.tsc b/res/universal/data/sprites_up/Stage/Priso2.tsc new file mode 100644 index 0000000..b14b583 --- /dev/null +++ b/res/universal/data/sprites_up/Stage/Priso2.tsc @@ -0,0 +1 @@ +? El autor de este parche + +Miembros honoríficos: + + [Vegetal_Gibber] + [Lukas] + +WEB: http://vagrant.romhackhispano.org +TWITTER: http://twitter.com/vagrantTrans +FACEBOOK: http://www.facebook.com/profile.php?id=100000756671192&ref=ss +CANAL YOUTUBE: http://www.youtube.com/user/VagrantTraducciones +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +... +------------------ +3. Agradecimientos +------------------ +Muchísimas gracias a Pixel por este maravilloso juego y a Aeon Genesis por la cuidada traducción al inglés, en la cual me basé para hacer ésta al Castellano. + +También me gustaría dar las gracias a ciertas personas por ayudarme a corregir algunos errores o a traducir correctamente algunas cosas: +- Krathos (amigo mío) y keitaro_j (elotrolado.net), por darse cuenta de ciertos fallos +- Abesol (elotrolado.net), por ayudarme en algunas frases y nombres +- jas1 (elotrolado.net), por darme a conocer los trainers, que me han ayudado a pasarme el juego más rápidamente mientras traducía +- Otras personas del subforo de Pruebas en elotrolado.net (franKM, Rigle, etc.) por apoyarme y ayudarme en algunas dudas de traducción +- Mi profesora de inglés, por confirmarme que ciertas frases estaban bien expresadas. +- Vagrant Traducciones y en especial a Faloppa, por apoyarme y aceptarme en el grupo. + + +======== += CSE2 = +======== + +Currently we don't have a licence for our code. But, considering CSE2 is +intended for modders, you can probably get away with using it for that without +any of us getting mad over it. + +It might be worth crediting us, just to be safe - I (Clownacy) don't mind, but +GabrielRavier does. + + +============ += FreeType = +============ + +Portions of this software are copyright © 2006-2020 The FreeType +Project (www.freetype.org). All rights reserved. diff --git a/screenshot.gif b/screenshot.gif new file mode 100644 index 0000000..c9f1e88 Binary files /dev/null and b/screenshot.gif differ diff --git a/src/ArmsItem.cpp b/src/ArmsItem.cpp new file mode 100644 index 0000000..c2cd967 --- /dev/null +++ b/src/ArmsItem.cpp @@ -0,0 +1,660 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "ArmsItem.h" + +#include +#include + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" +#include "Draw.h" +#include "Escape.h" +#include "Game.h" +#include "KeyControl.h" +#include "Main.h" +#include "Pause.h" +#include "Shoot.h" +#include "Sound.h" +#include "TextScr.h" + +ARMS gArmsData[ARMS_MAX]; +ITEM gItemData[ITEM_MAX]; + +int gSelectedArms; +int gSelectedItem; + +int gCampTitleY; + +/// True if we're in the items section of the inventory (not in the weapons section) (only relevant when the inventory is open) +BOOL gCampActive; + +BOOL gbInfiniteAmmo; + +int gArmsEnergyX = 16; + +void ClearArmsData(void) +{ +#ifdef FIX_BUGS + gSelectedArms = 0; // Should probably be done in order to avoid potential problems with the selected weapon being invalid (like is done in SubArmsData) +#endif + gArmsEnergyX = 32; + memset(gArmsData, 0, sizeof(gArmsData)); +} + +void ClearItemData(void) +{ + memset(gItemData, 0, sizeof(gItemData)); +} + +BOOL AddArmsData(long code, long max_num) +{ + // Search for code + int i = 0; + while (i < ARMS_MAX) + { + if (gArmsData[i].code == code) + break; // Found identical + + if (gArmsData[i].code == 0) + break; // Found free slot + + ++i; + } + + if (i == ARMS_MAX) + return FALSE; // No space left + + if (gArmsData[i].code == 0) + { + // Initialize new weapon + memset(&gArmsData[i], 0, sizeof(ARMS)); + gArmsData[i].level = 1; + } + + // Set weapon and ammo + gArmsData[i].code = code; + gArmsData[i].max_num += max_num; + gArmsData[i].num += max_num; + + // Cap the amount of current ammo to the maximum amount of ammo + if (gArmsData[i].num > gArmsData[i].max_num) + gArmsData[i].num = gArmsData[i].max_num; + + return TRUE; +} + +BOOL SubArmsData(long code) +{ + // Search for code + int i; + for (i = 0; i < ARMS_MAX; ++i) + if (gArmsData[i].code == code) + break; // Found + +#ifdef FIX_BUGS + if (i == ARMS_MAX) +#else + if (i == ITEM_MAX) // Wrong +#endif + return FALSE; // Not found + + // Shift all arms from the right to the left + for (++i; i < ARMS_MAX; ++i) + gArmsData[i - 1] = gArmsData[i]; + + // Clear farthest weapon and select first + gArmsData[i - 1].code = 0; + gSelectedArms = 0; + + return TRUE; +} + +BOOL TradeArms(long code1, long code2, long max_num) +{ + // Search for code1 + int i = 0; + while (i < ARMS_MAX) + { + if (gArmsData[i].code == code1) + break; // Found identical + + ++i; + } + + if (i == ARMS_MAX) + return FALSE; // Not found + + // Initialize new weapon replacing old one, but adding the maximum ammunition to that of the old weapon. + gArmsData[i].level = 1; + gArmsData[i].code = code2; + gArmsData[i].max_num += max_num; + gArmsData[i].num += max_num; + gArmsData[i].exp = 0; + + return TRUE; +} + +BOOL AddItemData(long code) +{ + // Search for code + int i = 0; + while (i < ITEM_MAX) + { + if (gItemData[i].code == code) + break; // Found identical + + if (gItemData[i].code == 0) + break; // Found free slot + + ++i; + } + + if (i == ITEM_MAX) + return FALSE; // Not found + + gItemData[i].code = code; + + return TRUE; +} + +BOOL SubItemData(long code) +{ + // Search for code + int i; + for (i = 0; i < ITEM_MAX; ++i) + if (gItemData[i].code == code) + break; // Found + + if (i == ITEM_MAX) + return FALSE; // Not found + + // Shift all items from the right to the left + for (++i; i < ITEM_MAX; ++i) + gItemData[i - 1] = gItemData[i]; + + gItemData[i - 1].code = 0; + gSelectedItem = 0; + + return TRUE; +} + +/// Update the inventory cursor +void MoveCampCursor(void) +{ + BOOL bChange; + + // Compute the current amount of weapons and items + int arms_num = 0; + int item_num = 0; + while (gArmsData[arms_num].code != 0) + ++arms_num; + while (gItemData[item_num].code != 0) + ++item_num; + + if (arms_num == 0 && item_num == 0) + return; // Empty inventory + + // True if we're currently changing cursor position + bChange = FALSE; + + if (!gCampActive) + { + // Handle selected weapon + if (gKeyTrg & gKeyLeft) + { + --gSelectedArms; + bChange = TRUE; + } + + if (gKeyTrg & gKeyRight) + { + ++gSelectedArms; + bChange = TRUE; + } + + if (gKeyTrg & (gKeyUp | gKeyDown)) + { + // If there are any items, we're changing to the items section, since the weapons section has only 1 row + if (item_num != 0) + gCampActive = TRUE; + + bChange = TRUE; + } + + // Loop around gSelectedArms if needed + if (gSelectedArms < 0) + gSelectedArms = arms_num - 1; + + if (gSelectedArms > arms_num - 1) + gSelectedArms = 0; + } + else + { + // Handle selected item + if (gKeyTrg & gKeyLeft) + { + if (gSelectedItem % 6 == 0) + gSelectedItem += 5; + else + gSelectedItem -= 1; + + bChange = TRUE; + } + + if (gKeyTrg & gKeyRight) + { + if (gSelectedItem == item_num - 1) + gSelectedItem = (gSelectedItem / 6) * 6; // Round down to multiple of 6 + else if (gSelectedItem % 6 == 5) + gSelectedItem -= 5; // Loop around row + else + gSelectedItem += 1; + + bChange = TRUE; + } + + if (gKeyTrg & gKeyUp) + { + if (gSelectedItem / 6 == 0) + gCampActive = FALSE; // We're on the first row, transition to weapons + else + gSelectedItem -= 6; + + bChange = TRUE; + } + + if (gKeyTrg & gKeyDown) + { + if (gSelectedItem / 6 == (item_num - 1) / 6) + gCampActive = FALSE; // We're on the last row, transition to weapons + else + gSelectedItem += 6; + + bChange = TRUE; + } + + if (gSelectedItem >= item_num) + gSelectedItem = item_num - 1; // Don't allow selecting a non-existing item + + if (gCampActive && gKeyTrg & gKeyOk) + StartTextScript(6000 + gItemData[gSelectedItem].code); + } + + if (bChange) + { + if (gCampActive == FALSE) + { + // Switch to a weapon + PlaySoundObject(SND_SWITCH_WEAPON, SOUND_MODE_PLAY); + + if (arms_num != 0) + StartTextScript(1000 + gArmsData[gSelectedArms].code); + else + StartTextScript(1000); + } + else + { + // Switch to an item + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + if (item_num != 0) + StartTextScript(5000 + gItemData[gSelectedItem].code); + else + StartTextScript(5000); + } + } +} + +/// Draw the inventory +void PutCampObject(void) +{ + static unsigned int flash; + + int i; + + /// Rect for the current weapon + RECT rcArms; + + /// Rect for the current item + RECT rcItem; + + /// Probably the rect for the slash + RECT rcPer = {72, 48, 80, 56}; + + /// Rect for when there is no ammo (double dashes) + RECT rcNone = {80, 48, 96, 56}; + + /// Rect for the "Lv" text! + RECT rcLv = {80, 80, 96, 88}; + + /// Final rect drawn on the screen + RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + + /// Cursor rect array for weapons, element [1] being for when the cursor is flashing + RECT rcCur1[2] = {{0, 88, 40, 128}, {40, 88, 80, 128}}; + + /// Cursor rect array for items, element [1] being for when the cursor is flashing + RECT rcCur2[2] = {{80, 88, 112, 104}, {80, 104, 112, 120}}; + + RECT rcTitle1 = {80, 48, 144, 56}; + RECT rcTitle2 = {80, 56, 144, 64}; + RECT rcBoxTop = {0, 0, 244, 8}; + RECT rcBoxBody = {0, 8, 244, 16}; + RECT rcBoxBottom = {0, 16, 244, 24}; + + // Draw box + PutBitmap3(&rcView, PixelToScreenCoord((WINDOW_WIDTH / 2) - 122), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 112), &rcBoxTop, SURFACE_ID_TEXT_BOX); + for (i = 1; i < 18; ++i) + PutBitmap3(&rcView, PixelToScreenCoord((WINDOW_WIDTH / 2) - 122), PixelToScreenCoord(((WINDOW_HEIGHT / 2) - 120) + ((i + 1) * 8)), &rcBoxBody, SURFACE_ID_TEXT_BOX); + PutBitmap3(&rcView, PixelToScreenCoord((WINDOW_WIDTH / 2) - 122), PixelToScreenCoord(((WINDOW_HEIGHT / 2) - 120) + ((i + 1) * 8)), &rcBoxBottom, SURFACE_ID_TEXT_BOX); + + // Move titles + if (gCampTitleY > (WINDOW_HEIGHT / 2) - 104) + --gCampTitleY; + + // Draw titles + PutBitmap3(&rcView, PixelToScreenCoord((WINDOW_WIDTH / 2) - 112), PixelToScreenCoord(gCampTitleY), &rcTitle1, SURFACE_ID_TEXT_BOX); + PutBitmap3(&rcView, PixelToScreenCoord((WINDOW_WIDTH / 2) - 112), PixelToScreenCoord(gCampTitleY + 52), &rcTitle2, SURFACE_ID_TEXT_BOX); + + // Draw arms cursor + ++flash; + + if (gCampActive == FALSE) + PutBitmap3(&rcView, PixelToScreenCoord((gSelectedArms * 40) + (WINDOW_WIDTH / 2) - 112), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 96), &rcCur1[(flash / 2) % 2], SURFACE_ID_TEXT_BOX); + else + PutBitmap3(&rcView, PixelToScreenCoord((gSelectedArms * 40) + (WINDOW_WIDTH / 2) - 112), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 96), &rcCur1[1], SURFACE_ID_TEXT_BOX); + + // Draw weapons + for (i = 0; i < ARMS_MAX; ++i) + { + if (gArmsData[i].code == 0) + break; // Invalid weapon + + // Get icon rect for next weapon + rcArms.left = (gArmsData[i].code % 16) * 16; + rcArms.right = rcArms.left + 16; + rcArms.top = ((gArmsData[i].code) / 16) * 16; + rcArms.bottom = rcArms.top + 16; + + // Draw the icon, slash and "Lv" + PutBitmap3(&rcView, PixelToScreenCoord((i * 40) + (WINDOW_WIDTH / 2) - 112), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 96), &rcArms, SURFACE_ID_ARMS_IMAGE); + PutBitmap3(&rcView, PixelToScreenCoord((i * 40) + (WINDOW_WIDTH / 2) - 112), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 64), &rcPer, SURFACE_ID_TEXT_BOX); + PutBitmap3(&rcView, PixelToScreenCoord((i * 40) + (WINDOW_WIDTH / 2) - 112), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 80), &rcLv, SURFACE_ID_TEXT_BOX); + PutNumber4((i * 40) + (WINDOW_WIDTH / 2) - 112, (WINDOW_HEIGHT / 2) - 80, gArmsData[i].level, FALSE); + + // Draw ammo + if (gArmsData[i].max_num) + { + PutNumber4((i * 40) + (WINDOW_WIDTH / 2) - 112, (WINDOW_HEIGHT / 2) - 72, gArmsData[i].num, FALSE); + PutNumber4((i * 40) + (WINDOW_WIDTH / 2) - 112, (WINDOW_HEIGHT / 2) - 64, gArmsData[i].max_num, FALSE); + } + else + { + // Weapon doesn't use ammunition + PutBitmap3(&rcView, PixelToScreenCoord((i * 40) + (WINDOW_WIDTH - 192) / 2), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 72), &rcNone, SURFACE_ID_TEXT_BOX); + PutBitmap3(&rcView, PixelToScreenCoord((i * 40) + (WINDOW_WIDTH - 192) / 2), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 64), &rcNone, SURFACE_ID_TEXT_BOX); + } + } + + // Draw items cursor + if (gCampActive == TRUE) + PutBitmap3(&rcView, PixelToScreenCoord(((gSelectedItem % 6) * 32) + (WINDOW_WIDTH / 2) - 112), PixelToScreenCoord(((gSelectedItem / 6) * 16) + (WINDOW_HEIGHT / 2) - 44), &rcCur2[flash / 2 % 2], SURFACE_ID_TEXT_BOX); + else + PutBitmap3(&rcView, PixelToScreenCoord(((gSelectedItem % 6) * 32) + (WINDOW_WIDTH / 2) - 112), PixelToScreenCoord(((gSelectedItem / 6) * 16) + (WINDOW_HEIGHT / 2) - 44), &rcCur2[1], SURFACE_ID_TEXT_BOX); + + for (i = 0; i < ITEM_MAX; ++i) + { + if (gItemData[i].code == 0) + break; // Invalid item + + // Get rect for next item + rcItem.left = (gItemData[i].code % 8) * 32; + rcItem.right = rcItem.left + 32; + rcItem.top = (gItemData[i].code / 8) * 16; + rcItem.bottom = rcItem.top + 16; + + PutBitmap3(&rcView, PixelToScreenCoord(((i % 6) * 32) + (WINDOW_WIDTH / 2) - 112), PixelToScreenCoord(((i / 6) * 16) + (WINDOW_HEIGHT / 2) - 44), &rcItem, SURFACE_ID_ITEM_IMAGE); + } +} + +int CampLoop(void) +{ + std::string old_script_path; + + RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + + // Save the current script path (to restore it when we get out of the inventory) + old_script_path = GetTextScriptPath(); + + // Load the inventory script + LoadTextScript2("ArmsItem.tsc"); + + gCampTitleY = (WINDOW_HEIGHT / 2) - 96; + + // Put the cursor on the first weapon + gCampActive = FALSE; + gSelectedItem = 0; + + // Compute current amount of weapons + int arms_num = 0; + while (gArmsData[arms_num].code != 0) + ++arms_num; + + if (arms_num != 0) + StartTextScript(1000 + gArmsData[gSelectedArms].code); + else + StartTextScript(5000 + gItemData[gSelectedItem].code); + + for (;;) + { + GetTrg(); + + if (gKeyTrg & KEY_PAUSE) + { + switch (Call_Pause(1)) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; // Quit game + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; // Go to game intro + } + } + + // Handle ESC + if (gKeyTrg & KEY_ESCAPE) + { + switch (Call_Escape()) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; // Quit game + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; // Go to game intro + } + } + + if (g_GameFlags & GAME_FLAG_IS_CONTROL_ENABLED) + MoveCampCursor(); + + switch (TextScriptProc()) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; // Quit game + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; // Go to game intro + } + + // Get currently displayed image + PutBitmap4(&rcView, 0, 0, &rcView, SURFACE_ID_SCREEN_GRAB); + PutCampObject(); + PutTextScript(); + PutFramePerSecound(); + + // Check whether we're getting out of the loop + if (gCampActive) + { + if (g_GameFlags & GAME_FLAG_IS_CONTROL_ENABLED && gKeyTrg & (gKeyCancel | gKeyItem)) + { + StopTextScript(); + break; + } + } + else + { + if (gKeyTrg & (gKeyOk | gKeyCancel | gKeyItem)) + { + StopTextScript(); + break; + } + } + + if (!Flip_SystemTask()) + return enum_ESCRETURN_exit; // Quit game + } + + // Resume original script + LoadTextScript_Stage(old_script_path.c_str()); + gArmsEnergyX = 32; // Displays weapon rotation animation in case the weapon was changed + return enum_ESCRETURN_continue; // Go to game +} + +BOOL CheckItem(long a) +{ + int i; + + for (i = 0; i < ITEM_MAX; ++i) + if (gItemData[i].code == a) + return TRUE; // Found + + return FALSE; // Not found +} + +BOOL CheckArms(long a) +{ + int i; + + for (i = 0; i < ARMS_MAX; ++i) + if (gArmsData[i].code == a) + return TRUE; // Found + + return FALSE; // Not found +} + +BOOL UseArmsEnergy(long num) +{ + if (gArmsData[gSelectedArms].max_num == 0) + return TRUE; // No ammo needed + if (gArmsData[gSelectedArms].num == 0) + return FALSE; // No ammo left + + if(!gbInfiniteAmmo) + gArmsData[gSelectedArms].num -= num; + + if (gArmsData[gSelectedArms].num < 0) + gArmsData[gSelectedArms].num = 0; + + return TRUE; // Was able to spend ammo +} + +BOOL ChargeArmsEnergy(long num) +{ + gArmsData[gSelectedArms].num += num; + + // Cap the ammo to the maximum ammunition + if (gArmsData[gSelectedArms].num > gArmsData[gSelectedArms].max_num) + gArmsData[gSelectedArms].num = gArmsData[gSelectedArms].max_num; + + return TRUE; // Always successfull +} + +void FullArmsEnergy(void) +{ + int a; + + for (a = 0; a < ARMS_MAX; ++a) + { + if (gArmsData[a].code == 0) + continue; // Don't change empty weapons + + gArmsData[a].num = gArmsData[a].max_num; + } +} + +int RotationArms(void) +{ + // Get amount of weapons + int arms_num = 0; + while (gArmsData[arms_num].code != 0) + ++arms_num; + + if (arms_num == 0) + return 0; + + ResetSpurCharge(); + + // Select next valid weapon + ++gSelectedArms; + + while (gSelectedArms < arms_num) + { + if (gArmsData[gSelectedArms].code) + break; + + ++gSelectedArms; + } + + if (gSelectedArms == arms_num) + gSelectedArms = 0; + + gArmsEnergyX = 32; + PlaySoundObject(SND_SWITCH_WEAPON, SOUND_MODE_PLAY); + + return gArmsData[gSelectedArms].code; +} + +int RotationArmsRev(void) +{ + // Get amount of weapons + int arms_num = 0; + while (gArmsData[arms_num].code != 0) + ++arms_num; + + if (arms_num == 0) + return 0; + + ResetSpurCharge(); + + // Select previous valid weapon + --gSelectedArms; + + if (gSelectedArms < 0) + gSelectedArms = arms_num - 1; + + while (gSelectedArms < arms_num) + { + if (gArmsData[gSelectedArms].code) + break; + + --gSelectedArms; + } + + gArmsEnergyX = 0; + PlaySoundObject(SND_SWITCH_WEAPON, SOUND_MODE_PLAY); + + return gArmsData[gSelectedArms].code; +} + +void ChangeToFirstArms(void) +{ + gSelectedArms = 0; + gArmsEnergyX = 32; + PlaySoundObject(SND_SWITCH_WEAPON, SOUND_MODE_PLAY); +} diff --git a/src/ArmsItem.h b/src/ArmsItem.h new file mode 100644 index 0000000..f653c89 --- /dev/null +++ b/src/ArmsItem.h @@ -0,0 +1,129 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +// Limits for the amount of weapons and items +#define ARMS_MAX 8 +#define ITEM_MAX 32 + +// "Arms" is a synonym of "weapon" here +// "Code" means "ID" here +// "Num" often means "ammo" here + +/// Weapon struct +typedef struct ARMS +{ + /// ID of the weapon + int code; + + /// Current level of the weapon + int level; + + /// Current EXP of the weapon. It is counted from the current level (it's reset to 0 at each level up) + int exp; + + /// Maximum ammunition + int max_num; + + /// Current ammunition + int num; +} ARMS; + +typedef struct ITEM +{ + /// ID of the item + int code; +} ITEM; + + + +/// Contains data for all the weapons the character currently has +extern ARMS gArmsData[ARMS_MAX]; + +/// Contains data for all the items the character currently has +extern ITEM gItemData[ITEM_MAX]; + +/// Currently selected weapon +extern int gSelectedArms; + +/// Currently selected item +extern int gSelectedItem; + +// Infinite ammo tweak +extern BOOL gbInfiniteAmmo; + +/// Contains data for all the weapons the character currently has +extern ARMS gArmsData[ARMS_MAX]; +extern int gCampTitleY; + +/// True if we're in the items section of the inventory (not in the weapons section) (only relevant when the inventory is open) +extern BOOL gCampActive; + +/// X coordinate for the weapons HUD section. Set it to 32 for the forward weapon rotation "animation", 0 for the reverse weapon rotation "animation" and 16 to immobilise it +extern int gArmsEnergyX; + + + +/// Clear the weapons array, reverting it to the default state (no weapons) and adjust variables (initialize weapons basically) +void ClearArmsData(void); + +/// Clear the item array, reverting it to the default state (no items) (initialize items basically) +void ClearItemData(void); + + +/// Add code to the weapons, setting max_num as the max ammo, or find code and add max_num to its ammo. Fails if no space is available and the weapon isn't +/// already present +BOOL AddArmsData(long code, long max_num); + +/// Remove code from the weapons. Fails if code is not found +BOOL SubArmsData(long code); + +/// Replace code1 with code2, setting max_num as its max ammo. Fails if code1 is not found +BOOL TradeArms(long code1, long code2, long max_num); + + +/// Add code to the items. Fails if no space is left +BOOL AddItemData(long code); + +/// Remove code from the items. Fails if code is not found +BOOL SubItemData(long code); + + +/// Inventory loop. Returns mode. +int CampLoop(void); + + +/// Search for a in the items. Returns whether a was found +BOOL CheckItem(long a); + +/// Search for a in the weapons. Returns whether a was found +BOOL CheckArms(long a); + + +/// Remove num ammo from the currently selected weapon. Returns whether there was any ammo left to fire +BOOL UseArmsEnergy(long num); + +/// Add num ammo to the currently selected weapon (capped at the maximum ammunition). Returns true +BOOL ChargeArmsEnergy(long num); + +/// Set every weapons ammunition to its maximum ammunition +void FullArmsEnergy(void); + + +// "Rotation" means "Weapons currently owned by the player (present in the weapons array)" + +/// Change the current weapon to the next one in the rotation. Returns the ID of the newly selected weapon +int RotationArms(void); + +/// Change the current weapon to the previous one in the rotation. Returns the ID of the newly selected weapon +int RotationArmsRev(void); + +/// Change the current weapon to be the first one and play the usual rotation animation +void ChangeToFirstArms(void); diff --git a/src/Attributes.h b/src/Attributes.h new file mode 100644 index 0000000..a6c318b --- /dev/null +++ b/src/Attributes.h @@ -0,0 +1,27 @@ +#pragma once + +/// Include file for portable usage of __attribute__ + +#ifdef __MINGW32__ +#define ATTRIBUTE_FORMAT_PRINTF(stringIndex, firstToCheck) __attribute__((format(__MINGW_PRINTF_FORMAT, stringIndex, firstToCheck))) +#elif defined(__GNUC__) +#define ATTRIBUTE_FORMAT_PRINTF(stringIndex, firstToCheck) __attribute__((format(printf, stringIndex, firstToCheck))) +#else +#define ATTRIBUTE_FORMAT_PRINTF(stringIndex, firstToCheck) +#endif + +#ifdef __GNUC__ + +#define ATTRIBUTE_HOT __attribute__((hot)) +#define LIKELY(condition) __builtin_expect((condition), 1) +#define UNLIKELY(condition) __builtin_expect((condition), 0) +#define PREFETCH(address, isWrite, locality) __builtin_prefetch((address), (isWrite), (locality)) + +#else + +#define ATTRIBUTE_HOT +#define LIKELY(condition) condition +#define UNLIKELY(condition) condition +#define PREFETCH(address, isWrite, locality) + +#endif diff --git a/src/Back.cpp b/src/Back.cpp new file mode 100644 index 0000000..71e7c48 --- /dev/null +++ b/src/Back.cpp @@ -0,0 +1,253 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Back.h" + +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" +#include "Draw.h" +#include "File.h" +#include "Main.h" + +BACK gBack; +int gWaterY; +static unsigned long color_black; + +// TODO - Another function that has an incorrect stack frame +BOOL InitBack(const char *fName, int type) +{ + std::string path; + FILE *fp; + + color_black = GetCortBoxColor(RGB(0, 0, 0x10)); // Unused. This may have once been used by background type 4 (the solid black background) + + // Get width and height + fp = NULL; + const char *bmp_file_extensions[] = {"pbm", "bmp"}; + for (size_t i = 0; i < sizeof(bmp_file_extensions) / sizeof(bmp_file_extensions[0]) && fp == NULL; ++i) + { + path = gSpritePath + '/' + fName + '.' + bmp_file_extensions[i]; + fp = fopen(path.c_str(), "rb"); + } + + if (fp != NULL) + { + if (fgetc(fp) != 'B' || fgetc(fp) != 'M') + { + #ifdef FIX_MAJOR_BUGS + // The original game forgets to close fp + fclose(fp); + #endif + return FALSE; + } + + fseek(fp, 18, SEEK_SET); + + gBack.partsW = File_ReadLE32(fp); + gBack.partsH = File_ReadLE32(fp); + fclose(fp); + } + else + { + path = gSpritePath + '/' + fName + ".png"; + fp = fopen(path.c_str(), "rb"); + + if (fp == NULL) + return FALSE; + + if (fgetc(fp) != 0x89 || fgetc(fp) != 'P' || fgetc(fp) != 'N' || fgetc(fp) != 'G') + { + fclose(fp); + return FALSE; + } + + fseek(fp, 16, SEEK_SET); + + gBack.partsW = File_ReadBE32(fp); + gBack.partsH = File_ReadBE32(fp); + fclose(fp); + } + + // Adjust background sizes to account for higher sprite resolutions + gBack.partsW /= (SPRITE_SCALE*gSpriteScale); + gBack.partsH /= (SPRITE_SCALE*gSpriteScale); + + gBack.flag = TRUE; // This variable is otherwise unused + + // *Now* we actually load the bitmap + if (!ReloadBitmap_File(fName, SURFACE_ID_LEVEL_BACKGROUND, 2, TRUE)) + return FALSE; + + gBack.type = type; + gWaterY = 240 * 0x10 * 0x200; + return TRUE; +} + +void ActBack(void) +{ + switch (gBack.type) + { + case BACKGROUND_TYPE_AUTOSCROLL: + gBack.fx += 6 * 0x200; + break; + + case BACKGROUND_TYPE_CLOUDS_WINDY: + case BACKGROUND_TYPE_CLOUDS: + ++gBack.fx; + gBack.fx %= 640; + break; + } +} + +/// Draw background background elements +void PutBack(int fx, int fy) +{ + int x, y; + RECT rect = {0, 0, gBack.partsW, gBack.partsH}; + + switch (gBack.type) + { + case BACKGROUND_TYPE_STATIONARY: + for (y = 0; y < WINDOW_HEIGHT; y += gBack.partsH) + for (x = 0; x < WINDOW_WIDTH; x += gBack.partsW) + PutBitmap4(&grcGame, PixelToScreenCoord(x), PixelToScreenCoord(y), &rect, SURFACE_ID_LEVEL_BACKGROUND); + + break; + + case BACKGROUND_TYPE_MOVE_DISTANT: + for (y = -(fy / 2 % (gBack.partsH * 0x200)); y < WINDOW_HEIGHT * 0x200; y += gBack.partsH * 0x200) + for (x = -(fx / 2 % (gBack.partsW * 0x200)); x < WINDOW_WIDTH * 0x200; x += gBack.partsW * 0x200) + PutBitmap4(&grcGame, SubpixelToScreenCoord(x), SubpixelToScreenCoord(y), &rect, SURFACE_ID_LEVEL_BACKGROUND); + + break; + + case BACKGROUND_TYPE_MOVE_NEAR: + for (y = -(fy % (gBack.partsH * 0x200)); y < WINDOW_HEIGHT * 0x200; y += gBack.partsH * 0x200) + if(gMirrorMode){ + for (x = WINDOW_WIDTH * 0x200; x >= -(fx % (gBack.partsW * 0x200)) - gBack.partsW * 0x200; x -= gBack.partsW * 0x200) + PutBitmap4(&grcGame, SubpixelToScreenCoord(x), SubpixelToScreenCoord(y), &rect, SURFACE_ID_LEVEL_BACKGROUND); + } + else{ + for (x = -(fx % (gBack.partsW * 0x200)); x < WINDOW_WIDTH * 0x200; x += gBack.partsW * 0x200) + PutBitmap4(&grcGame, SubpixelToScreenCoord(x), SubpixelToScreenCoord(y), &rect, SURFACE_ID_LEVEL_BACKGROUND); + } + + break; + + case BACKGROUND_TYPE_AUTOSCROLL: + for (y = -gBack.partsH; y < WINDOW_HEIGHT; y += gBack.partsH) + for (x = -(gBack.fx % (gBack.partsW * 0x200)); x < WINDOW_WIDTH * 0x200; x += gBack.partsW * 0x200) + PutBitmap4(&grcGame, SubpixelToScreenCoord(x), PixelToScreenCoord(y), &rect, SURFACE_ID_LEVEL_BACKGROUND); + + break; + + case BACKGROUND_TYPE_CLOUDS_WINDY: + case BACKGROUND_TYPE_CLOUDS: + // Draw sky + + // Draw the top row (including the moon/sun) + rect.top = 0; + rect.bottom = 88; + rect.left = 0; + rect.right = 320; + PutBitmap4(&grcGame, PixelToScreenCoord((WINDOW_WIDTH - 320) / 2), PixelToScreenCoord(0), &rect, SURFACE_ID_LEVEL_BACKGROUND); + + // Draw the repeating star/sky pattern on each side of the top row + if (gBack.type == 6) + rect.right = 255; + else + rect.left = 106; + + for (x = ((WINDOW_WIDTH - 320) / 2); x > 0; x -= (rect.right - rect.left)) + PutBitmap4(&grcGame, PixelToScreenCoord(x - (rect.right - rect.left)), PixelToScreenCoord(0), &rect, SURFACE_ID_LEVEL_BACKGROUND); + for (x = ((WINDOW_WIDTH - 320) / 2) + 320; x < WINDOW_WIDTH; x += (rect.right - rect.left)) + PutBitmap4(&grcGame, PixelToScreenCoord(x), PixelToScreenCoord(0), &rect, SURFACE_ID_LEVEL_BACKGROUND); + + // Draw each cloud layer from top to bottom + + // Draw first cloud layer + rect.top = 88; + rect.bottom = 123; + rect.left = 0; + rect.right = 320; + for (x = -((gBack.fx * 0x200) / 2); x < WINDOW_WIDTH * 0x200; x += 320 * 0x200) + PutBitmap4(&grcGame, SubpixelToScreenCoord(x), PixelToScreenCoord(88), &rect, SURFACE_ID_LEVEL_BACKGROUND); + + // Draw second cloud layer + rect.top = 123; + rect.bottom = 146; + rect.left = 0; + rect.right = 320; + for (x = -((gBack.fx % 320) * 0x200); x < WINDOW_WIDTH * 0x200; x += 320 * 0x200) + PutBitmap4(&grcGame, SubpixelToScreenCoord(x), PixelToScreenCoord(123), &rect, SURFACE_ID_LEVEL_BACKGROUND); + + // Draw third cloud layer + rect.top = 146; + rect.bottom = 176; + rect.left = 0; + rect.right = 320; + for (x = -(((gBack.fx * 2) % 320) * 0x200); x < WINDOW_WIDTH * 0x200; x += 320 * 0x200) + PutBitmap4(&grcGame, SubpixelToScreenCoord(x), PixelToScreenCoord(146), &rect, SURFACE_ID_LEVEL_BACKGROUND); + + // Draw fourth cloud layer + rect.top = 176; + rect.bottom = 240; + rect.left = 0; + rect.right = 320; + for (x = -(((gBack.fx * 4) % 320) * 0x200); x < WINDOW_WIDTH * 0x200; x += 320 * 0x200) + PutBitmap4(&grcGame, SubpixelToScreenCoord(x), PixelToScreenCoord(176), &rect, SURFACE_ID_LEVEL_BACKGROUND); + + break; + } +} + +/// Draw background foreground elements - only the water background type makes use of this +void PutFront(int fx, int fy) +{ + int xpos, ypos; + + RECT rcWater[2] = {{0, 0, 32, 16}, {0, 16, 32, 48}}; + + int x, y; + int x_1, x_2; + int y_1, y_2; + + switch (gBack.type) + { + case BACKGROUND_TYPE_WATER: + x_1 = fx / (32 * 0x200); + x_2 = x_1 + (((WINDOW_WIDTH + (32 - 1)) / 32) + 1); + y_1 = 0; + y_2 = y_1 + 32; + + for (y = y_1; y < y_2; ++y) + { + ypos = SubpixelToScreenCoord(y * 32 * 0x200) - SubpixelToScreenCoord(fy) + SubpixelToScreenCoord(gWaterY); + + if (ypos < PixelToScreenCoord(-32)) + continue; + + if (ypos > PixelToScreenCoord(WINDOW_HEIGHT)) + break; + + for (x = x_1; x < x_2; ++x) + { + xpos = SubpixelToScreenCoord((gMirrorMode? x + 1: x) * 32 * 0x200) - SubpixelToScreenCoord(fx); + PutBitmap3(&grcGame, xpos, ypos, &rcWater[1], SURFACE_ID_LEVEL_BACKGROUND); + if (y == 0) + PutBitmap3(&grcGame, xpos, ypos, &rcWater[0], SURFACE_ID_LEVEL_BACKGROUND); + } + } + + break; + } +} diff --git a/src/Back.h b/src/Back.h new file mode 100644 index 0000000..1c1164f --- /dev/null +++ b/src/Back.h @@ -0,0 +1,41 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +enum +{ + BACKGROUND_TYPE_STATIONARY = 0, // Doesn't move at all + BACKGROUND_TYPE_MOVE_DISTANT = 1, // Moves at half the speed of the foreground + BACKGROUND_TYPE_MOVE_NEAR = 2, // Moves at the same speed as the foreground + BACKGROUND_TYPE_WATER = 3, // No background - draws a water foreground layer instead + BACKGROUND_TYPE_BLACK = 4, // No background - just black + BACKGROUND_TYPE_AUTOSCROLL = 5, // Constantly scrolls to the left (used by Ironhead) + BACKGROUND_TYPE_CLOUDS_WINDY = 6, // Fancy parallax scrolling, items are blown to the left (used by bkMoon) + BACKGROUND_TYPE_CLOUDS = 7 // Fancy parallax scrolling (used by bkFog) +}; + +typedef struct BACK +{ + BOOL flag; // Unused - purpose unknown + int partsW; + int partsH; + int numX; + int numY; + int type; + int fx; +} BACK; + +extern BACK gBack; +extern int gWaterY; + +BOOL InitBack(const char *fName, int type); +void ActBack(void); +void PutBack(int fx, int fy); +void PutFront(int fx, int fy); diff --git a/src/Backends/Audio.h b/src/Backends/Audio.h new file mode 100644 index 0000000..538a6bb --- /dev/null +++ b/src/Backends/Audio.h @@ -0,0 +1,28 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +typedef struct AudioBackend_Sound AudioBackend_Sound; + +bool AudioBackend_Init(void); +void AudioBackend_Deinit(void); + +AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length); +void AudioBackend_DestroySound(AudioBackend_Sound *sound); + +void AudioBackend_PlaySound(AudioBackend_Sound *sound, bool looping); +void AudioBackend_StopSound(AudioBackend_Sound *sound); +void AudioBackend_RewindSound(AudioBackend_Sound *sound); + +void AudioBackend_SetSoundFrequency(AudioBackend_Sound *sound, unsigned int frequency); +void AudioBackend_SetSoundVolume(AudioBackend_Sound *sound, long volume); +void AudioBackend_SetSoundPan(AudioBackend_Sound *sound, long pan); + +void AudioBackend_SetOrganyaCallback(void (*callback)(void)); +void AudioBackend_SetOrganyaTimer(unsigned int milliseconds); + +void AudioBackend_Lock(void); +void AudioBackend_Unlock(void); diff --git a/src/Backends/Audio/3DS.cpp b/src/Backends/Audio/3DS.cpp new file mode 100644 index 0000000..a33e136 --- /dev/null +++ b/src/Backends/Audio/3DS.cpp @@ -0,0 +1,297 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Audio.h" + +#include +#include +#include +#include + +#include <3ds.h> + +#include "../Misc.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define CLAMP(a, min, max) MIN(MAX((a), (min)), (max)) + +typedef struct AudioBackend_Sound +{ + signed char *samples; + ndspWaveBuf wave_buffer; + unsigned int frequency; + float volume; + float pan_l; + float pan_r; + bool looping; + int channel; + unsigned int identifier; +} AudioBackend_Sound; + +static struct +{ + unsigned int sound_identifier; + AudioBackend_Sound *sound; +} channels[24]; + +static void (*organya_callback)(void); +static unsigned int organya_callback_timer; + +static LightLock organya_mutex; + +static Thread organya_thread; +static bool organya_thread_die; + +static void OrganyaThread(void *user_data) +{ + (void)user_data; + + while (!organya_thread_die) + { + LightLock_Lock(&organya_mutex); + + unsigned int sleep_milliseconds = 10; + + if (organya_callback_timer != 0) + { + organya_callback(); + + sleep_milliseconds = organya_callback_timer; + } + + LightLock_Unlock(&organya_mutex); + + svcSleepThread(sleep_milliseconds * 1000000); + } +} + +static float MillibelToScale(long volume) +{ + // Volume is in hundredths of a decibel, from 0 to -10000 + volume = CLAMP(volume, -10000, 0); + return pow(10.0f, volume / 2000.0f); +} + +static int AllocateChannel(AudioBackend_Sound *sound) +{ + // Search for a channel which either doesn't have an assigned sound, + // or whose assigned sound has since stopped playing. + for (int i = 0; i < 24; ++i) + { + if (channels[i].sound_identifier == 0 + || channels[i].sound->wave_buffer.status == NDSP_WBUF_FREE + || channels[i].sound->wave_buffer.status == NDSP_WBUF_DONE) + { + channels[i].sound_identifier = sound->identifier; + channels[i].sound = sound; + + return i; + } + } + + Backend_PrintInfo("Ran out of sound channels - hey you, whatever you're doing, stop it!"); + + return -1; +} + +bool AudioBackend_Init(void) +{ + Result rc = ndspInit(); + + if (R_SUCCEEDED(rc)) + { + ndspSetOutputMode(NDSP_OUTPUT_STEREO); + + LightLock_Init(&organya_mutex); + + s32 priority = 0x30; + svcGetThreadPriority(&priority, CUR_THREAD_HANDLE); + + organya_thread_die = false; + organya_thread = threadCreate(OrganyaThread, NULL, 32 * 1024, CLAMP(priority - 1, 0x18, 0x3F), -1, false); + + return true; + } + else + { + if (R_SUMMARY(rc) == RS_NOTFOUND && R_MODULE(rc) == RM_DSP) + Backend_PrintError("Could not load DSP firmware.\nThe game will not have any audio!\nTo fix this, you need to dump your\n3DS's DSP firmware.\nGoogle it if you're not sure what to do."); + else + Backend_PrintError("ndspInit failed in AudioBackend_Init"); + } + + return false; +} + +void AudioBackend_Deinit(void) +{ + organya_thread_die = true; + threadJoin(organya_thread, UINT64_MAX); + threadFree(organya_thread); + + ndspExit(); +} + +AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length) +{ + static unsigned int identifier_allocator; + + AudioBackend_Sound *sound = (AudioBackend_Sound*)malloc(sizeof(AudioBackend_Sound)); + + if (sound != NULL) + { + sound->samples = (signed char*)linearAlloc(length); + + if (sound->samples != NULL) + { + for (size_t i = 0; i < length; ++i) + sound->samples[i] = samples[i] - 0x80; + + DSP_FlushDataCache(sound->samples, length); + + memset(&sound->wave_buffer, 0, sizeof(sound->wave_buffer)); + sound->wave_buffer.data_vaddr = sound->samples; + sound->wave_buffer.nsamples = length; + + sound->frequency = frequency; + sound->volume = 1.0f; + sound->pan_l = 1.0f; + sound->pan_r = 1.0f; + sound->looping = false; + + sound->channel = -1; + + do + { + sound->identifier = ++identifier_allocator; + } while (sound->identifier == 0); // 0 is reserved + + return sound; + } + else + { + Backend_PrintError("linearAlloc failed in AudioBackend_CreateSound"); + } + + free(sound); + } + else + { + Backend_PrintError("malloc failed in AudioBackend_CreateSound"); + } + + return NULL; +} + +void AudioBackend_DestroySound(AudioBackend_Sound *sound) +{ + if (sound->channel != -1 && channels[sound->channel].sound_identifier == sound->identifier) + { + ndspChnWaveBufClear(sound->channel); + channels[sound->channel].sound_identifier = 0; + channels[sound->channel].sound = NULL; + } + + linearFree(sound->samples); + free(sound); +} + +void AudioBackend_PlaySound(AudioBackend_Sound *sound, bool looping) +{ + if (sound->channel == -1 || channels[sound->channel].sound_identifier != sound->identifier) + sound->channel = AllocateChannel(sound); + + bool previous_looping = sound->looping; + sound->looping = looping; + + if (sound->channel != -1) + { + if (sound->wave_buffer.status == NDSP_WBUF_FREE + || sound->wave_buffer.status == NDSP_WBUF_DONE + || previous_looping != looping) + { + ndspChnWaveBufClear(sound->channel); + + ndspChnSetInterp(sound->channel, NDSP_INTERP_LINEAR); + ndspChnSetRate(sound->channel, sound->frequency); + ndspChnSetFormat(sound->channel, NDSP_FORMAT_MONO_PCM8); + + sound->wave_buffer.looping = looping; + + float mix[12]; + memset(mix, 0, sizeof(mix)); + mix[0] = sound->pan_l * sound->volume; + mix[1] = sound->pan_r * sound->volume; + ndspChnSetMix(sound->channel, mix); + + ndspChnWaveBufAdd(sound->channel, &sound->wave_buffer); + } + } +} + +void AudioBackend_StopSound(AudioBackend_Sound *sound) +{ + if (sound->channel != -1 && channels[sound->channel].sound_identifier == sound->identifier) + ndspChnWaveBufClear(sound->channel); +} + +void AudioBackend_RewindSound(AudioBackend_Sound *sound) +{ + (void)sound; +} + +void AudioBackend_SetSoundFrequency(AudioBackend_Sound *sound, unsigned int frequency) +{ + sound->frequency = frequency; + + if (sound->channel != -1 && channels[sound->channel].sound_identifier == sound->identifier) + ndspChnSetRate(sound->channel, frequency); +} + +void AudioBackend_SetSoundVolume(AudioBackend_Sound *sound, long volume) +{ + sound->volume = MillibelToScale(volume); + + if (sound->channel != -1 && channels[sound->channel].sound_identifier == sound->identifier) + { + float mix[12]; + memset(mix, 0, sizeof(mix)); + mix[0] = sound->pan_l * sound->volume; + mix[1] = sound->pan_r * sound->volume; + ndspChnSetMix(sound->channel, mix); + } +} + +void AudioBackend_SetSoundPan(AudioBackend_Sound *sound, long pan) +{ + sound->pan_l = MillibelToScale(-pan); + sound->pan_r = MillibelToScale(pan); + + if (sound->channel != -1 && channels[sound->channel].sound_identifier == sound->identifier) + { + float mix[12]; + memset(mix, 0, sizeof(mix)); + mix[0] = sound->pan_l * sound->volume; + mix[1] = sound->pan_r * sound->volume; + ndspChnSetMix(sound->channel, mix); + } +} + +void AudioBackend_SetOrganyaCallback(void (*callback)(void)) +{ + LightLock_Lock(&organya_mutex); + + organya_callback = callback; + + LightLock_Unlock(&organya_mutex); +} + +void AudioBackend_SetOrganyaTimer(unsigned int milliseconds) +{ + LightLock_Lock(&organya_mutex); + + organya_callback_timer = milliseconds; + + LightLock_Unlock(&organya_mutex); +} diff --git a/src/Backends/Audio/Null.cpp b/src/Backends/Audio/Null.cpp new file mode 100644 index 0000000..de872b1 --- /dev/null +++ b/src/Backends/Audio/Null.cpp @@ -0,0 +1,84 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Audio.h" + +#include + +bool AudioBackend_Init(void) +{ + return true; +} + +void AudioBackend_Deinit(void) +{ + +} + +AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length) +{ + (void)frequency; + (void)samples; + (void)length; + + return NULL; +} + +void AudioBackend_DestroySound(AudioBackend_Sound *sound) +{ + (void)sound; +} + +void AudioBackend_PlaySound(AudioBackend_Sound *sound, bool looping) +{ + (void)sound; + (void)looping; +} + +void AudioBackend_StopSound(AudioBackend_Sound *sound) +{ + (void)sound; +} + +void AudioBackend_RewindSound(AudioBackend_Sound *sound) +{ + (void)sound; +} + +void AudioBackend_SetSoundFrequency(AudioBackend_Sound *sound, unsigned int frequency) +{ + (void)sound; + (void)frequency; +} + +void AudioBackend_SetSoundVolume(AudioBackend_Sound *sound, long volume) +{ + (void)sound; + (void)volume; +} + +void AudioBackend_SetSoundPan(AudioBackend_Sound *sound, long pan) +{ + (void)sound; + (void)pan; +} + +void AudioBackend_SetOrganyaCallback(void (*callback)(void)) +{ + (void)callback; +} + +void AudioBackend_SetOrganyaTimer(unsigned int milliseconds) +{ + (void)milliseconds; +} + +void AudioBackend_Lock(void) +{ + +} + +void AudioBackend_Unlock(void) +{ + +} diff --git a/src/Backends/Audio/SoftwareMixer.cpp b/src/Backends/Audio/SoftwareMixer.cpp new file mode 100644 index 0000000..71d000d --- /dev/null +++ b/src/Backends/Audio/SoftwareMixer.cpp @@ -0,0 +1,224 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Audio.h" + +#include + +#ifdef EXTRA_SOUND_FORMATS +#include "../../ExtraSoundFormats.h" +#endif + +#include "SoftwareMixer/Backend.h" +#include "SoftwareMixer/Mixer.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +static unsigned long output_frequency; + +static void (*organya_callback)(void); +static unsigned int organya_callback_timer_master; + +static void MixSoundsAndUpdateOrganya(long *stream, size_t frames_total) +{ + SoftwareMixerBackend_LockOrganyaMutex(); + + if (organya_callback_timer_master == 0) + { + SoftwareMixerBackend_LockMixerMutex(); + Mixer_MixSounds(stream, frames_total); + SoftwareMixerBackend_UnlockMixerMutex(); + } + else + { + // Synchronise audio generation with Organya. + // In the original game, Organya ran asynchronously in a separate thread, + // firing off commands to DirectSound in realtime. To match that, we'd + // need a very low-latency buffer, otherwise we'd get mistimed instruments. + // Instead, we can just do this. + unsigned int frames_done = 0; + + while (frames_done != frames_total) + { + static unsigned long organya_callback_timer; + + if (organya_callback_timer == 0) + { + organya_callback_timer = organya_callback_timer_master; + organya_callback(); + } + + const unsigned int frames_to_do = MIN(organya_callback_timer, frames_total - frames_done); + + SoftwareMixerBackend_LockMixerMutex(); + Mixer_MixSounds(stream + frames_done * 2, frames_to_do); + SoftwareMixerBackend_UnlockMixerMutex(); + + frames_done += frames_to_do; + organya_callback_timer -= frames_to_do; + } + } + + SoftwareMixerBackend_UnlockOrganyaMutex(); + +#ifdef EXTRA_SOUND_FORMATS + ExtraSound_Mix(stream, frames_total); +#endif +} + +bool AudioBackend_Init(void) +{ + output_frequency = SoftwareMixerBackend_Init(MixSoundsAndUpdateOrganya); + + if (output_frequency != 0) + { + #ifdef EXTRA_SOUND_FORMATS + ExtraSound_Init(output_frequency); + #endif + + Mixer_Init(output_frequency); + + if (SoftwareMixerBackend_Start()) + return true; + + SoftwareMixerBackend_Deinit(); + + #ifdef EXTRA_SOUND_FORMATS + ExtraSound_Deinit(); + #endif + } + + return false; +} + +void AudioBackend_Deinit(void) +{ + SoftwareMixerBackend_Deinit(); + +#ifdef EXTRA_SOUND_FORMATS + ExtraSound_Deinit(); +#endif +} + +AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length) +{ + SoftwareMixerBackend_LockMixerMutex(); + + Mixer_Sound *sound = Mixer_CreateSound(frequency, samples, length); + + SoftwareMixerBackend_UnlockMixerMutex(); + + return (AudioBackend_Sound*)sound; +} + +void AudioBackend_DestroySound(AudioBackend_Sound *sound) +{ + if (sound == NULL) + return; + + SoftwareMixerBackend_LockMixerMutex(); + + Mixer_DestroySound((Mixer_Sound*)sound); + + SoftwareMixerBackend_UnlockMixerMutex(); +} + +void AudioBackend_PlaySound(AudioBackend_Sound *sound, bool looping) +{ + if (sound == NULL) + return; + + SoftwareMixerBackend_LockMixerMutex(); + + Mixer_PlaySound((Mixer_Sound*)sound, looping); + + SoftwareMixerBackend_UnlockMixerMutex(); +} + +void AudioBackend_StopSound(AudioBackend_Sound *sound) +{ + if (sound == NULL) + return; + + SoftwareMixerBackend_LockMixerMutex(); + + Mixer_StopSound((Mixer_Sound*)sound); + + SoftwareMixerBackend_UnlockMixerMutex(); +} + +void AudioBackend_RewindSound(AudioBackend_Sound *sound) +{ + if (sound == NULL) + return; + + SoftwareMixerBackend_LockMixerMutex(); + + Mixer_RewindSound((Mixer_Sound*)sound); + + SoftwareMixerBackend_UnlockMixerMutex(); +} + +void AudioBackend_SetSoundFrequency(AudioBackend_Sound *sound, unsigned int frequency) +{ + if (sound == NULL) + return; + + SoftwareMixerBackend_LockMixerMutex(); + + Mixer_SetSoundFrequency((Mixer_Sound*)sound, frequency); + + SoftwareMixerBackend_UnlockMixerMutex(); +} + +void AudioBackend_SetSoundVolume(AudioBackend_Sound *sound, long volume) +{ + if (sound == NULL) + return; + + SoftwareMixerBackend_LockMixerMutex(); + + Mixer_SetSoundVolume((Mixer_Sound*)sound, volume); + + SoftwareMixerBackend_UnlockMixerMutex(); +} + +void AudioBackend_SetSoundPan(AudioBackend_Sound *sound, long pan) +{ + if (sound == NULL) + return; + + SoftwareMixerBackend_LockMixerMutex(); + + Mixer_SetSoundPan((Mixer_Sound*)sound, pan); + + SoftwareMixerBackend_UnlockMixerMutex(); +} + +void AudioBackend_SetOrganyaCallback(void (*callback)(void)) +{ + SoftwareMixerBackend_LockOrganyaMutex(); + + organya_callback = callback; + + SoftwareMixerBackend_UnlockOrganyaMutex(); +} + +void AudioBackend_SetOrganyaTimer(unsigned int milliseconds) +{ + SoftwareMixerBackend_LockOrganyaMutex(); + + organya_callback_timer_master = (milliseconds * output_frequency) / 1000; // convert milliseconds to audio frames + + SoftwareMixerBackend_UnlockOrganyaMutex(); +} + +void AudioBackend_Lock(void) +{ + SoftwareMixerBackend_LockMixerMutex(); +} + +void AudioBackend_Unlock(void) +{ + SoftwareMixerBackend_UnlockMixerMutex(); +} diff --git a/src/Backends/Audio/SoftwareMixer/3DS.cpp b/src/Backends/Audio/SoftwareMixer/3DS.cpp new file mode 100644 index 0000000..a8fd1a3 --- /dev/null +++ b/src/Backends/Audio/SoftwareMixer/3DS.cpp @@ -0,0 +1,210 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "Backend.h" + +#include +#include + +#include <3ds.h> + +#include "../../Misc.h" + +#define SAMPLE_RATE 32000 // The native sample rate is 32728.4980469 +#define FRAMES_PER_BUFFER (SAMPLE_RATE / 30) // 33.333 milliseconds + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define CLAMP(a, min, max) MIN(MAX((a), (min)), (max)) + +static void (*parent_callback)(long *stream, size_t frames_total); + +static short *stream_buffer; + +static ndspWaveBuf dsp_buffers[2]; +static bool current_dsp_buffer; + +static LightLock mixer_mutex; +static LightLock organya_mutex; + +static LightEvent audio_thread_event; + +static Thread audio_thread; +static bool audio_thread_die; + +static void FillBuffer(short *stream, size_t frames_total) +{ + size_t frames_done = 0; + + while (frames_done != frames_total) + { + long mix_buffer[FRAMES_PER_BUFFER * 2]; // 2 because stereo + + size_t subframes = MIN(FRAMES_PER_BUFFER, frames_total - frames_done); + + memset(mix_buffer, 0, subframes * sizeof(long) * 2); + + parent_callback(mix_buffer, subframes); + + for (size_t i = 0; i < subframes * 2; ++i) + { + if (mix_buffer[i] > 0x7FFF) + *stream++ = 0x7FFF; + else if (mix_buffer[i] < -0x7FFF) + *stream++ = -0x7FFF; + else + *stream++ = mix_buffer[i]; + } + + frames_done += subframes; + } + + DSP_FlushDataCache(stream, frames_total * sizeof(short) * 2); +} + +static void Callback(void *user_data) +{ + (void)user_data; + + LightEvent_Signal(&audio_thread_event); +} + +static void AudioThread(void *user_data) +{ + (void)user_data; + + while (!audio_thread_die) + { + if (dsp_buffers[current_dsp_buffer].status == NDSP_WBUF_DONE) + { + FillBuffer(dsp_buffers[current_dsp_buffer].data_pcm16, dsp_buffers[current_dsp_buffer].nsamples); + + ndspChnWaveBufAdd(0, &dsp_buffers[current_dsp_buffer]); + + current_dsp_buffer = !current_dsp_buffer; + } + + LightEvent_Wait(&audio_thread_event); + } +} + +unsigned long SoftwareMixerBackend_Init(void (*callback)(long *stream, size_t frames_total)) +{ + parent_callback = callback; + + current_dsp_buffer = false; + + stream_buffer = (short*)linearAlloc(FRAMES_PER_BUFFER * sizeof(short) * 2 * 2); + + if (stream_buffer != NULL) + { + Result rc = ndspInit(); + + if (R_SUCCEEDED(rc)) + { + ndspSetCallback(Callback, NULL); + + ndspSetOutputMode(NDSP_OUTPUT_STEREO); + + ndspChnSetInterp(0, NDSP_INTERP_LINEAR); + ndspChnSetRate(0, SAMPLE_RATE); + ndspChnSetFormat(0, NDSP_FORMAT_STEREO_PCM16); + + float mix[12]; + mix[0] = 1.0f; + mix[1] = 1.0f; + mix[2] = 0.0f; + mix[3] = 0.0f; + mix[4] = 0.0f; + mix[5] = 0.0f; + mix[6] = 0.0f; + mix[7] = 0.0f; + mix[8] = 0.0f; + mix[9] = 0.0f; + mix[10] = 0.0f; + mix[11] = 0.0f; + ndspChnSetMix(0, mix); + + memset(dsp_buffers, 0, sizeof(dsp_buffers)); + dsp_buffers[0].data_vaddr = &stream_buffer[FRAMES_PER_BUFFER * 2 * 0]; + dsp_buffers[0].nsamples = FRAMES_PER_BUFFER; + dsp_buffers[1].data_vaddr = &stream_buffer[FRAMES_PER_BUFFER * 2 * 1]; + dsp_buffers[1].nsamples = FRAMES_PER_BUFFER; + + LightLock_Init(&mixer_mutex); + LightLock_Init(&organya_mutex); + + LightEvent_Init(&audio_thread_event, RESET_ONESHOT); + + s32 priority = 0x30; + svcGetThreadPriority(&priority, CUR_THREAD_HANDLE); + + audio_thread_die = false; + audio_thread = threadCreate(AudioThread, NULL, 32 * 1024, CLAMP(priority - 1, 0x18, 0x3F), -1, false); + + return SAMPLE_RATE; + } + else + { + if (R_SUMMARY(rc) == RS_NOTFOUND && R_MODULE(rc) == RM_DSP) + Backend_PrintError("Could not load DSP firmware.\nThe game will not have any audio!\nTo fix this, you need to dump your\n3DS's DSP firmware.\nGoogle it if you're not sure what to do."); + else + Backend_PrintError("ndspInit failed in SoftwareMixerBackend_Init"); + } + + linearFree(stream_buffer); + } + else + { + Backend_PrintError("linearAlloc failed"); + } + + return 0; +} + +void SoftwareMixerBackend_Deinit(void) +{ + ndspSetCallback(NULL, NULL); + + // Kill audio thread + audio_thread_die = true; + LightEvent_Signal(&audio_thread_event); + threadJoin(audio_thread, UINT64_MAX); + threadFree(audio_thread); + + ndspChnReset(0); + + ndspExit(); + + linearFree(stream_buffer); +} + +bool SoftwareMixerBackend_Start(void) +{ + FillBuffer(stream_buffer, FRAMES_PER_BUFFER * 2); + + ndspChnWaveBufAdd(0, &dsp_buffers[0]); + ndspChnWaveBufAdd(0, &dsp_buffers[1]); + + return true; +} + +void SoftwareMixerBackend_LockMixerMutex(void) +{ + LightLock_Lock(&mixer_mutex); +} + +void SoftwareMixerBackend_UnlockMixerMutex(void) +{ + LightLock_Unlock(&mixer_mutex); +} + +void SoftwareMixerBackend_LockOrganyaMutex(void) +{ + LightLock_Lock(&organya_mutex); +} + +void SoftwareMixerBackend_UnlockOrganyaMutex(void) +{ + LightLock_Unlock(&organya_mutex); +} diff --git a/src/Backends/Audio/SoftwareMixer/Backend.h b/src/Backends/Audio/SoftwareMixer/Backend.h new file mode 100644 index 0000000..3e5939a --- /dev/null +++ b/src/Backends/Audio/SoftwareMixer/Backend.h @@ -0,0 +1,17 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +unsigned long SoftwareMixerBackend_Init(void (*callback)(long *stream, size_t frames_total)); +void SoftwareMixerBackend_Deinit(void); + +bool SoftwareMixerBackend_Start(void); + +void SoftwareMixerBackend_LockMixerMutex(void); +void SoftwareMixerBackend_UnlockMixerMutex(void); + +void SoftwareMixerBackend_LockOrganyaMutex(void); +void SoftwareMixerBackend_UnlockOrganyaMutex(void); diff --git a/src/Backends/Audio/SoftwareMixer/Mixer.cpp b/src/Backends/Audio/SoftwareMixer/Mixer.cpp new file mode 100644 index 0000000..2cf986a --- /dev/null +++ b/src/Backends/Audio/SoftwareMixer/Mixer.cpp @@ -0,0 +1,245 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "Mixer.h" + +#include +#include +#include + +#include "../../../Attributes.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define CLAMP(x, y, z) MIN(MAX((x), (y)), (z)) + +#define LANCZOS_KERNEL_RADIUS 2 + +struct Mixer_Sound +{ + signed char *samples; + size_t frames; + size_t position; + unsigned short position_subsample; + unsigned long advance_delta; // 16.16 fixed-point + bool playing; + bool looping; + short volume; // 8.8 fixed-point + short pan_l; // 8.8 fixed-point + short pan_r; // 8.8 fixed-point + short volume_l; // 8.8 fixed-point + short volume_r; // 8.8 fixed-point + + struct Mixer_Sound *next; +}; + +static Mixer_Sound *sound_list_head; + +static unsigned long output_frequency; + +static unsigned short MillibelToScale(long volume) +{ + // Volume is in hundredths of a decibel, from 0 to -10000 + volume = CLAMP(volume, -10000, 0); + return (unsigned short)(pow(10.0, volume / 2000.0) * 256.0); +} + +void Mixer_Init(unsigned long frequency) +{ + output_frequency = frequency; +} + +Mixer_Sound* Mixer_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length) +{ + Mixer_Sound *sound = (Mixer_Sound*)malloc(sizeof(Mixer_Sound)); + + if (sound == NULL) + return NULL; + + // Both interpolators will read outside the array's bounds, so allocate some extra room +#ifdef LANCZOS_RESAMPLER + sound->samples = (signed char*)malloc(LANCZOS_KERNEL_RADIUS - 1 + length + LANCZOS_KERNEL_RADIUS); +#else + sound->samples = (signed char*)malloc(length + 1); +#endif + + if (sound->samples == NULL) + { + free(sound); + return NULL; + } + +#ifdef LANCZOS_RESAMPLER + sound->samples += LANCZOS_KERNEL_RADIUS - 1; +#endif + + for (size_t i = 0; i < length; ++i) + sound->samples[i] = samples[i] - 0x80; // Convert from unsigned 8-bit PCM to signed + + sound->frames = length; + sound->playing = false; + sound->position = 0; + sound->position_subsample = 0; + + Mixer_SetSoundFrequency(sound, frequency); + Mixer_SetSoundVolume(sound, 0); + Mixer_SetSoundPan(sound, 0); + + sound->next = sound_list_head; + sound_list_head = sound; + + return sound; +} + +void Mixer_DestroySound(Mixer_Sound *sound) +{ + for (Mixer_Sound **sound_pointer = &sound_list_head; *sound_pointer != NULL; sound_pointer = &(*sound_pointer)->next) + { + if (*sound_pointer == sound) + { + *sound_pointer = sound->next; + #ifdef LANCZOS_RESAMPLER + sound->samples -= LANCZOS_KERNEL_RADIUS - 1; + #endif + free(sound->samples); + free(sound); + break; + } + } +} + +void Mixer_PlaySound(Mixer_Sound *sound, bool looping) +{ + sound->playing = true; + sound->looping = looping; + + // Fill the out-of-bounds part of the buffer with + // either blank samples or repeated samples +#ifdef LANCZOS_RESAMPLER + if (looping) + { + for (int i = -LANCZOS_KERNEL_RADIUS + 1; i < 0; ++i) + sound->samples[i] = sound->samples[sound->frames + i]; + + for (int i = 0; i < LANCZOS_KERNEL_RADIUS; ++i) + sound->samples[sound->frames + i] = sound->samples[i]; + } + else + { + for (int i = -LANCZOS_KERNEL_RADIUS + 1; i < 0; ++i) + sound->samples[i] = 0; + + for (int i = 0; i < LANCZOS_KERNEL_RADIUS; ++i) + sound->samples[sound->frames + i] = 0; + } +#else + sound->samples[sound->frames] = looping ? sound->samples[0] : 0; +#endif +} + +void Mixer_StopSound(Mixer_Sound *sound) +{ + sound->playing = false; +} + +void Mixer_RewindSound(Mixer_Sound *sound) +{ + sound->position = 0; + sound->position_subsample = 0; +} + +void Mixer_SetSoundFrequency(Mixer_Sound *sound, unsigned int frequency) +{ + sound->advance_delta = (frequency << 16) / output_frequency; +} + +void Mixer_SetSoundVolume(Mixer_Sound *sound, long volume) +{ + sound->volume = MillibelToScale(volume); + + sound->volume_l = (sound->pan_l * sound->volume) >> 8; + sound->volume_r = (sound->pan_r * sound->volume) >> 8; +} + +void Mixer_SetSoundPan(Mixer_Sound *sound, long pan) +{ + sound->pan_l = MillibelToScale(-pan); + sound->pan_r = MillibelToScale(pan); + + sound->volume_l = (sound->pan_l * sound->volume) >> 8; + sound->volume_r = (sound->pan_r * sound->volume) >> 8; +} + +// Most CPU-intensive function in the game (2/3rd CPU time consumption in my experience), so marked with ATTRIBUTE_HOT so the compiler considers it a hot spot (as it is) when optimizing +ATTRIBUTE_HOT void Mixer_MixSounds(long *stream, size_t frames_total) +{ + for (Mixer_Sound *sound = sound_list_head; sound != NULL; sound = sound->next) + { + if (sound->playing) + { + long *stream_pointer = stream; + + for (size_t frames_done = 0; frames_done < frames_total; ++frames_done) + { + #ifdef LANCZOS_RESAMPLER + // Perform Lanczos resampling + float output_sample = 0; + + for (int i = -LANCZOS_KERNEL_RADIUS + 1; i <= LANCZOS_KERNEL_RADIUS; ++i) + { + const signed char input_sample = sound->samples[sound->position + i]; + + const float kernel_input = ((float)sound->position_subsample / 0x10000) - i; + + if (kernel_input == 0.0f) + { + output_sample += input_sample; + } + else + { + const float nx = 3.14159265358979323846f * kernel_input; + const float nxa = nx / LANCZOS_KERNEL_RADIUS; + + output_sample += input_sample * (sin(nx) * sin(nxa) / (nx * nxa)); + } + } + + // Mix, and apply volume + *stream_pointer++ += (short)(output_sample * sound->volume_l); + *stream_pointer++ += (short)(output_sample * sound->volume_r); + #else + // Perform linear interpolation + const unsigned char interpolation_scale = sound->position_subsample >> 8; + + const signed char output_sample = (sound->samples[sound->position] * (0x100 - interpolation_scale) + + sound->samples[sound->position + 1] * interpolation_scale) >> 8; + + // Mix, and apply volume + *stream_pointer++ += output_sample * sound->volume_l; + *stream_pointer++ += output_sample * sound->volume_r; + #endif + + // Increment sample + const unsigned long next_position_subsample = sound->position_subsample + sound->advance_delta; + sound->position += next_position_subsample >> 16; + sound->position_subsample = next_position_subsample & 0xFFFF; + + // Stop or loop sample once it's reached its end + if (sound->position >= sound->frames) + { + if (sound->looping) + { + sound->position %= sound->frames; + } + else + { + sound->playing = false; + sound->position = 0; + sound->position_subsample = 0; + break; + } + } + } + } + } +} diff --git a/src/Backends/Audio/SoftwareMixer/Mixer.h b/src/Backends/Audio/SoftwareMixer/Mixer.h new file mode 100644 index 0000000..6e9b96e --- /dev/null +++ b/src/Backends/Audio/SoftwareMixer/Mixer.h @@ -0,0 +1,19 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +typedef struct Mixer_Sound Mixer_Sound; + +void Mixer_Init(unsigned long frequency); +Mixer_Sound* Mixer_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length); +void Mixer_DestroySound(Mixer_Sound *sound); +void Mixer_PlaySound(Mixer_Sound *sound, bool looping); +void Mixer_StopSound(Mixer_Sound *sound); +void Mixer_RewindSound(Mixer_Sound *sound); +void Mixer_SetSoundFrequency(Mixer_Sound *sound, unsigned int frequency); +void Mixer_SetSoundVolume(Mixer_Sound *sound, long volume); +void Mixer_SetSoundPan(Mixer_Sound *sound, long pan); +void Mixer_MixSounds(long *stream, size_t frames_total); diff --git a/src/Backends/Audio/SoftwareMixer/SDL1.cpp b/src/Backends/Audio/SoftwareMixer/SDL1.cpp new file mode 100644 index 0000000..9ad6504 --- /dev/null +++ b/src/Backends/Audio/SoftwareMixer/SDL1.cpp @@ -0,0 +1,116 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "Backend.h" + +#include +#include +#include + +#include "SDL.h" + +#include "../../Misc.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +static void (*parent_callback)(long *stream, size_t frames_total); + +static void Callback(void *user_data, Uint8 *stream_uint8, int len) +{ + (void)user_data; + + short *stream = (short*)stream_uint8; + const size_t frames_total = len / sizeof(short) / 2; + + size_t frames_done = 0; + + while (frames_done != frames_total) + { + long mix_buffer[0x800 * 2]; // 2 because stereo + + size_t subframes = MIN(0x800, frames_total - frames_done); + + memset(mix_buffer, 0, subframes * sizeof(long) * 2); + + parent_callback(mix_buffer, subframes); + + for (size_t i = 0; i < subframes * 2; ++i) + { + if (mix_buffer[i] > 0x7FFF) + *stream++ = 0x7FFF; + else if (mix_buffer[i] < -0x7FFF) + *stream++ = -0x7FFF; + else + *stream++ = mix_buffer[i]; + } + + frames_done += subframes; + } +} + +unsigned long SoftwareMixerBackend_Init(void (*callback)(long *stream, size_t frames_total)) +{ + if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) + { + std::string errorMessage = std::string("'SDL_InitSubSystem(SDL_INIT_AUDIO)' failed: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (SDL1 audio backend)", errorMessage.c_str()); + return false; + } + + SDL_AudioSpec specification; + specification.freq = 48000; + specification.format = AUDIO_S16; + specification.channels = 2; + specification.samples = 0x400; // Roughly 10 milliseconds for 48000Hz + specification.callback = Callback; + specification.userdata = NULL; + + SDL_AudioSpec obtained_specification; + if (SDL_OpenAudio(&specification, &obtained_specification) != 0) + { + std::string error_message = std::string("'SDL_OpenAudio' failed: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (SDL1 audio backend)", error_message.c_str()); + return false; + } + + char driver[20]; + Backend_PrintInfo("Selected SDL audio driver: %s", SDL_AudioDriverName(driver, 20)); + + parent_callback = callback; + + return obtained_specification.freq; +} + +void SoftwareMixerBackend_Deinit(void) +{ + SDL_CloseAudio(); + + SDL_QuitSubSystem(SDL_INIT_AUDIO); +} + +bool SoftwareMixerBackend_Start(void) +{ + SDL_PauseAudio(0); + + return true; +} + +void SoftwareMixerBackend_LockMixerMutex(void) +{ + SDL_LockAudio(); +} + +void SoftwareMixerBackend_UnlockMixerMutex(void) +{ + SDL_UnlockAudio(); +} + +void SoftwareMixerBackend_LockOrganyaMutex(void) +{ + SDL_LockAudio(); +} + +void SoftwareMixerBackend_UnlockOrganyaMutex(void) +{ + SDL_UnlockAudio(); +} diff --git a/src/Backends/Audio/SoftwareMixer/SDL2.cpp b/src/Backends/Audio/SoftwareMixer/SDL2.cpp new file mode 100644 index 0000000..5e20a59 --- /dev/null +++ b/src/Backends/Audio/SoftwareMixer/SDL2.cpp @@ -0,0 +1,123 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "Backend.h" + +#include +#include +#include + +#include "SDL.h" + +#include "../../Misc.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +static void (*parent_callback)(long *stream, size_t frames_total); + +static SDL_AudioDeviceID device_id; + +static void Callback(void *user_data, Uint8 *stream_uint8, int len) +{ + (void)user_data; + + short *stream = (short*)stream_uint8; + const size_t frames_total = len / sizeof(short) / 2; + + size_t frames_done = 0; + + while (frames_done != frames_total) + { + long mix_buffer[0x800 * 2]; // 2 because stereo + + size_t subframes = MIN(0x800, frames_total - frames_done); + + memset(mix_buffer, 0, subframes * sizeof(long) * 2); + + parent_callback(mix_buffer, subframes); + + for (size_t i = 0; i < subframes * 2; ++i) + { + if (mix_buffer[i] > 0x7FFF) + *stream++ = 0x7FFF; + else if (mix_buffer[i] < -0x7FFF) + *stream++ = -0x7FFF; + else + *stream++ = mix_buffer[i]; + } + + frames_done += subframes; + } +} + +unsigned long SoftwareMixerBackend_Init(void (*callback)(long *stream, size_t frames_total)) +{ + if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) + { + std::string errorMessage = std::string("'SDL_InitSubSystem(SDL_INIT_AUDIO)' failed: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (SDL2 audio backend)", errorMessage.c_str()); + return 0; + } + + Backend_PrintInfo("Available SDL audio drivers:"); + + for (int i = 0; i < SDL_GetNumAudioDrivers(); ++i) + Backend_PrintInfo("%s", SDL_GetAudioDriver(i)); + + SDL_AudioSpec specification; + specification.freq = 48000; + specification.format = AUDIO_S16; + specification.channels = 2; + specification.samples = 0x400; // Roughly 10 milliseconds for 48000Hz + specification.callback = Callback; + specification.userdata = NULL; + + SDL_AudioSpec obtained_specification; + device_id = SDL_OpenAudioDevice(NULL, 0, &specification, &obtained_specification, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE); + if (device_id == 0) + { + std::string error_message = std::string("'SDL_OpenAudioDevice' failed: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (SDL2 audio backend)", error_message.c_str()); + return 0; + } + + Backend_PrintInfo("Selected SDL audio driver: %s", SDL_GetCurrentAudioDriver()); + + parent_callback = callback; + + return obtained_specification.freq; +} + +void SoftwareMixerBackend_Deinit(void) +{ + SDL_CloseAudioDevice(device_id); + + SDL_QuitSubSystem(SDL_INIT_AUDIO); +} + +bool SoftwareMixerBackend_Start(void) +{ + SDL_PauseAudioDevice(device_id, 0); + + return true; +} + +void SoftwareMixerBackend_LockMixerMutex(void) +{ + SDL_LockAudioDevice(device_id); +} + +void SoftwareMixerBackend_UnlockMixerMutex(void) +{ + SDL_UnlockAudioDevice(device_id); +} + +void SoftwareMixerBackend_LockOrganyaMutex(void) +{ + SDL_LockAudioDevice(device_id); +} + +void SoftwareMixerBackend_UnlockOrganyaMutex(void) +{ + SDL_UnlockAudioDevice(device_id); +} diff --git a/src/Backends/Audio/SoftwareMixer/WiiU.cpp b/src/Backends/Audio/SoftwareMixer/WiiU.cpp new file mode 100644 index 0000000..f88425e --- /dev/null +++ b/src/Backends/Audio/SoftwareMixer/WiiU.cpp @@ -0,0 +1,237 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "Backend.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#define AUDIO_BUFFERS 2 // Double-buffer + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define CLAMP(x, y, z) MIN(MAX((x), (y)), (z)) + +static void (*parent_callback)(long *stream, size_t frames_total); + +static OSMutex sound_list_mutex; +static OSMutex organya_mutex; + +static AXVoice *voices[2]; + +static short *stream_buffers[2]; +static long *stream_buffer_long; +static size_t buffer_length; + +static void FrameCallback(void) +{ + // We use a double-buffer: while the Wii U is busy playing one half of the buffer, we update the other. + // The buffer is 10ms long in total, and this function runs every 3ms. + + // Just assume both voices are in-sync, and only check the first one + AXVoiceOffsets offsets; + AXGetVoiceOffsets(voices[0], &offsets); + + unsigned int current_buffer = offsets.currentOffset / buffer_length; + + static unsigned int last_buffer = 1; + + if (current_buffer != last_buffer) + { + // Clear the mixer buffer + memset(stream_buffer_long, 0, buffer_length * sizeof(long) * 2); + + // Fill mixer buffer + parent_callback(stream_buffer_long, buffer_length); + + // Deinterlate samples, convert them to S16, and write them to the double-buffers + short *left_output_buffer = &stream_buffers[0][buffer_length * last_buffer]; + short *right_output_buffer = &stream_buffers[1][buffer_length * last_buffer]; + + long *mixer_buffer_pointer = stream_buffer_long; + short *left_output_buffer_pointer = left_output_buffer; + short *right_output_buffer_pointer = right_output_buffer; + + for (unsigned int i = 0; i < buffer_length; ++i) + { + const long left_sample = *mixer_buffer_pointer++; + const long right_sample = *mixer_buffer_pointer++; + + // Clamp samples to sane limits, convert to S16, and store in double-buffers + if (left_sample > 0x7FFF) + *left_output_buffer_pointer++ = 0x7FFF; + else if (left_sample < -0x7FFF) + *left_output_buffer_pointer++ = -0x7FFF; + else + *left_output_buffer_pointer++ = (short)left_sample; + + if (right_sample > 0x7FFF) + *right_output_buffer_pointer++ = 0x7FFF; + else if (right_sample < -0x7FFF) + *right_output_buffer_pointer++ = -0x7FFF; + else + *right_output_buffer_pointer++ = (short)right_sample; + } + + // Make sure the sound hardware can see our data + DCStoreRange(left_output_buffer, buffer_length * sizeof(short)); + DCStoreRange(right_output_buffer, buffer_length * sizeof(short)); + + last_buffer = current_buffer; + } +} + +unsigned long SoftwareMixerBackend_Init(void (*callback)(long *stream, size_t frames_total)) +{ + if (!AXIsInit()) + { + AXInitParams initparams = { + .renderer = AX_INIT_RENDERER_48KHZ, + .pipeline = AX_INIT_PIPELINE_SINGLE, + }; + + AXInitWithParams(&initparams); + } + + OSInitMutex(&sound_list_mutex); + OSInitMutex(&organya_mutex); + + unsigned long output_frequency = AXGetInputSamplesPerSec(); + + buffer_length = output_frequency / 100; // 10ms buffer + + // Create and initialise two 'voices': each one will stream its own + // audio - one for the left speaker, and one for the right. + + // The software-mixer outputs interlaced samples into a buffer of `long`s, + // so create a buffer for it here. + stream_buffer_long = (long*)malloc(buffer_length * sizeof(long) * 2); // `* 2` because it's an interlaced stereo buffer + + if (stream_buffer_long != NULL) + { + stream_buffers[0] = (short*)malloc(buffer_length * sizeof(short) * AUDIO_BUFFERS); + + if (stream_buffers[0] != NULL) + { + stream_buffers[1] = (short*)malloc(buffer_length * sizeof(short) * AUDIO_BUFFERS); + + if (stream_buffers[1] != NULL) + { + voices[0] = AXAcquireVoice(31, NULL, NULL); + + if (voices[0] != NULL) + { + voices[1] = AXAcquireVoice(31, NULL, NULL); + + if (voices[1] != NULL) + { + for (unsigned int i = 0; i < 2; ++i) + { + AXVoiceBegin(voices[i]); + + AXSetVoiceType(voices[i], 0); + + AXVoiceVeData vol = {.volume = 0x8000}; + AXSetVoiceVe(voices[i], &vol); + + AXVoiceDeviceMixData mix_data[6]; + memset(mix_data, 0, sizeof(mix_data)); + mix_data[i].bus[0].volume = 0x8000; // Voice 1 goes on the left speaker - voice 2 goes on the right speaker + + AXSetVoiceDeviceMix(voices[i], AX_DEVICE_TYPE_DRC, 0, mix_data); + AXSetVoiceDeviceMix(voices[i], AX_DEVICE_TYPE_TV, 0, mix_data); + + AXSetVoiceSrcRatio(voices[i], 1.0f); // We use the native sample rate + AXSetVoiceSrcType(voices[i], AX_VOICE_SRC_TYPE_NONE); + + AXVoiceOffsets offs = { + .dataType = AX_VOICE_FORMAT_LPCM16, + .loopingEnabled = AX_VOICE_LOOP_ENABLED, + .loopOffset = 0, + .endOffset = (buffer_length * AUDIO_BUFFERS) - 1, // -1 or else you'll get popping! + .currentOffset = 0, + .data = stream_buffers[i] + }; + AXSetVoiceOffsets(voices[i], &offs); + + AXVoiceEnd(voices[i]); + } + + parent_callback = callback; + + // Register the frame callback. + // Apparently, this fires every 3ms - we will use + // it to update the stream buffers when needed. + AXRegisterAppFrameCallback(FrameCallback); + + return output_frequency; + } + + AXFreeVoice(voices[0]); + } + + free(stream_buffers[1]); + } + + free(stream_buffers[0]); + } + + free(stream_buffer_long); + } + + AXQuit(); + + return 0; +} + +void SoftwareMixerBackend_Deinit(void) +{ + AXRegisterAppFrameCallback(NULL); + + AXFreeVoice(voices[1]); + AXFreeVoice(voices[0]); + + free(stream_buffers[1]); + free(stream_buffers[0]); + + free(stream_buffer_long); + + AXQuit(); +} + +bool SoftwareMixerBackend_Start(void) +{ + AXSetVoiceState(voices[0], AX_VOICE_STATE_PLAYING); + AXSetVoiceState(voices[1], AX_VOICE_STATE_PLAYING); + + return true; +} + +void SoftwareMixerBackend_LockMixerMutex(void) +{ + OSLockMutex(&sound_list_mutex); +} + +void SoftwareMixerBackend_UnlockMixerMutex(void) +{ + OSUnlockMutex(&sound_list_mutex); +} + +void SoftwareMixerBackend_LockOrganyaMutex(void) +{ + OSLockMutex(&organya_mutex); +} + +void SoftwareMixerBackend_UnlockOrganyaMutex(void) +{ + OSUnlockMutex(&organya_mutex); +} diff --git a/src/Backends/Audio/SoftwareMixer/miniaudio.cpp b/src/Backends/Audio/SoftwareMixer/miniaudio.cpp new file mode 100644 index 0000000..b302173 --- /dev/null +++ b/src/Backends/Audio/SoftwareMixer/miniaudio.cpp @@ -0,0 +1,170 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "Backend.h" + +#include +#include + +#define MINIAUDIO_IMPLEMENTATION +#define MA_NO_DECODING +#define MA_NO_ENCODING +#define MA_NO_WAV +#define MA_NO_FLAC +#define MA_NO_MP3 +#define MA_API static +#include "../../../../external/miniaudio.h" + +#include "../../Misc.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +static void (*parent_callback)(long *stream, size_t frames_total); + +static ma_context context; +static ma_device device; +static ma_mutex mutex; +static ma_mutex organya_mutex; + +static void Callback(ma_device *device, void *output_stream, const void *input_stream, ma_uint32 frames_total) +{ + (void)device; + (void)input_stream; + + short *stream = (short*)output_stream; + + size_t frames_done = 0; + + while (frames_done != frames_total) + { + long mix_buffer[0x800 * 2]; // 2 because stereo + + size_t subframes = MIN(0x800, frames_total - frames_done); + + memset(mix_buffer, 0, subframes * sizeof(long) * 2); + + parent_callback(mix_buffer, subframes); + + for (size_t i = 0; i < subframes * 2; ++i) + { + if (mix_buffer[i] > 0x7FFF) + *stream++ = 0x7FFF; + else if (mix_buffer[i] < -0x7FFF) + *stream++ = -0x7FFF; + else + *stream++ = mix_buffer[i]; + } + + frames_done += subframes; + } +} + +unsigned long SoftwareMixerBackend_Init(void (*callback)(long *stream, size_t frames_total)) +{ + ma_device_config config = ma_device_config_init(ma_device_type_playback); + config.playback.pDeviceID = NULL; + config.playback.format = ma_format_s16; + config.playback.channels = 2; + config.sampleRate = 0; // Let miniaudio decide what sample rate to use + config.dataCallback = Callback; + config.pUserData = NULL; + + ma_result return_value; + + return_value = ma_context_init(NULL, 0, NULL, &context); + + if (return_value == MA_SUCCESS) + { + return_value = ma_device_init(&context, &config, &device); + + if (return_value == MA_SUCCESS) + { + return_value = ma_mutex_init(&mutex); + + if (return_value == MA_SUCCESS) + { + return_value = ma_mutex_init(&organya_mutex); + + if (return_value == MA_SUCCESS) + { + parent_callback = callback; + + return device.sampleRate; + } + else + { + Backend_PrintError("Failed to create organya mutex: %s", ma_result_description(return_value)); + } + + ma_mutex_uninit(&mutex); + } + else + { + Backend_PrintError("Failed to create mutex: %s", ma_result_description(return_value)); + } + + ma_device_uninit(&device); + } + else + { + Backend_PrintError("Failed to initialize playback device: %s", ma_result_description(return_value)); + } + + ma_context_uninit(&context); + } + else + { + Backend_PrintError("Failed to initialize context: %s", ma_result_description(return_value)); + } + + return 0; +} + +void SoftwareMixerBackend_Deinit(void) +{ + ma_result return_value = ma_device_stop(&device); + + if (return_value != MA_SUCCESS) + Backend_PrintError("Failed to stop playback device: %s", ma_result_description(return_value)); + + ma_mutex_uninit(&organya_mutex); + + ma_mutex_uninit(&mutex); + + ma_device_uninit(&device); + + ma_context_uninit(&context); +} + +bool SoftwareMixerBackend_Start(void) +{ + ma_result return_value = ma_device_start(&device); + + if (return_value != MA_SUCCESS) + { + Backend_PrintError("Failed to start playback device: %s", ma_result_description(return_value)); + return false; + } + + return true; +} + +void SoftwareMixerBackend_LockMixerMutex(void) +{ + ma_mutex_lock(&mutex); +} + +void SoftwareMixerBackend_UnlockMixerMutex(void) +{ + ma_mutex_unlock(&mutex); +} + +void SoftwareMixerBackend_LockOrganyaMutex(void) +{ + ma_mutex_lock(&organya_mutex); +} + +void SoftwareMixerBackend_UnlockOrganyaMutex(void) +{ + ma_mutex_unlock(&organya_mutex); +} diff --git a/src/Backends/Audio/WiiU.cpp b/src/Backends/Audio/WiiU.cpp new file mode 100644 index 0000000..8e615d9 --- /dev/null +++ b/src/Backends/Audio/WiiU.cpp @@ -0,0 +1,425 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +// This darned thing doesn't work - sounds just randomly refuse to play, +// particularly the ones used by Organya. + +// If anyone could figure out what causes this, that would be great. + +#include "../Audio.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define CLAMP(x, y, z) MIN(MAX((x), (y)), (z)) + +struct AudioBackend_Sound +{ + signed char *samples; + size_t length; + AXVoice *voice; + unsigned int frequency; + unsigned short volume; + unsigned short pan_l; + unsigned short pan_r; + + struct AudioBackend_Sound *next; +}; + +static void (*organya_callback)(void); +static unsigned int organya_milliseconds; + +static unsigned long ticks_per_second; + +static OSMutex sound_list_mutex; +static OSMutex organya_mutex; + +static AudioBackend_Sound *sound_list_head; + +static void CullVoices(void) +{ + // Free any voices that aren't playing anymore + OSLockMutex(&sound_list_mutex); + + for (AudioBackend_Sound *sound = sound_list_head; sound != NULL; sound = sound->next) + { + if (sound->voice != NULL) + { + if (!AXIsVoiceRunning(sound->voice)) + { + AXVoiceBegin(sound->voice); + AXFreeVoice(sound->voice); + AXVoiceEnd(sound->voice); + sound->voice = NULL; + } + } + } + + OSUnlockMutex(&sound_list_mutex); +} + +static double MillibelToScale(long volume) +{ + // Volume is in hundredths of a decibel, from 0 to -10000 + volume = CLAMP(volume, -10000, 0); + return pow(10.0, volume / 2000.0); +} + +static unsigned long GetTicksMilliseconds(void) +{ + static uint64_t accumulator; + + static unsigned long last_tick; + + unsigned long current_tick = OSGetTick(); + + accumulator += current_tick - last_tick; + + last_tick = current_tick; + + return (accumulator * 1000) / ticks_per_second; +} + +static int ThreadFunction(int argc, const char *argv[]) +{ + for (;;) + { + OSTestThreadCancel(); + + OSLockMutex(&organya_mutex); + + if (organya_milliseconds == 0) + { + OSUnlockMutex(&organya_mutex); + + // Do nothing + OSSleepTicks(ticks_per_second / 1000); + } + else + { + OSUnlockMutex(&organya_mutex); + + // Update Organya + static unsigned long next_ticks; + + for (;;) + { + unsigned long ticks = GetTicksMilliseconds(); + + if (ticks >= next_ticks) + break; + + OSSleepTicks(ticks_per_second / 1000); + } + + OSLockMutex(&organya_mutex); + next_ticks += organya_milliseconds; + OSUnlockMutex(&organya_mutex); + + OSLockMutex(&sound_list_mutex); + organya_callback(); + OSUnlockMutex(&sound_list_mutex); + } + } + + return 0; +} + +bool AudioBackend_Init(void) +{ + if (!AXIsInit()) + { + AXInitParams initparams = { + .renderer = AX_INIT_RENDERER_48KHZ, + .pipeline = AX_INIT_PIPELINE_SINGLE, + }; + + AXInitWithParams(&initparams); + } + + ticks_per_second = OSGetSystemInfo()->busClockSpeed / 4; + + OSInitMutex(&sound_list_mutex); + OSInitMutex(&organya_mutex); + + OSRunThread(OSGetDefaultThread(0), ThreadFunction, 0, NULL); + + return true; +} + +void AudioBackend_Deinit(void) +{ + OSCancelThread(OSGetDefaultThread(0)); + + OSJoinThread(OSGetDefaultThread(0), NULL); + + AXQuit(); +} + +AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length) +{ + AudioBackend_Sound *sound = (AudioBackend_Sound*)malloc(sizeof(AudioBackend_Sound)); + + if (sound != NULL) + { + signed char *samples_copy = (signed char*)malloc(length); + + if (samples_copy != NULL) + { + // Convert to signed + for (size_t i = 0; i < length; ++i) + samples_copy[i] = samples[i] - 0x80; + + DCStoreRange(samples_copy, length); + + sound->samples = samples_copy; + sound->length = length; + sound->voice = NULL; + sound->frequency = frequency; + sound->volume = 0x8000; + sound->pan_l = 0x8000; + sound->pan_r = 0x8000; + + OSLockMutex(&sound_list_mutex); + sound->next = sound_list_head; + sound_list_head = sound; + OSUnlockMutex(&sound_list_mutex); + + return sound; + } + + free(sound); + } + + return NULL; +} + +void AudioBackend_DestroySound(AudioBackend_Sound *sound) +{ + if (sound == NULL) + return; + + OSLockMutex(&sound_list_mutex); + + // Unhook sound from the linked-list + for (AudioBackend_Sound **sound_pointer = &sound_list_head; *sound_pointer != NULL; sound_pointer = &(*sound_pointer)->next) + { + if (*sound_pointer == sound) + { + *sound_pointer = sound->next; + break; + } + } + + OSUnlockMutex(&sound_list_mutex); + + if (sound->voice != NULL) + { + AXVoiceBegin(sound->voice); + AXFreeVoice(sound->voice); + AXVoiceEnd(sound->voice); + } + + free(sound->samples); + free(sound); +} + +void AudioBackend_PlaySound(AudioBackend_Sound *sound, bool looping) +{ + if (sound == NULL) + return; + + CullVoices(); + + OSLockMutex(&sound_list_mutex); + + if (sound->voice == NULL) + { + AXVoice *voice = AXAcquireVoice(31, NULL, NULL); + + if (voice != NULL) + { + AXVoiceBegin(voice); + + AXSetVoiceType(voice, 0); + + AXVoiceVeData vol = {.volume = sound->volume}; + AXSetVoiceVe(voice, &vol); + + AXVoiceDeviceMixData mix_data[6]; + memset(mix_data, 0, sizeof(mix_data)); + mix_data[0].bus[0].volume = sound->pan_l; + mix_data[1].bus[0].volume = sound->pan_r; + + AXSetVoiceDeviceMix(voice, AX_DEVICE_TYPE_DRC, 0, mix_data); + AXSetVoiceDeviceMix(voice, AX_DEVICE_TYPE_TV, 0, mix_data); + + float srcratio = (float)sound->frequency / (float)AXGetInputSamplesPerSec(); + AXSetVoiceSrcRatio(voice, srcratio); + AXSetVoiceSrcType(voice, AX_VOICE_SRC_TYPE_LINEAR); + + AXVoiceOffsets offs; + offs.dataType = AX_VOICE_FORMAT_LPCM8; + offs.endOffset = sound->length; + offs.loopingEnabled = AX_VOICE_LOOP_DISABLED; + offs.loopOffset = 0; + offs.currentOffset = 0; + offs.data = sound->samples; + AXSetVoiceOffsets(voice, &offs); + + AXVoiceEnd(voice); + + sound->voice = voice; + } + } + + if (sound->voice != NULL) + { + AXVoiceBegin(sound->voice); + + AXSetVoiceLoop(sound->voice, looping ? AX_VOICE_LOOP_ENABLED : AX_VOICE_LOOP_DISABLED); + AXSetVoiceState(sound->voice, AX_VOICE_STATE_PLAYING); + + AXVoiceEnd(sound->voice); + } + + OSUnlockMutex(&sound_list_mutex); +} + +void AudioBackend_StopSound(AudioBackend_Sound *sound) +{ + if (sound == NULL) + return; + + OSLockMutex(&sound_list_mutex); + + if (sound->voice != NULL) + { + AXVoiceBegin(sound->voice); + + AXSetVoiceState(sound->voice, AX_VOICE_STATE_STOPPED); + + AXVoiceEnd(sound->voice); + } + + OSUnlockMutex(&sound_list_mutex); +} + +void AudioBackend_RewindSound(AudioBackend_Sound *sound) +{ + if (sound == NULL) + return; + + OSLockMutex(&sound_list_mutex); + + if (sound->voice != NULL) + { + AXVoiceBegin(sound->voice); + + AXSetVoiceCurrentOffset(sound->voice, 0); + + AXVoiceEnd(sound->voice); + } + + OSUnlockMutex(&sound_list_mutex); +} + +void AudioBackend_SetSoundFrequency(AudioBackend_Sound *sound, unsigned int frequency) +{ + if (sound == NULL) + return; + + OSLockMutex(&sound_list_mutex); + + sound->frequency = frequency; + + if (sound->voice != NULL) + { + AXVoiceBegin(sound->voice); + + float srcratio = (float)frequency / (float)AXGetInputSamplesPerSec(); + AXSetVoiceSrcRatio(sound->voice, srcratio); + + AXVoiceEnd(sound->voice); + } + + OSUnlockMutex(&sound_list_mutex); +} + +void AudioBackend_SetSoundVolume(AudioBackend_Sound *sound, long volume) +{ + if (sound == NULL) + return; + + OSLockMutex(&sound_list_mutex); + + sound->volume = (unsigned short)(0x8000 * MillibelToScale(volume)); + + if (sound->voice != NULL) + { + AXVoiceBegin(sound->voice); + + AXVoiceVeData vol = {.volume = sound->volume}; + + AXSetVoiceVe(sound->voice, &vol); + + AXVoiceEnd(sound->voice); + } + + OSUnlockMutex(&sound_list_mutex); +} + +void AudioBackend_SetSoundPan(AudioBackend_Sound *sound, long pan) +{ + if (sound == NULL) + return; + + OSLockMutex(&sound_list_mutex); + + sound->pan_l = (unsigned short)(0x8000 * MillibelToScale(-pan)); + sound->pan_r = (unsigned short)(0x8000 * MillibelToScale(pan)); + + if (sound->voice != NULL) + { + AXVoiceBegin(sound->voice); + + AXVoiceDeviceMixData mix_data[6]; + memset(mix_data, 0, sizeof(mix_data)); + mix_data[0].bus[0].volume = sound->pan_l; + mix_data[1].bus[0].volume = sound->pan_r; + + AXSetVoiceDeviceMix(sound->voice, AX_DEVICE_TYPE_DRC, 0, mix_data); + AXSetVoiceDeviceMix(sound->voice, AX_DEVICE_TYPE_TV, 0, mix_data); + + AXVoiceEnd(sound->voice); + } + + OSUnlockMutex(&sound_list_mutex); +} + +void AudioBackend_SetOrganyaCallback(void (*callback)(void)) +{ + // As far as thread-safety goes - this is guarded by + // `organya_milliseconds`, which is guarded by `organya_mutex`. + organya_callback = callback; +} + +void AudioBackend_SetOrganyaTimer(unsigned int milliseconds) +{ + OSLockMutex(&organya_mutex); + + organya_milliseconds = milliseconds; + + OSUnlockMutex(&organya_mutex); +} diff --git a/src/Backends/Controller.h b/src/Backends/Controller.h new file mode 100644 index 0000000..c2f8972 --- /dev/null +++ b/src/Backends/Controller.h @@ -0,0 +1,10 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +bool ControllerBackend_Init(void); +void ControllerBackend_Deinit(void); +bool ControllerBackend_GetJoystickStatus(bool **buttons, unsigned int *button_count, short **axes, unsigned int *axis_count); +const char* ControllerBackend_GetButtonName(unsigned int button_id); +const char* ControllerBackend_GetControllerName(void); \ No newline at end of file diff --git a/src/Backends/Controller/3DS.cpp b/src/Backends/Controller/3DS.cpp new file mode 100644 index 0000000..42b4233 --- /dev/null +++ b/src/Backends/Controller/3DS.cpp @@ -0,0 +1,97 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Controller.h" + +#include + +#include <3ds.h> + +bool ControllerBackend_Init(void) +{ + return true; +} + +void ControllerBackend_Deinit(void) +{ + +} + +bool ControllerBackend_GetJoystickStatus(bool **buttons, unsigned int *button_count, short **axes, unsigned int *axis_count) +{ + static bool button_buffer[22]; + + *buttons = button_buffer; + *axes = NULL; + + *button_count = sizeof(button_buffer) / sizeof(button_buffer[0]); + *axis_count = 0; + + // Read controller + hidScanInput(); + + u32 hid_buttons = hidKeysHeld(); + + // Handle button inputs + button_buffer[0] = hid_buttons & KEY_Y; // Shoot + button_buffer[1] = hid_buttons & KEY_B; // Jump + button_buffer[2] = hid_buttons & KEY_X; // Map + button_buffer[3] = hid_buttons & KEY_L; // Weapon left + button_buffer[4] = hid_buttons & KEY_R; // Weapon right + button_buffer[5] = hid_buttons & KEY_A; // Inventory + button_buffer[6] = hid_buttons & KEY_START; // Pause + button_buffer[7] = hid_buttons & KEY_CPAD_UP; // Up + button_buffer[8] = hid_buttons & KEY_CPAD_DOWN; // Down + button_buffer[9] = hid_buttons & KEY_CPAD_LEFT; // Left + button_buffer[10] = hid_buttons & KEY_CPAD_RIGHT;// Right + button_buffer[11] = hid_buttons & KEY_ZL; + button_buffer[12] = hid_buttons & KEY_ZR; + button_buffer[13] = hid_buttons & KEY_SELECT; + button_buffer[14] = hid_buttons & KEY_DLEFT; + button_buffer[15] = hid_buttons & KEY_DRIGHT; + button_buffer[16] = hid_buttons & KEY_DUP; + button_buffer[17] = hid_buttons & KEY_DDOWN; + button_buffer[18] = hid_buttons & KEY_CSTICK_LEFT; + button_buffer[19] = hid_buttons & KEY_CSTICK_RIGHT; + button_buffer[20] = hid_buttons & KEY_CSTICK_UP; + button_buffer[21] = hid_buttons & KEY_CSTICK_DOWN; + + return true; +} + +const char* ControllerBackend_GetButtonName(unsigned int button_id) +{ + const char *button_names[22] = { + "Y", + "B", + "X", + "L", + "R", + "A", + "Start", + "Circle Pad Up", + "Circle Pad Down", + "Circle Pad Left", + "Circle Pad Right", + "ZL", + "ZR", + "Select", + "D-Pad Left", + "D-Pad Right", + "D-Pad Up", + "D-Pad Down", + "C-Stick Left", + "C-Stick Right", + "C-Stick Up", + "C-Stick Down" + }; + + if (button_id >= sizeof(button_names) / sizeof(button_names[0])) + return "Unknown"; + + return button_names[button_id]; +} + +const char* ControllerBackend_GetControllerName(void){ + return ""; +} \ No newline at end of file diff --git a/src/Backends/Controller/GLFW3.cpp b/src/Backends/Controller/GLFW3.cpp new file mode 100644 index 0000000..b040c58 --- /dev/null +++ b/src/Backends/Controller/GLFW3.cpp @@ -0,0 +1,186 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Controller.h" + +#include +#include +#include + +#define GLFW_INCLUDE_NONE +#include + +#include "../Misc.h" + +#define DEADZONE (10000.0f / 32767.0f) + +static bool joystick_connected; +static int connected_joystick_id; + +static float *axis_neutrals; + +static void JoystickCallback(int joystick_id, int event) +{ + switch (event) + { + case GLFW_CONNECTED: + Backend_PrintInfo("Joystick #%d connected - %s", joystick_id, glfwGetJoystickName(joystick_id)); + + if (!joystick_connected) + { + int total_axes; + const float *axes = glfwGetJoystickAxes(joystick_id, &total_axes); + + int total_buttons; + const unsigned char *buttons = glfwGetJoystickButtons(joystick_id, &total_buttons); + + if (total_buttons >= 6) + { +#if GLFW_VERSION_MAJOR > 3 || (GLFW_VERSION_MAJOR == 3 && GLFW_VERSION_MINOR >= 3) + if (glfwJoystickIsGamepad(joystick_id) == GLFW_TRUE) // Avoid selecting things like laptop touchpads +#endif + { + // Set up neutral axes + axis_neutrals = (float*)malloc(sizeof(float) * total_axes); + + if (axis_neutrals != NULL) + { + for (int i = 0; i < total_axes; ++i) + axis_neutrals[i] = axes[i]; + + Backend_PrintInfo("Joystick #%d selected\n", joystick_id); + joystick_connected = true; + connected_joystick_id = joystick_id; + } + else + { + Backend_PrintError("Couldn't allocate memory for joystick axes"); + } + } + } + } + + break; + + case GLFW_DISCONNECTED: + if (joystick_connected && joystick_id == connected_joystick_id) + { + Backend_PrintInfo("Joystick #%d disconnected", connected_joystick_id); + joystick_connected = false; + + free(axis_neutrals); + } + + break; + } +} + +bool ControllerBackend_Init(void) +{ + // Connect joysticks that are already plugged-in + for (int i = GLFW_JOYSTICK_1; i < GLFW_JOYSTICK_LAST; ++i) + if (glfwJoystickPresent(i) == GLFW_TRUE) + JoystickCallback(i, GLFW_CONNECTED); + + // Set-up the callback for future (dis)connections + glfwSetJoystickCallback(JoystickCallback); + + return true; +} + +void ControllerBackend_Deinit(void) +{ + glfwSetJoystickCallback(NULL); + + joystick_connected = false; + connected_joystick_id = 0; + + free(axis_neutrals); + axis_neutrals = NULL; +} + +bool ControllerBackend_GetJoystickStatus(bool **buttons, unsigned int *button_count, short **axes, unsigned int *axis_count) +{ + if (!joystick_connected) + return false; + + int total_glfw_buttons; + const unsigned char *glfw_buttons = glfwGetJoystickButtons(connected_joystick_id, &total_glfw_buttons); + + int total_glfw_axes; + const float *glfw_axes = glfwGetJoystickAxes(connected_joystick_id, &total_glfw_axes); + + int total_glfw_hats = 0; +#if GLFW_VERSION_MAJOR > 3 || (GLFW_VERSION_MAJOR == 3 && GLFW_VERSION_MINOR >= 3) + const unsigned char *glfw_hats = glfwGetJoystickHats(connected_joystick_id, &total_glfw_hats); +#endif + + *button_count = total_glfw_buttons + total_glfw_axes * 2 + total_glfw_hats * 4; + *axis_count = total_glfw_axes; + + static bool *button_buffer = NULL; + static short *axis_buffer = NULL; + + bool *new_button_buffer = (bool*)realloc(button_buffer, *button_count * sizeof(bool)); + short *new_axis_buffer = (short*)realloc(axis_buffer, *axis_count * sizeof(short)); + + if (new_button_buffer == NULL || new_axis_buffer == NULL) + return false; + + button_buffer = new_button_buffer; + axis_buffer = new_axis_buffer; + + ////////////////////////// + // Handle button inputs // + ////////////////////////// + + unsigned int current_button = 0; + + // Start with the joystick buttons + for (int i = 0; i < total_glfw_buttons; ++i) + button_buffer[current_button++] = glfw_buttons[i] == GLFW_PRESS; + + // Then the joystick axes + for (int i = 0; i < total_glfw_axes; ++i) + { + button_buffer[current_button++] = glfw_axes[i] < axis_neutrals[i] - DEADZONE; + button_buffer[current_button++] = glfw_axes[i] > axis_neutrals[i] + DEADZONE; + } + +#if GLFW_VERSION_MAJOR > 3 || (GLFW_VERSION_MAJOR == 3 && GLFW_VERSION_MINOR >= 3) + // Then the joystick hats + for (int i = 0; i < total_glfw_hats; ++i) + { + button_buffer[current_button++] = glfw_hats[i] & GLFW_HAT_UP; + button_buffer[current_button++] = glfw_hats[i] & GLFW_HAT_RIGHT; + button_buffer[current_button++] = glfw_hats[i] & GLFW_HAT_DOWN; + button_buffer[current_button++] = glfw_hats[i] & GLFW_HAT_LEFT; + } +#endif + + *buttons = button_buffer; + + //////////////////////// + // Handle axis inputs // + //////////////////////// + + for (int i = 0; i < total_glfw_axes; ++i) + axis_buffer[i] = (short)(glfw_axes[i] * 0x7FFF); + + *axes = axis_buffer; + + return true; +} + +const char* ControllerBackend_GetButtonName(unsigned int button_id) +{ + static char name_buffer[0x10]; + + snprintf(name_buffer, sizeof(name_buffer), "Button #%d", button_id); + + return name_buffer; +} + +const char* ControllerBackend_GetControllerName(void){ + return glfwGetJoystickName(connected_joystick_id); +} \ No newline at end of file diff --git a/src/Backends/Controller/Null.cpp b/src/Backends/Controller/Null.cpp new file mode 100644 index 0000000..ce585cb --- /dev/null +++ b/src/Backends/Controller/Null.cpp @@ -0,0 +1,29 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Controller.h" + +bool ControllerBackend_Init(void) +{ + return false; +} + +void ControllerBackend_Deinit(void) +{ + +} + +bool ControllerBackend_GetJoystickStatus(bool **buttons, unsigned int *button_count, short **axes, unsigned int *axis_count) +{ + (void)buttons; + (void)button_count; + (void)axes; + (void)axis_count; + + return false; +} + +const char* ControllerBackend_GetButtonName(unsigned int button_id) +{ + return "Null"; +} diff --git a/src/Backends/Controller/SDL.cpp b/src/Backends/Controller/SDL.cpp new file mode 100644 index 0000000..916b061 --- /dev/null +++ b/src/Backends/Controller/SDL.cpp @@ -0,0 +1,245 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Controller.h" + +#include +#include +#include + +#include "SDL.h" + +#include "../Misc.h" +#include "../Shared/SDL.h" + +#define DEADZONE 10000 + +static SDL_Joystick *joystick; + +static Sint16 *axis_neutrals; + +bool ControllerBackend_Init(void) +{ + if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) + { + Backend_PrintError("Couldn't initialise joystick SDL subsystem: %s", SDL_GetError()); + return false; + } + +#if !SDL_VERSION_ATLEAST(2, 0, 0) + if (SDL_NumJoysticks() > 0) + ControllerBackend_JoystickConnect(0); +#endif + + return true; +} + +void ControllerBackend_Deinit(void) +{ + if (joystick != NULL) + { + SDL_JoystickClose(joystick); + joystick = NULL; + } + + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); +} + +bool ControllerBackend_GetJoystickStatus(bool **buttons, unsigned int *button_count, short **axes, unsigned int *axis_count) +{ + if (joystick == NULL) + return false; + + int total_sdl_buttons = SDL_JoystickNumButtons(joystick); + if (total_sdl_buttons < 0) + { + total_sdl_buttons = 0; + Backend_PrintError("Failed to get number of buttons on joystick: %s", SDL_GetError()); + } + + int total_sdl_axes = SDL_JoystickNumAxes(joystick); + if (total_sdl_axes < 0) + { + total_sdl_axes = 0; + Backend_PrintError("Failed to get number of general axis controls on joystick: %s", SDL_GetError()); + } + + int total_sdl_hats = SDL_JoystickNumHats(joystick); + if (total_sdl_hats < 0) + { + total_sdl_hats = 0; + Backend_PrintError("Failed to get number of POV hats on joystick: %s", SDL_GetError()); + } + + *button_count = total_sdl_buttons + total_sdl_axes * 2 + total_sdl_hats * 4; + *axis_count = total_sdl_axes; + + static bool *button_buffer = NULL; + static short *axis_buffer = NULL; + + bool *new_button_buffer = (bool*)realloc(button_buffer, *button_count * sizeof(bool)); + + if (new_button_buffer == NULL) + return false; + + button_buffer = new_button_buffer; + + if (*axis_count == 0) + return true; + + short *new_axis_buffer = (short*)realloc(axis_buffer, *axis_count * sizeof(short)); + + if (new_button_buffer == NULL) + return false; + + if (new_axis_buffer == NULL) + return false; + + axis_buffer = new_axis_buffer; + + ////////////////////////// + // Handle button inputs // + ////////////////////////// + + unsigned int current_button = 0; + + // Start with the joystick buttons + for (int i = 0; i < total_sdl_buttons; ++i) + button_buffer[current_button++] = SDL_JoystickGetButton(joystick, i); + + // Then the joystick axes + for (int i = 0; i < total_sdl_axes; ++i) + { + Sint16 axis = SDL_JoystickGetAxis(joystick, i); + + button_buffer[current_button++] = axis < axis_neutrals[i] - DEADZONE; + button_buffer[current_button++] = axis > axis_neutrals[i] + DEADZONE; + } + + // Then the joystick hats + for (int i = 0; i < total_sdl_hats; ++i) + { + Uint8 hat = SDL_JoystickGetHat(joystick, i); + + button_buffer[current_button++] = hat == SDL_HAT_UP || hat == SDL_HAT_LEFTUP || hat == SDL_HAT_RIGHTUP; + button_buffer[current_button++] = hat == SDL_HAT_RIGHT || hat == SDL_HAT_RIGHTUP || hat == SDL_HAT_RIGHTDOWN; + button_buffer[current_button++] = hat == SDL_HAT_DOWN || hat == SDL_HAT_LEFTDOWN || hat == SDL_HAT_RIGHTDOWN; + button_buffer[current_button++] = hat == SDL_HAT_LEFT || hat == SDL_HAT_LEFTUP || hat == SDL_HAT_LEFTDOWN; + } + + *buttons = button_buffer; + + //////////////////////// + // Handle axis inputs // + //////////////////////// + + for (int i = 0; i < total_sdl_axes; ++i) + axis_buffer[i] = SDL_JoystickGetAxis(joystick, i); + + *axes = axis_buffer; + + return true; +} + +void ControllerBackend_JoystickConnect(Sint32 joystick_id) +{ +#if SDL_VERSION_ATLEAST(2, 0, 0) + const char *joystick_name = SDL_JoystickNameForIndex(joystick_id); +#else + const char *joystick_name = SDL_JoystickName(joystick_id); +#endif + + if (joystick_name != NULL) + { + Backend_PrintInfo("Joystick #%d connected - %s", joystick_id, joystick_name); + } + else + { + Backend_PrintError("Couldn't get joystick name: %s", SDL_GetError()); + Backend_PrintInfo("Joystick #%d connected - Name unknown", joystick_id); + } + + if (joystick == NULL) + { + joystick = SDL_JoystickOpen(joystick_id); + + if (joystick != NULL) + { + int total_axes = SDL_JoystickNumAxes(joystick); + if (total_axes < 0) + Backend_PrintError("Couldn't get number of general axis control on connected joystick: %s", SDL_GetError()); + + int total_buttons = SDL_JoystickNumButtons(joystick); + if (total_buttons < 0) + Backend_PrintError("Couldn't get number of buttons on connected joystick: %s", SDL_GetError()); + + if (total_buttons >= 6) + { + Backend_PrintInfo("Joystick #%d selected", joystick_id); + + // Set up neutral axes + axis_neutrals = (Sint16*)malloc(sizeof(Sint16) * total_axes); + + if (axis_neutrals != NULL) + { + for (int i = 0; i < total_axes; ++i) + axis_neutrals[i] = SDL_JoystickGetAxis(joystick, i); + + return; + } + else + { + Backend_PrintError("Couldn't allocate memory for neutral axes"); + } + } + + SDL_JoystickClose(joystick); + joystick = NULL; + } + else + { + Backend_PrintError("Couldn't open joystick for use: %s", SDL_GetError()); + } + } +} + +void ControllerBackend_JoystickDisconnect(Sint32 joystick_id) +{ +#if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_JoystickID current_joystick_id = SDL_JoystickInstanceID(joystick); + if (current_joystick_id < 0) + Backend_PrintError("Couldn't get instance ID for current joystick: %s", SDL_GetError()); + + if (joystick_id == current_joystick_id) + { + Backend_PrintInfo("Joystick #%d disconnected", joystick_id); + SDL_JoystickClose(joystick); + joystick = NULL; + + free(axis_neutrals); + } +#endif +} + +const char* ControllerBackend_GetButtonName(unsigned int button_id) +{ + static char name_buffer[0x10]; + + snprintf(name_buffer, sizeof(name_buffer), "Button #%d", button_id); + + return name_buffer; +} + +const char* ControllerBackend_GetControllerName(void){ + if (joystick != NULL){ + const char* joy_name = SDL_JoystickName(joystick); + + if(joy_name == NULL){ + return "Unknown Gamepad"; + } + + return joy_name; + } + + return "No Controller Attached"; +} \ No newline at end of file diff --git a/src/Backends/Controller/WiiU.cpp b/src/Backends/Controller/WiiU.cpp new file mode 100644 index 0000000..aca62ad --- /dev/null +++ b/src/Backends/Controller/WiiU.cpp @@ -0,0 +1,173 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Controller.h" + +#include + +#include +#include + +bool ControllerBackend_Init(void) +{ + VPADInit(); + + WPADInit(); + KPADInit(); + + // Enable Wii U Pro Controllers to be connected + WPADEnableURCC(1); + + return true; +} + +void ControllerBackend_Deinit(void) +{ + WPADShutdown(); + + VPADShutdown(); +} + +bool ControllerBackend_GetJoystickStatus(bool **buttons, unsigned int *button_count, short **axes, unsigned int *axis_count) +{ + static bool button_buffer[27]; + static short axis_buffer[4]; + + *buttons = button_buffer; + *axes = axis_buffer; + + *button_count = sizeof(button_buffer) / sizeof(button_buffer[0]); + *axis_count = sizeof(axis_buffer) / sizeof(axis_buffer[0]); + + memset(button_buffer, 0, sizeof(button_buffer)); + memset(axis_buffer, 0, sizeof(axis_buffer)); + + ////////////////// + // Read gamepad // + ////////////////// + + static uint32_t vpad_buttons; + + VPADStatus vpad_status; + if (VPADRead(VPAD_CHAN_0, &vpad_status, 1, NULL) == 1) + vpad_buttons = vpad_status.hold; + + // Handle button inputs + button_buffer[0] |= vpad_buttons & VPAD_BUTTON_Y; // Shoot + button_buffer[1] |= vpad_buttons & VPAD_BUTTON_B; // Jump + button_buffer[2] |= vpad_buttons & VPAD_BUTTON_X; // Map + button_buffer[3] |= vpad_buttons & VPAD_BUTTON_ZL; // Weapon left + button_buffer[4] |= vpad_buttons & VPAD_BUTTON_ZR; // Weapon right + button_buffer[5] |= vpad_buttons & VPAD_BUTTON_A; // Inventory + button_buffer[6] |= vpad_buttons & VPAD_BUTTON_PLUS; // Pause + button_buffer[7] |= vpad_buttons & VPAD_STICK_L_EMULATION_UP; // Up + button_buffer[8] |= vpad_buttons & VPAD_STICK_L_EMULATION_DOWN; // Down + button_buffer[9] |= vpad_buttons & VPAD_STICK_L_EMULATION_LEFT; // Left + button_buffer[10] |= vpad_buttons & VPAD_STICK_L_EMULATION_RIGHT;// Right + button_buffer[11] |= vpad_buttons & VPAD_BUTTON_L; + button_buffer[12] |= vpad_buttons & VPAD_BUTTON_R; + button_buffer[13] |= vpad_buttons & VPAD_BUTTON_MINUS; + button_buffer[14] |= vpad_buttons & VPAD_BUTTON_HOME; + button_buffer[15] |= vpad_buttons & VPAD_BUTTON_SYNC; + button_buffer[16] |= vpad_buttons & VPAD_BUTTON_STICK_L; + button_buffer[17] |= vpad_buttons & VPAD_BUTTON_STICK_R; + button_buffer[18] |= vpad_buttons & VPAD_BUTTON_TV; + button_buffer[19] |= vpad_buttons & VPAD_BUTTON_LEFT; + button_buffer[20] |= vpad_buttons & VPAD_BUTTON_RIGHT; + button_buffer[21] |= vpad_buttons & VPAD_BUTTON_UP; + button_buffer[22] |= vpad_buttons & VPAD_BUTTON_DOWN; + button_buffer[23] |= vpad_buttons & VPAD_STICK_R_EMULATION_LEFT; + button_buffer[24] |= vpad_buttons & VPAD_STICK_R_EMULATION_RIGHT; + button_buffer[25] |= vpad_buttons & VPAD_STICK_R_EMULATION_UP; + button_buffer[26] |= vpad_buttons & VPAD_STICK_R_EMULATION_DOWN; + + /* + // Handle axis inputs + axis_buffer[0] = (short)(vpad_status.leftStick.x * 0x7FFF); + axis_buffer[1] = (short)(vpad_status.leftStick.y * -0x7FFF); + axis_buffer[2] = (short)(vpad_status.rightStick.x * 0x7FFF); + axis_buffer[3] = (short)(vpad_status.rightStick.y * -0x7FFF); + */ + + /////////////////////////////// + // Read Wii U Pro Controller // + /////////////////////////////// + static uint32_t kpad_buttons; + + KPADStatus kpad_status; + if (KPADRead(WPAD_CHAN_0, &kpad_status, 1) == 1) + kpad_buttons = kpad_status.pro.hold; + + // Handle button inputs + button_buffer[0] |= kpad_buttons & WPAD_PRO_BUTTON_Y; // Shoot + button_buffer[1] |= kpad_buttons & WPAD_PRO_BUTTON_B; // Jump + button_buffer[2] |= kpad_buttons & WPAD_PRO_BUTTON_X; // Map + button_buffer[3] |= kpad_buttons & WPAD_PRO_TRIGGER_ZL; // Weapon left + button_buffer[4] |= kpad_buttons & WPAD_PRO_TRIGGER_ZR; // Weapon right + button_buffer[5] |= kpad_buttons & WPAD_PRO_BUTTON_A; // Inventory + button_buffer[6] |= kpad_buttons & WPAD_PRO_BUTTON_PLUS; // Pause + button_buffer[7] |= kpad_buttons & WPAD_PRO_STICK_L_EMULATION_UP; // Up + button_buffer[8] |= kpad_buttons & WPAD_PRO_STICK_L_EMULATION_DOWN; // Down + button_buffer[9] |= kpad_buttons & WPAD_PRO_STICK_L_EMULATION_LEFT; // Left + button_buffer[10] |= kpad_buttons & WPAD_PRO_STICK_L_EMULATION_RIGHT;// Right + button_buffer[11] |= kpad_buttons & WPAD_PRO_TRIGGER_L; + button_buffer[12] |= kpad_buttons & WPAD_PRO_TRIGGER_R; + button_buffer[13] |= kpad_buttons & WPAD_PRO_BUTTON_MINUS; + button_buffer[14] |= kpad_buttons & WPAD_PRO_BUTTON_HOME; +// button_buffer[15] |= kpad_buttons & WPAD_PRO_BUTTON_SYNC; + button_buffer[16] |= kpad_buttons & WPAD_PRO_BUTTON_STICK_L; + button_buffer[17] |= kpad_buttons & WPAD_PRO_BUTTON_STICK_R; +// button_buffer[18] |= kpad_buttons & WPAD_PRO_BUTTON_TV; + button_buffer[19] |= kpad_buttons & WPAD_PRO_BUTTON_LEFT; + button_buffer[20] |= kpad_buttons & WPAD_PRO_BUTTON_RIGHT; + button_buffer[21] |= kpad_buttons & WPAD_PRO_BUTTON_UP; + button_buffer[22] |= kpad_buttons & WPAD_PRO_BUTTON_DOWN; + button_buffer[23] |= kpad_buttons & WPAD_PRO_STICK_R_EMULATION_LEFT; + button_buffer[24] |= kpad_buttons & WPAD_PRO_STICK_R_EMULATION_RIGHT; + button_buffer[25] |= kpad_buttons & WPAD_PRO_STICK_R_EMULATION_UP; + button_buffer[26] |= kpad_buttons & WPAD_PRO_STICK_R_EMULATION_DOWN; + + return true; +} + +const char* ControllerBackend_GetButtonName(unsigned int button_id) +{ + const char *button_names[27] = { + "Y", + "B", + "X", + "ZL", + "ZR", + "A", + "+", + "Left Stick Up", + "Left Stick Down", + "Left Stick Left", + "Left Stick Right", + "L", + "R", + "-", + "Home", + "Sync", + "Left Stick Button", + "Right Stick Button", + "TV", + "D-Pad Left", + "D-Pad Right", + "D-Pad Up", + "D-Pad Down", + "Right Stick Left", + "Right Stick Right", + "Right Stick Up", + "Right Stick Down" + }; + + if (button_id >= sizeof(button_names) / sizeof(button_names[0])) + return "Unknown"; + + return button_names[button_id]; +} + +const char* ControllerBackend_GetControllerName(void){ + return ""; +} \ No newline at end of file diff --git a/src/Backends/Misc.h b/src/Backends/Misc.h new file mode 100644 index 0000000..2e31bf8 --- /dev/null +++ b/src/Backends/Misc.h @@ -0,0 +1,114 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include +#include + +#include "../Attributes.h" + +enum +{ + // Based on US QWERTY + BACKEND_KEYBOARD_A, + BACKEND_KEYBOARD_B, + BACKEND_KEYBOARD_C, + BACKEND_KEYBOARD_D, + BACKEND_KEYBOARD_E, + BACKEND_KEYBOARD_F, + BACKEND_KEYBOARD_G, + BACKEND_KEYBOARD_H, + BACKEND_KEYBOARD_I, + BACKEND_KEYBOARD_J, + BACKEND_KEYBOARD_K, + BACKEND_KEYBOARD_L, + BACKEND_KEYBOARD_M, + BACKEND_KEYBOARD_N, + BACKEND_KEYBOARD_O, + BACKEND_KEYBOARD_P, + BACKEND_KEYBOARD_Q, + BACKEND_KEYBOARD_R, + BACKEND_KEYBOARD_S, + BACKEND_KEYBOARD_T, + BACKEND_KEYBOARD_U, + BACKEND_KEYBOARD_V, + BACKEND_KEYBOARD_W, + BACKEND_KEYBOARD_X, + BACKEND_KEYBOARD_Y, + BACKEND_KEYBOARD_Z, + BACKEND_KEYBOARD_0, + BACKEND_KEYBOARD_1, + BACKEND_KEYBOARD_2, + BACKEND_KEYBOARD_3, + BACKEND_KEYBOARD_4, + BACKEND_KEYBOARD_5, + BACKEND_KEYBOARD_6, + BACKEND_KEYBOARD_7, + BACKEND_KEYBOARD_8, + BACKEND_KEYBOARD_9, + BACKEND_KEYBOARD_F1, + BACKEND_KEYBOARD_F2, + BACKEND_KEYBOARD_F3, + BACKEND_KEYBOARD_F4, + BACKEND_KEYBOARD_F5, + BACKEND_KEYBOARD_F6, + BACKEND_KEYBOARD_F7, + BACKEND_KEYBOARD_F8, + BACKEND_KEYBOARD_F9, + BACKEND_KEYBOARD_F10, + BACKEND_KEYBOARD_F11, + BACKEND_KEYBOARD_F12, + BACKEND_KEYBOARD_UP, + BACKEND_KEYBOARD_DOWN, + BACKEND_KEYBOARD_LEFT, + BACKEND_KEYBOARD_RIGHT, + BACKEND_KEYBOARD_ESCAPE, + BACKEND_KEYBOARD_BACK_QUOTE, + BACKEND_KEYBOARD_TAB, + BACKEND_KEYBOARD_CAPS_LOCK, + BACKEND_KEYBOARD_LEFT_SHIFT, + BACKEND_KEYBOARD_LEFT_CTRL, + BACKEND_KEYBOARD_LEFT_ALT, + BACKEND_KEYBOARD_SPACE, + BACKEND_KEYBOARD_RIGHT_ALT, + BACKEND_KEYBOARD_RIGHT_CTRL, + BACKEND_KEYBOARD_RIGHT_SHIFT, + BACKEND_KEYBOARD_ENTER, + BACKEND_KEYBOARD_BACKSPACE, + BACKEND_KEYBOARD_MINUS, + BACKEND_KEYBOARD_EQUALS, + BACKEND_KEYBOARD_LEFT_BRACKET, + BACKEND_KEYBOARD_RIGHT_BRACKET, + BACKEND_KEYBOARD_BACK_SLASH, + BACKEND_KEYBOARD_SEMICOLON, + BACKEND_KEYBOARD_APOSTROPHE, + BACKEND_KEYBOARD_COMMA, + BACKEND_KEYBOARD_PERIOD, + BACKEND_KEYBOARD_FORWARD_SLASH, + BACKEND_KEYBOARD_TOTAL +}; + +typedef struct Backend_DisplayMode +{ + unsigned int width; + unsigned int height; + unsigned int refresh_rate; +} Backend_DisplayMode; + +bool Backend_Init(void (*drag_and_drop_callback)(const char *path), void (*window_focus_callback)(bool focus)); +void Backend_Deinit(void); +void Backend_PostWindowCreation(void); +bool Backend_GetPaths(std::string *module_path, std::string *data_path); +void Backend_HideMouse(void); +void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t height); +void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height); +void Backend_EnableDragAndDrop(void); +bool Backend_SystemTask(bool active); +void Backend_GetKeyboardState(bool *keyboard_state); +void Backend_ShowMessageBox(const char *title, const char *message); +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintError(const char *format, ...); +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintInfo(const char *format, ...); +unsigned long Backend_GetTicks(void); +void Backend_Delay(unsigned int ticks); +void Backend_GetDisplayMode(Backend_DisplayMode *display_mode); diff --git a/src/Backends/Platform/3DS.cpp b/src/Backends/Platform/3DS.cpp new file mode 100644 index 0000000..4fa1a4b --- /dev/null +++ b/src/Backends/Platform/3DS.cpp @@ -0,0 +1,143 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Misc.h" + +#include +#include +#include +#include + +#include +#include + +#include <3ds.h> + +bool Backend_Init(void (*drag_and_drop_callback)(const char *path), void (*window_focus_callback)(bool focus)) +{ + (void)drag_and_drop_callback; + (void)window_focus_callback; + + gfxInitDefault(); + consoleInit(GFX_BOTTOM, NULL); + + if (R_SUCCEEDED(romfsInit())) + { +// osSetSpeedupEnable(true); // Enable New3DS speedup, since this doesn't run very well on Old3DSs yet + + return true; + } + else + { + Backend_PrintError("Could not initialise romfs"); + } + + return false; +} + +void Backend_Deinit(void) +{ + romfsExit(); + + gfxExit(); +} + +void Backend_PostWindowCreation(void) +{ + // Nothing to do here +} + +bool Backend_GetPaths(std::string *module_path, std::string *data_path) +{ + // Create the CSE2 folder if it doesn't already exist + mkdir("sdmc:/3ds", 0777); + mkdir("sdmc:/3ds/data", 0777); + mkdir("sdmc:/3ds/data/cse2", 0777); + + // Configuration files and save data goes on the read-write SD card + *module_path = "sdmc:/3ds/data/cse2"; + + // Data goes in the read-only ROMFS + *data_path = "romfs:"; + + return true; +} + +void Backend_HideMouse(void) +{ + +} + +void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t height) +{ + (void)rgb_pixels; + (void)width; + (void)height; +} + +void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height) +{ + (void)rgba_pixels; + (void)width; + (void)height; +} + +void Backend_EnableDragAndDrop(void) +{ + +} + +bool Backend_SystemTask(bool active) +{ + (void)active; + + return true; +} + +void Backend_GetKeyboardState(bool *keyboard_state) +{ + memset(keyboard_state, 0, sizeof(bool) * BACKEND_KEYBOARD_TOTAL); +} + +void Backend_ShowMessageBox(const char *title, const char *message) +{ + Backend_PrintInfo("ShowMessageBox - %s - %s", title, message); +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintError(const char *format, ...) +{ + va_list argumentList; + va_start(argumentList, format); + fputs("ERROR: ", stderr); + vfprintf(stderr, format, argumentList); + fputc('\n', stderr); + va_end(argumentList); +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintInfo(const char *format, ...) +{ + va_list argumentList; + va_start(argumentList, format); + fputs("INFO: ", stdout); + vfprintf(stdout, format, argumentList); + fputc('\n', stdout); + va_end(argumentList); +} + +unsigned long Backend_GetTicks(void) +{ + return svcGetSystemTick() / CPU_TICKS_PER_MSEC; +} + +void Backend_Delay(unsigned int ticks) +{ + // svcSleepThread measures in nanoseconds + svcSleepThread(ticks * 1000000); +} + +void Backend_GetDisplayMode(Backend_DisplayMode *display_mode) +{ + display_mode->width = 400; + display_mode->height = 240; + display_mode->refresh_rate = 60; +} diff --git a/src/Backends/Platform/GLFW3.cpp b/src/Backends/Platform/GLFW3.cpp new file mode 100644 index 0000000..10b0c3e --- /dev/null +++ b/src/Backends/Platform/GLFW3.cpp @@ -0,0 +1,320 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Misc.h" + +#include +#include +#include +#include +#include +#include + +#if __cplusplus >= 201103L + #include + #include +#elif defined(_WIN32) + #include "windows.h" +#else + #include +#endif + +#include + +#include "../Rendering.h" +#include "../Shared/GLFW3.h" +#include "../../Attributes.h" + +#define DO_KEY(GLFW_KEY, BACKEND_KEY) \ + case GLFW_KEY: \ + keyboard_state[BACKEND_KEY] = action == GLFW_PRESS; \ + break; + +static bool keyboard_state[BACKEND_KEYBOARD_TOTAL]; + +static GLFWcursor* cursor; + +static void (*drag_and_drop_callback)(const char *path); +static void (*window_focus_callback)(bool focus); + +static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) +{ + (void)window; + (void)scancode; + (void)mods; + + switch (action) + { + case GLFW_RELEASE: + case GLFW_PRESS: + switch (key) + { + DO_KEY(GLFW_KEY_A, BACKEND_KEYBOARD_A) + DO_KEY(GLFW_KEY_B, BACKEND_KEYBOARD_B) + DO_KEY(GLFW_KEY_C, BACKEND_KEYBOARD_C) + DO_KEY(GLFW_KEY_D, BACKEND_KEYBOARD_D) + DO_KEY(GLFW_KEY_E, BACKEND_KEYBOARD_E) + DO_KEY(GLFW_KEY_F, BACKEND_KEYBOARD_F) + DO_KEY(GLFW_KEY_G, BACKEND_KEYBOARD_G) + DO_KEY(GLFW_KEY_H, BACKEND_KEYBOARD_H) + DO_KEY(GLFW_KEY_I, BACKEND_KEYBOARD_I) + DO_KEY(GLFW_KEY_J, BACKEND_KEYBOARD_J) + DO_KEY(GLFW_KEY_K, BACKEND_KEYBOARD_K) + DO_KEY(GLFW_KEY_L, BACKEND_KEYBOARD_L) + DO_KEY(GLFW_KEY_M, BACKEND_KEYBOARD_M) + DO_KEY(GLFW_KEY_N, BACKEND_KEYBOARD_N) + DO_KEY(GLFW_KEY_O, BACKEND_KEYBOARD_O) + DO_KEY(GLFW_KEY_P, BACKEND_KEYBOARD_P) + DO_KEY(GLFW_KEY_Q, BACKEND_KEYBOARD_Q) + DO_KEY(GLFW_KEY_R, BACKEND_KEYBOARD_R) + DO_KEY(GLFW_KEY_S, BACKEND_KEYBOARD_S) + DO_KEY(GLFW_KEY_T, BACKEND_KEYBOARD_T) + DO_KEY(GLFW_KEY_U, BACKEND_KEYBOARD_U) + DO_KEY(GLFW_KEY_V, BACKEND_KEYBOARD_V) + DO_KEY(GLFW_KEY_W, BACKEND_KEYBOARD_W) + DO_KEY(GLFW_KEY_X, BACKEND_KEYBOARD_X) + DO_KEY(GLFW_KEY_Y, BACKEND_KEYBOARD_Y) + DO_KEY(GLFW_KEY_Z, BACKEND_KEYBOARD_Z) + DO_KEY(GLFW_KEY_0, BACKEND_KEYBOARD_0) + DO_KEY(GLFW_KEY_1, BACKEND_KEYBOARD_1) + DO_KEY(GLFW_KEY_2, BACKEND_KEYBOARD_2) + DO_KEY(GLFW_KEY_3, BACKEND_KEYBOARD_3) + DO_KEY(GLFW_KEY_4, BACKEND_KEYBOARD_4) + DO_KEY(GLFW_KEY_5, BACKEND_KEYBOARD_5) + DO_KEY(GLFW_KEY_6, BACKEND_KEYBOARD_6) + DO_KEY(GLFW_KEY_7, BACKEND_KEYBOARD_7) + DO_KEY(GLFW_KEY_8, BACKEND_KEYBOARD_8) + DO_KEY(GLFW_KEY_9, BACKEND_KEYBOARD_9) + DO_KEY(GLFW_KEY_F1, BACKEND_KEYBOARD_F1) + DO_KEY(GLFW_KEY_F2, BACKEND_KEYBOARD_F2) + DO_KEY(GLFW_KEY_F3, BACKEND_KEYBOARD_F3) + DO_KEY(GLFW_KEY_F4, BACKEND_KEYBOARD_F4) + DO_KEY(GLFW_KEY_F5, BACKEND_KEYBOARD_F5) + DO_KEY(GLFW_KEY_F6, BACKEND_KEYBOARD_F6) + DO_KEY(GLFW_KEY_F7, BACKEND_KEYBOARD_F7) + DO_KEY(GLFW_KEY_F8, BACKEND_KEYBOARD_F8) + DO_KEY(GLFW_KEY_F9, BACKEND_KEYBOARD_F9) + DO_KEY(GLFW_KEY_F10, BACKEND_KEYBOARD_F10) + DO_KEY(GLFW_KEY_F11, BACKEND_KEYBOARD_F11) + DO_KEY(GLFW_KEY_F12, BACKEND_KEYBOARD_F12) + DO_KEY(GLFW_KEY_UP, BACKEND_KEYBOARD_UP) + DO_KEY(GLFW_KEY_DOWN, BACKEND_KEYBOARD_DOWN) + DO_KEY(GLFW_KEY_LEFT, BACKEND_KEYBOARD_LEFT) + DO_KEY(GLFW_KEY_RIGHT, BACKEND_KEYBOARD_RIGHT) + DO_KEY(GLFW_KEY_ESCAPE, BACKEND_KEYBOARD_ESCAPE) + DO_KEY(GLFW_KEY_GRAVE_ACCENT, BACKEND_KEYBOARD_BACK_QUOTE) + DO_KEY(GLFW_KEY_TAB, BACKEND_KEYBOARD_TAB) + DO_KEY(GLFW_KEY_CAPS_LOCK, BACKEND_KEYBOARD_CAPS_LOCK) + DO_KEY(GLFW_KEY_LEFT_SHIFT, BACKEND_KEYBOARD_LEFT_SHIFT) + DO_KEY(GLFW_KEY_LEFT_CONTROL, BACKEND_KEYBOARD_LEFT_CTRL) + DO_KEY(GLFW_KEY_LEFT_ALT, BACKEND_KEYBOARD_LEFT_ALT) + DO_KEY(GLFW_KEY_SPACE, BACKEND_KEYBOARD_SPACE) + DO_KEY(GLFW_KEY_RIGHT_ALT, BACKEND_KEYBOARD_RIGHT_ALT) + DO_KEY(GLFW_KEY_RIGHT_CONTROL, BACKEND_KEYBOARD_RIGHT_CTRL) + DO_KEY(GLFW_KEY_RIGHT_SHIFT, BACKEND_KEYBOARD_RIGHT_SHIFT) + DO_KEY(GLFW_KEY_ENTER, BACKEND_KEYBOARD_ENTER) + DO_KEY(GLFW_KEY_BACKSPACE, BACKEND_KEYBOARD_BACKSPACE) + DO_KEY(GLFW_KEY_MINUS, BACKEND_KEYBOARD_MINUS) + DO_KEY(GLFW_KEY_EQUAL, BACKEND_KEYBOARD_EQUALS) + DO_KEY(GLFW_KEY_LEFT_BRACKET, BACKEND_KEYBOARD_LEFT_BRACKET) + DO_KEY(GLFW_KEY_RIGHT_BRACKET, BACKEND_KEYBOARD_RIGHT_BRACKET) + DO_KEY(GLFW_KEY_BACKSLASH, BACKEND_KEYBOARD_BACK_SLASH) + DO_KEY(GLFW_KEY_SEMICOLON, BACKEND_KEYBOARD_SEMICOLON) + DO_KEY(GLFW_KEY_APOSTROPHE, BACKEND_KEYBOARD_APOSTROPHE) + DO_KEY(GLFW_KEY_COMMA, BACKEND_KEYBOARD_COMMA) + DO_KEY(GLFW_KEY_PERIOD, BACKEND_KEYBOARD_PERIOD) + DO_KEY(GLFW_KEY_SLASH, BACKEND_KEYBOARD_FORWARD_SLASH) + + default: + break; + } + + break; + } +} + +static void WindowFocusCallback(GLFWwindow *window, int focused) +{ + (void)window; + + window_focus_callback(focused); +} + +static void WindowSizeCallback(GLFWwindow *window, int width, int height) +{ + (void)window; + + RenderBackend_HandleWindowResize(width, height); +} + +static void DragAndDropCallback(GLFWwindow *window, int count, const char **paths) +{ + (void)window; + (void)count; + + drag_and_drop_callback(paths[0]); +} + +static void ErrorCallback(int code, const char *description) +{ + Backend_PrintError("GLFW error received (%d): %s", code, description); +} + +bool Backend_Init(void (*drag_and_drop_callback_param)(const char *path), void (*window_focus_callback_param)(bool focus)) +{ + drag_and_drop_callback = drag_and_drop_callback_param; + window_focus_callback = window_focus_callback_param; + + glfwSetErrorCallback(ErrorCallback); + + if (glfwInit() == GL_TRUE) + return true; + + Backend_ShowMessageBox("Fatal error", "Could not initialise GLFW3"); + + return false; +} + +void Backend_Deinit(void) +{ + if (cursor != NULL) + glfwDestroyCursor(cursor); + + glfwTerminate(); +} + +void Backend_PostWindowCreation(void) +{ + // Hook callbacks + glfwSetKeyCallback(window, KeyCallback); + glfwSetWindowFocusCallback(window, WindowFocusCallback); + glfwSetWindowSizeCallback(window, WindowSizeCallback); +} + +bool Backend_GetPaths(std::string *module_path, std::string *data_path) +{ + (void)module_path; + (void)data_path; + + // GLFW3 doesn't seem to have a mechanism for this + return false; +} + +void Backend_HideMouse(void) +{ + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); +} + +void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t height) +{ + // Convert to RGBA, since that's the only thing GLFW3 accepts + unsigned char *rgba_pixels = (unsigned char*)malloc(width * height * 4); + + const unsigned char *rgb_pointer = rgb_pixels; + unsigned char *rgba_pointer = rgba_pixels; + + if (rgba_pixels != NULL) + { + for (size_t y = 0; y < height; ++y) + { + for (size_t x = 0; x < width; ++x) + { + *rgba_pointer++ = *rgb_pointer++; + *rgba_pointer++ = *rgb_pointer++; + *rgba_pointer++ = *rgb_pointer++; + *rgba_pointer++ = 0xFF; + } + } + + GLFWimage glfw_image = {(int)width, (int)height, rgba_pixels}; + glfwSetWindowIcon(window, 1, &glfw_image); + + free(rgba_pixels); + } +} + +void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height) +{ + GLFWimage glfw_image = {(int)width, (int)height, (unsigned char*)rgba_pixels}; + cursor = glfwCreateCursor(&glfw_image, 0, 0); + + if (cursor != NULL) + glfwSetCursor(window, cursor); +} + +void Backend_EnableDragAndDrop(void) +{ + glfwSetDropCallback(window, DragAndDropCallback); +} + +bool Backend_SystemTask(bool active) +{ + if (glfwWindowShouldClose(window)) + return false; + + if (active) + glfwPollEvents(); + else + glfwWaitEvents(); + + return true; +} + +void Backend_GetKeyboardState(bool *out_keyboard_state) +{ + memcpy(out_keyboard_state, keyboard_state, sizeof(keyboard_state)); +} + +void Backend_ShowMessageBox(const char *title, const char *message) +{ + // GLFW3 doesn't have a message box + Backend_PrintInfo("ShowMessageBox - '%s' - '%s'\n", title, message); +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintError(const char *format, ...) +{ + va_list argumentList; + va_start(argumentList, format); + fputs("ERROR: ", stderr); + vfprintf(stderr, format, argumentList); + fputc('\n', stderr); + va_end(argumentList); +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintInfo(const char *format, ...) +{ + va_list argumentList; + va_start(argumentList, format); + fputs("INFO: ", stdout); + vfprintf(stdout, format, argumentList); + fputc('\n', stdout); + va_end(argumentList); +} + +unsigned long Backend_GetTicks(void) +{ + return (unsigned long)(glfwGetTime() * 1000.0); +} + +void Backend_Delay(unsigned int ticks) +{ +#if __cplusplus >= 201103L + // GLFW3 doesn't have a delay function, so here's some butt-ugly C++11 + std::this_thread::sleep_for(std::chrono::milliseconds(ticks)); +#elif defined(_WIN32) + Sleep(ticks); +#else + usleep(ticks * 1000); +#endif +} + +void Backend_GetDisplayMode(Backend_DisplayMode *display_mode) +{ + GLFWmonitor *monitor = glfwGetPrimaryMonitor(); + + const GLFWvidmode *mode = glfwGetVideoMode(monitor); + + display_mode->width = mode->width; + display_mode->height = mode->height; + display_mode->refresh_rate = mode->refreshRate; +} diff --git a/src/Backends/Platform/Null.cpp b/src/Backends/Platform/Null.cpp new file mode 100644 index 0000000..9aeee3b --- /dev/null +++ b/src/Backends/Platform/Null.cpp @@ -0,0 +1,105 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Misc.h" + +#include + +#include "../../Attributes.h" + +bool Backend_Init(void (*drag_and_drop_callback)(const char *path), void (*window_focus_callback)(bool focus)) +{ + (void)drag_and_drop_callback; + (void)window_focus_callback; + + return true; +} + +void Backend_Deinit(void) +{ + +} + +void Backend_PostWindowCreation(void) +{ + +} + +bool Backend_GetPaths(std::string *module_path, std::string *data_path) +{ + (void)module_path; + (void)data_path; + + return false; +} + +void Backend_HideMouse(void) +{ + +} + +void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t height) +{ + (void)rgb_pixels; + (void)width; + (void)height; +} + +void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height) +{ + (void)rgba_pixels; + (void)width; + (void)height; +} + +void Backend_EnableDragAndDrop(void) +{ + +} + +bool Backend_SystemTask(bool active) +{ + (void)active; + + return true; +} + +void Backend_GetKeyboardState(bool *keyboard_state) +{ + (void)keyboard_state; +} + +void Backend_ShowMessageBox(const char *title, const char *message) +{ + (void)title; + (void)message; +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintError(const char *format, ...) +{ + (void)format; +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintInfo(const char *format, ...) +{ + (void)format; +} + +unsigned long Backend_GetTicks(void) +{ + static unsigned long fake_ticks = 0; + + fake_ticks += 1000 / 50; + + return fake_ticks; +} + +void Backend_Delay(unsigned int ticks) +{ + (void)ticks; +} + +void Backend_GetDisplayMode(Backend_DisplayMode *display_mode) +{ + (void)display_mode; +} diff --git a/src/Backends/Platform/SDL1.cpp b/src/Backends/Platform/SDL1.cpp new file mode 100644 index 0000000..affc72e --- /dev/null +++ b/src/Backends/Platform/SDL1.cpp @@ -0,0 +1,268 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Misc.h" + +#include +#include +#include +#include +#include +#include + +#include "SDL.h" + +#include "../Rendering.h" +#include "../../Attributes.h" + +#define DO_KEY(SDL_KEY, BACKEND_KEY) \ + case SDL_KEY: \ + keyboard_state[BACKEND_KEY] = event.key.type == SDL_KEYDOWN; \ + break; + +static bool keyboard_state[BACKEND_KEYBOARD_TOTAL]; + +static void (*window_focus_callback)(bool focus); + +bool Backend_Init(void (*drag_and_drop_callback_param)(const char *path), void (*window_focus_callback_param)(bool focus)) +{ + window_focus_callback = window_focus_callback_param; + + if (SDL_Init(SDL_INIT_VIDEO) == 0) + { + char driver[20]; + if (SDL_VideoDriverName(driver, 20) != NULL) + { + Backend_PrintInfo("Selected SDL video driver: %s", driver); + + return true; + } + else + { + Backend_PrintError("No SDL video driver initialized!"); + SDL_Quit(); + } + } + else + { + std::string error_message = std::string("Could not initialise SDL: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error", error_message.c_str()); + } + + return false; +} + +void Backend_Deinit(void) +{ + SDL_Quit(); +} + +void Backend_PostWindowCreation(void) +{ +} + +bool Backend_GetPaths(std::string *module_path, std::string *data_path) +{ + (void)module_path; + (void)data_path; + + return false; +} + +void Backend_HideMouse(void) +{ + SDL_ShowCursor(SDL_DISABLE); +} + +void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t height) +{ + SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)rgb_pixels, width, height, 24, width * 3, 0x0000FF, 0x00FF00, 0xFF0000, 0); + + if (surface != NULL) + { + SDL_WM_SetIcon(surface, NULL); + SDL_FreeSurface(surface); + } + else + { + Backend_PrintError("Couldn't create RGB surface for window icon: %s", SDL_GetError()); + } +} + +void Backend_SetCursor(const unsigned char *rgb_pixels, size_t width, size_t height) +{ + (void)rgb_pixels; + (void)width; + (void)height; + // SDL1 only supports black and white cursors +} + +void Backend_EnableDragAndDrop(void) +{ +} + +bool Backend_SystemTask(bool active) +{ + if (!active) + if (!SDL_WaitEvent(NULL)) + return false; + + SDL_Event event; + + while (SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_KEYUP: + case SDL_KEYDOWN: + switch (event.key.keysym.sym) + { + DO_KEY(SDLK_a, BACKEND_KEYBOARD_A) + DO_KEY(SDLK_b, BACKEND_KEYBOARD_B) + DO_KEY(SDLK_c, BACKEND_KEYBOARD_C) + DO_KEY(SDLK_d, BACKEND_KEYBOARD_D) + DO_KEY(SDLK_e, BACKEND_KEYBOARD_E) + DO_KEY(SDLK_f, BACKEND_KEYBOARD_F) + DO_KEY(SDLK_g, BACKEND_KEYBOARD_G) + DO_KEY(SDLK_h, BACKEND_KEYBOARD_H) + DO_KEY(SDLK_i, BACKEND_KEYBOARD_I) + DO_KEY(SDLK_j, BACKEND_KEYBOARD_J) + DO_KEY(SDLK_k, BACKEND_KEYBOARD_K) + DO_KEY(SDLK_l, BACKEND_KEYBOARD_L) + DO_KEY(SDLK_m, BACKEND_KEYBOARD_M) + DO_KEY(SDLK_n, BACKEND_KEYBOARD_N) + DO_KEY(SDLK_o, BACKEND_KEYBOARD_O) + DO_KEY(SDLK_p, BACKEND_KEYBOARD_P) + DO_KEY(SDLK_q, BACKEND_KEYBOARD_Q) + DO_KEY(SDLK_r, BACKEND_KEYBOARD_R) + DO_KEY(SDLK_s, BACKEND_KEYBOARD_S) + DO_KEY(SDLK_t, BACKEND_KEYBOARD_T) + DO_KEY(SDLK_u, BACKEND_KEYBOARD_U) + DO_KEY(SDLK_v, BACKEND_KEYBOARD_V) + DO_KEY(SDLK_w, BACKEND_KEYBOARD_W) + DO_KEY(SDLK_x, BACKEND_KEYBOARD_X) + DO_KEY(SDLK_y, BACKEND_KEYBOARD_Y) + DO_KEY(SDLK_z, BACKEND_KEYBOARD_Z) + DO_KEY(SDLK_0, BACKEND_KEYBOARD_0) + DO_KEY(SDLK_1, BACKEND_KEYBOARD_1) + DO_KEY(SDLK_2, BACKEND_KEYBOARD_2) + DO_KEY(SDLK_3, BACKEND_KEYBOARD_3) + DO_KEY(SDLK_4, BACKEND_KEYBOARD_4) + DO_KEY(SDLK_5, BACKEND_KEYBOARD_5) + DO_KEY(SDLK_6, BACKEND_KEYBOARD_6) + DO_KEY(SDLK_7, BACKEND_KEYBOARD_7) + DO_KEY(SDLK_8, BACKEND_KEYBOARD_8) + DO_KEY(SDLK_9, BACKEND_KEYBOARD_9) + DO_KEY(SDLK_F1, BACKEND_KEYBOARD_F1) + DO_KEY(SDLK_F2, BACKEND_KEYBOARD_F2) + DO_KEY(SDLK_F3, BACKEND_KEYBOARD_F3) + DO_KEY(SDLK_F4, BACKEND_KEYBOARD_F4) + DO_KEY(SDLK_F5, BACKEND_KEYBOARD_F5) + DO_KEY(SDLK_F6, BACKEND_KEYBOARD_F6) + DO_KEY(SDLK_F7, BACKEND_KEYBOARD_F7) + DO_KEY(SDLK_F8, BACKEND_KEYBOARD_F8) + DO_KEY(SDLK_F9, BACKEND_KEYBOARD_F9) + DO_KEY(SDLK_F10, BACKEND_KEYBOARD_F10) + DO_KEY(SDLK_F11, BACKEND_KEYBOARD_F11) + DO_KEY(SDLK_F12, BACKEND_KEYBOARD_F12) + DO_KEY(SDLK_UP, BACKEND_KEYBOARD_UP) + DO_KEY(SDLK_DOWN, BACKEND_KEYBOARD_DOWN) + DO_KEY(SDLK_LEFT, BACKEND_KEYBOARD_LEFT) + DO_KEY(SDLK_RIGHT, BACKEND_KEYBOARD_RIGHT) + DO_KEY(SDLK_ESCAPE, BACKEND_KEYBOARD_ESCAPE) + DO_KEY(SDLK_BACKQUOTE, BACKEND_KEYBOARD_BACK_QUOTE) + DO_KEY(SDLK_TAB, BACKEND_KEYBOARD_TAB) + DO_KEY(SDLK_CAPSLOCK, BACKEND_KEYBOARD_CAPS_LOCK) + DO_KEY(SDLK_LSHIFT, BACKEND_KEYBOARD_LEFT_SHIFT) + DO_KEY(SDLK_LCTRL, BACKEND_KEYBOARD_LEFT_CTRL) + DO_KEY(SDLK_LALT, BACKEND_KEYBOARD_LEFT_ALT) + DO_KEY(SDLK_SPACE, BACKEND_KEYBOARD_SPACE) + DO_KEY(SDLK_RALT, BACKEND_KEYBOARD_RIGHT_ALT) + DO_KEY(SDLK_RCTRL, BACKEND_KEYBOARD_RIGHT_CTRL) + DO_KEY(SDLK_RSHIFT, BACKEND_KEYBOARD_RIGHT_SHIFT) + DO_KEY(SDLK_RETURN, BACKEND_KEYBOARD_ENTER) + DO_KEY(SDLK_BACKSPACE, BACKEND_KEYBOARD_BACKSPACE) + DO_KEY(SDLK_MINUS, BACKEND_KEYBOARD_MINUS) + DO_KEY(SDLK_EQUALS, BACKEND_KEYBOARD_EQUALS) + DO_KEY(SDLK_LEFTBRACKET, BACKEND_KEYBOARD_LEFT_BRACKET) + DO_KEY(SDLK_RIGHTBRACKET, BACKEND_KEYBOARD_RIGHT_BRACKET) + DO_KEY(SDLK_BACKSLASH, BACKEND_KEYBOARD_BACK_SLASH) + DO_KEY(SDLK_SEMICOLON, BACKEND_KEYBOARD_SEMICOLON) + DO_KEY(SDLK_QUOTE, BACKEND_KEYBOARD_APOSTROPHE) + DO_KEY(SDLK_COMMA, BACKEND_KEYBOARD_COMMA) + DO_KEY(SDLK_PERIOD, BACKEND_KEYBOARD_PERIOD) + DO_KEY(SDLK_SLASH, BACKEND_KEYBOARD_FORWARD_SLASH) + + default: + break; + } + + break; + + case SDL_ACTIVEEVENT: + if (event.active.state & SDL_APPINPUTFOCUS) + { + window_focus_callback(event.active.gain); + } + + break; + + case SDL_VIDEORESIZE: + RenderBackend_HandleWindowResize(event.resize.w, event.resize.h); + break; + + case SDL_QUIT: + return false; + } + } + + return true; +} + +void Backend_GetKeyboardState(bool *out_keyboard_state) +{ + memcpy(out_keyboard_state, keyboard_state, sizeof(keyboard_state)); +} + +void Backend_ShowMessageBox(const char *title, const char *message) +{ + Backend_PrintInfo("ShowMessageBox - '%s' - '%s'\n", title, message); +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintError(const char *format, ...) +{ + va_list argumentList; + va_start(argumentList, format); + fputs("ERROR: ", stderr); + vfprintf(stderr, format, argumentList); + fputc('\n', stderr); + va_end(argumentList); +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintInfo(const char *format, ...) +{ + va_list argumentList; + va_start(argumentList, format); + fputs("INFO: ", stdout); + vfprintf(stdout, format, argumentList); + fputc('\n', stdout); + va_end(argumentList); +} + +unsigned long Backend_GetTicks(void) +{ + return SDL_GetTicks(); +} + +void Backend_Delay(unsigned int ticks) +{ + SDL_Delay(ticks); +} + +void Backend_GetDisplayMode(Backend_DisplayMode *display_mode) +{ + // Dummy - SDL1 doesn't seem to give us a way to do this and I hate it + display_mode->width = 1280; + display_mode->height = 720; + display_mode->refresh_rate = 0; // Dummy - tricks the game into thinking it should never use vsync, which is correct +} diff --git a/src/Backends/Platform/SDL2.cpp b/src/Backends/Platform/SDL2.cpp new file mode 100644 index 0000000..542f7eb --- /dev/null +++ b/src/Backends/Platform/SDL2.cpp @@ -0,0 +1,366 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Misc.h" + +#include +#include +#include +#include +#include +#include + +#include "SDL.h" + +#include "../Rendering.h" +#include "../Shared/SDL.h" +#include "../../Attributes.h" + +#define DO_KEY(SDL_KEY, BACKEND_KEY) \ + case SDL_KEY: \ + keyboard_state[BACKEND_KEY] = event.key.type == SDL_KEYDOWN; \ + break; + +static bool keyboard_state[BACKEND_KEYBOARD_TOTAL]; + +static unsigned char *cursor_surface_pixels; +static SDL_Surface *cursor_surface; +static SDL_Cursor *cursor; + +static void (*drag_and_drop_callback)(const char *path); +static void (*window_focus_callback)(bool focus); + +bool Backend_Init(void (*drag_and_drop_callback_param)(const char *path), void (*window_focus_callback_param)(bool focus)) +{ + drag_and_drop_callback = drag_and_drop_callback_param; + window_focus_callback = window_focus_callback_param; + + if (SDL_Init(SDL_INIT_EVENTS) == 0) + { + if (SDL_InitSubSystem(SDL_INIT_VIDEO) == 0) + { + Backend_PrintInfo("Available SDL video drivers:"); + + for (int i = 0; i < SDL_GetNumVideoDrivers(); ++i) + Backend_PrintInfo("%s", SDL_GetVideoDriver(i)); + + const char *driver = SDL_GetCurrentVideoDriver(); + + if (driver != NULL) + { + Backend_PrintInfo("Selected SDL video driver: %s", driver); + + return true; + } + else + { + Backend_PrintError("No SDL video driver initialized!"); + } + } + else + { + std::string error_message = std::string("Could not initialise SDL video subsystem: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error", error_message.c_str()); + } + + SDL_Quit(); + } + else + { + std::string error_message = std::string("Could not initialise SDL: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error", error_message.c_str()); + } + + return false; +} + +void Backend_Deinit(void) +{ + if (cursor != NULL) + SDL_FreeCursor(cursor); + + if (cursor_surface != NULL) + SDL_FreeSurface(cursor_surface); + + free(cursor_surface_pixels); + + SDL_Quit(); +} + +void Backend_PostWindowCreation(void) +{ + +} + +bool Backend_GetPaths(std::string *module_path, std::string *data_path) +{ +#ifdef _WIN32 + // SDL_GetBasePath returns a UTF-8 string, but Windows' fopen uses (extended?) ASCII. + // This is apparently a problem for accented characters, as they will make fopen fail. + // So, instead, we rely on argv[0], as that will put the accented characters in a + // format Windows will understand. + (void)module_path; + (void)data_path; + + return false; +#else + char *base_path = SDL_GetBasePath(); + if (base_path == NULL) + return false; + + // Trim the trailing '/' + size_t base_path_length = strlen(base_path); + base_path[base_path_length - 1] = '\0'; + *module_path = base_path; + SDL_free(base_path); + + *data_path = *module_path + "/data"; + + return true; +#endif +} + +void Backend_HideMouse(void) +{ + SDL_ShowCursor(SDL_DISABLE); +} + +void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t height) +{ + SDL_Surface *surface = SDL_CreateRGBSurfaceWithFormatFrom((void*)rgb_pixels, width, height, 0, width * 3, SDL_PIXELFORMAT_RGB24); + + if (surface != NULL) + { + SDL_SetWindowIcon(window, surface); + SDL_FreeSurface(surface); + } + else + { + Backend_PrintError("Couldn't create RGB surface for window icon: %s", SDL_GetError()); + } +} + +void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height) +{ + cursor_surface_pixels = (unsigned char*)malloc(width * height * 4); + + if (cursor_surface_pixels != NULL) + { + memcpy(cursor_surface_pixels, rgba_pixels, width * height * 4); + + cursor_surface = SDL_CreateRGBSurfaceWithFormatFrom(cursor_surface_pixels, width, height, 0, width * 4, SDL_PIXELFORMAT_RGBA32); + + if (cursor_surface != NULL) + { + cursor = SDL_CreateColorCursor(cursor_surface, 0, 0); + + if (cursor != NULL) + SDL_SetCursor(cursor); + } + } + else + { + Backend_PrintError("Failed to allocate memory for cursor surface"); + } +} + +void Backend_EnableDragAndDrop(void) +{ + SDL_EventState(SDL_DROPFILE, SDL_ENABLE); +} + +bool Backend_SystemTask(bool active) +{ + if (!active) + if (!SDL_WaitEvent(NULL)) + return false; + + SDL_Event event; + + while (SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_KEYUP: + case SDL_KEYDOWN: + switch (event.key.keysym.sym) + { + DO_KEY(SDLK_a, BACKEND_KEYBOARD_A) + DO_KEY(SDLK_b, BACKEND_KEYBOARD_B) + DO_KEY(SDLK_c, BACKEND_KEYBOARD_C) + DO_KEY(SDLK_d, BACKEND_KEYBOARD_D) + DO_KEY(SDLK_e, BACKEND_KEYBOARD_E) + DO_KEY(SDLK_f, BACKEND_KEYBOARD_F) + DO_KEY(SDLK_g, BACKEND_KEYBOARD_G) + DO_KEY(SDLK_h, BACKEND_KEYBOARD_H) + DO_KEY(SDLK_i, BACKEND_KEYBOARD_I) + DO_KEY(SDLK_j, BACKEND_KEYBOARD_J) + DO_KEY(SDLK_k, BACKEND_KEYBOARD_K) + DO_KEY(SDLK_l, BACKEND_KEYBOARD_L) + DO_KEY(SDLK_m, BACKEND_KEYBOARD_M) + DO_KEY(SDLK_n, BACKEND_KEYBOARD_N) + DO_KEY(SDLK_o, BACKEND_KEYBOARD_O) + DO_KEY(SDLK_p, BACKEND_KEYBOARD_P) + DO_KEY(SDLK_q, BACKEND_KEYBOARD_Q) + DO_KEY(SDLK_r, BACKEND_KEYBOARD_R) + DO_KEY(SDLK_s, BACKEND_KEYBOARD_S) + DO_KEY(SDLK_t, BACKEND_KEYBOARD_T) + DO_KEY(SDLK_u, BACKEND_KEYBOARD_U) + DO_KEY(SDLK_v, BACKEND_KEYBOARD_V) + DO_KEY(SDLK_w, BACKEND_KEYBOARD_W) + DO_KEY(SDLK_x, BACKEND_KEYBOARD_X) + DO_KEY(SDLK_y, BACKEND_KEYBOARD_Y) + DO_KEY(SDLK_z, BACKEND_KEYBOARD_Z) + DO_KEY(SDLK_0, BACKEND_KEYBOARD_0) + DO_KEY(SDLK_1, BACKEND_KEYBOARD_1) + DO_KEY(SDLK_2, BACKEND_KEYBOARD_2) + DO_KEY(SDLK_3, BACKEND_KEYBOARD_3) + DO_KEY(SDLK_4, BACKEND_KEYBOARD_4) + DO_KEY(SDLK_5, BACKEND_KEYBOARD_5) + DO_KEY(SDLK_6, BACKEND_KEYBOARD_6) + DO_KEY(SDLK_7, BACKEND_KEYBOARD_7) + DO_KEY(SDLK_8, BACKEND_KEYBOARD_8) + DO_KEY(SDLK_9, BACKEND_KEYBOARD_9) + DO_KEY(SDLK_F1, BACKEND_KEYBOARD_F1) + DO_KEY(SDLK_F2, BACKEND_KEYBOARD_F2) + DO_KEY(SDLK_F3, BACKEND_KEYBOARD_F3) + DO_KEY(SDLK_F4, BACKEND_KEYBOARD_F4) + DO_KEY(SDLK_F5, BACKEND_KEYBOARD_F5) + DO_KEY(SDLK_F6, BACKEND_KEYBOARD_F6) + DO_KEY(SDLK_F7, BACKEND_KEYBOARD_F7) + DO_KEY(SDLK_F8, BACKEND_KEYBOARD_F8) + DO_KEY(SDLK_F9, BACKEND_KEYBOARD_F9) + DO_KEY(SDLK_F10, BACKEND_KEYBOARD_F10) + DO_KEY(SDLK_F11, BACKEND_KEYBOARD_F11) + DO_KEY(SDLK_F12, BACKEND_KEYBOARD_F12) + DO_KEY(SDLK_UP, BACKEND_KEYBOARD_UP) + DO_KEY(SDLK_DOWN, BACKEND_KEYBOARD_DOWN) + DO_KEY(SDLK_LEFT, BACKEND_KEYBOARD_LEFT) + DO_KEY(SDLK_RIGHT, BACKEND_KEYBOARD_RIGHT) + DO_KEY(SDLK_ESCAPE, BACKEND_KEYBOARD_ESCAPE) + DO_KEY(SDLK_BACKQUOTE, BACKEND_KEYBOARD_BACK_QUOTE) + DO_KEY(SDLK_TAB, BACKEND_KEYBOARD_TAB) + DO_KEY(SDLK_CAPSLOCK, BACKEND_KEYBOARD_CAPS_LOCK) + DO_KEY(SDLK_LSHIFT, BACKEND_KEYBOARD_LEFT_SHIFT) + DO_KEY(SDLK_LCTRL, BACKEND_KEYBOARD_LEFT_CTRL) + DO_KEY(SDLK_LALT, BACKEND_KEYBOARD_LEFT_ALT) + DO_KEY(SDLK_SPACE, BACKEND_KEYBOARD_SPACE) + DO_KEY(SDLK_RALT, BACKEND_KEYBOARD_RIGHT_ALT) + DO_KEY(SDLK_RCTRL, BACKEND_KEYBOARD_RIGHT_CTRL) + DO_KEY(SDLK_RSHIFT, BACKEND_KEYBOARD_RIGHT_SHIFT) + DO_KEY(SDLK_RETURN, BACKEND_KEYBOARD_ENTER) + DO_KEY(SDLK_BACKSPACE, BACKEND_KEYBOARD_BACKSPACE) + DO_KEY(SDLK_MINUS, BACKEND_KEYBOARD_MINUS) + DO_KEY(SDLK_EQUALS, BACKEND_KEYBOARD_EQUALS) + DO_KEY(SDLK_LEFTBRACKET, BACKEND_KEYBOARD_LEFT_BRACKET) + DO_KEY(SDLK_RIGHTBRACKET, BACKEND_KEYBOARD_RIGHT_BRACKET) + DO_KEY(SDLK_BACKSLASH, BACKEND_KEYBOARD_BACK_SLASH) + DO_KEY(SDLK_SEMICOLON, BACKEND_KEYBOARD_SEMICOLON) + DO_KEY(SDLK_QUOTE, BACKEND_KEYBOARD_APOSTROPHE) + DO_KEY(SDLK_COMMA, BACKEND_KEYBOARD_COMMA) + DO_KEY(SDLK_PERIOD, BACKEND_KEYBOARD_PERIOD) + DO_KEY(SDLK_SLASH, BACKEND_KEYBOARD_FORWARD_SLASH) + + default: + break; + } + + break; + + case SDL_JOYDEVICEADDED: + ControllerBackend_JoystickConnect(event.jdevice.which); + break; + + case SDL_JOYDEVICEREMOVED: + ControllerBackend_JoystickDisconnect(event.jdevice.which); + break; + + case SDL_DROPFILE: + drag_and_drop_callback(event.drop.file); + SDL_free(event.drop.file); + break; + + case SDL_WINDOWEVENT: + switch (event.window.event) + { + case SDL_WINDOWEVENT_FOCUS_LOST: + window_focus_callback(false); + break; + + case SDL_WINDOWEVENT_FOCUS_GAINED: + window_focus_callback(true); + break; + + case SDL_WINDOWEVENT_RESIZED: + case SDL_WINDOWEVENT_SIZE_CHANGED: + RenderBackend_HandleWindowResize(event.window.data1, event.window.data2); + break; + } + + break; + + case SDL_QUIT: + return false; + + case SDL_RENDER_TARGETS_RESET: + RenderBackend_HandleRenderTargetLoss(); + break; + + } + } + + return true; +} + +void Backend_GetKeyboardState(bool *out_keyboard_state) +{ + memcpy(out_keyboard_state, keyboard_state, sizeof(keyboard_state)); +} + +void Backend_ShowMessageBox(const char *title, const char *message) +{ + Backend_PrintInfo("ShowMessageBox - '%s' - '%s'\n", title, message); + + if (SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title, message, window) != 0) + Backend_PrintError("Was also unable to display a message box containing the error: %s", SDL_GetError()); +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintError(const char *format, ...) +{ + va_list argumentList; + va_start(argumentList, format); + fputs("ERROR: ", stderr); + vfprintf(stderr, format, argumentList); + fputc('\n', stderr); + va_end(argumentList); +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintInfo(const char *format, ...) +{ + va_list argumentList; + va_start(argumentList, format); + fputs("INFO: ", stdout); + vfprintf(stdout, format, argumentList); + fputc('\n', stdout); + va_end(argumentList); +} + +unsigned long Backend_GetTicks(void) +{ + return SDL_GetTicks(); +} + +void Backend_Delay(unsigned int ticks) +{ + SDL_Delay(ticks); +} + +void Backend_GetDisplayMode(Backend_DisplayMode *display_mode) +{ + SDL_DisplayMode sdl_display_mode; + SDL_GetDesktopDisplayMode(0, &sdl_display_mode); + + display_mode->width = sdl_display_mode.w; + display_mode->height = sdl_display_mode.h; + display_mode->refresh_rate = sdl_display_mode.refresh_rate; +} diff --git a/src/Backends/Platform/WiiU.cpp b/src/Backends/Platform/WiiU.cpp new file mode 100644 index 0000000..d17b842 --- /dev/null +++ b/src/Backends/Platform/WiiU.cpp @@ -0,0 +1,157 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Misc.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static unsigned long ticks_per_second; + +bool Backend_Init(void (*drag_and_drop_callback)(const char *path), void (*window_focus_callback)(bool focus)) +{ + (void)drag_and_drop_callback; + (void)window_focus_callback; + + WHBProcInit(); + + if (!WHBMountSdCard()) + return FALSE; + + WHBLogUdpInit(); + + ticks_per_second = OSGetSystemInfo()->busClockSpeed / 4; + + return true; +} + +void Backend_Deinit(void) +{ + WHBLogUdpDeinit(); + + WHBUnmountSdCard(); + + WHBProcShutdown(); +} + +void Backend_PostWindowCreation(void) +{ + +} + +bool Backend_GetPaths(std::string *module_path, std::string *data_path) +{ + *module_path = WHBGetSdCardMountPath(); +#ifdef JAPANESE + *module_path += "/CSE2-enhanced-jp"; +#else + *module_path += "/CSE2-enhanced-en"; +#endif + + *data_path = *module_path + "/data"; + + return true; +} + +void Backend_HideMouse(void) +{ + +} + +void Backend_SetWindowIcon(const unsigned char *rgb_pixels, size_t width, size_t height) +{ + (void)rgb_pixels; + (void)width; + (void)height; +} + +void Backend_SetCursor(const unsigned char *rgba_pixels, size_t width, size_t height) +{ + (void)rgba_pixels; + (void)width; + (void)height; +} + +void Backend_EnableDragAndDrop(void) +{ + +} + +bool Backend_SystemTask(bool active) +{ + (void)active; + + return WHBProcIsRunning(); +} + +void Backend_GetKeyboardState(bool *keyboard_state) +{ + memset(keyboard_state, 0, sizeof(bool) * BACKEND_KEYBOARD_TOTAL); +} + +void Backend_ShowMessageBox(const char *title, const char *message) +{ + Backend_PrintInfo("ShowMessageBox - %s - %s", title, message); +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintError(const char *format, ...) +{ + char message_buffer[0x100]; + + va_list argument_list; + va_start(argument_list, format); + vsnprintf(message_buffer, sizeof(message_buffer), format, argument_list); + va_end(argument_list); + + WHBLogPrint("ERROR:"); + WHBLogPrint(message_buffer); +} + +ATTRIBUTE_FORMAT_PRINTF(1, 2) void Backend_PrintInfo(const char *format, ...) +{ + char message_buffer[0x100]; + + va_list argument_list; + va_start(argument_list, format); + vsnprintf(message_buffer, sizeof(message_buffer), format, argument_list); + va_end(argument_list); + + WHBLogPrint("INFO:"); + WHBLogPrint(message_buffer); +} + +unsigned long Backend_GetTicks(void) +{ + static uint64_t accumulator; + + static unsigned long last_tick; + + unsigned long current_tick = OSGetTick(); + + accumulator += current_tick - last_tick; + + last_tick = current_tick; + + return (accumulator * 1000) / ticks_per_second; +} + +void Backend_Delay(unsigned int ticks) +{ + OSSleepTicks((ticks * ticks_per_second) / 1000); +} + +void Backend_GetDisplayMode(Backend_DisplayMode *display_mode) +{ + display_mode->width = 854; + display_mode->height = 480; + display_mode->refresh_rate = 60; +} diff --git a/src/Backends/Rendering.h b/src/Backends/Rendering.h new file mode 100644 index 0000000..8804f3c --- /dev/null +++ b/src/Backends/Rendering.h @@ -0,0 +1,36 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +typedef struct RenderBackend_Surface RenderBackend_Surface; +typedef struct RenderBackend_GlyphAtlas RenderBackend_GlyphAtlas; + +typedef struct RenderBackend_Rect +{ + long left; + long top; + long right; + long bottom; +} RenderBackend_Rect; + +RenderBackend_Surface* RenderBackend_Init(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync); +void RenderBackend_Deinit(void); +void RenderBackend_DrawScreen(void); +RenderBackend_Surface* RenderBackend_CreateSurface(size_t width, size_t height, bool render_target); +void RenderBackend_FreeSurface(RenderBackend_Surface *surface); +bool RenderBackend_IsSurfaceLost(RenderBackend_Surface *surface); +void RenderBackend_RestoreSurface(RenderBackend_Surface *surface); +void RenderBackend_UploadSurface(RenderBackend_Surface *surface, const unsigned char *pixels, size_t width, size_t height); +void RenderBackend_Blit(RenderBackend_Surface *source_surface, const RenderBackend_Rect *rect, RenderBackend_Surface *destination_surface, long x, long y, bool alpha_blend); +void RenderBackend_ColourFill(RenderBackend_Surface *surface, const RenderBackend_Rect *rect, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha); +RenderBackend_GlyphAtlas* RenderBackend_CreateGlyphAtlas(size_t width, size_t height); +void RenderBackend_DestroyGlyphAtlas(RenderBackend_GlyphAtlas *atlas); +void RenderBackend_UploadGlyph(RenderBackend_GlyphAtlas *atlas, size_t x, size_t y, const unsigned char *pixels, size_t width, size_t height, size_t pitch); +void RenderBackend_PrepareToDrawGlyphs(RenderBackend_GlyphAtlas *atlas, RenderBackend_Surface *destination_surface, unsigned char red, unsigned char green, unsigned char blue); +void RenderBackend_DrawGlyph(long x, long y, size_t glyph_x, size_t glyph_y, size_t glyph_width, size_t glyph_height); +void RenderBackend_HandleRenderTargetLoss(void); +void RenderBackend_HandleWindowResize(size_t width, size_t height); +void RenderBackend_FlushGlyphs(void); diff --git a/src/Backends/Rendering/3DS.cpp b/src/Backends/Rendering/3DS.cpp new file mode 100644 index 0000000..8f54f55 --- /dev/null +++ b/src/Backends/Rendering/3DS.cpp @@ -0,0 +1,504 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Rendering.h" + +#include +#include +#include + +#include <3ds.h> +#include +#include + +#include "../Misc.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +// Used to transfer the final rendered display to the framebuffer +#define DISPLAY_TRANSFER_FLAGS \ + (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \ + GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \ + GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) + +// Used to convert textures to 3DS tiled format +#define TEXTURE_TRANSFER_FLAGS \ + (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(1) | GX_TRANSFER_RAW_COPY(0) | \ + GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGBA8) | \ + GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) + +typedef struct RenderBackend_Surface +{ + C3D_Tex texture; + C3D_RenderTarget *render_target; +} RenderBackend_Surface; + +typedef struct RenderBackend_GlyphAtlas +{ + C3D_Tex texture; + unsigned char *local_texture_buffer; +} RenderBackend_GlyphAtlas; + +static RenderBackend_GlyphAtlas *glyph_atlas; +static RenderBackend_Surface *glyph_destination_surface; +static C2D_ImageTint glyph_tint; + +static C3D_RenderTarget *screen_render_target; + +static RenderBackend_Surface *framebuffer_surface; +static size_t framebuffer_surface_width; +static size_t framebuffer_surface_height; + +static bool frame_started; + +static size_t RoundUpToPowerOfTwo(size_t value) +{ + size_t accumulator = 1; + + while (accumulator < value) + accumulator <<= 1; + + return accumulator; +} + +static void EnableAlpha(bool enabled) +{ + static bool previous_setting = true; + + if (enabled != previous_setting) + { + // Setting will not take effect mid-frame, so + // break-up the current frame if we have to. + if (frame_started) + C2D_Flush(); + + if (enabled) + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA); + else + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_ONE, GPU_ZERO, GPU_ONE, GPU_ZERO); + + previous_setting = enabled; + } +} + +static void SelectRenderTarget(C3D_RenderTarget *render_target) +{ + static C3D_RenderTarget *previous_render_target = NULL; + + if (render_target != previous_render_target) + { + previous_render_target = render_target; + + C2D_SceneBegin(render_target); + } +} + +static void BeginRendering(void) +{ + if (!frame_started) + { + C3D_FrameBegin(0); + frame_started = true; + } +} + +static void EndRendering(void) +{ + if (frame_started) + { + C3D_FrameEnd(0); + frame_started = false; + } +} + +RenderBackend_Surface* RenderBackend_Init(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ + *vsync = true; + + if (C3D_Init(C3D_DEFAULT_CMDBUF_SIZE)) + { + if (C2D_Init(C2D_DEFAULT_MAX_OBJECTS)) + { + C2D_Prepare(); + + C3D_DepthTest(false, GPU_GEQUAL, GPU_WRITE_ALL); + + screen_render_target = C3D_RenderTargetCreate(240, 400, GPU_RB_RGBA8, -1); + + if (screen_render_target != NULL) + { + C3D_RenderTargetSetOutput(screen_render_target, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); + + framebuffer_surface = RenderBackend_CreateSurface(screen_width, screen_height, true); + + if (framebuffer_surface != NULL) + { + framebuffer_surface_width = screen_width; + framebuffer_surface_height = screen_height; + + return framebuffer_surface; + } + else + { + Backend_PrintError("RenderBackend_CreateSurface failed in RenderBackend_Init"); + } + + C3D_RenderTargetDelete(screen_render_target); + } + else + { + Backend_PrintError("C2D_CreateScreenTarget failed in RenderBackend_Init"); + } + + C2D_Fini(); + } + else + { + Backend_PrintError("C2D_Init failed in RenderBackend_Init"); + } + + C3D_Fini(); + } + else + { + Backend_PrintError("C3D_Init failed in RenderBackend_Init"); + } + + return NULL; +} + +void RenderBackend_Deinit(void) +{ + // Just in case + EndRendering(); + + RenderBackend_FreeSurface(framebuffer_surface); + + C3D_RenderTargetDelete(screen_render_target); + + C2D_Fini(); + C3D_Fini(); +} + +void RenderBackend_DrawScreen(void) +{ + EndRendering(); + + EnableAlpha(false); + + const float texture_left = 0.0f; + const float texture_top = 0.0f; + const float texture_right = (float)framebuffer_surface_width / framebuffer_surface->texture.width; + const float texture_bottom = (float)framebuffer_surface_height / framebuffer_surface->texture.height; + + Tex3DS_SubTexture subtexture; + subtexture.width = framebuffer_surface_width; + subtexture.height = framebuffer_surface_height; + subtexture.left = texture_left; + subtexture.top = 1.0f - texture_top; + subtexture.right = texture_right; + subtexture.bottom = 1.0f - texture_bottom; + + C2D_Image image; + image.tex = &framebuffer_surface->texture; + image.subtex = &subtexture; + + C3D_FrameBegin(C3D_FRAME_SYNCDRAW); + + C2D_TargetClear(screen_render_target, C2D_Color32(0, 0, 0, 0xFF)); + + SelectRenderTarget(screen_render_target); + + C2D_DrawImageAt(image, (400 - framebuffer_surface_width) / 2, (240 - framebuffer_surface_height) / 2, 0.0f); + + C3D_FrameEnd(0); +} + +RenderBackend_Surface* RenderBackend_CreateSurface(size_t width, size_t height, bool render_target) +{ + // Just in case + EndRendering(); + + RenderBackend_Surface *surface = (RenderBackend_Surface*)malloc(sizeof(RenderBackend_Surface)); + + if (surface != NULL) + { + surface->render_target = NULL; + + memset(&surface->texture, 0, sizeof(surface->texture)); + + if ((render_target ? C3D_TexInitVRAM : C3D_TexInit)(&surface->texture, RoundUpToPowerOfTwo(width), RoundUpToPowerOfTwo(height), GPU_RGBA8)) + { + C3D_TexSetFilter(&surface->texture, GPU_NEAREST, GPU_NEAREST); + + if (!render_target) + { + return surface; + } + else + { + surface->render_target = C3D_RenderTargetCreateFromTex(&surface->texture, GPU_TEXFACE_2D, 0, -1); + + if (surface->render_target != NULL) + { + C2D_TargetClear(surface->render_target, C2D_Color32(0, 0, 0, 0)); + + return surface; + } + else + { + Backend_PrintError("C3D_RenderTargetCreateFromTex failed in RenderBackend_CreateSurface"); + } + } + + C3D_TexDelete(&surface->texture); + } + else + { + Backend_PrintError("C3D_TexInit/C3D_TexInitVRAM failed in RenderBackend_CreateSurface"); + } + + free(surface); + } + + return NULL; +} + +void RenderBackend_FreeSurface(RenderBackend_Surface *surface) +{ + // Just in case + EndRendering(); + + if (surface->render_target != NULL) + C3D_RenderTargetDelete(surface->render_target); + + C3D_TexDelete(&surface->texture); + + free(surface); +} + +bool RenderBackend_IsSurfaceLost(RenderBackend_Surface *surface) +{ + (void)surface; + + return false; +} + +void RenderBackend_RestoreSurface(RenderBackend_Surface *surface) +{ + (void)surface; +} + +void RenderBackend_UploadSurface(RenderBackend_Surface *surface, const unsigned char *pixels, size_t width, size_t height) +{ + // If we upload while drawing, we get corruption (visible after stage transitions) + EndRendering(); + + unsigned char *abgr_buffer = (unsigned char*)linearAlloc(surface->texture.width * surface->texture.height * 4); + + if (abgr_buffer != NULL) + { + const unsigned char *src = pixels; + + // Convert from RGBA to ABGR + for (size_t h = 0; h < height; ++h) + { + unsigned char *dst = &abgr_buffer[h * surface->texture.width * 4]; + + for (size_t w = 0; w < width; ++w) + { + unsigned char r = *src++; + unsigned char g = *src++; + unsigned char b = *src++; + unsigned char a = *src++; + + *dst++ = a; + *dst++ = b; + *dst++ = g; + *dst++ = r; + } + } + + GSPGPU_FlushDataCache(abgr_buffer, surface->texture.width * surface->texture.height * 4); + + C3D_SyncDisplayTransfer((u32*)abgr_buffer, GX_BUFFER_DIM(surface->texture.width, surface->texture.height), (u32*)surface->texture.data, GX_BUFFER_DIM(surface->texture.width, surface->texture.height), TEXTURE_TRANSFER_FLAGS); + + linearFree(abgr_buffer); + } + else + { + Backend_PrintError("Couldn't allocate memory for RenderBackend_UploadSurface"); + } +} + +void RenderBackend_Blit(RenderBackend_Surface *source_surface, const RenderBackend_Rect *rect, RenderBackend_Surface *destination_surface, long x, long y, bool colour_key) +{ + EnableAlpha(colour_key); + + BeginRendering(); + + const float texture_left = (float)rect->left / source_surface->texture.width; + const float texture_top = (float)(source_surface->texture.height - rect->top) / source_surface->texture.height; + const float texture_right = (float)rect->right / source_surface->texture.width; + const float texture_bottom = (float)(source_surface->texture.height - rect->bottom) / source_surface->texture.height; + + Tex3DS_SubTexture subtexture; + subtexture.width = rect->right - rect->left; + subtexture.height = rect->bottom - rect->top; + subtexture.left = texture_left; + subtexture.top = texture_top; + subtexture.right = texture_right; + subtexture.bottom = texture_bottom; + + C2D_Image image; + image.tex = &source_surface->texture; + image.subtex = &subtexture; + + SelectRenderTarget(destination_surface->render_target); + + C2D_DrawImageAt(image, x, y, 0.0f); +} + +void RenderBackend_ColourFill(RenderBackend_Surface *surface, const RenderBackend_Rect *rect, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) +{ + EnableAlpha(false); + + BeginRendering(); + + SelectRenderTarget(surface->render_target); + + C2D_DrawRectSolid(rect->left, rect->top, 0.0f, rect->right - rect->left, rect->bottom - rect->top, C2D_Color32(red, green, blue, alpha)); +} + +RenderBackend_GlyphAtlas* RenderBackend_CreateGlyphAtlas(size_t width, size_t height) +{ + // Just in case + EndRendering(); + + RenderBackend_GlyphAtlas *atlas = (RenderBackend_GlyphAtlas*)malloc(sizeof(RenderBackend_GlyphAtlas)); + + if (atlas != NULL) + { + width = RoundUpToPowerOfTwo(width); + height = RoundUpToPowerOfTwo(height); + + atlas->local_texture_buffer = (unsigned char*)linearAlloc(width * height * 4); + + if (atlas->local_texture_buffer != NULL) + { + memset(&atlas->texture, 0, sizeof(atlas->texture)); + + if (C3D_TexInit(&atlas->texture, width, height, GPU_RGBA8)) + { + C3D_TexSetFilter(&atlas->texture, GPU_NEAREST, GPU_NEAREST); + + return atlas; + } + else + { + Backend_PrintError("C3D_TexInit failed in RenderBackend_CreateGlyphAtlas"); + } + + linearFree(atlas->local_texture_buffer); + } + else + { + Backend_PrintError("linearAlloc failed in RenderBackend_CreateGlyphAtlas"); + } + + free(atlas); + } + else + { + Backend_PrintError("malloc failed in RenderBackend_CreateGlyphAtlas"); + } + + + return NULL; +} + +void RenderBackend_DestroyGlyphAtlas(RenderBackend_GlyphAtlas *atlas) +{ + // Just in case + EndRendering(); + + C3D_TexDelete(&atlas->texture); + linearFree(atlas->local_texture_buffer); + free(atlas); +} + +void RenderBackend_UploadGlyph(RenderBackend_GlyphAtlas *atlas, size_t x, size_t y, const unsigned char *pixels, size_t width, size_t height, size_t pitch) +{ + // This might be needed, but right now it actually *causes* + // corruption rather than prevent it, so it's been disabled + // (it causes the 'Studio Pixel presents' text to appear incomplete). +// EndRendering(); + + for (size_t h = 0; h < height; ++h) + { + const unsigned char *source_pointer = &pixels[h * pitch]; + unsigned char *destination_pointer = &atlas->local_texture_buffer[((y + h) * atlas->texture.width + x) * 4]; + + for (size_t w = 0; w < width; ++w) + { + *destination_pointer++ = *source_pointer++; + *destination_pointer++ = 0xFF; + *destination_pointer++ = 0xFF; + *destination_pointer++ = 0xFF; + } + } + + GSPGPU_FlushDataCache(atlas->local_texture_buffer, atlas->texture.width * atlas->texture.height * 4); + + C3D_SyncDisplayTransfer((u32*)atlas->local_texture_buffer, GX_BUFFER_DIM(atlas->texture.width, atlas->texture.height), (u32*)atlas->texture.data, GX_BUFFER_DIM(atlas->texture.width, atlas->texture.height), TEXTURE_TRANSFER_FLAGS); +} + +void RenderBackend_PrepareToDrawGlyphs(RenderBackend_GlyphAtlas *atlas, RenderBackend_Surface *destination_surface, unsigned char red, unsigned char green, unsigned char blue) +{ + EnableAlpha(true); + + glyph_atlas = atlas; + glyph_destination_surface = destination_surface; + + C2D_PlainImageTint(&glyph_tint, C2D_Color32(red, green, blue, 0xFF), 1.0f); +} + +void RenderBackend_DrawGlyph(long x, long y, size_t glyph_x, size_t glyph_y, size_t glyph_width, size_t glyph_height) +{ + BeginRendering(); + + SelectRenderTarget(glyph_destination_surface->render_target); + + const float texture_left = (float)glyph_x / glyph_atlas->texture.width; + const float texture_top = (float)(glyph_atlas->texture.height - glyph_y) / glyph_atlas->texture.height; + const float texture_right = (float)(glyph_x + glyph_width) / glyph_atlas->texture.width; + const float texture_bottom = (float)(glyph_atlas->texture.height - (glyph_y + glyph_height)) / glyph_atlas->texture.height; + + Tex3DS_SubTexture subtexture; + subtexture.width = glyph_width; + subtexture.height = glyph_height; + subtexture.left = texture_left; + subtexture.top = texture_top; + subtexture.right = texture_right; + subtexture.bottom = texture_bottom; + + C2D_Image image; + image.tex = &glyph_atlas->texture; + image.subtex = &subtexture; + + C2D_DrawImageAt(image, x, y, 0.0f, &glyph_tint); +} + +void RenderBackend_HandleRenderTargetLoss(void) +{ + // No problem for us +} + +void RenderBackend_HandleWindowResize(size_t width, size_t height) +{ + (void)width; + (void)height; + + // Will never happen +} diff --git a/src/Backends/Rendering/OpenGL3.cpp b/src/Backends/Rendering/OpenGL3.cpp new file mode 100644 index 0000000..cd69f9c --- /dev/null +++ b/src/Backends/Rendering/OpenGL3.cpp @@ -0,0 +1,1071 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +// Dual OpenGL 3.2 and OpenGL ES 2.0 renderer + +#include "../Rendering.h" + +#include +#include +#include + +#ifdef USE_OPENGLES2 +#include +#else +#include +#endif + +#include "../Misc.h" +#include "Window/OpenGL.h" + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#define MAX(a,b) ((a) > (b) ? (a) : (b)) + +#define ATTRIBUTE_INPUT_VERTEX_COORDINATES 1 +#define ATTRIBUTE_INPUT_TEXTURE_COORDINATES 2 + +typedef enum RenderMode +{ + MODE_BLANK, + MODE_DRAW_SURFACE, + MODE_DRAW_SURFACE_WITH_TRANSPARENCY, + MODE_COLOUR_FILL, + MODE_DRAW_GLYPH +} RenderMode; + +typedef struct RenderBackend_Surface +{ + GLuint texture_id; + size_t width; + size_t height; +} RenderBackend_Surface; + +typedef struct RenderBackend_GlyphAtlas +{ + GLuint texture_id; + size_t width; + size_t height; +} RenderBackend_GlyphAtlas; + +typedef struct Coordinate2D +{ + GLfloat x; + GLfloat y; +} Coordinate2D; + +typedef struct Vertex +{ + Coordinate2D position; + Coordinate2D texture; +} Vertex; + +typedef struct VertexBufferSlot +{ + Vertex vertices[2][3]; +} VertexBufferSlot; + +static struct +{ + GLuint id; + struct + { + GLint vertex_transform; + GLint texture_coordinate_transform; + } uniforms; +} program_texture; + +static struct +{ + GLuint id; + struct + { + GLint vertex_transform; + GLint colour; + } uniforms; +} program_colour_fill; + +static struct +{ + GLuint id; + struct + { + GLint vertex_transform; + GLint texture_coordinate_transform; + GLint colour; + } uniforms; +} program_glyph; + + +#ifndef USE_OPENGLES2 +static GLuint vertex_array_id; +#endif +static GLuint vertex_buffer_id; +static GLuint framebuffer_id; + +static VertexBufferSlot *local_vertex_buffer; +static size_t local_vertex_buffer_size; +static size_t current_vertex_buffer_slot; + +static RenderMode last_render_mode; +static GLuint last_source_texture; +static GLuint last_destination_texture; + +static RenderBackend_Surface *framebuffer_surface; +static RenderBackend_Surface *upscaled_framebuffer_surface; +static RenderBackend_Surface window_surface; + +static RenderBackend_Rect window_rect; + +#ifdef USE_OPENGLES2 +static const GLchar *vertex_shader_plain = " \ +#version 100\n \ +uniform mat4 vertex_transform; \ +attribute vec2 input_vertex_coordinates; \ +void main() \ +{ \ + gl_Position = vec4(input_vertex_coordinates.xy, 0.0, 1.0) * vertex_transform; \ +} \ +"; + +static const GLchar *vertex_shader_texture = " \ +#version 100\n \ +uniform mat4 vertex_transform; \ +uniform vec2 texture_coordinate_transform; \ +attribute vec2 input_vertex_coordinates; \ +attribute vec2 input_texture_coordinates; \ +varying vec2 texture_coordinates; \ +void main() \ +{ \ + texture_coordinates = input_texture_coordinates * texture_coordinate_transform; \ + gl_Position = vec4(input_vertex_coordinates.xy, 0.0, 1.0) * vertex_transform; \ +} \ +"; + +static const GLchar *fragment_shader_texture = " \ +#version 100\n \ +precision mediump float; \ +uniform sampler2D tex; \ +varying vec2 texture_coordinates; \ +void main() \ +{ \ + gl_FragColor = texture2D(tex, texture_coordinates); \ +} \ +"; + +static const GLchar *fragment_shader_colour_fill = " \ +#version 100\n \ +precision mediump float; \ +uniform vec4 colour; \ +void main() \ +{ \ + gl_FragColor = colour; \ +} \ +"; + +static const GLchar *fragment_shader_glyph = " \ +#version 100\n \ +precision mediump float; \ +uniform sampler2D tex; \ +uniform vec4 colour; \ +varying vec2 texture_coordinates; \ +void main() \ +{ \ + gl_FragColor = colour * texture2D(tex, texture_coordinates).r; \ +} \ +"; + +#else + +static const GLchar *vertex_shader_plain = " \ +#version 150 core\n \ +uniform mat4 vertex_transform; \ +in vec2 input_vertex_coordinates; \ +void main() \ +{ \ + gl_Position = vec4(input_vertex_coordinates.xy, 0.0, 1.0) * vertex_transform; \ +} \ +"; + +static const GLchar *vertex_shader_texture = " \ +#version 150 core\n \ +uniform mat4 vertex_transform; \ +uniform vec2 texture_coordinate_transform; \ +in vec2 input_vertex_coordinates; \ +in vec2 input_texture_coordinates; \ +out vec2 texture_coordinates; \ +void main() \ +{ \ + texture_coordinates = input_texture_coordinates * texture_coordinate_transform; \ + gl_Position = vec4(input_vertex_coordinates.xy, 0.0, 1.0) * vertex_transform; \ +} \ +"; + +static const GLchar *fragment_shader_texture = " \ +#version 150 core\n \ +uniform sampler2D tex; \ +in vec2 texture_coordinates; \ +out vec4 fragment; \ +void main() \ +{ \ + fragment = texture(tex, texture_coordinates); \ +} \ +"; + +static const GLchar *fragment_shader_colour_fill = " \ +#version 150 core\n \ +uniform vec4 colour; \ +out vec4 fragment; \ +void main() \ +{ \ + fragment = colour; \ +} \ +"; + +static const GLchar *fragment_shader_glyph = " \ +#version 150 core\n \ +uniform sampler2D tex; \ +uniform vec4 colour; \ +in vec2 texture_coordinates; \ +out vec4 fragment; \ +void main() \ +{ \ + fragment = colour * texture(tex, texture_coordinates).r; \ +} \ +"; +#endif + +// A little forward-declaration for some internal functions +static void Blit(RenderBackend_Surface *source_surface, const RenderBackend_Rect *source_rect, RenderBackend_Surface *destination_surface, const RenderBackend_Rect *destination_rect, bool colour_key); +static RenderBackend_Surface* CreateSurface(size_t width, size_t height, bool linear_filter); + +// This was used back when CSE2 used GLEW instead of glad +/* +static void GLAPIENTRY MessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void* userParam) +{ + (void)source; + (void)type; + (void)id; + (void)length; + (void)userParam; + + if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) + Backend_PrintInfo("OpenGL debug: %s", message); +} +*/ + +static void SetTextureUploadAlignment(size_t pitch) +{ + const GLint alignments[8] = {8, 1, 2, 1, 4, 1, 2, 1}; + + glPixelStorei(GL_UNPACK_ALIGNMENT, alignments[pitch & 7]); +} + +//////////////////////// +// Shader compilation // +//////////////////////// + +static GLuint CompileShader(const char *vertex_shader_source, const char *fragment_shader_source) +{ + GLint shader_status; + + GLuint program_id = glCreateProgram(); + + // Compile vertex shader + GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); + glCompileShader(vertex_shader); + + glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &shader_status); + if (shader_status != GL_TRUE) + { + char buffer[0x400]; + glGetShaderInfoLog(vertex_shader, sizeof(buffer), NULL, buffer); + Backend_PrintError("Vertex shader error: %s", buffer); + return 0; + } + + glAttachShader(program_id, vertex_shader); + + // Compile fragment shader + GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL); + glCompileShader(fragment_shader); + + glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &shader_status); + if (shader_status != GL_TRUE) + { + char buffer[0x400]; + glGetShaderInfoLog(fragment_shader, sizeof(buffer), NULL, buffer); + Backend_PrintError("Fragment shader error: %s", buffer); + return 0; + } + + glAttachShader(program_id, fragment_shader); + + // Link shaders + glBindAttribLocation(program_id, ATTRIBUTE_INPUT_VERTEX_COORDINATES, "input_vertex_coordinates"); + glBindAttribLocation(program_id, ATTRIBUTE_INPUT_TEXTURE_COORDINATES, "input_texture_coordinates"); + + glLinkProgram(program_id); + + glGetProgramiv(program_id, GL_LINK_STATUS, &shader_status); + if (shader_status != GL_TRUE) + { + char buffer[0x400]; + glGetProgramInfoLog(program_id, sizeof(buffer), NULL, buffer); + Backend_PrintError("Shader linker error: %s", buffer); + return 0; + } + + return program_id; +} + +////////////////////////////// +// Vertex buffer management // +////////////////////////////// + +static VertexBufferSlot* GetVertexBufferSlot(void) +{ + ++current_vertex_buffer_slot; + + // Check if buffer needs expanding + if (current_vertex_buffer_slot > local_vertex_buffer_size) + { + local_vertex_buffer_size = 1; + + while (current_vertex_buffer_slot > local_vertex_buffer_size) + local_vertex_buffer_size <<= 1; + + VertexBufferSlot *new_vertex_buffer = (VertexBufferSlot*)realloc(local_vertex_buffer, local_vertex_buffer_size * sizeof(VertexBufferSlot)); + + if (new_vertex_buffer != NULL) + { + local_vertex_buffer = new_vertex_buffer; + } + else + { + Backend_PrintError("Couldn't expand vertex buffer"); + return NULL; + } + } + + return &local_vertex_buffer[current_vertex_buffer_slot - 1]; +} + +static void FlushVertexBuffer(void) +{ + if (current_vertex_buffer_slot == 0) + return; + + glBufferData(GL_ARRAY_BUFFER, current_vertex_buffer_slot * sizeof(VertexBufferSlot), local_vertex_buffer, GL_STREAM_DRAW); + + glDrawArrays(GL_TRIANGLES, 0, 6 * current_vertex_buffer_slot); + + current_vertex_buffer_slot = 0; +} + +#ifndef USE_OPENGLES2 + +static const char* GetOpenGLErrorCodeDescription(GLenum error_code) +{ + switch (error_code) + { + case GL_NO_ERROR: + return "No error"; + + case GL_INVALID_ENUM: + return "An unacceptable value was specified for enumerated argument"; + + case GL_INVALID_VALUE: + return "A numeric argument is out of range"; + + case GL_INVALID_OPERATION: + return "The specified operation is not allowed in the current state"; + + case GL_INVALID_FRAMEBUFFER_OPERATION: + return "The framebuffer object is not complete"; + + case GL_OUT_OF_MEMORY: + return "There is not enough memory left to execute the command"; + + /* + * For some reason glad does not define these even though they are there in OpenGL 3.2 + */ + +/* + case GL_STACK_UNDERFLOW: + return "An attempt has been made to perform an operation that would cause an internal stack to underflow"; + + case GL_STACK_OVERFLOW: + return "An attempt has been made to perform an operation that would cause an internal stack to overflow"; +*/ + + default: + return "Unknown error"; + } +} + +static void PostGLCallCallback(const char *name, void *function_pointer, int length_arguments, ...) +{ + (void)function_pointer; + (void)length_arguments; + + GLenum error_code = glad_glGetError(); // Manually use glad_glGetError. Otherwise, glad_debug_glGetError would be called and we'd get infinite recursion into this function + + if (error_code != GL_NO_ERROR) + Backend_PrintError("Error %d in %s: %s", error_code, name, GetOpenGLErrorCodeDescription(error_code)); +} + +#endif + +/////////////////////////////////// +// Render-backend initialisation // +/////////////////////////////////// + +RenderBackend_Surface* RenderBackend_Init(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ +#ifndef USE_OPENGLES2 + glad_set_post_callback(PostGLCallCallback); +#endif + + size_t actual_screen_width = screen_width; + size_t actual_screen_height = screen_height; + + if (WindowBackend_OpenGL_CreateWindow(window_title, &actual_screen_width, &actual_screen_height, fullscreen, *vsync)) + { + Backend_PrintInfo("GL_VENDOR = %s", glGetString(GL_VENDOR)); + Backend_PrintInfo("GL_RENDERER = %s", glGetString(GL_RENDERER)); + Backend_PrintInfo("GL_VERSION = %s", glGetString(GL_VERSION)); + Backend_PrintInfo("GL_SHADING_LANGUAGE_VERSION = %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); + + // We're using pre-multiplied alpha so we can blend onto textures that have their own alpha + // http://apoorvaj.io/alpha-compositing-opengl-blending-and-premultiplied-alpha.html + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + + //glEnable(GL_DEBUG_OUTPUT); + //glDebugMessageCallback(MessageCallback, 0); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + #ifndef USE_OPENGLES2 + // Set up Vertex Array Object + glGenVertexArrays(1, &vertex_array_id); + glBindVertexArray(vertex_array_id); + #endif + + // Set up Vertex Buffer Object + glGenBuffers(1, &vertex_buffer_id); + glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id); + glVertexAttribPointer(ATTRIBUTE_INPUT_VERTEX_COORDINATES, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, position)); + glVertexAttribPointer(ATTRIBUTE_INPUT_TEXTURE_COORDINATES, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, texture)); + + // Set up the vertex attributes + glEnableVertexAttribArray(ATTRIBUTE_INPUT_VERTEX_COORDINATES); + + // Set up our shaders + program_texture.id = CompileShader(vertex_shader_texture, fragment_shader_texture); + program_colour_fill.id = CompileShader(vertex_shader_plain, fragment_shader_colour_fill); + program_glyph.id = CompileShader(vertex_shader_texture, fragment_shader_glyph); + + if (program_texture.id != 0 && program_colour_fill.id != 0 && program_glyph.id != 0) + { + // Get shader uniforms + program_texture.uniforms.texture_coordinate_transform = glGetUniformLocation(program_texture.id, "texture_coordinate_transform"); + program_texture.uniforms.vertex_transform = glGetUniformLocation(program_texture.id, "vertex_transform"); + +// program_texture_colour_key.uniforms.texture_coordinate_transform = glGetUniformLocation(program_texture_colour_key.id, "texture_coordinate_transform"); +// program_texture_colour_key.uniforms.vertex_transform = glGetUniformLocation(program_texture_colour_key.id, "vertex_transform"); + + program_colour_fill.uniforms.vertex_transform = glGetUniformLocation(program_colour_fill.id, "vertex_transform"); + program_colour_fill.uniforms.colour = glGetUniformLocation(program_colour_fill.id, "colour"); + + program_glyph.uniforms.texture_coordinate_transform = glGetUniformLocation(program_glyph.id, "texture_coordinate_transform"); + program_glyph.uniforms.vertex_transform = glGetUniformLocation(program_glyph.id, "vertex_transform"); + program_glyph.uniforms.colour = glGetUniformLocation(program_glyph.id, "colour"); + + // Set up framebuffer (used for surface-to-surface blitting) + glGenFramebuffers(1, &framebuffer_id); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id); + + // Set up framebuffer screen texture (used for screen-to-surface blitting) + framebuffer_surface = RenderBackend_CreateSurface(screen_width, screen_height, true); + + // Set up window surface + window_surface.texture_id = 0; + + RenderBackend_HandleWindowResize(actual_screen_width, actual_screen_height); + + return framebuffer_surface; + } + + if (program_glyph.id != 0) + glDeleteProgram(program_glyph.id); + + if (program_colour_fill.id != 0) + glDeleteProgram(program_colour_fill.id); + + if (program_texture.id != 0) + glDeleteProgram(program_texture.id); + + glDeleteBuffers(1, &vertex_buffer_id); + #ifndef USE_OPENGLES2 + glDeleteVertexArrays(1, &vertex_array_id); + #endif + } + + return NULL; +} + +void RenderBackend_Deinit(void) +{ + free(local_vertex_buffer); + + if (upscaled_framebuffer_surface != NULL) + RenderBackend_FreeSurface(upscaled_framebuffer_surface); + RenderBackend_FreeSurface(framebuffer_surface); + glDeleteFramebuffers(1, &framebuffer_id); + glDeleteProgram(program_glyph.id); + glDeleteProgram(program_colour_fill.id); + glDeleteProgram(program_texture.id); + glDeleteBuffers(1, &vertex_buffer_id); +#ifndef USE_OPENGLES2 + glDeleteVertexArrays(1, &vertex_array_id); +#endif + + WindowBackend_OpenGL_DestroyWindow(); +} + +void RenderBackend_DrawScreen(void) +{ + RenderBackend_Rect framebuffer_rect; + framebuffer_rect.left = 0; + framebuffer_rect.top = 0; + framebuffer_rect.right = framebuffer_surface->width; + framebuffer_rect.bottom = framebuffer_surface->height; + + if (upscaled_framebuffer_surface == NULL) + { + Blit(framebuffer_surface, &framebuffer_rect, &window_surface, &window_rect, false); + } + else + { + RenderBackend_Rect upscaled_framebuffer_rect; + upscaled_framebuffer_rect.left = 0; + upscaled_framebuffer_rect.top = 0; + upscaled_framebuffer_rect.right = upscaled_framebuffer_surface->width; + upscaled_framebuffer_rect.bottom = upscaled_framebuffer_surface->height; + + Blit(framebuffer_surface, &framebuffer_rect, upscaled_framebuffer_surface, &upscaled_framebuffer_rect, false); + Blit(upscaled_framebuffer_surface, &upscaled_framebuffer_rect, &window_surface, &window_rect, false); + } + + // Target actual screen, and not our framebuffer + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + // According to https://www.khronos.org/opengl/wiki/Common_Mistakes#Swap_Buffers + // the buffer should always be cleared, even if it seems unnecessary + glClear(GL_COLOR_BUFFER_BIT); + + // Flush the vertex buffer, which will render to the screen + FlushVertexBuffer(); + + WindowBackend_OpenGL_Display(); + + // Switch back to our framebuffer + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id); +} + +//////////////////////// +// Surface management // +//////////////////////// + +static RenderBackend_Surface* CreateSurface(size_t width, size_t height, bool linear_filter) +{ + RenderBackend_Surface *surface = (RenderBackend_Surface*)malloc(sizeof(RenderBackend_Surface)); + + if (surface == NULL) + return NULL; + + glGenTextures(1, &surface->texture_id); + glBindTexture(GL_TEXTURE_2D, surface->texture_id); +#ifdef USE_OPENGLES2 + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); +#else + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); +#endif + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, linear_filter ? GL_LINEAR : GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, linear_filter ? GL_LINEAR : GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +#ifndef USE_OPENGLES2 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); +#endif + + glBindTexture(GL_TEXTURE_2D, last_source_texture); + + surface->width = width; + surface->height = height; + + return surface; +} + +RenderBackend_Surface* RenderBackend_CreateSurface(size_t width, size_t height, bool render_target) +{ + (void)render_target; + + return CreateSurface(width, height, false); +} + +void RenderBackend_FreeSurface(RenderBackend_Surface *surface) +{ + // Flush the vertex buffer if we're about to destroy its texture + if (surface->texture_id == last_source_texture) + { + FlushVertexBuffer(); + last_source_texture = 0; + } + + if (surface->texture_id == last_destination_texture) + { + FlushVertexBuffer(); + last_destination_texture = 0; + } + + glDeleteTextures(1, &surface->texture_id); + free(surface); +} + +bool RenderBackend_IsSurfaceLost(RenderBackend_Surface *surface) +{ + (void)surface; + + return false; +} + +void RenderBackend_RestoreSurface(RenderBackend_Surface *surface) +{ + (void)surface; +} + +void RenderBackend_UploadSurface(RenderBackend_Surface *surface, const unsigned char *pixels, size_t width, size_t height) +{ + unsigned char *buffer = (unsigned char*)malloc(width * height * 4); + + if (buffer == NULL) + { + Backend_PrintError("Couldn't allocate memory for surface buffer"); + return; + } + + // Flush the vertex buffer if we're about to modify its texture + if (surface->texture_id == last_source_texture || surface->texture_id == last_destination_texture) + FlushVertexBuffer(); + + // Pre-multiply the colour channels with the alpha, so blending works correctly + const unsigned char *src_pointer = pixels; + unsigned char *dst_pointer = buffer; + + for (unsigned int y = 0; y < height; ++y) + { + for (unsigned int x = 0; x < width; ++x) + { + *dst_pointer++ = (src_pointer[0] * src_pointer[3]) / 0xFF; + *dst_pointer++ = (src_pointer[1] * src_pointer[3]) / 0xFF; + *dst_pointer++ = (src_pointer[2] * src_pointer[3]) / 0xFF; + *dst_pointer++ = src_pointer[3]; + src_pointer += 4; + } + } + + SetTextureUploadAlignment(width * 4); + glBindTexture(GL_TEXTURE_2D, surface->texture_id); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + free(buffer); + glBindTexture(GL_TEXTURE_2D, last_source_texture); +} + +///////////// +// Drawing // +///////////// + +static void Blit(RenderBackend_Surface *source_surface, const RenderBackend_Rect *source_rect, RenderBackend_Surface *destination_surface, const RenderBackend_Rect *destination_rect, bool alpha_blend) +{ + const RenderMode render_mode = (alpha_blend ? MODE_DRAW_SURFACE_WITH_TRANSPARENCY : MODE_DRAW_SURFACE); + + // Flush vertex data if a context-change is needed + if (last_render_mode != render_mode || last_source_texture != source_surface->texture_id || last_destination_texture != destination_surface->texture_id) + { + FlushVertexBuffer(); + + last_render_mode = render_mode; + last_source_texture = source_surface->texture_id; + last_destination_texture = destination_surface->texture_id; + + // Point our framebuffer to the destination texture + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destination_surface->texture_id, 0); + + glViewport(0, 0, destination_surface->width, destination_surface->height); + + GLfloat vertex_transform[4 * 4] = { + 2.0f / destination_surface->width, 0.0f, 0.0f, -1.0f, + 0.0f, 2.0f / destination_surface->height, 0.0f, -1.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + }; + + // Invert the Y-axis when drawing to the screen, since everything is upside-down in OpenGL for some reason + if (destination_surface->texture_id == 0) + { + vertex_transform[4 + 1] = -vertex_transform[4 + 1]; + vertex_transform[4 + 3] = -vertex_transform[4 + 3]; + } + + // Switch to colour-key shader if we have to + glUseProgram(program_texture.id); + glUniform2f(program_texture.uniforms.texture_coordinate_transform, 1.0f / source_surface->width, 1.0f / source_surface->height); + glUniformMatrix4fv(program_texture.uniforms.vertex_transform, 1, GL_FALSE, vertex_transform); + + if (alpha_blend) + glEnable(GL_BLEND); + else + glDisable(GL_BLEND); + + // Enable texture coordinates, since this uses textures + glEnableVertexAttribArray(ATTRIBUTE_INPUT_TEXTURE_COORDINATES); + + glBindTexture(GL_TEXTURE_2D, source_surface->texture_id); + } + + // Add data to the vertex queue + VertexBufferSlot *vertex_buffer_slot = GetVertexBufferSlot(); + + if (vertex_buffer_slot != NULL) + { + const GLfloat vertex_left = destination_rect->left; + const GLfloat vertex_top = destination_rect->top; + const GLfloat vertex_right = destination_rect->right; + const GLfloat vertex_bottom = destination_rect->bottom; + + vertex_buffer_slot->vertices[0][0].position.x = vertex_left; + vertex_buffer_slot->vertices[0][0].position.y = vertex_top; + vertex_buffer_slot->vertices[0][1].position.x = vertex_right; + vertex_buffer_slot->vertices[0][1].position.y = vertex_top; + vertex_buffer_slot->vertices[0][2].position.x = vertex_right; + vertex_buffer_slot->vertices[0][2].position.y = vertex_bottom; + + vertex_buffer_slot->vertices[1][0].position.x = vertex_left; + vertex_buffer_slot->vertices[1][0].position.y = vertex_top; + vertex_buffer_slot->vertices[1][1].position.x = vertex_right; + vertex_buffer_slot->vertices[1][1].position.y = vertex_bottom; + vertex_buffer_slot->vertices[1][2].position.x = vertex_left; + vertex_buffer_slot->vertices[1][2].position.y = vertex_bottom; + + const GLfloat texture_left = source_rect->left; + const GLfloat texture_top = source_rect->top; + const GLfloat texture_right = source_rect->right; + const GLfloat texture_bottom = source_rect->bottom; + + vertex_buffer_slot->vertices[0][0].texture.x = texture_left; + vertex_buffer_slot->vertices[0][0].texture.y = texture_top; + vertex_buffer_slot->vertices[0][1].texture.x = texture_right; + vertex_buffer_slot->vertices[0][1].texture.y = texture_top; + vertex_buffer_slot->vertices[0][2].texture.x = texture_right; + vertex_buffer_slot->vertices[0][2].texture.y = texture_bottom; + + vertex_buffer_slot->vertices[1][0].texture.x = texture_left; + vertex_buffer_slot->vertices[1][0].texture.y = texture_top; + vertex_buffer_slot->vertices[1][1].texture.x = texture_right; + vertex_buffer_slot->vertices[1][1].texture.y = texture_bottom; + vertex_buffer_slot->vertices[1][2].texture.x = texture_left; + vertex_buffer_slot->vertices[1][2].texture.y = texture_bottom; + } +} + +void RenderBackend_Blit(RenderBackend_Surface *source_surface, const RenderBackend_Rect *rect, RenderBackend_Surface *destination_surface, long x, long y, bool colour_key) +{ + const RenderBackend_Rect destination_rect = {x, y, x + (rect->right - rect->left), y + (rect->bottom - rect->top)}; + + Blit(source_surface, rect, destination_surface, &destination_rect, colour_key); +} + +void RenderBackend_ColourFill(RenderBackend_Surface *surface, const RenderBackend_Rect *rect, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) +{ + static unsigned char last_red; + static unsigned char last_green; + static unsigned char last_blue; + + // Flush vertex data if a context-change is needed + if (last_render_mode != MODE_COLOUR_FILL || last_destination_texture != surface->texture_id || last_red != red || last_green != green || last_blue != blue) + { + FlushVertexBuffer(); + + last_render_mode = MODE_COLOUR_FILL; + last_source_texture = 0; + last_destination_texture = surface->texture_id; + last_red = red; + last_green = green; + last_blue = blue; + + // Point our framebuffer to the destination texture + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, surface->texture_id, 0); + glViewport(0, 0, surface->width, surface->height); + + const GLfloat vertex_transform[4 * 4] = { + 2.0f / surface->width, 0.0f, 0.0f, -1.0f, + 0.0f, 2.0f / surface->height, 0.0f, -1.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + }; + + glUseProgram(program_colour_fill.id); + glUniformMatrix4fv(program_colour_fill.uniforms.vertex_transform, 1, GL_FALSE, vertex_transform); + + glDisable(GL_BLEND); + + // Disable texture coordinate array, since this doesn't use textures + glDisableVertexAttribArray(ATTRIBUTE_INPUT_TEXTURE_COORDINATES); + + glUniform4f(program_colour_fill.uniforms.colour, red / 255.0f, green / 255.0f, blue / 255.0f, alpha / 255.0f); + } + + // Add data to the vertex queue + VertexBufferSlot *vertex_buffer_slot = GetVertexBufferSlot(); + + if (vertex_buffer_slot != NULL) + { + const GLfloat vertex_left = rect->left; + const GLfloat vertex_top = rect->top; + const GLfloat vertex_right = rect->right; + const GLfloat vertex_bottom = rect->bottom; + + vertex_buffer_slot->vertices[0][0].position.x = vertex_left; + vertex_buffer_slot->vertices[0][0].position.y = vertex_top; + vertex_buffer_slot->vertices[0][1].position.x = vertex_right; + vertex_buffer_slot->vertices[0][1].position.y = vertex_top; + vertex_buffer_slot->vertices[0][2].position.x = vertex_right; + vertex_buffer_slot->vertices[0][2].position.y = vertex_bottom; + + vertex_buffer_slot->vertices[1][0].position.x = vertex_left; + vertex_buffer_slot->vertices[1][0].position.y = vertex_top; + vertex_buffer_slot->vertices[1][1].position.x = vertex_right; + vertex_buffer_slot->vertices[1][1].position.y = vertex_bottom; + vertex_buffer_slot->vertices[1][2].position.x = vertex_left; + vertex_buffer_slot->vertices[1][2].position.y = vertex_bottom; + } +} + +////////////////////// +// Glyph management // +////////////////////// + +RenderBackend_GlyphAtlas* RenderBackend_CreateGlyphAtlas(size_t width, size_t height) +{ + RenderBackend_GlyphAtlas *atlas = (RenderBackend_GlyphAtlas*)malloc(sizeof(RenderBackend_GlyphAtlas)); + + if (atlas != NULL) + { + atlas->width = width; + atlas->height = height; + + glGenTextures(1, &atlas->texture_id); + glBindTexture(GL_TEXTURE_2D, atlas->texture_id); + + #ifdef USE_OPENGLES2 + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); + #else + glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, NULL); + #endif + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + #ifndef USE_OPENGLES2 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + #endif + + glBindTexture(GL_TEXTURE_2D, last_source_texture); + } + + return atlas; +} + +void RenderBackend_DestroyGlyphAtlas(RenderBackend_GlyphAtlas *atlas) +{ + glDeleteTextures(1, &atlas->texture_id); + free(atlas); +} + +void RenderBackend_UploadGlyph(RenderBackend_GlyphAtlas *atlas, size_t x, size_t y, const unsigned char *pixels, size_t width, size_t height, size_t pitch) +{ +#ifdef USE_OPENGLES2 + unsigned char *buffer = (unsigned char*)malloc(width * height); + + if (buffer == NULL) + return; + + for (size_t y = 0; y < height; ++y) + memcpy (&buffer[y * width], &pixels[y * pitch], width); +#else + const unsigned char *buffer = pixels; + + glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch); +#endif + + SetTextureUploadAlignment(width); + glBindTexture(GL_TEXTURE_2D, atlas->texture_id); +#ifdef USE_OPENGLES2 + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer); +#else + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_RED, GL_UNSIGNED_BYTE, buffer); +#endif + glBindTexture(GL_TEXTURE_2D, last_source_texture); + +#ifdef USE_OPENGLES2 + free(buffer); +#else + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); +#endif +} + +void RenderBackend_PrepareToDrawGlyphs(RenderBackend_GlyphAtlas *atlas, RenderBackend_Surface *destination_surface, unsigned char red, unsigned char green, unsigned char blue) +{ + static unsigned char last_red; + static unsigned char last_green; + static unsigned char last_blue; + + // Flush vertex data if a context-change is needed + if (last_render_mode != MODE_DRAW_GLYPH || last_source_texture != atlas->texture_id || last_destination_texture != destination_surface->texture_id || last_red != red || last_green != green || last_blue != blue) + { + FlushVertexBuffer(); + + last_render_mode = MODE_DRAW_GLYPH; + last_source_texture = atlas->texture_id; + last_destination_texture = destination_surface->texture_id; + last_red = red; + last_green = green; + last_blue = blue; + + const GLfloat vertex_transform[4 * 4] = { + 2.0f / destination_surface->width, 0.0f, 0.0f, -1.0f, + 0.0f, 2.0f / destination_surface->height, 0.0f, -1.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + }; + + glUseProgram(program_glyph.id); + glUniform2f(program_glyph.uniforms.texture_coordinate_transform, 1.0f / atlas->width, 1.0f / atlas->height); + glUniform4f(program_glyph.uniforms.colour, red / 255.0f, green / 255.0f, blue / 255.0f, 1.0f); + glUniformMatrix4fv(program_glyph.uniforms.vertex_transform, 1, GL_FALSE, vertex_transform); + + // Point our framebuffer to the destination texture + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destination_surface->texture_id, 0); + glViewport(0, 0, destination_surface->width, destination_surface->height); + + glEnable(GL_BLEND); + + // Enable texture coordinates, since this uses textures + glEnableVertexAttribArray(ATTRIBUTE_INPUT_TEXTURE_COORDINATES); + + glBindTexture(GL_TEXTURE_2D, atlas->texture_id); + } +} + +void RenderBackend_DrawGlyph(long x, long y, size_t glyph_x, size_t glyph_y, size_t glyph_width, size_t glyph_height) +{ + // Add data to the vertex queue + VertexBufferSlot *vertex_buffer_slot = GetVertexBufferSlot(); + + if (vertex_buffer_slot != NULL) + { + const GLfloat vertex_left = x; + const GLfloat vertex_top = y; + const GLfloat vertex_right = x + glyph_width; + const GLfloat vertex_bottom = y + glyph_height; + + vertex_buffer_slot->vertices[0][0].position.x = vertex_left; + vertex_buffer_slot->vertices[0][0].position.y = vertex_top; + vertex_buffer_slot->vertices[0][1].position.x = vertex_right; + vertex_buffer_slot->vertices[0][1].position.y = vertex_top; + vertex_buffer_slot->vertices[0][2].position.x = vertex_right; + vertex_buffer_slot->vertices[0][2].position.y = vertex_bottom; + + vertex_buffer_slot->vertices[1][0].position.x = vertex_left; + vertex_buffer_slot->vertices[1][0].position.y = vertex_top; + vertex_buffer_slot->vertices[1][1].position.x = vertex_right; + vertex_buffer_slot->vertices[1][1].position.y = vertex_bottom; + vertex_buffer_slot->vertices[1][2].position.x = vertex_left; + vertex_buffer_slot->vertices[1][2].position.y = vertex_bottom; + + const GLfloat texture_left = glyph_x; + const GLfloat texture_top = glyph_y; + const GLfloat texture_right = glyph_x + glyph_width; + const GLfloat texture_bottom = glyph_y + glyph_height; + + vertex_buffer_slot->vertices[0][0].texture.x = texture_left; + vertex_buffer_slot->vertices[0][0].texture.y = texture_top; + vertex_buffer_slot->vertices[0][1].texture.x = texture_right; + vertex_buffer_slot->vertices[0][1].texture.y = texture_top; + vertex_buffer_slot->vertices[0][2].texture.x = texture_right; + vertex_buffer_slot->vertices[0][2].texture.y = texture_bottom; + + vertex_buffer_slot->vertices[1][0].texture.x = texture_left; + vertex_buffer_slot->vertices[1][0].texture.y = texture_top; + vertex_buffer_slot->vertices[1][1].texture.x = texture_right; + vertex_buffer_slot->vertices[1][1].texture.y = texture_bottom; + vertex_buffer_slot->vertices[1][2].texture.x = texture_left; + vertex_buffer_slot->vertices[1][2].texture.y = texture_bottom; + } +} + +/////////// +// Misc. // +/////////// + +void RenderBackend_HandleRenderTargetLoss(void) +{ + // No problem for us +} + +void RenderBackend_HandleWindowResize(size_t width, size_t height) +{ + size_t upscale_factor = MAX(1, MIN((width + framebuffer_surface->width / 2) / framebuffer_surface->width, (height + framebuffer_surface->height / 2) / framebuffer_surface->height)); + + size_t upscaled_framebuffer_width = framebuffer_surface->width * upscale_factor; + size_t upscaled_framebuffer_height = framebuffer_surface->height * upscale_factor; + + if (upscaled_framebuffer_surface != NULL) + { + RenderBackend_FreeSurface(upscaled_framebuffer_surface); + upscaled_framebuffer_surface = NULL; + } + + // Create rect that forces 4:3 no matter what size the window is + if (width * upscaled_framebuffer_height >= upscaled_framebuffer_width * height) // Fancy way to do `if (width / height >= upscaled_framebuffer->width / upscaled_framebuffer->height)` without floats + { + window_rect.right = (height * upscaled_framebuffer_width) / upscaled_framebuffer_height; + window_rect.bottom = height; + } + else + { + window_rect.right = width; + window_rect.bottom = (width * upscaled_framebuffer_height) / upscaled_framebuffer_width; + } + + window_rect.left = (width - window_rect.right) / 2; + window_rect.top = (height - window_rect.bottom) / 2; + window_rect.right += window_rect.left; + window_rect.bottom += window_rect.top; + + window_surface.width = width; + window_surface.height = height; + + if ((window_rect.right - window_rect.left) % framebuffer_surface->width != 0 || (window_rect.bottom - window_rect.top) % framebuffer_surface->height != 0) + { + upscaled_framebuffer_surface = CreateSurface(upscaled_framebuffer_width, upscaled_framebuffer_height, true); + + if (upscaled_framebuffer_surface == NULL) + Backend_PrintError("Couldn't regenerate upscaled framebuffer"); + } +} diff --git a/src/Backends/Rendering/OpenGLES2.cpp b/src/Backends/Rendering/OpenGLES2.cpp new file mode 100644 index 0000000..f24f857 --- /dev/null +++ b/src/Backends/Rendering/OpenGLES2.cpp @@ -0,0 +1,4 @@ +// I would use -DUSE_OPENGLES2 when RENDERER=OpenGLES2 is passed instead, but CMake likes to rebuild the entire +// project if I do that, and Make doesn't bother rebuilding anything at all. This method avoids both of those problems. +#define USE_OPENGLES2 +#include "OpenGL3.cpp" diff --git a/src/Backends/Rendering/SDLTexture.cpp b/src/Backends/Rendering/SDLTexture.cpp new file mode 100644 index 0000000..8685aee --- /dev/null +++ b/src/Backends/Rendering/SDLTexture.cpp @@ -0,0 +1,457 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Rendering.h" + +#include +#include +#include +#include + +#include "SDL.h" + +#include "../../WindowsWrapper.h" + +#include "../Misc.h" +#include "../Shared/SDL.h" + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#define MAX(a,b) ((a) > (b) ? (a) : (b)) + +typedef struct RenderBackend_Surface +{ + SDL_Texture *texture; + size_t width; + size_t height; + bool render_target; + bool lost; + + struct RenderBackend_Surface *next; + struct RenderBackend_Surface *prev; +} RenderBackend_Surface; + +typedef struct RenderBackend_GlyphAtlas +{ + SDL_Texture *texture; +} RenderBackend_GlyphAtlas; + +SDL_Window *window; + +static SDL_Renderer *renderer; + +static RenderBackend_Surface framebuffer; +static RenderBackend_Surface upscaled_framebuffer; + +static SDL_Rect window_rect; + +static RenderBackend_Surface *surface_list_head; + +static RenderBackend_GlyphAtlas *glyph_atlas; + +static SDL_BlendMode premultiplied_blend_mode; + +static void RectToSDLRect(const RenderBackend_Rect *rect, SDL_Rect *sdl_rect) +{ + sdl_rect->x = (int)rect->left; + sdl_rect->y = (int)rect->top; + sdl_rect->w = (int)(rect->right - rect->left); + sdl_rect->h = (int)(rect->bottom - rect->top); + + if (sdl_rect->w < 0) + sdl_rect->w = 0; + + if (sdl_rect->h < 0) + sdl_rect->h = 0; +} + +RenderBackend_Surface* RenderBackend_Init(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ + Backend_PrintInfo("Available SDL render drivers:"); + + for (int i = 0; i < SDL_GetNumRenderDrivers(); ++i) + { + SDL_RendererInfo info; + if (SDL_GetRenderDriverInfo(i, &info) < 0) + Backend_PrintError("Couldn't get render driver information: %s", SDL_GetError()); + else + Backend_PrintInfo("%s", info.name); + } + + window = SDL_CreateWindow(window_title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, screen_width, screen_height, SDL_WINDOW_RESIZABLE); + + if (window != NULL) + { + if (fullscreen) + if (SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP) < 0) + Backend_PrintError("Couldn't set window to fullscreen: %s", SDL_GetError()); + + #if SDL_VERSION_ATLEAST(2,0,10) + SDL_SetHint(SDL_HINT_RENDER_BATCHING, "1"); // We never interfere with the renderer, so don't let SDL implicitly disable batching + #endif + + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE | (*vsync ? SDL_RENDERER_PRESENTVSYNC : 0)); + + if (renderer != NULL) + { + SDL_RendererInfo info; + if (SDL_GetRendererInfo(renderer, &info) < 0) + Backend_PrintError("Couldn't get selected render driver information: %s", SDL_GetError()); + else + Backend_PrintInfo("Selected SDL render driver: %s", info.name); + + framebuffer.texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_TARGET, screen_width, screen_height); + + if (framebuffer.texture != NULL) + { + SDL_SetTextureBlendMode(framebuffer.texture, SDL_BLENDMODE_NONE); + + framebuffer.width = screen_width; + framebuffer.height = screen_height; + + // Set up our premultiplied-alpha blend mode + premultiplied_blend_mode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD, SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD); + + RenderBackend_HandleWindowResize(screen_width, screen_height); + + Backend_PostWindowCreation(); + + return &framebuffer; + } + else + { + std::string error_message = std::string("Could not create framebuffer: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (SDLTexture rendering backend)", error_message.c_str()); + } + + SDL_DestroyRenderer(renderer); + } + else + { + std::string error_message = std::string("Could not create renderer: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (SDLTexture rendering backend)", error_message.c_str()); + } + + + SDL_DestroyWindow(window); + } + else + { + std::string error_message = std::string("Could not create window: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (SDLTexture rendering backend)", error_message.c_str()); + } + + return NULL; +} + +void RenderBackend_Deinit(void) +{ + if (upscaled_framebuffer.texture != NULL) + SDL_DestroyTexture(upscaled_framebuffer.texture); + + SDL_DestroyTexture(framebuffer.texture); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); +} + +void RenderBackend_DrawScreen(void) +{ + if (upscaled_framebuffer.texture != NULL) + { + if (SDL_SetRenderTarget(renderer, upscaled_framebuffer.texture) < 0) + Backend_PrintError("Couldn't set upscaled framebuffer as the current rendering target: %s", SDL_GetError()); + + if (SDL_RenderCopy(renderer, framebuffer.texture, NULL, NULL) < 0) + Backend_PrintError("Failed to copy framebuffer texture to upscaled framebuffer: %s", SDL_GetError()); + } + + if (SDL_SetRenderTarget(renderer, NULL) < 0) + Backend_PrintError("Couldn't set default render target as the current rendering target: %s", SDL_GetError()); + + if (SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xFF) < 0) + Backend_PrintError("Couldn't set color for drawing operations: %s", SDL_GetError()); + + SDL_RenderClear(renderer); + + if (SDL_RenderCopy(renderer, upscaled_framebuffer.texture != NULL ? upscaled_framebuffer.texture : framebuffer.texture, NULL, &window_rect) < 0) + Backend_PrintError("Failed to copy upscaled framebuffer texture to default render target: %s", SDL_GetError()); + + SDL_RenderPresent(renderer); +} + +RenderBackend_Surface* RenderBackend_CreateSurface(size_t width, size_t height, bool render_target) +{ + RenderBackend_Surface *surface = (RenderBackend_Surface*)malloc(sizeof(RenderBackend_Surface)); + + if (surface == NULL) + return NULL; + + surface->texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA32, render_target ? SDL_TEXTUREACCESS_TARGET : SDL_TEXTUREACCESS_STATIC, width, height); + + if (surface->texture == NULL) + { + free(surface); + return NULL; + } + + surface->width = width; + surface->height = height; + surface->render_target = render_target; + surface->lost = false; + + // Add to linked-list + surface->prev = NULL; + surface->next = surface_list_head; + surface_list_head = surface; + + if (surface->next != NULL) + surface->next->prev = surface; + + return surface; +} + +void RenderBackend_FreeSurface(RenderBackend_Surface *surface) +{ + // Remove from linked list + if (surface->next != NULL) + surface->next->prev = surface->prev; + if (surface->prev != NULL) + surface->prev->next = surface->next; + + if (surface->prev == NULL) + surface_list_head = surface->next; + + SDL_DestroyTexture(surface->texture); + free(surface); +} + +bool RenderBackend_IsSurfaceLost(RenderBackend_Surface *surface) +{ + return surface->lost; +} + +void RenderBackend_RestoreSurface(RenderBackend_Surface *surface) +{ + surface->lost = false; +} + +void RenderBackend_UploadSurface(RenderBackend_Surface *surface, const unsigned char *pixels, size_t width, size_t height) +{ + unsigned char *buffer = (unsigned char*)malloc(width * height * 4); + + if (buffer == NULL) + { + Backend_PrintError("Couldn't allocate memory for surface buffer"); + return; + } + + const unsigned char *src_pixel = pixels; + unsigned char *buffer_pointer = buffer; + + // Pre-multiply the colour channels with the alpha, so blending works correctly + for (size_t y = 0; y < height; ++y) + { + for (size_t x = 0; x < width; ++x) + { + *buffer_pointer++ = (src_pixel[0] * src_pixel[3]) / 0xFF; + *buffer_pointer++ = (src_pixel[1] * src_pixel[3]) / 0xFF; + *buffer_pointer++ = (src_pixel[2] * src_pixel[3]) / 0xFF; + *buffer_pointer++ = src_pixel[3]; + src_pixel += 4; + } + } + + SDL_Rect rect = {0, 0, (int)width, (int)height}; + + if (SDL_UpdateTexture(surface->texture, &rect, buffer, width * 4) < 0) + Backend_PrintError("Couldn't update part of texture: %s", SDL_GetError()); + + free(buffer); +} + +void RenderBackend_Blit(RenderBackend_Surface *source_surface, const RenderBackend_Rect *rect, RenderBackend_Surface *destination_surface, long x, long y, bool alpha_blend) +{ + SDL_Rect source_rect; + RectToSDLRect(rect, &source_rect); + + SDL_Rect destination_rect = {(int)x, (int)y, source_rect.w, source_rect.h}; + + // Blit the texture + if (SDL_SetTextureBlendMode(source_surface->texture, alpha_blend ? premultiplied_blend_mode : SDL_BLENDMODE_NONE) < 0) + Backend_PrintError("Couldn't set texture blend mode: %s", SDL_GetError()); + + if (SDL_SetRenderTarget(renderer, destination_surface->texture) < 0) + Backend_PrintError("Couldn't set current rendering target: %s", SDL_GetError()); + + if (SDL_RenderCopy(renderer, source_surface->texture, &source_rect, &destination_rect) < 0) + Backend_PrintError("Couldn't copy part of texture to rendering target: %s", SDL_GetError()); +} + +void RenderBackend_ColourFill(RenderBackend_Surface *surface, const RenderBackend_Rect *rect, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) +{ + SDL_Rect sdl_rect; + RectToSDLRect(rect, &sdl_rect); + + if (SDL_SetRenderDrawColor(renderer, (red * alpha) / 0xFF, (green * alpha) / 0xFF, (blue * alpha) / 0xFF, alpha) < 0) + Backend_PrintError("Couldn't set color for drawing operations: %s", SDL_GetError()); + + // Draw colour + if (SDL_SetRenderTarget(renderer, surface->texture) < 0) + Backend_PrintError("Couldn't set texture current rendering target: %s", SDL_GetError()); + + if (SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE) < 0) + Backend_PrintError("Couldn't disable blending for drawing operations: %s", SDL_GetError()); + + if (SDL_RenderFillRect(renderer, &sdl_rect) < 0) + Backend_PrintError("Couldn't fill rectangle on current rendering target: %s", SDL_GetError()); + + if (SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND) < 0) + Backend_PrintError("Couldn't enable alpha blending for drawing operations: %s", SDL_GetError()); +} + +RenderBackend_GlyphAtlas* RenderBackend_CreateGlyphAtlas(size_t width, size_t height) +{ + RenderBackend_GlyphAtlas *atlas = (RenderBackend_GlyphAtlas*)malloc(sizeof(RenderBackend_GlyphAtlas)); + + if (atlas != NULL) + { + atlas->texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STATIC, width, height); + + if (atlas->texture != NULL) + { + return atlas; + } + else + { + Backend_PrintError("Couldn't create texture for renderer: %s", SDL_GetError()); + } + + free(atlas); + } + + return NULL; +} + +void RenderBackend_DestroyGlyphAtlas(RenderBackend_GlyphAtlas *atlas) +{ + SDL_DestroyTexture(atlas->texture); + free(atlas); +} + +void RenderBackend_UploadGlyph(RenderBackend_GlyphAtlas *atlas, size_t x, size_t y, const unsigned char *pixels, size_t width, size_t height, size_t pitch) +{ + unsigned char *buffer = (unsigned char*)malloc(width * height * 4); + + if (buffer != NULL) + { + unsigned char *destination_pointer = buffer; + + for (size_t iy = 0; iy < height; ++iy) + { + const unsigned char *source_pointer = &pixels[iy * pitch]; + + for (size_t ix = 0; ix < width; ++ix) + { + const unsigned char alpha = *source_pointer++; + + *destination_pointer++ = alpha; + *destination_pointer++ = alpha; + *destination_pointer++ = alpha; + *destination_pointer++ = alpha; + } + } + + SDL_Rect rect; + rect.x = x; + rect.y = y; + rect.w = width; + rect.h = height; + + if (SDL_UpdateTexture(atlas->texture, &rect, buffer, width * 4) < 0) + Backend_PrintError("Couldn't update texture: %s", SDL_GetError()); + + free(buffer); + } +} + +void RenderBackend_PrepareToDrawGlyphs(RenderBackend_GlyphAtlas *atlas, RenderBackend_Surface *destination_surface, unsigned char red, unsigned char green, unsigned char blue) +{ + glyph_atlas = atlas; + + if (SDL_SetRenderTarget(renderer, destination_surface->texture) < 0) + Backend_PrintError("Couldn't set texture as current rendering target: %s", SDL_GetError()); + + // The SDL_Texture side of things uses alpha, not a colour-key, so the bug where the font is blended + // with the colour key doesn't occur. + if (SDL_SetTextureColorMod(atlas->texture, red, green, blue) < 0) + Backend_PrintError("Couldn't set additional color value: %s", SDL_GetError()); + + if (SDL_SetTextureBlendMode(atlas->texture, SDL_BLENDMODE_BLEND) < 0) + Backend_PrintError("Couldn't set texture blend mode: %s", SDL_GetError()); + +} + +void RenderBackend_DrawGlyph(long x, long y, size_t glyph_x, size_t glyph_y, size_t glyph_width, size_t glyph_height) +{ + SDL_Rect source_rect; + source_rect.x = glyph_x; + source_rect.y = glyph_y; + source_rect.w = glyph_width; + source_rect.h = glyph_height; + + SDL_Rect destination_rect; + destination_rect.x = x; + destination_rect.y = y; + destination_rect.w = glyph_width; + destination_rect.h = glyph_height; + + if (SDL_RenderCopy(renderer, glyph_atlas->texture, &source_rect, &destination_rect) < 0) + Backend_PrintError("Couldn't copy glyph texture portion to renderer: %s", SDL_GetError()); +} + +void RenderBackend_HandleRenderTargetLoss(void) +{ + for (RenderBackend_Surface *surface = surface_list_head; surface != NULL; surface = surface->next) + if (surface->render_target) + surface->lost = true; +} + +void RenderBackend_HandleWindowResize(size_t width, size_t height) +{ + size_t upscale_factor = MAX(1, MIN((width + framebuffer.width / 2) / framebuffer.width, (height + framebuffer.height / 2) / framebuffer.height)); + + upscaled_framebuffer.width = framebuffer.width * upscale_factor; + upscaled_framebuffer.height = framebuffer.height * upscale_factor; + + if (upscaled_framebuffer.texture != NULL) + { + SDL_DestroyTexture(upscaled_framebuffer.texture); + upscaled_framebuffer.texture = NULL; + } + + // Create rect that forces 4:3 no matter what size the window is + if (width * upscaled_framebuffer.height >= upscaled_framebuffer.width * height) // Fancy way to do `if (width / height >= upscaled_framebuffer.width / upscaled_framebuffer.height)` without floats + { + window_rect.w = (height * upscaled_framebuffer.width) / upscaled_framebuffer.height; + window_rect.h = height; + } + else + { + window_rect.w = width; + window_rect.h = (width * upscaled_framebuffer.height) / upscaled_framebuffer.width; + } + + window_rect.x = (width - window_rect.w) / 2; + window_rect.y = (height - window_rect.h) / 2; + + if (window_rect.w % framebuffer.width != 0 || window_rect.h % framebuffer.height != 0) + { + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); + upscaled_framebuffer.texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_TARGET, upscaled_framebuffer.width, upscaled_framebuffer.height); + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest"); + + if (upscaled_framebuffer.texture == NULL) + Backend_PrintError("Couldn't regenerate upscaled framebuffer"); + + SDL_SetTextureBlendMode(upscaled_framebuffer.texture, SDL_BLENDMODE_NONE); + } +} diff --git a/src/Backends/Rendering/Software.cpp b/src/Backends/Rendering/Software.cpp new file mode 100644 index 0000000..062b258 --- /dev/null +++ b/src/Backends/Rendering/Software.cpp @@ -0,0 +1,479 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Rendering.h" + +#include +#include +#include + +#include "../Misc.h" +#include "Window/Software.h" +#include "../../Attributes.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +typedef struct RenderBackend_Surface +{ + unsigned char *pixels; + size_t width; + size_t height; + size_t pitch; +} RenderBackend_Surface; + +typedef struct RenderBackend_GlyphAtlas +{ + unsigned char *pixels; + size_t width; + size_t height; +} RenderBackend_GlyphAtlas; + +static RenderBackend_Surface framebuffer; + +static RenderBackend_GlyphAtlas *glyph_atlas; +static RenderBackend_Surface *glyph_destination_surface; +static unsigned char glyph_colour_channels[3]; + +RenderBackend_Surface* RenderBackend_Init(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ + if (WindowBackend_Software_CreateWindow(window_title, screen_width, screen_height, fullscreen, vsync)) + { + framebuffer.pixels = WindowBackend_Software_GetFramebuffer(&framebuffer.pitch); + #ifdef _3DS + framebuffer.width = screen_height; + framebuffer.height = screen_width; + #else + framebuffer.width = screen_width; + framebuffer.height = screen_height; + #endif + + return &framebuffer; + } + else + { + Backend_PrintError("Failed to create window"); + } + + return NULL; +} + +void RenderBackend_Deinit(void) +{ + WindowBackend_Software_DestroyWindow(); +} + +void RenderBackend_DrawScreen(void) +{ + WindowBackend_Software_Display(); + + // Backends may use double-buffering, so fetch a new framebuffer just in case + framebuffer.pixels = WindowBackend_Software_GetFramebuffer(&framebuffer.pitch); +} + +RenderBackend_Surface* RenderBackend_CreateSurface(size_t width, size_t height, bool render_target) +{ + (void)render_target; + + RenderBackend_Surface *surface = (RenderBackend_Surface*)malloc(sizeof(RenderBackend_Surface)); + + if (surface == NULL) + return NULL; + + surface->pixels = (unsigned char*)malloc(width * height * 4); + + if (surface->pixels == NULL) + { + free(surface); + return NULL; + } + +#ifdef _3DS + surface->width = height; + surface->height = width; + surface->pitch = height * 4; +#else + surface->width = width; + surface->height = height; + surface->pitch = width * 4; +#endif + + return surface; +} + +void RenderBackend_FreeSurface(RenderBackend_Surface *surface) +{ + free(surface->pixels); + free(surface); +} + +bool RenderBackend_IsSurfaceLost(RenderBackend_Surface *surface) +{ + (void)surface; + + return false; +} + +void RenderBackend_RestoreSurface(RenderBackend_Surface *surface) +{ + (void)surface; +} + +void RenderBackend_UploadSurface(RenderBackend_Surface *surface, const unsigned char *pixels, size_t width, size_t height) +{ +#ifdef _3DS + // Rotate 90 degrees clockwise, and convert from RGB to BGR + const unsigned char *source_pointer = pixels; + + for (size_t y = 0; y < height; ++y) + { + for (size_t x = 0; x < width; ++x) + { + unsigned char *destination_pixel = &surface->pixels[x * surface->pitch + (surface->width - y - 1) * 4]; + + destination_pixel[2] = *source_pointer++; + destination_pixel[1] = *source_pointer++; + destination_pixel[0] = *source_pointer++; + } + } +#else + for (size_t y = 0; y < height; ++y) + memcpy(&surface->pixels[y * surface->pitch], &pixels[y * width * 4], width * 4); +#endif +} + +ATTRIBUTE_HOT void RenderBackend_Blit(RenderBackend_Surface *source_surface, const RenderBackend_Rect *rect, RenderBackend_Surface *destination_surface, long x, long y, bool alpha_blend) +{ + RenderBackend_Rect rect_clamped; + +#ifdef _3DS + // Rotate + rect_clamped.left = source_surface->width - rect->bottom; + rect_clamped.top = rect->left; + rect_clamped.right = source_surface->width - rect->top; + rect_clamped.bottom = rect->right; + + const long new_x = (destination_surface->width - y) - (rect_clamped.right - rect_clamped.left); + const long new_y = x; + x = new_x; + y = new_y; +#else + rect_clamped.left = rect->left; + rect_clamped.top = rect->top; + rect_clamped.right = rect->right; + rect_clamped.bottom = rect->bottom; +#endif + + // Clamp the rect and coordinates so we don't write outside the pixel buffer + long overflow; + + overflow = 0 - x; + if (overflow > 0) + { + rect_clamped.left += overflow; + x += overflow; + } + + overflow = 0 - y; + if (overflow > 0) + { + rect_clamped.top += overflow; + y += overflow; + } + + overflow = (x + (rect_clamped.right - rect_clamped.left)) - destination_surface->width; + if (overflow > 0) + rect_clamped.right -= overflow; + + overflow = (y + (rect_clamped.bottom - rect_clamped.top)) - destination_surface->height; + if (overflow > 0) + rect_clamped.bottom -= overflow; + + if (rect_clamped.bottom - rect_clamped.top <= 0) + return; + + if (rect_clamped.right - rect_clamped.left <= 0) + return; + + if (alpha_blend) + { + for (long j = 0; j < rect_clamped.bottom - rect_clamped.top; ++j) + { + const unsigned char *source_pointer = &source_surface->pixels[((rect_clamped.top + j) * source_surface->pitch) + (rect_clamped.left * 4)]; + unsigned char *destination_pointer = &destination_surface->pixels[((y + j) * destination_surface->pitch) + (x * 4)]; + + for (long i = 0; i < rect_clamped.right - rect_clamped.left; ++i) + { + if (source_pointer[3] == 0xFF) + { + *destination_pointer++ = *source_pointer++; + *destination_pointer++ = *source_pointer++; + *destination_pointer++ = *source_pointer++; + *destination_pointer++ = *source_pointer++; + } + else if (source_pointer[3] != 0) + { + const float src_alpha = source_pointer[3] / 255.0f; + const float dst_alpha = destination_pointer[3] / 255.0f; + const float out_alpha = src_alpha + dst_alpha * (1.0f - src_alpha); + + for (unsigned int j = 0; j < 3; ++j) + destination_pointer[j] = (unsigned char)((source_pointer[j] * src_alpha + destination_pointer[j] * dst_alpha * (1.0f - src_alpha)) / out_alpha); + + destination_pointer[3] = (unsigned char)(out_alpha * 255.0f); + + source_pointer += 4; + destination_pointer += 4; + } + else + { + source_pointer += 4; + destination_pointer += 4; + } + } + } + } + else + { + const unsigned char *source_pointer = &source_surface->pixels[(rect_clamped.top * source_surface->pitch) + (rect_clamped.left * 4)]; + unsigned char *destination_pointer = &destination_surface->pixels[(y * destination_surface->pitch) + (x * 4)]; + + for (long j = 0; j < rect_clamped.bottom - rect_clamped.top; ++j) + { + memcpy(destination_pointer, source_pointer, (rect_clamped.right - rect_clamped.left) * 4); + + source_pointer += source_surface->pitch; + destination_pointer += destination_surface->pitch; + } + } +} + +ATTRIBUTE_HOT void RenderBackend_ColourFill(RenderBackend_Surface *surface, const RenderBackend_Rect *rect, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) +{ + RenderBackend_Rect rect_clamped; + +#ifdef _3DS + // Rotate + rect_clamped.left = surface->width - rect->bottom; + rect_clamped.top = rect->left; + rect_clamped.right = surface->width - rect->top; + rect_clamped.bottom = rect->right; +#else + rect_clamped.left = rect->left; + rect_clamped.top = rect->top; + rect_clamped.right = rect->right; + rect_clamped.bottom = rect->bottom; +#endif + + // Clamp the rect so it doesn't write outside the pixel buffer + long overflow; + + overflow = 0 - rect_clamped.left; + if (overflow > 0) + rect_clamped.left += overflow; + + overflow = 0 - rect_clamped.top; + if (overflow > 0) + rect_clamped.top += overflow; + + overflow = rect_clamped.right - surface->width; + if (overflow > 0) + rect_clamped.right -= overflow; + + overflow = rect_clamped.bottom - surface->height; + if (overflow > 0) + rect_clamped.bottom -= overflow; + + if (rect_clamped.bottom - rect_clamped.top <= 0) + return; + + if (rect_clamped.right - rect_clamped.left <= 0) + return; + + for (long j = 0; j < rect_clamped.bottom - rect_clamped.top; ++j) + { + unsigned char *destination_pointer = &surface->pixels[((rect_clamped.top + j) * surface->pitch) + (rect_clamped.left * 4)]; + + for (long i = 0; i < rect_clamped.right - rect_clamped.left; ++i) + { + #ifdef _3DS + *destination_pointer++ = alpha; + *destination_pointer++ = blue; + *destination_pointer++ = green; + *destination_pointer++ = red; + #else + *destination_pointer++ = red; + *destination_pointer++ = green; + *destination_pointer++ = blue; + *destination_pointer++ = alpha; + #endif + } + } +} + +RenderBackend_GlyphAtlas* RenderBackend_CreateGlyphAtlas(size_t width, size_t height) +{ + RenderBackend_GlyphAtlas *atlas = (RenderBackend_GlyphAtlas*)malloc(sizeof(RenderBackend_GlyphAtlas)); + + if (atlas != NULL) + { + atlas->pixels = (unsigned char*)malloc(width * height); + + if (atlas->pixels != NULL) + { + #ifdef _3DS + atlas->width = height; + atlas->height = width; + #else + atlas->width = width; + atlas->height = height; + #endif + + return atlas; + } + + free(atlas); + } + + return NULL; +} + +void RenderBackend_DestroyGlyphAtlas(RenderBackend_GlyphAtlas *atlas) +{ + free(atlas->pixels); + free(atlas); +} + +void RenderBackend_UploadGlyph(RenderBackend_GlyphAtlas *atlas, size_t x, size_t y, const unsigned char *pixels, size_t width, size_t height, size_t pitch) +{ +#ifdef _3DS + // Rotate + for (size_t h = 0; h < height; ++h) + { + const unsigned char *source_pointer = &pixels[h * pitch]; + + for (size_t w = 0; w < width; ++w) + atlas->pixels[(x + w) * atlas->width + (atlas->width - (y + h) - 1)] = *source_pointer++; + } +#else + for (size_t i = 0; i < height; ++i) + memcpy(&atlas->pixels[(y + i) * atlas->width + x], &pixels[i * pitch], width); +#endif +} + +void RenderBackend_PrepareToDrawGlyphs(RenderBackend_GlyphAtlas *atlas, RenderBackend_Surface *destination_surface, unsigned char red, unsigned char green, unsigned char blue) +{ + glyph_atlas = atlas; + glyph_destination_surface = destination_surface; + +#ifdef _3DS + glyph_colour_channels[0] = blue; + glyph_colour_channels[1] = green; + glyph_colour_channels[2] = red; +#else + glyph_colour_channels[0] = red; + glyph_colour_channels[1] = green; + glyph_colour_channels[2] = blue; +#endif +} + +void RenderBackend_DrawGlyph(long x, long y, size_t glyph_x, size_t glyph_y, size_t glyph_width, size_t glyph_height) +{ +#ifdef _3DS + // Rotate + const size_t new_glyph_width = glyph_height; + const size_t new_glyph_height = glyph_width; + glyph_width = new_glyph_width; + glyph_height = new_glyph_height; + + const long new_x = (glyph_destination_surface->width - y) - glyph_width; + const long new_y = x; + x = new_x; + y = new_y; + + const long new_glyph_x = (glyph_atlas->width - glyph_y) - glyph_width; + const long new_glyph_y = glyph_x; + glyph_x = new_glyph_x; + glyph_y = new_glyph_y; +#endif + + size_t surface_x; + size_t surface_y; + + // Clamp to within the destination surface's boundaries + if (x < 0) + { + surface_x = -x; + + if (surface_x >= glyph_width) + return; // Glyph is offscreen to the left + + glyph_x += surface_x; + glyph_width -= surface_x; + } + else + { + surface_x = x; + } + + if (surface_x >= glyph_destination_surface->width) + return; // Glyph is offscreen to the right + + if (glyph_width >= glyph_destination_surface->width - surface_x) + glyph_width = glyph_destination_surface->width - surface_x; + + if (y < 0) + { + surface_y = -y; + + if (surface_y >= glyph_height) + return; // Glyph is offscreen to the top + + glyph_y += surface_y; + glyph_height -= surface_y; + } + else + { + surface_y = y; + } + + if (surface_y >= glyph_destination_surface->height) + return; // Glyph is offscreen to the bottom + + if (glyph_height >= glyph_destination_surface->height - surface_y) + glyph_height = glyph_destination_surface->height - surface_y; + + // Do the actual drawing + for (size_t iy = 0; iy < glyph_height; ++iy) + { + for (size_t ix = 0; ix < glyph_width; ++ix) + { + const unsigned char src_alpha_int = glyph_atlas->pixels[(glyph_y + iy) * glyph_atlas->width + (glyph_x + ix)]; + + if (src_alpha_int != 0) + { + const float src_alpha = src_alpha_int / 255.0f; + + unsigned char *bitmap_pixel = &glyph_destination_surface->pixels[(surface_y + iy) * glyph_destination_surface->pitch + (surface_x + ix) * 4]; + + const float dst_alpha = bitmap_pixel[3] / 255.0f; + const float out_alpha = src_alpha + dst_alpha * (1.0f - src_alpha); + + for (unsigned int j = 0; j < 3; ++j) + bitmap_pixel[j] = (unsigned char)((glyph_colour_channels[j] * src_alpha + bitmap_pixel[j] * dst_alpha * (1.0f - src_alpha)) / out_alpha); // Alpha blending + + bitmap_pixel[3] = (unsigned char)(out_alpha * 255.0f); + } + } + } +} + +void RenderBackend_HandleRenderTargetLoss(void) +{ + // No problem for us +} + +void RenderBackend_HandleWindowResize(size_t width, size_t height) +{ + WindowBackend_Software_HandleWindowResize(width, height); +} diff --git a/src/Backends/Rendering/WiiU.cpp b/src/Backends/Rendering/WiiU.cpp new file mode 100644 index 0000000..2e525cf --- /dev/null +++ b/src/Backends/Rendering/WiiU.cpp @@ -0,0 +1,938 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Rendering.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../Misc.h" + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#define MAX(a,b) ((a) > (b) ? (a) : (b)) + +typedef enum RenderMode +{ + MODE_BLANK, + MODE_DRAW_SURFACE, + MODE_DRAW_SURFACE_WITH_TRANSPARENCY, + MODE_COLOUR_FILL, + MODE_DRAW_GLYPH +} RenderMode; + +typedef struct RenderBackend_Surface +{ + GX2Texture texture; + GX2ColorBuffer colour_buffer; + bool render_target; +} RenderBackend_Surface; + +typedef struct RenderBackend_GlyphAtlas +{ + GX2Texture texture; +} RenderBackend_GlyphAtlas; + +typedef struct Coordinate2D +{ + float x; + float y; +} Coordinate2D; + +typedef struct Vertex +{ + Coordinate2D position; + Coordinate2D texture; +} Vertex; + +typedef struct VertexBufferSlot +{ + Vertex vertices[4]; +} VertexBufferSlot; + +static WHBGfxShaderGroup shader_group_texture; +static WHBGfxShaderGroup shader_group_colour_fill; +static WHBGfxShaderGroup shader_group_glyph; + +static GX2RBuffer vertex_buffer; + +static GX2Sampler sampler_point; +static GX2Sampler sampler_linear; + +static RenderBackend_Surface *framebuffer_surface; +static RenderBackend_Surface *upscaled_framebuffer_surface_tv; +static RenderBackend_Surface *upscaled_framebuffer_surface_drc; + +static GX2ContextState *gx2_context; + +static VertexBufferSlot *local_vertex_buffer; +static size_t local_vertex_buffer_size; +static size_t current_vertex_buffer_slot; + +static RenderMode last_render_mode; +static GX2Texture *last_source_texture; +static GX2Texture *last_destination_texture; + +static const unsigned char shader_colour_fill[] = { + #include "WiiUShaders/colour_fill.gsh.h" +}; + +static const unsigned char shader_glyph[] = { + #include "WiiUShaders/glyph.gsh.h" +}; + +static const unsigned char shader_texture[] = { + #include "WiiUShaders/texture.gsh.h" +}; + +static VertexBufferSlot* GetVertexBufferSlot(void) +{ + ++current_vertex_buffer_slot; + + // Check if buffer needs expanding + if (current_vertex_buffer_slot > local_vertex_buffer_size) + { + local_vertex_buffer_size = 1; + + while (current_vertex_buffer_slot > local_vertex_buffer_size) + local_vertex_buffer_size <<= 1; + + VertexBufferSlot *new_vertex_buffer = (VertexBufferSlot*)realloc(local_vertex_buffer, local_vertex_buffer_size * sizeof(VertexBufferSlot)); + + if (new_vertex_buffer != NULL) + { + local_vertex_buffer = new_vertex_buffer; + } + else + { + Backend_PrintError("Couldn't expand vertex buffer"); + return NULL; + } + } + + return &local_vertex_buffer[current_vertex_buffer_slot - 1]; +} + +static void FlushVertexBuffer(void) +{ + static size_t vertex_buffer_size = 1; + + if (current_vertex_buffer_slot == 0) + return; + + // Make sure the buffers aren't currently being used before we modify them + GX2DrawDone(); + + // Upload vertex buffer to VBO, growing it if necessary + if (local_vertex_buffer_size > vertex_buffer_size) + { + vertex_buffer_size = local_vertex_buffer_size; + + GX2RDestroyBufferEx(&vertex_buffer, (GX2RResourceFlags)0); + + vertex_buffer.elemCount = vertex_buffer_size; + + GX2RCreateBuffer(&vertex_buffer); // We're basically screwed if this fails + + GX2RSetAttributeBuffer(&vertex_buffer, 0, sizeof(Vertex), offsetof(Vertex, position)); + GX2RSetAttributeBuffer(&vertex_buffer, 1, sizeof(Vertex), offsetof(Vertex, texture)); + } + + void *vertex_pointer = GX2RLockBufferEx(&vertex_buffer, (GX2RResourceFlags)0); + + memcpy(vertex_pointer, local_vertex_buffer, current_vertex_buffer_slot * sizeof(VertexBufferSlot)); + + GX2RUnlockBufferEx(&vertex_buffer, (GX2RResourceFlags)0); + + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, 4 * current_vertex_buffer_slot, 0, 1); + + current_vertex_buffer_slot = 0; +} + +static void Blit(RenderBackend_Surface *source_surface, const RenderBackend_Rect *source_rect, RenderBackend_Surface *destination_surface, const RenderBackend_Rect *destination_rect, bool alpha_blend) +{ + const RenderMode render_mode = (alpha_blend ? MODE_DRAW_SURFACE_WITH_TRANSPARENCY : MODE_DRAW_SURFACE); + + // Flush vertex data if a context-change is needed + if (last_render_mode != render_mode || last_source_texture != &source_surface->texture || last_destination_texture != &destination_surface->texture) + { + FlushVertexBuffer(); + + last_render_mode = render_mode; + last_source_texture = &source_surface->texture; + last_destination_texture = &destination_surface->texture; + + // Draw to the selected texture, instead of the screen + GX2SetColorBuffer(&destination_surface->colour_buffer, GX2_RENDER_TARGET_0); + GX2SetViewport(0.0f, 0.0f, (float)destination_surface->colour_buffer.surface.width, (float)destination_surface->colour_buffer.surface.height, 0.0f, 1.0f); + GX2SetScissor(0, 0, destination_surface->colour_buffer.surface.width, destination_surface->colour_buffer.surface.height); + + // Bind shader + GX2SetFetchShader(&shader_group_texture.fetchShader); + GX2SetVertexShader(shader_group_texture.vertexShader); + GX2SetPixelShader(shader_group_texture.pixelShader); + + // Set shader uniforms + const float vertex_coordinate_transform[4] = {2.0f / destination_surface->texture.surface.width, -2.0f / destination_surface->texture.surface.height, 1.0f, 1.0f}; + GX2SetVertexUniformReg(shader_group_texture.vertexShader->uniformVars[0].offset, 4, (uint32_t*)vertex_coordinate_transform); + + const float texture_coordinate_transform[4] = {1.0f / source_surface->texture.surface.width, 1.0f / source_surface->texture.surface.height, 1.0f, 1.0f}; + GX2SetVertexUniformReg(shader_group_texture.vertexShader->uniformVars[1].offset, 4, (uint32_t*)texture_coordinate_transform); + + // Bind misc. data + GX2SetPixelSampler(&sampler_point, shader_group_texture.pixelShader->samplerVars[0].location); + GX2SetPixelTexture(&source_surface->texture, shader_group_texture.pixelShader->samplerVars[0].location); + + // Disable blending + GX2SetColorControl(GX2_LOGIC_OP_COPY, alpha_blend ? 0xFF : 0, FALSE, TRUE); + } + + VertexBufferSlot *vertex_buffer_slot = GetVertexBufferSlot(); + + if (vertex_buffer_slot != NULL) + { + // Set vertex position buffer + const float vertex_left = destination_rect->left; + const float vertex_top = destination_rect->top; + const float vertex_right = destination_rect->right; + const float vertex_bottom = destination_rect->bottom; + + vertex_buffer_slot->vertices[0].position.x = vertex_left; + vertex_buffer_slot->vertices[0].position.y = vertex_top; + vertex_buffer_slot->vertices[1].position.x = vertex_right; + vertex_buffer_slot->vertices[1].position.y = vertex_top; + vertex_buffer_slot->vertices[2].position.x = vertex_right; + vertex_buffer_slot->vertices[2].position.y = vertex_bottom; + vertex_buffer_slot->vertices[3].position.x = vertex_left; + vertex_buffer_slot->vertices[3].position.y = vertex_bottom; + + // Set texture coordinate buffer + const float texture_left = source_rect->left; + const float texture_top = source_rect->top; + const float texture_right = source_rect->right; + const float texture_bottom = source_rect->bottom; + + vertex_buffer_slot->vertices[0].texture.x = texture_left; + vertex_buffer_slot->vertices[0].texture.y = texture_top; + vertex_buffer_slot->vertices[1].texture.x = texture_right; + vertex_buffer_slot->vertices[1].texture.y = texture_top; + vertex_buffer_slot->vertices[2].texture.x = texture_right; + vertex_buffer_slot->vertices[2].texture.y = texture_bottom; + vertex_buffer_slot->vertices[3].texture.x = texture_left; + vertex_buffer_slot->vertices[3].texture.y = texture_bottom; + } +} + +RenderBackend_Surface* RenderBackend_Init(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ + (void)window_title; + (void)fullscreen; + + *vsync = true; // Not optional (blame WUT's libwhb) + + if (WHBGfxInit()) + { + // Initialise the shaders + + // Texture shader + if (WHBGfxLoadGFDShaderGroup(&shader_group_texture, 0, shader_texture)) + { + WHBGfxInitShaderAttribute(&shader_group_texture, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); + WHBGfxInitShaderAttribute(&shader_group_texture, "input_texture_coordinates", 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); + WHBGfxInitFetchShader(&shader_group_texture); + + // Texture shader (with colour-key) +// if (WHBGfxLoadGFDShaderGroup(&shader_group_texture_colour_key, 0, shader_texture_colour_key)) +// { +// WHBGfxInitShaderAttribute(&shader_group_texture_colour_key, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); +// WHBGfxInitShaderAttribute(&shader_group_texture_colour_key, "input_texture_coordinates", 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); +// WHBGfxInitFetchShader(&shader_group_texture_colour_key); + + // Colour-fill shader + if (WHBGfxLoadGFDShaderGroup(&shader_group_colour_fill, 0, shader_colour_fill)) + { + WHBGfxInitShaderAttribute(&shader_group_colour_fill, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); + WHBGfxInitFetchShader(&shader_group_colour_fill); + + // Glyph shader + if (WHBGfxLoadGFDShaderGroup(&shader_group_glyph, 0, shader_glyph)) + { + WHBGfxInitShaderAttribute(&shader_group_glyph, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); + WHBGfxInitShaderAttribute(&shader_group_glyph, "input_texture_coordinates", 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); + WHBGfxInitFetchShader(&shader_group_glyph); + + // Initialise samplers + GX2InitSampler(&sampler_point, GX2_TEX_CLAMP_MODE_CLAMP, GX2_TEX_XY_FILTER_MODE_POINT); + GX2InitSampler(&sampler_linear, GX2_TEX_CLAMP_MODE_CLAMP, GX2_TEX_XY_FILTER_MODE_LINEAR); + + // Initialise vertex buffer + vertex_buffer.flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_VERTEX_BUFFER | + GX2R_RESOURCE_USAGE_CPU_READ | + GX2R_RESOURCE_USAGE_CPU_WRITE | + GX2R_RESOURCE_USAGE_GPU_READ); + vertex_buffer.elemSize = sizeof(VertexBufferSlot); + vertex_buffer.elemCount = 1; + + if (GX2RCreateBuffer(&vertex_buffer)) + { + // Create framebuffer surface + framebuffer_surface = RenderBackend_CreateSurface(screen_width, screen_height, true); + + if (framebuffer_surface != NULL) + { + // Set custom blending mode for pre-multiplied alpha + GX2SetBlendControl(GX2_RENDER_TARGET_0, + GX2_BLEND_MODE_ONE, + GX2_BLEND_MODE_INV_SRC_ALPHA, + GX2_BLEND_COMBINE_MODE_ADD, + TRUE, + GX2_BLEND_MODE_ONE, + GX2_BLEND_MODE_INV_SRC_ALPHA, + GX2_BLEND_COMBINE_MODE_ADD); + + // Create upscaled framebuffer surface + size_t tv_width, tv_height; + + switch (GX2GetSystemTVScanMode()) + { + case GX2_TV_SCAN_MODE_480I: + case GX2_TV_SCAN_MODE_480P: + tv_width = 854; + tv_height = 480; + break; + + case GX2_TV_SCAN_MODE_576I: + case GX2_TV_SCAN_MODE_720P: + tv_width = 1280; + tv_height = 720; + break; + + case GX2_TV_SCAN_MODE_1080I: + case GX2_TV_SCAN_MODE_1080P: + tv_width = 1920; + tv_height = 1080; + break; + } + + size_t upscale_factor = MAX(1, MIN((tv_width + screen_width / 2) / screen_width, (tv_height + screen_height / 2) / screen_height)); + + upscaled_framebuffer_surface_tv = RenderBackend_CreateSurface(screen_width * upscale_factor, screen_height * upscale_factor, true); + + if (upscaled_framebuffer_surface_tv != NULL) + { + // Create upscaled framebuffer surface + size_t drc_width = 854; + size_t drc_height = 480; + + size_t upscale_factor = MAX(1, MIN((drc_width + screen_width / 2) / screen_width, (drc_height + screen_height / 2) / screen_height)); + + upscaled_framebuffer_surface_drc = RenderBackend_CreateSurface(screen_width * upscale_factor, screen_height * upscale_factor, true); + + if (upscaled_framebuffer_surface_drc != NULL) + { + // From what I can tell, there isn't a 'global context' in GX2: instead there are context objects. + // wut internally uses (and *switches to*) its own contexts, so we need to maintain one too, + // and make sure we're always switching back to it when wut is done doing what it's doing. + gx2_context = (GX2ContextState*)aligned_alloc(GX2_CONTEXT_STATE_ALIGNMENT, sizeof(GX2ContextState)); + + if (gx2_context != NULL) + { + memset(gx2_context, 0, sizeof(GX2ContextState)); + GX2SetupContextStateEx(gx2_context, TRUE); + GX2SetContextState(gx2_context); + + // Disable depth-test (enabled by default for some reason) + GX2SetDepthOnlyControl(FALSE, FALSE, GX2_COMPARE_FUNC_ALWAYS); + + GX2RSetAttributeBuffer(&vertex_buffer, 0, sizeof(Vertex), offsetof(Vertex, position)); + GX2RSetAttributeBuffer(&vertex_buffer, 1, sizeof(Vertex), offsetof(Vertex, texture)); + + return framebuffer_surface; + } + else + { + Backend_PrintError("Couldn't allocate memory for the GX2 context"); + } + + RenderBackend_FreeSurface(upscaled_framebuffer_surface_drc); + } + else + { + Backend_PrintError("Couldn't create the DRC upscaled framebuffer surface"); + } + + RenderBackend_FreeSurface(upscaled_framebuffer_surface_tv); + } + else + { + Backend_PrintError("Couldn't create the TV upscaled framebuffer surface"); + } + + RenderBackend_FreeSurface(framebuffer_surface); + } + else + { + Backend_PrintError("Couldn't create the framebuffer surface"); + } + } + else + { + Backend_PrintError("Couldn't create the vertex buffer"); + } + + WHBGfxFreeShaderGroup(&shader_group_glyph); + } + else + { + Backend_PrintError("Couldn't create the glyph shader"); + } + + WHBGfxFreeShaderGroup(&shader_group_colour_fill); + } + else + { + Backend_PrintError("Couldn't create the colour-fill shader"); + } + +// WHBGfxFreeShaderGroup(&shader_group_texture_colour_key); +// } +// else +// { +// Backend_PrintError("Couldn't create the texture colour-key shader"); +// } + + WHBGfxFreeShaderGroup(&shader_group_texture); + } + else + { + Backend_PrintError("Couldn't create the texture shader"); + } + + WHBGfxShutdown(); + } + else + { + Backend_PrintError("WHBGfxInit failed"); + } + + return NULL; +} + +void RenderBackend_Deinit(void) +{ + free(gx2_context); + + RenderBackend_FreeSurface(framebuffer_surface); + + GX2RDestroyBufferEx(&vertex_buffer, (GX2RResourceFlags)0); + + WHBGfxFreeShaderGroup(&shader_group_glyph); + WHBGfxFreeShaderGroup(&shader_group_colour_fill); +// WHBGfxFreeShaderGroup(&shader_group_texture_colour_key); + WHBGfxFreeShaderGroup(&shader_group_texture); + + WHBGfxShutdown(); +} + +void RenderBackend_DrawScreen(void) +{ + FlushVertexBuffer(); + last_render_mode = MODE_BLANK; + last_source_texture = NULL; + last_destination_texture = NULL; + + RenderBackend_Rect source_rect; + + source_rect.left = 0; + source_rect.top = 0; + source_rect.right = framebuffer_surface->texture.surface.width; + source_rect.bottom = framebuffer_surface->texture.surface.height; + + RenderBackend_Rect destination_rect; + destination_rect.left = 0; + destination_rect.top = 0; + destination_rect.right = upscaled_framebuffer_surface_tv->texture.surface.width; + destination_rect.bottom = upscaled_framebuffer_surface_tv->texture.surface.height; + + Blit(framebuffer_surface, &source_rect, upscaled_framebuffer_surface_tv, &destination_rect, false); + + destination_rect.right = upscaled_framebuffer_surface_drc->texture.surface.width; + destination_rect.bottom = upscaled_framebuffer_surface_drc->texture.surface.height; + + Blit(framebuffer_surface, &source_rect, upscaled_framebuffer_surface_drc, &destination_rect, false); + + // Make sure the buffers aren't currently being used before we modify them + GX2DrawDone(); + + VertexBufferSlot *vertex_buffer_slot = (VertexBufferSlot*)GX2RLockBufferEx(&vertex_buffer, (GX2RResourceFlags)0); + + // Set buffer to (16:9) full-screen + vertex_buffer_slot->vertices[0].position.x = 0.0f; + vertex_buffer_slot->vertices[0].position.y = -2.0f; + vertex_buffer_slot->vertices[1].position.x = 2.0f; + vertex_buffer_slot->vertices[1].position.y = -2.0f; + vertex_buffer_slot->vertices[2].position.x = 2.0f; + vertex_buffer_slot->vertices[2].position.y = 0.0f; + vertex_buffer_slot->vertices[3].position.x = 0.0f; + vertex_buffer_slot->vertices[3].position.y = 0.0f; + + // Set buffer to full-texture + vertex_buffer_slot->vertices[0].texture.x = 0.0f; + vertex_buffer_slot->vertices[0].texture.y = 1.0f; + vertex_buffer_slot->vertices[1].texture.x = 1.0f; + vertex_buffer_slot->vertices[1].texture.y = 1.0f; + vertex_buffer_slot->vertices[2].texture.x = 1.0f; + vertex_buffer_slot->vertices[2].texture.y = 0.0f; + vertex_buffer_slot->vertices[3].texture.x = 0.0f; + vertex_buffer_slot->vertices[3].texture.y = 0.0f; + + GX2RUnlockBufferEx(&vertex_buffer, (GX2RResourceFlags)0); + + // Disable blending + GX2SetColorControl(GX2_LOGIC_OP_COPY, 0, FALSE, TRUE); + + // For some dumbass reason, despite being a vec2, this needs padding to a vec4 + const float plain_vec4[4] = {1.0f, 1.0f, 1.0f, 1.0f}; + + // Start drawing + WHBGfxBeginRender(); + + //////////////////// + // Draw to the TV // + //////////////////// + + WHBGfxBeginRenderTV(); + WHBGfxClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + // This might be needed? Not sure. +// GX2RInvalidateSurface(&framebuffer_surface->texture.surface, 0, (GX2RResourceFlags)0); + + // Disable blending + GX2SetColorControl(GX2_LOGIC_OP_COPY, 0, FALSE, TRUE); + + // Select texture shader + GX2SetFetchShader(&shader_group_texture.fetchShader); + GX2SetVertexShader(shader_group_texture.vertexShader); + GX2SetPixelShader(shader_group_texture.pixelShader); + + // Set shader uniforms + GX2SetVertexUniformReg(shader_group_texture.vertexShader->uniformVars[0].offset, 4, (uint32_t*)plain_vec4); + GX2SetVertexUniformReg(shader_group_texture.vertexShader->uniformVars[1].offset, 4, (uint32_t*)plain_vec4); + + // Bind a few things + GX2SetPixelSampler(&sampler_linear, shader_group_texture.pixelShader->samplerVars[0].location); + GX2SetPixelTexture(&upscaled_framebuffer_surface_tv->texture, shader_group_texture.pixelShader->samplerVars[0].location); + GX2RSetAttributeBuffer(&vertex_buffer, 0, sizeof(Vertex), offsetof(Vertex, position)); + GX2RSetAttributeBuffer(&vertex_buffer, 1, sizeof(Vertex), offsetof(Vertex, texture)); + + // Draw + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, 4, 0, 1); + + WHBGfxFinishRenderTV(); + + ///////////////////////// + // Draw to the gamepad // + ///////////////////////// + + WHBGfxBeginRenderDRC(); + WHBGfxClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + // This might be needed? Not sure. +// GX2RInvalidateSurface(&framebuffer_surface->texture.surface, 0, (GX2RResourceFlags)0); + + // Disable blending + GX2SetColorControl(GX2_LOGIC_OP_COPY, 0, FALSE, TRUE); + + // Select texture shader + GX2SetFetchShader(&shader_group_texture.fetchShader); + GX2SetVertexShader(shader_group_texture.vertexShader); + GX2SetPixelShader(shader_group_texture.pixelShader); + + // Set shader uniforms + GX2SetVertexUniformReg(shader_group_texture.vertexShader->uniformVars[0].offset, 4, (uint32_t*)plain_vec4); + GX2SetVertexUniformReg(shader_group_texture.vertexShader->uniformVars[1].offset, 4, (uint32_t*)plain_vec4); + + // Bind a few things + GX2SetPixelSampler(&sampler_linear, shader_group_texture.pixelShader->samplerVars[0].location); + GX2SetPixelTexture(&upscaled_framebuffer_surface_drc->texture, shader_group_texture.pixelShader->samplerVars[0].location); + GX2RSetAttributeBuffer(&vertex_buffer, 0, sizeof(Vertex), offsetof(Vertex, position)); + GX2RSetAttributeBuffer(&vertex_buffer, 1, sizeof(Vertex), offsetof(Vertex, texture)); + + // Draw + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, 4, 0, 1); + + WHBGfxFinishRenderDRC(); + + WHBGfxFinishRender(); + + // Switch back to our context + GX2SetContextState(gx2_context); +} + +RenderBackend_Surface* RenderBackend_CreateSurface(size_t width, size_t height, bool render_target) +{ + RenderBackend_Surface *surface = (RenderBackend_Surface*)malloc(sizeof(RenderBackend_Surface)); + + if (surface != NULL) + { + surface->render_target = render_target; + + // Initialise texture + memset(&surface->texture, 0, sizeof(surface->texture)); + surface->texture.surface.width = width; + surface->texture.surface.height = height; + surface->texture.surface.format = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; + surface->texture.surface.depth = 1; + surface->texture.surface.dim = GX2_SURFACE_DIM_TEXTURE_2D; + surface->texture.surface.tileMode = GX2_TILE_MODE_LINEAR_ALIGNED; + surface->texture.surface.mipLevels = 1; + surface->texture.viewNumMips = 1; + surface->texture.viewNumSlices = 1; + surface->texture.compMap = 0x00010203; + GX2CalcSurfaceSizeAndAlignment(&surface->texture.surface); + GX2InitTextureRegs(&surface->texture); + + GX2RResourceFlags resource_flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_TEXTURE | + GX2R_RESOURCE_USAGE_CPU_WRITE | GX2R_RESOURCE_USAGE_CPU_READ | + GX2R_RESOURCE_USAGE_GPU_WRITE | GX2R_RESOURCE_USAGE_GPU_READ); + + if (render_target) + resource_flags = (GX2RResourceFlags)(resource_flags | GX2R_RESOURCE_BIND_COLOR_BUFFER); + + if (GX2RCreateSurface(&surface->texture.surface, resource_flags)) + { + if (!render_target) + { + return surface; + } + else + { + // Initialise colour buffer (needed so the texture can be drawn to) + memset(&surface->colour_buffer, 0, sizeof(surface->colour_buffer)); + surface->colour_buffer.surface = surface->texture.surface; + surface->colour_buffer.viewNumSlices = 1; + GX2InitColorBufferRegs(&surface->colour_buffer); + + if (GX2RCreateSurfaceUserMemory(&surface->colour_buffer.surface, (uint8_t*)surface->texture.surface.image, (uint8_t*)surface->texture.surface.mipmaps, surface->texture.surface.resourceFlags)) + return surface; + else + Backend_PrintError("GX2RCreateSurfaceUserMemory failed in RenderBackend_CreateSurface"); + + GX2RDestroySurfaceEx(&surface->texture.surface, (GX2RResourceFlags)0); + } + } + else + { + Backend_PrintError("GX2RCreateSurface failed in RenderBackend_CreateSurface"); + } + + free(surface); + } + + return NULL; +} + +void RenderBackend_FreeSurface(RenderBackend_Surface *surface) +{ + // Flush the vertex buffer if we're about to destroy its texture + if (&surface->texture == last_source_texture) + { + FlushVertexBuffer(); + last_source_texture = NULL; + } + + if (&surface->texture == last_destination_texture) + { + FlushVertexBuffer(); + last_destination_texture = NULL; + } + + if (surface->render_target) + GX2RDestroySurfaceEx(&surface->colour_buffer.surface, (GX2RResourceFlags)0); + + GX2RDestroySurfaceEx(&surface->texture.surface, (GX2RResourceFlags)0); + free(surface); +} + +bool RenderBackend_IsSurfaceLost(RenderBackend_Surface *surface) +{ + (void)surface; + + return false; +} + +void RenderBackend_RestoreSurface(RenderBackend_Surface *surface) +{ + (void)surface; +} + +void RenderBackend_UploadSurface(RenderBackend_Surface *surface, const unsigned char *pixels, size_t width, size_t height) +{ + // Flush the vertex buffer if we're about to modify its texture + if (&surface->texture == last_source_texture || &surface->texture == last_destination_texture) + FlushVertexBuffer(); + + // Convert from RGB24 to RGBA32, and upload it to the GPU texture + unsigned char *buffer = (unsigned char*)GX2RLockSurfaceEx(&surface->texture.surface, 0, (GX2RResourceFlags)0); + + if (buffer != NULL) + { + // Pre-multiply the colour channels with the alpha, so blending works correctly + for (size_t y = 0; y < height; ++y) + { + unsigned char *out_pointer = &buffer[y * surface->texture.surface.pitch * 4]; + + for (size_t x = 0; x < width; ++x) + { + *out_pointer++ = (pixels[0] * pixels[3]) / 0xFF; + *out_pointer++ = (pixels[1] * pixels[3]) / 0xFF; + *out_pointer++ = (pixels[2] * pixels[3]) / 0xFF; + *out_pointer++ = pixels[3]; + pixels += 4; + } + } + + GX2RUnlockSurfaceEx(&surface->texture.surface, 0, (GX2RResourceFlags)0); + } +} + +void RenderBackend_Blit(RenderBackend_Surface *source_surface, const RenderBackend_Rect *rect, RenderBackend_Surface *destination_surface, long x, long y, bool alpha_blend) +{ + RenderBackend_Rect destination_rect = {x, y, x + (rect->right - rect->left), y + (rect->bottom - rect->top)}; + + Blit(source_surface, rect, destination_surface, &destination_rect, alpha_blend); +} + +void RenderBackend_ColourFill(RenderBackend_Surface *surface, const RenderBackend_Rect *rect, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) +{ + static unsigned char last_red; + static unsigned char last_green; + static unsigned char last_blue; + + // Flush vertex data if a context-change is needed + if (last_render_mode != MODE_COLOUR_FILL || last_destination_texture != &surface->texture || last_red != red || last_green != green || last_blue != blue) + { + FlushVertexBuffer(); + + last_render_mode = MODE_COLOUR_FILL; + last_source_texture = NULL; + last_destination_texture = &surface->texture; + last_red = red; + last_green = green; + last_blue = blue; + + // Draw to the selected texture, instead of the screen + GX2SetColorBuffer(&surface->colour_buffer, GX2_RENDER_TARGET_0); + GX2SetViewport(0.0f, 0.0f, (float)surface->colour_buffer.surface.width, (float)surface->colour_buffer.surface.height, 0.0f, 1.0f); + GX2SetScissor(0, 0, (float)surface->colour_buffer.surface.width, (float)surface->colour_buffer.surface.height); + + // Bind the colour-fill shader + GX2SetFetchShader(&shader_group_colour_fill.fetchShader); + GX2SetVertexShader(shader_group_colour_fill.vertexShader); + GX2SetPixelShader(shader_group_colour_fill.pixelShader); + + // Set shader uniforms + const float vertex_coordinate_transform[4] = {2.0f / surface->texture.surface.width, -2.0f / surface->texture.surface.height, 1.0f, 1.0f}; + GX2SetVertexUniformReg(shader_group_colour_fill.vertexShader->uniformVars[0].offset, 4, (uint32_t*)vertex_coordinate_transform); + + const float uniform_colours[4] = {red / 255.0f, green / 255.0f, blue / 255.0f, alpha / 255.0f}; + GX2SetPixelUniformReg(shader_group_colour_fill.pixelShader->uniformVars[0].offset, 4, (uint32_t*)&uniform_colours); + + // Disable blending + GX2SetColorControl(GX2_LOGIC_OP_COPY, 0, FALSE, TRUE); + } + + VertexBufferSlot *vertex_buffer_slot = GetVertexBufferSlot(); + + if (vertex_buffer_slot != NULL) + { + // Set vertex position buffer + const float vertex_left = rect->left; + const float vertex_top = rect->top; + const float vertex_right = rect->right; + const float vertex_bottom = rect->bottom; + + vertex_buffer_slot->vertices[0].position.x = vertex_left; + vertex_buffer_slot->vertices[0].position.y = vertex_top; + vertex_buffer_slot->vertices[1].position.x = vertex_right; + vertex_buffer_slot->vertices[1].position.y = vertex_top; + vertex_buffer_slot->vertices[2].position.x = vertex_right; + vertex_buffer_slot->vertices[2].position.y = vertex_bottom; + vertex_buffer_slot->vertices[3].position.x = vertex_left; + vertex_buffer_slot->vertices[3].position.y = vertex_bottom; + } +} + +RenderBackend_GlyphAtlas* RenderBackend_CreateGlyphAtlas(size_t width, size_t height) +{ + RenderBackend_GlyphAtlas *atlas = (RenderBackend_GlyphAtlas*)malloc(sizeof(RenderBackend_GlyphAtlas)); + + if (atlas != NULL) + { + // Initialise texture + memset(&atlas->texture, 0, sizeof(atlas->texture)); + atlas->texture.surface.width = width; + atlas->texture.surface.height = height; + atlas->texture.surface.format = GX2_SURFACE_FORMAT_UNORM_R8; + atlas->texture.surface.depth = 1; + atlas->texture.surface.dim = GX2_SURFACE_DIM_TEXTURE_2D; + atlas->texture.surface.tileMode = GX2_TILE_MODE_LINEAR_ALIGNED; + atlas->texture.surface.mipLevels = 1; + atlas->texture.viewNumMips = 1; + atlas->texture.viewNumSlices = 1; + atlas->texture.compMap = 0x00000000; + GX2CalcSurfaceSizeAndAlignment(&atlas->texture.surface); + GX2InitTextureRegs(&atlas->texture); + + if (GX2RCreateSurface(&atlas->texture.surface, (GX2RResourceFlags)(GX2R_RESOURCE_BIND_TEXTURE | + GX2R_RESOURCE_USAGE_CPU_WRITE | GX2R_RESOURCE_USAGE_CPU_READ | + GX2R_RESOURCE_USAGE_GPU_WRITE | GX2R_RESOURCE_USAGE_GPU_READ))) + { + return atlas; + } + else + { + Backend_PrintError("GX2RCreateSurface failed in RenderBackend_CreateGlyphAtlas"); + } + + free(atlas); + } + + return NULL; +} + +void RenderBackend_DestroyGlyphAtlas(RenderBackend_GlyphAtlas *atlas) +{ + GX2RDestroySurfaceEx(&atlas->texture.surface, (GX2RResourceFlags)0); + free(atlas); +} + +void RenderBackend_UploadGlyph(RenderBackend_GlyphAtlas *atlas, size_t x, size_t y, const unsigned char *pixels, size_t width, size_t height, size_t pitch) +{ + unsigned char *buffer = (unsigned char*)GX2RLockSurfaceEx(&atlas->texture.surface, 0, (GX2RResourceFlags)0); + + const unsigned char *in_pointer = pixels; + unsigned char *out_pointer = &buffer[y * atlas->texture.surface.pitch + x]; + + for (size_t iy = 0; iy < height; ++iy) + { + memcpy(out_pointer, in_pointer, width); + + in_pointer += pitch; + out_pointer += atlas->texture.surface.pitch; + } + + GX2RUnlockSurfaceEx(&atlas->texture.surface, 0, (GX2RResourceFlags)0); +} + +void RenderBackend_PrepareToDrawGlyphs(RenderBackend_GlyphAtlas *atlas, RenderBackend_Surface *destination_surface, unsigned char red, unsigned char green, unsigned char blue) +{ + static unsigned char last_red; + static unsigned char last_green; + static unsigned char last_blue; + + // Flush vertex data if a context-change is needed + if (last_render_mode != MODE_DRAW_GLYPH || last_destination_texture != &destination_surface->texture || last_source_texture != &atlas->texture || last_red != red || last_green != green || last_blue != blue) + { + FlushVertexBuffer(); + + last_render_mode = MODE_DRAW_GLYPH; + last_destination_texture = &destination_surface->texture; + last_source_texture = &atlas->texture; + last_red = red; + last_green = green; + last_blue = blue; + + // Draw to the selected texture, instead of the screen + GX2SetColorBuffer(&destination_surface->colour_buffer, GX2_RENDER_TARGET_0); + GX2SetViewport(0.0f, 0.0f, (float)destination_surface->colour_buffer.surface.width, (float)destination_surface->colour_buffer.surface.height, 0.0f, 1.0f); + GX2SetScissor(0, 0, destination_surface->colour_buffer.surface.width, destination_surface->colour_buffer.surface.height); + + // Select glyph shader + GX2SetFetchShader(&shader_group_glyph.fetchShader); + GX2SetVertexShader(shader_group_glyph.vertexShader); + GX2SetPixelShader(shader_group_glyph.pixelShader); + + // Set shader uniforms + const float vertex_coordinate_transform[4] = {2.0f / destination_surface->texture.surface.width, -2.0f / destination_surface->texture.surface.height, 1.0f, 1.0f}; + GX2SetVertexUniformReg(shader_group_glyph.vertexShader->uniformVars[0].offset, 4, (uint32_t*)vertex_coordinate_transform); + + const float texture_coordinate_transform[4] = {1.0f / atlas->texture.surface.width, 1.0f / atlas->texture.surface.height, 1.0f, 1.0f}; + GX2SetVertexUniformReg(shader_group_glyph.vertexShader->uniformVars[1].offset, 4, (uint32_t*)texture_coordinate_transform); + + const float uniform_colours[4] = {red / 255.0f, green / 255.0f, blue / 255.0f, 1.0f}; + GX2SetPixelUniformReg(shader_group_glyph.pixelShader->uniformVars[0].offset, 4, (uint32_t*)&uniform_colours); + + // Bind misc. data + GX2SetPixelSampler(&sampler_point, shader_group_glyph.pixelShader->samplerVars[0].location); + GX2SetPixelTexture(&atlas->texture, shader_group_glyph.pixelShader->samplerVars[0].location); + + // Enable blending + GX2SetColorControl(GX2_LOGIC_OP_COPY, 0xFF, FALSE, TRUE); + } +} + +void RenderBackend_DrawGlyph(long x, long y, size_t glyph_x, size_t glyph_y, size_t glyph_width, size_t glyph_height) +{ + VertexBufferSlot *vertex_buffer_slot = GetVertexBufferSlot(); + + if (vertex_buffer_slot != NULL) + { + // Set vertex position buffer + const float vertex_left = x; + const float vertex_top = y; + const float vertex_right = x + glyph_width; + const float vertex_bottom = y + glyph_height; + + vertex_buffer_slot->vertices[0].position.x = vertex_left; + vertex_buffer_slot->vertices[0].position.y = vertex_top; + vertex_buffer_slot->vertices[1].position.x = vertex_right; + vertex_buffer_slot->vertices[1].position.y = vertex_top; + vertex_buffer_slot->vertices[2].position.x = vertex_right; + vertex_buffer_slot->vertices[2].position.y = vertex_bottom; + vertex_buffer_slot->vertices[3].position.x = vertex_left; + vertex_buffer_slot->vertices[3].position.y = vertex_bottom; + + // Set texture coordinate buffer + const float texture_left = glyph_x; + const float texture_top = glyph_y; + const float texture_right = glyph_x + glyph_width; + const float texture_bottom = glyph_y + glyph_height; + + vertex_buffer_slot->vertices[0].texture.x = texture_left; + vertex_buffer_slot->vertices[0].texture.y = texture_top; + vertex_buffer_slot->vertices[1].texture.x = texture_right; + vertex_buffer_slot->vertices[1].texture.y = texture_top; + vertex_buffer_slot->vertices[2].texture.x = texture_right; + vertex_buffer_slot->vertices[2].texture.y = texture_bottom; + vertex_buffer_slot->vertices[3].texture.x = texture_left; + vertex_buffer_slot->vertices[3].texture.y = texture_bottom; + } +} + +void RenderBackend_HandleRenderTargetLoss(void) +{ + // Doesn't happen on the Wii U +} + +void RenderBackend_HandleWindowResize(size_t width, size_t height) +{ + (void)width; + (void)height; + + // Doesn't happen on the Wii U +} diff --git a/src/Backends/Rendering/WiiUShaders/colour_fill.gsh.h b/src/Backends/Rendering/WiiUShaders/colour_fill.gsh.h new file mode 100644 index 0000000..ac833a5 --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/colour_fill.gsh.h @@ -0,0 +1,25 @@ +71,102,120,50,0,0,0,32,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,3,0,0,1,192,0,0,0,0,0,0,0,0, +0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,1,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,254, +0,0,0,1,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, +0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, +0,0,0,255,0,0,0,0,0,0,0,14,0,0,0,16,0,0,1,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,1,52,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,1,208,96,1,72,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,202,112,1,88,0,0,0,9,0,0,0,1, +0,0,0,0,255,255,255,255,202,112,1,108,0,0,0,9,0,0,0,0,0,0,0,0,118,101,114,116,101,120,95,116,114,97,110,115,102,111,114,109,0,0,0,0,105,110,112,117,116,95,118,101,114,116,101,120,95,99,111,111,114,100,105,110, +97,116,101,115,0,0,0,0,208,96,0,232,208,96,1,8,202,112,1,52,202,112,1,72,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,136,208,96,0,0,0,0,0,48,208,96,1,88,0,0,0,0,0,0,0,4,208,96,1,136, +66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,5,0,0,1,64,0,0,0,1,0,0,0,0,0,0,0,0,0,0,128,9,32,0,0,0,0,0,24,160,60,160,0,0,136,6,0,148,0,64,0,0,255,15,0,148, +39,0,0,0,0,0,0,160,0,0,0,0,0,0,32,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,160,0,128,0,0,0,1,0,32,0,128,0,0,32,1,8,0,0,144,12,32,64,1,12,0,128,144,12,32,96, +254,164,31,2,16,0,32,0,254,160,159,128,16,0,32,32,0,0,128,63,0,0,128,63,0,0,0,128,0,13,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,6,0,0,1,52,0,0,0,2,0,0,0,0, +0,0,0,1,0,0,0,2,20,0,0,1,0,0,0,0,0,0,0,1,0,0,1,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,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,15,0,0,0,1,0,0,0,16,0,0,0,0,0,0,1,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,232, +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,202,112,0,252,0,0,0,11,0,0,0,1,0,0,0,0,255,255,255,255,99,111,108,111, +117,114,0,0,208,96,0,188,202,112,0,232,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,4,208,96,0,0,0,0,0,8,208,96,0,252,0,0,0,0,0,0,0,2,208,96,1,4,66,76,75,123,0,0,0,32,0,0,0,1, +0,0,0,0,0,0,0,7,0,0,1,32,0,0,0,3,0,0,0,0,32,0,0,0,0,0,12,160,0,0,0,0,136,6,32,148,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,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,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,1,0,0,144,12,0,0,0,5,0,0,144,12,0,32,0,9,0,0,144,12,0,64,0,13,0,128,144,12,0,96,66,76,75,123,0,0,0,32,0,0,0,1, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0 diff --git a/src/Backends/Rendering/WiiUShaders/glyph.gsh.h b/src/Backends/Rendering/WiiUShaders/glyph.gsh.h new file mode 100644 index 0000000..cbc5eda --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/glyph.gsh.h @@ -0,0 +1,29 @@ +71,102,120,50,0,0,0,32,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,40,0,0,0,0,0,0,0,0, +0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,1,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,252, +0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, +0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, +0,0,0,255,0,0,0,0,0,0,0,14,0,0,0,16,0,0,1,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,208,96,1,52,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,2,208,96,1,92,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,202,112,1,124,0,0,0,9,0,0,0,1, +0,0,0,4,255,255,255,255,202,112,1,144,0,0,0,9,0,0,0,1,0,0,0,0,255,255,255,255,202,112,1,176,0,0,0,9,0,0,0,0,0,0,0,1,202,112,1,204,0,0,0,9,0,0,0,0,0,0,0,0,118,101,114,116, +101,120,95,116,114,97,110,115,102,111,114,109,0,0,0,0,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,95,116,114,97,110,115,102,111,114,109,0,0,0,0,105,110,112,117,116,95,116,101,120,116,117,114,101,95,99,111, +111,114,100,105,110,97,116,101,115,0,0,0,105,110,112,117,116,95,118,101,114,116,101,120,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,0,208,96,0,232,208,96,1,8,202,112,1,52,202,112,1,72,202,112,1,92,202,112,1,108, +125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,232,208,96,0,0,0,0,0,108,208,96,1,124,0,0,0,0,0,0,0,6,208,96,1,232,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,5,0,0,1,80, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,128,9,32,0,0,0,0,0,32,160,60,160,0,0,136,6,0,148,0,64,0,0,136,4,0,20,41,0,0,0,0,0,0,160,0,0,0,0,0,0,32,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,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,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,32,0,144,0,0,0,1,4,160,0,144,0,0,32,2,36,160,0,128,0,8,64,2,32,32,0,128,0,8,96,2,8,0,128,144,12,32,64,254,172,31,2,16,0,32,0,254,168,159,0,16,0,32,32, +2,12,0,128,144,12,32,96,0,0,128,63,0,0,128,63,0,0,0,128,0,13,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,6,0,0,1,76,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,2, +20,0,0,1,0,0,0,0,0,0,0,1,0,0,1,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,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,15,0,0,0,1,0,0,0,16,0,0,0,0,0,0,1,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,232,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,8,0,0,0,11,0,0,0,1,0,0,0,0,255,255,255,255,202,112,1,16,0,0,0,1,0,0,0,0, +99,111,108,111,117,114,0,0,116,101,120,0,208,96,0,188,208,96,0,212,202,112,0,232,202,112,0,252,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,20,208,96,0,0,0,0,0,12,208,96,1,8,0,0,0,0,0,0,0,4, +208,96,1,20,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,7,0,0,1,144,0,0,0,3,0,0,0,0,48,0,0,0,0,0,192,128,32,0,0,0,0,0,12,160,0,0,0,0,136,6,32,148,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,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,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,32,0,144,0,0,0,0,4,160,0,144,0,0,32,0,8,32,1,144,0,0,64,0,12,160,129, +144,0,0,96,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,16,0,0,0,0,0,0,240,0,0,128,16,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0 diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/colour_fill.frag b/src/Backends/Rendering/WiiUShaders/shader sources/colour_fill.frag new file mode 100644 index 0000000..d97ea94 --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/colour_fill.frag @@ -0,0 +1,7 @@ +#version 150 core +layout(location = 0) uniform vec4 colour; +out vec4 fragment; +void main() +{ + fragment = colour; +} \ No newline at end of file diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/colour_fill.gsh b/src/Backends/Rendering/WiiUShaders/shader sources/colour_fill.gsh new file mode 100644 index 0000000..a3abb54 Binary files /dev/null and b/src/Backends/Rendering/WiiUShaders/shader sources/colour_fill.gsh differ diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/colour_fill.psh b/src/Backends/Rendering/WiiUShaders/shader sources/colour_fill.psh new file mode 100644 index 0000000..200306e --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/colour_fill.psh @@ -0,0 +1,18 @@ +; $MODE = "UniformRegister" +; $NUM_SPI_PS_INPUT_CNTL = 1 +; $SPI_PS_INPUT_CNTL[0].semantic = 0 +; $SPI_PS_INPUT_CNTL[0].default_val = 1 +; $UNIFORM_VARS[0].name = "colour" +; $UNIFORM_VARS[0].type = "vec4" +; $UNIFORM_VARS[0].count = 1 +; $UNIFORM_VARS[0].offset = 0 +; $UNIFORM_VARS[0].block = -1 + +00 ALU: ADDR(32) CNT(4) + 0 x: MOV R0.x, C0.x + y: MOV R0.y, C0.y + z: MOV R0.z, C0.z + w: MOV R0.w, C0.w +01 EXP_DONE: PIX0, R0 +END_OF_PROGRAM + diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/glyph.frag b/src/Backends/Rendering/WiiUShaders/shader sources/glyph.frag new file mode 100644 index 0000000..2ec3602 --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/glyph.frag @@ -0,0 +1,9 @@ +#version 150 core +layout(location = 0) uniform sampler2D tex; +layout(location = 0) uniform vec4 colour; +in vec2 texture_coordinates; +out vec4 fragment; +void main() +{ + fragment = colour * texture(tex, texture_coordinates).r; +} diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/glyph.gsh b/src/Backends/Rendering/WiiUShaders/shader sources/glyph.gsh new file mode 100644 index 0000000..32a5380 Binary files /dev/null and b/src/Backends/Rendering/WiiUShaders/shader sources/glyph.gsh differ diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/glyph.psh b/src/Backends/Rendering/WiiUShaders/shader sources/glyph.psh new file mode 100644 index 0000000..1e3d8c5 --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/glyph.psh @@ -0,0 +1,23 @@ +; $MODE = "UniformRegister" +; $SAMPLER_VARS[0].name= "tex" +; $SAMPLER_VARS[0].type= "sampler2D" +; $SAMPLER_VARS[0].location = 0 +; $NUM_SPI_PS_INPUT_CNTL = 1 +; $SPI_PS_INPUT_CNTL[0].semantic = 0 +; $SPI_PS_INPUT_CNTL[0].default_val = 1 +; $UNIFORM_VARS[0].name = "colour" +; $UNIFORM_VARS[0].type = "vec4" +; $UNIFORM_VARS[0].count = 1 +; $UNIFORM_VARS[0].offset = 0 +; $UNIFORM_VARS[0].block = -1 + +00 TEX: ADDR(48) CNT(1) VALID_PIX + 0 SAMPLE R0.xxxx, R0.xy0x, t0, s0 +01 ALU: ADDR(32) CNT(4) + 1 x: MUL R0.x, R0.x, C0.x + y: MUL R0.y, R0.y, C0.y + z: MUL R0.z, R0.z, C0.z + w: MUL R0.w, R0.w, C0.w +02 EXP_DONE: PIX0, R0 +END_OF_PROGRAM + diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/plain.vert b/src/Backends/Rendering/WiiUShaders/shader sources/plain.vert new file mode 100644 index 0000000..110afd3 --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/plain.vert @@ -0,0 +1,7 @@ +#version 150 core +layout(location = 0) uniform vec2 vertex_transform; +layout(location = 0) in vec4 input_vertex_coordinates; +void main() +{ + gl_Position = vec4(input_vertex_coordinates.x * vertex_transform.x - 1.0f, input_vertex_coordinates.y * vertex_transform.y + 1.0f, input_vertex_coordinates.zw); +} diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/plain.vsh b/src/Backends/Rendering/WiiUShaders/shader sources/plain.vsh new file mode 100644 index 0000000..c3a348e --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/plain.vsh @@ -0,0 +1,30 @@ +; $MODE = "UniformRegister" + +; $UNIFORM_VARS[0].name = "vertex_transform" +; $UNIFORM_VARS[0].type = "vec2" +; $UNIFORM_VARS[0].count = 1 +; $UNIFORM_VARS[0].offset = 0 +; $UNIFORM_VARS[0].block = -1 + +; $ATTRIB_VARS[0].name = "input_vertex_coordinates" +; $ATTRIB_VARS[0].type = "vec2" +; $ATTRIB_VARS[0].location = 0 + +; $NUM_SPI_VS_OUT_ID = 1 +; $SPI_VS_OUT_ID[0].SEMANTIC_0 = 0 + +00 CALL_FS NO_BARRIER +01 ALU: ADDR(32) CNT(7) + 0 x: MUL ____, R1.y, C0.y + y: MUL ____, R1.x, C0.x + z: MOV R1.z, R1.z + w: MOV R1.w, R1.w + 1 x: ADD R1.x, PV0.y, -1.0f + y: ADD R1.y, PV0.x, 1.0f +02 EXP_DONE: POS0, R1 +03 EXP_DONE: PARAM0, R0.____ +04 ALU: ADDR(39) CNT(1) + 2 x: NOP ____ +05 NOP NO_BARRIER +END_OF_PROGRAM + diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/texture.frag b/src/Backends/Rendering/WiiUShaders/shader sources/texture.frag new file mode 100644 index 0000000..ebddb47 --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/texture.frag @@ -0,0 +1,8 @@ +#version 150 core +layout(location = 0) uniform sampler2D tex; +in vec2 texture_coordinates; +out vec4 fragment; +void main() +{ + fragment = texture(tex, texture_coordinates); +} \ No newline at end of file diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/texture.gsh b/src/Backends/Rendering/WiiUShaders/shader sources/texture.gsh new file mode 100644 index 0000000..8a8cf15 Binary files /dev/null and b/src/Backends/Rendering/WiiUShaders/shader sources/texture.gsh differ diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/texture.psh b/src/Backends/Rendering/WiiUShaders/shader sources/texture.psh new file mode 100644 index 0000000..4724c36 --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/texture.psh @@ -0,0 +1,18 @@ +; $MODE = "UniformRegister" +; $SAMPLER_VARS[0].name= "tex" +; $SAMPLER_VARS[0].type= "sampler2D" +; $SAMPLER_VARS[0].location = 0 +; $NUM_SPI_PS_INPUT_CNTL = 1 +; $SPI_PS_INPUT_CNTL[0].semantic = 0 +; $SPI_PS_INPUT_CNTL[0].default_val = 1 +; $UNIFORM_VARS[0].name = "texture_coordinates" +; $UNIFORM_VARS[0].type = "vec2" +; $UNIFORM_VARS[0].count = 1 +; $UNIFORM_VARS[0].offset = 0 +; $UNIFORM_VARS[0].block = -1 + +00 TEX: ADDR(32) CNT(1) VALID_PIX + 0 SAMPLE R0, R0.xy0x, t0, s0 +01 EXP_DONE: PIX0, R0 +END_OF_PROGRAM + diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/texture.vert b/src/Backends/Rendering/WiiUShaders/shader sources/texture.vert new file mode 100644 index 0000000..a6c169b --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/texture.vert @@ -0,0 +1,11 @@ +#version 150 core +layout(location = 0) uniform vec2 vertex_transform; +layout(location = 1) uniform vec2 texture_coordinate_transform; +layout(location = 0) in vec4 input_vertex_coordinates; +layout(location = 1) in vec2 input_texture_coordinates; +out vec2 texture_coordinates; +void main() +{ + gl_Position = vec4(input_vertex_coordinates.x * vertex_transform.x - 1.0f, input_vertex_coordinates.y * vertex_transform.y + 1.0f, input_vertex_coordinates.zw); + texture_coordinates = input_texture_coordinates * texture_coordinate_transform; +} diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/texture.vsh b/src/Backends/Rendering/WiiUShaders/shader sources/texture.vsh new file mode 100644 index 0000000..c6a3783 --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/texture.vsh @@ -0,0 +1,47 @@ +; $MODE = "UniformRegister" + +; $UNIFORM_VARS[0].name = "vertex_transform" +; $UNIFORM_VARS[0].type = "vec2" +; $UNIFORM_VARS[0].count = 1 +; $UNIFORM_VARS[0].offset = 4 +; $UNIFORM_VARS[0].block = -1 +; $UNIFORM_VARS[1].name = "texture_coordinate_transform" +; $UNIFORM_VARS[1].type = "vec2" +; $UNIFORM_VARS[1].count = 1 +; $UNIFORM_VARS[1].offset = 0 +; $UNIFORM_VARS[1].block = -1 + +; $ATTRIB_VARS[0].name = "input_texture_coordinates" +; $ATTRIB_VARS[0].type = "vec2" +; $ATTRIB_VARS[0].location = 1 +; $ATTRIB_VARS[1].name = "input_vertex_coordinates" +; $ATTRIB_VARS[1].type = "vec2" +; $ATTRIB_VARS[1].location = 0 + +; $NUM_SPI_VS_OUT_ID = 1 +; $SPI_VS_OUT_ID[0].SEMANTIC_0 = 0 + +00 CALL_FS NO_BARRIER +01 ALU: ADDR(32) CNT(9) + 0 x: MUL R0.x, R1.x, C0.x + y: MUL R0.y, R1.y, C0.y + z: MUL ____, R2.y, C1.y VEC_120 + w: MUL ____, R2.x, C1.x VEC_120 + t: MOV R1.z, R2.z + 1 x: ADD R1.x, PV0.w, -1.0f + y: ADD R1.y, PV0.z, 1.0f + w: MOV R1.w, R2.w +02 EXP_DONE: POS0, R1 +03 EXP_DONE: PARAM0, R0.xyzz NO_BARRIER +04 ALU: ADDR(41) CNT(1) + 2 x: NOP ____ +05 NOP NO_BARRIER +END_OF_PROGRAM + + + + + + + + diff --git a/src/Backends/Rendering/WiiUShaders/shader sources/wtf is this.txt b/src/Backends/Rendering/WiiUShaders/shader sources/wtf is this.txt new file mode 100644 index 0000000..9f73918 --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/shader sources/wtf is this.txt @@ -0,0 +1,60 @@ +####################### +# Shader combinations # +####################### + +texture.vsh + texture.psh = texture.gsh +plain.vsh + colour_fill.psh = colour_fill.gsh +texture.vsh + glyph.psh = glyph.gsh + + +########################## +# How to compile shaders # +########################## + +I'mma give it to you straight: compiling shaders for the Wii U is an absolute +nightmare. + +You see, there are three major steps: +* Compile the GLSL to assembly +* Fill in a header by-hand +* Assemble the assembly + header + +To compile, you need AMD's 'GPU ShaderAnalyzer', which is Windows-only: +https://gpuopen.com/archive/gpu-shaderanalyzer/ + +You then need to compile for the RV730. + +After that, you need to fill-in a header. The only way I was able to figure out +what little I did was by finding examples on the internet: +https://github.com/snickerbockers/gx2gl/tree/master/src/shaders +https://github.com/yawut/SDL/tree/wiiu-2.0.9/src/video/wiiu/shaders +https://github.com/devkitPro/wut/tree/master/samples/cmake/content + +Even now, I don't have a complete idea of exactly what everything means. + +Anyway, once you have *that* out of the way, you still need to assemble your +shaders. For that, you'll need `latte-assembler` - a tool that comes with the +Decaf emulator. + +For me, I needed to clone the entire source tree (and its dependencies) in order +to build the tool successfully, which is a royal pain in the ass. + +For compilation, I used MSYS2+MinGW-w64. There were a couple of compilation +errors I had to address, but nothing too hard to solve. + +Eventually you'll have the assembler built. With it, you can link your `.psh` +and `.vsh` files into the final `.gsh` blob. + +Oh, right. I should warn you - the devs changed latte-assembler's syntax at some +point, so all the example `.psh`/`.vsh` files I could find online were +incompatible. That sucked. The main change was that stuff like 'float2' and +'float4' were changed to 'vec2' and 'vec4'. Just keep that in mind, and you +should be okay. + +Also, latte-assembler's 'assemble' command was originally named 'compile', and +the other 'compile' option didn't exist. Keep that in mind if you ever find any +documentation on how to use the tool. + +latte-assembler does have an option to convert straight from GLSL to `.gsh`, but +this feature is woefully incomplete (it doesn't support `sampler2D`), and not +worth using. diff --git a/src/Backends/Rendering/WiiUShaders/texture.gsh.h b/src/Backends/Rendering/WiiUShaders/texture.gsh.h new file mode 100644 index 0000000..f42b9d5 --- /dev/null +++ b/src/Backends/Rendering/WiiUShaders/texture.gsh.h @@ -0,0 +1,27 @@ +71,102,120,50,0,0,0,32,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,40,0,0,0,0,0,0,0,0, +0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,1,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,252, +0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, +0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, +0,0,0,255,0,0,0,0,0,0,0,14,0,0,0,16,0,0,1,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,208,96,1,52,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,2,208,96,1,92,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,202,112,1,124,0,0,0,9,0,0,0,1, +0,0,0,4,255,255,255,255,202,112,1,144,0,0,0,9,0,0,0,1,0,0,0,0,255,255,255,255,202,112,1,176,0,0,0,9,0,0,0,0,0,0,0,1,202,112,1,204,0,0,0,9,0,0,0,0,0,0,0,0,118,101,114,116, +101,120,95,116,114,97,110,115,102,111,114,109,0,0,0,0,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,95,116,114,97,110,115,102,111,114,109,0,0,0,0,105,110,112,117,116,95,116,101,120,116,117,114,101,95,99,111, +111,114,100,105,110,97,116,101,115,0,0,0,105,110,112,117,116,95,118,101,114,116,101,120,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,0,208,96,0,232,208,96,1,8,202,112,1,52,202,112,1,72,202,112,1,92,202,112,1,108, +125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,232,208,96,0,0,0,0,0,108,208,96,1,124,0,0,0,0,0,0,0,6,208,96,1,232,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,5,0,0,1,80, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,128,9,32,0,0,0,0,0,32,160,60,160,0,0,136,6,0,148,0,64,0,0,136,4,0,20,41,0,0,0,0,0,0,160,0,0,0,0,0,0,32,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,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,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,32,0,144,0,0,0,1,4,160,0,144,0,0,32,2,36,160,0,128,0,8,64,2,32,32,0,128,0,8,96,2,8,0,128,144,12,32,64,254,172,31,2,16,0,32,0,254,168,159,0,16,0,32,32, +2,12,0,128,144,12,32,96,0,0,128,63,0,0,128,63,0,0,0,128,0,13,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,6,0,0,1,88,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,2, +20,0,0,1,0,0,0,0,0,0,0,1,0,0,1,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,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,15,0,0,0,1,0,0,0,16,0,0,0,0,0,0,1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,232,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,8,0,0,0,9,0,0,0,1,0,0,0,0,255,255,255,255,202,112,1,28,0,0,0,1,0,0,0,0, +116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,116,101,120,0,208,96,0,188,208,96,0,212,202,112,0,232,202,112,0,252,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,32,208,96,0,0,0,0,0,24, +208,96,1,8,0,0,0,0,0,0,0,4,208,96,1,32,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,7,0,0,1,16,0,0,0,3,0,0,0,0,32,0,0,0,0,0,192,128,0,0,0,0,136,6,32,148, +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,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, +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,16,0,0,0,0,16,13,240,0,0,128,16,0,0,0,0, +66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0 diff --git a/src/Backends/Rendering/Window/OpenGL.h b/src/Backends/Rendering/Window/OpenGL.h new file mode 100644 index 0000000..062fa66 --- /dev/null +++ b/src/Backends/Rendering/Window/OpenGL.h @@ -0,0 +1,10 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +bool WindowBackend_OpenGL_CreateWindow(const char *window_title, size_t *screen_width, size_t *screen_height, bool fullscreen, bool vsync); +void WindowBackend_OpenGL_DestroyWindow(void); +void WindowBackend_OpenGL_Display(void); diff --git a/src/Backends/Rendering/Window/OpenGL3/GLFW3.cpp b/src/Backends/Rendering/Window/OpenGL3/GLFW3.cpp new file mode 100644 index 0000000..a1b5f5c --- /dev/null +++ b/src/Backends/Rendering/Window/OpenGL3/GLFW3.cpp @@ -0,0 +1,98 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../OpenGL.h" + +#include + +#ifndef USE_OPENGLES2 +#include +#endif +#include + +#include "../../../Misc.h" +#include "../../../Shared/GLFW3.h" + +GLFWwindow *window; + +bool WindowBackend_OpenGL_CreateWindow(const char *window_title, size_t *screen_width, size_t *screen_height, bool fullscreen, bool vsync) +{ +#ifdef USE_OPENGLES2 + glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); +#else + glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); +#endif + + GLFWmonitor *monitor = NULL; + + if (fullscreen) + { + monitor = glfwGetPrimaryMonitor(); + + if (monitor != NULL) + { + // Use current monitor resolution, because for some reason + // 640x480 causes my laptop to completely freeze on Linux. + const GLFWvidmode *mode = glfwGetVideoMode(monitor); + + *screen_width = mode->width; + *screen_height = mode->height; + } + } + + window = glfwCreateWindow(*screen_width, *screen_height, window_title, monitor, NULL); + + if (window != NULL) + { + glfwMakeContextCurrent(window); + + #ifndef USE_OPENGLES2 + if (gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) + { + // Check if the platform supports OpenGL 3.2 + if (GLAD_GL_VERSION_3_2) + { + #endif + glfwSwapInterval(vsync ? 1 : 0); // Set vsync + + Backend_PostWindowCreation(); + + return true; + #ifndef USE_OPENGLES2 + } + else + { + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", "Your system does not support OpenGL 3.2"); + } + } + else + { + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", "Could not initialize OpenGL context"); + } + #endif + + glfwDestroyWindow(window); + } + else + { + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", "Could not create window"); + } + + return false; +} + +void WindowBackend_OpenGL_DestroyWindow(void) +{ + glfwDestroyWindow(window); +} + +void WindowBackend_OpenGL_Display(void) +{ + glfwSwapBuffers(window); +} diff --git a/src/Backends/Rendering/Window/OpenGL3/SDL1.cpp b/src/Backends/Rendering/Window/OpenGL3/SDL1.cpp new file mode 100644 index 0000000..bb021ca --- /dev/null +++ b/src/Backends/Rendering/Window/OpenGL3/SDL1.cpp @@ -0,0 +1,60 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../OpenGL.h" + +#include +#include + +#include +#include "SDL.h" + +#include "../../../Misc.h" + +bool WindowBackend_OpenGL_CreateWindow(const char *window_title, size_t *screen_width, size_t *screen_height, bool fullscreen, bool vsync) +{ +#ifdef SDL_GL_SWAP_CONTROL + if (SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, vsync ? 1 : 0) < 0) // Set vsync + Backend_PrintError("Couldn't set OpenGL swap interval: %s", SDL_GetError()); +#endif + + if (SDL_SetVideoMode(*screen_width, *screen_height, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0)) != NULL) + { + SDL_WM_SetCaption(window_title, NULL); + + if (gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress)) + { + // Check if the platform supports OpenGL 3.2 + if (GLAD_GL_VERSION_3_2) + { + Backend_PostWindowCreation(); + + return true; + } + else + { + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", "Your system does not support OpenGL 3.2"); + } + } + else + { + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", "Couldn't load OpenGL functions"); + } + } + else + { + std::string error_message = std::string("Could not create window: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", error_message.c_str()); + } + + return false; +} + +void WindowBackend_OpenGL_DestroyWindow(void) +{ +} + +void WindowBackend_OpenGL_Display(void) +{ + SDL_GL_SwapBuffers(); +} diff --git a/src/Backends/Rendering/Window/OpenGL3/SDL2.cpp b/src/Backends/Rendering/Window/OpenGL3/SDL2.cpp new file mode 100644 index 0000000..29bb628 --- /dev/null +++ b/src/Backends/Rendering/Window/OpenGL3/SDL2.cpp @@ -0,0 +1,118 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../OpenGL.h" + +#include +#include + +#ifndef USE_OPENGLES2 +#include +#endif +#include "SDL.h" + +#include "../../../Misc.h" +#include "../../../Shared/SDL.h" + +SDL_Window *window; + +static SDL_GLContext context; + +bool WindowBackend_OpenGL_CreateWindow(const char *window_title, size_t *screen_width, size_t *screen_height, bool fullscreen, bool vsync) +{ +#ifdef USE_OPENGLES2 + if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES) < 0) + Backend_PrintError("Couldn't set OpenGL context type to ES: %s", SDL_GetError()); + + if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0) < 0) + Backend_PrintError("Couldn't set OpenGL context flags to 0: %s", SDL_GetError()); + + if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2) < 0) + Backend_PrintError("Couldn't set OpenGL major version to 2: %s", SDL_GetError()); + + if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0) < 0) + Backend_PrintError("Couldn't set OpenGL minor version to 0: %s", SDL_GetError()); +#else + if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE) < 0) + Backend_PrintError("Couldn't set OpenGL context type to core: %s", SDL_GetError()); + + if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG) < 0) + Backend_PrintError("Couldn't set OpenGL forward compatibility: %s", SDL_GetError()); + + if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3) < 0) + Backend_PrintError("Couldn't set OpenGL major version to 3: %s", SDL_GetError()); + + if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2) < 0) + Backend_PrintError("Couldn't set OpenGL minor verison to 2: %s", SDL_GetError()); +#endif + + window = SDL_CreateWindow(window_title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, *screen_width, *screen_height, SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL | (fullscreen ? SDL_WINDOW_FULLSCREEN : 0)); + + if (window != NULL) + { + context = SDL_GL_CreateContext(window); + + if (context != NULL) + { + if (SDL_GL_MakeCurrent(window, context) == 0) + { + #ifndef USE_OPENGLES2 + if (gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress)) + { + // Check if the platform supports OpenGL 3.2 + if (GLAD_GL_VERSION_3_2) + { + #endif + SDL_GL_SetSwapInterval(vsync ? 1 : 0); // Set vsync + + Backend_PostWindowCreation(); + + return true; + #ifndef USE_OPENGLES2 + } + else + { + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", "Your system does not support OpenGL 3.2"); + } + } + else + { + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", "Couldn't load OpenGL functions"); + } + #endif + } + else + { + std::string error_message = std::string("Couldn't setup OpenGL context for rendering: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", "SDL_GL_MakeCurrent failed"); + } + + SDL_GL_DeleteContext(context); + } + else + { + std::string error_message = std::string("Couldn't create OpenGL context: %s", SDL_GetError()); + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", "Could not create OpenGL context"); + } + + SDL_DestroyWindow(window); + } + else + { + std::string error_message = std::string("Could not create window: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", error_message.c_str()); + } + + return false; +} + +void WindowBackend_OpenGL_DestroyWindow(void) +{ + SDL_GL_DeleteContext(context); + SDL_DestroyWindow(window); +} + +void WindowBackend_OpenGL_Display(void) +{ + SDL_GL_SwapWindow(window); +} diff --git a/src/Backends/Rendering/Window/OpenGLES2/GLFW3.cpp b/src/Backends/Rendering/Window/OpenGLES2/GLFW3.cpp new file mode 100644 index 0000000..b0204a5 --- /dev/null +++ b/src/Backends/Rendering/Window/OpenGLES2/GLFW3.cpp @@ -0,0 +1,2 @@ +#define USE_OPENGLES2 +#include "../OpenGL3/GLFW3.cpp" diff --git a/src/Backends/Rendering/Window/OpenGLES2/SDL2.cpp b/src/Backends/Rendering/Window/OpenGLES2/SDL2.cpp new file mode 100644 index 0000000..c79532c --- /dev/null +++ b/src/Backends/Rendering/Window/OpenGLES2/SDL2.cpp @@ -0,0 +1,2 @@ +#define USE_OPENGLES2 +#include "../OpenGL3/SDL2.cpp" diff --git a/src/Backends/Rendering/Window/Software.h b/src/Backends/Rendering/Window/Software.h new file mode 100644 index 0000000..33e5084 --- /dev/null +++ b/src/Backends/Rendering/Window/Software.h @@ -0,0 +1,12 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +bool WindowBackend_Software_CreateWindow(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync); +void WindowBackend_Software_DestroyWindow(void); +unsigned char* WindowBackend_Software_GetFramebuffer(size_t *pitch); +void WindowBackend_Software_Display(void); +void WindowBackend_Software_HandleWindowResize(size_t width, size_t height); diff --git a/src/Backends/Rendering/Window/Software/3DS.cpp b/src/Backends/Rendering/Window/Software/3DS.cpp new file mode 100644 index 0000000..43a0296 --- /dev/null +++ b/src/Backends/Rendering/Window/Software/3DS.cpp @@ -0,0 +1,66 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Software.h" + +#include +#include +#include + +#include <3ds.h> + +static unsigned char *framebuffer; +static size_t framebuffer_pitch; +static size_t framebuffer_width; +static size_t framebuffer_height; + +bool WindowBackend_Software_CreateWindow(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ + *vsync = false; + + (void)window_title; + (void)fullscreen; + +// gfxSetDoubleBuffering(GFX_TOP, true); + + gfxSetScreenFormat(GFX_TOP, GSP_BGR8_OES); + + framebuffer = (unsigned char*)malloc(screen_width * screen_height * 3); + + if (framebuffer != NULL) + { + framebuffer_pitch = screen_height * 3; + framebuffer_width = screen_height; + framebuffer_height = screen_width; + + return true; + } + + return false; +} + +void WindowBackend_Software_DestroyWindow(void) +{ + free(framebuffer); +} + +unsigned char* WindowBackend_Software_GetFramebuffer(size_t *pitch) +{ + *pitch = framebuffer_pitch; + + return framebuffer; +} + +void WindowBackend_Software_Display(void) +{ + memcpy(gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL) + (400 - framebuffer_height) * 240 * 3 / 2, framebuffer, framebuffer_pitch * framebuffer_height); + + gfxFlushBuffers(); + gfxScreenSwapBuffers(GFX_TOP, false); +} + +void WindowBackend_Software_HandleWindowResize(size_t width, size_t height) +{ + (void)width; + (void)height; +} diff --git a/src/Backends/Rendering/Window/Software/GLFW3.cpp b/src/Backends/Rendering/Window/Software/GLFW3.cpp new file mode 100644 index 0000000..ff36ae5 --- /dev/null +++ b/src/Backends/Rendering/Window/Software/GLFW3.cpp @@ -0,0 +1,156 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Software.h" + +#include +#include + +#include + +#include "../../../Misc.h" +#include "../../../Shared/GLFW3.h" + +GLFWwindow *window; + +static unsigned char *framebuffer; +static size_t framebuffer_width; +static size_t framebuffer_height; + +static float framebuffer_x_ratio; +static float framebuffer_y_ratio; + +static GLuint screen_texture_id; + +bool WindowBackend_Software_CreateWindow(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ + glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 1); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + + framebuffer_width = screen_width; + framebuffer_height = screen_height; + + GLFWmonitor *monitor = NULL; + + if (fullscreen) + { + monitor = glfwGetPrimaryMonitor(); + + if (monitor != NULL) + { + const GLFWvidmode *mode = glfwGetVideoMode(monitor); + + screen_width = mode->width; + screen_height = mode->height; + } + } + + window = glfwCreateWindow(screen_width, screen_height, window_title, monitor, NULL); + + if (window != NULL) + { + glfwMakeContextCurrent(window); + + glfwSwapInterval(*vsync ? 1 : 0); // Set vsync + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + glEnable(GL_TEXTURE_2D); + + WindowBackend_Software_HandleWindowResize(screen_width, screen_height); + + // Create screen texture + glGenTextures(1, &screen_texture_id); + glBindTexture(GL_TEXTURE_2D, screen_texture_id); + + size_t framebuffer_texture_width = 1; + while (framebuffer_texture_width < framebuffer_width) + framebuffer_texture_width <<= 1; + + size_t framebuffer_texture_height = 1; + while (framebuffer_texture_height < framebuffer_height) + framebuffer_texture_height <<= 1; + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, framebuffer_texture_width, framebuffer_texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + framebuffer_x_ratio = (float)framebuffer_width / framebuffer_texture_width; + framebuffer_y_ratio = (float)framebuffer_height / framebuffer_texture_height; + + framebuffer = (unsigned char*)malloc(framebuffer_width * framebuffer_height * 4); + + Backend_PostWindowCreation(); + + return true; + } + else + { + Backend_ShowMessageBox("Fatal error (OpenGL rendering backend)", "Could not create window"); + } + + return false; +} + +void WindowBackend_Software_DestroyWindow(void) +{ + free(framebuffer); + glDeleteTextures(1, &screen_texture_id); + glfwDestroyWindow(window); +} + +unsigned char* WindowBackend_Software_GetFramebuffer(size_t *pitch) +{ + *pitch = framebuffer_width * 4; + + return framebuffer; +} + +void WindowBackend_Software_Display(void) +{ + glClear(GL_COLOR_BUFFER_BIT); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, framebuffer_width, framebuffer_height, GL_RGBA, GL_UNSIGNED_BYTE, framebuffer); + + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f, framebuffer_y_ratio); + glVertex2f(-1.0f, -1.0f); + glTexCoord2f(framebuffer_x_ratio, framebuffer_y_ratio); + glVertex2f(1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex2f(-1.0f, 1.0f); + glTexCoord2f(framebuffer_x_ratio, 0.0f); + glVertex2f(1.0f, 1.0f); + glEnd(); + + glfwSwapBuffers(window); +} + +void WindowBackend_Software_HandleWindowResize(size_t width, size_t height) +{ + // Do some viewport trickery, to fit the framebuffer in the center of the screen + GLint viewport_x; + GLint viewport_y; + GLsizei viewport_width; + GLsizei viewport_height; + + if (width * framebuffer_height > framebuffer_width * height) // Fancy way to do `if (width / height > framebuffer_width / framebuffer_height)` without floats + { + viewport_y = 0; + viewport_height = height; + + viewport_width = (framebuffer_width * height) / framebuffer_height; + viewport_x = (width - viewport_width) / 2; + } + else + { + viewport_x = 0; + viewport_width = width; + + viewport_height = (framebuffer_height * width) / framebuffer_width; + viewport_y = (height - viewport_height) / 2; + } + + glViewport(viewport_x, viewport_y, viewport_width, viewport_height); +} diff --git a/src/Backends/Rendering/Window/Software/Null.cpp b/src/Backends/Rendering/Window/Software/Null.cpp new file mode 100644 index 0000000..20f83ff --- /dev/null +++ b/src/Backends/Rendering/Window/Software/Null.cpp @@ -0,0 +1,50 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Software.h" + +#include +#include + +static unsigned char *framebuffer; +static size_t framebuffer_pitch; + +bool WindowBackend_Software_CreateWindow(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ + (void)window_title; + (void)fullscreen; + + framebuffer = (unsigned char*)malloc(screen_width * screen_height * 3); + + if (framebuffer != NULL) + { + framebuffer_pitch = screen_width * 3; + + return true; + } + + return false; +} + +void WindowBackend_Software_DestroyWindow(void) +{ + free(framebuffer); +} + +unsigned char* WindowBackend_Software_GetFramebuffer(size_t *pitch) +{ + *pitch = framebuffer_pitch; + + return framebuffer; +} + +void WindowBackend_Software_Display(void) +{ + +} + +void WindowBackend_Software_HandleWindowResize(size_t width, size_t height) +{ + (void)width; + (void)height; +} diff --git a/src/Backends/Rendering/Window/Software/SDL1.cpp b/src/Backends/Rendering/Window/Software/SDL1.cpp new file mode 100644 index 0000000..0c3139b --- /dev/null +++ b/src/Backends/Rendering/Window/Software/SDL1.cpp @@ -0,0 +1,93 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Software.h" + +#include +#include + +#include "SDL.h" + +#include "../../../Misc.h" + +static int bits_per_pixel = 24; +static Uint32 window_flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT; + +static SDL_Surface *window_sdlsurface; +static SDL_Surface *framebuffer_sdlsurface; + +bool WindowBackend_Software_CreateWindow(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ + *vsync = false; + + if (fullscreen) + window_flags |= SDL_FULLSCREEN; + else + window_flags &= ~SDL_FULLSCREEN; + + window_sdlsurface = SDL_SetVideoMode(screen_width, screen_height, bits_per_pixel, window_flags); + if (window_sdlsurface == NULL) { + Backend_PrintError("Couldn't create 24bpp window: %s", SDL_GetError()); + bits_per_pixel = 32; + window_sdlsurface = SDL_SetVideoMode(screen_width, screen_height, bits_per_pixel, window_flags); + } + + if (window_sdlsurface != NULL) + { + SDL_WM_SetCaption(window_title, NULL); + framebuffer_sdlsurface = SDL_CreateRGBSurface(SDL_SWSURFACE, window_sdlsurface->w, window_sdlsurface->h, 24, 0x0000FF, 0x00FF00, 0xFF0000, 0); + + if (framebuffer_sdlsurface != NULL) + { + SDL_LockSurface(framebuffer_sdlsurface); // If this errors then oh dear + + Backend_PostWindowCreation(); + + return true; + } + else + { + std::string error_message = std::string("Couldn't create framebuffer surface: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (software rendering backend)", error_message.c_str()); + } + } + else + { + std::string error_message = std::string("Couldn't create window: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (software rendering backend)", error_message.c_str()); + } + + return false; +} + +void WindowBackend_Software_DestroyWindow(void) +{ + SDL_FreeSurface(framebuffer_sdlsurface); +} + +unsigned char* WindowBackend_Software_GetFramebuffer(size_t *pitch) +{ + *pitch = framebuffer_sdlsurface->pitch; + + return (unsigned char*)framebuffer_sdlsurface->pixels; +} + +void WindowBackend_Software_Display(void) +{ + SDL_UnlockSurface(framebuffer_sdlsurface); + + if (SDL_BlitSurface(framebuffer_sdlsurface, NULL, window_sdlsurface, NULL) < 0) + Backend_PrintError("Couldn't blit framebuffer surface to window surface: %s", SDL_GetError()); + + SDL_LockSurface(framebuffer_sdlsurface); // If this errors then oh dear + + if (SDL_Flip(window_sdlsurface) < 0) + Backend_PrintError("Couldn't copy window surface to the screen: %s", SDL_GetError()); +} + +void WindowBackend_Software_HandleWindowResize(size_t width, size_t height) +{ + window_sdlsurface = SDL_SetVideoMode(width, height, bits_per_pixel, window_flags); + if (window_sdlsurface == NULL) + Backend_PrintError("Couldn't get SDL surface associated with window: %s", SDL_GetError()); +} diff --git a/src/Backends/Rendering/Window/Software/SDL2.cpp b/src/Backends/Rendering/Window/Software/SDL2.cpp new file mode 100644 index 0000000..25ac512 --- /dev/null +++ b/src/Backends/Rendering/Window/Software/SDL2.cpp @@ -0,0 +1,105 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "../Software.h" + +#include +#include + +#include "SDL.h" + +#include "../../../Misc.h" +#include "../../../Shared/SDL.h" + +SDL_Window *window; + +static SDL_Surface *window_sdlsurface; +static SDL_Surface *framebuffer_sdlsurface; + +bool WindowBackend_Software_CreateWindow(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ + *vsync = false; + + window = SDL_CreateWindow(window_title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, screen_width, screen_height, 0); + + if (window != NULL) + { + if (fullscreen) + if (SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN) < 0) + Backend_PrintError("Couldn't set window to fullscreen: %s", SDL_GetError()); + + window_sdlsurface = SDL_GetWindowSurface(window); + + if (window_sdlsurface != NULL) + { + + framebuffer_sdlsurface = SDL_CreateRGBSurfaceWithFormat(0, window_sdlsurface->w, window_sdlsurface->h, 0, SDL_PIXELFORMAT_RGBA32); + + if (framebuffer_sdlsurface != NULL) + { + SDL_LockSurface(framebuffer_sdlsurface); // If this errors then oh dear + + Backend_PostWindowCreation(); + + return true; + } + else + { + std::string error_message = std::string("Couldn't create framebuffer surface: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (software rendering backend)", error_message.c_str()); + SDL_DestroyWindow(window); + } + } + else + { + std::string error_message = std::string("Couldn't get SDL surface associated with window: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (software rendering backend)", error_message.c_str()); + } + } + else + { + std::string error_message = std::string("Couldn't create window: ") + SDL_GetError(); + Backend_ShowMessageBox("Fatal error (software rendering backend)", error_message.c_str()); + } + + return false; +} + +void WindowBackend_Software_DestroyWindow(void) +{ + SDL_FreeSurface(framebuffer_sdlsurface); + SDL_DestroyWindow(window); +} + +unsigned char* WindowBackend_Software_GetFramebuffer(size_t *pitch) +{ + *pitch = framebuffer_sdlsurface->pitch; + + return (unsigned char*)framebuffer_sdlsurface->pixels; +} + +void WindowBackend_Software_Display(void) +{ + SDL_UnlockSurface(framebuffer_sdlsurface); + + if (SDL_BlitSurface(framebuffer_sdlsurface, NULL, window_sdlsurface, NULL) < 0) + Backend_PrintError("Couldn't blit framebuffer surface to window surface: %s", SDL_GetError()); + + SDL_LockSurface(framebuffer_sdlsurface); // If this errors then oh dear + + if (SDL_UpdateWindowSurface(window) < 0) + Backend_PrintError("Couldn't copy window surface to the screen: %s", SDL_GetError()); +} + +void WindowBackend_Software_HandleWindowResize(size_t width, size_t height) +{ + (void)width; + (void)height; + + // https://wiki.libsdl.org/SDL_GetWindowSurface + // We need to fetch a new surface pointer + window_sdlsurface = SDL_GetWindowSurface(window); + + if (window_sdlsurface == NULL) + Backend_PrintError("Couldn't get SDL surface associated with window: %s", SDL_GetError()); +} diff --git a/src/Backends/Rendering/Window/Software/WiiU.cpp b/src/Backends/Rendering/Window/Software/WiiU.cpp new file mode 100644 index 0000000..0490de7 --- /dev/null +++ b/src/Backends/Rendering/Window/Software/WiiU.cpp @@ -0,0 +1,256 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +// Sexy new backend that bounces the software-rendered frame to the GPU, +// eliminating V-tearing, and gaining support for rendering to the TV for +// free! + +#include "../Window-Software.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../Attributes.h" + +#include "WiiUShaders/texture.gsh.h" + +typedef struct Viewport +{ + float x; + float y; + float width; + float height; +} Viewport; + +static unsigned char *fake_framebuffer; + +static size_t fake_framebuffer_width; +static size_t fake_framebuffer_height; + +static WHBGfxShaderGroup shader_group; + +static GX2RBuffer vertex_position_buffer; +static GX2RBuffer texture_coordinate_buffer; + +static GX2Sampler sampler; + +static GX2Texture screen_texture; + +static Viewport tv_viewport; +static Viewport drc_viewport; + +static void CalculateViewport(size_t actual_screen_width, size_t actual_screen_height, Viewport *viewport) +{ + if (actual_screen_width * fake_framebuffer_height > fake_framebuffer_width * actual_screen_height) // Fancy way to do `if (actual_screen_width / actual_screen_height > fake_framebuffer_width / fake_framebuffer_height)` without floats + { + viewport->y = 0.0f; + viewport->height = actual_screen_height; + + viewport->width = (fake_framebuffer_width * actual_screen_height) / fake_framebuffer_height; + viewport->x = (actual_screen_width - viewport->width) / 2; + } + else + { + viewport->x = 0.0f; + viewport->width = actual_screen_width; + + viewport->height = (fake_framebuffer_height * actual_screen_width) / fake_framebuffer_width; + viewport->y = (actual_screen_height - viewport->height) / 2; + } +} + +bool WindowBackend_Software_CreateWindow(const char *window_title, size_t screen_width, size_t screen_height, bool fullscreen, bool *vsync) +{ + (void)window_title; + (void)fullscreen; + + *vsync = true; // Not optional (blame WUT's libwhb) + + fake_framebuffer_width = screen_width; + fake_framebuffer_height = screen_height; + + fake_framebuffer = (unsigned char*)malloc(fake_framebuffer_width * fake_framebuffer_height * 3); + + if (fake_framebuffer != NULL) + { + WHBGfxInit(); + + if (WHBGfxLoadGFDShaderGroup(&shader_group, 0, rtexture)) + { + WHBGfxInitShaderAttribute(&shader_group, "input_vertex_coordinates", 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); + WHBGfxInitShaderAttribute(&shader_group, "input_texture_coordinates", 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); + WHBGfxInitFetchShader(&shader_group); + + // Initialise vertex position buffer + const float vertex_positions[4][2] = { + {-1.0f, 1.0f}, + { 1.0f, 1.0f}, + { 1.0f, -1.0f}, + {-1.0f, -1.0f} + }; + + vertex_position_buffer.flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_VERTEX_BUFFER | + GX2R_RESOURCE_USAGE_CPU_READ | + GX2R_RESOURCE_USAGE_CPU_WRITE | + GX2R_RESOURCE_USAGE_GPU_READ); + vertex_position_buffer.elemSize = sizeof(vertex_positions[0]); + vertex_position_buffer.elemCount = sizeof(vertex_positions) / sizeof(vertex_positions[0]); + GX2RCreateBuffer(&vertex_position_buffer); + memcpy(GX2RLockBufferEx(&vertex_position_buffer, (GX2RResourceFlags)0), vertex_positions, sizeof(vertex_positions)); + GX2RUnlockBufferEx(&vertex_position_buffer, (GX2RResourceFlags)0); + + // Initialise texture coordinate buffer + const float texture_coordinates[4][2] = { + {0.0f, 0.0f}, + {1.0f, 0.0f}, + {1.0f, 1.0f}, + {0.0f, 1.0f} + }; + + texture_coordinate_buffer.flags = (GX2RResourceFlags)(GX2R_RESOURCE_BIND_VERTEX_BUFFER | + GX2R_RESOURCE_USAGE_CPU_READ | + GX2R_RESOURCE_USAGE_CPU_WRITE | + GX2R_RESOURCE_USAGE_GPU_READ); + texture_coordinate_buffer.elemSize = sizeof(texture_coordinates[0]); + texture_coordinate_buffer.elemCount = sizeof(texture_coordinates) / sizeof(texture_coordinates[0]); + GX2RCreateBuffer(&texture_coordinate_buffer); + memcpy(GX2RLockBufferEx(&texture_coordinate_buffer, (GX2RResourceFlags)0), texture_coordinates, sizeof(texture_coordinates)); + GX2RUnlockBufferEx(&texture_coordinate_buffer, (GX2RResourceFlags)0); + + // Initialise sampler + GX2InitSampler(&sampler, GX2_TEX_CLAMP_MODE_CLAMP, GX2_TEX_XY_FILTER_MODE_POINT); + + // Initialise screen texture + screen_texture.surface.width = fake_framebuffer_width; + screen_texture.surface.height = fake_framebuffer_height; + screen_texture.surface.format = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; + screen_texture.surface.depth = 1; + screen_texture.surface.dim = GX2_SURFACE_DIM_TEXTURE_2D; + screen_texture.surface.tileMode = GX2_TILE_MODE_LINEAR_ALIGNED; + screen_texture.surface.mipLevels = 1; + screen_texture.viewNumMips = 1; + screen_texture.viewNumSlices = 1; + screen_texture.compMap = 0x00010203; + GX2CalcSurfaceSizeAndAlignment(&screen_texture.surface); + GX2InitTextureRegs(&screen_texture); + + if (GX2RCreateSurface(&screen_texture.surface, (GX2RResourceFlags)(GX2R_RESOURCE_BIND_TEXTURE | GX2R_RESOURCE_BIND_COLOR_BUFFER | + GX2R_RESOURCE_USAGE_CPU_WRITE | GX2R_RESOURCE_USAGE_CPU_READ | + GX2R_RESOURCE_USAGE_GPU_WRITE | GX2R_RESOURCE_USAGE_GPU_READ))) + { + // Do some binding + GX2SetPixelSampler(&sampler, shader_group.pixelShader->samplerVars[0].location); + GX2SetPixelTexture(&screen_texture, shader_group.pixelShader->samplerVars[0].location); + GX2RSetAttributeBuffer(&vertex_position_buffer, 0, vertex_position_buffer.elemSize, 0); + GX2RSetAttributeBuffer(&texture_coordinate_buffer, 1, texture_coordinate_buffer.elemSize, 0); + + // Calculate centred viewports + switch (GX2GetSystemTVScanMode()) + { + // For now, we have to match WUT's broken behaviour (its `GX2TVScanMode` + // enum is missing values, and the rest are off-by-one) + //case GX2_TV_SCAN_MODE_576I: + case GX2_TV_SCAN_MODE_480I: // Actually 576i + case GX2_TV_SCAN_MODE_480P: // Actually 480i + CalculateViewport(854, 480, &tv_viewport); + break; + + case GX2_TV_SCAN_MODE_720P: // Actually 480p + default: // Funnel the *real* 1080p into this + CalculateViewport(1280, 720, &tv_viewport); + break; + + case GX2_TV_SCAN_MODE_1080I: // Actually invalid + case GX2_TV_SCAN_MODE_1080P: // Actually 1080i + CalculateViewport(1920, 1080, &tv_viewport); + break; + } + + CalculateViewport(854, 480, &drc_viewport); + + return true; + } + + GX2RDestroyBufferEx(&texture_coordinate_buffer, (GX2RResourceFlags)0); + GX2RDestroyBufferEx(&vertex_position_buffer, (GX2RResourceFlags)0); + + WHBGfxFreeShaderGroup(&shader_group); + } + + WHBGfxShutdown(); + + free(fake_framebuffer); + } + + return false; +} + +void WindowBackend_Software_DestroyWindow(void) +{ + GX2RDestroySurfaceEx(&screen_texture.surface, (GX2RResourceFlags)0); + + GX2RDestroyBufferEx(&texture_coordinate_buffer, (GX2RResourceFlags)0); + GX2RDestroyBufferEx(&vertex_position_buffer, (GX2RResourceFlags)0); + + WHBGfxFreeShaderGroup(&shader_group); + + WHBGfxShutdown(); + + free(fake_framebuffer); +} + +unsigned char* WindowBackend_Software_GetFramebuffer(size_t *pitch) +{ + *pitch = screen_texture.surface.pitch * 4; + + return (unsigned char*)GX2RLockSurfaceEx(&screen_texture.surface, 0, (GX2RResourceFlags)0); +} + +ATTRIBUTE_HOT void WindowBackend_Software_Display(void) +{ + GX2RUnlockSurfaceEx(&screen_texture.surface, 0, (GX2RResourceFlags)0); + + WHBGfxBeginRender(); + + // Draw to the TV + WHBGfxBeginRenderTV(); + GX2SetViewport(tv_viewport.x, tv_viewport.y, tv_viewport.width, tv_viewport.height, 0.0f, 1.0f); + WHBGfxClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GX2SetFetchShader(&shader_group.fetchShader); + GX2SetVertexShader(shader_group.vertexShader); + GX2SetPixelShader(shader_group.pixelShader); + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, 4, 0, 1); + WHBGfxFinishRenderTV(); + + // Draw to the gamepad + WHBGfxBeginRenderDRC(); + GX2SetViewport(drc_viewport.x, drc_viewport.y, drc_viewport.width, drc_viewport.height, 0.0f, 1.0f); + WHBGfxClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GX2SetFetchShader(&shader_group.fetchShader); + GX2SetVertexShader(shader_group.vertexShader); + GX2SetPixelShader(shader_group.pixelShader); + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, 4, 0, 1); + WHBGfxFinishRenderDRC(); + + WHBGfxFinishRender(); +} + +void WindowBackend_Software_HandleWindowResize(size_t width, size_t height) +{ + (void)width; + (void)height; + + // The window doesn't resize on the Wii U +} diff --git a/src/Backends/Shared/GLFW3.h b/src/Backends/Shared/GLFW3.h new file mode 100644 index 0000000..7ee871c --- /dev/null +++ b/src/Backends/Shared/GLFW3.h @@ -0,0 +1,6 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +extern struct GLFWwindow *window; diff --git a/src/Backends/Shared/SDL.h b/src/Backends/Shared/SDL.h new file mode 100644 index 0000000..e69d9a7 --- /dev/null +++ b/src/Backends/Shared/SDL.h @@ -0,0 +1,13 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "SDL.h" + +#if SDL_VERSION_ATLEAST(2, 0, 0) +extern SDL_Window *window; +#endif + +void ControllerBackend_JoystickConnect(Sint32 joystick_id); +void ControllerBackend_JoystickDisconnect(Sint32 joystick_id); diff --git a/src/Bitmap.cpp b/src/Bitmap.cpp new file mode 100644 index 0000000..d67f91f --- /dev/null +++ b/src/Bitmap.cpp @@ -0,0 +1,290 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "Bitmap.h" + +#include +#include +#include + +#define STB_IMAGE_IMPLEMENTATION +#define STB_IMAGE_STATIC +#define STBI_ONLY_BMP +#define STBI_ONLY_PNG +#define STBI_NO_LINEAR +#define STBI_NO_STDIO +#include "../external/stb_image.h" + +#include "WindowsWrapper.h" + +#include "Draw.h" +#include "File.h" +#include "Generic.h" + +int gFilterIndex; +float gDimmingFactor = 1; + +// Color filters definitions +BOOL CallbackGrayscale(unsigned char *buffer, unsigned int index){ + const unsigned char r = buffer[index]; + const unsigned char g = buffer[index+1]; + const unsigned char b = buffer[index+2]; + + //compute luminance + double r_float = (1.0*r)/255; + double g_float = (1.0*g)/255; + double b_float = (1.0*b)/255; + + float lum = (r_float + g_float + b_float)/3; + + lum = lum*255; + + buffer[index] = lum; + buffer[index+1] = lum; + buffer[index+2] = lum; + + return TRUE; + +} + +BOOL CallbackGenesis(unsigned char *buffer, unsigned int index){ + const unsigned char r = buffer[index]; + const unsigned char g = buffer[index+1]; + const unsigned char b = buffer[index+2]; + + + unsigned int r_gen = (r+8)*8/256; + unsigned int g_gen = (g+8)*8/256; + unsigned int b_gen = (b+8)*8/256; + + if(r_gen == 8){ + r_gen = 7; + } + if(g_gen == 8){ + g_gen = 7; + } + if(b_gen == 8){ + b_gen = 7; + } + + const unsigned int colors[]={ + 0,52,87,116,144,172,206,255 + }; + + buffer[index] = colors[r_gen]; + buffer[index+1]= colors[g_gen]; + buffer[index+2] = colors[b_gen]; + + return TRUE; +} + +BOOL CallbackMSX(unsigned char *buffer, unsigned int index){ + const unsigned char r = buffer[index]; + const unsigned char g = buffer[index+1]; + const unsigned char b = buffer[index+2]; + + unsigned int r_gen = r*8/256; + unsigned int g_gen = g*8/256; + unsigned int b_gen = b*4/256; + + buffer[index] = r_gen*256/8 + 16; + buffer[index+1] = g_gen*256/8 + 16; + buffer[index+2] = b_gen*256/4 + 32; + + return TRUE; +} + + +BOOL CallbackGameBoy(unsigned char *buffer, unsigned int index){ + const unsigned char r = buffer[index]; + const unsigned char g = buffer[index+1]; + const unsigned char b = buffer[index+2]; + //compute luminance + double lum = 4.0*(r + g + b)/(3*256); + + int color = lum; + + unsigned int colors[] = { + 12,54,14, + 44,98,52, + 110,135,10, + 156,190,12, + }; + + buffer[index] = colors[3*color]; + buffer[index+1] = colors[3*color+1]; + buffer[index+2] = colors[3*color+2]; + + return TRUE; +} + +BOOL CallbackProtanopia(unsigned char *buffer, unsigned int index){ + const unsigned char r = buffer[index]; + const unsigned char g = buffer[index+1]; + const unsigned char b = buffer[index+2]; + + const double R[] = {56.667, 43.333, 0}; + const double G[] = {55.833, 44.167, 0}; + const double B[] = {0, 24.167, 75.833}; + + buffer[index] = r*R[0]/100 + g*R[1]/100 + b*R[2]/100; + buffer[index+1] = r*G[0]/100 + g*G[1]/100 + b*G[2]/100; + buffer[index+2] = r*B[0]/100 + g*B[1]/100 + b*B[2]/100; + + return TRUE; +} + +BOOL CallbackProtanomaly(unsigned char *buffer, unsigned int index){ + const unsigned char r = buffer[index]; + const unsigned char g = buffer[index+1]; + const unsigned char b = buffer[index+2]; + + const double R[] = {81.667, 18.333, 0}; + const double G[] = {33.333, 66.667, 0}; + const double B[] = {0, 12.5, 87.5}; + + buffer[index] = r*R[0]/100 + g*R[1]/100 + b*R[2]/100; + buffer[index+1] = r*G[0]/100 + g*G[1]/100 + b*G[2]/100; + buffer[index+2] = r*B[0]/100 + g*B[1]/100 + b*B[2]/100; + + return TRUE; +} + +BOOL CallbackDeuteranomaly(unsigned char *buffer, unsigned int index){ + const unsigned char r = buffer[index]; + const unsigned char g = buffer[index+1]; + const unsigned char b = buffer[index+2]; + + const double R[] = {80, 20, 0}; + const double G[] = {25.833, 74.167, 0}; + const double B[] = {0, 14.167, 85.833}; + + buffer[index] = r*R[0]/100 + g*R[1]/100 + b*R[2]/100; + buffer[index+1] = r*G[0]/100 + g*G[1]/100 + b*G[2]/100; + buffer[index+2] = r*B[0]/100 + g*B[1]/100 + b*B[2]/100; + + return TRUE; +} + +BOOL CallbackDeuteranopia(unsigned char *buffer, unsigned int index){ + const unsigned char r = buffer[index]; + const unsigned char g = buffer[index+1]; + const unsigned char b = buffer[index+2]; + + const double R[] = {62.5, 37.5, 0}; + const double G[] = {70, 30, 0}; + const double B[] = {0, 30, 70}; + + buffer[index] = r*R[0]/100 + g*R[1]/100 + b*R[2]/100; + buffer[index+1] = r*G[0]/100 + g*G[1]/100 + b*G[2]/100; + buffer[index+2] = r*B[0]/100 + g*B[1]/100 + b*B[2]/100; + + return TRUE; +} + +BOOL CallbackTritanomaly(unsigned char *buffer, unsigned int index){ + const unsigned char r = buffer[index]; + const unsigned char g = buffer[index+1]; + const unsigned char b = buffer[index+2]; + + const double R[] = {96.667, 3.333, 0}; + const double G[] = {0, 73.333, 26.667}; + const double B[] = {0, 18.333, 81.667}; + + buffer[index] = r*R[0]/100 + g*R[1]/100 + b*R[2]/100; + buffer[index+1] = r*G[0]/100 + g*G[1]/100 + b*G[2]/100; + buffer[index+2] = r*B[0]/100 + g*B[1]/100 + b*B[2]/100; + + return TRUE; +} + +BOOL CallbackTritanopia(unsigned char *buffer, unsigned int index){ + const unsigned char r = buffer[index]; + const unsigned char g = buffer[index+1]; + const unsigned char b = buffer[index+2]; + + const double R[] = {95, 5, 0}; + const double G[] = {0, 43.333, 56.667}; + const double B[] = {0, 47.5, 52.5}; + + buffer[index] = r*R[0]/100 + g*R[1]/100 + b*R[2]/100; + buffer[index+1] = r*G[0]/100 + g*G[1]/100 + b*G[2]/100; + buffer[index+2] = r*B[0]/100 + g*B[1]/100 + b*B[2]/100; + + return TRUE; +} + +ColorFilter gColorFilters[] = { + {"Off", NULL}, + {"Protanomaly", CallbackProtanomaly}, + {"Protanopia", CallbackProtanopia}, + {"Deuteranomaly", CallbackDeuteranomaly}, + {"Deuteranopia", CallbackDeuteranopia}, + {"Tritanomaly", CallbackTritanomaly}, + {"Tritanopia", CallbackTritanopia}, + {"Grayscale", CallbackGrayscale}, + {"Genesis", CallbackGenesis}, + {"MSX", CallbackMSX}, + {"Game Boy", CallbackGameBoy}, +}; + + +unsigned char* DecodeBitmap(const unsigned char *in_buffer, size_t in_buffer_size, size_t *width, size_t *height, unsigned int bytes_per_pixel) +{ + int int_width, int_height; + unsigned char *image_buffer = stbi_load_from_memory(in_buffer, in_buffer_size, &int_width, &int_height, NULL, bytes_per_pixel); + + *width = int_width; + *height = int_height; + + // apply color filter if it exists + if(gFilterIndex != 0){ + for (size_t i = 0; i < *width * *height; ++i){ + gColorFilters[gFilterIndex].callback(image_buffer, 4*i); + } + } + + return image_buffer; +} + +unsigned char* DecodeBitmapFromFile(const char *path, size_t *width, size_t *height, unsigned int bytes_per_pixel) +{ + size_t file_size; + unsigned char *file_buffer = LoadFileToMemory(path, &file_size); + + if (file_buffer != NULL) + { + unsigned char *image_buffer = DecodeBitmap(file_buffer, file_size, width, height, bytes_per_pixel); + + free(file_buffer); + + return image_buffer; + } + + return NULL; +} + +void FreeBitmap(unsigned char *buffer) +{ + stbi_image_free(buffer); +} + +BOOL DimBuffer(unsigned char *buffer, float dim_factor, size_t width, size_t height){ + for (size_t i = 0; i < width*height; i++){ + unsigned char color_r = (buffer)[4*i]; + unsigned char color_g = (buffer)[4*i+1]; + unsigned char color_b = (buffer)[4*i+2]; + unsigned char color_a = (buffer)[4*i+3]; + + unsigned char new_color_r = color_r*dim_factor; + unsigned char new_color_g = color_g*dim_factor; + unsigned char new_color_b = color_b*dim_factor; + + (buffer)[4*i] = new_color_r; + (buffer)[4*i+1] = new_color_g; + (buffer)[4*i+2] = new_color_b; + (buffer)[4*i+3] = color_a; + } + + return true; +} \ No newline at end of file diff --git a/src/Bitmap.h b/src/Bitmap.h new file mode 100644 index 0000000..5d0810c --- /dev/null +++ b/src/Bitmap.h @@ -0,0 +1,24 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +#include "WindowsWrapper.h" + +typedef struct ColorFilter{ + const char* name; + BOOL (*callback)(unsigned char *buffer, unsigned int index); +} ColorFilter; + +extern ColorFilter gColorFilters[]; +extern int gFilterIndex; +extern float gDimmingFactor; + +unsigned char* DecodeBitmapWithAlpha(const unsigned char *in_buffer, size_t in_buffer_size, unsigned int *width, unsigned int *height, BOOL colour_key); +unsigned char* DecodeBitmapWithAlphaFromFile(const char *path, unsigned int *width, unsigned int *height, BOOL colour_key); +unsigned char* DecodeBitmap(const unsigned char *in_buffer, size_t in_buffer_size, size_t *width, size_t *height, unsigned int bytes_per_pixel); +unsigned char* DecodeBitmapFromFile(const char *path, size_t *width, size_t *height, unsigned int bytes_per_pixel); +void FreeBitmap(unsigned char *buffer); +BOOL DimBuffer(unsigned char *buffer, float dim_factor, size_t width, size_t height); \ No newline at end of file diff --git a/src/Boss.cpp b/src/Boss.cpp new file mode 100644 index 0000000..3439ef8 --- /dev/null +++ b/src/Boss.cpp @@ -0,0 +1,392 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Boss.h" + +#include + +#include "WindowsWrapper.h" + +#include "BossAlmo1.h" +#include "BossAlmo2.h" +#include "BossBallos.h" +#include "BossFrog.h" +#include "BossIronH.h" +#include "BossOhm.h" +#include "BossPress.h" +#include "BossTwinD.h" +#include "BossX.h" +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Draw.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" +#include "NpcHit.h" +#include "Sound.h" +#include "TextScr.h" +#include "ValueView.h" + +NPCHAR gBoss[BOSS_MAX]; +double gBossHPMultiplier; + +void InitBossChar(int code) +{ + memset(gBoss, 0, sizeof(gBoss)); + gBoss[0].cond = 0x80; + gBoss[0].code_char = code; +} + +void PutBossChar(int fx, int fy) +{ + signed char a = 0; + int b; + + int side; + + for (b = BOSS_MAX - 1; b >= 0; --b) + { + if (gBoss[b].cond & 0x80) + { + if (gBoss[b].shock != 0) + { + a = ((gBoss[b].shock / 2 % 2) * 2) - 1; + } + else + { + a = 0; + + if (gBoss[b].bits & NPC_SHOW_DAMAGE && gBoss[b].damage_view != 0) + { + SetValueView(&gBoss[b].x, &gBoss[b].y, gBoss[b].damage_view); + gBoss[b].damage_view = 0; + } + } + + if (gBoss[b].direct == 0) + side = gBoss[b].view.front; + else + side = gBoss[b].view.back; + + PutBitmap3( + &grcGame, + SubpixelToScreenCoord(gBoss[b].x - side) - SubpixelToScreenCoord(fx) + PixelToScreenCoord(a), + SubpixelToScreenCoord(gBoss[b].y - gBoss[b].view.top) - SubpixelToScreenCoord(fy), + &gBoss[b].rect, + SURFACE_ID_LEVEL_SPRITESET_2); + } + } +} + +void SetBossCharActNo(int a) +{ + gBoss[0].act_no = a; +} + +void HitBossBullet(void) +{ + BOOL bHit; + int bul; + int bos; + int bos_; + + for (bos = 0; bos < BOSS_MAX; ++bos) + { + if (!(gBoss[bos].cond & 0x80)) + continue; + + for (bul = 0; bul < BULLET_MAX; ++bul) + { + if (!(gBul[bul].cond & 0x80)) + continue; + + if (gBul[bul].damage == -1) + continue; + + // Check if bullet touches boss + bHit = FALSE; + if (gBoss[bos].bits & NPC_SHOOTABLE + && gBoss[bos].x - gBoss[bos].hit.back < gBul[bul].x + gBul[bul].enemyXL + && gBoss[bos].x + gBoss[bos].hit.back > gBul[bul].x - gBul[bul].enemyXL + && gBoss[bos].y - gBoss[bos].hit.top < gBul[bul].y + gBul[bul].enemyYL + && gBoss[bos].y + gBoss[bos].hit.bottom > gBul[bul].y - gBul[bul].enemyYL) + bHit = TRUE; + else if (gBoss[bos].bits & NPC_INVULNERABLE + && gBoss[bos].x - gBoss[bos].hit.back < gBul[bul].x + gBul[bul].blockXL + && gBoss[bos].x + gBoss[bos].hit.back > gBul[bul].x - gBul[bul].blockXL + && gBoss[bos].y - gBoss[bos].hit.top < gBul[bul].y + gBul[bul].blockYL + && gBoss[bos].y + gBoss[bos].hit.bottom > gBul[bul].y - gBul[bul].blockYL) + bHit = TRUE; + + if (bHit) + { + // Damage boss + if (gBoss[bos].bits & NPC_SHOOTABLE) + { + if (gBoss[bos].cond & 0x10) + bos_ = 0; + else + bos_ = bos; + + gBoss[bos_].life -= gBul[bul].damage; + + if (gBoss[bos_].life < 1) + { + gBoss[bos_].life = bos_; + + if (gMC.cond & 0x80 && gBoss[bos_].bits & NPC_EVENT_WHEN_KILLED) + { + StartTextScript(gBoss[bos_].code_event); + } + else + { + PlaySoundObject(gBoss[bos_].destroy_voice, SOUND_MODE_PLAY); + + switch (gBoss[bos_].size) + { + case 1: + SetDestroyNpChar(gBoss[bos_].x, gBoss[bos_].y, gBoss[bos_].view.back, 4); + break; + case 2: + SetDestroyNpChar(gBoss[bos_].x, gBoss[bos_].y, gBoss[bos_].view.back, 8); + break; + case 3: + SetDestroyNpChar(gBoss[bos_].x, gBoss[bos_].y, gBoss[bos_].view.back, 16); + break; + } + + gBoss[bos_].cond = 0; + } + } + else + { + if (gBoss[bos].shock < 14) + { + SetCaret(gBul[bul].x, gBul[bul].y, CARET_HURT_PARTICLES, DIR_LEFT); + SetCaret(gBul[bul].x, gBul[bul].y, CARET_HURT_PARTICLES, DIR_LEFT); + SetCaret(gBul[bul].x, gBul[bul].y, CARET_HURT_PARTICLES, DIR_LEFT); + PlaySoundObject(gBoss[bos_].hit_voice, SOUND_MODE_PLAY); + } + + gBoss[bos].shock = 8; + gBoss[bos_].shock = 8; + gBoss[bos_].damage_view -= gBul[bul].damage; + } + + --gBul[bul].life; + + if (gBul[bul].life < 1) + gBul[bul].cond = 0; + } + else if (gBul[bul].code_bullet == 13 + || gBul[bul].code_bullet == 14 + || gBul[bul].code_bullet == 15 + || gBul[bul].code_bullet == 28 + || gBul[bul].code_bullet == 29 + || gBul[bul].code_bullet == 30) + { + --gBul[bul].life; + } + else + { + if (!(gBul[bul].bbits & 0x10)) + { + SetCaret(gBul[bul].x, gBul[bul].y, CARET_PROJECTILE_DISSIPATION, DIR_RIGHT); + PlaySoundObject(31, SOUND_MODE_PLAY); + gBul[bul].cond = 0; + continue; + } + } + } + } + } +} + +void ActBossChar_0(void) +{ + +} + +BOSSFUNCTION gpBossFuncTbl[10] = +{ + ActBossChar_0, + ActBossChar_Omega, + ActBossChar_Frog, + ActBossChar_MonstX, + ActBossChar_Core, + ActBossChar_Ironhead, + ActBossChar_Twin, + ActBossChar_Undead, + ActBossChar_Press, + ActBossChar_Ballos +}; + +void ActBossChar(void) +{ + int code_char; + int bos; + + if (!(gBoss[0].cond & 0x80)) + return; + + code_char = gBoss[0].code_char; + + gpBossFuncTbl[code_char](); + + for (bos = 0; bos < BOSS_MAX; ++bos) + if (gBoss[bos].shock) + --gBoss[bos].shock; +} + +void HitBossMap(void) +{ + int x, y; + unsigned char atrb[16]; + int judg; + int offx[16]; + int offy[16]; + int b, j; + + offx[0] = 0; + offx[1] = 1; + offx[2] = 0; + offx[3] = 1; + offx[4] = 2; + offx[5] = 2; + offx[6] = 2; + offx[7] = 0; + offx[8] = 1; + offx[9] = -1; + offx[10] = -1; + offx[11] = -1; + offx[12] = -1; + offx[13] = 0; + offx[14] = 1; + offx[15] = 2; + + offy[0] = 0; + offy[1] = 0; + offy[2] = 1; + offy[3] = 1; + offy[4] = 0; + offy[5] = 1; + offy[6] = 2; + offy[7] = 2; + offy[8] = 2; + offy[9] = -1; + offy[10] = 0; + offy[11] = 1; + offy[12] = 2; + offy[13] = -1; + offy[14] = -1; + offy[15] = -1; + + for (b = 0; b < BOSS_MAX; ++b) + { + if (!(gBoss[b].cond & 0x80)) + continue; + + if (gBoss[b].bits & NPC_IGNORE_SOLIDITY) + continue; + + if (gBoss[b].size >= 3) + { + judg = 16; + x = gBoss[b].x / 0x10 / 0x200; + y = gBoss[b].y / 0x10 / 0x200; + } + else + { + judg = 4; + x = gBoss[b].x / 0x10 / 0x200; + y = gBoss[b].y / 0x10 / 0x200; + } + + gBoss[b].flag = 0; + for (j = 0; j < judg; ++j) + { + atrb[j] = GetAttribute(x + offx[j], y + offy[j]); + + switch (atrb[j]) + { + case 0x44: + if (gBoss[b].bits & NPC_IGNORE_TILE_44) + break; + // Fallthrough + case 0x05: + case 0x41: + case 0x43: + JadgeHitNpCharBlock(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x50: + JudgeHitNpCharTriangleA(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x51: + JudgeHitNpCharTriangleB(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x52: + JudgeHitNpCharTriangleC(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x53: + JudgeHitNpCharTriangleD(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x54: + JudgeHitNpCharTriangleE(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x55: + JudgeHitNpCharTriangleF(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x56: + JudgeHitNpCharTriangleG(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x57: + JudgeHitNpCharTriangleH(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x02: + case 0x60: + case 0x61: + case 0x64: + JadgeHitNpCharBlock(&gBoss[b], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x70: + JudgeHitNpCharTriangleA(&gBoss[b], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x71: + JudgeHitNpCharTriangleB(&gBoss[b], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x72: + JudgeHitNpCharTriangleC(&gBoss[b], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x73: + JudgeHitNpCharTriangleD(&gBoss[b], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x74: + JudgeHitNpCharTriangleE(&gBoss[b], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x75: + JudgeHitNpCharTriangleF(&gBoss[b], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x76: + JudgeHitNpCharTriangleG(&gBoss[b], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gBoss[b], x + offx[j], y + offy[j]); + break; + case 0x77: + JudgeHitNpCharTriangleH(&gBoss[b], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gBoss[b], x + offx[j], y + offy[j]); + break; + } + } + } +} diff --git a/src/Boss.h b/src/Boss.h new file mode 100644 index 0000000..9982ca0 --- /dev/null +++ b/src/Boss.h @@ -0,0 +1,25 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "NpChar.h" + +#define BOSS_MAX 20 + +extern NPCHAR gBoss[BOSS_MAX]; +extern double gBossHPMultiplier; + +typedef void (*BOSSFUNCTION)(void); +extern BOSSFUNCTION gpBossFuncTbl[10]; + +void InitBossChar(int code); +void PutBossChar(int fx, int fy); +void SetBossCharActNo(int a); +void HitBossBullet(void); +void ActBossChar(void); +void HitBossMap(void); diff --git a/src/BossAlmo1.cpp b/src/BossAlmo1.cpp new file mode 100644 index 0000000..9b7e847 --- /dev/null +++ b/src/BossAlmo1.cpp @@ -0,0 +1,636 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BossAlmo1.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "Frame.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +void ActBossChar_Core_Face(NPCHAR *npc) +{ + RECT rect[4] = { + {0, 0, 72, 112}, + {0, 112, 72, 224}, + {160, 0, 232, 112}, + {0, 0, 0, 0}, + }; + + switch (npc->act_no) + { + case 10: + npc->act_no = 11; + npc->ani_no = 2; + npc->bits = NPC_IGNORE_SOLIDITY; + npc->view.front = 36 * 0x200; + npc->view.top = 56 * 0x200; + // Fallthrough + case 11: + npc->x = gBoss[0].x - (36 * 0x200); + npc->y = gBoss[0].y; + break; + + case 50: + npc->act_no = 51; + npc->act_wait = 112; + // Fallthrough + case 51: + --npc->act_wait; + + if (npc->act_wait == 0) + { + npc->act_no = 100; + npc->ani_no = 3; + } + + npc->x = gBoss[0].x - (36 * 0x200); + npc->y = gBoss[0].y; + break; + + case 100: + npc->ani_no = 3; + break; + } + + npc->rect = rect[npc->ani_no]; + + if (npc->act_no == 51) + npc->rect.bottom = npc->rect.top + npc->act_wait; +} + +void ActBossChar_Core_Tail(NPCHAR *npc) +{ + RECT rect[3] = { + {72, 0, 160, 112}, + {72, 112, 160, 224}, + {0, 0, 0, 0}, + }; + + switch (npc->act_no) + { + case 10: + npc->act_no = 11; + npc->ani_no = 0; + npc->bits = NPC_IGNORE_SOLIDITY; + npc->view.front = 44 * 0x200; + npc->view.top = 56 * 0x200; + // Fallthrough + case 11: + npc->x = gBoss[0].x + (44 * 0x200); + npc->y = gBoss[0].y; + break; + + case 50: + npc->act_no = 51; + npc->act_wait = 112; + // Fallthrough + case 51: + --npc->act_wait; + + if (npc->act_wait == 0) + { + npc->act_no = 100; + npc->ani_no = 2; + } + + npc->x = gBoss[0].x + (44 * 0x200); + npc->y = gBoss[0].y; + break; + + case 100: + npc->ani_no = 2; + break; + } + + npc->rect = rect[npc->ani_no]; + + if (npc->act_no == 51) + npc->rect.bottom = npc->rect.top + npc->act_wait; +} + +void ActBossChar_Core_Mini(NPCHAR *npc) +{ + RECT rect[3] = { + {256, 0, 320, 40}, + {256, 40, 320, 80}, + {256, 80, 320, 120}, + }; + + int xm, ym; + unsigned char deg; + + npc->life = 1000; + + switch (npc->act_no) + { + case 10: + npc->ani_no = 2; + npc->bits &= ~NPC_SHOOTABLE; + break; + + case 100: + npc->act_no = 101; + npc->ani_no = 2; + npc->act_wait = 0; + npc->tgt_x = gBoss[0].x + (Random(-0x80, 0x20) * 0x200); + npc->tgt_y = gBoss[0].y + (Random(-0x40, 0x40) * 0x200); + npc->bits |= NPC_SHOOTABLE; + // Fallthrough + case 101: + npc->x += (npc->tgt_x - npc->x) / 0x10; + npc->y += (npc->tgt_y - npc->y) / 0x10; + + ++npc->act_wait; + + if (npc->act_wait > 50) + npc->ani_no = 0; + + break; + + case 120: + npc->act_no = 121; + npc->act_wait = 0; + // Fallthrough + case 121: + ++npc->act_wait; + + if (npc->act_wait / 2 % 2) + npc->ani_no = 0; + else + npc->ani_no = 1; + + if (npc->act_wait > 20) + npc->act_no = 130; + + break; + + case 130: + npc->act_no = 131; + npc->ani_no = 2; + npc->act_wait = 0; + npc->tgt_x = npc->x + (Random(24, 48) * 0x200); + npc->tgt_y = npc->y + (Random(-4, 4) * 0x200); + // Fallthrough + case 131: + npc->x += (npc->tgt_x - npc->x) / 0x10; + npc->y += (npc->tgt_y - npc->y) / 0x10; + + ++npc->act_wait; + + if (npc->act_wait > 50) + { + npc->act_no = 140; + npc->ani_no = 0; + } + + if (npc->act_wait == 1 || npc->act_wait == 3) + { + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-2, 2); + ym = GetSin(deg) * 2; + xm = GetCos(deg) * 2; + SetNpChar(178, npc->x, npc->y, xm, ym, 0, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + break; + + case 140: + npc->x += (npc->tgt_x - npc->x) / 0x10; + npc->y += (npc->tgt_y - npc->y) / 0x10; + break; + + case 200: + npc->act_no = 201; + npc->ani_no = 2; + npc->xm = 0; + npc->ym = 0; + // Fallthrough + case 201: + npc->xm += 0x20; + npc->x += npc->xm; + + if (npc->x > (gMap.width * 0x200 * 0x10) + (2 * 0x200 * 0x10)) + npc->cond = 0; + + break; + } + + if (npc->shock != 0) + npc->tgt_x += 2 * 0x200; + + npc->rect = rect[npc->ani_no]; +} + +void ActBossChar_Core_Hit(NPCHAR *npc) +{ + switch (npc->count1) + { + case 0: + npc->x = gBoss[0].x; + npc->y = gBoss[0].y - (32 * 0x200); + break; + + case 1: + npc->x = gBoss[0].x + (28 * 0x200); + npc->y = gBoss[0].y; + break; + + case 2: + npc->x = gBoss[0].x + (4 * 0x200); + npc->y = gBoss[0].y + (32 * 0x200); + break; + + case 3: + npc->x = gBoss[0].x - (28 * 0x200); + npc->y = gBoss[0].y + (4 * 0x200); + break; + } +} + +void ActBossChar_Core(void) +{ + NPCHAR *npc = gBoss; + + static unsigned char flash; + BOOL bShock = FALSE; + int i; + unsigned char deg; + int xm, ym; + + switch (npc->act_no) + { + case 0: + npc->act_no = 10; + npc->exp = 1; + npc->cond = 0x80; + npc->bits = (NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY | NPC_SHOW_DAMAGE); + npc->life = 650; + npc->hit_voice = 114; + npc->x = 77 * 0x10 * 0x200; + npc->y = 14 * 0x10 * 0x200; + npc->xm = 0; + npc->ym = 0; + npc->code_event = 1000; + npc->bits |= NPC_EVENT_WHEN_KILLED; + + gBoss[4].cond = 0x80; + gBoss[4].act_no = 10; + + gBoss[5].cond = 0x80; + gBoss[5].act_no = 10; + + gBoss[8].cond = 0x80; + gBoss[8].bits = (NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY); + gBoss[8].view.front = 0; + gBoss[8].view.top = 0; + gBoss[8].hit.back = 40 * 0x200; + gBoss[8].hit.top = 16 * 0x200; + gBoss[8].hit.bottom = 16 * 0x200; + gBoss[8].count1 = 0; + + gBoss[9] = gBoss[8]; + gBoss[9].hit.back = 36 * 0x200; + gBoss[9].hit.top = 24 * 0x200; + gBoss[9].hit.bottom = 24 * 0x200; + gBoss[9].count1 = 1; + + gBoss[10] = gBoss[8]; + gBoss[10].hit.back = 44 * 0x200; + gBoss[10].hit.top = 8 * 0x200; + gBoss[10].hit.bottom = 8 * 0x200; + gBoss[10].count1 = 2; + + gBoss[11] = gBoss[8]; + gBoss[11].cond |= 0x10; + gBoss[11].hit.back = 20 * 0x200; + gBoss[11].hit.top = 20 * 0x200; + gBoss[11].hit.bottom = 20 * 0x200; + gBoss[11].count1 = 3; + + gBoss[1].cond = 0x80; + gBoss[1].act_no = 10; + gBoss[1].bits = (NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY | NPC_SHOOTABLE); + gBoss[1].life = 1000; + gBoss[1].hit_voice = 54; + gBoss[1].hit.back = 24 * 0x200; + gBoss[1].hit.top = 16 * 0x200; + gBoss[1].hit.bottom = 16 * 0x200; + gBoss[1].view.front = 32 * 0x200; + gBoss[1].view.top = 20 * 0x200; + gBoss[1].x = npc->x - (8 * 0x200); + gBoss[1].y = npc->y - (64 * 0x200); + + gBoss[2] = gBoss[1]; + gBoss[2].x = npc->x + (16 * 0x200); + gBoss[2].y = npc->y; + + gBoss[3] = gBoss[1]; + gBoss[3].x = npc->x - (8 * 0x200); + gBoss[3].y = npc->y + (64 * 0x200); + + gBoss[6] = gBoss[1]; + gBoss[6].x = npc->x - (48 * 0x200); + gBoss[6].y = npc->y - (32 * 0x200); + + gBoss[7] = gBoss[1]; + gBoss[7].x = npc->x - (48 * 0x200); + gBoss[7].y = npc->y + (32 * 0x200); + break; + + case 200: + npc->act_no = 201; + npc->act_wait = 0; + gBoss[11].bits &= ~NPC_SHOOTABLE; + gSuperYpos = 0; + CutNoise(); + // Fallthrough + case 201: + npc->tgt_x = gMC.x; + npc->tgt_y = gMC.y; + + ++npc->act_wait; + + if (npc->act_wait > 400) + { + ++npc->count1; + PlaySoundObject(115, SOUND_MODE_PLAY); + + if (npc->count1 > 3) + { + npc->count1 = 0; + npc->act_no = 220; + gBoss[4].ani_no = 0; + gBoss[5].ani_no = 0; + bShock = TRUE; + } + else + { + npc->act_no = 210; + gBoss[4].ani_no = 0; + gBoss[5].ani_no = 0; + bShock = TRUE; + } + } + + break; + + case 210: + npc->act_no = 211; + npc->act_wait = 0; + npc->count2 = npc->life; + gBoss[11].bits |= NPC_SHOOTABLE; + // Fallthrough + case 211: + npc->tgt_x = gMC.x; + npc->tgt_y = gMC.y; + + if (npc->shock != 0) + { + if (++flash / 2 % 2) + { + gBoss[4].ani_no = 0; + gBoss[5].ani_no = 0; + } + else + { + gBoss[4].ani_no = 1; + gBoss[5].ani_no = 1; + } + } + else + { + gBoss[4].ani_no = 0; + gBoss[5].ani_no = 0; + } + + ++npc->act_wait; + + if (npc->act_wait % 100 == 1) + { + gCurlyShoot_wait = Random(80, 100); + gCurlyShoot_x = gBoss[11].x; + gCurlyShoot_y = gBoss[11].y; + } + + if (npc->act_wait < 200 && npc->act_wait % 20 == 1) + SetNpChar(179, npc->x + (Random(-48, -16) * 0x200), npc->y + (Random(-64, 64) * 0x200), 0, 0, 0, NULL, 0x100); + + if (npc->act_wait > 400 || npc->life < npc->count2 - 200) + { + npc->act_no = 200; + gBoss[4].ani_no = 2; + gBoss[5].ani_no = 0; + bShock = TRUE; + } + + break; + + case 220: + npc->act_no = 221; + npc->act_wait = 0; + gSuperYpos = 1; + gBoss[11].bits |= NPC_SHOOTABLE; + SetQuake(100); + SetNoise(1, 1000); + // Fallthrough + case 221: + ++npc->act_wait; + SetNpChar(199, gMC.x + (Random(-50, 150) * 0x200 * 2), gMC.y + (Random(-160, 160) * 0x200), 0, 0, 0, NULL, 0x100); + gMC.xm -= 0x20; + gMC.cond |= 0x20; + + if (npc->shock != 0) + { + if (++flash / 2 % 2) + { + gBoss[4].ani_no = 0; + gBoss[5].ani_no = 0; + } + else + { + gBoss[4].ani_no = 1; + gBoss[5].ani_no = 1; + } + } + else + { + gBoss[4].ani_no = 0; + gBoss[5].ani_no = 0; + } + + if (npc->act_wait == 300 || npc->act_wait == 350 || npc->act_wait == 400) + { + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + ym = GetSin(deg) * 3; + xm = GetCos(deg) * 3; + SetNpChar(218, npc->x - (40 * 0x200), npc->y, xm, ym, 0, NULL, 0x100); + PlaySoundObject(101, SOUND_MODE_PLAY); + } + + if (npc->act_wait > 400) + { + npc->act_no = 200; + gBoss[4].ani_no = 2; + gBoss[5].ani_no = 0; + bShock = TRUE; + } + + break; + + case 500: + CutNoise(); + + npc->act_no = 501; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + gBoss[4].ani_no = 2; + gBoss[5].ani_no = 0; + gBoss[1].act_no = 200; + gBoss[2].act_no = 200; + gBoss[3].act_no = 200; + gBoss[6].act_no = 200; + gBoss[7].act_no = 200; + + SetQuake(20); + + for (i = 0; i < 0x20; ++i) + SetNpChar(4, npc->x + (Random(-128, 128) * 0x200), npc->y + (Random(-64, 64) * 0x200), Random(-128, 128) * 0x200, Random(-128, 128) * 0x200, 0, NULL, 0x100); + + for (i = 0; i < 12; ++i) + gBoss[i].bits &= ~(NPC_INVULNERABLE | NPC_SHOOTABLE); + + // Fallthrough + case 501: + ++npc->act_wait; + + if (npc->act_wait % 16) + SetNpChar(4, npc->x + (Random(-64, 64) * 0x200), npc->y + (Random(-32, 32) * 0x200), Random(-128, 128) * 0x200, Random(-128, 128) * 0x200, 0, NULL, 0x100); + + if (npc->act_wait / 2 % 2) + npc->x -= 0x200; + else + npc->x += 0x200; + + if (npc->x < 63 * 0x10 * 0x200) + npc->x += 0x80; + else + npc->x -= 0x80; + + if (npc->y < 11 * 0x10 * 0x200) + npc->y += 0x80; + else + npc->y -= 0x80; + + break; + + case 600: + npc->act_no = 601; + gBoss[4].act_no = 50; + gBoss[5].act_no = 50; + gBoss[8].bits &= ~NPC_INVULNERABLE; + gBoss[9].bits &= ~NPC_INVULNERABLE; + gBoss[10].bits &= ~NPC_INVULNERABLE; + gBoss[11].bits &= ~NPC_INVULNERABLE; + // Fallthrough + case 601: + ++npc->act_wait; + + if (npc->act_wait / 2 % 2) + npc->x -= 4 * 0x200; + else + npc->x += 4 * 0x200; + + break; + } + + if (bShock) + { + SetQuake(20); + + gBoss[1].act_no = 100; + gBoss[2].act_no = 100; + gBoss[3].act_no = 100; + gBoss[6].act_no = 100; + gBoss[7].act_no = 100; + + PlaySoundObject(26, SOUND_MODE_PLAY); + + for (i = 0; i < 8; ++i) + SetNpChar(4, gBoss[4].x + (Random(-32, 16) * 0x200), gBoss[4].y, Random(-0x200, 0x200), Random(-0x100, 0x100), 0, NULL, 0x100); + } + + if (npc->act_no >= 200 && npc->act_no < 300) + { + switch (npc->act_wait) + { + case 80: + gBoss[1].act_no = 120; + break; + case 110: + gBoss[2].act_no = 120; + break; + case 140: + gBoss[3].act_no = 120; + break; + case 170: + gBoss[6].act_no = 120; + break; + case 200: + gBoss[7].act_no = 120; + break; + } + + if (npc->x < npc->tgt_x + (10 * 0x10 * 0x200)) + npc->xm += 4; + if (npc->x > npc->tgt_x + (10 * 0x10 * 0x200)) + npc->xm -= 4; + + if (npc->y < npc->tgt_y) + npc->ym += 4; + if (npc->y > npc->tgt_y) + npc->ym -= 4; + } + + if (npc->xm > 0x80) + npc->xm = 0x80; + if (npc->xm < -0x80) + npc->xm = -0x80; + + if (npc->ym > 0x80) + npc->ym = 0x80; + if (npc->ym < -0x80) + npc->ym = -0x80; + + npc->x += npc->xm; + npc->y += npc->ym; + + ActBossChar_Core_Face(&gBoss[4]); + + ActBossChar_Core_Tail(&gBoss[5]); + + ActBossChar_Core_Mini(&gBoss[1]); + ActBossChar_Core_Mini(&gBoss[2]); + ActBossChar_Core_Mini(&gBoss[3]); + ActBossChar_Core_Mini(&gBoss[6]); + ActBossChar_Core_Mini(&gBoss[7]); + + ActBossChar_Core_Hit(&gBoss[8]); + ActBossChar_Core_Hit(&gBoss[9]); + ActBossChar_Core_Hit(&gBoss[10]); + ActBossChar_Core_Hit(&gBoss[11]); +} diff --git a/src/BossAlmo1.h b/src/BossAlmo1.h new file mode 100644 index 0000000..3cd3f2c --- /dev/null +++ b/src/BossAlmo1.h @@ -0,0 +1,10 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void ActBossChar_Core(void); diff --git a/src/BossAlmo2.cpp b/src/BossAlmo2.cpp new file mode 100644 index 0000000..13dba2a --- /dev/null +++ b/src/BossAlmo2.cpp @@ -0,0 +1,763 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BossAlmo2.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "Flash.h" +#include "Frame.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +static void ActBossCharA_Head(NPCHAR *npc) +{ + RECT rect[4] = { + {0, 0, 72, 112}, + {0, 112, 72, 224}, + {160, 0, 232, 112}, + {0, 0, 0, 0}, + }; + + switch (npc->act_no) + { + case 10: + npc->act_no = 11; + npc->ani_no = 2; + npc->bits = NPC_IGNORE_SOLIDITY; + npc->view.front = 36 * 0x200; + npc->view.top = 56 * 0x200; + // Fallthrough + case 11: + npc->x = gBoss[0].x - (36 * 0x200); + npc->y = gBoss[0].y; + break; + + case 50: + npc->act_no = 51; + npc->act_wait = 112; + // Fallthrough + case 51: + --npc->act_wait; + + if (npc->act_wait == 0) + { + npc->act_no = 100; + npc->ani_no = 3; + } + + break; + + case 100: + npc->ani_no = 3; + break; + } + + npc->rect = rect[npc->ani_no]; + + if (npc->act_no == 51) + npc->rect.bottom = npc->rect.top + npc->act_wait; +} + +static void ActBossCharA_Tail(NPCHAR *npc) +{ + RECT rect[3] = { + {72, 0, 160, 112}, + {72, 112, 160, 224}, + {0, 0, 0, 0}, + }; + + switch (npc->act_no) + { + case 10: + npc->act_no = 11; + npc->ani_no = 0; + npc->bits = NPC_IGNORE_SOLIDITY; + npc->view.front = 44 * 0x200; + npc->view.top = 56 * 0x200; + // Fallthrough + case 11: + npc->x = gBoss[0].x + (44 * 0x200); + npc->y = gBoss[0].y; + break; + + case 50: + npc->act_no = 51; + npc->act_wait = 112; + // Fallthrough + case 51: + --npc->act_wait; + + if (npc->act_wait == 0) + { + npc->act_no = 100; + npc->ani_no = 2; + } + + break; + + case 100: + npc->ani_no = 2; + break; + } + + npc->rect = rect[npc->ani_no]; + + if (npc->act_no == 51) + npc->rect.bottom = npc->rect.top + npc->act_wait; +} + +static void ActBossCharA_Face(NPCHAR *npc) +{ + RECT rect[5] = { + {0, 0, 0, 0}, + {160, 112, 232, 152}, + {160, 152, 232, 192}, + {160, 192, 232, 232}, + {248, 160, 320, 200}, + }; + + switch (npc->act_no) + { + case 0: + npc->ani_no = 0; + break; + + case 10: + npc->ani_no = 1; + break; + + case 20: + npc->ani_no = 2; + break; + + case 30: + npc->act_no = 31; + npc->ani_no = 3; + npc->act_wait = 100; + // Fallthrough + case 31: + ++npc->act_wait; + + if (npc->act_wait > 300) + npc->act_wait = 0; + + if (npc->act_wait > 250 && npc->act_wait % 0x10 == 1) + PlaySoundObject(26, SOUND_MODE_PLAY); + + if (npc->act_wait > 250 && npc->act_wait % 0x10 == 7) + { + SetNpChar(293, npc->x, npc->y, 0, 0, 0, NULL, 0x80); + PlaySoundObject(101, SOUND_MODE_PLAY); + } + + if (npc->act_wait == 200) + PlaySoundObject(116, SOUND_MODE_PLAY); + + if (npc->act_wait > 200 && npc->act_wait % 2 != 0) + npc->ani_no = 4; + else + npc->ani_no = 3; + + break; + } + + npc->view.back = 36 * 0x200; + npc->view.front = 36 * 0x200; + npc->view.top = 20 * 0x200; + + npc->x = gBoss[0].x - (36 * 0x200); + npc->y = gBoss[0].y + (4 * 0x200); + + npc->bits = NPC_IGNORE_SOLIDITY; + + npc->rect = rect[npc->ani_no]; +} + +static void ActBossCharA_Mini(NPCHAR *npc) +{ + RECT rect[3] = { + {256, 0, 320, 40}, + {256, 40, 320, 80}, + {256, 80, 320, 120}, + }; + + int deg; + + if (npc->cond == 0) + return; + + npc->life = 1000; + + switch (npc->act_no) + { + case 0: + npc->bits &= ~NPC_SHOOTABLE; + break; + + case 5: + npc->ani_no = 0; + npc->bits &= ~NPC_SHOOTABLE; + ++npc->count2; + npc->count2 %= 0x100; + break; + + case 10: + npc->ani_no = 0; + npc->bits &= ~NPC_SHOOTABLE; + npc->count2 += 2; + npc->count2 %= 0x100; + break; + + case 20: + npc->ani_no = 1; + npc->bits &= ~NPC_SHOOTABLE; + npc->count2 += 2; + npc->count2 %= 0x100; + break; + + case 30: + npc->ani_no = 0; + npc->bits &= ~NPC_SHOOTABLE; + npc->count2 += 4; + npc->count2 %= 0x100; + break; + + case 200: + npc->act_no = 201; + npc->ani_no = 2; + npc->xm = 0; + npc->ym = 0; + // Fallthrough + case 201: + npc->xm += 0x20; + + npc->x += npc->xm; + + if (npc->x > (gMap.width * 0x200 * 0x10) + (2 * 0x200 * 0x10)) + npc->cond = 0; + + break; + } + + if (npc->act_no < 50) + { + if (npc->count1 != 0) + deg = npc->count2 + 0x80; + else + deg = npc->count2 + 0x180; + + npc->x = npc->pNpc->x - (8 * 0x200) + (GetCos(deg / 2) * 0x30); + npc->y = npc->pNpc->y + (GetSin(deg / 2) * 0x50); + } + + npc->rect = rect[npc->ani_no]; +} + +static void ActBossCharA_Hit(NPCHAR *npc) +{ + switch (npc->count1) + { + case 0: + npc->x = gBoss[0].x; + npc->y = gBoss[0].y - (32 * 0x200); + break; + + case 1: + npc->x = gBoss[0].x + (28 * 0x200); + npc->y = gBoss[0].y; + break; + + case 2: + npc->x = gBoss[0].x + (4 * 0x200); + npc->y = gBoss[0].y + (32 * 0x200); + break; + + case 3: + npc->x = gBoss[0].x - (28 * 0x200); + npc->y = gBoss[0].y + (4 * 0x200); + break; + } +} + +void ActBossChar_Undead(void) +{ + NPCHAR *npc = gBoss; + + static unsigned char flash; + BOOL bShock = FALSE; + int x, y; + int i; + + static int life; + + switch (npc->act_no) + { + case 1: + npc->act_no = 10; + npc->exp = 1; + npc->cond = 0x80; + npc->bits = (NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY | NPC_SHOW_DAMAGE); + npc->life = 700; + npc->hit_voice = 114; + npc->x = 592 * 0x200; + npc->y = 120 * 0x200; + npc->xm = 0; + npc->ym = 0; + npc->code_event = 1000; + npc->bits |= NPC_EVENT_WHEN_KILLED; + + gBoss[3].cond = 0x80; + gBoss[3].act_no = 0; + + gBoss[4].cond = 0x80; + gBoss[4].act_no = 10; + + gBoss[5].cond = 0x80; + gBoss[5].act_no = 10; + + gBoss[8].cond = 0x80; + gBoss[8].bits = NPC_IGNORE_SOLIDITY; + gBoss[8].view.front = 0; + gBoss[8].view.top = 0; + gBoss[8].hit.back = 40 * 0x200; + gBoss[8].hit.top = 16 * 0x200; + gBoss[8].hit.bottom = 16 * 0x200; + gBoss[8].count1 = 0; + + gBoss[9] = gBoss[8]; + gBoss[9].hit.back = 36 * 0x200; + gBoss[9].hit.top = 24 * 0x200; + gBoss[9].hit.bottom = 24 * 0x200; + gBoss[9].count1 = 1; + + gBoss[10] = gBoss[8]; + gBoss[10].hit.back = 44 * 0x200; + gBoss[10].hit.top = 8 * 0x200; + gBoss[10].hit.bottom = 8 * 0x200; + gBoss[10].count1 = 2; + + gBoss[11] = gBoss[8]; + gBoss[11].cond |= 0x10; + gBoss[11].hit.back = 20 * 0x200; + gBoss[11].hit.top = 20 * 0x200; + gBoss[11].hit.bottom = 20 * 0x200; + gBoss[11].count1 = 3; + + gBoss[1].cond = 0x80; + gBoss[1].act_no = 0; + gBoss[1].bits = (NPC_IGNORE_SOLIDITY | NPC_SHOOTABLE); + gBoss[1].life = 1000; + gBoss[1].hit_voice = 54; + gBoss[1].hit.back = 24 * 0x200; + gBoss[1].hit.top = 16 * 0x200; + gBoss[1].hit.bottom = 16 * 0x200; + gBoss[1].view.front = 32 * 0x200; + gBoss[1].view.top = 20 * 0x200; + gBoss[1].pNpc = npc; + + gBoss[2] = gBoss[1]; + gBoss[2].count2 = 0x80; + + gBoss[6] = gBoss[1]; + gBoss[6].count1 = 1; + + gBoss[7] = gBoss[1]; + gBoss[7].count1 = 1; + gBoss[7].count2 = 0x80; + + life = npc->life; + + break; + + case 15: + npc->act_no = 16; + bShock = TRUE; + npc->direct = gMirrorMode? 2:0; + gBoss[3].act_no = 10; + gBoss[4].ani_no = 0; + break; + + case 20: + npc->act_no = 210; + bShock = TRUE; + npc->direct = gMirrorMode? 2:0; + gBoss[1].act_no = 5; + gBoss[2].act_no = 5; + gBoss[6].act_no = 5; + gBoss[7].act_no = 5; + break; + + case 200: + npc->act_no = 201; + npc->act_wait = 0; + gBoss[3].act_no = 0; + gBoss[4].ani_no = 2; + gBoss[5].ani_no = 0; + gBoss[8].bits &= ~NPC_INVULNERABLE; + gBoss[9].bits &= ~NPC_INVULNERABLE; + gBoss[10].bits &= ~NPC_INVULNERABLE; + gBoss[11].bits &= ~NPC_SHOOTABLE; + gSuperYpos = 0; + CutNoise(); + bShock = TRUE; + // Fallthrough + case 201: + ++npc->act_wait; + + if (npc->direct == 2 || npc->ani_no > 0 || npc->life < 200) + { + if (npc->act_wait > 200) + { + ++npc->count1; + PlaySoundObject(115, SOUND_MODE_PLAY); + + if (npc->life < 200) + { + npc->act_no = 230; + } + else + { + if (npc->count1 > 2) + npc->act_no = 220; + else + npc->act_no = 210; + } + } + } + + break; + + case 210: + npc->act_no = 211; + npc->act_wait = 0; + gBoss[3].act_no = 10; + gBoss[8].bits |= NPC_INVULNERABLE; + gBoss[9].bits |= NPC_INVULNERABLE; + gBoss[10].bits |= NPC_INVULNERABLE; + gBoss[11].bits |= NPC_SHOOTABLE; + life = npc->life; + bShock = TRUE; + // Fallthrough + case 211: + ++flash; + + if (npc->shock != 0 && flash / 2 % 2) + { + gBoss[4].ani_no = 1; + gBoss[5].ani_no = 1; + } + else + { + gBoss[4].ani_no = 0; + gBoss[5].ani_no = 0; + } + + ++npc->act_wait; + + if (npc->act_wait % 100 == 1) + { + gCurlyShoot_wait = Random(80, 100); + gCurlyShoot_x = gBoss[11].x; + gCurlyShoot_y = gBoss[11].y; + } + + if (npc->act_wait < 300) + { + if (npc->act_wait % 120 == 1) + SetNpChar(288, npc->x - (32 * 0x200), npc->y - (16 * 0x200), 0, 0, 1, NULL, 0x20); + + if (npc->act_wait % 120 == 61) + SetNpChar(288, npc->x - (32 * 0x200), npc->y + (16 * 0x200), 0, 0, 3, NULL, 0x20); + } + + if (npc->life < life - 50 || npc->act_wait > 400) + npc->act_no = 200; + + break; + + case 220: + npc->act_no = 221; + npc->act_wait = 0; + npc->count1 = 0; + gSuperYpos = 1; + gBoss[3].act_no = 20; + gBoss[8].bits |= NPC_INVULNERABLE; + gBoss[9].bits |= NPC_INVULNERABLE; + gBoss[10].bits |= NPC_INVULNERABLE; + gBoss[11].bits |= NPC_SHOOTABLE; + SetQuake(100); + life = npc->life; + bShock = TRUE; + // Fallthrough + case 221: + ++npc->act_wait; + + if (npc->act_wait % 40 == 1) + { + switch (Random(0, 3)) + { + case 0: + x = gBoss[1].x; + y = gBoss[1].y; + break; + case 1: + x = gBoss[2].x; + y = gBoss[2].y; + break; + case 2: + x = gBoss[6].x; + y = gBoss[6].y; + break; + case 3: + x = gBoss[7].x; + y = gBoss[7].y; + break; + } + + PlaySoundObject(25, SOUND_MODE_PLAY); + SetNpChar(285, x - (16 * 0x200), y, 0, 0, 0, NULL, 0x100); + SetNpChar(285, x - (16 * 0x200), y, 0, 0, 0x400, NULL, 0x100); + } + + ++flash; + + if (npc->shock != 0 && flash / 2 % 2) + { + gBoss[4].ani_no = 1; + gBoss[5].ani_no = 1; + } + else + { + gBoss[4].ani_no = 0; + gBoss[5].ani_no = 0; + } + + if (npc->life < life - 150 || npc->act_wait > 400 || npc->life < 200) + npc->act_no = 200; + + break; + + case 230: + npc->act_no = 231; + npc->act_wait = 0; + + gBoss[3].act_no = 30; + + gBoss[8].bits |= NPC_INVULNERABLE; + gBoss[9].bits |= NPC_INVULNERABLE; + gBoss[10].bits |= NPC_INVULNERABLE; + gBoss[11].bits |= NPC_SHOOTABLE; + + PlaySoundObject(25, SOUND_MODE_PLAY); + + SetNpChar(285, gBoss[3].x - (16 * 0x200), gBoss[3].y, 0, 0, 0, NULL, 0x100); + SetNpChar(285, gBoss[3].x - (16 * 0x200), gBoss[3].y, 0, 0, 0x400, NULL, 0x100); + SetNpChar(285, gBoss[3].x, gBoss[3].y - (16 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(285, gBoss[3].x, gBoss[3].y - (16 * 0x200), 0, 0, 0x400, NULL, 0x100); + SetNpChar(285, gBoss[3].x, gBoss[3].y + (16 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(285, gBoss[3].x, gBoss[3].y + (16 * 0x200), 0, 0, 0x400, NULL, 0x100); + + life = npc->life; + bShock = TRUE; + // Fallthrough + case 231: + ++flash; + + if (npc->shock != 0 && flash / 2 % 2) + { + gBoss[4].ani_no = 1; + gBoss[5].ani_no = 1; + } + else + { + gBoss[4].ani_no = 0; + gBoss[5].ani_no = 0; + } + + if (++npc->act_wait % 100 == 1) + { + gCurlyShoot_wait = Random(80, 100); + gCurlyShoot_x = gBoss[11].x; + gCurlyShoot_y = gBoss[11].y; + } + + if (npc->act_wait % 120 == 1) + SetNpChar(288, npc->x - (32 * 0x200), npc->y - (16 * 0x200), 0, 0, 1, NULL, 0x20); + + if (npc->act_wait % 120 == 61) + SetNpChar(288, npc->x - (32 * 0x200), npc->y + (16 * 0x200), 0, 0, 3, NULL, 0x20); + + break; + + case 500: + CutNoise(); + npc->act_no = 501; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + gBoss[3].act_no = 0; + gBoss[4].ani_no = 2; + gBoss[5].ani_no = 0; + gBoss[1].act_no = 5; + gBoss[2].act_no = 5; + gBoss[6].act_no = 5; + gBoss[7].act_no = 5; + SetQuake(20); + + for (i = 0; i < 100; ++i) + SetNpChar(4, npc->x + (Random(-128, 128) * 0x200), npc->y + (Random(-64, 64) * 0x200), Random(-128, 128) * 0x200, Random(-128, 128) * 0x200, 0, NULL, 0); + + DeleteNpCharCode(282, TRUE); + gBoss[11].bits &= ~NPC_SHOOTABLE; + + for (i = 0; i < 12; ++i) + gBoss[i].bits &= ~NPC_INVULNERABLE; + // Fallthrough + case 501: + ++npc->act_wait; + + if (npc->act_wait % 0x10 != 0) + SetNpChar(4, npc->x + (Random(-64, 64) * 0x200), npc->y + (Random(-32, 32) * 0x200), Random(-128, 128) * 0x200, Random(-128, 128) * 0x200, 0, NULL, 0x100); + + npc->x += 0x40; + npc->y += 0x80; + + if (npc->act_wait > 200) + { + npc->act_wait = 0; + npc->act_no = 1000; + } + + break; + + case 1000: + SetQuake(100); + + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait % 8 == 0) + PlaySoundObject(44, SOUND_MODE_PLAY); + + SetDestroyNpChar(gBoss[0].x + (Random(-72, 72) * 0x200), gBoss[0].y + (Random(-64, 64) * 0x200), 1, 1); + + if (gBoss[0].act_wait > 100) + { + gBoss[0].act_wait = 0; + gBoss[0].act_no = 1001; + SetFlash(gBoss[0].x, gBoss[0].y, FLASH_MODE_EXPLOSION); + PlaySoundObject(35, SOUND_MODE_PLAY); + } + + break; + + case 1001: + SetQuake(40); + + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait > 50) + { + for (i = 0; i < 20; ++i) + gBoss[i].cond = 0; + + DeleteNpCharCode(158, TRUE); + DeleteNpCharCode(301, TRUE); + } + + break; + } + + if (bShock) + { + SetQuake(20); + + if (npc->act_no == 201) + gBoss[1].act_no = gBoss[2].act_no = gBoss[6].act_no = gBoss[7].act_no = 10; + + if (npc->act_no == 221) + gBoss[1].act_no = gBoss[2].act_no = gBoss[6].act_no = gBoss[7].act_no = 20; + + if (npc->act_no == 231) + gBoss[1].act_no = gBoss[2].act_no = gBoss[6].act_no = gBoss[7].act_no = 30; + + PlaySoundObject(26, SOUND_MODE_PLAY); + + for (i = 0; i < 8; ++i) + SetNpChar(4, gBoss[4].x + (Random(-32, 16) * 0x200), gBoss[4].y, Random(-0x200, 0x200), Random(-0x100, 0x100), 0, NULL, 0x100); + } + + if (npc->act_no >= 200 && npc->act_no < 300) + { + if (npc->x < 192 * 0x200) + npc->direct = 2; + if (npc->x > (gMap.width - 4) * (0x200 * 0x10)) + npc->direct = 0; + + if (npc->direct == 0) + npc->xm -= 4; + else + npc->xm += 4; + } + + switch (npc->act_no) + { + case 201: + case 211: + case 221: + case 231: + ++npc->count2; + + if (npc->count2 == 150) + { + npc->count2 = 0; + SetNpChar(282, (gMap.width * 0x200 * 0x10) + 0x40, (Random(-1, 3) + 10) * (0x200 * 0x10), 0, 0, 0, NULL, 0x30); + } + else if (npc->count2 == 75) + { + SetNpChar(282, (gMap.width * 0x200 * 0x10) + 0x40, (Random(-3, 0) + 3) * (0x200 * 0x10), 0, 0, 0, NULL, 0x30); + } + + break; + } + + if (npc->xm > 0x80) + npc->xm = 0x80; + if (npc->xm < -0x80) + npc->xm = -0x80; + + if (npc->ym > 0x80) + npc->ym = 0x80; + if (npc->ym < -0x80) + npc->ym = -0x80; + + npc->x += npc->xm; + npc->y += npc->ym; + + ActBossCharA_Face(&gBoss[3]); + + ActBossCharA_Head(&gBoss[4]); + + ActBossCharA_Tail(&gBoss[5]); + + ActBossCharA_Mini(&gBoss[1]); + ActBossCharA_Mini(&gBoss[2]); + ActBossCharA_Mini(&gBoss[6]); + ActBossCharA_Mini(&gBoss[7]); + + ActBossCharA_Hit(&gBoss[8]); + ActBossCharA_Hit(&gBoss[9]); + ActBossCharA_Hit(&gBoss[10]); + ActBossCharA_Hit(&gBoss[11]); +} diff --git a/src/BossAlmo2.h b/src/BossAlmo2.h new file mode 100644 index 0000000..578c51e --- /dev/null +++ b/src/BossAlmo2.h @@ -0,0 +1,10 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void ActBossChar_Undead(void); diff --git a/src/BossBallos.cpp b/src/BossBallos.cpp new file mode 100644 index 0000000..1d700e7 --- /dev/null +++ b/src/BossBallos.cpp @@ -0,0 +1,800 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BossBallos.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "Flash.h" +#include "Frame.h" +#include "Game.h" +#include "MyChar.h" +#include "MycHit.h" +#include "MycParam.h" +#include "NpChar.h" +#include "Sound.h" + +static void ActBossChar_Eye(NPCHAR *npc) +{ + RECT rcLeft[5] = { + {272, 0, 296, 16}, + {272, 16, 296, 32}, + {272, 32, 296, 48}, + {0, 0, 0, 0}, + {240, 16, 264, 32}, + }; + + RECT rcRight[5] = { + {296, 0, 320, 16}, + {296, 16, 320, 32}, + {296, 32, 320, 48}, + {0, 0, 0, 0}, + {240, 32, 264, 48}, + }; + + switch (npc->act_no) + { + case 100: + npc->act_no = 101; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 101: + ++npc->ani_wait; + + if (npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->act_no = 102; + + break; + + case 102: + npc->ani_no = 3; + break; + + case 200: + npc->act_no = 201; + npc->ani_no = 3; + npc->ani_wait = 0; + // Fallthrough + case 201: + ++npc->ani_wait; + + if (npc->ani_wait > 2) + { + npc->ani_wait = 0; + --npc->ani_no; + } + + if (npc->ani_no <= 0) + npc->act_no = 202; + + break; + + case 300: + npc->act_no = 301; + npc->ani_no = 4; + + if (npc->direct == 0) + SetDestroyNpChar(npc->x - (4 * 0x200), npc->y, 0x800, 10); + else + SetDestroyNpChar(npc->x + (4 * 0x200), npc->y, 0x800, 10); + + break; + } + + if (npc->direct == 0) + npc->x = gBoss[0].x - (24 * 0x200); + else + npc->x = gBoss[0].x + (24 * 0x200); + + npc->y = gBoss[0].y - (36 * 0x200); + + if (npc->act_no >= 0 && npc->act_no < 300) + { + if (npc->ani_no != 3) + npc->bits &= ~NPC_SHOOTABLE; + else + npc->bits |= NPC_SHOOTABLE; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +static void ActBossChar_Body(NPCHAR *npc) +{ + RECT rc[4] = { + {0, 0, 120, 120}, + {120, 0, 240, 120}, + {0, 120, 120, 240}, + {120, 120, 240, 240}, + }; + + npc->x = gBoss[0].x; + npc->y = gBoss[0].y; + + npc->rect = rc[npc->ani_no]; +} + +static void ActBossChar_HITAI(NPCHAR *npc) // "Hitai" = "forehead" or "brow" (according to Google Translate, anyway) +{ + npc->x = gBoss[0].x; + npc->y = gBoss[0].y - (44 * 0x200); +} + +static void ActBossChar_HARA(NPCHAR *npc) // "Hara" = "belly" or "stomach" (according to Google Translate, anyway) +{ + npc->x = gBoss[0].x; + npc->y = gBoss[0].y; +} + +void ActBossChar_Ballos(void) +{ + NPCHAR *npc = gBoss; + + static unsigned char flash; + int i; + int x, y; + + switch (npc->act_no) + { + case 0: + // Initialize main boss + npc->act_no = 1; + npc->cond = 0x80; + npc->exp = 1; + npc->direct = gMirrorMode? 2:0; + npc->x = 320 * 0x200; + npc->y = -64 * 0x200; + npc->hit_voice = 54; + npc->hit.front = 32 * 0x200; + npc->hit.top = 48 * 0x200; + npc->hit.back = 32 * 0x200; + npc->hit.bottom = 48 * 0x200; + npc->bits = (NPC_IGNORE_SOLIDITY | NPC_SOLID_HARD | NPC_EVENT_WHEN_KILLED | NPC_SHOW_DAMAGE); + npc->size = 3; + npc->damage = 0; + npc->code_event = 1000; + npc->life = 800; + + // Initialize eyes + gBoss[1].cond = 0x90; + gBoss[1].direct = 0; + gBoss[1].bits = NPC_IGNORE_SOLIDITY; + gBoss[1].life = 10000; + gBoss[1].view.front = 12 * 0x200; + gBoss[1].view.top = 0; + gBoss[1].view.back = 12 * 0x200; + gBoss[1].view.bottom = 16 * 0x200; + gBoss[1].hit.front = 12 * 0x200; + gBoss[1].hit.top = 0; + gBoss[1].hit.back = 12 * 0x200; + gBoss[1].hit.bottom = 16 * 0x200; + + gBoss[2] = gBoss[1]; + gBoss[2].direct = 2; + + // Initialize the body + gBoss[3].cond = 0x90; + gBoss[3].bits = (NPC_SOLID_SOFT | NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY); + gBoss[3].view.front = 60 * 0x200; + gBoss[3].view.top = 60 * 0x200; + gBoss[3].view.back = 60 * 0x200; + gBoss[3].view.bottom = 60 * 0x200; + gBoss[3].hit.front = 48 * 0x200; + gBoss[3].hit.top = 24 * 0x200; + gBoss[3].hit.back = 48 * 0x200; + gBoss[3].hit.bottom = 32 * 0x200; + + gBoss[4].cond = 0x90; + gBoss[4].bits = (NPC_SOLID_SOFT | NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY); + gBoss[4].hit.front = 32 * 0x200; + gBoss[4].hit.top = 8 * 0x200; + gBoss[4].hit.back = 32 * 0x200; + gBoss[4].hit.bottom = 8 * 0x200; + + gBoss[5].cond = 0x90; + gBoss[5].bits = (NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY | NPC_SOLID_HARD); + gBoss[5].hit.front = 32 * 0x200; + gBoss[5].hit.top = 0; + gBoss[5].hit.back = 32 * 0x200; + gBoss[5].hit.bottom = 48 * 0x200; + break; + + case 100: + npc->act_no = 101; + npc->ani_no = 0; + npc->x = gMC.x; + SetNpChar(333, gMC.x, 304 * 0x200, 0, 0, 2, NULL, 0x100); + npc->act_wait = 0; + // Fallthrough + case 101: + ++npc->act_wait; + + if (npc->act_wait > 30) + npc->act_no = 102; + + break; + + case 102: + npc->ym += 0x40; + if (npc->ym > 0xC00) + npc->ym = 0xC00; + + npc->y += npc->ym; + + if (npc->y > (304 * 0x200) - npc->hit.bottom) + { + npc->y = (304 * 0x200) - npc->hit.bottom; + npc->ym = 0; + npc->act_no = 103; + npc->act_wait = 0; + SetQuake2(30); + PlaySoundObject(44, SOUND_MODE_PLAY); + + if (gMC.y > npc->y + (48 * 0x200) && gMC.x < npc->x + (24 * 0x200) && gMC.x > npc->x - (24 * 0x200)){ + int damage = 16; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + damage = 127; + } + else{ + damage = damage * gbDamageModifier; + } + + DamageMyChar(damage); + } + + + for (i = 0; i < 0x10; ++i) + { + x = npc->x + (Random(-40, 40) * 0x200); + SetNpChar(4, x, npc->y + (40 * 0x200), 0, 0, 0, NULL, 0x100); + } + + if (gMC.flag & 8) + gMC.ym = -0x200; + } + + break; + + case 103: + ++npc->act_wait; + + if (npc->act_wait == 50) + { + npc->act_no = 104; + gBoss[1].act_no = 100; + gBoss[2].act_no = 100; + } + + break; + + case 200: + npc->act_no = 201; + npc->count1 = 0; + // Fallthrough + case 201: + npc->act_no = 203; + npc->xm = 0; + ++npc->count1; + npc->hit.bottom = 48 * 0x200; + npc->damage = 0; + + if (npc->count1 % 3 == 0) + npc->act_wait = 150; + else + npc->act_wait = 50; + // Fallthrough + case 203: + --npc->act_wait; + + if (npc->act_wait <= 0) + { + npc->act_no = 204; + npc->ym = -0xC00; + + if (npc->x < gMC.x) + npc->xm = 0x200; + else + npc->xm = -0x200; + } + + break; + + case 204: + if (npc->x < 80 * 0x200) + npc->xm = 0x200; + if (npc->x > 544 * 0x200) + npc->xm = -0x200; + + npc->ym += 0x55; + if (npc->ym > 0xC00) + npc->ym = 0xC00; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->y > (304 * 0x200) - npc->hit.bottom) + { + npc->y = (304 * 0x200) - npc->hit.bottom; + npc->ym = 0; + npc->act_no = 201; + npc->act_wait = 0; + + if (gMC.y > npc->y + (56 * 0x200)){ + int damage = 16; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + damage = 127; + } + else{ + damage = damage * gbDamageModifier; + } + + DamageMyChar(damage); + } + + if (gMC.flag & 8) + gMC.ym = -0x200; + + SetQuake2(30); + PlaySoundObject(26, SOUND_MODE_PLAY); + SetNpChar(332, npc->x - (12 * 0x200), npc->y + (52 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(332, npc->x + (12 * 0x200), npc->y + (52 * 0x200), 0, 0, 2, NULL, 0x100); + PlaySoundObject(44, SOUND_MODE_PLAY); + + for (i = 0; i < 0x10; ++i) + { + x = npc->x + (Random(-40, 40) * 0x200); + SetNpChar(4, x, npc->y + (40 * 0x200), 0, 0, 0, NULL, 0x100); + } + } + + break; + + case 220: + npc->act_no = 221; + npc->life = 1200; + gBoss[1].act_no = 200; + gBoss[2].act_no = 200; + npc->xm = 0; + npc->ani_no = 0; + npc->shock = 0; + flash = 0; + // Fallthrough + case 221: + npc->ym += 0x40; + if (npc->ym > 0xC00) + npc->ym = 0xC00; + + npc->y += npc->ym; + + if (npc->y > (304 * 0x200) - npc->hit.bottom) + { + npc->y = (304 * 0x200) - npc->hit.bottom; + npc->ym = 0; + npc->act_no = 222; + npc->act_wait = 0; + SetQuake2(30); + PlaySoundObject(26, SOUND_MODE_PLAY); + + for (i = 0; i < 0x10; ++i) + { + x = npc->x + (Random(-40, 40) * 0x200); + SetNpChar(4, x, npc->y + (40 * 0x200), 0, 0, 0, NULL, 0x100); + } + + if (gMC.flag & 8) + gMC.ym = -0x200; + } + + break; + + case 300: + npc->act_no = 301; + npc->act_wait = 0; + + for (i = 0; i < 0x100; i += 0x40) + { + SetNpChar(342, npc->x, npc->y, 0, 0, i, npc, 90); + SetNpChar(342, npc->x, npc->y, 0, 0, i + 0x220, npc, 90); + } + + SetNpChar(343, npc->x, npc->y, 0, 0, 0, npc, 0x18); + SetNpChar(344, npc->x - (24 * 0x200), npc->y - (36 * 0x200), 0, 0, 0, npc, 0x20); + SetNpChar(344, npc->x + (24 * 0x200), npc->y - (36 * 0x200), 0, 0, 2, npc, 0x20); + // Fallthrough + case 301: + npc->y += ((225 * 0x200) - npc->y) / 8; + + ++npc->act_wait; + + if (npc->act_wait > 50) + { + npc->act_no = 310; + npc->act_wait = 0; + } + + break; + + case 311: + npc->direct = gMirrorMode? 2:0; + npc->xm = -0x3AA; + npc->ym = 0; + npc->x += npc->xm; + + if (npc->x < 111 * 0x200) + { + npc->x = 111 * 0x200; + npc->act_no = 312; + } + + break; + + case 312: + npc->direct = 1; + npc->ym = -0x3AA; + npc->xm = 0; + npc->y += npc->ym; + + if (npc->y < 111 * 0x200) + { + npc->y = 111 * 0x200; + npc->act_no = 313; + } + + break; + + case 313: + npc->direct = gMirrorMode? 0:2; + npc->xm = 0x3AA; + npc->ym = 0; + npc->x += npc->xm; + + if (npc->x > 513 * 0x200) + { + npc->x = 513 * 0x200; + npc->act_no = 314; + } + + if (npc->count1 != 0) + --npc->count1; + + if (npc->count1 == 0 && npc->x > 304 * 0x200 && npc->x < 336 * 0x200) + npc->act_no = 400; + + break; + + case 314: + npc->direct = 3; + npc->ym = 0x3AA; + npc->xm = 0; + npc->y += npc->ym; + + if (npc->y > 225 * 0x200) + { + npc->y = 225 * 0x200; + npc->act_no = 311; + } + + break; + + case 400: + npc->act_no = 401; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + DeleteNpCharCode(339, FALSE); + // Fallthrough + case 401: + npc->y += ((159 * 0x200) - npc->y) / 8; + + ++npc->act_wait; + + if (npc->act_wait > 50) + { + npc->act_wait = 0; + npc->act_no = 410; + + for (i = 0; i < 0x100; i += 0x20) + SetNpChar(346, npc->x, npc->y, 0, 0, i, npc, 0x50); + + SetNpChar(343, npc->x, npc->y, 0, 0, 0, npc, 0x18); + SetNpChar(344, npc->x - (24 * 0x200), npc->y - (36 * 0x200), 0, 0, 0, npc, 0x20); + SetNpChar(344, npc->x + (24 * 0x200), npc->y - (36 * 0x200), 0, 0, 2, npc, 0x20); + } + + break; + + case 410: + ++npc->act_wait; + + if (npc->act_wait > 50) + { + npc->act_wait = 0; + npc->act_no = 411; + } + + break; + + case 411: + ++npc->act_wait; + + if (npc->act_wait % 30 == 1) + { + x = (((npc->act_wait / 30) * 2) + 2) * 0x10 * 0x200; + SetNpChar(348, x, 336 * 0x200, 0, 0, 0, NULL, 0x180); + } + + if (npc->act_wait / 3 % 2) + PlaySoundObject(26, SOUND_MODE_PLAY); + + if (npc->act_wait > 540) + npc->act_no = 420; + + break; + + case 420: + npc->act_no = 421; + npc->act_wait = 0; + npc->ani_wait = 0; + SetQuake2(30); + PlaySoundObject(35, SOUND_MODE_PLAY); + gBoss[1].act_no = 102; + gBoss[2].act_no = 102; + + for (i = 0; i < 0x100; ++i) + { + x = npc->x + (Random(-60, 60) * 0x200); + y = npc->y + (Random(-60, 60) * 0x200); + SetNpChar(4, x, y, 0, 0, 0, NULL, 0); + } + // Fallthrough + case 421: + ++npc->ani_wait; + + if (npc->ani_wait > 500) + { + npc->ani_wait = 0; + npc->act_no = 422; + } + + break; + + case 422: + ++npc->ani_wait; + + if (npc->ani_wait > 200) + { + npc->ani_wait = 0; + npc->act_no = 423; + } + + break; + + case 423: + ++npc->ani_wait; + + if (npc->ani_wait > 20) + { + npc->ani_wait = 0; + npc->act_no = 424; + } + + break; + + case 424: + ++npc->ani_wait; + + if (npc->ani_wait > 200) + { + npc->ani_wait = 0; + npc->act_no = 425; + } + + break; + + case 425: + ++npc->ani_wait; + + if (npc->ani_wait > 500) + { + npc->ani_wait = 0; + npc->act_no = 426; + } + + break; + + case 426: + ++npc->ani_wait; + + if (npc->ani_wait > 200) + { + npc->ani_wait = 0; + npc->act_no = 427; + } + + break; + + case 427: + ++npc->ani_wait; + + if (npc->ani_wait > 20) + { + npc->ani_wait = 0; + npc->act_no = 428; + } + + break; + + case 428: + ++npc->ani_wait; + + if (npc->ani_wait > 200) + { + npc->ani_wait = 0; + npc->act_no = 421; + } + + break; + + case 1000: + npc->act_no = 1001; + npc->act_wait = 0; + + gBoss[1].act_no = 300; + gBoss[2].act_no = 300; + +#ifndef FIX_BUGS + // This code makes absolutely no sense. + // Luckily, it doesn't cause any bugs. + gBoss[1].act_no &= ~(NPC_SOLID_SOFT | NPC_SOLID_HARD); + gBoss[2].act_no &= ~(NPC_SOLID_SOFT | NPC_SOLID_HARD); +#endif + + gBoss[0].bits &= ~(NPC_SOLID_SOFT | NPC_SOLID_HARD); + gBoss[3].bits &= ~(NPC_SOLID_SOFT | NPC_SOLID_HARD); + gBoss[4].bits &= ~(NPC_SOLID_SOFT | NPC_SOLID_HARD); + gBoss[5].bits &= ~(NPC_SOLID_SOFT | NPC_SOLID_HARD); + // Fallthrough + case 1001: + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait % 12 == 0) + PlaySoundObject(44, SOUND_MODE_PLAY); + + SetDestroyNpChar(gBoss[0].x + (Random(-60, 60) * 0x200), gBoss[0].y + (Random(-60, 60) * 0x200), 1, 1); + + if (gBoss[0].act_wait > 150) + { + gBoss[0].act_wait = 0; + gBoss[0].act_no = 1002; + SetFlash(gBoss[0].x, gBoss[0].y, FLASH_MODE_EXPLOSION); + PlaySoundObject(35, SOUND_MODE_PLAY); + } + + break; + + case 1002: + SetQuake2(40); + + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait == 50) + { + gBoss[0].cond = 0; + gBoss[1].cond = 0; + gBoss[2].cond = 0; + gBoss[3].cond = 0; + gBoss[4].cond = 0; + gBoss[5].cond = 0; + + DeleteNpCharCode(350, TRUE); + DeleteNpCharCode(348, TRUE); + } + + break; + } + + if (npc->act_no > 420 && npc->act_no < 500) + { + gBoss[3].bits |= NPC_SHOOTABLE; + gBoss[4].bits |= NPC_SHOOTABLE; + gBoss[5].bits |= NPC_SHOOTABLE; + + ++npc->act_wait; + + if (npc->act_wait > 300) + { + npc->act_wait = 0; + + if (gMC.x > npc->x) + { + for (i = 0; i < 8; ++i) + { + x = ((156 + Random(-4, 4)) * 0x200 * 0x10) / 4; + y = (Random(8, 68) * 0x200 * 0x10) / 4; + SetNpChar(350, x, y, 0, 0, 0, NULL, 0x100); + } + } + else + { + for (i = 0; i < 8; ++i) + { + x = (Random(-4, 4) * 0x200 * 0x10) / 4; + y = (Random(8, 68) * 0x200 * 0x10) / 4; + SetNpChar(350, x, y, 0, 0, 2, NULL, 0x100); + } + } + } + + if (npc->act_wait == 270 || npc->act_wait == 280 || npc->act_wait == 290) + { + SetNpChar(353, npc->x, npc->y - (52 * 0x200), 0, 0, 1, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x, npc->y - (52 * 0x200), 0, 0, 0, NULL, 0x100); + } + + if (npc->life > 500) + { + if (Random(0, 10) == 2) + { + x = npc->x + (Random(-40, 40) * 0x200); + y = npc->y + (Random(0, 40) * 0x200); + SetNpChar(270, x, y, 0, 0, 3, NULL, 0); + } + } + else + { + if (Random(0, 4) == 2) + { + x = npc->x + (Random(-40, 40) * 0x200); + y = npc->y + (Random(0, 40) * 0x200); + SetNpChar(270, x, y, 0, 0, 3, NULL, 0); + } + } + } + + if (npc->shock != 0) + { + if (++flash / 2 % 2) + gBoss[3].ani_no = 1; + else + gBoss[3].ani_no = 0; + } + else + { + gBoss[3].ani_no = 0; + } + + if (npc->act_no > 420) + gBoss[3].ani_no += 2; + + ActBossChar_Eye(&gBoss[1]); + ActBossChar_Eye(&gBoss[2]); + ActBossChar_Body(&gBoss[3]); + ActBossChar_HITAI(&gBoss[4]); + ActBossChar_HARA(&gBoss[5]); +} diff --git a/src/BossBallos.h b/src/BossBallos.h new file mode 100644 index 0000000..0b76ee0 --- /dev/null +++ b/src/BossBallos.h @@ -0,0 +1,10 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void ActBossChar_Ballos(void); diff --git a/src/BossFrog.cpp b/src/BossFrog.cpp new file mode 100644 index 0000000..482b324 --- /dev/null +++ b/src/BossFrog.cpp @@ -0,0 +1,625 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BossFrog.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +enum BalfrogSprites +{ + BALFROG_SPRITE_NOTHING = 0, + BALFROG_SPRITE_STANDING_STILL = 1, + BALFROG_SPRITE_MOUTH_BARELY_OPEN_CROUCHING = 2, + BALFROG_SPRITE_MOUTH_OPEN_CROUCHING = 3, + BALFROG_SPRITE_MOUTH_OPEN_CROUCHING_FLASHING = 4, + BALFROG_SPRITE_JUMPING = 5, + BALFROG_SPRITE_BALROG_WHITE = 6, + BALFROG_SPRITE_BALROG_CROUCHING = 7, + BALFROG_SPRITE_BALROG_JUMPING = 8 +}; + +enum BalfrogStates +{ + BALFROG_INITIALIZE = 0, + BALFROG_START = 10, + BALFROG_INITIALIZE_FLICKER = 20, + BALFROG_FLICKER = 21, + BALFROG_WAIT = 100, + BALFROG_INITIALIZE_HOP_1 = 101, + BALFROG_INITIALIZE_HOP_2 = 102, + BALFROG_HOP = 103, + BALFROG_MIDAIR = 104, + BALFROG_INITIALIZE_LAND = 110, + BALFROG_LAND = 111, + BALFROG_INITIALIZE_SHOOT = 112, + BALFROG_SHOOT = 113, + BALFROG_AFTER_SHOOT_WAIT = 114, + BALFROG_INITIALIZE_LEAP_1 = 120, + BALFROG_INITIALIZE_LEAP_2 = 121, + BALFROG_INITIALIZE_LEAP_3 = 122, + BALFROG_LEAP = 123, + BALFROG_LEAP_MIDAIR = 124, + BALFROG_DIE = 130, + BALFROG_DIE_FLASHING = 131, + BALFROG_REVERT = 132, + BALFROG_NOP_START = 140, + BALFROG_NOP = 141, + BALFROG_GO_INTO_CEILING = 142, + BALFROG_GONE_INTO_CEILING = 143 +}; + +// Balfrog's mouth +static void ActBossChar02_01(void) +{ + NPCHAR *boss; + int minus; + + if (gBoss[0].direct == DIR_LEFT) + minus = 1; + else + minus = -1; + + boss = &gBoss[1]; + + switch (gBoss[0].ani_no) + { + case BALFROG_SPRITE_NOTHING: + boss->hit_voice = SND_BEHEMOTH_LARGE_HURT; + boss->hit.front = 16 * 0x200; + boss->hit.top = 16 * 0x200; + boss->hit.back = 16 * 0x200; + boss->hit.bottom = 16 * 0x200; + boss->size = 3; + boss->bits = NPC_INVULNERABLE; + break; + + case BALFROG_SPRITE_STANDING_STILL: + boss->x = gBoss[0].x + -24 * 0x200 * minus; + boss->y = gBoss[0].y - 24 * 0x200; + break; + + case BALFROG_SPRITE_MOUTH_BARELY_OPEN_CROUCHING: + boss->x = gBoss[0].x + -24 * 0x200 * minus; + boss->y = gBoss[0].y - 20 * 0x200; + break; + + case BALFROG_SPRITE_MOUTH_OPEN_CROUCHING: + case BALFROG_SPRITE_MOUTH_OPEN_CROUCHING_FLASHING: + boss->x = gBoss[0].x + -24 * 0x200 * minus; + boss->y = gBoss[0].y - 16 * 0x200; + break; + + case BALFROG_SPRITE_JUMPING: + boss->x = gBoss[0].x + -24 * 0x200 * minus; + boss->y = gBoss[0].y - 43 * 0x200; + break; + } +} + +static void ActBossChar02_02(void) +{ + NPCHAR *boss = &gBoss[2]; + + switch (gBoss[0].ani_no) + { + case BALFROG_SPRITE_NOTHING: + boss->hit_voice = SND_BEHEMOTH_LARGE_HURT; + boss->hit.front = 24 * 0x200; + boss->hit.top = 16 * 0x200; + boss->hit.back = 24 * 0x200; + boss->hit.bottom = 16 * 0x200; + boss->size = 3; + boss->bits = NPC_INVULNERABLE; + break; + + case BALFROG_SPRITE_STANDING_STILL: + case BALFROG_SPRITE_MOUTH_BARELY_OPEN_CROUCHING: + case BALFROG_SPRITE_MOUTH_OPEN_CROUCHING: + case BALFROG_SPRITE_MOUTH_OPEN_CROUCHING_FLASHING: + case BALFROG_SPRITE_JUMPING: + boss->x = gBoss[0].x; + boss->y = gBoss[0].y; + break; + } +} + +// Main boss AI +void ActBossChar_Frog(void) +{ + unsigned char deg; + int xm, ym; + int i; + + // Rects 1-4 are for when Balfrog is a frog, 5-8 for when he reverts into Balrog and goes into the ceiling + RECT rcLeft[9] = { + {0, 0, 0, 0}, // Nothing + {0, 48, 80, 112}, // Balfrog standing still + {0, 112, 80, 176}, // Balfrog with his mouth barely open, crouching + {0, 176, 80, 240}, // Balfrog with his mouth open, crouching + {160, 48, 240, 112}, // Balfrog with his mouth open, crouching, flashing + {160, 112, 240, 200}, // Balfrog jumping + {200, 0, 240, 24}, // Balrog completely white + {80, 0, 120, 24}, // Balrog crouching + {120, 0, 160, 24}, // Balrog jumping + }; + + // See above + RECT rcRight[9] = { + {0, 0, 0, 0}, + {80, 48, 160, 112}, + {80, 112, 160, 176}, + {80, 176, 160, 240}, + {240, 48, 320, 112}, + {240, 112, 320, 200}, + {200, 24, 240, 48}, + {80, 24, 120, 48}, + {120, 24, 160, 48}, + }; + + NPCHAR *boss = gBoss; + + switch (boss->act_no) + { + case BALFROG_INITIALIZE: + boss->x = 6 * (0x200 * 0x10); + boss->y = 12 * (0x200 * 0x10) + 8 * 0x200; + boss->direct = DIR_RIGHT; + boss->view.front = 48 * 0x200; + boss->view.top = 48 * 0x200; + boss->view.back = 32 * 0x200; + boss->view.bottom = 16 * 0x200; + boss->hit_voice = SND_BEHEMOTH_LARGE_HURT; + boss->hit.front = 24 * 0x200; + boss->hit.top = 16 * 0x200; + boss->hit.back = 24 * 0x200; + boss->hit.bottom = 16 * 0x200; + boss->size = 3; + boss->exp = 1; + boss->code_event = 1000; + boss->bits |= (NPC_EVENT_WHEN_KILLED | NPC_SHOW_DAMAGE); + boss->life = 300; + break; + + case BALFROG_START: + boss->act_no = (BALFROG_START + 1); + boss->ani_no = BALFROG_SPRITE_MOUTH_OPEN_CROUCHING; + boss->cond = NPCCOND_ALIVE; + boss->rect = rcRight[0]; + + gBoss[1].cond = (NPCCOND_ALIVE | NPCCOND_DAMAGE_BOSS); + gBoss[1].code_event = 1000; + gBoss[2].cond = NPCCOND_ALIVE; + + gBoss[1].damage = 5; + gBoss[2].damage = 5; + + for (i = 0; i < 8; ++i) + SetNpChar(NPC_SMOKE, boss->x + Random(-12, 12) * 0x200, boss->y + Random(-12, 12) * 0x200, Random(-341, 341), Random(-3 * 0x200, 0), DIR_LEFT, NULL, 0x100); + + break; + + case BALFROG_INITIALIZE_FLICKER: + boss->act_no = BALFROG_FLICKER; + boss->act_wait = 0; + // Fallthrough + case BALFROG_FLICKER: + ++boss->act_wait; + + if (boss->act_wait / 2 % 2) + boss->ani_no = BALFROG_SPRITE_MOUTH_OPEN_CROUCHING; + else + boss->ani_no = BALFROG_SPRITE_NOTHING; + + break; + + case BALFROG_WAIT: + boss->act_no = BALFROG_INITIALIZE_HOP_1; + boss->act_wait = 0; + boss->ani_no = BALFROG_SPRITE_STANDING_STILL; + boss->xm = 0; + // Fallthrough + case BALFROG_INITIALIZE_HOP_1: + ++boss->act_wait; + + if (boss->act_wait > 50) + { + boss->act_no = BALFROG_INITIALIZE_HOP_2; + boss->ani_wait = 0; + boss->ani_no = BALFROG_SPRITE_MOUTH_BARELY_OPEN_CROUCHING; + } + + break; + + case BALFROG_INITIALIZE_HOP_2: + ++boss->ani_wait; + + if (boss->ani_wait > 10) + { + boss->act_no = BALFROG_HOP; + boss->ani_wait = 0; + boss->ani_no = BALFROG_SPRITE_STANDING_STILL; + } + + break; + + case BALFROG_HOP: + ++boss->ani_wait; + + if (boss->ani_wait > 4) + { + boss->act_no = BALFROG_MIDAIR; + boss->ani_no = BALFROG_SPRITE_JUMPING; + boss->ym = -2 * 0x200; + PlaySoundObject(25, SOUND_MODE_PLAY); + + if (boss->direct == DIR_LEFT) + boss->xm = -1 * 0x200; + else + boss->xm = 1 * 0x200; + + boss->view.top = 64 * 0x200; + boss->view.bottom = 24 * 0x200; + } + + break; + + case BALFROG_MIDAIR: + if (boss->direct == DIR_LEFT && boss->flag & COLL_LEFT_WALL) + { + boss->direct = DIR_RIGHT; + boss->xm = 1 * 0x200; + } + + if (boss->direct == DIR_RIGHT && boss->flag & COLL_RIGHT_WALL) + { + boss->direct = DIR_LEFT; + boss->xm = -1 * 0x200; + } + + if (boss->flag & COLL_GROUND) + { + PlaySoundObject(SND_LARGE_OBJECT_HIT_GROUND, SOUND_MODE_PLAY); + SetQuake(30); + boss->act_no = BALFROG_WAIT; + boss->ani_no = BALFROG_SPRITE_STANDING_STILL; + boss->view.top = 48 * 0x200; + boss->view.bottom = 16 * 0x200; + + if (boss->direct == DIR_LEFT && boss->x < gMC.x) + { + boss->direct = DIR_RIGHT; + boss->act_no = BALFROG_INITIALIZE_LAND; + } + + if (boss->direct == DIR_RIGHT && boss->x > gMC.x) + { + boss->direct = DIR_LEFT; + boss->act_no = BALFROG_INITIALIZE_LAND; + } + + SetNpChar(110, Random(4, 16) * (0x200 * 0x10), Random(0, 4) * (0x200 * 0x10), 0, 0, DIR_AUTO, NULL, 0x80); + + for (i = 0; i < 4; ++i) + SetNpChar(NPC_SMOKE, boss->x + Random(-12, 12) * 0x200, boss->y + boss->hit.bottom, Random(-341, 341), Random(-3 * 0x200, 0), DIR_LEFT, NULL, 0x100); + } + + break; + + case BALFROG_INITIALIZE_LAND: + boss->ani_no = BALFROG_SPRITE_STANDING_STILL; + boss->act_wait = 0; + boss->act_no = BALFROG_LAND; + // Fallthrough + case BALFROG_LAND: + ++boss->act_wait; + + boss->xm = (boss->xm * 8) / 9; + + if (boss->act_wait > 50) + { + boss->ani_no = BALFROG_SPRITE_MOUTH_BARELY_OPEN_CROUCHING; + boss->ani_wait = 0; + boss->act_no = BALFROG_INITIALIZE_SHOOT; + } + + break; + + case BALFROG_INITIALIZE_SHOOT: + ++boss->ani_wait; + + if (boss->ani_wait > 4) + { + boss->act_no = BALFROG_SHOOT; + boss->act_wait = 0; + boss->ani_no = BALFROG_SPRITE_MOUTH_OPEN_CROUCHING; + boss->count1 = 16; + gBoss[1].bits |= NPC_SHOOTABLE; + boss->tgt_x = boss->life; + } + + break; + + case BALFROG_SHOOT: + if (boss->shock != 0) + { + if (boss->count2++ / 2 % 2) + boss->ani_no = BALFROG_SPRITE_MOUTH_OPEN_CROUCHING_FLASHING; + else + boss->ani_no = BALFROG_SPRITE_MOUTH_OPEN_CROUCHING; + } + else + { + boss->count2 = 0; + boss->ani_no = BALFROG_SPRITE_MOUTH_OPEN_CROUCHING; + } + + boss->xm = (boss->xm * 10) / 11; + + ++boss->act_wait; + + if (boss->act_wait > 16) + { + boss->act_wait = 0; + --boss->count1; + + if (boss->direct == DIR_LEFT) + deg = GetArktan(boss->x - 2 * (0x200 * 0x10) - gMC.x, boss->y - 8 * 0x200 - gMC.y); + else + deg = GetArktan(boss->x + 2 * (0x200 * 0x10) - gMC.x, boss->y - 8 * 0x200 - gMC.y); + + deg += (unsigned char)Random(-0x10, 0x10); + + ym = GetSin(deg); + xm = GetCos(deg); + + if (boss->direct == DIR_LEFT) + SetNpChar(NPC_PROJECTILE_BALFROG_SPITBALL, boss->x - 2 * (0x200 * 0x10), boss->y - 8 * 0x200, xm, ym, DIR_LEFT, NULL, 0x100); + else + SetNpChar(NPC_PROJECTILE_BALFROG_SPITBALL, boss->x + 2 * (0x200 * 0x10), boss->y - 8 * 0x200, xm, ym, DIR_LEFT, NULL, 0x100); + + PlaySoundObject(SND_ENEMY_SHOOT_PROJECTILE, SOUND_MODE_PLAY); + + if (boss->count1 == 0 || boss->life < boss->tgt_x - 90) + { + boss->act_no = BALFROG_AFTER_SHOOT_WAIT; + boss->act_wait = 0; + boss->ani_no = BALFROG_SPRITE_MOUTH_BARELY_OPEN_CROUCHING; + boss->ani_wait = 0; + gBoss[1].bits &= ~NPC_SHOOTABLE; + } + } + + break; + + case BALFROG_AFTER_SHOOT_WAIT: + ++boss->ani_wait; + + if (boss->ani_wait > 10) + { + if (++gBoss[1].count1 > 2) + { + gBoss[1].count1 = 0; + boss->act_no = BALFROG_INITIALIZE_LEAP_1; + } + else + { + boss->act_no = BALFROG_WAIT; + } + + boss->ani_wait = 0; + boss->ani_no = BALFROG_SPRITE_STANDING_STILL; + } + + break; + + case BALFROG_INITIALIZE_LEAP_1: + boss->act_no = BALFROG_INITIALIZE_LEAP_2; + boss->act_wait = 0; + boss->ani_no = BALFROG_SPRITE_STANDING_STILL; + boss->xm = 0; + // Fallthrough + case BALFROG_INITIALIZE_LEAP_2: + ++boss->act_wait; + + if (boss->act_wait > 50) + { + boss->act_no = BALFROG_INITIALIZE_LEAP_3; + boss->ani_wait = 0; + boss->ani_no = BALFROG_SPRITE_MOUTH_BARELY_OPEN_CROUCHING; + } + + break; + + case BALFROG_INITIALIZE_LEAP_3: + ++boss->ani_wait; + + if (boss->ani_wait > 20) + { + boss->act_no = BALFROG_LEAP; + boss->ani_wait = 0; + boss->ani_no = BALFROG_SPRITE_STANDING_STILL; + } + + break; + + case BALFROG_LEAP: + ++boss->ani_wait; + + if (boss->ani_wait > 4) + { + boss->act_no = BALFROG_LEAP_MIDAIR; + boss->ani_no = BALFROG_SPRITE_JUMPING; + boss->ym = -5 * 0x200; + boss->view.top = 64 * 0x200; + boss->view.bottom = 24 * 0x200; + PlaySoundObject(SND_SILLY_EXPLOSION, SOUND_MODE_PLAY); + } + + break; + + case BALFROG_LEAP_MIDAIR: + if (boss->flag & COLL_GROUND) + { + PlaySoundObject(SND_LARGE_OBJECT_HIT_GROUND, SOUND_MODE_PLAY); + SetQuake(60); + boss->act_no = BALFROG_WAIT; + boss->ani_no = BALFROG_SPRITE_STANDING_STILL; + boss->view.top = 48 * 0x200; + boss->view.bottom = 16 * 0x200; + + for (i = 0; i < 2; ++i) + SetNpChar(NPC_ENEMY_FROG, Random(4, 16) * (0x200 * 0x10), Random(0, 4) * (0x200 * 0x10), 0, 0, DIR_AUTO, NULL, 0x80); + + for (i = 0; i < 6; ++i) + SetNpChar(NPC_ENEMY_PUCHI, Random(4, 16) * (0x200 * 0x10), Random(0, 4) * (0x200 * 0x10), 0, 0, DIR_AUTO, NULL, 0x80); + + for (i = 0; i < 8; ++i) + SetNpChar(NPC_SMOKE, boss->x + Random(-12, 12) * 0x200, boss->y + boss->hit.bottom, Random(-341, 341), Random(-3 * 0x200, 0), DIR_LEFT, NULL, 0x100); + + if (boss->direct == DIR_LEFT && boss->x < gMC.x) + { + boss->direct = DIR_RIGHT; + boss->act_no = BALFROG_INITIALIZE_LAND; + } + + if (boss->direct == DIR_RIGHT && boss->x > gMC.x) + { + boss->direct = DIR_LEFT; + boss->act_no = BALFROG_INITIALIZE_LAND; + } + } + + break; + + case BALFROG_DIE: + boss->act_no = BALFROG_DIE_FLASHING; + boss->ani_no = BALFROG_SPRITE_MOUTH_OPEN_CROUCHING; + boss->act_wait = 0; + boss->xm = 0; + PlaySoundObject(SND_EXPLOSION, SOUND_MODE_PLAY); + + for (i = 0; i < 8; ++i) + SetNpChar(NPC_SMOKE, boss->x + Random(-12, 12) * 0x200, boss->y + Random(-12, 12) * 0x200, Random(-341, 341), Random(-3 * 0x200, 0), DIR_LEFT, NULL, 0x100); + + gBoss[1].cond = 0; + gBoss[2].cond = 0; + // Fallthrough + case BALFROG_DIE_FLASHING: + ++boss->act_wait; + + if (boss->act_wait % 5 == 0) + SetNpChar(NPC_SMOKE, boss->x + Random(-12, 12) * 0x200, boss->y + Random(-12, 12) * 0x200, Random(-341, 341), Random(-3 * 0x200, 0), DIR_LEFT, NULL, 0x100); + + if (boss->act_wait / 2 % 2) + boss->x -= 1 * 0x200; + else + boss->x += 1 * 0x200; + + if (boss->act_wait > 100) + { + boss->act_wait = 0; + boss->act_no = BALFROG_REVERT; + } + + break; + + case BALFROG_REVERT: + ++boss->act_wait; + + if (boss->act_wait / 2 % 2) + { + boss->view.front = 20 * 0x200; + boss->view.top = 12 * 0x200; + boss->view.back = 20 * 0x200; + boss->view.bottom = 12 * 0x200; + boss->ani_no = BALFROG_SPRITE_BALROG_WHITE; + } + else + { + boss->view.front = 48 * 0x200; + boss->view.top = 48 * 0x200; + boss->view.back = 32 * 0x200; + boss->view.bottom = 16 * 0x200; + boss->ani_no = BALFROG_SPRITE_MOUTH_OPEN_CROUCHING; + } + + if (boss->act_wait % 9 == 0) + SetNpChar(NPC_SMOKE, boss->x + Random(-12, 12) * 0x200, boss->y + Random(-12, 12) * 0x200, Random(-341, 341), Random(-3 * 0x200, 0), DIR_LEFT, NULL, 0x100); + + if (boss->act_wait > 150) + { + boss->act_no = BALFROG_NOP_START; + boss->hit.bottom = 12 * 0x200; + } + + break; + + case BALFROG_NOP_START: + boss->act_no = BALFROG_NOP; + // Fallthrough + case BALFROG_NOP: + if (boss->flag & COLL_GROUND) + { + boss->act_no = BALFROG_GO_INTO_CEILING; + boss->act_wait = 0; + boss->ani_no = BALFROG_SPRITE_BALROG_CROUCHING; + } + + break; + + case BALFROG_GO_INTO_CEILING: + ++boss->act_wait; + + if (boss->act_wait > 30) + { + boss->ani_no = BALFROG_SPRITE_BALROG_JUMPING; + boss->ym = -5 * 0x200; + boss->bits |= NPC_IGNORE_SOLIDITY; + boss->act_no = BALFROG_GONE_INTO_CEILING; + } + + break; + + case BALFROG_GONE_INTO_CEILING: + boss->ym = -5 * 0x200; + + if (boss->y < 0) + { + boss->cond = 0; + PlaySoundObject(SND_LARGE_OBJECT_HIT_GROUND, SOUND_MODE_PLAY); + SetQuake(30); + } + + break; + } + + boss->ym += 0x40; + if (boss->ym > 0x5FF) + boss->ym = 0x5FF; + + boss->x += boss->xm; + boss->y += boss->ym; + + if (boss->direct == DIR_LEFT) + boss->rect = rcLeft[boss->ani_no]; + else + boss->rect = rcRight[boss->ani_no]; + + ActBossChar02_01(); + ActBossChar02_02(); +} diff --git a/src/BossFrog.h b/src/BossFrog.h new file mode 100644 index 0000000..ea94a70 --- /dev/null +++ b/src/BossFrog.h @@ -0,0 +1,10 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void ActBossChar_Frog(void); diff --git a/src/BossIronH.cpp b/src/BossIronH.cpp new file mode 100644 index 0000000..3370ac1 --- /dev/null +++ b/src/BossIronH.cpp @@ -0,0 +1,230 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BossIronH.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "Frame.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" + +void ActBossChar_Ironhead(void) +{ + int i; + NPCHAR *npc = gBoss; + static unsigned char flash; + + switch (npc->act_no) + { + case 0: + npc->cond = 0x80; + npc->exp = 1; + npc->direct = gMirrorMode? 0:2; + npc->act_no = 100; + npc->x = 160 * 0x200; + npc->y = 128 * 0x200; + npc->view.front = 40 * 0x200; + npc->view.top = 12 * 0x200; + npc->view.back = 24 * 0x200; + npc->view.bottom = 12 * 0x200; + npc->hit_voice = 54; + npc->hit.front = 16 * 0x200; + npc->hit.top = 10 * 0x200; + npc->hit.back = 16 * 0x200; + npc->hit.bottom = 10 * 0x200; + npc->bits = (NPC_IGNORE_SOLIDITY | NPC_SHOOTABLE | NPC_EVENT_WHEN_KILLED | NPC_SHOW_DAMAGE); + npc->size = 3; + npc->damage = 10; + npc->code_event = 1000; + npc->life = 400; + break; + + case 100: + npc->act_no = 101; + npc->bits &= ~NPC_SHOOTABLE; + npc->act_wait = 0; + // Fallthrough + case 101: + ++npc->act_wait; + + if (npc->act_wait > 50) + { + npc->act_no = 250; + npc->act_wait = 0; + } + + if (npc->act_wait % 4 == 0) + SetNpChar(197, Random(15, 18) * (16 * 0x200), Random(2, 13) * (16 * 0x200), 0, 0, 0, NULL, 0x100); + + break; + + case 250: + npc->act_no = 251; + + if (npc->direct == 2) + { + npc->x = 240 * 0x200; + npc->y = gMC.y; + } + else + { + npc->x = 720 * 0x200; + npc->y = Random(2, 13) * (16 * 0x200); + } + + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + + npc->ym = Random(-0x200, 0x200); + npc->xm = Random(-0x200, 0x200); + + npc->bits |= NPC_SHOOTABLE; + // Fallthrough + case 251: + if (npc->direct == 2) + { + npc->tgt_x += 2 * 0x200; + } + else + { + npc->tgt_x -= 1 * 0x200; + + if (npc->tgt_y < gMC.y) + npc->tgt_y += 1 * 0x200; + else + npc->tgt_y -= 1 * 0x200; + } + + if (npc->x < npc->tgt_x) + npc->xm += 8; + else + npc->xm -= 8; + + if (npc->y < npc->tgt_y) + npc->ym += 8; + else + npc->ym -= 8; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 2) + { + if (npc->x > 720 * 0x200) + { + npc->direct = gMirrorMode? 2:0; + npc->act_no = 100; + } + } + else + { + if (npc->x < 272 * 0x200) + { + npc->direct = gMirrorMode? 0:2; + npc->act_no = 100; + } + } + + if (npc->direct == 0) + { + ++npc->act_wait; + + if (npc->act_wait == 300 || npc->act_wait == 310 || npc->act_wait == 320) + { + PlaySoundObject(39, SOUND_MODE_PLAY); + SetNpChar(198, npc->x + (10 * 0x200), npc->y + (1 * 0x200), Random(-3, 0) * 0x200, Random(-3, 3) * 0x200, 2, NULL, 0x100); + } + } + + ++npc->ani_wait; + + if (npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 7) + npc->ani_no = 0; + + break; + + case 1000: + npc->bits &= ~NPC_SHOOTABLE; + npc->ani_no = 8; + npc->damage = 0; + npc->act_no = 1001; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + SetQuake(20); + + for (i = 0; i < 0x20; ++i) + SetNpChar(4, npc->x + (Random(-128, 128) * 0x200), npc->y + (Random(-64, 64) * 0x200), Random(-128, 128) * 0x200, Random(-128, 128) * 0x200, 0, NULL, 0x100); + + DeleteNpCharCode(197, TRUE); + DeleteNpCharCode(271, TRUE); + DeleteNpCharCode(272, TRUE); + // Fallthrough + case 1001: + npc->tgt_x -= 1 * 0x200; + + npc->x = npc->tgt_x + (Random(-1, 1) * 0x200); + npc->y = npc->tgt_y + (Random(-1, 1) * 0x200); + + if (++npc->act_wait % 4 == 0) + SetNpChar(4, npc->x + (Random(-128, 128) * 0x200), npc->y + (Random(-64, 64) * 0x200), Random(-128, 128) * 0x200, Random(-128, 128) * 0x200, 0, NULL, 0x100); + + break; + } + + RECT rc[9] = { + {0, 0, 64, 24}, + {64, 0, 128, 24}, + {128, 0, 192, 24}, + {64, 0, 128, 24}, + {0, 0, 64, 24}, + {192, 0, 256, 24}, + {256, 0, 320, 24}, + {192, 0, 256, 24}, + {256, 48, 320, 72}, + }; + + RECT rcDamage[9] = { + {0, 24, 64, 48}, + {64, 24, 128, 48}, + {128, 24, 192, 48}, + {64, 24, 128, 48}, + {0, 24, 64, 48}, + {192, 24, 256, 48}, + {256, 24, 320, 48}, + {192, 24, 256, 48}, + {256, 48, 320, 72}, + }; + + if (npc->shock != 0) + { + if (++flash / 2 % 2) + npc->rect = rc[npc->ani_no]; + else + npc->rect = rcDamage[npc->ani_no]; + } + else + { + npc->rect = rc[npc->ani_no]; + } +} diff --git a/src/BossIronH.h b/src/BossIronH.h new file mode 100644 index 0000000..cf110b7 --- /dev/null +++ b/src/BossIronH.h @@ -0,0 +1,10 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void ActBossChar_Ironhead(void); diff --git a/src/BossLife.cpp b/src/BossLife.cpp new file mode 100644 index 0000000..d4af374 --- /dev/null +++ b/src/BossLife.cpp @@ -0,0 +1,100 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BossLife.h" + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" +#include "Boss.h" +#include "Draw.h" +#include "NpChar.h" + +BOSSLIFE gBL; + +void InitBossLife(void) +{ + gBL.flag = FALSE; +} + +BOOL StartBossLife(int code_event) +{ + int i = 0; + while (i < NPC_MAX && gNPC[i].code_event != code_event) + ++i; + + if (i == NPC_MAX) + return FALSE; + + gBL.flag = TRUE; + + if(gBossHPMultiplier == -1){ + gNPC[i].life = 1; + } + else{ + gNPC[i].life = gNPC[i].life*gBossHPMultiplier; + } + + gBL.max = gNPC[i].life; + gBL.br = gNPC[i].life; + gBL.pLife = &gNPC[i].life; + return TRUE; +} + +BOOL StartBossLife2(void) +{ + if(gBossHPMultiplier == -1){ + gBoss[0].life = 1; + } + else{ + gBoss[0].life = gBoss[0].life*gBossHPMultiplier; + } + + gBL.flag = TRUE; + gBL.max = gBoss[0].life; + gBL.br = gBoss[0].life; + gBL.pLife = &gBoss[0].life; + return TRUE; +} + +void PutBossLife(void) +{ + RECT rcText = {0, 48, 32, 56}; + RECT rcBox1 = {0, 0, 244, 8}; + RECT rcBox2 = {0, 16, 244, 24}; + RECT rcLife = {0, 24, 0, 32}; + RECT rcBr = {0, 32, 232, 40}; + + if (gBL.flag == FALSE) + return; + + if (*gBL.pLife < 1) + { + gBL.flag = FALSE; + return; + } + + rcLife.right = (*gBL.pLife * 198) / gBL.max; + + if (gBL.br > *gBL.pLife) + { + if (++gBL.count > 30) + --gBL.br; + } + else + { + gBL.count = 0; + } + + rcBr.right = (gBL.br * 198) / gBL.max; + + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 128), PixelToScreenCoord(WINDOW_HEIGHT - 20), &rcBox1, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 128), PixelToScreenCoord(WINDOW_HEIGHT - 12), &rcBox2, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 88), PixelToScreenCoord(WINDOW_HEIGHT - 16), &rcBr, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 88), PixelToScreenCoord(WINDOW_HEIGHT - 16), &rcLife, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 120), PixelToScreenCoord(WINDOW_HEIGHT - 16), &rcText, SURFACE_ID_TEXT_BOX); +} diff --git a/src/BossLife.h b/src/BossLife.h new file mode 100644 index 0000000..2936318 --- /dev/null +++ b/src/BossLife.h @@ -0,0 +1,26 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +typedef struct BOSSLIFE // Not the original struct name +{ + BOOL flag; + int *pLife; + int max; + int br; + int count; +} BOSSLIFE; + +extern BOSSLIFE gBL; + +void InitBossLife(void); +BOOL StartBossLife(int code_event); +BOOL StartBossLife2(void); +void PutBossLife(void); diff --git a/src/BossOhm.cpp b/src/BossOhm.cpp new file mode 100644 index 0000000..ebcf57f --- /dev/null +++ b/src/BossOhm.cpp @@ -0,0 +1,530 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BossOhm.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "Bullet.h" +#include "Flash.h" +#include "Frame.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" + +static void ActBoss01_12(void) +{ + int i; + + RECT rcLeft[1] = { + {80, 56, 104, 72} + }; + + RECT rcRight[1] = { + {104, 56, 128, 72} + }; + + for (i = 1; i < 3; ++i) + { + gBoss[i].y = (gBoss[0].y + gBoss[i + 2].y - (8 * 0x200)) / 2; + + if (gBoss[i].direct == 0) + { + gBoss[i].x = gBoss[0].x - (16 * 0x200); + gBoss[i].rect = rcLeft[gBoss[i].ani_no]; + } + else + { + gBoss[i].rect = rcRight[gBoss[i].ani_no]; + gBoss[i].x = gBoss[0].x + (16 * 0x200); + } + } +} + +static void ActBoss01_34(void) +{ + int i; + + RECT rcLeft[2] = { + {0, 56, 40, 88}, + {40, 56, 80, 88}, + }; + + RECT rcRight[2] = { + {0, 88, 40, 120}, + {40, 88, 80, 120}, + }; + + for (i = 3; i < 5; ++i) + { + switch (gBoss[i].act_no) + { + case 0: + gBoss[i].act_no = 1; + // Fallthrough + case 1: + gBoss[i].y = gBoss[0].y; + + if (i == 3) + gBoss[i].x = gBoss[0].x - (16 * 0x200); + if (i == 4) + gBoss[i].x = gBoss[0].x + (16 * 0x200); + + break; + + case 3: + gBoss[i].tgt_y = gBoss[0].y + (24 * 0x200); + + if (i == 3) + gBoss[i].x = gBoss[0].x - (16 * 0x200); + if (i == 4) + gBoss[i].x = gBoss[0].x + (16 * 0x200); + + gBoss[i].y += (gBoss[i].tgt_y - gBoss[i].y) / 2; + break; + } + + if (gBoss[i].flag & 8 || gBoss[i].y <= gBoss[i].tgt_y) + gBoss[i].ani_no = 0; + else + gBoss[i].ani_no = 1; + + if (gBoss[i].direct == 0) + gBoss[i].rect = rcLeft[gBoss[i].ani_no]; + else + gBoss[i].rect = rcRight[gBoss[i].ani_no]; + } +} + +static void ActBoss01_5(void) +{ + switch (gBoss[5].act_no) + { + case 0: + gBoss[5].bits |= (NPC_SOLID_SOFT | NPC_IGNORE_SOLIDITY); + + gBoss[5].hit.front = 20 * 0x200; + gBoss[5].hit.top = 36 * 0x200; + gBoss[5].hit.back = 20 * 0x200; + gBoss[5].hit.bottom = 16 * 0x200; + + gBoss[5].act_no = 1; + // Fallthrough + case 1: + gBoss[5].x = gBoss[0].x; + gBoss[5].y = gBoss[0].y; + break; + } +} + +void ActBossChar_Omega(void) +{ + switch (gBoss[0].act_no) + { + case 0: + gBoss[0].x = 219 * 0x10 * 0x200; + gBoss[0].y = 16 * 0x10 * 0x200; + + gBoss[0].view.front = 40 * 0x200; + gBoss[0].view.top = 40 * 0x200; + gBoss[0].view.back = 40 * 0x200; + gBoss[0].view.bottom = 16 * 0x200; + + gBoss[0].tgt_x = gBoss[0].x; + gBoss[0].tgt_y = gBoss[0].y; + + gBoss[0].hit_voice = 52; + + gBoss[0].hit.front = 8 * 0x200; + gBoss[0].hit.top = 24 * 0x200; + gBoss[0].hit.back = 8 * 0x200; + gBoss[0].hit.bottom = 16 * 0x200; + + gBoss[0].bits = (NPC_IGNORE_SOLIDITY | NPC_EVENT_WHEN_KILLED | NPC_SHOW_DAMAGE); + gBoss[0].size = 3; + gBoss[0].exp = 1; + gBoss[0].code_event = 210; + gBoss[0].life = 400; + + gBoss[1].cond = 0x80; + + gBoss[1].view.front = 12 * 0x200; + gBoss[1].view.top = 8 * 0x200; + gBoss[1].view.back = 12 * 0x200; + gBoss[1].view.bottom = 8 * 0x200; + + gBoss[1].bits = NPC_IGNORE_SOLIDITY; + + gBoss[2] = gBoss[1]; + + gBoss[1].direct = 0; + gBoss[2].direct = 2; + + gBoss[3].cond = 0x80; + + gBoss[3].view.front = 24 * 0x200; + gBoss[3].view.top = 16 * 0x200; + gBoss[3].view.back = 16 * 0x200; + gBoss[3].view.bottom = 16 * 0x200; + + gBoss[3].hit_voice = 52; + + gBoss[3].hit.front = 8 * 0x200; + gBoss[3].hit.top = 8 * 0x200; + gBoss[3].hit.back = 8 * 0x200; + gBoss[3].hit.bottom = 8 * 0x200; + + gBoss[3].bits = NPC_IGNORE_SOLIDITY; + + gBoss[3].x = gBoss[0].x - (16 * 0x200); + gBoss[3].y = gBoss[0].y; + gBoss[3].direct = 0; + + gBoss[4] = gBoss[3]; + + gBoss[4].direct = 2; + gBoss[3].x = gBoss[0].x + (16 * 0x200); + gBoss[5].cond = 0x80; + break; + + case 20: // Rising out of the ground + gBoss[0].act_no = 30; + gBoss[0].act_wait = 0; + gBoss[0].ani_no = 0; + // Fallthrough + case 30: + SetQuake(2); + gBoss[0].y -= 1 * 0x200; + + if (++gBoss[0].act_wait % 4 == 0) + PlaySoundObject(26, SOUND_MODE_PLAY); + + if (gBoss[0].act_wait == 48) + { + gBoss[0].act_wait = 0; + gBoss[0].act_no = 40; + + if (gBoss[0].life > 280) + break; + + gBoss[0].act_no = 110; + + gBoss[0].bits |= NPC_SHOOTABLE; + gBoss[0].bits &= ~NPC_IGNORE_SOLIDITY; + gBoss[3].bits &= ~NPC_IGNORE_SOLIDITY; + gBoss[4].bits &= ~NPC_IGNORE_SOLIDITY; + + gBoss[3].act_no = 3; + gBoss[4].act_no = 3; + gBoss[5].hit.top = 16 * 0x200; + } + + break; + + case 40: + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait == 48) + { + gBoss[0].act_wait = 0; + gBoss[0].act_no = 50; + gBoss[0].count1 = 0; + gBoss[5].hit.top = 16 * 0x200; + PlaySoundObject(102, SOUND_MODE_PLAY); + } + + break; + + case 50: // Open mouth + ++gBoss[0].count1; + + if (gBoss[0].count1 > 2) + { + gBoss[0].count1 = 0; + ++gBoss[0].count2; + } + + if (gBoss[0].count2 == 3) + { + gBoss[0].act_no = 60; + gBoss[0].act_wait = 0; + gBoss[0].bits |= NPC_SHOOTABLE; + gBoss[0].hit.front = 16 * 0x200; + gBoss[0].hit.back = 16 * 0x200; + } + + break; + + case 60: // Shoot out of mouth + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait > 20 && gBoss[0].act_wait < 80 && !(gBoss[0].act_wait % 3)) + { + if (Random(0, 9) < 8) + SetNpChar(48, gBoss[0].x, gBoss[0].y - (16 * 0x200), Random(-0x100, 0x100), -0x10 * 0x200 / 10, 0, NULL, 0x100); + else + SetNpChar(48, gBoss[0].x, gBoss[0].y - (16 * 0x200), Random(-0x100, 0x100), -0x10 * 0x200 / 10, 2, NULL, 0x100); + + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + if (gBoss[0].act_wait == 200 || CountArmsBullet(6)) + { + gBoss[0].count1 = 0; + gBoss[0].act_no = 70; + PlaySoundObject(102, SOUND_MODE_PLAY); + } + + break; + + case 70: // Close mouth + ++gBoss[0].count1; + + if (gBoss[0].count1 > 2) + { + gBoss[0].count1 = 0; + --gBoss[0].count2; + } + + if (gBoss[0].count2 == 1) + gBoss[0].damage = 20; + + if (gBoss[0].count2 == 0) + { + PlaySoundObject(102, SOUND_MODE_STOP); + PlaySoundObject(12, SOUND_MODE_PLAY); + + gBoss[0].act_no = 80; + gBoss[0].act_wait = 0; + + gBoss[0].bits &= ~NPC_SHOOTABLE; + + gBoss[0].hit.front = 24 * 0x200; + gBoss[0].hit.back = 24 * 0x200; + gBoss[5].hit.top = 36 * 0x200; + + gBoss[0].damage = 0; + } + + break; + + case 80: + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait == 48) + { + gBoss[0].act_wait = 0; + gBoss[0].act_no = 90; + } + + break; + + case 90: // Go back into the ground + SetQuake(2); + gBoss[0].y += 1 * 0x200; + + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait % 4 == 0) + PlaySoundObject(26, SOUND_MODE_PLAY); + + if (gBoss[0].act_wait == 48) + { + gBoss[0].act_wait = 0; + gBoss[0].act_no = 100; + } + + break; + + case 100: // Move to proper position for coming out of the ground + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait == 120) + { + gBoss[0].act_wait = 0; + gBoss[0].act_no = 30; + + gBoss[0].x = gBoss[0].tgt_x + (Random(-64, 64) * 0x200); + gBoss[0].y = gBoss[0].tgt_y; + } + + break; + + case 110: + ++gBoss[0].count1; + + if (gBoss[0].count1 > 2) + { + gBoss[0].count1 = 0; + ++gBoss[0].count2; + } + + if (gBoss[0].count2 == 3) + { + gBoss[0].act_no = 120; + gBoss[0].act_wait = 0; + gBoss[0].hit.front = 16 * 0x200; + gBoss[0].hit.back = 16 * 0x200; + } + + break; + + case 120: + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait == 50 || CountArmsBullet(6)) + { + gBoss[0].act_no = 130; + PlaySoundObject(102, SOUND_MODE_PLAY); + gBoss[0].act_wait = 0; + gBoss[0].count1 = 0; + } + + if (gBoss[0].act_wait < 30 && gBoss[0].act_wait % 5 == 0) + { + SetNpChar(48, gBoss[0].x, gBoss[0].y - (16 * 0x200), Random(-341, 341), -0x10 * 0x200 / 10, 0, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + break; + + case 130: + ++gBoss[0].count1; + + if (gBoss[0].count1 > 2) + { + gBoss[0].count1 = 0; + --gBoss[0].count2; + } + + if (gBoss[0].count2 == 1) + gBoss[0].damage = 20; + + if (gBoss[0].count2 == 0) + { + gBoss[0].act_no = 140; + gBoss[0].bits |= NPC_SHOOTABLE; + + gBoss[0].hit.front = 16 * 0x200; + gBoss[0].hit.back = 16 * 0x200; + + gBoss[0].ym = -0x5FF; + + PlaySoundObject(102, SOUND_MODE_STOP); + PlaySoundObject(12, SOUND_MODE_PLAY); + PlaySoundObject(25, SOUND_MODE_PLAY); + + if (gBoss[0].x < gMC.x) + gBoss[0].xm = 0x100; + if (gBoss[0].x > gMC.x) + gBoss[0].xm = -0x100; + + gBoss[0].damage = 0; + gBoss[5].hit.top = 36 * 0x200; + } + + break; + + case 140: + if (gMC.flag & 8 && gBoss[0].ym > 0) + gBoss[5].damage = 20; + else + gBoss[5].damage = 0; + + gBoss[0].ym += 0x24; + if (gBoss[0].ym > 0x5FF) + gBoss[0].ym = 0x5FF; + + gBoss[0].x += gBoss[0].xm; + gBoss[0].y += gBoss[0].ym; + + if (gBoss[0].flag & 8) + { + gBoss[0].act_no = 110; + gBoss[0].act_wait = 0; + gBoss[0].count1 = 0; + + gBoss[5].hit.top = 16 * 0x200; + gBoss[5].damage = 0; + + PlaySoundObject(26, SOUND_MODE_PLAY); + PlaySoundObject(12, SOUND_MODE_PLAY); + + SetQuake(30); + } + + break; + + case 150: + SetQuake(2); + + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait % 12 == 0) + PlaySoundObject(52, SOUND_MODE_PLAY); + + SetDestroyNpChar(gBoss[0].x + (Random(-0x30, 0x30) * 0x200), gBoss[0].y + (Random(-0x30, 0x18) * 0x200), 1, 1); + + if (gBoss[0].act_wait > 100) + { + gBoss[0].act_wait = 0; + gBoss[0].act_no = 160; + SetFlash(gBoss[0].x, gBoss[0].y, FLASH_MODE_EXPLOSION); + PlaySoundObject(35, SOUND_MODE_PLAY); + } + + break; + + case 160: + SetQuake(40); + + ++gBoss[0].act_wait; + + if (gBoss[0].act_wait > 50) + { + gBoss[0].cond = 0; + gBoss[1].cond = 0; + gBoss[2].cond = 0; + gBoss[3].cond = 0; + gBoss[4].cond = 0; + gBoss[5].cond = 0; + } + + break; + } + + RECT rect[4] = { + {0, 0, 80, 56}, + {80, 0, 160, 56}, + {160, 0, 240, 56}, + {80, 0, 160, 56}, + }; + + gBoss[0].rect = rect[gBoss[0].count2]; + + gBoss[1].shock = gBoss[0].shock; + gBoss[2].shock = gBoss[0].shock; + gBoss[3].shock = gBoss[0].shock; + gBoss[4].shock = gBoss[0].shock; + + ActBoss01_34(); + ActBoss01_12(); + ActBoss01_5(); + + if (gBoss[0].life == 0 && gBoss[0].act_no < 150) + { + gBoss[0].act_no = 150; + gBoss[0].act_wait = 0; + gBoss[0].damage = 0; + gBoss[5].damage = 0; + DeleteNpCharCode(48, TRUE); + } +} diff --git a/src/BossOhm.h b/src/BossOhm.h new file mode 100644 index 0000000..fb5de74 --- /dev/null +++ b/src/BossOhm.h @@ -0,0 +1,10 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void ActBossChar_Omega(void); diff --git a/src/BossPress.cpp b/src/BossPress.cpp new file mode 100644 index 0000000..2903c47 --- /dev/null +++ b/src/BossPress.cpp @@ -0,0 +1,241 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BossPress.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "Game.h" +#include "Map.h" +#include "NpChar.h" +#include "Sound.h" + +void ActBossChar_Press(void) +{ + NPCHAR *npc = gBoss; + static unsigned char flash; + int i; + int x; + + switch (npc->act_no) + { + case 0: + npc->act_no = 10; + npc->cond = 0x80; + npc->exp = 1; + npc->direct = gMirrorMode? 0:2; + npc->x = 0; + npc->y = 0; + npc->view.front = 40 * 0x200; + npc->view.top = 60 * 0x200; + npc->view.back = 40 * 0x200; + npc->view.bottom = 60 * 0x200; + npc->hit_voice = 54; + npc->hit.front = 49 * 0x200; + npc->hit.top = 60 * 0x200; + npc->hit.back = 40 * 0x200; + npc->hit.bottom = 48 * 0x200; + npc->bits = (NPC_IGNORE_SOLIDITY | NPC_SOLID_HARD | NPC_EVENT_WHEN_KILLED | NPC_SHOW_DAMAGE); + npc->size = 3; + npc->damage = 10; + npc->code_event = 1000; + npc->life = 700; + break; + + case 5: + npc->act_no = 6; + npc->x = 0; + npc->y = 0; + gBoss[1].cond = 0; + gBoss[2].cond = 0; + break; + + case 10: + npc->act_no = 11; + npc->x = 160 * 0x200; + npc->y = 74 * 0x200; + break; + + case 20: + npc->damage = 0; + npc->act_no = 21; + npc->x = 160 * 0x200; + npc->y = 413 * 0x200; + npc->bits &= ~NPC_SOLID_HARD; + gBoss[1].cond = 0; + gBoss[2].cond = 0; + // Fallthrough + case 21: + if (++npc->act_wait % 0x10 == 0) + SetDestroyNpChar(npc->x + (Random(-40, 40) * 0x200), npc->y + (Random(-60, 60) * 0x200), 1, 1); + + break; + + case 30: + npc->act_no = 31; + npc->ani_no = 2; + npc->x = 160 * 0x200; + npc->y = 64 * 0x200; + // Fallthrough + case 31: + npc->y += 4 * 0x200; + + if (npc->y >= 413 * 0x200) + { + npc->y = 413 * 0x200; + npc->ani_no = 0; + npc->act_no = 20; + PlaySoundObject(44, SOUND_MODE_PLAY); + + for (i = 0; i < 5; ++i) + { + x = npc->x + (Random(-40, 40) * 0x200); + SetNpChar(4, x, npc->y + (60 * 0x200), 0, 0, 0, NULL, 0x100); + } + + } + + break; + + case 100: + npc->act_no = 101; + npc->count2 = 9; + npc->act_wait = -100; + + gBoss[1].cond = 0x80; + gBoss[1].hit.front = 14 * 0x200; + gBoss[1].hit.back = 14 * 0x200; + gBoss[1].hit.top = 8 * 0x200; + gBoss[1].hit.bottom = 8 * 0x200; + gBoss[1].bits = (NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY); + + gBoss[2] = gBoss[1]; + + gBoss[3].cond = 0x90; + gBoss[3].bits |= NPC_SHOOTABLE; + gBoss[3].hit.front = 6 * 0x200; + gBoss[3].hit.back = 6 * 0x200; + gBoss[3].hit.top = 8 * 0x200; + gBoss[3].hit.bottom = 8 * 0x200; + + SetNpChar(325, npc->x, npc->y + (60 * 0x200), 0, 0, 0, NULL, 0x100); + // Fallthrough + case 101: + if (npc->count2 > 1 && npc->life < npc->count2 * 70) + { + --npc->count2; + + for (i = 0; i < 5; ++i) + { + ChangeMapParts(i + 8, npc->count2, 0); + SetDestroyNpChar((i + 8) * 0x200 * 0x10, npc->count2 * 0x200 * 0x10, 0, 4); + PlaySoundObject(12, SOUND_MODE_PLAY); + } + } + + if (++npc->act_wait == 81 || npc->act_wait == 241) + SetNpChar(323, 48 * 0x200, 240 * 0x200, 0, 0, 1, NULL, 0x100); + + if (npc->act_wait == 1 || npc->act_wait == 161) + SetNpChar(323, 272 * 0x200, 240 * 0x200, 0, 0, 1, NULL, 0x100); + + if (npc->act_wait >= 300) + { + npc->act_wait = 0; + SetNpChar(325, npc->x, npc->y + (60 * 0x200), 0, 0, 0, NULL, 0x100); + } + + break; + + case 500: + gBoss[3].bits &= ~NPC_SHOOTABLE; + + npc->act_no = 501; + npc->act_wait = 0; + npc->count1 = 0; + + DeleteNpCharCode(325, TRUE); + DeleteNpCharCode(330, TRUE); + // Fallthrough + case 501: + if (++npc->act_wait % 0x10 == 0) + { + PlaySoundObject(12, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x + (Random(-40, 40) * 0x200), npc->y + (Random(-60, 60) * 0x200), 1, 1); + } + + if (npc->act_wait == 95) + npc->ani_no = 1; + if (npc->act_wait == 98) + npc->ani_no = 2; + + if (npc->act_wait > 100) + npc->act_no = 510; + + break; + + case 510: + npc->ym += 0x40; + npc->damage = 0x7F; + npc->y += npc->ym; + + if (npc->count1 == 0 && npc->y > 160 * 0x200) + { + npc->count1 = 1; + npc->ym = -0x200; + npc->damage = 0; + + for (i = 0; i < 7; ++i) + { + ChangeMapParts(i + 7, 14, 0); + SetDestroyNpChar((i + 7) * 0x200 * 0x10, 224 * 0x200, 0, 0); + PlaySoundObject(12, SOUND_MODE_PLAY); + } + } + + if (npc->y > 480 * 0x200) + npc->act_no = 520; + + break; + } + + gBoss[1].x = npc->x - (24 * 0x200); + gBoss[1].y = npc->y + (52 * 0x200); + + gBoss[2].x = npc->x + (24 * 0x200); + gBoss[2].y = npc->y + (52 * 0x200); + + gBoss[3].x = npc->x; + gBoss[3].y = npc->y + (40 * 0x200); + + RECT rc[3] = { + {0, 0, 80, 120}, + {80, 0, 160, 120}, + {160, 0, 240, 120}, + }; + + RECT rcDamage[3] = { + {0, 120, 80, 240}, + {80, 120, 160, 240}, + {160, 120, 240, 240}, + }; + + if (npc->shock != 0) + { + if (++flash / 2 % 2) + npc->rect = rc[npc->ani_no]; + else + npc->rect = rcDamage[npc->ani_no]; + } + else + { + npc->rect = rc[npc->ani_no]; + } +} diff --git a/src/BossPress.h b/src/BossPress.h new file mode 100644 index 0000000..f4310ae --- /dev/null +++ b/src/BossPress.h @@ -0,0 +1,10 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void ActBossChar_Press(void); diff --git a/src/BossTwinD.cpp b/src/BossTwinD.cpp new file mode 100644 index 0000000..e070a9f --- /dev/null +++ b/src/BossTwinD.cpp @@ -0,0 +1,556 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BossTwinD.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "Flash.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +static void ActBossCharT_DragonBody(NPCHAR *npc) +{ + unsigned char deg; + + RECT rcLeft[3] = { + {0, 0, 40, 40}, + {40, 0, 80, 40}, + {80, 0, 120, 40}, + }; + + RECT rcRight[3] = { + {0, 40, 40, 80}, + {40, 40, 80, 80}, + {80, 40, 120, 80}, + }; + + switch (npc->act_no) + { + case 0: + deg = ((npc->pNpc->count1 / 4) + npc->count1) % 0x100; + npc->act_no = 10; + npc->x += npc->pNpc->x + (GetCos(deg) * npc->pNpc->tgt_x); + npc->y += npc->pNpc->y + (GetSin(deg) * npc->pNpc->tgt_y); + // Fallthrough + case 10: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + break; + + case 100: + deg = ((npc->pNpc->count1 / 4) + npc->count1) % 0x100; + npc->tgt_x = npc->pNpc->x + (GetCos(deg) * npc->pNpc->tgt_x); + npc->tgt_y = npc->pNpc->y + (GetSin(deg) * npc->pNpc->tgt_y); + + npc->x += (npc->tgt_x - npc->x) / 8; + npc->y += (npc->tgt_y - npc->y) / 8; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + break; + + case 1000: + npc->act_no = 1001; + npc->bits &= ~NPC_SHOOTABLE; + // Fallthrough + case 1001: + deg = ((npc->pNpc->count1 / 4) + npc->count1) % 0x100; + npc->tgt_x = npc->pNpc->x + (GetCos(deg) * npc->pNpc->tgt_x); + npc->tgt_y = npc->pNpc->y + (GetSin(deg) * npc->pNpc->tgt_y); + + npc->x += (npc->tgt_x - npc->x) / 8; + npc->y += (npc->tgt_y - npc->y) / 8; + + if (npc->x > npc->pNpc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + break; + } + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +static void ActBossCharT_DragonHead(NPCHAR *npc) +{ + unsigned char deg; + int xm, ym; + + RECT rcLeft[4] = { + {0, 80, 40, 112}, + {40, 80, 80, 112}, + {80, 80, 120, 112}, + {120, 80, 160, 112}, + }; + + RECT rcRight[4] = { + {0, 112, 40, 144}, + {40, 112, 80, 144}, + {80, 112, 120, 144}, + {120, 112, 160, 144}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + break; + + case 100: + npc->act_no = 200; + // Fallthrough + case 200: + npc->bits &= ~NPC_SHOOTABLE; + npc->ani_no = 0; + npc->hit.front = 16 * 0x200; + npc->act_no = 201; + npc->count1 = Random(100, 200); + // Fallthrough + case 201: + if (npc->count1 != 0) + { + --npc->count1; + } + else + { + npc->act_no = 210; + npc->act_wait = 0; + npc->count2 = 0; + } + + break; + + case 210: + ++npc->act_wait; + + if (npc->act_wait == 3) + npc->ani_no = 1; + + if (npc->act_wait == 6) + { + npc->ani_no = 2; + npc->hit.front = 8 * 0x200; + npc->bits |= NPC_SHOOTABLE; + npc->count2 = 0; + } + + if (npc->act_wait > 150) + { + npc->act_no = 220; + npc->act_wait = 0; + } + + if (npc->shock != 0) + ++npc->count2; + + if (npc->count2 > 10) + { + PlaySoundObject(51, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 4); + npc->act_no = 300; + npc->act_wait = 0; + npc->ani_no = 3; + npc->hit.front = 16 * 0x200; + } + + break; + + case 220: + ++npc->act_wait; + + if (npc->act_wait % 8 == 1) + { + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-6, 6); + ym = GetSin(deg); + xm = GetCos(deg); + + if (npc->direct == 0) + SetNpChar(202, npc->x - (8 * 0x200), npc->y, xm, ym, 0, NULL, 0x100); + else + SetNpChar(202, npc->x + (8 * 0x200), npc->y, xm, ym, 0, NULL, 0x100); + + PlaySoundObject(33, SOUND_MODE_PLAY); + } + + if (npc->act_wait > 50) + npc->act_no = 200; + + break; + + case 300: + ++npc->act_wait; + + if (npc->act_wait > 100) + npc->act_no = 200; + + break; + + case 400: + npc->act_no = 401; + npc->act_wait = 0; + npc->ani_no = 0; + npc->hit.front = 16 * 0x200; + npc->bits &= ~NPC_SHOOTABLE; + // Fallthrough + case 401: + ++npc->act_wait; + + if (npc->act_wait == 3) + npc->ani_no = 1; + + if (npc->act_wait == 6) + { + npc->ani_no = 2; + npc->hit.front = 8 * 0x200; + npc->bits |= NPC_SHOOTABLE; + npc->count2 = 0; + } + + if (npc->act_wait > 20 && npc->act_wait % 32 == 1) + { + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-6, 6); + ym = GetSin(deg); + xm = GetCos(deg); + + if (npc->direct == 0) + SetNpChar(202, npc->x - (8 * 0x200), npc->y, xm, ym, 0, NULL, 0x100); + else + SetNpChar(202, npc->x + (8 * 0x200), npc->y, xm, ym, 0, NULL, 0x100); + + PlaySoundObject(33, SOUND_MODE_PLAY); + } + + break; + + case 1000: + npc->bits &= ~NPC_SHOOTABLE; + npc->ani_no = 3; + break; + } + + npc->direct = npc->pNpc->direct; + + if (npc->direct == 0) + npc->x = npc->pNpc->x - (4 * 0x200); + else + npc->x = npc->pNpc->x + (4 * 0x200); + + npc->y = npc->pNpc->y - (8 * 0x200); + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +void ActBossChar_Twin(void) +{ + NPCHAR *npc = gBoss; + + switch (npc->act_no) + { + case 0: + npc->cond = 0x80; + npc->direct = gMirrorMode? 2:0; + npc->act_no = 10; + npc->exp = 0; + npc->x = 160 * 0x200; + npc->y = 128 * 0x200; + npc->view.front = 8 * 0x200; + npc->view.top = 8 * 0x200; + npc->view.back = 128 * 0x200; + npc->view.bottom = 8 * 0x200; + npc->hit_voice = 54; + npc->hit.front = 8 * 0x200; + npc->hit.top = 8 * 0x200; + npc->hit.back = 8 * 0x200; + npc->hit.bottom = 8 * 0x200; + npc->bits = NPC_IGNORE_SOLIDITY; + npc->bits |= NPC_EVENT_WHEN_KILLED; + npc->size = 3; + npc->damage = 0; + npc->code_event = 1000; + npc->life = 500; + npc->count2 = Random(700, 1200); + npc->tgt_x = 180; + npc->tgt_y = 61; + + gBoss[2].cond = 0x80; + gBoss[2].view.back = 20 * 0x200; + gBoss[2].view.front = 20 * 0x200; + gBoss[2].view.top = 16 * 0x200; + gBoss[2].view.bottom = 16 * 0x200; + gBoss[2].hit.back = 12 * 0x200; + gBoss[2].hit.front = 12 * 0x200; + gBoss[2].hit.top = 10 * 0x200; + gBoss[2].hit.bottom = 10 * 0x200; + gBoss[2].bits = (NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY); + gBoss[2].pNpc = &gBoss[3]; + gBoss[2].cond |= 0x10; + gBoss[2].damage = 10; + + gBoss[3].cond = 0x80; + gBoss[3].view.back = 20 * 0x200; + gBoss[3].view.front = 20 * 0x200; + gBoss[3].view.top = 20 * 0x200; + gBoss[3].view.bottom = 20 * 0x200; + gBoss[3].hit.back = 12 * 0x200; + gBoss[3].hit.front = 12 * 0x200; + gBoss[3].hit.top = 2 * 0x200; + gBoss[3].hit.bottom = 16 * 0x200; + gBoss[3].bits = NPC_IGNORE_SOLIDITY; + gBoss[3].pNpc = npc; + gBoss[3].damage = 10; + + gBoss[4] = gBoss[2]; + gBoss[4].pNpc = &gBoss[5]; + + gBoss[5] = gBoss[3]; + gBoss[5].count1 = 128; + break; + + case 20: + if (--npc->tgt_x <= 0x70) + { + npc->act_no = 100; + npc->act_wait = 0; + gBoss[2].act_no = 100; + gBoss[4].act_no = 100; + gBoss[3].act_no = 100; + gBoss[5].act_no = 100; + } + + break; + + case 100: + ++npc->act_wait; + + if (npc->act_wait < 100) + { + npc->count1 += 1; + } + else if (npc->act_wait < 120) + { + npc->count1 += 2; + } + else if (npc->act_wait < npc->count2) + { + npc->count1 += 4; + } + else if (npc->act_wait < npc->count2 + 40) + { + npc->count1 += 2; + } + else if (npc->act_wait < npc->count2 + 60) + { + npc->count1 += 1; + } + else + { + npc->act_wait = 0; + npc->act_no = 110; + npc->count2 = Random(400, 700); + break; + } + + if (npc->count1 > 0x3FF) + npc->count1 -= 0x400; + + break; + + case 110: + ++npc->act_wait; + + if (npc->act_wait < 20) + { + npc->count1 -= 1; + } + else if (npc->act_wait < 60) + { + npc->count1 -= 2; + } + else if (npc->act_wait < npc->count2) + { + npc->count1 -= 4; + } + else if (npc->act_wait < npc->count2 + 40) + { + npc->count1 -= 2; + } + else if (npc->act_wait < npc->count2 + 60) + { + npc->count1 -= 1; + } + else + { + if (npc->life < 300) + { + npc->act_wait = 0; + npc->act_no = 400; + gBoss[2].act_no = 400; + gBoss[4].act_no = 400; + } + else + { + npc->act_wait = 0; + npc->act_no = 100; + npc->count2 = Random(400, 700); + } + + break; + } + + if (npc->count1 <= 0) + npc->count1 += 0x400; + + break; + + case 400: + ++npc->act_wait; + + if (npc->act_wait > 100) + { + npc->act_wait = 0; + npc->act_no = 401; + } + + break; + + case 401: + ++npc->act_wait; + + if (npc->act_wait < 100) + { + npc->count1 += 1; + } + else if (npc->act_wait < 120) + { + npc->count1 += 2; + } + else if (npc->act_wait < 500) + { + npc->count1 += 4; + } + else if (npc->act_wait < 540) + { + npc->count1 += 2; + } + else if (npc->act_wait < 560) + { + npc->count1 += 1; + } + else + { + npc->act_no = 100; + npc->act_wait = 0; + gBoss[2].act_no = 100; + gBoss[4].act_no = 100; + break; + } + + if (npc->count1 > 0x3FF) + npc->count1 -= 0x400; + + break; + + case 1000: + npc->act_no = 1001; + npc->act_wait = 0; + gBoss[2].act_no = 1000; + gBoss[3].act_no = 1000; + gBoss[4].act_no = 1000; + gBoss[5].act_no = 1000; + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 40); + // Fallthrough + + case 1001: + ++npc->act_wait; + + if (npc->act_wait > 100) + npc->act_no = 1010; + + SetNpChar(4, npc->x + (Random(-0x80, 0x80) * 0x200), npc->y + (Random(-70, 70) * 0x200), 0, 0, 0, NULL, 0x100); + break; + + case 1010: + npc->count1 += 4; + + if (npc->count1 > 0x3FF) + npc->count1 -= 0x400; + + if (npc->tgt_x > 8) + --npc->tgt_x; + if (npc->tgt_y > 0) + --npc->tgt_y; + + if (npc->tgt_x < -8) + ++npc->tgt_x; + if (npc->tgt_y < 0) + ++npc->tgt_y; + + if (npc->tgt_y == 0) + { + npc->act_no = 1020; + npc->act_wait = 0; + SetFlash(gBoss[0].x, gBoss[0].y, FLASH_MODE_EXPLOSION); + PlaySoundObject(35, SOUND_MODE_PLAY); + } + + break; + + case 1020: + if (++gBoss[0].act_wait > 50) + { + DeleteNpCharCode(211, TRUE); + gBoss[0].cond = 0; + gBoss[1].cond = 0; + gBoss[2].cond = 0; + gBoss[3].cond = 0; + gBoss[4].cond = 0; + gBoss[5].cond = 0; + gBoss[0].act_no = 0; + } + + break; + } + + ActBossCharT_DragonHead(&gBoss[2]); + ActBossCharT_DragonBody(&gBoss[3]); + ActBossCharT_DragonHead(&gBoss[4]); + ActBossCharT_DragonBody(&gBoss[5]); + + RECT rc = {0, 0, 0, 0}; + npc->rect = rc; +} diff --git a/src/BossTwinD.h b/src/BossTwinD.h new file mode 100644 index 0000000..5216717 --- /dev/null +++ b/src/BossTwinD.h @@ -0,0 +1,10 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void ActBossChar_Twin(void); diff --git a/src/BossX.cpp b/src/BossX.cpp new file mode 100644 index 0000000..9e8cf3a --- /dev/null +++ b/src/BossX.cpp @@ -0,0 +1,913 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BossX.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "Flash.h" +#include "Frame.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +static void ActBossChar03_01(NPCHAR *npc) +{ + RECT rcUp[6] = { + {0, 0, 72, 32}, + {0, 32, 72, 64}, + {72, 0, 144, 32}, + {144, 0, 216, 32}, + {72, 32, 144, 64}, + {144, 32, 216, 64}, + }; + + RECT rcDown[6] = { + {0, 64, 72, 96}, + {0, 96, 72, 128}, + {72, 64, 144, 96}, + {144, 64, 216, 96}, + {72, 96, 144, 128}, + {144, 96, 216, 128}, + }; + + switch (npc->act_no) + { + case 10: + npc->ani_no = 0; + npc->bits &= ~NPC_BOUNCY; + break; + + case 100: + npc->bits |= NPC_BOUNCY; + npc->act_no = 101; + npc->act_wait = 0; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 101: + if (++npc->act_wait > 30) + npc->act_no = 102; + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + npc->xm -= 0x20; + break; + + case 102: + npc->bits &= ~NPC_BOUNCY; + npc->act_no = 103; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 103: + ++npc->act_wait; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + npc->xm -= 0x20; + break; + + case 200: + npc->bits |= NPC_BOUNCY; + npc->bits |= NPC_REAR_AND_TOP_DONT_HURT; + npc->act_no = 201; + npc->act_wait = 0; + npc->ani_no = 4; + npc->ani_wait = 0; + // Fallthrough + case 201: + if (++npc->act_wait > 30) + npc->act_no = 202; + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 4; + + npc->xm += 0x20; + break; + + case 202: + npc->bits &= ~NPC_BOUNCY; + npc->act_no = 203; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 203: + ++npc->act_wait; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + npc->xm += 0x20; + break; + + case 300: + npc->act_no = 301; + npc->ani_no = 4; + npc->ani_wait = 0; + npc->bits |= NPC_BOUNCY; + // Fallthrough + case 301: + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 4; + + npc->xm += 0x20; + + if (npc->xm > 0) + { + npc->xm = 0; + npc->act_no = 10; + } + + break; + + case 400: + npc->act_no = 401; + npc->ani_no = 2; + npc->ani_wait = 0; + npc->bits |= NPC_BOUNCY; + // Fallthrough + case 401: + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + npc->xm -= 0x20; + + if (npc->xm < 0) + { + npc->xm = 0; + npc->act_no = 10; + } + + break; + } + + if ((npc->act_no == 101 || npc->act_no == 201 || npc->act_no == 301 || npc->act_no == 401) && npc->act_wait % 2 == 1) + PlaySoundObject(112, SOUND_MODE_PLAY); + + if ((npc->act_no == 103 || npc->act_no == 203) && npc->act_wait % 4 == 1) + PlaySoundObject(111, SOUND_MODE_PLAY); + + if (npc->act_no >= 100 && gMC.y < npc->y + (4 * 0x200) && gMC.y > npc->y - (4 * 0x200)) + { + npc->damage = 10; + npc->bits |= NPC_REAR_AND_TOP_DONT_HURT; + } + else + { + npc->damage = 0; + npc->bits &= ~NPC_REAR_AND_TOP_DONT_HURT; + } + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + npc->x += npc->xm; + + if (npc->direct == 1) + npc->rect = rcUp[npc->ani_no]; + else + npc->rect = rcDown[npc->ani_no]; +} + +static void ActBossChar03_02(NPCHAR *npc) +{ + RECT rect[4] = { + {0, 128, 72, 160}, + {72, 128, 144, 160}, + {0, 160, 72, 192}, + {72, 160, 144, 192}, + }; + + int direct; + int x, y; + + switch (npc->act_no) + { + case 10: + npc->act_no = 11; + npc->act_wait = (npc->ani_no * 30) + 30; + // Fallthrough + case 11: + if (npc->act_wait != 0) + { + --npc->act_wait; + break; + } + + switch (npc->ani_no) + { + case 0: + direct = 3; + x = -30 * 0x200; + y = 6 * 0x200; + break; + case 1: + direct = 2; + x = 30 * 0x200; + y = 6 * 0x200; + break; + case 2: + direct = 0; + x = -30 * 0x200; + y = -6 * 0x200; + break; + case 3: + direct = 1; + x = 30 * 0x200; + y = -6 * 0x200; + break; + } + + SetNpChar(158, npc->x + x, npc->y + y, 0, 0, direct, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + npc->act_wait = 120; + + break; + } + + npc->x = (gBoss[0].x + gBoss[npc->count1].x) / 2; + npc->y = (gBoss[0].y + gBoss[npc->count1].y) / 2; + + npc->rect = rect[npc->ani_no]; +} + +static void ActBossChar03_03(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 10: + npc->tgt_x += 1 * 0x200; + + if (npc->tgt_x > 32 * 0x200) + { + npc->tgt_x = 32 * 0x200; + npc->act_no = 0; + gBoss[3].act_no = 10; + gBoss[4].act_no = 10; + gBoss[5].act_no = 10; + gBoss[6].act_no = 10; + } + + break; + + case 20: + npc->tgt_x -= 1 * 0x200; + + if (npc->tgt_x < 0) + { + npc->tgt_x = 0; + npc->act_no = 0; + gBoss[3].act_no = 0; + gBoss[4].act_no = 0; + gBoss[5].act_no = 0; + gBoss[6].act_no = 0; + } + + break; + + case 30: + npc->tgt_x += 1 * 0x200; + + if (npc->tgt_x > 20 * 0x200) + { + npc->tgt_x = 20 * 0x200; + npc->act_no = 0; + gBoss[7].act_no = 10; + gBoss[13].act_no = 10; + gBoss[14].act_no = 10; + gBoss[15].act_no = 10; + gBoss[16].act_no = 10; + } + + break; + + case 40: + npc->tgt_x -= 1 * 0x200; + + if (npc->tgt_x < 0) + { + npc->tgt_x = 0; + npc->act_no = 0; + gBoss[7].act_no = 0; + gBoss[13].act_no = 0; + gBoss[14].act_no = 0; + gBoss[15].act_no = 0; + gBoss[16].act_no = 0; + } + + break; + } + + RECT rcLeft = {216, 96, 264, 144}; + RECT rcRight = {264, 96, 312, 144}; + + if (npc->direct == 0) + { + npc->rect = rcLeft; + npc->x = gBoss[0].x - (24 * 0x200) - npc->tgt_x; + npc->y = gBoss[0].y; + } + else + { + npc->rect = rcRight; + npc->x = gBoss[0].x + (24 * 0x200) + npc->tgt_x; + npc->y = gBoss[0].y; + } +} + +static void ActBossChar03_04(NPCHAR *npc) +{ + int xm, ym; + unsigned char deg; + + RECT rect[8] = { + {0, 192, 16, 208}, + {16, 192, 32, 208}, + {32, 192, 48, 208}, + {48, 192, 64, 208}, + {0, 208, 16, 224}, + {16, 208, 32, 224}, + {32, 208, 48, 224}, + {48, 208, 64, 224}, + }; + + switch (npc->act_no) + { + case 0: + npc->bits &= ~NPC_SHOOTABLE; + npc->ani_no = 0; + break; + + case 10: + npc->act_no = 11; + npc->act_wait = (npc->tgt_x * 10) + 40; + npc->bits |= NPC_SHOOTABLE; + // Fallthrough + case 11: + if (npc->act_wait < 16 && npc->act_wait / 2 % 2) + npc->ani_no = 1; + else + npc->ani_no = 0; + + if (npc->act_wait != 0) + { + --npc->act_wait; + break; + } + + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-2, 2); + ym = GetSin(deg) * 3; + xm = GetCos(deg) * 3; + SetNpChar(156, npc->x, npc->y, xm, ym, 0, NULL, 0x100); + + PlaySoundObject(39, SOUND_MODE_PLAY); + npc->act_wait = 40; + + break; + } + + switch (npc->tgt_x) + { + case 0: + npc->x = gBoss[0].x - (22 * 0x200); + npc->y = gBoss[0].y - (16 * 0x200); + break; + case 1: + npc->x = gBoss[0].x + (28 * 0x200); + npc->y = gBoss[0].y - (16 * 0x200); + break; + case 2: + npc->x = gBoss[0].x - (15 * 0x200); + npc->y = gBoss[0].y + (14 * 0x200); + break; + case 3: + npc->x = gBoss[0].x + (17 * 0x200); + npc->y = gBoss[0].y + (14 * 0x200); + break; + } + + npc->rect = rect[npc->tgt_x + 4 * npc->ani_no]; +} + +static void ActBossChar03_face(NPCHAR *npc) +{ + RECT rect[3] = { + {216, 0, 320, 48}, + {216, 48, 320, 96}, + {216, 144, 320, 192}, + }; + + static unsigned char flash; + + switch (npc->act_no) + { + case 0: + gBoss[0].bits &= ~NPC_SHOOTABLE; + npc->ani_no = 0; + break; + + case 10: + npc->act_no = 11; + npc->act_wait = (npc->tgt_x * 10) + 40; + gBoss[0].bits |= NPC_SHOOTABLE; + // Fallthrough + case 11: + if (gBoss[0].shock) + { + if (flash++ / 2 % 2) + npc->ani_no = 1; + else + npc->ani_no = 0; + } + else + { + npc->ani_no = 0; + } + + break; + } + + gBoss[7].x = gBoss[0].x; + gBoss[7].y = gBoss[0].y; + + if (gBoss[0].act_no <= 10) + npc->ani_no = 2; + + npc->rect = rect[npc->ani_no]; +} + +void ActBossChar_MonstX(void) +{ + int i; + NPCHAR *npc = gBoss; + + switch (npc->act_no) + { + case 0: + npc->life = 1; + npc->x = -320 * 0x200; + break; + + case 1: + npc->life = 700; + npc->exp = 1; + npc->act_no = 1; + npc->x = 2048 * 0x200; + npc->y = 200 * 0x200; + npc->hit_voice = 54; + npc->hit.front = 24 * 0x200; + npc->hit.top = 24 * 0x200; + npc->hit.back = 24 * 0x200; + npc->hit.bottom = 24 * 0x200; + npc->bits = (NPC_IGNORE_SOLIDITY | NPC_EVENT_WHEN_KILLED | NPC_SHOW_DAMAGE); + npc->size = 3; + npc->code_event = 1000; + npc->ani_no = 0; + + gBoss[1].cond = 0x80; + gBoss[1].size = 3; + gBoss[1].direct = 0; + gBoss[1].view.front = 24 * 0x200; + gBoss[1].view.top = 24 * 0x200; + gBoss[1].view.back = 24 * 0x200; + gBoss[1].view.bottom = 24 * 0x200; + gBoss[1].bits = NPC_IGNORE_SOLIDITY; + + gBoss[2] = gBoss[1]; + gBoss[2].direct = 2; + + gBoss[3].cond = 0x80; + gBoss[3].life = 60; + gBoss[3].size = 3; // Redundant: this get overwritten a few lines later + gBoss[3].hit_voice = 54; + gBoss[3].destroy_voice = 71; + gBoss[3].size = 2; + gBoss[3].view.front = 8 * 0x200; + gBoss[3].view.top = 8 * 0x200; + gBoss[3].view.back = 8 * 0x200; + gBoss[3].view.bottom = 8 * 0x200; + gBoss[3].hit.front = 5 * 0x200; + gBoss[3].hit.back = 5 * 0x200; + gBoss[3].hit.top = 5 * 0x200; + gBoss[3].hit.bottom = 5 * 0x200; + gBoss[3].bits = NPC_IGNORE_SOLIDITY; + gBoss[3].tgt_x = 0; + + gBoss[4] = gBoss[3]; + gBoss[4].tgt_x = 1; + + gBoss[5] = gBoss[3]; + gBoss[5].tgt_x = 2; + gBoss[5].life = 100; + + gBoss[6] = gBoss[3]; + gBoss[6].tgt_x = 3; + gBoss[6].life = 100; + + gBoss[7].cond = 0x80; + gBoss[7].x = 2048 * 0x200; + gBoss[7].y = 200 * 0x200; + gBoss[7].view.front = 52 * 0x200; + gBoss[7].view.top = 24 * 0x200; + gBoss[7].view.back = 52 * 0x200; + gBoss[7].view.bottom = 24 * 0x200; + gBoss[7].hit_voice = 52; + gBoss[7].hit.front = 8 * 0x200; + gBoss[7].hit.top = 24 * 0x200; + gBoss[7].hit.back = 8 * 0x200; + gBoss[7].hit.bottom = 16 * 0x200; + gBoss[7].bits = NPC_IGNORE_SOLIDITY; + gBoss[7].size = 3; + gBoss[7].ani_no = 0; + + gBoss[9].cond = 0x80; + gBoss[9].act_no = 0; + gBoss[9].direct = 1; + gBoss[9].x = 1984 * 0x200; + gBoss[9].y = 144 * 0x200; + gBoss[9].view.front = 36 * 0x200; + gBoss[9].view.top = 8 * 0x200; + gBoss[9].view.back = 36 * 0x200; + gBoss[9].view.bottom = 24 * 0x200; + gBoss[9].hit_voice = 52; + gBoss[9].hit.front = 28 * 0x200; + gBoss[9].hit.top = 8 * 0x200; + gBoss[9].hit.back = 28 * 0x200; + gBoss[9].hit.bottom = 16 * 0x200; + gBoss[9].bits = (NPC_SOLID_SOFT | NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY | NPC_REAR_AND_TOP_DONT_HURT); + gBoss[9].size = 3; + + gBoss[10] = gBoss[9]; + gBoss[10].x = 2112 * 0x200; + + gBoss[11] = gBoss[9]; + gBoss[11].direct = 3; + gBoss[11].x = 1984 * 0x200; + gBoss[11].y = 256 * 0x200; + gBoss[11].view.top = 24 * 0x200; + gBoss[11].view.bottom = 8 * 0x200; + gBoss[11].hit.top = 16 * 0x200; + gBoss[11].hit.bottom = 8 * 0x200; + + gBoss[12] = gBoss[11]; + gBoss[12].x = 2112 * 0x200; + + gBoss[13] = gBoss[9]; + gBoss[13].cond = 0x80; + gBoss[13].view.top = 16 * 0x200; + gBoss[13].view.bottom = 16 * 0x200; + gBoss[13].view.front = 30 * 0x200; + gBoss[13].view.back = 42 * 0x200; + gBoss[13].count1 = 9; + gBoss[13].ani_no = 0; + gBoss[13].bits = NPC_IGNORE_SOLIDITY; + + gBoss[14] = gBoss[13]; + gBoss[14].view.front = 42 * 0x200; + gBoss[14].view.back = 30 * 0x200; + gBoss[14].count1 = 10; + gBoss[14].ani_no = 1; + gBoss[14].bits = NPC_IGNORE_SOLIDITY; + + gBoss[15] = gBoss[13]; + gBoss[15].view.top = 16 * 0x200; + gBoss[15].view.bottom = 16 * 0x200; + gBoss[15].count1 = 11; + gBoss[15].ani_no = 2; + gBoss[15].bits = NPC_IGNORE_SOLIDITY; + + gBoss[16] = gBoss[15]; + gBoss[16].view.front = 42 * 0x200; + gBoss[16].view.back = 30 * 0x200; + gBoss[16].count1 = 12; + gBoss[16].ani_no = 3; + gBoss[16].bits = NPC_IGNORE_SOLIDITY; + + npc->act_no = 2; + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + npc->count1 = 0; + // Fallthrough + case 11: + ++npc->act_wait; + + if (npc->act_wait > 100) + { + npc->act_wait = 0; + + if (npc->x > gMC.x) + npc->act_no = 100; + else + npc->act_no = 200; + } + + break; + + case 100: + npc->act_wait = 0; + npc->act_no = 101; + ++npc->count1; + // Fallthrough + case 101: + ++npc->act_wait; + + if (npc->act_wait == 4) + gBoss[9].act_no = 100; + if (npc->act_wait == 8) + gBoss[10].act_no = 100; + if (npc->act_wait == 10) + gBoss[11].act_no = 100; + if (npc->act_wait == 12) + gBoss[12].act_no = 100; + + if (npc->act_wait > 120 && npc->count1 > 2) + npc->act_no = 300; + if (npc->act_wait > 121 && gMC.x > npc->x) + npc->act_no = 200; + + break; + + case 200: + npc->act_wait = 0; + npc->act_no = 201; + ++npc->count1; + // Fallthrough + case 201: + ++npc->act_wait; + + if (npc->act_wait == 4) + gBoss[9].act_no = 200; + if (npc->act_wait == 8) + gBoss[10].act_no = 200; + if (npc->act_wait == 10) + gBoss[11].act_no = 200; + if (npc->act_wait == 12) + gBoss[12].act_no = 200; + + if (npc->act_wait > 120 && npc->count1 > 2) + npc->act_no = 400; + if (npc->act_wait > 121 && gMC.x < npc->x) + npc->act_no = 100; + + break; + + case 300: + npc->act_wait = 0; + npc->act_no = 301; + // Fallthrough + case 301: + ++npc->act_wait; + + if (npc->act_wait == 4) + gBoss[9].act_no = 300; + if (npc->act_wait == 8) + gBoss[10].act_no = 300; + if (npc->act_wait == 10) + gBoss[11].act_no = 300; + if (npc->act_wait == 12) + gBoss[12].act_no = 300; + + if (npc->act_wait > 50) + { + if (gBoss[3].cond == 0 && gBoss[4].cond == 0 && gBoss[5].cond == 0 && gBoss[6].cond == 0) + npc->act_no = 600; + else + npc->act_no = 500; + } + + break; + + case 400: + npc->act_wait = 0; + npc->act_no = 401; + // Fallthrough + case 401: + ++npc->act_wait; + + if (npc->act_wait == 4) + gBoss[9].act_no = 400; + if (npc->act_wait == 8) + gBoss[10].act_no = 400; + if (npc->act_wait == 10) + gBoss[11].act_no = 400; + if (npc->act_wait == 12) + gBoss[12].act_no = 400; + + if (npc->act_wait > 50) + { + if (gBoss[3].cond == 0 && gBoss[4].cond == 0 && gBoss[5].cond == 0 && gBoss[6].cond == 0) + npc->act_no = 600; + else + npc->act_no = 500; + } + + break; + + case 500: + npc->act_no = 501; + npc->act_wait = 0; + gBoss[1].act_no = 10; + gBoss[2].act_no = 10; + // Fallthrough + case 501: + ++npc->act_wait; + + if (npc->act_wait > 300) + { + npc->act_no = 502; + npc->act_wait = 0; + } + + if (gBoss[3].cond == 0 && gBoss[4].cond == 0 && gBoss[5].cond == 0 && gBoss[6].cond == 0) + { + npc->act_no = 502; + npc->act_wait = 0; + } + + break; + + case 502: + npc->act_no = 503; + npc->act_wait = 0; + npc->count1 = 0; + gBoss[1].act_no = 20; + gBoss[2].act_no = 20; + // Fallthrough + case 503: // Exactly identical to case 603 + ++npc->act_wait; + + if (npc->act_wait > 50) + { + if (npc->x > gMC.x) + npc->act_no = 100; + else + npc->act_no = 200; + } + + break; + + case 600: + npc->act_no = 601; + npc->act_wait = 0; + npc->count2 = npc->life; + gBoss[1].act_no = 30; + gBoss[2].act_no = 30; + // Fallthrough + case 601: + ++npc->act_wait; + + if (npc->life < npc->count2 - 200 || npc->act_wait > 300) + { + npc->act_no = 602; + npc->act_wait = 0; + } + + break; + + case 602: + npc->act_no = 603; + npc->act_wait = 0; + npc->count1 = 0; + gBoss[1].act_no = 40; + gBoss[2].act_no = 40; + // Fallthrough + + case 603: // Exactly identical to case 503 + ++npc->act_wait; + + if (npc->act_wait > 50) + { + if (npc->x > gMC.x) + npc->act_no = 100; + else + npc->act_no = 200; + } + + break; + + case 1000: + SetQuake(2); + + if (++npc->act_wait % 8 == 0) + PlaySoundObject(52, SOUND_MODE_PLAY); + + SetDestroyNpChar(npc->x + (Random(-72, 72) * 0x200), npc->y + (Random(-64, 64) * 0x200), 1, 1); + + if (npc->act_wait > 100) + { + npc->act_wait = 0; + npc->act_no = 1001; + SetFlash(npc->x, npc->y, FLASH_MODE_EXPLOSION); + PlaySoundObject(35, SOUND_MODE_PLAY); + } + + break; + + case 1001: + SetQuake(40); + + ++npc->act_wait; + + if (npc->act_wait > 50) + { + for (i = 0; i < 20; ++i) + gBoss[i].cond = 0; + + DeleteNpCharCode(158, TRUE); + SetNpChar(159, npc->x, npc->y - (24 * 0x200), 0, 0, 0, NULL, 0); + } + + break; + } + + ActBossChar03_01(&gBoss[9]); + ActBossChar03_01(&gBoss[10]); + ActBossChar03_01(&gBoss[11]); + ActBossChar03_01(&gBoss[12]); + + npc->x += (((gBoss[11].x + gBoss[10].x + gBoss[9].x + gBoss[12].x) / 4) - npc->x) / 0x10; + + ActBossChar03_face(&gBoss[7]); + + ActBossChar03_02(&gBoss[13]); + ActBossChar03_02(&gBoss[14]); + ActBossChar03_02(&gBoss[15]); + ActBossChar03_02(&gBoss[16]); + + ActBossChar03_03(&gBoss[1]); + ActBossChar03_03(&gBoss[2]); + + if (gBoss[3].cond) + ActBossChar03_04(&gBoss[3]); + if (gBoss[4].cond) + ActBossChar03_04(&gBoss[4]); + if (gBoss[5].cond) + ActBossChar03_04(&gBoss[5]); + if (gBoss[6].cond) + ActBossChar03_04(&gBoss[6]); + + if (npc->life == 0 && npc->act_no < 1000) + { + npc->act_no = 1000; + npc->act_wait = 0; + npc->shock = 150; + gBoss[9].act_no = 300; + gBoss[10].act_no = 300; + gBoss[11].act_no = 300; + gBoss[12].act_no = 300; + } +} diff --git a/src/BossX.h b/src/BossX.h new file mode 100644 index 0000000..8dec8cc --- /dev/null +++ b/src/BossX.h @@ -0,0 +1,10 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void ActBossChar_MonstX(void); diff --git a/src/Bug Fixes.txt b/src/Bug Fixes.txt new file mode 100644 index 0000000..1c27c36 --- /dev/null +++ b/src/Bug Fixes.txt @@ -0,0 +1,5 @@ +Main.cpp : void SystemTask() + Pixel intended for the second alternate up key to be the plus key, Japanese keyboards have the plus key where the semi-colon key is, causing errors on other keyboard layouts) + +SelStage.cpp : int StageSelectLoop(int *p_event) + The screencap that serves as the menu's background was being drawn with transparency enabled. This can cause moving sprites (like the text) to leave a trail. diff --git a/src/BulHit.cpp b/src/BulHit.cpp new file mode 100644 index 0000000..373d470 --- /dev/null +++ b/src/BulHit.cpp @@ -0,0 +1,439 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "BulHit.h" + +#include + +#include "WindowsWrapper.h" + +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Game.h" +#include "Map.h" +#include "NpChar.h" +#include "Sound.h" + +static void Vanish(BULLET *bul) +{ + if (bul->code_bullet != 37 && bul->code_bullet != 38 && bul->code_bullet != 39) + PlaySoundObject(28, SOUND_MODE_PLAY); + else + SetCaret(bul->x, bul->y, CARET_PROJECTILE_DISSIPATION, DIR_UP); + + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_PROJECTILE_DISSIPATION, DIR_RIGHT); +} + +int JudgeHitBulletBlock(int x, int y, BULLET *bul) +{ + int i; + int hit = 0; + if (bul->x - bul->blockXL < ((x * 16) + 8) * 0x200 + && bul->x + bul->blockXL > ((x * 16) - 8) * 0x200 + && bul->y - bul->blockYL < ((y * 16) + 8) * 0x200 + && bul->y + bul->blockYL > ((y * 16) - 8) * 0x200) + hit |= 0x200; + + if (hit && bul->bbits & 0x60 && GetAttribute(x, y) == 0x43) + { + if (!(bul->bbits & 0x40)) + bul->cond = 0; + + SetCaret(bul->x, bul->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + PlaySoundObject(12, SOUND_MODE_PLAY); + + for (i = 0; i < 4; ++i) + SetNpChar(4, x * 0x200 * 0x10, y * 0x200 * 0x10, Random(-0x200, 0x200), Random(-0x200, 0x200), 0, NULL, 0x100); + + ShiftMapParts(gMirrorMode? x-1: x, y); + } + + return hit; +} + +int JudgeHitBulletBlock2(int x, int y, unsigned char *atrb, BULLET *bul) +{ + BOOL block[4]; + int workX, workY; + int hit, i; + + hit = 0; + + if (bul->bbits & 0x40) + { + for (i = 0; i < 4; ++i) + { + if (*atrb == 0x41 || *atrb == 0x61) + block[i] = TRUE; + else + block[i] = FALSE; + + ++atrb; + } + } + else + { + for (i = 0; i < 4; ++i) + { + if (*atrb == 0x41 || *atrb == 0x43 || *atrb == 0x61) + block[i] = TRUE; + else + block[i] = FALSE; + + ++atrb; + } + } + + workX = ((x * 16) + 8) * 0x200; + workY = ((y * 16) + 8) * 0x200; + + // Left wall + if (block[0] && block[2]) + { + if (bul->x - bul->blockXL < workX) + hit |= 1; + } + else if (block[0] && !block[2]) + { + if (bul->x - bul->blockXL < workX && bul->y - bul->blockYL < workY - (3 * 0x200)) + hit |= 1; + } + else if (!block[0] && block[2]) + { + if (bul->x - bul->blockXL < workX && bul->y + bul->blockYL > workY + (3 * 0x200)) + hit |= 1; + } + + // Right wall + if (block[1] && block[3]) + { + if (bul->x + bul->blockXL > workX) + hit |= 4; + } + else if (block[1] && !block[3]) + { + if (bul->x + bul->blockXL > workX && bul->y - bul->blockYL < workY - (3 * 0x200)) + hit |= 4; + } + else if (!block[1] && block[3]) + { + if (bul->x + bul->blockXL > workX && bul->y + bul->blockYL > workY + (3 * 0x200)) + hit |= 4; + } + + // Ceiling + if (block[0] && block[1]) + { + if (bul->y - bul->blockYL < workY) + hit |= 2; + } + else if (block[0] && !block[1]) + { + if (bul->y - bul->blockYL < workY && bul->x - bul->blockXL < workX - (3 * 0x200)) + hit |= 2; + } + else if (!block[0] && block[1]) + { + if (bul->y - bul->blockYL < workY && bul->x + bul->blockXL > workX + (3 * 0x200)) + hit |= 2; + } + + // Ground + if (block[2] && block[3]) + { + if (bul->y + bul->blockYL > workY) + hit |= 8; + } + else if (block[2] && !block[3]) + { + if (bul->y + bul->blockYL > workY && bul->x - bul->blockXL < workX - (3 * 0x200)) + hit |= 8; + } + else if (!block[2] && block[3]) + { + if (bul->y + bul->blockYL > workY && bul->x + bul->blockXL > workX + (3 * 0x200)) + hit |= 8; + } + + // Clip + if (bul->bbits & 8) + { + if (hit & 1) + bul->x = workX + bul->blockXL; + else if (hit & 4) + bul->x = workX - bul->blockXL; + else if (hit & 2) + bul->y = workY + bul->blockYL; + else if (hit & 8) + bul->y = workY - bul->blockYL; + } + else + { + if (hit & 0xF) + Vanish(bul); + } + + return hit; +} + +int JudgeHitBulletTriangleA(int x, int y, BULLET *bul) +{ + int hit = 0; + if (bul->x < ((x * 16) + 8) * 0x200 + && bul->x > ((x * 16) - 8) * 0x200 + && bul->y - (2 * 0x200) < ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) + (4 * 0x200) + && bul->y + (2 * 0x200) > ((y * 16) - 8) * 0x200) + { + if (bul->bbits & 8) + bul->y = ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) + (6 * 0x200); + else + Vanish(bul); + + hit |= 0x82; + } + + return hit; +} + +int JudgeHitBulletTriangleB(int x, int y, BULLET *bul) +{ + int hit = 0; + if (bul->x < ((x * 16) + 8) * 0x200 + && bul->x > ((x * 16) - 8) * 0x200 + && bul->y - (2 * 0x200) < ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) - (4 * 0x200) + && bul->y + (2 * 0x200) > ((y * 16) - 8) * 0x200) + { + if (bul->bbits & 8) + bul->y = ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) - (2 * 0x200); + else + Vanish(bul); + + hit |= 0x82; + } + + return hit; +} + +int JudgeHitBulletTriangleC(int x, int y, BULLET *bul) +{ + int hit = 0; + if (bul->x < ((x * 16) + 8) * 0x200 + && bul->x > ((x * 16) - 8) * 0x200 + && bul->y - (2 * 0x200) < ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) - (4 * 0x200) + && bul->y + (2 * 0x200) > ((y * 16) - 8) * 0x200) + { + if (bul->bbits & 8) + bul->y = ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) - (2 * 0x200); + else + Vanish(bul); + + hit |= 0x42; + } + + return hit; +} + +int JudgeHitBulletTriangleD(int x, int y, BULLET *bul) +{ + int hit = 0; + if (bul->x < ((x * 16) + 8) * 0x200 + && bul->x > ((x * 16) - 8) * 0x200 + && bul->y - (2 * 0x200) < ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) + (4 * 0x200) + && bul->y + (2 * 0x200) > ((y * 16) - 8) * 0x200) + { + if (bul->bbits & 8) + bul->y = ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) + (6 * 0x200); + else + Vanish(bul); + + hit |= 0x42; + } + + return hit; +} + +int JudgeHitBulletTriangleE(int x, int y, BULLET *bul) +{ + int hit = 0; + if (bul->x < ((x * 16) + 8) * 0x200 + && bul->x - (1 * 0x200) > ((x * 16) - 8) * 0x200 + && bul->y + (2 * 0x200) > ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) - (4 * 0x200) + && bul->y - (2 * 0x200) < ((y * 16) + 8) * 0x200) + { + if (bul->bbits & 8) + bul->y = ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) - (6 * 0x200); + else + Vanish(bul); + + hit |= 0x28; + } + + return hit; +} + +int JudgeHitBulletTriangleF(int x, int y, BULLET *bul) +{ + int hit = 0; + if (bul->x < ((x * 16) + 8) * 0x200 + && bul->x > ((x * 16) - 8) * 0x200 + && bul->y + (2 * 0x200) > ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) + (4 * 0x200) + && bul->y - (2 * 0x200) < ((y * 16) + 8) * 0x200) + { + if (bul->bbits & 8) + bul->y = ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) + (2 * 0x200); + else + Vanish(bul); + + hit |= 0x28; + } + + return hit; +} + +int JudgeHitBulletTriangleG(int x, int y, BULLET *bul) +{ + int hit = 0; + if (bul->x < ((x * 16) + 8) * 0x200 + && bul->x > ((x * 16) - 8) * 0x200 + && bul->y + (2 * 0x200) > ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) + (4 * 0x200) + && bul->y - (2 * 0x200) < ((y * 16) + 8) * 0x200) + { + if (bul->bbits & 8) + bul->y = ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) + (2 * 0x200); + else + Vanish(bul); + + hit |= 0x18; + } + + return hit; +} + +int JudgeHitBulletTriangleH(int x, int y, BULLET *bul) +{ + int hit = 0; + if (bul->x < ((x * 16) + 8) * 0x200 + && bul->x > ((x * 16) - 8) * 0x200 + && bul->y + (2 * 0x200) > ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) - (4 * 0x200) + && bul->y - (2 * 0x200) < ((y * 16) + 8) * 0x200) + { + if (bul->bbits & 8) + bul->y = ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) - (6 * 0x200); + else + Vanish(bul); + + hit |= 0x18; + } + + return hit; +} + +void HitBulletMap(void) +{ + int x, y; + unsigned char atrb[4]; + + int i, j; + + for (i = 0; i < BULLET_MAX; ++i) + { + int offx[4]; + int offy[4]; + + if (!(gBul[i].cond & 0x80)) + continue; + + x = gBul[i].x / 0x10 / 0x200; + y = gBul[i].y / 0x10 / 0x200; + + // Get surrounding tiles + offx[0] = 0; + offx[1] = 1; + offx[2] = 0; + offx[3] = 1; + offy[0] = 0; + offy[1] = 0; + offy[2] = 1; + offy[3] = 1; + + atrb[0] = GetAttribute(x, y); + atrb[1] = GetAttribute(x + 1, y); + atrb[2] = GetAttribute(x, y + 1); + atrb[3] = GetAttribute(x + 1, y + 1); + + // Clear hit tiles + gBul[i].flag = 0; + + if (gBul[i].bbits & 4) + { + // There probably used to be commented-out code here + } + else + { + for (j = 0; j < 4; ++j) + { + if (!(gBul[i].cond & 0x80)) + continue; + + switch (atrb[j]) + { + case 0x41: + case 0x43: + case 0x44: + case 0x61: + case 0x64: + gBul[i].flag |= JudgeHitBulletBlock(x + offx[j], y + offy[j], &gBul[i]); + break; + + case 0x50: + case 0x70: + gBul[i].flag |= JudgeHitBulletTriangleA(x + offx[j], y + offy[j], &gBul[i]); + break; + + case 0x51: + case 0x71: + gBul[i].flag |= JudgeHitBulletTriangleB(x + offx[j], y + offy[j], &gBul[i]); + break; + + case 0x52: + case 0x72: + gBul[i].flag |= JudgeHitBulletTriangleC(x + offx[j], y + offy[j], &gBul[i]); + break; + + case 0x53: + case 0x73: + gBul[i].flag |= JudgeHitBulletTriangleD(x + offx[j], y + offy[j], &gBul[i]); + break; + + case 0x54: + case 0x74: + gBul[i].flag |= JudgeHitBulletTriangleE(x + offx[j], y + offy[j], &gBul[i]); + break; + + case 0x55: + case 0x75: + gBul[i].flag |= JudgeHitBulletTriangleF(x + offx[j], y + offy[j], &gBul[i]); + break; + + case 0x56: + case 0x76: + gBul[i].flag |= JudgeHitBulletTriangleG(x + offx[j], y + offy[j], &gBul[i]); + break; + + case 0x57: + case 0x77: + gBul[i].flag |= JudgeHitBulletTriangleH(x + offx[j], y + offy[j], &gBul[i]); + break; + } + } + + gBul[i].flag |= JudgeHitBulletBlock2(x, y, atrb, &gBul[i]); + } + } +} diff --git a/src/BulHit.h b/src/BulHit.h new file mode 100644 index 0000000..ea6d76f --- /dev/null +++ b/src/BulHit.h @@ -0,0 +1,10 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void HitBulletMap(void); diff --git a/src/Bullet.cpp b/src/Bullet.cpp new file mode 100644 index 0000000..8a5a9c7 --- /dev/null +++ b/src/Bullet.cpp @@ -0,0 +1,2508 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Bullet.h" + +#include +#include + +#include "WindowsWrapper.h" + +#include "Draw.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Game.h" +#include "KeyControl.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" + +BULLET gBul[BULLET_MAX]; + +void InitBullet(void) +{ + // Identical to ClearBullet + int i; + + for (i = 0; i < BULLET_MAX; ++i) + gBul[i].cond = 0; +} + +int CountArmsBullet(int arms_code) +{ + int i; + int count = 0; + + for (i = 0; i < BULLET_MAX; ++i) + if (gBul[i].cond & 0x80 && (gBul[i].code_bullet + 2) / 3 == arms_code) + ++count; + + return count; +} + +int CountBulletNum(int bullet_code) +{ + int i; + int count = 0; + + for (i = 0; i < BULLET_MAX; ++i) + if (gBul[i].cond & 0x80 && gBul[i].code_bullet == bullet_code) + ++count; + + return count; +} + +void DeleteBullet(int code) +{ + int i; + int count = 0; // Guessed name. This is unused, and was optimised out of the Linux port. + + for (i = 0; i < BULLET_MAX; ++i) + if (gBul[i].cond & 0x80 && (gBul[i].code_bullet + 2) / 3 == code) + gBul[i].cond = 0; +} + +void ClearBullet(void) +{ + // Identical to InitBullet + int i; + + for (i = 0; i < BULLET_MAX; ++i) + gBul[i].cond = 0; +} + +void PutBullet(int fx, int fy) +{ + int i; + int x, y; + + for (i = 0; i < BULLET_MAX; ++i) + { + if (gBul[i].cond & 0x80) + { + switch (gBul[i].direct) + { + case DIR_LEFT: + x = gBul[i].x - gBul[i].view.front; + y = gBul[i].y - gBul[i].view.top; + break; + case DIR_UP: + x = gBul[i].x - gBul[i].view.top; + y = gBul[i].y - gBul[i].view.front; + break; + case DIR_RIGHT: + x = gBul[i].x - gBul[i].view.back; + y = gBul[i].y - gBul[i].view.top; + break; + case DIR_DOWN: + x = gBul[i].x - gBul[i].view.top; + y = gBul[i].y - gBul[i].view.back; + break; + } + + PutBitmap3(&grcGame, SubpixelToScreenCoord(x) - SubpixelToScreenCoord(fx), SubpixelToScreenCoord(y) - SubpixelToScreenCoord(fy), &gBul[i].rect, SURFACE_ID_BULLET); + } + } +} + +BULLET_TABLE gBulTbl[] = { + // Null + {0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0}}, + // Snake + {4, 1, 20, 36, 4, 4, 2, 2, {8, 8, 8, 8}}, + {6, 1, 23, 36, 4, 4, 2, 2, {8, 8, 8, 8}}, + {8, 1, 30, 36, 4, 4, 2, 2, {8, 8, 8, 8}}, + // Polar Star + {1, 1, 8, 32, 6, 6, 2, 2, {8, 8, 8, 8}}, + {2, 1, 12, 32, 6, 6, 2, 2, {8, 8, 8, 8}}, + {4, 1, 16, 32, 6, 6, 2, 2, {8, 8, 8, 8}}, + // Fireball + {2, 2, 100, 8, 8, 16, 4, 2, {8, 8, 8, 8}}, + {3, 2, 100, 8, 4, 4, 4, 2, {8, 8, 8, 8}}, + {3, 2, 100, 8, 4, 4, 4, 2, {8, 8, 8, 8}}, + // Machine Gun + {2, 1, 20, 32, 2, 2, 2, 2, {8, 8, 8, 8}}, + {4, 1, 20, 32, 2, 2, 2, 2, {8, 8, 8, 8}}, + {6, 1, 20, 32, 2, 2, 2, 2, {8, 8, 8, 8}}, + // Missile Launcher + {0, 10, 50, 40, 2, 2, 2, 2, {8, 8, 8, 8}}, + {0, 10, 70, 40, 4, 4, 4, 4, {8, 8, 8, 8}}, + {0, 10, 90, 40, 4, 4, 0, 0, {8, 8, 8, 8}}, + // Missile Launcher explosion + {1, 100, 100, 20, 16, 16, 0, 0, {0, 0, 0, 0}}, + {1, 100, 100, 20, 16, 16, 0, 0, {0, 0, 0, 0}}, + {1, 100, 100, 20, 16, 16, 0, 0, {0, 0, 0, 0}}, + // Bubbler + {1, 1, 20, 8, 2, 2, 2, 2, {4, 4, 4, 4}}, + {2, 1, 20, 8, 2, 2, 2, 2, {4, 4, 4, 4}}, + {2, 1, 20, 8, 4, 4, 4, 4, {4, 4, 4, 4}}, + // Bubbler level 3 thorns + {3, 1, 32, 32, 2, 2, 2, 2, {4, 4, 4, 4}}, + // Blade slashes + {0, 100, 0, 36, 8, 8, 8, 8, {12, 12, 12, 12}}, + // Falling spike that deals 127 damage + {127, 1, 2, 4, 8, 4, 8, 4, {0, 0, 0, 0}}, + // Blade + {15, 1, 30, 36, 8, 8, 4, 2, {8, 8, 8, 8}}, + {6, 3, 18, 36, 10, 10, 4, 2, {12, 12, 12, 12}}, + {1, 100, 30, 36, 6, 6, 4, 4, {12, 12, 12, 12}}, + // Super Missile Launcher + {0, 10, 30, 40, 2, 2, 2, 2, {8, 8, 8, 8}}, + {0, 10, 40, 40, 4, 4, 4, 4, {8, 8, 8, 8}}, + {0, 10, 40, 40, 4, 4, 0, 0, {8, 8, 8, 8}}, + // Super Missile Launcher explosion + {2, 100, 100, 20, 12, 12, 0, 0, {0, 0, 0, 0}}, + {2, 100, 100, 20, 12, 12, 0, 0, {0, 0, 0, 0}}, + {2, 100, 100, 20, 12, 12, 0, 0, {0, 0, 0, 0}}, + // Nemesis + {4, 4, 20, 32, 4, 4, 3, 3, {8, 8, 24, 8}}, + {4, 2, 20, 32, 2, 2, 2, 2, {8, 8, 24, 8}}, + {1, 1, 20, 32, 2, 2, 2, 2, {8, 8, 24, 8}}, + // Spur + {4, 4, 30, 64, 6, 6, 3, 3, {8, 8, 8, 8}}, + {8, 8, 30, 64, 6, 6, 3, 3, {8, 8, 8, 8}}, + {12, 12, 30, 64, 6, 6, 3, 3, {8, 8, 8, 8}}, + // Spur trail + {3, 100, 30, 32, 6, 6, 3, 3, {4, 4, 4, 4}}, + {6, 100, 30, 32, 6, 6, 3, 3, {4, 4, 4, 4}}, + {11, 100, 30, 32, 6, 6, 3, 3, {4, 4, 4, 4}}, + // Curly's Nemesis + {4, 4, 20, 32, 4, 4, 3, 3, {8, 8, 24, 8}}, + // Screen-nuke that kills all enemies + {0, 4, 4, 4, 0, 0, 0, 0, {0, 0, 0, 0}}, + // Whimsical Star + {1, 1, 1, 36, 1, 1, 1, 1, {1, 1, 1, 1}} +}; + +void SetBullet(int no, int x, int y, int dir) +{ + int i = 0; + while (i < BULLET_MAX && gBul[i].cond & 0x80) + ++i; + + if (i >= BULLET_MAX) + return; + + memset(&gBul[i], 0, sizeof(BULLET)); + gBul[i].code_bullet = no; + gBul[i].cond = 0x80; + gBul[i].direct = dir; + gBul[i].damage = gBulTbl[no].damage; + gBul[i].life = gBulTbl[no].life; + gBul[i].life_count = gBulTbl[no].life_count; + gBul[i].bbits = gBulTbl[no].bbits; + gBul[i].enemyXL = gBulTbl[no].enemyXL * 0x200; + gBul[i].enemyYL = gBulTbl[no].enemyYL * 0x200; + gBul[i].blockXL = gBulTbl[no].blockXL * 0x200; + gBul[i].blockYL = gBulTbl[no].blockYL * 0x200; + gBul[i].view.back = gBulTbl[no].view.back * 0x200; + gBul[i].view.front = gBulTbl[no].view.front * 0x200; + gBul[i].view.top = gBulTbl[no].view.top * 0x200; + gBul[i].view.bottom = gBulTbl[no].view.bottom * 0x200; + gBul[i].x = x; + gBul[i].y = y; +} + +void ActBullet_Frontia1(BULLET *bul) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + if (bul->act_no == 0) + { + bul->ani_no = Random(0, 2); + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x600; + break; + case DIR_UP: + bul->ym = -0x600; + break; + case DIR_RIGHT: + bul->xm = 0x600; + break; + case DIR_DOWN: + bul->ym = 0x600; + break; + } + } + else + { + bul->x += bul->xm; + bul->y += bul->ym; + } + + if (++bul->ani_wait > 0) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 3) + bul->ani_no = 0; + + RECT rcLeft[4] = { + {136, 80, 152, 80}, + {120, 80, 136, 96}, + {136, 64, 152, 80}, + {120, 64, 136, 80}, + }; + + RECT rcRight[4] = { + {120, 64, 136, 80}, + {136, 64, 152, 80}, + {120, 80, 136, 96}, + {136, 80, 152, 80}, + }; + + if (bul->direct == DIR_LEFT) + bul->rect = rcLeft[bul->ani_no]; + else + bul->rect = rcRight[bul->ani_no]; +} + +void ActBullet_Frontia2(BULLET *bul, int level) +{ + static unsigned int inc; + + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + if (bul->act_no == 0) + { + bul->ani_no = Random(0, 2); + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x200; + break; + case DIR_UP: + bul->ym = -0x200; + break; + case DIR_RIGHT: + bul->xm = 0x200; + break; + case DIR_DOWN: + bul->ym = 0x200; + break; + } + + ++inc; + + switch (bul->direct) + { + case DIR_LEFT: + case DIR_RIGHT: + if (inc % 2) + bul->ym = 0x400; + else + bul->ym = -0x400; + + break; + + case DIR_UP: + case DIR_DOWN: + if (inc % 2) + bul->xm = 0x400; + else + bul->xm = -0x400; + + break; + } + } + else + { + switch (bul->direct) + { + case DIR_LEFT: + bul->xm -= 0x80; + break; + case DIR_UP: + bul->ym -= 0x80; + break; + case DIR_RIGHT: + bul->xm += 0x80; + break; + case DIR_DOWN: + bul->ym += 0x80; + break; + } + + switch (bul->direct) + { + case DIR_LEFT: + case DIR_RIGHT: + if (bul->count1 % 5 == 2) + { + if (bul->ym < 0) + bul->ym = 0x400; + else + bul->ym = -0x400; + } + + break; + + case DIR_UP: + case DIR_DOWN: + if (bul->count1 % 5 == 2) + { + if (bul->xm < 0) + bul->xm = 0x400; + else + bul->xm = -0x400; + } + + break; + } + + bul->x += bul->xm; + bul->y += bul->ym; + } + + if (++bul->ani_wait > 0) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 2) + bul->ani_no = 0; + + RECT rect[3] = { + {192, 16, 208, 32}, + {208, 16, 224, 32}, + {224, 16, 240, 32}, + }; + + bul->rect = rect[bul->ani_no]; + + if (level == 2) + SetNpChar(129, bul->x, bul->y, 0, -0x200, bul->ani_no, NULL, 0x100); + else + SetNpChar(129, bul->x, bul->y, 0, -0x200, bul->ani_no + 3, NULL, 0x100); +} + +void ActBullet_PoleStar(BULLET *bul, int level) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + if (bul->act_no == 0) + { + bul->act_no = 1; + + // Set speed + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x1000; + break; + case DIR_UP: + bul->ym = -0x1000; + break; + case DIR_RIGHT: + bul->xm = 0x1000; + break; + case DIR_DOWN: + bul->ym = 0x1000; + break; + } + + // Set hitbox + switch (level) + { + case 1: + switch (bul->direct) + { + case DIR_LEFT: + bul->enemyYL = 0x400; + break; + case DIR_UP: + bul->enemyXL = 0x400; + break; + case DIR_RIGHT: + bul->enemyYL = 0x400; + break; + case DIR_DOWN: + bul->enemyXL = 0x400; + break; + } + break; + case 2: + switch (bul->direct) + { + case DIR_LEFT: + bul->enemyYL = 0x800; + break; + case DIR_UP: + bul->enemyXL = 0x800; + break; + case DIR_RIGHT: + bul->enemyYL = 0x800; + break; + case DIR_DOWN: + bul->enemyXL = 0x800; + break; + } + break; + } + } + else + { + // Move + bul->x += bul->xm; + bul->y += bul->ym; + } + + RECT rect1[2] = { + {128, 32, 144, 48}, + {144, 32, 160, 48}, + }; + + RECT rect2[2] = { + {160, 32, 176, 48}, + {176, 32, 192, 48}, + }; + + RECT rect3[2] = { + {128, 48, 144, 64}, + {144, 48, 160, 64}, + }; + + //Set framerect + switch (level) + { + case 1: + if (bul->direct == DIR_UP || bul->direct == DIR_DOWN) + bul->rect = rect1[1]; + else + bul->rect = rect1[0]; + + break; + + case 2: + if (bul->direct == DIR_UP || bul->direct == DIR_DOWN) + bul->rect = rect2[1]; + else + bul->rect = rect2[0]; + + break; + + case 3: + if (bul->direct == DIR_UP || bul->direct == DIR_DOWN) + bul->rect = rect3[1]; + else + bul->rect = rect3[0]; + + break; + } +} + +void ActBullet_FireBall(BULLET *bul, int level) +{ + BOOL bBreak; + + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + bBreak = FALSE; + if (bul->flag & 2 && bul->flag & 8) + bBreak = TRUE; + if (bul->flag & 1 && bul->flag & 4) + bBreak = TRUE; + + if (bul->direct == DIR_LEFT && bul->flag & 1) + bul->direct = DIR_RIGHT; + if (bul->direct == DIR_RIGHT && bul->flag & 4) + bul->direct = DIR_LEFT; + + if (bBreak) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + PlaySoundObject(28, SOUND_MODE_PLAY); + return; + } + + if (bul->act_no == 0) + { + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x400; + break; + + case DIR_UP: + bul->xm = gMC.xm; + + if (gMC.xm < 0) + bul->direct = DIR_LEFT; + else + bul->direct = DIR_RIGHT; + + if (gMC.direct == DIR_LEFT) + bul->xm -= 0x80; + else + bul->xm += 0x80; + + bul->ym = -0x5FF; + break; + + case DIR_RIGHT: + bul->xm = 0x400; + break; + + case DIR_DOWN: + bul->xm = gMC.xm; + + if (gMC.xm < 0) + bul->direct = DIR_LEFT; + else + bul->direct = DIR_RIGHT; + + bul->ym = 0x5FF; + + break; + } + } + else + { + if (bul->flag & 8) + bul->ym = -0x400; + else if (bul->flag & 1) + bul->xm = 0x400; + else if (bul->flag & 4) + bul->xm = -0x400; + + bul->ym += 85; + if (bul->ym > 0x3FF) + bul->ym = 0x3FF; + + bul->x += bul->xm; + bul->y += bul->ym; + + if (bul->flag & 0xD) + PlaySoundObject(34, SOUND_MODE_PLAY); + } + + RECT rect_left1[4] = { + {128, 0, 144, 16}, + {144, 0, 160, 16}, + {160, 0, 176, 16}, + {176, 0, 192, 16}, + }; + + RECT rect_right1[4] = { + {128, 16, 144, 32}, + {144, 16, 160, 32}, + {160, 16, 176, 32}, + {176, 16, 192, 32}, + }; + + RECT rect_left2[3] = { + {192, 16, 208, 32}, + {208, 16, 224, 32}, + {224, 16, 240, 32}, + }; + + RECT rect_right2[3] = { + {224, 16, 240, 32}, + {208, 16, 224, 32}, + {192, 16, 208, 32}, + }; + + ++bul->ani_no; + + if (level == 1) + { + if (bul->ani_no > 3) + bul->ani_no = 0; + + if (bul->direct == DIR_LEFT) + bul->rect = rect_left1[bul->ani_no]; + else + bul->rect = rect_right1[bul->ani_no]; + } + else + { + if (bul->ani_no > 2) + bul->ani_no = 0; + + if (bul->direct == DIR_LEFT) + bul->rect = rect_left2[bul->ani_no]; + else + bul->rect = rect_right2[bul->ani_no]; + + if (level == 2) + SetNpChar(129, bul->x, bul->y, 0, -0x200, bul->ani_no, NULL, 0x100); + else + SetNpChar(129, bul->x, bul->y, 0, -0x200, bul->ani_no + 3, NULL, 0x100); + } +} + +void ActBullet_MachineGun(BULLET *bul, int level) +{ + int move; + + RECT rect1[4] = { + {64, 0, 80, 16}, + {80, 0, 96, 16}, + {96, 0, 112, 16}, + {112, 0, 128, 16}, + }; + + RECT rect2[4] = { + {64, 16, 80, 32}, + {80, 16, 96, 32}, + {96, 16, 112, 32}, + {112, 16, 128, 32}, + }; + + RECT rect3[4] = { + {64, 32, 80, 48}, + {80, 32, 96, 48}, + {96, 32, 112, 48}, + {112, 32, 128, 48}, + }; + + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + if (bul->act_no == 0) + { + switch (level) + { + case 1: + move = 0x1000; + break; + case 2: + move = 0x1000; + break; + case 3: + move = 0x1000; + break; + } + + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -move; + bul->ym = Random(-0xAA, 0xAA); + break; + case DIR_UP: + bul->ym = -move; + bul->xm = Random(-0xAA, 0xAA); + break; + case DIR_RIGHT: + bul->xm = move; + bul->ym = Random(-0xAA, 0xAA); + break; + case DIR_DOWN: + bul->ym = move; + bul->xm = Random(-0xAA, 0xAA); + break; + } + } + else + { + bul->x += bul->xm; + bul->y += bul->ym; + + switch (level) + { + case 1: + bul->rect = rect1[bul->direct]; + break; + + case 2: + bul->rect = rect2[bul->direct]; + + if (bul->direct == DIR_UP || bul->direct == DIR_DOWN) + SetNpChar(127, bul->x, bul->y, 0, 0, DIR_UP, NULL, 0x100); + else + SetNpChar(127, bul->x, bul->y, 0, 0, DIR_LEFT, NULL, 0x100); + + break; + + case 3: + bul->rect = rect3[bul->direct]; + SetNpChar(128, bul->x, bul->y, 0, 0, bul->direct, NULL, 0x100); + break; + } + } +} + +void ActBullet_Missile(BULLET *bul, int level) +{ + BOOL bHit; + + static unsigned int inc; + + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + bHit = FALSE; + + if (bul->life != 10) + bHit = TRUE; + if (bul->direct == DIR_LEFT && bul->flag & 1) + bHit = TRUE; + if (bul->direct == DIR_RIGHT && bul->flag & 4) + bHit = TRUE; + if (bul->direct == DIR_UP && bul->flag & 2) + bHit = TRUE; + if (bul->direct == DIR_DOWN && bul->flag & 8) + bHit = TRUE; + if (bul->direct == DIR_LEFT && bul->flag & 0x80) + bHit = TRUE; + if (bul->direct == DIR_LEFT && bul->flag & 0x20) + bHit = TRUE; + if (bul->direct == DIR_RIGHT && bul->flag & 0x40) + bHit = TRUE; + if (bul->direct == DIR_RIGHT && bul->flag & 0x10) + bHit = TRUE; + + if (bHit) + { + SetBullet(level + 15, bul->x, bul->y, DIR_LEFT); + bul->cond = 0; + } + + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + case DIR_RIGHT: + bul->tgt_y = bul->y; + break; + case DIR_UP: + case DIR_DOWN: + bul->tgt_x = bul->x; + break; + } + + if (level == 3) + { + switch (bul->direct) + { + case DIR_LEFT: + case DIR_RIGHT: + if (bul->y > gMC.y) + bul->ym = 0x100; + else + bul->ym = -0x100; + + bul->xm = Random(-0x200, 0x200); + break; + + case DIR_UP: + case DIR_DOWN: + if (bul->x > gMC.x) + bul->xm = 0x100; + else + bul->xm = -0x100; + + bul->ym = Random(-0x200, 0x200); + break; + } + + switch (++inc % 3) + { + case 0: + bul->ani_no = 0x80; + break; + case 1: + bul->ani_no = 0x40; + break; + case 2: + bul->ani_no = 0x33; + break; + } + } + else + { + bul->ani_no = 0x80; + } + // Fallthrough + case 1: + switch (bul->direct) + { + case DIR_LEFT: + bul->xm += -bul->ani_no; + break; + case DIR_UP: + bul->ym += -bul->ani_no; + break; + case DIR_RIGHT: + bul->xm += bul->ani_no; + break; + case DIR_DOWN: + bul->ym += bul->ani_no; + break; + } + + if (level == 3) + { + switch (bul->direct) + { + case DIR_LEFT: + case DIR_RIGHT: + if (bul->y < bul->tgt_y) + bul->ym += 0x20; + else + bul->ym -= 0x20; + + break; + + case DIR_UP: + case DIR_DOWN: + if (bul->x < bul->tgt_x) + bul->xm += 0x20; + else + bul->xm -= 0x20; + break; + } + } + + if (bul->xm < -0xA00) + bul->xm = -0xA00; + if (bul->xm > 0xA00) + bul->xm = 0xA00; + + if (bul->ym < -0xA00) + bul->ym = -0xA00; + if (bul->ym > 0xA00) + bul->ym = 0xA00; + + bul->x += bul->xm; + bul->y += bul->ym; + + break; + } + + if (++bul->count2 > 2) + { + bul->count2 = 0; + + switch (bul->direct) + { + case DIR_LEFT: + SetCaret(bul->x + (8 * 0x200), bul->y, CARET_EXHAUST, DIR_RIGHT); + break; + case DIR_UP: + SetCaret(bul->x, bul->y + (8 * 0x200), CARET_EXHAUST, DIR_DOWN); + break; + case DIR_RIGHT: + SetCaret(bul->x - (8 * 0x200), bul->y, CARET_EXHAUST, DIR_LEFT); + break; + case DIR_DOWN: + SetCaret(bul->x, bul->y - (8 * 0x200), CARET_EXHAUST, DIR_UP); + break; + } + } + + RECT rect1[4] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + {32, 0, 48, 16}, + {48, 0, 64, 16}, + }; + + RECT rect2[4] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {32, 16, 48, 32}, + {48, 16, 64, 32}, + }; + + RECT rect3[4] = { + {0, 32, 16, 48}, + {16, 32, 32, 48}, + {32, 32, 48, 48}, + {48, 32, 64, 48}, + }; + + switch (level) + { + case 1: + bul->rect = rect1[bul->direct]; + break; + case 2: + bul->rect = rect2[bul->direct]; + break; + case 3: + bul->rect = rect3[bul->direct]; + break; + } +} + +void ActBullet_Bom(BULLET *bul, int level) +{ + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + + switch (level) + { + case 1: + bul->act_wait = 10; + break; + case 2: + bul->act_wait = 15; + break; + case 3: + bul->act_wait = 5; + break; + } + + PlaySoundObject(44, SOUND_MODE_PLAY); + // Fallthrough + case 1: + switch (level) + { + case 1: + if (bul->act_wait % 3 == 0) + SetDestroyNpCharUp(bul->x + (Random(-16, 16) * 0x200), bul->y + (Random(-16, 16) * 0x200), bul->enemyXL, 2); + break; + + case 2: + if (bul->act_wait % 3 == 0) + SetDestroyNpCharUp(bul->x + (Random(-32, 32) * 0x200), bul->y + (Random(-32, 32) * 0x200), bul->enemyXL, 2); + break; + + case 3: + if (bul->act_wait % 3 == 0) + SetDestroyNpCharUp(bul->x + (Random(-40, 40) * 0x200), bul->y + (Random(-40, 40) * 0x200), bul->enemyXL, 2); + break; + } + + if (--bul->act_wait < 0) + bul->cond = 0; + + break; + } +} + +void ActBullet_Bubblin1(BULLET *bul) +{ + if (bul->flag & 0x2FF) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + return; + } + + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x600; + break; + case DIR_RIGHT: + bul->xm = 0x600; + break; + case DIR_UP: + bul->ym = -0x600; + break; + case DIR_DOWN: + bul->ym = 0x600; + break; + } + + break; + } + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm += 0x2A; + break; + case DIR_RIGHT: + bul->xm -= 0x2A; + break; + case DIR_UP: + bul->ym += 0x2A; + break; + case DIR_DOWN: + bul->ym -= 0x2A; + break; + } + + bul->x += bul->xm; + bul->y += bul->ym; + + if (++bul->act_wait > 40) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_PROJECTILE_DISSIPATION_TINY, DIR_LEFT); + } + + RECT rect[4] = { + {192, 0, 200, 8}, + {200, 0, 208, 8}, + {208, 0, 216, 8}, + {216, 0, 224, 8}, + }; + + if (++bul->ani_wait > 3) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 3) + bul->ani_no = 3; + + bul->rect = rect[bul->ani_no]; +} + +void ActBullet_Bubblin2(BULLET *bul) +{ + BOOL bDelete = FALSE; + + if (bul->direct == DIR_LEFT && bul->flag & 1) + bDelete = TRUE; + if (bul->direct == DIR_RIGHT && bul->flag & 4) + bDelete = TRUE; + if (bul->direct == DIR_UP && bul->flag & 2) + bDelete = TRUE; + if (bul->direct == DIR_DOWN && bul->flag & 8) + bDelete = TRUE; + + if (bDelete) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + return; + } + + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x600; + bul->ym = Random(-0x100, 0x100); + break; + case DIR_RIGHT: + bul->xm = 0x600; + bul->ym = Random(-0x100, 0x100); + break; + case DIR_UP: + bul->ym = -0x600; + bul->xm = Random(-0x100, 0x100); + break; + case DIR_DOWN: + bul->ym = 0x600; + bul->xm = Random(-0x100, 0x100); + break; + } + + break; + } + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm += 0x10; + break; + case DIR_RIGHT: + bul->xm -= 0x10; + break; + case DIR_UP: + bul->ym += 0x10; + break; + case DIR_DOWN: + bul->ym -= 0x10; + break; + } + + bul->x += bul->xm; + bul->y += bul->ym; + + if (++bul->act_wait > 60) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_PROJECTILE_DISSIPATION_TINY, DIR_LEFT); + } + + RECT rect[4] = { + {192, 8, 200, 16}, + {200, 8, 208, 16}, + {208, 8, 216, 16}, + {216, 8, 224, 16}, + }; + + if (++bul->ani_wait > 3) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 3) + bul->ani_no = 3; + + bul->rect = rect[bul->ani_no]; +} + +void ActBullet_Bubblin3(BULLET *bul) +{ + if (++bul->act_wait > 100 || !(gKey & gKeyShot)) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + PlaySoundObject(100, SOUND_MODE_PLAY); + + if (gMC.up) + SetBullet(22, bul->x, bul->y, DIR_UP); + else if (gMC.down) + SetBullet(22, bul->x, bul->y, DIR_DOWN); + else + SetBullet(22, bul->x, bul->y, gMC.direct); + + return; + } + + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = Random(-0x400, -0x200); + bul->ym = (Random(-4, 4) * 0x200) / 2; + break; + case DIR_RIGHT: + bul->xm = Random(0x200, 0x400); + bul->ym = (Random(-4, 4) * 0x200) / 2; + break; + case DIR_UP: + bul->ym = Random(-0x400, -0x200); + bul->xm = (Random(-4, 4) * 0x200) / 2; + break; + case DIR_DOWN: + bul->ym = Random(0x80, 0x100); + bul->xm = (Random(-4, 4) * 0x200) / 2; + break; + } + + break; + } + + if (bul->x < gMC.x) + bul->xm += 0x20; + if (bul->x > gMC.x) + bul->xm -= 0x20; + + if (bul->y < gMC.y) + bul->ym += 0x20; + if (bul->y > gMC.y) + bul->ym -= 0x20; + + if (bul->xm < 0 && bul->flag & 1) + bul->xm = 0x400; + if (bul->xm > 0 && bul->flag & 4) + bul->xm = -0x400; + + if (bul->ym < 0 && bul->flag & 2) + bul->ym = 0x400; + if (bul->ym > 0 && bul->flag & 8) + bul->ym = -0x400; + + bul->x += bul->xm; + bul->y += bul->ym; + + RECT rect[4] = { + {240, 16, 248, 24}, + {248, 16, 256, 24}, + {240, 24, 248, 32}, + {248, 24, 256, 32}, + }; + + if (++bul->ani_wait > 3) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 3) + bul->ani_no = 3; + + bul->rect = rect[bul->ani_no]; +} + +void ActBullet_Spine(BULLET *bul) +{ + if (++bul->count1 > bul->life_count || bul->flag & 8) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + if (bul->act_no == 0) + { + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = (-Random(10, 16) * 0x200) / 2; + break; + case DIR_UP: + bul->ym = (-Random(10, 16) * 0x200) / 2; + break; + case DIR_RIGHT: + bul->xm = (Random(10, 16) * 0x200) / 2; + break; + case DIR_DOWN: + bul->ym = (Random(10, 16) * 0x200) / 2; + break; + } + } + else + { + bul->x += bul->xm; + bul->y += bul->ym; + } + + if (++bul->ani_wait > 1) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 1) + bul->ani_no = 0; + + RECT rcLeft[2] = { + {224, 0, 232, 8}, + {232, 0, 240, 8}, + }; + + RECT rcRight[2] = { + {224, 0, 232, 8}, + {232, 0, 240, 8}, + }; + + RECT rcDown[2] = { + {224, 8, 232, 16}, + {232, 8, 240, 16}, + }; + + switch (bul->direct) + { + case DIR_LEFT: + bul->rect = rcLeft[bul->ani_no]; + break; + case DIR_UP: + bul->rect = rcDown[bul->ani_no]; + break; + case DIR_RIGHT: + bul->rect = rcRight[bul->ani_no]; + break; + case DIR_DOWN: + bul->rect = rcDown[bul->ani_no]; + break; + } +} + +void ActBullet_Sword1(BULLET *bul) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + if (bul->count1 == 3) + bul->bbits &= ~4; + + if (bul->count1 % 5 == 1) + PlaySoundObject(34, SOUND_MODE_PLAY); + + if (bul->act_no == 0) + { + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x800; + break; + case DIR_UP: + bul->ym = -0x800; + break; + case DIR_RIGHT: + bul->xm = 0x800; + break; + case DIR_DOWN: + bul->ym = 0x800; + break; + } + } + else + { + bul->x += bul->xm; + bul->y += bul->ym; + } + + RECT rcLeft[4] = { + {0, 48, 16, 64}, + {16, 48, 32, 64}, + {32, 48, 48, 64}, + {48, 48, 64, 64}, + }; + + RECT rcRight[4] = { + {64, 48, 80, 64}, + {80, 48, 96, 64}, + {96, 48, 112, 64}, + {112, 48, 128, 64}, + }; + + if (++bul->ani_wait > 1) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 3) + bul->ani_no = 0; + + if (bul->direct == DIR_LEFT) + bul->rect = rcLeft[bul->ani_no]; + else + bul->rect = rcRight[bul->ani_no]; +} + +void ActBullet_Sword2(BULLET *bul) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + if (bul->count1 == 3) + bul->bbits &= ~4; + + if (bul->count1 % 7 == 1) + PlaySoundObject(106, SOUND_MODE_PLAY); + + if (bul->act_no == 0) + { + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x800; + break; + case DIR_UP: + bul->ym = -0x800; + break; + case DIR_RIGHT: + bul->xm = 0x800; + break; + case DIR_DOWN: + bul->ym = 0x800; + break; + } + } + else + { + bul->x += bul->xm; + bul->y += bul->ym; + } + + RECT rcLeft[4] = { + {160, 48, 184, 72}, + {184, 48, 208, 72}, + {208, 48, 232, 72}, + {232, 48, 256, 72}, + }; + + RECT rcRight[4] = { + {160, 72, 184, 96}, + {184, 72, 208, 96}, + {208, 72, 232, 96}, + {232, 72, 256, 96}, + }; + + if (++bul->ani_wait > 1) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->ani_no > 3) + bul->ani_no = 0; + + if (bul->direct == DIR_LEFT) + bul->rect = rcLeft[bul->ani_no]; + else + bul->rect = rcRight[bul->ani_no]; +} + +void ActBullet_Sword3(BULLET *bul) +{ + RECT rcLeft[2] = { + {272, 0, 296, 24}, + {296, 0, 320, 24}, + }; + + RECT rcUp[2] = { + {272, 48, 296, 72}, + {296, 0, 320, 24}, + }; + + RECT rcRight[2] = { + {272, 24, 296, 48}, + {296, 24, 320, 48}, + }; + + RECT rcDown[2] = { + {296, 48, 320, 72}, + {296, 24, 320, 48}, + }; + + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + bul->xm = 0; + bul->ym = 0; + // Fallthrough + case 1: + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x800; + break; + case DIR_UP: + bul->ym = -0x800; + break; + case DIR_RIGHT: + bul->xm = 0x800; + break; + case DIR_DOWN: + bul->ym = 0x800; + break; + } + + if (bul->life != 100) + { + bul->act_no = 2; + bul->ani_no = 1; + bul->damage = -1; + bul->act_wait = 0; + } + + if (++bul->act_wait % 4 == 1) + { + PlaySoundObject(106, SOUND_MODE_PLAY); + + if (++bul->count1 % 2) + SetBullet(23, bul->x, bul->y, DIR_LEFT); + else + SetBullet(23, bul->x, bul->y, DIR_RIGHT); + } + + if (++bul->count1 == 5) + bul->bbits &= ~4; + + if (bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + break; + + case 2: + bul->xm = 0; + bul->ym = 0; + ++bul->act_wait; + + if (Random(-1, 1) == 0) + { + PlaySoundObject(106, SOUND_MODE_PLAY); + + if (Random(0, 1) % 2) + SetBullet(23, bul->x + (Random(-0x40, 0x40) * 0x200), bul->y + (Random(-0x40, 0x40) * 0x200), DIR_LEFT); + else + SetBullet(23, bul->x + (Random(-0x40, 0x40) * 0x200), bul->y + (Random(-0x40, 0x40) * 0x200), DIR_RIGHT); + } + + if (bul->act_wait > 50) + bul->cond = 0; + } + + bul->x += bul->xm; + bul->y += bul->ym; + + switch (bul->direct) + { + case DIR_LEFT: + bul->rect = rcLeft[bul->ani_no]; + break; + case DIR_UP: + bul->rect = rcUp[bul->ani_no]; + break; + case DIR_RIGHT: + bul->rect = rcRight[bul->ani_no]; + break; + case DIR_DOWN: + bul->rect = rcDown[bul->ani_no]; + break; + } + + if (bul->act_wait % 2) + bul->rect.right = 0; +} + +void ActBullet_Edge(BULLET *bul) +{ + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + bul->y -= 12 * 0x200; + + if (bul->direct == DIR_LEFT) + bul->x += 16 * 0x200; + else + bul->x -= 16 * 0x200; + // Fallthrough + case 1: + if (++bul->ani_wait > 2) + { + bul->ani_wait = 0; + ++bul->ani_no; + } + + if (bul->direct == DIR_LEFT) + bul->x -= 2 * 0x200; + else + bul->x += 2 * 0x200; + + bul->y += 2 * 0x200; + + if (bul->ani_no == 1) + bul->damage = 2; + else + bul->damage = 1; + + if (bul->ani_no > 4) + { + bul->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rcLeft' and 'rcRight', even though it's now too high + #endif + } + + break; + } + + RECT rcLeft[5] = { + {0, 64, 24, 88}, + {24, 64, 48, 88}, + {48, 64, 72, 88}, + {72, 64, 96, 88}, + {96, 64, 120, 88}, + }; + + RECT rcRight[5] = { + {0, 88, 24, 112}, + {24, 88, 48, 112}, + {48, 88, 72, 112}, + {72, 88, 96, 112}, + {96, 88, 120, 112}, + }; + + if (bul->direct == DIR_LEFT) + bul->rect = rcLeft[bul->ani_no]; + else + bul->rect = rcRight[bul->ani_no]; +} + +void ActBullet_Drop(BULLET *bul) +{ + RECT rc = {0, 0, 0, 0}; + + if (++bul->act_wait > 2) + bul->cond = 0; + + bul->rect = rc; +} + +void ActBullet_SuperMissile(BULLET *bul, int level) +{ + BOOL bHit; + + static unsigned int inc; + + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + bHit = FALSE; + + if (bul->life != 10) + bHit = TRUE; + if (bul->direct == DIR_LEFT && bul->flag & 1) + bHit = TRUE; + if (bul->direct == DIR_RIGHT && bul->flag & 4) + bHit = TRUE; + if (bul->direct == DIR_UP && bul->flag & 2) + bHit = TRUE; + if (bul->direct == DIR_DOWN && bul->flag & 8) + bHit = TRUE; + if (bul->direct == DIR_LEFT && bul->flag & 0x80) + bHit = TRUE; + if (bul->direct == DIR_LEFT && bul->flag & 0x20) + bHit = TRUE; + if (bul->direct == DIR_RIGHT && bul->flag & 0x40) + bHit = TRUE; + if (bul->direct == DIR_RIGHT && bul->flag & 0x10) + bHit = TRUE; + + if (bHit) + { + SetBullet(level + 30, bul->x, bul->y, DIR_LEFT); + bul->cond = 0; + } + + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + case DIR_RIGHT: + bul->tgt_y = bul->y; + bul->enemyXL = 0x1000; + bul->blockXL = 0x1000; + break; + + case DIR_UP: + case DIR_DOWN: + bul->tgt_x = bul->x; + bul->enemyYL = 0x1000; + bul->blockYL = 0x1000; + break; + } + + if (level == 3) + { + switch (bul->direct) + { + case DIR_LEFT: + case DIR_RIGHT: + if (bul->y > gMC.y) + bul->ym = 0x100; + else + bul->ym = -0x100; + + bul->xm = Random(-0x200, 0x200); + break; + + case DIR_UP: + case DIR_DOWN: + if (bul->x > gMC.x) + bul->xm = 0x100; + else + bul->xm = -0x100; + + bul->ym = Random(-0x200, 0x200); + break; + } + + switch (++inc % 3) + { + case 0: + bul->ani_no = 0x200; + break; + case 1: + bul->ani_no = 0x100; + break; + case 2: + bul->ani_no = 0xAA; + break; + } + } + else + { + bul->ani_no = 0x200; + } + // Fallthrough + case 1: + switch (bul->direct) + { + case DIR_LEFT: + bul->xm += -bul->ani_no; + break; + case DIR_UP: + bul->ym += -bul->ani_no; + break; + case DIR_RIGHT: + bul->xm += bul->ani_no; + break; + case DIR_DOWN: + bul->ym += bul->ani_no; + break; + } + + if (level == 3) + { + switch (bul->direct) + { + case DIR_LEFT: + case DIR_RIGHT: + if (bul->y < bul->tgt_y) + bul->ym += 0x40; + else + bul->ym -= 0x40; + + break; + case DIR_UP: + case DIR_DOWN: + if (bul->x < bul->tgt_x) + bul->xm += 0x40; + else + bul->xm -= 0x40; + + break; + } + } + + if (bul->xm < -0x1400) + bul->xm = -0x1400; + if (bul->xm > 0x1400) + bul->xm = 0x1400; + + if (bul->ym < -0x1400) + bul->ym = -0x1400; + if (bul->ym > 0x1400) + bul->ym = 0x1400; + + bul->x += bul->xm; + bul->y += bul->ym; + + break; + } + + if (++bul->count2 > 2) + { + bul->count2 = 0; + + switch (bul->direct) + { + case DIR_LEFT: + SetCaret(bul->x + (8 * 0x200), bul->y, CARET_EXHAUST, DIR_RIGHT); + break; + case DIR_UP: + SetCaret(bul->x, bul->y + (8 * 0x200), CARET_EXHAUST, DIR_DOWN); + break; + case DIR_RIGHT: + SetCaret(bul->x - (8 * 0x200), bul->y, CARET_EXHAUST, DIR_LEFT); + break; + case DIR_DOWN: + SetCaret(bul->x, bul->y - (8 * 0x200), CARET_EXHAUST, DIR_UP); + break; + } + } + + RECT rect1[4] = { + {120, 96, 136, 112}, + {136, 96, 152, 112}, + {152, 96, 168, 112}, + {168, 96, 184, 112}, + }; + + RECT rect2[4] = { + {184, 96, 200, 112}, + {200, 96, 216, 112}, + {216, 96, 232, 112}, + {232, 96, 248, 112}, + }; + + switch (level) + { + case 1: + bul->rect = rect1[bul->direct]; + break; + case 2: + bul->rect = rect2[bul->direct]; + break; + case 3: + bul->rect = rect1[bul->direct]; + break; + } +} + +void ActBullet_SuperBom(BULLET *bul, int level) +{ + switch (bul->act_no) + { + case 0: + bul->act_no = 1; + + switch (level) + { + case 1: + bul->act_wait = 10; + break; + case 2: + bul->act_wait = 14; + break; + case 3: + bul->act_wait = 6; + break; + } + + PlaySoundObject(44, SOUND_MODE_PLAY); + // Fallthrough + case 1: + switch (level) + { + case 1: + if (bul->act_wait % 3 == 0) + SetDestroyNpCharUp(bul->x + (Random(-16, 16) * 0x200), bul->y + (Random(-16, 16) * 0x200), bul->enemyXL, 2); + break; + case 2: + if (bul->act_wait % 3 == 0) + SetDestroyNpCharUp(bul->x + (Random(-32, 32) * 0x200), bul->y + (Random(-32, 32) * 0x200), bul->enemyXL, 2); + break; + case 3: + if (bul->act_wait % 3 == 0) + SetDestroyNpCharUp(bul->x + (Random(-40, 40) * 0x200), bul->y + (Random(-40, 40) * 0x200), bul->enemyXL, 2); + break; + } + + if (--bul->act_wait < 0) + bul->cond = 0; + + break; + } +} + +void ActBullet_Nemesis(BULLET *bul, int level) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + if (bul->act_no == 0) + { + bul->act_no = 1; + bul->count1 = 0; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x1000; + break; + case DIR_UP: + bul->ym = -0x1000; + break; + case DIR_RIGHT: + bul->xm = 0x1000; + break; + case DIR_DOWN: + bul->ym = 0x1000; + break; + } + + switch (level) + { + case 3: + bul->xm /= 3; + bul->ym /= 3; + break; + } + } + else + { + if (level == 1 && bul->count1 % 4 == 1) + { + switch (bul->direct) + { + case DIR_LEFT: + SetNpChar(4, bul->x, bul->y, -0x200, Random(-0x200, 0x200), DIR_RIGHT, NULL, 0x100); + break; + case DIR_UP: + SetNpChar(4, bul->x, bul->y, Random(-0x200, 0x200), -0x200, DIR_RIGHT, NULL, 0x100); + break; + case DIR_RIGHT: + SetNpChar(4, bul->x, bul->y, 0x200, Random(-0x200, 0x200), DIR_RIGHT, NULL, 0x100); + break; + case DIR_DOWN: + SetNpChar(4, bul->x, bul->y, Random(-0x200, 0x200), 0x200, DIR_RIGHT, NULL, 0x100); + break; + } + } + + bul->x += bul->xm; + bul->y += bul->ym; + } + + if (++bul->ani_no > 1) + bul->ani_no = 0; + + RECT rcL[2] = { + {0, 112, 32, 128}, + {0, 128, 32, 144}, + }; + + RECT rcU[2] = { + {32, 112, 48, 144}, + {48, 112, 64, 144}, + }; + + RECT rcR[2] = { + {64, 112, 96, 128}, + {64, 128, 96, 144}, + }; + + RECT rcD[2] = { + {96, 112, 112, 144}, + {112, 112, 128, 144}, + }; + + switch (bul->direct) + { + case DIR_LEFT: + bul->rect = rcL[bul->ani_no]; + break; + case DIR_UP: + bul->rect = rcU[bul->ani_no]; + break; + case DIR_RIGHT: + bul->rect = rcR[bul->ani_no]; + break; + case DIR_DOWN: + bul->rect = rcD[bul->ani_no]; + break; + } + + bul->rect.top += ((level - 1) / 2) * 32; + bul->rect.bottom += ((level - 1) / 2) * 32; + bul->rect.left += ((level - 1) % 2) * 128; + bul->rect.right += ((level - 1) % 2) * 128; +} + +void ActBullet_Spur(BULLET *bul, int level) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + SetCaret(bul->x, bul->y, CARET_SHOOT, DIR_LEFT); + return; + } + + if (bul->damage && bul->life != 100) + bul->damage = 0; + + if (bul->act_no == 0) + { + bul->act_no = 1; + + switch (bul->direct) + { + case DIR_LEFT: + bul->xm = -0x1000; + break; + case DIR_UP: + bul->ym = -0x1000; + break; + case DIR_RIGHT: + bul->xm = 0x1000; + break; + case DIR_DOWN: + bul->ym = 0x1000; + break; + } + + switch (level) + { + case 1: + switch (bul->direct) + { + case DIR_LEFT: + bul->enemyYL = 0x400; + break; + case DIR_UP: + bul->enemyXL = 0x400; + break; + case DIR_RIGHT: + bul->enemyYL = 0x400; + break; + case DIR_DOWN: + bul->enemyXL = 0x400; + break; + } + + break; + + case 2: + switch (bul->direct) + { + case DIR_LEFT: + bul->enemyYL = 0x800; + break; + case DIR_UP: + bul->enemyXL = 0x800; + break; + case DIR_RIGHT: + bul->enemyYL = 0x800; + break; + case DIR_DOWN: + bul->enemyXL = 0x800; + break; + } + + break; + } + } + else + { + bul->x += bul->xm; + bul->y += bul->ym; + } + + RECT rect1[2] = { + {128, 32, 144, 48}, + {144, 32, 160, 48}, + }; + + RECT rect2[2] = { + {160, 32, 176, 48}, + {176, 32, 192, 48}, + }; + + RECT rect3[2] = { + {128, 48, 144, 64}, + {144, 48, 160, 64}, + }; + + bul->damage = bul->life; + + switch (level) + { + case 1: + if (bul->direct == DIR_UP || bul->direct == DIR_DOWN) + bul->rect = rect1[1]; + else + bul->rect = rect1[0]; + + break; + + case 2: + if (bul->direct == DIR_UP || bul->direct == DIR_DOWN) + bul->rect = rect2[1]; + else + bul->rect = rect2[0]; + + break; + + case 3: + if (bul->direct == DIR_UP || bul->direct == DIR_DOWN) + bul->rect = rect3[1]; + else + bul->rect = rect3[0]; + + break; + } + + SetBullet(39 + level, bul->x, bul->y, bul->direct); +} + +void ActBullet_SpurTail(BULLET *bul, int level) +{ + if (++bul->count1 > 20) + bul->ani_no = bul->count1 - 20; + + if (bul->ani_no > 2) + { + bul->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // Avoid accessing the RECT arrays with an out-of-bounds index + #endif + } + + if (bul->damage && bul->life != 100) + bul->damage = 0; + + RECT rc_h_lv1[3] = { + {192, 32, 200, 40}, + {200, 32, 208, 40}, + {208, 32, 216, 40}, + }; + + RECT rc_v_lv1[3] = { + {192, 40, 200, 48}, + {200, 40, 208, 48}, + {208, 40, 216, 48}, + }; + + RECT rc_h_lv2[3] = { + {216, 32, 224, 40}, + {224, 32, 232, 40}, + {232, 32, 240, 40}, + }; + + RECT rc_v_lv2[3] = { + {216, 40, 224, 48}, + {224, 40, 232, 48}, + {232, 40, 240, 48}, + }; + + RECT rc_h_lv3[3] = { + {240, 32, 248, 40}, + {248, 32, 256, 40}, + {256, 32, 264, 40}, + }; + + RECT rc_v_lv3[3] = { + {240, 32, 248, 40}, + {248, 32, 256, 40}, + {256, 32, 264, 40}, + }; + + switch (level) + { + case 1: + if (bul->direct == DIR_LEFT || bul->direct == DIR_RIGHT) + bul->rect = rc_h_lv1[bul->ani_no]; + else + bul->rect = rc_v_lv1[bul->ani_no]; + + break; + + case 2: + if (bul->direct == DIR_LEFT || bul->direct == DIR_RIGHT) + bul->rect = rc_h_lv2[bul->ani_no]; + else + bul->rect = rc_v_lv2[bul->ani_no]; + + break; + + case 3: + if (bul->direct == DIR_LEFT || bul->direct == DIR_RIGHT) + bul->rect = rc_h_lv3[bul->ani_no]; + else + bul->rect = rc_v_lv3[bul->ani_no]; + + break; + } +} + +void ActBullet_EnemyClear(BULLET *bul) +{ + if (++bul->count1 > bul->life_count) + { + bul->cond = 0; + return; + } + + bul->damage = 10000; + bul->enemyXL = 0xC8000; + bul->enemyYL = 0xC8000; +} + +void ActBullet_Star(BULLET *bul) +{ + if (++bul->count1 > bul->life_count) + bul->cond = 0; +} + +void ActBullet(void) +{ + int i; + + for (i = 0; i < BULLET_MAX; ++i) + { + if (gBul[i].cond & 0x80) + { + if (gBul[i].life < 1) + { + gBul[i].cond = 0; + continue; + } + + switch (gBul[i].code_bullet) + { + // Snake + case 1: + ActBullet_Frontia1(&gBul[i]); + break; + case 2: + ActBullet_Frontia2(&gBul[i], 2); + break; + case 3: + ActBullet_Frontia2(&gBul[i], 3); + break; + + // Polar Star + case 4: + ActBullet_PoleStar(&gBul[i], 1); + break; + case 5: + ActBullet_PoleStar(&gBul[i], 2); + break; + case 6: + ActBullet_PoleStar(&gBul[i], 3); + break; + + // Fireball + case 7: + ActBullet_FireBall(&gBul[i], 1); + break; + case 8: + ActBullet_FireBall(&gBul[i], 2); + break; + case 9: + ActBullet_FireBall(&gBul[i], 3); + break; + + // Machine Gun + case 10: + ActBullet_MachineGun(&gBul[i], 1); + break; + case 11: + ActBullet_MachineGun(&gBul[i], 2); + break; + case 12: + ActBullet_MachineGun(&gBul[i], 3); + break; + + // Missile Launcher + case 13: + ActBullet_Missile(&gBul[i], 1); + break; + case 14: + ActBullet_Missile(&gBul[i], 2); + break; + case 15: + ActBullet_Missile(&gBul[i], 3); + break; + + // Missile Launcher explosion + case 16: + ActBullet_Bom(&gBul[i], 1); + break; + case 17: + ActBullet_Bom(&gBul[i], 2); + break; + case 18: + ActBullet_Bom(&gBul[i], 3); + break; + + // Bubbler + case 19: + ActBullet_Bubblin1(&gBul[i]); + break; + case 20: + ActBullet_Bubblin2(&gBul[i]); + break; + case 21: + ActBullet_Bubblin3(&gBul[i]); + break; + + // Bubbler level 3 spines + case 22: + ActBullet_Spine(&gBul[i]); + break; + + // Blade slashes + case 23: + ActBullet_Edge(&gBul[i]); + break; + + // Falling spike that deals 127 damage + case 24: + ActBullet_Drop(&gBul[i]); + break; + + // Blade + case 25: + ActBullet_Sword1(&gBul[i]); + break; + case 26: + ActBullet_Sword2(&gBul[i]); + break; + case 27: + ActBullet_Sword3(&gBul[i]); + break; + + // Super Missile Launcher + case 28: + ActBullet_SuperMissile(&gBul[i], 1); + break; + case 29: + ActBullet_SuperMissile(&gBul[i], 2); + break; + case 30: + ActBullet_SuperMissile(&gBul[i], 3); + break; + + // Super Missile Launcher explosion + case 31: + ActBullet_SuperBom(&gBul[i], 1); + break; + case 32: + ActBullet_SuperBom(&gBul[i], 2); + break; + case 33: + ActBullet_SuperBom(&gBul[i], 3); + break; + + // Nemesis + case 34: // Identical to case 43 + ActBullet_Nemesis(&gBul[i], 1); + break; + case 35: + ActBullet_Nemesis(&gBul[i], 2); + break; + case 36: + ActBullet_Nemesis(&gBul[i], 3); + break; + + // Spur + case 37: + ActBullet_Spur(&gBul[i], 1); + break; + case 38: + ActBullet_Spur(&gBul[i], 2); + break; + case 39: + ActBullet_Spur(&gBul[i], 3); + break; + + // Spur trail + case 40: + ActBullet_SpurTail(&gBul[i], 1); + break; + case 41: + ActBullet_SpurTail(&gBul[i], 2); + break; + case 42: + ActBullet_SpurTail(&gBul[i], 3); + break; + + // Curly's Nemesis + case 43: // Identical to case 34 + ActBullet_Nemesis(&gBul[i], 1); + break; + + // Screen-nuke that kills all enemies + case 44: + ActBullet_EnemyClear(&gBul[i]); + break; + + // Whimsical Star + case 45: + ActBullet_Star(&gBul[i]); + break; + } + } + } +} + +BOOL IsActiveSomeBullet(void) +{ + int i; + + for (i = 0; i < BULLET_MAX; ++i) + { + if (gBul[i].cond & 0x80) + { + switch (gBul[i].code_bullet) + { + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 23: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + case 32: + case 33: + return TRUE; + } + } + } + + return FALSE; +} diff --git a/src/Bullet.h b/src/Bullet.h new file mode 100644 index 0000000..9f6151e --- /dev/null +++ b/src/Bullet.h @@ -0,0 +1,69 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" + +#define BULLET_MAX 0x40 + +typedef struct BULLET +{ + int flag; + int code_bullet; + int bbits; + int cond; + int x; + int y; + int xm; + int ym; + int tgt_x; + int tgt_y; + int act_no; + int act_wait; + int ani_wait; + int ani_no; + unsigned char direct; + RECT rect; + int count1; + int count2; + int life_count; + int damage; + int life; + int enemyXL; + int enemyYL; + int blockXL; + int blockYL; + OTHER_RECT view; +} BULLET; + +typedef struct BULLET_TABLE +{ + signed char damage; + signed char life; + int life_count; + int bbits; + int enemyXL; + int enemyYL; + int blockXL; + int blockYL; + OTHER_RECT view; +} BULLET_TABLE; + +extern BULLET gBul[BULLET_MAX]; + +void InitBullet(void); +int CountArmsBullet(int arms_code); +int CountBulletNum(int bullet_code); +void DeleteBullet(int code); +void ClearBullet(void); +void PutBullet(int fx, int fy); +void SetBullet(int no, int x, int y, int dir); +void ActBullet(void); +BOOL IsActiveSomeBullet(void); diff --git a/src/Caret.cpp b/src/Caret.cpp new file mode 100644 index 0000000..1cad98e --- /dev/null +++ b/src/Caret.cpp @@ -0,0 +1,685 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Caret.h" + +#include + +#include "WindowsWrapper.h" +#include "CommonDefines.h" + +#include "CommonDefines.h" +#include "Draw.h" +#include "Game.h" +#include "Triangle.h" + +#define CARET_MAX 0x40 + +struct CARET +{ + int cond; + int code; + int direct; + int x; + int y; + int xm; + int ym; + int act_no; + int act_wait; + int ani_no; + int ani_wait; + int view_left; + int view_top; + RECT rect; +}; + +struct CARET_TABLE +{ + int view_left; + int view_top; +}; + +CARET gCrt[CARET_MAX]; + +// Sprite offsets +CARET_TABLE gCaretTable[] = { + {0, 0}, // CARET_NULL + { 4 * 0x200, 4 * 0x200}, // CARET_BUBBLE + { 8 * 0x200, 8 * 0x200}, // CARET_PROJECTILE_DISSIPATION + { 8 * 0x200, 8 * 0x200}, // CARET_SHOOT + { 8 * 0x200, 8 * 0x200}, // CARET_SNAKE_AFTERIMAGE + { 4 * 0x200, 4 * 0x200}, // CARET_ZZZ + { 8 * 0x200, 8 * 0x200}, // CARET_SNAKE_AFTERIMAGE_DUPLICATE + { 4 * 0x200, 4 * 0x200}, // CARET_EXHAUST + { 8 * 0x200, 8 * 0x200}, // CARET_DROWNED_QUOTE + { 8 * 0x200, 8 * 0x200}, // CARET_QUESTION_MARK + {28 * 0x200, 8 * 0x200}, // CARET_LEVEL_UP + { 4 * 0x200, 4 * 0x200}, // CARET_HURT_PARTICLES + {16 * 0x200, 16 * 0x200}, // CARET_EXPLOSION + { 4 * 0x200, 4 * 0x200}, // CARET_TINY_PARTICLES + {20 * 0x200, 20 * 0x200}, // CARET_UNKNOWN + { 4 * 0x200, 4 * 0x200}, // CARET_PROJECTILE_DISSIPATION_TINY + {20 * 0x200, 4 * 0x200}, // CARET_EMPTY + {52 * 0x200, 4 * 0x200} // CARET_PUSH_JUMP_KEY +}; + +void InitCaret(void) +{ + memset(gCrt, 0, sizeof(gCrt)); +} + +// Null +void ActCaret00(CARET *crt) +{ + (void)crt; +} + +// Bubble +void ActCaret01(CARET *crt) +{ + RECT rcLeft[4] = { + { 0, 64, 8, 72}, + { 8, 64, 16, 72}, + {16, 64, 24, 72}, + {24, 64, 32, 72}, + }; + + RECT rcRight[4] = { + {64, 24, 72, 32}, + {72, 24, 80, 32}, + {80, 24, 88, 32}, + {88, 24, 96, 32}, + }; + + if (crt->act_no == 0) + { + crt->act_no = 1; + crt->xm = Random(-0x400, 0x400); + crt->ym = Random(-0x400, 0); + } + + crt->ym += 0x40; + crt->x += crt->xm; + crt->y += crt->ym; + + if (++crt->ani_wait > 5) + { + crt->ani_wait = 0; + + if (++crt->ani_no > 3) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rcLeft' and 'rcRight', even though it's now too high + #endif + } + } + + if (crt->direct == DIR_LEFT) + crt->rect = rcLeft[crt->ani_no]; + else + crt->rect = rcRight[crt->ani_no]; +} + +// Projectile dissipation +void ActCaret02(CARET *crt) +{ + RECT rect_left[4] = { + { 0, 32, 16, 48}, + {16, 32, 32, 48}, + {32, 32, 48, 48}, + {48, 32, 64, 48}, + }; + + RECT rect_right[4] = { + {176, 0, 192, 16}, + {192, 0, 208, 16}, + {208, 0, 224, 16}, + {224, 0, 240, 16}, + }; + + RECT rect_up[3] = { + { 0, 32, 16, 48}, + {32, 32, 48, 48}, + {16, 32, 32, 48}, + }; + + switch (crt->direct) + { + case DIR_LEFT: + crt->ym -= 0x10; + crt->y += crt->ym; + + if (++crt->ani_wait > 5) + { + crt->ani_wait = 0; + ++crt->ani_no; + } + + if (crt->ani_no > 3) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rect_left', even though it's now too high + #endif + } + + crt->rect = rect_left[crt->ani_no]; + break; + + case DIR_RIGHT: + if (++crt->ani_wait > 2) + { + crt->ani_wait = 0; + ++crt->ani_no; + } + + if (crt->ani_no > 3) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rect_right', even though it's now too high + #endif + } + + crt->rect = rect_right[crt->ani_no]; + break; + + case DIR_UP: + crt->rect = rect_up[++crt->ani_wait / 2 % 3]; + + if (crt->ani_wait > 24) + crt->cond = 0; + + break; + } +} + +// Shoot +void ActCaret03(CARET *crt) +{ + RECT rect[4] = { + { 0, 48, 16, 64}, + {16, 48, 32, 64}, + {32, 48, 48, 64}, + {48, 48, 64, 64}, + }; + + if (++crt->ani_wait > 2) + { + crt->ani_wait = 0; + + if (++crt->ani_no > 3) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rect', even though it's now too high + #endif + } + } + + crt->rect = rect[crt->ani_no]; +} + +// Snake after-image? This doesn't seem to be used. +void ActCaret04(CARET *crt) +{ + RECT rect[9] = { + // Left + {64, 32, 80, 48}, + {80, 32, 96, 48}, + {96, 32, 112, 48}, + // Up + {64, 48, 80, 64}, + {80, 48, 96, 64}, + {96, 48, 112, 64}, + // Right + {64, 64, 80, 80}, + {80, 64, 96, 80}, + {96, 64, 112, 80}, + }; + + if (++crt->ani_wait > 1) + { + crt->ani_wait = 0; + + if (++crt->ani_no > 2) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rect', even though it's now too high + #endif + } + } + + crt->rect = rect[(crt->direct * 3) + crt->ani_no]; +} + +// 'Zzz' - snoring +void ActCaret05(CARET *crt) +{ + RECT rect[7] = { + {32, 64, 40, 72}, + {32, 72, 40, 80}, + {40, 64, 48, 72}, + {40, 72, 48, 80}, + {40, 64, 48, 72}, + {40, 72, 48, 80}, + {40, 64, 48, 72}, + }; + + if (++crt->ani_wait > 4) + { + crt->ani_wait = 0; + ++crt->ani_no; + } + + if (crt->ani_no > 6) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rect', even though it's now too high + #endif + } + + crt->x += 0x80; + crt->y -= 0x80; + + crt->rect = rect[crt->ani_no]; +} + +// No ActCaret06... + +// Exhaust (used by the Booster and hoverbike) +void ActCaret07(CARET *crt) +{ + RECT rcLeft[7] = { + { 56, 0, 64, 8}, + { 64, 0, 72, 8}, + { 72, 0, 80, 8}, + { 80, 0, 88, 8}, + { 88, 0, 96, 8}, + { 96, 0, 104, 8}, + {104, 0, 112, 8}, + }; + + if (++crt->ani_wait > 1) + { + crt->ani_wait = 0; + + if (++crt->ani_no > 6) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rcLeft', even though it's now too high + #endif + } + } + + crt->rect = rcLeft[crt->ani_no]; + + switch (crt->direct) + { + case DIR_LEFT: + crt->x -= 2 * 0x200; + break; + case DIR_UP: + crt->y -= 2 * 0x200; + break; + case DIR_RIGHT: + crt->x += 2 * 0x200; + break; + case DIR_DOWN: + crt->y += 2 * 0x200; + break; + } +} + +// Drowned Quote +void ActCaret08(CARET *crt) +{ + RECT rcLeft = {16, 80, 32, 96}; + RECT rcRight = {32, 80, 48, 96}; + + if (crt->direct == DIR_LEFT) + crt->rect = rcLeft; + else + crt->rect = rcRight; +} + +// The '?' that appears when you press the down key +void ActCaret09(CARET *crt) +{ + RECT rcLeft = {0, 80, 16, 96}; + RECT rcRight = {48, 64, 64, 80}; + + if (++crt->ani_wait < 5) + crt->y -= 0x800; + + if (crt->ani_wait == 32) + crt->cond = 0; + + if (crt->direct == DIR_LEFT) + crt->rect = rcLeft; + else + crt->rect = rcRight; +} + +// 'Level Up!' +void ActCaret10(CARET *crt) +{ + RECT rcLeft[2] = { + {0, 0, 56, 16}, + {0, 16, 56, 32}, + }; + + RECT rcRight[2] = { + {0, 96, 56, 112}, + {0, 112, 56, 128}, + }; + + ++crt->ani_wait; + + if (crt->direct == DIR_LEFT) + { + if (crt->ani_wait < 20) + crt->y -= 2 * 0x200; + + if (crt->ani_wait == 80) + crt->cond = 0; + } + else + { + if (crt->ani_wait < 20) + crt->y -= 1 * 0x200; + + if (crt->ani_wait == 80) + crt->cond = 0; + } + + if (crt->direct == DIR_LEFT) + crt->rect = rcLeft[crt->ani_wait / 2 % 2]; + else + crt->rect = rcRight[crt->ani_wait / 2 % 2]; +} + +// Red hurt particles (used by bosses and invisible hidden pickups) +void ActCaret11(CARET *crt) +{ + unsigned char deg; + + if (crt->act_no == 0) + { + crt->act_no = 1; + deg = Random(0, 0xFF); + crt->xm = GetCos(deg) * 2; + crt->ym = GetSin(deg) * 2; + } + + crt->x += crt->xm; + crt->y += crt->ym; + + RECT rcRight[7] = { + { 56, 8, 64, 16}, + { 64, 8, 72, 16}, + { 72, 8, 80, 16}, + { 80, 8, 88, 16}, + { 88, 8, 96, 16}, + { 96, 8, 104, 16}, + {104, 8, 112, 16}, + }; + + if (++crt->ani_wait > 2) + { + crt->ani_wait = 0; + + if (++crt->ani_no > 6) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rcRight', even though it's now too high + #endif + } + } + + crt->rect = rcRight[crt->ani_no]; +} + +// Missile Launcher explosion flash +void ActCaret12(CARET *crt) +{ + RECT rcLeft[2] = { + {112, 0, 144, 32}, + {144, 0, 176, 32}, + }; + + if (++crt->ani_wait > 2) + { + crt->ani_wait = 0; + + if (++crt->ani_no > 1) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rcLeft', even though it's now too high + #endif + } + } + + crt->rect = rcLeft[crt->ani_no]; +} + +// Particles used when Quote jumps into the ceiling, and also used by the Demon Crown and Ballos's puppy +void ActCaret13(CARET *crt) +{ + RECT rcLeft[2] = { + {56, 24, 64, 32}, + {0, 0, 0, 0}, + }; + + if (crt->act_no == 0) + { + crt->act_no = 1; + + switch (crt->direct) + { + case DIR_LEFT: + crt->xm = Random(-0x600, 0x600); + crt->ym = Random(-0x200, 0x200); + break; + + case DIR_UP: + crt->ym = -0x200 * Random(1, 3); + break; + } + } + + switch (crt->direct) + { + case DIR_LEFT: + crt->xm = (crt->xm * 4) / 5; + crt->ym = (crt->ym * 4) / 5; + break; + } + + crt->x += crt->xm; + crt->y += crt->ym; + + if (++crt->ani_wait > 20) + crt->cond = 0; + + crt->rect = rcLeft[crt->ani_wait / 2 % 2]; + + if (crt->direct == DIR_OTHER) + crt->x -= 4 * 0x200; +} + +// Broken (unknown and unused) +void ActCaret14(CARET *crt) +{ + // These rects are invalid. + // However, notably, there are 5 unused 40x40 sprites at the bottom of Caret.pbm. + // Perhaps those were originally at these coordinates. + RECT rect[5] = { + {0, 96, 40, 136}, + {40, 96, 80, 136}, + {80, 96, 120, 136}, + {120, 96, 160, 136}, + {160, 96, 200, 136}, + }; + + if (++crt->ani_wait > 1) + { + crt->ani_wait = 0; + + if (++crt->ani_no > 4) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rect', even though it's now too high + #endif + } + } + + crt->rect = rect[crt->ani_no]; +} + +// Tiny version of the projectile dissipation effect +void ActCaret15(CARET *crt) +{ + RECT rcLeft[4] = { + { 0, 72, 8, 80}, + { 8, 72, 16, 80}, + {16, 72, 24, 80}, + {24, 72, 32, 80}, + }; + + if (++crt->ani_wait > 2) + { + crt->ani_wait = 0; + + if (++crt->ani_no > 3) + { + crt->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rcLeft', even though it's now too high + #endif + } + } + + crt->rect = rcLeft[crt->ani_no]; +} + +// 'Empty!' +void ActCaret16(CARET *crt) +{ + RECT rcLeft[2] = { + {104, 96, 144, 104}, + {104, 104, 144, 112}, + }; + + if (++crt->ani_wait < 10) + crt->y -= 2 * 0x200; + + if (crt->ani_wait == 40) + crt->cond = 0; + + crt->rect = rcLeft[crt->ani_wait / 2 % 2]; +} + +// 'PUSH JUMP KEY!' (unused) +void ActCaret17(CARET *crt) +{ + RECT rcLeft[2] = { + {0, 144, 144, 152}, + {0, 0, 0, 0}, + }; + + if (++crt->ani_wait >= 40) + crt->ani_wait = 0; + + if (crt->ani_wait < 30) + crt->rect = rcLeft[0]; + else + crt->rect = rcLeft[1]; +} + +typedef void (*CARETFUNCTION)(CARET*); +CARETFUNCTION gpCaretFuncTbl[] = +{ + ActCaret00, + ActCaret01, + ActCaret02, + ActCaret03, + ActCaret04, + ActCaret05, + ActCaret04, // Interestingly, this slot is a duplicate + ActCaret07, + ActCaret08, + ActCaret09, + ActCaret10, + ActCaret11, + ActCaret12, + ActCaret13, + ActCaret14, + ActCaret15, + ActCaret16, + ActCaret17 +}; + +void ActCaret(void) +{ + int i; + int code; + + for (i = 0; i < CARET_MAX; ++i) + { + if (gCrt[i].cond & 0x80) + { + code = gCrt[i].code; + gpCaretFuncTbl[code](&gCrt[i]); + } + } +} + +void PutCaret(int fx, int fy) +{ + int i; + + for (i = 0; i < CARET_MAX; ++i) + { + if (gCrt[i].cond & 0x80) + { + PutBitmap3( + &grcGame, + SubpixelToScreenCoord(gCrt[i].x - gCrt[i].view_left) - SubpixelToScreenCoord(fx), + SubpixelToScreenCoord(gCrt[i].y - gCrt[i].view_top) - SubpixelToScreenCoord(fy), + &gCrt[i].rect, + SURFACE_ID_CARET); + } + } +} + +void SetCaret(int x, int y, int code, int dir) +{ + int c; + for (c = 0; c < CARET_MAX; ++c) + if (gCrt[c].cond == 0) + break; + + if (c == CARET_MAX) + return; + + memset(&gCrt[c], 0, sizeof(CARET)); + gCrt[c].cond = 0x80; + gCrt[c].code = code; + gCrt[c].x = x; + gCrt[c].y = y; + gCrt[c].view_left = gCaretTable[code].view_left; + gCrt[c].view_top = gCaretTable[code].view_top; + gCrt[c].direct = dir; +} diff --git a/src/Caret.h b/src/Caret.h new file mode 100644 index 0000000..ec85242 --- /dev/null +++ b/src/Caret.h @@ -0,0 +1,37 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +enum +{ + CARET_NULL = 0, + CARET_BUBBLE = 1, + CARET_PROJECTILE_DISSIPATION = 2, + CARET_SHOOT = 3, + CARET_SNAKE_AFTERIMAGE = 4, + CARET_ZZZ = 5, + CARET_SNAKE_AFTERIMAGE_DUPLICATE = 6, + CARET_EXHAUST = 7, + CARET_DROWNED_QUOTE = 8, + CARET_QUESTION_MARK = 9, + CARET_LEVEL_UP = 10, + CARET_HURT_PARTICLES = 11, + CARET_EXPLOSION = 12, + CARET_TINY_PARTICLES = 13, + CARET_UNKNOWN = 14, + CARET_PROJECTILE_DISSIPATION_TINY = 15, + CARET_EMPTY = 16, + CARET_PUSH_JUMP_KEY = 17 +}; + +void InitCaret(void); +void ActCaret(void); +void PutCaret(int fx, int fy); +void SetCaret(int x, int y, int code, int dir); diff --git a/src/CommonDefines.h b/src/CommonDefines.h new file mode 100644 index 0000000..825f4b5 --- /dev/null +++ b/src/CommonDefines.h @@ -0,0 +1,45 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#ifdef _3DS + #define WINDOW_WIDTH 400 + #define WINDOW_HEIGHT 240 +#else + #define WINDOW_WIDTH 426 + #define WINDOW_HEIGHT 240 +#endif + +#define SPRITE_SCALE 1 // Set to 2 for 2x sprites, 4 for 4x, etc. Must be a power of 2 + +enum Collisions +{ + COLL_LEFT_WALL = 1, // Touching a left wall + COLL_CEILING = 2, // Touching a ceiling + COLL_RIGHT_WALL = 4, // Touching a right wall + COLL_GROUND = 8 // Touching the ground + // To be continued +}; + +enum Direction +{ + DIR_LEFT = 0, + DIR_UP = 1, + DIR_RIGHT = 2, + DIR_DOWN = 3, + DIR_AUTO = 4, + DIR_OTHER = 5 +}; + +struct OTHER_RECT // The original name for this struct is unknown +{ + int front; + int top; + int back; + int bottom; +}; diff --git a/src/Config.cpp b/src/Config.cpp new file mode 100644 index 0000000..b48f8cb --- /dev/null +++ b/src/Config.cpp @@ -0,0 +1,273 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "Backends/Misc.h" +#include "Config.h" +#include "File.h" +#include "Main.h" + +const char* const gConfigName = "ConfigCSE2E.dat"; +const char* const gProof = "CSE2E 20200430"; + +BOOL LoadConfigData(CONFIGDATA *conf) +{ + // Clear old configuration data + memset(conf, 0, sizeof(CONFIGDATA)); + + // Get path + std::string path = gModulePath + '/' + gConfigName; + + // Open file + FILE *fp = fopen(path.c_str(), "rb"); + if (fp == NULL) + return FALSE; + + // Read the version id and font name + fread(conf->proof, sizeof(conf->proof), 1, fp); + fread(conf->font_name, sizeof(conf->font_name), 1, fp); + + // Read display mode + conf->display_mode = fgetc(fp); + + // Read framerate toggle + conf->b60fps = fgetc(fp); + + // Read vsync toggle + conf->bVsync = fgetc(fp); + + // Read smooth-scrolling toggle + conf->bSmoothScrolling = fgetc(fp); + + // Read soundtrack value + conf->soundtrack = fgetc(fp); + + // Read screenshake + conf->bScreenShake = fgetc(fp); + + // Read font data + conf->font_select = fgetc(fp); + + // Read enable joystick + conf->bUseJoystick = fgetc(fp); + + // Read no experience drops + conf->bNoExpDrops = fgetc(fp); + + // Read damage modifier + conf->damage_modifier = fgetc(fp); + + // Read autofire + conf->autoFire = fgetc(fp); + + // Read infinite ammo + conf->bInfiniteAmmo = fgetc(fp); + + // Read default booster + conf->defaultBooster = fgetc(fp); + + // Read infinite booster + conf->bInfiniteBooster = fgetc(fp); + + // Read grace jumps + conf->bGraceJumps = fgetc(fp); + + // Read color filter + conf->color_filter = fgetc(fp); + + // Read flash mode + conf->flash_mode = fgetc(fp); + + // Read game speed multiplier + conf->game_speed_multiplier = fgetc(fp); + + // Read boss health multiplier + conf->boss_health_multiplier = fgetc(fp); + + // Read extended UI + conf->bExtendedUI = fgetc(fp); + + // Read background brightness level + conf->backgroundBrightness = fgetc(fp); + + // Read graphics set + conf->graphics_set = fgetc(fp); + + // Read key-bindings + for (size_t i = 0; i < BINDING_TOTAL; ++i) + { + conf->bindings[i].keyboard = File_ReadLE32(fp); + conf->bindings[i].controller = fgetc(fp); + } + + // Close file + fclose(fp); + + // Check if version is not correct, and return if it failed + if (strcmp(conf->proof, gProof)) + { + memset(conf, 0, sizeof(CONFIGDATA)); + return FALSE; + } + + return TRUE; +} + +BOOL SaveConfigData(const CONFIGDATA *conf) +{ + // Get path + std::string path = gModulePath + '/' + gConfigName; + + // Open file + FILE *fp = fopen(path.c_str(), "wb"); + if (fp == NULL) + return FALSE; + + // Write the version id and font name + fwrite(conf->proof, sizeof(conf->proof), 1, fp); + fwrite(conf->font_name, sizeof(conf->font_name), 1, fp); + + // Write display mode + fputc(conf->display_mode, fp); + + // Write framerate toggle + fputc(conf->b60fps, fp); + + // Write vsync toggle + fputc(conf->bVsync, fp); + + // Write smooth-scrolling toggle + fputc(conf->bSmoothScrolling, fp); + + // Write soundtrack value + fputc(conf->soundtrack, fp); + + // Read screenshake + fputc(conf->bScreenShake, fp); + + // Write font data + fputc(conf->font_select, fp); + + // Write enable joystick + fputc(conf->bUseJoystick, fp); + + // Write no experience drops + fputc(conf->bNoExpDrops, fp); + + // Write damage modifier + fputc(conf->damage_modifier, fp); + + // Write autofire + fputc(conf->autoFire, fp); + + // Write infinite ammo + fputc(conf->bInfiniteAmmo, fp); + + // Write default booster + fputc(conf->defaultBooster, fp); + + // Write infinite booster + fputc(conf->bInfiniteBooster, fp); + + // Write infinite booster + fputc(conf->bGraceJumps, fp); + + // Write color filter + fputc(conf->color_filter, fp); + + // Write color filter + fputc(conf->flash_mode, fp); + + // Write game speed multiplier + fputc(conf->game_speed_multiplier, fp); + + // Write boss health multiplier + fputc(conf->boss_health_multiplier, fp); + + // Write extended UI + fputc(conf->bExtendedUI, fp); + + // Write background brightness level + fputc(conf->backgroundBrightness, fp); + + // Write Graphics Set + fputc(conf->graphics_set, fp); + + // Write key-bindings + for (size_t i = 0; i < BINDING_TOTAL; ++i) + { + File_WriteLE32(conf->bindings[i].keyboard, fp); + fputc(conf->bindings[i].controller, fp); + } + + // Close file + fclose(fp); + + return TRUE; +} + +void DefaultConfigData(CONFIGDATA *conf) +{ + // Clear old configuration data + memset(conf, 0, sizeof(CONFIGDATA)); + + strcpy(conf->proof, gProof); + + // Fun fact: The Linux port added this line: + // conf->display_mode = 1; + + conf->font_select = 0; + conf->game_speed_multiplier = 5; + conf->bScreenShake = TRUE; + conf->display_mode = 2; + conf->bExtendedUI = 1; + conf->bUseJoystick = TRUE; + conf->graphics_set = 0; +#ifdef _3DS + conf->display_mode = 1; +#elif defined(__riscos__) + conf->display_mode = 2; +#endif + + // Reset joystick settings (as these can't simply be set to 0) + conf->bindings[BINDING_UP].controller = 7; + conf->bindings[BINDING_DOWN].controller = 8; + conf->bindings[BINDING_LEFT].controller = 9; + conf->bindings[BINDING_RIGHT].controller = 10; + conf->bindings[BINDING_OK].controller = 1; + conf->bindings[BINDING_CANCEL].controller = 0; + conf->bindings[BINDING_JUMP].controller = 1; + conf->bindings[BINDING_SHOT].controller = 0; + conf->bindings[BINDING_STRAFE].controller = 11; + conf->bindings[BINDING_ARMSREV].controller = 3; + conf->bindings[BINDING_ARMS].controller = 4; + conf->bindings[BINDING_ITEM].controller = 5; + conf->bindings[BINDING_MAP].controller = 2; + conf->bindings[BINDING_PAUSE].controller = 6; + + // Set default key bindings + conf->bindings[BINDING_UP].keyboard = BACKEND_KEYBOARD_UP; + conf->bindings[BINDING_DOWN].keyboard = BACKEND_KEYBOARD_DOWN; + conf->bindings[BINDING_LEFT].keyboard = BACKEND_KEYBOARD_LEFT; + conf->bindings[BINDING_RIGHT].keyboard = BACKEND_KEYBOARD_RIGHT; + conf->bindings[BINDING_OK].keyboard = BACKEND_KEYBOARD_Z; + conf->bindings[BINDING_CANCEL].keyboard = BACKEND_KEYBOARD_X; + conf->bindings[BINDING_JUMP].keyboard = BACKEND_KEYBOARD_Z; + conf->bindings[BINDING_SHOT].keyboard = BACKEND_KEYBOARD_X; + conf->bindings[BINDING_STRAFE].keyboard = BACKEND_KEYBOARD_C; + conf->bindings[BINDING_ARMSREV].keyboard = BACKEND_KEYBOARD_A; + conf->bindings[BINDING_ARMS].keyboard = BACKEND_KEYBOARD_S; + conf->bindings[BINDING_ITEM].keyboard = BACKEND_KEYBOARD_Q; + conf->bindings[BINDING_MAP].keyboard = BACKEND_KEYBOARD_W; + conf->bindings[BINDING_PAUSE].keyboard = BACKEND_KEYBOARD_ESCAPE; +} diff --git a/src/Config.h b/src/Config.h new file mode 100644 index 0000000..baa1a41 --- /dev/null +++ b/src/Config.h @@ -0,0 +1,75 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#include "Input.h" + +enum +{ + BINDING_UP, + BINDING_DOWN, + BINDING_LEFT, + BINDING_RIGHT, + BINDING_OK, + BINDING_CANCEL, + BINDING_JUMP, + BINDING_SHOT, + BINDING_STRAFE, + BINDING_ARMSREV, + BINDING_ARMS, + BINDING_ITEM, + BINDING_MAP, + BINDING_PAUSE, + BINDING_TOTAL +}; + +typedef struct CONFIG_BINDING +{ + int keyboard; + unsigned char controller; +} CONFIG_BINDING; + +struct CONFIGDATA +{ + char proof[0x20]; + char font_name[0x40]; + unsigned char display_mode; + BOOL b60fps; + BOOL bVsync; + BOOL bSmoothScrolling; + unsigned char soundtrack; + CONFIG_BINDING bindings[BINDING_TOTAL]; + unsigned char font_select; + BOOL bUseJoystick; + + // Tweaks Mode + BOOL bNoExpDrops; + unsigned char damage_modifier; + unsigned char autoFire; + BOOL bInfiniteAmmo; + BOOL bScreenShake; + unsigned char defaultBooster; + BOOL bInfiniteBooster; + BOOL bGraceJumps; + unsigned char color_filter; + unsigned char flash_mode; + unsigned char game_speed_multiplier; + unsigned char boss_health_multiplier; + BOOL bExtendedUI; + unsigned char backgroundBrightness; + unsigned char graphics_set; +}; + +extern const char* const gConfigName; +extern const char* const gProof; + +BOOL LoadConfigData(CONFIGDATA *conf); +BOOL SaveConfigData(const CONFIGDATA *conf); +void DefaultConfigData(CONFIGDATA *conf); diff --git a/src/Draw.cpp b/src/Draw.cpp new file mode 100644 index 0000000..d8b0d94 --- /dev/null +++ b/src/Draw.cpp @@ -0,0 +1,930 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Draw.h" + +#include +#include +#include +#include +#include + +#ifdef _3DS + #include <3ds.h> +#endif + +#include "WindowsWrapper.h" + +#include "Backends/Misc.h" +#include "Backends/Rendering.h" +#include "Bitmap.h" +#include "CommonDefines.h" +#include "Ending.h" +#include "Font.h" +#include "Generic.h" +#include "Main.h" +#include "MapName.h" +#include "Resource.h" +#include "TextScr.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +typedef enum SurfaceType +{ + SURFACE_SOURCE_NONE = 1, + SURFACE_SOURCE_RESOURCE, + SURFACE_SOURCE_FILE +} SurfaceType; + +RECT grcGame = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; +RECT grcFull = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + +static int mag; +static BOOL fullscreen; // TODO - Not the original variable name + +BOOL gb60fps; +BOOL gbSmoothScrolling; +BOOL gbVsync; + +size_t font_width; +size_t font_height; +size_t title_width; +size_t title_height; + +static unsigned int vsync_fps; +FONT_DATA gbFontData; +BOOL gMirrorMode; +unsigned int gSpriteScale ; + +static RenderBackend_Surface *framebuffer; +static RenderBackend_Surface *game_framebuffer; +static RenderBackend_Surface *hud_framebuffer; // TODO - Not the original variable name + +static RenderBackend_Surface *surf[SURFACE_ID_MAX]; + +static Font *font; +static Font *title_font; + +// This doesn't exist in the Linux port, so none of these symbol names are accurate +static struct +{ + char name[50]; + unsigned int width; + unsigned int height; + SurfaceType type; + BOOL bSystem; // Basically a 'do not regenerate' flag +} surface_metadata[SURFACE_ID_MAX]; + +BOOL Flip_SystemTask(void) +{ + // TODO - Not the original variable names + static unsigned long timePrev; + static unsigned long timeNow; + + if (gbVsync && vsync_fps == (gb60fps ? 60 : 50)) + { + if (!SystemTask()) + return FALSE; + } + else + { + const unsigned int frameDelays[3] = {17, 16, 17}; + static unsigned int frame; + + const unsigned int delay = gb60fps ? frameDelays[frame % 3] : 20; + ++frame; + + while (TRUE) + { + if (!SystemTask()) + return FALSE; + + // Framerate limiter + timeNow = Backend_GetTicks(); + + if (timeNow >= timePrev + delay) + break; + + Backend_Delay(1); + } + + if (timeNow >= timePrev + 100) + timePrev = timeNow; // If the timer is freakishly out of sync, panic and reset it, instead of spamming frames for who-knows how long + else + timePrev += delay; + } + + static RenderBackend_Rect rcGameScaled; + rcGameScaled.left = 0; + rcGameScaled.top = 0; + rcGameScaled.right = WINDOW_WIDTH*mag; + rcGameScaled.bottom = WINDOW_HEIGHT*mag; + + RenderBackend_Blit(game_framebuffer, &rcGameScaled, framebuffer, 0, 0, TRUE); + RenderBackend_Blit(hud_framebuffer, &rcGameScaled, framebuffer, 0, 0, TRUE); + + RenderBackend_DrawScreen(); + +#ifdef _3DS + // This would go in Backend_SystemTask, but that causes a hang + // because of a race condition: aptMainLoop cannot be called + // between C3D_FrameBegin and C3D_FrameEnd + if (!aptMainLoop()) + return false; +#endif + + if (RestoreSurfaces()) + { + RestoreStripper(); + RestoreMapName(); + RestoreTextScript(); + } + + return TRUE; +} + +BOOL StartDirectDraw(const char *title, int lMagnification, BOOL b60fps, BOOL bSmoothScrolling, BOOL bVsync) +{ + gb60fps = b60fps; + gbSmoothScrolling = bSmoothScrolling; + + Backend_DisplayMode display_mode; + Backend_GetDisplayMode(&display_mode); + vsync_fps = display_mode.refresh_rate; + + memset(surface_metadata, 0, sizeof(surface_metadata)); + + switch (lMagnification) + { + default: + mag = lMagnification; + fullscreen = FALSE; + break; + + case 0: // Fullscreen + // Round to the nearest internal resolution + mag = MIN((display_mode.width + (WINDOW_WIDTH / 2)) / WINDOW_WIDTH, (display_mode.height + (WINDOW_HEIGHT / 2)) / WINDOW_HEIGHT); + fullscreen = TRUE; + break; + } + + // Round down to the nearest multiple of SPRITE_SCALE (we can't use 2x sprites at 1x or 3x internal resolution) + mag -= mag % (SPRITE_SCALE*gSpriteScale); + + // Account for rounding-down to 0 + if (mag == 0) + mag = (SPRITE_SCALE*gSpriteScale); + + // If v-sync is requested, check if it's available + if (bVsync) + gbVsync = vsync_fps == (b60fps ? 60 : 50); + + bool requested_vsync = gbVsync; + framebuffer = RenderBackend_Init(title, WINDOW_WIDTH * mag, WINDOW_HEIGHT * mag, fullscreen, &requested_vsync); + game_framebuffer = RenderBackend_CreateSurface(WINDOW_WIDTH * mag, WINDOW_HEIGHT * mag, true); + hud_framebuffer = RenderBackend_CreateSurface(WINDOW_WIDTH * mag, WINDOW_HEIGHT * mag, true); + + gbVsync = requested_vsync; + + if (framebuffer == NULL) + return FALSE; + + return TRUE; +} + +void EndDirectDraw(void) +{ + int i; + + // Release all surfaces + for (i = 0; i < SURFACE_ID_MAX; ++i) + { + if (surf[i] != NULL) + { + RenderBackend_FreeSurface(surf[i]); + surf[i] = NULL; + } + } + + framebuffer = NULL; + + RenderBackend_Deinit(); + + memset(surface_metadata, 0, sizeof(surface_metadata)); +} + +void ReleaseSurface(SurfaceID s) +{ + // Release the surface we want to release + if (surf[s] != NULL) + { + RenderBackend_FreeSurface(surf[s]); + surf[s] = NULL; + } + + memset(&surface_metadata[s], 0, sizeof(surface_metadata[0])); +} + +static BOOL ScaleAndUploadSurface(const unsigned char *image_buffer, size_t width, size_t height, SurfaceID surf_no) +{ + const int magnification_scaled = mag / (SPRITE_SCALE*gSpriteScale); + + if (magnification_scaled == 1) + { + // Just copy the pixels the way they are + RenderBackend_UploadSurface(surf[surf_no], image_buffer, width, height); + } + else + { + unsigned char *upscaled_image_buffer = (unsigned char*)malloc(width * mag * height * mag * 4); + + if (upscaled_image_buffer == NULL) + return FALSE; + + // Upscale the bitmap to the game's internal resolution + for (size_t y = 0; y < height; ++y) + { + const unsigned char *src_row = &image_buffer[y * width * 4]; + unsigned char *dst_row = &upscaled_image_buffer[y * magnification_scaled * width * magnification_scaled * 4]; + + const unsigned char *src_ptr = src_row; + unsigned char *dst_ptr = dst_row; + + for (size_t x = 0; x < width; ++x) + { + for (int i = 0; i < magnification_scaled; ++i) + { + *dst_ptr++ = src_ptr[0]; + *dst_ptr++ = src_ptr[1]; + *dst_ptr++ = src_ptr[2]; + *dst_ptr++ = src_ptr[3]; + } + + src_ptr += 4; + } + + for (int i = 1; i < magnification_scaled; ++i) + memcpy(dst_row + i * width * magnification_scaled * 4, dst_row, width * magnification_scaled * 4); + } + + RenderBackend_UploadSurface(surf[surf_no], upscaled_image_buffer, width * magnification_scaled, height * magnification_scaled); + + free(upscaled_image_buffer); + } + + return TRUE; +} + +// TODO - Inaccurate stack frame +BOOL MakeSurface_Resource(const char *name, SurfaceID surf_no) +{ + if (surf_no >= SURFACE_ID_MAX) + return FALSE; + + if (surf[surf_no] != NULL) + return FALSE; + + size_t size; + const unsigned char *data = FindResource(name, "BITMAP", &size); + + if (data == NULL) + return FALSE; + + size_t width, height; + unsigned char *image_buffer = DecodeBitmap(data, size, &width, &height, 4); + + if (image_buffer == NULL) + return FALSE; + + surf[surf_no] = RenderBackend_CreateSurface(width * mag / (SPRITE_SCALE*gSpriteScale), height * mag / (SPRITE_SCALE*gSpriteScale), false); + + if (surf[surf_no] == NULL) + { + FreeBitmap(image_buffer); + return FALSE; + } + + if (!ScaleAndUploadSurface(image_buffer, width, height, surf_no)) + { + RenderBackend_FreeSurface(surf[surf_no]); + FreeBitmap(image_buffer); + return FALSE; + } + + FreeBitmap(image_buffer); + + surface_metadata[surf_no].type = SURFACE_SOURCE_RESOURCE; + surface_metadata[surf_no].width = width / (SPRITE_SCALE*gSpriteScale); + surface_metadata[surf_no].height = height / (SPRITE_SCALE*gSpriteScale); + surface_metadata[surf_no].bSystem = FALSE; + strcpy(surface_metadata[surf_no].name, name); + + return TRUE; +} + +// TODO - Inaccurate stack frame +BOOL MakeSurface_File(const char *name, SurfaceID surf_no, int bApplyMirrorMode) +{ + std::string path; + +#ifdef FIX_BUGS + if (surf_no >= SURFACE_ID_MAX) +#else + if (surf_no > SURFACE_ID_MAX) +#endif + { + ErrorLog("surface no", surf_no); + return FALSE; + } + + if (surf[surf_no] != NULL) + { + ErrorLog("existing", surf_no); + return FALSE; + } + + size_t width, height; + unsigned char *image_buffer = NULL; + + const char *file_extensions[] = {"pbm", "bmp", "png"}; + for (size_t i = 0; i < sizeof(file_extensions) / sizeof(file_extensions[0]); ++i) + { + path = gSpritePath + '/' + name + '.' + file_extensions[i]; + + image_buffer = DecodeBitmapFromFile(path.c_str(), &width, &height, 4); + + if (image_buffer != NULL){ + break; + } + } + + if (image_buffer == NULL) + { + ErrorLog(path.c_str(), 1); + return FALSE; + } + + surf[surf_no] = RenderBackend_CreateSurface(width * mag / (SPRITE_SCALE*gSpriteScale), height * mag / (SPRITE_SCALE*gSpriteScale), false); + + if (surf[surf_no] == NULL) + { + FreeBitmap(image_buffer); + return FALSE; + } + + if((surf_no == SURFACE_ID_LEVEL_BACKGROUND || surf_no == SURFACE_ID_LEVEL_TILESET_2)){ + DimBuffer(image_buffer, gDimmingFactor, width, height); + } + + if (!ScaleAndUploadSurface(image_buffer, width, height, surf_no)) + { + RenderBackend_FreeSurface(surf[surf_no]); + FreeBitmap(image_buffer); + return FALSE; + } + + FreeBitmap(image_buffer); + + surface_metadata[surf_no].type = SURFACE_SOURCE_FILE; + surface_metadata[surf_no].width = width / (SPRITE_SCALE*gSpriteScale); + surface_metadata[surf_no].height = height / (SPRITE_SCALE*gSpriteScale); + surface_metadata[surf_no].bSystem = FALSE; + strcpy(surface_metadata[surf_no].name, name); + + return TRUE; +} + +// TODO - Inaccurate stack frame +BOOL ReloadBitmap_Resource(const char *name, SurfaceID surf_no) +{ + if (surf_no >= SURFACE_ID_MAX) + return FALSE; + + size_t size; + const unsigned char *data = FindResource(name, "BITMAP", &size); + + if (data == NULL) + return FALSE; + + size_t width, height; + unsigned char *image_buffer = DecodeBitmap(data, size, &width, &height, 4); + + if (image_buffer == NULL) + return FALSE; + + if (!ScaleAndUploadSurface(image_buffer, width, height, surf_no)) + { + FreeBitmap(image_buffer); + return FALSE; + } + + FreeBitmap(image_buffer); + + surface_metadata[surf_no].type = SURFACE_SOURCE_RESOURCE; + strcpy(surface_metadata[surf_no].name, name); + + return TRUE; +} + +// TODO - Inaccurate stack frame +BOOL ReloadBitmap_File(const char *name, SurfaceID surf_no, int bApplyMirrorMode, BOOL use_dimming) +{ + std::string path; + +#ifdef FIX_BUGS + if (surf_no >= SURFACE_ID_MAX) +#else + if (surf_no > SURFACE_ID_MAX) +#endif + { + ErrorLog("surface no", surf_no); + return FALSE; + } + + size_t width, height; + unsigned char *image_buffer = NULL; + + const char *file_extensions[] = {"pbm", "bmp", "png"}; + for (size_t i = 0; i < sizeof(file_extensions) / sizeof(file_extensions[0]); ++i) + { + path = gSpritePath + '/' + name + '.' + file_extensions[i]; + + image_buffer = DecodeBitmapFromFile(path.c_str(), &width, &height, 4); + + if (image_buffer != NULL) + break; + } + + if (image_buffer == NULL) + { + ErrorLog(path.c_str(), 1); + return FALSE; + } + + RenderBackend_FreeSurface(surf[surf_no]); + surf[surf_no] = RenderBackend_CreateSurface(width * mag / (SPRITE_SCALE*gSpriteScale), height * mag / (SPRITE_SCALE*gSpriteScale), false); + + if((surf_no == SURFACE_ID_LEVEL_BACKGROUND || surf_no == SURFACE_ID_LEVEL_TILESET_2) && use_dimming){ + DimBuffer(image_buffer, gDimmingFactor, width, height); + } + + if (!ScaleAndUploadSurface(image_buffer, width, height, surf_no)) + { + FreeBitmap(image_buffer); + return FALSE; + } + + FreeBitmap(image_buffer); + + surface_metadata[surf_no].type = SURFACE_SOURCE_FILE; + strcpy(surface_metadata[surf_no].name, name); + + return TRUE; +} + +// TODO - Inaccurate stack frame +BOOL MakeSurface_Generic(int bxsize, int bysize, SurfaceID surf_no, BOOL bSystem, BOOL bTarget) +{ +#ifdef FIX_BUGS + if (surf_no >= SURFACE_ID_MAX) +#else + if (surf_no > SURFACE_ID_MAX) // OOPS (should be '>=') +#endif + return FALSE; + + if (surf[surf_no] != NULL) + return FALSE; + + surf[surf_no] = RenderBackend_CreateSurface(bxsize * mag, bysize * mag, bTarget); + + if (surf[surf_no] == NULL) + return FALSE; + + surface_metadata[surf_no].type = SURFACE_SOURCE_NONE; + surface_metadata[surf_no].width = bxsize; + surface_metadata[surf_no].height = bysize; + + if (bSystem) + surface_metadata[surf_no].bSystem = TRUE; + else + surface_metadata[surf_no].bSystem = FALSE; + + strcpy(surface_metadata[surf_no].name, "generic"); + + return TRUE; +} + +void BackupSurface(SurfaceID surf_no, const RECT *rect) +{ + if (surf[surf_no] == NULL) + return; + + static RenderBackend_Rect rcSet; // TODO - Not the original variable name + rcSet.left = rect->left * mag; + rcSet.top = rect->top * mag; + rcSet.right = rect->right * mag; + rcSet.bottom = rect->bottom * mag; + + // Do not draw invalid RECTs + if (rcSet.right <= rcSet.left || rcSet.bottom <= rcSet.top) + return; + + RenderBackend_Blit(framebuffer, &rcSet, surf[surf_no], rcSet.left, rcSet.top, FALSE); +} + +static void ScaleRect(const RECT *rect, RenderBackend_Rect *scaled_rect) +{ + scaled_rect->left = rect->left * mag; + scaled_rect->top = rect->top * mag; + scaled_rect->right = rect->right * mag; + scaled_rect->bottom = rect->bottom * mag; +} + +void PutBitmap3(const RECT *rcView, int x, int y, const RECT *rect, SurfaceID surf_no) // Transparency +{ + if (surf[surf_no] == NULL) + return; + + static RenderBackend_Rect rcWork; + ScaleRect(rect, &rcWork); + + static RenderBackend_Rect rcViewScaled; + ScaleRect(rcView, &rcViewScaled); + + if (x + rcWork.right - rcWork.left > rcViewScaled.right) + rcWork.right -= (x + rcWork.right - rcWork.left) - rcViewScaled.right; + + if (x < rcViewScaled.left) + { + rcWork.left += rcViewScaled.left - x; + x = rcViewScaled.left; + } + + if (y + rcWork.bottom - rcWork.top > rcViewScaled.bottom) + rcWork.bottom -= (y + rcWork.bottom - rcWork.top) - rcViewScaled.bottom; + + if (y < rcViewScaled.top) + { + rcWork.top += rcViewScaled.top - y; + y = rcViewScaled.top; + } + + // Do not draw invalid RECTs + if (rcWork.right <= rcWork.left || rcWork.bottom <= rcWork.top) + return; + + RenderBackend_Blit(surf[surf_no], &rcWork, framebuffer, x, y, TRUE); +} + +void PutBitmap4(const RECT *rcView, int x, int y, const RECT *rect, SurfaceID surf_no) // No Transparency +{ + if (surf[surf_no] == NULL) + return; + + static RenderBackend_Rect rcWork; + ScaleRect(rect, &rcWork); + + static RenderBackend_Rect rcViewScaled; + ScaleRect(rcView, &rcViewScaled); + + if (x + rcWork.right - rcWork.left > rcViewScaled.right) + rcWork.right -= (x + rcWork.right - rcWork.left) - rcViewScaled.right; + + if (x < rcViewScaled.left) + { + rcWork.left += rcViewScaled.left - x; + x = rcViewScaled.left; + } + + if (y + rcWork.bottom - rcWork.top > rcViewScaled.bottom) + rcWork.bottom -= (y + rcWork.bottom - rcWork.top) - rcViewScaled.bottom; + + if (y < rcViewScaled.top) + { + rcWork.top += rcViewScaled.top - y; + y = rcViewScaled.top; + } + + // Do not draw invalid RECTs + if (rcWork.right <= rcWork.left || rcWork.bottom <= rcWork.top) + return; + + + RenderBackend_Blit(surf[surf_no], &rcWork, framebuffer, x, y, FALSE); +} + +void Surface2Surface(int x, int y, const RECT *rect, SurfaceID to, SurfaceID from) +{ + if (surf[to] == NULL || surf[from] == NULL) + return; + + static RenderBackend_Rect rcWork; + + rcWork.left = rect->left * mag; + rcWork.top = rect->top * mag; + rcWork.right = rect->right * mag; + rcWork.bottom = rect->bottom * mag; + + // Do not draw invalid RECTs + if (rcWork.right <= rcWork.left || rcWork.bottom <= rcWork.top) + return; + + RenderBackend_Blit(surf[from], &rcWork, surf[to], x * mag, y * mag, TRUE); +} + +unsigned long GetCortBoxColor(unsigned long col) +{ + // Comes in 00BBGGRR, goes out 00BBGGRR + return col; +} + +void CortBox(const RECT *rect, unsigned long col) +{ + static RenderBackend_Rect rcSet; // TODO - Not the original variable name + rcSet.left = rect->left * mag; + rcSet.top = rect->top * mag; + rcSet.right = rect->right * mag; + rcSet.bottom = rect->bottom * mag; + + unsigned char red = col & 0xFF; + unsigned char green = (col >> 8) & 0xFF; + unsigned char blue = (col >> 16) & 0xFF; + + if(gFilterIndex != 0){ + unsigned char colors[3] = {red, green, blue}; + gColorFilters[gFilterIndex].callback(colors, 0); + + red = colors[0]; + green = colors[1]; + blue = colors[2]; + } + + // Do not draw invalid RECTs + if (rcSet.right <= rcSet.left || rcSet.bottom <= rcSet.top) + return; + + RenderBackend_ColourFill(framebuffer, &rcSet, red, green, blue, 0xFF); +} + +void CortBox2(const RECT *rect, unsigned long col, SurfaceID surf_no) +{ + if (surf[surf_no] == NULL) + return; + + static RenderBackend_Rect rcSet; // TODO - Not the original variable name + rcSet.left = rect->left * mag; + rcSet.top = rect->top * mag; + rcSet.right = rect->right * mag; + rcSet.bottom = rect->bottom * mag; + + surface_metadata[surf_no].type = SURFACE_SOURCE_NONE; + + unsigned char red = col & 0xFF; + unsigned char green = (col >> 8) & 0xFF; + unsigned char blue = (col >> 16) & 0xFF; + unsigned char alpha = (col >> 24) & 0xFF; + + // Do not draw invalid RECTs + if (rcSet.right <= rcSet.left || rcSet.bottom <= rcSet.top) + return; + + if(gFilterIndex != 0){ + unsigned char colors[3] = {red, green, blue}; + gColorFilters[gFilterIndex].callback(colors, 0); + + red = colors[0]; + green = colors[1]; + blue = colors[2]; + } + + RenderBackend_ColourFill(surf[surf_no], &rcSet, red, green, blue, alpha); +} + +// Dummied-out log function +// According to the Mac port, its name really is just "out". +BOOL out(char surface_identifier) +{ + // The actual name (and type) of these two variables are unknown + std::string path; + FILE *fp; + + (void)surface_identifier; + (void)path; + (void)fp; + + // There may have been some kind of 'OutputDebugStringA' call here, + // like the one in 'EnumDevices_Callback' in 'Input.cpp'. + // Pixel may have kept them wrapped in '#ifdef DEBUG' blocks. + + return TRUE; +} + +// TODO - Probably not the original function name (this is an educated guess) +int RestoreSurfaces(void) +{ + int s; + RECT rect; + int surfaces_regenerated = 0; + + if (framebuffer == NULL) + return surfaces_regenerated; + + if (RenderBackend_IsSurfaceLost(framebuffer)) + { + ++surfaces_regenerated; + RenderBackend_RestoreSurface(framebuffer); + out('f'); // 'f' for 'frontbuffer' (or, in this branch's case, 'framebuffer') + } + + for (s = 0; s < SURFACE_ID_MAX; ++s) + { + if (surf[s] != NULL) + { + if (RenderBackend_IsSurfaceLost(surf[s])) + { + ++surfaces_regenerated; + RenderBackend_RestoreSurface(surf[s]); + out('0' + s); // The number of the surface lost + + if (!surface_metadata[s].bSystem) + { + switch (surface_metadata[s].type) + { + case SURFACE_SOURCE_NONE: + rect.left = 0; + rect.top = 0; + rect.right = surface_metadata[s].width; + rect.bottom = surface_metadata[s].height; + CortBox2(&rect, 0, (SurfaceID)s); + break; + + case SURFACE_SOURCE_RESOURCE: + ReloadBitmap_Resource(surface_metadata[s].name, (SurfaceID)s); + break; + + case SURFACE_SOURCE_FILE: + ReloadBitmap_File(surface_metadata[s].name, (SurfaceID)s, false, false); + break; + } + } + } + } + } + + //clear default surfaces + + + return surfaces_regenerated; +} + +int SubpixelToScreenCoord(int coord) +{ + if (gbSmoothScrolling) + return (coord * mag) / 0x200; + else + return (coord / (0x200 / SPRITE_SCALE)) * (mag / SPRITE_SCALE); +} + +int PixelToScreenCoord(int coord) +{ + return coord * mag; +} + +// TODO - Inaccurate stack frame +void InitTextObject(const char *name) +{ + (void)name; // Unused in this branch + + // Get font size + size_t width, height; + + // Let me tell you why these font sizes are unfortunate... + // 6x12 is a good font size - fonts use high-quality bitmaps at that + // size, and it works with Cave Story's internal assumption that + // characters are spaced 6 pixels apart. + // The sad part is the 10x20 size: you might be wondering why Pixel + // didn't use 12x24 instead. Well, that's because fonts don't use + // bitmaps at that size - instead you get ugly low-res vector + // renders. So, Pixel had to use 10x20 instead. But there's a + // problem: this means the characters are spaced 5 pixels apart + // instead. This normally isn't a problem because the game usually + // hardcodes it, but this isn't the case when either > 8) & 0xFF; + unsigned char blue = (color >> 16) & 0xFF; + + unsigned char colors[3] = {red, green, blue}; + gColorFilters[gFilterIndex].callback(colors, 0); + + red = colors[0]; + green = colors[1]; + blue = colors[2]; + + text_color = RGB(colors[0], colors[1], colors[2]); + } + + DrawText(font, framebuffer, x * mag, y * mag, text_color, text); +} + + +void PutText2(int x, int y, const char *text, unsigned long color, SurfaceID surf_no) +{ + unsigned long text_color = color; + + if(gFilterIndex != 0){ + unsigned char red = color & 0xFF; + unsigned char green = (color >> 8) & 0xFF; + unsigned char blue = (color >> 16) & 0xFF; + + unsigned char colors[3] = {red, green, blue}; + gColorFilters[gFilterIndex].callback(colors, 0); + + red = colors[0]; + green = colors[1]; + blue = colors[2]; + + text_color = RGB(colors[0], colors[1], colors[2]); + } + + DrawText(font, surf[surf_no], x * mag, y * mag, text_color, text); +} + +void PutTitleText(int x, int y, const char *text, unsigned long color) +{ + unsigned long text_color = color; + if(gFilterIndex != 0){ + unsigned char red = color & 0xFF; + unsigned char green = (color >> 8) & 0xFF; + unsigned char blue = (color >> 16) & 0xFF; + + unsigned char colors[3] = {red, green, blue}; + gColorFilters[gFilterIndex].callback(colors, 0); + + red = colors[0]; + green = colors[1]; + blue = colors[2]; + + text_color = RGB(colors[0], colors[1], colors[2]); + } + + DrawText(title_font, framebuffer, x * mag, y * mag, text_color, text); +} + +void EndTextObject(void) +{ + UnloadFont(font); +} diff --git a/src/Draw.h b/src/Draw.h new file mode 100644 index 0000000..4eecdb6 --- /dev/null +++ b/src/Draw.h @@ -0,0 +1,93 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +#include "WindowsWrapper.h" +#include "TextScr.h" + +extern RECT grcGame; +extern RECT grcFull; + +extern BOOL gb60fps; +extern BOOL gbSmoothScrolling; +extern BOOL gMirrorMode; +extern unsigned int gSpriteScale; + +extern FONT_DATA gbFontData; +extern BOOL gbVsync; + +extern size_t font_width; +extern size_t font_height; +extern size_t title_width; +extern size_t title_height; + +typedef enum SurfaceID +{ + SURFACE_ID_TITLE = 0, + SURFACE_ID_PIXEL = 1, + SURFACE_ID_LEVEL_TILESET = 2, + SURFACE_ID_LEVEL_TILESET_2 = 3, + SURFACE_ID_FADE = 6, + SURFACE_ID_ITEM_IMAGE = 8, + SURFACE_ID_MAP = 9, + SURFACE_ID_SCREEN_GRAB = 10, + SURFACE_ID_ARMS = 11, + SURFACE_ID_ARMS_IMAGE = 12, + SURFACE_ID_ROOM_NAME = 13, + SURFACE_ID_STAGE_ITEM = 14, + SURFACE_ID_LOADING = 15, + SURFACE_ID_MENU_OVERLAY = 16, + SURFACE_ID_MY_CHAR = 17, + SURFACE_ID_BULLET = 18, + SURFACE_ID_CARET = 19, + SURFACE_ID_NPC_SYM = 20, + SURFACE_ID_LEVEL_SPRITESET_1 = 21, + SURFACE_ID_LEVEL_SPRITESET_2 = 22, + SURFACE_ID_NPC_REGU = 23, + SURFACE_ID_MAP_CARET = 24, + SURFACE_ID_TEXT_BOX = 26, + SURFACE_ID_FACE = 27, + SURFACE_ID_LEVEL_BACKGROUND = 28, + SURFACE_ID_VALUE_VIEW = 29, + SURFACE_ID_TEXT_LINE1 = 30, + SURFACE_ID_TEXT_LINE2 = 31, + SURFACE_ID_TEXT_LINE3 = 32, + SURFACE_ID_TEXT_LINE4 = 33, + SURFACE_ID_TEXT_LINE5 = 34, + SURFACE_ID_CREDIT_CAST = 35, + SURFACE_ID_CREDITS_IMAGE = 36, + SURFACE_ID_CASTS = 37, + SURFACE_ID_MAX = 40 +} SurfaceID; + +BOOL Flip_SystemTask(void); +BOOL StartDirectDraw(const char *title, int lMagnification, BOOL b60fps, BOOL bSmoothScrolling, BOOL bVsync); +void EndDirectDraw(void); +void ReleaseSurface(SurfaceID s); +BOOL MakeSurface_Resource(const char *name, SurfaceID surf_no); +BOOL MakeSurface_File(const char *name, SurfaceID surf_no, int bApplyMirrorMode); +BOOL ReloadBitmap_Resource(const char *name, SurfaceID surf_no); +BOOL ReloadBitmap_File(const char *name, SurfaceID surf_no, int bApplyMirrorMode, BOOL use_dimming); +BOOL MakeSurface_Generic(int bxsize, int bysize, SurfaceID surf_no, BOOL bSystem, BOOL bTarget); +void BackupSurface(SurfaceID surf_no, const RECT *rect); +void PutBitmap3(const RECT *rcView, int x, int y, const RECT *rect, SurfaceID surf_no); +void PutBitmap4(const RECT *rcView, int x, int y, const RECT *rect, SurfaceID surf_no); +void Surface2Surface(int x, int y, const RECT *rect, SurfaceID to, SurfaceID from); +unsigned long GetCortBoxColor(unsigned long col); +void CortBox(const RECT *rect, unsigned long col); +void CortBox2(const RECT *rect, unsigned long col, SurfaceID surf_no); +int RestoreSurfaces(void); +int SubpixelToScreenCoord(int coord); +int PixelToScreenCoord(int coord); +void InitTextObject(const char *font_name); +void PutText(int x, int y, const char *text, unsigned long color); +void PutText2(int x, int y, const char *text, unsigned long color, SurfaceID surf_no); +void PutTitleText(int x, int y, const char *text, unsigned long color); +void EndTextObject(void); diff --git a/src/Ending.cpp b/src/Ending.cpp new file mode 100644 index 0000000..d35691a --- /dev/null +++ b/src/Ending.cpp @@ -0,0 +1,600 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Ending.h" + +#include +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "Draw.h" +#include "Escape.h" +#include "Flags.h" +#include "Generic.h" +#include "KeyControl.h" +#include "Main.h" +#include "MycParam.h" +#ifdef EXTRA_SOUND_FORMATS +#include "ExtraSoundFormats.h" +#endif +#include "Organya.h" +#include "Pause.h" +#include "Stage.h" +#include "TextScr.h" + +enum CREDIT_MODE +{ + CREDIT_MODE_STOP, + CREDIT_MODE_SCROLL_READ, + CREDIT_MODE_SCROLL_WAIT +}; + +enum ILLUSTRATION_ACTION +{ + ILLUSTRATION_ACTION_IDLE, + ILLUSTRATION_ACTION_SLIDE_IN, + ILLUSTRATION_ACTION_SLIDE_OUT +}; + +struct CREDIT +{ + long size; + char *pData; + int offset; + int wait; + CREDIT_MODE mode; + int start_x; +}; + +struct STRIP +{ + int flag; + int x; + int y; + int cast; + char str[0x40]; +}; + +struct ILLUSTRATION +{ + ILLUSTRATION_ACTION act_no; + int x; +}; + +struct ISLAND_SPRITE +{ + int x; + int y; +}; + +static CREDIT Credit; +static STRIP Strip[MAX_STRIP]; +static ILLUSTRATION Illust; + +// Update casts +void ActionStripper(void) +{ + int s; + + for (s = 0; s < MAX_STRIP; ++s) + { + // Move up + if (Strip[s].flag & 0x80 && Credit.mode != CREDIT_MODE_STOP) + Strip[s].y -= 0x100; + // Get removed when off-screen + if (Strip[s].y <= -16 * 0x200) + Strip[s].flag = 0; + } +} + +// Draw casts +void PutStripper(void) +{ + int s; + RECT rc; + + for (s = 0; s < MAX_STRIP; ++s) + { + if (Strip[s].flag & 0x80) + { + // Draw text + rc.left = 0; + rc.right = 320; + rc.top = s * 16; + rc.bottom = rc.top + 16; + + PutBitmap3(&grcFull, SubpixelToScreenCoord(Strip[s].x) + PixelToScreenCoord((WINDOW_WIDTH - 320) / 2), SubpixelToScreenCoord(Strip[s].y), &rc, SURFACE_ID_CREDIT_CAST); + + // Draw character + rc.left = (Strip[s].cast % 13) * 24; + rc.right = rc.left + 24; + rc.top = (Strip[s].cast / 13) * 24; + rc.bottom = rc.top + 24; + + PutBitmap3(&grcFull, SubpixelToScreenCoord(Strip[s].x) + PixelToScreenCoord(((WINDOW_WIDTH - 320) / 2) - 24), SubpixelToScreenCoord(Strip[s].y) - PixelToScreenCoord(8), &rc, SURFACE_ID_CASTS); + } + } +} + +// Create a cast object +void SetStripper(int x, int y, const char *text, int cast) +{ + int s; + RECT rc; + + for (s = 0; s < MAX_STRIP; ++s) + if (!(Strip[s].flag & 0x80)) + break; + + if (s == MAX_STRIP) + return; + + // Initialize cast property + Strip[s].flag = 0x80; + Strip[s].x = x; + Strip[s].y = y; + Strip[s].cast = cast; + strcpy(Strip[s].str, text); + + // Draw text + rc.left = 0; + rc.right = 320; + rc.top = s * 16; + rc.bottom = rc.top + 16; + + CortBox2(&rc, 0, SURFACE_ID_CREDIT_CAST); + PutText2(0, rc.top, text, RGB(0xFF, 0xFF, 0xFE), SURFACE_ID_CREDIT_CAST); +} + +// Regenerate cast text +void RestoreStripper(void) +{ + int s; + RECT rc; + + for (s = 0; s < MAX_STRIP; ++s) + { + if (Strip[s].flag & 0x80) + { + rc.left = 0; + rc.right = 320; + rc.top = s * 16; + rc.bottom = rc.top + 16; + + CortBox2(&rc, 0, SURFACE_ID_CREDIT_CAST); + PutText2(0, rc.top, Strip[s].str, RGB(0xFF, 0xFF, 0xFE), SURFACE_ID_CREDIT_CAST); + } + } +} + +// Handle the illustration +void ActionIllust(void) +{ + switch (Illust.act_no) + { + case ILLUSTRATION_ACTION_IDLE: // Off-screen to the left + Illust.x = -160 * 0x200; + break; + + case ILLUSTRATION_ACTION_SLIDE_IN: // Move in from the left + Illust.x += 40 * 0x200; + if (Illust.x > 0) + Illust.x = 0; + break; + + case ILLUSTRATION_ACTION_SLIDE_OUT: // Move out from the right + Illust.x -= 40 * 0x200; + if (Illust.x < -160 * 0x200) + Illust.x = -160 * 0x200; + break; + } +} + +// Draw illustration +void PutIllust(void) +{ + RECT rcIllust = {0, 0, 160, 240}; +#if WINDOW_WIDTH != 320 || WINDOW_HEIGHT != 240 // TODO - Move this to CSE2EX + // Widescreen edit + RECT rcClip = {(WINDOW_WIDTH - 320) / 2, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + PutBitmap3(&rcClip, SubpixelToScreenCoord(Illust.x) + PixelToScreenCoord((WINDOW_WIDTH - 320) / 2), PixelToScreenCoord((WINDOW_HEIGHT - 240) / 2), &rcIllust, SURFACE_ID_CREDITS_IMAGE); +#else + PutBitmap3(&grcFull, SubpixelToScreenCoord(Illust.x) + PixelToScreenCoord((WINDOW_WIDTH - 320) / 2), PixelToScreenCoord((WINDOW_HEIGHT - 240) / 2), &rcIllust, SURFACE_ID_CREDITS_IMAGE); +#endif +} + +// Load illustration +void ReloadIllust(int a) +{ + char name[16]; + sprintf(name, "CREDIT%02d", a); + std::string path = std::string{"Resource/BITMAP/"} + name; + ReloadBitmap_File(path.c_str(), SURFACE_ID_CREDITS_IMAGE, true, false); +} + +const char *credit_script = "Credit.tsc"; + +// Initialize and release credits +void InitCreditScript(void) +{ + // Clear script state and casts + memset(&Credit, 0, sizeof(CREDIT)); + memset(Strip, 0, sizeof(Strip)); +} + +void ReleaseCreditScript(void) +{ + if (Credit.pData != NULL) + { + // Free script data + free(Credit.pData); + Credit.pData = NULL; + } +} + +// Start playing credits +BOOL StartCreditScript(void) +{ + FILE *fp; + std::string path; + + // Clear previously existing credits data + if (Credit.pData != NULL) + { + free(Credit.pData); + Credit.pData = NULL; + } + + // Open file + path = gDataPath + '/' + credit_script; + + Credit.size = GetFileSizeLong(path.c_str()); + if (Credit.size == -1) + return FALSE; + + // Allocate buffer data + Credit.pData = (char*)malloc(Credit.size); + if (Credit.pData == NULL) + return FALSE; + + fp = fopen(path.c_str(), "rb"); + if (fp == NULL) + { + free(Credit.pData); + return FALSE; + } + + // Read data + fread(Credit.pData, 1, Credit.size, fp); + +#ifdef FIX_MAJOR_BUGS + // The original game forgot to close the file + fclose(fp); +#endif + + EncryptionBinaryData2((unsigned char*)Credit.pData, Credit.size); + + // Reset credits + Credit.offset = 0; + Credit.wait = 0; + Credit.mode = CREDIT_MODE_SCROLL_READ; + Illust.x = -160 * 0x200; + Illust.act_no = ILLUSTRATION_ACTION_IDLE; + + // Modify cliprect + grcGame.left = WINDOW_WIDTH / 2; +#if WINDOW_WIDTH != 320 || WINDOW_HEIGHT != 240 // TODO - Move to CSE2EX + // These three are non-vanilla: for wide/tallscreen support + grcGame.right = ((WINDOW_WIDTH - 320) / 2) + 320; + grcGame.top = (WINDOW_HEIGHT - 240) / 2; + grcGame.bottom = ((WINDOW_HEIGHT - 240) / 2) + 240; +#endif + + // Reload casts + if (!ReloadBitmap_File("casts", SURFACE_ID_CASTS, false, false)) + return FALSE; + + // Clear casts + memset(Strip, 0, sizeof(Strip)); + return TRUE; +} + +// Get number from text (4 digit) +static int GetScriptNumber(const char *text) +{ + return (text[0] - '0') * 1000 + + (text[1] - '0') * 100 + + (text[2] - '0') * 10 + + (text[3] - '0') * 1; +} + +// Parse credits +static void ActionCredit_Read(void) +{ + int a, b, len; + char text[40]; + + while (1) + { + if (Credit.offset >= Credit.size) + break; + + switch (Credit.pData[Credit.offset]) + { + case '[': // Create cast + // Get the range for the cast text + Credit.offset += 1; + + a = Credit.offset; + + while (Credit.pData[a] != ']') + { + if (IsShiftJIS(Credit.pData[a])) + a += 2; + else + a += 1; + } + + len = a - Credit.offset; + + // Copy the text to the cast text + memcpy(text, &Credit.pData[Credit.offset], len); + text[len] = '\0'; + + // Get cast ID + Credit.offset = a; + Credit.offset += 1; + len = GetScriptNumber(&Credit.pData[Credit.offset]); + + // Create cast object + SetStripper(Credit.start_x, (WINDOW_HEIGHT + 8) * 0x200, text, len); + + // Change offset + Credit.offset += 4; + return; + + case '-': // Wait for X amount of frames + Credit.offset += 1; + Credit.wait = GetScriptNumber(&Credit.pData[Credit.offset]); + Credit.offset += 4; + Credit.mode = CREDIT_MODE_SCROLL_WAIT; + return; + + case '+': // Change casts x-position + Credit.offset += 1; + Credit.start_x = GetScriptNumber(&Credit.pData[Credit.offset]) * 0x200; + Credit.offset += 4; + return; + + case '/': // Stop credits + Credit.mode = CREDIT_MODE_STOP; + return; + + case '!': // Change music + Credit.offset += 1; + a = GetScriptNumber(&Credit.pData[Credit.offset]); + Credit.offset += 4; + ChangeMusic((MusicID)a); + return; + + case '~': // Start fading out music + Credit.offset += 1; + SetOrganyaFadeout(); + #ifdef EXTRA_SOUND_FORMATS + ExtraSound_FadeOutMusic(); + #endif + return; + + case 'j': // Jump to label + Credit.offset += 1; + + // Get number + b = GetScriptNumber(&Credit.pData[Credit.offset]); + + // Change offset + Credit.offset += 4; + + // Jump to specific label + if (1) // This appears to be a hacked-up duplicate of some code from the below 'f' condition + { + while (Credit.offset < Credit.size) + { + if (Credit.pData[Credit.offset] == 'l') + { + Credit.offset += 1; + a = GetScriptNumber(&Credit.pData[Credit.offset]); + Credit.offset += 4; + + if (b == a) + break; + } + else + { + if (IsShiftJIS(Credit.pData[Credit.offset])) + Credit.offset += 2; + else + Credit.offset += 1; + } + } + } + + return; + + case 'f': // Flag jump + Credit.offset += 1; + + // Read numbers XXXX:YYYY + a = GetScriptNumber(&Credit.pData[Credit.offset]); + Credit.offset += 5; + b = GetScriptNumber(&Credit.pData[Credit.offset]); + Credit.offset += 4; + + // If flag is set + if (GetNPCFlag(a)) + { + // Jump to label + while (Credit.offset < Credit.size) + { + if (Credit.pData[Credit.offset] == 'l') + { + Credit.offset += 1; + a = GetScriptNumber(&Credit.pData[Credit.offset]); + Credit.offset += 4; + + if (b == a) + break; + } + else + { + if (IsShiftJIS(Credit.pData[Credit.offset])) + Credit.offset += 2; + else + Credit.offset += 1; + } + } + } + return; + + default: + // Progress through file + Credit.offset += 1; + break; + } + } +} + +// Update credits +void ActionCredit(void) +{ + if (Credit.offset >= Credit.size) + return; + + // Update script, or if waiting, decrement the wait value + switch (Credit.mode) + { + case CREDIT_MODE_SCROLL_READ: + ActionCredit_Read(); + break; + + case CREDIT_MODE_SCROLL_WAIT: + if (--Credit.wait <= 0) + Credit.mode = CREDIT_MODE_SCROLL_READ; + break; + } +} + +// Change illustration +void SetCreditIllust(int a) +{ + ReloadIllust(a); + Illust.act_no = ILLUSTRATION_ACTION_SLIDE_IN; +} + +// Slide illustration off-screen +void CutCreditIllust(void) +{ + Illust.act_no = ILLUSTRATION_ACTION_SLIDE_OUT; +} + +// Scene of the island falling +int Scene_DownIsland(int mode) +{ + ISLAND_SPRITE sprite; + int wait; + + // Setup background + RECT rc_frame = {(WINDOW_WIDTH / 2) - 80, (WINDOW_HEIGHT / 2) - 40, (WINDOW_WIDTH / 2) + 80, (WINDOW_HEIGHT / 2) + 40}; + RECT rc_sky = {0, 0, 160, 80}; + RECT rc_ground = {160, 48, 320, 80}; + + // Setup island + RECT rc_sprite = {160, 0, 200, 24}; + + sprite.x = 168 * 0x200; + sprite.y = 64 * 0x200; + + for (wait = 0; wait < 900; ++wait) + { + // Get pressed keys + GetTrg(); + + if (gKey & KEY_PAUSE) + { + switch (Call_Pause(1)) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + } + + // Escape menu + if (gKey & KEY_ESCAPE) + { + switch (Call_Escape()) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + } + + switch (mode) + { + case 0: + // Move down + sprite.y += 0x200 / 10; + break; + + case 1: + if (wait < 350) + { + // Move down at normal speed + sprite.y += 0x200 / 10; + } + else if (wait < 500) + { + // Move down slower + sprite.y += 0x200 / 20; + } + else if (wait < 600) + { + // Move down slow + sprite.y += 0x200 / 40; + } + else if (wait == 750) + { + // End scene + wait = 900; + } + + break; + } + + // Draw scene + CortBox(&grcFull, 0); + PutBitmap3(&rc_frame, PixelToScreenCoord(80 + ((WINDOW_WIDTH - 320) / 2)), PixelToScreenCoord(80 + ((WINDOW_HEIGHT - 240) / 2)), &rc_sky, SURFACE_ID_LEVEL_SPRITESET_1); + PutBitmap3(&rc_frame, SubpixelToScreenCoord(sprite.x) - PixelToScreenCoord(20) + PixelToScreenCoord((WINDOW_WIDTH - 320) / 2), SubpixelToScreenCoord(sprite.y) - PixelToScreenCoord(12) + PixelToScreenCoord((WINDOW_HEIGHT - 240) / 2), &rc_sprite, SURFACE_ID_LEVEL_SPRITESET_1); + PutBitmap3(&rc_frame, PixelToScreenCoord(80 + ((WINDOW_WIDTH - 320) / 2)), PixelToScreenCoord(128 + ((WINDOW_HEIGHT - 240) / 2)), &rc_ground, SURFACE_ID_LEVEL_SPRITESET_1); + PutTimeCounter(16, 8); + + // Draw window + PutFramePerSecound(); + if (!Flip_SystemTask()) + return enum_ESCRETURN_exit; + } + + return enum_ESCRETURN_continue; +} diff --git a/src/Ending.h b/src/Ending.h new file mode 100644 index 0000000..673fa97 --- /dev/null +++ b/src/Ending.h @@ -0,0 +1,29 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" + +#define MAX_STRIP ((WINDOW_HEIGHT / 16) + 1) + +void ActionStripper(void); +void PutStripper(void); +void SetStripper(int x, int y, const char *text, int cast); +void RestoreStripper(void); +void ActionIllust(void); +void PutIllust(void); +void ReloadIllust(int a); +void InitCreditScript(void); +void ReleaseCreditScript(void); +BOOL StartCreditScript(void); +void ActionCredit(void); +void SetCreditIllust(int a); +void CutCreditIllust(void); +int Scene_DownIsland(int mode); diff --git a/src/Escape.cpp b/src/Escape.cpp new file mode 100644 index 0000000..61947ad --- /dev/null +++ b/src/Escape.cpp @@ -0,0 +1,56 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Escape.h" + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" +#include "Draw.h" +#include "KeyControl.h" +#include "Main.h" + +int Call_Escape(void) +{ + RECT rc = {0, 128, 208, 144}; + + while (1) + { + // Get pressed keys + GetTrg(); + + if (gKeyTrg & KEY_ESCAPE) // Escape is pressed, quit game + { + gKeyTrg = 0; + return enum_ESCRETURN_exit; + } + if (gKeyTrg & KEY_F1) // F1 is pressed, continue + { + gKeyTrg = 0; + return enum_ESCRETURN_continue; + } + if (gKeyTrg & KEY_F2) // F2 is pressed, reset + { + gKeyTrg = 0; + return enum_ESCRETURN_restart; + } + + // Draw screen + CortBox(&grcFull, 0x000000); + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) - 104), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 8), &rc, SURFACE_ID_TEXT_BOX); + PutFramePerSecound(); + + if (!Flip_SystemTask()) + { + // Quit if window is closed + gKeyTrg = 0; + return enum_ESCRETURN_exit; + } + } + + return enum_ESCRETURN_exit; +} diff --git a/src/Escape.h b/src/Escape.h new file mode 100644 index 0000000..a29fa7e --- /dev/null +++ b/src/Escape.h @@ -0,0 +1,17 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +enum enum_ESCRETURN +{ + enum_ESCRETURN_exit, + enum_ESCRETURN_continue, + enum_ESCRETURN_restart +}; + +int Call_Escape(void); diff --git a/src/ExtraSoundFormats.cpp b/src/ExtraSoundFormats.cpp new file mode 100644 index 0000000..d91a8b7 --- /dev/null +++ b/src/ExtraSoundFormats.cpp @@ -0,0 +1,330 @@ +#include "ExtraSoundFormats.h" + +#include +#include +#include + +#include "Sound.h" + +#include "clownaudio/mixer.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define CLAMP(x, y, z) MIN(MAX((x), (y)), (z)) + +typedef struct SoundSlot +{ + bool valid; + ClownAudio_SoundData *sound_data; + ClownAudio_SoundID sound_id; + long volume; + long pan; +} SoundSlot; + +static ClownAudio_Mixer *mixer; + +static SoundSlot song; +static SoundSlot previous_song; + +static SoundSlot sfx_list[SE_MAX]; + +static bool playing = true; + +static unsigned short MillibelToScale(long volume) +{ + // Volume is in hundredths of a decibel, from 0 to -10000 + volume = CLAMP(volume, -10000, 0); + return (unsigned short)(pow(10.0, volume / 2000.0) * 256.0f); +} + +void ExtraSound_Init(unsigned int sample_rate) +{ + mixer = ClownAudio_CreateMixer(sample_rate); +} + +void ExtraSound_Deinit(void) +{ + // Free songs + if (previous_song.valid) + { + AudioBackend_Lock(); + ClownAudio_Mixer_DestroySound(mixer, previous_song.sound_id); + AudioBackend_Unlock(); + + ClownAudio_Mixer_UnloadSoundData(previous_song.sound_data); + previous_song.valid = false; + } + + if (song.valid) + { + AudioBackend_Lock(); + ClownAudio_Mixer_DestroySound(mixer, song.sound_id); + AudioBackend_Unlock(); + + ClownAudio_Mixer_UnloadSoundData(song.sound_data); + song.valid = false; + } + + // Free SFX + for (unsigned int i = 0; i < SE_MAX; ++i) + { + if (sfx_list[i].valid) + { + AudioBackend_Lock(); + ClownAudio_Mixer_DestroySound(mixer, sfx_list[i].sound_id); + AudioBackend_Unlock(); + + ClownAudio_Mixer_UnloadSoundData(sfx_list[i].sound_data); + sfx_list[i].valid = false; + } + } + + ClownAudio_DestroyMixer(mixer); +} + +void ExtraSound_Play(void) +{ + playing = true; +} + +void ExtraSound_Stop(void) +{ + playing = false; +} + +void ExtraSound_LoadMusic(const char *intro_file_path, const char *loop_file_path, bool loop) +{ + if (previous_song.valid) + { + AudioBackend_Lock(); + ClownAudio_Mixer_DestroySound(mixer, previous_song.sound_id); + AudioBackend_Unlock(); + + ClownAudio_Mixer_UnloadSoundData(previous_song.sound_data); + } + + if (song.valid) + { + AudioBackend_Lock(); + ClownAudio_Mixer_PauseSound(mixer, song.sound_id); + AudioBackend_Unlock(); + } + + previous_song = song; + + if (intro_file_path != NULL || loop_file_path != NULL) + { + ClownAudio_SoundDataConfig data_config; + ClownAudio_InitSoundDataConfig(&data_config); + song.sound_data = ClownAudio_Mixer_LoadSoundDataFromFiles(mixer, intro_file_path, loop_file_path, &data_config); + + if (song.sound_data != NULL) + { + ClownAudio_SoundConfig sound_config; + ClownAudio_InitSoundConfig(&sound_config); + sound_config.loop = loop; + ClownAudio_Sound *sound = ClownAudio_Mixer_CreateSound(mixer, song.sound_data, &sound_config); + + if (sound != NULL) + { + AudioBackend_Lock(); + song.sound_id = ClownAudio_Mixer_RegisterSound(mixer, sound); + AudioBackend_Unlock(); + + song.valid = true; + + return; + } + + ClownAudio_Mixer_UnloadSoundData(song.sound_data); + } + } + + song.valid = false; +} + +void ExtraSound_LoadPreviousMusic(void) +{ + if (song.valid) + { + AudioBackend_Lock(); + ClownAudio_Mixer_DestroySound(mixer, song.sound_id); + AudioBackend_Unlock(); + + ClownAudio_Mixer_UnloadSoundData(song.sound_data); + song.valid = false; + } + + if (previous_song.valid) + { + song = previous_song; + + AudioBackend_Lock(); + ClownAudio_Mixer_CancelFade(mixer, song.sound_id); + AudioBackend_Unlock(); + } + + previous_song.valid = false; +} + +void ExtraSound_PauseMusic(void) +{ + if (song.valid) + { + AudioBackend_Lock(); + ClownAudio_Mixer_PauseSound(mixer, song.sound_id); + AudioBackend_Unlock(); + } +} + +void ExtraSound_UnpauseMusic(void) +{ + if (song.valid) + { + AudioBackend_Lock(); + ClownAudio_Mixer_UnpauseSound(mixer, song.sound_id); + AudioBackend_Unlock(); + } +} + +void ExtraSound_FadeOutMusic(void) +{ + AudioBackend_Lock(); + ClownAudio_Mixer_FadeOutSound(mixer, song.sound_id, 5 * 1000); + AudioBackend_Unlock(); +} + +void ExtraSound_SetMusicVolume(unsigned short volume) +{ + const unsigned short volume_linear = (volume * volume) >> 8; + + AudioBackend_Lock(); + ClownAudio_Mixer_SetSoundVolume(mixer, song.sound_id, volume_linear, volume_linear); + AudioBackend_Unlock(); +} + +void ExtraSound_LoadSFX(const char *path, int id) +{ + if (sfx_list[id].valid) + { + AudioBackend_Lock(); + ClownAudio_Mixer_DestroySound(mixer, sfx_list[id].sound_id); + AudioBackend_Unlock(); + + ClownAudio_Mixer_UnloadSoundData(sfx_list[id].sound_data); + } + + size_t file_buffer_size; + + ClownAudio_SoundDataConfig data_config; + ClownAudio_InitSoundDataConfig(&data_config); + data_config.predecode = true; + data_config.dynamic_sample_rate = true; + sfx_list[id].sound_data = ClownAudio_Mixer_LoadSoundDataFromFiles(mixer, path, NULL, &data_config); + + if (sfx_list[id].sound_data != NULL) + { + ClownAudio_SoundConfig sound_config; + ClownAudio_InitSoundConfig(&sound_config); + sound_config.do_not_free_when_done = true; + sound_config.dynamic_sample_rate = true; + ClownAudio_Sound *sound = ClownAudio_Mixer_CreateSound(mixer, sfx_list[id].sound_data, &sound_config); + + if (sound != NULL) + { + AudioBackend_Lock(); + sfx_list[id].sound_id = ClownAudio_Mixer_RegisterSound(mixer, sound); + AudioBackend_Unlock(); + + sfx_list[id].volume = 0; + sfx_list[id].pan = 0; + sfx_list[id].valid = true; + return; + } + + ClownAudio_Mixer_UnloadSoundData(sfx_list[id].sound_data); + } + + sfx_list[id].valid = false; +} + +void ExtraSound_PlaySFX(int id, int mode) +{ + if (sfx_list[id].valid) + { + AudioBackend_Lock(); + + switch (mode) + { + case 0: + ClownAudio_Mixer_PauseSound(mixer, sfx_list[id].sound_id); + break; + + case 1: + ClownAudio_Mixer_PauseSound(mixer, sfx_list[id].sound_id); + ClownAudio_Mixer_RewindSound(mixer, sfx_list[id].sound_id); + ClownAudio_Mixer_SetSoundLoop(mixer, sfx_list[id].sound_id, false); + ClownAudio_Mixer_UnpauseSound(mixer, sfx_list[id].sound_id); + break; + + case -1: + ClownAudio_Mixer_SetSoundLoop(mixer, sfx_list[id].sound_id, true); + ClownAudio_Mixer_UnpauseSound(mixer, sfx_list[id].sound_id); + break; + } + + AudioBackend_Unlock(); + } +} + +void ExtraSound_SetSFXFrequency(int id, unsigned long frequency) +{ + if (sfx_list[id].valid) + { + AudioBackend_Lock(); + ClownAudio_Mixer_SetSoundSampleRate(mixer, sfx_list[id].sound_id, frequency, frequency); + AudioBackend_Unlock(); + } +} + +void ExtraSound_SetSFXVolume(int id, long volume) +{ + if (sfx_list[id].valid) + { + sfx_list[id].volume = volume; + + const unsigned short volume_scale = MillibelToScale(sfx_list[id].volume); + const unsigned short pan_scale_left = MillibelToScale(-sfx_list[id].pan); + const unsigned short pan_scale_right = MillibelToScale(sfx_list[id].pan); + + AudioBackend_Lock(); + ClownAudio_Mixer_SetSoundVolume(mixer, sfx_list[id].sound_id, (pan_scale_left * volume_scale) >> 8, (pan_scale_right * volume_scale) >> 8); + AudioBackend_Unlock(); + } +} + +void ExtraSound_SetSFXPan(int id, long pan) +{ + if (sfx_list[id].valid) + { + sfx_list[id].pan = pan; + + const unsigned short volume_scale = MillibelToScale(sfx_list[id].volume); + const unsigned short pan_scale_left = MillibelToScale(-sfx_list[id].pan); + const unsigned short pan_scale_right = MillibelToScale(sfx_list[id].pan); + + AudioBackend_Lock(); + ClownAudio_Mixer_SetSoundVolume(mixer, sfx_list[id].sound_id, (pan_scale_left * volume_scale) >> 8, (pan_scale_right * volume_scale) >> 8); + AudioBackend_Unlock(); + } +} + +void ExtraSound_Mix(long *buffer, unsigned long frames) +{ + if (playing) + { + AudioBackend_Lock(); + ClownAudio_Mixer_MixSamples(mixer, buffer, frames); + AudioBackend_Unlock(); + } +} diff --git a/src/ExtraSoundFormats.h b/src/ExtraSoundFormats.h new file mode 100644 index 0000000..550c9f3 --- /dev/null +++ b/src/ExtraSoundFormats.h @@ -0,0 +1,18 @@ +#pragma once + +void ExtraSound_Init(unsigned int sample_rate); +void ExtraSound_Deinit(void); +void ExtraSound_Play(void); +void ExtraSound_Stop(void); +void ExtraSound_LoadMusic(const char *intro_file_path, const char *loop_file_path, bool loop); +void ExtraSound_LoadPreviousMusic(void); +void ExtraSound_PauseMusic(void); +void ExtraSound_UnpauseMusic(void); +void ExtraSound_FadeOutMusic(void); +void ExtraSound_SetMusicVolume(unsigned short volume); // Logarithmic - 0 is silent, 0x80 is half-volume, 0x100 is full-volume +void ExtraSound_LoadSFX(const char *path, int id); +void ExtraSound_PlaySFX(int id, int mode); +void ExtraSound_SetSFXFrequency(int id, unsigned long frequency); +void ExtraSound_SetSFXVolume(int id, long volume); +void ExtraSound_SetSFXPan(int id, long pan); +void ExtraSound_Mix(long *buffer, unsigned long frames); diff --git a/src/Fade.cpp b/src/Fade.cpp new file mode 100644 index 0000000..c3a7485 --- /dev/null +++ b/src/Fade.cpp @@ -0,0 +1,262 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Fade.h" + +#include + +#include "WindowsWrapper.h" + +#include "Draw.h" + +FADE gFade; + +static unsigned long mask_color; + +void InitFade(void) +{ + memset(&gFade, 0, sizeof(FADE)); + mask_color = GetCortBoxColor(RGB(0, 0, 0x20)); +} + +void SetFadeMask(void) +{ + gFade.bMask = TRUE; +} + +void ClearFade(void) +{ + gFade.bMask = FALSE; + gFade.mode = 0; +} + +void StartFadeOut(signed char dir) +{ + int x, y; + + gFade.mode = 2; + gFade.count = 0; + gFade.dir = dir; + gFade.bMask = FALSE; + + for (y = 0; y < FADE_HEIGHT; ++y) + { + for (x = 0; x < FADE_WIDTH; ++x) + { + gFade.ani_no[y][x] = 0; + gFade.flag[y][x] = FALSE; + } + } +} + +void StartFadeIn(signed char dir) +{ + int x, y; + + gFade.mode = 1; + gFade.count = 0; + gFade.dir = dir; + gFade.bMask = TRUE; + + for (y = 0; y < FADE_HEIGHT; ++y) + { + for (x = 0; x < FADE_WIDTH; ++x) + { + gFade.ani_no[y][x] = 15; + gFade.flag[y][x] = FALSE; + } + } + + x = x; // This probably doesn't match the original source code, but it produces the same assembly +} + +void ProcFade(void) +{ + int x, y; + + switch (gFade.mode) + { + case 2: + switch (gFade.dir) + { + case 0: + for (y = 0; y < FADE_HEIGHT; ++y) + for (x = 0; x < FADE_WIDTH; ++x) + if ((FADE_WIDTH - 1) - gFade.count == x) + gFade.flag[y][x] = TRUE; + + break; + + case 2: + for (y = 0; y < FADE_HEIGHT; ++y) + for (x = 0; x < FADE_WIDTH; ++x) + if (gFade.count == x) + gFade.flag[y][x] = TRUE; + + break; + + case 1: + for (y = 0; y < FADE_HEIGHT; ++y) + for (x = 0; x < FADE_WIDTH; ++x) + if ((FADE_HEIGHT - 1) - gFade.count == y) + gFade.flag[y][x] = TRUE; + + break; + + case 3: + for (y = 0; y < FADE_HEIGHT; ++y) + for (x = 0; x < FADE_WIDTH; ++x) + if (gFade.count == y) + gFade.flag[y][x] = TRUE; + + break; + + case 4: + for (y = 0; y < (FADE_HEIGHT / 2); ++y) + for (x = 0; x < (FADE_WIDTH / 2); ++x) + if (gFade.count == x + y) + gFade.flag[y][x] = TRUE; + + for (y = 0; y < (FADE_HEIGHT / 2); ++y) + for (x = (FADE_WIDTH / 2); x < FADE_WIDTH; ++x) + if (gFade.count == y + ((FADE_WIDTH - 1) - x)) + gFade.flag[y][x] = TRUE; + + for (y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; ++y) + for (x = 0; x < (FADE_WIDTH / 2); ++x) + if (gFade.count == x + ((FADE_HEIGHT - 1) - y)) + gFade.flag[y][x] = TRUE; + + for (y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; ++y) + for (x = (FADE_WIDTH / 2); x < FADE_WIDTH; ++x) + if (gFade.count == ((FADE_WIDTH - 1) - x) + ((FADE_HEIGHT - 1) - y)) + gFade.flag[y][x] = TRUE; + + break; + } + + for (y = 0; y < FADE_HEIGHT; ++y) + for (x = 0; x < FADE_WIDTH; ++x) + if (gFade.ani_no[y][x] < 15 && gFade.flag[y][x]) + ++gFade.ani_no[y][x]; + + if (++gFade.count > ((FADE_WIDTH > FADE_HEIGHT) ? FADE_WIDTH : FADE_HEIGHT) + 16) + { + gFade.bMask = TRUE; + gFade.mode = 0; + } + + break; + + case 1: + gFade.bMask = FALSE; + + switch (gFade.dir) + { + case 0: + for (y = 0; y < FADE_HEIGHT; ++y) + for (x = 0; x < FADE_WIDTH; ++x) + if ((FADE_WIDTH - 1) - gFade.count == x) + gFade.flag[y][x] = TRUE; + + break; + + case 2: + for (y = 0; y < FADE_HEIGHT; ++y) + for (x = 0; x < FADE_WIDTH; ++x) + if (gFade.count == x) + gFade.flag[y][x] = TRUE; + + break; + + case 1: + for (y = 0; y < FADE_HEIGHT; ++y) + for (x = 0; x < FADE_WIDTH; ++x) + if ((FADE_HEIGHT - 1) - gFade.count == y) + gFade.flag[y][x] = TRUE; + + break; + + case 3: + for (y = 0; y < FADE_HEIGHT; ++y) + for (x = 0; x < FADE_WIDTH; ++x) + if (gFade.count == y) + gFade.flag[y][x] = TRUE; + + break; + + case 4: + for (y = 0; y < (FADE_HEIGHT / 2); ++y) + for (x = 0; x < (FADE_WIDTH / 2); ++x) + if ((FADE_WIDTH - 1) - gFade.count == x + y) + gFade.flag[y][x] = TRUE; + + for (y = 0; y < (FADE_HEIGHT / 2); ++y) + for (x = (FADE_WIDTH / 2); x < FADE_WIDTH; ++x) + if ((FADE_WIDTH - 1) - gFade.count == y + ((FADE_WIDTH - 1) - x)) + gFade.flag[y][x] = TRUE; + + for (y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; ++y) + for (x = 0; x < (FADE_WIDTH / 2); ++x) + if ((FADE_WIDTH - 1) - gFade.count == x + ((FADE_HEIGHT - 1) - y)) + gFade.flag[y][x] = TRUE; + + for (y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; ++y) + for (x = (FADE_WIDTH / 2); x < FADE_WIDTH; ++x) + if ((FADE_WIDTH - 1) - gFade.count == ((FADE_WIDTH - 1) - x) + ((FADE_HEIGHT - 1) - y)) + gFade.flag[y][x] = TRUE; + + break; + } + + for (y = 0; y < FADE_HEIGHT; ++y) + for (x = 0; x < FADE_WIDTH; ++x) + if (gFade.ani_no[y][x] > 0 && gFade.flag[y][x]) + --gFade.ani_no[y][x]; + + if (++gFade.count > ((FADE_WIDTH > FADE_HEIGHT) ? FADE_WIDTH : FADE_HEIGHT) + 16) + gFade.mode = 0; + + break; + } +} + +void PutFade(void) +{ + int x, y; + + RECT rect; + rect.top = 0; + rect.bottom = 16; + + if (gFade.bMask) + { + CortBox(&grcGame, mask_color); + return; + } + + if (gFade.mode == 0) + return; + + for (y = 0; y < FADE_HEIGHT; ++y) + { + for (x = 0; x < FADE_WIDTH; ++x) + { + rect.left = gFade.ani_no[y][x] * 16; + rect.right = rect.left + 16; + PutBitmap3(&grcGame, PixelToScreenCoord(x * 16), PixelToScreenCoord(y * 16), &rect, SURFACE_ID_FADE); + } + } +} + +BOOL GetFadeActive(void) +{ + if (gFade.mode == 0) + return FALSE; + else + return TRUE; +} diff --git a/src/Fade.h b/src/Fade.h new file mode 100644 index 0000000..94d2a7c --- /dev/null +++ b/src/Fade.h @@ -0,0 +1,35 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "CommonDefines.h" +#include "WindowsWrapper.h" + +#define FADE_WIDTH (((WINDOW_WIDTH - 1) / 16) + 1) +#define FADE_HEIGHT (((WINDOW_HEIGHT - 1) / 16) + 1) + +struct FADE +{ + int mode; + BOOL bMask; + int count; + signed char ani_no[FADE_HEIGHT][FADE_WIDTH]; + signed char flag[FADE_HEIGHT][FADE_WIDTH]; // Not a BOOLEAN (those are unsigned) + signed char dir; +}; + +extern FADE gFade; + +void InitFade(void); +void SetFadeMask(void); +void ClearFade(void); +void StartFadeOut(signed char dir); +void StartFadeIn(signed char dir); +void ProcFade(void); +void PutFade(void); +BOOL GetFadeActive(void); diff --git a/src/File.cpp b/src/File.cpp new file mode 100644 index 0000000..79b7b04 --- /dev/null +++ b/src/File.cpp @@ -0,0 +1,105 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "File.h" + +#include +#include +#include + +unsigned char* LoadFileToMemory(const char *file_path, size_t *file_size) +{ + unsigned char *buffer = NULL; + + FILE *file = fopen(file_path, "rb"); + + if (file != NULL) + { + if (!fseek(file, 0, SEEK_END)) + { + const long _file_size = ftell(file); + + if (_file_size >= 0) + { + rewind(file); + buffer = (unsigned char*)malloc(_file_size); + + if (buffer != NULL) + { + if (fread(buffer, _file_size, 1, file) == 1) + { + fclose(file); + *file_size = (size_t)_file_size; + return buffer; + } + + free(buffer); + } + } + } + + fclose(file); + } + + return NULL; +} + +unsigned short File_ReadBE16(FILE *stream) +{ + unsigned char bytes[2]; + + fread(bytes, 2, 1, stream); + + return (bytes[0] << 8) | bytes[1]; +} + +unsigned long File_ReadBE32(FILE *stream) +{ + unsigned char bytes[4]; + + fread(bytes, 4, 1, stream); + + return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]; +} + +unsigned short File_ReadLE16(FILE *stream) +{ + unsigned char bytes[2]; + + fread(bytes, 2, 1, stream); + + return (bytes[1] << 8) | bytes[0]; +} + +unsigned long File_ReadLE32(FILE *stream) +{ + unsigned char bytes[4]; + + fread(bytes, 4, 1, stream); + + return (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0]; +} + +void File_WriteBE16(unsigned short value, FILE *stream) +{ + for (unsigned int i = 2; i-- != 0;) + fputc(value >> (8 * i), stream); +} + +void File_WriteBE32(unsigned long value, FILE *stream) +{ + for (unsigned int i = 4; i-- != 0;) + fputc(value >> (8 * i), stream); +} + +void File_WriteLE16(unsigned short value, FILE *stream) +{ + for (unsigned int i = 0; i < 2; ++i) + fputc(value >> (8 * i), stream); +} + +void File_WriteLE32(unsigned long value, FILE *stream) +{ + for (unsigned int i = 0; i < 4; ++i) + fputc(value >> (8 * i), stream); +} diff --git a/src/File.h b/src/File.h new file mode 100644 index 0000000..93cd3f3 --- /dev/null +++ b/src/File.h @@ -0,0 +1,19 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include +#include + +unsigned char* LoadFileToMemory(const char *file_path, size_t *file_size); + +unsigned short File_ReadBE16(FILE *stream); +unsigned long File_ReadBE32(FILE *stream); +unsigned short File_ReadLE16(FILE *stream); +unsigned long File_ReadLE32(FILE *stream); + +void File_WriteBE16(unsigned short value, FILE *stream); +void File_WriteBE32(unsigned long value, FILE *stream); +void File_WriteLE16(unsigned short value, FILE *stream); +void File_WriteLE32(unsigned long value, FILE *stream); diff --git a/src/Flags.cpp b/src/Flags.cpp new file mode 100644 index 0000000..49d48a3 --- /dev/null +++ b/src/Flags.cpp @@ -0,0 +1,70 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Flags.h" + +#include + +#include "WindowsWrapper.h" + +// Macros for setting, un-setting and getting flags +// Each flag is stored in a bit, so we can use the exact same macros we'd use for bits +#define SET_FLAG(x, i) ((x)[(i) / 8] |= 1 << ((i) % 8)) +#define UNSET_FLAG(x, i) ((x)[(i) / 8] &= ~(1 << ((i) % 8))) +#define GET_FLAG(x, i) ((x)[(i) / 8] & (1 << ((i) % 8))) + +unsigned char gFlagNPC[1000]; +unsigned char gSkipFlag[8]; + +// Flag initializers +void InitFlags(void) +{ + memset(gFlagNPC, 0, sizeof(gFlagNPC)); +} + +void InitSkipFlags(void) +{ + memset(gSkipFlag, 0, sizeof(gSkipFlag)); +} + +// NPC flags +void SetNPCFlag(long a) +{ + SET_FLAG(gFlagNPC, a); +} + +void CutNPCFlag(long a) +{ + UNSET_FLAG(gFlagNPC, a); +} + +BOOL GetNPCFlag(long a) +{ + if (GET_FLAG(gFlagNPC, a)) + return TRUE; + else + return FALSE; +} + +// Skip flags +void SetSkipFlag(long a) +{ + SET_FLAG(gSkipFlag, a); +} + +void CutSkipFlag(long a) +{ + UNSET_FLAG(gSkipFlag, a); +} + +BOOL GetSkipFlag(long a) +{ + if (GET_FLAG(gSkipFlag, a)) + return TRUE; + else + return FALSE; +} diff --git a/src/Flags.h b/src/Flags.h new file mode 100644 index 0000000..9b34d5e --- /dev/null +++ b/src/Flags.h @@ -0,0 +1,22 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +extern unsigned char gFlagNPC[1000]; +extern unsigned char gSkipFlag[8]; + +void InitFlags(void); +void InitSkipFlags(void); +void SetNPCFlag(long a); +void CutNPCFlag(long a); +BOOL GetNPCFlag(long a); +void SetSkipFlag(long a); +void CutSkipFlag(long a); +BOOL GetSkipFlag(long a); diff --git a/src/Flash.cpp b/src/Flash.cpp new file mode 100644 index 0000000..3a3cd21 --- /dev/null +++ b/src/Flash.cpp @@ -0,0 +1,189 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Flash.h" + +#include "CommonDefines.h" +#include "Draw.h" +#include "WindowsWrapper.h" + +static struct +{ + FlashMode mode; + int act_no; + BOOL flag; + int cnt; + int width; + int x; + int y; + RECT rect1; + RECT rect2; +} flash; + +unsigned int gFlashMode; +unsigned long gFlashColor; + +void InitFlash(void) +{ + if (gFlashMode == 1){ + gFlashColor = GetCortBoxColor(RGB(0xDD, 0xDD, 0xDC)); + } + else{ + gFlashColor = GetCortBoxColor(RGB(0xFF, 0xFF, 0xFE)); + } +} + +void SetFlash(int x, int y, FlashMode mode) +{ + flash.act_no = 0; + flash.flag = TRUE; + flash.x = x; + flash.y = y; + flash.mode = mode; + flash.cnt = 0; + flash.width = 0; +} + +void ActFlash_Explosion(int flx, int fly) +{ + int left, top, right, bottom; + + switch (flash.act_no) + { + case 0: // Expand + flash.cnt += 0x200; + flash.width += flash.cnt; + + left = (flash.x - flx - flash.width) / 0x200; + top = (flash.y - fly - flash.width) / 0x200; + right = (flash.x - flx + flash.width) / 0x200; + bottom = (flash.y - fly + flash.width) / 0x200; + + if (left < 0) + left = 0; + if (top < 0) + top = 0; + if (right > WINDOW_WIDTH) + right = WINDOW_WIDTH; + if (bottom > WINDOW_HEIGHT) + bottom = WINDOW_HEIGHT; + + // The tall part of the explosion + flash.rect1.left = left; + flash.rect1.right = right; + flash.rect1.top = 0; + flash.rect1.bottom = WINDOW_HEIGHT; + + // The wide part of the explosion + flash.rect2.left = 0; + flash.rect2.right = WINDOW_WIDTH; + flash.rect2.top = top; + flash.rect2.bottom = bottom; + + if (flash.width > WINDOW_WIDTH * 0x200 * 4) // I guess in theory this means that the explosion would take longer in widescreen... + { + flash.act_no = 1; + flash.cnt = 0; + flash.width = WINDOW_HEIGHT * 0x200; + } + + break; + + case 1: // Shrink + flash.width -= flash.width / 8; + + if ((flash.width / 0x100) == 0) + flash.flag = FALSE; + + top = (flash.y - fly - flash.width) / 0x200; + if (top < 0) + top = 0; + + bottom = (flash.y - fly + flash.width) / 0x200; + if (bottom > WINDOW_HEIGHT) + bottom = WINDOW_HEIGHT; + + // The tall part of the explosion + flash.rect1.left = 0; + flash.rect1.right = 0; + flash.rect1.top = 0; + flash.rect1.bottom = 0; + + // The wide part of the explosion + flash.rect2.top = top; + flash.rect2.bottom = bottom; + flash.rect2.left = 0; + flash.rect2.right = WINDOW_WIDTH; + + break; + } +} + +void ActFlash_Flash(void) +{ + ++flash.cnt; + + flash.rect1.left = 0; + flash.rect1.right = 0; + flash.rect1.top = 0; + flash.rect1.bottom = 0; + + if (flash.cnt / 2 % 2) + { + flash.rect2.top = 0; + flash.rect2.bottom = WINDOW_HEIGHT; + flash.rect2.left = 0; + flash.rect2.right = WINDOW_WIDTH; + } + else + { + flash.rect2.left = 0; + flash.rect2.right = 0; + flash.rect2.top = 0; + flash.rect2.bottom = 0; + } + + if (flash.cnt > 20) + flash.flag = FALSE; +} + +void ActFlash(int flx, int fly) +{ + if (!flash.flag) + return; + + if(gFlashMode == 2) + return; + + switch (flash.mode) + { + case FLASH_MODE_EXPLOSION: + ActFlash_Explosion(flx, fly); + break; + + case FLASH_MODE_FLASH: + ActFlash_Flash(); + break; + } +} + +void PutFlash(void) +{ + if (!flash.flag) + return; + + if(gFlashMode == 2) + return; + + CortBox(&flash.rect1, gFlashColor); + CortBox(&flash.rect2, gFlashColor); +} + +void ResetFlash(void) +{ + flash.flag = FALSE; +} diff --git a/src/Flash.h b/src/Flash.h new file mode 100644 index 0000000..e9ff15f --- /dev/null +++ b/src/Flash.h @@ -0,0 +1,26 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +enum FlashMode +{ + FLASH_MODE_EXPLOSION = 1, + FLASH_MODE_FLASH = 2 +}; + +extern unsigned long gFlashColor; + +void InitFlash(void); +void SetFlash(int x, int y, FlashMode mode); +void ActFlash_Explosion(int flx, int fly); +void ActFlash_Flash(void); +void ActFlash(int flx, int fly); +void PutFlash(void); +void ResetFlash(void); + +extern unsigned int gFlashMode; \ No newline at end of file diff --git a/src/Font.cpp b/src/Font.cpp new file mode 100644 index 0000000..d8dd38d --- /dev/null +++ b/src/Font.cpp @@ -0,0 +1,1383 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "Font.h" + +#include +#include +#include +#include + +#ifdef FREETYPE_FONTS + #include + #include FT_FREETYPE_H + #include FT_BITMAP_H +#endif + +#include "Bitmap.h" +#include "File.h" +#include "Backends/Rendering.h" +#include "Backends/Misc.h" + +// This controls however many glyphs (letters) the game can cache in VRAM at once +#define TOTAL_GLYPH_SLOTS 256 + +typedef struct Glyph +{ + unsigned long unicode_value; + + size_t x; + size_t y; + + size_t width; + size_t height; + + size_t x_offset; + size_t y_offset; + + size_t x_advance; + + struct Glyph *next; +} Glyph; + +typedef struct Font +{ +#ifdef FREETYPE_FONTS + FT_Library library; + FT_Face face; + unsigned char *data; + bool antialiasing; +#else + unsigned char *image_buffer; + size_t image_buffer_width; + size_t image_buffer_height; + size_t glyph_slot_width; + size_t glyph_slot_height; + size_t total_local_glyphs; + Glyph *local_glyphs; +#endif + Glyph glyphs[TOTAL_GLYPH_SLOTS]; + Glyph *glyph_list_head; + RenderBackend_GlyphAtlas *atlas; +} Font; + +#ifdef JAPANESE +static const unsigned short shiftjis_to_unicode_lookup[0x3100] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, + 0xFF70, 0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, + 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, + 0xFF90, 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8, 0xFF3E, + 0xFFE3, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, 0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, 0x005C, + 0x301C, 0x2016, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019, 0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D, 0xFF5B, + 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 0x2212, 0x00B1, 0x00D7, 0x0020, + 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E, 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5, + 0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20, 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, + 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x2227, 0x2228, 0x00AC, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, + 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x212B, 0x2030, 0x266F, 0x266D, 0x266A, 0x2020, 0x2021, 0x00B6, 0x0020, 0x0020, 0x0020, 0x0020, 0x25EF, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0xFF10, + 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, + 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x0020, 0x0020, 0x0020, 0x0020, 0x3041, + 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, + 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, + 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, + 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, + 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, + 0x3092, 0x3093, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, + 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, + 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, + 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x0020, + 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, + 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0391, + 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, + 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x03B1, + 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, + 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, + 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, + 0x042F, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x0020, + 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, + 0x044E, 0x044F, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x2500, + 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517, + 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x4E9C, + 0x5516, 0x5A03, 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, 0x8475, 0x831C, 0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, + 0x82A6, 0x9BF5, 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, 0x867B, 0x98F4, 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, + 0x5B89, 0x5EB5, 0x6309, 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A, 0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 0x59D4, + 0x5A01, 0x5C09, 0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570, 0x79FB, 0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, + 0x8B02, 0x9055, 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 0x80B2, 0x90C1, 0x78EF, 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, + 0x828B, 0x9C2F, 0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, 0x98F2, 0x6DEB, 0x80E4, 0x852D, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B, 0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C, 0x7ABA, 0x4E11, 0x7893, + 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D, 0x851A, 0x9C3B, 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642, 0x4E91, 0x904B, 0x96F2, + 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30, 0x5F71, 0x6620, 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B, 0x76C8, 0x7A4E, 0x9834, + 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2, 0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E, 0x53AD, 0x5186, 0x0020, + 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028, 0x63A9, 0x63F4, 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5, 0x733F, 0x7E01, + 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B, 0x5869, 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80, 0x5FDC, 0x62BC, + 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1, 0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x61B6, + 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55, 0x4F3D, 0x4FA1, + 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1, 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3, 0x706B, 0x73C2, + 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB, 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8, 0x8FE6, 0x904E, + 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259, 0x753B, 0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5, 0x4ECB, 0x4F1A, + 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB, 0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x9B41, 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, 0x82A5, 0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, 0x5916, + 0x54B3, 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, 0x8857, 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, + 0x67FF, 0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9, 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, + 0x89D2, 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3, 0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B, 0x0020, + 0x6A7F, 0x68B6, 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, 0x6D3B, 0x6E07, 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, + 0x53F6, 0x691B, 0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, 0x91DC, 0x938C, 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 0x7CA5, + 0x5208, 0x82C5, 0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7, 0x5DFB, 0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, + 0x5BDB, 0x5E72, 0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 0x63DB, 0x6562, 0x67D1, 0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, + 0x6F97, 0x6F45, 0x74B0, 0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9, 0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 0x89B3, + 0x8ACC, 0x8CAB, 0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, 0x97D3, 0x9928, 0x8218, 0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, + 0x764C, 0x773C, 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 0x9854, 0x9858, 0x4F01, 0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, + 0x5B09, 0x5BC4, 0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2, 0x671F, 0x68CB, 0x68C4, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D, 0x757F, 0x7948, 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18, 0x8CB4, 0x8D77, 0x8ECC, + 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80, 0x507D, 0x5100, 0x5993, 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A, 0x72A0, 0x7591, 0x7947, + 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC, 0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70, 0x7827, 0x6775, 0x9ECD, + 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006, 0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13, 0x6025, 0x6551, 0x0020, + 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403, 0x7A76, 0x7AAE, 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B, 0x53BB, 0x5C45, + 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A, 0x8A31, 0x8DDD, 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB, 0x4EAC, 0x4F9B, + 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6, 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37, 0x5F4A, 0x602F, + 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1, 0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7, 0x93E1, 0x97FF, + 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681, 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5, 0x52E4, 0x5747, + 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434, 0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F, 0x8B39, 0x8FD1, + 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5, 0x533A, 0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8, 0x99D2, 0x5177, + 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3, 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x6398, 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, 0x7C82, 0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, 0x85AB, + 0x8A13, 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 0x50BE, 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, + 0x5F62, 0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C, 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, + 0x7D99, 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, 0x8B66, 0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8, 0x0020, + 0x5287, 0x621F, 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, 0x6C7A, 0x6F54, 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, + 0x5039, 0x5026, 0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC, 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 0x691C, + 0x6A29, 0x727D, 0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B, 0x8B19, 0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, + 0x9855, 0x9A13, 0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 0x5F26, 0x6E1B, 0x6E90, 0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, + 0x9650, 0x4E4E, 0x500B, 0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, 0x5DF1, 0x5EAB, 0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 0x72D0, + 0x7CCA, 0x88B4, 0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, 0x96C7, 0x9867, 0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, + 0x5449, 0x543E, 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 0x6A8E, 0x745A, 0x7881, 0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, + 0x4EA4, 0x4F7C, 0x4FAF, 0x5019, 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE, 0x539A, 0x53E3, 0x5411, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D, 0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83, 0x5E9A, 0x5EB7, 0x5F18, + 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7, 0x653B, 0x6602, 0x6643, 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB, 0x6C5F, 0x6D2A, 0x6D69, + 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C, 0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003, 0x80AF, 0x80B1, 0x8154, + 0x818F, 0x822A, 0x8352, 0x884C, 0x8861, 0x8B1B, 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC, 0x95A4, 0x964D, 0x0020, + 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB, 0x53F7, 0x5408, 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9, 0x514B, 0x523B, + 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2, 0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB, 0x8FBC, 0x6B64, + 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A, 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5, 0x7D3A, 0x826E, + 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F, 0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396, 0x88DF, 0x5750, + 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700, 0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D, 0x6B73, 0x6E08, + 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D, 0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728, 0x6750, 0x7F6A, + 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A, 0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A, 0x548B, 0x643E, + 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22, 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x5BDF, 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690, 0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, 0x4E09, + 0x5098, 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 0x73CA, 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, + 0x9910, 0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, 0x523A, 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, + 0x59FF, 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, 0x652F, 0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, 0x0020, + 0x6B7B, 0x6C0F, 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 0x8102, 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, + 0x8AEE, 0x8CC7, 0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150, 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, 0x6B21, + 0x6ECB, 0x6CBB, 0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA, 0x8494, 0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, + 0x9D2B, 0x7AFA, 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 0x57F7, 0x5931, 0x5AC9, 0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, + 0x5B9F, 0x8500, 0x7BE0, 0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, 0x820E, 0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 0x716E, + 0x793E, 0x7D17, 0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA, 0x5C3A, 0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, + 0x932B, 0x82E5, 0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 0x5B88, 0x624B, 0x6731, 0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, + 0x9152, 0x9996, 0x5112, 0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, 0x7DAC, 0x9700, 0x56DA, 0x53CE, 0x5468, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101, 0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED, 0x821F, 0x8490, 0x8846, + 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031, 0x914B, 0x916C, 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341, 0x5F93, 0x620E, 0x67D4, + 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD, 0x9283, 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B, 0x587E, 0x719F, 0x51FA, + 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625, 0x77AC, 0x7AE3, 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F, 0x6B89, 0x6DF3, 0x0020, + 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075, 0x9187, 0x9806, 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A, 0x5EB6, 0x7DD2, + 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9, 0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7, 0x511F, 0x52DD, + 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531, 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11, 0x5C1A, 0x5E84, + 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB, 0x638C, 0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2, 0x6A1F, 0x6A35, + 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126, 0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0, 0x7B11, 0x7CA7, + 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D, 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4, 0x9266, 0x937E, + 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E, 0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38, 0x60C5, 0x64FE, + 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63, 0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x62ED, 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF, 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5, 0x5507, + 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, 0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, + 0x79E6, 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B, 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, + 0x58EC, 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D, 0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, 0x0020, + 0x9017, 0x5439, 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 0x7FE0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, + 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 0x6F84, + 0x647A, 0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3, 0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, + 0x6674, 0x68F2, 0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, 0x8056, 0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, + 0x901D, 0x9192, 0x9752, 0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC, 0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 0x7A4D, + 0x7C4D, 0x7E3E, 0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9, 0x63A5, 0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, + 0x8AAC, 0x96EA, 0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 0x5343, 0x5360, 0x5BA3, 0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, + 0x6813, 0x6834, 0x6CC9, 0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, 0x717D, 0x65CB, 0x7A7F, 0x7BAD, 0x7DDA, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239, 0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291, 0x9583, 0x9BAE, 0x524D, + 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985, 0x7E55, 0x81B3, 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE, 0x66FD, 0x695A, 0x72D9, + 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF, 0x7C97, 0x7D20, 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20, 0x50E7, 0x5275, 0x53CC, + 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F, 0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383, 0x633F, 0x63BB, 0x0020, + 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD, 0x6F15, 0x71E5, 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF, 0x7D9C, 0x8061, + 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5, 0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897, 0x618E, 0x81D3, + 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247, 0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7, 0x5C5E, 0x8CCA, + 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3, 0x5B58, 0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A, 0x592A, 0x6C70, + 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253, 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806, 0x5BFE, 0x8010, + 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234, 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8, 0x9000, 0x902E, + 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927, 0x7B2C, 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544, 0x5B85, 0x6258, + 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17, 0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x53E9, 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, 0x8FBF, 0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0, 0x4E39, + 0x5358, 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, 0x6E5B, 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, + 0x86CB, 0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80, 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, + 0x6065, 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045, 0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4, 0x0020, + 0x9010, 0x79E9, 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 0x5FE0, 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, + 0x8A3B, 0x914E, 0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7, 0x8457, 0x8CAF, 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 0x5E16, + 0x5E33, 0x5E81, 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, 0x671D, 0x6F6E, 0x7252, 0x753A, 0x773A, 0x8074, 0x8139, + 0x8178, 0x8776, 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 0x9577, 0x9802, 0x9CE5, 0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, + 0x8CC3, 0x93AE, 0x9673, 0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB, 0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 0x4F43, + 0x6F2C, 0x67D8, 0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, 0x576A, 0x58F7, 0x5B2C, 0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, + 0x4EAD, 0x4F4E, 0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 0x5824, 0x5B9A, 0x5E1D, 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, + 0x633A, 0x63D0, 0x68AF, 0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02, 0x8AE6, 0x8E44, 0x9013, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5, 0x6458, 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1, 0x6EBA, 0x54F2, 0x5FB9, + 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178, 0x586B, 0x5929, 0x5C55, 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC, 0x8EE2, 0x985B, 0x70B9, + 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB, 0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597, 0x675C, 0x6E21, 0x767B, + 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D, 0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012, 0x515A, 0x51AC, 0x0020, + 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5B95, 0x5CF6, 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843, 0x68BC, 0x68DF, + 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8, 0x5F53, 0x75D8, 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71, 0x5230, 0x8463, + 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F, 0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD, 0x52D5, 0x540C, + 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3, 0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F, 0x5F97, 0x5FB3, + 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2, 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A, 0x9CF6, 0x82EB, + 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7, 0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D, 0x5948, 0x90A3, + 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058, 0x637A, 0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960, 0x8EDF, 0x96E3, + 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302, 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x5982, 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, 0x79B0, 0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, 0x5FF5, + 0x637B, 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 0x56A2, 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, + 0x8997, 0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E, 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, + 0x5EC3, 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA, 0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885, 0x0020, + 0x6973, 0x7164, 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, 0x877F, 0x79E4, 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, + 0x67CF, 0x6CCA, 0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, 0x66DD, 0x6F20, 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 0x51FD, + 0x7BB1, 0x7872, 0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560, 0x516B, 0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, + 0x4F10, 0x7F70, 0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 0x5859, 0x86E4, 0x96BC, 0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, + 0x642C, 0x6591, 0x677F, 0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, 0x7554, 0x7E41, 0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 0x7169, + 0x9812, 0x98EF, 0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, 0x86EE, 0x532A, 0x5351, 0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, + 0x6249, 0x6279, 0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 0x76AE, 0x7891, 0x79D8, 0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, + 0x907F, 0x975E, 0x98DB, 0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8, 0x7435, 0x7709, 0x7F8E, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B, 0x9AED, 0x5F66, 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562, 0x7B46, 0x903C, 0x6867, + 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C, 0x4FF5, 0x5F6A, 0x6A19, 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8A55, 0x8C79, 0x5EDF, + 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328, 0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C, 0x7015, 0x8CA7, 0x8CD3, + 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8, 0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016, 0x6276, 0x6577, 0x0020, + 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150, 0x819A, 0x8299, 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644, 0x4FAE, 0x64AB, + 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01, 0x6953, 0x98A8, 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45, 0x670D, 0x798F, + 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255, 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3, 0x61A4, 0x626E, + 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0, 0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73, 0x5F0A, 0x67C4, + 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801, 0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86, 0x504F, 0x5909, + 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D, 0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA, 0x5703, 0x6355, + 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF, 0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023, 0x4FF8, 0x5305, + 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF, 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x6CD5, 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC, 0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, 0x98FD, + 0x9CF3, 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, + 0x5192, 0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632, 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, + 0x6734, 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, 0x5800, 0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, 0x0020, + 0x6469, 0x78E8, 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, 0x54E9, 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, + 0x9C52, 0x685D, 0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD, 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, 0x6F2B, + 0x8513, 0x5473, 0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A, 0x84D1, 0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, + 0x7720, 0x52D9, 0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 0x9D61, 0x690B, 0x5A7F, 0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, + 0x8FF7, 0x9298, 0x9CF4, 0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, 0x7DBF, 0x7DEC, 0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 0x5984, + 0x5B5F, 0x6BDB, 0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9, 0x76EE, 0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, + 0x7C7E, 0x8CB0, 0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 0x4E5F, 0x51B6, 0x591C, 0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, + 0x5F79, 0x7D04, 0x85AC, 0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109, 0x6108, 0x6CB9, 0x7652, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A, 0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709, 0x67DA, 0x6E67, 0x6D8C, + 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5, 0x8A98, 0x904A, 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88, 0x4F59, 0x4E0E, 0x8A89, + 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996, 0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8, 0x6D0B, 0x6EB6, 0x7194, + 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449, 0x84C9, 0x8981, 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E, 0x6291, 0x6B32, 0x0020, + 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85, 0x87BA, 0x88F8, 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61, 0x843D, 0x916A, + 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD, 0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406, 0x7483, 0x75E2, + 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B, 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C, 0x7409, 0x7559, + 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6, 0x616E, 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC, 0x5BEE, 0x6599, + 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C, 0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B, 0x7DD1, 0x502B, + 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8, 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F, 0x985E, 0x4EE4, + 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C, 0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97, 0x9F62, 0x66A6, + 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9, 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x84EE, 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF, 0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717, 0x697C, + 0x6994, 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, 0x874B, 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, + 0x502D, 0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1, 0x67A0, 0x9DF2, 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, + 0x6E7E, 0x7897, 0x8155, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x5F0C, + 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36, 0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B, 0x4E8A, 0x8212, 0x5F0D, + 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2, 0x4EB0, 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2, 0x4ED7, 0x4EDE, 0x4EED, + 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30, 0x4F5B, 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98, 0x4F7B, 0x4F69, 0x4F70, + 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118, 0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0, 0x4FE4, 0x4FE5, 0x501A, + 0x5028, 0x5014, 0x502A, 0x5025, 0x5005, 0x4F1C, 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011, 0x5006, 0x5043, 0x5047, + 0x6703, 0x5055, 0x5050, 0x5048, 0x505A, 0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED, 0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, 0x5116, + 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B, 0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169, + 0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189, 0x518F, 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9, + 0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD, 0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, 0x0020, + 0x51F0, 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A, 0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, + 0x525E, 0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, 0x528D, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, 0x8FA7, + 0x52AC, 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, 0x52E3, 0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, + 0x5306, 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 0x531A, 0x5323, 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, + 0x4E17, 0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B, 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 0x53AE, + 0x53B0, 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE, 0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, + 0x542D, 0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 0x548F, 0x5475, 0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, + 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, 0x54A5, 0x54AC, 0x54C4, 0x54C8, 0x54A8, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x54AB, 0x54C2, 0x54A4, 0x54BE, 0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE, 0x54ED, 0x54FA, 0x54E2, 0x5539, + 0x5540, 0x5563, 0x554C, 0x552E, 0x555C, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555D, 0x5599, 0x5580, 0x54AF, 0x558A, 0x559F, + 0x557B, 0x557E, 0x5598, 0x559E, 0x55AE, 0x557C, 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5, 0x55DF, 0x55C4, 0x55DC, 0x55E4, + 0x55D4, 0x5614, 0x55F7, 0x5616, 0x55FE, 0x55FD, 0x561B, 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634, 0x5636, 0x5632, 0x5638, 0x0020, + 0x566B, 0x5664, 0x562F, 0x566C, 0x566A, 0x5686, 0x5680, 0x568A, 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE, 0x56B6, 0x56B4, 0x56C2, + 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8, 0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF, 0x5704, 0x5709, 0x5708, + 0x570B, 0x570D, 0x5713, 0x5718, 0x5716, 0x55C7, 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740, 0x574F, 0x5769, 0x57C0, + 0x5788, 0x5761, 0x577F, 0x5789, 0x5793, 0x57A0, 0x57B3, 0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4, 0x57D2, 0x57D3, 0x580A, + 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D, 0x5872, 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D, 0x5879, 0x5885, 0x58B9, + 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB, 0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8, 0x58E5, 0x58DC, 0x58E4, + 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB, 0x58FC, 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925, 0x592C, 0x592D, 0x5932, + 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950, 0x594E, 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6, 0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F, 0x5A11, + 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36, 0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD, + 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C, 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43, + 0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69, 0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, 0x0020, + 0x5B83, 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4, 0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, + 0x5BF3, 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22, 0x5C28, 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, 0x5C50, + 0x5C4F, 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, 0x5C91, 0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, + 0x5CC5, 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 0x5CED, 0x5D8C, 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, + 0x5D11, 0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E, 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 0x5D82, + 0x5DA2, 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9, 0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, + 0x5DF5, 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 0x5E37, 0x5E44, 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, + 0x5E64, 0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, 0x5EC1, 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA, 0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3, 0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, + 0x5F03, 0x5F09, 0x5F5D, 0x5F5C, 0x5F0B, 0x5F11, 0x5F16, 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48, 0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, + 0x5F56, 0x5F57, 0x5F59, 0x5F61, 0x5F6D, 0x5F73, 0x5F77, 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88, 0x5F91, 0x5F87, 0x5F9E, 0x5F99, + 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD, 0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3, 0x5FFF, 0x6021, 0x6060, 0x0020, + 0x6019, 0x6010, 0x6029, 0x600E, 0x6031, 0x601B, 0x6015, 0x602B, 0x6026, 0x600F, 0x603A, 0x605A, 0x6041, 0x606A, 0x6077, 0x605F, + 0x604A, 0x6046, 0x604D, 0x6063, 0x6043, 0x6064, 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7, 0x6083, 0x609A, 0x6084, + 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7, 0x608B, 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD, 0x60C6, 0x60B5, 0x60D8, + 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7, 0x6100, 0x60F4, 0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D, 0x610E, 0x6147, 0x613E, + 0x6128, 0x6127, 0x614A, 0x613F, 0x613C, 0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615A, 0x616B, + 0x6174, 0x616F, 0x6165, 0x6171, 0x615F, 0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194, 0x619A, 0x618A, 0x6191, + 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9, 0x61F7, 0x61C8, 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD, 0x61E6, 0x61E3, 0x61F6, + 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC, 0x61FE, 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241, 0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C, 0x6282, + 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294, 0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8, + 0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, 0x630C, 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350, + 0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB, 0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B, 0x0020, + 0x6369, 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, 0x63F6, 0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, + 0x651D, 0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E, 0x652A, 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 0x64DA, + 0x64D2, 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209, 0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, + 0x64F4, 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 0x6505, 0x6524, 0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, + 0x754B, 0x6548, 0x6556, 0x6555, 0x654D, 0x6558, 0x655E, 0x655D, 0x6572, 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 0x65AB, + 0x65B7, 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, 0x65D9, 0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, + 0x6773, 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 0x6649, 0x6641, 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, + 0x6670, 0x6683, 0x6688, 0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1, 0x66B9, 0x66C9, 0x66BE, 0x66BC, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x66C4, 0x66B8, 0x66D6, 0x66DA, 0x66E0, 0x663F, 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F, 0x6716, 0x671E, 0x6726, 0x6727, + 0x9738, 0x672E, 0x673F, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, 0x675E, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67A9, + 0x677C, 0x676A, 0x678C, 0x678B, 0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3, 0x67E9, 0x67B8, 0x67E4, 0x67DE, + 0x67DD, 0x67E2, 0x67EE, 0x67B9, 0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840, 0x684D, 0x6832, 0x684E, 0x0020, + 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877, 0x687F, 0x689F, 0x688F, 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883, 0x6AAE, 0x68B9, 0x6874, + 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D, 0x687E, 0x6901, 0x68CA, 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1, 0x690C, 0x68CD, 0x68D4, + 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904, 0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A, 0x691A, 0x6923, 0x6921, + 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978, 0x696B, 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959, 0x6930, 0x6961, 0x695E, + 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE, 0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA, 0x69DD, 0x69BB, 0x69C3, + 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C, 0x6995, 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A, 0x69F9, 0x69F2, 0x69E7, + 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14, 0x69EB, 0x6A0A, 0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C, 0x6A72, 0x6A36, 0x6A78, + 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48, 0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC, 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, 0x6B05, + 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37, 0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59, + 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, 0x6B80, 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA, + 0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6, 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF, 0x0020, + 0x9EBE, 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, 0x6C55, 0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, + 0x6C7E, 0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD, 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 0x6CBA, + 0x6CDB, 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D, 0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, + 0x6D93, 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 0x6FE4, 0x6D85, 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, + 0x6DC6, 0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, 0x6DD9, 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 0x6E2E, + 0x6E19, 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, 0x6E4D, 0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, + 0x6E38, 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 0x6EBD, 0x6EAF, 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, + 0x6E9F, 0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2, 0x6F31, 0x6EEF, 0x6F32, 0x6ECC, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x6F3E, 0x6F13, 0x6EF7, 0x6F86, 0x6F7A, 0x6F78, 0x6F81, 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D, 0x6F82, 0x6F7C, 0x6F58, 0x6F8E, + 0x6F91, 0x6FC2, 0x6F66, 0x6FB3, 0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5, 0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, + 0x6FEE, 0x6FDB, 0x7009, 0x700B, 0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74, 0x701D, 0x7018, 0x701F, 0x7030, + 0x703E, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE, 0x70DF, 0x70CB, 0x70DD, 0x0020, + 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714C, 0x7156, 0x716C, 0x718F, 0x71FB, 0x7184, + 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9, 0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7, 0x71F5, 0x71FC, 0x71F9, + 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228, 0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, 0x7240, 0x7246, 0x724B, 0x7258, + 0x7274, 0x727E, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6, 0x72C4, 0x72CE, 0x72D2, + 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7, 0x500F, 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F, 0x7329, 0x7325, 0x733E, + 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A, 0x7368, 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3, 0x73CE, 0x73BB, 0x73C0, + 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405, 0x746F, 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F, 0x7459, 0x7441, 0x745C, + 0x7469, 0x7470, 0x7463, 0x746A, 0x7476, 0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1, 0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, 0x750D, + 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D, 0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567, + 0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758A, 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2, + 0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD, 0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, 0x0020, + 0x75FC, 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609, 0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, + 0x7630, 0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, 0x7662, 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, 0x7672, + 0x7676, 0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, 0x7696, 0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, + 0x76BA, 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 0x76E5, 0x76E7, 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, + 0x7724, 0x771E, 0x7725, 0x7726, 0x771B, 0x7737, 0x7738, 0x7747, 0x775A, 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 0x7779, + 0x778E, 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF, 0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, + 0x77DC, 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 0x7820, 0x792A, 0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, + 0x78A3, 0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, 0x78BE, 0x78BC, 0x78C5, 0x78CA, 0x78EC, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x78E7, 0x78DA, 0x78FD, 0x78F4, 0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, 0x7940, 0x7960, 0x7957, 0x795F, 0x795A, 0x7955, + 0x7953, 0x797A, 0x797F, 0x798A, 0x799D, 0x79A7, 0x9F4B, 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA, 0x79C9, 0x79D5, 0x79E7, 0x79EC, + 0x79E1, 0x79E3, 0x7A08, 0x7A0D, 0x7A18, 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E, 0x7A37, 0x7A43, 0x7A57, 0x7A49, + 0x7A61, 0x7A62, 0x7A69, 0x9F9D, 0x7A70, 0x7A79, 0x7A7D, 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96, 0x7AA9, 0x7AC8, 0x7AB0, 0x0020, + 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083, 0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA, 0x7ADD, 0x7AE1, 0x7AE2, + 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F, 0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28, 0x7B36, 0x7B50, 0x7B7A, + 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45, 0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E, 0x7B9D, 0x7B98, 0x7B9F, + 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92, 0x7B8F, 0x7B5D, 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4, 0x7BC6, 0x7BDD, 0x7BE9, + 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60, 0x7C00, 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6, 0x7C23, 0x7C27, 0x7C2A, + 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C, 0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64, 0x7C56, 0x7C65, 0x7C6C, + 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD, 0x7CA2, 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE, 0x7CB9, 0x7CBD, 0x7CC0, + 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC, 0x7CE2, 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32, 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72, 0x7D68, + 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D, 0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB, + 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8, 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A, + 0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22, 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, 0x0020, + 0x7E32, 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79, 0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, + 0x8FAE, 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93, 0x7E94, 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, 0x7F45, + 0x7F4C, 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, 0x7F5F, 0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, + 0x7F83, 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 0x7F9A, 0x7FA3, 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, + 0x7FC5, 0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3, 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 0x8018, + 0x8019, 0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052, 0x8058, 0x805A, 0x805F, 0x8062, 0x8068, 0x8073, 0x8072, + 0x8070, 0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 0x8085, 0x809B, 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, + 0x80D9, 0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, 0x811B, 0x8129, 0x8123, 0x812F, 0x814B, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x968B, 0x8146, 0x813E, 0x8153, 0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818A, 0x8180, 0x8182, + 0x81A0, 0x8195, 0x81A4, 0x81A3, 0x815F, 0x8193, 0x81A9, 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD, 0x81C0, 0x81C2, 0x81BA, 0x81C9, + 0x81CD, 0x81D1, 0x81D9, 0x81D8, 0x81C8, 0x81DA, 0x81DF, 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE, 0x8201, 0x8202, 0x8205, 0x8207, + 0x820A, 0x820D, 0x8210, 0x8216, 0x8229, 0x822B, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825D, 0x825A, 0x825F, 0x8264, 0x0020, + 0x8262, 0x8268, 0x826A, 0x826B, 0x822E, 0x8271, 0x8277, 0x8278, 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F, 0x82BB, 0x82AC, 0x82E1, + 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3, 0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC, 0x8309, 0x82D9, 0x8335, + 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385, 0x839A, 0x83AA, 0x839F, + 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387, 0x838A, 0x837C, 0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8, 0x83F4, 0x8413, 0x83EB, + 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B, 0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420, 0x83BD, 0x8438, 0x8506, + 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A, 0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446, 0x842C, 0x846F, 0x8479, + 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF, 0x849F, 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6, 0x84D6, 0x84A1, 0x8521, + 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C, 0x851F, 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591, 0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587, 0x859C, + 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0, 0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B, + 0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, 0x864D, 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9, + 0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0, 0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, 0x0020, + 0x86DF, 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB, 0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, + 0x8737, 0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778, 0x874C, 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, 0x8753, + 0x8763, 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, 0x87BD, 0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, + 0x87C6, 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 0x87FE, 0x87F6, 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, + 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852, 0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 0x889E, + 0x8875, 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, 0x8899, 0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, + 0x88C4, 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 0x88FC, 0x88F4, 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, + 0x891E, 0x8925, 0x892A, 0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938, 0x894C, 0x891D, 0x8960, 0x895E, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x8966, 0x8964, 0x896D, 0x896A, 0x896F, 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993, 0x8998, 0x89A1, 0x89A9, 0x89A6, + 0x89AC, 0x89AF, 0x89B2, 0x89BA, 0x89BD, 0x89BF, 0x89C0, 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4, 0x89F8, 0x8A03, 0x8A16, 0x8A10, + 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25, 0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D, 0x8A6C, 0x8A62, 0x8A85, 0x8A82, + 0x8A84, 0x8AA8, 0x8AA1, 0x8A91, 0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA, 0x8AEB, 0x8AF3, 0x8AE7, 0x0020, + 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2, 0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16, 0x8B10, 0x8B17, 0x8B20, + 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E, 0x8B28, 0x8B41, 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B, 0x8B5A, 0x8B6B, 0x8B5F, + 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80, 0x8B8C, 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A, 0x8C41, 0x8C3F, 0x8C48, + 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62, 0x8C6C, 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D, 0x8C8E, 0x8C94, 0x8C7C, + 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD, 0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3, 0x8CDA, 0x8CFD, 0x8CFA, + 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07, 0x8D0F, 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16, 0x8D67, 0x8D6D, 0x8D71, + 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE, 0x8DBA, 0x8DCF, 0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA, 0x8DEB, 0x8DDF, 0x8DE3, + 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D, 0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60, 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, 0x8E87, + 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99, 0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5, + 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE, 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F, + 0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42, 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C, 0x0020, + 0x8F62, 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, 0x8FB7, 0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, + 0x9005, 0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, 0x9016, 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 0x904F, + 0x9050, 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E, 0x9068, 0x906F, 0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, + 0x9081, 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 0x90B1, 0x90B5, 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, + 0x9132, 0x9130, 0x914A, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173, 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 0x91AF, + 0x91AA, 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, 0x91D0, 0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, + 0x921E, 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, + 0x929C, 0x9296, 0x9293, 0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9, 0x930F, 0x92FA, 0x9344, 0x932E, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x9319, 0x9322, 0x931A, 0x9323, 0x933A, 0x9335, 0x933B, 0x935C, 0x9360, 0x937C, 0x936E, 0x9356, 0x93B0, 0x93AC, 0x93AD, 0x9394, + 0x93B9, 0x93D6, 0x93D7, 0x93E8, 0x93E5, 0x93D8, 0x93C3, 0x93DD, 0x93D0, 0x93C8, 0x93E4, 0x941A, 0x9414, 0x9413, 0x9403, 0x9407, + 0x9410, 0x9436, 0x942B, 0x9435, 0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, 0x9462, 0x945E, 0x946A, 0x9229, 0x9470, + 0x9475, 0x9477, 0x947D, 0x945A, 0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594, 0x9596, 0x9598, 0x9599, 0x0020, + 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC, 0x95BB, 0x95B9, 0x95BE, 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC, 0x95D5, 0x95D4, 0x95D6, + 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621, 0x9628, 0x962E, 0x962F, 0x9642, 0x964C, 0x964F, 0x964B, 0x9677, 0x965C, 0x965E, 0x965D, + 0x965F, 0x9666, 0x9672, 0x966C, 0x968D, 0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0, 0x96B4, 0x96B6, 0x96B8, + 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD, 0x894D, 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970E, 0x9711, + 0x970F, 0x9716, 0x9719, 0x9724, 0x972A, 0x9730, 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975C, 0x9760, + 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B, 0x9771, 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 0x9786, 0x978B, 0x978F, 0x9790, 0x979C, + 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4, 0x97C3, 0x97C6, 0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2, 0x7ADF, 0x97F6, 0x97F5, + 0x980F, 0x980C, 0x9838, 0x9824, 0x9821, 0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4, 0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, 0x9914, + 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E, 0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951, + 0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD, 0x99AE, 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE, + 0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2, 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43, 0x0020, + 0x9A3E, 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, 0x9A64, 0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, + 0x9ACF, 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 0x9AFB, + 0x9B06, 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, + 0x9B4F, 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 0x9B83, 0x9B91, 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, + 0x9BCA, 0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, 0x9BE4, 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 0x9C15, + 0x9C14, 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04, 0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, + 0x9C32, 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 0x9C78, 0x9CE7, 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, + 0x9D2A, 0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41, 0x9D3F, 0x9D3E, 0x9D46, 0x9D48, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x9D5D, 0x9D5E, 0x9D64, 0x9D51, 0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A, 0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, + 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8, 0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6, 0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, + 0x9E1B, 0x9E1E, 0x9E75, 0x9E79, 0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91, 0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, + 0x9EAA, 0x9EAD, 0x9761, 0x9ECC, 0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0, 0x9EE5, 0x9EE8, 0x9EEF, 0x0020, + 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB, 0x9EFC, 0x9EFD, 0x9F07, 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C, 0x9F3E, 0x9F4A, 0x9F52, + 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61, 0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95, 0x9F9C, 0x9FA0, 0x582F, + 0x69C7, 0x9059, 0x7464, 0x51DC, 0x7199, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 +}; + +static unsigned short ShiftJISToUTF32(const unsigned char *string, size_t *bytes_read) +{ + size_t lookup_index; + + switch (string[0] & 0xF0) + { + case 0x80: + lookup_index = 0x100; + break; + case 0x90: + lookup_index = 0x1100; + break; + case 0xE0: + lookup_index = 0x2100; + break; + + default: + if (bytes_read != NULL) + *bytes_read = 1; + + return shiftjis_to_unicode_lookup[string[0]]; + } + + lookup_index += ((string[0] << 8) | string[1]) & 0xFFF; + + if (bytes_read != NULL) + *bytes_read = 2; + + return shiftjis_to_unicode_lookup[lookup_index]; +} + +#else + +static const unsigned short cp1252_to_unicode_lookup[0x100] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0020, 0x017D, 0x0020, + 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0020, 0x017E, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF +}; + +static unsigned short UTF8toUTF32_latin1(const unsigned char *string, size_t *bytes_read) +{ + switch (string[0]) + { + case 0xC3: + *bytes_read += 2; + return (string[1] + 0x40); + case 0xC2: + *bytes_read += 2; + return string[1]; + + default: + ++*bytes_read; + return string[0]; + } +} + +// This was used before we knew the original EXE was actually using CP1252. +// This function might be useful for mods and future translations, so I've left it here. + + +static unsigned long UTF8ToUTF32(const unsigned char *string, size_t *bytes_read) +{ + // TODO - check for well-formedness + size_t length; + unsigned long charcode; + + unsigned int zero_bit = 0; + for (unsigned char lead_byte = string[0]; zero_bit < 5 && (lead_byte & 0x80); ++zero_bit, lead_byte <<= 1); + + switch (zero_bit) + { + case 0: + // Single-byte character + length = 1; + charcode = string[0]; + break; + + case 2: + case 3: + case 4: + length = zero_bit; + charcode = string[0] & ((1 << (8 - zero_bit)) - 1); + + for (unsigned int i = 1; i < zero_bit; ++i) + { + if ((string[i] & 0xC0) == 0x80) + { + charcode <<= 6; + charcode |= string[i] & ~0xC0; + } + else + { + // Error: Invalid continuation byte + length = 1; + charcode = 0xFFFD; + break; + } + } + + break; + + default: + // Error: Invalid lead byte + length = 1; + charcode = 0xFFFD; + break; + + } + + if (bytes_read) + *bytes_read = length; + + return charcode; +} + +#endif + +static unsigned char GammaCorrect(unsigned char value) +{ + /* + Generated with... + for (unsigned int i = 0; i < 0x100; ++i) + lookup[i] = pow(i / 255.0, 1.0 / 1.8) * 255.0; + */ + + const unsigned char lookup[0x100] = { + 0x00, 0x0B, 0x11, 0x15, 0x19, 0x1C, 0x1F, 0x22, 0x25, 0x27, 0x2A, 0x2C, 0x2E, 0x30, 0x32, 0x34, + 0x36, 0x38, 0x3A, 0x3C, 0x3D, 0x3F, 0x41, 0x43, 0x44, 0x46, 0x47, 0x49, 0x4A, 0x4C, 0x4D, 0x4F, + 0x50, 0x51, 0x53, 0x54, 0x55, 0x57, 0x58, 0x59, 0x5B, 0x5C, 0x5D, 0x5E, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x84, + 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0x9F, 0xA0, + 0xA1, 0xA2, 0xA3, 0xA3, 0xA4, 0xA5, 0xA6, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, + 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB3, 0xB4, 0xB5, 0xB6, 0xB6, 0xB7, 0xB8, 0xB8, + 0xB9, 0xBA, 0xBB, 0xBB, 0xBC, 0xBD, 0xBD, 0xBE, 0xBF, 0xBF, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, + 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, 0xC8, 0xC8, 0xC9, 0xCA, 0xCA, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, + 0xCF, 0xD0, 0xD0, 0xD1, 0xD2, 0xD2, 0xD3, 0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, + 0xD9, 0xDA, 0xDB, 0xDB, 0xDC, 0xDC, 0xDD, 0xDE, 0xDE, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE3, + 0xE3, 0xE4, 0xE4, 0xE5, 0xE6, 0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEC, 0xEC, + 0xED, 0xED, 0xEE, 0xEF, 0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5, + 0xF6, 0xF7, 0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFF + }; + + return lookup[value]; +} + +static Glyph* GetGlyph(Font *font, unsigned long unicode_value) +{ + Glyph **glyph_pointer = &font->glyph_list_head; + Glyph *glyph; + + for (;;) + { + glyph = *glyph_pointer; + + if (glyph->unicode_value == unicode_value) + { + // Move it to the front of the list + *glyph_pointer = glyph->next; + glyph->next = font->glyph_list_head; + font->glyph_list_head = glyph; + + return glyph; + } + + if (glyph->next == NULL) + break; + + glyph_pointer = &glyph->next; + } + + // Couldn't find glyph - overwrite the old one at the end. + // The one at the end hasn't been used in a while anyway. + +#ifdef FREETYPE_FONTS + unsigned int glyph_index = FT_Get_Char_Index(font->face, unicode_value); + + if (FT_Load_Glyph(font->face, glyph_index, FT_LOAD_RENDER | (font->antialiasing ? 0 : FT_LOAD_TARGET_MONO)) == 0) + { + FT_Bitmap bitmap; + FT_Bitmap_New(&bitmap); + + if (FT_Bitmap_Convert(font->library, &font->face->glyph->bitmap, &bitmap, 1) == 0) + { + switch (font->face->glyph->bitmap.pixel_mode) + { + case FT_PIXEL_MODE_GRAY: + for (size_t y = 0; y < bitmap.rows; ++y) + { + unsigned char *pixel_pointer = &bitmap.buffer[y * bitmap.pitch]; + + for (size_t x = 0; x < bitmap.width; ++x) + { + *pixel_pointer = GammaCorrect((*pixel_pointer * 0xFF) / (bitmap.num_grays - 1)); + ++pixel_pointer; + } + } + + break; + + case FT_PIXEL_MODE_MONO: + for (size_t y = 0; y < bitmap.rows; ++y) + { + unsigned char *pixel_pointer = &bitmap.buffer[y * bitmap.pitch]; + + for (size_t x = 0; x < bitmap.width; ++x) + { + *pixel_pointer = *pixel_pointer ? 0xFF : 0; + ++pixel_pointer; + } + } + + break; + } + + glyph->unicode_value = unicode_value; + glyph->width = bitmap.width; + glyph->height = bitmap.rows; + glyph->x_offset = font->face->glyph->bitmap_left; + glyph->y_offset = (font->face->size->metrics.ascender + (64 / 2)) / 64 - font->face->glyph->bitmap_top; + glyph->x_advance = font->face->glyph->advance.x / 64; + + if (glyph->width != 0 && glyph->height != 0) // Some glyphs are just plain empty - don't bother trying to upload them + RenderBackend_UploadGlyph(font->atlas, glyph->x, glyph->y, bitmap.buffer, glyph->width, glyph->height, glyph->width); + + FT_Bitmap_Done(font->library, &bitmap); + + *glyph_pointer = glyph->next; + glyph->next = font->glyph_list_head; + font->glyph_list_head = glyph; + + return glyph; + } + + FT_Bitmap_Done(font->library, &bitmap); + } +#else + // Perform a binary search for the glyph + size_t left = 0; + size_t right = font->total_local_glyphs; + + while (right - left >= 2) + { + const size_t index = (left + right) / 2; + + if (font->local_glyphs[index].unicode_value > unicode_value) + right = index; + else + left = index; + } + + if (font->local_glyphs[left].unicode_value == unicode_value) + { + const Glyph *local_glyph = &font->local_glyphs[left]; + + glyph->unicode_value = local_glyph->unicode_value; + glyph->width = font->glyph_slot_width; + glyph->height = font->glyph_slot_height; + glyph->x_offset = 0; + glyph->y_offset = 0; + glyph->x_advance = local_glyph->x_advance; + + if (glyph->width != 0 && glyph->height != 0) // Some glyphs are just plain empty - don't bother trying to upload them + RenderBackend_UploadGlyph(font->atlas, glyph->x, glyph->y, &font->image_buffer[local_glyph->y * font->image_buffer_width + local_glyph->x], glyph->width, glyph->height, font->image_buffer_width); + + *glyph_pointer = glyph->next; + glyph->next = font->glyph_list_head; + font->glyph_list_head = glyph; + + return glyph; + } +#endif + + return NULL; +} + +#ifdef FREETYPE_FONTS +Font* LoadFreeTypeFontFromData(const unsigned char *data, size_t data_size, size_t cell_width, size_t cell_height, bool antialiasing) +{ + Font *font = (Font*)malloc(sizeof(Font)); + + if (font != NULL) + { + if (FT_Init_FreeType(&font->library) == 0) + { + font->data = (unsigned char*)malloc(data_size); + + if (font->data != NULL) + { + memcpy(font->data, data, data_size); + + if (FT_New_Memory_Face(font->library, font->data, (FT_Long)data_size, 0, &font->face) == 0) + { + // Select a rough size, for vector glyphs + FT_Size_RequestRec request; + request.type = FT_SIZE_REQUEST_TYPE_CELL; + request.width = cell_height << 6; // 'cell_height << 6' isn't a typo: it's needed by the Japanese font + request.height = cell_height << 6; + request.horiResolution = 0; + request.vertResolution = 0; + FT_Request_Size(font->face, &request); + + // If an accurate bitmap font is available, however, use that instead + for (FT_Int i = 0; i < font->face->num_fixed_sizes; ++i) + { + if (font->face->available_sizes[i].width == cell_width && font->face->available_sizes[i].height == cell_height) + { + FT_Select_Size(font->face, i); + break; + } + } + + font->glyph_list_head = NULL; + + size_t atlas_entry_width = FT_MulFix(font->face->bbox.xMax - font->face->bbox.xMin + 1, font->face->size->metrics.x_scale) / 64; + size_t atlas_entry_height = FT_MulFix(font->face->bbox.yMax - font->face->bbox.yMin + 1, font->face->size->metrics.y_scale) / 64; + + size_t atlas_columns = ceil(sqrt(atlas_entry_width * atlas_entry_height * TOTAL_GLYPH_SLOTS) / atlas_entry_width); + size_t atlas_rows = (TOTAL_GLYPH_SLOTS + (atlas_columns - 1)) / atlas_columns; + + font->atlas = RenderBackend_CreateGlyphAtlas(atlas_columns * atlas_entry_width, atlas_rows * atlas_entry_height); + + if (font->atlas != NULL) + { + // Initialise the linked-list + for (size_t i = 0; i < TOTAL_GLYPH_SLOTS; ++i) + { + font->glyphs[i].next = (i == 0) ? NULL : &font->glyphs[i - 1]; + + font->glyphs[i].x = (i % atlas_columns) * atlas_entry_width; + font->glyphs[i].y = (i / atlas_columns) * atlas_entry_height; + + font->glyphs[i].unicode_value = 0; + } + + font->glyph_list_head = &font->glyphs[TOTAL_GLYPH_SLOTS - 1]; + + font->antialiasing = antialiasing; + + return font; + } + + FT_Done_Face(font->face); + } + + free(font->data); + } + + FT_Done_FreeType(font->library); + } + + free(font); + } + + return NULL; +} + +Font* LoadFreeTypeFont(const char *font_filename, size_t cell_width, size_t cell_height, bool antialiasing) +{ + Font *font = NULL; + + size_t file_size; + unsigned char *file_buffer = LoadFileToMemory(font_filename, &file_size); + + if (file_buffer != NULL) + { + font = LoadFreeTypeFontFromData(file_buffer, file_size, cell_width, cell_height, antialiasing); + free(file_buffer); + } + + return font; +} +#else +Font* LoadBitmapFont(const char *bitmap_path, const char *metadata_path) +{ + size_t bitmap_width, bitmap_height; + unsigned char *image_buffer = DecodeBitmapFromFile(bitmap_path, &bitmap_width, &bitmap_height, 1); + + if (image_buffer != NULL) + { + size_t metadata_size; + unsigned char *metadata_buffer = LoadFileToMemory(metadata_path, &metadata_size); + + if (metadata_buffer != NULL) + { + Font *font = (Font*)malloc(sizeof(Font)); + + if (font != NULL) + { + font->glyph_slot_width = (metadata_buffer[0] << 8) | metadata_buffer[1]; + font->glyph_slot_height = (metadata_buffer[2] << 8) | metadata_buffer[3]; + font->total_local_glyphs = (metadata_buffer[4] << 8) | metadata_buffer[5]; + + font->local_glyphs = (Glyph*)malloc(sizeof(Glyph) * font->total_local_glyphs); + + if (font->local_glyphs != NULL) + { + for (size_t i = 0; i < font->total_local_glyphs; ++i) + { + font->local_glyphs[i].unicode_value = (metadata_buffer[6 + i * 4 + 0] << 8) | metadata_buffer[6 + i * 4 + 1]; + + font->local_glyphs[i].x = (i % (bitmap_width / font->glyph_slot_width)) * font->glyph_slot_width; + font->local_glyphs[i].y = (i / (bitmap_width / font->glyph_slot_width)) * font->glyph_slot_height; + + font->local_glyphs[i].width = font->glyph_slot_width; + font->local_glyphs[i].height = font->glyph_slot_height; + + font->local_glyphs[i].x_offset = 0; + font->local_glyphs[i].y_offset = 0; + + font->local_glyphs[i].x_advance = (metadata_buffer[6 + i * 4 + 2] << 8) | metadata_buffer[6 + i * 4 + 3]; + + font->local_glyphs[i].next = NULL; + } + + size_t atlas_entry_width = font->glyph_slot_width; + size_t atlas_entry_height = font->glyph_slot_height; + + size_t atlas_columns = ceil(sqrt(atlas_entry_width * atlas_entry_height * TOTAL_GLYPH_SLOTS) / atlas_entry_width); + size_t atlas_rows = (TOTAL_GLYPH_SLOTS + (atlas_columns - 1)) / atlas_columns; + + font->atlas = RenderBackend_CreateGlyphAtlas(atlas_columns * atlas_entry_width, atlas_rows * atlas_entry_height); + + if (font->atlas != NULL) + { + // Initialise the linked-list + for (size_t i = 0; i < TOTAL_GLYPH_SLOTS; ++i) + { + font->glyphs[i].next = (i == 0) ? NULL : &font->glyphs[i - 1]; + + font->glyphs[i].x = (i % atlas_columns) * atlas_entry_width; + font->glyphs[i].y = (i / atlas_columns) * atlas_entry_height; + + font->glyphs[i].unicode_value = 0; + } + + font->glyph_list_head = &font->glyphs[TOTAL_GLYPH_SLOTS - 1]; + + font->image_buffer = image_buffer; + font->image_buffer_width = bitmap_width; + font->image_buffer_height = bitmap_height; + + free(metadata_buffer); + + return font; + } + } + + free(font); + } + + free(metadata_buffer); + } + + FreeBitmap(image_buffer); + } + + return NULL; +} +#endif + +void DrawText(Font *font, RenderBackend_Surface *surface, int x, int y, unsigned long colour, const char *string) +{ + if (font != NULL && surface != NULL) + { + RenderBackend_PrepareToDrawGlyphs(font->atlas, surface, colour & 0xFF, (colour >> 8) & 0xFF, (colour >> 16) & 0xFF); + + size_t pen_x = 0; + + const unsigned char *string_pointer = (unsigned char*)string; + const unsigned char *string_end = (unsigned char*)string + strlen(string); + + while (string_pointer != string_end) + { + #ifdef JAPANESE + size_t bytes_read; + const unsigned short unicode_value = ShiftJISToUTF32(string_pointer, &bytes_read); + string_pointer += bytes_read; + #elif defined(SPANISH) + size_t bytes_read = 0; + const unsigned short unicode_value = UTF8toUTF32_latin1(string_pointer, &bytes_read); + string_pointer += bytes_read; + #else + const unsigned short unicode_value = cp1252_to_unicode_lookup[*string_pointer++]; + #endif + Glyph *glyph = GetGlyph(font, unicode_value); + + if (glyph != NULL) + { + const long letter_x = x + pen_x + glyph->x_offset; + const long letter_y = y + glyph->y_offset; + + RenderBackend_DrawGlyph(letter_x, letter_y, glyph->x, glyph->y, glyph->width, glyph->height); + + pen_x += glyph->x_advance; + } + } + } +} + +void UnloadFont(Font *font) +{ + if (font != NULL) + { + RenderBackend_DestroyGlyphAtlas(font->atlas); + + #ifdef FREETYPE_FONTS + FT_Done_Face(font->face); + free(font->data); + FT_Done_FreeType(font->library); + #else + free(font->local_glyphs); + FreeBitmap(font->image_buffer); + #endif + + free(font); + } +} diff --git a/src/Font.h b/src/Font.h new file mode 100644 index 0000000..aad83d5 --- /dev/null +++ b/src/Font.h @@ -0,0 +1,20 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +#include "Backends/Rendering.h" + +typedef struct Font Font; + +#ifdef FREETYPE_FONTS +Font* LoadFreeTypeFontFromData(const unsigned char *data, size_t data_size, size_t cell_width, size_t cell_height, bool antialiasing); +Font* LoadFreeTypeFont(const char *font_filename, size_t cell_width, size_t cell_height, bool antialiasing); +#else +Font* LoadBitmapFont(const char *bitmap_path, const char *metadata_path); +#endif + +void DrawText(Font *font, RenderBackend_Surface *surface, int x, int y, unsigned long colour, const char *string); +void UnloadFont(Font *font); diff --git a/src/Frame.cpp b/src/Frame.cpp new file mode 100644 index 0000000..6cbba65 --- /dev/null +++ b/src/Frame.cpp @@ -0,0 +1,317 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Frame.h" + +#include "Boss.h" +#include "CommonDefines.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" + +FRAME gFrame; +BOOL gbScreenShake; + +void MoveFrame3(void) +{ + short map_w, map_l; + GetMapData(0, &map_w, &map_l); + +#if WINDOW_WIDTH != 320 || WINDOW_HEIGHT != 240 + if (g_GameFlags & 8) + { + // Use the original camera boundaries during the credits + const int x_delta = -((WINDOW_WIDTH - 320) / 2) * 0x200; + const int y_delta = -((WINDOW_HEIGHT - 240) / 2) * 0x200; + + gFrame.x += (x_delta + *gFrame.tgt_x - (320 * 0x200 / 2) - gFrame.x) / gFrame.wait; + gFrame.y += (y_delta + *gFrame.tgt_y - (240 * 0x200 / 2) - gFrame.y) / gFrame.wait; + + if (gFrame.x < x_delta) + gFrame.x = x_delta; + if (gFrame.y < y_delta) + gFrame.y = y_delta; + + if (gFrame.x > x_delta + (((map_w - 1) * 16) - 320) * 0x200) + gFrame.x = x_delta + (((map_w - 1) * 16) - 320) * 0x200; + if (gFrame.y > y_delta + (((map_l - 1) * 16) - 240) * 0x200) + gFrame.y = y_delta + (((map_l - 1) * 16) - 240) * 0x200; + } + else + { + // Widescreen/tallscreen-safe behaviour + if ((map_w - 1) * 16 < WINDOW_WIDTH) + { + gFrame.x = -(((WINDOW_WIDTH - ((map_w - 1) * 16)) * 0x200) / 2); + } + else + { + gFrame.x += (*gFrame.tgt_x - (WINDOW_WIDTH * 0x200 / 2) - gFrame.x) / gFrame.wait; + + if (gFrame.x < 0) + gFrame.x = 0; + + if (gFrame.x > (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200) + gFrame.x = (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200; + } + + if ((map_l - 1) * 16 < WINDOW_HEIGHT) + { + gFrame.y = -(((WINDOW_HEIGHT - ((map_l - 1) * 16)) * 0x200) / 2); + } + else + { + gFrame.y += (*gFrame.tgt_y - (WINDOW_HEIGHT * 0x200 / 2) - gFrame.y) / gFrame.wait; + + if (gFrame.y < 0) + gFrame.y = 0; + + if (gFrame.y > (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200) + gFrame.y = (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200; + } + } +#else + // Vanilla behaviour + gFrame.x += (*gFrame.tgt_x - (WINDOW_WIDTH * 0x200 / 2) - gFrame.x) / gFrame.wait; + gFrame.y += (*gFrame.tgt_y - (WINDOW_HEIGHT * 0x200 / 2) - gFrame.y) / gFrame.wait; + + if (gFrame.x < 0) + gFrame.x = 0; + if (gFrame.y < 0) + gFrame.y = 0; + + if (gFrame.x > (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200) + gFrame.x = (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200; + if (gFrame.y > (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200) + gFrame.y = (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200; +#endif + + // Quake + if (gFrame.quake2) + { + if(gbScreenShake){ + gFrame.x += (Random(-5, 5) * 0x200); + gFrame.y += (Random(-3, 3) * 0x200); + } + --gFrame.quake2; + } + else if (gFrame.quake) + { + if(gbScreenShake){ + gFrame.x += (Random(-1, 1) * 0x200); + gFrame.y += (Random(-1, 1) * 0x200); + } + --gFrame.quake; + } + + // This code exists in the Linux port (v1.0.0.4), but not the Windows version (v1.0.0.6) or the Mac port +/* if (gFrame.x < 0) + gFrame.x = 0; + if (gFrame.y < 0) + gFrame.y = 0;*/ +} + +void GetFramePosition(int *fx, int *fy) +{ + *fx = gFrame.x; + *fy = gFrame.y; +} + +void SetFramePosition(int fx, int fy) +{ + short map_w, map_l; + + // End quake + gFrame.quake = 0; + gFrame.quake2 = 0; + + // Move frame position + GetMapData(0, &map_w, &map_l); + + gFrame.x = fx; + gFrame.y = fy; + + // Keep in bounds +#if WINDOW_WIDTH != 320 || WINDOW_HEIGHT != 240 + if (g_GameFlags & 8) + { + // Use the original camera boundaries during the credits + const int x_delta = -((WINDOW_WIDTH - 320) / 2) * 0x200; + const int y_delta = -((WINDOW_HEIGHT - 240) / 2) * 0x200; + + if (gFrame.x < x_delta) + gFrame.x = x_delta; + if (gFrame.y < y_delta) + gFrame.y = y_delta; + + if (gFrame.x > x_delta + (((map_w - 1) * 16) - 320) * 0x200) + gFrame.x = x_delta + (((map_w - 1) * 16) - 320) * 0x200; + if (gFrame.y > y_delta + (((map_l - 1) * 16) - 240) * 0x200) + gFrame.y = y_delta + (((map_l - 1) * 16) - 240) * 0x200; + } + else + { + // Widescreen/tallscreen-safe behaviour + if ((map_w - 1) * 16 < WINDOW_WIDTH) + { + gFrame.x = -(((WINDOW_WIDTH - ((map_w - 1) * 16)) * 0x200) / 2); + } + else + { + if (gFrame.x < 0) + gFrame.x = 0; + + if (gFrame.x > (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200) + gFrame.x = (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200; + } + + if ((map_l - 1) * 16 < WINDOW_HEIGHT) + { + gFrame.y = -(((WINDOW_HEIGHT - ((map_l - 1) * 16)) * 0x200) / 2); + } + else + { + if (gFrame.y < 0) + gFrame.y = 0; + + if (gFrame.y > (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200) + gFrame.y = (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200; + } + } +#else + // Vanilla behaviour + if (gFrame.x < 0) + gFrame.x = 0; + if (gFrame.y < 0) + gFrame.y = 0; + + if (gFrame.x > (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200) + gFrame.x = (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200; + if (gFrame.y > (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200) + gFrame.y = (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200; +#endif +} + +void SetFrameMyChar(void) +{ + int mc_x, mc_y; + short map_w, map_l; + + // Move frame position + GetMyCharPosition(&mc_x, &mc_y); + + GetMapData(0, &map_w, &map_l); + + gFrame.x = mc_x - ((WINDOW_WIDTH / 2) * 0x200); + gFrame.y = mc_y - ((WINDOW_HEIGHT / 2) * 0x200); + + // Keep in bounds +#if WINDOW_WIDTH != 320 || WINDOW_HEIGHT != 240 + if (g_GameFlags & 8) + { + // Use the original camera boundaries during the credits + const int x_delta = -((WINDOW_WIDTH - 320) / 2) * 0x200; + const int y_delta = -((WINDOW_HEIGHT - 240) / 2) * 0x200; + + if (gFrame.x < x_delta) + gFrame.x = x_delta; + if (gFrame.y < y_delta) + gFrame.y = y_delta; + + if (gFrame.x > x_delta + (((map_w - 1) * 16) - 320) * 0x200) + gFrame.x = x_delta + (((map_w - 1) * 16) - 320) * 0x200; + if (gFrame.y > y_delta + (((map_l - 1) * 16) - 240) * 0x200) + gFrame.y = y_delta + (((map_l - 1) * 16) - 240) * 0x200; + } + else + { + // Widescreen/tallscreen-safe behaviour + if ((map_w - 1) * 16 < WINDOW_WIDTH) + { + gFrame.x = -(((WINDOW_WIDTH - ((map_w - 1) * 16)) * 0x200) / 2); + } + else + { + if (gFrame.x < 0) + gFrame.x = 0; + + if (gFrame.x > (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200) + gFrame.x = (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200; + } + + if ((map_l - 1) * 16 < WINDOW_HEIGHT) + { + gFrame.y = -(((WINDOW_HEIGHT - ((map_l - 1) * 16)) * 0x200) / 2); + } + else + { + if (gFrame.y < 0) + gFrame.y = 0; + + if (gFrame.y > (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200) + gFrame.y = (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200; + } + } +#else + // Vanilla behaviour + if (gFrame.x < 0) + gFrame.x = 0; + if (gFrame.y < 0) + gFrame.y = 0; + + if (gFrame.x > (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200) + gFrame.x = (((map_w - 1) * 16) - WINDOW_WIDTH) * 0x200; + if (gFrame.y > (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200) + gFrame.y = (((map_l - 1) * 16) - WINDOW_HEIGHT) * 0x200; +#endif +} + +void SetFrameTargetMyChar(int wait) +{ + gFrame.tgt_x = &gMC.tgt_x; + gFrame.tgt_y = &gMC.tgt_y; + gFrame.wait = wait; +} + +void SetFrameTargetNpChar(int event, int wait) +{ + int i; + for (i = 0; i < NPC_MAX; ++i) + if (gNPC[i].code_event == event) + break; + + if (i == NPC_MAX) + return; + + gFrame.tgt_x = &gNPC[i].x; + gFrame.tgt_y = &gNPC[i].y; + gFrame.wait = wait; +} + +void SetFrameTargetBoss(int no, int wait) +{ + gFrame.tgt_x = &gBoss[no].x; + gFrame.tgt_y = &gBoss[no].y; + gFrame.wait = wait; +} + +void SetQuake(int time) +{ + gFrame.quake = time; +} + +void SetQuake2(int time) +{ + gFrame.quake2 = time; +} + +void ResetQuake(void) +{ + gFrame.quake = 0; + gFrame.quake2 = 0; +} diff --git a/src/Frame.h b/src/Frame.h new file mode 100644 index 0000000..7dafb67 --- /dev/null +++ b/src/Frame.h @@ -0,0 +1,35 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +typedef struct FRAME +{ + int x; + int y; + int *tgt_x; + int *tgt_y; + int wait; + int quake; + int quake2; +} FRAME; + +extern FRAME gFrame; +extern BOOL gbScreenShake; + +void MoveFrame3(void); +void GetFramePosition(int *fx, int *fy); +void SetFramePosition(int fx, int fy); +void SetFrameMyChar(void); +void SetFrameTargetMyChar(int wait); +void SetFrameTargetNpChar(int event, int wait); +void SetFrameTargetBoss(int no, int wait); +void SetQuake(int time); +void SetQuake2(int time); +void ResetQuake(void); diff --git a/src/Game.cpp b/src/Game.cpp new file mode 100644 index 0000000..b1bcffe --- /dev/null +++ b/src/Game.cpp @@ -0,0 +1,1047 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Game.h" + +#include +#include + +#include "WindowsWrapper.h" + +#include "Backends/Misc.h" +#include "ArmsItem.h" +#include "Back.h" +#include "Bitmap.h" +#include "Boss.h" +#include "BossLife.h" +#include "BulHit.h" +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Draw.h" +#include "Ending.h" +#include "Escape.h" +#include "Fade.h" +#include "Flags.h" +#include "Flash.h" +#include "Frame.h" +#include "Generic.h" +#include "GenericLoad.h" +#include "KeyControl.h" +#include "Main.h" +#include "Map.h" +#include "MapName.h" +#include "MiniMap.h" +#include "MyChar.h" +#include "MycHit.h" +#include "MycParam.h" +#include "NpChar.h" +#include "NpcHit.h" +#include "NpcTbl.h" +#include "Pause.h" +#include "Profile.h" +#include "Random.h" +#include "SelStage.h" +#include "Shoot.h" +#include "Sound.h" +#include "Stage.h" +#include "Star.h" +#include "TextScr.h" +#include "ValueView.h" + +int g_GameFlags; +int gCounter; +double gSpeedMultiplier; +int gCorrectedCounter; +bool gExtendedUI; +int menu_position = 0; + +RECT pauseView = {0,0,WINDOW_WIDTH, WINDOW_HEIGHT}; + +static BOOL bContinue; + +int Random(int min, int max) +{ + const int range = max - min + 1; + return (msvc_rand() % range) + min; +} + +void PutNumber4(int x, int y, int value, BOOL bZero) +{ + // Define rects + RECT rcClient = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + + RECT rect[10] = { + {0, 56, 8, 64}, + {8, 56, 16, 64}, + {16, 56, 24, 64}, + {24, 56, 32, 64}, + {32, 56, 40, 64}, + {40, 56, 48, 64}, + {48, 56, 56, 64}, + {56, 56, 64, 64}, + {64, 56, 72, 64}, + {72, 56, 80, 64}, + }; + + // Digits + int tbl[4] = {1000, 100, 10, 1}; + + int a; + int sw; + int offset; + + // Limit value + if (value > 9999) + value = 9999; + + // Go through number and draw digits + offset = 0; + sw = 0; + while (offset < 4) + { + // Get the digit that this is + a = 0; + + while (value >= tbl[offset]) + { + value -= tbl[offset]; + ++a; + ++sw; + } + + // Draw digit + if ((bZero && offset == 2) || sw != 0 || offset == 3) + PutBitmap3(&rcClient, PixelToScreenCoord(x + 8 * offset), PixelToScreenCoord(y), &rect[a], SURFACE_ID_TEXT_BOX); + + // Go to next digit + ++offset; + } +} + +// Draws black bars to cover the out-of-bounds parts of the screen +static void PutBlackBars(int fx, int fy) +{ + RECT rect; + + // Don't draw if credits are running + if (g_GameFlags & 8) + return; + + int stage_left; + int stage_top; + int stage_width; + int stage_height; + + // Force black-bars in the IronHead battle + if (gStageNo == 31) + { + stage_left = 20 * 16; + stage_top = 0; + stage_width = 320; + stage_height = 240; + } + else + { + stage_left = 0; + stage_top = 0; + stage_width = (gMap.width - 1) * 16; + stage_height = (gMap.length - 1) * 16; + } + + // Left bar + rect.left = 0; + rect.top = 0; + rect.right = stage_left - (fx / 0x200); + rect.bottom = WINDOW_HEIGHT; + CortBox(&rect, 0); + + // Right bar + rect.left = stage_left + stage_width - (fx / 0x200); + rect.top = 0; + rect.right = WINDOW_WIDTH; + rect.bottom = WINDOW_HEIGHT; + CortBox(&rect, 0); + + // Top bar + rect.left = 0; + rect.top = 0; + rect.right = WINDOW_WIDTH; + rect.bottom = stage_top - (fy / 0x200); + CortBox(&rect, 0); + + // Bottom bar + rect.left = 0; + rect.top = stage_top + stage_height - (fy / 0x200); + rect.right = WINDOW_WIDTH; + rect.bottom = WINDOW_HEIGHT; + CortBox(&rect, 0); +} + +static int ModeOpening(void) +{ + int frame_x; + int frame_y; + unsigned int wait; + + InitNpChar(); + InitCaret(); + InitStar(); + InitFade(); + InitFlash(); + InitBossLife(); + ChangeMusic(MUS_SILENCE); + TransferStage(72, 100, 3, 3); + SetFrameTargetMyChar(16); + SetFadeMask(); + + + // Reset cliprect and flags + grcGame.left = 0; +#if WINDOW_WIDTH != 320 || WINDOW_HEIGHT != 240 + // Non-vanilla: these three lines are widescreen-related + grcGame.top = 0; + grcGame.right = WINDOW_WIDTH; + grcGame.bottom = WINDOW_HEIGHT; +#endif + + g_GameFlags = 3; + + CutNoise(); + + wait = 0; + while (wait < 500) + { + // Increase timer + ++wait; + + // Get pressed keys + GetTrg(); + + // Skip intro if OK is pressed + if (gKey & gKeyOk) + break; + + // Update everything + ActNpChar(); + ActBossChar(); + ActBack(); + ResetMyCharFlag(); + HitMyCharMap(); + HitMyCharNpChar(); + HitMyCharBoss(); + HitNpCharMap(); + HitBossMap(); + HitBossBullet(); + ActCaret(); + MoveFrame3(); + ProcFade(); + + // Draw everything + CortBox(&grcFull, 0x000000); + + GetFramePosition(&frame_x, &frame_y); + PutBack(frame_x, frame_y); + PutStage_Back(frame_x, frame_y); + PutBossChar(frame_x, frame_y); + PutNpChar(frame_x, frame_y); + PutMapDataVector(frame_x, frame_y); + PutStage_Front(frame_x, frame_y); + PutFront(frame_x, frame_y); + PutBlackBars(frame_x, frame_y); + PutCaret(frame_x, frame_y); + PutFade(); + + // Update Text Script + switch (TextScriptProc()) + { + case enum_ESCRETURN_exit: + return 0; + + case enum_ESCRETURN_restart: + return 1; + } + + PutMapName(FALSE); + PutTextScript(); + PutFramePerSecound(); + + if (!Flip_SystemTask()) + return 0; + + ++gCounter; + } + + wait = Backend_GetTicks(); + while (Backend_GetTicks() < wait + 500) + { + CortBox(&grcGame, 0x000000); + PutFramePerSecound(); + if (!Flip_SystemTask()) + return 0; + } + return 2; +} + +static int ModeTitle(void) +{ + int frame_x; + int frame_y; + + int MAX_MENU_OPTIONS = 5; + bool bCanContinue = true; + int background_id = 53; + + // Set rects + RECT rcTitle = {0, 0, 144, 40}; + RECT rcPixel = {0, 0, 160, 16}; + RECT rcNew = {144, 0, 192, 16}; + RECT rcContinue = {144, 16, 192, 32}; + + RECT rcVersion = {152, 80, 208, 88}; + RECT rcPeriod = {152, 88, 208, 96}; + + // Character rects + RECT rcMyChar[4] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {0, 16, 16, 32}, + {32, 16, 48, 32}, + }; + + RECT rcCurly[4] = { + {0, 112, 16, 128}, + {16, 112, 32, 128}, + {0, 112, 16, 128}, + {32, 112, 48, 128}, + }; + + RECT rcToroko[4] = { + {64, 80, 80, 96}, + {80, 80, 96, 96}, + {64, 80, 80, 96}, + {96, 80, 112, 96}, + }; + + RECT rcKing[4] = { + {224, 48, 240, 64}, + {288, 48, 304, 64}, + {224, 48, 240, 64}, + {304, 48, 320, 64}, + }; + + RECT rcSu[4] = { + {0, 16, 16, 32}, + {32, 16, 48, 32}, + {0, 16, 16, 32}, + {48, 16, 64, 32}, + }; + + unsigned int wait; + + int anime; + int v1, v2, v3, v4; + + RECT char_rc; + int char_type; + int time_counter; + int char_y; + SurfaceID char_surf; + unsigned long back_color; + + // Reset everything + InitCaret(); + InitStar(); + CutNoise(); + + // Create variables + anime = 0; + char_type = 0; + time_counter = 0; + back_color = GetCortBoxColor(RGB(0x20, 0x20, 0x20)); + + GetCompileVersion(&v1, &v2, &v3, &v4); + + // Set state + if (IsProfile()){ + const int save_room = GetProfileStage(NULL); + + //replace if saved in prefab + if(save_room == 66 || save_room == 79){ + background_id = 62; + } + bContinue = TRUE; + } + else{ + bContinue = FALSE; + bCanContinue = FALSE; + } + + if(bContinue) + menu_position = 1; + + // Set character + time_counter = LoadTimeCounter(); + + if (time_counter && time_counter < 6 * 60 * (gb60fps ? 60 : 50)) // 6 minutes + char_type = 1; + if (time_counter && time_counter < 5 * 60 * (gb60fps ? 60 : 50)) // 5 minutes + char_type = 2; + if (time_counter && time_counter < 4 * 60 * (gb60fps ? 60 : 50)) // 4 minutes + char_type = 3; + if (time_counter && time_counter < 3 * 60 * (gb60fps ? 60 : 50)) // 3 minutes + char_type = 4; + + // Set music to character's specific music + if (char_type == 1) + ChangeMusic(MUS_RUNNING_HELL); + else if (char_type == 2) + ChangeMusic(MUS_TOROKOS_THEME); + else if (char_type == 3) + ChangeMusic(MUS_WHITE); + else if (char_type == 4) + ChangeMusic(MUS_SAFETY); + else + ChangeMusic(MUS_CAVE_STORY); + + // Reset cliprect, flags, and give the player the Nikumaru counter + grcGame.left = 0; +#if WINDOW_WIDTH != 320 || WINDOW_HEIGHT != 240 + // Non-vanilla: these three lines are widescreen-related + grcGame.top = 0; + grcGame.right = WINDOW_WIDTH; + grcGame.bottom = WINDOW_HEIGHT; +#endif + + g_GameFlags = 0; + gMC.equip |= EQUIP_NIKUMARU_COUNTER; // Give the player the Nikumaru Counter so the timer appears on-screen + + // Start loop + wait = 0; + + std::string path; + + path = gTMT[background_id].back; + + InitBack(path.c_str(), gTMT[background_id].bkType); + GetFramePosition(&frame_x, &frame_y); + + while (1) + { + // Don't accept selection for 10 frames + if (wait < 10) + ++wait; + + // Get pressed keys + GetTrg(); + + // Quit when OK is pressed + if (wait >= 10) + { + if (gKeyTrg & gKeyOk) + { + if(menu_position == 0 || menu_position == 1){ + PlaySoundObject(18, SOUND_MODE_PLAY); + break; + } + if(menu_position == 2){ + switch (Call_Options(0)) + { + case enum_ESCRETURN_exit: + return 0; + + case enum_ESCRETURN_restart: + return 1; + } + } + if(menu_position == 3){ + switch (Call_Tweaks(0)) + { + case enum_ESCRETURN_exit: + return 0; + + case enum_ESCRETURN_restart: + return 1; + } + } + if(menu_position == 4){ + // Quit the game, no prompt + return 0; + } + } + } + + // Move cursor + if (gKeyTrg & (gKeyUp | gKeyDown)) + { + PlaySoundObject(1, SOUND_MODE_PLAY); + + if (gKeyTrg & gKeyUp){ + menu_position--; + + if(menu_position == 1 && !bCanContinue){ + menu_position--; + } + + if (menu_position < 0){ + menu_position = MAX_MENU_OPTIONS - 1; + } + } + + if(gKeyTrg & gKeyDown){ + ++menu_position; + + if(menu_position == 1 && !bCanContinue){ + ++menu_position; + } + + if(menu_position >= MAX_MENU_OPTIONS){ + menu_position = 0; + } + } + + if (menu_position == 0){ + bContinue = FALSE; + } + if(menu_position == 1){ + bContinue = TRUE; + } + } + + // Update carets + ActCaret(); + + // Animate character cursor + if (++anime >= 40) + anime = 0; + + // Draw moon background + if(anime %2 == 0) + ActBack(); + PutBack(frame_x, frame_y); + + RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + PutBitmap3(&rcView, 0, 0, &pauseView, SURFACE_ID_MENU_OVERLAY); + + // Draw version + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 60), PixelToScreenCoord(WINDOW_HEIGHT - 24), &rcVersion, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 4), PixelToScreenCoord(WINDOW_HEIGHT - 24), &rcPeriod, SURFACE_ID_TEXT_BOX); + + PutNumber4((WINDOW_WIDTH / 2) - 20, WINDOW_HEIGHT - 24, v1, FALSE); + PutNumber4((WINDOW_WIDTH / 2) - 4, WINDOW_HEIGHT - 24, v2, FALSE); + PutNumber4((WINDOW_WIDTH / 2) + 12, WINDOW_HEIGHT - 24, v3, FALSE); + PutNumber4((WINDOW_WIDTH / 2) + 28, WINDOW_HEIGHT - 24, v4, FALSE); + + // Draw main title + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 67), PixelToScreenCoord(33), &rcTitle, SURFACE_ID_TITLE); + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 80), PixelToScreenCoord(WINDOW_HEIGHT - 48), &rcPixel, SURFACE_ID_PIXEL); + + // Draw title menu text + // PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 24), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 32), &rcNew, SURFACE_ID_TITLE); + // PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 24), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 12), &rcContinue, SURFACE_ID_TITLE); + + PutText((WINDOW_WIDTH / 2) - 20, (WINDOW_HEIGHT / 2) - 37, menu_strings_table[NEW_GAME], RGB(0xF7, 0xF7, 0xEA)); + PutText((WINDOW_WIDTH / 2) - 20, (WINDOW_HEIGHT / 2) - 17, menu_strings_table[CONTINUE], bCanContinue? RGB(0xF7, 0xF7, 0xEA): RGB(0x80, 0x80, 0x80) ); + PutText((WINDOW_WIDTH / 2) - 20, (WINDOW_HEIGHT / 2) + 3, menu_strings_table[OPTIONS], RGB(0xF7, 0xF7, 0xEA)); + PutText((WINDOW_WIDTH / 2) - 20, (WINDOW_HEIGHT / 2) + 23, menu_strings_table[TWEAKS], RGB(0xF7, 0xF7, 0xEA)); + PutText((WINDOW_WIDTH / 2) - 20, (WINDOW_HEIGHT / 2) + 43, menu_strings_table[QUIT], RGB(0xF7, 0xF7, 0xEA)); + + // Draw character cursor + switch (char_type) + { + case 0: + char_rc = rcMyChar[anime / 10 % 4]; + char_surf = SURFACE_ID_MY_CHAR; + break; + case 1: + char_rc = rcCurly[anime / 10 % 4]; + char_surf = SURFACE_ID_NPC_REGU; + break; + case 2: + char_rc = rcToroko[anime / 10 % 4]; + char_surf = SURFACE_ID_NPC_REGU; + break; + case 3: + char_rc = rcKing[anime / 10 % 4]; + char_surf = SURFACE_ID_NPC_REGU; + break; + case 4: + char_rc = rcSu[anime / 10 % 4]; + char_surf = SURFACE_ID_NPC_REGU; + break; + } + + char_y = (WINDOW_HEIGHT / 2) - 38 + 20*menu_position; + + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 40), PixelToScreenCoord(char_y), &char_rc, char_surf); + + // Draw carets + PutCaret(0, 0); + + if (time_counter) + PutTimeCounter(16, 8); + + PutFramePerSecound(); + + if (!Flip_SystemTask()) + return 0; + } + + ChangeMusic(MUS_SILENCE); + + // Black screen when option is selected + wait = Backend_GetTicks(); + while (Backend_GetTicks() < wait + 1000) + { + CortBox(&grcGame, 0); + PutFramePerSecound(); + if (!Flip_SystemTask()) + return 0; + } + + return 3; +} + +static int ModeAction(void) +{ + int frame_x; + int frame_y; + + unsigned int swPlay; + unsigned long color = GetCortBoxColor(RGB(0, 0, 0x20)); + + swPlay = 1; + + // Reset stuff + gCounter = 0; + gCorrectedCounter = 0; + grcGame.left = 0; +#if WINDOW_WIDTH != 320 || WINDOW_HEIGHT != 240 + // Non-vanilla: these three lines are widescreen-related + grcGame.top = 0; + grcGame.right = WINDOW_WIDTH; + grcGame.bottom = WINDOW_HEIGHT; +#endif + g_GameFlags = 3; + + CONFIGDATA conf; + if (!LoadConfigData(&conf)) + DefaultConfigData(&conf); + + switch(conf.damage_modifier){ + case 0: + gbDamageModifier = 1; + break; + case 1: + gbDamageModifier = 2; + break; + case 2: + gbDamageModifier = -1; + break; + case 3: + gbDamageModifier = 0; + break; + case 4: + gbDamageModifier = 0.5; + break; + default: + gbDamageModifier = 1; + break; + } + + gbNoExpDrops = conf.bNoExpDrops; + gbAutoFire = conf.autoFire; + gbScreenShake = conf.bScreenShake; + gbGraceJump = conf.bGraceJumps; + gFlashMode = conf.flash_mode; + gDefaultBooster = conf.defaultBooster; + gExtendedUI = conf.bExtendedUI; + gbInfiniteAmmo = conf.bInfiniteAmmo; + + switch(conf.game_speed_multiplier){ + case 0: + gSpeedMultiplier = 0.5; + break; + case 1: + gSpeedMultiplier = 0.6; + break; + case 2: + gSpeedMultiplier = 0.7; + break; + case 3: + gSpeedMultiplier = 0.8; + break; + case 4: + gSpeedMultiplier = 0.9; + break; + case 5: + gSpeedMultiplier = 1; + break; + case 6: + gSpeedMultiplier = 1.1; + break; + case 7: + gSpeedMultiplier = 1.2; + break; + case 8: + gSpeedMultiplier = 1.3; + break; + case 9: + gSpeedMultiplier = 1.4; + break; + case 10: + gSpeedMultiplier = 1.5; + break; + default: + gSpeedMultiplier = 1; + break; + } + + switch(conf.boss_health_multiplier){ + case 0: + gBossHPMultiplier = 1; + break; + case 1: + gBossHPMultiplier = 1.5; + break; + case 2: + gBossHPMultiplier = 2; + break; + case 3: + gBossHPMultiplier = -1; + break; + case 4: + gBossHPMultiplier = 0.5; + break; + default: + gBossHPMultiplier = 1; + break; + } + + // Initialize everything + InitMyChar(); + InitNpChar(); + InitBullet(); + InitCaret(); + InitStar(); + InitFade(); + InitFlash(); + ClearArmsData(); + ClearItemData(); + ClearPermitStage(); + StartMapping(); + InitFlags(); + InitBossLife(); + + if (bContinue) + { + if (!LoadProfile(NULL) && !InitializeGame()) + return 0; + } + else + { + if (!InitializeGame()) + return 0; + } + + while (1) + { + // Get pressed keys + const int speed_corrected_timer = (int)(gCounter*gSpeedMultiplier); + + if(speed_corrected_timer > gCorrectedCounter){ + GetTrg(); + } + + if (gKey & KEY_PAUSE) + { + BackupSurface(SURFACE_ID_SCREEN_GRAB,&pauseView); + switch (Call_Pause(1)) + { + case enum_ESCRETURN_exit: + return 0; + + case enum_ESCRETURN_restart: + return 1; + } + } + + // Escape menu + if (gKey & KEY_ESCAPE) + { + switch (Call_Escape()) + { + case enum_ESCRETURN_exit: + return 0; + + case enum_ESCRETURN_restart: + return 1; + } + } + + if (swPlay % 2 && g_GameFlags & 1) // The "swPlay % 2" part is always true + { + if (gSpeedMultiplier == 1){ + if (g_GameFlags & 2) + ActMyChar(TRUE); + else + ActMyChar(FALSE); + + ActStar(); + ActNpChar(); + ActBossChar(); + ActValueView(); + ActBack(); + ResetMyCharFlag(); + HitMyCharMap(); + HitMyCharNpChar(); + HitMyCharBoss(); + HitNpCharMap(); + HitBossMap(); + HitBulletMap(); + HitNpCharBullet(); + HitBossBullet(); + if (g_GameFlags & 2) + ShootBullet(); + ActBullet(); + ActCaret(); + MoveFrame3(); + #ifdef FIX_BUGS + // ActFlash uses frame_x and frame_y uninitialised + GetFramePosition(&frame_x, &frame_y); + #endif + ActFlash(frame_x, frame_y); + + if (g_GameFlags & 2) + AnimationMyChar(TRUE); + else + AnimationMyChar(FALSE); + } + else if(speed_corrected_timer > gCorrectedCounter){ + for (int i = gCorrectedCounter; i < speed_corrected_timer; i++){ + if (g_GameFlags & 2) + ActMyChar(TRUE); + else + ActMyChar(FALSE); + + ActStar(); + ActNpChar(); + ActBossChar(); + ActValueView(); + ActBack(); + ResetMyCharFlag(); + HitMyCharMap(); + HitMyCharNpChar(); + HitMyCharBoss(); + HitNpCharMap(); + HitBossMap(); + HitBulletMap(); + HitNpCharBullet(); + HitBossBullet(); + if (g_GameFlags & 2) + ShootBullet(); + ActBullet(); + ActCaret(); + MoveFrame3(); + #ifdef FIX_BUGS + // ActFlash uses frame_x and frame_y uninitialised + GetFramePosition(&frame_x, &frame_y); + #endif + ActFlash(frame_x, frame_y); + + if (g_GameFlags & 2) + AnimationMyChar(TRUE); + else + AnimationMyChar(FALSE); + } + } + } + + if (g_GameFlags & 8) + { + ActionCredit(); + ActionIllust(); + ActionStripper(); + } + + ProcFade(); + CortBox(&grcFull, color); + GetFramePosition(&frame_x, &frame_y); + PutBack(frame_x, frame_y); + PutStage_Back(frame_x, frame_y); + PutBossChar(frame_x, frame_y); + PutNpChar(frame_x, frame_y); + PutBullet(frame_x, frame_y); + PutMyChar(frame_x, frame_y); + PutStar(frame_x, frame_y); + PutMapDataVector(frame_x, frame_y); + PutStage_Front(frame_x, frame_y); + PutFront(frame_x, frame_y); + PutBlackBars(frame_x, frame_y); + PutFlash(); + PutCaret(frame_x, frame_y); + PutValueView(frame_x, frame_y); + PutBossLife(); + PutFade(); + + if (!(g_GameFlags & 4)) + { + // Open inventory + if (gKeyTrg & gKeyItem) + { + BackupSurface(SURFACE_ID_SCREEN_GRAB, &grcGame); + + switch (CampLoop()) + { + case enum_ESCRETURN_exit: + return 0; + + case enum_ESCRETURN_restart: + return 1; + } + + gMC.cond &= ~1; + } + else if (gMC.equip & EQUIP_MAP && gKeyTrg & gKeyMap) + { + BackupSurface(SURFACE_ID_SCREEN_GRAB, &grcGame); + + switch (MiniMapLoop()) + { + case enum_ESCRETURN_exit: + return 0; + + case enum_ESCRETURN_restart: + return 1; + } + } + } + + if (g_GameFlags & 2) + { + if (gKeyTrg & gKeyArms) + RotationArms(); + else if (gKeyTrg & gKeyArmsRev) + RotationArmsRev(); + } + + if (swPlay % 2) // This is always true + { + switch (TextScriptProc()) + { + case enum_ESCRETURN_exit: + return 0; + + case enum_ESCRETURN_restart: + return 1; + } + } + + PutMapName(FALSE); + PutTimeCounter(16, 8); + + if (g_GameFlags & 2) + { + PutMyLife(TRUE); + PutArmsEnergy(TRUE); + if(gExtendedUI){ + if(gMC.equip & 0x1 || gMC.equip & 0x20 || gDefaultBooster != 0) + PutMyBooster(); + +#ifndef JAPANESE + PutMusicName(); +#endif + } + + PutMyAir((WINDOW_WIDTH / 2) - 40, (WINDOW_HEIGHT / 2) - 16); + PutActiveArmsList(); + } + + if (g_GameFlags & 8) + { + PutIllust(); + PutStripper(); + } + + PutTextScript(); + + PutFramePerSecound(); + + if (!Flip_SystemTask()) + return 0; + + ++gCounter; + + gCorrectedCounter = speed_corrected_timer; + } + + return 0; +} + +BOOL Game(void) +{ + int mode; + + CONFIGDATA conf; + if (!LoadConfigData(&conf)) + DefaultConfigData(&conf); + + + gFilterIndex = conf.color_filter; + gbUseJoystick = conf.bUseJoystick; + + if (!LoadGenericData()) + { + #if !defined(JAPANESE) && defined(FIX_BUGS) // The Aeon Genesis translation didn't translate this + Backend_ShowMessageBox("Error", "Couldn't read general purpose files"); + #else + Backend_ShowMessageBox("エラー", "汎用ファイルが読めない"); + #endif + return FALSE; + } + + PlaySoundObject(7, SOUND_MODE_PLAY_LOOP); + + std::string path = gDataPath + "/npc.tbl"; + + if (!LoadNpcTable(path.c_str())) + { + #if !defined(JAPANESE) && defined(FIX_BUGS) // The Aeon Genesis translation didn't translate this + Backend_ShowMessageBox("Error", "Couldn't read the NPC table"); + #else + Backend_ShowMessageBox("エラー", "NPCテーブルが読めない"); + #endif + return FALSE; + } + + LoadStageTable(); + + InitTextScript2(); + InitSkipFlags(); + InitMapData2(); + InitCreditScript(); + + mode = 1; + while (mode) + { + if (mode == 1) + mode = ModeOpening(); + if (mode == 2) + mode = ModeTitle(); + if (mode == 3) + mode = ModeAction(); + } + + PlaySoundObject(7, SOUND_MODE_STOP); + + EndMapData(); + EndTextScript(); + ReleaseNpcTable(); + ReleaseCreditScript(); + + return TRUE; +} diff --git a/src/Game.h b/src/Game.h new file mode 100644 index 0000000..4510905 --- /dev/null +++ b/src/Game.h @@ -0,0 +1,45 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +enum GameFlagsValues +{ + // To be continued + + /** + * While this bit is NOT set, the game will : + * - Disable manual movement of the character + * - Disable shooting bullets + * - Disable shooting Curly's nemesis + * - Disable changing weapons + * - Disable speeding up the display of text in TSC scripts + * - Disable damage of the character + * - Not display the HUD (Life, EXP, air, weapons) + * - Disable animation of the character + * - Disable movement of the inventory cursor + * - Disable getting out of the inventory while on the item section + * - Create a bullet if some other conditions are fullfilled while iterating over the stars in ActStar (If you have any idea of how that actually works, you may + * want to replace this line with a better explanation) + */ + GAME_FLAG_IS_CONTROL_ENABLED = 2 + + // To be continued +}; + +extern int g_GameFlags; +extern int gCounter; +extern int gCorrectedCounter; +extern double gSpeedMultiplier; +extern bool gExtendedUI; + +int Random(int min, int max); +void PutNumber4(int x, int y, int value, BOOL bZero); + +BOOL Game(void); diff --git a/src/Generic.cpp b/src/Generic.cpp new file mode 100644 index 0000000..5275a11 --- /dev/null +++ b/src/Generic.cpp @@ -0,0 +1,168 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Generic.h" + +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "Main.h" + +void GetCompileDate(int *year, int *month, int *day) +{ + int i; + char strMonth[0x10]; + + const char *table[13] = { + "XXX", + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }; + + sscanf(__DATE__, "%s %d %d", strMonth, day, year); // The expansion of __DATE__ is not reproductible. TODO : Think about changing this to be reproductible + + for (i = 0; i < 12; ++i) // This being 12 instead of 13 might be a bug, but it works anyway by accident + if (!memcmp(&strMonth, table[i], 3)) + break; + + *month = i; +} + +BOOL GetCompileVersion(int *v1, int *v2, int *v3, int *v4) +{ + *v1 = 1; + *v2 = 0; + *v3 = 0; + *v4 = 6; + return TRUE; +} + +void DeleteLog(void) +{ + std::string path; + + path = gModulePath + "/debug.txt"; + remove(path.c_str()); +} + +BOOL WriteLog(const char *string, int value1, int value2, int value3) +{ + std::string path; + FILE *fp; + + path = gModulePath + "/debug.txt"; + fp = fopen(path.c_str(), "a+"); + + if (fp == NULL) + return FALSE; + + fprintf(fp, "%s,%d,%d,%d\n", string, value1, value2, value3); + fclose(fp); + return TRUE; +} + +BOOL IsKeyFile(const char *name) +{ + std::string path; + FILE *fp; + + path = gModulePath + '/' + name; + + fp = fopen(path.c_str(), "rb"); + + if (fp == NULL) + return FALSE; + + fclose(fp); + return TRUE; +} + +long GetFileSizeLong(const char *path) +{ + long len; + FILE *fp; + + len = 0; + + fp = fopen(path, "rb"); + if (fp == NULL) + return -1; + + fseek(fp, 0, SEEK_END); + len = ftell(fp); + fclose(fp); + return len; +} + +BOOL ErrorLog(const char *string, int value) +{ + std::string path; + FILE *fp; + + path = gModulePath + "/error.log"; + + if (GetFileSizeLong(path.c_str()) > 0x19000) // Purge the error log if it gets too big, I guess + remove(path.c_str()); + + fp = fopen(path.c_str(), "a+"); + if (fp == NULL) + return FALSE; + + fprintf(fp, "%s,%d\n", string, value); + fclose(fp); + return TRUE; +} + +BOOL IsShiftJIS(unsigned char c) +{ + if (c >= 0x81 && c <= 0x9F) + return TRUE; + + if (c >= 0xE0 && c <= 0xEF) + return TRUE; + + return FALSE; +} + +static const char* const extra_text = "(C)Pixel"; + +BOOL IsEnableBitmap(const char *path) +{ + FILE *fp; + long len; + char str[16]; + + len = (long)strlen(extra_text); + + fp = fopen(path, "rb"); + + if (fp == NULL) + return FALSE; + + fseek(fp, len * -1, SEEK_END); + fread(str, 1, len, fp); + fclose(fp); + + if (memcmp(str, extra_text, len)) + return FALSE; + + return TRUE; +} diff --git a/src/Generic.h b/src/Generic.h new file mode 100644 index 0000000..8fb18d3 --- /dev/null +++ b/src/Generic.h @@ -0,0 +1,20 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +void GetCompileDate(int *year, int *month, int *day); +BOOL GetCompileVersion(int *v1, int *v2, int *v3, int *v4); +void DebugLog(void); +BOOL WriteLog(const char *string, int value1, int value2, int value3); +BOOL IsKeyFile(const char *name); +long GetFileSizeLong(const char *path); +BOOL ErrorLog(const char *string, int value); +BOOL IsShiftJIS(unsigned char c); +BOOL IsEnableBitmap(const char *path); diff --git a/src/GenericLoad.cpp b/src/GenericLoad.cpp new file mode 100644 index 0000000..dbe7e5c --- /dev/null +++ b/src/GenericLoad.cpp @@ -0,0 +1,362 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "GenericLoad.h" + +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" +#include "Draw.h" +#include "Backends/Misc.h" +#include "Ending.h" +#ifdef EXTRA_SOUND_FORMATS +#include "ExtraSoundFormats.h" +#endif +#include "Main.h" +#include "PixTone.h" +#include "Sound.h" + +enum +{ + SOUND_TYPE_PIXTONE, + SOUND_TYPE_OTHER +}; + +static const struct +{ + int slot; + const char *path; + int type; +} ptp_table[] = { + // TODO - Name the files + {1, "PixTone/001.pxt", SOUND_TYPE_PIXTONE}, + {2, "PixTone/002.pxt", SOUND_TYPE_PIXTONE}, + {3, "PixTone/003.pxt", SOUND_TYPE_PIXTONE}, + {4, "PixTone/004.pxt", SOUND_TYPE_PIXTONE}, + {5, "PixTone/005.pxt", SOUND_TYPE_PIXTONE}, + {6, "PixTone/006.pxt", SOUND_TYPE_PIXTONE}, + {7, "PixTone/007.pxt", SOUND_TYPE_PIXTONE}, + {11, "PixTone/011.pxt", SOUND_TYPE_PIXTONE}, + {12, "PixTone/012.pxt", SOUND_TYPE_PIXTONE}, + {14, "PixTone/014.pxt", SOUND_TYPE_PIXTONE}, + {15, "PixTone/015.pxt", SOUND_TYPE_PIXTONE}, + {16, "PixTone/016.pxt", SOUND_TYPE_PIXTONE}, + {17, "PixTone/017.pxt", SOUND_TYPE_PIXTONE}, + {18, "PixTone/018.pxt", SOUND_TYPE_PIXTONE}, + {20, "PixTone/020.pxt", SOUND_TYPE_PIXTONE}, + {21, "PixTone/021.pxt", SOUND_TYPE_PIXTONE}, + {22, "PixTone/022.pxt", SOUND_TYPE_PIXTONE}, + {23, "PixTone/023.pxt", SOUND_TYPE_PIXTONE}, + {24, "PixTone/024.pxt", SOUND_TYPE_PIXTONE}, + {25, "PixTone/025.pxt", SOUND_TYPE_PIXTONE}, + {26, "PixTone/026.pxt", SOUND_TYPE_PIXTONE}, + {27, "PixTone/027.pxt", SOUND_TYPE_PIXTONE}, + {28, "PixTone/028.pxt", SOUND_TYPE_PIXTONE}, + {29, "PixTone/029.pxt", SOUND_TYPE_PIXTONE}, + {30, "PixTone/030.pxt", SOUND_TYPE_PIXTONE}, + {31, "PixTone/031.pxt", SOUND_TYPE_PIXTONE}, + {32, "PixTone/032.pxt", SOUND_TYPE_PIXTONE}, + {33, "PixTone/033.pxt", SOUND_TYPE_PIXTONE}, + {34, "PixTone/034.pxt", SOUND_TYPE_PIXTONE}, + {35, "PixTone/035.pxt", SOUND_TYPE_PIXTONE}, + {37, "PixTone/037.pxt", SOUND_TYPE_PIXTONE}, + {38, "PixTone/038.pxt", SOUND_TYPE_PIXTONE}, + {39, "PixTone/039.pxt", SOUND_TYPE_PIXTONE}, + {40, "PixTone/040.pxt", SOUND_TYPE_PIXTONE}, + {41, "PixTone/041.pxt", SOUND_TYPE_PIXTONE}, + {42, "PixTone/042.pxt", SOUND_TYPE_PIXTONE}, + {43, "PixTone/043.pxt", SOUND_TYPE_PIXTONE}, + {44, "PixTone/044.pxt", SOUND_TYPE_PIXTONE}, + {45, "PixTone/045.pxt", SOUND_TYPE_PIXTONE}, + {46, "PixTone/046.pxt", SOUND_TYPE_PIXTONE}, + {47, "PixTone/047.pxt", SOUND_TYPE_PIXTONE}, + {48, "PixTone/048.pxt", SOUND_TYPE_PIXTONE}, + {49, "PixTone/049.pxt", SOUND_TYPE_PIXTONE}, + {50, "PixTone/050.pxt", SOUND_TYPE_PIXTONE}, + {51, "PixTone/051.pxt", SOUND_TYPE_PIXTONE}, + {52, "PixTone/052.pxt", SOUND_TYPE_PIXTONE}, + {53, "PixTone/053.pxt", SOUND_TYPE_PIXTONE}, + {54, "PixTone/054.pxt", SOUND_TYPE_PIXTONE}, + {55, "PixTone/055.pxt", SOUND_TYPE_PIXTONE}, + {56, "PixTone/056.pxt", SOUND_TYPE_PIXTONE}, + {57, "PixTone/057.pxt", SOUND_TYPE_PIXTONE}, + {58, "PixTone/058.pxt", SOUND_TYPE_PIXTONE}, + {59, "PixTone/059.pxt", SOUND_TYPE_PIXTONE}, + {60, "PixTone/060.pxt", SOUND_TYPE_PIXTONE}, + {61, "PixTone/061.pxt", SOUND_TYPE_PIXTONE}, + {62, "PixTone/062.pxt", SOUND_TYPE_PIXTONE}, + {63, "PixTone/063.pxt", SOUND_TYPE_PIXTONE}, + {64, "PixTone/064.pxt", SOUND_TYPE_PIXTONE}, + {65, "PixTone/065.pxt", SOUND_TYPE_PIXTONE}, + {70, "PixTone/070.pxt", SOUND_TYPE_PIXTONE}, + {71, "PixTone/071.pxt", SOUND_TYPE_PIXTONE}, + {72, "PixTone/072.pxt", SOUND_TYPE_PIXTONE}, + {100, "PixTone/100.pxt", SOUND_TYPE_PIXTONE}, + {101, "PixTone/101.pxt", SOUND_TYPE_PIXTONE}, + {102, "PixTone/102.pxt", SOUND_TYPE_PIXTONE}, + {103, "PixTone/103.pxt", SOUND_TYPE_PIXTONE}, + {104, "PixTone/104.pxt", SOUND_TYPE_PIXTONE}, + {105, "PixTone/105.pxt", SOUND_TYPE_PIXTONE}, + {106, "PixTone/106.pxt", SOUND_TYPE_PIXTONE}, + {107, "PixTone/107.pxt", SOUND_TYPE_PIXTONE}, + {108, "PixTone/108.pxt", SOUND_TYPE_PIXTONE}, + {109, "PixTone/109.pxt", SOUND_TYPE_PIXTONE}, + {110, "PixTone/110.pxt", SOUND_TYPE_PIXTONE}, + {111, "PixTone/111.pxt", SOUND_TYPE_PIXTONE}, + {112, "PixTone/112.pxt", SOUND_TYPE_PIXTONE}, + {113, "PixTone/113.pxt", SOUND_TYPE_PIXTONE}, + {114, "PixTone/114.pxt", SOUND_TYPE_PIXTONE}, + {115, "PixTone/115.pxt", SOUND_TYPE_PIXTONE}, + {116, "PixTone/116.pxt", SOUND_TYPE_PIXTONE}, + {117, "PixTone/117.pxt", SOUND_TYPE_PIXTONE}, + {150, "PixTone/150.pxt", SOUND_TYPE_PIXTONE}, + {151, "PixTone/151.pxt", SOUND_TYPE_PIXTONE}, + {152, "PixTone/152.pxt", SOUND_TYPE_PIXTONE}, + {153, "PixTone/153.pxt", SOUND_TYPE_PIXTONE}, + {154, "PixTone/154.pxt", SOUND_TYPE_PIXTONE}, + {155, "PixTone/155.pxt", SOUND_TYPE_PIXTONE} +}; + +// Original decompiled from `PTone103.exe` - has since been modified +static BOOL LoadPixToneFile(const char *filename, PIXTONEPARAMETER *pixtone_parameters) +{ + BOOL success = FALSE; + + FILE *fp = fopen(filename, "r"); + + if (fp != NULL) + { + fseek(fp, 0, SEEK_END); + const size_t file_size = ftell(fp); + rewind(fp); + + char *file_buffer = (char*)malloc(file_size); + fread(file_buffer, 1, file_size, fp); + + fclose(fp); + + char *p = file_buffer; + + for (unsigned int i = 0; i < 4; ++i) + { + float freq; + int increment; + sscanf(p, "use :%d\n%n", &pixtone_parameters[i].use, &increment); + p += increment; + sscanf(p, "size :%d\n%n", &pixtone_parameters[i].size, &increment); + p += increment; + sscanf(p, "main_model :%d\n%n", &pixtone_parameters[i].oMain.model, &increment); + p += increment; + sscanf(p, "main_freq :%f\n%n", &freq, &increment); + p += increment; + pixtone_parameters[i].oMain.num = freq; + sscanf(p, "main_top :%d\n%n", &pixtone_parameters[i].oMain.top, &increment); + p += increment; + sscanf(p, "main_offset :%d\n%n", &pixtone_parameters[i].oMain.offset, &increment); + p += increment; + sscanf(p, "pitch_model :%d\n%n", &pixtone_parameters[i].oPitch.model, &increment); + p += increment; + sscanf(p, "pitch_freq :%f\n%n", &freq, &increment); + p += increment; + pixtone_parameters[i].oPitch.num = freq; + sscanf(p, "pitch_top :%d\n%n", &pixtone_parameters[i].oPitch.top, &increment); + p += increment; + sscanf(p, "pitch_offset :%d\n%n", &pixtone_parameters[i].oPitch.offset, &increment); + p += increment; + sscanf(p, "volume_model :%d\n%n", &pixtone_parameters[i].oVolume.model, &increment); + p += increment; + sscanf(p, "volume_freq :%f\n%n", &freq, &increment); + p += increment; + pixtone_parameters[i].oVolume.num = freq; + sscanf(p, "volume_top :%d\n%n", &pixtone_parameters[i].oVolume.top, &increment); + p += increment; + sscanf(p, "volume_offset:%d\n%n", &pixtone_parameters[i].oVolume.offset, &increment); + p += increment; + sscanf(p, "initialY:%d\n%n", &pixtone_parameters[i].initial, &increment); + p += increment; + sscanf(p, "ax :%d\n%n", &pixtone_parameters[i].pointAx, &increment); + p += increment; + sscanf(p, "ay :%d\n%n", &pixtone_parameters[i].pointAy, &increment); + p += increment; + sscanf(p, "bx :%d\n%n", &pixtone_parameters[i].pointBx, &increment); + p += increment; + sscanf(p, "by :%d\n%n", &pixtone_parameters[i].pointBy, &increment); + p += increment; + sscanf(p, "cx :%d\n%n", &pixtone_parameters[i].pointCx, &increment); + p += increment; + sscanf(p, "cy :%d\n\n%n", &pixtone_parameters[i].pointCy, &increment); + p += increment; + } + + free(file_buffer); + + success = TRUE; + } + + return success; +} + +BOOL ReloadAll(void){ + BOOL bError; + + bError = FALSE; + if (!ReloadBitmap_File("Resource/BITMAP/pixel", SURFACE_ID_PIXEL, 0, false)) + bError = TRUE; + if (!ReloadBitmap_File("MyChar", SURFACE_ID_MY_CHAR, 1, false)) + bError = TRUE; + if (!ReloadBitmap_File("Title", SURFACE_ID_TITLE, false, false)) + bError = TRUE; + if (!ReloadBitmap_File("ArmsImage", SURFACE_ID_ARMS_IMAGE, 1, false)) + bError = TRUE; + if (!ReloadBitmap_File("Arms", SURFACE_ID_ARMS, 1, false)) + bError = TRUE; + if (!ReloadBitmap_File("ItemImage", SURFACE_ID_ITEM_IMAGE, 1, false)) + bError = TRUE; + if (!ReloadBitmap_File("StageImage", SURFACE_ID_STAGE_ITEM, 1, false)) + bError = TRUE; + if (!ReloadBitmap_File("Npc/NpcSym", SURFACE_ID_NPC_SYM, 1, false)) + bError = TRUE; + if (!ReloadBitmap_File("Npc/NpcRegu", SURFACE_ID_NPC_REGU, 1, false)) + bError = TRUE; + if (!ReloadBitmap_File("TextBox", SURFACE_ID_TEXT_BOX, 0, false)) + bError = TRUE; + if (!ReloadBitmap_File("Caret", SURFACE_ID_CARET, 0, false)) + bError = TRUE; + if (!ReloadBitmap_File("Bullet", SURFACE_ID_BULLET, 0, false)) + bError = TRUE; + if (!ReloadBitmap_File("Face", SURFACE_ID_FACE, 3, false)) + bError = TRUE; + if (!ReloadBitmap_File("Fade", SURFACE_ID_FADE, 0, false)) + bError = TRUE; + if (!ReloadBitmap_File("Resource/BITMAP/Credit01", SURFACE_ID_CREDITS_IMAGE, 2, false)) + bError = TRUE; + if(!ReloadBitmap_File("fgOverlay",SURFACE_ID_MENU_OVERLAY, 0, false)) + bError = TRUE; + if(!ReloadBitmap_File("mapFrame",SURFACE_ID_MAP_CARET, false, false)) + bError = TRUE; + + if(bError) + return FALSE; + + return TRUE; +} + +BOOL LoadGenericData(void) +{ + int pt_size; + BOOL bError; + + bError = FALSE; + if (!MakeSurface_File("Resource/BITMAP/pixel", SURFACE_ID_PIXEL, false)) + bError = TRUE; + + if (!MakeSurface_File("MyChar", SURFACE_ID_MY_CHAR, true)) + bError = TRUE; + + if (!MakeSurface_File("Title", SURFACE_ID_TITLE, false)) + bError = TRUE; + + if (!MakeSurface_File("ArmsImage", SURFACE_ID_ARMS_IMAGE, 1)) + bError = TRUE; + + if (!MakeSurface_File("Arms", SURFACE_ID_ARMS, true)) + bError = TRUE; + + if (!MakeSurface_File("ItemImage", SURFACE_ID_ITEM_IMAGE, true)) + bError = TRUE; + + if (!MakeSurface_File("StageImage", SURFACE_ID_STAGE_ITEM, true)) + bError = TRUE; + + if (!MakeSurface_File("Npc/NpcSym", SURFACE_ID_NPC_SYM, true)) + bError = TRUE; + + if (!MakeSurface_File("Npc/NpcRegu", SURFACE_ID_NPC_REGU, true)) + bError = TRUE; + + if (!MakeSurface_File("TextBox", SURFACE_ID_TEXT_BOX, false)) + bError = TRUE; + + if (!MakeSurface_File("Caret", SURFACE_ID_CARET, false)) + bError = TRUE; + + if (!MakeSurface_File("Bullet", SURFACE_ID_BULLET, false)) + bError = TRUE; + + if (!MakeSurface_File("Face", SURFACE_ID_FACE, 3)) + bError = TRUE; + + if (!MakeSurface_File("Fade", SURFACE_ID_FADE, false)) + bError = TRUE; + + if (!MakeSurface_File("Resource/BITMAP/Credit01", SURFACE_ID_CREDITS_IMAGE, 2)) + bError = TRUE; + + if(!MakeSurface_File("fgOverlay",SURFACE_ID_MENU_OVERLAY, false)) + bError = TRUE; + if(!MakeSurface_File("mapFrame",SURFACE_ID_MAP_CARET, false)) + bError = TRUE; + + if (bError) + return FALSE; + + MakeSurface_Generic(WINDOW_WIDTH, WINDOW_HEIGHT, SURFACE_ID_SCREEN_GRAB, TRUE, TRUE); + MakeSurface_Generic(320, 240, SURFACE_ID_LEVEL_BACKGROUND, FALSE, FALSE); + MakeSurface_Generic(WINDOW_WIDTH, WINDOW_HEIGHT, SURFACE_ID_MAP, TRUE, TRUE); + MakeSurface_Generic(320, 240, SURFACE_ID_CASTS, FALSE, FALSE); + MakeSurface_Generic(256, 256, SURFACE_ID_LEVEL_TILESET, FALSE, FALSE); + MakeSurface_Generic(256, 256, SURFACE_ID_LEVEL_TILESET_2, FALSE, FALSE); + MakeSurface_Generic(160, 16, SURFACE_ID_ROOM_NAME, FALSE, TRUE); + MakeSurface_Generic(40, 240, SURFACE_ID_VALUE_VIEW, FALSE, TRUE); + MakeSurface_Generic(320, 240, SURFACE_ID_LEVEL_SPRITESET_1, FALSE, FALSE); + MakeSurface_Generic(320, 240, SURFACE_ID_LEVEL_SPRITESET_2, FALSE, FALSE); + MakeSurface_Generic(320, 16 * (MAX_STRIP - 1), SURFACE_ID_CREDIT_CAST, FALSE, TRUE); + + pt_size = 0; + + for (unsigned int i = 0; i < sizeof(ptp_table) / sizeof(ptp_table[0]); ++i) + { + std::string path = gDataPath + '/' + ptp_table[i].path; + + switch (ptp_table[i].type) + { + case SOUND_TYPE_PIXTONE: + PIXTONEPARAMETER pixtone_parameters[4]; + + if (LoadPixToneFile(path.c_str(), pixtone_parameters)) + { + int ptp_num = 0; + while (pixtone_parameters[ptp_num].use && ptp_num < 4) + ++ptp_num; + + pt_size += MakePixToneObject(pixtone_parameters, ptp_num, ptp_table[i].slot); + } + + break; + +#ifdef EXTRA_SOUND_FORMATS + case SOUND_TYPE_OTHER: + ExtraSound_LoadSFX(path.c_str(), ptp_table[i].slot); + break; +#endif + } + } + + // Commented-out, since ints *technically* have an undefined length +/* + char str[0x40]; + sprintf(str, "PixTone = %d byte", pt_size); + // There must have once been a 'OutputDebugStringA' call here or something. + // See 'EnumDevices_Callback' in 'Input.cpp' for an example of this. +*/ + + return TRUE; +} diff --git a/src/GenericLoad.h b/src/GenericLoad.h new file mode 100644 index 0000000..f95ece4 --- /dev/null +++ b/src/GenericLoad.h @@ -0,0 +1,15 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#include "PixTone.h" + +BOOL LoadGenericData(void); +BOOL ReloadAll(void); diff --git a/src/Input.cpp b/src/Input.cpp new file mode 100644 index 0000000..deb3308 --- /dev/null +++ b/src/Input.cpp @@ -0,0 +1,75 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Input.h" + +#include + +#include "Backends/Controller.h" + +#include "WindowsWrapper.h" + +static int joystick_neutral_x = 0; +static int joystick_neutral_y = 0; + +void ReleaseDirectInput(void) +{ + ControllerBackend_Deinit(); +} + +BOOL InitDirectInput(void) +{ + return ControllerBackend_Init(); +} + +BOOL GetJoystickStatus(DIRECTINPUTSTATUS *status) +{ + const size_t button_limit = sizeof(status->bButton) / sizeof(status->bButton[0]); + + bool *buttons; + unsigned int button_count; + + short *axes; + unsigned int axis_count; + + if (!ControllerBackend_GetJoystickStatus(&buttons, &button_count, &axes, &axis_count)) + return FALSE; + + if (button_count > button_limit) + button_count = button_limit; + + for (unsigned int i = 0; i < button_count; ++i) + status->bButton[i] = buttons[i]; + + for (unsigned int i = button_count; i < button_limit; ++i) + status->bButton[i] = FALSE; + + return TRUE; +} + +BOOL ResetJoystickStatus(void) +{ + bool *buttons; + unsigned int button_count; + + short *axes; + unsigned int axis_count; + + if (!ControllerBackend_GetJoystickStatus(&buttons, &button_count, &axes, &axis_count)) + return FALSE; + + joystick_neutral_x = 0; + joystick_neutral_y = 0; + + if (axis_count >= 1) + joystick_neutral_x = axes[0]; + + if (axis_count >= 2) + joystick_neutral_y = axes[1]; + + return TRUE; +} diff --git a/src/Input.h b/src/Input.h new file mode 100644 index 0000000..40f2d67 --- /dev/null +++ b/src/Input.h @@ -0,0 +1,20 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +struct DIRECTINPUTSTATUS +{ + BOOL bButton[128]; // The original `Input.cpp` assumed there were 32 buttons (because of DirectInput's `DIJOYSTATE` struct) +}; + +void ReleaseDirectInput(void); +BOOL InitDirectInput(void); +BOOL GetJoystickStatus(DIRECTINPUTSTATUS *status); +BOOL ResetJoystickStatus(void); diff --git a/src/KeyControl.cpp b/src/KeyControl.cpp new file mode 100644 index 0000000..04e925d --- /dev/null +++ b/src/KeyControl.cpp @@ -0,0 +1,43 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "KeyControl.h" + +#include "Backends/Misc.h" +#include "Input.h" +#include "Draw.h" + +bool gKeyboardState[BACKEND_KEYBOARD_TOTAL]; +DIRECTINPUTSTATUS gJoystickState; + +long gKey; +long gKeyTrg; + +long gKeyJump = KEY_JUMP; +long gKeyShot = KEY_SHOT; +long gKeyArms = KEY_ARMS; +long gKeyArmsRev = KEY_ARMSREV; +long gKeyItem = KEY_ITEM; +long gKeyMap = KEY_MAP; + +long gKeyStrafe = KEY_STRAFE; + +long gKeyOk = KEY_OK; +long gKeyCancel = KEY_CANCEL; + +long gKeyLeft = gMirrorMode? KEY_RIGHT: KEY_LEFT; +long gKeyUp = KEY_UP; +long gKeyRight = gMirrorMode? KEY_LEFT: KEY_RIGHT; +long gKeyDown = KEY_DOWN; + +void GetTrg(void) +{ + static int key_old; + gKeyTrg = gKey ^ key_old; + gKeyTrg = gKey & gKeyTrg; + key_old = gKey; +} diff --git a/src/KeyControl.h b/src/KeyControl.h new file mode 100644 index 0000000..07ccb13 --- /dev/null +++ b/src/KeyControl.h @@ -0,0 +1,66 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "Backends/Misc.h" +#include "Input.h" + +enum KeyBind +{ + //The movement keys go in the order of left, right, up and down + KEY_LEFT = 0x00000001, + KEY_RIGHT = 0x00000002, + KEY_UP = 0x00000004, + KEY_DOWN = 0x00000008, + //Map key + KEY_MAP = 0x00000010, + //Jump and Shoot keys + KEY_SHOT = 0x00000020, + KEY_JUMP = 0x00000040, + //Left and right weapon switch keys + KEY_ARMS = 0x00000080, + KEY_ARMSREV = 0x00000100, + //Function keys + KEY_F1 = 0x00000400, + KEY_F2 = 0x00000800, + //Inventory + KEY_ITEM = 0x00001000, + //Okay and cancel keys + KEY_OK = 0x00002000, + KEY_CANCEL = 0x00004000, + //Escape key + KEY_ESCAPE = 0x00008000, + //Pause key + KEY_PAUSE = 0x00010000, + KEY_STRAFE = 0x00020000, +}; + +extern bool gKeyboardState[BACKEND_KEYBOARD_TOTAL]; +extern DIRECTINPUTSTATUS gJoystickState; + +extern long gKey; +extern long gKeyTrg; + +extern long gKeyJump; +extern long gKeyShot; +extern long gKeyArms; +extern long gKeyArmsRev; +extern long gKeyItem; +extern long gKeyMap; + +extern long gKeyStrafe; + +extern long gKeyOk; +extern long gKeyCancel; + +extern long gKeyLeft; +extern long gKeyUp; +extern long gKeyRight; +extern long gKeyDown; + +void GetTrg(void); diff --git a/src/Main.cpp b/src/Main.cpp new file mode 100644 index 0000000..dd26f58 --- /dev/null +++ b/src/Main.cpp @@ -0,0 +1,498 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Main.h" + +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "Backends/Misc.h" +#include "Bitmap.h" +#include "CommonDefines.h" +#include "Config.h" +#include "Draw.h" +#ifdef EXTRA_SOUND_FORMATS +#include "ExtraSoundFormats.h" +#endif +#include "Game.h" +#include "Generic.h" +#include "Input.h" +#include "KeyControl.h" +#include "MyChar.h" +#include "Organya.h" +#include "Profile.h" +#include "Resource.h" +#include "Stage.h" +#include "Sound.h" +#include "Triangle.h" + +void InactiveWindow(void); +void ActiveWindow(void); + +std::string gModulePath; +std::string gDataPath; +std::string gSpritePath; + +BOOL bFullscreen; +BOOL gbUseJoystick; + +CONFIG_BINDING bindings[BINDING_TOTAL]; + +static BOOL bActive = TRUE; +static BOOL bFPS = FALSE; + +#ifdef JAPANESE +static const char* const lpWindowName = "洞窟物語"; // "Cave Story" +#else +static const char* const lpWindowName = "Cave Story ~ Doukutsu Monogatari"; +#endif + +static void DragAndDropCallback(const char *path) +{ + LoadProfile(path); +} + +static void WindowFocusCallback(bool focus) +{ + if (focus) + ActiveWindow(); + else + InactiveWindow(); +} + +// Framerate stuff +static unsigned long CountFramePerSecound(void) +{ + unsigned long current_tick; // The original name for this variable is unknown + static BOOL first = TRUE; + static unsigned long max_count; + static unsigned long count; + static unsigned long wait; + + if (first) + { + wait = Backend_GetTicks(); + first = FALSE; + } + + current_tick = Backend_GetTicks(); + ++count; + + if (wait + 1000 <= current_tick) + { + wait += 1000; + max_count = count; + count = 0; + } + + return max_count; +} + +void PutFramePerSecound(void) +{ + if (bFPS) + { + const unsigned long fps = CountFramePerSecound(); + PutNumber4(WINDOW_WIDTH - 40, 8, fps, FALSE); + } +} + +// TODO - Inaccurate stack frame +int main(int argc, char *argv[]) +{ + (void)argc; + + if (!Backend_Init(DragAndDropCallback, WindowFocusCallback)) + return EXIT_FAILURE; + + + // Get executable's path, and path of the data fol|der + if (!Backend_GetPaths(&gModulePath, &gDataPath)) + { + // Fall back on argv[0] if the backend cannot provide a path + gModulePath = argv[0]; + + for (size_t i = gModulePath.length();; --i) + { + if (i == 0 || gModulePath[i] == '\\' || gModulePath[i] == '/') + { + gModulePath.resize(i); + break; + } + } + + gDataPath = gModulePath + "/data"; + } + + CONFIGDATA conf; + if (!LoadConfigData(&conf)) + DefaultConfigData(&conf); + + gSpriteScale = 1 + conf.graphics_set; + + gSpritePath = gDataPath + (gSpriteScale == 2? "/sprites_up": "/sprites_og"); + + gSoundtrack = conf.soundtrack; + gDimmingFactor = (4.0 - conf.backgroundBrightness)/4; + + memcpy(bindings, conf.bindings, sizeof(bindings)); + + RECT unused_rect = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + + switch (conf.display_mode) + { + default: + // Windowed + + #ifdef FIX_MAJOR_BUGS + if (!StartDirectDraw(lpWindowName, conf.display_mode, conf.b60fps, conf.bSmoothScrolling, conf.bVsync)) + { + Backend_Deinit(); + return EXIT_FAILURE; + } + #else + // Doesn't handle StartDirectDraw failing + StartDirectDraw(lpWindowName, conf.display_mode, conf.b60fps, conf.bSmoothScrolling, conf.bVsync); + #endif + + break; + + case 0: + // Fullscreen + + #ifdef FIX_MAJOR_BUGS + if (!StartDirectDraw(lpWindowName, 0, conf.b60fps, conf.bSmoothScrolling, conf.bVsync)) + { + Backend_Deinit(); + return EXIT_FAILURE; + } + #else + // Doesn't handle StartDirectDraw failing + StartDirectDraw(lpWindowName, 0, conf.b60fps, conf.bSmoothScrolling, conf.bVsync); + #endif + + bFullscreen = TRUE; + + Backend_HideMouse(); + break; + } + +#ifdef DEBUG_SAVE + Backend_EnableDragAndDrop(); +#endif + + // Set up window icon +#ifndef _WIN32 // On Windows, we use native icons instead (so we can give the taskbar and window separate icons, like the original EXE does) + size_t window_icon_resource_size; + const unsigned char *window_icon_resource_data = FindResource("ICON_MINI", "ICON", &window_icon_resource_size); + + if (window_icon_resource_data != NULL) + { + size_t window_icon_width, window_icon_height; + unsigned char *window_icon_rgb_pixels = DecodeBitmap(window_icon_resource_data, window_icon_resource_size, &window_icon_width, &window_icon_height, 3); + + if (window_icon_rgb_pixels != NULL) + { + Backend_SetWindowIcon(window_icon_rgb_pixels, window_icon_width, window_icon_height); + FreeBitmap(window_icon_rgb_pixels); + } + } +#endif + + // Set up the cursor + std::string cursor_path = gSpritePath + "/Resource/CURSOR/CURSOR_NORMAL.png"; + + size_t cursor_width, cursor_height; + unsigned char *cursor_rgba_pixels = DecodeBitmapFromFile(cursor_path.c_str(), &cursor_width, &cursor_height, 4); + + if (cursor_rgba_pixels != NULL) + { + Backend_SetCursor(cursor_rgba_pixels, cursor_width, cursor_height); + FreeBitmap(cursor_rgba_pixels); + } + + if (IsKeyFile("fps")) + bFPS = TRUE; + + // Set rects + RECT rcLoading = {0, 0, 64, 8}; + RECT rcFull = {0, 0, 0, 0}; + rcFull.right = WINDOW_WIDTH; + rcFull.bottom = WINDOW_HEIGHT; + + // Load the "LOADING" text + BOOL b = MakeSurface_File("Loading", SURFACE_ID_LOADING, false); + + // Draw loading screen + CortBox(&rcFull, 0x000000); + PutBitmap3(&rcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) - 32), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 4), &rcLoading, SURFACE_ID_LOADING); + + // Draw to screen + if (!Flip_SystemTask()) + { + Backend_Deinit(); + return EXIT_SUCCESS; + } + + // Initialize sound + InitDirectSound(); + + // Initialize joystick + InitDirectInput(); + + // Initialize stuff +#ifdef JAPANESE + const FONT_DATA f_data = {"Zpix", 10, 10, 18, 18}; + + gbFontData = f_data; +#else + const FONT_DATA f_data[] = { + {"opendyslexic", 15, 15, 29, 30}, + {"monogram", 13, 13, 26, 26}, + {"lekton", 12, 12, 26, 26}, + {"courier", 12, 12, 26, 26}, + }; + + gbFontData = f_data[conf.font_select]; +#endif + + InitTextObject("hi"); + + InitTriangleTable(); + + // Run game code + Game(); + + // End stuff + EndTextObject(); + EndDirectSound(); + EndDirectDraw(); + + Backend_Deinit(); + + return EXIT_SUCCESS; +} + +void InactiveWindow(void) +{ + if (bActive) + { + bActive = FALSE; + StopOrganyaMusic(); +#ifdef EXTRA_SOUND_FORMATS + ExtraSound_Stop(); +#endif + SleepNoise(); + } + + PlaySoundObject(7, SOUND_MODE_STOP); +} + +void ActiveWindow(void) +{ + if (!bActive) + { + bActive = TRUE; + StopOrganyaMusic(); + PlayOrganyaMusic(); +#ifdef EXTRA_SOUND_FORMATS + ExtraSound_Play(); +#endif + ResetNoise(); + } + + PlaySoundObject(7, SOUND_MODE_PLAY_LOOP); +} + +void JoystickProc(void); + +BOOL SystemTask(void) +{ + static bool previous_keyboard_state[BACKEND_KEYBOARD_TOTAL]; + + do + { + if (!Backend_SystemTask(bActive)) + { + StopOrganyaMusic(); + return FALSE; + } + } while(!bActive); + + Backend_GetKeyboardState(gKeyboardState); + + for (unsigned int i = 0; i < BACKEND_KEYBOARD_TOTAL; ++i) + { + if (gKeyboardState[i] && !previous_keyboard_state[i]) + { + if (i == BACKEND_KEYBOARD_ESCAPE) + gKey |= KEY_ESCAPE; + else if (i == BACKEND_KEYBOARD_F1) + gKey |= KEY_F1; + else if (i == BACKEND_KEYBOARD_F2) + gKey |= KEY_F2; + + if (i == bindings[BINDING_MAP].keyboard) + gKey |= KEY_MAP; + if (i == bindings[BINDING_LEFT].keyboard) + gKey |= KEY_LEFT; + if (i == bindings[BINDING_RIGHT].keyboard) + gKey |= KEY_RIGHT; + if (i == bindings[BINDING_UP].keyboard) + gKey |= KEY_UP; + if (i == bindings[BINDING_DOWN].keyboard) + gKey |= KEY_DOWN; + if (i == bindings[BINDING_SHOT].keyboard) + gKey |= KEY_SHOT; + if (i == bindings[BINDING_JUMP].keyboard) + gKey |= KEY_JUMP; + if (i == bindings[BINDING_ARMS].keyboard) + gKey |= KEY_ARMS; + if (i == bindings[BINDING_ARMSREV].keyboard) + gKey |= KEY_ARMSREV; + if (i == bindings[BINDING_ITEM].keyboard) + gKey |= KEY_ITEM; + if (i == bindings[BINDING_CANCEL].keyboard) + gKey |= KEY_CANCEL; + if (i == bindings[BINDING_OK].keyboard) + gKey |= KEY_OK; + if (i == bindings[BINDING_PAUSE].keyboard) + gKey |= KEY_PAUSE; + if (i == bindings[BINDING_STRAFE].keyboard) + gKey |= KEY_STRAFE; + } + else if (!gKeyboardState[i] && previous_keyboard_state[i]) + { + if (i == BACKEND_KEYBOARD_ESCAPE) + gKey &= ~KEY_ESCAPE; + else if (i == BACKEND_KEYBOARD_F1) + gKey &= ~KEY_F1; + else if (i == BACKEND_KEYBOARD_F2) + gKey &= ~KEY_F2; + + if (i == bindings[BINDING_MAP].keyboard) + gKey &= ~KEY_MAP; + if (i == bindings[BINDING_LEFT].keyboard) + gKey &= ~KEY_LEFT; + if (i == bindings[BINDING_RIGHT].keyboard) + gKey &= ~KEY_RIGHT; + if (i == bindings[BINDING_UP].keyboard) + gKey &= ~KEY_UP; + if (i == bindings[BINDING_DOWN].keyboard) + gKey &= ~KEY_DOWN; + if (i == bindings[BINDING_SHOT].keyboard) + gKey &= ~KEY_SHOT; + if (i == bindings[BINDING_JUMP].keyboard) + gKey &= ~KEY_JUMP; + if (i == bindings[BINDING_ARMS].keyboard) + gKey &= ~KEY_ARMS; + if (i == bindings[BINDING_ARMSREV].keyboard) + gKey &= ~KEY_ARMSREV; + if (i == bindings[BINDING_ITEM].keyboard) + gKey &= ~KEY_ITEM; + if (i == bindings[BINDING_CANCEL].keyboard) + gKey &= ~KEY_CANCEL; + if (i == bindings[BINDING_OK].keyboard) + gKey &= ~KEY_OK; + if (i == bindings[BINDING_PAUSE].keyboard) + gKey &= ~KEY_PAUSE; + if (i == bindings[BINDING_STRAFE].keyboard) + gKey &= ~KEY_STRAFE; + } + } + + memcpy(previous_keyboard_state, gKeyboardState, sizeof(gKeyboardState)); + + // Run joystick code + if(gbUseJoystick){ + JoystickProc(); + } + + return TRUE; +} + +void JoystickProc(void) +{ + int i; + static DIRECTINPUTSTATUS old_status; + + if (!GetJoystickStatus(&gJoystickState)) + memset(&gJoystickState, 0, sizeof(gJoystickState)); + + // Set held buttons + for (i = 0; i < sizeof(gJoystickState.bButton) / sizeof(gJoystickState.bButton[0]); ++i) + { + if (gJoystickState.bButton[i] && !old_status.bButton[i]) + { + if (i == bindings[BINDING_MAP].controller) + gKey |= KEY_MAP; + if (i == bindings[BINDING_LEFT].controller) + gKey |= KEY_LEFT; + if (i == bindings[BINDING_RIGHT].controller) + gKey |= KEY_RIGHT; + if (i == bindings[BINDING_UP].controller) + gKey |= KEY_UP; + if (i == bindings[BINDING_DOWN].controller) + gKey |= KEY_DOWN; + if (i == bindings[BINDING_SHOT].controller) + gKey |= KEY_SHOT; + if (i == bindings[BINDING_JUMP].controller) + gKey |= KEY_JUMP; + if (i == bindings[BINDING_ARMS].controller) + gKey |= KEY_ARMS; + if (i == bindings[BINDING_ARMSREV].controller) + gKey |= KEY_ARMSREV; + if (i == bindings[BINDING_ITEM].controller) + gKey |= KEY_ITEM; + if (i == bindings[BINDING_CANCEL].controller) + gKey |= KEY_CANCEL; + if (i == bindings[BINDING_OK].controller) + gKey |= KEY_OK; + if (i == bindings[BINDING_PAUSE].controller) + gKey |= KEY_PAUSE; + if (i == bindings[BINDING_STRAFE].controller) + gKey |= KEY_STRAFE; + } + else if (!gJoystickState.bButton[i] && old_status.bButton[i]) + { + if (i == bindings[BINDING_MAP].controller) + gKey &= ~KEY_MAP; + if (i == bindings[BINDING_LEFT].controller) + gKey &= ~KEY_LEFT; + if (i == bindings[BINDING_RIGHT].controller) + gKey &= ~KEY_RIGHT; + if (i == bindings[BINDING_UP].controller) + gKey &= ~KEY_UP; + if (i == bindings[BINDING_DOWN].controller) + gKey &= ~KEY_DOWN; + if (i == bindings[BINDING_SHOT].controller) + gKey &= ~KEY_SHOT; + if (i == bindings[BINDING_JUMP].controller) + gKey &= ~KEY_JUMP; + if (i == bindings[BINDING_ARMS].controller) + gKey &= ~KEY_ARMS; + if (i == bindings[BINDING_ARMSREV].controller) + gKey &= ~KEY_ARMSREV; + if (i == bindings[BINDING_ITEM].controller) + gKey &= ~KEY_ITEM; + if (i == bindings[BINDING_CANCEL].controller) + gKey &= ~KEY_CANCEL; + if (i == bindings[BINDING_OK].controller) + gKey &= ~KEY_OK; + if (i == bindings[BINDING_PAUSE].controller) + gKey &= ~KEY_PAUSE; + if (i == bindings[BINDING_STRAFE].controller) + gKey &= ~KEY_STRAFE; + } + } + + old_status = gJoystickState; +} diff --git a/src/Main.h b/src/Main.h new file mode 100644 index 0000000..7a28d8f --- /dev/null +++ b/src/Main.h @@ -0,0 +1,30 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +#include "WindowsWrapper.h" + +#include "Config.h" +#include "Input.h" + +extern std::string gModulePath; +extern std::string gDataPath; +extern std::string gSpritePath; + +extern BOOL bFullscreen; +extern BOOL gbUseJoystick; + +extern int gJoystickButtonTable[8]; + +extern CONFIG_BINDING bindings[BINDING_TOTAL]; + +void PutFramePerSecound(void); + +BOOL SystemTask(void); diff --git a/src/Map.cpp b/src/Map.cpp new file mode 100644 index 0000000..b3549c2 --- /dev/null +++ b/src/Map.cpp @@ -0,0 +1,317 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Map.h" + +#include +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" +#include "Draw.h" +#include "File.h" +#include "Main.h" +#include "NpChar.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +#define PXM_BUFFER_SIZE 0x4B000 + +MAP_DATA gMap; + +const char *code_pxma = "PXM"; + +BOOL InitMapData2(void) +{ + gMap.data = (unsigned char*)malloc(PXM_BUFFER_SIZE); + return TRUE; +} + +BOOL LoadMapData2(const char *path_map) +{ + FILE *fp; + char check[3]; + std::string path; + + // Get path + path = gSpritePath + '/' + path_map; + + // Open file + fp = fopen(path.c_str(), "rb"); + if (fp == NULL) + return FALSE; + + // Make sure file begins with "PXM" + fread(check, 1, 3, fp); + + if (memcmp(check, code_pxma, 3)) + { + fclose(fp); + return FALSE; + } + + unsigned char dum; + fread(&dum, 1, 1, fp); + // Get width and height + gMap.width = File_ReadLE16(fp); + gMap.length = File_ReadLE16(fp); + + if (gMap.data == NULL) + { + fclose(fp); + return FALSE; + } + + // Read tile data + fread(gMap.data, 1, gMap.width * gMap.length, fp); + fclose(fp); + return TRUE; +} + +BOOL LoadAttributeData(const char *path_atrb) +{ + FILE *fp; + std::string path; + + // Open file + path = gSpritePath + '/' + path_atrb; + + fp = fopen(path.c_str(), "rb"); + if (fp == NULL) + return FALSE; + + // Read data + fread(gMap.atrb, 1, sizeof(gMap.atrb), fp); + fclose(fp); + return TRUE; +} + +void EndMapData(void) +{ + free(gMap.data); +} + +void ReleasePartsImage(void) +{ + ReleaseSurface(SURFACE_ID_LEVEL_TILESET); +} + +void GetMapData(unsigned char **data, short *mw, short *ml) +{ + if (data != NULL) + *data = gMap.data; + + if (mw != NULL) + *mw = gMap.width; + + if (ml != NULL) + *ml = gMap.length; +} + +unsigned char GetAttribute(int x, int y) +{ + size_t a; + + if (x < 0 || y < 0 || x >= gMap.width || y >= gMap.length) + return 0; + + a = *(gMap.data + x + (y * gMap.width)); // Yes, the original code really does do this instead of a regular array access + + if(gMirrorMode){ + a = *(gMap.data + x - 1 + (y * gMap.width)); // Yes, the original code really does do this instead of a regular array access + } + + return gMap.atrb[a]; +} + +void DeleteMapParts(int x, int y) +{ + *(gMap.data + x + (y * gMap.width)) = 0; +} + +void ShiftMapParts(int x, int y) +{ + *(gMap.data + x + (y * gMap.width)) -= 1; +} + +BOOL ChangeMapParts(int x, int y, unsigned char no) +{ + int i; + + if (*(gMap.data + x + (y * gMap.width)) == no) + return FALSE; + + *(gMap.data + x + (y * gMap.width)) = no; + + for (i = 0; i < 3; ++i) + SetNpChar(4, x * 0x200 * 0x10, y * 0x200 * 0x10, 0, 0, 0, NULL, 0); + + return TRUE; +} + +void PutStage_Back(int fx, int fy) +{ + int i, j; + RECT rect; + int offset; + + // Get range to draw + int num_x = MIN(gMap.width, ((WINDOW_WIDTH + (16 - 1)) / 16) + 1); + int num_y = MIN(gMap.length, ((WINDOW_HEIGHT + (16 - 1)) / 16) + 1); + int put_x = MAX(0, ((fx / 0x200) + 8) / 16); + int put_y = MAX(0, ((fy / 0x200) + 8) / 16); + + int atrb; + + for (j = put_y; j < put_y + num_y; ++j) + { + for (i = put_x; i < put_x + num_x; ++i) + { + // Get attribute + offset = (j * gMap.width) + i; + atrb = GetAttribute(i, j); + + if (atrb >= 0x20) + continue; + + // Draw tile + rect.left = (gMap.data[offset] % 16) * 16; + rect.top = (gMap.data[offset] / 16) * 16; + rect.right = rect.left + 16; + rect.bottom = rect.top + 16; + + PutBitmap3(&grcGame, PixelToScreenCoord((i * 16) - 8) - SubpixelToScreenCoord(fx), PixelToScreenCoord((j * 16) - 8) - SubpixelToScreenCoord(fy), &rect, SURFACE_ID_LEVEL_TILESET_2); + } + } +} + +void PutStage_Front(int fx, int fy) +{ + RECT rcSnack = {256, 48, 272, 64}; + int i, j; + RECT rect; + int offset; + + // Get range to draw + int num_x = MIN(gMap.width, ((WINDOW_WIDTH + (16 - 1)) / 16) + 1); + int num_y = MIN(gMap.length, ((WINDOW_HEIGHT + (16 - 1)) / 16) + 1); + int put_x = MAX(0, ((fx / 0x200) + 8) / 16); + int put_y = MAX(0, ((fy / 0x200) + 8) / 16); + + int atrb; + + for (j = put_y; j < put_y + num_y; ++j) + { + for (i = put_x; i < put_x + num_x; ++i) + { + // Get attribute + offset = (j * gMap.width) + i; + atrb = GetAttribute(i, j); + + if (atrb < 0x40 || atrb >= 0x80) + continue; + + // Draw tile + rect.left = (gMap.data[offset] % 16) * 16; + rect.top = (gMap.data[offset] / 16) * 16; + rect.right = rect.left + 16; + rect.bottom = rect.top + 16; + + PutBitmap3(&grcGame, PixelToScreenCoord((i * 16) - 8) - SubpixelToScreenCoord(fx), PixelToScreenCoord((j * 16) - 8) - SubpixelToScreenCoord(fy), &rect, SURFACE_ID_LEVEL_TILESET); + + if (atrb == 0x43) + PutBitmap3(&grcGame, gMirrorMode? (PixelToScreenCoord((i * 16) - 8) - SubpixelToScreenCoord(fx)):PixelToScreenCoord((i * 16) - 8) - SubpixelToScreenCoord(fx), PixelToScreenCoord((j * 16) - 8) - SubpixelToScreenCoord(fy), &rcSnack, SURFACE_ID_NPC_SYM); + } + } +} + +void PutMapDataVector(int fx, int fy) +{ + int i, j; + RECT rect; + int offset; + + int num_x; + int num_y; + int put_x; + int put_y; + + static unsigned char count = 0; + + int atrb; + + // Animate the wind + count += 2; + + // Get range to draw + num_x = MIN(gMap.width, ((WINDOW_WIDTH + (16 - 1)) / 16) + 1); + num_y = MIN(gMap.length, ((WINDOW_HEIGHT + (16 - 1)) / 16) + 1); + put_x = MAX(0, ((fx / 0x200) + 8) / 16); + put_y = MAX(0, ((fy / 0x200) + 8) / 16); + + for (j = put_y; j < put_y + num_y; ++j) + { + for (i = put_x; i < put_x + num_x; ++i) + { + // Get attribute + offset = (j * gMap.width) + i; + atrb = GetAttribute(i, j); + + if (atrb != 0x80 + && atrb != 0x81 + && atrb != 0x82 + && atrb != 0x83 + && atrb != 0xA0 + && atrb != 0xA1 + && atrb != 0xA2 + && atrb != 0xA3) + continue; + + switch (atrb) + { + case 128: + case 160: + rect.left = 224 + (count % 16); + rect.right = rect.left + 16; + rect.top = 48; + rect.bottom = rect.top + 16; + break; + + case 129: + case 161: + rect.left = 224; + rect.right = rect.left + 16; + rect.top = 48 + (count % 16); + rect.bottom = rect.top + 16; + break; + + case 130: + case 162: + rect.left = 240 - (count % 16); + rect.right = rect.left + 16; + rect.top = 48; + rect.bottom = rect.top + 16; + break; + + case 131: + case 163: + rect.left = 224; + rect.right = rect.left + 16; + rect.top = 64 - (count % 16); + rect.bottom = rect.top + 16; + break; + } + + PutBitmap3(&grcGame, PixelToScreenCoord((i * 16) - 8) - SubpixelToScreenCoord(fx), PixelToScreenCoord((j * 16) - 8) - SubpixelToScreenCoord(fy), &rect, SURFACE_ID_CARET); + } + } +} diff --git a/src/Map.h b/src/Map.h new file mode 100644 index 0000000..1075976 --- /dev/null +++ b/src/Map.h @@ -0,0 +1,34 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +typedef struct MAP_DATA +{ + unsigned char *data; + unsigned char atrb[0x100]; + short width; + short length; +} MAP_DATA; + +extern MAP_DATA gMap; + +BOOL InitMapData2(void); +BOOL LoadMapData2(const char *path_map); +BOOL LoadAttributeData(const char *path_atrb); +void EndMapData(void); +void ReleasePartsImage(void); +void GetMapData(unsigned char **data, short *mw, short *ml); +unsigned char GetAttribute(int x, int y); +void DeleteMapParts(int x, int y); +void ShiftMapParts(int x, int y); +BOOL ChangeMapParts(int x, int y, unsigned char no); +void PutStage_Back(int fx, int fy); +void PutStage_Front(int fx, int fy); +void PutMapDataVector(int fx, int fy); diff --git a/src/MapName.cpp b/src/MapName.cpp new file mode 100644 index 0000000..e037319 --- /dev/null +++ b/src/MapName.cpp @@ -0,0 +1,138 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "MapName.h" + +#include + +#include "CommonDefines.h" +#include "Draw.h" +#include "WindowsWrapper.h" + +MAP_NAME gMapName; + +static RECT rc = { 0, 0, 160, 12 }; + +void ReadyMapName(const char *str) +{ + int a; + + // Handle "Studio Pixel presents" text in the intro, using an obfuscated string + unsigned char presentText[] = { +#ifdef JAPANESE + // "開発室Pixel presents" + 0x8A - 1, // 開 + 0x4A - 1, + 0x94 - 1, // 発 + 0xAD - 1, + 0x8E - 1, // 室 + 0xBA - 1, + 'P' - 1, + 'i' - 1, + 'x' - 1, + 'e' - 1, + 'l' - 1, + ' ' - 1, + 'p' - 1, + 'r' - 1, + 'e' - 1, + 's' - 1, + 'e' - 1, + 'n' - 1, + 't' - 1, + 's' - 1, +#else + // " Studio Pixel presents" + ' ' - 1, + ' ' - 1, + 'S' - 1, + 't' - 1, + 'u' - 1, + 'd' - 1, + 'i' - 1, + 'o' - 1, + ' ' - 1, + 'P' - 1, + 'i' - 1, + 'x' - 1, + 'e' - 1, + 'l' - 1, + ' ' - 1, + 'p' - 1, + 'r' - 1, + 'e' - 1, + 's' - 1, + 'e' - 1, + 'n' - 1, + 't' - 1, + 's' - 1, +#endif + 0xFF + }; + + // Reset map name flags + gMapName.flag = FALSE; + gMapName.wait = 0; + + if (!strcmp(str, "u")) + { + for (a = 0; a < (int)sizeof(presentText); ++a) + presentText[a] = presentText[a] + 1; + + str = (char*)presentText; + } + + // Copy map's name to the global map name + strcpy(gMapName.name, str); + + // Draw the text to the surface + a = (int)strlen(gMapName.name); + CortBox2(&rc, 0, SURFACE_ID_ROOM_NAME); + PutText2(((152 - (a * 6)) / 2) + 6, 1, gMapName.name, RGB(0x11, 0x00, 0x22), SURFACE_ID_ROOM_NAME); + PutText2(((152 - (a * 6)) / 2) + 6, 0, gMapName.name, RGB(0xFF, 0xFF, 0xFE), SURFACE_ID_ROOM_NAME); +} + +void PutMapName(BOOL bMini) +{ + // 'unused_rect' isn't the original name. The Linux port optimised this out, so there's no known name for it. + RECT unused_rect = {0, 0, 160, 16}; + + if (bMini) + { + // Map system + RECT rcBack; + rcBack.left = 0; + rcBack.right = WINDOW_WIDTH; + rcBack.top = 7; + rcBack.bottom = 24; + + CortBox(&rcBack, 0x000000); + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 80), PixelToScreenCoord(10), &rc, SURFACE_ID_ROOM_NAME); + } + else if (gMapName.flag) + { + // MNA + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - (gbFontData.name == "monogram"? 80:85)), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 40), &rc, SURFACE_ID_ROOM_NAME); + if (++gMapName.wait > 160) + gMapName.flag = FALSE; + } +} + +void StartMapName(void) +{ + gMapName.flag = TRUE; + gMapName.wait = 0; +} + +void RestoreMapName(void) +{ + int a = (int)strlen(gMapName.name); + + CortBox2(&rc, 0, SURFACE_ID_ROOM_NAME); + PutText2(((160 - (a * 6)) / 2) + 6, 1, gMapName.name, RGB(0x11, 0x00, 0x22), SURFACE_ID_ROOM_NAME); + PutText2(((160 - (a * 6)) / 2) + 6, 0, gMapName.name, RGB(0xFF, 0xFF, 0xFE), SURFACE_ID_ROOM_NAME); +} diff --git a/src/MapName.h b/src/MapName.h new file mode 100644 index 0000000..c55bffe --- /dev/null +++ b/src/MapName.h @@ -0,0 +1,24 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +typedef struct MAP_NAME +{ + BOOL flag; + int wait; + char name[0x20]; +} MAP_NAME; + +extern MAP_NAME gMapName; + +void ReadyMapName(const char *str); +void PutMapName(BOOL bMini); +void StartMapName(void); +void RestoreMapName(void); diff --git a/src/MiniMap.cpp b/src/MiniMap.cpp new file mode 100644 index 0000000..c2c99a8 --- /dev/null +++ b/src/MiniMap.cpp @@ -0,0 +1,508 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "MiniMap.h" + +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" +#include "Draw.h" +#include "Escape.h" +#include "Flags.h" +#include "KeyControl.h" +#include "Main.h" +#include "Map.h" +#include "MapName.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Pause.h" +#include "Stage.h" + +void WriteMiniMapLine(int line) +{ + int x; + unsigned char a; + + int my_x; + int my_y; + + RECT rcLevel[4] = { + {228, 82, 232, 86}, + {232, 82, 236, 86}, + {236, 82, 240, 86}, + {240, 82, 244, 86}, + }; + + my_x = ((gMC.x / 0x200) + 8) / 16; + my_y = ((gMC.y / 0x200) + 8) / 16; + + for (x = 0; x < gMap.width; ++x) + { + a = GetAttribute(x, line); + + // Yup, this really is an if/else chain. + // No switch here. + if (a == 0) + Surface2Surface(x*4, line*4, &rcLevel[0], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + else if (a == 68 || + a == 1 || + a == 64 || + a == 128 || + a == 129 || + a == 130 || + a == 131 || + a == 81 || + a == 82 || + a == 85 || + a == 86 || + a == 2 || + a == 96 || + a == 113 || + a == 114 || + a == 117 || + a == 118 || + a == 160 || + a == 161 || + a == 162 || + a == 163) + Surface2Surface(x*4, line*4, &rcLevel[1], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + else if (a == 67 || + a == 99 || + a == 80 || + a == 83 || + a == 84 || + a == 87 || + // a == 96 || // This is already listed above, so that part of the expression is always false + a == 112 || + a == 115 || + a == 116 || + a == 119) + Surface2Surface(x, line, &rcLevel[2], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + else + Surface2Surface(x, line, &rcLevel[3], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + } +} + +int WriteMiniMap(int x, int y){ + unsigned char a; + + RECT rcLevel[9] = { + // tileset + {212, 103, 220, 110}, + {220, 103, 227, 110}, + {228, 103, 235, 110}, + {236, 103, 243, 110}, + // exits, + {236, 111, 243, 118}, + // items, + {228, 111, 235, 118}, + // save disk + {236, 119, 243, 126}, + // life station + {228, 119, 235, 126}, + //blank tile + {212, 111, 219, 118} + }; + + for(int m_y = y - 11; m_y <= y + 11; m_y ++){ + for(int m_x = x - 16; m_x <= x + 16; m_x ++){ + int mini_x = m_x - (x - 16); + int mini_y = m_y - (y - 11); + + if(m_x < 0 || m_x >= gMap.width || m_y < 0 || m_y >= gMap.length){ + Surface2Surface(mini_x * 7, mini_y * 7, &rcLevel[8], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + continue; + } + + a = GetAttribute(m_x, m_y); + + // Yup, this really is an if/else chain. + // No switch here. + if (a == 0) + Surface2Surface(mini_x * 7, mini_y * 7, &rcLevel[0], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + else if (a == 68 || + a == 1 || + a == 64 || + a == 69 || + a == 128 || + a == 129 || + a == 130 || + a == 131 || + a == 81 || + a == 82 || + a == 85 || + a == 86 || + a == 2 || + a == 96 || + a == 113 || + a == 114 || + a == 117 || + a == 118 || + a == 160 || + a == 161 || + a == 162 || + a == 163) + Surface2Surface(mini_x * 7, mini_y * 7, &rcLevel[1], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + else if (a == 67 || + a == 99 || + a == 80 || + a == 83 || + a == 84 || + a == 87 || + a == 96 || // This is already listed above, so that part of the expression is always false + a == 112 || + a == 115 || + a == 116 || + a == 119) + Surface2Surface(mini_x * 7, mini_y * 7, &rcLevel[2], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + else + Surface2Surface(mini_x * 7, mini_y * 7, &rcLevel[3], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + + } + } + + for(int i = 0; i < NPC_MAX; i++){ + //doors + if(gNPC[i].code_char == 0x12 || gNPC[i].code_char == 0x89){ + int npc_x = gNPC[i].x / (0x10*0x200); + int npc_y = gNPC[i].y / (0x10*0x200); + + if(npc_y >= y - 11 && npc_y <= y + 11 && npc_x >= x - 16 && npc_x <= x + 16){ + int npc_max_y = npc_y - (y - 11); + int npc_map_x = npc_x - (x - 16); + + Surface2Surface(npc_map_x * 7, npc_max_y * 7, &rcLevel[4], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + + if(gNPC[i].code_char == 0x89){ //large door is wide + Surface2Surface((npc_map_x + 1) * 7, npc_max_y * 7, &rcLevel[4], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + } + } + } + + //invisible doors + if(gNPC[i].code_char == 0x0 && gNPC[i].code_event >= 100 && gNPC[i].code_event <= 120 && (gNPC[i].bits & NPC_INTERACTABLE)){ + int npc_x = gNPC[i].x / (0x10*0x200); + int npc_y = gNPC[i].y / (0x10*0x200); + + if(npc_y >= y - 11 && npc_y <= y + 11 && npc_x >= x - 16 && npc_x <= x + 16){ + int npc_max_y = npc_y - (y - 11); + int npc_map_x = npc_x - (x - 16); + + Surface2Surface(npc_map_x * 7, npc_max_y * 7, &rcLevel[4], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + } + } + + //chests, items, life capsules + if(gNPC[i].code_char == 0xF || gNPC[i].code_char == 0x20 || gNPC[i].code_char == 0x46){ + int npc_x = gNPC[i].x / (0x10*0x200); + int npc_y = gNPC[i].y / (0x10*0x200); + + // so many unused chests what + if(gNPC[i].code_char == 0xF && gNPC[i].code_flag == 151 && gNPC[i].bits & NPC_APPEAR_WHEN_FLAG_SET){ + continue; + } + + if(gNPC[i].code_flag == 410){ + continue; + } + + // hide items if already collected + if(gNPC[i].bits & NPC_HIDE_WHEN_FLAG_SET && (GetNPCFlag(gNPC[i].code_flag))){ + continue; + } + + // hide items if not yet spawned + if(gNPC[i].bits & NPC_APPEAR_WHEN_FLAG_SET && !(GetNPCFlag(gNPC[i].code_flag))){ + continue; + } + + if(npc_y >= y - 11 && npc_y <= y + 11 && npc_x >= x - 16 && npc_x <= x + 16){ + int npc_max_y = npc_y - (y - 11); + int npc_map_x = npc_x - (x - 16); + + Surface2Surface(npc_map_x * 7, npc_max_y * 7, &rcLevel[5], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + } + } + + // save disk + if(gNPC[i].code_char == 0x10){ + int npc_x = gNPC[i].x / (0x10*0x200); + int npc_y = gNPC[i].y / (0x10*0x200); + + // hide if not yet spawned + if(gNPC[i].bits & NPC_APPEAR_WHEN_FLAG_SET && !(GetNPCFlag(gNPC[i].code_flag))){ + continue; + } + + //discard unused save scripts + if(gNPC[i].code_event != 16){ + continue; + } + + if(npc_y >= y - 11 && npc_y <= y + 11 && npc_x >= x - 16 && npc_x <= x + 16){ + int npc_max_y = npc_y - (y - 11); + int npc_map_x = npc_x - (x - 16); + + Surface2Surface(npc_map_x * 7, npc_max_y * 7, &rcLevel[6], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + } + } + + // life capsule + if(gNPC[i].code_char == 0x11){ + int npc_x = gNPC[i].x / (0x10*0x200); + int npc_y = gNPC[i].y / (0x10*0x200); + + // hide if not yet spawned + if(gNPC[i].bits & NPC_APPEAR_WHEN_FLAG_SET && !(GetNPCFlag(gNPC[i].code_flag))){ + continue; + } + + if(npc_y >= y - 11 && npc_y <= y + 11 && npc_x >= x - 16 && npc_x <= x + 16){ + int npc_max_y = npc_y - (y - 11); + int npc_map_x = npc_x - (x - 16); + + Surface2Surface(npc_map_x * 7, npc_max_y * 7, &rcLevel[7], SURFACE_ID_MAP, SURFACE_ID_TEXT_BOX); + } + } + } + + return enum_ESCRETURN_continue; +} + +int MiniMapLoop(void) +{ + int f; + RECT rcView; + RECT rcMiniMap; + + int my_x; + int my_y; + unsigned char my_wait; + RECT my_rect = {220, 111, 225, 116}; + RECT rcMapCaret = {0, 0, 253, 203}; + + my_x = ((gMC.x / 0x200) + 8) / 16; + my_y = ((gMC.y / 0x200) + 8) / 16; + + for (f = 0; f <= 8; ++f) + { + GetTrg(); + + if (gKey & KEY_PAUSE) + { + switch (Call_Pause(1)) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + } + + if (gKey & KEY_ESCAPE) + { + switch (Call_Escape()) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + } + + PutBitmap4(&grcGame, 0, 0, &grcGame, SURFACE_ID_SCREEN_GRAB); + PutBitmap3(&grcGame, 0, 0, &grcGame, SURFACE_ID_MENU_OVERLAY); + + rcView.left = (WINDOW_WIDTH / 2) - (((42 * f) / 8) / 2)*6; + rcView.right = (WINDOW_WIDTH / 2) + (((42 * f) / 8) / 2)*6; + rcView.top = (WINDOW_HEIGHT / 2) - (((22.5 * f) / 8) / 2)*6; + rcView.bottom = (WINDOW_HEIGHT / 2) + (((22.5 * f) / 8) / 2)*6; + + PutMapName(TRUE); + CortBox(&rcView, 0); + + PutFramePerSecound(); + if (!Flip_SystemTask()) + return enum_ESCRETURN_exit; + } + + rcMiniMap.left = 0; + rcMiniMap.right = 33*7; + rcMiniMap.top = 0; + rcMiniMap.bottom = 25*7; + + rcView.right = --rcView.left*7 + 2*7; + rcView.bottom = --rcView.top*7 + 2*7; + CortBox2(&rcMiniMap, 0, SURFACE_ID_MAP); + + int map_x = my_x; + int map_y = my_y; + + my_wait = 0; + while (1) + { + GetTrg(); + + if (gKeyTrg & (gKeyOk | gKeyCancel)) + break; + + if (gKey & KEY_PAUSE) + { + switch (Call_Pause(1)) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + } + + if (gKey & KEY_ESCAPE) + { + switch (Call_Escape()) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + } + + if(my_wait % 3 == 0){ + if(gKey & KEY_UP){ + map_y = map_y - 1; + } + + if(gKey & KEY_DOWN){ + map_y = map_y + 1; + } + + if(gKey & KEY_LEFT){ + map_x = map_x - 1; + } + + if(gKey & KEY_RIGHT){ + map_x = map_x + 1; + } + } + + if(map_x - 10 < 0){ + map_x = 10; + } + + if(map_x + 10 >= gMap.width){ + map_x = gMap.width - 10; + } + + if(map_y - 7 < 0){ + map_y = 7; + } + + if(map_y + 7 > gMap.length){ + map_y = gMap.length - 7; + } + + PutBitmap4(&grcGame, 0, 0, &grcGame, SURFACE_ID_SCREEN_GRAB); + PutBitmap3(&grcGame, 0, 0, &grcGame, SURFACE_ID_MENU_OVERLAY); + // CortBox(&rcView, 0); + + WriteMiniMap(map_x, map_y); + + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 110), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 84), &rcMiniMap, SURFACE_ID_MAP); + PutBitmap3(&grcGame, PixelToScreenCoord((WINDOW_WIDTH / 2) - 110), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 107), &rcMapCaret, SURFACE_ID_MAP_CARET); + + PutMapName(TRUE); + + if (++my_wait / 16 % 2){ + int my_char_map_x = WINDOW_WIDTH/2 + 3 - 7*(map_x - my_x); + int my_char_map_y = WINDOW_HEIGHT/2 - 6 - 7* (map_y - my_y); + if(my_char_map_x >= (WINDOW_WIDTH / 2) - 119 && my_char_map_x <= (WINDOW_WIDTH / 2) - 122 + 42*5 + 21){ + if(my_char_map_y >= (WINDOW_HEIGHT / 2) - 76 && my_char_map_y <= (WINDOW_HEIGHT / 2) - 82 + 23*7){ + PutBitmap3(&grcGame, PixelToScreenCoord(my_char_map_x), PixelToScreenCoord(my_char_map_y), &my_rect, SURFACE_ID_TEXT_BOX); + } + } + + } + + PutFramePerSecound(); + if (!Flip_SystemTask()) + return enum_ESCRETURN_exit; + } + + for (f = 8; f >= -1; --f) + { + GetTrg(); + + if (gKey & KEY_PAUSE) + { + switch (Call_Pause(1)) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + } + + if (gKey & KEY_ESCAPE) + { + switch (Call_Escape()) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + } + + PutBitmap4(&grcGame, 0, 0, &grcGame, SURFACE_ID_SCREEN_GRAB); + + rcView.left = (WINDOW_WIDTH / 2) - (((gMap.width * f) / 8) / 2); + rcView.right = (WINDOW_WIDTH / 2) + (((gMap.width * f) / 8) / 2); + rcView.top = (WINDOW_HEIGHT / 2) - (((gMap.length * f) / 8) / 2); + rcView.bottom = (WINDOW_HEIGHT / 2) + (((gMap.length * f) / 8) / 2); + + PutMapName(TRUE); + CortBox(&rcView, 0); + + PutFramePerSecound(); + if (!Flip_SystemTask()) + return enum_ESCRETURN_exit; + } + + return enum_ESCRETURN_continue; +} + +signed char gMapping[0x80]; + +BOOL IsMapping(void) +{ + if (!gMapping[gStageNo]) + return FALSE; + else + return TRUE; +} + +void StartMapping(void) +{ + memset(gMapping, FALSE, sizeof(gMapping)); +} + +void SetMapping(int a) +{ + gMapping[a] = TRUE; +} diff --git a/src/MiniMap.h b/src/MiniMap.h new file mode 100644 index 0000000..33d72d9 --- /dev/null +++ b/src/MiniMap.h @@ -0,0 +1,17 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +extern signed char gMapping[0x80]; + +int MiniMapLoop(void); +BOOL IsMapping(void); +void StartMapping(void); +void SetMapping(int a); diff --git a/src/MyChar.cpp b/src/MyChar.cpp new file mode 100644 index 0000000..f916837 --- /dev/null +++ b/src/MyChar.cpp @@ -0,0 +1,1160 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "MyChar.h" + +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "ArmsItem.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Draw.h" +#include "Flags.h" +#include "Game.h" +#include "KeyControl.h" +#include "MycHit.h" +#include "MycParam.h" +#include "NpChar.h" +#include "Sound.h" +#include "Star.h" +#include "TextScr.h" +#include "ValueView.h" +#include "Config.h" + +MYCHAR gMC; +BOOL gbInfiniteBoost; +int gDefaultBooster; +BOOL gbGraceJump; +int graceJumpTimer = 9; + +void InitMyChar(void) +{ + memset(&gMC, 0, sizeof(MYCHAR)); + gMC.cond = 0x80; + gMC.direct = 2; + + gMC.view.back = 8 * 0x200; + gMC.view.top = 8 * 0x200; + gMC.view.front = 8 * 0x200; + gMC.view.bottom = 8 * 0x200; + + gMC.hit.back = 5 * 0x200; + gMC.hit.top = 8 * 0x200; + gMC.hit.front = 5 * 0x200; + gMC.hit.bottom = 8 * 0x200; + + gMC.life = 3; + gMC.max_life = 3; + gMC.unit = 0; + + // This is initialized with the values the game uses in vanilla + gMC.physics_normal.max_dash = 0x32C; + gMC.physics_normal.max_move = 0x5FF; + gMC.physics_normal.gravity1 = 0x50; + gMC.physics_normal.gravity2 = 0x20; + gMC.physics_normal.dash1 = 0x200 / 6; + gMC.physics_normal.dash2 = 0x200 / 16; + gMC.physics_normal.resist = 0x200 / 10; + gMC.physics_normal.jump = 0x500; + + gMC.physics_underwater.max_dash = 0x32C / 2; + gMC.physics_underwater.max_move = 0x5FF / 2; + gMC.physics_underwater.gravity1 = 0x50 / 2; + gMC.physics_underwater.gravity2 = 0x20 / 2; + gMC.physics_underwater.dash1 = 0x200 / 6 / 2; + gMC.physics_underwater.dash2 = 0x200 / 16 / 2; + gMC.physics_underwater.resist = 0x200 / 10 / 2; + gMC.physics_underwater.jump = 0x500 / 2; + + gMC.no_splash_or_air_limit_underwater = 0; + + // tweaks mode information + CONFIGDATA conf; + if (!LoadConfigData(&conf)) + DefaultConfigData(&conf); + + gDefaultBooster = conf.defaultBooster; + + gbInfiniteBoost = conf.bInfiniteBooster; +} + +void AnimationMyChar(BOOL bKey) +{ + const long mKeyLeft = gMirrorMode? gKeyRight: gKeyLeft; + const long mKeyRight = gMirrorMode? gKeyLeft: gKeyRight; + + RECT rcLeft[12] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + {0, 0, 16, 16}, + {32, 0, 48, 16}, + {0, 0, 16, 16}, + {48, 0, 64, 16}, + {64, 0, 80, 16}, + {48, 0, 64, 16}, + {80, 0, 96, 16}, + {48, 0, 64, 16}, + {96, 0, 112, 16}, + {112, 0, 128, 16}, + }; + + RECT rcRight[12] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {0, 16, 16, 32}, + {32, 16, 48, 32}, + {0, 16, 16, 32}, + {48, 16, 64, 32}, + {64, 16, 80, 32}, + {48, 16, 64, 32}, + {80, 16, 96, 32}, + {48, 16, 64, 32}, + {96, 16, 112, 32}, + {112, 16, 128, 32}, + }; + + if (gMC.cond & 2) + return; + + if (gMC.flag & 8) + { + if (gMC.cond & 1) + { + gMC.ani_no = 11; + } + else if (gKey & gKeyUp && gKey & (mKeyLeft | mKeyRight) && bKey) + { + gMC.cond |= 4; + + if (++gMC.ani_wait > 4) + { + gMC.ani_wait = 0; + + if (++gMC.ani_no == 7 || gMC.ani_no == 9) + PlaySoundObject(24, SOUND_MODE_PLAY); + } + + if (gMC.ani_no > 9 || gMC.ani_no < 6) + gMC.ani_no = 6; + } + else if (gKey & (mKeyLeft | mKeyRight) && bKey) + { + gMC.cond |= 4; + + if (++gMC.ani_wait > 4) + { + gMC.ani_wait = 0; + + if (++gMC.ani_no == 2 || gMC.ani_no == 4) + PlaySoundObject(24, SOUND_MODE_PLAY); + } + + if (gMC.ani_no > 4 || gMC.ani_no < 1) + gMC.ani_no = 1; + } + else if (gKey & gKeyUp && bKey) + { + if (gMC.cond & 4) + PlaySoundObject(24, SOUND_MODE_PLAY); + + gMC.cond &= ~4; + gMC.ani_no = 5; + } + else + { + if (gMC.cond & 4) + PlaySoundObject(24, SOUND_MODE_PLAY); + + gMC.cond &= ~4; + gMC.ani_no = 0; + } + } + else if (gMC.up) + { + gMC.ani_no = 6; + } + else if (gMC.down) + { + gMC.ani_no = 10; + } + else + { + if (gMC.ym > 0) + gMC.ani_no = 1; + else + gMC.ani_no = 3; + } + + if(gMirrorMode){ + if (gMC.direct == 0) + gMC.rect = rcRight[gMC.ani_no]; + else + gMC.rect = rcLeft[gMC.ani_no]; + } + else{ + if (gMC.direct == 0) + gMC.rect = rcLeft[gMC.ani_no]; + else + gMC.rect = rcRight[gMC.ani_no]; + } +} + +void ShowMyChar(BOOL bShow) +{ + if (bShow) + gMC.cond &= ~2; + else + gMC.cond |= 2; +} + +void PutMyChar(int fx, int fy) +{ + int arms_offset_y; + + if (!(gMC.cond & 0x80) || gMC.cond & 2) + return; + + // Draw weapon + gMC.rect_arms.left = (gArmsData[gSelectedArms].code % 13) * 24; + gMC.rect_arms.right = gMC.rect_arms.left + 24; + gMC.rect_arms.top = (gArmsData[gSelectedArms].code / 13) * 96; + gMC.rect_arms.bottom = gMC.rect_arms.top + 16; + + if (gMC.direct == 2 && !gMirrorMode) + { + gMC.rect_arms.top += 16; + gMC.rect_arms.bottom += 16; + } + + if (gMC.direct == 0 && gMirrorMode){ + gMC.rect_arms.top += 16; + gMC.rect_arms.bottom += 16; + } + + if (gMC.up) + { + arms_offset_y = -4; + gMC.rect_arms.top += 32; + gMC.rect_arms.bottom += 32; + } + else if (gMC.down) + { + arms_offset_y = 4; + gMC.rect_arms.top += 64; + gMC.rect_arms.bottom += 64; + } + else + { + arms_offset_y = 0; + } + + if (gMC.ani_no == 1 || gMC.ani_no == 3 || gMC.ani_no == 6 || gMC.ani_no == 8) + ++gMC.rect_arms.top; + + if(gMirrorMode){ + if (gMC.direct == 0) + PutBitmap3( + &grcGame, + SubpixelToScreenCoord(gMC.x - gMC.view.front) - SubpixelToScreenCoord(fx), + SubpixelToScreenCoord(gMC.y - gMC.view.top) - SubpixelToScreenCoord(fy) + PixelToScreenCoord(arms_offset_y), + &gMC.rect_arms, + SURFACE_ID_ARMS); + else + PutBitmap3( + &grcGame, + SubpixelToScreenCoord(gMC.x - gMC.view.front) - SubpixelToScreenCoord(fx) + PixelToScreenCoord(8), + SubpixelToScreenCoord(gMC.y - gMC.view.top) - SubpixelToScreenCoord(fy) + PixelToScreenCoord(arms_offset_y), + &gMC.rect_arms, + SURFACE_ID_ARMS); + } + else{ + if (gMC.direct == 0) + PutBitmap3( + &grcGame, + SubpixelToScreenCoord(gMC.x - gMC.view.front) - SubpixelToScreenCoord(fx) - PixelToScreenCoord(8), + SubpixelToScreenCoord(gMC.y - gMC.view.top) - SubpixelToScreenCoord(fy) + PixelToScreenCoord(arms_offset_y), + &gMC.rect_arms, + SURFACE_ID_ARMS); + else + PutBitmap3( + &grcGame, + SubpixelToScreenCoord(gMC.x - gMC.view.front) - SubpixelToScreenCoord(fx), + SubpixelToScreenCoord(gMC.y - gMC.view.top) - SubpixelToScreenCoord(fy) + PixelToScreenCoord(arms_offset_y), + &gMC.rect_arms, + SURFACE_ID_ARMS); + } + + if (gMC.shock / 2 % 2) + return; + + // Draw player + RECT rect = gMC.rect; + rect.top += 32 * gMIMCurrentNum; + rect.bottom += 32 * gMIMCurrentNum; +#ifndef ENABLE_MIM_DISABLE_EQUIP_40_GRAPHICS + if (gMC.equip & EQUIP_MIMIGA_MASK) + { + rect.top += 32; + rect.bottom += 32; + } +#endif + + PutBitmap3(&grcGame, SubpixelToScreenCoord(gMC.x - gMC.view.front) - SubpixelToScreenCoord(fx), SubpixelToScreenCoord(gMC.y - gMC.view.top) - SubpixelToScreenCoord(fy), &rect, SURFACE_ID_MY_CHAR); + + // Draw air tank + RECT rcBubble[2] = { + {56, 96, 80, 120}, + {80, 96, 104, 120}, + }; + + ++gMC.bubble; + if (gMC.equip & EQUIP_AIR_TANK && gMC.flag & 0x100) + PutBitmap3(&grcGame, SubpixelToScreenCoord(gMC.x) - PixelToScreenCoord(12) - SubpixelToScreenCoord(fx), SubpixelToScreenCoord(gMC.y) - PixelToScreenCoord(12) - SubpixelToScreenCoord(fy), &rcBubble[(gMC.bubble / 2) % 2], SURFACE_ID_CARET); + else if (gMC.unit == 1) + PutBitmap3(&grcGame, SubpixelToScreenCoord(gMC.x) - PixelToScreenCoord(12) - SubpixelToScreenCoord(fx), SubpixelToScreenCoord(gMC.y) - PixelToScreenCoord(12) - SubpixelToScreenCoord(fy), &rcBubble[(gMC.bubble / 2) % 2], SURFACE_ID_CARET); +} + +void ActMyChar_Normal(BOOL bKey) +{ + // Get speeds and accelerations + int max_move; + int max_dash; + int gravity1; + int gravity2; + int jump; + int dash1; + int dash2; + int resist; + + int a, x; + + const long mKeyLeft = gMirrorMode? gKeyRight: gKeyLeft; + const long mKeyRight = gMirrorMode? gKeyLeft: gKeyRight; + + MYCHAR_PHYSICS *physics; + + if (gMC.cond & 2) + return; + + physics = (gMC.flag & 0x100) ? &gMC.physics_underwater : &gMC.physics_normal; + max_dash = physics->max_dash; + gravity1 = physics->gravity1; + gravity2 = physics->gravity2; + dash1 = physics->dash1; + dash2 = physics->dash2; + resist = physics->resist; + jump = physics->jump; + + // Don't create "?" effect + gMC.ques = FALSE; + + // If can't control player, stop boosting + if (!bKey) + gMC.boost_sw = 0; + + // Movement on the ground + if (gMC.flag & 8 || gMC.flag & 0x10 || gMC.flag & 0x20) + { + // Stop boosting and refuel + gMC.boost_sw = 0; + + if (gMC.equip & EQUIP_BOOSTER_0_8 || (!(gMC.equip & EQUIP_BOOSTER_2_0) && gDefaultBooster == 1)) + { + gMC.boost_cnt = 50; + } + else if (gMC.equip & EQUIP_BOOSTER_2_0 || (!(gMC.equip & EQUIP_BOOSTER_0_8) && gDefaultBooster == 2)) + { + gMC.boost_cnt = 50; + } + else + { + gMC.boost_cnt = 0; + } + + // Move in direction held + if (bKey) + { + if (gKeyTrg == gKeyDown && gKey == gKeyDown && !(gMC.cond & 1) && !(g_GameFlags & 4)) + { + gMC.cond |= 1; + gMC.ques = TRUE; + } + else if (gKey == gKeyDown) + { + // There probably used to be commented-out code here + } + else + { + if (gKey & mKeyLeft && gMC.xm > -max_dash) + { + gMC.xm -= dash1; + } + if (gKey & mKeyRight && gMC.xm < max_dash) + { + gMC.xm += dash1; + } + + if(!(gKey & gKeyStrafe)){ + if (gKey & mKeyLeft){ + gMC.direct = 0; + } + + if (gKey & mKeyRight){ + gMC.direct = 2; + } + } + } + } + + // Friction + if (!(gMC.cond & 0x20)) + { + if (gMC.xm < 0) + { + if (gMC.xm > -resist) + gMC.xm = 0; + else + gMC.xm += resist; + } + if (gMC.xm > 0) + { + if (gMC.xm < resist) + gMC.xm = 0; + else + gMC.xm -= resist; + } + } + } + else + { + // Start boosting + if (bKey) + { + if ((gMC.equip & (EQUIP_BOOSTER_0_8 | EQUIP_BOOSTER_2_0) || gDefaultBooster != 0) && gKeyTrg & gKeyJump && gMC.boost_cnt != 0) + { + // Booster 0.8 + if (gMC.equip & EQUIP_BOOSTER_0_8 || (!(gMC.equip & EQUIP_BOOSTER_2_0) && gDefaultBooster == 1)) + { + gMC.boost_sw = 1; + + if (gMC.ym > 0x100) + gMC.ym /= 2; + } + + // Booster 2.0 + if (gMC.equip & EQUIP_BOOSTER_2_0 || (!(gMC.equip & EQUIP_BOOSTER_0_8) && gDefaultBooster == 2)) + { + if (gKey & gKeyUp) + { + gMC.boost_sw = 2; + gMC.xm = 0; + gMC.ym = -0x5FF; + } + else if (gKey & mKeyLeft) + { + gMC.boost_sw = 1; + gMC.ym = 0; + gMC.xm = -0x5FF; + } + else if (gKey & mKeyRight) + { + gMC.boost_sw = 1; + gMC.ym = 0; + gMC.xm = 0x5FF; + } + else if (gKey & gKeyDown) + { + gMC.boost_sw = 3; + gMC.xm = 0; + gMC.ym = 0x5FF; + } + else + { + gMC.boost_sw = 2; + gMC.xm = 0; + gMC.ym = -0x5FF; + } + } + } + + if (gKey & mKeyLeft && gMC.xm > -max_dash) + { + gMC.xm -= dash2; + } + if (gKey & mKeyRight && gMC.xm < max_dash) + { + gMC.xm += dash2; + } + + if(!(gKey & gKeyStrafe)){ + if (gKey &mKeyLeft){ + gMC.direct = 0; + } + + if (gKey & mKeyRight){ + gMC.direct = 2; + } + } + } + + // Slow down when stopped boosting (Booster 2.0) + if ((gMC.equip & EQUIP_BOOSTER_2_0 || gDefaultBooster == 2) && gMC.boost_sw != 0 && (!(gKey & gKeyJump) || gMC.boost_cnt == 0)) + { + if (gMC.boost_sw == 1) + gMC.xm /= 2; + else if (gMC.boost_sw == 2) + gMC.ym /= 2; + } + + // Stop boosting + if (gMC.boost_cnt == 0 || !(gKey & gKeyJump)) + gMC.boost_sw = 0; + } + + // Jumping + if (bKey) + { + // Look up and down + if (gKey & gKeyUp) + gMC.up = TRUE; + else + gMC.up = FALSE; + + if (gKey & gKeyDown && !(gMC.flag & 8)) + gMC.down = TRUE; + else + gMC.down = FALSE; + + if (gKeyTrg & gKeyJump && (gMC.flag & 8 || (gbGraceJump && graceJumpTimer > 0 && gMC.ym >= 0 && !(gMC.equip & 0x1 || gMC.equip & 0x20)) || gMC.flag & 0x10 || gMC.flag & 0x20)) + { + if (gMC.flag & 0x2000) + { + // Another weird empty case needed for accurate assembly. + // There probably used to be some commented-out code here. + } + else + { + gMC.ym = -jump; + graceJumpTimer = 0; + PlaySoundObject(15, SOUND_MODE_PLAY); + } + } + } + + // Stop interacting when moved + if (bKey && gKey & (mKeyLeft | mKeyRight | gKeyUp | gKeyJump | gKeyShot)) + gMC.cond &= ~1; + + // Booster losing fuel + if (gMC.boost_sw != 0 && gMC.boost_cnt != 0){ + --gMC.boost_cnt; + if (gbInfiniteBoost && 50 - gMC.boost_cnt > 3) + gMC.boost_cnt = 50; + } + + + // Wind / current forces + if (gMC.flag & 0x1000) + gMC.xm -= 0x88; + if (gMC.flag & 0x2000) + gMC.ym -= 0x80; + if (gMC.flag & 0x4000) + gMC.xm += 0x88; + if (gMC.flag & 0x8000) + gMC.ym += 0x55; + + // Booster 2.0 forces and effects + if ((gMC.equip & EQUIP_BOOSTER_2_0 || (!(gMC.equip & EQUIP_BOOSTER_0_8) && gDefaultBooster == 2)) && gMC.boost_sw != 0) + { + if (gMC.boost_sw == 1) + { + // Go up when going into a wall + if (gMC.flag & 5) + gMC.ym = -0x100; + + + // Move in direction facing + if (gMC.direct == 0){ + gMC.xm -= 0x20; + } + if (gMC.direct == 2){ + gMC.xm += 0x20; + } + + // Boost particles (and sound) + if (gKeyTrg & gKeyJump || gMC.boost_cnt % 3 == 1) + { + if (gMC.direct == 0) + SetCaret(gMC.x + (2 * 0x200), gMC.y + (2 * 0x200), CARET_EXHAUST, DIR_RIGHT); + if (gMC.direct == 2) + SetCaret(gMC.x - (2 * 0x200), gMC.y + (2 * 0x200), CARET_EXHAUST, DIR_LEFT); + + PlaySoundObject(113, SOUND_MODE_PLAY); + } + } + else if (gMC.boost_sw == 2) + { + // Move upwards + gMC.ym -= 0x20; + + // Boost particles (and sound) + if (gKeyTrg & gKeyJump || gMC.boost_cnt % 3 == 1) + { + SetCaret(gMC.x, gMC.y + (6 * 0x200), CARET_EXHAUST, DIR_DOWN); + PlaySoundObject(113, SOUND_MODE_PLAY); + } + } + else if (gMC.boost_sw == 3 && (gKeyTrg & gKeyJump || gMC.boost_cnt % 3 == 1)) + { + // Boost particles (and sound) + SetCaret(gMC.x, gMC.y - (6 * 0x200), CARET_EXHAUST, DIR_UP); + PlaySoundObject(113, SOUND_MODE_PLAY); + } + } + // Upwards wind/current + else if (gMC.flag & 0x2000) + { + gMC.ym += gravity1; + } + // Booster 0.8 + else if ((gMC.equip & EQUIP_BOOSTER_0_8 || (!(gMC.equip & EQUIP_BOOSTER_2_0) && gDefaultBooster == 1)) && gMC.boost_sw != 0) + { + // Booster particles + if (gMC.boost_cnt % 3 == 0) + { + SetCaret(gMC.x, gMC.y + (gMC.hit.bottom / 2), CARET_EXHAUST, DIR_DOWN); + PlaySoundObject(113, SOUND_MODE_PLAY); + } + + if (gMC.ym > -0x400){ + // Upwards force + gMC.ym -= 0x20; + } + + // Bounce off of ceiling + if (gMC.flag & 2) + gMC.ym = 0x200; + } + // Gravity while jump is held + else if (gMC.ym < 0 && bKey && gKey & gKeyJump) + { + gMC.ym += gravity2; + } + // Normal gravity + else + { + gMC.ym += gravity1; + } + + // Keep player on slopes + if (!bKey || !(gKeyTrg & gKeyJump)) + { + if (gMC.flag & 0x10 && gMC.xm < 0) + gMC.ym = -gMC.xm; + if (gMC.flag & 0x20 && gMC.xm > 0) + gMC.ym = gMC.xm; + if (gMC.flag & 8 && gMC.flag & 0x80000 && gMC.xm < 0) + gMC.ym = 0x400; + if (gMC.flag & 8 && gMC.flag & 0x10000 && gMC.xm > 0) + gMC.ym = 0x400; + if (gMC.flag & 8 && gMC.flag & 0x20000 && gMC.flag & 0x40000) + gMC.ym = 0x400; + } + + if (0) + { + // There used to be an if-statement here that didn't do anything, but the compiler optimised it out. + // We only know this was here because empty if-statements affect the register usage. + // Since there's no code, we have no idea what the original condition actually was. + } + + // Limit speed + if (gMC.flag & 0x100 && !(gMC.flag & (0x8000 | 0x4000 | 0x2000 | 0x1000))) + max_move = gMC.physics_underwater.max_move; // Underwater or in wind + else + max_move = gMC.physics_normal.max_move; // Normal conditions + + if (gMC.xm < -max_move) + gMC.xm = -max_move; + if (gMC.ym < -max_move) + gMC.ym = -max_move; + + if (gMC.xm > max_move) + gMC.xm = max_move; + if (gMC.ym > max_move) + gMC.ym = max_move; + + // Water splashing + if (!gMC.no_splash_or_air_limit_underwater && !gMC.sprash && gMC.flag & 0x100) + { + int dir; + + if (gMC.flag & 0x800) + dir = 2; + else + dir = 0; + + if (!(gMC.flag & 8) && gMC.ym > 0x200) + { + for (a = 0; a < 8; ++a) + { + x = gMC.x + (Random(-8, 8) * 0x200); + SetNpChar(73, x, gMC.y, gMC.xm + Random(-0x200, 0x200), Random(-0x200, 0x80) - (gMC.ym / 2), dir, NULL, 0); + } + + PlaySoundObject(56, SOUND_MODE_PLAY); + } + else + { + if (gMC.xm > 0x200 || gMC.xm < -0x200) + { + for (a = 0; a < 8; ++a) + { + x = gMC.x + (Random(-8, 8) * 0x200); + SetNpChar(73, x, gMC.y, gMC.xm + Random(-0x200, 0x200), Random(-0x200, 0x80), dir, NULL, 0); + } + + PlaySoundObject(56, SOUND_MODE_PLAY); + } + } + + gMC.sprash = TRUE; + } + + if (!(gMC.flag & 0x100)) + gMC.sprash = FALSE; + + // Spike damage + if (gMC.flag & 0x400){ + int damage = 10; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + damage = 127; + } + else{ + damage = damage * gbDamageModifier; + } + DamageMyChar(damage); + } + + // Camera + if (gMC.direct == 0) + { + gMC.index_x -= 0x200; + if (gMC.index_x < -0x8000) + gMC.index_x = -0x8000; + } + else + { + gMC.index_x += 0x200; + if (gMC.index_x > 0x8000) + gMC.index_x = 0x8000; + } + if (gKey & gKeyUp && bKey) + { + gMC.index_y -= 0x200; + if (gMC.index_y < -0x8000) + gMC.index_y = -0x8000; + } + else if (gKey & gKeyDown && bKey) + { + gMC.index_y += 0x200; + if (gMC.index_y > 0x8000) + gMC.index_y = 0x8000; + } + else + { + if (gMC.index_y > 0x200) + gMC.index_y -= 0x200; + if (gMC.index_y < -0x200) + gMC.index_y += 0x200; + } + + gMC.tgt_x = gMC.x + gMC.index_x; + gMC.tgt_y = gMC.y + gMC.index_y; + + // Change position + if (gMC.xm <= resist && gMC.xm >= -resist) + { + // This case is completely empty. This is most likely the result of commented-out code or some other change (so this is most likely inaccurate to the original source code) + } + else + { + gMC.x += gMC.xm; + } + + gMC.y += gMC.ym; +} + +void ActMyChar_Stream(BOOL bKey) +{ + gMC.up = FALSE; + gMC.down = FALSE; + + const long mKeyLeft = gMirrorMode? gKeyRight: gKeyLeft; + const long mKeyRight = gMirrorMode? gKeyLeft: gKeyRight; + + if (bKey) + { + if (gKey & (mKeyLeft | mKeyRight)) + { + if (gKey & gKeyLeft) + gMC.xm -= 0x100; + + if (gKey & gKeyRight) + gMC.xm += 0x100; + } + else if (gMC.xm < 0x80 && gMC.xm > -0x80) + { + gMC.xm = 0; + } + else if (gMC.xm > 0) + { + gMC.xm -= 0x80; + } + else if (gMC.xm < 0) + { + gMC.xm += 0x80; + } + + if (gKey & (gKeyUp | gKeyDown)) + { + if (gKey & gKeyUp) + gMC.ym -= 0x100; + + if (gKey & gKeyDown) + gMC.ym += 0x100; + } + else if (gMC.ym < 0x80 && gMC.ym > -0x80) + { + gMC.ym = 0; + } + else if (gMC.ym > 0) + { + gMC.ym -= 0x80; + } + else if (gMC.ym < 0) + { + gMC.ym += 0x80; + } + } + else + { + if (gMC.xm < 0x80 && gMC.xm > -0x40) + gMC.xm = 0; + else if (gMC.xm > 0) + gMC.xm -= 0x80; + else if (gMC.xm < 0) + gMC.xm += 0x80; + + if (gMC.ym < 0x80 && gMC.ym > -0x40) + gMC.ym = 0; + else if (gMC.ym > 0) + gMC.ym -= 0x80; + else if (gMC.ym < 0) + gMC.ym += 0x80; + } + + if (gMC.ym < -0x200 && gMC.flag & 2) + SetCaret(gMC.x, gMC.y - gMC.hit.top, CARET_TINY_PARTICLES, DIR_OTHER); + if (gMC.ym > 0x200 && gMC.flag & 8) + SetCaret(gMC.x, gMC.y + gMC.hit.bottom, CARET_TINY_PARTICLES, DIR_OTHER); + + if (gMC.xm > 0x400) + gMC.xm = 0x400; + if (gMC.xm < -0x400) + gMC.xm = -0x400; + + if (gMC.ym > 0x400) + gMC.ym = 0x400; + if (gMC.ym < -0x400) + gMC.ym = -0x400; + + if ((gKey & (mKeyLeft | gKeyUp)) == (mKeyLeft | gKeyUp)) + { + if (gMC.xm < -780) + gMC.xm = -780; + if (gMC.ym < -780) + gMC.ym = -780; + } + + if ((gKey & (mKeyRight | gKeyUp)) == (mKeyRight | gKeyUp)) + { + if (gMC.xm > 780) + gMC.xm = 780; + if (gMC.ym < -780) + gMC.ym = -780; + } + + if ((gKey & (mKeyLeft | gKeyDown)) == (mKeyLeft | gKeyDown)) + { + if (gMC.xm < -780) + gMC.xm = -780; + if (gMC.ym > 780) + gMC.ym = 780; + } + + if ((gKey & (mKeyRight | gKeyDown)) == (mKeyRight | gKeyDown)) + { + if (gMC.xm > 780) + gMC.xm = 780; + if (gMC.ym > 780) + gMC.ym = 780; + } + + gMC.x += gMC.xm; + gMC.y += gMC.ym; +} + +void AirProcess(void) +{ + if (gMC.equip & EQUIP_AIR_TANK) + { + gMC.air = 1000; + gMC.air_get = 0; + } + else + { + if (!(gMC.flag & 0x100) || gMC.no_splash_or_air_limit_underwater) + { + gMC.air = 1000; + } + else + { + if (--gMC.air <= 0) + { + if (GetNPCFlag(4000)) + { + // Core cutscene + StartTextScript(1100); + } + else + { + // Drown + StartTextScript(41); + + if (gMC.direct == 0) + SetCaret(gMC.x, gMC.y, CARET_DROWNED_QUOTE, DIR_LEFT); + else + SetCaret(gMC.x, gMC.y, CARET_DROWNED_QUOTE, DIR_RIGHT); + + gMC.cond &= ~0x80; + } + } + } + + if (gMC.flag & 0x100) + { + gMC.air_get = 60; + } + else + { + if (gMC.air_get != 0) + --gMC.air_get; + } + } +} + +void ActMyChar(BOOL bKey) +{ + if (!(gMC.cond & 0x80)) + return; + + if (gMC.exp_wait != 0) + --gMC.exp_wait; + + if (gMC.shock != 0) + { + --gMC.shock; + } + else if (gMC.exp_count != 0) + { + SetValueView(&gMC.x, &gMC.y, gMC.exp_count); + gMC.exp_count = 0; + } + + if(graceJumpTimer > 0 && !(gMC.flag & 8)){ + graceJumpTimer--; + } + + if(gMC.flag & 8){ + graceJumpTimer = 9; + } + + switch (gMC.unit) + { + case 0: + if (!(g_GameFlags & 4) && bKey) + AirProcess(); + + ActMyChar_Normal(bKey); + break; + + case 1: + ActMyChar_Stream(bKey); + break; + } + + gMC.cond &= ~0x20; +} + +void GetMyCharPosition(int *x, int *y) +{ + *x = gMC.x; + *y = gMC.y; +} + +void SetMyCharPosition(int x, int y) +{ + gMC.x = x; + gMC.y = y; + gMC.tgt_x = gMC.x; + gMC.tgt_y = gMC.y; + gMC.index_x = 0; + gMC.index_y = 0; + gMC.xm = 0; + gMC.ym = 0; + gMC.cond &= ~1; + InitStar(); +} + +void MoveMyChar(int x, int y) +{ + gMC.x = x; + gMC.y = y; +} + +void ZeroMyCharXMove(void) +{ + gMC.xm = 0; +} + +int GetUnitMyChar(void) +{ + return gMC.unit; +} + +void SetMyCharDirect(unsigned char dir) +{ + int i; + + if (dir == 3) + { + gMC.cond |= 1; + } + else + { + gMC.cond &= ~1; + + if (dir < 10) + { + gMC.direct = dir; + } + else + { + for (i = 0; i < NPC_MAX; ++i) + if (gNPC[i].code_event == dir) + break; + + if (i == NPC_MAX) + return; + + if (gMC.x > gNPC[i].x) + gMC.direct = 0; + else + gMC.direct = 2; + } + } + + gMC.xm = 0; + AnimationMyChar(FALSE); +} + +void ChangeMyUnit(unsigned char a) +{ + gMC.unit = a; +} + +void PitMyChar(void) +{ + gMC.y += 2 * 0x10 * 0x200; // Shove player two tiles down. I wonder what this was meant for? +} + +void EquipItem(int flag, BOOL b) +{ + if (b) + gMC.equip |= flag; + else{ + gMC.equip &= ~flag; + } +} + +void ResetCheck(void) +{ + gMC.cond &= ~1; +} + +static int noise_no; +static unsigned int noise_freq; + +void SetNoise(int no, int freq) +{ + noise_freq = freq; + noise_no = no; + + switch (noise_no) + { + case 1: + ChangeSoundFrequency(40, noise_freq); + ChangeSoundFrequency(41, noise_freq + 100); + PlaySoundObject(40, SOUND_MODE_PLAY_LOOP); + PlaySoundObject(41, SOUND_MODE_PLAY_LOOP); + break; + + case 2: + PlaySoundObject(58, SOUND_MODE_PLAY_LOOP); + break; + } +} + +void CutNoise(void) +{ + noise_no = 0; + PlaySoundObject(40, SOUND_MODE_STOP); + PlaySoundObject(41, SOUND_MODE_STOP); + PlaySoundObject(58, SOUND_MODE_STOP); +} + +void ResetNoise(void) +{ + switch (noise_no) + { + case 1: + ChangeSoundFrequency(40, noise_freq); + ChangeSoundFrequency(41, noise_freq + 100); + PlaySoundObject(40, SOUND_MODE_PLAY_LOOP); + PlaySoundObject(41, SOUND_MODE_PLAY_LOOP); + break; + + case 2: + PlaySoundObject(58, SOUND_MODE_PLAY_LOOP); + break; + } +} + +void SleepNoise(void) +{ + PlaySoundObject(40, SOUND_MODE_STOP); + PlaySoundObject(41, SOUND_MODE_STOP); + PlaySoundObject(58, SOUND_MODE_STOP); +} diff --git a/src/MyChar.h b/src/MyChar.h new file mode 100644 index 0000000..9d091f6 --- /dev/null +++ b/src/MyChar.h @@ -0,0 +1,115 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" + +// TODO - When I add bitmask constants for gMC.flags... +// 0x100 is a 'player is underwater' flag + +// gMC.equip +enum +{ + EQUIP_BOOSTER_0_8 = 1, + EQUIP_MAP = 2, + EQUIP_ARMS_BARRIER = 4, + EQUIP_TURBOCHARGE = 8, + EQUIP_AIR_TANK = 0x10, + EQUIP_BOOSTER_2_0 = 0x20, + EQUIP_MIMIGA_MASK = 0x40, + EQUIP_WHIMSICAL_STAR = 0x80, + EQUIP_NIKUMARU_COUNTER = 0x100 +}; + +typedef struct MYCHAR_PHYSICS +{ + int max_dash; + int max_move; + int gravity1; + int gravity2; + int dash1; + int dash2; + int resist; + int jump; +} MYCHAR_PHYSICS; + +typedef struct MYCHAR +{ + unsigned char cond; + unsigned int flag; + int direct; + BOOL up; + BOOL down; + int unit; + int equip; + int x; + int y; + int tgt_x; + int tgt_y; + int index_x; + int index_y; + int xm; + int ym; + int ani_wait; + int ani_no; + OTHER_RECT hit; + OTHER_RECT view; + RECT rect; + RECT rect_arms; + int level; + int exp_wait; + int exp_count; + unsigned char shock; + unsigned char no_life; + unsigned char rensha; + unsigned char bubble; + short life; + short star; + short max_life; + short a; + int lifeBr; + int lifeBr_count; + int air; + int air_get; + signed char sprash; // This is explicitly a char, but used like a BOOL + signed char ques; // Same for this variable as well + signed char boost_sw; + int boost_cnt; + // Custom + MYCHAR_PHYSICS physics_normal; + MYCHAR_PHYSICS physics_underwater; + int no_splash_or_air_limit_underwater; // Determines whether the behaviours in which entering water causes a splash, being in water draws the air timer and being in water decreases your air are enabled (0 means it's enabled, non-0 means it's disabled) +} MYCHAR; + +extern MYCHAR gMC; +extern BOOL gbInfiniteBoost; +extern BOOL gbGraceJump; +extern int gDefaultBooster; + +void InitMyChar(void); +void AnimationMyChar(BOOL bKey); +void ShowMyChar(BOOL bShow); +void PutMyChar(int fx, int fy); +void ActMyChar_Normal(BOOL bKey); +void ActMyChar(BOOL bKey); +void GetMyCharPosition(int *x, int *y); +void SetMyCharPosition(int x, int y); +void MoveMyChar(int x, int y); +void ZeroMyCharXMove(void); +int GetUnitMyChar(void); +void SetMyCharDirect(unsigned char dir); +void ChangeMyUnit(unsigned char a); +void PitMyChar(void); +void EquipItem(int flag, BOOL b); +void ResetCheck(void); +void SetNoise(int no, int freq); +void CutNoise(void); +void ResetNoise(void); +void SleepNoise(void); diff --git a/src/MycHit.cpp b/src/MycHit.cpp new file mode 100644 index 0000000..dfc2e1d --- /dev/null +++ b/src/MycHit.cpp @@ -0,0 +1,978 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "MycHit.h" + +#include "WindowsWrapper.h" + +#include "Back.h" +#include "Boss.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Game.h" +#include "KeyControl.h" +#include "Map.h" +#include "MyChar.h" +#include "MycParam.h" +#include "NpChar.h" +#include "Sound.h" +#include "TextScr.h" +#include "Config.h" + +double gbDamageModifier; + +void ResetMyCharFlag(void) +{ + gMC.flag = 0; +} + +static void PutlittleStar(void) +{ + if (!(gMC.cond & 2) && gMC.ym < -0x200) + { + PlaySoundObject(3, SOUND_MODE_PLAY); + SetCaret(gMC.x, gMC.y - gMC.hit.top, CARET_TINY_PARTICLES, DIR_LEFT); + SetCaret(gMC.x, gMC.y - gMC.hit.top, CARET_TINY_PARTICLES, DIR_LEFT); + } +} + +int JudgeHitMyCharBlock(int x, int y) +{ + int hit = 0; + + // Left wall + if (gMC.y - gMC.hit.top < (y * 0x10 + 4) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 4) * 0x200 + && gMC.x - gMC.hit.back < (x * 0x10 + 8) * 0x200 + && gMC.x - gMC.hit.back > x * 0x10 * 0x200) + { + // Clip + gMC.x = ((x * 0x10 + 8) * 0x200) + gMC.hit.back; + + // Halt momentum + if (gMC.xm < -0x180) + gMC.xm = -0x180; + if (!(gKey & gKeyLeft) && gMC.xm < 0) + gMC.xm = 0; + + // Set that a left wall was hit + hit |= 1; + } + + // Right wall + if (gMC.y - gMC.hit.top < (y * 0x10 + 4) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 4) * 0x200 + && gMC.x + gMC.hit.back > (x * 0x10 - 8) * 0x200 + && gMC.x + gMC.hit.back < x * 0x10 * 0x200) + { + // Clip + gMC.x = ((x * 0x10 - 8) * 0x200) - gMC.hit.back; + + // Halt momentum + if (gMC.xm > 0x180) + gMC.xm = 0x180; + if (!(gKey & gKeyRight) && gMC.xm > 0) + gMC.xm = 0; + + // Set that a right wall was hit + hit |= 4; + } + + // Ceiling + if (gMC.x - gMC.hit.back < (x * 0x10 + 5) * 0x200 + && gMC.x + gMC.hit.back > (x * 0x10 - 5) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 + 8) * 0x200 + && gMC.y - gMC.hit.top > y * 0x10 * 0x200) + { + // Clip + gMC.y = ((y * 0x10 + 8) * 0x200) + gMC.hit.top; + + // Halt momentum + if (!(gMC.cond & 2) && gMC.ym < -0x200) + PutlittleStar(); + if (gMC.ym < 0) + gMC.ym = 0; + + // Set that a ceiling was hit + hit |= 2; + } + + // Floor + if (gMC.x - gMC.hit.back < (x * 0x10 + 5) * 0x200 + && gMC.x + gMC.hit.back > ((x * 0x10 - 5) * 0x200) + && gMC.y + gMC.hit.bottom > (y * 0x10 - 8) * 0x200 + && gMC.y + gMC.hit.bottom < y * 0x10 * 0x200) + { + // Clip + gMC.y = ((y * 0x10 - 8) * 0x200) - gMC.hit.bottom; + + // Halt momentum + if (gMC.ym > 0x400) + PlaySoundObject(23, SOUND_MODE_PLAY); + if (gMC.ym > 0) + gMC.ym = 0; + + // Set that a floor was hit + hit |= 8; + } + + return hit; +} + +int JudgeHitMyCharTriangleA(int x, int y) +{ + int hit = 0; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 * 0x200) - (gMC.x - x * 0x10 * 0x200) / 2 + 0x800 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 8) * 0x200) + { + // Clip + gMC.y = (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 + gMC.hit.top; + + // Halt momentum + if (!(gMC.cond & 2) && gMC.ym < -0x200) + PutlittleStar(); + if (gMC.ym < 0) + gMC.ym = 0; + + // Set that hit a ceiling + hit |= 2; + } + + return hit; +} + +int JudgeHitMyCharTriangleB(int x, int y) +{ + int hit = 0; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 8) * 0x200) + { + // Clip + gMC.y = (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + gMC.hit.top; + + // Halt momentum + if (!(gMC.cond & 2) && gMC.ym < -0x200) + PutlittleStar(); + if (gMC.ym < 0) + gMC.ym = 0; + + // Set that hit a ceiling + hit |= 2; + } + + return hit; +} + +int JudgeHitMyCharTriangleC(int x, int y) +{ + int hit = 0; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 8) * 0x200) + { + // Clip + gMC.y = (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + gMC.hit.top; + + // Halt momentum + if (!(gMC.cond & 2) && gMC.ym < -0x200) + PutlittleStar(); + if (gMC.ym < 0) + gMC.ym = 0; + + // Set that hit a ceiling + hit |= 2; + } + + return hit; +} + +int JudgeHitMyCharTriangleD(int x, int y) +{ + int hit = 0; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 8) * 0x200) + { + // Clip + gMC.y = (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 + gMC.hit.top; + + // Halt momentum + if (!(gMC.cond & 2) && gMC.ym < -0x200) + PutlittleStar(); + if (gMC.ym < 0) + gMC.ym = 0; + + // Set that hit a ceiling + hit |= 2; + } + + return hit; +} + +int JudgeHitMyCharTriangleE(int x, int y) +{ + int hit = 0; + + hit |= 0x10000; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + && gMC.y - gMC.hit.top < (y * 0x10 + 8) * 0x200) + { + // Clip + gMC.y = (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 - gMC.hit.bottom; + + // Halt momentum + if (gMC.ym > 0x400) + PlaySoundObject(23, SOUND_MODE_PLAY); + if (gMC.ym > 0) + gMC.ym = 0; + + // Set that hit this slope + hit |= 0x28; + } + + return hit; +} + +int JudgeHitMyCharTriangleF(int x, int y) +{ + int hit = 0; + + hit |= 0x20000; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 + && gMC.y - gMC.hit.top < (y * 0x10 + 8) * 0x200) + { + // Clip + gMC.y = (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 - gMC.hit.bottom; + + // Halt momentum + if (gMC.ym > 0x400) + PlaySoundObject(23, SOUND_MODE_PLAY); + if (gMC.ym > 0) + gMC.ym = 0; + + // Set that hit this slope + hit |= 0x28; + } + + return hit; +} + +int JudgeHitMyCharTriangleG(int x, int y) +{ + int hit = 0; + + hit |= 0x40000; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 + && gMC.y - gMC.hit.top < (y * 0x10 + 8) * 0x200) + { + // Clip + gMC.y = (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 - gMC.hit.bottom; + + // Halt momentum + if (gMC.ym > 0x400) + PlaySoundObject(23, SOUND_MODE_PLAY); + if (gMC.ym > 0) + gMC.ym = 0; + + // Set that hit this slope + hit |= 0x18; + } + + return hit; +} + +int JudgeHitMyCharTriangleH(int x, int y) +{ + int hit = 0; + + hit |= 0x80000; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + && gMC.y - gMC.hit.top < (y * 0x10 + 8) * 0x200) + { + // Clip + gMC.y = (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 - gMC.hit.bottom; + + // Halt momentum + if (gMC.ym > 0x400) + PlaySoundObject(23, SOUND_MODE_PLAY); + if (gMC.ym > 0) + gMC.ym = 0; + + // Set that hit this slope + hit |= 0x18; + } + + return hit; +} + +int JudgeHitMyCharWater(int x, int y) +{ + int hit = 0; + + if (gMC.x - gMC.hit.back < (x * 0x10 + 5) * 0x200 + && gMC.x + gMC.hit.back > ((x * 0x10 - 5) * 0x200) + && gMC.y - gMC.hit.top < ((y * 0x10 + 5) * 0x200) + && gMC.y + gMC.hit.bottom > y * 0x10 * 0x200) + hit |= 0x100; + + return hit; +} + +int JudgeHitMyCharDamage(int x, int y) +{ + int hit = 0; + + if (gMC.x - 0x800 < (x * 0x10 + 4) * 0x200 + && gMC.x + 0x800 > (x * 0x10 - 4) * 0x200 + && gMC.y - 0x800 < (y * 0x10 + 3) * 0x200 + && gMC.y + 0x800 > (y * 0x10 - 3) * 0x200) + hit |= 0x400; + + return hit; +} + +int JudgeHitMyCharDamageW(int x, int y) +{ + int hit = 0; + + if (gMC.x - 0x800 < (x * 0x10 + 4) * 0x200 + && gMC.x + 0x800 > (x * 0x10 - 4) * 0x200 + && gMC.y - 0x800 < (y * 0x10 + 3) * 0x200 + && gMC.y + 0x800 > (y * 0x10 - 3) * 0x200) + hit |= 0xD00; + + return hit; +} + +int JudgeHitMyCharVectLeft(int x, int y) +{ + int hit = 0; + if (gMC.x - gMC.hit.back < (x * 0x10 + 6) * 0x200 + && gMC.x + gMC.hit.back > (x * 0x10 - 6) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 + 6) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 6) * 0x200) + hit |= 0x1000; + + return hit; +} + +int JudgeHitMyCharVectUp(int x, int y) +{ + int hit = 0; + if (gMC.x - gMC.hit.back < (x * 0x10 + 6) * 0x200 + && gMC.x + gMC.hit.back > (x * 0x10 - 6) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 + 6) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 6) * 0x200) + hit |= 0x2000; + + return hit; +} + +int JudgeHitMyCharVectRight(int x, int y) +{ + int hit = 0; + if (gMC.x - gMC.hit.back < (x * 0x10 + 6) * 0x200 + && gMC.x + gMC.hit.back > (x * 0x10 - 6) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 + 6) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 6) * 0x200) + hit |= 0x4000; + + return hit; +} + +int JudgeHitMyCharVectDown(int x, int y) +{ + int hit = 0; + if (gMC.x - gMC.hit.back < (x * 0x10 + 6) * 0x200 + && gMC.x + gMC.hit.back > (x * 0x10 - 6) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 + 6) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 6) * 0x200) + hit |= 0x8000; + + return hit; +} + +void HitMyCharMap(void) +{ + int x, y; + int i; + unsigned char atrb[4]; + + x = gMC.x / 0x10 / 0x200; + y = gMC.y / 0x10 / 0x200; + + int offx[4]; + int offy[4]; + + offx[0] = 0; + offx[1] = 1; + offx[2] = 0; + offx[3] = 1; + + offy[0] = 0; + offy[1] = 0; + offy[2] = 1; + offy[3] = 1; + + for (i = 0; i < 4; ++i) + { + atrb[i] = GetAttribute(x + offx[i], y + offy[i]); + + switch (atrb[i]) + { + // Block + case 0x05: + case 0x41: + case 0x43: + case 0x46: + gMC.flag |= JudgeHitMyCharBlock(x + offx[i], y + offy[i]); + break; + + // Slopes + case 0x50: + gMC.flag |= JudgeHitMyCharTriangleA(x + offx[i], y + offy[i]); + break; + + case 0x51: + gMC.flag |= JudgeHitMyCharTriangleB(x + offx[i], y + offy[i]); + break; + + case 0x52: + gMC.flag |= JudgeHitMyCharTriangleC(x + offx[i], y + offy[i]); + break; + + case 0x53: + gMC.flag |= JudgeHitMyCharTriangleD(x + offx[i], y + offy[i]); + break; + + case 0x54: + gMC.flag |= JudgeHitMyCharTriangleE(x + offx[i], y + offy[i]); + break; + + case 0x55: + gMC.flag |= JudgeHitMyCharTriangleF(x + offx[i], y + offy[i]); + break; + + case 0x56: + gMC.flag |= JudgeHitMyCharTriangleG(x + offx[i], y + offy[i]); + break; + + case 0x57: + gMC.flag |= JudgeHitMyCharTriangleH(x + offx[i], y + offy[i]); + break; + + // Spikes + case 0x42: + gMC.flag |= JudgeHitMyCharDamage(x + offx[i], y + offy[i]); + break; + + // Water spikes + case 0x62: + gMC.flag |= JudgeHitMyCharDamageW(x + offx[i], y + offy[i]); + break; + + // Wind + case 0x80: + gMC.flag |= JudgeHitMyCharVectLeft(x + offx[i], y + offy[i]); + break; + + case 0x81: + gMC.flag |= JudgeHitMyCharVectUp(x + offx[i], y + offy[i]); + break; + + case 0x82: + gMC.flag |= JudgeHitMyCharVectRight(x + offx[i], y + offy[i]); + break; + + case 0x83: + gMC.flag |= JudgeHitMyCharVectDown(x + offx[i], y + offy[i]); + break; + + // Water + case 0x02: + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + // Water and water blocks (same as the previous case) + case 0x60: + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0x61: + gMC.flag |= JudgeHitMyCharBlock(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + // Water slopes + case 0x70: + gMC.flag |= JudgeHitMyCharTriangleA(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0x71: + gMC.flag |= JudgeHitMyCharTriangleB(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0x72: + gMC.flag |= JudgeHitMyCharTriangleC(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0x73: + gMC.flag |= JudgeHitMyCharTriangleD(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0x74: + gMC.flag |= JudgeHitMyCharTriangleE(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0x75: + gMC.flag |= JudgeHitMyCharTriangleF(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0x76: + gMC.flag |= JudgeHitMyCharTriangleG(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0x77: + gMC.flag |= JudgeHitMyCharTriangleH(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + // Water current + case 0xA0: + gMC.flag |= JudgeHitMyCharVectLeft(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0xA1: + gMC.flag |= JudgeHitMyCharVectUp(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0xA2: + gMC.flag |= JudgeHitMyCharVectRight(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + + case 0xA3: + gMC.flag |= JudgeHitMyCharVectDown(x + offx[i], y + offy[i]); + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + } + } + + if (gMC.y > gWaterY + (4 * 0x200)) + gMC.flag |= 0x100; +} + +int JudgeHitMyCharNPC(NPCHAR *npc) +{ + int hit = 0; + + int hit_x = gMirrorMode? npc->x - 16:npc->x; + + if (gMC.y - gMC.hit.top < npc->y + npc->hit.bottom - (3 * 0x200) + && gMC.y + gMC.hit.bottom > npc->y - npc->hit.top + (3 * 0x200) + && gMC.x - gMC.hit.back < hit_x + npc->hit.back + && gMC.x - gMC.hit.back > hit_x) + { + if (gMC.xm < 0x200) + gMC.xm += 0x200; + hit |= 1; + } + + if (gMC.y - gMC.hit.top < npc->y + npc->hit.bottom - (3 * 0x200) + && gMC.y + gMC.hit.bottom > npc->y - npc->hit.top + (3 * 0x200) + && gMC.x + gMC.hit.back - 0x200 > hit_x - npc->hit.back + && gMC.x + gMC.hit.back - 0x200 < hit_x) + { + if (gMC.xm > -0x200) + gMC.xm -= 0x200; + hit |= 4; + } + + if (gMC.x - gMC.hit.back < hit_x + npc->hit.back - (3 * 0x200) + && gMC.x + gMC.hit.back > hit_x - npc->hit.back + (3 * 0x200) + && gMC.y - gMC.hit.top < npc->y + npc->hit.bottom + && gMC.y - gMC.hit.top > npc->y) + { + if (gMC.ym < 0) + gMC.ym = 0; + hit |= 2; + } + + if (gMC.x - gMC.hit.back < hit_x + npc->hit.back - (3 * 0x200) + && gMC.x + gMC.hit.back > hit_x - npc->hit.back + (3 * 0x200) + && gMC.y + gMC.hit.bottom > npc->y - npc->hit.top + && gMC.hit.bottom + gMC.y < npc->y + (3 * 0x200)) + { + if (npc->bits & NPC_BOUNCY) + { + gMC.ym = npc->ym - 0x200; + hit |= 8; + } + else if (!(gMC.flag & 8) && gMC.ym > npc->ym) + { + gMC.y = npc->y - npc->hit.top - gMC.hit.bottom + 0x200; + gMC.ym = npc->ym; + gMC.x += npc->xm; + hit |= 8; + } + } + + return hit; +} + +unsigned char JudgeHitMyCharNPC3(NPCHAR *npc) +{ + int hit_x = gMirrorMode? npc->x - 16:npc->x; + + if (npc->direct == 0) + { + if (gMC.x + (2 * 0x200) > hit_x - npc->hit.front + && gMC.x - (2 * 0x200) < hit_x + npc->hit.back + && gMC.y + (2 * 0x200) > npc->y - npc->hit.top + && gMC.y - (2 * 0x200) < npc->y + npc->hit.bottom) + return 1; + } + else + { + if (gMC.x + (2 * 0x200) > hit_x - npc->hit.back + && gMC.x - (2 * 0x200) < hit_x + npc->hit.front + && gMC.y + (2 * 0x200) > npc->y - npc->hit.top + && gMC.y - (2 * 0x200) < npc->y + npc->hit.bottom) + return 1; + } + + return 0; +} + +int JudgeHitMyCharNPC4(NPCHAR *npc) +{ + // TODO: comment this + int hit = 0; + + float fy1; + float fx1; + float fx2; + float fy2; + + int hit_x = gMirrorMode? npc->x - 16:npc->x; + + if (hit_x > gMC.x) + fx1 = (float)(hit_x - gMC.x); + else + fx1 = (float)(gMC.x - hit_x); + + if (npc->y > gMC.y) + fy1 = (float)(npc->y - gMC.y); + else + fy1 = (float)(gMC.y - npc->y); + + fx2 = (float)npc->hit.back; + fy2 = (float)npc->hit.top; + + if (fx1 == 0.0f) + fx1 = 1.0f; + if (fx2 == 0.0f) + fx2 = 1.0f; + + if (fy1 / fx1 > fy2 / fx2) + { + if (gMC.x - gMC.hit.back < hit_x + npc->hit.back && gMC.x + gMC.hit.back > hit_x - npc->hit.back) + { + if (gMC.y - gMC.hit.top < npc->y + npc->hit.bottom && gMC.y - gMC.hit.top > npc->y) + { + if (gMC.ym < npc->ym) + { + gMC.y = npc->y + npc->hit.bottom + gMC.hit.top + 0x200; + gMC.ym = npc->ym; + } + else + { + if (gMC.ym < 0) + gMC.ym = 0; + } + + hit |= 2; + } + + if (gMC.y + gMC.hit.bottom > npc->y - npc->hit.top && gMC.hit.bottom + gMC.y < npc->y + (3 * 0x200)) + { + if (gMC.ym - npc->ym > 2 * 0x200) + PlaySoundObject(23, SOUND_MODE_PLAY); + + if (gMC.unit == 1) + { + gMC.y = npc->y - npc->hit.top - gMC.hit.bottom + 0x200; + hit |= 8; + } + else if (npc->bits & NPC_BOUNCY) + { + gMC.ym = npc->ym - 0x200; + hit |= 8; + } + else if (!(gMC.flag & 8) && gMC.ym > npc->ym) + { + gMC.y = npc->y - npc->hit.top - gMC.hit.bottom + 0x200; + gMC.ym = npc->ym; + gMC.x += npc->xm; + hit |= 8; + } + } + } + } + else + { + if (gMC.y - gMC.hit.top < npc->y + npc->hit.bottom && gMC.y + gMC.hit.bottom > npc->y - npc->hit.top) + { + if (gMC.x - gMC.hit.back < npc->x + npc->hit.back && gMC.x - gMC.hit.back > npc->x) + { + if (gMC.xm < npc->xm) + gMC.xm = npc->xm; + + gMC.x = npc->x + npc->hit.back + gMC.hit.back; + + hit |= 1; + } + + if (gMC.x + gMC.hit.back > npc->x - npc->hit.back && gMC.hit.back + gMC.x < npc->x) + { + if (gMC.xm > npc->xm) + gMC.xm = npc->xm; + + gMC.x = npc->x - npc->hit.back - gMC.hit.back; + + hit |= 4; + } + } + } + + return hit; +} + +void HitMyCharNpChar(void) +{ + int i; + int hit = 0; + + if (!(gMC.cond & 0x80) || gMC.cond & 2) + return; + + for (i = 0; i < NPC_MAX; ++i) + { + if (!(gNPC[i].cond & 0x80)) + continue; + + hit = 0; + + if (gNPC[i].bits & NPC_SOLID_SOFT) + { + hit = JudgeHitMyCharNPC(&gNPC[i]); + gMC.flag |= hit; + } + else if (gNPC[i].bits & NPC_SOLID_HARD) + { + hit = JudgeHitMyCharNPC4(&gNPC[i]); + gMC.flag |= hit; + } + else + { + hit = JudgeHitMyCharNPC3(&gNPC[i]); + } + + // Special NPCs (pickups) + if (hit != 0 && gNPC[i].code_char == 1) + { + PlaySoundObject(14, SOUND_MODE_PLAY); + AddExpMyChar(gNPC[i].exp); + gNPC[i].cond = 0; + } + + if (hit != 0 && gNPC[i].code_char == 86) + { + PlaySoundObject(42, SOUND_MODE_PLAY); + AddBulletMyChar(gNPC[i].code_event, gNPC[i].exp); + gNPC[i].cond = 0; + } + + if (hit != 0 && gNPC[i].code_char == 87) + { + PlaySoundObject(20, SOUND_MODE_PLAY); + AddLifeMyChar(gNPC[i].exp); + gNPC[i].cond = 0; + } + + // Run event on contact + if (!(g_GameFlags & 4) && hit != 0 && gNPC[i].bits & NPC_EVENT_WHEN_TOUCHED) + StartTextScript(gNPC[i].code_event); + + // NPC damage + if (g_GameFlags & 2 && !(gNPC[i].bits & NPC_INTERACTABLE)) + { + if (gNPC[i].bits & NPC_REAR_AND_TOP_DONT_HURT) + { + int damage = gNPC[i].damage; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + KillMyChar(); + } + else{ + damage = damage * gbDamageModifier; + } + + if (hit & 4 && gNPC[i].xm < 0) + DamageMyChar(damage); + if (hit & 1 && gNPC[i].xm > 0) + DamageMyChar(damage); + if (hit & 8 && gNPC[i].ym < 0) + DamageMyChar(damage); + if (hit & 2 && gNPC[i].ym > 0) + DamageMyChar(damage); + } + else if (hit != 0 && gNPC[i].damage && !(g_GameFlags & 4)) + { + int damage = gNPC[i].damage; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + KillMyChar(); + } + else{ + damage = damage * gbDamageModifier; + } + + DamageMyChar(damage); + } + } + + // Interaction + if (!(g_GameFlags & 4) && hit != 0 && gMC.cond & 1 && gNPC[i].bits & NPC_INTERACTABLE) + { + StartTextScript(gNPC[i].code_event); + gMC.xm = 0; + gMC.ques = FALSE; + } + } + + // Create question mark when NPC hasn't been interacted with + if (gMC.ques) + SetCaret(gMC.x, gMC.y, CARET_QUESTION_MARK, DIR_LEFT); +} + +void HitMyCharBoss(void) +{ + int b; + int hit = 0; + + if (!(gMC.cond & 0x80) || gMC.cond & 2) + return; + + for (b = 0; b < BOSS_MAX; ++b) + { + if (!(gBoss[b].cond & 0x80)) + continue; + + hit = 0; + + if (gBoss[b].bits & NPC_SOLID_SOFT) + { + hit = JudgeHitMyCharNPC(&gBoss[b]); + gMC.flag |= hit; + } + else if (gBoss[b].bits & NPC_SOLID_HARD) + { + hit = JudgeHitMyCharNPC4(&gBoss[b]); + gMC.flag |= hit; + } + else + { + hit = JudgeHitMyCharNPC3(&gBoss[b]); + } + + if (!(g_GameFlags & 4) && hit != 0 && gBoss[b].bits & NPC_EVENT_WHEN_TOUCHED) + { + StartTextScript(gBoss[b].code_event); + gMC.ques = FALSE; + } + + if (gBoss[b].bits & NPC_REAR_AND_TOP_DONT_HURT) + { + int damage = gBoss[b].damage; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + KillMyChar(); + } + else{ + damage = damage * gbDamageModifier; + } + + if (hit & 4 && gBoss[b].xm < 0) + DamageMyChar(damage); + if (hit & 1 && gBoss[b].xm > 0) + DamageMyChar(damage); + } + else if (hit != 0 && gBoss[b].damage != 0 && !(g_GameFlags & 4)) + { + int damage = gBoss[b].damage; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + KillMyChar(); + } + else{ + damage = damage * gbDamageModifier; + } + + DamageMyChar(damage); + } + + if (!(g_GameFlags & 4) && hit != 0 && gMC.cond & 1 && gBoss[b].bits & NPC_INTERACTABLE) + { + StartTextScript(gBoss[b].code_event); + gMC.xm = 0; + gMC.ques = FALSE; + } + } + + if (gMC.ques) + SetCaret(gMC.x, gMC.y, CARET_QUESTION_MARK, DIR_LEFT); +} diff --git a/src/MycHit.h b/src/MycHit.h new file mode 100644 index 0000000..418f91d --- /dev/null +++ b/src/MycHit.h @@ -0,0 +1,15 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +extern double gbDamageModifier; + +void ResetMyCharFlag(void); +void HitMyCharMap(void); +void HitMyCharNpChar(void); +void HitMyCharBoss(void); diff --git a/src/MycParam.cpp b/src/MycParam.cpp new file mode 100644 index 0000000..86ac68c --- /dev/null +++ b/src/MycParam.cpp @@ -0,0 +1,598 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "MycParam.h" + +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "ArmsItem.h" +#include "CommonDefines.h" +#include "Caret.h" +#include "Draw.h" +#include "File.h" +#include "Game.h" +#include "Main.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "TextScr.h" +#include "ValueView.h" + +ARMS_LEVEL gArmsLevelTable[14] = +{ + {{0, 0, 100}}, + {{30, 40, 16}}, + {{10, 20, 10}}, + {{10, 20, 20}}, + {{30, 40, 10}}, + {{10, 20, 10}}, + {{10, 20, 30}}, + {{10, 20, 5}}, + {{10, 20, 100}}, + {{30, 60, 0}}, + {{30, 60, 10}}, + {{10, 20, 100}}, + {{1, 1, 1}}, + {{40, 60, 200}} +}; + +void AddExpMyChar(int x) +{ + int lv = gArmsData[gSelectedArms].level - 1; + int arms_code = gArmsData[gSelectedArms].code; + + gArmsData[gSelectedArms].exp += x; + + if (lv == 2) + { + if (gArmsData[gSelectedArms].exp >= gArmsLevelTable[arms_code].exp[lv]) + { + gArmsData[gSelectedArms].exp = gArmsLevelTable[arms_code].exp[lv]; + + if (gMC.equip & EQUIP_WHIMSICAL_STAR) + { + if (gMC.star < 3) + ++gMC.star; + } + } + } + else + { + for (; lv < 2; ++lv) + { + if (gArmsData[gSelectedArms].exp >= gArmsLevelTable[arms_code].exp[lv]) + { + ++gArmsData[gSelectedArms].level; + gArmsData[gSelectedArms].exp = 0; + + if (gArmsData[gSelectedArms].code != 13) + { + PlaySoundObject(27, SOUND_MODE_PLAY); + SetCaret(gMC.x, gMC.y, CARET_LEVEL_UP, DIR_LEFT); + } + } + } + } + + if (gArmsData[gSelectedArms].code != 13) + { + gMC.exp_count += x; + gMC.exp_wait = 30; + } + else + { + gMC.exp_wait = 10; + } +} + +void ZeroExpMyChar(void) +{ + gArmsData[gSelectedArms].level = 1; + gArmsData[gSelectedArms].exp = 0; +} + +BOOL IsMaxExpMyChar(void) +{ + int arms_code; + + if (gArmsData[gSelectedArms].level == 3) + { + arms_code = gArmsData[gSelectedArms].code; + + if (gArmsData[gSelectedArms].exp >= gArmsLevelTable[arms_code].exp[2]) + return TRUE; + } + + return FALSE; +} + +void DamageMyChar(int damage) +{ +#ifdef FIX_BUGS + if (!(g_GameFlags & 2)) +#else + // I'm preeeetty sure this is a typo. The Linux port optimised this entire check out. + if (!(g_GameFlags | 2)) +#endif + return; + + if (gMC.shock) + return; + + // Damage player + PlaySoundObject(16, SOUND_MODE_PLAY); + gMC.cond &= ~1; + gMC.shock = 128; + + if (gMC.unit == 1) + { + // Another weird case where there *has* to be an empty 'if' here to produce the same assembly. + // Chances are there used to be some commented-out code here. + } + else + { + gMC.ym = -0x400; + } + + gMC.life -= (short)damage; + + // Lose a whimsical star + if (gMC.equip & EQUIP_WHIMSICAL_STAR && gMC.star > 0) + gMC.star = (short)gMC.star - 1; // For some reason, this does a cast to short. Might not be accurate to the original source code (possibly, Pixel was just being careful about int size/conversion, or this is from some weird macro) + + // Lose experience + if (gMC.equip & EQUIP_ARMS_BARRIER) + gArmsData[gSelectedArms].exp -= damage; + else + gArmsData[gSelectedArms].exp -= damage * 2; + + while (gArmsData[gSelectedArms].exp < 0) + { + if (gArmsData[gSelectedArms].level > 1) + { + --gArmsData[gSelectedArms].level; + + int lv = gArmsData[gSelectedArms].level - 1; + int arms_code = gArmsData[gSelectedArms].code; + + gArmsData[gSelectedArms].exp = gArmsLevelTable[arms_code].exp[lv] + gArmsData[gSelectedArms].exp; + + if (gMC.life > 0 && gArmsData[gSelectedArms].code != 13) + SetCaret(gMC.x, gMC.y, CARET_LEVEL_UP, DIR_RIGHT); + } + else + { + gArmsData[gSelectedArms].exp = 0; + } + } + + // Tell player how much damage was taken + if(damage > 0) + SetValueView(&gMC.x, &gMC.y, -damage); + + // Death + if (gMC.life <= 0) + { + PlaySoundObject(17, SOUND_MODE_PLAY); + gMC.cond = 0; + SetDestroyNpChar(gMC.x, gMC.y, 10 * 0x200, 0x40); + StartTextScript(40); + } +} + +void KillMyChar(void){ + PlaySoundObject(17, SOUND_MODE_PLAY); + gMC.cond = 0; + SetDestroyNpChar(gMC.x, gMC.y, 10 * 0x200, 0x40); + StartTextScript(40); +} + +void ZeroArmsEnergy_All(void) +{ + int a; + + for (a = 0; a < ARMS_MAX; a++) + { + gArmsData[a].level = 1; + gArmsData[a].exp = 0; + } +} + +void AddBulletMyChar(int no, int val) +{ + int a; + + // Missile Launcher + a = 0; + while (a < ARMS_MAX && gArmsData[a].code != 5) + ++a; + + if (a == ARMS_MAX) + { + // Super Missile Launcher + a = 0; + while (a < ARMS_MAX && gArmsData[a].code != 10) + ++a; + + if (a == ARMS_MAX) + return; + } + + gArmsData[a].num += val; + if (gArmsData[a].num > gArmsData[a].max_num) + gArmsData[a].num = gArmsData[a].max_num; +} + +void AddLifeMyChar(int x) +{ + gMC.life += (short)x; + if (gMC.life > gMC.max_life) + gMC.life = gMC.max_life; + gMC.lifeBr = gMC.life; +} + +void AddMaxLifeMyChar(int val) +{ + gMC.max_life += (short)val; + if (gMC.max_life > 232) + gMC.max_life = 232; + gMC.life += (short)val; + gMC.lifeBr = gMC.life; +} + +void PutArmsEnergy(BOOL flash) +{ + static unsigned char add_flash; + + RECT rcPer = {72, 48, 80, 56}; + RECT rcLv = {80, 80, 96, 88}; + RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + RECT rcNone = {80, 48, 96, 56}; + + if (gArmsEnergyX > 16) + gArmsEnergyX -= 2; + if (gArmsEnergyX < 16) + gArmsEnergyX += 2; + + // Draw max ammo + if (gArmsData[gSelectedArms].max_num) + { + PutNumber4(gArmsEnergyX + 32, 16, gArmsData[gSelectedArms].num, FALSE); + PutNumber4(gArmsEnergyX + 32, 24, gArmsData[gSelectedArms].max_num, FALSE); + } + else + { + PutBitmap3(&rcView, PixelToScreenCoord(gArmsEnergyX + 48), PixelToScreenCoord(16), &rcNone, SURFACE_ID_TEXT_BOX); + PutBitmap3(&rcView, PixelToScreenCoord(gArmsEnergyX + 48), PixelToScreenCoord(24), &rcNone, SURFACE_ID_TEXT_BOX); + } + + // Draw experience and ammo + if (flash == TRUE && (gMC.shock / 2) % 2) + return; + + PutBitmap3(&rcView, PixelToScreenCoord(gArmsEnergyX + 32), PixelToScreenCoord(24), &rcPer, SURFACE_ID_TEXT_BOX); + PutBitmap3(&rcView, PixelToScreenCoord(gArmsEnergyX), PixelToScreenCoord(32), &rcLv, SURFACE_ID_TEXT_BOX); + PutNumber4(gArmsEnergyX - 8, 32, gArmsData[gSelectedArms].level, FALSE); + + RECT rcExpBox = {0, 72, 40, 80}; + RECT rcExpVal = {0, 80, 0, 88}; + RECT rcExpMax = {40, 72, 80, 80}; + RECT rcExpFlash = {40, 80, 80, 88}; + + int lv = gArmsData[gSelectedArms].level - 1; + +#ifdef FIX_MAJOR_BUGS + // When the player has no weapons, the default level is 0, which becomes -1. + // Catch it, and set it to 0 instead, so the following array-accesses aren't + // out-of-bounds. + if (lv < 0) + lv = 0; +#endif + + int arms_code = gArmsData[gSelectedArms].code; + int exp_now = gArmsData[gSelectedArms].exp; + int exp_next = gArmsLevelTable[arms_code].exp[lv]; + + PutBitmap3(&rcView, PixelToScreenCoord(gArmsEnergyX + 24), PixelToScreenCoord(32), &rcExpBox, SURFACE_ID_TEXT_BOX); + + if (lv == 2 && gArmsData[gSelectedArms].exp == gArmsLevelTable[arms_code].exp[lv]) + { + PutBitmap3(&rcView, PixelToScreenCoord(gArmsEnergyX + 24), PixelToScreenCoord(32), &rcExpMax, SURFACE_ID_TEXT_BOX); + } + else + { + if (exp_next != 0) + rcExpVal.right += (exp_now * 40) / exp_next; + else + rcExpVal.right = 0; + + PutBitmap3(&rcView, PixelToScreenCoord(gArmsEnergyX + 24), PixelToScreenCoord(32), &rcExpVal, SURFACE_ID_TEXT_BOX); + } + + if (gMC.exp_wait && ((add_flash++ / 2) % 2)) + PutBitmap3(&rcView, PixelToScreenCoord(gArmsEnergyX + 24), PixelToScreenCoord(32), &rcExpFlash, SURFACE_ID_TEXT_BOX); +} + +void PutActiveArmsList(void) +{ + int x; + int a; + RECT rect = {0, 0, 0, 16}; + + int arms_num = 0; + while (gArmsData[arms_num].code != 0) + ++arms_num; + + if (arms_num == 0) + return; + + for (a = 0; a < arms_num; ++a) + { + // Get X position to draw at + x = ((a - gSelectedArms) * 16) + gArmsEnergyX; + + if (x < 8) + x += 48 + (arms_num * 16); + else if (x >= 24) + x += 48; + + if (x >= 72 + ((arms_num - 1) * 16)) + x -= 48 + (arms_num * 16); + if (x < 72 && x >= 24) + x -= 48; + + // Draw icon + rect.left = gArmsData[a].code * 16; + rect.right = rect.left + 16; + PutBitmap3(&grcGame, PixelToScreenCoord(x), PixelToScreenCoord(16), &rect, SURFACE_ID_ARMS_IMAGE); + } +} + +void PutMyLife(BOOL flash) +{ + RECT rcCase = {0, 40, 232, 48}; + RECT rcLife = {0, 24, 232, 32}; + RECT rcBr = {0, 32, 232, 40}; + + if (flash == TRUE && gMC.shock / 2 % 2) + return; + + if (gMC.lifeBr < gMC.life) + gMC.lifeBr = gMC.life; + + if (gMC.lifeBr > gMC.life) + { + if (++gMC.lifeBr_count > 30) + --gMC.lifeBr; + } + else + { + gMC.lifeBr_count = 0; + } + + // Draw bar + rcCase.right = 64; + rcLife.right = ((gMC.life * 40) / gMC.max_life) - 1; + rcBr.right = ((gMC.lifeBr * 40) / gMC.max_life) - 1; + + PutBitmap3(&grcGame, PixelToScreenCoord(16), PixelToScreenCoord(40), &rcCase, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcGame, PixelToScreenCoord(40), PixelToScreenCoord(40), &rcBr, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcGame, PixelToScreenCoord(40), PixelToScreenCoord(40), &rcLife, SURFACE_ID_TEXT_BOX); + PutNumber4(8, 40, gMC.lifeBr, FALSE); +} + +void PutMyBooster(void){ + RECT rcCase = {16, 144, 232, 152}; + RECT rcLife = {0, 153, 232, 160}; + + // Draw bar + rcCase.right = 64; + rcLife.right = ((gMC.boost_cnt * 40) / 50) - 1; + + PutBitmap3(&grcGame, PixelToScreenCoord(32), PixelToScreenCoord(48), &rcCase, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcGame, PixelToScreenCoord(40), PixelToScreenCoord(48), &rcLife, SURFACE_ID_TEXT_BOX); +} + +void PutMyAir(int x, int y) +{ + RECT rcAir[2] = { + {112, 72, 144, 80}, + {112, 80, 144, 88}, + }; + + if (gMC.no_splash_or_air_limit_underwater) + return; + + if (gMC.equip & EQUIP_AIR_TANK) + return; + + if (gMC.air_get != 0) + { + // Draw how much air is left + if (gMC.air_get % 6 < 4) + PutNumber4(x + 32, y, gMC.air / 10, FALSE); + + // Draw "AIR" text + if (gMC.air % 30 > 10) + PutBitmap3(&grcGame, PixelToScreenCoord(x), PixelToScreenCoord(y), &rcAir[0], SURFACE_ID_TEXT_BOX); + else + PutBitmap3(&grcGame, PixelToScreenCoord(x), PixelToScreenCoord(y), &rcAir[1], SURFACE_ID_TEXT_BOX); + } +} + +static int time_count; + +void PutTimeCounter(int x, int y) +{ + RECT rcTime[3] = { + {112, 104, 120, 112}, + {120, 104, 128, 112}, + {128, 104, 160, 112}, + }; + + if (gMC.equip & EQUIP_NIKUMARU_COUNTER) + { + // Draw clock and increase time + if (g_GameFlags & 2) + { + if (time_count < 100 * 60 * (gb60fps ? 60 : 50)) // 100 minutes + ++time_count; + + if (time_count % 30 > 10) + PutBitmap3(&grcGame, PixelToScreenCoord(x), PixelToScreenCoord(y), &rcTime[0], SURFACE_ID_TEXT_BOX); + else + PutBitmap3(&grcGame, PixelToScreenCoord(x), PixelToScreenCoord(y), &rcTime[1], SURFACE_ID_TEXT_BOX); + } + else + { + PutBitmap3(&grcGame, PixelToScreenCoord(x), PixelToScreenCoord(y), &rcTime[0], SURFACE_ID_TEXT_BOX); + } + + // Draw time + if (gb60fps) + { + PutNumber4(x, y, time_count / (60 * 60), FALSE); + PutNumber4(x + 20, y, time_count / 60 % 60, TRUE); + PutNumber4(x + 32, y, time_count / 6 % 10, FALSE); + } + else + { + PutNumber4(x, y, time_count / (60 * 50), FALSE); + PutNumber4(x + 20, y, time_count / 50 % 60, TRUE); + PutNumber4(x + 32, y, time_count / 5 % 10, FALSE); + } + PutBitmap3(&grcGame, PixelToScreenCoord(x + 30), PixelToScreenCoord(y), &rcTime[2], SURFACE_ID_TEXT_BOX); + } + else + { + time_count = 0; + } +} + +BOOL SaveTimeCounter(void) +{ + int i; + unsigned char p[4]; + REC rec; + FILE *fp; + std::string path; + + // Quit if player doesn't have the Nikumaru Counter + if (!(gMC.equip & EQUIP_NIKUMARU_COUNTER)) + return TRUE; + + // Get last time + path = gModulePath + "/290.rec"; + + fp = fopen(path.c_str(), "rb"); + if (fp != NULL) + { + // Read data + rec.counter[0] = File_ReadLE32(fp); + rec.counter[1] = File_ReadLE32(fp); + rec.counter[2] = File_ReadLE32(fp); + rec.counter[3] = File_ReadLE32(fp); + rec.random[0] = fgetc(fp); + rec.random[1] = fgetc(fp); + rec.random[2] = fgetc(fp); + rec.random[3] = fgetc(fp); + fclose(fp); + + p[0] = (unsigned char)(rec.counter[0] - rec.random[0]); + p[1] = (unsigned char)((rec.counter[0] >> 8) - rec.random[0]); + p[2] = (unsigned char)((rec.counter[0] >> 16) - rec.random[0]); + p[3] = (unsigned char)((rec.counter[0] >> 24) - rec.random[0] / 2); + + rec.counter[0] = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); + + // If this is faster than our new time, quit + if (rec.counter[0] < time_count) + return TRUE; + } + + // Save new time + for (i = 0; i < 4; ++i) + { + rec.counter[i] = time_count; + rec.random[i] = Random(0, 250) + i; + + p[0] = (unsigned char)(rec.counter[i] + rec.random[i]); + p[1] = (unsigned char)((rec.counter[i] >> 8) + rec.random[i]); + p[2] = (unsigned char)((rec.counter[i] >> 16) + rec.random[i]); + p[3] = (unsigned char)((rec.counter[i] >> 24) + rec.random[i] / 2); + + rec.counter[i] = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); + } + + fp = fopen(path.c_str(), "wb"); + if (fp == NULL) + return FALSE; + + File_WriteLE32(rec.counter[0], fp); + File_WriteLE32(rec.counter[1], fp); + File_WriteLE32(rec.counter[2], fp); + File_WriteLE32(rec.counter[3], fp); + fputc(rec.random[0], fp); + fputc(rec.random[1], fp); + fputc(rec.random[2], fp); + fputc(rec.random[3], fp); + + fclose(fp); + return TRUE; +} + +int LoadTimeCounter(void) +{ + int i; + unsigned char p[4]; + REC rec; + FILE *fp; + std::string path; + + // Open file + path = gModulePath + "/290.rec"; + + fp = fopen(path.c_str(), "rb"); + if (fp == NULL) + return 0; + + // Read data + rec.counter[0] = File_ReadLE32(fp); + rec.counter[1] = File_ReadLE32(fp); + rec.counter[2] = File_ReadLE32(fp); + rec.counter[3] = File_ReadLE32(fp); + rec.random[0] = fgetc(fp); + rec.random[1] = fgetc(fp); + rec.random[2] = fgetc(fp); + rec.random[3] = fgetc(fp); + fclose(fp); + + // Decode from checksum + for (i = 0; i < 4; ++i) + { + p[0] = (unsigned char)(rec.counter[i] - rec.random[i]); + p[1] = (unsigned char)((rec.counter[i] >> 8) - rec.random[i]); + p[2] = (unsigned char)((rec.counter[i] >> 16) - rec.random[i]); + p[3] = (unsigned char)((rec.counter[i] >> 24) - rec.random[i] / 2); + + rec.counter[i] = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); + } + + // Verify checksum's result + if (rec.counter[0] != rec.counter[1] || rec.counter[0] != rec.counter[2]) + { + time_count = 0; + return 0; + } + + time_count = rec.counter[0]; + return time_count; +} diff --git a/src/MycParam.h b/src/MycParam.h new file mode 100644 index 0000000..9306fcb --- /dev/null +++ b/src/MycParam.h @@ -0,0 +1,41 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +typedef struct ARMS_LEVEL +{ + int exp[3]; +} ARMS_LEVEL; + +typedef struct REC +{ + long counter[4]; + unsigned char random[4]; +} REC; + +extern ARMS_LEVEL gArmsLevelTable[14]; + +void AddExpMyChar(int x); +void ZeroExpMyChar(void); +BOOL IsMaxExpMyChar(void); +void DamageMyChar(int damage); +void KillMyChar(); +void ZeroArmsEnergy_All(void); +void AddBulletMyChar(int no, int val); +void AddLifeMyChar(int x); +void AddMaxLifeMyChar(int val); +void PutArmsEnergy(BOOL flash); +void PutActiveArmsList(void); +void PutMyLife(BOOL flash); +void PutMyBooster(void); +void PutMyAir(int x, int y); +void PutTimeCounter(int x, int y); +BOOL SaveTimeCounter(void); +int LoadTimeCounter(void); diff --git a/src/NpChar.cpp b/src/NpChar.cpp new file mode 100644 index 0000000..208284e --- /dev/null +++ b/src/NpChar.cpp @@ -0,0 +1,692 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpChar.h" + +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "ArmsItem.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Draw.h" +#include "File.h" +#include "Flags.h" +#include "Game.h" +#include "Main.h" +#include "MyChar.h" +#include "NpcTbl.h" +#include "Sound.h" +#include "ValueView.h" + +NPCHAR gNPC[NPC_MAX]; +int gCurlyShoot_wait; +int gCurlyShoot_x; +int gCurlyShoot_y; +int gSuperXpos; +int gSuperYpos; + +const char* const gPassPixEve = "PXE"; + +static void SetUniqueParameter(NPCHAR *npc) +{ + int code = npc->code_char; + npc->surf = (SurfaceID)gNpcTable[code].surf; + npc->hit_voice = gNpcTable[code].hit_voice; + npc->destroy_voice = gNpcTable[code].destroy_voice; + npc->damage = gNpcTable[code].damage; + npc->size = gNpcTable[code].size; + npc->life = gNpcTable[code].life; + npc->hit.front = gNpcTable[code].hit.front * 0x200; + npc->hit.back = gNpcTable[code].hit.back * 0x200; + npc->hit.top = gNpcTable[code].hit.top * 0x200; + npc->hit.bottom = gNpcTable[code].hit.bottom * 0x200; + npc->view.front = gNpcTable[code].view.front * 0x200; + npc->view.back = gNpcTable[code].view.back * 0x200; + npc->view.top = gNpcTable[code].view.top * 0x200; + npc->view.bottom = gNpcTable[code].view.bottom * 0x200; +} + +void InitNpChar(void) +{ + memset(gNPC, 0, sizeof(gNPC)); +} + +BOOL LoadEvent(const char *path_event) +{ + int i, n; + FILE *fp; + int count; + char code[4]; + EVENT eve; + + std::string path = gSpritePath + '/' + path_event; + + fp = fopen(path.c_str(), "rb"); + if (fp == NULL) + return FALSE; + + // Read "PXE" check + fread(code, 1, 4, fp); + if (memcmp(code, gPassPixEve, 3) != 0) + { +#ifdef FIX_MAJOR_BUGS + // The original game forgot to close the file here + fclose(fp); +#endif + return FALSE; + } + + // Get amount of NPCs + count = File_ReadLE32(fp); + + // Load NPCs + memset(gNPC, 0, sizeof(gNPC)); + + n = 170; + for (i = 0; i < count; ++i) + { + // Get data from file + eve.x = File_ReadLE16(fp); + eve.y = File_ReadLE16(fp); + eve.code_flag = File_ReadLE16(fp); + eve.code_event = File_ReadLE16(fp); + eve.code_char = File_ReadLE16(fp); + eve.bits = File_ReadLE16(fp); + + // Set NPC parameters + gNPC[n].direct = (eve.bits & NPC_SPAWN_IN_OTHER_DIRECTION) ? 2 : 0; + gNPC[n].code_char = eve.code_char; + gNPC[n].code_event = eve.code_event; + gNPC[n].code_flag = eve.code_flag; + gNPC[n].x = (gMirrorMode? eve.x + 1: eve.x) * 0x10 * 0x200; + gNPC[n].y = eve.y * 0x10 * 0x200; + gNPC[n].bits = eve.bits; + gNPC[n].bits |= gNpcTable[gNPC[n].code_char].bits; + gNPC[n].exp = gNpcTable[gNPC[n].code_char].exp; + SetUniqueParameter(&gNPC[n]); + + // Check flags + if (gNPC[n].bits & NPC_APPEAR_WHEN_FLAG_SET) + { + if (GetNPCFlag(gNPC[n].code_flag) == TRUE) + gNPC[n].cond |= 0x80; + } + else if (gNPC[n].bits & NPC_HIDE_WHEN_FLAG_SET) + { + if (GetNPCFlag(gNPC[n].code_flag) == FALSE) + gNPC[n].cond |= 0x80; + } + else + { + gNPC[n].cond = 0x80; + } + + // Increase index + ++n; + } + + fclose(fp); + return TRUE; +} + +void SetNpChar(int code_char, int x, int y, int xm, int ym, int dir, NPCHAR *npc, int start_index) +{ + int n = start_index; + while (n < NPC_MAX && gNPC[n].cond) + ++n; + + if (n == NPC_MAX) + return; + + // Set NPC parameters + memset(&gNPC[n], 0, sizeof(NPCHAR)); + gNPC[n].cond |= 0x80; + gNPC[n].direct = dir; + gNPC[n].code_char = code_char; + gNPC[n].x = x; + gNPC[n].y = y; + gNPC[n].xm = xm; + gNPC[n].ym = ym; + gNPC[n].pNpc = npc; + gNPC[n].bits = gNpcTable[gNPC[n].code_char].bits; + gNPC[n].exp = gNpcTable[gNPC[n].code_char].exp; + SetUniqueParameter(&gNPC[n]); +} + +void SetDestroyNpChar(int x, int y, int w, int num) +{ + int i; + int offset_x; + int offset_y; + + // Create smoke + w /= 0x200; + for (i = 0; i < num; ++i) + { + offset_x = Random(-w, w) * 0x200; + offset_y = Random(-w, w) * 0x200; + SetNpChar(NPC_SMOKE, x + offset_x, y + offset_y, 0, 0, 0, NULL, 0x100); + } + + // Flash effect + SetCaret(x, y, CARET_EXPLOSION, DIR_LEFT); +} + +void SetDestroyNpCharUp(int x, int y, int w, int num) +{ + int i; + int offset_x; + int offset_y; + + // Create smoke + w /= 0x200; + for (i = 0; i < num; ++i) + { + offset_x = Random(-w, w) * 0x200; + offset_y = Random(-w, w) * 0x200; + SetNpChar(4, x + offset_x, y + offset_y, 0, 0, 1, NULL, 0x100); + } + + // Flash effect + SetCaret(x, y, CARET_EXPLOSION, DIR_LEFT); +} + +void SetExpObjects(int x, int y, int exp) +{ + int n; + int sub_exp; + + n = 0x100; + while (exp) + { + while (n < NPC_MAX && gNPC[n].cond) + ++n; + + if (n == NPC_MAX) + break; + + memset(&gNPC[n], 0, sizeof(NPCHAR)); + + if (exp >= 20) + { + exp -= 20; + sub_exp = 20; + } + else if (exp >= 5) + { + exp -= 5; + sub_exp = 5; + } + else if (exp >= 1) + { + exp -= 1; + sub_exp = 1; + } + + gNPC[n].cond |= 0x80; + gNPC[n].direct = 0; + gNPC[n].code_char = 1; + gNPC[n].x = x; + gNPC[n].y = y; + gNPC[n].bits = gNpcTable[gNPC[n].code_char].bits; + gNPC[n].exp = sub_exp; + + SetUniqueParameter(&gNPC[n]); + } +} + +BOOL SetBulletObject(int x, int y, int val) +{ + int n; + int bullet_no; // The Linux debug data claims there's a 3-line gap between this and the next variable declaration. Just enough space for an 'if' statement. + + // if (/* unknown */) + { // This is necessary for accurate ASM (stack frame layout) + int tamakazu_ari[10]; + int t = 0; + + memset(tamakazu_ari, 0, sizeof(tamakazu_ari)); + + for (n = 0; n < 8; ++n) + { + switch (gArmsData[n].code) + { + case 5: + tamakazu_ari[t++] = 0; + break; + + case 10: + tamakazu_ari[t++] = 1; + break; + + default: + tamakazu_ari[t] = 0; + break; + } + } + + if (t == 0) + return FALSE; + + n = Random(1, 10 * t); + bullet_no = tamakazu_ari[n % t]; + + n = 0x100; + while (n < NPC_MAX && gNPC[n].cond) + ++n; + + if (n == NPC_MAX) + return FALSE; + + memset(&gNPC[n], 0, sizeof(NPCHAR)); + gNPC[n].cond |= 0x80; + gNPC[n].direct = 0; + gNPC[n].code_event = bullet_no; + gNPC[n].code_char = 86; + gNPC[n].x = x; + gNPC[n].y = y; + gNPC[n].bits = gNpcTable[gNPC[n].code_char].bits; + gNPC[n].exp = val; + SetUniqueParameter(&gNPC[n]); + } + + return TRUE; +} + +BOOL SetLifeObject(int x, int y, int val) +{ + int n = 0x100; + while (n < NPC_MAX && gNPC[n].cond) + ++n; + + if (n == NPC_MAX) + return FALSE; + + memset(&gNPC[n], 0, sizeof(NPCHAR)); + gNPC[n].cond |= 0x80; + gNPC[n].direct = 0; + gNPC[n].code_char = 87; + gNPC[n].x = x; + gNPC[n].y = y; + gNPC[n].bits = gNpcTable[gNPC[n].code_char].bits; + gNPC[n].exp = val; + SetUniqueParameter(&gNPC[n]); + return TRUE; +} + +void VanishNpChar(NPCHAR *npc) +{ + int x, y; + + x = npc->x; + y = npc->y; + memset(npc, 0, sizeof(NPCHAR)); + npc->count1 = 0; + npc->x = x; + npc->y = y; + npc->cond |= 0x80; + npc->direct = 0; + npc->code_char = 3; + npc->bits = gNpcTable[npc->code_char].bits; + npc->exp = gNpcTable[npc->code_char].exp; + SetUniqueParameter(npc); +} + +void PutNpChar(int fx, int fy) +{ + int n; + signed char a = 0; + + int side; + + for (n = 0; n < NPC_MAX; ++n) + { + if (gNPC[n].cond & 0x80) + { + if (gNPC[n].shock) + { + a = 2 * ((gNPC[n].shock / 2) % 2) - 1; + } + else + { + a = 0; + if (gNPC[n].bits & NPC_SHOW_DAMAGE && gNPC[n].damage_view) + { + SetValueView(&gNPC[n].x, &gNPC[n].y, gNPC[n].damage_view); + gNPC[n].damage_view = 0; + } + } + + if (gNPC[n].direct == 0) + side = gNPC[n].view.front; + else + side = gNPC[n].view.back; + + PutBitmap3( + &grcGame, + SubpixelToScreenCoord(gNPC[n].x - side) - SubpixelToScreenCoord(fx) + PixelToScreenCoord(a), + SubpixelToScreenCoord(gNPC[n].y - gNPC[n].view.top) - SubpixelToScreenCoord(fy), + &gNPC[n].rect, + (SurfaceID)gNPC[n].surf); + } + } +} + +void ActNpChar(void) +{ + int i; + int code_char; + + for (i = 0; i < NPC_MAX; ++i) + { + if (gNPC[i].cond & 0x80) + { + code_char = gNPC[i].code_char; + + gpNpcFuncTbl[code_char](&gNPC[i]); + + if (gNPC[i].shock) + --gNPC[i].shock; + } + } +} + +void ChangeNpCharByEvent(int code_event, int code_char, int dir) +{ + int n; + + for (n = 0; n < NPC_MAX; ++n) + { + if ((gNPC[n].cond & 0x80) && gNPC[n].code_event == code_event) + { + gNPC[n].bits &= ~(NPC_SOLID_SOFT | NPC_IGNORE_TILE_44 | NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY | NPC_BOUNCY | NPC_SHOOTABLE | NPC_SOLID_HARD | NPC_REAR_AND_TOP_DONT_HURT | NPC_SHOW_DAMAGE); // Clear these flags + gNPC[n].code_char = code_char; + gNPC[n].bits |= gNpcTable[gNPC[n].code_char].bits; + gNPC[n].exp = gNpcTable[gNPC[n].code_char].exp; + SetUniqueParameter(&gNPC[n]); + gNPC[n].cond |= 0x80; + gNPC[n].act_no = 0; + gNPC[n].act_wait = 0; + gNPC[n].count1 = 0; + gNPC[n].count2 = 0; + gNPC[n].ani_no = 0; + gNPC[n].ani_wait = 0; + gNPC[n].xm = 0; + gNPC[n].ym = 0; + + if (dir == 5) + { + // Another empty case that has to exist for the same assembly to be generated + } + else if (dir == 4) + { + if (gNPC[n].x < gMC.x) + gNPC[n].direct = 2; + else + gNPC[n].direct = 0; + } + else + { + gNPC[n].direct = dir; + } + + gpNpcFuncTbl[code_char](&gNPC[n]); + } + } +} + +void ChangeCheckableNpCharByEvent(int code_event, int code_char, int dir) +{ + int n; + + for (n = 0; n < NPC_MAX; ++n) + { + if (!(gNPC[n].cond & 0x80) && gNPC[n].code_event == code_event) + { + gNPC[n].bits &= ~(NPC_SOLID_SOFT | NPC_IGNORE_TILE_44 | NPC_INVULNERABLE | NPC_IGNORE_SOLIDITY | NPC_BOUNCY | NPC_SHOOTABLE | NPC_SOLID_HARD | NPC_REAR_AND_TOP_DONT_HURT | NPC_SHOW_DAMAGE); // Clear these flags + gNPC[n].bits |= NPC_INTERACTABLE; + gNPC[n].code_char = code_char; + gNPC[n].bits |= gNpcTable[gNPC[n].code_char].bits; + gNPC[n].exp = gNpcTable[gNPC[n].code_char].exp; + SetUniqueParameter(&gNPC[n]); + gNPC[n].cond |= 0x80; + gNPC[n].act_no = 0; + gNPC[n].act_wait = 0; + gNPC[n].count1 = 0; + gNPC[n].count2 = 0; + gNPC[n].ani_no = 0; + gNPC[n].ani_wait = 0; + gNPC[n].xm = 0; + gNPC[n].ym = 0; + + if (dir == 5) + { + // Another empty case that has to exist for the same assembly to be generated + } + else if (dir == 4) + { + if (gNPC[n].x < gMC.x) + gNPC[n].direct = 2; + else + gNPC[n].direct = 0; + } + else + { + gNPC[n].direct = (signed char)dir; + } + + gpNpcFuncTbl[code_char](&gNPC[n]); + } + } +} + +void SetNpCharActionNo(int code_event, int act_no, int dir) +{ + + int n = 0; + while (n < NPC_MAX) + { + if ((gNPC[n].cond & 0x80) && gNPC[n].code_event == code_event) + break; + + ++n; + } + + if (n == NPC_MAX) + return; + + gNPC[n].act_no = act_no; + + if (dir == 5) + { + // Another empty case that has to exist for the same assembly to be generated + } + else if (dir == 4) + { + if (gNPC[n].x < gMC.x) + gNPC[n].direct = 2; + else + gNPC[n].direct = 0; + } + else + { + gNPC[n].direct = dir; + } +} + +void MoveNpChar(int code_event, int x, int y, int dir) +{ + int n = 0; + while (n < NPC_MAX) + { + if ((gNPC[n].cond & 0x80) && gNPC[n].code_event == code_event) + break; + + ++n; + } + + if (n == NPC_MAX) + return; + + gNPC[n].x = x; + gNPC[n].y = y; + + if (dir == 5) + { + // Another empty case that has to exist for the same assembly to be generated + } + else if (dir == 4) + { + if (gNPC[n].x < gMC.x) + gNPC[n].direct = 2; + else + gNPC[n].direct = 0; + } + else + { + gNPC[n].direct = (signed char)dir; + } +} + +void BackStepMyChar(int code_event) +{ + int n = 0; + + gMC.cond &= ~1; + gMC.ym = -0x200; + + if (code_event == 0) + { + gMC.direct = 0; + gMC.xm = 0x200; + } + else if (code_event == 2) + { + gMC.direct = 2; + gMC.xm = -0x200; + } + else + { + while (n < NPC_MAX) + { + if ((gNPC[n].cond & 0x80) && gNPC[n].code_event == code_event) + break; + + ++n; + } + + if (n == NPC_MAX) + return; + + if (gNPC[n].x < gMC.x) + { + gMC.direct = 0; + gMC.xm = 0x200; + } + else + { + gMC.direct = 2; + gMC.xm = -0x200; + } + } +} + +void DeleteNpCharEvent(int code) +{ + int i; + + for (i = 0; i < NPC_MAX; ++i) + { + if ((gNPC[i].cond & 0x80) && gNPC[i].code_event == code) + { + gNPC[i].cond = 0; + SetNPCFlag(gNPC[i].code_flag); + } + } +} + +void DeleteNpCharCode(int code, BOOL bSmoke) +{ + int n; + + for (n = 0; n < NPC_MAX; ++n) + { + if ((gNPC[n].cond & 0x80) && gNPC[n].code_char == code) + { + gNPC[n].cond = 0; + SetNPCFlag(gNPC[n].code_flag); + + if (bSmoke) + { + PlaySoundObject(gNPC[n].destroy_voice, SOUND_MODE_PLAY); + + switch (gNPC[n].size) + { + case 1: + SetDestroyNpChar(gNPC[n].x, gNPC[n].y, gNPC[n].view.back, 4); + break; + + case 2: + SetDestroyNpChar(gNPC[n].x, gNPC[n].y, gNPC[n].view.back, 8); + break; + + case 3: + SetDestroyNpChar(gNPC[n].x, gNPC[n].y, gNPC[n].view.back, 16); + break; + } + } + } + } +} + +void GetNpCharPosition(int *x, int *y, int i) +{ + *x = gNPC[i].x; + *y = gNPC[i].y; +} + +BOOL IsNpCharCode(int code) +{ + int i; + + for (i = 0; i < NPC_MAX; ++i) + if ((gNPC[i].cond & 0x80) && gNPC[i].code_char == code) + return TRUE; + + return FALSE; +} + +BOOL GetNpCharAlive(int code_event) +{ + int i; + + for (i = 0; i < NPC_MAX; ++i) + if ((gNPC[i].cond & 0x80) && gNPC[i].code_event == code_event) + break; + + if (i < NPC_MAX) + return TRUE; + else + return FALSE; +} + +int CountAliveNpChar(void) +{ + int n; + int count = 0; + + for (n = 0; n < NPC_MAX; ++n) + if (gNPC[n].cond & 0x80) + ++count; + + return count; +} diff --git a/src/NpChar.h b/src/NpChar.h new file mode 100644 index 0000000..14d9fd7 --- /dev/null +++ b/src/NpChar.h @@ -0,0 +1,140 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" +#include "Draw.h" + +#define NPC_MAX 0x200 + +enum NPCCond +{ + NPCCOND_DAMAGE_BOSS = 0x10, // (gBoss npc exclusive) When set, damage the main boss + NPCCOND_ALIVE = 0x80 // Whether the NPC is alive or not +}; + +// Be careful when changing these: they're baked into the 'npc.tbl' file +enum NPCFlags +{ + NPC_SOLID_SOFT = 1<<0, // Pushes Quote out + NPC_IGNORE_TILE_44 = 1<<1, // Ignores tile 44, which normally blocks NPCs + NPC_INVULNERABLE = 1<<2, // Can't be hurt + NPC_IGNORE_SOLIDITY = 1<<3, // Doesn't collide with anything + NPC_BOUNCY = 1<<4, // Quote bounces on top of NPC + NPC_SHOOTABLE = 1<<5, // Can be shot + NPC_SOLID_HARD = 1<<6, // Essentially acts as level tiles + NPC_REAR_AND_TOP_DONT_HURT = 1<<7, // Rear and top don't hurt when touched + NPC_EVENT_WHEN_TOUCHED = 1<<8, // Run event when touched + NPC_EVENT_WHEN_KILLED = 1<<9, // Run event when killed + NPC_APPEAR_WHEN_FLAG_SET = 1<<11, // Only appear when flag is set + NPC_SPAWN_IN_OTHER_DIRECTION = 1<<12, // Spawn facing to the right (or however the NPC interprets the direction) + NPC_INTERACTABLE = 1<<13, // Run event when interacted with + NPC_HIDE_WHEN_FLAG_SET = 1<<14, // Hide when flag is set + NPC_SHOW_DAMAGE = 1<<15 // Show the number of damage taken when harmed +}; + +enum NPCNames +{ + NPC_NULL = 0, + NPC_EXP = 1, + NPC_ENEMY_BEHEMOTH = 2, + NPC_DAMAGE_TEXT_HOLDER = 3, + NPC_SMOKE = 4, + // To be continued + NPC_ENEMY_FROG = 104, + NPC_SPEECH_BALLOON_HEY_LOW = 105, + NPC_SPEECH_BALLOON_HEY_HIGH = 106, + NPC_MALCO_UNDAMAGED = 107, + NPC_PROJECTILE_BALFROG_SPITBALL = 108, + NPC_MALCO_DAMAGED = 109, + NPC_ENEMY_PUCHI = 110, + // To be continued + NPC_KINGS_SWORD = 145 +}; + +typedef struct NPCHAR +{ + unsigned char cond; + int flag; + int x; + int y; + int xm; + int ym; + int xm2; + int ym2; + int tgt_x; + int tgt_y; + int code_char; + int code_flag; + int code_event; + SurfaceID surf; + int hit_voice; + int destroy_voice; + int life; + int exp; + int size; + int direct; + unsigned short bits; + RECT rect; + int ani_wait; + int ani_no; + int count1; + int count2; + int act_no; + int act_wait; + OTHER_RECT hit; + OTHER_RECT view; + unsigned char shock; + int damage_view; + int damage; + struct NPCHAR *pNpc; +} NPCHAR; + +struct EVENT +{ + short x; + short y; + short code_flag; + short code_event; + short code_char; + unsigned short bits; +}; + +extern NPCHAR gNPC[NPC_MAX]; +extern int gCurlyShoot_wait; +extern int gCurlyShoot_x; +extern int gCurlyShoot_y; +extern int gSuperXpos; +extern int gSuperYpos; + +extern const char* const gPassPixEve; + +void InitNpChar(void); +BOOL LoadEvent(const char *path_event); +void SetNpChar(int code_char, int x, int y, int xm, int ym, int dir, NPCHAR *npc, int start_index); +void SetDestroyNpChar(int x, int y, int w, int num); +void SetDestroyNpCharUp(int x, int y, int w, int num); +void SetExpObjects(int x, int y, int exp); +BOOL SetBulletObject(int x, int y, int val); +BOOL SetLifeObject(int x, int y, int val); +void VanishNpChar(NPCHAR *npc); +void PutNpChar(int fx, int fy); +void ActNpChar(void); +void ChangeNpCharByEvent(int code_event, int code_char, int dir); +void ChangeCheckableNpCharByEvent(int code_event, int code_char, int dir); +void SetNpCharActionNo(int code_event, int act_no, int dir); +void MoveNpChar(int code_event, int x, int y, int dir); +void BackStepMyChar(int code_event); +void DeleteNpCharEvent(int code); +void DeleteNpCharCode(int code, BOOL bSmoke); +void GetNpCharPosition(int *x, int *y, int i); +BOOL IsNpCharCode(int code); +BOOL GetNpCharAlive(int code_event); +int CountAliveNpChar(void); diff --git a/src/NpcAct.h b/src/NpcAct.h new file mode 100644 index 0000000..4240491 --- /dev/null +++ b/src/NpcAct.h @@ -0,0 +1,372 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "NpChar.h" + +void ActNpc000(NPCHAR *npc); +void ActNpc001(NPCHAR *npc); +void ActNpc002(NPCHAR *npc); +void ActNpc003(NPCHAR *npc); +void ActNpc004(NPCHAR *npc); +void ActNpc005(NPCHAR *npc); +void ActNpc006(NPCHAR *npc); +void ActNpc007(NPCHAR *npc); +void ActNpc008(NPCHAR *npc); +void ActNpc009(NPCHAR *npc); +void ActNpc010(NPCHAR *npc); +void ActNpc011(NPCHAR *npc); +void ActNpc012(NPCHAR *npc); +void ActNpc013(NPCHAR *npc); +void ActNpc014(NPCHAR *npc); +void ActNpc015(NPCHAR *npc); +void ActNpc016(NPCHAR *npc); +void ActNpc017(NPCHAR *npc); +void ActNpc018(NPCHAR *npc); +void ActNpc019(NPCHAR *npc); +void ActNpc020(NPCHAR *npc); +void ActNpc021(NPCHAR *npc); +void ActNpc022(NPCHAR *npc); +void ActNpc023(NPCHAR *npc); +void ActNpc024(NPCHAR *npc); +void ActNpc025(NPCHAR *npc); +void ActNpc026(NPCHAR *npc); +void ActNpc027(NPCHAR *npc); +void ActNpc028(NPCHAR *npc); +void ActNpc029(NPCHAR *npc); +void ActNpc030(NPCHAR *npc); +void ActNpc031(NPCHAR *npc); +void ActNpc032(NPCHAR *npc); +void ActNpc033(NPCHAR *npc); +void ActNpc034(NPCHAR *npc); +void ActNpc035(NPCHAR *npc); +void ActNpc036(NPCHAR *npc); +void ActNpc037(NPCHAR *npc); +void ActNpc038(NPCHAR *npc); +void ActNpc039(NPCHAR *npc); +void ActNpc040(NPCHAR *npc); +void ActNpc041(NPCHAR *npc); +void ActNpc042(NPCHAR *npc); +void ActNpc043(NPCHAR *npc); +void ActNpc044(NPCHAR *npc); +void ActNpc045(NPCHAR *npc); +void ActNpc046(NPCHAR *npc); +void ActNpc047(NPCHAR *npc); +void ActNpc048(NPCHAR *npc); +void ActNpc049(NPCHAR *npc); +void ActNpc050(NPCHAR *npc); +void ActNpc051(NPCHAR *npc); +void ActNpc052(NPCHAR *npc); +void ActNpc053(NPCHAR *npc); +void ActNpc054(NPCHAR *npc); +void ActNpc055(NPCHAR *npc); +void ActNpc056(NPCHAR *npc); +void ActNpc057(NPCHAR *npc); +void ActNpc058(NPCHAR *npc); +void ActNpc059(NPCHAR *npc); +void ActNpc060(NPCHAR *npc); +void ActNpc061(NPCHAR *npc); +void ActNpc062(NPCHAR *npc); +void ActNpc063(NPCHAR *npc); +void ActNpc064(NPCHAR *npc); +void ActNpc065(NPCHAR *npc); +void ActNpc066(NPCHAR *npc); +void ActNpc067(NPCHAR *npc); +void ActNpc068(NPCHAR *npc); +void ActNpc069(NPCHAR *npc); +void ActNpc070(NPCHAR *npc); +void ActNpc071(NPCHAR *npc); +void ActNpc072(NPCHAR *npc); +void ActNpc073(NPCHAR *npc); +void ActNpc074(NPCHAR *npc); +void ActNpc075(NPCHAR *npc); +void ActNpc076(NPCHAR *npc); +void ActNpc077(NPCHAR *npc); +void ActNpc078(NPCHAR *npc); +void ActNpc079(NPCHAR *npc); +void ActNpc080(NPCHAR *npc); +void ActNpc081(NPCHAR *npc); +void ActNpc082(NPCHAR *npc); +void ActNpc083(NPCHAR *npc); +void ActNpc084(NPCHAR *npc); +void ActNpc085(NPCHAR *npc); +void ActNpc086(NPCHAR *npc); +void ActNpc087(NPCHAR *npc); +void ActNpc088(NPCHAR *npc); +void ActNpc089(NPCHAR *npc); +void ActNpc090(NPCHAR *npc); +void ActNpc091(NPCHAR *npc); +void ActNpc092(NPCHAR *npc); +void ActNpc093(NPCHAR *npc); +void ActNpc094(NPCHAR *npc); +void ActNpc095(NPCHAR *npc); +void ActNpc096(NPCHAR *npc); +void ActNpc097(NPCHAR *npc); +void ActNpc098(NPCHAR *npc); +void ActNpc099(NPCHAR *npc); +void ActNpc100(NPCHAR *npc); +void ActNpc101(NPCHAR *npc); +void ActNpc102(NPCHAR *npc); +void ActNpc103(NPCHAR *npc); +void ActNpc104(NPCHAR *npc); +void ActNpc105(NPCHAR *npc); +void ActNpc106(NPCHAR *npc); +void ActNpc107(NPCHAR *npc); +void ActNpc108(NPCHAR *npc); +void ActNpc109(NPCHAR *npc); +void ActNpc110(NPCHAR *npc); +void ActNpc111(NPCHAR *npc); +void ActNpc112(NPCHAR *npc); +void ActNpc113(NPCHAR *npc); +void ActNpc114(NPCHAR *npc); +void ActNpc115(NPCHAR *npc); +void ActNpc116(NPCHAR *npc); +void ActNpc117(NPCHAR *npc); +void ActNpc118(NPCHAR *npc); +void ActNpc119(NPCHAR *npc); +void ActNpc120(NPCHAR *npc); +void ActNpc121(NPCHAR *npc); +void ActNpc122(NPCHAR *npc); +void ActNpc123(NPCHAR *npc); +void ActNpc124(NPCHAR *npc); +void ActNpc125(NPCHAR *npc); +void ActNpc126(NPCHAR *npc); +void ActNpc127(NPCHAR *npc); +void ActNpc128(NPCHAR *npc); +void ActNpc129(NPCHAR *npc); +void ActNpc130(NPCHAR *npc); +void ActNpc131(NPCHAR *npc); +void ActNpc132(NPCHAR *npc); +void ActNpc133(NPCHAR *npc); +void ActNpc134(NPCHAR *npc); +void ActNpc135(NPCHAR *npc); +void ActNpc136(NPCHAR *npc); +void ActNpc137(NPCHAR *npc); +void ActNpc138(NPCHAR *npc); +void ActNpc139(NPCHAR *npc); +void ActNpc140(NPCHAR *npc); +void ActNpc141(NPCHAR *npc); +void ActNpc142(NPCHAR *npc); +void ActNpc143(NPCHAR *npc); +void ActNpc144(NPCHAR *npc); +void ActNpc145(NPCHAR *npc); +void ActNpc146(NPCHAR *npc); +void ActNpc147(NPCHAR *npc); +void ActNpc148(NPCHAR *npc); +void ActNpc149(NPCHAR *npc); +void ActNpc150(NPCHAR *npc); +void ActNpc151(NPCHAR *npc); +void ActNpc152(NPCHAR *npc); +void ActNpc153(NPCHAR *npc); +void ActNpc154(NPCHAR *npc); +void ActNpc155(NPCHAR *npc); +void ActNpc156(NPCHAR *npc); +void ActNpc157(NPCHAR *npc); +void ActNpc158(NPCHAR *npc); +void ActNpc159(NPCHAR *npc); +void ActNpc160(NPCHAR *npc); +void ActNpc161(NPCHAR *npc); +void ActNpc162(NPCHAR *npc); +void ActNpc163(NPCHAR *npc); +void ActNpc164(NPCHAR *npc); +void ActNpc165(NPCHAR *npc); +void ActNpc166(NPCHAR *npc); +void ActNpc167(NPCHAR *npc); +void ActNpc168(NPCHAR *npc); +void ActNpc169(NPCHAR *npc); +void ActNpc170(NPCHAR *npc); +void ActNpc171(NPCHAR *npc); +void ActNpc172(NPCHAR *npc); +void ActNpc173(NPCHAR *npc); +void ActNpc174(NPCHAR *npc); +void ActNpc175(NPCHAR *npc); +void ActNpc176(NPCHAR *npc); +void ActNpc177(NPCHAR *npc); +void ActNpc178(NPCHAR *npc); +void ActNpc179(NPCHAR *npc); +void ActNpc180(NPCHAR *npc); +void ActNpc181(NPCHAR *npc); +void ActNpc182(NPCHAR *npc); +void ActNpc183(NPCHAR *npc); +void ActNpc184(NPCHAR *npc); +void ActNpc185(NPCHAR *npc); +void ActNpc186(NPCHAR *npc); +void ActNpc187(NPCHAR *npc); +void ActNpc188(NPCHAR *npc); +void ActNpc189(NPCHAR *npc); +void ActNpc190(NPCHAR *npc); +void ActNpc191(NPCHAR *npc); +void ActNpc192(NPCHAR *npc); +void ActNpc193(NPCHAR *npc); +void ActNpc194(NPCHAR *npc); +void ActNpc195(NPCHAR *npc); +void ActNpc196(NPCHAR *npc); +void ActNpc197(NPCHAR *npc); +void ActNpc198(NPCHAR *npc); +void ActNpc199(NPCHAR *npc); +void ActNpc200(NPCHAR *npc); +void ActNpc201(NPCHAR *npc); +void ActNpc202(NPCHAR *npc); +void ActNpc203(NPCHAR *npc); +void ActNpc204(NPCHAR *npc); +void ActNpc205(NPCHAR *npc); +void ActNpc206(NPCHAR *npc); +void ActNpc207(NPCHAR *npc); +void ActNpc208(NPCHAR *npc); +void ActNpc209(NPCHAR *npc); +void ActNpc210(NPCHAR *npc); +void ActNpc211(NPCHAR *npc); +void ActNpc212(NPCHAR *npc); +void ActNpc213(NPCHAR *npc); +void ActNpc214(NPCHAR *npc); +void ActNpc215(NPCHAR *npc); +void ActNpc216(NPCHAR *npc); +void ActNpc217(NPCHAR *npc); +void ActNpc218(NPCHAR *npc); +void ActNpc219(NPCHAR *npc); +void ActNpc220(NPCHAR *npc); +void ActNpc221(NPCHAR *npc); +void ActNpc222(NPCHAR *npc); +void ActNpc223(NPCHAR *npc); +void ActNpc224(NPCHAR *npc); +void ActNpc225(NPCHAR *npc); +void ActNpc226(NPCHAR *npc); +void ActNpc227(NPCHAR *npc); +void ActNpc228(NPCHAR *npc); +void ActNpc229(NPCHAR *npc); +void ActNpc230(NPCHAR *npc); +void ActNpc231(NPCHAR *npc); +void ActNpc232(NPCHAR *npc); +void ActNpc233(NPCHAR *npc); +void ActNpc234(NPCHAR *npc); +void ActNpc235(NPCHAR *npc); +void ActNpc236(NPCHAR *npc); +void ActNpc237(NPCHAR *npc); +void ActNpc238(NPCHAR *npc); +void ActNpc239(NPCHAR *npc); +void ActNpc240(NPCHAR *npc); +void ActNpc241(NPCHAR *npc); +void ActNpc242(NPCHAR *npc); +void ActNpc243(NPCHAR *npc); +void ActNpc244(NPCHAR *npc); +void ActNpc245(NPCHAR *npc); +void ActNpc246(NPCHAR *npc); +void ActNpc247(NPCHAR *npc); +void ActNpc248(NPCHAR *npc); +void ActNpc249(NPCHAR *npc); +void ActNpc250(NPCHAR *npc); +void ActNpc251(NPCHAR *npc); +void ActNpc252(NPCHAR *npc); +void ActNpc253(NPCHAR *npc); +void ActNpc254(NPCHAR *npc); +void ActNpc255(NPCHAR *npc); +void ActNpc256(NPCHAR *npc); +void ActNpc257(NPCHAR *npc); +void ActNpc258(NPCHAR *npc); +void ActNpc259(NPCHAR *npc); +void ActNpc260(NPCHAR *npc); +void ActNpc261(NPCHAR *npc); +void ActNpc262(NPCHAR *npc); +void ActNpc263(NPCHAR *npc); +void ActNpc264(NPCHAR *npc); +void ActNpc265(NPCHAR *npc); +void ActNpc266(NPCHAR *npc); +void ActNpc267(NPCHAR *npc); +void ActNpc268(NPCHAR *npc); +void ActNpc269(NPCHAR *npc); +void ActNpc270(NPCHAR *npc); +void ActNpc271(NPCHAR *npc); +void ActNpc272(NPCHAR *npc); +void ActNpc273(NPCHAR *npc); +void ActNpc274(NPCHAR *npc); +void ActNpc275(NPCHAR *npc); +void ActNpc276(NPCHAR *npc); +void ActNpc277(NPCHAR *npc); +void ActNpc278(NPCHAR *npc); +void ActNpc279(NPCHAR *npc); +void ActNpc280(NPCHAR *npc); +void ActNpc281(NPCHAR *npc); +void ActNpc282(NPCHAR *npc); +void ActNpc283(NPCHAR *npc); +void ActNpc284(NPCHAR *npc); +void ActNpc285(NPCHAR *npc); +void ActNpc286(NPCHAR *npc); +void ActNpc287(NPCHAR *npc); +void ActNpc288(NPCHAR *npc); +void ActNpc289(NPCHAR *npc); +void ActNpc290(NPCHAR *npc); +void ActNpc291(NPCHAR *npc); +void ActNpc292(NPCHAR *npc); +void ActNpc293(NPCHAR *npc); +void ActNpc294(NPCHAR *npc); +void ActNpc295(NPCHAR *npc); +void ActNpc296(NPCHAR *npc); +void ActNpc297(NPCHAR *npc); +void ActNpc298(NPCHAR *npc); +void ActNpc299(NPCHAR *npc); +void ActNpc300(NPCHAR *npc); +void ActNpc301(NPCHAR *npc); +void ActNpc302(NPCHAR *npc); +void ActNpc303(NPCHAR *npc); +void ActNpc304(NPCHAR *npc); +void ActNpc305(NPCHAR *npc); +void ActNpc306(NPCHAR *npc); +void ActNpc307(NPCHAR *npc); +void ActNpc308(NPCHAR *npc); +void ActNpc309(NPCHAR *npc); +void ActNpc310(NPCHAR *npc); +void ActNpc311(NPCHAR *npc); +void ActNpc312(NPCHAR *npc); +void ActNpc313(NPCHAR *npc); +void ActNpc314(NPCHAR *npc); +void ActNpc315(NPCHAR *npc); +void ActNpc316(NPCHAR *npc); +void ActNpc317(NPCHAR *npc); +void ActNpc318(NPCHAR *npc); +void ActNpc319(NPCHAR *npc); +void ActNpc320(NPCHAR *npc); +void ActNpc321(NPCHAR *npc); +void ActNpc322(NPCHAR *npc); +void ActNpc323(NPCHAR *npc); +void ActNpc324(NPCHAR *npc); +void ActNpc325(NPCHAR *npc); +void ActNpc326(NPCHAR *npc); +void ActNpc327(NPCHAR *npc); +void ActNpc328(NPCHAR *npc); +void ActNpc329(NPCHAR *npc); +void ActNpc330(NPCHAR *npc); +void ActNpc331(NPCHAR *npc); +void ActNpc332(NPCHAR *npc); +void ActNpc333(NPCHAR *npc); +void ActNpc334(NPCHAR *npc); +void ActNpc335(NPCHAR *npc); +void ActNpc336(NPCHAR *npc); +void ActNpc337(NPCHAR *npc); +void ActNpc338(NPCHAR *npc); +void ActNpc339(NPCHAR *npc); +void ActNpc340(NPCHAR *npc); +void ActNpc341(NPCHAR *npc); +void ActNpc342(NPCHAR *npc); +void ActNpc343(NPCHAR *npc); +void ActNpc344(NPCHAR *npc); +void ActNpc345(NPCHAR *npc); +void ActNpc346(NPCHAR *npc); +void ActNpc347(NPCHAR *npc); +void ActNpc348(NPCHAR *npc); +void ActNpc349(NPCHAR *npc); +void ActNpc350(NPCHAR *npc); +void ActNpc351(NPCHAR *npc); +void ActNpc352(NPCHAR *npc); +void ActNpc353(NPCHAR *npc); +void ActNpc354(NPCHAR *npc); +void ActNpc355(NPCHAR *npc); +void ActNpc356(NPCHAR *npc); +void ActNpc357(NPCHAR *npc); +void ActNpc358(NPCHAR *npc); +void ActNpc359(NPCHAR *npc); +void ActNpc360(NPCHAR *npc); diff --git a/src/NpcAct000.cpp b/src/NpcAct000.cpp new file mode 100644 index 0000000..61a138e --- /dev/null +++ b/src/NpcAct000.cpp @@ -0,0 +1,1799 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Back.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +// Null +void ActNpc000(NPCHAR *npc) +{ + RECT rect = {0, 0, 16, 16}; + + if (npc->act_no == 0) + { + npc->act_no = 1; + + if (npc->direct == 2) + npc->y += 16 * 0x200; + } + + npc->rect = rect; +} + +// Experience +void ActNpc001(NPCHAR *npc) +{ + // In wind + if (gBack.type == BACKGROUND_TYPE_AUTOSCROLL || gBack.type == BACKGROUND_TYPE_CLOUDS_WINDY) + { + if (npc->act_no == 0) + { + // Set state + npc->act_no = 1; + + // Set random speed + npc->ym = Random(-0x80, 0x80); + npc->xm = Random(0x7F, 0x100); + } + + // Blow to the left + npc->xm -= 8; + + // Destroy when off-screen + if (npc->x < 80 * 0x200) + npc->cond = 0; + +#ifdef FIX_BUGS + // Limit speed + if (npc->xm < -0x600) + npc->xm = -0x600; +#else + // Limit speed (except Pixel applied it to the X position) + if (npc->x < -0x600) + npc->x = -0x600; +#endif + + // Bounce off walls + if (npc->flag & 1) + npc->xm = 0x100; + if (npc->flag & 2) + npc->ym = 0x40; + if (npc->flag & 8) + npc->ym = -0x40; + } + // When not in wind + else + { + if (npc->act_no == 0) + { + // Set state + npc->act_no = 1; + npc->ani_no = Random(0, 4); + + // Random speed + npc->xm = Random(-0x200, 0x200); + npc->ym = Random(-0x400, 0); + + // Random direction (reverse animation or not) + if (Random(0, 1) != 0) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + // Gravity + if (npc->flag & 0x100) + npc->ym += 0x15; + else + npc->ym += 0x2A; + + // Bounce off walls + if (npc->flag & 1 && npc->xm < 0) + npc->xm *= -1; + if (npc->flag & 4 && npc->xm > 0) + npc->xm *= -1; + + // Bounce off ceiling + if (npc->flag & 2 && npc->ym < 0) + npc->ym *= -1; + + // Bounce off floor + if (npc->flag & 8) + { + PlaySoundObject(45, SOUND_MODE_PLAY); + npc->ym = -0x280; + npc->xm = 2 * npc->xm / 3; + } + + // Play bounce song (and try to clip out of floor if stuck) + if (npc->flag & 0xD) + { + PlaySoundObject(45, SOUND_MODE_PLAY); + if (++npc->count2 > 2) + npc->y -= 1 * 0x200; + } + else + { + npc->count2 = 0; + } + + // Limit speed + if (npc->xm < -0x5FF) + npc->xm = -0x5FF; + if (npc->xm > 0x5FF) + npc->xm = 0x5FF; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + } + + // Move + npc->y += npc->ym; + npc->x += npc->xm; + + // Get framerects + RECT rect[6] = { + { 0, 16, 16, 32}, + {16, 16, 32, 32}, + {32, 16, 48, 32}, + {48, 16, 64, 32}, + {64, 16, 80, 32}, + {80, 16, 96, 32}, + }; + + RECT rcNo = {0, 0, 0, 0}; + + // Animate + ++npc->ani_wait; + + if (npc->direct == 0) + { + if (npc->ani_wait > 2) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 5) + npc->ani_no = 0; + } + } + else + { + if (npc->ani_wait > 2) + { + npc->ani_wait = 0; + + if (--npc->ani_no < 0) + npc->ani_no = 5; + } + } + + npc->rect = rect[npc->ani_no]; + + // Size + if (npc->act_no != 0) + { + switch (npc->exp) + { + case 5: + npc->rect.top += 16; + npc->rect.bottom += 16; + break; + + case 20: + npc->rect.top += 32; + npc->rect.bottom += 32; + break; + } + + npc->act_no = 1; + } + + // Delete after 500 frames + if (++npc->count1 > 500 && npc->ani_no == 5 && npc->ani_wait == 2) + npc->cond = 0; + + // Blink after 400 frames + if (npc->count1 > 400) + if (npc->count1 / 2 % 2) + npc->rect = rcNo; +} + +// Behemoth +void ActNpc002(NPCHAR *npc) +{ + // Rects + RECT rcLeft[7] = { + { 32, 0, 64, 24}, + { 0, 0, 32, 24}, + { 32, 0, 64, 24}, + { 64, 0, 96, 24}, + { 96, 0, 128, 24}, + {128, 0, 160, 24}, + {160, 0, 192, 24}, + }; + + RECT rcRight[7] = { + { 32, 24, 64, 48}, + { 0, 24, 32, 48}, + { 32, 24, 64, 48}, + { 64, 24, 96, 48}, + { 96, 24, 128, 48}, + {128, 24, 160, 48}, + {160, 24, 192, 48}, + }; + + // Turn when touching a wall + if (npc->flag & 1) + npc->direct = gMirrorMode? 0:2; + else if (npc->flag & 4) + npc->direct = gMirrorMode? 2:0; + + switch (npc->act_no) + { + case 0: // Walking + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + if (++npc->ani_wait > 8) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + if (npc->shock) + { + npc->count1 = 0; + npc->act_no = 1; + npc->ani_no = 4; + } + + break; + + case 1: // Shot + npc->xm = (npc->xm * 7) / 8; + + if (++npc->count1 > 40) + { + if (npc->shock) + { + npc->count1 = 0; + npc->act_no = 2; + npc->ani_no = 6; + npc->ani_wait = 0; + npc->damage = 5; + } + else + { + npc->act_no = 0; + npc->ani_wait = 0; + } + } + break; + + case 2: // Charge + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + + if (++npc->count1 > 200) + { + npc->act_no = 0; + npc->damage = 1; + } + + if (++npc->ani_wait > 5) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + { + npc->ani_no = 5; + // These three lines are missing in the Linux port, because it's based on v1.0.0.4: + // https://www.cavestory.org/forums/threads/version-1-0-0-5-really-different-than-1-0-0-6.102/#post-3231 + PlaySoundObject(26, SOUND_MODE_PLAY); + SetNpChar(4, npc->x, npc->y + (3 * 0x200), 0, 0, 0, NULL, 0x100); + SetQuake(8); + } + break; + } + + // Gravity + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + // Move + npc->x += npc->xm; + npc->y += npc->ym; + + // Set framerect + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Dead enemy (to make sure the damage-value doesn't teleport to a newly-loaded NPC) +void ActNpc003(NPCHAR *npc) +{ + if (++npc->count1 > 100) + npc->cond = 0; + + RECT rect = {0, 0, 0, 0}; + npc->rect = rect; +} + +// Smoke +void ActNpc004(NPCHAR *npc) +{ + RECT rcLeft[8] = { + { 16, 0, 17, 1}, + { 16, 0, 32, 16}, + { 32, 0, 48, 16}, + { 48, 0, 64, 16}, + { 64, 0, 80, 16}, + { 80, 0, 96, 16}, + { 96, 0, 112, 16}, + {112, 0, 128, 16}, + }; + + RECT rcUp[8] = { + {16, 0, 17, 1}, + {80, 48, 96, 64}, + { 0, 128, 16, 144}, + {16, 128, 32, 144}, + {32, 128, 48, 144}, + {48, 128, 64, 144}, + {64, 128, 80, 144}, + {80, 128, 96, 144}, + }; + + unsigned char deg; + + if (npc->act_no == 0) + { + // Move in random direction at random speed + if (npc->direct == 0 || npc->direct == 1) + { + deg = Random(0, 0xFF); + npc->xm = GetCos(deg) * Random(0x200, 0x5FF) / 0x200; + npc->ym = GetSin(deg) * Random(0x200, 0x5FF) / 0x200; + } + + // Set state + npc->ani_no = Random(0, 4); + npc->ani_wait = Random(0, 3); + npc->act_no = 1; + } + else + { + // Slight drag + npc->xm = (npc->xm * 20) / 21; + npc->ym = (npc->ym * 20) / 21; + + // Move + npc->x += npc->xm; + npc->y += npc->ym; + } + + // Animate + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + // Set framerect + if (npc->ani_no > 7) + { + // Destroy if over + npc->cond = 0; + } + else + { + if (npc->direct == 1) + npc->rect = rcUp[npc->ani_no]; + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + if (npc->direct == 2) + npc->rect = rcLeft[npc->ani_no]; + } +} + +// Critter (Green, Egg Corridor) +void ActNpc005(NPCHAR *npc) +{ + RECT rcLeft[3] = { + { 0, 48, 16, 64}, + {16, 48, 32, 64}, + {32, 48, 48, 64}, + }; + + RECT rcRight[3] = { + { 0, 64, 16, 80}, + {16, 64, 32, 80}, + {32, 64, 48, 80}, + }; + + switch (npc->act_no) + { + case 0: // Initialize + npc->y += 3 * 0x200; + npc->act_no = 1; + // Fallthrough + case 1: // Waiting + // Look at player + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + // Open eyes near player + if (npc->act_wait >= 8 && npc->x - (112 * 0x200) < gMC.x && npc->x + (112 * 0x200) > gMC.x && npc->y - (80 * 0x200) < gMC.y && npc->y + (80 * 0x200) > gMC.y) + { + npc->ani_no = 1; + } + else + { + if (npc->act_wait < 8) + ++npc->act_wait; + + npc->ani_no = 0; + } + + // Jump if attacked + if (npc->shock) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + // Jump if player is nearby + if (npc->act_wait >= 8 && npc->x - (48 * 0x200) < gMC.x && npc->x + (48 * 0x200) > gMC.x && npc->y - (80 * 0x200) < gMC.y && npc->y + (48 * 0x200) > gMC.y) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + break; + + case 2: // Going to jump + if (++npc->act_wait > 8) + { + // Set jump state + npc->act_no = 3; + npc->ani_no = 2; + + // Jump + npc->ym = -0x5FF; + PlaySoundObject(30, SOUND_MODE_PLAY); + + // Jump in facing direction + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + } + + break; + + case 3: // Jumping + // Land + if (npc->flag & 8) + { + npc->xm = 0; + npc->act_wait = 0; + npc->ani_no = 0; + npc->act_no = 1; + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + break; + } + + // Gravity + npc->ym += 64; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + // Move + npc->x += npc->xm; + npc->y += npc->ym; + + // Set framerect + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Beetle (Goes left and right, Egg Corridor) +void ActNpc006(NPCHAR *npc) +{ + RECT rcLeft[5] = { + { 0, 80, 16, 96}, + {16, 80, 32, 96}, + {32, 80, 48, 96}, + {48, 80, 64, 96}, + {64, 80, 80, 96}, + }; + + RECT rcRight[5] = { + { 0, 96, 16, 112}, + {16, 96, 32, 112}, + {32, 96, 48, 112}, + {48, 96, 64, 112}, + {64, 96, 80, 112}, + }; + + switch (npc->act_no) + { + case 0: // Initialize + npc->act_no = 1; + + if (npc->direct == 0) + npc->act_no = 1; + else + npc->act_no = 3; + break; + + case 1: + // Accelerate to the left + npc->xm -= 0x10; + if (npc->xm < -0x400) + npc->xm = -0x400; + + // Move + if (npc->shock) + npc->x += npc->xm / 2; + else + npc->x += npc->xm; + + // Animate + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 1; + + // Stop when hitting a wall + if (npc->flag & 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 0; + npc->xm = 0; + npc->direct = gMirrorMode? 0:2; + } + break; + + case 2: + // Wait 60 frames then move to the right + if (++npc->act_wait > 60) + { + npc->act_no = 3; + npc->ani_wait = 0; + npc->ani_no = 1; + } + break; + + case 3: + // Accelerate to the right + npc->xm += 0x10; + if (npc->xm > 0x400) + npc->xm = 0x400; + + // Move + if (npc->shock) + npc->x += npc->xm / 2; + else + npc->x += npc->xm; + + // Animate + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 1; + + // Stop when hitting a wall + if (npc->flag & 4) + { + npc->act_no = 4; + npc->act_wait = 0; + npc->ani_no = 0; + npc->xm = 0; + npc->direct = gMirrorMode? 2:0; + } + break; + + case 4: + // Wait 60 frames then move to the left + if (++npc->act_wait > 60) + { + npc->act_no = 1; + npc->ani_wait = 0; + npc->ani_no = 1; + } + break; + } + + // Set framerect + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Basil +void ActNpc007(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {256, 64, 288, 80}, + {256, 80, 288, 96}, + {256, 96, 288, 112}, + }; + + RECT rcRight[3] = { + {288, 64, 320, 80}, + {288, 80, 320, 96}, + {288, 96, 320, 112}, + }; + + switch (npc->act_no) + { + case 0: + npc->x = gMC.x; // Spawn beneath player + + if (npc->direct == 0) + npc->act_no = 1; + else + npc->act_no = 2; + + break; + + case 1: // Going left + npc->xm -= 0x40; + + // Turn around if far enough away from the player + if (npc->x < gMC.x - (192 * 0x200)) + npc->act_no = 2; + + // Turn around if touching a wall + if (npc->flag & 1) + { + npc->xm = 0; + npc->act_no = 2; + } + + break; + + case 2: // Going right + npc->xm += 0x40; + + // Turn around if far enough away from the player + if (npc->x > gMC.x + (192 * 0x200)) + npc->act_no = 1; + + // Turn around if touching a wall + if (npc->flag & 4) + { + npc->xm = 0; + npc->act_no = 1; + } + + break; + } + + // Face direction Bazil is moving + if (npc->xm < 0) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + // Cap speed + if (npc->xm > 0x5FF) + npc->xm = 0x5FF; + if (npc->xm < -0x5FF) + npc->xm = -0x5FF; + + // Apply momentum + npc->x += npc->xm; + + // Increment animation + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + // Loop animation + if (npc->ani_no > 2) + npc->ani_no = 0; + + // Update sprite + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Beetle (Follows you, Egg Corridor) +void ActNpc008(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {80, 80, 96, 96}, + {96, 80, 112, 96}, + }; + + RECT rcRight[2] = { + {80, 96, 96, 112}, + {96, 96, 112, 112}, + }; + + switch (npc->act_no) + { + case 0: + if (gMC.x < npc->x + (16 * 0x200) && gMC.x > npc->x - (16 * 0x200)) + { + npc->bits |= NPC_SHOOTABLE; + npc->ym = -0x100; + npc->tgt_y = npc->y; + npc->act_no = 1; + npc->damage = 2; + + if (npc->direct == 0) + { + npc->x = gMC.x + (256 * 0x200); + npc->xm = -0x2FF; + } + else + { + npc->x = gMC.x - (256 * 0x200); + npc->xm = 0x2FF; + } + } + else + { + npc->bits &= ~NPC_SHOOTABLE; + npc->rect.right = 0; + npc->damage = 0; + npc->xm = 0; + npc->ym = 0; + return; + } + + break; + + case 1: + if (npc->x > gMC.x) + { + npc->direct = gMirrorMode? 2:0; + npc->xm -= 0x10; + } + else + { + npc->direct = gMirrorMode? 0:2; + npc->xm += 0x10; + } + + if (npc->xm > 0x2FF) + npc->xm = 0x2FF; + if (npc->xm < -0x2FF) + npc->xm = -0x2FF; + + if (npc->y < npc->tgt_y) + npc->ym += 8; + else + npc->ym -= 8; + + if (npc->ym > 0x100) + npc->ym = 0x100; + if (npc->ym < -0x100) + npc->ym = -0x100; + + if (npc->shock) + { + npc->x += npc->xm / 2; + npc->y += npc->ym / 2; + } + else + { + npc->x += npc->xm; + npc->y += npc->ym; + } + + break; + } + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Balrog (drop-in) +void ActNpc009(NPCHAR *npc) +{ + int i; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 2; + // Fallthrough + case 1: + npc->ym += 0x20; + + if (npc->count1 < 40) + { + ++npc->count1; + } + else + { + npc->bits &= ~NPC_IGNORE_SOLIDITY; + npc->bits |= NPC_SOLID_SOFT; + } + + if (npc->flag & 8) + { + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + npc->act_no = 2; + npc->ani_no = 1; + npc->act_wait = 0; + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(30); + } + + break; + + case 2: + if (++npc->act_wait > 16) + { + npc->act_no = 3; + npc->ani_no = 0; + npc->ani_wait = 0; + } + + break; + } + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[3] = { + {0, 0, 40, 24}, + {80, 0, 120, 24}, + {120, 0, 160, 24}, + }; + + RECT rect_right[3] = { + {0, 24, 40, 48}, + {80, 24, 120, 48}, + {120, 24, 160, 48}, + }; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Balrog (shooting) (super-secret unused version from the prototype) +void ActNpc010(NPCHAR *npc) +{ + unsigned char deg; + int xm, ym; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (++npc->act_wait > 12) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->count1 = 3; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 16) + { + --npc->count1; + npc->act_wait = 0; + + deg = GetArktan(npc->x - gMC.x, npc->y + (4 * 0x200) - gMC.y); + deg += (unsigned char)Random(-0x10, 0x10); + ym = GetSin(deg); + xm = GetCos(deg); + SetNpChar(11, npc->x, npc->y + (4 * 0x200), xm, ym, 0, NULL, 0x100); + + PlaySoundObject(39, SOUND_MODE_PLAY); + + if (npc->count1 == 0) + { + npc->act_no = 3; + npc->act_wait = 0; + } + } + + break; + + case 3: + if (++npc->act_wait > 3) + { + npc->act_no = 4; + npc->act_wait = 0; + npc->xm = (gMC.x - npc->x) / 100; + npc->ym = -0x600; + npc->ani_no = 3; + } + + break; + + case 4: + if (npc->flag & 5) + npc->xm = 0; + + if (npc->y + (16 * 0x200) < gMC.y) + npc->damage = 5; + else + npc->damage = 0; + + if (npc->flag & 8) + { + npc->act_no = 5; + npc->act_wait = 0; + npc->ani_no = 2; + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(30); + npc->damage = 0; + } + + break; + + case 5: + npc->xm = 0; + + if (++npc->act_wait > 3) + { + npc->act_no = 1; + npc->act_wait = 0; + } + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[4] = { + {0, 0, 40, 24}, + {40, 0, 80, 24}, + {80, 0, 120, 24}, + {120, 0, 160, 24}, + }; + + RECT rect_right[4] = { + {0, 24, 40, 48}, + {40, 24, 80, 48}, + {80, 24, 120, 48}, + {120, 24, 160, 48}, + }; + + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Proto-Balrog's projectile +void ActNpc011(NPCHAR *npc) +{ + if (npc->flag & 0xFF) + { + npc->cond = 0; + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rect_left[3] = { + {208, 104, 224, 120}, + {224, 104, 240, 120}, + {240, 104, 256, 120}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 2) + npc->ani_no = 0; + } + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->count1 > 150) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } +} + +// Balrog (cutscene) +void ActNpc012(NPCHAR *npc) +{ + int i; + int x, y; + + switch (npc->act_no) + { + case 0: + if (npc->direct == 4) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + npc->act_no = 1; + npc->ani_no = 0; + // Fallthrough + case 1: + if (Random(0, 100) == 0) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 16) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + if (npc->direct == 4) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + npc->act_no = 11; + npc->ani_no = 2; + npc->act_wait = 0; + npc->tgt_x = 0; + // Fallthrough + case 11: + if (++npc->act_wait > 30) + { + npc->act_no = 12; + npc->act_wait = 0; + npc->ani_no = 3; + npc->ym = -0x800; + npc->bits |= NPC_IGNORE_SOLIDITY; + } + + break; + + case 12: + if (npc->flag & 5) + npc->xm = 0; + + if (npc->y < 0) + { + npc->code_char = 0; + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(30); + } + + break; + + case 20: + if (npc->direct == 4) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + npc->act_no = 21; + npc->ani_no = 5; + npc->act_wait = 0; + npc->count1 = 0; + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + PlaySoundObject(72, SOUND_MODE_PLAY); + // Fallthrough + case 21: + npc->tgt_x = 1; + + if (npc->flag & 8) + ++npc->act_wait; + + if (++npc->count1 / 2 % 2) + npc->x += 1 * 0x200; + else + npc->x -= 1 * 0x200; + + if (npc->act_wait > 100) + { + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_no = 2; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + break; + + case 30: + npc->ani_no = 4; + + if (++npc->act_wait > 100) + { + npc->act_no = 0; + npc->ani_no = 0; + } + + break; + + case 40: + if (npc->direct == 4) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + npc->act_no = 41; + npc->act_wait = 0; + npc->ani_no = 5; + // Fallthrough + case 41: + if (++npc->ani_wait / 2 % 2) + npc->ani_no = 5; + else + npc->ani_no = 6; + + break; + + case 42: + if (npc->direct == 4) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + npc->act_no = 43; + npc->act_wait = 0; + npc->ani_no = 6; + // Fallthrough + case 43: + if (++npc->ani_wait / 2 % 2) + npc->ani_no = 7; + else + npc->ani_no = 6; + + break; + + case 50: + npc->ani_no = 8; + npc->xm = 0; + break; + + case 60: + npc->act_no = 61; + npc->ani_no = 9; + npc->ani_wait = 0; + // Fallthrough + case 61: + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + + if (++npc->ani_no == 10 || npc->ani_no == 11) + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + if (npc->ani_no > 12) + npc->ani_no = 9; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + break; + + case 70: + npc->act_no = 71; + npc->act_wait = 64; + PlaySoundObject(29, SOUND_MODE_PLAY); + npc->ani_no = 13; + // Fallthrough + case 71: + if (--npc->act_wait == 0) + npc->cond = 0; + + break; + + case 80: + npc->count1 = 0; + npc->act_no = 81; + // Fallthrough + case 81: + if (++npc->count1 / 2 % 2) + npc->x += 1 * 0x200; + else + npc->x -= 1 * 0x200; + + npc->ani_no = 5; + npc->xm = 0; + npc->ym += 0x20; + + break; + + case 100: + npc->act_no = 101; + npc->act_wait = 0; + npc->ani_no = 2; + // Fallthrough + case 101: + if (++npc->act_wait > 20) + { + npc->act_no = 102; + npc->act_wait = 0; + npc->ani_no = 3; + npc->ym = -0x800; + npc->bits |= NPC_IGNORE_SOLIDITY; + DeleteNpCharCode(150, FALSE); + DeleteNpCharCode(117, FALSE); + SetNpChar(355, 0, 0, 0, 0, 0, npc, 0x100); + SetNpChar(355, 0, 0, 0, 0, 1, npc, 0x100); + } + + break; + + case 102: + { + x = npc->x / 0x200 / 0x10; + y = npc->y / 0x200 / 0x10; + + if (y >= 0 && y < 35 && ChangeMapParts(x, y, 0)) + { + ChangeMapParts(x - 1, y, 0); + ChangeMapParts(x + 1, y, 0); + PlaySoundObject(44, SOUND_MODE_PLAY); + SetQuake2(10); + } + + if (npc->y < -32 * 0x200) + { + npc->code_char = 0; + SetQuake(30); + } + + break; + } + } + + if (npc->tgt_x && Random(0, 10) == 0) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[14] = { + {0, 0, 40, 24}, + {160, 0, 200, 24}, + {80, 0, 120, 24}, + {120, 0, 160, 24}, + {240, 0, 280, 24}, + {200, 0, 240, 24}, + {280, 0, 320, 24}, + {0, 0, 0, 0}, + {80, 48, 120, 72}, + {0, 48, 40, 72}, + {0, 0, 40, 24}, + {40, 48, 80, 72}, + {0, 0, 40, 24}, + {280, 0, 320, 24}, + }; + + RECT rect_right[14] = { + {0, 24, 40, 48}, + {160, 24, 200, 48}, + {80, 24, 120, 48}, + {120, 24, 160, 48}, + {240, 24, 280, 48}, + {200, 24, 240, 48}, + {280, 24, 320, 48}, + {0, 0, 0, 0}, + {80, 72, 120, 96}, + {0, 72, 40, 96}, + {0, 24, 40, 48}, + {40, 72, 80, 96}, + {0, 24, 40, 48}, + {280, 24, 320, 48}, + }; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; + + if (npc->act_no == 71) + { + npc->rect.bottom = npc->rect.top + npc->act_wait / 2; + + if (npc->act_wait % 2) + ++npc->rect.left; + } +} + +// Forcefield +void ActNpc013(NPCHAR *npc) +{ + RECT rect[4] = { + {128, 0, 144, 16}, + {144, 0, 160, 16}, + {160, 0, 176, 16}, + {176, 0, 192, 16}, + }; + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + npc->rect = rect[npc->ani_no]; +} + +// Santa's Key +void ActNpc014(NPCHAR *npc) +{ + RECT rect[3] = { + {192, 0, 208, 16}, + {208, 0, 224, 16}, + {224, 0, 240, 16}, + }; + + int i; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 2) + { + npc->ym = -0x200; + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + } + + break; + } + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + npc->rect = rect[npc->ani_no]; +} + +// Chest (closed) +void ActNpc015(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {240, 0, 256, 16}, + {256, 0, 272, 16}, + {272, 0, 288, 16}, + }; + + int i; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->bits |= NPC_INTERACTABLE; + + if (npc->direct == 2) + { + npc->ym = -0x200; + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + } + + // Fallthrough + case 1: + npc->ani_no = 0; + + if (Random(0, 30) == 0) + npc->act_no = 2; + + break; + + case 2: + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + { + npc->ani_no = 0; + npc->act_no = 1; + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + npc->rect = rcLeft[npc->ani_no]; +} + +// Save point +void ActNpc016(NPCHAR *npc) +{ + RECT rect[8] = { + {96, 16, 112, 32}, + {112, 16, 128, 32}, + {128, 16, 144, 32}, + {144, 16, 160, 32}, + {160, 16, 176, 32}, + {176, 16, 192, 32}, + {192, 16, 208, 32}, + {208, 16, 224, 32}, + }; + + int i; + + switch (npc->act_no) + { + case 0: + npc->bits |= NPC_INTERACTABLE; + npc->act_no = 1; + + if (npc->direct == 2) + { + npc->bits &= ~NPC_INTERACTABLE; + npc->ym = -0x200; + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + } + + // Fallthrough + case 1: + if (npc->flag & 8) + npc->bits |= NPC_INTERACTABLE; + + break; + } + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 7) + npc->ani_no = 0; + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + npc->rect = rect[npc->ani_no]; +} + +// Health refill +void ActNpc017(NPCHAR *npc) +{ + RECT rect[2] = { + {288, 0, 304, 16}, + {304, 0, 320, 16}, + }; + + int a; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 2) + { + npc->ym = -0x200; + + for (a = 0; a < 4; ++a) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + } + + // Fallthrough + case 1: + a = Random(0, 30); + + if (a < 10) + npc->act_no = 2; + else if (a < 25) + npc->act_no = 3; + else + npc->act_no = 4; + + npc->act_wait = Random(0x10, 0x40); + npc->ani_wait = 0; + break; + + case 2: + npc->rect = rect[0]; + + if (--npc->act_wait == 0) + npc->act_no = 1; + + break; + + case 3: + if (++npc->ani_wait % 2) + npc->rect = rect[0]; + else + npc->rect = rect[1]; + + if (--npc->act_wait == 0) + npc->act_no = 1; + + break; + + case 4: + npc->rect = rect[1]; + + if (--npc->act_wait == 0) + npc->act_no = 1; + + break; + } + + npc->ym += 0x40; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; +} + +// Door +void ActNpc018(NPCHAR *npc) +{ + int i; + + RECT rect[2] = { + {224, 16, 240, 40}, + {192, 112, 208, 136}, + }; + + switch (npc->act_no) + { + case 0: + if (npc->direct == 0) + npc->rect = rect[0]; + else + npc->rect = rect[1]; + + break; + + case 1: + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x, npc->y, Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + npc->act_no = 0; + npc->rect = rect[0]; + break; + } +} + +// Balrog (burst) +void ActNpc019(NPCHAR *npc) +{ + int i; + + switch (npc->act_no) + { + case 0: + for (i = 0; i < 0x10; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + npc->y += 10 * 0x200; + npc->act_no = 1; + npc->ani_no = 3; + npc->ym = -0x100; + PlaySoundObject(12, SOUND_MODE_PLAY); + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(30); + // Fallthrough + case 1: + npc->ym += 0x10; + + if (npc->ym > 0 && npc->flag & 8) + { + npc->act_no = 2; + npc->ani_no = 2; + npc->act_wait = 0; + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(30); + } + + break; + + case 2: + if (++npc->act_wait > 0x10) + { + npc->act_no = 3; + npc->ani_no = 0; + npc->ani_wait = 0; + } + + break; + + case 3: + if (Random(0, 100) == 0) + { + npc->act_no = 4; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 4: + if (++npc->act_wait > 0x10) + { + npc->act_no = 3; + npc->ani_no = 0; + } + + break; + } + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[4] = { + {0, 0, 40, 24}, + {160, 0, 200, 24}, + {80, 0, 120, 24}, + {120, 0, 160, 24}, + }; + + RECT rect_right[4] = { + {0, 24, 40, 48}, + {160, 24, 200, 48}, + {80, 24, 120, 48}, + {120, 24, 160, 48}, + }; + + if (npc->direct == 0) + npc->rect = gMirrorMode? rect_right[npc->ani_no]:rect_left[npc->ani_no]; + else + npc->rect = gMirrorMode? rect_left[npc->ani_no]:rect_right[npc->ani_no]; +} diff --git a/src/NpcAct020.cpp b/src/NpcAct020.cpp new file mode 100644 index 0000000..ef6dd26 --- /dev/null +++ b/src/NpcAct020.cpp @@ -0,0 +1,1363 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Caret.h" +#include "CommonDefines.h" +#include "Game.h" +#include "Frame.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" +#include "NpcHit.h" + +// Computer +void ActNpc020(NPCHAR *npc) +{ + RECT rcLeft = {288, 16, 320, 40}; + + RECT rcRight[3] = { + {288, 40, 320, 64}, + {288, 40, 320, 64}, + {288, 64, 320, 88}, + }; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (npc->direct == 0) + npc->rect = rcLeft; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Chest (open) +void ActNpc021(NPCHAR *npc) +{ + if (npc->act_no == 0) + { + npc->act_no = 1; + + if (npc->direct == 2) + npc->y += 16 * 0x200; + } + + RECT rect = {224, 40, 240, 48}; + + npc->rect = rect; +} + +// Teleporter +void ActNpc022(NPCHAR *npc) +{ + RECT rect[2] = { + {240, 16, 264, 48}, + {248, 152, 272, 184}, + }; + + switch (npc->act_no) + { + case 0: + npc->ani_no = 0; + break; + + case 1: + if (++npc->ani_no > 1) + npc->ani_no = 0; + + break; + } + + npc->rect = rect[npc->ani_no]; +} + +// Teleporter lights +void ActNpc023(NPCHAR *npc) +{ + RECT rect[8] = { + {264, 16, 288, 20}, + {264, 20, 288, 24}, + {264, 24, 288, 28}, + {264, 28, 288, 32}, + {264, 32, 288, 36}, + {264, 36, 288, 40}, + {264, 40, 288, 44}, + {264, 44, 288, 48}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 7) + npc->ani_no = 0; + + npc->rect = rect[npc->ani_no]; +} + +// Power Critter +void ActNpc024(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {0, 0, 24, 24}, + {24, 0, 48, 24}, + {48, 0, 72, 24}, + {72, 0, 96, 24}, + {96, 0, 120, 24}, + {120, 0, 144, 24}, + }; + + RECT rcRight[6] = { + {0, 24, 24, 48}, + {24, 24, 48, 48}, + {48, 24, 72, 48}, + {72, 24, 96, 48}, + {96, 24, 120, 48}, + {120, 24, 144, 48}, + }; + + switch (npc->act_no) + { + case 0: + npc->y += 3 * 0x200; + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->act_wait >= 8 && npc->x - (128 * 0x200) < gMC.x && npc->x + (128 * 0x200) > gMC.x && npc->y - (128 * 0x200) < gMC.y && npc->y + (48 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->ani_no = 1; + } + else + { + if (npc->act_wait < 8) + ++npc->act_wait; + + npc->ani_no = 0; + } + + if (npc->shock) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + if (npc->act_wait >= 8 && npc->x - (96 * 0x200) < gMC.x && npc->x + (96 * 0x200) > gMC.x && npc->y - (96 * 0x200) < gMC.y && npc->y + (48 * 0x200) > gMC.y) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 3; + npc->ani_no = 2; + npc->ym = -0x5FF; + PlaySoundObject(108, SOUND_MODE_PLAY); + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->direct == 0) + npc->xm = gMirrorMode? 0x100: -0x100; + else + npc->xm = gMirrorMode? -0x100: 0x100; + } + + break; + + case 3: + if (npc->ym > 0x200) + { + npc->tgt_y = npc->y; + npc->act_no = 4; + npc->ani_no = 3; + npc->act_wait = 0; + npc->act_wait = 0; // Pixel duplicated this line + } + + break; + + case 4: + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + ++npc->act_wait; + + if (npc->flag & 7 || npc->act_wait > 100) + { + npc->damage = 12; + npc->act_no = 5; + npc->ani_no = 2; + npc->xm /= 2; + break; + } + + if (npc->act_wait % 4 == 1) + PlaySoundObject(110, SOUND_MODE_PLAY); + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 3; + + break; + + case 5: + if (npc->flag & 8) + { + npc->damage = 2; + npc->xm = 0; + npc->act_wait = 0; + npc->ani_no = 0; + npc->act_no = 1; + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(30); + } + + break; + } + + if (npc->act_no != 4) + { + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + } + else + { + if (npc->x < gMC.x) + npc->xm += 0x20; + else + npc->xm -= 0x20; + + if (npc->y > npc->tgt_y) + npc->ym -= 0x10; + else + npc->ym += 0x10; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Egg Corridor lift +void ActNpc025(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {256, 64, 288, 80}, + {256, 80, 288, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->x += 8 * 0x200; + // Fallthrough + case 1: + if (++npc->act_wait > 150) + { + npc->act_wait = 0; + ++npc->act_no; + } + + break; + + case 2: // Identical to case 4 + if (++npc->act_wait <= 0x40) + { + npc->y -= 1 * 0x200; + } + else + { + npc->act_wait = 0; + ++npc->act_no; + } + + break; + + case 3: + if (++npc->act_wait > 150) + { + npc->act_wait = 0; + ++npc->act_no; + } + + break; + + case 4: // Identical to case 2 + if (++npc->act_wait <= 0x40) + { + npc->y -= 1 * 0x200; + } + else + { + npc->act_wait = 0; + ++npc->act_no; + } + + break; + + case 5: + if (++npc->act_wait > 150) + { + npc->act_wait = 0; + ++npc->act_no; + } + + break; + + case 6: + if (++npc->act_wait <= 0x40) + { + npc->y += 1 * 0x200; + } + else + { + npc->act_wait = 0; + ++npc->act_no; + } + + break; + + case 7: + if (++npc->act_wait > 150) + { + npc->act_wait = 0; + ++npc->act_no; + } + + break; + + case 8: + if (++npc->act_wait <= 0x40) + { + npc->y += 1 * 0x200; + } + else + { + npc->act_wait = 0; + npc->act_no = 1; + } + + break; + } + + switch (npc->act_no) + { + case 2: + case 4: + case 6: + case 8: + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + } + + npc->rect = rcLeft[npc->ani_no]; +} + +// Bat (Grasstown, flying) +void ActNpc026(NPCHAR *npc) +{ + unsigned char deg; + + switch (npc->act_no) + { + case 0: + deg = Random(0, 0xFF); + npc->xm = GetCos(deg); + deg += 0x40; + npc->tgt_x = npc->x + (GetCos(deg) * 8); + + deg = Random(0, 0xFF); + npc->ym = GetSin(deg); + deg += 0x40; + npc->tgt_y = npc->y + (GetSin(deg) * 8); + + npc->act_no = 1; + npc->count1 = 120; + // Fallthrough + case 1: + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->tgt_x < npc->x) + npc->xm -= 0x10; + if (npc->tgt_x > npc->x) + npc->xm += 0x10; + + if (npc->tgt_y < npc->y) + npc->ym -= 0x10; + if (npc->tgt_y > npc->y) + npc->ym += 0x10; + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->count1 < 120) + { + ++npc->count1; + break; + } + + if (npc->x - (8 * 0x200) < gMC.x && npc->x + (8 * 0x200) > gMC.x && npc->y < gMC.y && npc->y + (96 * 0x200) > gMC.y) + { + npc->xm /= 2; + npc->ym = 0; + npc->act_no = 3; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + } + + break; + + case 3: + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + if (npc->flag & 8) + { + npc->ym = 0; + npc->xm *= 2; + npc->count1 = 0; + npc->act_no = 1; + npc->bits |= NPC_IGNORE_SOLIDITY; + } + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[4] = { + {32, 80, 48, 96}, + {48, 80, 64, 96}, + {64, 80, 80, 96}, + {80, 80, 96, 96}, + }; + + RECT rect_right[4] = { + {32, 96, 48, 112}, + {48, 96, 64, 112}, + {64, 96, 80, 112}, + {80, 96, 96, 112}, + }; + + if (npc->act_no == 3) + { + npc->ani_no = 3; + } + else + { + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + } + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Death trap +void ActNpc027(NPCHAR *npc) +{ + RECT rcLeft[1] = { + {96, 64, 128, 88} + }; + + npc->rect = rcLeft[npc->ani_no]; + + npc->direct == 0; +} + +// Flying Critter (Grasstown) +void ActNpc028(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {0, 48, 16, 64}, + {16, 48, 32, 64}, + {32, 48, 48, 64}, + {48, 48, 64, 64}, + {64, 48, 80, 64}, + {80, 48, 96, 64}, + }; + + RECT rcRight[6] = { + {0, 64, 16, 80}, + {16, 64, 32, 80}, + {32, 64, 48, 80}, + {48, 64, 64, 80}, + {64, 64, 80, 80}, + {80, 64, 96, 80}, + }; + + switch (npc->act_no) + { + case 0: + npc->y += 3 * 0x200; + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->act_wait >= 8 && npc->x - (128 * 0x200) < gMC.x && npc->x + (128 * 0x200) > gMC.x && npc->y - (128 * 0x200) < gMC.y && npc->y + (48 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->ani_no = 1; + } + else + { + if (npc->act_wait < 8) + ++npc->act_wait; + + npc->ani_no = 0; + } + + if (npc->shock) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + if (npc->act_wait >= 8 && npc->x - (96 * 0x200) < gMC.x && npc->x + (96 * 0x200) > gMC.x && npc->y - (96 * 0x200) < gMC.y && npc->y + (48 * 0x200) > gMC.y) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 3; + npc->ani_no = 2; + npc->ym = -0x4CC; + PlaySoundObject(30, SOUND_MODE_PLAY); + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->direct == 0) + npc->xm = gMirrorMode? 0x100:-0x100; + else + npc->xm = gMirrorMode? -0x100:0x100; + } + + break; + + case 3: + if (npc->ym > 0x100) + { + npc->tgt_y = npc->y; + npc->act_no = 4; + npc->ani_no = 3; + npc->act_wait = 0; + npc->act_wait = 0; // Pixel duplicated this line + } + + break; + + case 4: + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + ++npc->act_wait; + + if (npc->flag & 7 || npc->act_wait > 100) + { + npc->damage = 3; + npc->act_no = 5; + npc->ani_no = 2; + npc->xm /= 2; + break; + } + + if (npc->act_wait % 4 == 1) + PlaySoundObject(109, SOUND_MODE_PLAY); + + if (npc->flag & 8) + npc->ym = -0x200; + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 3; + + break; + + case 5: + if (npc->flag & 8) + { + npc->damage = 2; + npc->xm = 0; + npc->act_wait = 0; + npc->ani_no = 0; + npc->act_no = 1; + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + break; + } + + if (npc->act_no != 4) + { + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + } + else + { + if (npc->x < gMC.x) + npc->xm += 0x20; + else + npc->xm -= 0x20; + + if (npc->y > npc->tgt_y) + npc->ym -= 0x10; + else + npc->ym += 0x10; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Cthulhu +void ActNpc029(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {0, 192, 16, 216}, + {16, 192, 32, 216}, + }; + + RECT rcRight[2] = { + {0, 216, 16, 240}, + {16, 216, 32, 240}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (npc->x - (48 * 0x200) < gMC.x && npc->x + (48 * 0x200) > gMC.x && npc->y - (48 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + npc->ani_no = 1; + else + npc->ani_no = 0; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Gunsmith +void ActNpc030(NPCHAR *npc) +{ + RECT rc[3] = { + {48, 0, 64, 16}, + {48, 16, 64, 32}, + {0, 32, 16, 48}, + }; + + if (npc->direct == 0) + { + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + } + else + { + if (npc->act_no == 0) + { + npc->act_no = 1; + npc->y += 16 * 0x200; + npc->ani_no = 2; + } + + if (++npc->act_wait > 100) + { + npc->act_wait = 0; + SetCaret(npc->x, npc->y - (2 * 0x200), CARET_ZZZ, DIR_LEFT); + } + } + + npc->rect = rc[npc->ani_no]; +} + +// Bat (Grasstown, hanging) +void ActNpc031(NPCHAR *npc) +{ + RECT rcLeft[5] = { + {0, 80, 16, 96}, + {16, 80, 32, 96}, + {32, 80, 48, 96}, + {48, 80, 64, 96}, + {64, 80, 80, 96}, + }; + + RECT rcRight[5] = { + {0, 96, 16, 112}, + {16, 96, 32, 112}, + {32, 96, 48, 112}, + {48, 96, 64, 112}, + {64, 96, 80, 112}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (8 * 0x200) < gMC.x && npc->x + (8 * 0x200) > gMC.x && npc->y - (8 * 0x200) < gMC.y && npc->y + (96 * 0x200) > gMC.y) + { + npc->ani_no = 0; + npc->act_no = 3; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->ani_no = 0; + + if (npc->shock || npc->x - (20 * 0x200) > gMC.x || npc->x + (20 * 0x200) < gMC.x) + { + npc->ani_no = 1; + npc->ani_wait = 0; + npc->act_no = 4; + npc->act_wait = 0; + } + + break; + + case 4: + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + if (++npc->act_wait < 20 && !(npc->flag & 8)) + break; + + if (npc->flag & 8 || npc->y > gMC.y - (16 * 0x200)) + { + npc->ani_wait = 0; + npc->ani_no = 2; + npc->act_no = 5; + npc->tgt_y = npc->y; + + if (npc->flag & 8) + npc->ym = -0x200; + } + + break; + + case 5: + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 2; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (gMC.x < npc->x) + npc->xm -= 0x10; + if (gMC.x > npc->x) + npc->xm += 0x10; + + if (npc->tgt_y < npc->y) + npc->ym -= 0x10; + if (npc->tgt_y > npc->y) + npc->ym += 0x10; + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->flag & 8) + npc->ym = -0x200; + if (npc->flag & 2) + npc->ym = 0x200; + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Life capsule +void ActNpc032(NPCHAR *npc) +{ + RECT rect[2] = { + {32, 96, 48, 112}, + {48, 96, 64, 112}, + }; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + npc->rect = rect[npc->ani_no]; +} + +// Balrog bouncing projectile +void ActNpc033(NPCHAR *npc) +{ + if (npc->flag & 5) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } + else if (npc->flag & 8) + { + npc->ym = -0x400; + } + + npc->ym += 0x2A; + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rect_left[2] = { + {240, 64, 256, 80}, + {240, 80, 256, 96}, + }; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 1) + npc->ani_no = 0; + } + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->act_wait > 250) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } +} + +// Bed +void ActNpc034(NPCHAR *npc) +{ + RECT rcLeft = {192, 48, 224, 64}; + RECT rcRight = {192, 184, 224, 200}; + + if (npc->direct == 0) + npc->rect = rcLeft; + else + npc->rect = rcRight; +} + +// Mannan +void ActNpc035(NPCHAR *npc) +{ + if (npc->act_no < 3 && npc->life < 90) + { + PlaySoundObject(71, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8); + if (!gbNoExpDrops) + SetExpObjects(npc->x, npc->y, npc->exp); + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 2; + npc->bits &= ~NPC_SHOOTABLE; + npc->damage = 0; + } + + switch (npc->act_no) + { + case 0: + case 1: + if (npc->shock) + { + if (npc->direct == 0) + SetNpChar(103, npc->x - (8 * 0x200), npc->y + (8 * 0x200), 0, 0, npc->direct, NULL, 0x100); + else + SetNpChar(103, npc->x + (8 * 0x200), npc->y + (8 * 0x200), 0, 0, npc->direct, NULL, 0x100); + + npc->ani_no = 1; + npc->act_no = 2; + npc->act_wait = 0; + } + + break; + + case 2: + if (++npc->act_wait > 20) + { + npc->act_wait = 0; + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + if (++npc->act_wait == 50 || npc->act_wait == 60) + npc->ani_no = 3; + + if (npc->act_wait == 53 || npc->act_wait == 63) + npc->ani_no = 2; + + if (npc->act_wait > 100) + npc->act_no = 4; + + break; + } + + RECT rcLeft[4] = { + {96, 64, 120, 96}, + {120, 64, 144, 96}, + {144, 64, 168, 96}, + {168, 64, 192, 96}, + }; + + RECT rcRight[4] = { + {96, 96, 120, 128}, + {120, 96, 144, 128}, + {144, 96, 168, 128}, + {168, 96, 192, 128}, + }; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Balrog (hover) +void ActNpc036(NPCHAR *npc) +{ + int i; + unsigned char deg; + int xm, ym; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (++npc->act_wait > 12) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->count1 = 3; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 16) + { + --npc->count1; + npc->act_wait = 0; + + deg = GetArktan(npc->x - gMC.x, npc->y + (4 * 0x200) - gMC.y); + deg += (unsigned char)Random(-0x10, 0x10); + ym = GetSin(deg); + xm = GetCos(deg); + + SetNpChar(11, npc->x, npc->y + 0x800, xm, ym, 0, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + + if (npc->count1 == 0) + { + npc->act_no = 3; + npc->act_wait = 0; + } + } + + break; + + case 3: + if (++npc->act_wait > 3) + { + npc->act_no = 4; + npc->act_wait = 0; + npc->xm = (gMC.x - npc->x) / 100; + npc->ym = -0x600; + npc->ani_no = 3; + } + + break; + + case 4: + if (npc->ym > -0x200) + { + if (npc->life > 60) + { + npc->act_no = 5; + npc->ani_no = 4; + npc->ani_wait = 0; + npc->act_wait = 0; + npc->tgt_y = npc->y; + } + else + { + npc->act_no = 6; + } + } + + break; + + case 5: + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + { + npc->ani_no = 4; + PlaySoundObject(47, SOUND_MODE_PLAY); + } + + if (++npc->act_wait > 100) + { + npc->act_no = 6; + npc->ani_no = 3; + } + + if (npc->y < npc->tgt_y) + npc->ym += 0x40; + else + npc->ym -= 0x40; + + if (npc->ym < -0x200) + npc->ym = -0x200; + if (npc->ym > 0x200) + npc->ym = 0x200; + + break; + + case 6: + if (npc->y + (16 * 0x200) < gMC.y) + npc->damage = 10; + else + npc->damage = 0; + + if (npc->flag & 8) + { + npc->act_no = 7; + npc->act_wait = 0; + npc->ani_no = 2; + PlaySoundObject(26, SOUND_MODE_PLAY); + PlaySoundObject(25, SOUND_MODE_PLAY); + SetQuake(30); + npc->damage = 0; + + for (i = 0; i < 8; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + for (i = 0; i < 8; ++i) + SetNpChar(33, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-0x400, 0x400), Random(-0x400, 0), 0, NULL, 0x100); + } + + break; + + case 7: + npc->xm = 0; + + if (++npc->act_wait > 3) + { + npc->act_no = 1; + npc->act_wait = 0; + } + + break; + } + + if (npc->act_no != 5) + { + npc->ym += 0x200 / 10; + + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[6] = { + {0, 0, 40, 24}, + {40, 0, 80, 24}, + {80, 0, 120, 24}, + {120, 0, 160, 24}, + {160, 48, 200, 72}, + {200, 48, 240, 72}, + }; + + RECT rect_right[6] = { + {0, 24, 40, 48}, + {40, 24, 80, 48}, + {80, 24, 120, 48}, + {120, 24, 160, 48}, + {160, 72, 200, 96}, + {200, 72, 240, 96}, + }; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Signpost +void ActNpc037(NPCHAR *npc) +{ + RECT rect[2] = { + {192, 64, 208, 80}, + {208, 64, 224, 80}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + npc->rect = rect[npc->ani_no]; +} + +// Fireplace +void ActNpc038(NPCHAR *npc) +{ + RECT rect[4] = { + {128, 64, 144, 80}, + {144, 64, 160, 80}, + {160, 64, 176, 80}, + {176, 64, 192, 80}, + }; + + switch (npc->act_no) + { + case 0: + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + npc->rect = rect[npc->ani_no]; + break; + + case 10: + npc->act_no = 11; + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8); + // Fallthrough + case 11: + npc->rect.left = 0; + npc->rect.right = 0; + break; + } +} + +// Save sign +void ActNpc039(NPCHAR *npc) +{ + RECT rect[2] = { + {224, 64, 240, 80}, + {240, 64, 256, 80}, + }; + + if (npc->direct == 0) + npc->ani_no = 0; + else + npc->ani_no = 1; + + npc->rect = rect[npc->ani_no]; +} diff --git a/src/NpcAct040.cpp b/src/NpcAct040.cpp new file mode 100644 index 0000000..d8975b6 --- /dev/null +++ b/src/NpcAct040.cpp @@ -0,0 +1,2028 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Caret.h" +#include "CommonDefines.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +// Santa +void ActNpc040(NPCHAR *npc) +{ + RECT rcLeft[7] = { + {0, 32, 16, 48}, + {16, 32, 32, 48}, + {32, 32, 48, 48}, + {0, 32, 16, 48}, + {48, 32, 64, 48}, + {0, 32, 16, 48}, + {64, 32, 80, 48}, + }; + + RECT rcRight[7] = { + {0, 48, 16, 64}, + {16, 48, 32, 64}, + {32, 48, 48, 64}, + {0, 48, 16, 64}, + {48, 48, 64, 64}, + {0, 48, 16, 64}, + {64, 48, 80, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (32 * 0x200) < gMC.x && npc->x + (32 * 0x200) > gMC.x && npc->y - (32 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->act_no = 4; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + npc->ani_no++; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->x -= 1 * 0x200; + else + npc->x += 1 * 0x200; + + break; + + case 5: + npc->ani_no = 6; + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Busted Door +void ActNpc041(NPCHAR *npc) +{ + RECT rect = {0, 80, 48, 112}; + + if (npc->act_no == 0) + { + ++npc->act_no; + npc->y -= 1 * 0x10 * 0x200; // Move one tile up + } + + npc->rect = rect; +} + +// Sue +void ActNpc042(NPCHAR *npc) +{ + int n; + + RECT rcLeft[13] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + {32, 0, 48, 16}, + {0, 0, 16, 16}, + {48, 0, 64, 16}, + {0, 0, 16, 16}, + {64, 0, 80, 16}, + {80, 32, 96, 48}, + {96, 32, 112, 48}, + {128, 32, 144, 48}, + {0, 0, 16, 16}, + {112, 32, 128, 48}, + {160, 32, 176, 48}, + }; + + RECT rcRight[13] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {32, 16, 48, 32}, + {0, 16, 16, 32}, + {48, 16, 64, 32}, + {0, 16, 16, 32}, + {64, 16, 80, 32}, + {80, 48, 96, 64}, + {96, 48, 112, 64}, + {128, 48, 144, 64}, + {0, 16, 16, 32}, + {112, 48, 128, 64}, + {160, 48, 176, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->act_no = 4; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + break; + + case 5: + npc->ani_no = 6; + npc->xm = 0; + break; + + case 6: + PlaySoundObject(50, SOUND_MODE_PLAY); + npc->act_wait = 0; + npc->act_no = 7; + npc->ani_no = 7; + // Fallthrough + case 7: + if (++npc->act_wait > 10) + npc->act_no = 0; + + break; + + case 8: + PlaySoundObject(50, SOUND_MODE_PLAY); + npc->act_wait = 0; + npc->act_no = 9; + npc->ani_no = 7; + npc->ym = -0x200; + + if (npc->direct == 0) + npc->xm = 0x400; + else + npc->xm = -0x400; + + // Fallthrough + case 9: + if (++npc->act_wait > 3 && npc->flag & 8) + { + npc->act_no = 10; + + if (npc->direct == 0) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + + break; + + case 10: + npc->xm = 0; + npc->ani_no = 8; + break; + + case 11: + npc->act_no = 12; + npc->act_wait = 0; + npc->ani_no = 9; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 12: + if (++npc->ani_wait > 8) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 10) + npc->ani_no = 9; + + break; + + case 13: + npc->ani_no = 11; + npc->xm = 0; + npc->ym = 0; + npc->act_no = 14; + + for (n = 0; n < NPC_MAX; ++n) + if (gNPC[n].code_event == 501) + break; + + if (n == NPC_MAX) + { + npc->act_no = 0; + break; + } + + npc->pNpc = &gNPC[n]; + // Fallthrough + case 14: + if (npc->pNpc->direct == 0) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + if (npc->pNpc->direct == 0) + npc->x = npc->pNpc->x - (6 * 0x200); + else + npc->x = npc->pNpc->x + (6 * 0x200); + + npc->y = npc->pNpc->y + (4 * 0x200); + + if (npc->pNpc->ani_no == 2 || npc->pNpc->ani_no == 4) + npc->y -= 1 * 0x200; + + break; + + case 15: + npc->act_no = 16; + SetNpChar(257, npc->x + (128 * 0x200), npc->y, 0, 0, 0, NULL, 0); + SetNpChar(257, npc->x + (128 * 0x200), npc->y, 0, 0, 2, NULL, 0x80); + npc->xm = 0; + npc->ani_no = 0; + // Fallthrough + case 16: + gSuperXpos = npc->x - (24 * 0x200); + gSuperYpos = npc->y - (8 * 0x200); + break; + + case 17: + npc->xm = 0; + npc->ani_no = 12; + gSuperXpos = npc->x; + gSuperYpos = npc->y - (8 * 0x200); + break; + + case 20: + npc->act_no = 21; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 21: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + + if (npc->x < gMC.x - (8 * 0x200)) + { + npc->direct = gMirrorMode? 0:2; + npc->act_no = 0; + } + + break; + + case 30: + npc->act_no = 31; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 31: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + + break; + + case 40: + npc->act_no = 41; + npc->ani_no = 9; + npc->ym = -0x400; + break; + } + + if (npc->act_no != 14) + { + npc->ym += 0x40; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Chalkboard +void ActNpc043(NPCHAR *npc) +{ + RECT rcLeft = {128, 80, 168, 112}; + RECT rcRight = {168, 80, 208, 112}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 1 * 0x10 * 0x200; + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft; + else + npc->rect = rcRight; +} + +// Polish +void ActNpc044(NPCHAR *npc) +{ + // Yeah, Pixel defined these backwards for some reason. + RECT rcRight[3] = { + {0, 0, 32, 32}, + {32, 0, 64, 32}, + {64, 0, 96, 32}, + }; + + RECT rcLeft[3] = { + {0, 0, 32, 32}, + {96, 0, 128, 32}, + {128, 0, 160, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + npc->ani_no = 0; + + if (npc->direct == 0) + npc->act_no = 8; + else + npc->act_no = 2; + // Fallthrough + case 2: + npc->ym += 0x20; + + if (npc->ym > 0 && npc->flag & 8) + { + npc->ym = -0x100; + npc->xm += 0x100; + } + + if (npc->flag & 4) + npc->act_no = 3; + + break; + + case 3: + npc->xm += 0x20; + + if (npc->xm > 0 && npc->flag & 4) + { + npc->xm = -0x100; + npc->ym -= 0x100; + } + + if (npc->flag & 2) + npc->act_no = 4; + + break; + + case 4: + npc->ym -= 0x20; + + if (npc->ym < 0 && npc->flag & 2) + { + npc->ym = 0x100; + npc->xm -= 0x100; + } + + if (npc->flag & 1) + npc->act_no = 5; + + break; + + case 5: + npc->xm -= 0x20; + + if (npc->xm < 0 && npc->flag & 1) + { + npc->xm = 0x100; + npc->ym += 0x100; + } + + if (npc->flag & 8) + npc->act_no = 2; + + break; + + case 6: + npc->ym += 0x20; + + if (npc->ym > 0 && npc->flag & 8) + { + npc->ym = -0x100; + npc->xm -= 0x100; + } + + if (npc->flag & 1) + npc->act_no = 7; + + break; + + case 7: + npc->xm -= 0x20; + + if (npc->xm < 0 && npc->flag & 1) + { + npc->xm = 0x100; + npc->ym -= 0x100; + } + + if (npc->flag & 2) + npc->act_no = 8; + + break; + + case 8: + npc->ym -= 0x20; + + if (npc->ym < 0 && npc->flag & 2) + { + npc->ym = 0x100; + npc->xm += 0x100; + } + + if (npc->flag & 4) + npc->act_no = 9; + + break; + + case 9: + npc->xm += 0x20; + + if (npc->xm > 0 && npc->flag & 4) + { + npc->xm = -0x100; + npc->ym += 0x100; + } + + if (npc->flag & 8) + npc->act_no = 6; + + break; + } + + if (npc->life <= 100) + { + int i; + + for (i = 0; i < 10; ++i) + SetNpChar(45, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8); + PlaySoundObject(25, SOUND_MODE_PLAY); + npc->cond = 0; + } + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->shock) + { + npc->x += npc->xm / 2; + npc->y += npc->ym / 2; + } + else + { + npc->x += npc->xm; + npc->y += npc->ym; + } + + if (npc->act_no >= 2 && npc->act_no <= 9 && ++npc->ani_no > 2) + npc->ani_no = 1; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Baby +void ActNpc045(NPCHAR *npc) +{ + RECT rect[3] = { + {0, 32, 16, 48}, + {16, 32, 32, 48}, + {32, 32, 48, 48}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 2; + + if (Random(0, 1)) + npc->xm = Random(-0x200, -0x100); + else + npc->xm = Random(0x100, 0x200); + + if (Random(0, 1)) + npc->ym = Random(-0x200, -0x100); + else + npc->ym = Random(0x100, 0x200); + + npc->xm2 = npc->xm; + npc->ym2 = npc->ym; + // Fallthrough + case 1: + case 2: + if (++npc->ani_no > 2) + npc->ani_no = 1; + + break; + } + + if (npc->xm2 < 0 && npc->flag & 1) + npc->xm2 *= -1; + if (npc->xm2 > 0 && npc->flag & 4) + npc->xm2 *= -1; + + if (npc->ym2 < 0 && npc->flag & 2) + npc->ym2 *= -1; + if (npc->ym2 > 0 && npc->flag & 8) + npc->ym2 *= -1; + + if (npc->xm2 > 0x200) + npc->xm2 = 0x200; + if (npc->xm2 < -0x200) + npc->xm2 = -0x200; + + if (npc->ym2 > 0x200) + npc->ym2 = 0x200; + if (npc->ym2 < -0x200) + npc->ym2 = -0x200; + + if (npc->shock) + { + npc->x += npc->xm2 / 2; + npc->y += npc->ym2 / 2; + } + else + { + npc->x += npc->xm2; + npc->y += npc->ym2; + } + + npc->rect = rect[npc->ani_no]; +} + +// H/V Trigger +void ActNpc046(NPCHAR *npc) +{ + RECT rect = {0, 0, 16, 16}; + + npc->bits |= NPC_EVENT_WHEN_TOUCHED; + + if (npc->direct == 0) + { + if (npc->x < gMC.x) + npc->x += 0x5FF; + else + npc->x -= 0x5FF; + } + else + { + if (npc->y < gMC.y) + npc->y += 0x5FF; + else + npc->y -= 0x5FF; + } + + npc->rect = rect; +} + +// Sandcroc +void ActNpc047(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->ani_no = 0; + npc->act_no = 1; + npc->act_wait = 0; + npc->tgt_y = npc->y; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + npc->bits &= ~NPC_SOLID_SOFT; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + // Fallthrough + case 1: + if (gMC.x > npc->x - (8 * 0x200) && gMC.x < npc->x + (8 * 0x200) && gMC.y > npc->y && gMC.y < npc->y + (8 * 0x200)) + { + npc->act_no = 2; + npc->act_wait = 0; + PlaySoundObject(102, SOUND_MODE_PLAY); + } + + if (npc->x < gMC.x) + npc->x += 2 * 0x200; + + if (npc->x > gMC.x) + npc->x -= 2 * 0x200; + + break; + + case 2: + if (++npc->ani_wait > 3) + { + ++npc->ani_no; + npc->ani_wait = 0; + } + + if (npc->ani_no == 3) + npc->damage = 10; + + if (npc->ani_no == 4) + { + npc->bits |= NPC_SHOOTABLE; + npc->act_no = 3; + npc->act_wait = 0; + } + + break; + + case 3: + npc->bits |= NPC_SOLID_SOFT; + npc->damage = 0; + ++npc->act_wait; + + if (npc->shock) + { + npc->act_no = 4; + npc->act_wait = 0; + } + + break; + + case 4: + npc->bits |= NPC_IGNORE_SOLIDITY; + npc->y += 1 * 0x200; + + if (++npc->act_wait == 32) + { + npc->bits &= ~NPC_SOLID_SOFT; + npc->bits &= ~NPC_SHOOTABLE; + npc->act_no = 5; + npc->act_wait = 0; + } + + break; + + case 5: + if (npc->act_wait < 100) + { + ++npc->act_wait; + } + else + { + npc->y = npc->tgt_y; + npc->ani_no = 0; + npc->act_no = 0; + } + + break; + } + + RECT rect[5] = { + {0, 48, 48, 80}, + {48, 48, 96, 80}, + {96, 48, 144, 80}, + {144, 48, 192, 80}, + {192, 48, 240, 80}, + }; + + npc->rect = rect[npc->ani_no]; +} + +// Omega projectiles +void ActNpc048(NPCHAR *npc) +{ + if (npc->flag & 1 && npc->xm < 0) + { + npc->xm *= -1; + } + else if (npc->flag & 4 && npc->xm > 0) + { + npc->xm *= -1; + } + else if (npc->flag & 8) + { + if (++npc->count1 > 2 || npc->direct == 2) + { + VanishNpChar(npc); + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } + else + { + npc->ym = -0x100; + } + } + + if (npc->direct == 2) + { + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + } + + npc->ym += 5; + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rcLeft[2] = { + {288, 88, 304, 104}, + {304, 88, 320, 104}, + }; + + RECT rcRight[2] = { + {288, 104, 304, 120}, + {304, 104, 320, 120}, + }; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + if (++npc->ani_no > 1) + npc->ani_no = 0; + } + + if (++npc->act_wait > 750) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Skullhead +void ActNpc049(NPCHAR *npc) +{ + unsigned char deg; + int xm, ym; + + if (npc->act_no >= 10 && npc->pNpc->code_char == 3) + { + npc->act_no = 3; + npc->xm = 0; + npc->ym = 0; + npc->count2 = 1; + } + + if (npc->flag & 1) + { + npc->direct = gMirrorMode? 0:2; + npc->xm = 0x100; + } + + if (npc->flag & 4) + { + npc->direct = gMirrorMode? 2:0; + npc->xm = -0x100; + } + + switch (npc->act_no) + { + case 0: + if (npc->pNpc != NULL) + npc->act_no = 10; + else + npc->act_no = 1; + // Fallthrough + case 1: + if (++npc->act_wait > 3) + { + npc->ym = -0x400; + npc->act_no = 3; + npc->ani_no = 2; + + if (npc->count2 != 0) + { + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + } + else + { + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + } + } + + npc->ani_no = 1; + break; + + case 3: + if (npc->flag & 8) + { + npc->act_no = 1; + npc->act_wait = 0; + npc->xm = 0; + } + + if (npc->flag & 8 || npc->ym > 0) + npc->ani_no = 1; + else + npc->ani_no = 2; + + break; + + case 10: + if (npc->count1 < 50) + { + ++npc->count1; + } + else + { + if (npc->x - (128 * 0x200) < gMC.x && npc->x + (128 * 0x200) > gMC.x && npc->y - (96 * 0x200) < gMC.y && npc->y + (96 * 0x200) > gMC.y) + { + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_no = 2; + } + } + + break; + + case 11: + if (++npc->act_wait == 30 || npc->act_wait == 35) + { + deg = GetArktan(npc->x - gMC.x, npc->y + (4 * 0x200) - gMC.y); + ym = GetSin(deg) * 2; + xm = GetCos(deg) * 2; + SetNpChar(50, npc->x, npc->y, xm, ym, 0, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + if (npc->act_wait > 50) + { + npc->count1 = 0; + npc->act_no = 10; + npc->ani_no = 1; + } + + break; + } + + if (npc->act_no >= 10) + { + npc->x = npc->pNpc->x; + npc->y = npc->pNpc->y + (16 * 0x200); + npc->direct = npc->pNpc->direct; + --npc->pNpc->count1; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rcLeft[3] = { + {0, 80, 32, 104}, + {32, 80, 64, 104}, + {64, 80, 96, 104}, + }; + + RECT rcRight[3] = { + {0, 104, 32, 128}, + {32, 104, 64, 128}, + {64, 104, 96, 128}, + }; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Skeleton projectile +void ActNpc050(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + if (npc->direct == 2) + npc->act_no = 2; + // Fallthrough + case 1: + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->flag & 1) + { + npc->act_no = 2; + npc->xm = 0x200; + ++npc->count1; + } + + if (npc->flag & 4) + { + npc->act_no = 2; + npc->xm = -0x200; + ++npc->count1; + } + + if (npc->flag & 2) + { + npc->act_no = 2; + npc->ym = 0x200; + ++npc->count1; + } + + if (npc->flag & 8) + { + npc->act_no = 2; + npc->ym = -0x200; + ++npc->count1; + } + + break; + + case 2: + npc->ym += 0x40; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->flag & 8) + { + if (++npc->count1 > 1) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } + } + + break; + } + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + + RECT rect[4] = { + {48, 32, 64, 48}, + {64, 32, 80, 48}, + {80, 32, 96, 48}, + {96, 32, 112, 48}, + }; + + if (npc->direct == 0) + { + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + } + else + { + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + --npc->ani_no; + } + + if (npc->ani_no < 0) + npc->ani_no = 3; + } + + npc->rect = rect[npc->ani_no]; +} + +// Crow & Skullhead +void ActNpc051(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + if (npc->x - (((WINDOW_WIDTH / 2) + 160) * 0x200) < gMC.x && npc->x + (((WINDOW_WIDTH / 2) + 160) * 0x200) > gMC.x && npc->y - (((WINDOW_HEIGHT / 2) + 200) * 0x200) < gMC.y && npc->y + (((WINDOW_HEIGHT / 2) + 200) * 0x200) > gMC.y) + { + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + + if (npc->direct == 0) // Completely redundant as both the conditions are the same + npc->ym = 0x400; + else + npc->ym = 0x400; + + npc->act_no = 1; + SetNpChar(49, 0, 0, 0, 0, 0, npc, 0); + } + else + { + break; + } + + // Fallthrough + case 1: + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->tgt_y < npc->y) + npc->ym -= 10; + if (npc->tgt_y > npc->y) + npc->ym += 10; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->count1 < 10) + ++npc->count1; + else + npc->act_no = 2; + + break; + + case 2: + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->y > gMC.y + (32 * 0x200)) + { + if (gMC.x < npc->x) + npc->xm += 0x10; + if (gMC.x > npc->x) + npc->xm -= 0x10; + } + else + { + if (gMC.x < npc->x) + npc->xm -= 0x10; + if (gMC.x > npc->x) + npc->xm += 0x10; + } + + if (gMC.y < npc->y) + npc->ym -= 0x10; + if (gMC.y > npc->y) + npc->ym += 0x10; + + if (npc->shock) + { + npc->ym += 0x20; + npc->xm = 0; + } + + break; + } + + if (npc->xm < 0 && npc->flag & 1) + npc->xm = 0x100; + if (npc->xm > 0 && npc->flag & 4) + npc->xm = -0x100; + + if (npc->ym < 0 && npc->flag & 2) + npc->ym = 0x100; + if (npc->ym > 0 && npc->flag & 8) + npc->ym = -0x100; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[5] = { + {96, 80, 128, 112}, + {128, 80, 160, 112}, + {160, 80, 192, 112}, + {192, 80, 224, 112}, + {224, 80, 256, 112}, + }; + + RECT rect_right[5] = { + {96, 112, 128, 144}, + {128, 112, 160, 144}, + {160, 112, 192, 144}, + {192, 112, 224, 144}, + {224, 112, 256, 144}, + }; + + if (npc->shock) + { + npc->ani_no = 4; + } + else if (npc->act_no == 2 && npc->y < gMC.y - (32 * 0x200)) + { + npc->ani_no = 0; + } + else + { + if (npc->act_no != 0) + { + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + } + } + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Blue robot (sitting) +void ActNpc052(NPCHAR *npc) +{ + RECT rect = {240, 96, 256, 112}; + + npc->rect = rect; +} + +// Skullstep leg +void ActNpc053(NPCHAR *npc) +{ + unsigned char deg; + + RECT rcLeft[2] = { + {0, 128, 24, 144}, + {24, 128, 48, 144}, + }; + + RECT rcRight[2] = { + {48, 128, 72, 144}, + {72, 128, 96, 144}, + }; + + if (npc->pNpc->code_char == 3) + { + VanishNpChar(npc); + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 4); + return; + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->count1 = 10; + // Fallthrough + case 1: + if (npc->direct == 0 && npc->flag & 0x20) + { + npc->pNpc->y -= 2 * 0x200; + npc->pNpc->ym -= 0x100; + } + + if (npc->direct == 2 && npc->flag & 0x10) + { + npc->pNpc->y -= 2 * 0x200; + npc->pNpc->ym -= 0x100; + } + + if (npc->flag & 8) + { + npc->pNpc->y -= 2 * 0x200; + npc->pNpc->ym -= 0x100; + + if (npc->pNpc->direct == 0) + npc->pNpc->xm -= 0x80; + else + npc->pNpc->xm += 0x80; + } + + deg = (unsigned char)npc->xm + (unsigned char)npc->pNpc->count2; + npc->x = npc->pNpc->x + npc->count1 * GetCos(deg); + npc->y = npc->pNpc->y + npc->count1 * GetSin(deg); + + npc->direct = npc->pNpc->direct; + + break; + } + + npc->direct = npc->pNpc->direct; + + if (deg >= 20 && deg <= 108) + npc->ani_no = 0; + else + npc->ani_no = 1; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Skullstep +void ActNpc054(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {0, 80, 32, 104}, + {32, 80, 64, 104}, + {64, 80, 96, 104}, + }; + + RECT rcRight[3] = { + {0, 104, 32, 128}, + {32, 104, 64, 128}, + {64, 104, 96, 128}, + }; + + unsigned char deg; + + switch (npc->act_no) + { + case 0: + SetNpChar(53, 0, 0, 0, 0, npc->direct, npc, 0x100); + SetNpChar(53, 0, 0, 128, 0, npc->direct, npc, 0); + npc->act_no = 1; + npc->ani_no = 1; + // Fallthrough + case 1: + deg = npc->count2; + + if (npc->direct == 0) + deg -= 6; + else + deg += 6; + + npc->count2 = deg; + + if (npc->flag & 8) + { + npc->xm = (npc->xm * 3) / 4; + + if (++npc->act_wait > 60) + { + npc->act_no = 2; + npc->act_wait = 0; + } + } + else + { + npc->act_wait = 0; + } + + if (npc->direct == 0 && npc->flag & 1) + { + if (++npc->count1 > 8) + { + npc->direct = gMirrorMode? 0:2; + npc->xm *= -1; + } + } + else if (npc->direct == 2 && npc->flag & 4) + { + if (++npc->count1 > 8) + { + npc->direct = gMirrorMode? 2:0; + npc->xm *= -1; + } + } + else + { + npc->count1 = 0; + } + + break; + + case 2: + ++npc->act_wait; + npc->shock += (unsigned char)npc->act_wait; + + if (npc->act_wait > 50) + { + VanishNpChar(npc); + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8); + PlaySoundObject(25, SOUND_MODE_PLAY); + } + + break; + } + + npc->ym += 0x80; + + if (npc->xm > 0x2FF) + npc->xm = 0x2FF; + if (npc->xm < -0x2FF) + npc->xm = -0x2FF; + + if (npc->ym > 0x2FF) + npc->ym = 0x2FF; + if (npc->ym < -0x2FF) + npc->ym = -0x2FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Kazuma +void ActNpc055(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {192, 192, 208, 216}, + {208, 192, 224, 216}, + {192, 192, 208, 216}, + {224, 192, 240, 216}, + {192, 192, 208, 216}, + {240, 192, 256, 216}, + }; + + RECT rcRight[6] = { + {192, 216, 208, 240}, + {208, 216, 224, 240}, + {192, 216, 208, 240}, + {224, 216, 240, 240}, + {192, 216, 208, 240}, + {240, 216, 256, 240}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + break; + + case 3: + npc->act_no = 4; + npc->ani_no = 1; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 1; + + if (npc->direct == 0) + npc->x -= 1 * 0x200; + else + npc->x += 1 * 0x200; + + break; + + case 5: + npc->ani_no = 5; + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Beetle (Sand Zone) +void ActNpc056(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {0, 144, 16, 160}, + {16, 144, 32, 160}, + {32, 144, 48, 160}, + }; + + RECT rcRight[3] = { + {0, 160, 16, 176}, + {16, 160, 32, 176}, + {32, 160, 48, 176}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 0) + npc->act_no = 1; + else + npc->act_no = 3; + + break; + + case 1: + npc->xm -= 0x10; + + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->shock) + npc->x += npc->xm / 2; + else + npc->x += npc->xm; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 1; + + if (npc->flag & 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 0; + npc->xm = 0; + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 2: + if (npc->x < gMC.x && npc->x > gMC.x - (16 * 0x10 * 0x200) && npc->y < gMC.y + (8 * 0x200) && npc->y > gMC.y - (8 * 0x200)) + { + npc->act_no = 3; + npc->ani_wait = 0; + npc->ani_no = 1; + } + + break; + + case 3: + npc->xm += 0x10; + + if (npc->xm > 0x400) + npc->xm = 0x400; + + if (npc->shock) + npc->x += npc->xm / 2; + else + npc->x += npc->xm; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 1; + + if (npc->flag & 4) + { + npc->act_no = 4; + npc->act_wait = 0; + npc->ani_no = 0; + npc->xm = 0; + npc->direct = gMirrorMode? 2:0; + } + + break; + + case 4: + if (npc->x < gMC.x + (16 * 0x10 * 0x200) && npc->x > gMC.x && npc->y < gMC.y + (8 * 0x200) && npc->y > gMC.y - (8 * 0x200)) + { + npc->act_no = 1; + npc->ani_wait = 0; + npc->ani_no = 1; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Crow +void ActNpc057(NPCHAR *npc) +{ + unsigned char deg; + + switch (npc->act_no) + { + case 0: + deg = Random(0, 0xFF); + npc->xm = GetCos(deg); + deg += 0x40; + npc->tgt_x = npc->x + (GetCos(deg) * 8); + + deg = Random(0, 0xFF); + npc->ym = GetSin(deg); + deg += 0x40; + npc->tgt_y = npc->y + (GetSin(deg) * 8); + + npc->act_no = 1; + npc->count1 = 120; + npc->ani_no = Random(0, 1); + npc->ani_wait = Random(0, 4); + // Fallthrough + case 1: + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->tgt_x < npc->x) + npc->xm -= 0x10; + if (npc->tgt_x > npc->x) + npc->xm += 0x10; + + if (npc->tgt_y < npc->y) + npc->ym -= 0x10; + if (npc->tgt_y > npc->y) + npc->ym += 0x10; + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->shock) + { + npc->act_no = 2; + npc->act_wait = 0; + + if (npc->direct == 2) + npc->xm = -0x200; + else + npc->xm = 0x200; + + npc->ym = 0; + } + + break; + + case 2: + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->y > gMC.y + (48 * 0x200)) + { + if (gMC.x < npc->x) + npc->xm += 0x10; + if (gMC.x > npc->x) + npc->xm -= 0x10; + } + else + { + if (gMC.x < npc->x) + npc->xm -= 0x10; + if (gMC.x > npc->x) + npc->xm += 0x10; + } + + if (gMC.y < npc->y) + npc->ym -= 0x10; + if (gMC.y > npc->y) + npc->ym += 0x10; + + if (npc->shock) + { + npc->ym += 0x20; + npc->xm = 0; + } + + if (npc->xm < 0 && npc->flag & 1) + npc->xm = 0x200; + if (npc->xm > 0 && npc->flag & 4) + npc->xm = -0x200; + + if (npc->ym < 0 && npc->flag & 2) + npc->ym = 0x200; + if (npc->ym > 0 && npc->flag & 8) + npc->ym = -0x200; + + if (npc->xm > 0x5FF) + npc->xm = 0x5FF; + if (npc->xm < -0x5FF) + npc->xm = -0x5FF; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[5] = { + {96, 80, 128, 112}, + {128, 80, 160, 112}, + {160, 80, 192, 112}, + {192, 80, 224, 112}, + {224, 80, 256, 112}, + }; + + RECT rect_right[5] = { + {96, 112, 128, 144}, + {128, 112, 160, 144}, + {160, 112, 192, 144}, + {192, 112, 224, 144}, + {224, 112, 256, 144}, + }; + + if (npc->shock) + { + npc->ani_no = 4; + } + else + { + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + } + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Basu (Egg Corridor) +void ActNpc058(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {192, 0, 216, 24}, + {216, 0, 240, 24}, + {240, 0, 264, 24}, + }; + + RECT rcRight[3] = { + {192, 24, 216, 48}, + {216, 24, 240, 48}, + {240, 24, 264, 48}, + }; + + switch (npc->act_no) + { + case 0: + if (gMC.x < npc->x + (16 * 0x200) && gMC.x > npc->x - (16 * 0x200)) + { + npc->bits |= NPC_SHOOTABLE; + npc->ym = -0x100; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->act_no = 1; + npc->act_wait = 0; + npc->count1 = npc->direct; + npc->count2 = 0; + npc->damage = 6; + + if (npc->direct == 0) + { + npc->x = gMC.x + (16 * 0x10 * 0x200); + npc->xm = -0x2FF; + } + else + { + npc->x = gMC.x - (16 * 0x10 * 0x200); + npc->xm = 0x2FF; + } + + return; + } + + npc->rect.right = 0; + npc->damage = 0; + npc->xm = 0; + npc->ym = 0; + npc->bits &= ~NPC_SHOOTABLE; + + return; + + case 1: + if (npc->x > gMC.x) + { + npc->direct = gMirrorMode? 2:0; + npc->xm -= 0x10; + } + else + { + npc->direct = gMirrorMode? 0:2; + npc->xm += 0x10; + } + + if (npc->flag & 1) + npc->xm = 0x200; + + if (npc->flag & 4) + npc->xm = -0x200; + + if (npc->y < npc->tgt_y) + npc->ym += 8; + else + npc->ym -= 8; + + if (npc->xm > 0x2FF) + npc->xm = 0x2FF; + if (npc->xm < -0x2FF) + npc->xm = -0x2FF; + + if (npc->ym > 0x100) + npc->ym = 0x100; + if (npc->ym < -0x100) + npc->ym = -0x100; + + if (npc->shock) + { + npc->x += npc->xm / 2; + npc->y += npc->ym / 2; + } + else + { + npc->x += npc->xm; + npc->y += npc->ym; + } + + if (gMC.x > npc->x + (400 * 0x200) || gMC.x < npc->x - (400 * 0x200)) // TODO: Maybe do something about this for widescreen + { + npc->act_no = 0; + npc->xm = 0; + npc->direct = npc->count1; + npc->x = npc->tgt_x; + npc->rect.right = 0; + npc->damage = 0; + return; + } + + break; + } + + if (npc->act_no != 0) // This is always true + { + if (npc->act_wait < 150) + ++npc->act_wait; + + if (npc->act_wait == 150) + { + if ((++npc->count2 % 8) == 0 && npc->x < gMC.x + (160 * 0x200) && npc->x > gMC.x - (160 * 0x200)) // TODO: Maybe do something about this for widescreen + { + unsigned char deg; + int xm; + int ym; + + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-6, 6); + ym = GetSin(deg) * 2; + xm = GetCos(deg) * 2; + SetNpChar(84, npc->x, npc->y, xm, ym, 0, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + if (npc->count2 > 8) + { + npc->act_wait = 0; + npc->count2 = 0; + } + } + } + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->act_wait > 120 && npc->act_wait / 2 % 2 == 1 && npc->ani_no == 1) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Eye door +void ActNpc059(NPCHAR *npc) +{ + RECT rcLeft[4] = { + {224, 16, 240, 40}, + {208, 80, 224, 104}, + {224, 80, 240, 104}, + {240, 80, 256, 104}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->x - (64 * 0x200) < gMC.x && npc->x + (64 * 0x200) > gMC.x && npc->y - (64 * 0x200) < gMC.y && npc->y + (64 * 0x200) > gMC.y) + { + npc->act_no = 2; + npc->ani_wait = 0; + } + + break; + + case 2: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no == 2) + npc->act_no = 3; + + break; + + case 3: + if (npc->x - (64 * 0x200) < gMC.x && npc->x + (64 * 0x200) > gMC.x && npc->y - (64 * 0x200) < gMC.y && npc->y + (64 * 0x200) > gMC.y) + { + // There probably used to be some commented-out code here + } + else + { + npc->act_no = 4; + npc->ani_wait = 0; + } + + break; + + case 4: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + --npc->ani_no; + } + + if (npc->ani_no == 0) + npc->act_no = 1; + + break; + } + + if (npc->shock) + npc->rect = rcLeft[3]; + else + npc->rect = rcLeft[npc->ani_no]; +} diff --git a/src/NpcAct060.cpp b/src/NpcAct060.cpp new file mode 100644 index 0000000..a1f0755 --- /dev/null +++ b/src/NpcAct060.cpp @@ -0,0 +1,1873 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" +#include "Draw.h" +#include "Flash.h" +#include "Frame.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "MycHit.h" +#include "MycParam.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +// Toroko +void ActNpc060(NPCHAR *npc) +{ + RECT rcLeft[8] = { + {0, 64, 16, 80}, + {16, 64, 32, 80}, + {32, 64, 48, 80}, + {16, 64, 32, 80}, + {48, 64, 64, 80}, + {16, 64, 32, 80}, + {112, 64, 128, 80}, + {128, 64, 144, 80}, + }; + + RECT rcRight[8] = { + {0, 80, 16, 96}, + {16, 80, 32, 96}, + {32, 80, 48, 96}, + {16, 80, 32, 96}, + {48, 80, 64, 96}, + {16, 80, 32, 96}, + {112, 80, 128, 96}, + {128, 80, 144, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (16 * 0x200) < gMC.x && npc->x + (16 * 0x200) > gMC.x && npc->y - (16 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->act_no = 4; + npc->ani_no = 1; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 1; + + if (npc->flag & 1) + { + npc->direct = gMirrorMode? 0:2; + npc->xm = 0x200; + } + + if (npc->flag & 4) + { + npc->direct = gMirrorMode? 2:0; + npc->xm = -0x200; + } + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + + break; + + case 6: + npc->act_no = 7; + npc->act_wait = 0; + npc->ani_no = 1; + npc->ani_wait = 0; + npc->ym = -0x400; + // Fallthrough + case 7: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 1; + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + if (npc->act_wait++ != 0 && npc->flag & 8) + npc->act_no = 3; + + break; + + case 8: + npc->ani_no = 1; + npc->act_wait = 0; + npc->act_no = 9; + npc->ym = -0x200; + // Fallthrough + case 9: + if (npc->act_wait++ != 0 && npc->flag & 8) + npc->act_no = 0; + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 6; + npc->ym = -0x400; + PlaySoundObject(50, SOUND_MODE_PLAY); + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + break; + + case 11: + if (npc->act_wait++ != 0 && npc->flag & 8) + { + npc->act_no = 12; + npc->ani_no = 7; + npc->bits |= NPC_INTERACTABLE; + } + + break; + + case 12: + npc->xm = 0; + break; + } + + npc->ym += 0x40; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = gMirrorMode? rcRight[npc->ani_no]: rcLeft[npc->ani_no]; + else + npc->rect = gMirrorMode? rcLeft[npc->ani_no]: rcRight[npc->ani_no]; +} + +// King +void ActNpc061(NPCHAR *npc) +{ + int i; + + RECT rcLeft[11] = { + // NpcRegu + {224, 32, 240, 48}, // 0 - Stood + {240, 32, 256, 48}, // 1 - Blinking + {256, 32, 272, 48}, // 2 - Injured - falling backwards + {272, 32, 288, 48}, // 3 - Lying down + {288, 32, 304, 48}, // 4 - Walking - frame 1 + {224, 32, 240, 48}, // 5 - Walking - frame 2 + {304, 32, 320, 48}, // 6 - Walking - frame 3 + {224, 32, 240, 48}, // 7 - Walking - frame 4 + {272, 32, 288, 48}, // 8 - Dying - frame 1 + {0, 0, 0, 0}, // 9 - Dying - frame 2 + // NpcSym + {112, 32, 128, 48}, // 10 - King's sword + }; + + RECT rcRight[11] = { + // NpcRegu + {224, 48, 240, 64}, // 0 - Stood + {240, 48, 256, 64}, // 1 - Blinking + {256, 48, 272, 64}, // 2 - Injured - falling backwards + {272, 48, 288, 64}, // 3 - Lying down + {288, 48, 304, 64}, // 4 - Walking - frame 1 + {224, 48, 240, 64}, // 5 - Walking - frame 2 + {304, 48, 320, 64}, // 6 - Walking - frame 3 + {224, 48, 240, 64}, // 7 - Walking - frame 4 + {272, 48, 288, 64}, // 8 - Dying - frame 1 + {0, 0, 0, 0}, // 9 - Dying - frame 2 + // NpcSym + {112, 32, 128, 48}, // 10 - King's sword + }; + + switch (npc->act_no) + { + case 0: // Stood + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: // Blink + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 5: // Lying down + npc->ani_no = 3; + npc->xm = 0; + break; + + case 6: // Being knocked-back + npc->act_no = 7; + npc->act_wait = 0; + npc->ani_wait = 0; + npc->ym = -0x400; + // Fallthrough + case 7: + npc->ani_no = 2; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + // If touching ground, enter 'lying down' state (the `act_wait` check is probably + // so he doesn't do it before he even leaves the ground in the first place) + if (npc->act_wait++ != 0 && npc->flag & 8) + npc->act_no = 5; + + break; + + case 8: // Walking + npc->act_no = 9; + npc->ani_no = 4; + npc->ani_wait = 0; + // Fallthrough + case 9: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 7) + npc->ani_no = 4; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + break; + + case 10: // Running + npc->act_no = 11; + npc->ani_no = 4; + npc->ani_wait = 0; + // Fallthrough + case 11: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 7) + npc->ani_no = 4; + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + + break; + + case 20: // Spawn his sword, before entering his 'idle' state + SetNpChar(NPC_KINGS_SWORD, 0, 0, 0, 0, 2, npc, 0x100); + npc->ani_no = 0; + npc->act_no = 0; + break; + + case 30: // Flying through air after being attacked by Misery + npc->act_no = 31; + npc->act_wait = 0; + npc->ani_wait = 0; + npc->ym = 0; + // Fallthrough + case 31: + npc->ani_no = 2; + + if (npc->direct == 0) + npc->xm = -0x600; + else + npc->xm = 0x600; + + if (npc->flag & 1) + { + npc->direct = gMirrorMode? 0:2; + npc->act_no = 7; + npc->act_wait = 0; + npc->ani_wait = 0; + npc->ym = -0x400; + npc->xm = 0x200; + PlaySoundObject(71, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x, npc->y, 0x800, 4); + } + + break; + + case 40: // Dying + npc->act_no = 42; + npc->act_wait = 0; + npc->ani_no = 8; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 42: + if (++npc->ani_no > 9) + npc->ani_no = 8; + + if (++npc->act_wait > 100) + { + for (i = 0; i < 4; ++i) + SetNpChar(NPC_SMOKE, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + npc->act_no = 50; + npc->surf = SURFACE_ID_NPC_SYM; + npc->ani_no = 10; + } + + break; + + case 60: // Leap (used to attack Balrog in the Sand Zone storehouse) + npc->ani_no = 6; + npc->act_no = 61; + npc->ym = -0x5FF; + npc->xm = 0x400; + npc->count2 = 1; + break; + + case 61: // Leap - part 2 + npc->ym += 0x40; + + if (npc->flag & 8) + { + npc->act_no = 0; + npc->count2 = 0; + npc->xm = 0; + } + + break; + } + + // Apply gravity and speed-caps during most states + if (npc->act_no < 30 || npc->act_no >= 40) + { + npc->ym += 0x40; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = gMirrorMode? rcRight[npc->ani_no]: rcLeft[npc->ani_no]; + else + npc->rect = gMirrorMode? rcLeft[npc->ani_no]: rcRight[npc->ani_no]; +} + +// Kazuma at computer +void ActNpc062(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {272, 192, 288, 216}, + {288, 192, 304, 216}, + {304, 192, 320, 216}, + }; + + switch (npc->act_no) + { + case 0: + npc->x -= 4 * 0x200; + npc->y += 16 * 0x200; + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (Random(0, 80) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (Random(0, 120) == 10) + { + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 2; + } + + break; + + case 2: + if (++npc->act_wait > 40) + { + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 2; + } + + break; + + case 3: + if (++npc->act_wait > 80) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + npc->rect = rcLeft[npc->ani_no]; +} + +// Toroko with stick +void ActNpc063(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {64, 64, 80, 80}, + {80, 64, 96, 80}, + {64, 64, 80, 80}, + {96, 64, 112, 80}, + {112, 64, 128, 80}, + {128, 64, 144, 80}, + }; + + RECT rcRight[6] = { + {64, 80, 80, 96}, + {80, 80, 96, 96}, + {64, 80, 80, 96}, + {96, 80, 112, 96}, + {112, 80, 128, 96}, + {128, 80, 144, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = 0; + npc->ani_wait = 0; + npc->ym = -0x400; + // Fallthrough + case 1: + if (npc->ym > 0) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + if (npc->act_wait++ != 0 && npc->flag & 8) + npc->act_no = 2; + + break; + + case 2: + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 3: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + if (++npc->act_wait > 50) + { + npc->act_wait = 40; + npc->xm *= -1; + + if (npc->direct == 0) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + + if (npc->act_wait > 35) + npc->bits |= NPC_SHOOTABLE; + + if (npc->direct == 0) + npc->xm -= 0x40; + else + npc->xm += 0x40; + + if (npc->shock) + { + npc->act_no = 4; + npc->ani_no = 4; + npc->ym = -0x400; + npc->bits &= ~NPC_SHOOTABLE; + npc->damage = 0; + } + + break; + + case 4: + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + if (npc->act_wait++ != 0 && npc->flag & 8) + { + npc->act_no = 5; + npc->bits |= NPC_INTERACTABLE; + } + + break; + + case 5: + npc->xm = 0; + npc->ani_no = 5; + break; + } + + npc->ym += 0x40; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = gMirrorMode? rcRight[npc->ani_no]: rcLeft[npc->ani_no]; + else + npc->rect = gMirrorMode? rcLeft[npc->ani_no]: rcRight[npc->ani_no]; +} + +// First Cave Critter +void ActNpc064(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + {32, 0, 48, 16}, + }; + + RECT rcRight[3] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {32, 16, 48, 32}, + }; + + switch (npc->act_no) + { + case 0: // Initialize + npc->y += 3 * 0x200; + npc->act_no = 1; + // Fallthrough + case 1: // Waiting + // Look at player + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->tgt_x < 100) + ++npc->tgt_x; + + // Open eyes near player + if (npc->act_wait >= 8 && npc->x - (112 * 0x200) < gMC.x && npc->x + (112 * 0x200) > gMC.x && npc->y - (80 * 0x200) < gMC.y && npc->y + (80 * 0x200) > gMC.y) + { + npc->ani_no = 1; + } + else + { + if (npc->act_wait < 8) + ++npc->act_wait; + + npc->ani_no = 0; + } + + // Jump if attacked + if (npc->shock) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + // Jump if player is nearby + if (npc->act_wait >= 8 && npc->tgt_x >= 100 && npc->x - (64 * 0x200) < gMC.x && npc->x + (64 * 0x200) > gMC.x && npc->y - (80 * 0x200) < gMC.y && npc->y + (48 * 0x200) > gMC.y) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + break; + + case 2: // Going to jump + if (++npc->act_wait > 8) + { + // Set jump state + npc->act_no = 3; + npc->ani_no = 2; + + // Jump + npc->ym = -0x5FF; + PlaySoundObject(30, SOUND_MODE_PLAY); + + // Jump in facing direction + if (npc->direct == 0) + npc->xm = gMirrorMode? 0x100: -0x100; + else + npc->xm = gMirrorMode? -0x100: 0x100; + } + break; + + case 3: // Jumping + // Land + if (npc->flag & 8) + { + npc->xm = 0; + npc->act_wait = 0; + npc->ani_no = 0; + npc->act_no = 1; + PlaySoundObject(23, SOUND_MODE_PLAY); + } + break; + } + + // Gravity + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + // Move + npc->x += npc->xm; + npc->y += npc->ym; + + // Set framerect + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// First Cave Bat +void ActNpc065(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->count1 = 120; + npc->act_no = 1; + npc->act_wait = Random(0, 50); + // Fallthrough + + case 1: + if (++npc->act_wait < 50) + break; + + npc->act_wait = 0; + npc->act_no = 2; + npc->ym = 0x300; + + break; + + case 2: + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->tgt_y < npc->y) + npc->ym -= 0x10; + if (npc->tgt_y > npc->y) + npc->ym += 0x10; + + if (npc->ym > 0x300) + npc->ym = 0x300; + if (npc->ym < -0x300) + npc->ym = -0x300; + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[4] = { + {32, 32, 48, 48}, + {48, 32, 64, 48}, + {64, 32, 80, 48}, + {80, 32, 96, 48}, + }; + + RECT rect_right[4] = { + {32, 48, 48, 64}, + {48, 48, 64, 64}, + {64, 48, 80, 64}, + {80, 48, 96, 64}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Misery bubble +void ActNpc066(NPCHAR *npc) +{ + RECT rect[4] = { + {32, 192, 56, 216}, + {56, 192, 80, 216}, + {32, 216, 56, 240}, + {56, 216, 80, 240}, + }; + + switch (npc->act_no) + { + case 0: + int a; + for (a = 0; a < NPC_MAX; ++a) + if (gNPC[a].code_event == 1000) + break; + + if (a == NPC_MAX) + break; + + npc->tgt_x = gNPC[a].x; + npc->tgt_y = gNPC[a].y; + npc->count1 = a; + + unsigned char deg; + deg = GetArktan(npc->x - npc->tgt_x, npc->y - npc->tgt_y); + npc->xm = GetCos(deg) * 2; + npc->ym = GetSin(deg) * 2; + + npc->act_no = 1; + // Fallthrough + case 1: + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->x - (3 * 0x200) < npc->tgt_x && npc->x + (3 * 0x200) > npc->tgt_x && npc->y - (3 * 0x200) < npc->tgt_y && npc->y + (3 * 0x200) > npc->tgt_y) + { + npc->act_no = 2; + npc->ani_no = 2; + gNPC[npc->count1].cond = 0; + PlaySoundObject(21, SOUND_MODE_PLAY); + } + + break; + + case 2: + npc->xm -= 0x20; + npc->ym -= 0x20; + + if (npc->xm < -0x5FF) + npc->xm = -0x5FF; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + + if (npc->y < -8 * 0x200) + npc->cond = 0; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rect[npc->ani_no]; +} + +// Misery (floating) +void ActNpc067(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->ani_no = 0; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 1: + npc->x = npc->tgt_x + (Random(-1, 1) * 0x200); + + if (++npc->act_wait == 0x20) + npc->act_no = 10; + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_no = 0; + npc->ym = 0x200; + // Fallthrough + + case 11: + if (npc->tgt_y < npc->y) + npc->ym -= 0x10; + if (npc->tgt_y > npc->y) + npc->ym += 0x10; + + if (npc->ym > 0x100) + npc->ym = 0x100; + if (npc->ym < -0x100) + npc->ym = -0x100; + + break; + + case 13: + npc->ani_no = 1; + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + if (npc->flag & 8) + { + PlaySoundObject(23, SOUND_MODE_PLAY); + npc->ym = 0; + npc->act_no = 14; + npc->bits |= NPC_IGNORE_SOLIDITY; + npc->ani_no = 2; + } + + break; + + case 15: + npc->act_no = 16; + npc->act_wait = 0; + npc->ani_no = 4; + // Fallthrough + case 16: + if (++npc->act_wait == 30) + { + PlaySoundObject(21, SOUND_MODE_PLAY); + SetNpChar(66, npc->x, npc->y - (16 * 0x200), 0, 0, 0, npc, 0); + } + + if (npc->act_wait == 50) + npc->act_no = 14; + + break; + + case 20: + npc->act_no = 21; + npc->ani_no = 0; + npc->ym = 0; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 21: + npc->ym -= 0x20; + + if (npc->y < -8 * 0x200) + npc->cond = 0; + + break; + + case 25: + npc->act_no = 26; + npc->act_wait = 0; + npc->ani_no = 5; + npc->ani_wait = 0; + // Fallthrough + case 26: + if (++npc->ani_no > 7) + npc->ani_no = 5; + + if (++npc->act_wait == 30) + { + PlaySoundObject(101, SOUND_MODE_PLAY); + SetFlash(0, 0, FLASH_MODE_FLASH); + npc->act_no = 27; + npc->ani_no = 7; + } + + break; + + case 27: + if (++npc->act_wait == 50) + npc->act_no = 14; + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rcLeft[8] = { + {80, 0, 96, 16}, + {96, 0, 112, 16}, + {112, 0, 128, 16}, + {128, 0, 144, 16}, + {144, 0, 160, 16}, + {160, 0, 176, 16}, + {176, 0, 192, 16}, + {144, 0, 160, 16}, + }; + + RECT rcRight[8] = { + {80, 16, 96, 32}, + {96, 16, 112, 32}, + {112, 16, 128, 32}, + {128, 16, 144, 32}, + {144, 16, 160, 32}, + {160, 16, 176, 32}, + {176, 16, 192, 32}, + {144, 16, 160, 32}, + }; + + if (npc->act_no == 11) + { + if (npc->ani_wait != 0) + { + --npc->ani_wait; + npc->ani_no = 1; + } + else + { + if (Random(0, 100) == 1) + npc->ani_wait = 30; + + npc->ani_no = 0; + } + } + + if (npc->act_no == 14) + { + if (npc->ani_wait != 0) + { + --npc->ani_wait; + npc->ani_no = 3; + } + else + { + if (Random(0, 100) == 1) + npc->ani_wait = 30; + + npc->ani_no = 2; + } + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->act_no == 1 && npc->ani_wait < 32) + npc->rect.bottom = (++npc->ani_wait / 2) + npc->rect.bottom - 16; +} + +// Balrog (running) +void ActNpc068(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->act_wait = 30; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 1: + if (--npc->act_wait) + break; + + npc->act_no = 2; + ++npc->count1; + + break; + + case 2: + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 1; + npc->ani_wait = 0; + // Fallthrough + case 3: + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + + if (++npc->ani_no == 2 || npc->ani_no == 4) + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + if (npc->ani_no > 4) + npc->ani_no = 1; + + if (npc->direct == 0) + npc->xm -= 0x10; + else + npc->xm += 0x10; + + if (npc->act_wait >= 8 && npc->x - (12 * 0x200) < gMC.x && npc->x + (12 * 0x200) > gMC.x && npc->y - (12 * 0x200) < gMC.y && npc->y + (8 * 0x200) > gMC.y) + { + npc->act_no = 10; + npc->ani_no = 5; + gMC.cond |= 2; + + int damage = 2; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + damage = 127; + } + else{ + damage = damage * gbDamageModifier; + } + + DamageMyChar(damage); + + break; + } + + ++npc->act_wait; + + if (npc->flag & 5 || npc->act_wait > 75) + { + npc->act_no = 9; + npc->ani_no = 0; + break; + } + + if ((npc->count1 % 3) == 0 && npc->act_wait > 25) + { + npc->act_no = 4; + npc->ani_no = 7; + npc->ym = -0x400; + break; + } + + break; + + case 4: + if (npc->flag & 8) + { + npc->act_no = 9; + npc->ani_no = 8; + SetQuake(30); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + + if (npc->act_wait >= 8 && npc->x - (12 * 0x200) < gMC.x && npc->x + (12 * 0x200) > gMC.x && npc->y - (12 * 0x200) < gMC.y && npc->y + (8 * 0x200) > gMC.y) + { + npc->act_no = 10; + npc->ani_no = 5; + gMC.cond |= 2; + + int damage = 2; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + damage = 127; + } + else{ + damage = damage * gbDamageModifier; + } + + DamageMyChar(damage); + } + + break; + + case 9: + npc->xm = (npc->xm * 4) / 5; + + if (npc->xm != 0) + break; + + npc->act_no = 0; + + break; + + case 10: + gMC.x = npc->x; + gMC.y = npc->y; + + npc->xm = (npc->xm * 4) / 5; + + if (npc->xm != 0) + break; + + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_no = 5; + npc->ani_wait = 0; + + break; + + case 11: + gMC.x = npc->x; + gMC.y = npc->y; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + npc->ani_no = 5; + + if (++npc->act_wait > 100) + npc->act_no = 20; + + break; + + case 20: + PlaySoundObject(25, SOUND_MODE_PLAY); + gMC.cond &= ~2; + + if (npc->direct == 0) + { + gMC.x += 4 * 0x200; + gMC.y -= 8 * 0x200; + gMC.xm = 0x5FF; + gMC.ym = -0x200; + gMC.direct = 2; + npc->direct = gMirrorMode? 0:2; + } + else + { + gMC.x -= 4 * 0x200; + gMC.y -= 8 * 0x200; + gMC.xm = -0x5FF; + gMC.ym = -0x200; + gMC.direct = 0; + npc->direct = gMirrorMode? 2:0; + } + + npc->act_no = 21; + npc->act_wait = 0; + npc->ani_no = 7; + // Fallthrough + case 21: + if (++npc->act_wait < 50) + break; + + npc->act_no = 0; + break; + } + + npc->ym += 0x20; + + if (npc->xm < -0x400) + npc->xm = -0x400; + if (npc->xm > 0x400) + npc->xm = 0x400; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[9] = { + {0, 0, 40, 24}, + {0, 48, 40, 72}, + {0, 0, 40, 24}, + {40, 48, 80, 72}, + {0, 0, 40, 24}, + {80, 48, 120, 72}, + {120, 48, 160, 72}, + {120, 0, 160, 24}, + {80, 0, 120, 24}, + }; + + RECT rect_right[9] = { + {0, 24, 40, 48}, + {0, 72, 40, 96}, + {0, 24, 40, 48}, + {40, 72, 80, 96}, + {0, 24, 40, 48}, + {80, 72, 120, 96}, + {120, 72, 160, 96}, + {120, 24, 160, 48}, + {80, 24, 120, 48}, + }; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Pignon +void ActNpc069(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {48, 0, 64, 16}, + {64, 0, 80, 16}, + {80, 0, 96, 16}, + {96, 0, 112, 16}, + {48, 0, 64, 16}, + {112, 0, 128, 16}, + }; + + RECT rcRight[6] = { + {48, 16, 64, 32}, + {64, 16, 80, 32}, + {80, 16, 96, 32}, + {96, 16, 112, 32}, + {48, 16, 64, 32}, + {112, 16, 128, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 100) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + break; + } + + if (Random(0, 150) == 1) + { + if (npc->direct == 0) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + + if (Random(0, 150) == 1) + { + npc->act_no = 3; + npc->act_wait = 50; + npc->ani_no = 0; + break; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->act_no = 4; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (--npc->act_wait == 0) + npc->act_no = 0; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 2; + + if (npc->flag & 1) + { + npc->direct = gMirrorMode? 0:2; + npc->xm = 0x200; + } + + if (npc->flag & 4) + { + npc->direct = gMirrorMode? 2:0; + npc->xm = -0x200; + } + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + break; + + case 5: + if (npc->flag & 8) + npc->act_no = 0; + + break; + } + + switch (npc->act_no) + { + case 1: + case 2: + case 4: + if (npc->shock) + { + npc->ym = -0x200; + npc->ani_no = 5; + npc->act_no = 5; + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Sparkle +void ActNpc070(NPCHAR *npc) +{ + RECT rect[4] = { + {96, 48, 112, 64}, + {112, 48, 128, 64}, + {128, 48, 144, 64}, + {144, 48, 160, 64}, + }; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + npc->rect = rect[npc->ani_no]; +} + +// Chinfish +void ActNpc071(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->ym = 0x80; + // Fallthrough + case 1: + if (npc->tgt_y < npc->y) + npc->ym -= 8; + if (npc->tgt_y > npc->y) + npc->ym += 8; + + if (npc->ym > 0x100) + npc->ym = 0x100; + if (npc->ym < -0x100) + npc->ym = -0x100; + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rcLeft[3] = { + {64, 32, 80, 48}, + {80, 32, 96, 48}, + {96, 32, 112, 48}, + }; + + RECT rcRight[3] = { + {64, 48, 80, 64}, + {80, 48, 96, 64}, + {96, 48, 112, 64}, + }; + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->shock) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Sprinkler +void ActNpc072(NPCHAR *npc) +{ + if (npc->direct == 0) + { + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + { + npc->ani_no = 0; + return; + } + + if (gMC.x < npc->x + (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.x > npc->x - (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.y < npc->y + (((WINDOW_HEIGHT / 2) + 120) * 0x200) && gMC.y > npc->y - (((WINDOW_HEIGHT / 2) + 120) * 0x200)) + { + if (++npc->act_no % 2) + SetNpChar(73, npc->x, npc->y, Random(-0x200, 0x200) * 2, Random(-0x200, 0x80) * 3, 0, NULL, 0x100); + + SetNpChar(73, npc->x, npc->y, Random(-0x200, 0x200) * 2, Random(-0x200, 0x80) * 3, 0, NULL, 0x100); + } + } + + RECT rect[2] = { + {224, 48, 240, 64}, + {240, 48, 256, 64}, + }; + + npc->rect = rect[npc->ani_no]; +} + +// Water droplet +void ActNpc073(NPCHAR *npc) +{ + RECT rect[5] = { + {72, 16, 74, 18}, + {74, 16, 76, 18}, + {76, 16, 78, 18}, + {78, 16, 80, 18}, + {80, 16, 82, 18}, + }; + + npc->ym += 0x20; + npc->ani_no = Random(0, 4); + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rect[npc->ani_no]; + + if (npc->direct == 2) + { + npc->rect.top += 2; + npc->rect.bottom += 2; + } + + if (++npc->act_wait > 10) + { + if (npc->flag & 1) + npc->cond = 0; + if (npc->flag & 4) + npc->cond = 0; + if (npc->flag & 8) + npc->cond = 0; + if (npc->flag & 0x100) + npc->cond = 0; + } + + if (npc->y > gMap.length * 0x200 * 0x10) + npc->cond = 0; +} + +// Jack +void ActNpc074(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {64, 0, 80, 16}, + {80, 0, 96, 16}, + {96, 0, 112, 16}, + {64, 0, 80, 16}, + {112, 0, 128, 16}, + {64, 0, 80, 16}, + }; + + RECT rcRight[6] = { + {64, 16, 80, 32}, + {80, 16, 96, 32}, + {96, 16, 112, 32}, + {64, 16, 80, 32}, + {112, 16, 128, 32}, + {64, 16, 80, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 8: + npc->act_no = 9; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 9: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + break; + } + + npc->ym += 0x40; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Kanpachi (fishing) +void ActNpc075(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {272, 32, 296, 56}, + {296, 32, 320, 56}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (npc->x - (48 * 0x200) < gMC.x && npc->x + (48 * 0x200) > gMC.x && npc->y - (48 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + npc->ani_no = 1; + else + npc->ani_no = 0; + + break; + } + + npc->rect = rcLeft[npc->ani_no]; +} + +// Flowers +void ActNpc076(NPCHAR *npc) +{ + npc->rect.left = npc->code_event * 16; + npc->rect.top = 0; + npc->rect.right = npc->rect.left + 16; + npc->rect.bottom = 16; +} + +// Yamashita +void ActNpc077(NPCHAR *npc) +{ + RECT rc[3] = { + {0, 16, 48, 48}, + {48, 16, 96, 48}, + {96, 16, 144, 48}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rc[npc->ani_no]; + else + npc->rect = rc[2]; +} + +// Pot +void ActNpc078(NPCHAR *npc) +{ + RECT rc[2] = { + {160, 48, 176, 64}, + {176, 48, 192, 64}, + }; + + if (npc->direct == 0) + npc->rect = rc[0]; + else + npc->rect = rc[1]; +} + +// Mahin +void ActNpc079(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + {32, 0, 48, 16}, + }; + + RECT rcRight[3] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {32, 16, 48, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 2; + npc->ani_wait = 0; + break; + + case 2: + npc->ani_no = 0; + + if (Random(0, 120) == 10) + { + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (32 * 0x200) < gMC.x && npc->x + (32 * 0x200) > gMC.x && npc->y - (32 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 3: + if (++npc->act_wait > 8) + { + npc->act_no = 2; + npc->ani_no = 0; + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} diff --git a/src/NpcAct080.cpp b/src/NpcAct080.cpp new file mode 100644 index 0000000..c5fbd72 --- /dev/null +++ b/src/NpcAct080.cpp @@ -0,0 +1,1906 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Back.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Flash.h" +#include "Frame.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +// Gravekeeper +void ActNpc080(NPCHAR *npc) +{ + RECT rcLeft[7] = { + {0, 64, 24, 88}, + {24, 64, 48, 88}, + {0, 64, 24, 88}, + {48, 64, 72, 88}, + {72, 64, 96, 88}, + {96, 64, 120, 88}, + {120, 64, 144, 88}, + }; + + RECT rcRight[7] = { + {0, 88, 24, 112}, + {24, 88, 48, 112}, + {0, 88, 24, 112}, + {48, 88, 72, 112}, + {72, 88, 96, 112}, + {96, 88, 120, 112}, + {120, 88, 144, 112}, + }; + + switch (npc->act_no) + { + case 0: + npc->bits &= ~NPC_SHOOTABLE; + npc->act_no = 1; + npc->damage = 0; + npc->hit.front = 4 * 0x200; + // Fallthrough + case 1: + npc->ani_no = 0; + + if (npc->x - (128 * 0x200) < gMC.x && npc->x + (128 * 0x200) > gMC.x && npc->y - (48 * 0x200) < gMC.y && npc->y + (32 * 0x200) > gMC.y) + { + npc->ani_wait = 0; + npc->act_no = 2; + } + + if (npc->shock) + { + npc->ani_no = 1; + npc->ani_wait = 0; + npc->act_no = 2; + npc->bits &= ~NPC_SHOOTABLE; + } + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + break; + + case 2: + if (++npc->ani_wait > 6) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + if (npc->x - (16 * 0x200) < gMC.x && npc->x + (16 * 0x200) > gMC.x) + { + npc->hit.front = (18 * 0x200); + npc->act_wait = 0; + npc->act_no = 3; + npc->bits |= NPC_SHOOTABLE; + PlaySoundObject(34, SOUND_MODE_PLAY); + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + } + + if (gMC.x < npc->x) + { + npc->direct = gMirrorMode? 2:0; + npc->xm = -0x100; + } + else + { + npc->direct = gMirrorMode? 0:2; + npc->xm = 0x100; + } + + break; + + case 3: + npc->xm = 0; + + if (++npc->act_wait > 40) + { + npc->act_wait = 0; + npc->act_no = 4; + PlaySoundObject(106, SOUND_MODE_PLAY); + } + + npc->ani_no = 4; + break; + + case 4: + npc->damage = 10; + + if (++npc->act_wait > 2) + { + npc->act_wait = 0; + npc->act_no = 5; + } + + npc->ani_no = 5; + break; + + case 5: + npc->ani_no = 6; + + if (++npc->act_wait > 60) + npc->act_no = 0; + + break; + } + + if (npc->xm < 0 && npc->flag & 1) + npc->xm = 0; + if (npc->xm > 0 && npc->flag & 4) + npc->xm = 0; + + npc->ym += 0x20; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + +#ifdef FIX_BUGS + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; +#else + // Caps npc->xm instead of npc->ym + if (npc->ym > 0x5FF) + npc->xm = 0x5FF; + if (npc->ym < -0x5FF) + npc->xm = -0x5FF; +#endif + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Giant pignon +void ActNpc081(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {144, 64, 168, 88}, + {168, 64, 192, 88}, + {192, 64, 216, 88}, + {216, 64, 240, 88}, + {144, 64, 168, 88}, + {240, 64, 264, 88}, + }; + + RECT rcRight[6] = { + {144, 88, 168, 112}, + {168, 88, 192, 112}, + {192, 88, 216, 112}, + {216, 88, 240, 112}, + {144, 88, 168, 112}, + {240, 88, 264, 112}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 100) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + break; + } + + if (Random(0, 150) == 1) + { + if (npc->direct == 0) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + + if (Random(0, 150) == 1) + { + npc->act_no = 3; + npc->act_wait = 50; + npc->ani_no = 0; + break; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->act_no = 4; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (--npc->act_wait == 0) + npc->act_no = 0; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 2; + + if (npc->flag & 1) + { + npc->direct = gMirrorMode? 0:2; + npc->xm = 0x200; + } + + if (npc->flag & 4) + { + npc->direct = gMirrorMode? 2:0; + npc->xm = -0x200; + } + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + break; + + case 5: + if (npc->flag & 8) + npc->act_no = 0; + + break; + } + + switch (npc->act_no) + { + case 1: + case 2: + case 4: + if (npc->shock) + { + npc->ym = -0x200; + npc->ani_no = 5; + npc->act_no = 5; + + if (npc->x < gMC.x) + npc->xm = 0x100; + else + npc->xm = -0x100; + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Misery (standing) +void ActNpc082(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 2; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 3; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 2; + } + + break; + + case 15: + npc->act_no = 16; + npc->act_wait = 0; + npc->ani_no = 4; + // Fallthrough + case 16: + if (++npc->act_wait == 30) + { + PlaySoundObject(21, SOUND_MODE_PLAY); + SetNpChar(66, npc->x, npc->y - (16 * 0x200), 0, 0, 0, npc, 0); + } + + if (npc->act_wait == 50) + npc->act_no = 14; + + break; + + case 20: + npc->act_no = 21; + npc->ani_no = 0; + npc->ym = 0; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 21: + npc->ym -= 0x20; + + if (npc->y < -8 * 0x200) + npc->cond = 0; + + break; + + case 25: + npc->act_no = 26; + npc->act_wait = 0; + npc->ani_no = 5; + npc->ani_wait = 0; + // Fallthrough + case 26: + if (++npc->ani_no > 7) + npc->ani_no = 5; + + if (++npc->act_wait == 30) + { + PlaySoundObject(101, SOUND_MODE_PLAY); + SetFlash(0, 0, FLASH_MODE_FLASH); + npc->act_no = 27; + npc->ani_no = 7; + } + + break; + + case 27: + if (++npc->act_wait == 50) + { + npc->act_no = 0; + npc->ani_no = 0; + } + + break; + + case 30: + npc->act_no = 31; + npc->ani_no = 3; + npc->ani_wait = 0; + // Fallthrough + case 31: + if (++npc->ani_wait > 10) + { + npc->act_no = 32; + npc->ani_no = 4; + npc->ani_wait = 0; + } + + break; + + case 32: + if (++npc->ani_wait > 100) + { + npc->act_no = 1; + npc->ani_no = 2; + } + + break; + + case 40: + npc->act_no = 41; + npc->act_wait = 0; + // Fallthrough + case 41: + npc->ani_no = 4; + + switch (++npc->act_wait) + { + case 30: + case 40: + case 50: + SetNpChar(11, npc->x + (8 * 0x200), npc->y - (8 * 0x200), 0x600, Random(-0x200, 0), 0, NULL, 0x100); + PlaySoundObject(33, SOUND_MODE_PLAY); + break; + } + + if (npc->act_wait > 50) + npc->act_no = 0; + + break; + + case 50: + npc->ani_no = 8; + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rcLeft[9] = { + {80, 0, 96, 16}, + {96, 0, 112, 16}, + {112, 0, 128, 16}, + {128, 0, 144, 16}, + {144, 0, 160, 16}, + {160, 0, 176, 16}, + {176, 0, 192, 16}, + {144, 0, 160, 16}, + {208, 64, 224, 80}, + }; + + RECT rcRight[9] = { + {80, 16, 96, 32}, + {96, 16, 112, 32}, + {112, 16, 128, 32}, + {128, 16, 144, 32}, + {144, 16, 160, 32}, + {160, 16, 176, 32}, + {176, 16, 192, 32}, + {144, 16, 160, 32}, + {208, 80, 224, 96}, + }; + + if (npc->act_no == 11) + { + if (npc->ani_wait != 0) + { + --npc->ani_wait; + npc->ani_no = 1; + } + else + { + if (Random(0, 100) == 1) + npc->ani_wait = 30; + + npc->ani_no = 0; + } + } + + if (npc->act_no == 14) + { + if (npc->ani_wait != 0) + { + --npc->ani_wait; + npc->ani_no = 3; + } + else + { + if (Random(0, 100) == 1) + npc->ani_wait = 30; + + npc->ani_no = 2; + } + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Igor (cutscene) +void ActNpc083(NPCHAR *npc) +{ + RECT rcLeft[8] = { + {0, 0, 40, 40}, + {40, 0, 80, 40}, + {80, 0, 120, 40}, + {0, 0, 40, 40}, + {120, 0, 160, 40}, + {0, 0, 40, 40}, + {160, 0, 200, 40}, + {200, 0, 240, 40}, + }; + + RECT rcRight[8] = { + {0, 40, 40, 80}, + {40, 40, 80, 80}, + {80, 40, 120, 80}, + {0, 40, 40, 80}, + {120, 40, 160, 80}, + {0, 40, 40, 80}, + {160, 40, 200, 80}, + {200, 40, 240, 80}, + }; + + switch (npc->act_no) + { + case 0: + npc->xm = 0; + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (++npc->ani_wait > 5) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + + case 2: + npc->act_no = 3; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 3: + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + break; + + case 4: + npc->xm = 0; + npc->act_no = 5; + npc->act_wait = 0; + npc->ani_no = 6; + // Fallthrough + case 5: + if (++npc->act_wait > 10) + { + npc->act_wait = 0; + npc->act_no = 6; + npc->ani_no = 7; + PlaySoundObject(70, SOUND_MODE_PLAY); + } + + break; + + case 6: + if (++npc->act_wait > 8) + { + npc->act_no = 0; + npc->ani_no = 0; + } + + break; + + case 7: + npc->act_no = 1; + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Basu projectile (Egg Corridor) +void ActNpc084(NPCHAR *npc) +{ + if (npc->flag & 0xFF) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rect_left[4] = { + {48, 48, 64, 64}, + {64, 48, 80, 64}, + {48, 64, 64, 80}, + {64, 64, 80, 80}, + }; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->count1 > 300) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } +} + +// Terminal +void ActNpc085(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {256, 96, 272, 120}, + {256, 96, 272, 120}, + {272, 96, 288, 120}, + }; + + RECT rcRight[3] = { + {256, 96, 272, 120}, + {288, 96, 304, 120}, + {304, 96, 320, 120}, + }; + + switch(npc->act_no) + { + case 0: + npc->ani_no = 0; + + if (npc->x - (8 * 0x200) < gMC.x && npc->x + (8 * 0x200) > gMC.x && npc->y - (16 * 0x200) < gMC.y && npc->y + (8 * 0x200) > gMC.y) + { + PlaySoundObject(43, SOUND_MODE_PLAY); + npc->act_no = 1; + } + + break; + + case 1: + if (++npc->ani_no > 2) + npc->ani_no = 1; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Missile +void ActNpc086(NPCHAR *npc) +{ + RECT rect1[2] = { + {0, 80, 16, 96}, + {16, 80, 32, 96}, + }; + + RECT rect3[2] = { + {0, 112, 16, 128}, + {16, 112, 32, 128}, + }; + + RECT rcLast = {16, 0, 32, 16}; + + if (npc->direct == 0) + { + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + } + + if (gBack.type == BACKGROUND_TYPE_AUTOSCROLL || gBack.type == BACKGROUND_TYPE_CLOUDS_WINDY) + { + if (npc->act_no == 0) + { + npc->act_no = 1; + npc->ym = Random(-0x20, 0x20); + npc->xm = Random(0x7F, 0x100); + } + + npc->xm -= 8; + + if (npc->x < 80 * 0x200) + npc->cond = 0; + + if (npc->x < -3 * 0x200) + npc->x = -3 * 0x200; + + if (npc->flag & 1) + npc->xm = 0x100; + + if (npc->flag & 2) + npc->ym = 0x40; + + if (npc->flag & 8) + npc->ym = -0x40; + + npc->x += npc->xm; + npc->y += npc->ym; + } + + switch (npc->exp) + { + case 1: + npc->rect = rect1[npc->ani_no]; + break; + + case 3: + npc->rect = rect3[npc->ani_no]; + break; + } + + if (npc->direct == 0) + ++npc->count1; + + if (npc->count1 > 550) + npc->cond = 0; + + if (npc->count1 > 500 && npc->count1 / 2 % 2) + npc->rect.right = 0; + + if (npc->count1 > 547) + npc->rect = rcLast; +} + +// Heart +void ActNpc087(NPCHAR *npc) +{ + RECT rect2[2] = { + {32, 80, 48, 96}, + {48, 80, 64, 96}, + }; + + RECT rect6[2] = { + {64, 80, 80, 96}, + {80, 80, 96, 96}, + }; + + RECT rcLast = {16, 0, 32, 16}; + + if (npc->direct == 0) + { + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + } + + if (gBack.type == BACKGROUND_TYPE_AUTOSCROLL || gBack.type == BACKGROUND_TYPE_CLOUDS_WINDY) + { + if (npc->act_no == 0) + { + npc->act_no = 1; + npc->ym = Random(-0x20, 0x20); + npc->xm = Random(0x7F, 0x100); + } + + npc->xm -= 8; + + if (npc->x < 80 * 0x200) + npc->cond = 0; + + if (npc->x < -3 * 0x200) + npc->x = -3 * 0x200; + + if (npc->flag & 1) + npc->xm = 0x100; + + if (npc->flag & 2) + npc->ym = 0x40; + + if (npc->flag & 8) + npc->ym = -0x40; + + npc->x += npc->xm; + npc->y += npc->ym; + } + + switch (npc->exp) + { + case 2: + npc->rect = rect2[npc->ani_no]; + break; + + case 6: + npc->rect = rect6[npc->ani_no]; + break; + } + + if (npc->direct == 0) + ++npc->count1; + + if (npc->count1 > 550) + npc->cond = 0; + + if (npc->count1 > 500 && npc->count1 / 2 % 2) + npc->rect.right = 0; + + if (npc->count1 > 547) + npc->rect = rcLast; +} + +// Igor (boss) +void ActNpc088(NPCHAR *npc) +{ + int i; + unsigned char deg; + int xm, ym; + + RECT rcLeft[12] = { + {0, 0, 40, 40}, + {40, 0, 80, 40}, + {80, 0, 120, 40}, + {0, 0, 40, 40}, + {120, 0, 160, 40}, + {0, 0, 40, 40}, + {160, 0, 200, 40}, + {200, 0, 240, 40}, + {0, 80, 40, 120}, + {40, 80, 80, 120}, + {240, 0, 280, 40}, + {280, 0, 320, 40}, + }; + + RECT rcRight[12] = { + {0, 40, 40, 80}, + {40, 40, 80, 80}, + {80, 40, 120, 80}, + {0, 40, 40, 80}, + {120, 40, 160, 80}, + {0, 40, 40, 80}, + {160, 40, 200, 80}, + {200, 40, 240, 80}, + {120, 80, 160, 120}, + {160, 80, 200, 120}, + {240, 40, 280, 80}, + {280, 40, 320, 80}, + }; + + switch (npc->act_no) + { + case 0: + npc->xm = 0; + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (++npc->ani_wait > 5) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (++npc->act_wait > 50) + npc->act_no = 2; + + break; + + case 2: + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 2; + npc->ani_wait = 0; + + if (++npc->count1 < 3 || npc->life > 150) + { + npc->count2 = 0; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + else + { + npc->count2 = 1; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + // Fallthrough + case 3: + ++npc->act_wait; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + if (npc->count2) + { + if (npc->act_wait > 16) + { + npc->act_no = 9; + npc->xm = 0; + npc->ani_no = 10; + break; + } + } + else if (npc->act_wait > 50) + { + npc->ani_no = 8; + npc->ym = -0x400; + npc->act_no = 7; + npc->act_wait = 0; + npc->xm = (npc->xm * 3) / 2; + npc->damage = 2; + break; + } + else + { + if (npc->direct == 0) + { + if (npc->x - (24 * 0x200) < gMC.x) + npc->act_no = 4; + } + else + { + if (npc->x + (24 * 0x200) > gMC.x) + npc->act_no = 4; + } + } + + break; + + case 4: + npc->xm = 0; + npc->act_no = 5; + npc->act_wait = 0; + npc->ani_no = 6; + // Fallthrough + case 5: + if (++npc->act_wait > 12) + { + npc->act_wait = 0; + npc->act_no = 6; + npc->ani_no = 7; + PlaySoundObject(70, SOUND_MODE_PLAY); + npc->damage = 5; + npc->hit.front = 24 * 0x200; + npc->hit.top = 1; + } + + break; + + case 6: + if (++npc->act_wait > 10) + { + npc->act_no = 0; + npc->ani_no = 0; + npc->damage = 0; + npc->hit.front = 8 * 0x200; + npc->hit.top = 16 * 0x200; + } + + break; + + case 7: + if (npc->flag & 8) + { + npc->act_no = 8; + npc->ani_no = 9; + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(30); + npc->damage = 0; + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + } + + break; + + case 8: + npc->xm = 0; + + if (++npc->act_wait > 10) + { + npc->act_no = 0; + npc->ani_no = 0; + npc->damage = 0; + } + + break; + + case 9: + npc->act_no = 10; + npc->act_wait = 0; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + // Fallthrough + case 10: + if (++npc->act_wait > 100 && npc->act_wait % 6 == 1) + { + if (npc->direct == 0) + deg = 0x88; + else + deg = 0xF8; + + deg += (unsigned char)Random(-0x10, 0x10); + ym = GetSin(deg) * 3; + xm = GetCos(deg) * 3; + SetNpChar(11, npc->x, npc->y + (4 * 0x200), xm, ym, 0, NULL, 0x100); + + PlaySoundObject(12, SOUND_MODE_PLAY); + } + + if (npc->act_wait > 50 && npc->act_wait / 2 % 2) + npc->ani_no = 11; + else + npc->ani_no = 10; + + if (npc->act_wait > 132) + { + npc->act_no = 0; + npc->ani_no = 0; + npc->count1 = 0; + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Igor (defeated) +void ActNpc089(NPCHAR *npc) +{ + int i; + + RECT rcLeft[4] = { + {80, 80, 120, 120}, + {240, 80, 264, 104}, + {264, 80, 288, 104}, + {288, 80, 312, 104}, + }; + + RECT rcRight[4] = { + {200, 80, 240, 120}, + {240, 104, 264, 128}, + {264, 104, 288, 128}, + {288, 104, 312, 128}, + }; + + switch (npc->act_no) + { + case 0: + PlaySoundObject(72, SOUND_MODE_PLAY); + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + for (i = 0; i < 8; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + npc->act_no = 1; + // Fallthrough + case 1: + if (++npc->act_wait > 100) + { + npc->act_wait = 0; + npc->act_no = 2; + } + + if (npc->act_wait % 5 == 0) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + if (npc->direct == 0) + npc->rect = rcLeft[0]; + else + npc->rect = rcRight[0]; + + if (npc->act_wait / 2 % 2) + --npc->rect.left; + + break; + + case 2: + if (++npc->act_wait / 2 % 2 && npc->act_wait < 100) + { + npc->ani_no = 0; + npc->view.back = 20 * 0x200; + npc->view.front = 20 * 0x200; + npc->view.top = 20 * 0x200; + } + else + { + npc->ani_no = 1; + npc->view.back = 12 * 0x200; + npc->view.front = 12 * 0x200; + npc->view.top = 8 * 0x200; + } + + if (npc->act_wait > 150) + { + npc->act_wait = 0; + npc->act_no = 3; + npc->ani_no = 1; + } + + if (npc->act_wait % 9 == 0) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + break; + + case 3: + if (++npc->ani_wait > 50) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no == 3) + npc->act_no = 4; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; +} + +// Background +void ActNpc090(NPCHAR *npc) +{ + RECT rect = {280, 80, 296, 104}; + + npc->rect = rect; +} + +// Cage +void ActNpc091(NPCHAR *npc) +{ + RECT rect = {96, 88, 128, 112}; + + if (npc->act_no == 0) + { + ++npc->act_no; + npc->y += 16 * 0x200; + } + + npc->rect = rect; +} + +// Sue at PC +void ActNpc092(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {272, 216, 288, 240}, + {288, 216, 304, 240}, + {304, 216, 320, 240}, + }; + + switch (npc->act_no) + { + case 0: + npc->x -= 4 * 0x200; + npc->y += 16 * 0x200; + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (Random(0, 80) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (Random(0, 120) == 10) + { + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 2; + } + + break; + + case 2: + if (++npc->act_wait > 40) + { + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 2; + } + + break; + + case 3: + if (++npc->act_wait > 80) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + npc->rect = rcLeft[npc->ani_no]; +} + +// Chaco +void ActNpc093(NPCHAR *npc) +{ + RECT rcLeft[7] = { + {128, 0, 144, 16}, + {144, 0, 160, 16}, + {160, 0, 176, 16}, + {128, 0, 144, 16}, + {176, 0, 192, 16}, + {128, 0, 144, 16}, + {32, 32, 48, 48}, + }; + + RECT rcRight[7] = { + {128, 16, 144, 32}, + {144, 16, 160, 32}, + {160, 16, 176, 32}, + {128, 16, 144, 32}, + {176, 16, 192, 32}, + {128, 16, 144, 32}, + {32, 32, 48, 48}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (32 * 0x200) < gMC.x && npc->x + (32 * 0x200) > gMC.x && npc->y - (32 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->act_no = 4; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->x -= 1 * 0x200; + else + npc->x += 1 * 0x200; + + break; + + case 10: + npc->ani_no = 6; + + if (++npc->act_wait > 200) + { + npc->act_wait = 0; + SetCaret(npc->x, npc->y, CARET_ZZZ, DIR_LEFT); + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Kulala +void ActNpc094(NPCHAR *npc) +{ + RECT rect[5] = { + {272, 0, 320, 24}, + {272, 24, 320, 48}, + {272, 48, 320, 72}, + {272, 72, 320, 96}, + {272, 96, 320, 120}, + }; + + switch (npc->act_no) + { + case 0: + npc->ani_no = 4; + + if (npc->shock) + { + npc->ani_no = 0; + npc->act_no = 10; + npc->act_wait = 0; + } + + break; + + case 10: + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + + if (++npc->act_wait > 40) + { + npc->act_wait = 0; + npc->ani_wait = 0; + npc->act_no = 11; + } + + break; + + case 11: + if (++npc->ani_wait > 5) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + { + npc->act_no = 12; + npc->ani_no = 3; + } + + break; + + case 12: + npc->ym = -0x155; + + if (++npc->act_wait > 20) + { + npc->act_wait = 0; + npc->act_no = 10; + npc->ani_no = 0; + } + + break; + + case 20: + npc->xm /= 2; + npc->ym += 0x20; + + if (npc->shock == 0) + { + npc->act_wait = 30; + npc->act_no = 10; + npc->ani_no = 0; + } + + break; + } + + if (npc->shock) + { + if (++npc->count2 > 12) + { + npc->act_no = 20; + npc->ani_no = 4; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + } + } + else + { + npc->count2 = 0; + } + + if (npc->act_no >= 10) + { + if (npc->flag & 1) + { + npc->count1 = 50; + npc->direct = gMirrorMode? 0:2; + } + + if (npc->flag & 4) + { + npc->count1 = 50; + npc->direct = gMirrorMode? 2:0; + } + + if (npc->count1 != 0) + { + --npc->count1; + + if (npc->direct == 0) + npc->xm -= 0x80; + else + npc->xm += 0x80; + } + else + { + npc->count1 = 50; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + npc->ym += 0x10; + + if (npc->flag & 8) + npc->ym = -0x400; + } + + if (npc->xm > 0x100) + npc->xm = 0x100; + if (npc->xm < -0x100) + npc->xm = -0x100; + + if (npc->ym > 0x300) + npc->ym = 0x300; + if (npc->ym < -0x300) + npc->ym = -0x300; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rect[npc->ani_no]; +} + +// Jelly +void ActNpc095(NPCHAR *npc) +{ + RECT rcLeft[4] = { + {208, 64, 224, 80}, + {224, 64, 240, 80}, + {240, 64, 256, 80}, + {256, 64, 272, 80}, + }; + + RECT rcRight[4] = { + {208, 80, 224, 96}, + {224, 80, 240, 96}, + {240, 80, 256, 96}, + {256, 80, 272, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = Random(0, 50); + npc->tgt_y = npc->y; + npc->tgt_x = npc->x; + + if (npc->direct == 0) + npc->xm = gMirrorMode? -0x200:0x200; + else + npc->xm = gMirrorMode? 0x200:-0x200; + // Fallthrough + case 1: + if (--npc->act_wait > 0) + break; + + npc->act_no = 10; + // Fallthrough + case 10: + if (++npc->act_wait > 10) + { + npc->act_wait = 0; + npc->ani_wait = 0; + npc->act_no = 11; + } + + break; + + case 11: + if (++npc->ani_wait > 5) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no == 2) + { + if (npc->direct == 0) + npc->xm -= gMirrorMode? -0x100:0x100; + else + npc->xm += gMirrorMode? -0x100:0x100; + + npc->ym -= 0x200; + } + + if (npc->ani_no > 2) + { + npc->act_no = 12; + npc->ani_no = 3; + } + + break; + + case 12: + ++npc->act_wait; + + if (npc->y > npc->tgt_y && npc->act_wait > 10) + { + npc->act_wait = 0; + npc->act_no = 10; + npc->ani_no = 0; + } + + break; + } + + if (npc->x > npc->tgt_x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->flag & 1) + { + npc->count1 = 50; + npc->direct = gMirrorMode? 0:2; + } + + if (npc->flag & 4) + { + npc->count1 = 50; + npc->direct = gMirrorMode? 2:0; + } + + npc->ym += 0x20; + + if (npc->flag & 8) + npc->ym = -0x400; + + if (npc->xm > 0x100) + npc->xm = 0x100; + if (npc->xm < -0x100) + npc->xm = -0x100; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->shock) + { + npc->x += npc->xm / 2; + npc->y += npc->ym / 2; + } + else + { + npc->x += npc->xm; + npc->y += npc->ym; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Fan (left) +void ActNpc096(NPCHAR *npc) +{ + RECT rc[3] = { + {272, 120, 288, 136}, + {288, 120, 304, 136}, + {304, 120, 320, 136}, + }; + + switch (npc->act_no) + { + case 0: + if (npc->direct == 2) + npc->act_no = 2; + else + npc->ani_no = 1; + + // Fallthrough + case 1: + npc->ani_no = 0; + break; + + case 2: + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (gMC.x > npc->x - (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.x < npc->x + (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.y > npc->y - (((WINDOW_HEIGHT / 2) + 120) * 0x200) && gMC.y < npc->y + (((WINDOW_HEIGHT / 2) + 120) * 0x200)) + { + if (Random(0, 5) == 1) + SetNpChar(199, npc->x, npc->y + (Random(-8, 8) * 0x200), 0, 0, 0, NULL, 0x100); + } + + if (gMC.y < npc->y + (8 * 0x200) && gMC.y > npc->y - (8 * 0x200) && gMC.x < npc->x && gMC.x > npc->x - (96 * 0x200)) + { + gMC.xm -= 0x88; + gMC.cond |= 0x20; + } + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Fan (up) +void ActNpc097(NPCHAR *npc) +{ + RECT rc[3] = { + {272, 136, 288, 152}, + {288, 136, 304, 152}, + {304, 136, 320, 152}, + }; + + switch (npc->act_no) + { + case 0: + if (npc->direct == 2) + npc->act_no = 2; + else + npc->ani_no = 1; + + // Fallthrough + case 1: + npc->ani_no = 0; + break; + + case 2: + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (gMC.x > npc->x - (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.x < npc->x + (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.y > npc->y - (((WINDOW_HEIGHT / 2) + 120) * 0x200) && gMC.y < npc->y + (((WINDOW_HEIGHT / 2) + 120) * 0x200)) + { + if (Random(0, 5) == 1) + SetNpChar(199, npc->x + (Random(-8, 8) * 0x200), npc->y, 0, 0, 1, NULL, 0x100); + } + + if (gMC.x < npc->x + (8 * 0x200) && gMC.x > npc->x - (8 * 0x200) && gMC.y < npc->y && gMC.y > npc->y - (96 * 0x200)) + gMC.ym -= 0x88; + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Fan (right) +void ActNpc098(NPCHAR *npc) +{ + RECT rc[3] = { + {272, 152, 288, 168}, + {288, 152, 304, 168}, + {304, 152, 320, 168}, + }; + + switch (npc->act_no) + { + case 0: + if (npc->direct == 2) + npc->act_no = 2; + else + npc->ani_no = 1; + + // Fallthrough + case 1: + npc->ani_no = 0; + break; + + case 2: + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (gMC.x > npc->x - (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.x < npc->x + (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.y > npc->y - (((WINDOW_HEIGHT / 2) + 120) * 0x200) && gMC.y < npc->y + (((WINDOW_HEIGHT / 2) + 120) * 0x200)) + { + if (Random(0, 5) == 1) + SetNpChar(199, npc->x, npc->y + (Random(-8, 8) * 0x200), 0, 0, 2, NULL, 0x100); + } + + if (gMC.y < npc->y + (8 * 0x200) && gMC.y > npc->y - (8 * 0x200) && gMC.x < npc->x + (96 * 0x200) && gMC.x > npc->x) + { + gMC.xm += 0x88; + gMC.cond |= 0x20; + } + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Fan (down) +void ActNpc099(NPCHAR *npc) +{ + RECT rc[3] = { + {272, 168, 288, 184}, + {288, 168, 304, 184}, + {304, 168, 320, 184}, + }; + + switch (npc->act_no) + { + case 0: + if (npc->direct == 2) + npc->act_no = 2; + else + npc->ani_no = 1; + + // Fallthrough + case 1: + npc->ani_no = 0; + break; + + case 2: + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (gMC.x > npc->x - (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.x < npc->x + (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.y > npc->y - (((WINDOW_HEIGHT / 2) + 120) * 0x200) && gMC.y < npc->y + (((WINDOW_HEIGHT / 2) + 120) * 0x200)) + { + if (Random(0, 5) == 1) + SetNpChar(199, npc->x + (Random(-8, 8) * 0x200), npc->y, 0, 0, 3, NULL, 0x100); + } + + if (gMC.x < npc->x + (8 * 0x200) && gMC.x > npc->x - (8 * 0x200) && gMC.y < npc->y + (96 * 0x200) && gMC.y > npc->y) + gMC.ym += 0x88; + + break; + } + + npc->rect = rc[npc->ani_no]; +} diff --git a/src/NpcAct100.cpp b/src/NpcAct100.cpp new file mode 100644 index 0000000..5b1334c --- /dev/null +++ b/src/NpcAct100.cpp @@ -0,0 +1,1748 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "TextScr.h" + +// Grate +void ActNpc100(NPCHAR *npc) +{ + RECT rc[2] = { + {272, 48, 288, 64}, + {272, 48, 288, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->y += 16 * 0x200; + npc->act_no = 1; + break; + } + + if (npc->direct == 0) + npc->rect = rc[0]; + else + npc->rect = rc[1]; +} + +// Malco computer screen +void ActNpc101(NPCHAR *npc) +{ + RECT rect[3] = { + {240, 136, 256, 152}, + {240, 136, 256, 152}, + {256, 136, 272, 152}, + }; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + npc->rect = rect[npc->ani_no]; +} + +// Malco computer wave +void ActNpc102(NPCHAR *npc) +{ + RECT rect[4] = { + {208, 120, 224, 136}, + {224, 120, 240, 136}, + {240, 120, 256, 136}, + {256, 120, 272, 136}, + }; + + if (npc->act_no == 0) + { + npc->act_no = 1; + npc->y += 8 * 0x200; + } + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + npc->rect = rect[npc->ani_no]; +} + +// Mannan projectile +void ActNpc103(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {192, 96, 208, 120}, + {208, 96, 224, 120}, + {224, 96, 240, 120}, + }; + + RECT rcRight[3] = { + {192, 120, 208, 144}, + {208, 120, 224, 144}, + {224, 120, 240, 144}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->direct == 0) + npc->xm -= 0x20; + else + npc->xm += 0x20; + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + break; + } + + npc->x += npc->xm; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (++npc->count1 > 100) + npc->cond = 0; + + if (npc->count1 % 4 == 1) + PlaySoundObject(46, SOUND_MODE_PLAY); +} + +// Frog +void ActNpc104(NPCHAR *npc) +{ + BOOL bJump; + + RECT rcLeft[3] = { + {0, 112, 32, 144}, + {32, 112, 64, 144}, + {64, 112, 96, 144}, + }; + + RECT rcRight[3] = { + {0, 144, 32, 176}, + {32, 144, 64, 176}, + {64, 144, 96, 176}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + + if (npc->direct == 4) + { + if (Random(0, 1)) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->bits |= NPC_IGNORE_SOLIDITY; + npc->ani_no = 2; + npc->act_no = 3; + break; + } + + npc->bits &= ~NPC_IGNORE_SOLIDITY; + // Fallthrough + case 1: + ++npc->act_wait; + + if (Random(0, 50) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 0; + npc->ani_wait = 0; + break; + } + + break; + + case 2: + ++npc->act_wait; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->act_wait > 18) + { + npc->act_no = 1; + npc->act_no = 1; // Duplicate line + } + + break; + + case 3: + if (++npc->act_wait > 40) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (npc->flag & 8) + { + npc->act_no = 0; + npc->ani_no = 0; + npc->act_wait = 0; + } + + break; + + case 10: + npc->act_no = 11; + // Fallthrough + case 11: + if (npc->flag & 1 && npc->xm < 0) + { + npc->xm *= -1; + npc->direct = gMirrorMode? 0:2; + } + + if (npc->flag & 4 && npc->xm > 0) + { + npc->xm *= -1; + npc->direct = gMirrorMode? 2:0; + } + + if (npc->flag & 8) + { + npc->act_no = 0; + npc->ani_no = 0; + npc->act_wait = 0; + } + + break; + } + + bJump = FALSE; + + if (npc->act_no < 10 && npc->act_no != 3 && npc->act_wait > 10) + { + if (npc->shock) + bJump = TRUE; + + if (npc->x < gMC.x - (160 * 0x200) || npc->x > gMC.x + (160 * 0x200) || npc->y < gMC.y - (64 * 0x200) || npc->y > gMC.y + (64 * 0x200)) + { + // This blank space is needed for the function to produce the same assembly. + // Chances are there used to be some commented-out code here. + } + else + { + if (Random(0, 50) == 2) + bJump = TRUE; + } + } + + if (bJump) + { + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + npc->act_no = 10; + npc->ani_no = 2; + npc->ym = -0x5FF; + + if (!(gMC.cond & 2)) + PlaySoundObject(30, SOUND_MODE_PLAY); + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + } + + npc->ym += 0x80; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// "HEY!" speech bubble (low) +void ActNpc105(NPCHAR *npc) +{ + RECT rect[2] = { + {128, 32, 144, 48}, + {128, 32, 128, 32}, + }; + + if (++npc->act_wait > 30) + npc->cond = 0; + + if (npc->act_wait < 5) + npc->y -= 1 * 0x200; + + npc->rect = rect[npc->ani_no]; +} + +// "HEY!" speech bubble (high) +void ActNpc106(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + SetNpChar(105, npc->x, npc->y - (8 * 0x200), 0, 0, 0, NULL, 0x180); + npc->act_no = 1; + break; + } +} + +// Malco +void ActNpc107(NPCHAR *npc) +{ + int i; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 2) + npc->ani_no = 5; + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_wait = 0; + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x, npc->y, Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + // Fallthrough + case 11: + if (++npc->ani_wait > 1) + { + PlaySoundObject(43, SOUND_MODE_PLAY); + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (++npc->act_wait > 100) + npc->act_no = 12; + + break; + + case 12: + npc->act_no = 13; + npc->act_wait = 0; + npc->ani_no = 1; + // Fallthrough + case 13: + if (++npc->act_wait > 50) + npc->act_no = 14; + + break; + + case 14: + npc->act_no = 15; + npc->act_wait = 0; + // Fallthrough + case 15: + if (npc->act_wait / 2 % 2) + { + npc->x += 1 * 0x200; + PlaySoundObject(11, SOUND_MODE_PLAY); + } + else + { + npc->x -= 1 * 0x200; + } + + if (++npc->act_wait > 50) + npc->act_no = 16; + + break; + + case 16: + npc->act_no = 17; + npc->act_wait = 0; + npc->ani_no = 2; + PlaySoundObject(12, SOUND_MODE_PLAY); + + for (i = 0; i < 8; ++i) + SetNpChar(4, npc->x, npc->y, Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + // Fallthrough + case 17: + if (++npc->act_wait > 150) + npc->act_no = 18; + + break; + + case 18: + npc->act_no = 19; + npc->act_wait = 0; + npc->ani_no = 3; + npc->ani_wait = 0; + // Fallthrough + case 19: + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + { + PlaySoundObject(11, SOUND_MODE_PLAY); + npc->ani_no = 3; + } + + if (++npc->act_wait > 100) + { + npc->act_no = 20; + PlaySoundObject(12, SOUND_MODE_PLAY); + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x, npc->y, Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + } + + break; + + case 20: + npc->ani_no = 4; + break; + + case 21: + npc->act_no = 22; + npc->ani_no = 5; + PlaySoundObject(51, SOUND_MODE_PLAY); + break; + + case 100: + npc->act_no = 101; + npc->ani_no = 6; + npc->ani_wait = 0; + // Fallthrough + case 101: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 9) + npc->ani_no = 6; + + break; + + case 110: + SetDestroyNpChar(npc->x, npc->y, 0x2000, 16); + npc->cond = 0; + break; + } + + RECT rcPoweron[10] = { + {144, 0, 160, 24}, + {160, 0, 176, 24}, + {176, 0, 192, 24}, + {192, 0, 208, 24}, + {208, 0, 224, 24}, + {224, 0, 240, 24}, + {176, 0, 192, 24}, + {192, 0, 208, 24}, + {208, 0, 224, 24}, + {192, 0, 208, 24}, + }; + + npc->rect = rcPoweron[npc->ani_no]; +} + +// Balfrog projectile +void ActNpc108(NPCHAR *npc) +{ + if (npc->flag & 0xFF) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rect_left[3] = { + {96, 48, 112, 64}, + {112, 48, 128, 64}, + {128, 48, 144, 64}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->count1 > 300) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } +} + +// Malco (broken) +void ActNpc109(NPCHAR *npc) +{ + int i; + + RECT rcLeft[2] = { + {240, 0, 256, 24}, + {256, 0, 272, 24}, + }; + + RECT rcRight[2] = { + {240, 24, 256, 48}, + {256, 24, 272, 48}, + }; + + switch (npc->act_no) + { + case 0: + if (--npc->act_wait != 0) + npc->act_no = 1; + + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (32 * 0x200) < gMC.x && npc->x + (32 * 0x200) > gMC.x && npc->y - (32 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 0; + PlaySoundObject(12, SOUND_MODE_PLAY); + + for (i = 0; i < 8; ++i) + SetNpChar(4, npc->x, npc->y, Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Puchi +void ActNpc110(NPCHAR *npc) +{ + BOOL bJump; + + RECT rcLeft[3] = { + {96, 128, 112, 144}, + {112, 128, 128, 144}, + {128, 128, 144, 144}, + }; + + RECT rcRight[3] = { + {96, 144, 112, 160}, + {112, 144, 128, 160}, + {128, 144, 144, 160}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + + if (npc->direct == 4) + { + if (Random(0, 1)) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->bits |= NPC_IGNORE_SOLIDITY; + npc->ani_no = 2; + npc->act_no = 3; + + break; + } + + npc->bits &= ~NPC_IGNORE_SOLIDITY; + // Fallthrough + case 1: + ++npc->act_wait; + + if (Random(0, 50) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 0; + npc->ani_wait = 0; + break; + } + + break; + + case 2: + ++npc->act_wait; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->act_wait > 18) + { + npc->act_no = 1; + npc->act_no = 1; // Duplicate line + } + + break; + + case 3: + if (++npc->act_wait > 40) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (npc->flag & 8) + { + npc->act_no = 0; + npc->ani_no = 0; + npc->act_wait = 0; + } + + break; + + case 10: + npc->act_no = 11; + // Fallthrough + case 11: + if (npc->flag & 1 && npc->xm < 0) + { + npc->xm *= -1; + npc->direct = gMirrorMode? 0:2; + } + + if (npc->flag & 4 && npc->xm > 0) + { + npc->xm *= -1; + npc->direct = gMirrorMode? 2:0; + } + + if (npc->flag & 8) + { + npc->act_no = 0; + npc->ani_no = 0; + npc->act_wait = 0; + } + + break; + } + + bJump = FALSE; + + if (npc->act_no < 10 && npc->act_no != 3 && npc->act_wait > 10) + { + if (npc->shock) + bJump = TRUE; + + if (npc->x < gMC.x - (160 * 0x200) || npc->x > gMC.x + (160 * 0x200) || npc->y < gMC.y - (64 * 0x200) || npc->y > gMC.y + (64 * 0x200)) + { + // This blank space is needed for the function to produce the same assembly. + // Chances are there used to be some commented-out code here. + } + else + { + if (Random(0, 50) == 2) + bJump = TRUE; + } + } + + if (bJump) + { + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + npc->act_no = 10; + npc->ani_no = 2; + npc->ym = -0x2FF; + PlaySoundObject(6, SOUND_MODE_PLAY); + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + } + + npc->ym += 0x80; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Quote (teleport out) +void ActNpc111(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + }; + + RECT rcRight[2] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->y -= 16 * 0x200; + break; + + case 1: + if (++npc->act_wait > 20) + { + npc->act_wait = 0; + npc->act_no = 2; + npc->ani_no = 1; + npc->ym = -0x2FF; + } + + break; + + case 2: + if (npc->ym > 0) + npc->hit.bottom = 16 * 0x200; + + if (npc->flag & 8) + { + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 0; + } + + break; + + case 3: + if (++npc->act_wait > 40) + { + npc->act_no = 4; + npc->act_wait = 64; + PlaySoundObject(29, SOUND_MODE_PLAY); + } + + break; + + case 4: + --npc->act_wait; + npc->ani_no = 0; + + if (npc->act_wait == 0) + npc->cond = 0; + + break; + } + + npc->ym += 0x40; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + npc->rect.top += 32 * gMIMCurrentNum; + npc->rect.bottom += 32 * gMIMCurrentNum; + +#ifndef ENABLE_MIM_DISABLE_EQUIP_40_GRAPHICS + // Use a different sprite if the player is wearing the Mimiga Mask + if (gMC.equip & EQUIP_MIMIGA_MASK) + { + npc->rect.top += 32; + npc->rect.bottom += 32; + } +#endif + + if (npc->act_no == 4) + { + npc->rect.bottom = npc->rect.top + (npc->act_wait / 4); + + if (npc->act_wait / 2 % 2) + ++npc->rect.left; + } +} + +// Quote (teleport in) +void ActNpc112(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + }; + + RECT rcRight[2] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->x += 16 * 0x200; + npc->y += 8 * 0x200; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 1: + if (++npc->act_wait == 64) + { + npc->act_no = 2; + npc->act_wait = 0; + } + + break; + + case 2: + if (++npc->act_wait > 20) + { + npc->act_no = 3; + npc->ani_no = 1; + npc->hit.bottom = 8 * 0x200; + } + + break; + + case 3: + if (npc->flag & 8) + { + npc->act_no = 4; + npc->act_wait = 0; + npc->ani_no = 0; + } + + break; + } + + npc->ym += 0x40; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + npc->rect.top += 32 * gMIMCurrentNum; + npc->rect.bottom += 32 * gMIMCurrentNum; +#ifndef ENABLE_MIM_DISABLE_EQUIP_40_GRAPHICS + // Use a different sprite if the player is wearing the Mimiga Mask + if (gMC.equip & EQUIP_MIMIGA_MASK) + { + npc->rect.top += 32; + npc->rect.bottom += 32; + } +#endif + + if (npc->act_no == 1) + { + npc->rect.bottom = npc->rect.top + (npc->act_wait / 4); + + if (npc->act_wait / 2 % 2) + ++npc->rect.left; + } +} + +// Professor Booster +void ActNpc113(NPCHAR *npc) +{ + RECT rcLeft[7] = { + {224, 0, 240, 16}, + {240, 0, 256, 16}, + {256, 0, 272, 16}, + {224, 0, 240, 16}, + {272, 0, 288, 16}, + {224, 0, 240, 16}, + {288, 0, 304, 16}, + }; + + RECT rcRight[7] = { + {224, 16, 240, 32}, + {240, 16, 256, 32}, + {256, 16, 272, 32}, + {224, 16, 240, 32}, + {272, 16, 288, 32}, + {224, 16, 240, 32}, + {288, 16, 304, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->act_no = 4; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->x -= 1 * 0x200; + else + npc->x += 1 * 0x200; + + break; + + case 5: + npc->ani_no = 6; + break; + + case 30: + npc->act_no = 31; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->hit.bottom = 16 * 0x200; + npc->x -= 16 * 0x200; + npc->y += 8 * 0x200; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 31: + if (++npc->act_wait == 64) + { + npc->act_no = 32; + npc->act_wait = 0; + } + + break; + + case 32: + if (++npc->act_wait > 20) + { + npc->act_no = 33; + npc->ani_no = 1; + npc->hit.bottom = 8 * 0x200; + } + + break; + + case 33: + if (npc->flag & 8) + { + npc->act_no = 34; + npc->act_wait = 0; + npc->ani_no = 0; + } + + break; + } + + npc->ym += 0x40; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->act_no == 31) + { + npc->rect.bottom = npc->rect.top + (npc->act_wait / 4); + + if (npc->act_wait / 2 % 2) + ++npc->rect.left; + } +} + +// Press +void ActNpc114(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {144, 112, 160, 136}, + {160, 112, 176, 136}, + {176, 112, 192, 136}, + }; + + int i; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 4 * 0x200; + // Fallthrough + case 1: + if (npc->flag & 8) + { + // Chances are there used to be commented-out code here + } + else + { + npc->act_no = 10; + npc->ani_wait = 0; + npc->ani_no = 1; + } + + break; + + case 10: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 2; + + if (gMC.y > npc->y) + { + npc->bits &= ~NPC_SOLID_HARD; + npc->damage = 0x7F; + } + else + { + npc->bits |= NPC_SOLID_HARD; + npc->damage = 0; + } + + if (npc->flag & 8) + { + if (npc->ani_no > 1) + { + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x, npc->y, Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(10); + } + + npc->act_no = 1; + npc->ani_no = 0; + npc->damage = 0; + npc->bits |= NPC_SOLID_HARD; + } + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + npc->rect = rcLeft[npc->ani_no]; +} + +// Ravil +void ActNpc115(NPCHAR *npc) +{ + int i; + + RECT rcLeft[6] = { + {0, 120, 24, 144}, + {24, 120, 48, 144}, + {48, 120, 72, 144}, + {72, 120, 96, 144}, + {96, 120, 120, 144}, + {120, 120, 144, 144}, + }; + + RECT rcRight[6] = { + {0, 144, 24, 168}, + {24, 144, 48, 168}, + {48, 144, 72, 168}, + {72, 144, 96, 168}, + {96, 144, 120, 168}, + {120, 144, 144, 168}, + }; + + switch (npc->act_no) + { + case 0: + npc->xm = 0; + npc->act_no = 1; + npc->act_wait = 0; + npc->count1 = 0; + // Fallthrough + case 1: + if (gMC.x < npc->x + (96 * 0x200) && gMC.x > npc->x - (96 * 0x200) && gMC.y < npc->y + (32 * 0x200) && gMC.y > npc->y - (96 * 0x200)) + npc->act_no = 10; + + if (npc->shock) + npc->act_no = 10; + + break; + + case 10: + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->ani_no = 1; + + if (++npc->act_wait > 20) + { + npc->act_wait = 0; + npc->act_no = 20; + } + + break; + + case 20: + npc->damage = 0; + npc->xm = 0; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + if (++npc->count1 > 2) + { + npc->count1 = 0; + npc->ani_no = 4; + npc->act_no = 21; + npc->ym = -0x400; + npc->xm *= 2; + npc->damage = 5; + PlaySoundObject(102, SOUND_MODE_PLAY); + } + else + { + npc->act_no = 21; + npc->ym = -0x400; + PlaySoundObject(30, SOUND_MODE_PLAY); + } + } + + break; + + case 21: + if (npc->flag & 8) + { + PlaySoundObject(23, SOUND_MODE_PLAY); + npc->act_no = 20; + npc->ani_no = 1; + npc->ani_wait = 0; + npc->damage = 0; + + if (gMC.x > npc->x + (144 * 0x200) || gMC.x < npc->x - (144 * 0x200) || gMC.y > npc->y + (48 * 0x200) || gMC.y < npc->y - (144 * 0x200)) + npc->act_no = 0; + } + + break; + + case 30: + for (i = 0; i < 8; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + npc->ani_no = 0; + npc->act_no = 0; + + break; + + case 50: + npc->act_no = 51; + npc->ani_no = 4; + npc->damage = 0; + npc->ym = -0x200; + npc->bits &= ~(NPC_SOLID_SOFT | NPC_SHOOTABLE); + PlaySoundObject(51, SOUND_MODE_PLAY); + // Fallthrough + case 51: + if (npc->flag & 8) + { + PlaySoundObject(23, SOUND_MODE_PLAY); + npc->act_no = 52; + npc->ani_no = 5; + npc->xm = 0; + } + + break; + } + + if (npc->act_no > 50) + npc->ym += 0x20; + else + npc->ym += 0x40; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Red petals +void ActNpc116(NPCHAR *npc) +{ + RECT rc = {272, 184, 320, 200}; + + npc->rect = rc; +} + +// Curly +void ActNpc117(NPCHAR *npc) +{ + RECT rcLeft[10] = { + {0, 96, 16, 112}, + {16, 96, 32, 112}, + {0, 96, 16, 112}, + {32, 96, 48, 112}, + {0, 96, 16, 112}, + {176, 96, 192, 112}, + {112, 96, 128, 112}, + {160, 96, 176, 112}, + {144, 96, 160, 112}, + {48, 96, 64, 112}, + }; + + RECT rcRight[10] = { + {0, 112, 16, 128}, + {16, 112, 32, 128}, + {0, 112, 16, 128}, + {32, 112, 48, 128}, + {0, 112, 16, 128}, + {176, 112, 192, 128}, + {112, 112, 128, 128}, + {160, 112, 176, 128}, + {144, 112, 160, 128}, + {48, 112, 64, 128}, + }; + + switch (npc->act_no) + { + case 0: + if (npc->direct == 4) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + npc->xm = 0; + npc->ym += 0x40; + break; + + case 3: + if (0) + { + // There used to be an if-statement here that didn't do anything, but the compiler optimised it out. + // We only know this was here because empty if-statements affect the assembly's register usage. + // Since there's no code, we have no idea what the original condition actually was. + } + + if (0) + { + // Another empty if-statement + } + + npc->act_no = 4; + npc->ani_no = 1; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 1; + + npc->ym += 0x40; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + break; + + case 5: + npc->act_no = 6; + npc->ani_no = 5; + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8); + break; + + case 6: + if (0) + { + // There used to be an if-statement here that didn't do anything, but the compiler optimised it out. + // We only know this was here because empty if-statements affect the assembly's register usage. + // Since there's no code, we have no idea what the original condition actually was. + } + + npc->ani_no = 5; + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 1; + npc->ani_wait = 0; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + // Fallthrough + case 11: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 1; + + if (npc->direct == 0) + npc->x -= 1 * 0x200; + else + npc->x += 1 * 0x200; + + if (gMC.x < npc->x + (20 * 0x200) && gMC.x > npc->x - (20 * 0x200)) + npc->act_no = 0; + + break; + + case 20: + npc->xm = 0; + npc->ani_no = 6; + break; + + case 21: + npc->xm = 0; + npc->ani_no = 9; + break; + + case 30: + npc->act_no = 31; + npc->act_wait = 0; + npc->ym = -0x400; + // Fallthrough + case 31: + npc->ani_no = 7; + + if (npc->direct == 0) + npc->xm = 0x200; + else + npc->xm = -0x200; + + npc->ym += 0x40; + + if (npc->act_wait++ != 0 && npc->flag & 8) + npc->act_no = 32; + + break; + + case 32: + npc->ym += 0x40; + npc->ani_no = 8; + npc->xm = 0; + break; + + case 70: + npc->act_no = 71; + npc->act_wait = 0; + npc->ani_no = 1; + npc->ani_wait = 0; + // Fallthrough + case 71: + if (npc->direct == 0) + npc->x += 0x100; + else + npc->x -= 0x100; + + if (++npc->ani_wait > 8) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 1; + + break; + } + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Curly (boss) +void ActNpc118(NPCHAR *npc) +{ + BOOL bUpper; + + RECT rcLeft[9] = { + {0, 32, 32, 56}, + {32, 32, 64, 56}, + {64, 32, 96, 56}, + {96, 32, 128, 56}, + {0, 32, 32, 56}, + {128, 32, 160, 56}, + {0, 32, 32, 56}, + {0, 32, 32, 56}, + {160, 32, 192, 56}, + }; + + RECT rcRight[9] = { + {0, 56, 32, 80}, + {32, 56, 64, 80}, + {64, 56, 96, 80}, + {96, 56, 128, 80}, + {0, 56, 32, 80}, + {128, 56, 160, 80}, + {0, 56, 32, 80}, + {0, 56, 32, 80}, + {160, 56, 192, 80}, + }; + + bUpper = FALSE; + + if (npc->direct == 0 && npc->x < gMC.x) + bUpper = TRUE; + if (npc->direct == 2 && npc->x > gMC.x) + bUpper = TRUE; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + break; + + case 10: + npc->act_no = 11; + npc->act_wait = Random(50, 100); + npc->ani_no = 0; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + // Fallthrough + case 11: + if (npc->act_wait != 0) + --npc->act_wait; + else + npc->act_no = 13; + + break; + + case 13: + npc->act_no = 14; + npc->ani_no = 3; + npc->act_wait = Random(50, 100); + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 14: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + npc->ani_no = 3; + + if (npc->direct == 0) + npc->xm -= 0x40; + else + npc->xm += 0x40; + + if (npc->act_wait != 0) + { + --npc->act_wait; + } + else + { + npc->bits |= NPC_SHOOTABLE; + npc->act_no = 20; + npc->act_wait = 0; + PlaySoundObject(103, SOUND_MODE_PLAY); + } + + break; + + case 20: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->xm = (npc->xm * 8) / 9; + + if (++npc->ani_no > 1) + npc->ani_no = 0; + + if (++npc->act_wait > 50) + { + npc->act_no = 21; + npc->act_wait = 0; + } + + break; + + case 21: + if (++npc->act_wait % 4 == 1) + { + if (npc->direct == 0) + { + if (bUpper) + { + npc->ani_no = 2; + SetNpChar(123, npc->x, npc->y - (8 * 0x200), 0, 0, 1, NULL, 0x100); + } + else + { + npc->ani_no = 0; + SetNpChar(123, npc->x - (8 * 0x200), npc->y + (4 * 0x200), 0, 0, 0, NULL, 0x100); + npc->x += 1 * 0x200; + } + } + else + { + if (bUpper) + { + npc->ani_no = 2; + SetNpChar(123, npc->x, npc->y - (8 * 0x200), 0, 0, 1, NULL, 0x100); + } + else + { + npc->ani_no = 0; + SetNpChar(123, npc->x + (8 * 0x200), npc->y + (4 * 0x200), 0, 0, 2, NULL, 0x100); + npc->x -= 1 * 0x200; + } + } + } + + if (npc->act_wait > 30) + npc->act_no = 10; + + break; + + case 30: + if (++npc->ani_no > 8) + npc->ani_no = 7; + + if (++npc->act_wait > 30) + { + npc->act_no = 10; + npc->ani_no = 0; + } + + break; + } + + if (npc->act_no > 10 && npc->act_no < 30 && CountArmsBullet(6)) + { + npc->act_wait = 0; + npc->act_no = 30; + npc->ani_no = 7; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + npc->xm = 0; + } + + npc->ym += 0x20; + + if (npc->xm > 0x1FF) + npc->xm = 0x1FF; + if (npc->xm < -0x1FF) + npc->xm = -0x1FF; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + npc->x += npc->xm; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Table and chair +void ActNpc119(NPCHAR *npc) +{ + RECT rc = {248, 184, 272, 200}; + + npc->rect = rc; +} diff --git a/src/NpcAct120.cpp b/src/NpcAct120.cpp new file mode 100644 index 0000000..fe8f884 --- /dev/null +++ b/src/NpcAct120.cpp @@ -0,0 +1,1482 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include +#include + +#include "WindowsWrapper.h" + +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Game.h" +#include "KeyControl.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +// Colon (1) +void ActNpc120(NPCHAR *npc) +{ + RECT rect[2] = { + {64, 0, 80, 16}, + {64, 16, 80, 32}, + }; + + if (npc->direct == 0) + npc->rect = rect[0]; + else + npc->rect = rect[1]; +} + +// Colon (2) +void ActNpc121(NPCHAR *npc) +{ + RECT rect[3] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + {112, 0, 128, 16}, + }; + + if (npc->direct == 0) + { + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + npc->rect = rect[npc->ani_no]; + } + else + { + npc->rect = rect[2]; + + if (++npc->act_wait > 100) + { + npc->act_wait = 0; + SetCaret(npc->x, npc->y, CARET_ZZZ, DIR_LEFT); + } + } +} + +// Colon (attacking) +void ActNpc122(NPCHAR *npc) +{ + RECT rcLeft[10] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + {32, 0, 48, 16}, + {0, 0, 16, 16}, + {48, 0, 64, 16}, + {0, 0, 16, 16}, + {80, 0, 96, 16}, + {96, 0, 112, 16}, + {112, 0, 128, 16}, + {128, 0, 144, 16}, + }; + + RECT rcRight[10] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {32, 16, 48, 32}, + {0, 16, 16, 32}, + {48, 16, 64, 32}, + {0, 16, 16, 32}, + {80, 16, 96, 32}, + {96, 16, 112, 32}, + {112, 16, 128, 32}, + {128, 16, 144, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (32 * 0x200) < gMC.x && npc->x + (32 * 0x200) > gMC.x && npc->y - (32 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->life = 1000; + npc->act_no = 11; + npc->act_wait = Random(0, 50); + npc->ani_no = 0; + npc->damage = 0; + // Fallthrough + case 11: + if (npc->act_wait != 0) + --npc->act_wait; + else + npc->act_no = 13; + + break; + + case 13: + npc->act_no = 14; + npc->act_wait = Random(0, 50); + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 14: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->xm -= 0x40; + else + npc->xm += 0x40; + + if (npc->act_wait != 0) + { + --npc->act_wait; + } + else + { + npc->bits |= NPC_SHOOTABLE; + npc->act_no = 15; + npc->ani_no = 2; + npc->ym = -0x200; + npc->damage = 2; + } + + break; + + case 15: + if (npc->flag & 8) + { + npc->bits |= NPC_SHOOTABLE; + npc->xm = 0; + npc->act_no = 10; + npc->damage = 0; + } + + break; + + case 20: + if (npc->flag & 8) + { + npc->xm = 0; + npc->act_no = 21; + npc->damage = 0; + + if (npc->ani_no == 6) + npc->ani_no = 8; + else + npc->ani_no = 9; + + npc->act_wait = Random(300, 400); + } + + break; + + case 21: + if (npc->act_wait) + { + --npc->act_wait; + } + else + { + npc->bits |= NPC_SHOOTABLE; + npc->life = 1000; + npc->act_no = 11; + npc->act_wait = Random(0, 50); + npc->ani_no = 0; + } + + break; + } + + if (npc->act_no > 10 && npc->act_no < 20 && npc->life != 1000) + { + npc->act_no = 20; + npc->ym = -0x200; + npc->ani_no = Random(6, 7); + npc->bits &= ~NPC_SHOOTABLE; + } + + npc->ym += 0x20; + + if (npc->xm > 0x1FF) + npc->xm = 0x1FF; + if (npc->xm < -0x1FF) + npc->xm = -0x1FF; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + npc->x += npc->xm; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Curly boss projectile +void ActNpc123(NPCHAR *npc) +{ + RECT rect[4] = { + {192, 0, 208, 16}, + {208, 0, 224, 16}, + {224, 0, 240, 16}, + {240, 0, 256, 16}, + }; + + BOOL bBreak = FALSE; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + SetCaret(npc->x, npc->y, CARET_SHOOT, DIR_LEFT); + PlaySoundObject(32, SOUND_MODE_PLAY); + + switch (npc->direct) + { + case 0: + npc->xm = -0x1000; + npc->ym = Random(-0x80, 0x80); + break; + + case 1: + npc->ym = -0x1000; + npc->xm = Random(-0x80, 0x80); + break; + + case 2: + npc->xm = 0x1000; + npc->ym = Random(-0x80, 0x80); + break; + + case 3: + npc->ym = 0x1000; + npc->xm = Random(-0x80, 0x80); + break; + } + + break; + + case 1: + switch (npc->direct) + { + case 0: + if (npc->flag & 1) + bBreak = TRUE; + break; + + case 1: + if (npc->flag & 2) + bBreak = TRUE; + break; + + case 2: + if (npc->flag & 4) + bBreak = TRUE; + break; + + case 3: + if (npc->flag & 8) + bBreak = TRUE; + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + break; + } + + if (bBreak) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_RIGHT); + PlaySoundObject(28, SOUND_MODE_PLAY); + npc->cond = 0; + } + + npc->rect = rect[npc->direct]; +} + +// Sunstone +void ActNpc124(NPCHAR *npc) +{ + RECT rect[2] = { + {160, 0, 192, 32}, + {192, 0, 224, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->x += 8 * 0x200; + npc->y += 8 * 0x200; + // Fallthrough + case 1: + npc->bits &= ~NPC_IGNORE_SOLIDITY; + npc->ani_no = 0; + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 1; + npc->act_wait = 0; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 11: + switch (npc->direct) + { + case 0: + npc->x -= 0x80; + break; + + case 1: + npc->y -= 0x80; + break; + + case 2: + npc->x += 0x80; + break; + + case 3: + npc->y += 0x80; + break; + } + if (++npc->act_wait % 8 == 0) + PlaySoundObject(26, SOUND_MODE_PLAY); + + SetQuake(20); + break; + } + + npc->rect = rect[npc->ani_no]; +} + +// Hidden item +void ActNpc125(NPCHAR *npc) +{ + if (npc->life < 990) + { + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8); + PlaySoundObject(70, SOUND_MODE_PLAY); + + if (npc->direct == 0) + SetNpChar(87, npc->x, npc->y, 0, 0, 2, NULL, 0); + else + SetNpChar(86, npc->x, npc->y, 0, 0, 2, NULL, 0); + + npc->cond = 0; + } + + RECT rc[2] = { + {0, 96, 16, 112}, + {16, 96, 32, 112}, + }; + + if (npc->direct == 0) + npc->rect = rc[0]; + else + npc->rect = rc[1]; +} + +// Puppy (running) +void ActNpc126(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {48, 144, 64, 160}, + {64, 144, 80, 160}, + {48, 144, 64, 160}, + {80, 144, 96, 160}, + {96, 144, 112, 160}, + {112, 144, 128, 160}, + }; + + RECT rcRight[6] = { + {48, 160, 64, 176}, + {64, 160, 80, 176}, + {48, 160, 64, 176}, + {80, 160, 96, 176}, + {96, 160, 112, 176}, + {112, 160, 128, 176}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (96 * 0x200) < gMC.x && npc->x + (96 * 0x200) > gMC.x && npc->y - (32 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + if (npc->x - (32 * 0x200) < gMC.x && npc->x + (32 * 0x200) > gMC.x && npc->y - (32 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + npc->act_no = 10; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 4; + npc->ani_wait = 0; + // Fallthrough + case 11: + if (npc->flag & 8) + { + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 4; + } + else + { + npc->ani_no = 5; + npc->ani_wait = 0; + } + + if (npc->xm < 0 && npc->flag & 1) + { + npc->xm /= -2; + npc->direct = gMirrorMode? 0:2; + } + + if (npc->xm > 0 && npc->flag & 4) + { + npc->xm /= -2; + npc->direct = gMirrorMode? 2:0; + } + + if (npc->direct == 0) + npc->xm -= 0x40; + else + npc->xm += 0x40; + + if (npc->xm > 0x5FF) + npc->xm = 0x400; + + if (npc->xm < -0x5FF) + npc->xm = -0x400; + + break; + } + + if (gKeyTrg & gKeyDown) + npc->bits |= NPC_INTERACTABLE; + else + npc->bits &= ~NPC_INTERACTABLE; + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Machine gun trail (Level 2) +void ActNpc127(NPCHAR *npc) +{ + RECT rcV[3] = { + {112, 48, 128, 64}, + {112, 64, 128, 80}, + {112, 80, 128, 96}, + }; + + RECT rcH[3] = { + {64, 80, 80, 96}, + {80, 80, 96, 96}, + {96, 80, 112, 96}, + }; + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 2) + { + npc->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rcH' and 'rcV', even though it's now too high + #endif + } + } + + if (npc->direct == 0) + npc->rect = rcH[npc->ani_no]; + else + npc->rect = rcV[npc->ani_no]; +} + +// Machine gun trail (Level 3) +void ActNpc128(NPCHAR *npc) +{ + RECT rcLeft[5] = { + {0, 0, 0, 0}, + {176, 16, 184, 32}, + {184, 16, 192, 32}, + {192, 16, 200, 32}, + {200, 16, 208, 32}, + }; + + RECT rcRight[5] = { + {0, 0, 0, 0}, + {232, 16, 240, 32}, + {224, 16, 232, 32}, + {216, 16, 224, 32}, + {208, 16, 216, 32}, + }; + + RECT rcUp[5] = { + {0, 0, 0, 0}, + {176, 32, 192, 40}, + {176, 40, 192, 48}, + {192, 32, 208, 40}, + {192, 40, 208, 48}, + }; + + RECT rcDown[5] = { + {0, 0, 0, 0}, + {208, 32, 224, 40}, + {208, 40, 224, 48}, + {224, 32, 232, 40}, + {224, 40, 232, 48}, + }; + + if (npc->act_no == 0) + { + npc->act_no = 1; + + if (npc->direct == 0 || npc->direct == 2) + { + npc->view.front = 4 * 0x200; + npc->view.top = 8 * 0x200; + } + else + { + npc->view.front = 8 * 0x200; + npc->view.top = 4 * 0x200; + } + } + + if (++npc->ani_no > 4) + { + npc->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rcLeft' and co., even though it's now too high + #endif + } + + switch (npc->direct) + { + case 0: + npc->rect = rcLeft[npc->ani_no]; + break; + + case 1: + npc->rect = rcUp[npc->ani_no]; + break; + + case 2: + npc->rect = rcRight[npc->ani_no]; + break; + + case 3: + npc->rect = rcDown[npc->ani_no]; + break; + } +} + +// Fireball trail (Level 2 & 3) +void ActNpc129(NPCHAR *npc) +{ + RECT rect[18] = { + {128, 48, 144, 64}, + {144, 48, 160, 64}, + {160, 48, 176, 64}, + + {128, 64, 144, 80}, + {144, 64, 160, 80}, + {160, 64, 176, 80}, + + {128, 80, 144, 96}, + {144, 80, 160, 96}, + {160, 80, 176, 96}, + + {176, 48, 192, 64}, + {192, 48, 208, 64}, + {208, 48, 224, 64}, + + {176, 64, 192, 80}, + {192, 64, 208, 80}, + {208, 64, 224, 80}, + + {176, 80, 192, 96}, + {192, 80, 208, 96}, + {208, 80, 224, 96}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 2) + { + npc->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rect', even though it's now too high + #endif + } + } + + npc->y += npc->ym; + + npc->rect = rect[(npc->direct * 3) + npc->ani_no]; +} + +// Puppy (sitting, wagging tail) +void ActNpc130(NPCHAR *npc) +{ + RECT rcLeft[4] = { + {48, 144, 64, 160}, + {64, 144, 80, 160}, + {48, 144, 64, 160}, + {80, 144, 96, 160}, + }; + + RECT rcRight[4] = { + {48, 160, 64, 176}, + {64, 160, 80, 176}, + {48, 160, 64, 176}, + {80, 160, 96, 176}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->bits |= NPC_INTERACTABLE; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (64 * 0x200) < gMC.x && npc->x + (64 * 0x200) > gMC.x && npc->y - (32 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + } + + if (npc->x - (96 * 0x200) < gMC.x && npc->x + (96 * 0x200) > gMC.x && npc->y - (32 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Puppy (sleeping) +void ActNpc131(NPCHAR *npc) +{ + RECT rcLeft[1] = { + {144, 144, 160, 160} + }; + + RECT rcRight[1] = { + {144, 160, 160, 176} + }; + + if (++npc->act_wait > 100) + { + npc->act_wait = 0; + SetCaret(npc->x, npc->y, CARET_ZZZ, DIR_LEFT); + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Puppy (barking) +void ActNpc132(NPCHAR *npc) +{ + RECT rcLeft[5] = { + {48, 144, 64, 160}, + {64, 144, 80, 160}, + {96, 144, 112, 160}, + {96, 144, 112, 160}, + {128, 144, 144, 160}, + }; + + RECT rcRight[5] = { + {48, 160, 64, 176}, + {64, 160, 80, 176}, + {96, 160, 112, 176}, + {96, 160, 112, 176}, + {128, 160, 144, 176}, + }; + + if (npc->act_no < 100) + { + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (64 * 0x200) < gMC.x && npc->x + (64 * 0x200) > gMC.x && npc->y - (16 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 2; + + if (npc->ani_no == 4 && npc->ani_wait == 0) + PlaySoundObject(105, SOUND_MODE_PLAY); + } + else + { + if (npc->ani_no == 4) + npc->ani_no = 2; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 11: + if (Random(0, 120) == 10) + { + npc->act_no = 12; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 12: + if (++npc->act_wait > 8) + { + npc->act_no = 11; + npc->ani_no = 0; + } + + break; + + case 100: + npc->act_no = 101; + npc->count1 = 0; + // Fallthrough + case 101: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + { + if (npc->count1 < 3) + { + npc->ani_no = 2; + ++npc->count1; + } + else + { + npc->ani_no = 0; + npc->count1 = 0; + } + } + + if (npc->ani_no == 4 && npc->ani_wait == 0) + PlaySoundObject(105, SOUND_MODE_PLAY); + + break; + + case 120: + npc->ani_no = 0; + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Jenka +void ActNpc133(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {176, 32, 192, 48}, + {192, 32, 208, 48}, + }; + + RECT rcRight[2] = { + {176, 48, 192, 64}, + {192, 48, 208, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Armadillo +void ActNpc134(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {224, 0, 256, 16}, + {256, 0, 288, 16}, + {288, 0, 320, 16}, + }; + + RECT rcRight[3] = { + {224, 16, 256, 32}, + {256, 16, 288, 32}, + {288, 16, 320, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 2; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + // Fallthrough + case 1: + if (gMC.x > npc->x - (320 * 0x200) && gMC.x < npc->x + (320 * 0x200) && gMC.y > npc->y - (160 * 0x200) && gMC.y < npc->y + (64 * 0x200)) // TODO: Maybe do something about this for widescreen/tallscreen? + { + npc->act_no = 10; + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + } + + break; + + case 10: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->direct == 0 && npc->flag & 1) + npc->direct = gMirrorMode? 0:2; + if (npc->direct == 2 && npc->flag & 4) + npc->direct = gMirrorMode? 2:0; + + if (npc->direct == 0) + npc->x -= 0x100; + else + npc->x += 0x100; + + if (CountArmsBullet(6)) + { + npc->act_no = 20; + npc->act_wait = 0; + npc->ani_no = 2; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + } + + break; + + case 20: + if (++npc->act_wait > 100) + { + npc->act_no = 10; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Skeleton +void ActNpc135(NPCHAR *npc) +{ + unsigned char deg; + int xm, ym; + + RECT rcLeft[2] = { + {256, 32, 288, 64}, + {288, 32, 320, 64}, + }; + + RECT rcRight[2] = { + {256, 64, 288, 96}, + {288, 64, 320, 96}, + }; + + if (gMC.x < npc->x - (352 * 0x200) || gMC.x > npc->x + (352 * 0x200) || gMC.y < npc->y - (160 * 0x200) || gMC.y > npc->y + (64 * 0x200)) + npc->act_no = 0; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->xm = 0; + // Fallthrough + case 1: + if (gMC.x > npc->x - (320 * 0x200) && gMC.x < npc->x + (320 * 0x200) && gMC.y > npc->y - (160 * 0x200) && gMC.y < npc->y + (64 * 0x200)) + npc->act_no = 10; + + if (npc->flag & 8) + npc->ani_no = 0; + + break; + + case 10: + npc->xm = 0; + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_no = 0; + // Fallthrough + case 11: + if (++npc->act_wait >= 5 && npc->flag & 8) + { + npc->act_no = 20; + npc->ani_no = 1; + npc->count1 = 0; + npc->ym = -0x200 * Random(1, 3); + + if (npc->shock) + { + if (npc->x < gMC.x) + npc->xm -= 0x100; + else + npc->xm += 0x100; + } + else + { + if (npc->x < gMC.x) + npc->xm += 0x100; + else + npc->xm -= 0x100; + } + } + + break; + + case 20: + if (npc->ym > 0 && npc->count1 == 0) + { + ++npc->count1; + deg = GetArktan(npc->x - gMC.x, npc->y + (4 * 0x200) - gMC.y); + ym = GetSin(deg) * 2; + xm = GetCos(deg) * 2; + SetNpChar(50, npc->x, npc->y, xm, ym, 0, NULL, 0x180); + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + if (npc->flag & 8) + { + npc->act_no = 10; + npc->ani_no = 0; + } + + break; + } + + if (npc->act_no >= 10) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + npc->ym += 0x200 / 10; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + if (npc->xm > 0x5FF) + npc->xm = 0x5FF; + if (npc->xm < -0x5FF) + npc->xm = -0x5FF; + + npc->y += npc->ym; + npc->x += npc->xm; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Puppy (carried) +void ActNpc136(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {48, 144, 64, 160}, + {64, 144, 80, 160}, + }; + + RECT rcRight[2] = { + {48, 160, 64, 176}, + {64, 160, 80, 176}, + }; + + switch (npc->act_no) + { + case 0: + npc->bits &= ~NPC_INTERACTABLE; + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (gMC.direct == 0) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->y = gMC.y - (10 * 0x200); + + if (npc->direct == 0) + { + npc->x = gMC.x + (4 * 0x200); + npc->rect = rcLeft[npc->ani_no]; + } + else + { + npc->x = gMC.x - (4 * 0x200); + npc->rect = rcRight[npc->ani_no]; + } + + if (gMC.ani_no % 2) + ++npc->rect.top; +} + +// Large door (frame) +void ActNpc137(NPCHAR *npc) +{ + RECT rc = {96, 136, 128, 188}; + + npc->rect = rc; +} + +// Large door +void ActNpc138(NPCHAR *npc) +{ + RECT rcLeft = {96, 112, 112, 136}; + RECT rcRight = {112, 112, 128, 136}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 0) + { + npc->rect = rcLeft; + npc->x += 8 * 0x200; + } + else + { + npc->rect = rcRight; + npc->x -= 8 * 0x200; + } + + npc->tgt_x = npc->x; + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 1; + npc->act_wait = 0; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 11: + if (++npc->act_wait % 8 == 0) + PlaySoundObject(26, SOUND_MODE_PLAY); + + if (npc->direct == 0) + { + npc->rect = rcLeft; + npc->rect.left += npc->act_wait / 8; + } + else + { + npc->x = npc->tgt_x + ((npc->act_wait / 8) * 0x200); + npc->rect = rcRight; + npc->rect.right -= npc->act_wait / 8; + } + + if (npc->act_wait == 104) + npc->cond = 0; + + break; + } +} + +// Doctor +void ActNpc139(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {0, 128, 24, 160}, + {24, 128, 48, 160}, + {48, 128, 72, 160}, + }; + + RECT rcRight[3] = { + {0, 160, 24, 192}, + {24, 160, 48, 192}, + {48, 160, 72, 192}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->xm = 0; + npc->ym = 0; + npc->y -= 8 * 0x200; + // Fallthrough + case 1: + if (npc->flag & 8) + npc->ani_no = 0; + else + npc->ani_no = 2; + + npc->ym += 0x40; + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 1; + npc->ani_wait = 0; + npc->count1 = 0; + // Fallthrough + case 11: + if (++npc->ani_wait > 6) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + { + npc->ani_no = 0; + ++npc->count1; + } + + if (npc->count1 > 8) + { + npc->ani_no = 0; + npc->act_no = 1; + } + + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + npc->ani_no = 2; + npc->tgt_y = npc->y - (32 * 0x200); + // Fallthrough + case 21: + if (npc->y < npc->tgt_y) + npc->ym += 0x20; + else + npc->ym -= 0x20; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + break; + + case 30: + npc->act_no = 31; + npc->xm = 0; + npc->ym = 0; + npc->act_wait = (npc->rect.bottom - npc->rect.top) * 2; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 31: + --npc->act_wait; + npc->ani_no = 0; + + if (npc->act_wait == 0) + npc->cond = 0; + + break; + + case 40: + npc->act_no = 41; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 41: + npc->ani_no = 2; + + if (++npc->act_wait < 64) + break; + + npc->act_no = 20; + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->act_no == 31 || npc->act_no == 41) + { + npc->rect.bottom = npc->rect.top + (npc->act_wait / 2); + + if (npc->act_wait / 2 % 2) + ++npc->rect.left; + } +} diff --git a/src/NpcAct140.cpp b/src/NpcAct140.cpp new file mode 100644 index 0000000..dd2873b --- /dev/null +++ b/src/NpcAct140.cpp @@ -0,0 +1,2028 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Flash.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "TextScr.h" +#include "Triangle.h" + +// Toroko (frenzied) +void ActNpc140(NPCHAR *npc) +{ + int i; + + RECT rcLeft[14] = { + {0, 0, 32, 32}, + {32, 0, 64, 32}, + {64, 0, 96, 32}, + {96, 0, 128, 32}, + {128, 0, 160, 32}, + {160, 0, 192, 32}, + {192, 0, 224, 32}, + {224, 0, 256, 32}, + {0, 64, 32, 96}, + {32, 64, 64, 96}, + {64, 64, 96, 96}, + {96, 64, 128, 96}, + {128, 64, 160, 96}, + {0, 0, 0, 0}, + }; + + RECT rcRight[14] = { + {0, 32, 32, 64}, + {32, 32, 64, 64}, + {64, 32, 96, 64}, + {96, 32, 128, 64}, + {128, 32, 160, 64}, + {160, 32, 192, 64}, + {192, 32, 224, 64}, + {224, 32, 256, 64}, + {0, 96, 32, 128}, + {32, 96, 64, 128}, + {64, 96, 96, 128}, + {96, 96, 128, 128}, + {128, 96, 160, 128}, + {0, 0, 0, 0}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 9; + npc->act_wait = 0; + npc->bits &= ~NPC_INTERACTABLE; + // Fallthrough + case 1: + if (++npc->act_wait > 50) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 8; + } + + break; + + case 2: + if (++npc->ani_no > 10) + npc->ani_no = 9; + + if (++npc->act_wait > 50) + { + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 0; + } + + break; + + case 3: + if (++npc->act_wait > 50) + { + npc->act_no = 10; + npc->bits |= NPC_SHOOTABLE; + } + + break; + + case 10: + npc->bits = npc->bits; // Chances are this line isn't accurate to the original source code, but it produces the same assembly + npc->act_no = 11; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->act_wait = Random(20, 130); + npc->xm = 0; + // Fallthrough + case 11: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (CountArmsBullet(6) || CountArmsBullet(3) > 3) + npc->act_no = 20; + + if (npc->act_wait != 0) + { + --npc->act_wait; + } + else + { + if (Random(0, 99) % 2) + npc->act_no = 20; + else + npc->act_no = 50; + } + + break; + + case 20: + npc->act_no = 21; + npc->ani_no = 2; + npc->act_wait = 0; + // Fallthrough + case 21: + if (++npc->act_wait > 10) + { + npc->act_no = 22; + npc->act_wait = 0; + npc->ani_no = 3; + npc->ym = -0x5FF; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + } + + break; + + case 22: + if (++npc->act_wait > 10) + { + npc->act_no = 23; + npc->act_wait = 0; + npc->ani_no = 6; + SetNpChar(141, 0, 0, 0, 0, 0, npc, 0); + } + + break; + + case 23: + if (++npc->act_wait > 30) + { + npc->act_no = 24; + npc->act_wait = 0; + npc->ani_no = 7; + } + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + break; + + case 24: + if (++npc->act_wait > 3) + { + npc->act_no = 25; + npc->ani_no = 3; + } + + break; + + case 25: + if (npc->flag & 8) + { + npc->act_no = 26; + npc->act_wait = 0; + npc->ani_no = 2; + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(20); + } + + break; + + case 26: + npc->xm = (npc->xm * 8) / 9; + + if (++npc->act_wait > 20) + { + npc->act_no = 10; + npc->ani_no = 0; + } + + break; + + case 50: + npc->act_no = 51; + npc->act_wait = 0; + npc->ani_no = 4; + SetNpChar(141, 0, 0, 0, 0, 0, npc, 0); + // Fallthrough + case 51: + if (++npc->act_wait > 30) + { + npc->act_no = 52; + npc->act_wait = 0; + npc->ani_no = 5; + } + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + break; + + case 52: + if (++npc->act_wait > 3) + { + npc->act_no = 10; + npc->ani_no = 0; + } + + break; + + case 100: + npc->ani_no = 3; + npc->act_no = 101; + npc->bits &= ~NPC_SHOOTABLE; + npc->damage = 0; + + for (i = 0; i < 8; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + break; + + case 101: + if (npc->flag & 8) + { + npc->act_no = 102; + npc->act_wait = 0; + npc->ani_no = 2; + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(20); + } + + break; + + case 102: + npc->xm = (npc->xm * 8) / 9; + + if (++npc->act_wait > 50) + { + npc->act_no = 103; + npc->act_wait = 0; + npc->ani_no = 10; + } + + break; + + case 103: + if (++npc->act_wait > 50) + { + npc->ani_no = 9; + npc->act_no = 104; + npc->act_wait = 0; + } + + break; + + case 104: + if (++npc->ani_no > 10) + npc->ani_no = 9; + + if (++npc->act_wait > 100) + { + npc->act_wait = 0; + npc->ani_no = 9; + npc->act_no = 105; + } + + break; + + case 105: + if (++npc->act_wait > 50) + { + npc->ani_wait = 0; + npc->act_no = 106; + npc->ani_no = 11; + } + + break; + + case 106: + if (++npc->ani_wait > 50) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 12) + npc->ani_no = 12; + + break; + + case 140: + npc->act_no = 141; + npc->act_wait = 0; + npc->ani_no = 12; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 141: + if (++npc->ani_no > 13) + npc->ani_no = 12; + + if (++npc->act_wait > 100) + { + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + npc->cond = 0; + } + + break; + } + + if (npc->act_no > 100 && npc->act_no < 105 && npc->act_wait % 9 == 0) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + npc->ym += 0x20; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Toroko block projectile +void ActNpc141(NPCHAR *npc) +{ + int i; + unsigned char deg; + + RECT rect[2] = { + {288, 32, 304, 48}, + {304, 32, 320, 48}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = 0; + // Fallthrough + case 1: + if (npc->pNpc->direct == 0) + npc->x = npc->pNpc->x + (10 * 0x200); + else + npc->x = npc->pNpc->x - (10 * 0x200); + + npc->y = npc->pNpc->y - (8 * 0x200); + + if (npc->pNpc->act_no == 24 || npc->pNpc->act_no == 52) + { + npc->act_no = 10; + + if (npc->pNpc->direct == 0) + npc->x = npc->pNpc->x - (16 * 0x200); + else + npc->x = npc->pNpc->x + (16 * 0x200); + + npc->y = npc->pNpc->y; + + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + npc->ym = GetSin(deg) * 4; + npc->xm = GetCos(deg) * 4; + + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + break; + + case 10: + if (npc->flag & 0xF) + { + npc->act_no = 20; + npc->act_wait = 0; + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + PlaySoundObject(12, SOUND_MODE_PLAY); + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x, npc->y, Random(-0x200, 0x200), Random(-0x200, 0x200), 0, NULL, 0x100); + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + break; + + case 20: + npc->x += npc->xm; + npc->y += npc->ym; + + if (++npc->act_wait > 4) + { + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x, npc->y, Random(-0x200, 0x200), Random(-0x200, 0x200), 0, NULL, 0x100); + + npc->code_char = 142; + npc->ani_no = 0; + npc->act_no = 20; + npc->xm = 0; + npc->bits &= ~NPC_INVULNERABLE; + npc->bits |= NPC_SHOOTABLE; + npc->damage = 1; + } + + break; + } + + if (++npc->ani_no > 1) + npc->ani_no = 0; + + npc->rect = rect[npc->ani_no]; +} + +// Flower Cub +void ActNpc142(NPCHAR *npc) +{ + RECT rect[5] = { + {0, 128, 16, 144}, + {16, 128, 32, 144}, + {32, 128, 48, 144}, + {48, 128, 64, 144}, + {64, 128, 80, 144}, + }; + + switch (npc->act_no) + { + case 10: + npc->act_no = 11; + npc->ani_no = 0; + npc->act_wait = 0; + // Fallthrough + case 11: + if (++npc->act_wait > 30) + { + npc->act_no = 12; + npc->ani_no = 1; + npc->ani_wait = 0; + } + + break; + + case 12: + if (++npc->ani_wait > 8) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no == 3) + { + npc->act_no = 20; + npc->ym = -0x200; + + if (gMC.x < npc->x) + npc->xm = -0x200; + else + npc->xm = 0x200; + } + + break; + + case 20: + if (npc->ym > -0x80) + npc->ani_no = 4; + else + npc->ani_no = 3; + + if (npc->flag & 8) + { + npc->ani_no = 2; + npc->act_no = 21; + npc->act_wait = 0; + npc->xm = 0; + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + break; + + case 21: + if (++npc->act_wait > 10) + { + npc->act_no = 10; + npc->ani_no = 0; + } + + break; + } + + npc->ym += 0x40; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rect[npc->ani_no]; +} + +// Jenka (collapsed) +void ActNpc143(NPCHAR *npc) +{ + RECT rcLeft[1] = { + {208, 32, 224, 48} + }; + + RECT rcRight[1] = { + {208, 48, 224, 64} + }; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Toroko (teleporting in) +void ActNpc144(NPCHAR *npc) +{ + RECT rcLeft[5] = { + {0, 64, 16, 80}, + {16, 64, 32, 80}, + {32, 64, 48, 80}, + {16, 64, 32, 80}, + {128, 64, 144, 80}, + }; + + RECT rcRight[5] = { + {0, 80, 16, 96}, + {16, 80, 32, 96}, + {32, 80, 48, 96}, + {16, 80, 32, 96}, + {128, 80, 144, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->tgt_x = npc->x; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 1: + if (++npc->act_wait == 64) + { + npc->act_no = 2; + npc->act_wait = 0; + } + + break; + + case 2: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + if (npc->flag & 8) + { + npc->act_no = 4; + npc->act_wait = 0; + npc->ani_no = 4; + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 11: + if (Random(0, 120) == 10) + { + npc->act_no = 12; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 12: + if (++npc->act_wait > 8) + { + npc->act_no = 11; + npc->ani_no = 0; + } + + break; + } + + if (npc->act_no > 1) + { + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->act_no == 1) + { + npc->rect.bottom = npc->rect.top + npc->act_wait / 4; + + if (npc->act_wait / 2 % 2) + npc->x = npc->tgt_x; + else + npc->x = npc->tgt_x + (1 * 0x200); + } +} + +// King's sword +void ActNpc145(NPCHAR *npc) +{ + RECT rcLeft[1] = { + {96, 32, 112, 48} + }; + + RECT rcRight[1] = { + {112, 32, 128, 48} + }; + + switch (npc->act_no) + { + case 0: + if (npc->pNpc->count2 == 0) + { + if (npc->pNpc->direct == 0) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + else + { + if (npc->pNpc->direct == 0) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + + if (npc->direct == 0) + npc->x = npc->pNpc->x - (10 * 0x200); + else + npc->x = npc->pNpc->x + (10 * 0x200); + + npc->y = npc->pNpc->y; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Lightning +void ActNpc146(NPCHAR *npc) +{ + RECT rect[5] = { + {0, 0, 0, 0}, + {256, 0, 272, 240}, + {272, 0, 288, 240}, + {288, 0, 304, 240}, + {304, 0, 320, 240}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 2) + SetFlash(0, 0, FLASH_MODE_FLASH); + // Fallthrough + case 1: + if (++npc->act_wait > 10) + { + npc->act_no = 2; + PlaySoundObject(101, SOUND_MODE_PLAY); + } + + break; + + case 2: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no == 2) + npc->damage = 10; + + if (npc->ani_no > 4) + { + SetDestroyNpChar(npc->x, npc->y, 0x1000, 8); + npc->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rect', even though it's now too high + #endif + } + + break; + } + + npc->rect = rect[npc->ani_no]; +} + +// Critter (purple) +void ActNpc147(NPCHAR *npc) +{ + int xm, ym; + unsigned char deg; + + RECT rcLeft[6] = { + {0, 96, 16, 112}, + {16, 96, 32, 112}, + {32, 96, 48, 112}, + {48, 96, 64, 112}, + {64, 96, 80, 112}, + {80, 96, 96, 112}, + }; + + RECT rcRight[6] = { + {0, 112, 16, 128}, + {16, 112, 32, 128}, + {32, 112, 48, 128}, + {48, 112, 64, 128}, + {64, 112, 80, 128}, + {80, 112, 96, 128}, + }; + + switch (npc->act_no) + { + case 0: + npc->y += 3 * 0x200; + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->act_wait >= 8 && npc->x - (96 * 0x200) < gMC.x && npc->x + (96 * 0x200) > gMC.x && npc->y - (96 * 0x200) < gMC.y && npc->y + (32 * 0x200) > gMC.y) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->ani_no = 1; + } + else + { + if (npc->act_wait < 8) + ++npc->act_wait; + + npc->ani_no = 0; + } + + if (npc->shock) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + if (npc->act_wait >= 8 && npc->x - (48 * 0x200) < gMC.x && npc->x + (48 * 0x200) > gMC.x && npc->y - (96 * 0x200) < gMC.y && npc->y + (32 * 0x200) > gMC.y) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 3; + npc->ani_no = 2; + npc->ym = -0x5FF; + PlaySoundObject(30, SOUND_MODE_PLAY); + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 3: + if (npc->ym > 0x100) + { + npc->tgt_y = npc->y; + npc->act_no = 4; + npc->ani_no = 3; + npc->act_wait = 0; + npc->act_wait = 0; // Duplicate line + } + + break; + + case 4: + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + ++npc->act_wait; + + if (npc->flag & 7 || npc->act_wait > 60) + { + npc->damage = 3; + npc->act_no = 5; + npc->ani_no = 2; + break; + } + + if (npc->act_wait % 4 == 1) + PlaySoundObject(109, SOUND_MODE_PLAY); + + if (npc->flag & 8) + npc->ym = -0x200; + + if (npc->act_wait % 30 == 6) + { + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-6, 6); + ym = GetSin(deg) * 3; + xm = GetCos(deg) * 3; + + SetNpChar(148, npc->x, npc->y, xm, ym, 0, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 3; + + break; + + case 5: + if (npc->flag & 8) + { + npc->damage = 2; + npc->xm = 0; + npc->act_wait = 0; + npc->ani_no = 0; + npc->act_no = 1; + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + break; + } + + if (npc->act_no != 4) + { + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + } + else + { + if (npc->y > npc->tgt_y) + npc->ym -= 0x10; + else + npc->ym += 0x10; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Purple Critter's projectile +void ActNpc148(NPCHAR *npc) +{ + if (npc->flag & 0xFF) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rect_left[2] = { + {96, 96, 104, 104}, + {104, 96, 112, 104}, + }; + + if (++npc->ani_no > 1) + npc->ani_no = 0; + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->count1 > 300) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } +} + +// Moving block (horizontal) +void ActNpc149(NPCHAR *npc) +{ + int i; + + switch (npc->act_no) + { + case 0: + npc->x += 8 * 0x200; + npc->y += 8 * 0x200; + + if (npc->direct == 0) + npc->act_no = 10; + else + npc->act_no = 20; + + npc->xm = 0; + npc->ym = 0; + + npc->bits |= NPC_SOLID_HARD; + break; + + case 10: + npc->bits &= ~NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 0; + + if (gMC.x < npc->x + (25 * 0x200) && gMC.x > npc->x - (25 * 0x10 * 0x200) && gMC.y < npc->y + (25 * 0x200) && gMC.y > npc->y - (25 * 0x200)) + { + npc->act_no = 11; + npc->act_wait = 0; + } + + break; + + case 11: + if (++npc->act_wait % 10 == 6) + PlaySoundObject(107, SOUND_MODE_PLAY); + + if (npc->flag & 1) + { + npc->xm = 0; + npc->direct = gMirrorMode? 0:2; + npc->act_no = 20; + SetQuake(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x - (16 * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + break; + } + + if (gMC.flag & 1) + { + npc->bits |= NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 100; + } + else + { + npc->bits &= ~NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 0; + } + + npc->xm -= 0x20; + + break; + + case 20: + npc->bits &= ~NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 0; + + if (gMC.x > npc->x - (25 * 0x200) && gMC.x < npc->x + (25 * 0x10 * 0x200) && gMC.y < npc->y + (25 * 0x200) && gMC.y > npc->y - (25 * 0x200)) + { + npc->act_no = 21; + npc->act_wait = 0; + } + + break; + + case 21: + if (++npc->act_wait % 10 == 6) + PlaySoundObject(107, SOUND_MODE_PLAY); + + if (npc->flag & 4) + { + npc->xm = 0; + npc->direct = gMirrorMode? 2:0; + npc->act_no = 10; + SetQuake(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (16 * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + break; + } + + if (gMC.flag & 4) + { + npc->bits |= NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 100; + } + else + { + npc->bits &= ~NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 0; + } + + npc->xm += 0x20; + + break; + } + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + + npc->x += npc->xm; + + RECT rect = {16, 0, 48, 32}; + npc->rect = rect; +} + +// Quote +void ActNpc150(NPCHAR *npc) +{ + int i; + + RECT rcLeft[9] = { + {0, 0, 16, 16}, + {48, 0, 64, 16}, + {144, 0, 160, 16}, + {16, 0, 32, 16}, + {0, 0, 16, 16}, + {32, 0, 48, 16}, + {0, 0, 16, 16}, + {160, 0, 176, 16}, + {112, 0, 128, 16}, + }; + + RECT rcRight[9] = { + {0, 16, 16, 32}, + {48, 16, 64, 32}, + {144, 16, 160, 32}, + {16, 16, 32, 32}, + {0, 16, 16, 32}, + {32, 16, 48, 32}, + {0, 16, 16, 32}, + {160, 16, 176, 32}, + {112, 16, 128, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + + if (npc->direct > 10) + { + npc->x = gMC.x; + npc->y = gMC.y; + npc->direct -= 10; + } + break; + + case 2: + npc->ani_no = 1; + break; + + case 10: + npc->act_no = 11; + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x, npc->y, Random(-0x155, 0x155), Random(-0x600, 0), 0, NULL, 0x100); + + PlaySoundObject(71, SOUND_MODE_PLAY); + // Fallthrough + case 11: + npc->ani_no = 2; + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 64; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 21: + if (--npc->act_wait == 0) + npc->cond = 0; + + break; + + case 50: + npc->act_no = 51; + npc->ani_no = 3; + npc->ani_wait = 0; + // Fallthrough + case 51: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + npc->ani_no = 3; + + if (npc->direct == 0) + npc->x -= 1 * 0x200; + else + npc->x += 1 * 0x200; + + break; + + case 60: + npc->act_no = 61; + npc->ani_no = 7; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + // Fallthrough + case 61: + npc->tgt_y += 0x100; + npc->x = npc->tgt_x + (Random(-1, 1) * 0x200); + npc->y = npc->tgt_y + (Random(-1, 1) * 0x200); + break; + + case 70: + npc->act_no = 71; + npc->act_wait = 0; + npc->ani_no = 3; + npc->ani_wait = 0; + // Fallthrough + case 71: + if (npc->direct == 0) + npc->x += 0x100; + else + npc->x -= 0x100; + + if (++npc->ani_wait > 8) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + npc->ani_no = 3; + + break; + + case 80: + npc->ani_no = 8; + break; + + case 99: + case 100: + npc->act_no = 101; + npc->ani_no = 3; + npc->ani_wait = 0; + // Fallthrough + case 101: + npc->ym += 0x40; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + if (npc->flag & 8) + { + npc->ym = 0; + npc->act_no = 102; + } + + npc->y += npc->ym; + break; + + case 102: + if (++npc->ani_wait > 8) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + npc->ani_no = 3; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + npc->rect.top += 32 * gMIMCurrentNum; + npc->rect.bottom += 32 * gMIMCurrentNum; + + if (npc->act_no == 21) + { + npc->rect.bottom = npc->rect.top + (npc->act_wait / 4); + + if (npc->act_wait / 2 % 2) + ++npc->rect.left; + } + + // Use a different sprite if the player is wearing the Mimiga Mask + // In theory this should be disabled by ENABLE_MIM_DISABLE_EQUIP_40_GRAPHICS, but the original mod doesn't do that (probably a bug tbh) so we don't do it either in order to make it so its behaviour is reproduced exactly with ENABLE_MIM_DISABLE_EQUIP_40_GRAPHICS + if (gMC.equip & EQUIP_MIMIGA_MASK) + { + npc->rect.top += 32; + npc->rect.bottom += 32; + } +} + +// Blue robot (standing) +void ActNpc151(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {192, 0, 208, 16}, + {208, 0, 224, 16}, + }; + + RECT rcRight[2] = { + {192, 16, 208, 32}, + {208, 16, 224, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + + case 1: + if (Random(0, 100) == 0) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 16) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Shutter stuck +void ActNpc152(NPCHAR *npc) +{ + RECT rc = {0, 0, 0, 0}; + + switch (npc->act_no) + { + case 0: + if (npc->direct == 2) + npc->y += 16 * 0x200; + + npc->act_no = 1; + break; + } + + npc->rect = rc; +} + +const RECT grcKitL[21] = { + {0, 0, 24, 24}, + {24, 0, 48, 24}, + {48, 0, 72, 24}, + {0, 0, 24, 24}, + {72, 0, 96, 24}, + {0, 0, 24, 24}, + {96, 0, 120, 24}, + {120, 0, 144, 24}, + {144, 0, 168, 24}, + {168, 0, 192, 24}, + {192, 0, 216, 24}, + {216, 0, 240, 24}, + {240, 0, 264, 24}, + {264, 0, 288, 24}, + {0, 48, 24, 72}, + {24, 48, 48, 72}, + {48, 48, 72, 72}, + {72, 48, 96, 72}, + {288, 0, 312, 24}, + {24, 48, 48, 72}, + {96, 48, 120, 72} +}; + +const RECT grcKitR[21] = { + {0, 24, 24, 48}, + {24, 24, 48, 48}, + {48, 24, 72, 48}, + {0, 24, 24, 48}, + {72, 24, 96, 48}, + {0, 24, 24, 48}, + {96, 24, 120, 48}, + {120, 24, 144, 48}, + {144, 24, 168, 48}, + {168, 24, 192, 48}, + {192, 24, 216, 48}, + {216, 24, 240, 48}, + {240, 24, 264, 48}, + {264, 24, 288, 48}, + {0, 72, 24, 96}, + {24, 72, 48, 96}, + {48, 72, 72, 96}, + {72, 72, 96, 96}, + {288, 24, 312, 48}, + {24, 72, 48, 96}, + {96, 72, 120, 96} +}; + +// Gaudi +void ActNpc153(NPCHAR *npc) +{ + if (npc->x > gMC.x + (((WINDOW_WIDTH / 2) + 160) * 0x200) || npc->x < gMC.x - (((WINDOW_WIDTH / 2) + 160) * 0x200) || npc->y > gMC.y + (((WINDOW_HEIGHT / 2) + 120) * 0x200) || npc->y < gMC.y - (((WINDOW_HEIGHT / 2) + 120) * 0x200)) + return; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->xm = 0; + npc->ani_no = 0; + npc->y += 3 * 0x200; + // Fallthrough + case 1: + if (Random(0, 100) == 1) + { + npc->act_no = 2; + npc->ani_no = 1; + npc->act_wait = 0; + } + + if (Random(0, 100) == 1) + { + if (npc->direct == 0) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + + if (Random(0, 100) == 1) + npc->act_no = 10; + + break; + + case 2: + if (++npc->act_wait > 20) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = Random(25, 100); + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 11: + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + if (npc->act_wait != 0) + { + --npc->act_wait; + } + else + { + npc->act_no = 1; + npc->ani_no = 0; + npc->xm = 0; + } + + if (npc->direct == 0 && npc->flag & 1) + { + npc->ani_no = 2; + npc->ym = -0x5FF; + npc->act_no = 20; + + if (!(gMC.cond & 2)) + PlaySoundObject(30, SOUND_MODE_PLAY); + } + else if (npc->direct == 2 && npc->flag & 4) + { + npc->ani_no = 2; + npc->ym = -0x5FF; + npc->act_no = 20; + + if (!(gMC.cond & 2)) + PlaySoundObject(30, SOUND_MODE_PLAY); + } + + break; + + case 20: + if (npc->direct == 0 && npc->flag & 1) + ++npc->count1; + else if (npc->direct == 2 && npc->flag & 4) + ++npc->count1; + else + npc->count1 = 0; + + if (npc->count1 > 10) + { + if (npc->direct == 0) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + if (npc->flag & 8) + { + npc->act_no = 21; + npc->ani_no = 20; + npc->act_wait = 0; + npc->xm = 0; + + if (!(gMC.cond & 2)) + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + break; + + case 21: + if (++npc->act_wait > 10) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = grcKitL[npc->ani_no]; + else + npc->rect = grcKitR[npc->ani_no]; + + if (npc->life <= 985) + { + npc->code_char = 154; + npc->act_no = 0; + } +} + +// Gaudi (dead) +void ActNpc154(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->bits &= ~NPC_SHOOTABLE; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + npc->damage = 0; + npc->act_no = 1; + npc->ani_no = 9; + npc->ym = -0x200; + + if (npc->direct == 0) + npc->xm = 0x100; + else + npc->xm = -0x100; + + PlaySoundObject(53, SOUND_MODE_PLAY); + break; + + case 1: + if (npc->flag & 8) + { + npc->ani_no = 10; + npc->ani_wait = 0; + npc->act_no = 2; + npc->act_wait = 0; + } + + break; + + case 2: + npc->xm = (npc->xm * 8) / 9; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 11) + npc->ani_no = 10; + + if (++npc->act_wait > 50) + npc->cond |= 8; + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = grcKitL[npc->ani_no]; + else + npc->rect = grcKitR[npc->ani_no]; +} + +// Gaudi (flying) +void ActNpc155(NPCHAR *npc) +{ + unsigned char deg; + int xm, ym; + + if (npc->x > gMC.x + (((WINDOW_WIDTH / 2) + 160) * 0x200) || npc->x < gMC.x - (((WINDOW_WIDTH / 2) + 160) * 0x200) || npc->y > gMC.y + (((WINDOW_HEIGHT / 2) + 120) * 0x200) || npc->y < gMC.y - (((WINDOW_HEIGHT / 2) + 120) * 0x200)) + return; + + switch (npc->act_no) + { + case 0: + deg = Random(0, 0xFF); + npc->xm = GetCos(deg); + deg += 0x40; + npc->tgt_x = npc->x + (GetCos(deg) * 8); + + deg = Random(0, 0xFF); + npc->ym = GetSin(deg); + deg += 0x40; + npc->tgt_y = npc->y + (GetSin(deg) * 8); + + npc->act_no = 1; + npc->count1 = 120; + npc->act_wait = Random(70, 150); + npc->ani_no = 14; + // Fallthrough + case 1: + if (++npc->ani_no > 15) + npc->ani_no = 14; + + if (npc->act_wait != 0) + { + --npc->act_wait; + } + else + { + npc->act_no = 2; + npc->ani_no = 18; + } + + break; + + case 2: + if (++npc->ani_no > 19) + npc->ani_no = 18; + + if (++npc->act_wait > 30) + { + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-6, 6); + ym = GetSin(deg) * 3; + xm = GetCos(deg) * 3; + SetNpChar(156, npc->x, npc->y, xm, ym, 0, NULL, 0x100); + + if (!(gMC.cond & 2)) + PlaySoundObject(39, SOUND_MODE_PLAY); + + npc->act_no = 1; + npc->act_wait = Random(70, 150); + npc->ani_no = 14; + npc->ani_wait = 0; + } + + break; + } + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->tgt_x < npc->x) + npc->xm -= 0x10; + if (npc->tgt_x > npc->x) + npc->xm += 0x10; + + if (npc->tgt_y < npc->y) + npc->ym -= 0x10; + if (npc->tgt_y > npc->y) + npc->ym += 0x10; + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = grcKitL[npc->ani_no]; + else + npc->rect = grcKitR[npc->ani_no]; + + if (npc->life <= 985) + { + npc->code_char = 154; + npc->act_no = 0; + } +} + +// Gaudi projectile +void ActNpc156(NPCHAR *npc) +{ + if (npc->flag & 0xFF) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rect_left[3] = { + {96, 112, 112, 128}, + {112, 112, 128, 128}, + {128, 112, 144, 128}, + }; + + if (++npc->ani_no > 2) + npc->ani_no = 0; + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->count1 > 300) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } +} + +// Moving block (vertical) +void ActNpc157(NPCHAR *npc) +{ + int i; + + switch (npc->act_no) + { + case 0: + npc->x += 8 * 0x200; + npc->y += 8 * 0x200; + + if (npc->direct == 0) + npc->act_no = 10; + else + npc->act_no = 20; + + npc->xm = 0; + npc->ym = 0; + npc->bits |= NPC_SOLID_HARD; + + break; + + case 10: + npc->bits &= ~NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 0; + + if (gMC.y < npc->y + (25 * 0x200) && gMC.y > npc->y - (25 * 0x10 * 0x200) && gMC.x < npc->x + (25 * 0x200) && gMC.x > npc->x - (25 * 0x200)) + { + npc->act_no = 11; + npc->act_wait = 0; + } + + break; + + case 11: + if (++npc->act_wait % 10 == 6) + PlaySoundObject(107, SOUND_MODE_PLAY); + + if (npc->flag & 2) + { + npc->ym = 0; + npc->direct = gMirrorMode? 0:2; + npc->act_no = 20; + SetQuake(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y - (16 * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + break; + } + + if (gMC.flag & 2) + { + npc->bits |= NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 100; + } + else + { + npc->bits &= ~NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 0; + } + + npc->ym -= 0x20; + + break; + + case 20: + npc->bits &= ~NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 0; + + if (gMC.y > npc->y - (25 * 0x200) && gMC.y < npc->y + (25 * 0x10 * 0x200) && gMC.x < npc->x + (25 * 0x200) && gMC.x > npc->x - (25 * 0x200)) + { + npc->act_no = 21; + npc->act_wait = 0; + } + + break; + + case 21: + if (++npc->act_wait % 10 == 6) + PlaySoundObject(107, SOUND_MODE_PLAY); + + if (npc->flag & 8) + { + npc->ym = 0; + npc->direct = gMirrorMode? 2:0; + npc->act_no = 10; + SetQuake(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (16 * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + break; + } + + if (gMC.flag & 8) + { + npc->bits |= NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 100; + } + else + { + npc->bits &= ~NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 0; + } + + npc->ym += 0x20; + + break; + } + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + npc->y += npc->ym; + + RECT rect = {16, 0, 48, 32}; + npc->rect = rect; +} + +// Fish Missile +void ActNpc158(NPCHAR *npc) +{ + int dir; + + RECT rect[8] = { + {0, 224, 16, 240}, + {16, 224, 32, 240}, + {32, 224, 48, 240}, + {48, 224, 64, 240}, + {64, 224, 80, 240}, + {80, 224, 96, 240}, + {96, 224, 112, 240}, + {112, 224, 128, 240}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + switch (npc->direct) + { + case 0: + npc->count1 = 0xA0; + break; + + case 1: + npc->count1 = 0xE0; + break; + + case 2: + npc->count1 = 0x20; + break; + + case 3: + npc->count1 = 0x60; + break; + } + // Fallthrough + case 1: + npc->xm = 2 * GetCos(npc->count1); + npc->ym = 2 * GetSin(npc->count1); + npc->y += npc->ym; + npc->x += npc->xm; + dir = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + + if (dir < npc->count1) + { + if (npc->count1 - dir < 0x80) + --npc->count1; + else + ++npc->count1; + } + else + { + if (dir - npc->count1 < 0x80) + ++npc->count1; + else + --npc->count1; + } + + if (npc->count1 > 0xFF) + npc->count1 -= 0x100; + if (npc->count1 < 0) + npc->count1 += 0x100; + + break; + } + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + SetCaret(npc->x, npc->y, CARET_EXHAUST, DIR_AUTO); + } + + npc->ani_no = (npc->count1 + 0x10) / 0x20; + + if (npc->ani_no > 7) + npc->ani_no = 7; + + npc->rect = rect[npc->ani_no]; +} + +// Monster X (defeated) +void ActNpc159(NPCHAR *npc) +{ + int i; + + RECT rect = {144, 128, 192, 200}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + for (i = 0; i < 8; ++i) + SetNpChar(4, npc->x + (Random(-16, 16) * 0x200), npc->y + (Random(-16, 16) * 0x200), Random(-341, 341), Random(-341, 341), 0, NULL, 0x100); + // Fallthrough + case 1: + if (++npc->act_wait > 50) + { + npc->act_no = 2; + npc->xm = -0x100; + } + + if (npc->act_wait / 2 % 2) + npc->x += 0x200; + else + npc->x -= 0x200; + + break; + + case 2: + ++npc->act_wait; + npc->ym += 0x40; + + if (npc->y > 40 * 0x10 * 0x200) + npc->cond = 0; + + break; + } + + npc->y += npc->ym; + npc->x += npc->xm; + + npc->rect = rect; + + if (npc->act_wait % 8 == 1) + SetNpChar(4, npc->x + (Random(-16, 16) * 0x200), npc->y + (Random(-16, 16) * 0x200), Random(-341, 341), Random(-341, 341), 0, NULL, 0x100); +} diff --git a/src/NpcAct160.cpp b/src/NpcAct160.cpp new file mode 100644 index 0000000..bae88be --- /dev/null +++ b/src/NpcAct160.cpp @@ -0,0 +1,1676 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Caret.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Game.h" +#include "MyChar.h" +#include "MycHit.h" +#include "MycParam.h" +#include "NpChar.h" +#include "NpcHit.h" +#include "Sound.h" +#include "Triangle.h" + +// Puu Black +void ActNpc160(NPCHAR *npc) +{ + int i; + + switch (npc->act_no) + { + case 0: + npc->bits &= ~NPC_SOLID_SOFT; + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + npc->ym = 0xA00; + + if (npc->y < 128 * 0x200) + { + ++npc->count1; + } + else + { + npc->bits &= ~NPC_IGNORE_SOLIDITY; + npc->act_no = 2; + } + + break; + + case 2: + npc->ym = 0xA00; + + if (npc->flag & 8) + { + DeleteNpCharCode(161, TRUE); + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + npc->act_no = 3; + npc->act_wait = 0; + SetQuake(30); + PlaySoundObject(26, SOUND_MODE_PLAY); + PlaySoundObject(72, SOUND_MODE_PLAY); + } + + if (npc->y < gMC.y && gMC.flag & 8) + npc->damage = 20; + else + npc->damage = 0; + + break; + + case 3: + npc->damage = 20; // Overwritten by the following line + npc->damage = 0; + + if (++npc->act_wait > 24) + { + npc->act_no = 4; + npc->count1 = 0; + npc->count2 = 0; + } + + break; + + case 4: + gSuperXpos = npc->x; + gSuperYpos = npc->y; + + if (npc->shock % 2 == 1) + { + SetNpChar(161, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-0x600, 0x600), Random(-0x600, 0x600), 0, NULL, 0x100); + + if (++npc->count1 > 30) + { + npc->count1 = 0; + npc->act_no = 5; + npc->ym = -0xC00; + npc->bits |= NPC_IGNORE_SOLIDITY; + } + } + + break; + + case 5: + gSuperXpos = npc->x; + gSuperYpos = npc->y; + + if (++npc->count1 > 60) + { + npc->count1 = 0; + npc->act_no = 6; + } + + break; + + case 6: + gSuperXpos = gMC.x; + gSuperYpos = 400 * 0x10 * 0x200; + + if (++npc->count1 > 110) + { + npc->count1 = 10; + npc->x = gMC.x; + npc->y = 0; + npc->ym = 0x5FF; + npc->act_no = 1; + } + + break; + } + + npc->y += npc->ym; + + switch (npc->act_no) + { + case 0: + case 1: + npc->ani_no = 3; + break; + + case 2: + npc->ani_no = 3; + break; + + case 3: + npc->ani_no = 2; + break; + + case 4: + npc->ani_no = 0; + break; + + case 5: + npc->ani_no = 3; + break; + + case 6: + npc->ani_no = 3; + break; + } + + RECT rect_left[4] = { + {0, 0, 40, 24}, + {40, 0, 80, 24}, + {80, 0, 120, 24}, + {120, 0, 160, 24}, + }; + + RECT rect_right[4] = { + {0, 24, 40, 48}, + {40, 24, 80, 48}, + {80, 24, 120, 48}, + {120, 24, 160, 48}, + }; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Puu Black projectile +void ActNpc161(NPCHAR *npc) +{ + npc->exp = 0; + + if (npc->x < gSuperXpos) + npc->xm += 0x40; + else + npc->xm -= 0x40; + + if (npc->y < gSuperYpos) + npc->ym += 0x40; + else + npc->ym -= 0x40; + + if (npc->xm < -4605) + npc->xm = -4605; + if (npc->xm > 4605) + npc->xm = 4605; + + if (npc->ym < -4605) + npc->ym = -4605; + if (npc->ym > 4605) + npc->ym = 4605; + + if (npc->life < 100) + { + npc->bits &= ~NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + npc->damage = 0; + npc->ani_no = 2; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->ani_no < 2) + { + if (Random(0, 10) == 2) + npc->ani_no = 0; + else + npc->ani_no = 1; + } + + RECT rect[3] = { + {0, 48, 16, 64}, + {16, 48, 32, 64}, + {32, 48, 48, 64}, + }; + + npc->rect = rect[npc->ani_no]; +} + +// Puu Black (dead) +void ActNpc162(NPCHAR *npc) +{ + int i; + + RECT rect_left = {40, 0, 80, 24}; + RECT rect_right = {40, 24, 80, 48}; + RECT rect_end = {0, 0, 0, 0}; + + switch (npc->act_no) + { + case 0: + DeleteNpCharCode(161, TRUE); + PlaySoundObject(72, SOUND_MODE_PLAY); + + for (i = 0; i < 10; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-0x600, 0x600), Random(-0x600, 0x600), 0, NULL, 0x100); + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->direct == 0) + npc->rect = rect_left; + else + npc->rect = rect_right; + + npc->count1 = 0; + npc->act_no = 1; + // Fallthrough + case 1: + ++npc->count1; + + if (npc->count1 % 4 == 0) + SetNpChar(161, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), 0, 0, 0, NULL, 0x100); + + if (npc->count1 > 160) + { + npc->count1 = 0; + npc->act_no = 2; + npc->tgt_y = npc->y; + } + + break; + + case 2: + SetQuake(2); + + ++npc->count1; + + if (npc->count1 <= 240) + { + if (npc->direct == 0) + npc->rect = rect_left; + else + npc->rect = rect_right; + + npc->rect.top += npc->count1 / 8; + npc->y = npc->tgt_y + ((npc->count1 / 8) * 0x200); + npc->rect.left -= (npc->count1 / 2) % 2; + } + else + { + npc->rect = rect_end; + + npc->count1 = 0; + npc->act_no = 3; + } + + if (npc->count1 % 3 == 2) + SetNpChar(161, npc->x + (Random(-12, 12) * 0x200), npc->y - (12 * 0x200), Random(-0x200, 0x200), 0x100, 0, NULL, 0x100); + + if (npc->count1 % 4 == 2) + PlaySoundObject(21, SOUND_MODE_PLAY); + + break; + + case 3: + if (++npc->count1 < 60) + break; + + DeleteNpCharCode(161, TRUE); + npc->cond = 0; + + break; + + } + + gSuperXpos = npc->x; + gSuperYpos = -1000 * 0x200; +} + +// Dr Gero +void ActNpc163(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {192, 0, 208, 16}, + {208, 0, 224, 16}, + }; + + RECT rcRight[2] = { + {192, 16, 208, 32}, + {208, 16, 224, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Nurse Hasumi +void ActNpc164(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {224, 0, 240, 16}, + {240, 0, 256, 16}, + }; + + RECT rcRight[2] = { + {224, 16, 240, 32}, + {240, 16, 256, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Curly (collapsed) +void ActNpc165(NPCHAR *npc) +{ + RECT rcRight[2] = { + {192, 96, 208, 112}, + {208, 96, 224, 112}, + }; + + RECT rcLeft = {144, 96, 160, 112}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y += 10 * 0x200; + // Fallthrough + case 1: + if (npc->direct == 2 && gMC.x > npc->x - (32 * 0x200) && gMC.x < npc->x + (32 * 0x200) && gMC.y > npc->y - (16 * 0x200) && gMC.y < npc->y + (16 * 0x200)) + npc->ani_no = 1; + else + npc->ani_no = 0; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Chaba +void ActNpc166(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {144, 104, 184, 128}, + {184, 104, 224, 128}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + npc->rect = rcLeft[npc->ani_no]; +} + +// Professor Booster (falling) +void ActNpc167(NPCHAR *npc) +{ + int i; + + RECT rect[3] = { + {304, 0, 320, 16}, + {304, 16, 320, 32}, + {0, 0, 0, 0}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 1; + break; + + case 10: + npc->ani_no = 0; + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + npc->ani_no = 0; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 21: + if (++npc->ani_no > 2) + npc->ani_no = 1; + + if (++npc->act_wait > 100) + { + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + npc->cond = 0; + } + + break; + } + + npc->rect = rect[npc->ani_no]; +} + +// Boulder +void ActNpc168(NPCHAR *npc) +{ + RECT rect = {264, 56, 320, 96}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + npc->tgt_x = npc->x; + // Fallthrough + case 11: + ++npc->act_wait; + npc->x = npc->tgt_x; + + if (npc->act_wait / 3 % 2) + npc->x += 1 * 0x200; + + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + npc->ym = -0x400; + npc->xm = 0x100; + PlaySoundObject(25, SOUND_MODE_PLAY); + // Fallthrough + case 21: + npc->ym += 0x10; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->act_wait && npc->flag & 8) + { + PlaySoundObject(35, SOUND_MODE_PLAY); + SetQuake(40); + npc->act_no = 0; + } + + if (npc->act_wait == 0) + ++npc->act_wait; + + break; + } + + npc->rect = rect; +} + +// Balrog (missile) +void ActNpc169(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->act_wait = 30; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 1: + if (--npc->act_wait != 0) + break; + + npc->act_no = 2; + ++npc->count1; + break; + + case 2: + npc->act_no = 3; + npc->act_wait = 0; + npc->ani_no = 1; + npc->ani_wait = 0; + // Fallthrough + case 3: + ++npc->ani_wait; + + if (npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + + if (npc->ani_no == 2 || npc->ani_no == 4) + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + if (npc->ani_no > 4) + npc->ani_no = 1; + + if (npc->direct == 0) + npc->xm -= 0x20; + else + npc->xm += 0x20; + + if (npc->act_wait >= 8 && npc->x - (12 * 0x200) < gMC.x && npc->x + (12 * 0x200) > gMC.x && npc->y - (12 * 0x200) < gMC.y && npc->y + (8 * 0x200) > gMC.y) + { + npc->act_no = 10; + npc->ani_no = 5; + gMC.cond |= 2; + int damage = 5; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + damage = 127; + } + else{ + damage = damage * gbDamageModifier; + } + + DamageMyChar(damage); + break; + } + + ++npc->act_wait; + + if (npc->act_wait > 75) + { + npc->act_no = 9; + npc->ani_no = 0; + break; + } + + if (npc->flag & 5) + { + if (npc->count2 < 5) + { + ++npc->count2; + } + else + { + npc->act_no = 4; + npc->act_wait = 0; + npc->ani_no = 7; + npc->ym = -0x5FF; + } + } + else + { + npc->count2 = 0; + } + + if (npc->count1 % 2 == 0 && npc->act_wait > 25) + { + npc->act_no = 4; + npc->act_wait = 0; + npc->ani_no = 7; + npc->ym = -0x5FF; + break; + } + + break; + + case 4: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + ++npc->act_wait; + + if (npc->act_wait < 30 && npc->act_wait % 6 == 1) + { + PlaySoundObject(39, SOUND_MODE_PLAY); + SetNpChar(170, npc->x, npc->y, 0, 0, npc->direct, NULL, 0x100); + } + + if (npc->flag & 8) + { + npc->act_no = 9; + npc->ani_no = 8; + SetQuake(30); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + + if (npc->act_wait >= 8 && npc->x - (12 * 0x200) < gMC.x && npc->x + (12 * 0x200) > gMC.x && npc->y - (12 * 0x200) < gMC.y && npc->y + (8 * 0x200) > gMC.y) + { + npc->act_no = 10; + npc->ani_no = 5; + gMC.cond |= 2; + int damage = 10; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + damage = 127; + } + else{ + damage = damage * gbDamageModifier; + } + + DamageMyChar(damage); + } + + break; + + case 9: + npc->xm = (npc->xm * 4) / 5; + + if (npc->xm != 0) + break; + + npc->act_no = 0; + break; + + case 10: + gMC.x = npc->x; + gMC.y = npc->y; + + npc->xm = (npc->xm * 4) / 5; + + if (npc->xm != 0) + break; + + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_no = 5; + npc->ani_wait = 0; + break; + + case 11: + gMC.x = npc->x; + gMC.y = npc->y; + + ++npc->ani_wait; + + if (npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + npc->ani_no = 5; + + ++npc->act_wait; + + if (npc->act_wait > 100) + npc->act_no = 20; + + break; + + case 20: + PlaySoundObject(25, SOUND_MODE_PLAY); + gMC.cond &= ~2; + + if (npc->direct == 0) + { + gMC.x += 4 * 0x200; + gMC.y -= 8 * 0x200; + gMC.xm = 0x5FF; + gMC.ym = -0x200; + gMC.direct = 2; + npc->direct = gMirrorMode? 0:2; + } + else + { + gMC.x -= 4 * 0x200; + gMC.y -= 8 * 0x200; + gMC.xm = -0x5FF; + gMC.ym = -0x200; + gMC.direct = 0; + npc->direct = gMirrorMode? 2:0; + } + + npc->act_no = 21; + npc->act_wait = 0; + npc->ani_no = 7; + // Fallthrough + case 21: + ++npc->act_wait; + + if (npc->act_wait < 50) + break; + + npc->act_no = 0; + break; + } + + npc->ym += 0x20; + + if (npc->xm < -0x300) + npc->xm = -0x300; + if (npc->xm > 0x300) + npc->xm = 0x300; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[9] = { + {0, 0, 40, 24}, + {0, 48, 40, 72}, + {0, 0, 40, 24}, + {40, 48, 80, 72}, + {0, 0, 40, 24}, + {80, 48, 120, 72}, + {120, 48, 160, 72}, + {120, 0, 160, 24}, + {80, 0, 120, 24}, + }; + + RECT rect_right[9] = { + {0, 24, 40, 48}, + {0, 72, 40, 96}, + {0, 24, 40, 48}, + {40, 72, 80, 96}, + {0, 24, 40, 48}, + {80, 72, 120, 96}, + {120, 72, 160, 96}, + {120, 24, 160, 48}, + {80, 24, 120, 48}, + }; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Balrog missile +void ActNpc170(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {112, 96, 128, 104}, + {128, 96, 144, 104}, + }; + + RECT rcRight[2] = { + {112, 104, 128, 112}, + {128, 104, 144, 112}, + }; + + BOOL bHit = FALSE; + + if (npc->direct == 0 && npc->flag & 1) + bHit = TRUE; + if (npc->direct == 2 && npc->flag & 4) + bHit = TRUE; + + if (bHit) + { + PlaySoundObject(44, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x, npc->y, 0, 3); + VanishNpChar(npc); + return; + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 0) + npc->xm = Random(1, 2) * 0x200; + else + npc->xm = Random(-2, -1) * 0x200; + + npc->ym = Random(-2, 0) * 0x200; + // Fallthrough + case 1: + ++npc->count1; + + if (npc->direct == 0) + { + npc->xm -= 0x20; + + if (npc->count1 % 3 == 1) + SetCaret(npc->x + (8 * 0x200), npc->y, CARET_EXHAUST, DIR_RIGHT); + } + else + { + npc->xm += 0x20; + + if (npc->count1 % 3 == 1) + SetCaret(npc->x - (8 * 0x200), npc->y, CARET_EXHAUST, DIR_LEFT); + } + + if (npc->count1 < 50) + { + if (npc->y < gMC.y) + npc->ym += 0x20; + else + npc->ym -= 0x20; + } + else + { + npc->ym = 0; + } + + if (++npc->ani_no > 1) + npc->ani_no = 0; + + break; + } + + if (npc->xm < -0x400) + npc->xm = -0x600; + if (npc->xm > 0x400) + npc->xm = 0x600; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Fire Whirrr +void ActNpc171(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {120, 48, 152, 80}, + {152, 48, 184, 80}, + }; + + RECT rcRight[2] = { + {184, 48, 216, 80}, + {216, 48, 248, 80}, + }; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = Random(0, 50); + npc->tgt_y = npc->y; + // Fallthrough + case 1: + if (npc->act_wait != 0) + { + --npc->act_wait; + } + else + { + npc->act_no = 10; + npc->ym = 0x200; + } + // Fallthrough + case 10: + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->y < npc->tgt_y) + npc->ym += 0x10; + else + npc->ym -= 0x10; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + npc->y += npc->ym; + + if (npc->direct == 0) + { + if (gMC.y < npc->y + (80 * 0x200) && gMC.y > npc->y - (80 * 0x200) && gMC.x < npc->x && gMC.x > npc->x - (160 * 0x200)) + ++npc->count1; + } + else + { + if (gMC.y < npc->y + (80 * 0x200) && gMC.y > npc->y - (80 * 0x200) && gMC.x < npc->x + (160 * 0x200) && gMC.x > npc->x) + ++npc->count1; + } + + if (npc->count1 > 20) + { + SetNpChar(172, npc->x, npc->y, 0, 0, npc->direct, NULL, 0x100); + npc->count1 = -100; + gCurlyShoot_wait = Random(80, 100); + gCurlyShoot_x = npc->x; + gCurlyShoot_y = npc->y; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Fire Whirr projectile +void ActNpc172(NPCHAR *npc) +{ + RECT rect[3] = { + {248, 48, 264, 80}, + {264, 48, 280, 80}, + {280, 48, 296, 80}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (npc->direct == 0) + npc->x -= 1 * 0x200; + else + npc->x += 1 * 0x200; + + if (npc->flag & 1 || npc->flag & 4) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + VanishNpChar(npc); + return; + } + + break; + } + + npc->rect = rect[npc->ani_no]; +} + +// Gaudi (armoured) +void ActNpc173(NPCHAR *npc) +{ + unsigned char deg; + int xm, ym; + + RECT rcLeft[4] = { + {0, 128, 24, 152}, + {24, 128, 48, 152}, + {48, 128, 72, 152}, + {72, 128, 96, 152}, + }; + + RECT rcRight[4] = { + {0, 152, 24, 176}, + {24, 152, 48, 176}, + {48, 152, 72, 176}, + {72, 152, 96, 176}, + }; + + if (npc->x > gMC.x + (((WINDOW_WIDTH / 2) + 160) * 0x200) || npc->x < gMC.x - (((WINDOW_WIDTH / 2) + 160) * 0x200) || npc->y > gMC.y + (((WINDOW_HEIGHT / 2) + 120) * 0x200) || npc->y < gMC.y - (((WINDOW_HEIGHT / 2) + 120) * 0x200)) + return; + + switch (npc->act_no) + { + case 0: + npc->tgt_x = npc->x; + npc->act_no = 1; + // Fallthrough + case 1: + npc->ani_no = 0; + npc->xm = 0; + + if (npc->act_wait < 5) + { + ++npc->act_wait; + } + else + { + if (npc->x - (192 * 0x200) < gMC.x && npc->x + (192 * 0x200) > gMC.x && npc->y - (160 * 0x200) < gMC.y && npc->y + (160 * 0x200) > gMC.y) + { + npc->act_no = 10; + npc->act_wait = 0; + npc->ani_no = 1; + } + } + + break; + + case 10: + if (++npc->act_wait > 3) + { + if (++npc->count1 == 3) + { + PlaySoundObject(30, SOUND_MODE_PLAY); + npc->count1 = 0; + npc->act_no = 25; + npc->act_wait = 0; + npc->ani_no = 2; + npc->ym = -0x600; + + if (npc->x < npc->tgt_x) + npc->xm = 0x80; + else + npc->xm = -0x80; + } + else + { + PlaySoundObject(30, SOUND_MODE_PLAY); + npc->act_no = 20; + npc->ani_no = 2; + npc->ym = -0x200; + + if (npc->x < npc->tgt_x) + npc->xm = 0x200; + else + npc->xm = -0x200; + } + } + + break; + + case 20: + ++npc->act_wait; + + if (npc->flag & 8) + { + PlaySoundObject(23, SOUND_MODE_PLAY); + npc->ani_no = 1; + npc->act_no = 30; + npc->act_wait = 0; + } + + break; + + case 25: + if (++npc->act_wait == 30 || npc->act_wait == 40) + { + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-6, 6); + ym = GetSin(deg) * 3; + xm = GetCos(deg) * 3; + + SetNpChar(174, npc->x, npc->y, xm, ym, 0, NULL, 0x100); + + PlaySoundObject(39, SOUND_MODE_PLAY); + npc->ani_no = 3; + + gCurlyShoot_wait = Random(80, 100); + gCurlyShoot_x = npc->x; + gCurlyShoot_y = npc->y; + } + + if (npc->act_wait == 35 || npc->act_wait == 45) + npc->ani_no = 2; + + if (npc->flag & 8) + { + PlaySoundObject(23, SOUND_MODE_PLAY); + npc->ani_no = 1; + npc->act_no = 30; + npc->act_wait = 0; + } + + break; + + case 30: + npc->xm = 7 * npc->xm / 8; + + if (++npc->act_wait > 3) + { + npc->ani_no = 0; + npc->act_no = 1; + npc->act_wait = 0; + } + + break; + } + + npc->ym += 51; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + if (npc->ym < -0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->life <= 985) + { + SetDestroyNpChar(npc->x, npc->y, 0, 2); + npc->code_char = 154; + npc->act_no = 0; + } +} + +// Armoured-Gaudi projectile +void ActNpc174(NPCHAR *npc) +{ + BOOL bHit; + + switch (npc->act_no) + { + case 0: + if (npc->direct == 2) + npc->act_no = 2; + // Fallthrough + case 1: + npc->x += npc->xm; + npc->y += npc->ym; + + bHit = FALSE; + + if (npc->flag & 1) + { + bHit = TRUE; + npc->xm = 0x200; + } + + if (npc->flag & 4) + { + bHit = TRUE; + npc->xm = -0x200; + } + + if (npc->flag & 2) + { + bHit = TRUE; + npc->ym = 0x200; + } + + if (npc->flag & 8) + { + bHit = TRUE; + npc->ym = -0x200; + } + + if (bHit) + { + npc->act_no = 2; + ++npc->count1; + PlaySoundObject(31, SOUND_MODE_PLAY); + } + + break; + + case 2: + npc->ym += 0x40; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->flag & 8) + { + if (++npc->count1 > 1) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } + } + + break; + } + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + + RECT rect_left[3] = { + {120, 80, 136, 96}, + {136, 80, 152, 96}, + {152, 80, 168, 96}, + }; + + if (++npc->ani_no > 2) + npc->ani_no = 0; + + npc->rect = rect_left[npc->ani_no]; +} + +// Gaudi egg +void ActNpc175(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {168, 80, 192, 104}, + {192, 80, 216, 104}, + }; + + RECT rcRight[2] = { + {216, 80, 240, 104}, + {240, 80, 264, 104}, + }; + + if (npc->act_no < 3 && npc->life < 90) + { + LoseNpChar(npc, FALSE); + npc->act_no = 10; + npc->ani_no = 1; + npc->bits &= ~NPC_SHOOTABLE; + npc->damage = 0; + } + + switch (npc->act_no) + { + case 0: + npc->ani_no = 0; + npc->act_no = 1; + break; + } + + if (npc->direct == 0) + npc->ym += 0x20; + else + npc->ym -= 0x20; + + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// BuyoBuyo Base +void ActNpc176(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {96, 128, 128, 144}, + {128, 128, 160, 144}, + {160, 128, 192, 144}, + }; + + RECT rcRight[3] = { + {96, 144, 128, 160}, + {128, 144, 160, 160}, + {160, 144, 192, 160}, + }; + + if (npc->act_no < 3 && npc->life < 940) + { + LoseNpChar(npc, FALSE); + npc->act_no = 10; + npc->ani_no = 2; + npc->bits &= ~NPC_SHOOTABLE; + npc->damage = 0; + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (npc->direct == 0) + { + if (npc->x < gMC.x + (160 * 0x200) && npc->x > gMC.x - (160 * 0x200) && npc->y < gMC.y + (160 * 0x200) && npc->y > gMC.y - (16 * 0x200)) + ++npc->count1; + } + else + { + if (npc->x < gMC.x + (160 * 0x200) && npc->x > gMC.x - (160 * 0x200) && npc->y < gMC.y + (16 * 0x200) && npc->y > gMC.y - (160 * 0x200)) + ++npc->count1; + } + + if (npc->count1 > 10) + { + npc->act_no = 2; + npc->act_wait = 0; + } + + break; + + case 2: + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (++npc->act_wait > 10) + { + if (++npc->count2 > 2) + { + npc->count2 = 0; + npc->count1 = -90; + } + else + { + npc->count1 = -10; + } + + if (npc->direct == 0) + SetNpChar(177, npc->x, npc->y - (8 * 0x200), 0, 0, 0, NULL, 0x100); + else + SetNpChar(177, npc->x, npc->y + (8 * 0x200), 0, 0, 2, NULL, 0x100); + + PlaySoundObject(39, SOUND_MODE_PLAY); + + npc->act_no = 0; + npc->ani_no = 0; + + gCurlyShoot_wait = Random(80, 100); + gCurlyShoot_x = npc->x; + gCurlyShoot_y = npc->y; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// BuyoBuyo +void ActNpc177(NPCHAR *npc) +{ + RECT rc[2] = { + {192, 128, 208, 144}, + {208, 128, 224, 144}, + }; + + if (npc->flag & 0xFF) + { + SetCaret(npc->x, npc->y, CARET_SHOOT, DIR_LEFT); + npc->cond = 0; + return; + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 0) + npc->ym = -0x600; + else + npc->ym = 0x600; + // Fallthrough + case 1: + if (npc->y < gMC.y + (16 * 0x200) && npc->y > gMC.y - (16 * 0x200)) + { + npc->act_no = 10; + + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->xm = ((Random(0, 1) * 0x200) - 0x100) * 2; + npc->ym = ((Random(0, 1) * 0x200) - 0x100) * 2; + } + + break; + + case 10: + if (npc->x < npc->tgt_x) + npc->xm += 0x20; + else + npc->xm -= 0x20; + + if (npc->y < npc->tgt_y) + npc->ym += 0x20; + else + npc->ym -= 0x20; + + if (++npc->act_wait > 300) + { + SetCaret(npc->x, npc->y, CARET_SHOOT, DIR_LEFT); + npc->cond = 0; + return; + } + + if (npc->direct == 0) + npc->tgt_x -= 1 * 0x200; + else + npc->tgt_x += 1 * 0x200; + + break; + } + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x400) + npc->ym = 0x400; + if (npc->ym < -0x400) + npc->ym = -0x400; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (++npc->ani_wait > 6) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + npc->rect = rc[npc->ani_no]; +} + +// Core blade projectile +void ActNpc178(NPCHAR *npc) +{ + if (npc->flag & 0xFF) + { + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + npc->cond = 0; + } + + if (npc->flag & 0x100) + { + npc->y += npc->ym / 2; + npc->x += npc->xm / 2; + } + else + { + npc->y += npc->ym; + npc->x += npc->xm; + } + + RECT rect_left[3] = { + {0, 224, 16, 240}, + {16, 224, 32, 240}, + {32, 224, 48, 240}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->count1 > 150) + { + VanishNpChar(npc); + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } +} + +// Core wisp projectile +void ActNpc179(NPCHAR *npc) +{ + if (npc->flag & 0xFF) + { + npc->cond = 0; + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } + + npc->xm -= 0x20; + npc->ym = 0; + + if (npc->xm < -0x400) + npc->xm = -0x400; + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rect_left[3] = { + {48, 224, 72, 240}, + {72, 224, 96, 240}, + {96, 224, 120, 240}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->count1 > 300) + { + VanishNpChar(npc); + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } +} diff --git a/src/NpcAct180.cpp b/src/NpcAct180.cpp new file mode 100644 index 0000000..708b10c --- /dev/null +++ b/src/NpcAct180.cpp @@ -0,0 +1,1448 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Back.h" +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Flags.h" +#include "Frame.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "NpcHit.h" +#include "Sound.h" +#include "Triangle.h" + +// Curly AI +void ActNpc180(NPCHAR *npc) +{ + int xx, yy; + + RECT rcLeft[11] = { + {0, 96, 16, 112}, + {16, 96, 32, 112}, + {0, 96, 16, 112}, + {32, 96, 48, 112}, + {0, 96, 16, 112}, + {48, 96, 64, 112}, + {64, 96, 80, 112}, + {48, 96, 64, 112}, + {80, 96, 96, 112}, + {48, 96, 64, 112}, + {144, 96, 160, 112}, + }; + + RECT rcRight[11] = { + {0, 112, 16, 128}, + {16, 112, 32, 128}, + {0, 112, 16, 128}, + {32, 112, 48, 128}, + {0, 112, 16, 128}, + {48, 112, 64, 128}, + {64, 112, 80, 128}, + {48, 112, 64, 128}, + {80, 112, 96, 128}, + {48, 112, 64, 128}, + {144, 112, 160, 128}, + }; + + if (npc->y < gMC.y - (10 * 0x10 * 0x200)) + { + if (npc->y < 16 * 0x10 * 0x200) + { + npc->tgt_x = 320 * 0x10 * 0x200; + npc->tgt_y = npc->y; + } + else + { + npc->tgt_x = 0; + npc->tgt_y = npc->y; + } + } + else + { + if (gCurlyShoot_wait != 0) + { + npc->tgt_x = gCurlyShoot_x; + npc->tgt_y = gCurlyShoot_y; + } + else + { + npc->tgt_x = gMC.x; + npc->tgt_y = gMC.y; + } + } + + if (npc->xm < 0 && npc->flag & 1) + npc->xm = 0; + if (npc->xm > 0 && npc->flag & 4) + npc->xm = 0; + + switch (npc->act_no) + { + case 20: + npc->x = gMC.x; + npc->y = gMC.y; + npc->act_no = 100; + npc->ani_no = 0; + SetNpChar(183, 0, 0, 0, 0, 0, npc, 0x100); + + if (GetNPCFlag(563)) + SetNpChar(182, 0, 0, 0, 0, 0, npc, 0x100); + else + SetNpChar(181, 0, 0, 0, 0, 0, npc, 0x100); + + break; + + case 40: + npc->act_no = 41; + npc->act_wait = 0; + npc->ani_no = 10; + // Fallthrough + case 41: + if (++npc->act_wait == 750) + { + npc->bits &= ~NPC_INTERACTABLE; + npc->ani_no = 0; + } + + if (npc->act_wait > 1000) + { + npc->act_no = 100; + npc->ani_no = 0; + SetNpChar(183, 0, 0, 0, 0, 0, npc, 0x100); + + if (GetNPCFlag(563)) + SetNpChar(182, 0, 0, 0, 0, 0, npc, 0x100); + else + SetNpChar(181, 0, 0, 0, 0, 0, npc, 0x100); + } + + break; + + case 100: + npc->ani_no = 0; + npc->xm = (npc->xm * 7) / 8; + npc->count1 = 0; + + if (npc->x > npc->tgt_x + (16 * 0x200)) + { + npc->act_no = 200; + npc->ani_no = 1; + npc->direct = gMirrorMode? 2:0; + npc->act_wait = Random(20, 60); + } + else if (npc->x < npc->tgt_x - (16 * 0x200)) + { + npc->act_no = 300; + npc->ani_no = 1; + npc->direct = gMirrorMode? 0:2; + npc->act_wait = Random(20, 60); + } + + break; + + case 200: + npc->xm -= 0x20; + npc->direct = gMirrorMode? 2:0; + + if (npc->flag & 1) + ++npc->count1; + else + npc->count1 = 0; + + break; + + case 210: + npc->xm -= 0x20; + npc->direct = gMirrorMode? 2:0; + + if (npc->flag & 8) + npc->act_no = 100; + + break; + + case 300: + npc->xm += 0x20; + npc->direct = gMirrorMode? 0:2; + + if (npc->flag & 4) + ++npc->count1; + else + npc->count1 = 0; + + break; + + case 310: + npc->xm += 0x20; + npc->direct = gMirrorMode? 0:2; + + if (npc->flag & 8) + npc->act_no = 100; + + break; + } + + if (gCurlyShoot_wait != 0) + --gCurlyShoot_wait; + + if (gCurlyShoot_wait == 70) + npc->count2 = 10; + + if (gCurlyShoot_wait == 60 && npc->flag & 8 && Random(0, 2)) + { + npc->count1 = 0; + npc->ym = -0x600; + npc->ani_no = 1; + PlaySoundObject(15, SOUND_MODE_PLAY); + + if (npc->x > npc->tgt_x) + npc->act_no = 210; + else + npc->act_no = 310; + } + + xx = npc->x - npc->tgt_x; + yy = npc->y - npc->tgt_y; + + if (xx < 0) + xx *= -1; + + if (npc->act_no == 100) + { + if (xx + (2 * 0x200) < yy) + npc->ani_no = 5; + else + npc->ani_no = 0; + } + + if (npc->act_no == 210 || npc->act_no == 310) + { + if (xx + (2 * 0x200) < yy) + npc->ani_no = 6; + else + npc->ani_no = 1; + } + + if (npc->act_no == 200 || npc->act_no == 300) + { + ++npc->ani_wait; + + if (xx + (2 * 0x200) < yy) + npc->ani_no = 6 + (npc->ani_wait / 4 % 4); + else + npc->ani_no = 1 + (npc->ani_wait / 4 % 4); + + if (npc->act_wait) + { + --npc->act_wait; + +#ifdef FIX_BUGS + // I assume this is what was intended + if (npc->flag & 8 && npc->count1 > 10) +#else + if (npc->flag && 8 && npc->count1 > 10) +#endif + { + npc->count1 = 0; + npc->ym = -0x600; + npc->act_no += 10; + npc->ani_no = 1; + PlaySoundObject(15, SOUND_MODE_PLAY); + } + } + else + { + npc->act_no = 100; + npc->ani_no = 0; + } + } + + if (npc->act_no >= 100 && npc->act_no < 500) + { + if (npc->x < gMC.x - (80 * 0x200) || npc->x > gMC.x + (80 * 0x200)) + { +#ifdef FIX_BUGS + if (npc->flag & 5) +#else + if (npc->flag && 5) +#endif + npc->ym += 0x200 / 32; + else + npc->ym += 0x200 / 10; + } + else + { + npc->ym += 0x200 / 10; + } + } + + if (npc->xm > 0x300) + npc->xm = 0x300; + if (npc->xm < -0x300) + npc->xm = -0x300; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->act_no >= 100 && !(npc->flag & 8)) + { + switch (npc->ani_no) + { + case 1000: + break; + + default: + if (xx + (2 * 0x200) < yy) + npc->ani_no = 6; + else + npc->ani_no = 1; + + break; + } + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Curly AI Machine Gun +void ActNpc181(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {216, 152, 232, 168}, + {232, 152, 248, 168}, + }; + + RECT rcRight[2] = { + {216, 168, 232, 184}, + {232, 168, 248, 184}, + }; + + if (npc->pNpc == NULL) + return; + + if (npc->pNpc->ani_no < 5) + { + if (npc->pNpc->direct == 0) + { + npc->direct = gMirrorMode? 2:0; + npc->x = npc->pNpc->x - (8 * 0x200); + } + else + { + npc->direct = gMirrorMode? 0:2; + npc->x = npc->pNpc->x + (8 * 0x200); + } + + npc->y = npc->pNpc->y; + npc->ani_no = 0; + } + else + { + if (npc->pNpc->direct == 0) + { + npc->direct = gMirrorMode? 2:0; + npc->x = npc->pNpc->x; + } + else + { + npc->direct = gMirrorMode? 0:2; + npc->x = npc->pNpc->x; + } + + npc->y = npc->pNpc->y - (10 * 0x200); + npc->ani_no = 1; + } + + if (npc->pNpc->ani_no == 1 || npc->pNpc->ani_no == 3 || npc->pNpc->ani_no == 6 || npc->pNpc->ani_no == 8) + npc->y -= 1 * 0x200; + + switch (npc->act_no) + { + case 0: + if (npc->pNpc->count2 == 10) + { + npc->pNpc->count2 = 0; + npc->act_no = 10; + npc->act_wait = 0; + } + + break; + + case 10: + if (++npc->act_wait % 6 == 1) + { + if (npc->ani_no == 0) + { + if (npc->direct == 0) + { + SetBullet(12, npc->x - (4 * 0x200), npc->y + (3 * 0x200), 0); + SetCaret(npc->x - (4 * 0x200), npc->y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(12, npc->x + (4 * 0x200), npc->y + (3 * 0x200), 2); + SetCaret(npc->x + (4 * 0x200), npc->y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (npc->direct == 0) + { + SetBullet(12, npc->x - (2 * 0x200), npc->y - (4 * 0x200), 1); + SetCaret(npc->x - (2 * 0x200), npc->y - (4 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(12, npc->x + (2 * 0x200), npc->y - (4 * 0x200), 1); + SetCaret(npc->x + (2 * 0x200), npc->y - (4 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + } + + if (npc->act_wait == 60) + npc->act_no = 0; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Curly AI Polar Star +void ActNpc182(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {184, 152, 200, 168}, + {200, 152, 216, 168}, + }; + + RECT rcRight[2] = { + {184, 168, 200, 184}, + {200, 168, 216, 184}, + }; + + if (npc->pNpc == NULL) + return; + + if (npc->pNpc->ani_no < 5) + { + if (npc->pNpc->direct == 0) + { + npc->direct = gMirrorMode? 2:0; + npc->x = npc->pNpc->x - (8 * 0x200); + } + else + { + npc->direct = gMirrorMode? 0:2; + npc->x = npc->pNpc->x + (8 * 0x200); + } + + npc->y = npc->pNpc->y; + npc->ani_no = 0; + } + else + { + if (npc->pNpc->direct == 0) + { + npc->direct = gMirrorMode? 2:0; + npc->x = npc->pNpc->x; + } + else + { + npc->direct = gMirrorMode? 0:2; + npc->x = npc->pNpc->x; + } + + npc->y = npc->pNpc->y - (10 * 0x200); + npc->ani_no = 1; + } + + if (npc->pNpc->ani_no == 1 || npc->pNpc->ani_no == 3 || npc->pNpc->ani_no == 6 || npc->pNpc->ani_no == 8) + npc->y -= 1 * 0x200; + + switch (npc->act_no) + { + case 0: + if (npc->pNpc->count2 == 10) + { + npc->pNpc->count2 = 0; + npc->act_no = 10; + npc->act_wait = 0; + } + + break; + + case 10: + if (++npc->act_wait % 12 == 1) + { + if (npc->ani_no == 0) + { + if (npc->direct == 0) + { + SetBullet(6, npc->x - (4 * 0x200), npc->y + (3 * 0x200), 0); + SetCaret(npc->x - (4 * 0x200), npc->y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(6, npc->x + (4 * 0x200), npc->y + (3 * 0x200), 2); + SetCaret(npc->x + (4 * 0x200), npc->y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (npc->direct == 0) + { + SetBullet(6, npc->x - (2 * 0x200), npc->y - (4 * 0x200), 1); + SetCaret(npc->x - (2 * 0x200), npc->y - (4 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(6, npc->x + (2 * 0x200), npc->y - (4 * 0x200), 1); + SetCaret(npc->x + (2 * 0x200), npc->y - (4 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + } + + if (npc->act_wait == 60) + npc->act_no = 0; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Curly Air Tank Bubble +void ActNpc183(NPCHAR *npc) +{ + RECT rect[2] = { + {56, 96, 80, 120}, + {80, 96, 104, 120}, + }; + + if (npc->pNpc == NULL) + return; + + switch (npc->act_no) + { + case 0: + npc->x = npc->pNpc->x; + npc->y = npc->pNpc->y; + npc->act_no = 1; + break; + } + + npc->x += (npc->pNpc->x - npc->x) / 2; + npc->y += (npc->pNpc->y - npc->y) / 2; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->pNpc->flag & 0x100) + npc->rect = rect[npc->ani_no]; + else + npc->rect.right = 0; +} + +// Big Shutter +void ActNpc184(NPCHAR *npc) +{ + int i; + + RECT rc[4] = { + {0, 64, 32, 96}, + {32, 64, 64, 96}, + {64, 64, 96, 96}, + {32, 64, 64, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->x += 8 * 0x200; + npc->y += 8 * 0x200; + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 1; + npc->act_wait = 0; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 11: + switch (npc->direct) + { + case 0: + npc->x -= 0x80; + break; + + case 1: + npc->y -= 0x80; + break; + + case 2: + npc->x += 0x80; + break; + + case 3: + npc->y += 0x80; + break; + } + + if ((++npc->act_wait % 8) == 0) + PlaySoundObject(26, SOUND_MODE_PLAY); + + SetQuake(20); + break; + + case 20: + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (16 * 0x200), Random(-0x155, 0x155), Random(-0x600, 0), 0, NULL, 0x100); + + npc->act_no = 1; + break; + } + + if (++npc->ani_wait > 10) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + npc->rect = rc[npc->ani_no]; +} + +// Small Shutter +void ActNpc185(NPCHAR *npc) +{ + RECT rc = {96, 64, 112, 96}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y += 8 * 0x200; + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 1; + npc->act_wait = 0; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 11: + switch (npc->direct) + { + case 0: + npc->x -= 0x80; + break; + + case 1: + npc->y -= 0x80; + break; + + case 2: + npc->x += 0x80; + break; + + case 3: + npc->y += 0x80; + break; + } + + ++npc->act_wait; + break; + + case 20: + npc->y -= 24 * 0x200; + npc->act_no = 1; + break; + } + + npc->rect = rc; +} + +// Lift block +void ActNpc186(NPCHAR *npc) +{ + RECT rc[4] = { + {48, 48, 64, 64}, + {64, 48, 80, 64}, + {80, 48, 96, 64}, + {64, 48, 80, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 1; + npc->act_wait = 0; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 11: + switch (npc->direct) + { + case 0: + npc->x -= 0x80; + break; + + case 1: + npc->y -= 0x80; + break; + + case 2: + npc->x += 0x80; + break; + + case 3: + npc->y += 0x80; + break; + } + + ++npc->act_wait; + break; + } + + if (++npc->ani_wait > 10) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + npc->rect = rc[npc->ani_no]; +} + +// Fuzz Core +void ActNpc187(NPCHAR *npc) +{ + int i; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->count1 = 120; + npc->act_wait = Random(0, 50); + + for (i = 0; i < 5; ++i) + SetNpChar(188, 0, 0, 0, 0, 51 * i, npc, 0x100); + // Fallthrough + case 1: + if (++npc->act_wait < 50) + break; + + npc->act_wait = 0; + npc->act_no = 2; + npc->ym = 0x300; + break; + + case 2: + npc->count1 += 4; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->tgt_y < npc->y) + npc->ym -= 0x10; + if (npc->tgt_y > npc->y) + npc->ym += 0x10; + + if (npc->ym > 0x355) + npc->ym = 0x355; + if (npc->ym < -0x355) + npc->ym = -0x355; + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[2] = { + {224, 104, 256, 136}, + {256, 104, 288, 136}, + }; + + RECT rect_right[2] = { + {224, 136, 256, 168}, + {256, 136, 288, 168}, + }; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Fuzz +void ActNpc188(NPCHAR *npc) +{ + unsigned char deg; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->count1 = npc->direct; + // Fallthrough + case 1: + if (npc->pNpc->code_char == 187 && npc->pNpc->cond & 0x80) + { + deg = (npc->pNpc->count1 + npc->count1) % 0x100; + npc->x = npc->pNpc->x + (GetSin(deg) * 20); + npc->y = npc->pNpc->y + (GetCos(deg) * 0x20); + } + else + { + npc->xm = Random(-0x200, 0x200); + npc->ym = Random(-0x200, 0x200); + npc->act_no = 10; + } + + break; + + case 10: + if (gMC.x < npc->x) + npc->xm -= 0x20; + else + npc->xm += 0x20; + + if (gMC.y < npc->y) + npc->ym -= 0x20; + else + npc->ym += 0x20; + + if (npc->xm > 0x800) + npc->xm = 0x800; + if (npc->xm < -0x800) + npc->xm = -0x800; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + npc->x += npc->xm; + npc->y += npc->ym; + + break; + } + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + RECT rect_left[2] = { + {288, 104, 304, 120}, + {304, 104, 320, 120}, + }; + + RECT rect_right[2] = { + {288, 120, 304, 136}, + {304, 120, 320, 136}, + }; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Unused homing flame object (possibly related to the Core?) +void ActNpc189(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->xm = -0x40; + // Fallthrough + case 1: + npc->y += npc->ym; + + if (++npc->act_wait > 0x100) + npc->act_no = 10; + + break; + + case 10: + if (gMC.x < npc->x) + npc->xm -= 8; + else + npc->xm += 8; + + if (gMC.y < npc->y) + npc->ym -= 8; + else + npc->ym += 8; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x400) + npc->ym = 0x400; + if (npc->ym < -0x400) + npc->ym = -0x400; + + npc->x += npc->xm; + npc->y += npc->ym; + + break; + } + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + RECT rect[3] = { + {224, 184, 232, 200}, + {232, 184, 240, 200}, + {240, 184, 248, 200}, + }; + + npc->rect = rect[npc->ani_no]; +} + +// Broken robot +void ActNpc190(NPCHAR *npc) +{ + RECT rect[2] = { + {192, 32, 208, 48}, + {208, 32, 224, 48}, + }; + + int i; + + switch (npc->act_no) + { + case 0: + npc->ani_no = 0; + break; + + case 10: + PlaySoundObject(72, SOUND_MODE_PLAY); + + for (i = 0; i < 8; ++i) + SetNpChar(4, npc->x, npc->y + (Random(-8, 8) * 0x200), Random(-8, -2) * 0x200, Random(-3, 3) * 0x200, 0, NULL, 0x100); + + npc->cond = 0; + break; + + case 20: + if (++npc->ani_wait > 10) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + } + + npc->rect = rect[npc->ani_no]; +} + +// Water level +void ActNpc191(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 10; + npc->tgt_y = npc->y; + npc->ym = 0x200; + // Fallthrough + case 10: + if (npc->y < npc->tgt_y) + npc->ym += 4; + else + npc->ym -= 4; + + if (npc->ym < -0x100) + npc->ym = -0x100; + if (npc->ym > 0x100) + npc->ym = 0x100; + + npc->y += npc->ym; + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + // Fallthrough + case 21: + if (npc->y < npc->tgt_y) + npc->ym += 4; + else + npc->ym -= 4; + + if (npc->ym < -0x200) + npc->ym = -0x200; + if (npc->ym > 0x200) + npc->ym = 0x200; + + npc->y += npc->ym; + + if (++npc->act_wait > 1000) + npc->act_no = 22; + + break; + + case 22: + if (npc->y < 0) + npc->ym += 4; + else + npc->ym -= 4; + + if (npc->ym < -0x200) + npc->ym = -0x200; + if (npc->ym > 0x200) + npc->ym = 0x200; + + npc->y += npc->ym; + + if (npc->y < 64 * 0x200 || gSuperYpos != 0) + { + npc->act_no = 21; + npc->act_wait = 0; + } + break; + + case 30: + if (npc->y < 0) + npc->ym += 4; + else + npc->ym -= 4; + + if (npc->ym < -0x200) + npc->ym = -0x200; + if (npc->ym > 0x100) + npc->ym = 0x100; + + npc->y += npc->ym; + break; + } + + gWaterY = npc->y; + + npc->rect.right = 0; + npc->rect.bottom = 0; +} + +// Scooter +void ActNpc192(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->view.back = 16 * 0x200; + npc->view.front = 16 * 0x200; + npc->view.top = 8 * 0x200; + npc->view.bottom = 8 * 0x200; + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 1; + npc->view.top = 16 * 0x200; + npc->view.bottom = 16 * 0x200; + npc->y -= 5 * 0x200; + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + // Fallthrough + case 21: + npc->x = npc->tgt_x + (Random(-1, 1) * 0x200); + npc->y = npc->tgt_y + (Random(-1, 1) * 0x200); + + if (++npc->act_wait > 30) + npc->act_no = 30; + + break; + + case 30: + npc->act_no = 31; + npc->act_wait = 1; + npc->xm = -0x800; + npc->x = npc->tgt_x; + npc->y = npc->tgt_y; + PlaySoundObject(44, SOUND_MODE_PLAY); + // Fallthrough + case 31: + npc->xm += 0x20; + npc->x += npc->xm; + ++npc->act_wait; + npc->y = npc->tgt_y + (Random(-1, 1) * 0x200); + + if (npc->act_wait > 10) + npc->direct = gMirrorMode? 0:2; + + if (npc->act_wait > 200) + npc->act_no = 40; + + break; + + case 40: + npc->act_no = 41; + npc->act_wait = 2; + npc->direct = gMirrorMode? 2:0; + npc->y -= 48 * 0x200; + npc->xm = -0x1000; + // Fallthrough + case 41: + npc->x += npc->xm; + npc->y += npc->ym; + + npc->act_wait += 2; + + if (npc->act_wait > 1200) + npc->cond = 0; + + break; + } + + if (npc->act_wait % 4 == 0 && npc->act_no >= 20) + { + PlaySoundObject(34, SOUND_MODE_PLAY); + + if (npc->direct == 0) + SetCaret(npc->x + (10 * 0x200), npc->y + (10 * 0x200), CARET_EXHAUST, DIR_RIGHT); + else + SetCaret(npc->x - (10 * 0x200), npc->y + (10 * 0x200), CARET_EXHAUST, DIR_LEFT); + } + + RECT rcLeft[2] = { + {224, 64, 256, 80}, + {256, 64, 288, 96}, + }; + + RECT rcRight[2] = { + {224, 80, 256, 96}, + {288, 64, 320, 96}, + }; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Scooter (broken) +void ActNpc193(NPCHAR *npc) +{ + RECT rc = {256, 96, 320, 112}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y = npc->y; // This line probably isn't accurate to the original source code, but it produces the same assembly + npc->x += 24 * 0x200; + break; + } + + npc->rect = rc; +} + +// Blue robot (broken) +void ActNpc194(NPCHAR *npc) +{ + RECT rc = {192, 120, 224, 128}; + + if (npc->act_no == 0) + { + npc->act_no = 1; + npc->y += 4 * 0x200; + } + + npc->rect = rc; +} + +// Grate +void ActNpc195(NPCHAR *npc) +{ + RECT rc = {112, 64, 128, 80}; + npc->rect = rc; +} + +// Ironhead motion wall +void ActNpc196(NPCHAR *npc) +{ + RECT rcLeft = {112, 64, 144, 80}; + RECT rcRight = {112, 80, 144, 96}; + + npc->x -= 6 * 0x200; + + if (npc->x <= 19 * 0x10 * 0x200) + npc->x += 22 * 0x10 * 0x200; + + if (npc->direct == 0) + npc->rect = rcLeft; + else + npc->rect = rcRight; +} + +// Porcupine Fish +void ActNpc197(NPCHAR *npc) +{ + RECT rc[4] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + {32, 0, 48, 16}, + {48, 0, 64, 16}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 10; + npc->ani_wait = 0; + npc->ym = Random(-0x200, 0x200); + npc->xm = 0x800; + // Fallthrough + case 10: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->xm < 0) + { + npc->damage = 3; + npc->act_no = 20; + } + + break; + + case 20: + npc->damage = 3; + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + if (npc->x < 48 * 0x200) + { + npc->destroy_voice = 0; + LoseNpChar(npc, TRUE); + } + + break; + } + + if (npc->flag & 2) + npc->ym = 0x200; + if (npc->flag & 8) + npc->ym = -0x200; + + npc->xm -= 12; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rc[npc->ani_no]; +} + +// Ironhead projectile +void ActNpc198(NPCHAR *npc) +{ + RECT rcRight[3] = { + {208, 48, 224, 72}, + {224, 48, 240, 72}, + {240, 48, 256, 72}, + }; + + switch (npc->act_no) + { + case 0: + if (++npc->act_wait > 20) + { + npc->act_no = 1; + npc->xm = 0; + npc->ym = 0; + npc->count1 = 0; + } + + break; + + case 1: + npc->xm += 0x20; + break; + } + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rcRight[npc->ani_no]; + + if (++npc->count1 > 100) + npc->cond = 0; + + if (npc->count1 % 4 == 1) + PlaySoundObject(46, SOUND_MODE_PLAY); +} + +// Water/wind particles +void ActNpc199(NPCHAR *npc) +{ + RECT rect[5] = { + {72, 16, 74, 18}, + {74, 16, 76, 18}, + {76, 16, 78, 18}, + {78, 16, 80, 18}, + {80, 16, 82, 18}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = Random(0, 2); + + switch (npc->direct) + { + case 0: + npc->xm = -1; + break; + + case 1: + npc->ym = -1; + break; + + case 2: + npc->xm = 1; + break; + + case 3: + npc->ym = 1; + break; + } + + npc->xm *= (Random(4, 8) * 0x200) / 2; + npc->ym *= (Random(4, 8) * 0x200) / 2; + break; + } + + if (++npc->ani_wait > 6) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + { + npc->cond = 0; + #ifdef FIX_MAJOR_BUGS + return; // The code below will use 'ani_no' to access 'rect', even though it's now too high + #endif + } + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rect[npc->ani_no]; +} diff --git a/src/NpcAct200.cpp b/src/NpcAct200.cpp new file mode 100644 index 0000000..a388964 --- /dev/null +++ b/src/NpcAct200.cpp @@ -0,0 +1,1529 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "NpcHit.h" +#include "Sound.h" +#include "Triangle.h" + +// Dragon Zombie +void ActNpc200(NPCHAR *npc) +{ + unsigned char deg; + int xm, ym; + + RECT rcLeft[6] = { + {0, 0, 40, 40}, + {40, 0, 80, 40}, + {80, 0, 120, 40}, + {120, 0, 160, 40}, + {160, 0, 200, 40}, + {200, 0, 240, 40}, + }; + + RECT rcRight[6] = { + {0, 40, 40, 80}, + {40, 40, 80, 80}, + {80, 40, 120, 80}, + {120, 40, 160, 80}, + {160, 40, 200, 80}, + {200, 40, 240, 80}, + }; + + if (npc->act_no < 100 && npc->life < 950) + { + PlaySoundObject(72, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8); + if (!gbNoExpDrops) + SetExpObjects(npc->x, npc->y, npc->exp); + npc->act_no = 100; + npc->bits &= ~NPC_SHOOTABLE; + npc->damage = 0; + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 10; + npc->count1 = 0; + // Fallthrough + case 10: + if (++npc->ani_wait > 30) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->count1) + --npc->count1; + + if (npc->count1 == 0 && gMC.x > npc->x - (112 * 0x200) && gMC.x < npc->x + (112 * 0x200)) + npc->act_no = 20; + + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + // Fallthrough + case 21: + if (++npc->act_wait / 2 % 2) + npc->ani_no = 2; + else + npc->ani_no = 3; + + if (npc->act_wait > 30) + npc->act_no = 30; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + break; + + case 30: + npc->act_no = 31; + npc->act_wait = 0; + npc->ani_no = 4; + npc->tgt_x = gMC.x; + npc->tgt_y = gMC.y; + // Fallthrough + case 31: + if (++npc->act_wait < 40 && npc->act_wait % 8 == 1) + { + if (npc->direct == 0) + deg = GetArktan(npc->x - (14 * 0x200) - npc->tgt_x, npc->y - npc->tgt_y); + else + deg = GetArktan(npc->x + (14 * 0x200) - npc->tgt_x, npc->y - npc->tgt_y); + + deg += (unsigned char)Random(-6, 6); + + ym = GetSin(deg) * 3; + xm = GetCos(deg) * 3; + + if (npc->direct == 0) + SetNpChar(202, npc->x - (14 * 0x200), npc->y, xm, ym, 0, NULL, 0x100); + else + SetNpChar(202, npc->x + (14 * 0x200), npc->y, xm, ym, 0, NULL, 0x100); + + if (!(gMC.cond & 2)) + PlaySoundObject(33, SOUND_MODE_PLAY); + } + + if (npc->act_wait > 60) + { + npc->act_no = 10; + npc->count1 = Random(100, 200); + npc->ani_wait = 0; + } + + break; + + case 100: + npc->ani_no = 5; + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Dragon Zombie (dead) +void ActNpc201(NPCHAR *npc) +{ + RECT rcLeft[1] = { + {200, 0, 240, 40} + }; + + RECT rcRight[1] = { + {200, 40, 240, 80} + }; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Dragon Zombie projectile +void ActNpc202(NPCHAR *npc) +{ + if (npc->flag & 0xFF) + { + npc->cond = 0; + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rect_left[3] = { + {184, 216, 200, 240}, + {200, 216, 216, 240}, + {216, 216, 232, 240}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->count1 > 300) + { + npc->cond = 0; + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } +} + +// Critter (destroyed Egg Corridor) +void ActNpc203(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {0, 80, 16, 96}, + {16, 80, 32, 96}, + {32, 80, 48, 96}, + }; + + RECT rcRight[3] = { + {0, 96, 16, 112}, + {16, 96, 32, 112}, + {32, 96, 48, 112}, + }; + + switch (npc->act_no) + { + case 0: + npc->y += 3 * 0x200; + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->act_wait >= 8 && npc->x - (112 * 0x200) < gMC.x && npc->x + (112 * 0x200) > gMC.x && npc->y - (80 * 0x200) < gMC.y && npc->y + (80 * 0x200) > gMC.y) + { + npc->ani_no = 1; + } + else + { + if (npc->act_wait < 8) + ++npc->act_wait; + + npc->ani_no = 0; + } + + if (npc->shock) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + if (npc->act_wait >= 8 && npc->x - (48 * 0x200) < gMC.x && npc->x + (48 * 0x200) > gMC.x && npc->y - (80 * 0x200) < gMC.y && npc->y + (48 * 0x200) > gMC.y) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 3; + npc->ani_no = 2; + npc->ym = -0x5FF; + + if (!(gMC.cond & 2)) + PlaySoundObject(30, SOUND_MODE_PLAY); + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + } + + break; + + case 3: + if (npc->flag & 8) + { + npc->xm = 0; + npc->act_wait = 0; + npc->ani_no = 0; + npc->act_no = 1; + + if (!(gMC.cond & 2)) + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Falling spike (small) +void ActNpc204(NPCHAR *npc) +{ + RECT rc[2] = { + {240, 80, 256, 96}, + {240, 144, 256, 160}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + // Fallthrough + case 1: + if (gMC.x > npc->x - (12 * 0x200) && gMC.x < npc->x + (12 * 0x200) && gMC.y > npc->y) + npc->act_no = 2; + + break; + + case 2: + if (++npc->act_wait / 6 % 2) + npc->x = npc->tgt_x - (1 * 0x200); + else + npc->x = npc->tgt_x; + + if (npc->act_wait > 30) + { + npc->act_no = 3; + npc->ani_no = 1; + } + + break; + + case 3: + npc->ym += 0x20; + + if (npc->flag & 0xFF) + { + if (!(gMC.cond & 2)) + PlaySoundObject(12, SOUND_MODE_PLAY); + + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 4); + npc->cond = 0; + return; + } + + break; + } + + if (npc->ym > 0xC00) + npc->ym = 0xC00; + + npc->y += npc->ym; + + npc->rect = rc[npc->ani_no]; +} + +// Falling spike (large) +void ActNpc205(NPCHAR *npc) +{ + RECT rc[2] = { + {112, 80, 128, 112}, + {128, 80, 144, 112}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->y += 4 * 0x200; + // Fallthrough + case 1: + if (gMC.x > npc->x - (12 * 0x200) && gMC.x < npc->x + (12 * 0x200) && gMC.y > npc->y) + npc->act_no = 2; + + break; + + case 2: + if (++npc->act_wait / 6 % 2) + npc->x = npc->tgt_x - (1 * 0x200); + else + npc->x = npc->tgt_x; + + if (npc->act_wait > 30) + { + npc->act_no = 3; + npc->ani_no = 1; + npc->act_wait = 0; + } + + break; + + case 3: + npc->ym += 0x20; + + if (gMC.y > npc->y) + { + npc->bits &= ~NPC_SOLID_HARD; + npc->damage = 0x7F; + } + else + { + npc->bits |= NPC_SOLID_HARD; + npc->damage = 0; + } + + if (++npc->act_wait > 8 && npc->flag & 0xFF) + { + npc->bits |= NPC_SOLID_HARD; + npc->act_no = 4; + npc->act_wait = 0; + npc->ym = 0; + npc->damage = 0; + PlaySoundObject(12, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 4); + SetBullet(24, npc->x, npc->y, 0); + return; + } + + break; + + case 4: + if (++npc->act_wait > 4) + { + npc->act_no = 5; + npc->bits |= NPC_SHOOTABLE; + } + + break; + } + + if (npc->ym > 0xC00) + npc->ym = 0xC00; + + npc->y += npc->ym; + + npc->rect = rc[npc->ani_no]; +} + +// Counter Bomb +void ActNpc206(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->count1 = 120; + npc->act_wait = Random(0, 50); + // Fallthrough + case 1: + if (++npc->act_wait < 50) + break; + + npc->act_wait = 0; + npc->act_no = 2; + npc->ym = 0x300; + break; + + case 2: + if (gMC.x > npc->x - (80 * 0x200) && gMC.x < npc->x + (80 * 0x200)) + { + npc->act_wait = 0; + npc->act_no = 3; + } + + if (npc->shock) + { + npc->act_wait = 0; + npc->act_no = 3; + } + + break; + + case 3: + switch (npc->act_wait) + { + // Interestingly, this NPC counts down at 60 frames + // per second, while NPC322 (Deleet) counts at 50. + case 60 * 0: + SetNpChar(207, npc->x + (16 * 0x200), npc->y + (4 * 0x200), 0, 0, 0, NULL, 0x100); + break; + + case 60 * 1: + SetNpChar(207, npc->x + (16 * 0x200), npc->y + (4 * 0x200), 0, 0, 1, NULL, 0x100); + break; + + case 60 * 2: + SetNpChar(207, npc->x + (16 * 0x200), npc->y + (4 * 0x200), 0, 0, 2, NULL, 0x100); + break; + + case 60 * 3: + SetNpChar(207, npc->x + (16 * 0x200), npc->y + (4 * 0x200), 0, 0, 3, NULL, 0x100); + break; + + case 60 * 4: + SetNpChar(207, npc->x + (16 * 0x200), npc->y + (4 * 0x200), 0, 0, 4, NULL, 0x100); + break; + + case 60 * 5: + npc->hit.back = 128 * 0x200; + npc->hit.front = 128 * 0x200; + npc->hit.top = 100 * 0x200; + npc->hit.bottom = 100 * 0x200; + npc->damage = 30; + PlaySoundObject(35, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x, npc->y, 0x10000, 100); + SetQuake(20); + npc->cond |= 8; + break; + } + + ++npc->act_wait; + break; + } + + if (npc->act_no > 1) + { + if (npc->tgt_y < npc->y) + npc->ym -= 0x10; + if (npc->tgt_y > npc->y) + npc->ym += 0x10; + + if (npc->ym > 0x100) + npc->ym = 0x100; + if (npc->ym < -0x100) + npc->ym = -0x100; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[3] = { + {80, 80, 120, 120}, + {120, 80, 160, 120}, + {160, 80, 200, 120}, + }; + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + npc->rect = rect_left[npc->ani_no]; +} + +// Counter Bomb's countdown +void ActNpc207(NPCHAR *npc) +{ + RECT rc[5] = { + {0, 144, 16, 160}, + {16, 144, 32, 160}, + {32, 144, 48, 160}, + {48, 144, 64, 160}, + {64, 144, 80, 160}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = npc->direct; + PlaySoundObject(43, SOUND_MODE_PLAY); + // Fallthrough + case 1: + npc->x += 1 * 0x200; + + if (++npc->act_wait > 8) + { + npc->act_wait = 0; + npc->act_no = 2; + } + + break; + + case 2: + if (++npc->act_wait > 30) + { + npc->cond = 0; + return; + } + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Basu (destroyed Egg Corridor) +void ActNpc208(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {248, 80, 272, 104}, + {272, 80, 296, 104}, + {296, 80, 320, 104}, + }; + + RECT rcRight[3] = { + {248, 104, 272, 128}, + {272, 104, 296, 128}, + {296, 104, 320, 128}, + }; + + switch (npc->act_no) + { + case 0: + if (gMC.x < npc->x + (16 * 0x200) && gMC.x > npc->x - (16 * 0x200)) + { + npc->bits |= NPC_SHOOTABLE; + npc->ym = -0x200; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->act_no = 1; + npc->act_wait = 0; + npc->count1 = npc->direct; + npc->count2 = 0; + npc->damage = 6; + + if (npc->direct == 0) + { + npc->x = gMC.x + (256 * 0x200); + npc->xm = -0x2FF; + } + else + { + npc->x = gMC.x - (256 * 0x200); + npc->xm = 0x2FF; + } + + return; + } + + npc->rect.right = 0; + npc->damage = 0; + npc->xm = 0; + npc->ym = 0; + npc->bits &= ~NPC_SHOOTABLE; + return; + + case 1: + if (npc->x > gMC.x) + { + npc->direct = gMirrorMode? 2:0; + npc->xm -= 0x10; + } + else + { + npc->direct = gMirrorMode? 0:2; + npc->xm += 0x10; + } + + if (npc->flag & 1) + npc->xm = 0x200; + if (npc->flag & 4) + npc->xm = -0x200; + + if (npc->y < npc->tgt_y) + npc->ym += 8; + else + npc->ym -= 8; + + if (npc->xm > 0x2FF) + npc->xm = 0x2FF; + if (npc->xm < -0x2FF) + npc->xm = -0x2FF; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->shock) + { + npc->x += npc->xm / 2; + npc->y += npc->ym / 2; + } + else + { + npc->x += npc->xm; + npc->y += npc->ym; + } + + if (gMC.x > npc->x + (400 * 0x200) || gMC.x < npc->x - (400 * 0x200)) + { + npc->act_no = 0; + npc->xm = 0; + npc->direct = npc->count1; + npc->x = npc->tgt_x; + npc->rect.right = 0; + npc->damage = 0; + return; + } + + break; + } + + if (npc->act_no != 0) + { + if (npc->act_wait < 150) + ++npc->act_wait; + + if (npc->act_wait == 150) + { + if (++npc->count2 % 8 == 0 && npc->x < gMC.x + (160 * 0x200) && npc->x > gMC.x - (160 * 0x200)) + { + unsigned char deg; + int xm; + int ym; + + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-6, 6); + ym = GetSin(deg) * 3; + xm = GetCos(deg) * 3; + SetNpChar(209, npc->x, npc->y, xm, ym, 0, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + if (npc->count2 > 16) + { + npc->act_wait = 0; + npc->count2 = 0; + } + } + } + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->act_wait > 120 && npc->act_wait / 2 % 2 == 1 && npc->ani_no == 1) + npc->ani_no = 2; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Basu projectile (destroyed Egg Corridor) +void ActNpc209(NPCHAR *npc) +{ + if (npc->flag & 0xFF) + { + npc->cond = 0; + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rect_left[4] = { + {232, 96, 248, 112}, + {200, 112, 216, 128}, + {216, 112, 232, 128}, + {232, 112, 248, 128}, + }; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->count1 > 300) + { + npc->cond = 0; + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } +} + +// Beetle (destroyed Egg Corridor) +void ActNpc210(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {0, 112, 16, 128}, + {16, 112, 32, 128}, + }; + + RECT rcRight[2] = { + {32, 112, 48, 128}, + {48, 112, 64, 128}, + }; + + switch (npc->act_no) + { + case 0: + if (gMC.x < npc->x + (16 * 0x200) && gMC.x > npc->x - (16 * 0x200)) + { + npc->bits |= NPC_SHOOTABLE; + npc->ym = -0x200; + npc->tgt_y = npc->y; + npc->act_no = 1; + npc->damage = 2; + + if (npc->direct == 0) + { + npc->x = gMC.x + (256 * 0x200); + npc->xm = -0x2FF; + } + else + { + npc->x = gMC.x - (256 * 0x200); + npc->xm = 0x2FF; + } + } + else + { + npc->bits &= ~NPC_SHOOTABLE; + npc->rect.right = 0; + npc->damage = 0; + npc->xm = 0; + npc->ym = 0; + return; + } + + break; + + case 1: + if (npc->x > gMC.x) + { + npc->direct = gMirrorMode? 2:0; + npc->xm -= 0x10; + } + else + { + npc->direct = gMirrorMode? 0:2; + npc->xm += 0x10; + } + + if (npc->xm > 0x2FF) + npc->xm = 0x2FF; + if (npc->xm < -0x2FF) + npc->xm = -0x2FF; + + if (npc->y < npc->tgt_y) + npc->ym += 8; + else + npc->ym -= 8; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->shock) + { + npc->x += npc->xm / 2; + npc->y += npc->ym / 2; + } + else + { + npc->x += npc->xm; + npc->y += npc->ym; + } + + break; + } + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Spikes (small) +void ActNpc211(NPCHAR *npc) +{ + if(gMirrorMode){ + RECT rects[4] = { + {288, 200, 304, 216}, + {272, 200, 288, 216}, + {256, 200, 272, 216}, + {304, 200, 320, 216}, + }; + + npc->rect = rects[npc->code_event]; + } + else{ + RECT rects[4] = { + {256, 200, 272, 216}, + {272, 200, 288, 216}, + {288, 200, 304, 216}, + {304, 200, 320, 216}, + }; + + npc->rect = rects[npc->code_event]; + } + +} + +// Sky Dragon +void ActNpc212(NPCHAR *npc) +{ + RECT rcRight[4] = { + {160, 152, 200, 192}, + {200, 152, 240, 192}, + {240, 112, 280, 152}, + {280, 112, 320, 152}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 4 * 0x200; + // Fallthrough + case 1: + if (++npc->ani_wait > 30) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 2; + npc->ani_wait = 0; + npc->tgt_y = npc->y - (16 * 0x200); + npc->tgt_x = npc->x - (6 * 0x200); + npc->ym = 0; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 11: + if (npc->x < npc->tgt_x) + npc->xm += 8; + else + npc->xm -= 8; + + if (npc->y < npc->tgt_y) + npc->ym += 8; + else + npc->ym -= 8; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (++npc->ani_wait > 5) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + break; + + case 20: + npc->act_no = 21; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 21: + if (npc->y < npc->tgt_y) + npc->ym += 0x10; + else + npc->ym -= 0x10; + + npc->xm += 0x20; + + if (npc->xm > 0x600) + npc->xm = 0x600; + if (npc->xm < -0x600) + npc->xm = -0x600; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + break; + + case 30: + npc->act_no = 31; + SetNpChar(297, 0, 0, 0, 0, 0, npc, 0x100); + break; + } + + npc->rect = rcRight[npc->ani_no]; + + // Use different sprite if player is wearing the Mimiga Mask + if (gMC.equip & EQUIP_MIMIGA_MASK) + { + if (npc->ani_no > 1) + { + npc->rect.top += 40; + npc->rect.bottom += 40; + } + } +} + +// Night Spirit +void ActNpc213(NPCHAR *npc) +{ + RECT rect[10] = { + {0, 0, 0, 0}, + {0, 0, 48, 48}, + {48, 0, 96, 48}, + {96, 0, 144, 48}, + {144, 0, 192, 48}, + {192, 0, 240, 48}, + {240, 0, 288, 48}, + {0, 48, 48, 96}, + {48, 48, 96, 96}, + {96, 48, 144, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->ani_no = 0; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + // Fallthrough + case 1: + if (gMC.y > npc->y - (8 * 0x200) && gMC.y < npc->y + (8 * 0x200)) + { + if (npc->direct == 0) + npc->y -= 240 * 0x200; + else + npc->y += 240 * 0x200; + + npc->act_no = 10; + npc->act_wait = 0; + npc->ani_no = 1; + npc->ym = 0; + npc->bits |= NPC_SHOOTABLE; + } + + break; + + case 10: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 1; + + if (++npc->act_wait > 200) + { + npc->act_no = 20; + npc->act_wait = 0; + npc->ani_no = 4; + } + + break; + + case 20: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + npc->ani_no = 4; + + if (++npc->act_wait > 50) + { + npc->act_no = 30; + npc->act_wait = 0; + npc->ani_no = 7; + } + + break; + + case 30: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 9) + npc->ani_no = 7; + + if (++npc->act_wait % 5 == 1) + { + SetNpChar(214, npc->x, npc->y, (Random(2, 12) * 0x200) / 4, Random(-0x200, 0x200), 0, NULL, 0x100); + PlaySoundObject(21, SOUND_MODE_PLAY); + } + + if (npc->act_wait > 50) + { + npc->act_no = 10; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 40: + if (npc->y < npc->tgt_y) + npc->ym += 0x40; + else + npc->ym -= 0x40; + + if (npc->ym < -0x400) + npc->ym = -0x400; + if (npc->ym > 0x400) + npc->ym = 0x400; + + if (npc->shock) + npc->y += npc->ym / 2; + else + npc->y += npc->ym; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + npc->ani_no = 4; + + if (gMC.y < npc->tgt_y + (240 * 0x200) && gMC.y > npc->tgt_y - (240 * 0x200)) + { + npc->act_no = 20; + npc->act_wait = 0; + npc->ani_no = 4; + } + + break; + } + + if (npc->act_no >= 10 && npc->act_no <= 30) + { + if (npc->y < gMC.y) + npc->ym += 25; + else + npc->ym -= 25; + + if (npc->ym < -0x400) + npc->ym = -0x400; + if (npc->ym > 0x400) + npc->ym = 0x400; + + if (npc->flag & 2) + npc->ym = 0x200; + if (npc->flag & 8) + npc->ym = -0x200; + + if (npc->shock) + npc->y += npc->ym / 2; + else + npc->y += npc->ym; + + if (gMC.y > npc->tgt_y + (240 * 0x200) || gMC.y < npc->tgt_y - (240 * 0x200)) + npc->act_no = 40; + } + + npc->rect = rect[npc->ani_no]; +} + +// Night Spirit projectile +void ActNpc214(NPCHAR *npc) +{ + RECT rect[3] = { + {144, 48, 176, 64}, + {176, 48, 208, 64}, + {208, 48, 240, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 1: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + npc->xm -= 25; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->xm < 0) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (npc->flag & 0xFF) + { + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 4); + PlaySoundObject(28, SOUND_MODE_PLAY); + npc->cond = 0; + } + + break; + } + + npc->rect = rect[npc->ani_no]; +} + +// Sandcroc (Outer Wall) +void ActNpc215(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->ani_no = 0; + npc->act_no = 1; + npc->act_wait = 0; + npc->tgt_y = npc->y; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + npc->bits &= ~NPC_SOLID_SOFT; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + // Fallthrough + case 1: + if (gMC.x > npc->x - (12 * 0x200) && gMC.x < npc->x + (12 * 0x200) && gMC.y > npc->y && gMC.y < npc->y + (8 * 0x200)) + { + npc->act_no = 15; + npc->act_wait = 0; + } + + break; + + case 15: + if (++npc->act_wait > 10) + { + PlaySoundObject(102, SOUND_MODE_PLAY); + npc->act_no = 20; + } + + break; + + case 20: + if (++npc->ani_wait > 3) + { + ++npc->ani_no; + npc->ani_wait = 0; + } + + if (npc->ani_no == 3) + npc->damage = 15; + + if (npc->ani_no == 4) + { + npc->bits |= NPC_SHOOTABLE; + npc->act_no = 30; + npc->act_wait = 0; + } + + break; + + case 30: + npc->bits |= NPC_SOLID_SOFT; + npc->damage = 0; + ++npc->act_wait; + + if (npc->shock) + { + npc->act_no = 40; + npc->act_wait = 0; + } + + break; + + case 40: + npc->bits |= NPC_IGNORE_SOLIDITY; + npc->y += 1 * 0x200; + + if (++npc->act_wait == 32) + { + npc->bits &= ~NPC_SOLID_SOFT; + npc->bits &= ~NPC_SHOOTABLE; + npc->act_no = 50; + npc->act_wait = 0; + } + + break; + + case 50: + if (npc->act_wait < 100) + { + ++npc->act_wait; + } + else + { + npc->y = npc->tgt_y; + npc->ani_no = 0; + npc->act_no = 0; + } + + break; + } + + RECT rect[5] = { + {0, 0, 0, 0}, + {0, 96, 48, 128}, + {48, 96, 96, 128}, + {96, 96, 144, 128}, + {144, 96, 192, 128}, + }; + + npc->rect = rect[npc->ani_no]; +} + +// Debug Cat +void ActNpc216(NPCHAR *npc) +{ + RECT rect = {256, 192, 272, 216}; + + npc->rect = rect; +} + +// Itoh +void ActNpc217(NPCHAR *npc) +{ + RECT rect[8] = { + {144, 64, 160, 80}, + {160, 64, 176, 80}, + {176, 64, 192, 80}, + {192, 64, 208, 80}, + {144, 80, 160, 96}, + {160, 80, 176, 96}, + {144, 80, 160, 96}, + {176, 80, 192, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->ani_no = 2; + npc->xm = 0; + break; + + case 20: + npc->act_no = 21; + npc->ani_no = 2; + npc->xm += 0x200; + npc->ym -= 0x400; + break; + + case 21: + if (npc->flag & 8) + { + npc->ani_no = 3; + npc->act_no = 30; + npc->act_wait = 0; + npc->xm = 0; + npc->tgt_x = npc->x; + } + + break; + + case 30: + npc->ani_no = 3; + + if (++npc->act_wait / 2 % 2) + npc->x = npc->tgt_x + (1 * 0x200); + else + npc->x = npc->tgt_x; + + break; + + case 40: + npc->act_no = 41; + npc->ym = -0x200; + npc->ani_no = 2; + // Fallthrough + case 41: + if (npc->flag & 8) + { + npc->act_no = 42; + npc->ani_no = 4; + } + + break; + + case 42: + npc->xm = 0; + npc->ani_no = 4; + break; + + case 50: + npc->act_no = 51; + npc->act_wait = 0; + // Fallthrough + case 51: + if (++npc->act_wait > 32) + npc->act_no = 42; + + npc->xm = 0x200; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 7) + npc->ani_no = 4; + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rect[npc->ani_no]; +} + +// Core giant energy ball projectile +void ActNpc218(NPCHAR *npc) +{ + RECT rc[2] = { + {256, 120, 288, 152}, + {288, 120, 320, 152}, + }; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (++npc->act_wait > 200) + npc->cond = 0; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + npc->rect = rc[npc->ani_no]; +} + +// Smoke generator +void ActNpc219(NPCHAR *npc) +{ + RECT rc = {0, 0, 0, 0}; + + if (npc->direct == 0) + { + if (Random(0, 40) == 1) + SetNpChar(4, npc->x + (Random(-20, 20) * 0x200), npc->y, 0, -0x200, 0, NULL, 0x100); + } + else + { + SetNpChar(199, npc->x + (Random(-0xA0, 0xA0) * 0x200), npc->y + (Random(-0x80, 0x80) * 0x200), 0, 0, 2, NULL, 0x100); + } + + npc->rect = rc; +} diff --git a/src/NpcAct220.cpp b/src/NpcAct220.cpp new file mode 100644 index 0000000..8659c42 --- /dev/null +++ b/src/NpcAct220.cpp @@ -0,0 +1,1314 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Caret.h" +#include "CommonDefines.h" +#include "Game.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +// Shovel Brigade +void ActNpc220(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {0, 64, 16, 80}, + {16, 64, 32, 80}, + }; + + RECT rcRight[2] = { + {0, 80, 16, 96}, + {16, 80, 32, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Shovel Brigade (walking) +void ActNpc221(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {0, 64, 16, 80}, + {16, 64, 32, 80}, + {32, 64, 48, 80}, + {0, 64, 16, 80}, + {48, 64, 64, 80}, + {0, 64, 16, 80}, + }; + + RECT rcRight[6] = { + {0, 80, 16, 96}, + {16, 80, 32, 96}, + {32, 80, 48, 96}, + {0, 80, 16, 96}, + {48, 80, 64, 96}, + {0, 80, 16, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 60) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (Random(0, 60) == 1) + { + npc->act_no = 10; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = Random(0, 16); + npc->ani_no = 2; + npc->ani_wait = 0; + + if (Random(0, 9) % 2) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 11: + if (npc->direct == 0 && npc->flag & 1) + npc->direct = gMirrorMode? 0:2; + else if (npc->direct == 2 && npc->flag & 4) + npc->direct = gMirrorMode? 2:0; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (++npc->act_wait > 32) + npc->act_no = 0; + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Prison bars +void ActNpc222(NPCHAR *npc) +{ + RECT rc = {96, 168, 112, 200}; + + if (npc->act_no == 0) + { + ++npc->act_no; + npc->y -= 8 * 0x200; + } + + npc->rect = rc; +} + +// Momorin +void ActNpc223(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {80, 192, 96, 216}, + {96, 192, 112, 216}, + {112, 192, 128, 216}, + }; + + RECT rcRight[3] = { + {80, 216, 96, 240}, + {96, 216, 112, 240}, + {112, 216, 128, 240}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 160) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 12) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->ani_no = 2; + break; + } + + if (npc->act_no < 2 && gMC.y < npc->y + (16 * 0x200) && gMC.y > npc->y - (16 * 0x200)) + { + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Chie +void ActNpc224(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {112, 32, 128, 48}, + {128, 32, 144, 48}, + }; + + RECT rcRight[2] = { + {112, 48, 128, 64}, + {128, 48, 144, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 160) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 12) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (npc->act_no < 2 && gMC.y < npc->y + (16 * 0x200) && gMC.y > npc->y - (16 * 0x200)) + { + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Megane +void ActNpc225(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {64, 64, 80, 80}, + {80, 64, 96, 80}, + }; + + RECT rcRight[2] = { + {64, 80, 80, 96}, + {80, 80, 96, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 160) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 12) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Kanpachi +void ActNpc226(NPCHAR *npc) +{ + RECT rcRight[7] = { + {256, 56, 272, 80}, + {272, 56, 288, 80}, + {288, 56, 304, 80}, + {256, 56, 272, 80}, + {304, 56, 320, 80}, + {256, 56, 272, 80}, + {240, 56, 256, 80}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 60) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 11: + npc->xm = 0x200; + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + ++npc->act_wait; + + break; + + case 20: + npc->xm = 0; + npc->ani_no = 6; + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rcRight[npc->ani_no]; +} + +// Bucket +void ActNpc227(NPCHAR *npc) +{ + RECT rc = {208, 32, 224, 48}; + npc->rect = rc; +} + +// Droll (guard) +void ActNpc228(NPCHAR *npc) +{ + RECT rcLeft[4] = { + {0, 0, 32, 40}, + {32, 0, 64, 40}, + {64, 0, 96, 40}, + {96, 0, 128, 40}, + }; + + RECT rcRight[4] = { + {0, 40, 32, 80}, + {32, 40, 64, 80}, + {64, 40, 96, 80}, + {96, 40, 128, 80}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 8 * 0x200; + // Fallthrough + case 1: + npc->xm = 0; + npc->act_no = 2; + npc->ani_no = 0; + // Fallthrough + case 2: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (++npc->ani_wait > 50) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 2; + npc->act_wait = 0; + // Fallthrough + case 11: + if (++npc->act_wait > 10) + { + npc->act_no = 12; + npc->ani_no = 3; + npc->ym = -0x600; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + } + + break; + + case 12: + if (npc->flag & 8) + { + npc->ani_no = 2; + npc->act_no = 13; + npc->act_wait = 0; + } + + break; + + case 13: + npc->xm /= 2; + + if (++npc->act_wait > 10) + npc->act_no = 1; + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Red Flowers (sprouts) +void ActNpc229(NPCHAR *npc) +{ + RECT rc[2] = { + {0, 96, 48, 112}, + {0, 112, 48, 128}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 16 * 0x200; + break; + } + + if (npc->direct == 0) + npc->rect = rc[0]; + else + npc->rect = rc[1]; +} + +// Red Flowers (blooming) +void ActNpc230(NPCHAR *npc) +{ + RECT rc[2] = { + {48, 96, 96, 128}, + {96, 96, 144, 128}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->x -= 16 * 0x200; + npc->y -= 16 * 0x200; + break; + } + + if (npc->direct == 0) + npc->rect = rc[0]; + else + npc->rect = rc[1]; +} + +// Rocket +void ActNpc231(NPCHAR *npc) +{ + int i; + + RECT rc[2] = { + {176, 32, 208, 48}, + {176, 48, 208, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + npc->ani_no = 0; + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + // Fallthrough + case 11: + ++npc->act_wait; + npc->ym += 8; + + if (npc->flag & 8) + { + if (npc->act_wait < 10) + npc->act_no = 12; + else + npc->act_no = 1; + } + + break; + + case 12: + npc->bits &= ~NPC_INTERACTABLE; + npc->act_no = 13; + npc->act_wait = 0; + npc->ani_no = 1; + + for (i = 0; i < 10; ++i) + { + SetNpChar(4, npc->x + (Random(-16, 16) * 0x200), npc->y + (Random(-8, 8) * 0x200), 0, 0, 0, NULL, 0x100); + PlaySoundObject(12, SOUND_MODE_PLAY); // Wait, it does this in a loop? + } + // Fallthrough + case 13: + npc->ym -= 8; + + ++npc->act_wait; + + if (npc->act_wait % 2 == 0) + SetCaret(npc->x - (10 * 0x200), npc->y + (8 * 0x200), CARET_EXHAUST, DIR_DOWN); + if (npc->act_wait % 2 == 1) + SetCaret(npc->x + (10 * 0x200), npc->y + (8 * 0x200), CARET_EXHAUST, DIR_DOWN); + + if (npc->act_wait % 4 == 1) + PlaySoundObject(34, SOUND_MODE_PLAY); + + if (npc->flag & 2 || gMC.flag & 2 || npc->act_wait > 450) + { + if (npc->flag & 2 || gMC.flag & 2) + npc->ym = 0; + + npc->act_no = 15; + + for (i = 0; i < 6; ++i) + { + SetNpChar(4, npc->x + (Random(-16, 16) * 0x200), npc->y + (Random(-8, 8) * 0x200), 0, 0, 0, NULL, 0x100); + PlaySoundObject(12, SOUND_MODE_PLAY); // Here it does it again... + } + } + + break; + + case 15: + npc->ym += 8; + ++npc->act_wait; + + if (npc->ym < 0) + { + if (npc->act_wait % 8 == 0) + SetCaret(npc->x - (10 * 0x200), npc->y + (8 * 0x200), CARET_EXHAUST, DIR_DOWN); + + if (npc->act_wait % 8 == 4) + SetCaret(npc->x + (10 * 0x200), npc->y + (8 * 0x200), CARET_EXHAUST, DIR_DOWN); + + if (npc->act_wait % 16 == 1) + PlaySoundObject(34, SOUND_MODE_PLAY); + } + + if (npc->flag & 8) + { + npc->bits |= NPC_INTERACTABLE; + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + npc->rect = rc[npc->ani_no]; +} + +// Orangebell +void ActNpc232(NPCHAR *npc) +{ + int i; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->ym = 0x200; + + for (i = 0; i < 8; ++i) + SetNpChar(233, npc->x, npc->y, 0, 0, npc->direct, npc, 0x100); + // Fallthrough + case 1: + if (npc->xm < 0 && npc->flag & 1) + npc->direct = gMirrorMode? 0:2; + if (npc->xm > 0 && npc->flag & 4) + npc->direct = gMirrorMode? 2:0; + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + if (npc->y < npc->tgt_y) + npc->ym += 8; + else + npc->ym -= 8; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (++npc->ani_wait > 5) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + break; + } + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rcLeft[3] = { + {128, 0, 160, 32}, + {160, 0, 192, 32}, + {192, 0, 224, 32}, + }; + + RECT rcRight[3] = { + {128, 32, 160, 64}, + {160, 32, 192, 64}, + {192, 32, 224, 64}, + }; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Orangebell bat +void ActNpc233(NPCHAR *npc) +{ + unsigned char deg; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + deg = Random(0, 0xFF); + npc->xm = GetCos(deg); + deg = Random(0, 0xFF); + npc->ym = GetSin(deg); + + npc->count1 = 120; + npc->count2 = Random(-0x20, 0x20) * 0x200; + // Fallthrough + case 1: + if (npc->pNpc->code_char == 232) + { + npc->tgt_x = npc->pNpc->x; + npc->tgt_y = npc->pNpc->y; + npc->direct = npc->pNpc->direct; + } + + if (npc->tgt_x < npc->x) + npc->xm -= 8; + if (npc->tgt_x > npc->x) + npc->xm += 8; + + if (npc->tgt_y + npc->count2 < npc->y) + npc->ym -= 0x20; + if (npc->tgt_y + npc->count2 > npc->y) + npc->ym += 0x20; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x400) + npc->ym = 0x400; + if (npc->ym < -0x400) + npc->ym = -0x400; + + if (npc->count1 < 120) + { + ++npc->count1; + break; + } + + if (npc->x - (8 * 0x200) < gMC.x && npc->x + (8 * 0x200) > gMC.x && npc->y < gMC.y && npc->y + (176 * 0x200) > gMC.y) + { + npc->xm /= 4; + npc->ym = 0; + npc->act_no = 3; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + } + + break; + + case 3: + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + if (npc->flag & 8) + { + npc->ym = 0; + npc->xm *= 2; + npc->count1 = 0; + npc->act_no = 1; + npc->bits |= NPC_IGNORE_SOLIDITY; + } + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rcLeft[4] = { + {256, 0, 272, 16}, + {272, 0, 288, 16}, + {288, 0, 304, 16}, + {304, 0, 320, 16}, + }; + + RECT rcRight[4] = { + {256, 16, 272, 32}, + {272, 16, 288, 32}, + {288, 16, 304, 32}, + {304, 16, 320, 32}, + }; + + if (npc->act_no == 3) + { + npc->ani_no = 3; + } + else + { + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Red Flowers (picked) +void ActNpc234(NPCHAR *npc) +{ + RECT rc[2] = { + {144, 96, 192, 112}, + {144, 112, 192, 128}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y += 16 * 0x200; + break; + } + + if (npc->direct == 0) + npc->rect = rc[0]; + else + npc->rect = rc[1]; +} + +// Midorin +void ActNpc235(NPCHAR *npc) +{ + RECT rcLeft[4] = { + {192, 96, 208, 112}, + {208, 96, 224, 112}, + {224, 96, 240, 112}, + {192, 96, 208, 112}, + }; + + RECT rcRight[4] = { + {192, 112, 208, 128}, + {208, 112, 224, 128}, + {224, 112, 240, 128}, + {192, 112, 208, 128}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 30) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (Random(0, 30) == 1) + { + npc->act_no = 10; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = Random(0, 16); + npc->ani_no = 2; + npc->ani_wait = 0; + + if (Random(0, 9) % 2) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 11: + if (npc->direct == 0 && npc->flag & 1) + npc->direct = gMirrorMode? 0:2; + else if (npc->direct == 2 && npc->flag & 4) + npc->direct = gMirrorMode? 2:0; + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + if (++npc->act_wait > 64) + npc->act_no = 0; + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->ani_no == 2) + npc->hit.top = 5 * 0x200; + else + npc->hit.top = 4 * 0x200; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Gunfish +void ActNpc236(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {128, 64, 152, 88}, + {152, 64, 176, 88}, + {176, 64, 200, 88}, + {200, 64, 224, 88}, + {224, 64, 248, 88}, + {248, 64, 272, 88}, + }; + + RECT rcRight[6] = { + {128, 88, 152, 112}, + {152, 88, 176, 112}, + {176, 88, 200, 112}, + {200, 88, 224, 112}, + {224, 88, 248, 112}, + {248, 88, 272, 112}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = Random(0, 50); + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->ym = 0; + // Fallthrough + case 1: + if (npc->act_wait != 0) + { + --npc->act_wait; + } + else + { + npc->ym = 0x200; + npc->act_no = 2; + } + + break; + + case 2: + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + if (gMC.x < npc->x + (128 * 0x200) && gMC.x > npc->x - (128 * 0x200) && gMC.y < npc->y + (32 * 0x200) && gMC.y > npc->y - (160 * 0x200)) + ++npc->act_wait; + + if (npc->act_wait > 80) + { + npc->act_no = 10; + npc->act_wait = 0; + } + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + + case 10: + if (++npc->act_wait > 20) + { + npc->act_wait = 0; + npc->act_no = 20; + } + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + break; + + case 20: + if (++npc->act_wait > 60) + { + npc->act_wait = 0; + npc->act_no = 2; + } + + if (npc->act_wait % 10 == 3) + { + PlaySoundObject(39, SOUND_MODE_PLAY); + + if (npc->direct == 0) + SetNpChar(237, npc->x - (8 * 0x200), npc->y - (8 * 0x200), -0x400, -0x400, 0, NULL, 0x100); + else + SetNpChar(237, npc->x + (8 * 0x200), npc->y - (8 * 0x200), 0x400, -0x400, 0, NULL, 0x100); + } + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 4; + + break; + } + + if (npc->y < npc->tgt_y) + npc->ym += 0x10; + else + npc->ym -= 0x10; + + if (npc->ym > 0x100) + npc->ym = 0x100; + if (npc->ym < -0x100) + npc->ym = -0x100; + + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Gunfish projectile +void ActNpc237(NPCHAR *npc) +{ + RECT rc = {312, 32, 320, 40}; + + int i; + BOOL bHit; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + bHit = FALSE; + + ++npc->act_wait; + + if (npc->flag & 0xFF) + bHit = TRUE; + + if (npc->act_wait > 10 && npc->flag & 0x100) + bHit = TRUE; + + if (bHit) + { + for (i = 0; i < 5; ++i) + SetCaret(npc->x, npc->y, CARET_BUBBLE, DIR_LEFT); + + PlaySoundObject(21, SOUND_MODE_PLAY); + npc->cond = 0; + return; + } + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rc; +} + +// Press (sideways) +void ActNpc238(NPCHAR *npc) +{ + int i; + + RECT rc[3] = { + {184, 200, 208, 216}, + {208, 200, 232, 216}, + {232, 200, 256, 216}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->view.front = 16 * 0x200; + npc->view.back = 8 * 0x200; + // Fallthrough + case 1: + if (npc->direct == 0 && gMC.x < npc->x && gMC.x > npc->x - (192 * 0x200) && gMC.y > npc->y - (4 * 0x200) && gMC.y < npc->y + (8 * 0x200)) + { + npc->act_no = 10; + npc->act_wait = 0; + npc->ani_no = 2; + } + + if (npc->direct == 2 && gMC.x > npc->x && gMC.x < npc->x + (192 * 0x200) && gMC.y > npc->y - (4 * 0x200) && gMC.y < npc->y + (8 * 0x200)) + { + npc->act_no = 10; + npc->act_wait = 0; + npc->ani_no = 2; + } + + break; + + case 10: + npc->damage = 0x7F; + + if (npc->direct == 0) + npc->x -= 6 * 0x200; + else + npc->x += 6 * 0x200; + + if (++npc->act_wait == 8) + { + npc->act_no = 20; + npc->act_wait = 0; + + for (i = 0; i < 4; ++i) + { + SetNpChar(4, npc->x + (Random(-16, 16) * 0x200), npc->y + (Random(-8, 8) * 0x200), 0, 0, 0, NULL, 0x100); + PlaySoundObject(12, SOUND_MODE_PLAY); + } + } + + break; + + case 20: + npc->damage = 0; + + if (++npc->act_wait > 50) + { + npc->act_wait = 0; + npc->act_no = 30; + } + + break; + + case 30: + npc->damage = 0; + npc->ani_no = 1; + + if (++npc->act_wait == 12) + { + npc->act_no = 1; + npc->act_wait = 0; + npc->ani_no = 0; + } + + if (npc->direct == 0) + npc->x += 4 * 0x200; + else + npc->x -= 4 * 0x200; + + break; + } + + if (npc->direct == 0 && gMC.x < npc->x) + npc->hit.back = 16 * 0x200; + else if (npc->direct == 2 && gMC.x > npc->x) + npc->hit.back = 16 * 0x200; + else + npc->hit.back = 8 * 0x200; + + npc->rect = rc[npc->ani_no]; +} + +// Cage bars +void ActNpc239(NPCHAR *npc) +{ + RECT rcLeft = {192, 48, 256, 80}; + RECT rcRight = {96, 112, 144, 144}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 0) + { + npc->x += 8 * 0x200; + npc->y += 16 * 0x200; + } + else + { + npc->view.front = 24 * 0x200; + npc->view.back = 24 * 0x200; + npc->view.top = 8 * 0x200; + npc->view.back = 24 * 0x200; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft; + else + npc->rect = rcRight; +} diff --git a/src/NpcAct240.cpp b/src/NpcAct240.cpp new file mode 100644 index 0000000..2cf7b85 --- /dev/null +++ b/src/NpcAct240.cpp @@ -0,0 +1,1462 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Caret.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" +#include "NpcHit.h" +#include "Sound.h" +#include "Triangle.h" + +// Mimiga (jailed) +void ActNpc240(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {160, 64, 176, 80}, + {176, 64, 192, 80}, + {192, 64, 208, 80}, + {160, 64, 176, 80}, + {208, 64, 224, 80}, + {160, 64, 176, 80}, + }; + + RECT rcRight[6] = { + {160, 80, 176, 96}, + {176, 80, 192, 96}, + {192, 80, 208, 96}, + {160, 80, 176, 96}, + {208, 80, 224, 96}, + {160, 80, 176, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 60) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (Random(0, 60) == 1) + { + npc->act_no = 10; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = Random(0, 16); + npc->ani_no = 2; + npc->ani_wait = 0; + + if (Random(0, 9) % 2) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 11: + if (npc->direct == 0 && npc->flag & 1) + npc->direct = gMirrorMode? 0:2; + else if (npc->direct == 2 && npc->flag & 4) + npc->direct = gMirrorMode? 2:0; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + if (++npc->act_wait > 32) + npc->act_no = 0; + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Critter (Last Cave) +void ActNpc241(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + {32, 0, 48, 16}, + }; + + RECT rcRight[3] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {32, 16, 48, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->y += 3 * 0x200; + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->act_wait >= 8 && npc->x - (144 * 0x200) < gMC.x && npc->x + (144 * 0x200) > gMC.x && npc->y - (80 * 0x200) < gMC.y && npc->y + (80 * 0x200) > gMC.y) + { + npc->ani_no = 1; + } + else + { + if (npc->act_wait < 8) + ++npc->act_wait; + + npc->ani_no = 0; + } + + if (npc->shock) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + if (npc->act_wait >= 8 && npc->x - (96 * 0x200) < gMC.x && npc->x + (96 * 0x200) > gMC.x && npc->y - (80 * 0x200) < gMC.y && npc->y + (96 * 0x200) > gMC.y) + { + npc->act_no = 2; + npc->ani_no = 0; + npc->act_wait = 0; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 3; + npc->ani_no = 2; + npc->ym = -0x5FF; + PlaySoundObject(30, SOUND_MODE_PLAY); + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + } + + break; + + case 3: + if (npc->flag & 8) + { + npc->xm = 0; + npc->act_wait = 0; + npc->ani_no = 0; + npc->act_no = 1; + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + break; + } + + npc->ym += 0x55; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Bat (Last Cave) +void ActNpc242(NPCHAR *npc) +{ + if (npc->x < 0 || npc->x > gMap.width * 0x10 * 0x200) + { + VanishNpChar(npc); + return; + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->act_wait = Random(0, 50); + // Fallthrough + case 1: + if (npc->act_wait != 0) + { + --npc->act_wait; + break; + } + + npc->act_no = 2; + npc->ym = 0x400; + // Fallthrough + case 2: + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + if (npc->tgt_y < npc->y) + npc->ym -= 0x10; + if (npc->tgt_y > npc->y) + npc->ym += 0x10; + + if (npc->ym > 0x300) + npc->ym = 0x300; + if (npc->ym < -0x300) + npc->ym = -0x300; + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rect_left[4] = { + {32, 32, 48, 48}, + {48, 32, 64, 48}, + {64, 32, 80, 48}, + {80, 32, 96, 48}, + }; + + RECT rect_right[4] = { + {32, 48, 48, 64}, + {48, 48, 64, 64}, + {64, 48, 80, 64}, + {80, 48, 96, 64}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (npc->direct == 0) + npc->rect = rect_left[npc->ani_no]; + else + npc->rect = rect_right[npc->ani_no]; +} + +// Bat generator (Last Cave) +void ActNpc243(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = Random(0, 500); + // Fallthrough + case 1: + if (npc->act_wait != 0) + { + --npc->act_wait; + } + else + { + npc->act_no = 0; + SetNpChar(242, npc->x, npc->y + (Random(-0x20, 0x20) * 0x200), 0, 0, npc->direct, NULL, 0x100); + } + + break; + } +} + +// Lava drop +void ActNpc244(NPCHAR *npc) +{ + RECT rc = {96, 0, 104, 16}; + BOOL bHit; + + int i; + + npc->ym += 0x40; + + bHit = FALSE; + + if (npc->flag & 0xFF) + bHit = TRUE; + + if (npc->act_wait > 10 && npc->flag & 0x100) + bHit = TRUE; + + if (bHit) + { + for (i = 0; i < 3; ++i) + SetCaret(npc->x, npc->y + (4 * 0x200), CARET_BUBBLE, DIR_RIGHT); + + if (npc->x > gMC.x - (256 * 0x200) && npc->x < gMC.x + (256 * 0x200) && npc->y > gMC.y - (160 * 0x200) && npc->y < gMC.y + (160 * 0x200)) + PlaySoundObject(21, SOUND_MODE_PLAY); + + npc->cond = 0; + } + else + { + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + npc->rect = rc; + } +} + +// Lava drop generator +void ActNpc245(NPCHAR *npc) +{ + RECT rc[4] = { + {0, 0, 0, 0}, + {104, 0, 112, 16}, + {112, 0, 120, 16}, + {120, 0, 128, 16}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->act_wait = npc->code_event; + // Fallthrough + case 1: + npc->ani_no = 0; + + if (npc->act_wait != 0) + { + --npc->act_wait; + return; + } + + npc->act_no = 10; + npc->ani_wait = 0; + break; + + case 10: + if (++npc->ani_wait > 10) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + { + npc->ani_no = 0; + npc->act_no = 1; + npc->act_wait = npc->code_flag; + SetNpChar(244, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + } + + break; + } + + if (npc->ani_wait / 2 % 2) + npc->x = npc->tgt_x; + else + npc->x = npc->tgt_x + 0x200; + + npc->rect = rc[npc->ani_no]; +} + +// Press (proximity) +void ActNpc246(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {144, 112, 160, 136}, + {160, 112, 176, 136}, + {176, 112, 192, 136}, + }; + + int i; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 4 * 0x200; + // Fallthrough + case 1: + if (gMC.x < npc->x + (8 * 0x200) && gMC.x > npc->x - (8 * 0x200) && gMC.y > npc->y + (8 * 0x200) && gMC.y < npc->y + (128 * 0x200)) + npc->act_no = 5; + + break; + + case 5: + if (npc->flag & 8) + { + // Another place where this blank space is needed for ASM-accuracy. + // Chances are there used to be commented-out code here. + } + else + { + npc->act_no = 10; + npc->ani_wait = 0; + npc->ani_no = 1; + } + + break; + + case 10: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 2; + + if (gMC.y > npc->y) + { + npc->bits &= ~NPC_SOLID_HARD; + npc->damage = 0x7F; + } + else + { + npc->bits |= NPC_SOLID_HARD; + npc->damage = 0; + } + + if (npc->flag & 8) + { + if (npc->ani_no > 1) + { + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x, npc->y, Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(10); + } + + npc->act_no = 20; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->bits |= NPC_SOLID_HARD; + npc->damage = 0; + } + + break; + } + + if (npc->act_no >= 5) + { + npc->ym += 0x80; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + } + + npc->rect = rcLeft[npc->ani_no]; +} + +// Misery (boss) +void ActNpc247(NPCHAR *npc) +{ + unsigned char deg; + int xm, ym; + + RECT rcLeft[9] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + {32, 0, 48, 16}, + {48, 0, 64, 16}, + {64, 0, 80, 16}, + {80, 0, 96, 16}, + {96, 0, 112, 16}, + {0, 0, 0, 0}, + {112, 0, 128, 16}, + }; + + RECT rcRight[9] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {32, 16, 48, 32}, + {48, 16, 64, 32}, + {64, 16, 80, 32}, + {80, 16, 96, 32}, + {96, 16, 112, 32}, + {0, 0, 0, 0}, + {112, 16, 128, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y += 6 * 0x200; + npc->tgt_y = 64 * 0x200; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 20: + npc->xm = 0; + npc->ym += 0x40; + + if (npc->flag & 8) + { + npc->act_no = 21; + npc->ani_no = 2; + } + + break; + + case 21: + if (Random(0, 120) == 10) + { + npc->act_no = 22; + npc->act_wait = 0; + npc->ani_no = 3; + } + + break; + + case 22: + if (++npc->act_wait > 8) + { + npc->act_no = 21; + npc->ani_no = 2; + } + + break; + + case 100: + npc->act_no = 101; + npc->act_wait = 0; + npc->ani_no = 0; + npc->xm = 0; + npc->bits |= NPC_SHOOTABLE; + npc->count2 = npc->life; + // Fallthrough + case 101: + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->y < npc->tgt_y) + npc->ym += 0x20; + else + npc->ym -= 0x20; + + if (npc->ym < -0x200) + npc->ym = -0x200; + if (npc->ym > 0x200) + npc->ym = 0x200; + + if (++npc->act_wait > 200 || npc->life <= npc->count2 - 80) + { + npc->act_wait = 0; + npc->act_no = 110; + } + + break; + + case 110: + npc->act_no = 111; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + npc->bits &= ~NPC_SHOOTABLE; + // Fallthrough + case 111: + if (++npc->act_wait % 2) + npc->ani_no = 5; + else + npc->ani_no = 6; + + if (npc->act_wait > 30) + { + npc->act_wait = 0; + + if (++npc->count1 % 3 == 0) + npc->act_no = 113; + else + npc->act_no = 112; + + npc->ani_no = 4; + } + + break; + + case 112: + if (++npc->act_wait % 6 == 0) + { + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-4, 4); + ym = GetSin(deg) * 4; + xm = GetCos(deg) * 4; + + SetNpChar(248, npc->x, npc->y + (4 * 0x200), xm, ym, 0, NULL, 0x100); + PlaySoundObject(34, SOUND_MODE_PLAY); + } + + if (npc->act_wait > 30) + { + npc->act_wait = 0; + npc->act_no = 150; + } + + break; + + case 113: + if (++npc->act_wait == 10) + { + ym = gMC.y - (64 * 0x200); + SetNpChar(279, gMC.x, ym, 0, 0, 1, NULL, 0x100); + } + + if (npc->act_wait > 30) + { + npc->act_wait = 0; + npc->act_no = 150; + } + + break; + + case 150: + npc->act_no = 151; + npc->act_wait = 0; + npc->ani_no = 7; + + SetNpChar(249, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + SetNpChar(249, npc->x, npc->y, 0, 0, 2, NULL, 0x100); + + npc->tgt_x = Random(9, 31) * 0x200 * 0x10; + npc->tgt_y = Random(5, 7) * 0x200 * 0x10; + + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 151: + if (++npc->act_wait == 42) + { + SetNpChar(249, npc->tgt_x + (16 * 0x200), npc->tgt_y, 0, 0, 0, NULL, 0x100); + SetNpChar(249, npc->tgt_x - (16 * 0x200), npc->tgt_y, 0, 0, 2, NULL, 0x100); + } + + if (npc->act_wait > 50) + { + npc->act_wait = 0; + npc->ym = -0x200; + npc->bits |= NPC_SHOOTABLE; + npc->x = npc->tgt_x; + npc->y = npc->tgt_y; + + if (npc->life < 340) + { + SetNpChar(252, 0, 0, 0, 0, 0, npc, 0x100); + SetNpChar(252, 0, 0, 0, 0, 0x80, npc, 0x100); + } + + if (npc->life < 180) + { + SetNpChar(252, 0, 0, 0, 0, 0x40, npc, 0x100); + SetNpChar(252, 0, 0, 0, 0, 0xC0, npc, 0x100); + } + + if (gMC.x < npc->x - (112 * 0x200) || gMC.x > npc->x + (112 * 0x200)) + npc->act_no = 160; + else + npc->act_no = 100; + } + + break; + + case 160: + npc->act_no = 161; + npc->act_wait = 0; + npc->ani_no = 4; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 161: + if (npc->y < npc->tgt_y) + npc->ym += 0x20; + else + npc->ym -= 0x20; + + if (npc->ym < -0x200) + npc->ym = -0x200; + if (npc->ym > 0x200) + npc->ym = 0x200; + + if (++npc->act_wait % 24 == 0) + { + SetNpChar(250, npc->x, npc->y + (4 * 0x200), 0, 0, 0, NULL, 0x100); + PlaySoundObject(34, SOUND_MODE_PLAY); + } + + if (npc->act_wait > 72) + { + npc->act_wait = 0; + npc->act_no = 100; + } + + break; + + case 1000: + npc->bits &= ~NPC_SHOOTABLE; + npc->act_no = 1001; + npc->act_wait = 0; + npc->ani_no = 4; + + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + + npc->xm = 0; + npc->ym = 0; + + DeleteNpCharCode(252, TRUE); + + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + // Fallthrough + case 1001: + if (++npc->act_wait / 2 % 2) + npc->x = npc->tgt_x + (1 * 0x200); + else + npc->x = npc->tgt_x; + + break; + + case 1010: + npc->ym += 0x10; + + if (npc->flag & 8) + { + npc->act_no = 1020; + npc->ani_no = 8; + } + + break; + } + + if (npc->xm < -0x200) + npc->xm = -0x200; + if (npc->xm > 0x200) + npc->xm = 0x200; + + if (npc->ym < -0x400) + npc->ym = -0x400; + if (npc->ym > 0x400) + npc->ym = 0x400; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Boss Misery (vanishing) +void ActNpc248(NPCHAR *npc) +{ + if (npc->flag & 0xFF) + { + npc->cond = 0; + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } + + npc->y += npc->ym; + npc->x += npc->xm; + + RECT rect_left[3] = { + {0, 48, 16, 64}, + {16, 48, 32, 64}, + {32, 48, 48, 64}, + }; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 2) + npc->ani_no = 0; + } + + npc->rect = rect_left[npc->ani_no]; + + if (++npc->count1 > 300) + { + npc->cond = 0; + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } +} + +// Boss Misery energy shot +void ActNpc249(NPCHAR *npc) +{ + RECT rc[2] = { + {48, 48, 64, 64}, + {64, 48, 80, 64}, + }; + + if (++npc->act_wait > 8) + npc->cond = 0; + + if (npc->direct == 0) + { + npc->rect = rc[0]; + npc->x -= 2 * 0x200; + } + else + { + npc->rect = rc[1]; + npc->x += 2 * 0x200; + } +} + +// Boss Misery lightning ball +void ActNpc250(NPCHAR *npc) +{ + RECT rc[3] = { + {0, 32, 16, 48}, + {16, 32, 32, 48}, + {32, 32, 48, 48}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_y = npc->y; + npc->xm = 0; + npc->ym = -0x200; + // Fallthrough + case 1: + if (npc->x < gMC.x) + npc->xm += 0x10; + else + npc->xm -= 0x10; + + if (npc->y < npc->tgt_y) + npc->ym += 0x20; + else + npc->ym -= 0x20; + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (gMC.x > npc->x - (8 * 0x200) && gMC.x < npc->x + (8 * 0x200) && gMC.y > npc->y) + npc->act_no = 10; + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + // Fallthrough + case 11: + if (++npc->act_wait > 10) + { + SetNpChar(251, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + PlaySoundObject(101, SOUND_MODE_PLAY); + npc->cond = 0; + return; + } + + if (npc->act_wait / 2 % 2) + npc->ani_no = 2; + else + npc->ani_no = 1; + } + + npc->rect = rc[npc->ani_no]; +} + +// Boss Misery lightning +void ActNpc251(NPCHAR *npc) +{ + RECT rc[2] = { + {80, 32, 96, 64}, + {96, 32, 112, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (++npc->ani_no > 1) + npc->ani_no = 0; + + npc->y += 8 * 0x200; + + if (npc->flag & 0xFF) + { + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 3); + npc->cond = 0; + } + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Boss Misery bats +void ActNpc252(NPCHAR *npc) +{ + RECT rcLeft[4] = { + {48, 32, 64, 48}, + {112, 32, 128, 48}, + {128, 32, 144, 48}, + {144, 32, 160, 48}, + }; + + RECT rcRight[4] = { + {48, 32, 64, 48}, + {112, 48, 128, 64}, + {128, 48, 144, 64}, + {144, 48, 160, 64}, + }; + + unsigned char deg; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = 0; + npc->count1 = npc->direct; + // Fallthrough + case 1: + npc->count1 += 2; + npc->count1 %= 0x100; + + deg = npc->count1; + + if (npc->act_wait < 192) + ++npc->act_wait; + + npc->x = npc->pNpc->x + (GetCos(deg) * npc->act_wait) / 4; + npc->y = npc->pNpc->y + (GetSin(deg) * npc->act_wait) / 4; + + if (npc->pNpc->act_no == 151) + { + npc->act_no = 10; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 11; + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-3, 3); + npc->xm = GetCos(deg); + npc->ym = GetSin(deg); + + npc->ani_no = 1; + npc->ani_wait = 0; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 11: + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->flag & 0xFF) + { + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + npc->cond = 0; + } + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 1; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// EXP capsule +void ActNpc253(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + } + + if (npc->life <= 100) + { + if (!gbNoExpDrops) + SetExpObjects(npc->x, npc->y, npc->code_flag); + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8); + PlaySoundObject(25, SOUND_MODE_PLAY); + npc->cond = 0; + } + + RECT rc[2] = { + {0, 64, 16, 80}, + {16, 64, 32, 80}, + }; + + npc->rect = rc[npc->ani_no]; +} + +// Helicopter +void ActNpc254(NPCHAR *npc) +{ + RECT rc[2] = { + {0, 0, 128, 64}, + {0, 64, 128, 128}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + SetNpChar(255, npc->x + (18 * 0x200), npc->y - (57 * 0x200), 0, 0, 0, npc, 0x100); + SetNpChar(255, npc->x - (32 * 0x200), npc->y - (52 * 0x200), 0, 0, 2, npc, 0x100); + break; + + case 20: + npc->act_wait = 0; + npc->count1 = 60; + npc->act_no = 21; + break; + + case 30: + npc->act_no = 21; + SetNpChar(223, npc->x - (11 * 0x200), npc->y - (14 * 0x200), 0, 0, 0, NULL, 0x100); + break; + + case 40: + npc->act_no = 21; + SetNpChar(223, npc->x - (9 * 0x200), npc->y - (14 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(40, npc->x - (22 * 0x200), npc->y - (14 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(93, npc->x - (35 * 0x200), npc->y - (14 * 0x200), 0, 0, 0, NULL, 0x100); + break; + } + + if (npc->direct == 0) + npc->rect = rc[0]; + else + npc->rect = rc[1]; +} + +// Helicopter blades +void ActNpc255(NPCHAR *npc) +{ + RECT rcLeft[4] = { + {128, 0, 240, 16}, + {128, 16, 240, 32}, + {128, 32, 240, 48}, + {128, 16, 240, 32}, + }; + + RECT rcRight[4] = { + {240, 0, 320, 16}, + {240, 16, 320, 32}, + {240, 32, 320, 48}, + {240, 16, 320, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 0) + { + npc->view.front = (56 * 0x200); + npc->view.back = (56 * 0x200); + } + else + { + npc->view.front = (40 * 0x200); + npc->view.back = (40 * 0x200); + } + // Fallthrough + case 1: + if (npc->pNpc->act_no >= 20) + npc->act_no = 10; + + break; + + case 10: + npc->act_no = 11; + // Fallthrough + case 11: + if (++npc->ani_no > 3) + npc->ani_no = 0; + + break; + } + + if (npc->direct == 0) + { + npc->x = npc->pNpc->x + (18 * 0x200); + npc->y = npc->pNpc->y - (57 * 0x200); + } + else + { + npc->x = npc->pNpc->x - (32 * 0x200); + npc->y = npc->pNpc->y - (52 * 0x200); + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Doctor (facing away) +void ActNpc256(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {48, 160, 72, 192}, + {72, 160, 96, 192}, + {0, 128, 24, 160}, + {24, 128, 48, 160}, + {0, 160, 24, 192}, + {24, 160, 48, 192}, + }; + + switch (npc->act_no) + { + case 0: + gSuperXpos = 0; + npc->act_no = 1; + npc->y -= 8 * 0x200; + // Fallthrough + case 1: + npc->ani_no = 0; + break; + + case 10: + npc->act_no = 11; + npc->ani_wait = 0; + npc->ani_no = 0; + npc->count1 = 0; + // Fallthrough + case 11: + if (++npc->ani_wait > 5) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + { + npc->ani_no = 0; + ++npc->count1; + } + + if (npc->count1 > 5) + npc->act_no = 1; + + break; + + case 20: + npc->act_no = 21; + // Fallthrough + case 21: + npc->ani_no = 2; + break; + + case 40: + npc->act_no = 41; + SetNpChar(257, npc->x - (14 * 0x200), npc->y - (16 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(257, npc->x - (14 * 0x200), npc->y - (16 * 0x200), 0, 0, 2, NULL, 0xAA); + // Fallthrough + case 41: + npc->ani_no = 4; + break; + + case 50: + npc->act_no = 51; + npc->ani_wait = 0; + npc->ani_no = 4; + npc->count1 = 0; + // Fallthrough + case 51: + if (++npc->ani_wait > 5) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + { + npc->ani_no = 4; + ++npc->count1; + } + + if (npc->count1 > 5) + npc->act_no = 41; + + break; + } + + npc->rect = rcLeft[npc->ani_no]; +} + +// Red crystal +void ActNpc257(NPCHAR *npc) +{ + RECT rc[3] = { + {176, 32, 184, 48}, + {184, 32, 192, 48}, + {0, 0, 0, 0}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (gSuperXpos != 0) + npc->act_no = 10; + + break; + + case 10: + if (npc->x < gSuperXpos) + npc->xm += 0x55; + if (npc->x > gSuperXpos) + npc->xm -= 0x55; + + if (npc->y < gSuperYpos) + npc->ym += 0x55; + if (npc->y > gSuperYpos) + npc->ym -= 0x55; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x400) + npc->ym = 0x400; + if (npc->ym < -0x400) + npc->ym = -0x400; + + npc->x += npc->xm; + npc->y += npc->ym; + + break; + } + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->direct == 0 && npc->xm > 0) + npc->ani_no = 2; + if (npc->direct == 2 && npc->xm < 0) + npc->ani_no = 2; + + npc->rect = rc[npc->ani_no]; +} + +// Mimiga (sleeping) +void ActNpc258(NPCHAR *npc) +{ + RECT rc = {48, 32, 64, 48}; + npc->rect = rc; +} + +// Curly (carried and unconcious) +void ActNpc259(NPCHAR *npc) +{ + RECT rcLeft = {224, 96, 240, 112}; + RECT rcRight = {224, 112, 240, 128}; + + switch (npc->act_no) + { + case 0: + npc->bits &= ~NPC_INTERACTABLE; + npc->act_no = 1; + // Fallthrough + case 1: + if (gMC.direct == 0) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->y = gMC.y - (4 * 0x200); + + if (npc->direct == 0) + { + npc->x = gMC.x + (3 * 0x200); + npc->rect = rcLeft; + } + else + { + npc->x = gMC.x - (3 * 0x200); + npc->rect = rcRight; + } + + if (gMC.ani_no % 2) + ++npc->rect.top; + + break; + + case 10: + npc->act_no = 11; + npc->xm = 0x40; + npc->ym = -0x20; + + npc->rect = rcLeft; + break; + + case 11: + if (npc->y < (64 * 0x200)) + npc->ym = 0x20; + + npc->x += npc->xm; + npc->y += npc->ym; + break; + + case 20: + VanishNpChar(npc); + SetDestroyNpCharUp(npc->x, npc->y, 0x2000, 0x40); + break; + } +} diff --git a/src/NpcAct260.cpp b/src/NpcAct260.cpp new file mode 100644 index 0000000..047d7bb --- /dev/null +++ b/src/NpcAct260.cpp @@ -0,0 +1,2284 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Caret.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "MycHit.h" +#include "MycParam.h" +#include "NpChar.h" +#include "NpcHit.h" +#include "Sound.h" +#include "Triangle.h" + +// Shovel Brigade (caged) +void ActNpc260(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {128, 64, 144, 80}, + {144, 64, 160, 80}, + {224, 64, 240, 80}, + }; + + RECT rcRight[3] = { + {128, 80, 144, 96}, + {144, 80, 160, 96}, + {224, 80, 240, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->x += 0x200; + npc->y -= 0x400; + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 160) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 12) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 2; + SetNpChar(87, npc->x, npc->y - (16 * 0x200), 0, 0, 0, NULL, 0x100); + + break; + } + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Chie (caged) +void ActNpc261(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {112, 32, 128, 48}, + {128, 32, 144, 48}, + }; + + RECT rcRight[2] = { + {112, 48, 128, 64}, + {128, 48, 144, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->x -= 1 * 0x200; + npc->y -= 2 * 0x200; + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 160) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 12) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Chaco (caged) +void ActNpc262(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {128, 0, 144, 16}, + {144, 0, 160, 16}, + }; + + RECT rcRight[2] = { + {128, 16, 144, 32}, + {144, 16, 160, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->x -= 1 * 0x200; + npc->y -= 2 * 0x200; + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 160) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 12) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Doctor (boss) +void ActNpc263(NPCHAR *npc) +{ + int deg; + int xm, ym; + + RECT rcLeft[9] = { + {0, 0, 24, 32}, + {24, 0, 48, 32}, + {48, 0, 72, 32}, + {0, 0, 0, 0}, + {72, 0, 96, 32}, + {96, 0, 120, 32}, + {120, 0, 144, 32}, + {144, 0, 168, 32}, + {264, 0, 288, 32}, + }; + + RECT rcRight[9] = { + {0, 32, 24, 64}, + {24, 32, 48, 64}, + {48, 32, 72, 64}, + {0, 0, 0, 0}, + {72, 32, 96, 64}, + {96, 32, 120, 64}, + {120, 32, 144, 64}, + {144, 32, 168, 64}, + {264, 32, 288, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y += 8 * 0x200; + npc->ani_no = 3; + break; + + case 2: + if (++npc->act_wait / 2 % 2) + npc->ani_no = 0; + else + npc->ani_no = 3; + + if (npc->act_wait > 50) + npc->act_no = 10; + + break; + + case 10: + npc->ym += 0x80; + npc->bits |= NPC_SHOOTABLE; + npc->damage = 3; + + if (npc->flag & 8) + { + npc->act_no = 20; + npc->act_wait = 0; + npc->ani_no = 0; + npc->count2 = npc->life; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 20: + if (++npc->act_wait < 50 && npc->life < npc->count2 - 20) + npc->act_wait = 50; + + if (npc->act_wait == 50) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->ani_no = 4; + } + + if (npc->act_wait == 80) + { + npc->ani_no = 5; + PlaySoundObject(25, SOUND_MODE_PLAY); + + if (npc->direct == 0) + { + SetNpChar(264, npc->x - (16 * 0x200), npc->y, 0, 0, 0, NULL, 0x100); + SetNpChar(264, npc->x - (16 * 0x200), npc->y, 0, 0, 0x400, NULL, 0x100); + } + else + { + SetNpChar(264, npc->x + (16 * 0x200), npc->y, 0, 0, 2, NULL, 0x100); + SetNpChar(264, npc->x + (16 * 0x200), npc->y, 0, 0, 2 + 0x400, NULL, 0x100); + } + } + + if (npc->act_wait == 120) + npc->ani_no = 0; + + if (npc->act_wait > 130 && npc->life < npc->count2 - 50) + npc->act_wait = 161; + + if (npc->act_wait > 160) + { + npc->act_no = 100; + npc->ani_no = 0; + } + + break; + + case 30: + npc->act_no = 31; + npc->act_wait = 0; + npc->ani_no = 6; + npc->tgt_x = npc->x; + npc->bits |= NPC_SHOOTABLE; + // Fallthrough + case 31: + if (++npc->act_wait / 2 % 2) + npc->x = npc->tgt_x; + else + npc->x = npc->tgt_x + 0x200; + + if (npc->act_wait > 50) + { + npc->act_no = 32; + npc->act_wait = 0; + npc->ani_no = 7; + PlaySoundObject(101, SOUND_MODE_PLAY); + + for (deg = 8; deg < 0x100; deg += 0x10) + { + xm = GetCos(deg) * 2; + ym = GetSin(deg) * 2; + SetNpChar(266, npc->x, npc->y, xm, ym, 0, NULL, 0x100); + } + } + + break; + + case 32: + if (++npc->act_wait > 50) + npc->act_no = 100; + + break; + + case 100: + npc->act_no = 101; + npc->bits &= ~NPC_SHOOTABLE; + npc->damage = 0; + npc->act_wait = 0; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 101: + npc->act_wait += 2; + + if (npc->act_wait > 16) + { + npc->act_no = 102; + npc->act_wait = 0; + npc->ani_no = 3; + npc->tgt_x = Random(5, 35) * 0x200 * 0x10; + npc->tgt_y = Random(5, 7) * 0x200 * 0x10; + } + + break; + + case 102: + if (++npc->act_wait > 40) + { + npc->act_no = 103; + npc->act_wait = 16; + npc->ani_no = 2; + npc->ym = 0; + npc->x = npc->tgt_x; + npc->y = npc->tgt_y; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 103: + npc->act_wait -= 2; + + if (npc->act_wait <= 0) + { + npc->bits |= NPC_SHOOTABLE; + npc->damage = 3; + + if (npc->count1 < 3) + { + ++npc->count1; + npc->act_no = 10; + } + else + { + npc->count1 = 0; + npc->act_no = 30; + } + } + + break; + + case 500: + npc->bits &= ~NPC_SHOOTABLE; + npc->ani_no = 6; + npc->ym += 0x10; + + if (npc->flag & 8) + { + npc->act_no = 501; + npc->act_wait = 0; + npc->tgt_x = npc->x; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 501: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->ani_no = 8; + + if (++npc->act_wait / 2 % 2) + npc->x = npc->tgt_x; + else + npc->x = npc->tgt_x + (1 * 0x200); + + break; + } + + if (npc->act_no >= 10) + { + if (npc->act_no == 102) + { + gSuperXpos = npc->tgt_x; + gSuperYpos = npc->tgt_y; + } + else + { + gSuperXpos = npc->x; + gSuperYpos = npc->y; + } + } + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->act_no == 101 || npc->act_no == 103) + { + npc->rect.top += npc->act_wait; + npc->rect.bottom -= npc->act_wait; + npc->view.top = (16 - npc->act_wait) * 0x200; + } + else + { + npc->view.top = 16 * 0x200; + } +} + +// Doctor red wave (projectile) +void ActNpc264(NPCHAR *npc) +{ + RECT rc = {288, 0, 304, 16}; + unsigned char deg; + + if (npc->x < 0 || npc->x > gMap.width * 0x10 * 0x200) + { + VanishNpChar(npc); + return; + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->count1 = npc->direct / 8; + npc->direct %= 8; + // Fallthrough + case 1: + npc->count1 += 6; + npc->count1 %= 0x100; + deg = npc->count1; + + if (npc->act_wait < 128) + ++npc->act_wait; + + if (npc->direct == 0) + npc->xm -= 21; + else + npc->xm += 21; + + npc->tgt_x += npc->xm; + + npc->x = npc->tgt_x + (GetCos(deg) * npc->act_wait) / 2 / 4; + npc->y = npc->tgt_y + (GetSin(deg) * npc->act_wait) / 2; + + SetNpChar(265, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + + break; + } + + npc->rect = rc; +} + +// Doctor red ball projectile +void ActNpc265(NPCHAR *npc) +{ + RECT rc[3] = { + {288, 16, 304, 32}, + {288, 32, 304, 48}, + {288, 48, 304, 64}, + }; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->cond = 0; + else + npc->rect = rc[npc->ani_no]; +} + +// Doctor red ball projectile (bouncing) +void ActNpc266(NPCHAR *npc) +{ + RECT rc[2] = { + {304, 16, 320, 32}, + {304, 32, 320, 48}, + }; + + if (npc->flag & 1) + npc->xm *= -1; + if (npc->flag & 4) + npc->xm *= -1; + + if (npc->flag & 2) + npc->ym = 0x200; + if (npc->flag & 8) + npc->ym = -0x200; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (++npc->ani_no > 1) + npc->ani_no = 0; + + npc->rect = rc[npc->ani_no]; + + if (++npc->act_wait % 4 == 1) + SetNpChar(265, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + + if (npc->act_wait > 250) + VanishNpChar(npc); +} + +// Muscle Doctor +void ActNpc267(NPCHAR *npc) +{ + RECT rcLeft[10] = { + {0, 0, 0, 0}, + {0, 64, 40, 112}, + {40, 64, 80, 112}, + {80, 64, 120, 112}, + {120, 64, 160, 112}, + {160, 64, 200, 112}, + {200, 64, 240, 112}, + {240, 64, 280, 112}, + {280, 64, 320, 112}, + {0, 160, 40, 208}, + }; + + RECT rcRight[10] = { + {0, 0, 0, 0}, + {0, 112, 40, 160}, + {40, 112, 80, 160}, + {80, 112, 120, 160}, + {120, 112, 160, 160}, + {160, 112, 200, 160}, + {200, 112, 240, 160}, + {240, 112, 280, 160}, + {280, 112, 320, 160}, + {40, 160, 80, 208}, + }; + + int xm, ym; + int i; + + switch (npc->act_no) + { + case 0: + if (gSuperXpos > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->direct == 0) + npc->x = gSuperXpos - (6 * 0x200); + else + npc->x = gSuperXpos + (6 * 0x200); + + npc->y = gSuperYpos; + // Fallthrough + case 1: + npc->act_no = 2; + // Fallthrough + case 2: + npc->ym += 0x80; + + if (++npc->act_wait / 2 % 2) + npc->ani_no = 0; + else + npc->ani_no = 3; + + break; + + case 5: + npc->act_no = 6; + npc->ani_no = 1; + npc->ani_wait = 0; + // Fallthrough + case 6: + npc->ym += 0x80; + + if (++npc->ani_wait > 40) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 1; + + break; + + case 7: + npc->act_no = 8; + npc->act_wait = 0; + npc->ani_no = 3; + // Fallthrough + case 8: + npc->ym += 0x40; + + if (++npc->act_wait > 40) + npc->act_no = 10; + + break; + + case 10: + npc->bits |= NPC_INVULNERABLE; + npc->xm = 0; + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_no = 1; + npc->ani_wait = 0; + npc->count2 = npc->life; + // Fallthrough + case 11: + npc->ym += 0x80; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->flag & 8) + { + if (npc->life < npc->count2 - 20) + { + if (gMC.flag & 8 && gMC.x > npc->x - (48 * 0x200) && gMC.x < npc->x + (48 * 0x200) && npc->ani_no != 6) + { + npc->ani_no = 6; + int damage = 5; + if (damage == 1 && gbDamageModifier == 0.5){ + damage = 1; + } + else if (gbDamageModifier == -1 ){ + damage = 127; + } + else{ + damage = damage * gbDamageModifier; + } + + DamageMyChar(damage); + SetQuake(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + gMC.ym = -0x400; + + if (npc->x > gMC.x) + gMC.xm = -0x5FF; + else + gMC.xm = 0x5FF; + + for (i = 0; i < 100; ++i) + SetNpChar(270, npc->x + (Random(-0x10, 0x10) * 0x200), npc->y + (Random(-0x10, 0x10) * 0x200), Random(-0x200, 0x200) * 3, Random(-0x200, 0x200) * 3, 3, NULL, 0xAA); + } + } + else + { + if (++npc->ani_wait > 10) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 2) + npc->ani_no = 1; + } + } + } + else + { + npc->ani_no = 4; + } + + if (++npc->act_wait > 30 || npc->life < npc->count2 - 20) + { + if (++npc->count1 > 10) + npc->count1 = 0; + + switch (npc->count1) + { + case 8: + npc->act_no = 20; + break; + + case 2: + case 7: + npc->act_no = 100; + break; + + case 3: + case 6: + npc->act_no = 30; + break; + + case 1: + case 9: + npc->act_no = 40; + break; + + default: + npc->act_no = 15; + npc->act_wait = 0; + break; + } + } + + break; + + case 15: + npc->ani_no = 3; + ++npc->act_wait; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->act_wait > 20) + { + npc->act_no = 16; + npc->ani_no = 4; + npc->ani_wait = 0; + npc->ym = -0x600; + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + } + + break; + + case 16: + npc->ym += 0x40; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 4; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->ym > 0 && npc->flag & 8) + npc->act_no = 17; + + break; + + case 17: + npc->act_no = 18; + npc->act_wait = 0; + SetQuake(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + // Fallthrough + case 18: + npc->ani_no = 3; + ++npc->act_wait; + + npc->xm = (npc->xm * 7) / 8; + npc->ym += 0x80; + + if (npc->act_wait > 10) + npc->act_no = 10; + + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + // Fallthrough + case 21: + ++npc->act_wait; + npc->ani_no = 6; + + if (npc->act_wait > 20 && npc->act_wait % 3 == 1) + { + ym = Random(-0x200, 0x200); + xm = Random(0x100, 0x200) * 4; + + if (npc->direct == 0) + SetNpChar(269, npc->x - 0x1000, npc->y - 0x800, -xm, ym, 0, NULL, 0x100); + else + SetNpChar(269, npc->x + 0x1000, npc->y - 0x800, xm, ym, 2, NULL, 0x100); + + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + if (npc->act_wait > 90) + npc->act_no = 10; + + break; + + case 30: + npc->act_no = 31; + npc->act_wait = 0; + npc->bits |= NPC_SOLID_SOFT; + npc->bits &= ~NPC_SHOOTABLE; + // Fallthrough + case 31: + npc->ani_no = 3; + + if (++npc->act_wait > 20) + { + npc->act_no = 32; + npc->act_wait = 0; + npc->ani_no = 7; + npc->bits |= NPC_REAR_AND_TOP_DONT_HURT; + npc->damage = 10; + PlaySoundObject(25, SOUND_MODE_PLAY); + + if (npc->direct == 0) + npc->xm = -0x5FF; + else + npc->xm = 0x5FF; + } + + break; + + case 32: + ++npc->act_wait; + npc->ym = 0; + + if (npc->act_wait / 2 % 2) + npc->ani_no = 7; + else + npc->ani_no = 8; + + if (npc->act_wait > 30) + { + npc->act_wait = 0; + npc->act_no = 18; + npc->damage = 5; + npc->bits &= ~(NPC_SOLID_SOFT | NPC_REAR_AND_TOP_DONT_HURT); + npc->bits |= NPC_SHOOTABLE; + } + + if (npc->flag & 1 || npc->flag & 4) + { + npc->act_no = 15; + npc->act_wait = 0; + npc->damage = 5; + npc->bits &= ~(NPC_SOLID_SOFT | NPC_REAR_AND_TOP_DONT_HURT); + npc->bits |= NPC_SHOOTABLE; + } + + break; + + case 40: + npc->ani_no = 3; + ++npc->act_wait; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->act_wait > 20) + { + npc->act_no = 41; + npc->ani_no = 4; + npc->ani_wait = 0; + npc->ym = -0x800; + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + } + + break; + + case 41: + npc->ym += 0x40; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 4; + + if (gMC.y > npc->y && gMC.x > npc->x - (8 * 0x200) && gMC.x < npc->x + (8 * 0x200)) + { + npc->act_no = 16; + npc->ym = 0x5FF; + npc->xm = 0; + } + + if (npc->ym > 0 && npc->flag & 8) + npc->act_no = 17; + + break; + + case 100: + npc->act_no = 101; + npc->act_wait = 0; + npc->bits &= ~(NPC_INVULNERABLE | NPC_SHOOTABLE); + npc->damage = 0; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 101: + npc->act_wait += 2; + + if (npc->act_wait > 28) + { + npc->act_no = 102; + npc->act_wait = 0; + npc->ani_no = 0; + + npc->tgt_x = gMC.x; + npc->tgt_y = gMC.y - (32 * 0x200); + + if (npc->tgt_y < (64 * 0x200)) + npc->tgt_y = (64 * 0x200); + + if (npc->tgt_x < (64 * 0x200)) + npc->tgt_x = (64 * 0x200); + if (npc->tgt_x > (576 * 0x200)) + npc->tgt_x = (576 * 0x200); + } + + break; + + case 102: + if (++npc->act_wait > 40) + { + npc->act_no = 103; + npc->act_wait = 28; + npc->ani_no = 4; + npc->ym = 0; + npc->x = npc->tgt_x; + npc->y = npc->tgt_y; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 103: + npc->act_wait -= 2; + + if (npc->act_wait <= 0) + { + npc->bits |= (NPC_INVULNERABLE | NPC_SHOOTABLE); + npc->damage = 5; + npc->act_no = 16; + npc->ym = -0x200; + npc->xm = 0; + } + + break; + + case 500: + DeleteNpCharCode(269, TRUE); + npc->bits &= ~NPC_SHOOTABLE; + npc->ani_no = 4; + npc->ym += 0x20; + npc->xm = 0; + + if (npc->flag & 8) + { + npc->act_no = 501; + npc->act_wait = 0; + npc->tgt_x = npc->x; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 501: + npc->ani_no = 9; + + if (++npc->act_wait / 2 % 2) + npc->x = npc->tgt_x; + else + npc->x = npc->tgt_x + (1 * 0x200); + + break; + + case 510: + npc->act_no = 511; + npc->act_wait = 0; + npc->ani_no = 9; + npc->tgt_x = npc->x; + npc->y += 16 * 0x200; + npc->bits |= NPC_IGNORE_SOLIDITY; + // Fallthrough + case 511: + SetQuake(2); + + if (++npc->act_wait % 6 == 3) + PlaySoundObject(25, SOUND_MODE_PLAY); + + if (npc->act_wait / 2 % 2) + npc->x = npc->tgt_x; + else + npc->x = npc->tgt_x + (1 * 0x200); + + if (npc->act_wait > 352) + { + npc->ani_no = 0; + npc->act_no = 0x200; + } + + break; + + case 520: + npc->damage = 0; + gSuperYpos = -32 * 0x200; + break; + } + + if (npc->act_no >= 11 && npc->act_no < 501) + { + if (npc->act_no == 102) + { + gSuperXpos = npc->tgt_x; + gSuperYpos = npc->tgt_y; + } + else + { + gSuperXpos = npc->x; + gSuperYpos = npc->y; + } + } + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->act_no >= 512) + { + // There probably used to be some commented-out code here + } + else if (npc->act_no < 510) + { + if (npc->act_no != 102 && npc->act_no != 103 && Random(0, 3) == 2) + SetNpChar(270, npc->x + (Random(-0x10, 0x10) * 0x200), npc->y + (Random(-8, 4) * 0x200), npc->xm, 0, 3, 0, 0x100); + } + else + { + SetNpChar(270, npc->x + (Random(-0x10, 0x10) * 0x200), npc->y - (((336 - npc->act_wait) / 8) * 0x200), Random(-0x200, 0x200), Random(-0x200, 0) * 2, 3, NULL, 0xAA); + SetNpChar(270, npc->x + (Random(-0x10, 0x10) * 0x200), npc->y - (((336 - npc->act_wait) / 8) * 0x200), Random(-0x200, 0x200), Random(-0x200, 0) * 2, 3, NULL, 0xAA); + SetNpChar(270, npc->x + (Random(-0x10, 0x10) * 0x200), npc->y - (((336 - npc->act_wait) / 8) * 0x200), 0, 2 * Random(-0x200, 0), 3, NULL, 0xAA); + SetNpChar(270, npc->x + (Random(-0x10, 0x10) * 0x200), npc->y - (((336 - npc->act_wait) / 8) * 0x200), 0, 2 * Random(-0x200, 0), 3, NULL, 0xAA); + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->act_no == 511) + { + npc->rect.top += npc->act_wait / 8; + npc->view.top = (44 - (npc->act_wait / 8)) * 0x200; + npc->view.bottom = 4 * 0x200; + } + else if (npc->act_no == 101 || npc->act_no == 103) + { + npc->rect.top += npc->act_wait; + npc->rect.bottom -= npc->act_wait; + npc->view.top = (28 - npc->act_wait) * 0x200; + } + else + { + npc->view.top = 28 * 0x200; + } +} + +// Igor (enemy) +void ActNpc268(NPCHAR *npc) +{ + unsigned char deg; + int xm, ym; + + RECT rcLeft[10] = { + {0, 0, 40, 40}, + {40, 0, 80, 40}, + {80, 0, 120, 40}, + {0, 0, 40, 40}, + {120, 0, 160, 40}, + {0, 0, 40, 40}, + {40, 80, 80, 120}, + {0, 80, 40, 120}, + {240, 0, 280, 40}, + {280, 0, 320, 40}, + }; + + RECT rcRight[10] = { + {0, 40, 40, 80}, + {40, 40, 80, 80}, + {80, 40, 120, 80}, + {0, 40, 40, 80}, + {120, 40, 160, 80}, + {0, 40, 40, 80}, + {160, 80, 200, 120}, + {120, 80, 160, 120}, + {240, 40, 280, 80}, + {280, 40, 320, 80}, + }; + + if (npc->x < gMC.x - (320 * 0x200) || npc->x > gMC.x + (320 * 0x200) || npc->y < gMC.y - (240 * 0x200) || npc->y > gMC.y + (240 * 0x200)) + npc->act_no = 1; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y += 8 * 0x200; + // Fallthrough + case 1: + if (++npc->ani_wait > 20) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + +#ifdef FIX_BUGS + if (npc->x < gMC.x + (112 * 0x200) && npc->x > gMC.x - (112 * 0x200) && npc->y < gMC.y + (48 * 0x200) && npc->y > gMC.y - (112 * 0x200)) +#else + // Instead of checking the X and Y coordinates, this checks the X coordinates twice + if (npc->x < gMC.x + (112 * 0x200) && npc->x > gMC.x - (112 * 0x200) && npc->x < gMC.x + (48 * 0x200) && npc->x > gMC.x - (112 * 0x200)) +#endif + npc->act_no = 10; + + if (npc->shock) + npc->act_no = 10; + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_no = 0; + npc->ani_wait = 0; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 11: + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + if (npc->x < gMC.x + (64 * 0x200) && npc->x > gMC.x - (64 * 0x200)) + { + npc->act_no = 20; + npc->act_wait = 0; + } + + if (npc->xm < 0 && npc->flag & 1) + { + npc->act_no = 20; + npc->act_wait = 0; + } + + if (npc->xm > 0 && npc->flag & 4) + { + npc->act_no = 20; + npc->act_wait = 0; + } + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + break; + + case 20: + npc->xm = 0; + npc->ani_no = 6; + + if (++npc->act_wait > 10) + { + npc->act_no = 30; + npc->ym = -0x5FF; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + PlaySoundObject(108, SOUND_MODE_PLAY); + } + + break; + + case 30: + npc->ani_no = 7; + + if (npc->flag & 8) + { + npc->act_no = 40; + npc->act_wait = 0; + SetQuake(20); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + + break; + + case 40: + npc->xm = 0; + npc->ani_no = 6; + + if (++npc->act_wait > 30) + npc->act_no = 50; + + break; + + case 50: + npc->act_no = 51; + npc->act_wait = 0; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 51: + if (++npc->act_wait > 30 && npc->act_wait % 4 == 1) + { + if (npc->direct == 0) + deg = 0x88; + else + deg = 0xF8; + + deg += (unsigned char)Random(-0x10, 0x10); + ym = GetSin(deg) * 5; + xm = GetCos(deg) * 5; + SetNpChar(11, npc->x, npc->y + (4 * 0x200), xm, ym, 0, NULL, 0x100); + PlaySoundObject(12, SOUND_MODE_PLAY); + } + + if (npc->act_wait < 50 && npc->act_wait / 2 % 2) + npc->ani_no = 9; + else + npc->ani_no = 8; + + if (npc->act_wait > 82) + { + npc->act_no = 10; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + } + + npc->ym += 0x200 / 10; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Red Bat (bouncing) +void ActNpc269(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {232, 0, 248, 16}, + {248, 0, 264, 16}, + {248, 16, 264, 32}, + }; + + RECT rcRight[3] = { + {232, 32, 248, 48}, + {248, 32, 264, 48}, + {248, 48, 264, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->xm2 = npc->xm; + npc->ym2 = npc->ym; + // Fallthrough + case 1: + if (npc->xm2 < 0 && npc->flag & 1) + { + npc->direct = gMirrorMode? 0:2; + npc->xm2 *= -1; + } + else if (npc->xm2 > 0 && npc->flag & 4) + { + npc->direct = gMirrorMode? 2:0; + npc->xm2 *= -1; + } + else if (npc->ym2 < 0 && npc->flag & 2) + { + npc->ym2 *= -1; + } + else if (npc->ym2 > 0 && npc->flag & 8) + { + npc->ym2 *= -1; + } + + npc->x += npc->xm2; + npc->y += npc->ym2; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Doctor's blood (or """"red energy"""") +void ActNpc270(NPCHAR *npc) +{ + RECT rc[2] = { + {170, 34, 174, 38}, + {170, 42, 174, 46}, + }; + + if (npc->direct == 3 || npc->direct == 1) + { + if (npc->direct == 3) + npc->ym += 0x40; + if (npc->direct == 1) + npc->ym -= 0x40; + + ++npc->act_wait; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->act_wait > 50) + npc->cond = 0; + + if (npc->flag & 0xFF) + npc->cond = 0; + } + else if (npc->direct == 2) + { + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->bits |= NPC_IGNORE_SOLIDITY; + + npc->xm = Random(-0x200, 0x200) * 3; + npc->ym = Random(-0x200, 0x200) * 3; + + npc->count1 = Random(0x10, 0x33); + npc->count2 = Random(0x80, 0x100); + + break; + } + + if (npc->x < npc->pNpc->x) + npc->xm += 0x200 / npc->count1; + if (npc->x > npc->pNpc->x) + npc->xm -= 0x200 / npc->count1; + + if (npc->y < npc->pNpc->y) + npc->ym += 0x200 / npc->count1; + if (npc->y > npc->pNpc->y) + npc->ym -= 0x200 / npc->count1; + + if (npc->xm > npc->count2 * 2) + npc->xm = npc->count2 * 2; + if (npc->xm < -npc->count2 * 2) + npc->xm = -npc->count2 * 2; + + if (npc->ym > npc->count2 * 3) + npc->ym = npc->count2 * 3; + if (npc->ym < -npc->count2 * 3) + npc->ym = -npc->count2 * 3; + + npc->x += npc->xm; + npc->y += npc->ym; + } + + npc->rect = rc[Random(0, 1)]; +} + +// Ironhead block +void ActNpc271(NPCHAR *npc) +{ + int a; + + if (npc->xm < 0 && npc->x < -16 * 0x200) + { + VanishNpChar(npc); + return; + } + + if (npc->xm > 0 && npc->x > (gMap.width * 0x200 * 0x10) + (1 * 0x200 * 0x10)) + { + VanishNpChar(npc); + return; + } + + if (npc->act_no == 0) + { + npc->act_no = 1; + + a = Random(0, 9); + + if (a == 9) + { + npc->rect.left = 0; + npc->rect.right = 0x20; + npc->rect.top = 0x40; + npc->rect.bottom = 0x60; + + npc->view.front = 16 * 0x200; + npc->view.back = 16 * 0x200; + npc->view.top = 16 * 0x200; + npc->view.bottom = 16 * 0x200; + + npc->hit.front = 12 * 0x200; + npc->hit.back = 12 * 0x200; + npc->hit.top = 12 * 0x200; + npc->hit.bottom = 12 * 0x200; + } + else + { + npc->rect.left = ((a % 3) * 16) + (7 * 16); + npc->rect.top = (a / 3) * 16; + npc->rect.right = npc->rect.left + 16; + npc->rect.bottom = npc->rect.top + 16; + } + + if (npc->direct == 0) + npc->xm = Random(0x100, 0x200) * -2; + else + npc->xm = Random(0x100, 0x200) * 2; + + npc->ym = Random(-0x200, 0x200); + } + + if (npc->ym < 0 && npc->y - npc->hit.top < 8 * 0x200) + { + npc->ym *= -1; + SetCaret(npc->x, npc->y - (8 * 0x200), CARET_TINY_PARTICLES, DIR_LEFT); + SetCaret(npc->x, npc->y - (8 * 0x200), CARET_TINY_PARTICLES, DIR_LEFT); + } + + if (npc->ym > 0 && npc->y + npc->hit.bottom > 232 * 0x200) + { + npc->ym *= -1; + SetCaret(npc->x, npc->y + (8 * 0x200), CARET_TINY_PARTICLES, DIR_LEFT); + SetCaret(npc->x, npc->y + (8 * 0x200), CARET_TINY_PARTICLES, DIR_LEFT); + } + + npc->x += npc->xm; + npc->y += npc->ym; +} + +// Ironhead block generator +void ActNpc272(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = Random(0, 200); + // Fallthrough + case 1: + if (npc->act_wait) + { + --npc->act_wait; + } + else + { + npc->act_no = 0; + SetNpChar(271, npc->x, npc->y + (Random(-32, 32) * 0x200), 0, 0, npc->direct, NULL, 0x100); + } + + break; + } +} + +// Droll projectile +void ActNpc273(NPCHAR *npc) +{ + RECT rc[3] = { + {248, 40, 272, 64}, + {272, 40, 296, 64}, + {296, 40, 320, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->flag & 0xFF) + { + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + VanishNpChar(npc); + return; + } + + if (++npc->act_wait % 5 == 0) + PlaySoundObject(110, SOUND_MODE_PLAY); + + if (++npc->ani_no > 2) + npc->ani_no = 0; + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Droll +void ActNpc274(NPCHAR *npc) +{ + RECT rcLeft[6] = { + {0, 0, 32, 40}, + {32, 0, 64, 40}, + {64, 0, 96, 40}, + {64, 80, 96, 120}, + {96, 80, 128, 120}, + {96, 0, 128, 40}, + }; + + RECT rcRight[6] = { + {0, 40, 32, 80}, + {32, 40, 64, 80}, + {64, 40, 96, 80}, + {64, 120, 96, 160}, + {96, 120, 128, 160}, + {96, 40, 128, 80}, + }; + + unsigned char deg; + int xm, ym; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 8 * 0x200; + npc->tgt_x = npc->x; + // Fallthrough + case 1: + npc->xm = 0; + npc->act_no = 2; + npc->ani_no = 0; + // Fallthrough + case 2: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (++npc->ani_wait > 40) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->shock) + npc->act_no = 10; + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 2; + npc->act_wait = 0; + // Fallthrough + case 11: + if (++npc->act_wait > 10) + { + npc->act_no = 12; + npc->ani_no = 3; + npc->ym = -0x600; + npc->count1 = 0; + + if (npc->tgt_x > npc->x) + npc->xm = 0x200; + else + npc->xm = -0x200; + } + + break; + + case 12: + if (npc->ym > 0) + { + npc->ani_no = 4; + + if (npc->count1 == 0) + { + ++npc->count1; + deg = GetArktan(npc->x - gMC.x, npc->y - (10 * 0x200) - gMC.y); + ym = GetSin(deg) * 4; + xm = GetCos(deg) * 4; + SetNpChar(273, npc->x, npc->y - (10 * 0x200), xm, ym, 0, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + } + } + + if (npc->ym > 0x200) + npc->ani_no = 5; + + if (npc->flag & 8) + { + npc->ani_no = 2; + npc->act_no = 13; + npc->act_wait = 0; + npc->xm = 0; + } + + break; + + case 13: + npc->xm /= 2; + + if (++npc->act_wait > 10) + npc->act_no = 1; + + break; + } + + npc->ym += 0x55; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Puppy (plantation) +void ActNpc275(NPCHAR *npc) +{ + RECT rcRight[4] = { + {272, 80, 288, 96}, + {288, 80, 304, 96}, + {272, 80, 288, 96}, + {304, 80, 320, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (64 * 0x200) < gMC.x && npc->x + (64 * 0x200) > gMC.x && npc->y - (32 * 0x200) < gMC.y && npc->y + (16 * 0x200) > gMC.y) + { + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rcRight[npc->ani_no]; +} + +// Red Demon +void ActNpc276(NPCHAR *npc) +{ + RECT rcLeft[9] = { + {0, 64, 32, 104}, + {32, 64, 64, 104}, + {64, 64, 96, 104}, + {96, 64, 128, 104}, + {128, 64, 160, 104}, + {160, 64, 192, 104}, + {192, 64, 224, 104}, + {224, 64, 256, 104}, + {256, 64, 288, 104}, + }; + + RECT rcRight[9] = { + {0, 104, 32, 144}, + {32, 104, 64, 144}, + {64, 104, 96, 144}, + {96, 104, 128, 144}, + {128, 104, 160, 144}, + {160, 104, 192, 144}, + {192, 104, 224, 144}, + {224, 104, 256, 144}, + {256, 104, 288, 144}, + }; + + unsigned char deg; + int xm, ym; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 8 * 0x200; + // Fallthrough + case 1: + npc->xm = 0; + npc->act_no = 2; + npc->ani_no = 0; + // Fallthrough + case 2: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (++npc->ani_wait > 20) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->shock) + npc->act_no = 10; + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_no = 3; + npc->bits |= NPC_SHOOTABLE; + // Fallthrough + case 11: + switch (++npc->act_wait) + { + case 30: + case 40: + case 50: + npc->ani_no = 4; + + deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + ym = GetSin(deg) * 4; + xm = GetCos(deg) * 4; + + SetNpChar(277, npc->x, npc->y, xm, ym, 0, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + + break; + + case 34: + case 44: + case 54: + npc->ani_no = 3; + break; + } + + if (npc->act_wait > 60) + { + npc->act_no = 20; + npc->act_wait = 0; + npc->ani_no = 2; + } + + break; + + case 20: + if (++npc->act_wait > 20) + { + npc->act_no = 21; + npc->act_wait = 0; + npc->ani_no = 5; + npc->ym = -0x5FF; + + if (npc->x < gMC.x) + npc->xm = 0x100; + else + npc->xm = -0x100; + } + + break; + + case 21: + switch (++npc->act_wait) + { + case 30: + case 40: + case 50: + npc->ani_no = 6; + + deg = GetArktan(npc->x - gMC.x, npc->y - (10 * 0x200) - gMC.y); + ym = GetSin(deg) * 4; + xm = GetCos(deg) * 4; + + SetNpChar(277, npc->x, npc->y - (10 * 0x200), xm, ym, 0, NULL, 0x100); + PlaySoundObject(39, SOUND_MODE_PLAY); + + break; + + case 34: + case 44: + npc->ani_no = 5; + break; + } + + if (npc->act_wait > 53) + npc->ani_no = 7; + + if (npc->flag & 8) + { + npc->act_no = 22; + npc->act_wait = 0; + npc->ani_no = 2; + SetQuake(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + + break; + + case 22: + npc->xm /= 2; + + if (++npc->act_wait > 22) + npc->act_no = 10; + + break; + + case 50: + npc->bits &= ~NPC_SHOOTABLE; + npc->damage = 0; + + if (npc->flag & 8) + { + npc->act_no = 51; + npc->ani_no = 2; + SetQuake(10); + if (!gbNoExpDrops) + SetExpObjects(npc->x, npc->y, 19); + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8); + PlaySoundObject(72, SOUND_MODE_PLAY); + } + + break; + + case 51: + npc->xm = (npc->xm * 7) / 8; + npc->ani_no = 8; + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->act_no < 50) + { + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Red Demon projectile +void ActNpc277(NPCHAR *npc) +{ + RECT rc[3] = { + {128, 0, 152, 24}, + {152, 0, 176, 24}, + {176, 0, 200, 24}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->flag & 0xFF) + { + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + VanishNpChar(npc); + return; + } + + if (++npc->act_wait % 5 == 0) + PlaySoundObject(110, SOUND_MODE_PLAY); + + if (++npc->ani_no > 2) + npc->ani_no = 0; + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Little family +void ActNpc278(NPCHAR *npc) +{ + RECT rcPapa[2] = { + {0, 120, 8, 128}, + {8, 120, 16, 128}, + }; + + RECT rcMama[2] = { + {16, 120, 24, 128}, + {24, 120, 32, 128}, + }; + + RECT rcKodomo[2] = { // Japanese for 'child' + {32, 120, 40, 128}, + {40, 120, 48, 128}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 60) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (Random(0, 60) == 1) + { + npc->act_no = 10; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = Random(0, 16); + npc->ani_no = 0; + npc->ani_wait = 0; + + if (Random(0, 9) % 2) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + // Fallthrough + case 11: + if (npc->direct == 0 && npc->flag & 1) + npc->direct = gMirrorMode? 0:2; + else if (npc->direct == 2 && npc->flag & 4) + npc->direct = gMirrorMode? 2:0; + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (++npc->act_wait > 0x20) + npc->act_no = 0; + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + + switch (npc->code_event) + { + case 200: + npc->rect = rcPapa[npc->ani_no]; + break; + + case 210: + npc->rect = rcMama[npc->ani_no]; + break; + + default: + npc->rect = rcKodomo[npc->ani_no]; + break; + } +} + +// Falling block (large) +void ActNpc279(NPCHAR *npc) +{ + RECT rc[2] = { + {0, 16, 32, 48}, + {16, 0, 32, 16}, + }; + + int i; + + switch (npc->act_no) + { + case 0: + switch (npc->direct) + { + case 0: + npc->act_no = 100; + npc->bits |= NPC_INVULNERABLE; + npc->ani_no = 0; + break; + + case 2: + npc->act_no = 100; + npc->bits |= NPC_INVULNERABLE; + npc->ani_no = 1; + + npc->view.back = 8 * 0x200; + npc->view.front = 8 * 0x200; + npc->view.top = 8 * 0x200; + npc->view.bottom = 8 * 0x200; + + npc->hit.back = 8 * 0x200; + npc->hit.front = 8 * 0x200; + npc->hit.top = 8 * 0x200; + npc->hit.bottom = 8 * 0x200; + + break; + + case 1: + npc->ani_no = 0; + npc->act_no = 10; + break; + } + + if (npc->direct != 1) + break; + // Fallthrough + case 10: + npc->act_no = 11; + npc->act_wait = 16; + // Fallthrough + case 11: + npc->act_wait -= 2; + + if (npc->act_wait <= 0) + { + npc->act_no = 100; + npc->bits |= NPC_INVULNERABLE; + } + + break; + + case 100: + npc->ym += 0x40; + if (npc->ym > 0x700) + npc->ym = 0x700; + + if (npc->y > 128 * 0x200) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (npc->flag & 8) + { + npc->ym = -0x200; + npc->act_no = 110; + npc->bits |= NPC_IGNORE_SOLIDITY; + PlaySoundObject(26, SOUND_MODE_PLAY); + SetQuake(10); + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (16 * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + } + + break; + + case 110: + npc->ym += 0x40; + + if (npc->y > (gMap.length * 0x200 * 0x10) + (2 * 0x200 * 0x10)) + { + npc->cond = 0; + return; + } + + break; + } + + if (gMC.y > npc->y) + npc->damage = 10; + else + npc->damage = 0; + + npc->y += npc->ym; + npc->rect = rc[npc->ani_no]; + + if (npc->act_no == 11) + { + npc->rect.top += npc->act_wait; + npc->rect.bottom -= npc->act_wait; + npc->view.top = (16 - npc->act_wait) * 0x200; + } +} diff --git a/src/NpcAct280.cpp b/src/NpcAct280.cpp new file mode 100644 index 0000000..9ff60cf --- /dev/null +++ b/src/NpcAct280.cpp @@ -0,0 +1,1782 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "Frame.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +// Sue (being teleported by Misery) +void ActNpc280(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {112, 32, 128, 48}, + {144, 32, 160, 48}, + }; + + RECT rcRight[2] = { + {112, 48, 128, 64}, + {144, 48, 160, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->x += 6 * 0x200; + npc->tgt_x = npc->x; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 1: + if (++npc->act_wait == 64) + { + npc->act_no = 2; + npc->act_wait = 0; + } + + break; + + case 2: + npc->ani_no = 0; + + if (npc->flag & 8) + { + npc->act_no = 4; + npc->act_wait = 0; + npc->ani_no = 1; + PlaySoundObject(23, SOUND_MODE_PLAY); + } + + break; + } + + if (npc->act_no > 1) + { + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->act_no == 1) + { + npc->rect.bottom = npc->rect.top + npc->act_wait / 4; + + if (npc->act_wait / 2 % 2) + npc->x = npc->tgt_x; + else + npc->x = npc->tgt_x + (1 * 0x200); + } +} + +// Doctor (red energy form) +void ActNpc281(NPCHAR *npc) +{ + RECT rc = {0, 0, 0, 0}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + // Fallthrough + case 11: + ++npc->act_wait; + + SetNpChar(270, npc->x, npc->y + (128 * 0x200), 0, 0, 2, npc, 0x100); + + if (npc->act_wait > 150) + npc->act_no = 12; + + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + // Fallthrough + case 21: + if (++npc->act_wait > 250) + { + DeleteNpCharCode(270, FALSE); + npc->act_no = 22; + } + + break; + } + + npc->rect = rc; +} + +// Mini Undead Core (active) +void ActNpc282(NPCHAR *npc) +{ + // Yes, Pixel spelt this wrong (should be 'rc') + RECT tc[3] = { + {256, 80, 320, 120}, + {256, 0, 320, 40}, + {256, 120, 320, 160}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 20; + npc->tgt_y = npc->y; + + if (Random(0, 100) % 2) + npc->ym = -0x100; + else + npc->ym = 0x100; + // Fallthrough + case 20: + npc->xm = -0x200; + + if (npc->x < -64 * 0x200) + npc->cond = 0; + + if (npc->tgt_y < npc->y) + npc->ym -= 0x10; + if (npc->tgt_y > npc->y) + npc->ym += 0x10; + + if (npc->ym > 0x100) + npc->ym = 0x100; + if (npc->ym < -0x100) + npc->ym = -0x100; + + if (gMC.flag & 8 && gMC.y < npc->y - (4 * 0x200) && gMC.x > npc->x - (24 * 0x200) && gMC.x < npc->x + (24 * 0x200)) + { + npc->tgt_y = 144 * 0x200; + npc->ani_no = 2; + } + else if (npc->ani_no != 1) + { + npc->ani_no = 0; + } + + if (gMC.flag & 1 && gMC.x < npc->x - npc->hit.back && gMC.x > npc->x - npc->hit.back - (8 * 0x200) && gMC.y + gMC.hit.bottom > npc->y - npc->hit.top && gMC.y - gMC.hit.top < npc->y + npc->hit.bottom) + { + npc->bits &= ~NPC_SOLID_HARD; + npc->ani_no = 1; + } + else if (gMC.flag & 4 && gMC.x > npc->x + npc->hit.back && gMC.x < npc->x + npc->hit.back + (8 * 0x200) && gMC.y + gMC.hit.bottom > npc->y - npc->hit.top && gMC.y - gMC.hit.top < npc->y + npc->hit.bottom) + { + npc->bits &= ~NPC_SOLID_HARD; + npc->ani_no = 1; + } + else if (gMC.flag & 2 && gMC.y < npc->y - npc->hit.top && gMC.y > npc->y - npc->hit.top - (8 * 0x200) && gMC.x + gMC.hit.front > npc->x - npc->hit.back && gMC.x - gMC.hit.back < npc->x + npc->hit.front) + { + npc->bits &= ~NPC_SOLID_HARD; + npc->ani_no = 1; + } + else if (gMC.flag & 8 && gMC.y > npc->y + npc->hit.bottom - (4 * 0x200) && gMC.y < npc->y + npc->hit.bottom + (12 * 0x200) && gMC.x + gMC.hit.front > npc->x - npc->hit.back - (4 * 0x200) && gMC.x - gMC.hit.back < npc->x + npc->hit.front + (4 * 0x200)) + { + npc->bits &= ~NPC_SOLID_HARD; + npc->ani_no = 1; + } + } + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = tc[npc->ani_no]; +} + +// Misery (transformed) +void ActNpc283(NPCHAR *npc) +{ + int x, y, direct; + + RECT rcLeft[11] = { + {0, 64, 32, 96}, + {32, 64, 64, 96}, + {64, 64, 96, 96}, + {96, 64, 128, 96}, + {128, 64, 160, 96}, + {160, 64, 192, 96}, + {192, 64, 224, 96}, + {224, 64, 256, 96}, + {0, 0, 0, 0}, + {256, 64, 288, 96}, + {288, 64, 320, 96}, + }; + + RECT rcRight[11] = { + {0, 96, 32, 128}, + {32, 96, 64, 128}, + {64, 96, 96, 128}, + {96, 96, 128, 128}, + {128, 96, 160, 128}, + {160, 96, 192, 128}, + {192, 96, 224, 128}, + {224, 96, 256, 128}, + {0, 0, 0, 0}, + {256, 96, 288, 128}, + {288, 96, 320, 128}, + }; + + if (npc->act_no < 100 && (gBoss[0].cond == 0 || npc->life < 400)) + npc->act_no = 100; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 8 * 0x200; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 1: + if (++npc->act_wait / 2 % 2) + npc->ani_no = 9; + else + npc->ani_no = 0; + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 9; + break; + + case 20: + gSuperXpos = 0; + npc->act_no = 21; + npc->act_wait = 0; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 21: + npc->xm = 7 * npc->xm / 8; + npc->ym = 7 * npc->ym / 8; + + if (++npc->ani_wait > 20) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (++npc->act_wait > 100) + npc->act_no = 30; + + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + break; + + case 30: + npc->act_no = 31; + npc->act_wait = 0; + npc->ani_no = 2; + npc->count2 = npc->life; + // Fallthrough + case 31: + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + if (npc->flag & 8) + npc->ym = -0x200; + + if (npc->x > gBoss[0].x) + npc->xm -= 0x20; + else + npc->xm += 0x20; + + if (npc->y > gMC.y) + npc->ym -= 0x10; + else + npc->ym += 0x10; + + if (npc->xm > 0x200) + npc->xm = 0x200; + if (npc->xm < -0x200) + npc->xm = -0x200; + + if (npc->ym > 0x200) + npc->ym = 0x200; + if (npc->ym < -0x200) + npc->ym = -0x200; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (++npc->act_wait > 150 && (npc->life < npc->count2 - 20 || gSuperXpos)) + { + gSuperXpos = 0; + npc->act_no = 40; + } + + if (gBoss[0].ani_no && npc->act_wait > 250) + npc->act_no = 50; + + break; + + case 40: + npc->act_no = 41; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + PlaySoundObject(103, SOUND_MODE_PLAY); + + if (gMC.y < 160 * 0x200) + npc->count2 = 290; + else + npc->count2 = 289; + // Fallthrough + case 41: + if (++npc->act_wait / 2 % 2) + npc->ani_no = 4; + else + npc->ani_no = 5; + + if (npc->act_wait % 6 == 1) + { + if (npc->count2 == 289) + { + x = npc->x + (Random(-0x40, 0x40) * 0x200); + y = npc->y + (Random(-0x20, 0x20) * 0x200); + } + else + { + x = npc->x + (Random(-0x20, 0x20) * 0x200); + y = npc->y + (Random(-0x40, 0x40) * 0x200); + } + + if (x < 32 * 0x200) + x = 32 * 0x200; + if (x > (gMap.width - 2) * 0x200 * 0x10) + x = (gMap.width - 2) * 0x200 * 0x10; + + if (y < 32 * 0x200) + y = 32 * 0x200; + if (y > (gMap.length - 2) * 0x200 * 0x10) + y = (gMap.length - 2) * 0x200 * 0x10; + + PlaySoundObject(39, SOUND_MODE_PLAY); + SetNpChar(npc->count2, x, y, 0, 0, 0, NULL, 0x100); + } + + if (npc->act_wait > 50) + { + npc->act_no = 42; + npc->act_wait = 0; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 42: + ++npc->act_wait; + npc->ani_no = 6; + + if (npc->act_wait > 50) + { + npc->ym = -0x200; + + if (npc->direct == 0) + npc->xm = 0x200; + else + npc->xm = -0x200; + + npc->act_no = 30; + } + + break; + + case 50: + npc->act_no = 51; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + PlaySoundObject(103, SOUND_MODE_PLAY); + // Fallthrough + case 51: + if (++npc->act_wait / 2 % 2) + npc->ani_no = 4; + else + npc->ani_no = 5; + + if (gMC.equip & EQUIP_BOOSTER_2_0) + { + if (npc->act_wait % 10 == 1) + { + if (npc->direct == 0) + { + x = npc->x + (10 * 0x200); + y = npc->y; + + switch (npc->act_wait / 6 % 4) + { + case 0: + direct = 0xD8; + break; + + case 1: + direct = 0xEC; + break; + + case 2: + direct = 0x14; + break; + + case 3: + direct = 0x28; + break; + } + } + else + { + x = npc->x - (10 * 0x200); + y = npc->y; + + switch (npc->act_wait / 6 % 4) + { + case 0: + direct = 0x58; + break; + + case 1: + direct = 0x6C; + break; + + case 2: + direct = 0x94; + break; + + case 3: + direct = 0xA8; + break; + } + } + + PlaySoundObject(39, SOUND_MODE_PLAY); + SetNpChar(301, x, y, 0, 0, direct, NULL, 0x100); + } + } + else if (npc->act_wait % 24 == 1) + { + if (npc->direct == 0) + { + x = npc->x + (10 * 0x200); + y = npc->y; + + switch (npc->act_wait / 6 % 4) + { + case 0: + direct = 0xD8; + break; + + case 1: + direct = 0xEC; + break; + + case 2: + direct = 0x14; + break; + + case 3: + direct = 0x28; + break; + } + } + else + { + x = npc->x - (10 * 0x200); + y = npc->y; + + switch (npc->act_wait / 6 % 4) + { + case 0: + direct = 0x58; + break; + + case 1: + direct = 0x6C; + break; + + case 2: + direct = 0x94; + break; + + case 3: + direct = 0xA8; + break; + } + } + + PlaySoundObject(39, SOUND_MODE_PLAY); + SetNpChar(301, x, y, 0, 0, direct, NULL, 0x100); + } + + if (npc->act_wait > 50) + { + npc->act_no = 42; + npc->act_wait = 0; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 99: + npc->xm = 0; + npc->ym = 0; + npc->ani_no = 9; + npc->bits &= ~NPC_SHOOTABLE; + break; + + case 100: + npc->act_no = 101; + npc->ani_no = 9; + npc->damage = 0; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_IGNORE_SOLIDITY; + npc->ym = -0x200; + npc->shock += 50; + npc->hit.bottom = 12 * 0x200; + ++gBoss[0].ani_no; + // Fallthrough + case 101: + npc->ym += 0x20; + + if (npc->y > (216 * 0x200) - npc->hit.bottom) + { + npc->y = (216 * 0x200) - npc->hit.bottom; + npc->act_no = 102; + npc->ani_no = 10; + npc->xm = 0; + npc->ym = 0; + } + + break; + } + + npc->y += npc->ym; + + if (npc->shock) + npc->x += npc->xm / 2; + else + npc->x += npc->xm; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Sue (transformed) +void ActNpc284(NPCHAR *npc) +{ + unsigned char deg; + + RECT rcLeft[13] = { + {0, 128, 32, 160}, + {32, 128, 64, 160}, + {64, 128, 96, 160}, + {96, 128, 128, 160}, + {128, 128, 160, 160}, + {160, 128, 192, 160}, + {192, 128, 224, 160}, + {224, 128, 256, 160}, + {0, 0, 0, 0}, + {256, 128, 288, 160}, + {288, 128, 320, 160}, + {224, 64, 256, 96}, + {208, 32, 224, 48}, + }; + + RECT rcRight[13] = { + {0, 160, 32, 192}, + {32, 160, 64, 192}, + {64, 160, 96, 192}, + {96, 160, 128, 192}, + {128, 160, 160, 192}, + {160, 160, 192, 192}, + {192, 160, 224, 192}, + {224, 160, 256, 192}, + {0, 0, 0, 0}, + {256, 160, 288, 192}, + {288, 160, 320, 192}, + {224, 96, 256, 128}, + {208, 48, 224, 64}, + }; + + if (npc->act_no < 100 && (gBoss[0].cond == 0|| npc->life < 500)) + npc->act_no = 100; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 4 * 0x200; + PlaySoundObject(29, SOUND_MODE_PLAY); + npc->count2 = npc->life; + // Fallthrough + case 1: + if (++npc->act_wait / 2 % 2) + { + npc->view.top = 16 * 0x200; + npc->view.back = 16 * 0x200; + npc->view.front = 16 * 0x200; + npc->ani_no = 11; + } + else + { + npc->view.top = 3 * 0x200; + npc->view.back = 8 * 0x200; + npc->view.front = 8 * 0x200; + npc->ani_no = 12; + } + + if (npc->act_wait > 50) + npc->act_no = 10; + + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 11; + npc->view.top = 16 * 0x200; + npc->view.back = 16 * 0x200; + npc->view.front = 16 * 0x200; + DeleteNpCharCode(257, TRUE); + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->damage = 0; + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + // Fallthrough + case 21: + npc->xm = (npc->xm * 7) / 8; + npc->ym = (npc->ym * 7) / 8; + + if (++npc->ani_wait > 20) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (++npc->act_wait > 80) + npc->act_no = 30; + + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + if (npc->life < npc->count2 - 50) + { + npc->count2 = npc->life; + gSuperXpos = 10; + } + + break; + + case 30: + npc->act_no = 31; + npc->act_wait = 0; + npc->ani_no = 2; + npc->xm = 0; + npc->ym = 0; + // Fallthrough + case 31: + if (++npc->act_wait > 16) + { + ++npc->count1; + npc->count1 %= 4; + + switch (npc->count1) + { + case 1: + case 3: + npc->act_no = 34; + break; + + case 0: // Identical to case 2 + npc->act_no = 32; + break; + + case 2: // Identical to case 0 + npc->act_no = 32; + break; + } + } + + break; + + case 32: + npc->act_no = 33; + npc->act_wait = 0; + npc->bits &= ~NPC_SHOOTABLE; + + if (gMC.x < npc->x) + npc->tgt_x = gMC.x - (160 * 0x200); + else + npc->tgt_x = gMC.x + (160 * 0x200); + + npc->tgt_y = gMC.y; + + deg = GetArktan(npc->x - npc->tgt_x, npc->y - npc->tgt_y); + npc->xm = 3 * GetCos(deg); + npc->ym = 3 * GetSin(deg); + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (npc->x < (gMap.width * 0x200 * 0x10) / 2 && npc->xm > 0) + { + if (npc->y < (gMap.length * 0x200 * 0x10) / 2 && npc->ym > 0) + npc->bits |= NPC_IGNORE_SOLIDITY; + if (npc->y > (gMap.length * 0x200 * 0x10) / 2 && npc->ym < 0) + npc->bits |= NPC_IGNORE_SOLIDITY; + } + if (npc->x > (gMap.width * 0x200 * 0x10) / 2 && npc->xm < 0) + { + if (npc->y < (gMap.length * 0x200 * 0x10) / 2 && npc->ym > 0) + npc->bits |= NPC_IGNORE_SOLIDITY; + if (npc->y > (gMap.length * 0x200 * 0x10) / 2 && npc->ym < 0) + npc->bits |= NPC_IGNORE_SOLIDITY; + } + + if (npc->xm > 0) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + // Fallthrough + case 33: + if (++npc->act_wait / 2 % 2) + npc->ani_no = 3; + else + npc->ani_no = 8; + + if (npc->act_wait > 50 || npc->flag & 5) + npc->act_no = 20; + + break; + + case 34: + npc->act_no = 35; + npc->act_wait = 0; + npc->damage = 4; + + npc->tgt_x = gMC.x; + npc->tgt_y = gMC.y; + + deg = GetArktan(npc->x - npc->tgt_x, npc->y - npc->tgt_y); + npc->ym = 3 * GetSin(deg); + npc->xm = 3 * GetCos(deg); + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (npc->x < (gMap.width * 0x200 * 0x10) / 2 && npc->xm > 0) + { + if (npc->y < (gMap.length * 0x200 * 0x10) / 2 && npc->ym > 0) + npc->bits |= NPC_IGNORE_SOLIDITY; + if (npc->y > (gMap.length * 0x200 * 0x10) / 2 && npc->ym < 0) + npc->bits |= NPC_IGNORE_SOLIDITY; + } + + if (npc->x > (gMap.width * 0x200 * 0x10) / 2 && npc->xm < 0) + { + if (npc->y < (gMap.length * 0x200 * 0x10) / 2 && npc->ym > 0) + npc->bits |= NPC_IGNORE_SOLIDITY; + if (npc->y > (gMap.length * 0x200 * 0x10) / 2 && npc->ym < 0) + npc->bits |= NPC_IGNORE_SOLIDITY; + } + + if (npc->xm > 0) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + // Fallthrough + case 35: + if (++npc->act_wait > 20 && npc->shock) + npc->act_no = 40; + else if (npc->act_wait > 50 || npc->flag & 5) + npc->act_no = 20; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 7) + npc->ani_no = 4; + + if (npc->act_wait % 5 == 1) + PlaySoundObject(109, SOUND_MODE_PLAY); + + break; + + case 40: + npc->act_no = 41; + npc->act_wait = 0; + npc->ani_no = 2; + npc->damage = 0; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + // Fallthrough + case 41: + npc->xm = (npc->xm * 7) / 8; + npc->ym = (npc->ym * 7) / 8; + + if (++npc->act_wait > 6) + { + npc->act_no = 42; + npc->act_wait = 0; + npc->ym = -0x200; + + if (npc->direct == 0) + npc->xm = 0x200; + else + npc->xm = -0x200; + } + + break; + + case 42: + npc->ani_no = 9; + + if (npc->flag & 8) + { + npc->act_no = 43; + npc->act_wait = 0; + npc->ani_no = 2; + + if (npc->x < gMC.x) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + break; + + case 43: + if (++npc->act_wait > 16) + npc->act_no = 20; + + break; + + case 99: + npc->xm = 0; + npc->ym = 0; + npc->ani_no = 9; + npc->bits &= ~NPC_SHOOTABLE; + break; + + case 100: + npc->act_no = 101; + npc->ani_no = 9; + npc->damage = 0; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_IGNORE_SOLIDITY; + npc->ym = -0x200; + npc->shock += 50; + ++gBoss[0].ani_no; + // Fallthrough + case 101: + npc->ym += 0x20; + + if (npc->y > (216 * 0x200) - npc->hit.bottom) + { + npc->y = (216 * 0x200) - npc->hit.bottom; + npc->act_no = 102; + npc->ani_no = 10; + npc->xm = 0; + npc->ym = 0; + } + + break; + } + + npc->y += npc->ym; + + if (npc->shock) + npc->x += npc->xm / 2; + else + npc->x += npc->xm; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Undead Core spiral projectile +void ActNpc285(NPCHAR *npc) +{ + RECT rc = {232, 104, 248, 120}; + unsigned char deg; + + if (npc->x < 0 || npc->x > gMap.width * 0x10 * 0x200) + { + VanishNpChar(npc); + return; + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + npc->count1 = npc->direct / 8; + npc->direct %= 8; + // Fallthrough + case 1: + npc->count1 += 24; + npc->count1 %= 0x100; + + deg = npc->count1; + + if (npc->act_wait < 128) + ++npc->act_wait; + + if (npc->direct == 0) + npc->xm -= 21; + else + npc->xm += 21; + + npc->tgt_x += npc->xm; + + npc->x = npc->tgt_x + (GetCos(deg) * 4); + npc->y = npc->tgt_y + (GetSin(deg) * 6); + + SetNpChar(286, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + + break; + } + + npc->rect = rc; +} + +// Undead Core spiral shot trail +void ActNpc286(NPCHAR *npc) +{ + RECT rc[3] = { + {232, 120, 248, 136}, + {232, 136, 248, 152}, + {232, 152, 248, 168}, + }; + + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->cond = 0; + else + npc->rect = rc[npc->ani_no]; +} + +// Orange smoke +void ActNpc287(NPCHAR *npc) +{ + RECT rcLeft[7] = { + {0, 224, 16, 240}, + {16, 224, 32, 240}, + {32, 224, 48, 240}, + {48, 224, 64, 240}, + {64, 224, 80, 240}, + {80, 224, 96, 240}, + {96, 224, 112, 240}, + }; + + if (npc->act_no == 0) + { + npc->xm = Random(-4, 4) * 0x200; + npc->act_no = 1; + } + else + { + npc->xm = (npc->xm * 20) / 21; + npc->ym = (npc->ym * 20) / 21; + + npc->x += npc->xm; + npc->y += npc->ym; + } + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + npc->cond = 0; + else + npc->rect = rcLeft[npc->ani_no]; +} + +// Undead Core exploding rock +void ActNpc288(NPCHAR *npc) +{ + RECT rc[5] = { + {232, 72, 248, 88}, + {232, 88, 248, 104}, + {232, 0, 256, 24}, + {232, 24, 256, 48}, + {232, 48, 256, 72}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->xm = -0x200; + // Fallthrough + case 1: + if (npc->direct == 1) + { + npc->ym -= 0x20; + if (npc->ym < -0x5FF) + npc->ym = -0x5FF; + + if (npc->flag & 2) + npc->act_no = 2; + } + else if (npc->direct == 3) + { + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + if (npc->flag & 8) + npc->act_no = 2; + } + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + + case 2: + PlaySoundObject(44, SOUND_MODE_PLAY); + npc->act_no = 3; + npc->act_wait = 0; + npc->bits |= NPC_IGNORE_SOLIDITY; + npc->ym = 0; + + if (npc->x > gMC.x) + npc->xm = -0x400; + else + npc->xm = 0x400; + + npc->view.back = 12 * 0x200; + npc->view.front = 12 * 0x200; + npc->view.top = 12 * 0x200; + npc->view.bottom = 12 * 0x200; + // Fallthrough + case 3: + if (++npc->ani_no > 4) + npc->ani_no = 2; + + if (++npc->act_wait % 4 == 1) + { + if (npc->direct == 1) + SetNpChar(287, npc->x, npc->y, 0, 0x400, 0, NULL, 0x100); + else + SetNpChar(287, npc->x, npc->y, 0, -0x400, 0, NULL, 0x100); + } + + if (npc->x < 1 * 0x200 * 0x10 || npc->x > (gMap.width * 0x200 * 0x10) - (1 * 0x200 * 0x10)) + npc->cond = 0; + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rc[npc->ani_no]; +} + +// Critter (orange, Misery) +void ActNpc289(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {160, 32, 176, 48}, + {176, 32, 192, 48}, + {192, 32, 208, 48}, + }; + + RECT rcRight[3] = { + {160, 48, 176, 64}, + {176, 48, 192, 64}, + {192, 48, 208, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 2; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 1: + if (++npc->act_wait > 16) + { + npc->act_no = 10; + npc->view.top = 8 * 0x200; + npc->view.bottom = 8 * 0x200; + npc->damage = 2; + npc->bits |= NPC_SHOOTABLE; + } + + break; + + case 10: + if (npc->flag & 8) + { + npc->act_no = 11; + npc->ani_no = 0; + npc->act_wait = 0; + npc->xm = 0; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 11: + if (++npc->act_wait > 10) + { + if (++npc->count1 > 4) + npc->act_no = 12; + else + npc->act_no = 10; + + PlaySoundObject(30, SOUND_MODE_PLAY); + npc->ym = -0x600; + + if (npc->direct == 0) + npc->xm = -0x200; + else + npc->xm = 0x200; + + npc->ani_no = 2; + } + + break; + + case 12: + npc->bits |= NPC_IGNORE_SOLIDITY; + + if (npc->y > gMap.length * 0x200 * 0x10) + { + VanishNpChar(npc); + return; + } + + break; + } + + if (npc->act_no >= 10) + npc->ym += 0x40; + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->act_no == 1) + { + npc->rect.top += 8 - (npc->act_wait / 2); + npc->rect.bottom -= 8 + (npc->act_wait / 2); + npc->view.top = (npc->act_wait * 0x200) / 2; + npc->view.bottom = (npc->act_wait * 0x200) / 2; + } +} + +// Bat (Misery) +void ActNpc290(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {112, 32, 128, 48}, + {128, 32, 144, 48}, + {144, 32, 160, 48}, + }; + + RECT rcRight[3] = { + {112, 48, 128, 64}, + {128, 48, 144, 64}, + {144, 48, 160, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 2; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 1: + if (++npc->act_wait > 16) + { + npc->act_no = 10; + npc->view.top = 8 * 0x200; + npc->view.bottom = 8 * 0x200; + npc->damage = 2; + npc->bits |= NPC_SHOOTABLE; + npc->tgt_y = npc->y; + npc->ym = 0x400; + } + + break; + + case 10: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (npc->y < npc->tgt_y) + npc->ym += 0x40; + else + npc->ym -= 0x40; + + if (npc->direct == 0) + npc->xm -= 0x10; + else + npc->xm += 0x10; + + if (npc->x < 0 || npc->y < 0 || npc->x > gMap.width * 0x200 * 0x10 || npc->y > gMap.length * 0x200 * 0x10) + { + VanishNpChar(npc); + return; + } + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->act_no == 1) + { + npc->rect.top += 8 - (npc->act_wait / 2); + npc->rect.bottom -= 8 + (npc->act_wait / 2); + npc->view.top = (npc->act_wait * 0x200) / 2; + npc->view.bottom = (npc->act_wait * 0x200) / 2; + } +} + +// Mini Undead Core (inactive) +void ActNpc291(NPCHAR *npc) +{ + RECT tc[2] = { + {256, 80, 320, 120}, + {256, 0, 320, 40}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 20; + + if (npc->direct == 2) + { + npc->bits &= ~NPC_SOLID_HARD; + npc->ani_no = 1; + } + + break; + } + + npc->rect = tc[npc->ani_no]; +} + +// Quake +void ActNpc292(NPCHAR *npc) +{ + (void)npc; + + SetQuake(10); +} + +// Undead Core giant energy shot +void ActNpc293(NPCHAR *npc) +{ + RECT rect[2] = { + {240, 200, 280, 240}, + {280, 200, 320, 240}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (++npc->ani_no > 1) + npc->ani_no = 0; + + SetNpChar(4, npc->x + (Random(0, 0x10) * 0x200), npc->y + (Random(-0x10, 0x10) * 0x200), 0, 0, 0, NULL, 0x100); + + npc->x -= 8 * 0x200; + + if (npc->x < -32 * 0x200) + npc->cond = 0; + + break; + } + + npc->rect = rect[npc->ani_no]; +} + +// Quake + falling block generator +void ActNpc294(NPCHAR *npc) +{ + int x, y, dir; + + switch (npc->act_no) + { + case 0: + if (gMC.x < (gMap.width - 6) * 0x200 * 0x10) + { + npc->act_no = 1; + npc->act_wait = 0; + } + + break; + + case 1: + ++npc->act_wait; + + if (gMC.equip & EQUIP_BOOSTER_2_0) + { + npc->x = gMC.x + (64 * 0x200); + + if (npc->x < 416 * 0x200) + npc->x = 416 * 0x200; + } + else + { + npc->x = gMC.x + (96 * 0x200); + + if (npc->x < 368 * 0x200) + npc->x = 368 * 0x200; + } + + if (npc->x > (gMap.width - 10) * 0x200 * 0x10) + npc->x = (gMap.width - 10) * 0x200 * 0x10; + + if (npc->act_wait > 24) + { + if (gMC.equip & EQUIP_BOOSTER_2_0) + x = npc->x + (Random(-14, 14) * 0x200 * 0x10); + else + x = npc->x + (Random(-11, 11) * 0x200 * 0x10); + + y = gMC.y - (224 * 0x200); + + if (Random(0, 10) % 2) // Because just doing 'Random(0, 1)' is too hard + dir = 0; + else + dir = 2; + + SetNpChar(279, x, y, 0, 0, dir, NULL, 0x100); + + npc->act_wait = Random(0, 15); + } + + break; + } +} + +// Cloud +void ActNpc295(NPCHAR *npc) +{ + RECT rc[4] = { + {0, 0, 208, 64}, + {32, 64, 144, 96}, + {32, 96, 104, 0x80}, + {104, 96, 144, 0x80}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = npc->direct % 4; + switch (npc->direct) + { + case 0: + npc->ym = -1000; + npc->view.back = 104 * 0x200; + npc->view.front = 104 * 0x200; + break; + + case 1: + npc->ym = -0x800; + npc->view.back = 56 * 0x200; + npc->view.front = 56 * 0x200; + break; + + case 2: + npc->ym = -0x400; + npc->view.back = 32 * 0x200; + npc->view.front = 32 * 0x200; + break; + + case 3: + npc->ym = -0x200; + npc->view.back = 20 * 0x200; + npc->view.front = 20 * 0x200; + break; + + case 4: + npc->xm = -0x400; + npc->view.back = 104 * 0x200; + npc->view.front = 104 * 0x200; + break; + + case 5: + npc->xm = -0x200; + npc->view.back = 56 * 0x200; + npc->view.front = 56 * 0x200; + break; + + case 6: + npc->xm = -0x100; + npc->view.back = 32 * 0x200; + npc->view.front = 32 * 0x200; + break; + + case 7: + npc->xm = -0x80; + npc->view.back = 20 * 0x200; + npc->view.front = 20 * 0x200; + break; + } + + break; + + case 1: + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->x < -64 * 0x200) + npc->cond = 0; + if (npc->y < -32 * 0x200) + npc->cond = 0; + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Cloud generator +void ActNpc296(NPCHAR *npc) +{ + int x, y, dir, pri; + + if (++npc->act_wait > 16) + { + npc->act_wait = Random(0, 16); + dir = Random(0, 100) % 4; + + if (npc->direct == 0) + { + switch (dir) + { + case 0: + pri = 0x180; + break; + + case 1: + pri = 0x80; + break; + + case 2: + pri = 0x40; + break; + + case 3: + pri = 0x00; + break; + } + + x = Random(-10, 10) * 0x200 * 0x10 + npc->x; + y = npc->y; + SetNpChar(295, x, y, 0, 0, dir, NULL, pri); + } + else + { + switch (dir) + { + case 0: + pri = 0x80; + break; + + case 1: + pri = 0x55; + break; + + case 2: + pri = 0x40; + break; + + case 3: + pri = 0x00; + break; + } + + x = npc->x; + y = Random(-7, 7) * 0x200 * 0x10 + npc->y; + SetNpChar(295, x, y, 0, 0, dir + 4, NULL, pri); + } + } +} + +// Sue in dragon's mouth +void ActNpc297(NPCHAR *npc) +{ + RECT rc = {112, 48, 0x80, 64}; + + npc->x = npc->pNpc->x + (16 * 0x200); + npc->y = npc->pNpc->y + (8 * 0x200); + + npc->rect = rc; +} + +// Doctor (opening) +void ActNpc298(NPCHAR *npc) +{ + RECT rc[8] = { + {72, 0x80, 88, 160}, + {88, 0x80, 104, 160}, + {104, 0x80, 120, 160}, + {72, 0x80, 88, 160}, + {120, 0x80, 136, 160}, + {72, 0x80, 88, 160}, + {104, 160, 120, 192}, + {120, 160, 136, 192}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 8 * 0x200; + // Fallthrough + + case 1: + npc->ani_no = 0; + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->count1 = 0; + // Fallthrough + + case 11: + if (++npc->ani_wait > 6) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + { + npc->ani_no = 0; + + if (++npc->count1 > 7) + { + npc->ani_no = 0; + npc->act_no = 1; + } + } + + break; + + case 20: + npc->act_no = 21; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + + case 21: + if (++npc->ani_wait > 10) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 5) + npc->ani_no = 2; + + npc->x += 0x100; + + break; + + case 30: + npc->ani_no = 6; + break; + + case 40: + npc->act_no = 41; + npc->ani_no = 6; + npc->ani_wait = 0; + npc->count1 = 0; + // Fallthrough + + case 41: + if (++npc->ani_wait > 6) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 7) + { + npc->ani_no = 6; + + if (++npc->count1 > 7) + { + npc->ani_no = 6; + npc->act_no = 30; + } + } + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Balrog/Misery (opening) +void ActNpc299(NPCHAR *npc) +{ + RECT rc[2] = { + {0, 0, 48, 48}, + {48, 0, 96, 48}, + }; + + if (npc->act_no == 0) + { + npc->act_no = 1; + + if (npc->direct == 0) + { + npc->ani_no = 1; + npc->act_wait = 25; + npc->y -= 0x40 * (50 / 2); + } + else + { + npc->ani_no = 0; + npc->act_wait = 0; + } + } + + if (++npc->act_wait / 50 % 2) + npc->y += 0x40; + else + npc->y -= 0x40; + + npc->rect = rc[npc->ani_no]; +} diff --git a/src/NpcAct300.cpp b/src/NpcAct300.cpp new file mode 100644 index 0000000..7c94e91 --- /dev/null +++ b/src/NpcAct300.cpp @@ -0,0 +1,1918 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Boss.h" +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +// Demon crown (opening) +void ActNpc300(NPCHAR *npc) +{ + RECT rc = {192, 80, 208, 96}; + + if (npc->act_no == 0) + { + npc->act_no = 1; + npc->y += 6 * 0x200; + } + + if (++npc->ani_wait % 8 == 1) + SetCaret(npc->x + (Random(-8, 8) * 0x200), npc->y + (8 * 0x200), CARET_TINY_PARTICLES, DIR_UP); + + npc->rect = rc; +} + +// Fish missile (Misery) +void ActNpc301(NPCHAR *npc) +{ + int dir; + + RECT rect[8] = { + {144, 0, 160, 16}, + {160, 0, 176, 16}, + {176, 0, 192, 16}, + {192, 0, 208, 16}, + {144, 16, 160, 32}, + {160, 16, 176, 32}, + {176, 16, 192, 32}, + {192, 16, 208, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->count1 = npc->direct; + // Fallthrough + case 1: + npc->xm = GetCos(npc->count1) * 2; + npc->ym = GetSin(npc->count1) * 2; + + npc->y += npc->ym; + npc->x += npc->xm; + + dir = GetArktan(npc->x - gMC.x, npc->y - gMC.y); + + if (dir < npc->count1) + { + if (npc->count1 - dir < 0x80) + --npc->count1; + else + ++npc->count1; + } + else + { + if (dir - npc->count1 < 0x80) + ++npc->count1; + else + --npc->count1; + } + + if (npc->count1 > 0xFF) + npc->count1 -= 0x100; + if (npc->count1 < 0) + npc->count1 += 0x100; + + break; + } + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + SetCaret(npc->x, npc->y, CARET_EXHAUST, DIR_AUTO); + } + + npc->ani_no = (npc->count1 + 0x10) / 0x20; + if (npc->ani_no > 7) + npc->ani_no = 7; + + npc->rect = rect[npc->ani_no]; +} + +// Camera focus marker +void ActNpc302(NPCHAR *npc) +{ + int n; + + switch (npc->act_no) + { + case 10: + npc->x = gMC.x; + npc->y = gMC.y - 32 * 0x200; + break; + + case 20: + switch (npc->direct) + { + case 0: + npc->x -= 2 * 0x200; + break; + + case 1: + npc->y -= 2 * 0x200; + break; + + case 2: + npc->x += 2 * 0x200; + break; + + case 3: + npc->y += 2 * 0x200; + break; + } + + gMC.x = npc->x; + gMC.y = npc->y; + break; + + case 30: + npc->x = gMC.x; + npc->y = gMC.y + (80 * 0x200); + break; + + case 100: + npc->act_no = 101; + + if (npc->direct != 0) + { + for (n = 0xAA; n < NPC_MAX; ++n) + { + if (gNPC[n].cond & 0x80 && gNPC[n].code_event == npc->direct) + { + npc->pNpc = &gNPC[n]; + break; + } + } + + if (n == NPC_MAX) + { + npc->cond = 0; + break; + } + } + else + { + npc->pNpc = gBoss; + } + // Fallthrough + case 101: + npc->x = (gMC.x + npc->pNpc->x) / 2; + npc->y = (gMC.y + npc->pNpc->y) / 2; + break; + } +} + +// Curly's machine gun +void ActNpc303(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {216, 152, 232, 168}, + {232, 152, 248, 168}, + }; + + RECT rcRight[2] = { + {216, 168, 232, 184}, + {232, 168, 248, 184}, + }; + + if (npc->pNpc == NULL) + return; + + // Set position + if (npc->pNpc->direct == 0) + { + npc->direct = gMirrorMode? 2:0; + npc->x = npc->pNpc->x - (8 * 0x200); + } + else + { + npc->direct = gMirrorMode? 0:2; + npc->x = npc->pNpc->x + (8 * 0x200); + } + + npc->y = npc->pNpc->y; + + // Animation + npc->ani_no = 0; + if (npc->pNpc->ani_no == 3 || npc->pNpc->ani_no == 5) + npc->y -= 1 * 0x200; + + // Set framerect + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Gaudi in hospital +void ActNpc304(NPCHAR *npc) +{ + RECT rc[4] = { + {0, 176, 24, 192}, + {24, 176, 48, 192}, + {48, 176, 72, 192}, + {72, 176, 96, 192}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y += 10 * 0x200; + // Fallthrough + case 1: + npc->ani_no = 0; + break; + + case 10: + npc->ani_no = 1; + break; + + case 20: + npc->act_no = 21; + npc->ani_no = 2; + // Fallthrough + case 21: + if (++npc->ani_wait > 10) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 2; + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Small puppy +void ActNpc305(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {160, 144, 176, 160}, + {176, 144, 192, 160}, + }; + + RECT rcRight[2] = { + {160, 160, 176, 176}, + {176, 160, 192, 176}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 16 * 0x200; + npc->ani_wait = Random(0, 6); + // Fallthrough + + case 1: + if (++npc->ani_wait > 6) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Balrog (nurse) +void ActNpc306(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {240, 96, 280, 128}, + {280, 96, 320, 128}, + }; + + RECT rcRight[2] = { + {160, 152, 200, 184}, + {200, 152, 240, 184}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->y += 4 * 0x200; + // Fallthrough + case 1: + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Caged Santa +void ActNpc307(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {0, 32, 16, 48}, + {16, 32, 32, 48}, + }; + + RECT rcRight[2] = { + {0, 48, 16, 64}, + {16, 48, 32, 64}, + }; + + switch (npc->act_no) + { + case 0: + npc->x += 1 * 0x200; + npc->y -= 2 * 0x200; + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + // Fallthrough + case 1: + if (Random(0, 160) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 2: + if (++npc->act_wait > 12) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + } + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Stumpy +void ActNpc308(NPCHAR *npc) +{ + unsigned char deg; + + RECT rcLeft[2] = { + {128, 112, 144, 128}, + {144, 112, 160, 128}, + }; + + RECT rcRight[2] = { + {128, 128, 144, 144}, + {144, 128, 160, 144}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (gMC.x < npc->x + (240 * 0x200) && gMC.x > npc->x - (240 * 0x200) && gMC.y < npc->y + (192 * 0x200) && gMC.y > npc->y - (192 * 0x200)) + npc->act_no = 10; + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + npc->xm2 = 0; + npc->ym2 = 0; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 11: + if (++npc->act_wait > 50) + npc->act_no = 20; + + ++npc->ani_wait; + + if (npc->act_wait > 1) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 1) + npc->ani_no = 0; + } + + if (gMC.x > npc->x + (320 * 0x200) || gMC.x < npc->x - (320 * 0x200) || gMC.y > npc->y + (240 * 0x200) || gMC.y < npc->y - (240 * 0x200)) + npc->act_no = 0; + + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + + deg = (unsigned char)GetArktan(npc->x - gMC.x, npc->y - gMC.y); + deg += (unsigned char)Random(-3, 3); + npc->ym2 = GetSin(deg) * 2; + npc->xm2 = GetCos(deg) * 2; + + if (npc->xm2 < 0) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 21: + if (npc->xm2 < 0 && npc->flag & 1) + { + npc->direct = gMirrorMode? 0:2; + npc->xm2 *= -1; + } + + if (npc->xm2 > 0 && npc->flag & 4) + { + npc->direct = gMirrorMode? 2:0; + npc->xm2 *= -1; + } + + if (npc->ym2 < 0 && npc->flag & 2) + npc->ym2 *= -1; + if (npc->ym2 > 0 && npc->flag & 8) + npc->ym2 *= -1; + + if (npc->flag & 0x100) + npc->ym2 = -0x200; + + npc->x += npc->xm2; + npc->y += npc->ym2; + + if (++npc->act_wait > 50) + npc->act_no = 10; + + if (++npc->ani_no > 1) + npc->ani_no = 0; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Bute +void ActNpc309(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {0, 0, 16, 16}, + {16, 0, 32, 16}, + }; + + RECT rcRight[2] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->direct == 0) + { + if (gMC.x > npc->x - (288 * 0x200) && gMC.x < npc->x - (272 * 0x200)) + { + npc->act_no = 10; + break; + } + } + else + { + if (gMC.x < npc->x + (288 * 0x200) && gMC.x > npc->x + (272 * 0x200)) + { + npc->act_no = 10; + break; + } + } + + return; + + case 10: + npc->act_no = 11; + npc->bits |= NPC_SHOOTABLE; + npc->damage = 5; + // Fallthrough + case 11: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->direct == 0) + npc->xm2 -= 0x10; + else + npc->xm2 += 0x10; + + if (npc->y > gMC.y) + npc->ym2 -= 0x10; + else + npc->ym2 += 0x10; + + if (npc->xm2 < 0 && npc->flag & 1) + npc->xm2 *= -1; + if (npc->xm2 > 0 && npc->flag & 4) + npc->xm2 *= -1; + + if (npc->ym2 < 0 && npc->flag & 2) + npc->ym2 *= -1; + if (npc->ym2 > 0 && npc->flag & 8) + npc->ym2 *= -1; + + if (npc->xm2 < -0x5FF) + npc->xm2 = -0x5FF; + if (npc->xm2 > 0x5FF) + npc->xm2 = 0x5FF; + + if (npc->ym2 < -0x5FF) + npc->ym2 = -0x5FF; + if (npc->ym2 > 0x5FF) + npc->ym2 = 0x5FF; + + npc->x += npc->xm2; + npc->y += npc->ym2; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->life <= 996) + { + npc->code_char = 316; + npc->act_no = 0; + } +} + +// Bute (with sword) +void ActNpc310(NPCHAR *npc) +{ + RECT rcLeft[5] = { + {32, 0, 56, 16}, + {56, 0, 80, 16}, + {80, 0, 104, 16}, + {104, 0, 128, 16}, + {128, 0, 152, 16}, + }; + + RECT rcRight[5] = { + {32, 16, 56, 32}, + {56, 16, 80, 32}, + {80, 16, 104, 32}, + {104, 16, 128, 32}, + {128, 16, 152, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + npc->damage = 0; + // Fallthrough + case 1: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->ani_no = 0; + + if (gMC.x > npc->x - (128 * 0x200) && gMC.x < npc->x + (128 * 0x200) && gMC.y > npc->y - (128 * 0x200) && gMC.y < npc->y + (16 * 0x200)) + npc->act_no = 10; + + break; + + case 10: + npc->xm = 0; + npc->act_no = 11; + npc->act_wait = 0; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + npc->damage = 0; + npc->ani_no = 0; + // Fallthrough + case 11: + if (++npc->act_wait > 30) + npc->act_no = 20; + + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + npc->bits &= ~NPC_INVULNERABLE; + npc->bits |= NPC_SHOOTABLE; + npc->damage = 0; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 21: + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (++npc->act_wait > 50) + npc->act_no = 10; + + if (npc->x < gMC.x + (40 * 0x200) && npc->x > gMC.x - (40 * 0x200)) + { + npc->ym = -0x300; + npc->xm /= 2; + npc->ani_no = 2; + npc->act_no = 30; + PlaySoundObject(30, SOUND_MODE_PLAY); + } + + break; + + case 30: + if (npc->ym > -0x80) + { + npc->act_no = 31; + npc->ani_wait = 0; + npc->ani_no = 3; + npc->damage = 9; + } + + break; + + case 31: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + npc->ani_no = 4; + } + + if (npc->flag & 8) + { + npc->act_no = 32; + npc->act_wait = 0; + npc->xm = 0; + npc->damage = 3; + } + + break; + + case 32: + if (++npc->act_wait > 30) + { + npc->act_no = 10; + npc->damage = 0; + } + + break; + } + + npc->ym += 0x20; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->life <= 996) + { + npc->code_char = 316; + npc->act_no = 0; + } +} + +// Bute archer +void ActNpc311(NPCHAR *npc) +{ + RECT rcLeft[7] = { + {0, 32, 24, 56}, + {24, 32, 48, 56}, + {48, 32, 72, 56}, + {72, 32, 96, 56}, + {96, 32, 120, 56}, + {120, 32, 144, 56}, + {144, 32, 168, 56}, + }; + + RECT rcRight[7] = { + {0, 56, 24, 80}, + {24, 56, 48, 80}, + {48, 56, 72, 80}, + {72, 56, 96, 80}, + {96, 56, 120, 80}, + {120, 56, 144, 80}, + {144, 56, 168, 80}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->direct == 0) + { + if (gMC.x > npc->x - (320 * 0x200) && gMC.x < npc->x && gMC.y > npc->y - (160 * 0x200) && gMC.y < npc->y + (160 * 0x200)) + npc->act_no = 10; + } + else + { + if (gMC.x > npc->x && gMC.x < npc->x + (320 * 0x200) && gMC.y > npc->y - (160 * 0x200) && gMC.y < npc->y + (160 * 0x200)) + npc->act_no = 10; + } + + break; + + case 10: + npc->act_no = 11; + // Fallthrough + case 11: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (gMC.x > npc->x - (224 * 0x200) && gMC.x < npc->x + (224 * 0x200) && gMC.y > npc->y - (8 * 0x200)) + { + npc->ani_no = 1; + npc->count1 = 0; + } + else + { + npc->ani_no = 4; + npc->count1 = 1; + } + + if (++npc->act_wait > 10) + npc->act_no = 20; + + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + // Fallthrough + case 21: + if (npc->count1 == 0) + { + if (++npc->ani_no > 2) + npc->ani_no = 1; + } + else + { + if (++npc->ani_no > 5) + npc->ani_no = 4; + } + + if (++npc->act_wait > 30) + npc->act_no = 30; + + break; + + case 30: + npc->act_no = 31; + npc->act_wait = 0; + + if (npc->count1 == 0) + { + if (npc->direct == 0) + SetNpChar(312, npc->x, npc->y, -0x600, 0, 0, NULL, 0x100); + else + SetNpChar(312, npc->x, npc->y, 0x600, 0, 2, NULL, 0x100); + + npc->ani_no = 3; + } + else + { + if (npc->direct == 0) + SetNpChar(312, npc->x, npc->y, -0x600, -0x600, 0, NULL, 0x100); + else + SetNpChar(312, npc->x, npc->y, 0x600, -0x600, 2, NULL, 0x100); + + npc->ani_no = 6; + } + // Fallthrough + case 31: + if (++npc->act_wait > 30) + { + npc->act_no = 40; + npc->act_wait = Random(0, 100); + } + + break; + + case 40: + npc->ani_no = 0; + + if (++npc->act_wait > 150) + npc->act_no = 10; + + if (gMC.x < npc->x - (352 * 0x200) || gMC.x > npc->x + (352 * 0x200) || gMC.y < npc->y - (240 * 0x200) || gMC.y > npc->y + (240 * 0x200)) + { + npc->act_no = 40; + npc->act_wait = 0; + } + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->life <= 992) + { + npc->code_char = 316; + npc->act_no = 0; + } +} + +// Bute arrow projectile +void ActNpc312(NPCHAR *npc) +{ + RECT rcLeft[5] = { + {0, 160, 16, 176}, + {16, 160, 32, 176}, + {32, 160, 48, 176}, + {48, 160, 64, 176}, + {64, 160, 80, 176}, + }; + + RECT rcRight[5] = { + {0, 176, 16, 192}, + {16, 176, 32, 192}, + {32, 176, 48, 192}, + {48, 176, 64, 192}, + {64, 176, 80, 192}, + }; + + if (npc->act_no > 0 && npc->act_no < 20 && npc->flag & 0xFF) + npc->act_no = 20; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = 0; + + if (npc->xm < 0) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->ym < 0) + npc->ani_no = 0; + else + npc->ani_no = 2; + // Fallthrough + case 1: + ++npc->act_wait; + + if (npc->act_wait == 4) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (npc->act_wait > 10) + npc->act_no = 10; + + break; + + case 10: + npc->act_no = 11; + npc->ani_wait = 0; + npc->xm = 3 * npc->xm / 4; + npc->ym = 3 * npc->ym / 4; + // Fallthrough + case 11: + npc->ym += 0x20; + + if (++npc->ani_wait > 10) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 4; + + break; + + case 20: + npc->act_no = 21; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + npc->damage = 0; + // Fallthrough + case 21: + if (++npc->act_wait > 30) + npc->act_no = 30; + + break; + + case 30: + npc->act_no = 31; + npc->act_wait = 0; + // Fallthrough + case 31: + if (++npc->act_wait > 30) + { + npc->cond = 0; + return; + } + + break; + } + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->act_no == 31) + { + if (npc->act_wait / 2 % 2) + { + npc->rect.left = 0; + npc->rect.right = 0; + } + } +} + +// Ma Pignon +void ActNpc313(NPCHAR *npc) +{ + RECT rcLeft[14] = { + {128, 0, 144, 16}, + {144, 0, 160, 16}, + {160, 0, 176, 16}, + {176, 0, 192, 16}, + {192, 0, 208, 16}, + {208, 0, 224, 16}, + {224, 0, 240, 16}, + {240, 0, 256, 16}, + {256, 0, 272, 16}, + {272, 0, 288, 16}, + {288, 0, 304, 16}, + {128, 0, 144, 16}, + {176, 0, 192, 16}, + {304, 0, 320, 16}, + }; + + RECT rcRight[14] = { + {128, 16, 144, 32}, + {144, 16, 160, 32}, + {160, 16, 176, 32}, + {176, 16, 192, 32}, + {192, 16, 208, 32}, + {208, 16, 224, 32}, + {224, 16, 240, 32}, + {240, 16, 256, 32}, + {256, 16, 272, 32}, + {272, 16, 288, 32}, + {288, 16, 304, 32}, + {128, 16, 144, 32}, + {176, 16, 192, 32}, + {304, 16, 320, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->y += 4 * 0x200; + // Fallthrough + case 1: + npc->ym += 0x40; + + if (Random(0, 120) == 10) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (npc->x - (32 * 0x200) < gMC.x && npc->x + (32 * 0x200) > gMC.x) + { + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 100: + npc->act_no = 110; + npc->act_wait = 0; + npc->count1 = 0; + npc->bits |= NPC_SHOOTABLE; + // Fallthrough + case 110: + npc->damage = 1; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->ani_no = 0; + + if (++npc->act_wait > 4) + { + npc->act_wait = 0; + npc->act_no = 120; + + if (++npc->count2 > 12) + { + npc->count2 = 0; + npc->act_no = 300; + } + } + + break; + + case 120: + npc->ani_no = 2; + + if (++npc->act_wait > 4) + { + npc->act_no = 130; + npc->ani_no = 3; + npc->xm = 2 * Random(-0x200, 0x200); + npc->ym = -0x800; + PlaySoundObject(30, SOUND_MODE_PLAY); + ++npc->count1; + } + + break; + + case 130: + npc->ym += 0x80; + + if (npc->y > 128 * 0x200) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (npc->xm < 0 && npc->flag & 1) + npc->xm *= -1; + if (npc->xm > 0 && npc->flag & 4) + npc->xm *= -1; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->ym < -0x200) + npc->ani_no = 3; + else if (npc->ym > 0x200) + npc->ani_no = 4; + else + npc->ani_no = 0; + + if (npc->flag & 8) + { + npc->act_no = 140; + npc->act_wait = 0; + npc->ani_no = 2; + npc->xm = 0; + } + + if (npc->count1 > 4 && gMC.y < npc->y + (4 * 0x200)) + { + npc->act_no = 200; + npc->act_wait = 0; + npc->xm = 0; + npc->ym = 0; + } + + break; + + case 140: + npc->ani_no = 2; + + if (++npc->act_wait > 4) + npc->act_no = 110; + + break; + + case 200: + npc->ani_no = 5; + + if (++npc->act_wait > 10) + { + npc->act_no = 210; + npc->ani_no = 6; + + if (npc->direct == 0) + npc->xm = -0x5FF; + else + npc->xm = 0x5FF; + + PlaySoundObject(25, SOUND_MODE_PLAY); + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + npc->damage = 10; + } + + break; + + case 210: + if (++npc->ani_no > 7) + npc->ani_no = 6; + + if (npc->xm < 0 && npc->flag & 1) + npc->act_no = 220; + if (npc->xm > 0 && npc->flag & 4) + npc->act_no = 220; + + break; + + case 220: + npc->act_no = 221; + npc->act_wait = 0; + SetQuake(16); + PlaySoundObject(26, SOUND_MODE_PLAY); + npc->damage = 4; + // Fallthrough + case 221: + if (++npc->ani_no > 7) + npc->ani_no = 6; + + if (++npc->act_wait % 6 == 0) + SetNpChar(314, Random(4, 16) * 0x200 * 0x10, 1 * 0x200 * 0x10, 0, 0, 0, NULL, 0x100); + + if (npc->act_wait > 30) + { + npc->count1 = 0; + npc->act_no = 130; + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + npc->damage = 3; + } + + break; + + case 300: + npc->act_no = 301; + npc->ani_no = 9; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + // Fallthrough + case 301: + if (++npc->ani_no > 11) + npc->ani_no = 9; + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + + if (gMC.x > npc->x - (4 * 0x200) && gMC.x < npc->x + (4 * 0x200)) + { + npc->act_no = 310; + npc->act_wait = 0; + npc->ani_no = 2; + npc->xm = 0; + } + + break; + + case 310: + npc->ani_no = 2; + + if (++npc->act_wait > 4) + { + npc->act_no = 320; + npc->ani_no = 12; + npc->ym = -0x800; + PlaySoundObject(25, SOUND_MODE_PLAY); + npc->bits |= NPC_IGNORE_SOLIDITY; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + npc->damage = 10; + } + + break; + + case 320: + if (++npc->ani_no > 13) + npc->ani_no = 12; + + if (npc->y < (16 * 0x200)) + npc->act_no = 330; + + break; + + case 330: + npc->ym = 0; + npc->act_no = 331; + npc->act_wait = 0; + SetQuake(16); + PlaySoundObject(26, SOUND_MODE_PLAY); + // Fallthrough + case 331: + if (++npc->ani_no > 13) + npc->ani_no = 12; + + if (++npc->act_wait % 6 == 0) + SetNpChar(315, Random(4, 16) * 0x200 * 0x10, 0, 0, 0, 0, NULL, 0x100); + + if (npc->act_wait > 30) + { + npc->count1 = 0; + npc->act_no = 130; + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + npc->damage = 3; + } + + break; + + case 500: + npc->bits &= ~NPC_SHOOTABLE; + npc->act_no = 501; + npc->act_wait = 0; + npc->ani_no = 8; + npc->tgt_x = npc->x; + npc->damage = 0; + DeleteNpCharCode(315, TRUE); + // Fallthrough + case 501: + npc->ym += 0x20; + + if (++npc->act_wait % 2) + npc->x = npc->tgt_x; + else + npc->x = npc->tgt_x + (1 * 0x200); + + break; + } + + if (npc->act_no > 100 && npc->act_no < 500 && npc->act_no != 210 && npc->act_no != 320) + { + if (IsActiveSomeBullet()) + { + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + } + else + { + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + } + } + + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Ma Pignon rock +void ActNpc314(NPCHAR *npc) +{ + RECT rc[3] = { + {64, 64, 80, 80}, + {80, 64, 96, 80}, + {96, 64, 112, 80}, + }; + + switch (npc->act_no) + { + case 0: + npc->count2 = 0; + npc->act_no = 100; + npc->bits |= NPC_INVULNERABLE; + npc->ani_no = Random(0, 2); + // Fallthrough + case 100: + npc->ym += 0x40; + + if (npc->ym > 0x700) + npc->ym = 0x700; + + if (npc->y > 128 * 0x200) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (npc->flag & 8) + { + int i; + + npc->ym = -0x200; + npc->act_no = 110; + npc->bits |= NPC_IGNORE_SOLIDITY; + PlaySoundObject(12, SOUND_MODE_PLAY); + SetQuake(10); + + for (i = 0; i < 2; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (16 * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + } + + break; + + case 110: + npc->ym += 0x40; + + if (npc->y > (gMap.length * 0x200 * 0x10) + (2 * 0x200 * 0x10)) + { + npc->cond = 0; + return; + } + + break; + } + + if (++npc->ani_wait > 6) + { + ++npc->ani_wait; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (gMC.y > npc->y) + npc->damage = 10; + else + npc->damage = 0; + + npc->y += npc->ym; + + npc->rect = rc[npc->ani_no]; +} + +// Ma Pignon clone +void ActNpc315(NPCHAR *npc) +{ + RECT rcLeft[4] = { + {128, 0, 144, 16}, + {160, 0, 176, 16}, + {176, 0, 192, 16}, + {192, 0, 208, 16}, + }; + + RECT rcRight[4] = { + {128, 16, 144, 32}, + {160, 16, 176, 32}, + {176, 16, 192, 32}, + {192, 16, 208, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->ani_no = 3; + npc->ym += 0x80; + + if (npc->y > 128 * 0x200) + { + npc->act_no = 130; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + } + + break; + + case 100: + npc->act_no = 110; + npc->act_wait = 0; + npc->count1 = 0; + npc->bits |= NPC_SHOOTABLE; + // Fallthrough + case 110: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->ani_no = 0; + + if (++npc->act_wait > 4) + { + npc->act_wait = 0; + npc->act_no = 120; + } + + break; + + case 120: + npc->ani_no = 1; + + if (++npc->act_wait > 4) + { + npc->act_no = 130; + npc->ani_no = 3; + npc->xm = 2 * Random(-0x200, 0x200); + npc->ym = -0x800; + PlaySoundObject(30, SOUND_MODE_PLAY); + } + + break; + + case 130: + npc->ym += 0x80; + + if (npc->xm < 0 && npc->flag & 1) + npc->xm *= -1; + if (npc->xm > 0 && npc->flag & 4) + npc->xm *= -1; + + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (npc->ym < -0x200) + npc->ani_no = 2; + else if (npc->ym > 0x200) + npc->ani_no = 0; + else + npc->ani_no = 3; + + if (npc->flag & 8) + { + npc->act_no = 140; + npc->act_wait = 0; + npc->ani_no = 1; + npc->xm = 0; + } + + break; + + case 140: + npc->ani_no = 1; + + if (++npc->act_wait > 4) + { + npc->act_no = 110; + npc->bits |= NPC_SHOOTABLE; + } + + break; + } + + if (npc->act_no > 100) + { + if (IsActiveSomeBullet()) + { + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + } + else + { + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_INVULNERABLE; + } + } + + if (++npc->count2 > 300) + { + VanishNpChar(npc); + } + else + { + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + } +} + +// Bute (dead) +void ActNpc316(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {248, 32, 272, 56}, + {272, 32, 296, 56}, + {296, 32, 320, 56}, + }; + + RECT rcRight[3] = { + {248, 56, 272, 80}, + {272, 56, 296, 80}, + {296, 56, 320, 80}, + }; + + switch (npc->act_no) + { + case 0: + npc->bits &= ~NPC_SHOOTABLE; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + npc->damage = 0; + npc->act_no = 1; + npc->ani_no = 0; + npc->view.front = 12 * 0x200; + npc->view.back = 12 * 0x200; + npc->view.top = 12 * 0x200; + npc->ym = -0x200; + + if (npc->direct == 0) + npc->xm = 0x100; + else + npc->xm = -0x100; + + PlaySoundObject(50, SOUND_MODE_PLAY); + + break; + + case 1: + if (npc->flag & 8) + { + npc->ani_no = 1; + npc->ani_wait = 0; + npc->act_no = 2; + npc->act_wait = 0; + } + + break; + + case 2: + npc->xm = 8 * npc->xm / 9; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 1; + + if (++npc->act_wait > 50) + npc->cond |= 8; + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Mesa +void ActNpc317(NPCHAR *npc) +{ + RECT rcLeft[4] = { + {0, 80, 32, 120}, + {32, 80, 64, 120}, + {64, 80, 96, 120}, + {96, 80, 128, 120}, + }; + + RECT rcRight[4] = { + {0, 120, 32, 160}, + {32, 120, 64, 160}, + {64, 120, 96, 160}, + {96, 120, 128, 160}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 8 * 0x200; + npc->tgt_x = npc->x; + // Fallthrough + case 1: + npc->xm = 0; + npc->act_no = 2; + npc->ani_no = 0; + npc->count1 = 0; + // Fallthrough + case 2: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (++npc->ani_wait > 40) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (gMC.x > npc->x - (320 * 0x200) && gMC.x < npc->x + (320 * 0x200) && gMC.y > npc->y - (160 * 0x200) && gMC.y < npc->y + (160 * 0x200) && ++npc->count1 > 50) + npc->act_no = 10; + + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + npc->ani_no = 2; + SetNpChar(319, npc->x, npc->y, 0, 0, 0, npc, 0x100); + // Fallthrough + case 11: + if (++npc->act_wait > 50) + { + npc->act_wait = 0; + npc->act_no = 12; + npc->ani_no = 3; + PlaySoundObject(39, SOUND_MODE_PLAY); + } + + break; + + case 12: + if (++npc->act_wait > 20) + npc->act_no = 1; + + break; + } + + npc->ym += 0x55; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + if (npc->life <= 936) + { + npc->code_char = 318; + npc->act_no = 0; + } +} + +// Mesa (dead) +void ActNpc318(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {224, 80, 256, 120}, + {256, 80, 288, 120}, + {288, 80, 320, 120}, + }; + + RECT rcRight[3] = { + {224, 120, 256, 160}, + {256, 120, 288, 160}, + {288, 120, 320, 160}, + }; + + switch (npc->act_no) + { + case 0: + npc->bits &= ~NPC_SHOOTABLE; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + npc->bits &= ~NPC_SOLID_SOFT; + npc->damage = 0; + npc->act_no = 1; + npc->ani_no = 0; + npc->ym = -0x200; + + if (npc->direct == 0) + npc->xm = 0x40; + else + npc->xm = -0x40; + + PlaySoundObject(54, SOUND_MODE_PLAY); + break; + + case 1: + if (npc->flag & 8) + { + npc->ani_no = 1; + npc->ani_wait = 0; + npc->act_no = 2; + npc->act_wait = 0; + } + + break; + + case 2: + npc->xm = 8 * npc->xm / 9; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 1; + + if (++npc->act_wait > 50) + npc->cond |= 8; + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Mesa block +void ActNpc319(NPCHAR *npc) +{ + RECT rc[3] = { + {16, 0, 32, 16}, + {16, 0, 32, 16}, + {96, 80, 112, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->y = npc->pNpc->y + (10 * 0x200); + + if (npc->pNpc->direct == 0) + npc->x = npc->pNpc->x + (7 * 0x200); + else + npc->x = npc->pNpc->x - (7 * 0x200); + + if (npc->pNpc->code_char == 318) + { + SetDestroyNpChar(npc->x, npc->y, 0, 3); + npc->cond = 0; + return; + } + + if (npc->pNpc->ani_no != 2) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ym = -0x400; + npc->y = npc->pNpc->y - (4 * 0x200); + + if (npc->pNpc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + } + + break; + + case 2: + if (++npc->act_wait == 4) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + npc->ym += 0x2A; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->flag & 8) + { + PlaySoundObject(12, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x, npc->y, 0, 3); + npc->cond = 0; + } + + break; + } + + if (++npc->ani_no > 2) + npc->ani_no = 0; + + npc->rect = rc[npc->ani_no]; +} diff --git a/src/NpcAct320.cpp b/src/NpcAct320.cpp new file mode 100644 index 0000000..c33a0ab --- /dev/null +++ b/src/NpcAct320.cpp @@ -0,0 +1,1160 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Frame.h" +#include "Game.h" +#include "KeyControl.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Shoot.h" +#include "Sound.h" + +// Curly (carried, shooting) +void ActNpc320(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {16, 96, 32, 112}, + {48, 96, 64, 112}, + {96, 96, 112, 112}, + }; + + RECT rcRight[3] = { + {16, 112, 32, 128}, + {48, 112, 64, 128}, + {96, 112, 112, 128}, + }; + + if (npc->act_no == 0) + { + npc->act_no = 1; + npc->x = gMC.x; + npc->y = gMC.y; + SetNpChar(321, 0, 0, 0, 0, 0, npc, 0x100); + } + + if (gMC.flag & 8) + { + if (gMC.up) + { + npc->tgt_x = gMC.x; + npc->tgt_y = gMC.y - (10 * 0x200); + npc->ani_no = 1; + } + else + { + npc->ani_no = 0; + + if (gMC.direct == 0) + { + npc->tgt_x = gMC.x + (7 * 0x200); + npc->tgt_y = gMC.y - (3 * 0x200); + } + else + { + npc->tgt_x = gMC.x - (7 * 0x200); + npc->tgt_y = gMC.y - (3 * 0x200); + } + } + } + else + { + if (gMC.up) + { + npc->tgt_x = gMC.x; + npc->tgt_y = gMC.y + (8 * 0x200); + npc->ani_no = 2; + } + else if (gMC.down) + { + npc->tgt_x = gMC.x; + npc->tgt_y = gMC.y - (8 * 0x200); + npc->ani_no = 1; + } + else + { + npc->ani_no = 0; + + if (gMC.direct == 0) + { + npc->tgt_x = gMC.x + (7 * 0x200); + npc->tgt_y = gMC.y - (3 * 0x200); + } + else + { + npc->tgt_x = gMC.x - (7 * 0x200); + npc->tgt_y = gMC.y - (3 * 0x200); + } + } + } + + npc->x += (npc->tgt_x - npc->x) / 2; + npc->y += (npc->tgt_y - npc->y) / 2; + + if (gMC.ani_no % 2) + npc->y -= 1 * 0x200; + + if (gMC.direct == 0) + npc->rect = rcRight[npc->ani_no]; + else + npc->rect = rcLeft[npc->ani_no]; +} + +// Curly's Nemesis +void ActNpc321(NPCHAR *npc) +{ + RECT rcLeft[3] = { + {136, 152, 152, 168}, + {152, 152, 168, 168}, + {168, 152, 184, 168}, + }; + + RECT rcRight[3] = { + {136, 168, 152, 184}, + {152, 168, 168, 184}, + {168, 168, 184, 184}, + }; + + int direct; + + if (npc->pNpc == NULL) + return; + + switch (npc->pNpc->ani_no) + { + case 0: + if (gMC.direct == 0) + { + npc->x = npc->pNpc->x + (8 * 0x200); + direct = 2; + } + else + { + npc->x = npc->pNpc->x - (8 * 0x200); + direct = 0; + } + + npc->y = npc->pNpc->y; + break; + + case 1: + if (gMC.direct == 0) // Does the same thing whether this is false or true + npc->x = npc->pNpc->x; + else + npc->x = npc->pNpc->x; + + direct = 1; + npc->y = npc->pNpc->y - (10 * 0x200); + break; + + case 2: + if (gMC.direct == 0) // Does the same thing whether this is false or true + npc->x = npc->pNpc->x; + else + npc->x = npc->pNpc->x; + + direct = 3; + npc->y = npc->pNpc->y + (10 * 0x200); + break; + } + + npc->ani_no = npc->pNpc->ani_no; + + if (g_GameFlags & 2 && CountBulletNum(43) < 2 && ((gbAutoFire == 2 && autofire_switch) || (gbAutoFire == 1? gKey & gKeyShot : gKeyTrg & gKeyShot))) + { + SetBullet(43, npc->pNpc->x, npc->pNpc->y, direct); + SetCaret(npc->pNpc->x, npc->pNpc->y, CARET_SHOOT, DIR_LEFT); + PlaySoundObject(117, SOUND_MODE_PLAY); + } + + if (gMC.direct == 0) + npc->rect = rcRight[npc->ani_no]; + else + npc->rect = rcLeft[npc->ani_no]; +} + +// Deleet +void ActNpc322(NPCHAR *npc) +{ + RECT rc[3] = { + {272, 216, 296, 240}, + {296, 216, 320, 240}, + {160, 216, 184, 240}, + }; + + if (npc->act_no < 2 && npc->life <= 968) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->bits &= ~NPC_SHOOTABLE; + npc->bits |= NPC_INVULNERABLE; + PlaySoundObject(22, SOUND_MODE_PLAY); + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 0) + npc->y += 8 * 0x200; + else + npc->x += 8 * 0x200; + // Fallthrough + case 1: + if (npc->shock) + ++npc->count1; + else + npc->count1 = 0; + + npc->rect = rc[npc->count1 / 2 % 2]; + break; + + case 2: + npc->ani_no = 2; + + switch (npc->act_wait) + { + // Interestingly, this NPC counts down at 50 frames per second, + // while NPC206 (the Egg Corridor Counter Bomb), counts at 60. + case 50 * 0: + SetNpChar(207, npc->x + (4 * 0x200), npc->y, 0, 0, 0, NULL, 0x180); + break; + + case 50 * 1: + SetNpChar(207, npc->x + (4 * 0x200), npc->y, 0, 0, 1, NULL, 0x180); + break; + + case 50 * 2: + SetNpChar(207, npc->x + (4 * 0x200), npc->y, 0, 0, 2, NULL, 0x180); + break; + + case 50 * 3: + SetNpChar(207, npc->x + (4 * 0x200), npc->y, 0, 0, 3, NULL, 0x180); + break; + + case 50 * 4: + SetNpChar(207, npc->x + (4 * 0x200), npc->y, 0, 0, 4, NULL, 0x180); + break; + + case 50 * 5: + npc->hit.back = 48 * 0x200; + npc->hit.front = 48 * 0x200; + npc->hit.top = 48 * 0x200; + npc->hit.bottom = 48 * 0x200; + npc->damage = 12; + PlaySoundObject(26, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x, npc->y, 0x6000, 40); + SetQuake(10); + + if (npc->direct == 0) + { + DeleteMapParts(npc->x / 0x200 / 0x10, (npc->y - (8 * 0x200)) / 0x200 / 0x10); + DeleteMapParts(npc->x / 0x200 / 0x10, (npc->y + (8 * 0x200)) / 0x200 / 0x10); + } + else + { + DeleteMapParts((npc->x - (8 * 0x200)) / 0x200 / 0x10, npc->y / 0x200 / 0x10); + DeleteMapParts((npc->x + (8 * 0x200)) / 0x200 / 0x10, npc->y / 0x200 / 0x10); + } + + npc->cond |= 8; + break; + } + + ++npc->act_wait; + npc->rect = rc[2]; + break; + } +} + +// Bute (spinning) +void ActNpc323(NPCHAR *npc) +{ + RECT rc[4] = { + {216, 32, 232, 56}, + {232, 32, 248, 56}, + {216, 56, 232, 80}, + {232, 56, 248, 80}, + }; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 3) + npc->ani_no = 0; + } + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + switch (npc->direct) + { + case 0: + npc->xm = -0x600; + break; + + case 2: + npc->xm = 0x600; + break; + + case 1: + npc->ym = -0x600; + break; + + case 3: + npc->ym = 0x600; + break; + } + // Fallthrough + case 1: + if (++npc->act_wait == 16) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->flag & 0xFF) + npc->act_no = 10; + + if (npc->act_wait > 20) + { + switch (npc->direct) + { + case 0: + if (npc->x <= gMC.x + (32 * 0x200)) + npc->act_no = 10; + break; + + case 2: + if (npc->x >= gMC.x - (32 * 0x200)) + npc->act_no = 10; + break; + + case 1: + if (npc->y <= gMC.y + (32 * 0x200)) + npc->act_no = 10; + break; + + case 3: + if (npc->y >= gMC.y - (32 * 0x200)) + npc->act_no = 10; + break; + } + } + + break; + } + + if (npc->act_no == 10) + { + npc->code_char = 309; + npc->ani_no = 0; + npc->act_no = 11; + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + npc->damage = 5; + npc->view.top = 8 * 0x200; + } + + npc->rect = rc[npc->ani_no]; +} + +// Bute generator +void ActNpc324(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 10: + npc->act_no = 11; + npc->act_wait = 0; + // Fallthrough + case 11: + if (++npc->act_wait % 50 == 1) + SetNpChar(323, npc->x, npc->y, 0, 0, npc->direct, NULL, 0x100); + + if (npc->act_wait > 351) + npc->act_no = 0; + + break; + } +} + +// Heavy Press lightning +void ActNpc325(NPCHAR *npc) +{ + RECT rc[7] = { + {240, 96, 272, 128}, + {272, 96, 304, 128}, + {240, 128, 272, 160}, + {240, 0, 256, 96}, + {256, 0, 272, 96}, + {272, 0, 288, 96}, + {288, 0, 304, 96}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 1: + if (++npc->ani_wait > 0) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + if (++npc->act_wait > 50) + { + npc->act_no = 10; + npc->ani_wait = 0; + npc->ani_no = 3; + npc->damage = 10; + npc->view.front = 8 * 0x200; + npc->view.top = 12 * 0x200; + PlaySoundObject(101, SOUND_MODE_PLAY); + SetDestroyNpChar(npc->x, npc->y + (84 * 0x200), 0, 3); + } + + break; + + case 10: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 6) + { + npc->cond = 0; + return; + } + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Sue/Itoh becoming human +void ActNpc326(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 8 * 0x200; + npc->x += 16 * 0x200; + npc->ani_no = 0; + // Fallthrough + case 1: + if (++npc->act_wait > 80) + { + npc->act_no = 10; + npc->act_wait = 0; + break; + } + + if (npc->direct == 0) + { + if (npc->act_wait == 30) + npc->ani_no = 1; + if (npc->act_wait == 40) + npc->ani_no = 0; + } + else + { + if (npc->act_wait == 50) + npc->ani_no = 1; + if (npc->act_wait == 60) + npc->ani_no = 0; + } + + break; + + case 10: + if (++npc->act_wait > 50) + { + npc->act_no = 15; + npc->ani_no = 4; + + if (npc->direct == 0) + npc->act_wait = 0; + else + npc->act_wait = -20; + + break; + } + + if (npc->act_wait / 2 % 2) + npc->ani_no = 2; + else + npc->ani_no = 3; + + break; + + case 15: + if (++npc->act_wait > 40) + { + npc->act_wait = 0; + npc->act_no = 20; + } + + break; + + case 20: + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + + if (++npc->act_wait > 50) + { + npc->act_no = 30; + npc->act_wait = 0; + npc->ani_no = 6; + + if (npc->direct == 0) + SetNpChar(327, npc->x, npc->y - (16 * 0x200), 0, 0, 0, npc, 0x100); + else + SetNpChar(327, npc->x, npc->y - (8 * 0x200), 0, 0, 0, npc, 0x100); + + break; + } + + break; + + case 30: + if (++npc->act_wait == 30) + npc->ani_no = 7; + + if (npc->act_wait == 40) + npc->act_no = 40; + + break; + + case 40: + npc->act_no = 41; + npc->act_wait = 0; + npc->ani_no = 0; + // Fallthrough + case 41: + if (++npc->act_wait == 30) + npc->ani_no = 1; + + if (npc->act_wait == 40) + npc->ani_no = 0; + + break; + } + + RECT rcItoh[8] = { + {0, 128, 16, 152}, + {16, 128, 32, 152}, + {32, 128, 48, 152}, + {48, 128, 64, 152}, + {64, 128, 80, 152}, + {80, 128, 96, 152}, + {96, 128, 112, 152}, + {112, 128, 128, 152}, + }; + + RECT rcSu[8] = { + {128, 128, 144, 152}, + {144, 128, 160, 152}, + {160, 128, 176, 152}, + {176, 128, 192, 152}, + {192, 128, 208, 152}, + {208, 128, 224, 152}, + {224, 128, 240, 152}, + {32, 152, 48, 176}, + }; + + if (npc->direct == 0) + npc->rect = rcItoh[npc->ani_no]; + else + npc->rect = rcSu[npc->ani_no]; +} + +// Sneeze +void ActNpc327(NPCHAR *npc) +{ + RECT rc[2] = { + {240, 80, 256, 96}, + {256, 80, 272, 96}, + }; + + ++npc->act_wait; + + switch (npc->act_no) + { + case 0: + if (npc->act_wait < 4) + npc->y -= 2 * 0x200; + + if (npc->pNpc->ani_no == 7) + { + npc->ani_no = 1; + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + } + break; + + case 1: + if (npc->act_wait < 48) + { + npc->x = npc->tgt_x + (Random(-1, 1) * 0x200); + npc->y = npc->tgt_y + (Random(-1, 1) * 0x200); + } + else + { + npc->x = npc->tgt_x; + npc->y = npc->tgt_y; + } + break; + } + + if (npc->act_wait > 70) + npc->cond = 0; + + npc->rect = rc[npc->ani_no]; +} + +// Thingy that turns Sue and Itoh into humans for 4 seconds +void ActNpc328(NPCHAR *npc) +{ + RECT rc = {96, 0, 128, 48}; + npc->rect = rc; +} + +// Laboratory fan +void ActNpc329(NPCHAR *npc) +{ + RECT rc[2] = { + {48, 0, 64, 16}, + {64, 0, 80, 16}, + }; + + if (++npc->ani_wait / 2 % 2) + npc->rect = rc[0]; + else + npc->rect = rc[1]; +} + +// Rolling +void ActNpc330(NPCHAR *npc) +{ + RECT rc[3] = { + {144, 136, 160, 152}, + {160, 136, 176, 152}, + {176, 136, 192, 152}, + }; + + switch (npc->act_no) + { + case 0: + ChangeMapParts(npc->x / 0x200 / 0x10, npc->y / 0x200 / 0x10, 0); + + if (npc->direct == 0) + npc->act_no = 10; + else + npc->act_no = 30; + + break; + + case 10: + npc->xm -= 0x40; + npc->ym = 0; + + if (npc->flag & 1) + npc->act_no = 20; + + break; + + case 20: + npc->xm = 0; + npc->ym -= 0x40; + + if (npc->flag & 2) + npc->act_no = 30; + + break; + + case 30: + npc->xm += 0x40; + npc->ym = 0; + + if (npc->flag & 4) + npc->act_no = 40; + + break; + + case 40: + npc->xm = 0; + npc->ym += 0x40; + + if (npc->flag & 8) + npc->act_no = 10; + + break; + } + + if (npc->xm < -0x400) + npc->xm = -0x400; + if (npc->xm > 0x400) + npc->xm = 0x400; + + if (npc->ym < -0x400) + npc->ym = -0x400; + if (npc->ym > 0x400) + npc->ym = 0x400; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 0; + + npc->rect = rc[npc->ani_no]; +} + +// Ballos bone projectile +void ActNpc331(NPCHAR *npc) +{ + RECT rc[4] = { + {288, 80, 304, 96}, + {304, 80, 320, 96}, + {288, 96, 304, 112}, + {304, 96, 320, 112}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (npc->flag & 8) + { + npc->ym = -0x200; + npc->act_no = 10; + } + + break; + + case 10: + if (npc->flag & 8) + { + npc->cond = 0; + SetCaret(npc->x, npc->y, CARET_PROJECTILE_DISSIPATION, DIR_LEFT); + } + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->y += npc->ym; + npc->x += npc->xm; + + if (++npc->ani_wait > 3) + { + npc->ani_wait = 0; + + if (npc->direct == 0) + ++npc->ani_no; + else + --npc->ani_no; + + if (npc->ani_no < 0) + npc->ani_no += 4; + if (npc->ani_no > 3) + npc->ani_no -= 4; + } + + npc->rect = rc[npc->ani_no]; +} + +// Ballos shockwave +void ActNpc332(NPCHAR *npc) +{ + RECT rc[3] = { + {144, 96, 168, 120}, + {168, 96, 192, 120}, + {192, 96, 216, 120}, + }; + + int xm; + + switch (npc->act_no) + { + case 0: + PlaySoundObject(44, SOUND_MODE_PLAY); + npc->act_no = 1; + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + // Fallthrough + case 1: + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 2) + npc->ani_no = 0; + } + + if (++npc->act_wait % 6 == 1) + { + if (npc->direct == 0) + xm = (Random(-0x10, -4) * 0x200) / 8; + else + xm = (Random(4, 0x10) * 0x200) / 8; + + SetNpChar(331, npc->x, npc->y, xm, -0x400, 0, 0, 0x100); + + PlaySoundObject(12, SOUND_MODE_PLAY); + } + + break; + } + + if (npc->flag & 1) + npc->cond = 0; + if (npc->flag & 4) + npc->cond = 0; + + npc->x += npc->xm; + + npc->rect = rc[npc->ani_no]; +} + +// Ballos lightning +void ActNpc333(NPCHAR *npc) +{ + RECT rc[2] = { + {80, 120, 104, 144}, + {104, 120, 128, 144}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->tgt_x = npc->x; + npc->tgt_y = npc->y; + PlaySoundObject(103, SOUND_MODE_PLAY); + npc->y = gMC.y; + // Fallthrough + case 1: + if (++npc->act_wait / 2 % 2) + npc->ani_no = 0; + else + npc->ani_no = 1; + + if (npc->direct == 0 && npc->act_wait == 20) + SetNpChar(146, npc->tgt_x, npc->tgt_y, 0, 0, 0, NULL, 0x100); + + if (npc->act_wait > 40) + npc->cond = 0; + + break; + + } + + npc->rect = rc[npc->ani_no]; +} + +// Sweat +void ActNpc334(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {160, 184, 168, 200}, + {168, 184, 176, 200}, + }; + + RECT rcRight[2] = { + {176, 184, 184, 200}, + {184, 184, 192, 200}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 10; + + if (npc->direct == 0) + { + npc->x += 10 * 0x200; + npc->y -= 18 * 0x200; + } + else + { + npc->x = gMC.x - (10 * 0x200); + npc->y = gMC.y - (2 * 0x200); + } + // Fallthrough + case 10: + if (++npc->act_wait / 8 % 2) + npc->ani_no = 0; + else + npc->ani_no = 1; + + if (npc->act_wait >= 64) + npc->cond = 0; + + break; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Ikachan +void ActNpc335(NPCHAR *npc) +{ + RECT rc[3] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {32, 16, 48, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = Random(3, 20); + // Fallthrough + case 1: + if (--npc->act_wait <= 0) + { + npc->act_no = 2; + npc->act_wait = Random(10, 50); + npc->ani_no = 1; + npc->xm = 0x600; + } + + break; + + case 2: + if (--npc->act_wait <= 0) + { + npc->act_no = 3; + npc->act_wait = Random(40, 50); + npc->ani_no = 2; + npc->ym = Random(-0x100, 0x100); + } + + break; + + case 3: + if (--npc->act_wait <= 0) + { + npc->act_no = 1; + npc->act_wait = 0; + npc->ani_no = 0; + } + + break; + } + + npc->xm -= 0x10; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rc[npc->ani_no]; +} + +// Ikachan generator +void ActNpc336(NPCHAR *npc) +{ + int y; + + switch (npc->act_no) + { + case 0: + if (gMC.shock) + npc->cond = 0; + + break; + + case 10: + if (++npc->act_wait % 4 == 1) + { + y = npc->y + (Random(0, 13) * 0x200 * 0x10); + SetNpChar(335, npc->x, y, 0, 0, 0, 0, 0); + } + + break; + } +} + +// Numhachi +void ActNpc337(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {256, 112, 288, 152}, + {288, 112, 320, 152}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->y -= 8 * 0x200; + // Fallthrough + case 1: + npc->xm = 0; + npc->act_no = 2; + npc->ani_no = 0; + // Fallthrough + case 2: + if (++npc->ani_wait > 50) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + } + + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rcLeft[npc->ani_no]; +} + +// Green Devil +void ActNpc338(NPCHAR *npc) +{ + RECT rcLeft[2] = { + {288, 0, 304, 16}, + {304, 0, 320, 16}, + }; + + RECT rcRight[2] = { + {288, 16, 304, 32}, + {304, 16, 320, 32}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->view.top = 8 * 0x200; + npc->view.bottom = 8 * 0x200; + npc->damage = 3; + npc->bits |= NPC_SHOOTABLE; + npc->tgt_y = npc->y; + npc->ym = (Random(-10, 10) * 0x200) / 2; + // Fallthrough + case 1: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (npc->y < npc->tgt_y) + npc->ym += 0x80; + else + npc->ym -= 0x80; + + if (npc->direct == 0) + npc->xm -= 0x20; + else + npc->xm += 0x20; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->x < 0 || npc->y < 0 || npc->x > gMap.width * 0x200 * 0x10 || npc->y > gMap.length * 0x200 * 0x10) + { + VanishNpChar(npc); + return; + } + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Green Devil generator +void ActNpc339(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->act_wait = Random(0, 40); + // Fallthrough + case 1: + if (npc->act_wait) + { + --npc->act_wait; + } + else + { + npc->act_no = 0; + SetNpChar(338, npc->x, npc->y + (Random(-0x10, 0x10) * 0x200), 0, 0, npc->direct, NULL, 0x100); + } + + break; + } +} diff --git a/src/NpcAct340.cpp b/src/NpcAct340.cpp new file mode 100644 index 0000000..524cf87 --- /dev/null +++ b/src/NpcAct340.cpp @@ -0,0 +1,1996 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcAct.h" + +#include + +#include "WindowsWrapper.h" + +#include "Caret.h" +#include "CommonDefines.h" +#include "Draw.h" +#include "Flash.h" +#include "Flags.h" +#include "Frame.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "Triangle.h" + +// Ballos +void ActNpc340(NPCHAR *npc) +{ + int i; + int x; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->cond = 0x80; + npc->exp = 1; + npc->direct = gMirrorMode? 2:0; + npc->y -= 6 * 0x200; + npc->damage = 0; + SetNpChar(341, npc->x, npc->y - (16 * 0x200), 0, 0, 0, npc, 0x100); + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + // Fallthrough + case 11: + if (++npc->act_wait > 100) + npc->act_no = 100; + + break; + + case 100: + npc->act_no = 110; + npc->act_wait = 0; + npc->ani_no = 1; + npc->ani_wait = 0; + npc->damage = 4; + npc->bits |= NPC_SHOOTABLE; + // Fallthrough + case 110: + npc->act_no = 111; + npc->damage = 3; + npc->tgt_x = npc->life; + // Fallthrough + case 111: + if (++npc->ani_wait > 10) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 2) + npc->ani_no = 1; + + ++npc->act_wait; + + if (npc->life < npc->tgt_x - 50 || npc->act_wait > 150) + { + switch (npc->count2 % 5) + { + case 0: + case 1: + case 2: + case 3: + npc->act_no = 200; + break; + + case 4: + npc->act_no = 300; + break; + } + + ++npc->count2; + } + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + break; + + case 200: + npc->act_no = 201; + npc->count1 = 0; + // Fallthrough + case 201: + if (npc->xm == 0) + npc->act_no = 202; + else + npc->act_no = 203; + + npc->act_wait = 0; + npc->ani_no = 3; + npc->damage = 3; + ++npc->count1; + // Fallthrough + case 202: + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + npc->xm = 8 * npc->xm / 9; + npc->ym = 8 * npc->ym / 9; + + if (++npc->act_wait > 20) + npc->act_no = 210; + + break; + + case 203: + npc->xm = 8 * npc->xm / 9; + npc->ym = 8 * npc->ym / 9; + + if (++npc->act_wait > 20) + { + if (gMC.y < npc->y + (12 * 0x200)) + npc->act_no = 220; + else + npc->act_no = 230; + } + + break; + + case 210: + npc->act_no = 211; + npc->act_wait = 0; + npc->ani_no = 6; + npc->ani_wait = 0; + npc->ym = 0; + npc->damage = 10; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + PlaySoundObject(25, SOUND_MODE_PLAY); + // Fallthrough + case 211: + if (npc->direct == 0) + npc->xm = -0x800; + else + npc->xm = 0x800; + + if (++npc->act_wait / 2 % 2) + npc->ani_no = 6; + else + npc->ani_no = 7; + + if (npc->direct == 0 && npc->flag & 1) + { + npc->act_no = 212; + npc->act_wait = 0; + npc->damage = 3; + SetQuake2(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + + if (npc->direct == 2 && npc->flag & 4) + { + npc->act_no = 212; + npc->act_wait = 0; + npc->damage = 3; + SetQuake2(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + + if (npc->count1 < 4 && gMC.x > npc->x - (16 * 0x200) && gMC.x < npc->x + (16 * 0x200)) + npc->act_no = 201; + + break; + + case 212: + ++npc->act_wait; + npc->xm = 0; + npc->ani_no = 6; + + if (npc->act_wait > 30) + { + if (npc->count1 > 3) + npc->act_no = 240; + else + npc->act_no = 201; + } + + break; + + case 220: + npc->act_no = 221; + npc->act_wait = 0; + npc->ani_no = 8; + npc->ani_wait = 0; + npc->xm = 0; + npc->damage = 10; + npc->direct = gMirrorMode? 2:0; + PlaySoundObject(25, SOUND_MODE_PLAY); + // Fallthrough + case 221: + npc->ym = -0x800; + + if (++npc->act_wait / 2 % 2) + npc->ani_no = 8; + else + npc->ani_no = 9; + + if (npc->y < (48 * 0x200)) + { + npc->y = (48 * 0x200); + npc->ym = 0; + npc->act_no = 222; + npc->act_wait = 0; + npc->damage = 3; + + for (i = 0; i < 8; ++i) + { + x = npc->x + (Random(-0x10, 0x10) * 0x200); + SetNpChar(4, x, npc->y - (10 * 0x200), 0, 0, 0, NULL, 0x100); + } + + SetNpChar(332, npc->x - (12 * 0x200), npc->y - (12 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(332, npc->x + (12 * 0x200), npc->y - (12 * 0x200), 0, 0, 2, NULL, 0x100); + SetQuake2(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + + if (npc->count1 < 4 && gMC.y > npc->y - (16 * 0x200) && gMC.y < npc->y + (16 * 0x200)) + npc->act_no = 201; + + break; + + case 222: + ++npc->act_wait; + npc->xm = 0; + npc->ani_no = 8; + + if (npc->act_wait > 30) + { + if (npc->count1 > 3) + npc->act_no = 240; + else + npc->act_no = 201; + } + + break; + + case 230: + npc->act_no = 231; + npc->act_wait = 0; + npc->ani_no = 8; + npc->ani_wait = 0; + npc->xm = 0; + npc->damage = 10; + npc->direct = gMirrorMode? 0:2; + PlaySoundObject(25, SOUND_MODE_PLAY); + // Fallthrough + case 231: + npc->ym = 0x800; + + if (++npc->act_wait / 2 % 2) + npc->ani_no = 8; + else + npc->ani_no = 9; + + if (npc->flag & 8) + { + npc->act_no = 232; + npc->act_wait = 0; + npc->damage = 3; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + for (i = 0; i < 8; ++i) + { + x = npc->x + (Random(-0x10, 0x10) * 0x200); + SetNpChar(4, x, npc->y + (10 * 0x200), 0, 0, 0, NULL, 0x100); + } + + SetNpChar(332, npc->x - (12 * 0x200), npc->y + (12 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(332, npc->x + (12 * 0x200), npc->y + (12 * 0x200), 0, 0, 2, NULL, 0x100); + SetQuake2(10); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + + if (npc->count1 < 4 && gMC.y > npc->y - (16 * 0x200) && gMC.y < npc->y + (16 * 0x200)) + npc->act_no = 201; + + break; + + case 232: + ++npc->act_wait; + npc->xm = 0; + npc->ani_no = 3; + + if (npc->act_wait > 30) + { + if (npc->count1 > 3) + npc->act_no = 242; + else + npc->act_no = 201; + } + + break; + + case 240: + npc->act_no = 241; + npc->direct = gMirrorMode? 2:0; + // Fallthrough + case 241: + npc->ym += 0x80; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + if (++npc->ani_wait / 2 % 2) + npc->ani_no = 4; + else + npc->ani_no = 5; + + if (npc->flag & 8) + { + npc->act_no = 242; + npc->act_wait = 0; + npc->ani_no = 3; + + if (gMC.x < npc->x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + } + + break; + + case 242: + npc->xm = 3 * npc->xm / 4; + npc->ani_no = 3; + + if (++npc->act_wait > 10) + npc->act_no = 110; + + break; + + case 300: + npc->act_no = 310; + npc->act_wait = 0; + npc->ym = -0x600; + + if (npc->x > 320 * 0x200) + { + npc->direct = gMirrorMode? 0:2; + npc->tgt_x = gMC.x; + npc->tgt_y = 176 * 0x200; + } + else + { + npc->direct = gMirrorMode? 2:0; + npc->tgt_x = gMC.x; + npc->tgt_y = 176 * 0x200; + } + + npc->ani_wait = 0; + // Fallthrough + case 310: + ++npc->ani_wait; + + if (++npc->act_wait > 200 && npc->ani_wait < 20) + npc->direct = gMirrorMode? 0:2; + else + npc->direct = gMirrorMode? 2:0; + + if (npc->ani_wait / 2 % 2) + npc->ani_no = 4; + else + npc->ani_no = 5; + + if (npc->x < npc->tgt_x) + npc->xm += 0x40; + else + npc->xm -= 0x40; + + if (npc->y < npc->tgt_y) + npc->ym += 0x40; + else + npc->ym -= 0x40; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x400) + npc->ym = 0x400; + if (npc->ym < -0x400) + npc->ym = -0x400; + + if (npc->act_wait > 200 && npc->act_wait % 40 == 1) + { + npc->ani_wait = 0; + SetNpChar(333, gMC.x, 304 * 0x200, 0, 0, 0, NULL, 0x100); + } + + if (npc->act_wait > 480) + { + npc->act_no = 320; + npc->act_wait = 0; + } + + break; + + case 320: + npc->xm = 0; + npc->ym = 0; + npc->direct = gMirrorMode? 0:2; + + if (++npc->act_wait == 40) + SetFlash(0, 0, FLASH_MODE_FLASH); + + if (npc->act_wait > 50 && npc->act_wait % 10 == 1) + { + x = ((4 * npc->act_wait - 200) / 10 + 2) * 0x200 * 0x10; + SetNpChar(333, x, 304 * 0x200, 0, 0, 0, NULL, 0x100); + } + + if (npc->act_wait > 140) + npc->act_no = 240; + + if (++npc->ani_wait / 2 % 2) + npc->ani_no = 4; + else + npc->ani_no = 5; + + break; + + case 1000: + npc->act_no = 1001; + npc->act_wait = 0; + npc->ani_no = 10; + npc->tgt_x = npc->x; + npc->xm = 0; + npc->bits &= ~NPC_SHOOTABLE; + SetDestroyNpChar(npc->x, npc->y, 0x10, 0x10); + PlaySoundObject(72, SOUND_MODE_PLAY); + // Fallthrough + case 1001: + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + if (++npc->act_wait / 2 % 2) + npc->x = npc->tgt_x + 0x200; + else + npc->x = npc->tgt_x - 0x200; + + if (npc->flag & 8) + { + npc->act_no = 1002; + npc->act_wait = 0; + } + + break; + + case 1002: + if (++npc->act_wait > 150) + { + npc->act_wait = 0; + npc->act_no = 1003; + npc->ani_no = 3; + } + + if (npc->act_wait / 2 % 2) + npc->x = npc->tgt_x + 0x200; + else + npc->x = npc->tgt_x - 0x200; + + break; + + case 1003: + if (++npc->act_wait > 30) + { + npc->act_wait = 0; + npc->act_no = 1004; + npc->ani_no = 3; + npc->ym -= 0xA00; + npc->direct = gMirrorMode? 2:0; + npc->bits |= NPC_IGNORE_SOLIDITY; + } + + break; + + case 1004: + if (npc->y < 0) + { + npc->xm = 0; + npc->ym = 0; + npc->act_no = 1005; + npc->act_wait = 0; + SetFlash(0, 0, FLASH_MODE_FLASH); + PlaySoundObject(29, SOUND_MODE_PLAY); + } + + if (++npc->act_wait / 2 % 2) + npc->ani_no = 8; + else + npc->ani_no = 9; + + break; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + RECT rcLeft[11] = { + {0, 0, 48, 40}, + {48, 0, 96, 40}, + {96, 0, 144, 40}, + {144, 0, 192, 40}, + {192, 0, 240, 40}, + {240, 0, 288, 40}, + {0, 80, 48, 120}, + {48, 80, 96, 120}, + {96, 80, 144, 120}, + {144, 80, 192, 120}, + {192, 80, 240, 120}, + }; + + RECT rcRight[11] = { + {0, 40, 48, 80}, + {48, 40, 96, 80}, + {96, 40, 144, 80}, + {144, 40, 192, 80}, + {192, 40, 240, 80}, + {240, 40, 288, 80}, + {0, 120, 48, 160}, + {48, 120, 96, 160}, + {96, 120, 144, 160}, + {144, 120, 192, 160}, + {192, 120, 240, 160}, + }; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Ballos 1 head +void ActNpc341(NPCHAR *npc) +{ + RECT rc[3] = { + {288, 32, 320, 48}, + {288, 48, 320, 64}, + {288, 64, 320, 80}, + }; + + if (npc->pNpc->act_no == 11 && npc->pNpc->act_wait > 50) + ++npc->ani_wait; + + if (npc->ani_wait > 4) + { + npc->ani_wait = 0; + + if (npc->ani_no < 2) + ++npc->ani_no; + } + + if (npc->pNpc->ani_no) + npc->cond = 0; + + npc->rect = rc[npc->ani_no]; +} + +// Ballos 3 eye +void ActNpc342(NPCHAR *npc) +{ + static int flash; + + RECT rc[3] = { + {240, 48, 280, 88}, + {240, 88, 280, 128}, + {280, 48, 320, 88}, + }; + + unsigned char deg; + + if (npc->act_no < 1000 && npc->pNpc->act_no >= 1000) + npc->act_no = 1000; + + switch (npc->act_no) + { + case 0: + npc->act_no = 10; + npc->count1 = (npc->direct & 0xFF) * 2; + npc->direct >>= 8; + npc->count2 = 0xC0; + npc->damage = 14; + // Fallthrough + case 10: + if (npc->count2 < 320) + npc->count2 += 8; + else + npc->act_no = 11; + + break; + + case 11: + if (npc->count2 > 304) + npc->count2 -= 4; + else + npc->act_no = 12; + + break; + + case 12: + if (npc->pNpc->act_no == 311) + npc->act_no = 20; + + break; + + case 20: + npc->act_no = 21; + npc->bits |= NPC_SHOOTABLE; + npc->life = 1000; + // Fallthrough + case 21: + npc->count1 -= 2; + + if (npc->count1 < 0) + npc->count1 += 0x200; + + if (npc->shock) + { + if (++flash / 2 % 2) + npc->ani_no = 1; + else + npc->ani_no = 0; + } + else + { + npc->ani_no = 0; + } + + if (npc->life < 900) + { + npc->act_no = 22; + npc->bits &= ~NPC_SHOOTABLE; + SetDestroyNpChar(npc->x, npc->y, 0x2000, 0x20); + PlaySoundObject(71, SOUND_MODE_PLAY); + } + + npc->pNpc->count1 = 4; + + if (npc->pNpc->act_no == 401) + npc->act_no = 23; + + break; + + case 22: + npc->ani_no = 2; + npc->count1 -= 2; + + if (npc->count1 < 0) + npc->count1 += 0x200; + + if (npc->pNpc->act_no == 401) + npc->act_no = 23; + + break; + + case 23: + npc->ani_no = 2; + npc->count1 -= 4; + + if (npc->count1 < 0) + npc->count1 += 0x200; + + if (npc->pNpc->act_no == 420) + npc->act_no = 30; + + break; + + case 30: + npc->act_no = 31; + npc->life = 1000; + npc->damage = 10; + + if (npc->direct == 0) + npc->bits |= NPC_SHOOTABLE; + + npc->ym = 0; + // Fallthrough + case 31: + ++npc->count1; + npc->count1 %= 0x200; + + if (npc->count2 > 0x100) + --npc->count2; + + if (npc->bits & NPC_SHOOTABLE) + { + if (npc->shock) + { + if (++flash / 2 % 2) + npc->ani_no = 1; + else + npc->ani_no = 0; + } + else + { + npc->ani_no = 0; + } + } + else + { + npc->ani_no = 2; + } + + if (npc->life < 900) + npc->act_no = 40; + + break; + + case 40: + npc->act_no = 41; + npc->xm = 0; + npc->ym = 0; + npc->ani_no = 2; + npc->damage = 5; + npc->bits &= ~(NPC_IGNORE_SOLIDITY | NPC_SHOOTABLE); + SetDestroyNpChar(npc->x, npc->y, 0x2000, 0x20); + PlaySoundObject(71, SOUND_MODE_PLAY); + // Fallthrough + case 41: + if (npc->flag & 1) + npc->xm = 0x100; + + if (npc->flag & 4) + npc->xm = -0x100; + + if (npc->flag & 8) + { + if (npc->xm == 0) + { + if (gMC.x < npc->x) + npc->xm = 0x100; + else + npc->xm = -0x100; + } + + npc->ym = -0x800; + PlaySoundObject(26, SOUND_MODE_PLAY); + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + break; + + case 1000: + npc->act_no = 1001; + npc->xm = 0; + npc->ym = 0; + npc->ani_no = 2; + npc->bits &= ~(NPC_IGNORE_SOLIDITY | NPC_SHOOTABLE); + npc->damage = 0; + npc->count1 /= 4; + npc->exp = 0; + // Fallthrough + case 1001: + if (npc->count1 > 0) + { + if (--npc->count1 / 2 % 2) + npc->ani_no = 1; + else + npc->ani_no = 0; + } + else + { + SetDestroyNpChar(npc->x, npc->y, 0x2000, 0x20); + PlaySoundObject(71, SOUND_MODE_PLAY); + VanishNpChar(npc); + return; + } + + break; + } + + if (npc->act_no == 21 || npc->act_no == 22) + { + switch (npc->pNpc->direct) + { + case 0: + if (npc->count1 == 140) + { + SetNpChar(4, npc->x + (8 * 0x200), npc->y + 0x1800, 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x - (8 * 0x200), npc->y + 0x1800, 0, 0, 0, NULL, 0x100); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + break; + + case 1: + if (npc->count1 == 268) + { + SetNpChar(4, npc->x - (12 * 0x200), npc->y + (8 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x - (12 * 0x200), npc->y - (8 * 0x200), 0, 0, 0, NULL, 0x100); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + break; + + case 2: + if (npc->count1 == 396) + { + SetNpChar(4, npc->x + (8 * 0x200), npc->y - (12 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x - (8 * 0x200), npc->y - (12 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(345, npc->x - (8 * 0x200), npc->y - (12 * 0x200), 0, 0, 0, NULL, 0x100); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + break; + + case 3: + if (npc->count1 == 12) + { + SetNpChar(4, npc->x + (12 * 0x200), npc->y + (8 * 0x200), 0, 0, 0, NULL, 0x100); + SetNpChar(4, npc->x + (12 * 0x200), npc->y - (8 * 0x200), 0, 0, 0, NULL, 0x100); + PlaySoundObject(26, SOUND_MODE_PLAY); + } + break; + } + } + + if (npc->act_no < 40) + { + deg = npc->count1 / 2; + + npc->tgt_x = npc->pNpc->x + npc->count2 * GetCos(deg) / 4; + npc->tgt_y = npc->pNpc->y + npc->count2 * GetSin(deg) / 4; + + npc->xm = npc->tgt_x - npc->x; + npc->ym = npc->tgt_y - npc->y; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rc[npc->ani_no]; +} + +// Ballos 2 cutscene +void ActNpc343(NPCHAR *npc) +{ + RECT rc = {0, 0, 120, 120}; + + npc->rect = rc; + + if (++npc->act_wait > 100) + npc->cond = 0; + + npc->x = npc->pNpc->x; + npc->y = npc->pNpc->y; +} + +// Ballos 2 eyes +void ActNpc344(NPCHAR *npc) +{ + RECT rc[2] = { + {272, 0, 296, 16}, + {296, 0, 320, 16}, + }; + + if (npc->direct == 0) + { + npc->rect = rc[0]; + npc->x = npc->pNpc->x - (24 * 0x200); + } + else + { + npc->rect = rc[1]; + npc->x = npc->pNpc->x + (24 * 0x200); + } + + if (++npc->act_wait > 100) + npc->cond = 0; + + npc->y = npc->pNpc->y - (36 * 0x200); +} + +// Ballos skull projectile +void ActNpc345(NPCHAR *npc) +{ + RECT rc[4] = { + {128, 176, 144, 192}, + {144, 176, 160, 192}, + {160, 176, 176, 192}, + {176, 176, 192, 192}, + }; + + int i; + + switch (npc->act_no) + { + case 0: + npc->act_no = 100; + npc->ani_no = Random(0, 16) % 4; + // Fallthrough + case 100: + npc->ym += 0x40; + if (npc->ym > 0x700) + npc->ym = 0x700; + + if (npc->y > 128 * 0x200) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + if (npc->act_wait++ / 2 % 2) + SetNpChar(4, npc->x, npc->y, 0, 0, 0, NULL, 0x100); + + if (npc->flag & 8) + { + npc->ym = -0x200; + npc->act_no = 110; + npc->bits |= NPC_IGNORE_SOLIDITY; + PlaySoundObject(12, SOUND_MODE_PLAY); + SetQuake(10); + + for (i = 0; i < 4; ++i) + SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (16 * 0x200), Random(-341, 341), Random(-0x600, 0), 0, NULL, 0x100); + } + + break; + + case 110: + npc->ym += 0x40; + + if (npc->y > (gMap.length * 0x200 * 0x10) + (2 * 0x200 * 0x10)) + { + npc->cond = 0; + return; + } + + break; + } + + if (++npc->ani_wait > 8) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + npc->y += npc->ym; + + npc->rect = rc[npc->ani_no]; +} + +// Ballos 4 orbiting platform +void ActNpc346(NPCHAR *npc) +{ + RECT rc = {240, 0, 272, 16}; + unsigned char deg; + + if (npc->act_no < 1000 && npc->pNpc->act_no >= 1000) + npc->act_no = 1000; + + switch (npc->act_no) + { + case 0: + npc->act_no = 10; + npc->count1 = npc->direct * 4; + npc->count2 = 192; + npc->ani_no = 0; + // Fallthrough + case 10: + if (npc->count2 < 448) + npc->count2 += 8; + else + npc->act_no = 11; + + break; + + case 11: + if (npc->pNpc->act_no == 411) + npc->act_no = 20; + + break; + + case 20: + if (--npc->count1 < 0) + npc->count1 += 0x400; + + if (npc->pNpc->act_no == 421) + npc->act_no = 40; + if (npc->pNpc->act_no == 423) + npc->act_no = 100; + + break; + + case 30: + ++npc->count1; + npc->count1 %= 0x400; + + if (npc->pNpc->act_no == 425) + npc->act_no = 50; + if (npc->pNpc->act_no == 427) + npc->act_no = 100; + + break; + + case 40: + npc->count1 -= 2; + + if (npc->count1 < 0) + npc->count1 += 0x400; + + if (npc->pNpc->act_no == 422) + npc->act_no = 20; + + break; + + case 50: + npc->count1 += 2; + npc->count1 %= 0x400; + + if (npc->pNpc->act_no == 426) + npc->act_no = 30; + + break; + + case 100: + npc->ani_no = 0; + + if (npc->pNpc->act_no == 424) + npc->act_no = 30; + if (npc->pNpc->act_no == 428) + npc->act_no = 20; + + break; + + case 1000: + npc->act_no = 1001; + npc->xm = 0; + npc->ym = 0; + npc->bits &= ~NPC_SOLID_HARD; + // Fallthrough + case 1001: + npc->ym += 0x40; + + if (npc->y > gMap.length * 0x10 * 0x200) + npc->cond = 0; + + break; + } + + if (npc->act_no < 1000) + { + if (gMC.y > npc->y - 0x1000 && gMC.ym < 0) + npc->bits &= ~NPC_SOLID_HARD; + else + npc->bits |= NPC_SOLID_HARD; + + deg = npc->count1 / 4; + npc->tgt_x = npc->pNpc->x + npc->count2 * GetCos(deg) / 4; + npc->tgt_y = npc->pNpc->y + (16 * 0x200) + npc->count2 * GetSin(deg) / 4; + + npc->xm = npc->tgt_x - npc->x; + + if (npc->act_no == 20 || npc->act_no == 30) + { + if (npc->count1 % 4 == 0) + npc->ani_no = (npc->tgt_y - npc->y) / 4; + } + else if (npc->act_no == 40 || npc->act_no == 50) + { + if ((npc->count1 / 2 % 2) == 0) + npc->ani_no = (npc->tgt_y - npc->y) / 2; + } + else + { + npc->ani_no = npc->tgt_y - npc->y; + } + + npc->ym = npc->ani_no; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + npc->rect = rc; +} + +// Hoppy +void ActNpc347(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + npc->ani_no = 0; + + if (gMC.y < npc->y + (128 * 0x200) && gMC.y > npc->y - (128 * 0x200)) + { + npc->act_no = 10; + npc->act_wait = 0; + npc->ani_no = 1; + } + + break; + + case 10: + if (++npc->act_wait == 4) + npc->ani_no = 2; + + if (npc->act_wait > 12) + { + npc->act_no = 12; + npc->xm = 0x700; + PlaySoundObject(6, SOUND_MODE_PLAY); + npc->ani_no = 3; + } + + break; + + case 12: + if (gMC.y < npc->y) + npc->ym = -0xAA; + else + npc->ym = 0xAA; + + if (npc->flag & 1) + { + npc->act_no = 13; + npc->act_wait = 0; + npc->ani_no = 2; + npc->xm = 0; + npc->ym = 0; + break; + } + + npc->xm -= 42; + + if (npc->xm < -0x5FF) + npc->xm = -0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + break; + + case 13: + ++npc->act_wait; + + if (npc->act_wait == 2) + npc->ani_no = 1; + + if (npc->act_wait == 6) + npc->ani_no = 0; + + if (npc->act_wait > 16) + npc->act_no = 1; + + break; + } + + RECT rc[4] = { + {256, 48, 272, 64}, + {272, 48, 288, 64}, + {288, 48, 304, 64}, + {304, 48, 320, 64}, + }; + + npc->rect = rc[npc->ani_no]; +} + +// Ballos 4 spikes +void ActNpc348(NPCHAR *npc) +{ + RECT rc[2] = { + {128, 152, 160, 176}, + {160, 152, 192, 176}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + // Fallthrough + case 1: + if (++npc->act_wait < 0x80) + { + npc->y -= 0x80; + + if (npc->act_wait / 2 % 2) + npc->ani_no = 1; + else + npc->ani_no = 0; + } + else + { + npc->act_no = 10; + npc->ani_no = 0; + npc->damage = 2; + } + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Statue +void ActNpc349(NPCHAR *npc) +{ + RECT rect = {0, 0, 16, 16}; + + if (npc->act_no == 0) + { + npc->act_no = 1; + + if (npc->direct == 0) + npc->x += 8 * 0x200; + if (npc->direct == 2) + npc->y += 16 * 0x200; + } + + npc->rect = rect; +} + +// Flying Bute archer +void ActNpc350(NPCHAR *npc) +{ + RECT rcLeft[7] = { + {0, 160, 24, 184}, + {24, 160, 48, 184}, + {48, 160, 72, 184}, + {72, 160, 96, 184}, + {96, 160, 120, 184}, + {120, 160, 144, 184}, + {144, 160, 168, 184}, + }; + + RECT rcRight[7] = { + {0, 184, 24, 208}, + {24, 184, 48, 208}, + {48, 184, 72, 208}, + {72, 184, 96, 208}, + {96, 184, 120, 208}, + {120, 184, 144, 208}, + {144, 184, 168, 208}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + if (npc->direct == 0) + npc->tgt_x = npc->x - (128 * 0x200); + else + npc->tgt_x = npc->x + (128 * 0x200); + + npc->tgt_y = npc->y; + npc->ym = Random(-0x200, 0x200) * 2; + npc->xm = Random(-0x200, 0x200) * 2; + // Fallthrough + case 1: + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 1) + npc->ani_no = 0; + } + + if (npc->direct == 0) + { + if (npc->x < npc->tgt_x) + npc->act_no = 20; + } + else + { + if (npc->x > npc->tgt_x) + npc->act_no = 20; + } + + break; + + case 20: + npc->act_no = 21; + npc->act_wait = Random(0, 150); + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 21: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 3) + npc->ani_no = 2; + } + + if (++npc->act_wait > 300) + npc->act_no = 30; + + if (gMC.x < npc->x + (112 * 0x200) && gMC.x > npc->x - (112 * 0x200) && gMC.y < npc->y + (16 * 0x200) && gMC.y > npc->y - (16 * 0x200)) + npc->act_no = 30; + + break; + + case 30: + npc->act_no = 31; + npc->act_wait = 0; + npc->ani_wait = 0; + // Fallthrough + case 31: + if (++npc->ani_wait / 2 % 2) + npc->ani_no = 3; + else + npc->ani_no = 4; + + if (++npc->act_wait > 30) + { + npc->act_no = 40; + npc->ani_no = 5; + + if (npc->direct == 0) + SetNpChar(312, npc->x, npc->y, -0x800, 0, 0, NULL, 0x199); + else + SetNpChar(312, npc->x, npc->y, 0x800, 0, 2, NULL, 0x199); + } + + break; + + case 40: + npc->act_no = 41; + npc->act_wait = 0; + npc->ani_wait = 0; + // Fallthrough + case 41: + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 6) + npc->ani_no = 5; + } + + if (++npc->act_wait > 40) + { + npc->act_no = 50; + npc->ani_no = 0; + npc->xm = 0; + npc->ym = 0; + } + + break; + + case 50: + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 1) + npc->ani_no = 0; + } + + if (npc->direct == 0) + npc->xm -= 0x20; + else + npc->xm += 0x20; + + if (npc->x < 0 || npc->x > gMap.width * 0x200 * 0x10) + { + VanishNpChar(npc); + return; + } + + break; + } + + if (npc->act_no < 50) + { + if (npc->x < npc->tgt_x) + npc->xm += 0x2A; + if (npc->x > npc->tgt_x) + npc->xm -= 0x2A; + + if (npc->y < npc->tgt_y) + npc->ym += 0x2A; + if (npc->y > npc->tgt_y) + npc->ym -= 0x2A; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x400) + npc->ym = 0x400; + if (npc->ym < -0x400) + npc->ym = -0x400; + } + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; +} + +// Statue (shootable) +void ActNpc351(NPCHAR *npc) +{ + RECT rc[9] = { + {0, 96, 32, 136}, + {32, 96, 64, 136}, + {64, 96, 96, 136}, + {96, 96, 128, 136}, + {128, 96, 160, 136}, + {0, 176, 32, 216}, + {32, 176, 64, 216}, + {64, 176, 96, 216}, + {96, 176, 128, 216}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = npc->direct / 10; + npc->x += 8 * 0x200; + npc->y += 12 * 0x200; + break; + + case 10: + if (GetNPCFlag(npc->code_flag)) + { + npc->act_no = 20; + } + else + { + npc->act_no = 11; + npc->bits |= NPC_SHOOTABLE; + } + // Fallthrough + case 11: + if (npc->life <= 900) + { + SetNpChar(351, npc->x - (8 * 0x200), npc->y - (12 * 0x200), 0, 0, (npc->ani_no + 4) * 10, NULL, 0); + npc->cond |= 8; + } + + break; + + case 20: + npc->ani_no += 4; + npc->act_no = 1; + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Ending characters +void ActNpc352(NPCHAR *npc) +{ + switch (npc->act_no) + { + case 0: + // Set state + npc->act_no = 1; + npc->ani_no = 0; + npc->count1 = npc->direct / 100; + npc->direct %= 100; + + // Set surfaces / offset + switch (npc->count1) + { + case 7: + case 8: + case 9: + case 12: + case 13: + npc->surf = SURFACE_ID_LEVEL_SPRITESET_1; + break; + } + + switch (npc->count1) + { + case 2: + case 4: + case 9: + case 12: + npc->view.top = 16 * 0x200; + break; + } + + // Balrog + if (npc->count1 == 9) + { + npc->view.back = 20 * 0x200; + npc->view.front = 20 * 0x200; + npc->x -= 1 * 0x200; + } + + // Spawn King's sword + if (npc->count1 == 0) + SetNpChar(145, 0, 0, 0, 0, 2, npc, 0x100); + // Fallthrough + case 1: + npc->ym += 0x40; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + if (npc->flag & 8) + { + npc->ym = 0; + npc->act_no = 2; + npc->ani_no = 1; + } + + npc->y += npc->ym; + + break; + } + + RECT rc[28] = { + {304, 48, 320, 64}, + {224, 48, 240, 64}, + {32, 80, 48, 96}, + {0, 80, 16, 96}, + {224, 216, 240, 240}, + {192, 216, 208, 240}, + {48, 16, 64, 32}, + {0, 16, 16, 32}, + {112, 192, 128, 216}, + {80, 192, 96, 216}, + {304, 0, 320, 16}, + {224, 0, 240, 16}, + {176, 32, 192, 48}, + {176, 32, 192, 48}, + {240, 16, 256, 32}, + {224, 16, 240, 32}, + {208, 16, 224, 32}, + {192, 16, 208, 32}, + {280, 128, 320, 152}, + {280, 152, 320, 176}, + {32, 112, 48, 128}, + {0, 112, 16, 128}, + {80, 0, 96, 16}, + {112, 0, 128, 16}, + {16, 152, 32, 176}, + {0, 152, 16, 176}, + {48, 16, 64, 32}, + {48, 0, 64, 16} + }; + + npc->rect = rc[npc->ani_no + (npc->count1 * 2)]; +} + +// Bute with sword (flying) +void ActNpc353(NPCHAR *npc) +{ + RECT rc[4] = { + {168, 160, 184, 184}, + {184, 160, 200, 184}, + {168, 184, 184, 208}, + {184, 184, 200, 208}, + }; + + RECT rcLeft[2] = { + {200, 160, 216, 176}, + {216, 160, 232, 176}, + }; + + RECT rcRight[2] = { + {200, 176, 216, 192}, + {216, 176, 232, 192}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + + switch (npc->direct) + { + case 0: + npc->xm = -0x600; + break; + + case 2: + npc->xm = 0x600; + break; + + case 1: + npc->ym = -0x600; + break; + + case 3: + npc->ym = 0x600; + break; + } + // Fallthrough + case 1: + ++npc->act_wait; + + if (npc->act_wait == 8) + npc->bits &= ~NPC_IGNORE_SOLIDITY; + + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->act_wait == 0x10) + npc->act_no = 10; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 3) + npc->ani_no = 0; + } + + npc->rect = rc[npc->ani_no]; + break; + + case 10: + npc->act_no = 11; + npc->ani_no = 0; + npc->bits |= NPC_SHOOTABLE; + npc->bits &= ~NPC_IGNORE_SOLIDITY; + npc->damage = 5; + npc->view.top = 8 * 0x200; + // Fallthrough + case 11: + if (npc->x > gMC.x) + npc->direct = gMirrorMode? 2:0; + else + npc->direct = gMirrorMode? 0:2; + + if (gMC.y - (24 * 0x200) > npc->y) + { + if (npc->direct == 0) + npc->xm2 += 0x10; + else + npc->xm2 -= 0x10; + } + else + { + if (npc->direct == 0) + npc->xm2 -= 0x10; + else + npc->xm2 += 0x10; + } + + if (npc->y > gMC.y) + npc->ym2 -= 0x10; + else + npc->ym2 += 0x10; + + if (npc->xm2 < 0 && npc->flag & 1) + npc->xm2 *= -1; + if (npc->xm2 > 0 && npc->flag & 4) + npc->xm2 *= -1; + + if (npc->ym2 < 0 && npc->flag & 2) + npc->ym2 *= -1; + if (npc->ym2 > 0 && npc->flag & 8) + npc->ym2 *= -1; + + if (npc->xm2 < -0x5FF) + npc->xm2 = -0x5FF; + if (npc->xm2 > 0x5FF) + npc->xm2 = 0x5FF; + + if (npc->ym2 < -0x5FF) + npc->ym2 = -0x5FF; + if (npc->ym2 > 0x5FF) + npc->ym2 = 0x5FF; + + npc->x += npc->xm2; + npc->y += npc->ym2; + + if (++npc->ani_wait > 1) + { + npc->ani_wait = 0; + + if (++npc->ani_no > 1) + npc->ani_no = 0; + } + + if (npc->direct == 0) + npc->rect = rcLeft[npc->ani_no]; + else + npc->rect = rcRight[npc->ani_no]; + + break; + } +} + +// Invisible deathtrap wall +void ActNpc354(NPCHAR *npc) +{ + int i, x, y; + + switch (npc->act_no) + { + case 0: + npc->hit.bottom = 280 * 0x200; + break; + + case 10: + npc->act_no = 11; + npc->act_wait = 0; + + if (npc->direct == 0) + npc->x += 16 * 0x200; + else + npc->x -= 16 * 0x200; + // Fallthrough + case 11: + if (++npc->act_wait > 100) + { + npc->act_wait = 0; + SetQuake(20); + PlaySoundObject(26, SOUND_MODE_PLAY); + PlaySoundObject(12, SOUND_MODE_PLAY); + + if (npc->direct == 0) + npc->x -= 16 * 0x200; + else + npc->x += 16 * 0x200; + + for (i = 0; i < 20; ++i) + { + x = (npc->x / 0x200 / 0x10); + y = (npc->y / 0x200 / 0x10) + i; + ChangeMapParts(x, y, 109); + } + } + + break; + } +} + +// Quote and Curly on Balrog's back +void ActNpc355(NPCHAR *npc) +{ + RECT rc[4] = { + {80, 16, 96, 32}, + {80, 96, 96, 112}, + {128, 16, 144, 32}, + {208, 96, 224, 112}, + }; + + switch (npc->act_no) + { + case 0: + switch (npc->direct) + { + case 0: + npc->surf = SURFACE_ID_MY_CHAR; + npc->ani_no = 0; + npc->x = npc->pNpc->x - (14 * 0x200); + npc->y = npc->pNpc->y + (10 * 0x200); + break; + + case 1: + npc->surf = SURFACE_ID_NPC_REGU; + npc->ani_no = 1; + npc->x = npc->pNpc->x + (14 * 0x200); + npc->y = npc->pNpc->y + (10 * 0x200); + break; + + case 2: + npc->surf = SURFACE_ID_MY_CHAR; + npc->ani_no = 2; + npc->x = npc->pNpc->x - (7 * 0x200); + npc->y = npc->pNpc->y - (19 * 0x200); + break; + + case 3: + npc->surf = SURFACE_ID_NPC_REGU; + npc->ani_no = 3; + npc->x = npc->pNpc->x + (4 * 0x200); + npc->y = npc->pNpc->y - (19 * 0x200); + break; + } + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Balrog rescue +void ActNpc356(NPCHAR *npc) +{ + RECT rcRight[2] = { + {240, 128, 280, 152}, + {240, 152, 280, 176}, + }; + + switch (npc->act_no) + { + case 0: + npc->act_no = 11; + npc->ani_wait = 0; + npc->tgt_y = npc->y - (16 * 0x200); + npc->tgt_x = npc->x - (6 * 0x200); + npc->ym = 0; + SetNpChar(355, 0, 0, 0, 0, 3, npc, 0xAA); + SetNpChar(355, 0, 0, 0, 0, 2, npc, 0xAA); + // Fallthrough + case 11: + if (npc->x < npc->tgt_x) + npc->xm += 8; + else + npc->xm -= 8; + + if (npc->y < npc->tgt_y) + npc->ym += 8; + else + npc->ym -= 8; + + npc->x += npc->xm; + npc->y += npc->ym; + + break; + + case 20: + npc->act_no = 21; + npc->xm = -0x400; + npc->ym = 0x200; + // Fallthrough + case 21: + ++npc->ani_wait; + npc->xm += 0x10; + npc->ym -= 8; + npc->x += npc->xm; + npc->y += npc->ym; + + if (npc->x > 60 * 0x10 * 0x200) + npc->act_no = 22; + + break; + + case 22: + npc->xm = 0; + npc->ym = 0; + break; + } + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + npc->rect = rcRight[npc->ani_no]; +} + +// Puppy ghost +void ActNpc357(NPCHAR *npc) +{ + RECT rc = {224, 136, 240, 152}; + + switch (npc->act_no) + { + case 0: + npc->rect = rc; + ++npc->act_wait; + break; + + case 10: + npc->act_wait = 0; + npc->act_no = 11; + PlaySoundObject(29, SOUND_MODE_PLAY); + // Fallthrough + case 11: + ++npc->act_wait; + npc->rect = rc; + + if (npc->act_wait / 2 % 2) + npc->rect.right = npc->rect.left; + + if (npc->act_wait > 50) + npc->cond = 0; + + break; + } + + if (npc->act_wait % 8 == 1) + SetCaret(npc->x + (Random(-8, 8) * 0x200), npc->y + 0x1000, CARET_TINY_PARTICLES, DIR_UP); +} + +// Misery (stood in the wind during the credits) +void ActNpc358(NPCHAR *npc) +{ + RECT rc[5] = { + {208, 8, 224, 32}, + {224, 8, 240, 32}, + {240, 8, 256, 32}, + {256, 8, 272, 32}, + {272, 8, 288, 32}, + }; + + switch (npc->act_no) + { + case 0: + if (++npc->ani_wait > 6) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + break; + + case 10: + if (++npc->ani_wait > 6) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 3; + + break; + } + + npc->rect = rc[npc->ani_no]; +} + +// Water droplet generator +void ActNpc359(NPCHAR *npc) +{ + int x; + + if (gMC.x < npc->x + (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.x > npc->x - (((WINDOW_WIDTH / 2) + 160) * 0x200) && gMC.y < npc->y + (((WINDOW_HEIGHT / 2) + 200) * 0x200) && gMC.y > npc->y - (((WINDOW_HEIGHT / 2) + 40) * 0x200) && Random(0, 100) == 2) + { + x = npc->x + (Random(-6, 6) * 0x200); + SetNpChar(73, x, npc->y - (7 * 0x200), 0, 0, 0, 0, 0); + } +} + +// "Thank you" message at the end of the credits +void ActNpc360(NPCHAR *npc) +{ + RECT rc = {0, 176, 48, 184}; + + if (npc->act_no == 0) + { + ++npc->act_no; + npc->x -= 8 * 0x200; + npc->y -= 8 * 0x200; + } + + npc->rect = rc; +} diff --git a/src/NpcHit.cpp b/src/NpcHit.cpp new file mode 100644 index 0000000..59707d7 --- /dev/null +++ b/src/NpcHit.cpp @@ -0,0 +1,641 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcHit.h" + +#include "WindowsWrapper.h" + +#include "Back.h" +#include "Bullet.h" +#include "Caret.h" +#include "CommonDefines.h" +#include "Flags.h" +#include "Game.h" +#include "Map.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Sound.h" +#include "TextScr.h" +#include "ValueView.h" + +BOOL gbNoExpDrops; + +void JadgeHitNpCharBlock(NPCHAR *npc, int x, int y) +{ + int hit = 0; + + if (npc->y - npc->hit.top < (y * 0x10 + 5) * 0x200 + && npc->y + npc->hit.bottom > (y * 0x10 - 5) * 0x200 + && npc->x - npc->hit.back < (x * 0x10 + 8) * 0x200 + && npc->x - npc->hit.back > x * 0x10 * 0x200) + { + npc->x = ((x * 0x10 + 8) * 0x200) + npc->hit.back; + hit |= 1; + } + + if (npc->y - npc->hit.top < (y * 0x10 + 5) * 0x200 + && npc->y + npc->hit.bottom > (y * 0x10 - 5) * 0x200 + && npc->x + npc->hit.back > (x * 0x10 - 8) * 0x200 + && npc->x + npc->hit.back < x * 0x10 * 0x200) + { + npc->x = ((x * 0x10 - 8) * 0x200) - npc->hit.back; + hit |= 4; + } + + if (npc->x - npc->hit.back < (x * 0x10 + 5) * 0x200 + && npc->x + npc->hit.back > (x * 0x10 - 5) * 0x200 + && npc->y - npc->hit.top < (y * 0x10 + 8) * 0x200 + && npc->y - npc->hit.top > y * 0x10 * 0x200) + { + npc->y = ((y * 0x10 + 8) * 0x200) + npc->hit.top; + npc->ym = 0; + hit |= 2; + } + + if (npc->x - npc->hit.back < (x * 0x10 + 5) * 0x200 + && npc->x + npc->hit.back > (x * 0x10 - 5) * 0x200 + && npc->y + npc->hit.bottom > (y * 0x10 - 8) * 0x200 + && npc->y + npc->hit.bottom < y * 0x10 * 0x200) + { + npc->y = ((y * 0x10 - 8) * 0x200) - npc->hit.bottom; + npc->ym = 0; + hit |= 8; + } + + npc->flag |= hit; +} + +void JudgeHitNpCharTriangleA(NPCHAR *npc, int x, int y) +{ + int hit = 0; + + if (npc->x < (x * 0x10 + 8) * 0x200 + && npc->x > (x * 0x10 - 8) * 0x200 + && npc->y - npc->hit.top < (y * 0x10 * 0x200) - ((npc->x - (x * 0x10 * 0x200)) / 2) + 0x800 + && npc->y + npc->hit.bottom > (y * 0x10 - 8) * 0x200) + { + // Clip + npc->y = (y * 0x10 * 0x200) - ((npc->x - (x * 0x10 * 0x200)) / 2) + 0x800 + npc->hit.top; + + // Halt momentum + if (npc->ym < 0) + npc->ym = 0; + + // Set that hit a ceiling + hit |= 2; + } + + npc->flag |= hit; +} + +void JudgeHitNpCharTriangleB(NPCHAR *npc, int x, int y) +{ + int hit = 0; + + if (npc->x < (x * 0x10 + 8) * 0x200 + && npc->x > (x * 0x10 - 8) * 0x200 + && npc->y - npc->hit.top < (y * 0x10 * 0x200) - ((npc->x - (x * 0x10 * 0x200)) / 2) - 0x800 + && npc->y + npc->hit.bottom > (y * 0x10 - 8) * 0x200) + { + // Clip + npc->y = (y * 0x10 * 0x200) - ((npc->x - (x * 0x10 * 0x200)) / 2) - 0x800 + npc->hit.top; + + // Halt momentum + if (npc->ym < 0) + npc->ym = 0; + + // Set that hit a ceiling + hit |= 2; + } + + npc->flag |= hit; +} + +void JudgeHitNpCharTriangleC(NPCHAR *npc, int x, int y) +{ + int hit = 0; + + if (npc->x < (x * 0x10 + 8) * 0x200 + && npc->x > (x * 0x10 - 8) * 0x200 + && npc->y - npc->hit.top < (y * 0x10 * 0x200) + ((npc->x - (x * 0x10 * 0x200)) / 2) - 0x800 + && npc->y + npc->hit.bottom > (y * 0x10 - 8) * 0x200) + { + // Clip + npc->y = (y * 0x10 * 0x200) + ((npc->x - (x * 0x10 * 0x200)) / 2) - 0x800 + npc->hit.top; + + // Halt momentum + if (npc->ym < 0) + npc->ym = 0; + + // Set that hit a ceiling + hit |= 2; + } + + npc->flag |= hit; +} + +void JudgeHitNpCharTriangleD(NPCHAR *npc, int x, int y) +{ + int hit = 0; + + if (npc->x < (x * 0x10 + 8) * 0x200 + && npc->x > (x * 0x10 - 8) * 0x200 + && npc->y - npc->hit.top < (y * 0x10 * 0x200) + ((npc->x - (x * 0x10 * 0x200)) / 2) + 0x800 + && npc->y + npc->hit.bottom > (y * 0x10 - 8) * 0x200) + { + // Clip + npc->y = (y * 0x10 * 0x200) + ((npc->x - (x * 0x10 * 0x200)) / 2) + 0x800 + npc->hit.top; + + // Halt momentum + if (npc->ym < 0) + npc->ym = 0; + + // Set that hit a ceiling + hit |= 2; + } + + npc->flag |= hit; +} + +void JudgeHitNpCharTriangleE(NPCHAR *npc, int x, int y) +{ + int hit = 0; + + hit |= 0x10000; + + if (npc->x < (x * 0x10 + 8) * 0x200 + && npc->x > (x * 0x10 - 8) * 0x200 + && npc->y + npc->hit.bottom > (y * 0x10 * 0x200) + ((npc->x - (x * 0x10 * 0x200)) / 2) - 0x800 + && npc->y - npc->hit.top < (y * 0x10 + 8) * 0x200) + { + // Clip + npc->y = (y * 0x10 * 0x200) + ((npc->x - (x * 0x10 * 0x200)) / 2) - 0x800 - npc->hit.bottom; + + // Halt momentum + if (npc->ym > 0) + npc->ym = 0; + + // Set that hit this slope + hit |= 0x28; + } + + npc->flag |= hit; +} + +void JudgeHitNpCharTriangleF(NPCHAR *npc, int x, int y) +{ + int hit = 0; + + hit |= 0x20000; + + if (npc->x < (x * 0x10 + 8) * 0x200 + && npc->x >= (x * 0x10 - 8) * 0x200 // Note that this function uses '>='. I'm not sure if this is a bug. + && npc->y + npc->hit.bottom > (y * 0x10 * 0x200) + ((npc->x - (x * 0x10 * 0x200)) / 2) + 0x800 + && npc->y - npc->hit.top < (y * 0x10 + 8) * 0x200) + { + // Clip + npc->y = (y * 0x10 * 0x200) + ((npc->x - (x * 0x10 * 0x200)) / 2) + 0x800 - npc->hit.bottom; + + // Halt momentum + if (npc->ym > 0) + npc->ym = 0; + + // Set that hit this slope + hit |= 0x28; + } + + npc->flag |= hit; +} + +void JudgeHitNpCharTriangleG(NPCHAR *npc, int x, int y) +{ + int hit = 0; + + hit |= 0x40000; + + if (npc->x < (x * 0x10 + 8) * 0x200 + && npc->x > (x * 0x10 - 8) * 0x200 + && npc->y + npc->hit.bottom > (y * 0x10 * 0x200) - ((npc->x - (x * 0x10 * 0x200)) / 2) + 0x800 + && npc->y - npc->hit.top < (y * 0x10 + 8) * 0x200) + { + // Clip + npc->y = (y * 0x10 * 0x200) - ((npc->x - (x * 0x10 * 0x200)) / 2) + 0x800 - npc->hit.bottom; + + // Halt momentum + if (npc->ym > 0) + npc->ym = 0; + + // Set that hit this slope + hit |= 0x18; + } + + npc->flag |= hit; +} + +void JudgeHitNpCharTriangleH(NPCHAR *npc, int x, int y) +{ + int hit = 0; + + hit |= 0x80000; + + if (npc->x < (x * 0x10 + 8) * 0x200 + && npc->x > (x * 0x10 - 8) * 0x200 + && npc->y + npc->hit.bottom > (y * 0x10 * 0x200) - ((npc->x - (x * 0x10 * 0x200)) / 2) - 0x800 + && npc->y - npc->hit.top < (y * 0x10 + 8) * 0x200) + { + // Clip + npc->y = (y * 0x10 * 0x200) - ((npc->x - (x * 0x10 * 0x200)) / 2) - 0x800 - npc->hit.bottom; + + // Halt momentum + if (npc->ym > 0) + npc->ym = 0; + + // Set that hit this slope + hit |= 0x18; + } + + npc->flag |= hit; +} + +void JudgeHitNpCharWater(NPCHAR *npc, int x, int y) +{ + int hit = 0; + + if (npc->x - npc->hit.back < (x * 0x10 + 6) * 0x200 + && npc->x + npc->hit.back > (x * 0x10 - 6) * 0x200 + && npc->y - npc->hit.top < (y * 0x10 + 6) * 0x200 + && npc->y + npc->hit.bottom > (y * 0x10 - 6) * 0x200) + hit |= 0x100; + + npc->flag |= hit; +} + +void HitNpCharMap(void) +{ + int x, y; + int judg; + + int offx[9]; + int offy[9]; + + int i, j; + + offx[0] = 0; + offx[1] = 1; + offx[2] = 0; + offx[3] = 1; + offx[4] = 2; + offx[5] = 2; + offx[6] = 2; + offx[7] = 0; + offx[8] = 1; + + offy[0] = 0; + offy[1] = 0; + offy[2] = 1; + offy[3] = 1; + offy[4] = 0; + offy[5] = 1; + offy[6] = 2; + offy[7] = 2; + offy[8] = 2; + + for (i = 0; i < NPC_MAX; ++i) + { + if (!(gNPC[i].cond & 0x80)) + continue; + + if (gNPC[i].bits & NPC_IGNORE_SOLIDITY) + continue; + + if (gNPC[i].size >= 3) + { + judg = 9; + x = (gNPC[i].x - 0x1000) / 0x10 / 0x200; + y = (gNPC[i].y - 0x1000) / 0x10 / 0x200; + } + else + { + judg = 4; + x = gNPC[i].x / 0x10 / 0x200; + y = gNPC[i].y / 0x10 / 0x200; + } + + gNPC[i].flag = 0; + + for (j = 0; j < judg; ++j) + { + switch (GetAttribute(x + offx[j], y + offy[j])) + { + // No NPC block + case 0x44: + if (gNPC[i].bits & NPC_IGNORE_TILE_44) + break; + // Fallthrough + // Block + case 0x03: + case 0x05: + case 0x41: + case 0x43: + JadgeHitNpCharBlock(&gNPC[i], x + offx[j], y + offy[j]); + break; + + // Slopes + case 0x50: + JudgeHitNpCharTriangleA(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x51: + JudgeHitNpCharTriangleB(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x52: + JudgeHitNpCharTriangleC(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x53: + JudgeHitNpCharTriangleD(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x54: + JudgeHitNpCharTriangleE(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x55: + JudgeHitNpCharTriangleF(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x56: + JudgeHitNpCharTriangleG(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x57: + JudgeHitNpCharTriangleH(&gNPC[i], x + offx[j], y + offy[j]); + break; + + // Water + case 0x02: + case 0x60: + case 0x62: + JudgeHitNpCharWater(&gNPC[i], x + offx[j], y + offy[j]); + break; + + // Water block + case 0x04: + case 0x61: + case 0x64: + JadgeHitNpCharBlock(&gNPC[i], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gNPC[i], x + offx[j], y + offy[j]); + break; + + // Water slopes + case 0x70: + JudgeHitNpCharTriangleA(&gNPC[i], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x71: + JudgeHitNpCharTriangleB(&gNPC[i], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x72: + JudgeHitNpCharTriangleC(&gNPC[i], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x73: + JudgeHitNpCharTriangleD(&gNPC[i], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x74: + JudgeHitNpCharTriangleE(&gNPC[i], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x75: + JudgeHitNpCharTriangleF(&gNPC[i], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x76: + JudgeHitNpCharTriangleG(&gNPC[i], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0x77: + JudgeHitNpCharTriangleH(&gNPC[i], x + offx[j], y + offy[j]); + JudgeHitNpCharWater(&gNPC[i], x + offx[j], y + offy[j]); + break; + + case 0xA0: + gNPC[i].flag |= 0x100; + // Fallthrough + case 0x80: + gNPC[i].flag |= 0x1000; + break; + + case 0xA1: + gNPC[i].flag |= 0x100; + // Fallthrough + case 0x81: + gNPC[i].flag |= 0x2000; + break; + + case 0xA2: + gNPC[i].flag |= 0x100; + // Fallthrough + case 0x82: + gNPC[i].flag |= 0x4000; + break; + + case 0xA3: + gNPC[i].flag |= 0x100; + // Fallthrough + case 0x83: + gNPC[i].flag |= 0x8000; + break; + } + + if (gNPC[i].y > gWaterY + 0x800) + gNPC[i].flag |= 0x100; + } + } +} + +void LoseNpChar(NPCHAR *npc, BOOL bVanish) +{ + int val; + + // Play death sound + PlaySoundObject(npc->destroy_voice, SOUND_MODE_PLAY); + + // Create smoke + switch (npc->size) + { + case 1: + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 3); + break; + + case 2: + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 7); + break; + + case 3: + SetDestroyNpChar(npc->x, npc->y, npc->view.back, 12); + break; + } + + // Create drop + if (npc->exp != 0) + { + switch (Random(1, 5)) + { + case 1: + // Spawn health + if (npc->exp > 6) + val = 6; + else + val = 2; + + SetLifeObject(npc->x, npc->y, val); + + break; + + case 2: + // Spawn missile launcher ammo + if (npc->exp > 6) + val = 3; + else + val = 1; + + if (SetBulletObject(npc->x, npc->y, val)) + break; + + // Fallthrough + default: + // Spawn weapon energy + if (!gbNoExpDrops) + SetExpObjects(npc->x, npc->y, npc->exp); + break; + } + } + + // Set flag + SetNPCFlag(npc->code_flag); + + // Create value view + if (npc->bits & NPC_SHOW_DAMAGE) + { + if ((npc->bits & NPC_SHOW_DAMAGE) && npc->damage_view) // npc->bits & NPC_SHOW_DAMAGE is already verified at this point, so this is redundant + SetValueView(&npc->x, &npc->y, npc->damage_view); + if (bVanish) + VanishNpChar(npc); + } + else + { + npc->cond = 0; + } +} + +void HitNpCharBullet(void) +{ + int n, b; + BOOL bHit; + + for (n = 0; n < NPC_MAX; ++n) + { + if (!(gNPC[n].cond & 0x80)) + continue; + + if (gNPC[n].bits & NPC_SHOOTABLE && gNPC[n].bits & NPC_INTERACTABLE) + continue; + + for (b = 0; b < BULLET_MAX; ++b) + { + if (!(gBul[b].cond & 0x80)) + continue; + + if (gBul[b].damage == -1) + continue; + + // Check if bullet touches npc + bHit = FALSE; + if (gNPC[n].bits & NPC_SHOOTABLE + && gNPC[n].x - gNPC[n].hit.back < gBul[b].x + gBul[b].enemyXL + && gNPC[n].x + gNPC[n].hit.back > gBul[b].x - gBul[b].enemyXL + && gNPC[n].y - gNPC[n].hit.top < gBul[b].y + gBul[b].enemyYL + && gNPC[n].y + gNPC[n].hit.bottom > gBul[b].y - gBul[b].enemyYL) + bHit = TRUE; + else if (gNPC[n].bits & NPC_INVULNERABLE + && gNPC[n].x - gNPC[n].hit.back < gBul[b].x + gBul[b].blockXL + && gNPC[n].x + gNPC[n].hit.back > gBul[b].x - gBul[b].blockXL + && gNPC[n].y - gNPC[n].hit.top < gBul[b].y + gBul[b].blockYL + && gNPC[n].y + gNPC[n].hit.bottom > gBul[b].y - gBul[b].blockYL) + bHit = TRUE; + + if (bHit) + { + // Damage NPC + if (gNPC[n].bits & NPC_SHOOTABLE) + { + gNPC[n].life -= gBul[b].damage; + + if (gNPC[n].life < 1) + { + gNPC[n].life = 0; + + if (gNPC[n].bits & NPC_SHOW_DAMAGE) + gNPC[n].damage_view -= gBul[b].damage; + + if ((gMC.cond & 0x80) && gNPC[n].bits & NPC_EVENT_WHEN_KILLED) + StartTextScript(gNPC[n].code_event); + else + gNPC[n].cond |= 8; + } + else + { + if (gNPC[n].shock < 14) + { + SetCaret((gBul[b].x + gNPC[n].x) / 2, (gBul[b].y + gNPC[n].y) / 2, CARET_HURT_PARTICLES, DIR_LEFT); + SetCaret((gBul[b].x + gNPC[n].x) / 2, (gBul[b].y + gNPC[n].y) / 2, CARET_HURT_PARTICLES, DIR_LEFT); + SetCaret((gBul[b].x + gNPC[n].x) / 2, (gBul[b].y + gNPC[n].y) / 2, CARET_HURT_PARTICLES, DIR_LEFT); + PlaySoundObject(gNPC[n].hit_voice, SOUND_MODE_PLAY); + gNPC[n].shock = 16; + } + + if (gNPC[n].bits & NPC_SHOW_DAMAGE) + gNPC[n].damage_view -= gBul[b].damage; + } + } + else if (gBul[b].code_bullet == 13 + || gBul[b].code_bullet == 14 + || gBul[b].code_bullet == 15 + || gBul[b].code_bullet == 28 + || gBul[b].code_bullet == 29 + || gBul[b].code_bullet == 30) + { + // Strange empty case that's needed for accurate assembly + } + else if (!(gBul[b].bbits & 0x10)) + { + // Hit invulnerable NPC + SetCaret((gBul[b].x + gNPC[n].x) / 2, (gBul[b].y + gNPC[n].y) / 2, CARET_PROJECTILE_DISSIPATION, DIR_RIGHT); + PlaySoundObject(31, SOUND_MODE_PLAY); + gBul[b].life = 0; + continue; + } + + --gBul[b].life; + } + } + + if (gNPC[n].cond & 8) + LoseNpChar(&gNPC[n], TRUE); + } +} diff --git a/src/NpcHit.h b/src/NpcHit.h new file mode 100644 index 0000000..6b7d81c --- /dev/null +++ b/src/NpcHit.h @@ -0,0 +1,28 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#include "NpChar.h" + +extern BOOL gbNoExpDrops; + +void JadgeHitNpCharBlock(NPCHAR *npc, int x, int y); +void JudgeHitNpCharTriangleA(NPCHAR *npc, int x, int y); +void JudgeHitNpCharTriangleB(NPCHAR *npc, int x, int y); +void JudgeHitNpCharTriangleC(NPCHAR *npc, int x, int y); +void JudgeHitNpCharTriangleD(NPCHAR *npc, int x, int y); +void JudgeHitNpCharTriangleE(NPCHAR *npc, int x, int y); +void JudgeHitNpCharTriangleF(NPCHAR *npc, int x, int y); +void JudgeHitNpCharTriangleG(NPCHAR *npc, int x, int y); +void JudgeHitNpCharTriangleH(NPCHAR *npc, int x, int y); +void JudgeHitNpCharWater(NPCHAR *npc, int x, int y); +void HitNpCharMap(void); +void LoseNpChar(NPCHAR *npc, BOOL bVanish); +void HitNpCharBullet(void); diff --git a/src/NpcTbl.cpp b/src/NpcTbl.cpp new file mode 100644 index 0000000..eb34997 --- /dev/null +++ b/src/NpcTbl.cpp @@ -0,0 +1,444 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "NpcTbl.h" + +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "File.h" +#include "Generic.h" +#include "NpcAct.h" + +// Npc function table +const NPCFUNCTION gpNpcFuncTbl[] = { + ActNpc000, + ActNpc001, + ActNpc002, + ActNpc003, + ActNpc004, + ActNpc005, + ActNpc006, + ActNpc007, + ActNpc008, + ActNpc009, + ActNpc010, + ActNpc011, + ActNpc012, + ActNpc013, + ActNpc014, + ActNpc015, + ActNpc016, + ActNpc017, + ActNpc018, + ActNpc019, + ActNpc020, + ActNpc021, + ActNpc022, + ActNpc023, + ActNpc024, + ActNpc025, + ActNpc026, + ActNpc027, + ActNpc028, + ActNpc029, + ActNpc030, + ActNpc031, + ActNpc032, + ActNpc033, + ActNpc034, + ActNpc035, + ActNpc036, + ActNpc037, + ActNpc038, + ActNpc039, + ActNpc040, + ActNpc041, + ActNpc042, + ActNpc043, + ActNpc044, + ActNpc045, + ActNpc046, + ActNpc047, + ActNpc048, + ActNpc049, + ActNpc050, + ActNpc051, + ActNpc052, + ActNpc053, + ActNpc054, + ActNpc055, + ActNpc056, + ActNpc057, + ActNpc058, + ActNpc059, + ActNpc060, + ActNpc061, + ActNpc062, + ActNpc063, + ActNpc064, + ActNpc065, + ActNpc066, + ActNpc067, + ActNpc068, + ActNpc069, + ActNpc070, + ActNpc071, + ActNpc072, + ActNpc073, + ActNpc074, + ActNpc075, + ActNpc076, + ActNpc077, + ActNpc078, + ActNpc079, + ActNpc080, + ActNpc081, + ActNpc082, + ActNpc083, + ActNpc084, + ActNpc085, + ActNpc086, + ActNpc087, + ActNpc088, + ActNpc089, + ActNpc090, + ActNpc091, + ActNpc092, + ActNpc093, + ActNpc094, + ActNpc095, + ActNpc096, + ActNpc097, + ActNpc098, + ActNpc099, + ActNpc100, + ActNpc101, + ActNpc102, + ActNpc103, + ActNpc104, + ActNpc105, + ActNpc106, + ActNpc107, + ActNpc108, + ActNpc109, + ActNpc110, + ActNpc111, + ActNpc112, + ActNpc113, + ActNpc114, + ActNpc115, + ActNpc116, + ActNpc117, + ActNpc118, + ActNpc119, + ActNpc120, + ActNpc121, + ActNpc122, + ActNpc123, + ActNpc124, + ActNpc125, + ActNpc126, + ActNpc127, + ActNpc128, + ActNpc129, + ActNpc130, + ActNpc131, + ActNpc132, + ActNpc133, + ActNpc134, + ActNpc135, + ActNpc136, + ActNpc137, + ActNpc138, + ActNpc139, + ActNpc140, + ActNpc141, + ActNpc142, + ActNpc143, + ActNpc144, + ActNpc145, + ActNpc146, + ActNpc147, + ActNpc148, + ActNpc149, + ActNpc150, + ActNpc151, + ActNpc152, + ActNpc153, + ActNpc154, + ActNpc155, + ActNpc156, + ActNpc157, + ActNpc158, + ActNpc159, + ActNpc160, + ActNpc161, + ActNpc162, + ActNpc163, + ActNpc164, + ActNpc165, + ActNpc166, + ActNpc167, + ActNpc168, + ActNpc169, + ActNpc170, + ActNpc171, + ActNpc172, + ActNpc173, + ActNpc174, + ActNpc175, + ActNpc176, + ActNpc177, + ActNpc178, + ActNpc179, + ActNpc180, + ActNpc181, + ActNpc182, + ActNpc183, + ActNpc184, + ActNpc185, + ActNpc186, + ActNpc187, + ActNpc188, + ActNpc189, + ActNpc190, + ActNpc191, + ActNpc192, + ActNpc193, + ActNpc194, + ActNpc195, + ActNpc196, + ActNpc197, + ActNpc198, + ActNpc199, + ActNpc200, + ActNpc201, + ActNpc202, + ActNpc203, + ActNpc204, + ActNpc205, + ActNpc206, + ActNpc207, + ActNpc208, + ActNpc209, + ActNpc210, + ActNpc211, + ActNpc212, + ActNpc213, + ActNpc214, + ActNpc215, + ActNpc216, + ActNpc217, + ActNpc218, + ActNpc219, + ActNpc220, + ActNpc221, + ActNpc222, + ActNpc223, + ActNpc224, + ActNpc225, + ActNpc226, + ActNpc227, + ActNpc228, + ActNpc229, + ActNpc230, + ActNpc231, + ActNpc232, + ActNpc233, + ActNpc234, + ActNpc235, + ActNpc236, + ActNpc237, + ActNpc238, + ActNpc239, + ActNpc240, + ActNpc241, + ActNpc242, + ActNpc243, + ActNpc244, + ActNpc245, + ActNpc246, + ActNpc247, + ActNpc248, + ActNpc249, + ActNpc250, + ActNpc251, + ActNpc252, + ActNpc253, + ActNpc254, + ActNpc255, + ActNpc256, + ActNpc257, + ActNpc258, + ActNpc259, + ActNpc260, + ActNpc261, + ActNpc262, + ActNpc263, + ActNpc264, + ActNpc265, + ActNpc266, + ActNpc267, + ActNpc268, + ActNpc269, + ActNpc270, + ActNpc271, + ActNpc272, + ActNpc273, + ActNpc274, + ActNpc275, + ActNpc276, + ActNpc277, + ActNpc278, + ActNpc279, + ActNpc280, + ActNpc281, + ActNpc282, + ActNpc283, + ActNpc284, + ActNpc285, + ActNpc286, + ActNpc287, + ActNpc288, + ActNpc289, + ActNpc290, + ActNpc291, + ActNpc292, + ActNpc293, + ActNpc294, + ActNpc295, + ActNpc296, + ActNpc297, + ActNpc298, + ActNpc299, + ActNpc300, + ActNpc301, + ActNpc302, + ActNpc303, + ActNpc304, + ActNpc305, + ActNpc306, + ActNpc307, + ActNpc308, + ActNpc309, + ActNpc310, + ActNpc311, + ActNpc312, + ActNpc313, + ActNpc314, + ActNpc315, + ActNpc316, + ActNpc317, + ActNpc318, + ActNpc319, + ActNpc320, + ActNpc321, + ActNpc322, + ActNpc323, + ActNpc324, + ActNpc325, + ActNpc326, + ActNpc327, + ActNpc328, + ActNpc329, + ActNpc330, + ActNpc331, + ActNpc332, + ActNpc333, + ActNpc334, + ActNpc335, + ActNpc336, + ActNpc337, + ActNpc338, + ActNpc339, + ActNpc340, + ActNpc341, + ActNpc342, + ActNpc343, + ActNpc344, + ActNpc345, + ActNpc346, + ActNpc347, + ActNpc348, + ActNpc349, + ActNpc350, + ActNpc351, + ActNpc352, + ActNpc353, + ActNpc354, + ActNpc355, + ActNpc356, + ActNpc357, + ActNpc358, + ActNpc359, + ActNpc360, +}; + +NPC_TABLE *gNpcTable; + +BOOL LoadNpcTable(const char *path) +{ + FILE *fp; + int n; + size_t size; + int num; + + size = GetFileSizeLong(path); // TODO - Investigate whether GetFileSizeLong actually returns an unsigned long or not + if (size == -1) + return FALSE; + + num = (int)(size / 0x18); + + gNpcTable = (NPC_TABLE*)malloc(num * sizeof(NPC_TABLE)); + if (gNpcTable == NULL) + return FALSE; + + fp = fopen(path, "rb"); + if (fp == NULL) + { + free(gNpcTable); + gNpcTable = NULL; + return FALSE; + } + + for (n = 0; n < num; ++n) // bits + gNpcTable[n].bits = File_ReadLE16(fp); + for (n = 0; n < num; ++n) // life + gNpcTable[n].life = File_ReadLE16(fp); + for (n = 0; n < num; ++n) // surf + fread(&gNpcTable[n].surf, 1, 1, fp); + for (n = 0; n < num; ++n) // destroy_voice + fread(&gNpcTable[n].destroy_voice, 1, 1, fp); + for (n = 0; n < num; ++n) // hit_voice + fread(&gNpcTable[n].hit_voice, 1, 1, fp); + for (n = 0; n < num; ++n) // size + fread(&gNpcTable[n].size, 1, 1, fp); + for (n = 0; n < num; ++n) // exp + gNpcTable[n].exp = File_ReadLE32(fp); + for (n = 0; n < num; ++n) // damage + gNpcTable[n].damage = File_ReadLE32(fp); + for (n = 0; n < num; ++n) // hit + fread(&gNpcTable[n].hit, 4, 1, fp); + for (n = 0; n < num; ++n) // view + fread(&gNpcTable[n].view, 4, 1, fp); + + fclose(fp); + return TRUE; +} + +void ReleaseNpcTable(void) +{ + if (gNpcTable != NULL) + { + free(gNpcTable); + gNpcTable = NULL; + } +} diff --git a/src/NpcTbl.h b/src/NpcTbl.h new file mode 100644 index 0000000..9280c5f --- /dev/null +++ b/src/NpcTbl.h @@ -0,0 +1,43 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#include "NpChar.h" + +struct NPC_TBL_RECT +{ + unsigned char front; + unsigned char top; + unsigned char back; + unsigned char bottom; +}; + +struct NPC_TABLE +{ + unsigned short bits; + unsigned short life; + unsigned char surf; + unsigned char hit_voice; + unsigned char destroy_voice; + unsigned char size; + long exp; + long damage; + NPC_TBL_RECT hit; + NPC_TBL_RECT view; +}; + +extern NPC_TABLE *gNpcTable; + +BOOL LoadNpcTable(const char *path); +void ReleaseNpcTable(void); + +// NPC Function table +typedef void (*NPCFUNCTION)(NPCHAR*); +extern const NPCFUNCTION gpNpcFuncTbl[]; diff --git a/src/Organya.cpp b/src/Organya.cpp new file mode 100644 index 0000000..4eb2f85 --- /dev/null +++ b/src/Organya.cpp @@ -0,0 +1,919 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +// Some of the original source code for this file can be found here: +// https://github.com/shbow/organya/blob/master/source/OrgFile.cpp +// https://github.com/shbow/organya/blob/master/source/OrgPlay.cpp +// https://github.com/shbow/organya/blob/master/source/Sound.cpp +// https://github.com/shbow/organya/blob/master/source/WinTimer.cpp + +#include "Organya.h" + +#include +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "Backends/Audio.h" +#include "Backends/Misc.h" +#include "File.h" +#include "Main.h" +#include "Sound.h" + +#define PANDUMMY 0xFF +#define VOLDUMMY 0xFF +#define KEYDUMMY 0xFF + +#define ALLOCNOTE 4096 + +#define DEFVOLUME 200//255はVOLDUMMY。MAXは254 +#define DEFPAN 6 + +//曲情報をセットする時のフラグ +#define SETALL 0xffffffff//全てをセット +#define SETWAIT 0x00000001 +#define SETGRID 0x00000002 +#define SETALLOC 0x00000004 +#define SETREPEAT 0x00000008 +#define SETFREQ 0x00000010 +#define SETWAVE 0x00000020 +#define SETPIPI 0x00000040 + +// Below are Organya song data structures +typedef struct NOTELIST +{ + NOTELIST *from; // Previous address + NOTELIST *to; // Next address + + long x; // Position + unsigned char length; // Sound length + unsigned char y; // Sound height + unsigned char volume; // Volume + unsigned char pan; +} NOTELIST; + +// Track data * 8 +typedef struct TRACKDATA +{ + unsigned short freq; // Frequency (1000 is default) + unsigned char wave_no; // Waveform No. + signed char pipi; + + NOTELIST *note_p; + NOTELIST *note_list; +} TRACKDATA; + +// Unique information held in songs +typedef struct MUSICINFO +{ + unsigned short wait; + unsigned char line; // Number of lines in one measure + unsigned char dot; // Number of dots per line + unsigned short alloc_note; // Number of allocated notes + long repeat_x; // Repeat + long end_x; // End of song (Return to repeat) + TRACKDATA tdata[MAXTRACK]; +} MUSICINFO; + +// メインクラス。このアプリケーションの中心。(クラスってやつを初めて使う) (Main class. The heart of this application. (Class is used for the first time)) +typedef struct OrgData +{ + OrgData(); // コンストラクタ (Constructor) +// ~OrgData(); // デストラクタ (Destructor) + MUSICINFO info; + char track; + char mute[MAXTRACK]; + unsigned char def_pan; + unsigned char def_volume; + void InitOrgData(void); + void GetMusicInfo(MUSICINFO *mi); // 曲情報を取得 (Get song information) + // 曲情報を設定。flagは設定アイテムを指定 (Set song information. flag specifies the setting item) + BOOL SetMusicInfo(MUSICINFO *mi,unsigned long flag); + BOOL NoteAlloc(unsigned short note_num); // 指定の数だけNoteDataの領域を確保 (Allocate the specified number of NoteData areas.) + void ReleaseNote(void); // NoteDataを開放 (Release NoteData) + // 以下は再生 (The following is playback) + void PlayData(void); + void SetPlayPointer(long x); // 再生ポインターを指定の位置に設定 (Set playback pointer to specified position) + // 以下はファイル関係 (The following are related to files) + BOOL InitMusicData(const char *path); +} ORGDATA; + +AudioBackend_Sound *lpORGANBUFFER[8][8][2] = {NULL}; + +///////////////////////////////////////////// +//■オルガーニャ■■■■■■■■■■■■/////// (Organya) +///////////////////// + +// Wave playing and loading +typedef struct +{ + short wave_size; + short oct_par; + short oct_size; +} OCTWAVE; + +OCTWAVE oct_wave[8] = +{ + { 256, 1, 4 }, // 0 Oct + { 256, 2, 8 }, // 1 Oct + { 128, 4, 12 }, // 2 Oct + { 128, 8, 16 }, // 3 Oct + { 64, 16, 20 }, // 4 Oct + { 32, 32, 24 }, // 5 Oct + { 16, 64, 28 }, // 6 Oct + { 8,128, 32 }, // 7 Oct +}; + +BOOL MakeSoundObject8(signed char *wavep, signed char track, signed char pipi) +{ + unsigned long i,j,k; + unsigned long wav_tp; // WAVテーブルをさすポインタ (Pointer to WAV table) + unsigned long wave_size; // 256; + unsigned long data_size; + unsigned char *wp; + unsigned char *wp_sub; + int work; + + if (!audio_backend_initialised) + return FALSE; + + for (j = 0; j < 8; j++) + { + for (k = 0; k < 2; k++) + { + wave_size = oct_wave[j].wave_size; + + if (pipi) + data_size = wave_size * oct_wave[j].oct_size; + else + data_size = wave_size; + + wp = (unsigned char*)malloc(data_size); + + if (wp == NULL) + return FALSE; + + // Get wave data + wp_sub = wp; + wav_tp = 0; + + for (i = 0; i < data_size; i++) + { + work = *(wavep + wav_tp); + work += 0x80; + + *wp_sub = (unsigned char)work; + + wav_tp += 0x100 / wave_size; + if (wav_tp > 0xFF) + wav_tp -= 0x100; + + wp_sub++; + } + + lpORGANBUFFER[track][j][k] = AudioBackend_CreateSound(22050, wp, data_size); + + free(wp); + + if (lpORGANBUFFER[track][j][k] == NULL) + return FALSE; + + AudioBackend_RewindSound(lpORGANBUFFER[track][j][k]); + } + } + + return TRUE; +} + +short freq_tbl[12] = {262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494}; + +void ChangeOrganFrequency(unsigned char key, signed char track, long a) +{ + if (!audio_backend_initialised) + return; + + for (int j = 0; j < 8; j++) + for (int i = 0; i < 2; i++) + AudioBackend_SetSoundFrequency(lpORGANBUFFER[track][j][i], ((oct_wave[j].wave_size * freq_tbl[key]) * oct_wave[j].oct_par) / 8 + (a - 1000)); // 1000を+αのデフォルト値とする (1000 is the default value for + α) +} + +BOOL g_mute[MAXTRACK]; // Used by the debug Mute menu +short pan_tbl[13] = {0, 43, 86, 129, 172, 215, 256, 297, 340, 383, 426, 469, 512}; +unsigned char old_key[MAXTRACK] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 再生中の音 (Sound being played) +unsigned char key_on[MAXTRACK]; // キースイッチ (Key switch) +unsigned char key_twin[MAXTRACK]; // 今使っているキー(連続時のノイズ防止の為に二つ用意) (Currently used keys (prepared for continuous noise prevention)) + +void ChangeOrganPan(unsigned char key, unsigned char pan, signed char track) // 512がMAXで256がノーマル (512 is MAX and 256 is normal) +{ + if (!audio_backend_initialised) + return; + + if (old_key[track] != KEYDUMMY) + AudioBackend_SetSoundPan(lpORGANBUFFER[track][old_key[track] / 12][key_twin[track]], (pan_tbl[pan] - 0x100) * 10); +} + +void ChangeOrganVolume(int no, long volume, signed char track) // 300がMAXで300がノーマル (300 is MAX and 300 is normal) +{ + if (!audio_backend_initialised) + return; + + if (old_key[track] != KEYDUMMY) + AudioBackend_SetSoundVolume(lpORGANBUFFER[track][old_key[track] / 12][key_twin[track]], (volume - 0xFF) * 8); +} + +// サウンドの再生 (Play sound) +void PlayOrganObject(unsigned char key, int mode, signed char track, long freq) +{ + if (!audio_backend_initialised) + return; + + if (lpORGANBUFFER[track][key / 12][key_twin[track]] != NULL) + { + switch (mode) + { + case 0: // 停止 (Stop) + if (old_key[track] != 0xFF) + { + AudioBackend_StopSound(lpORGANBUFFER[track][old_key[track] / 12][key_twin[track]]); + AudioBackend_RewindSound(lpORGANBUFFER[track][old_key[track] / 12][key_twin[track]]); + } + break; + + case 1: // 再生 (Playback) + break; + + case 2: // 歩かせ停止 (Stop playback) + if (old_key[track] != 0xFF) + { + AudioBackend_PlaySound(lpORGANBUFFER[track][old_key[track] / 12][key_twin[track]], FALSE); + old_key[track] = 0xFF; + } + break; + + case -1: + if (old_key[track] == 0xFF) // 新規鳴らす (New sound) + { + ChangeOrganFrequency(key % 12, track, freq); // 周波数を設定して (Set the frequency) + AudioBackend_PlaySound(lpORGANBUFFER[track][key / 12][key_twin[track]], TRUE); + old_key[track] = key; + key_on[track] = 1; + } + else if (key_on[track] == 1 && old_key[track] == key) // 同じ音 (Same sound) + { + // 今なっているのを歩かせ停止 (Stop playback now) + AudioBackend_PlaySound(lpORGANBUFFER[track][old_key[track] / 12][key_twin[track]], FALSE); + key_twin[track]++; + if (key_twin[track] > 1) + key_twin[track] = 0; + AudioBackend_PlaySound(lpORGANBUFFER[track][key / 12][key_twin[track]], TRUE); + } + else // 違う音を鳴らすなら (If you make a different sound) + { + AudioBackend_PlaySound(lpORGANBUFFER[track][old_key[track] / 12][key_twin[track]], FALSE); // 今なっているのを歩かせ停止 (Stop playback now) + key_twin[track]++; + if (key_twin[track] > 1) + key_twin[track] = 0; + ChangeOrganFrequency(key % 12, track, freq); // 周波数を設定して (Set the frequency) + AudioBackend_PlaySound(lpORGANBUFFER[track][key / 12][key_twin[track]], TRUE); + old_key[track] = key; + } + + break; + } + } +} + +// オルガーニャオブジェクトを開放 (Open Organya object) +void ReleaseOrganyaObject(signed char track) +{ + if (!audio_backend_initialised) + return; + + for (int i = 0; i < 8; i++) + { + if (lpORGANBUFFER[track][i][0] != NULL) + { + AudioBackend_DestroySound(lpORGANBUFFER[track][i][0]); + lpORGANBUFFER[track][i][0] = NULL; + } + if (lpORGANBUFFER[track][i][1] != NULL) + { + AudioBackend_DestroySound(lpORGANBUFFER[track][i][1]); + lpORGANBUFFER[track][i][1] = NULL; + } + } +} + +// 波形データをロード (Load waveform data) +signed char wave_data[100][0x100]; + +BOOL InitWaveData100(void) +{ + if (!audio_backend_initialised) + return FALSE; + + std::string path = gDataPath + "/Resource/WAVE/Wave.dat"; + + FILE *fp = fopen(path.c_str(), "rb"); + + if (fp == NULL) + return FALSE; + + fread(wave_data, 1, 100 * 0x100, fp); + + fclose(fp); + + return TRUE; +} + +// 波形を100個の中から選択して作成 (Select from 100 waveforms to create) +BOOL MakeOrganyaWave(signed char track, signed char wave_no, signed char pipi) +{ + if (!audio_backend_initialised) + return FALSE; + + if (wave_no > 99) + return FALSE; + + ReleaseOrganyaObject(track); + MakeSoundObject8(wave_data[wave_no], track, pipi); + + return TRUE; +} + +///////////////////////////////////////////// +//■オルガーニャドラムス■■■■■■■■/////// (Organya drums) +///////////////////// + +void ChangeDramFrequency(unsigned char key, signed char track) +{ + if (!audio_backend_initialised) + return; + + AudioBackend_SetSoundFrequency(lpSECONDARYBUFFER[150 + track], key * 800 + 100); +} + +void ChangeDramPan(unsigned char pan, signed char track) +{ + if (!audio_backend_initialised) + return; + + AudioBackend_SetSoundPan(lpSECONDARYBUFFER[150 + track], (pan_tbl[pan] - 0x100) * 10); +} + +void ChangeDramVolume(long volume, signed char track) +{ + if (!audio_backend_initialised) + return; + + AudioBackend_SetSoundVolume(lpSECONDARYBUFFER[150 + track], (volume - 0xFF) * 8); +} + +// サウンドの再生 (Play sound) +void PlayDramObject(unsigned char key, int mode, signed char track) +{ + if (!audio_backend_initialised) + return; + + if (lpSECONDARYBUFFER[150 + track] != NULL) + { + switch (mode) + { + case 0: // 停止 (Stop) + AudioBackend_StopSound(lpSECONDARYBUFFER[150 + track]); + AudioBackend_RewindSound(lpSECONDARYBUFFER[150 + track]); + break; + + case 1: // 再生 (Playback) + AudioBackend_StopSound(lpSECONDARYBUFFER[150 + track]); + AudioBackend_RewindSound(lpSECONDARYBUFFER[150 + track]); + ChangeDramFrequency(key, track); // 周波数を設定して (Set the frequency) + AudioBackend_PlaySound(lpSECONDARYBUFFER[150 + track], FALSE); + break; + + case 2: // 歩かせ停止 (Stop playback) + break; + + case -1: + break; + } + } +} + +ORGDATA org_data; + +static void OrganyaCallback(void) +{ + org_data.PlayData(); +} + +OrgData::OrgData(void) +{ + for (int i = 0; i < MAXTRACK; i++) + { + info.tdata[i].note_list = NULL; + info.tdata[i].note_p = NULL; + } +} + +void OrgData::InitOrgData(void) +{ + track = 0; + info.alloc_note = ALLOCNOTE; // とりあえず10000個確保 (For the time being, secure 10,000 pieces) + info.dot = 4; + info.line = 4; + info.wait = 128; + info.repeat_x = info.dot * info.line * 0; + info.end_x = info.dot * info.line * 255; + + for (int i = 0; i < MAXTRACK; i++) + { + info.tdata[i].freq = 1000; + info.tdata[i].wave_no = 0; + info.tdata[i].pipi = 0; + } + + NoteAlloc(info.alloc_note); + SetMusicInfo(&info, SETALL); + + def_pan = DEFPAN; + def_volume = DEFVOLUME; +} + +// 曲情報を設定。flagはアイテムを指定 (Set song information. flag specifies an item) +BOOL OrgData::SetMusicInfo(MUSICINFO *mi, unsigned long flag) +{ + //char str[32]; // Leftover debug junk + int i; + + if (flag & SETGRID) // グリッドを有効に (Enable grid) + { + info.dot = mi->dot; + info.line = mi->line; + } + + if (flag & SETWAIT) + { + info.wait = mi->wait; + //itoa(mi->wait, str, 10); // Leftover debug junk + } + + if (flag & SETREPEAT) + { + info.repeat_x = mi->repeat_x; + info.end_x = mi->end_x; + } + + if (flag & SETFREQ) + { + for (i = 0; i < MAXMELODY; i++) + { + info.tdata[i].freq = mi->tdata[i].freq; + info.tdata[i].pipi = info.tdata[i].pipi; // Just sets info.tdata[i].pipi to itself (SETPIPI already sets pipi, so maybe this line shouldn't be here in the first place) + } + } + + if (flag & SETWAVE) + for (i = 0; i < MAXTRACK; i++) + info.tdata[i].wave_no = mi->tdata[i].wave_no; + + if (flag & SETPIPI) + for (i = 0; i < MAXTRACK; i++) + info.tdata[i].pipi = mi->tdata[i].pipi; + + return TRUE; +} + +// 指定の数だけNoteDataの領域を確保(初期化) (Allocate the specified number of NoteData areas (initialization)) +BOOL OrgData::NoteAlloc(unsigned short alloc) +{ + int i,j; + + for (j = 0; j < MAXTRACK; j++) + { + info.tdata[j].wave_no = 0; + info.tdata[j].note_list = NULL; // コンストラクタにやらせたい (I want the constructor to do it) + info.tdata[j].note_p = (NOTELIST*)malloc(sizeof(NOTELIST) * alloc); + + if (info.tdata[j].note_p == NULL) + { + for (i = 0; i < MAXTRACK; i++) + { + if (info.tdata[i].note_p != NULL) + { + free(info.tdata[i].note_p); + #ifdef FIX_BUGS + info.tdata[i].note_p = NULL; + #else + info.tdata[j].note_p = NULL; // Uses j instead of i + #endif + } + } + + return FALSE; + } + + for (i = 0; i < alloc; i++) + { + (info.tdata[j].note_p + i)->from = NULL; + (info.tdata[j].note_p + i)->to = NULL; + (info.tdata[j].note_p + i)->length = 0; + (info.tdata[j].note_p + i)->pan = PANDUMMY; + (info.tdata[j].note_p + i)->volume = VOLDUMMY; + (info.tdata[j].note_p + i)->y = KEYDUMMY; + } + } + + for (j = 0; j < MAXMELODY; j++) + MakeOrganyaWave(j, info.tdata[j].wave_no, info.tdata[j].pipi); + + track = 0; // 今はここに書いておく (Write here now) + + return TRUE; +} + +// NoteDataを開放 (Release NoteData) +void OrgData::ReleaseNote(void) +{ + for (int i = 0; i < MAXTRACK; i++) + { + if (info.tdata[i].note_p != NULL) + { + free(info.tdata[i].note_p); + info.tdata[i].note_p = NULL; + } + } +} + +char pass[7] = "Org-01"; +char pass2[7] = "Org-02"; // Pipi + +BOOL OrgData::InitMusicData(const char *path) +{ + #define READ_LE16(p) ((p[1] << 8) | p[0]); p += 2 + #define READ_LE32(p) ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]); p += 4 + + NOTELIST *np; + int i,j; + char pass_check[6]; + char ver = 0; + unsigned short note_num[MAXTRACK]; + + size_t file_size; + unsigned char *file_buffer = LoadFileToMemory(path, &file_size); + const unsigned char *p = file_buffer; + + if (p == NULL) + return FALSE; + + memcpy(&pass_check[0], p, 6); + p += 6; + + if(memcmp(pass_check, pass, 6) == 0) + ver = 1; + if(memcmp(pass_check, pass2, 6) == 0) + ver = 2; + + if(ver == 0) + { + free(file_buffer); + return FALSE; + } + + // 曲の情報を設定 (Set song information) + info.wait = READ_LE16(p); + info.line = *p++; + info.dot = *p++; + info.repeat_x = READ_LE32(p); + info.end_x = READ_LE32(p); + + for (i = 0; i < MAXTRACK; i++) + { + info.tdata[i].freq = READ_LE16(p); + + info.tdata[i].wave_no = *p++; + + if (ver == 1) + info.tdata[i].pipi = 0; + else + info.tdata[i].pipi = *p; + + ++p; + + note_num[i] = READ_LE16(p); + } + + // 音符のロード (Loading notes) + for (j = 0; j < MAXTRACK; j++) + { + // 最初の音符はfromがNULLとなる (The first note has from as NULL) + if (note_num[j] == 0) + { + info.tdata[j].note_list = NULL; + continue; + } + + // リストを作る (Make a list) + np = info.tdata[j].note_p; + info.tdata[j].note_list = info.tdata[j].note_p; + np->from = NULL; + np->to = (np + 1); + np++; + + for (i = 1; i < note_num[j]; i++) + { + np->from = (np - 1); + np->to = (np + 1); + np++; + } + + // 最後の音符のtoはNULL (The last note to is NULL) + np--; + np->to = NULL; + + // 内容を代入 (Assign content) + np = info.tdata[j].note_p; // X座標 (X coordinate) + for (i = 0; i < note_num[j]; i++) + { + np->x = READ_LE32(p); + np++; + } + + np = info.tdata[j].note_p; // Y座標 (Y coordinate) + for (i = 0; i < note_num[j]; i++) + { + np->y = *p++; + np++; + } + + np = info.tdata[j].note_p; // 長さ (Length) + for (i = 0; i < note_num[j]; i++) + { + np->length = *p++; + np++; + } + + np = info.tdata[j].note_p; // ボリューム (Volume) + for (i = 0; i < note_num[j]; i++) + { + np->volume = *p++; + np++; + } + + np = info.tdata[j].note_p; // パン (Pan) + for (i = 0; i < note_num[j]; i++) + { + np->pan = *p++; + np++; + } + } + + free(file_buffer); + + // データを有効に (Enable data) + for (j = 0; j < MAXMELODY; j++) + MakeOrganyaWave(j,info.tdata[j].wave_no, info.tdata[j].pipi); + + // Pixel ripped out some code so he could use PixTone sounds as drums, but he left this dead code + for (j = MAXMELODY; j < MAXTRACK; j++) + { + i = info.tdata[j].wave_no; + //InitDramObject(dram_name[i], j - MAXMELODY); + } + + SetPlayPointer(0); // 頭出し (Cue) + + return TRUE; +} + +// 曲情報を取得 (Get song information) +void OrgData::GetMusicInfo(MUSICINFO *mi) +{ + mi->dot = info.dot; + mi->line = info.line; + mi->alloc_note = info.alloc_note; + mi->wait = info.wait; + mi->repeat_x = info.repeat_x; + mi->end_x = info.end_x; + + for (int i = 0; i < MAXTRACK; i++) + { + mi->tdata[i].freq = info.tdata[i].freq; + mi->tdata[i].wave_no = info.tdata[i].wave_no; + mi->tdata[i].pipi = info.tdata[i].pipi; + } +} + +// Play data +long PlayPos; // Called 'play_p' in the source code release +NOTELIST *np[MAXTRACK]; +long now_leng[MAXMELODY]; + +int Volume = 100; +int TrackVol[MAXTRACK]; +BOOL bFadeout = FALSE; + +void OrgData::PlayData(void) +{ + int i; + + // Handle fading out + if (bFadeout && Volume) + Volume -= 2; + if (Volume < 0) + Volume = 0; + + // メロディの再生 (Play melody) + for (i = 0; i < MAXMELODY; i++) + { + if (np[i] != NULL && PlayPos == np[i]->x) + { + if (!g_mute[i] && np[i]->y != KEYDUMMY) // 音が来た。 (The sound has come.) + { + PlayOrganObject(np[i]->y, -1, i, info.tdata[i].freq); + now_leng[i] = np[i]->length; + } + + if (np[i]->pan != PANDUMMY) + ChangeOrganPan(np[i]->y, np[i]->pan, i); + if (np[i]->volume != VOLDUMMY) + TrackVol[i] = np[i]->volume; + + np[i] = np[i]->to; // 次の音符を指す (Points to the next note) + } + + if (now_leng[i] == 0) + PlayOrganObject(0, 2, i, info.tdata[i].freq); + + if (now_leng[i] > 0) + now_leng[i]--; + + if (np[i]) + ChangeOrganVolume(np[i]->y, TrackVol[i] * Volume / 0x7F, i); + } + + // ドラムの再生 (Drum playback) + for (i = MAXMELODY; i < MAXTRACK; i++) + { + if (np[i] != NULL && PlayPos == np[i]->x) // 音が来た。 (The sound has come.) + { + if (np[i]->y != KEYDUMMY && !g_mute[i]) // ならす (Tame) + PlayDramObject(np[i]->y, 1, i - MAXMELODY); + + if (np[i]->pan != PANDUMMY) + ChangeDramPan(np[i]->pan, i - MAXMELODY); + if (np[i]->volume != VOLDUMMY) + TrackVol[i] = np[i]->volume; + + np[i] = np[i]->to; // 次の音符を指す (Points to the next note) + } + + if (np[i]) + ChangeDramVolume(TrackVol[i] * Volume / 0x7F, i - MAXMELODY); + } + + // Looping + PlayPos++; + if (PlayPos >= info.end_x) + { + PlayPos = info.repeat_x; + SetPlayPointer(PlayPos); + } +} + +void OrgData::SetPlayPointer(long x) +{ + for (int i = 0; i < MAXTRACK; i++) + { + np[i] = info.tdata[i].note_list; + while (np[i] != NULL && np[i]->x < x) + np[i] = np[i]->to; // 見るべき音符を設定 (Set note to watch) + } + + PlayPos = x; +} + +// Start and end organya +BOOL StartOrganya(const char *path_wave) // The argument is ignored for some reason +{ + if (!audio_backend_initialised) + return FALSE; + + if (!InitWaveData100()) + return FALSE; + + org_data.InitOrgData(); + + AudioBackend_SetOrganyaCallback(OrganyaCallback); + + return TRUE; +} + +// Load organya file +BOOL LoadOrganya(const char *name) +{ + if (!audio_backend_initialised) + return FALSE; + + if (!org_data.InitMusicData(name)) + return FALSE; + + Volume = 100; + bFadeout = 0; + +#ifdef FIX_BUGS + return TRUE; +#else + return FALSE; // Err... isn't this meant to be 'TRUE'? +#endif +} + +void SetOrganyaPosition(unsigned int x) +{ + if (!audio_backend_initialised) + return; + + org_data.SetPlayPointer(x); + Volume = 100; + bFadeout = FALSE; +} + +unsigned int GetOrganyaPosition(void) +{ + if (!audio_backend_initialised) + return 0; + + return PlayPos; +} + +void PlayOrganyaMusic(void) +{ + if (!audio_backend_initialised) + return; + + AudioBackend_SetOrganyaTimer(org_data.info.wait); +} + +BOOL ChangeOrganyaVolume(signed int volume) +{ + if (!audio_backend_initialised) + return FALSE; + + if (volume < 0 || volume > 100) + return FALSE; + + Volume = volume; + return TRUE; +} + +void StopOrganyaMusic(void) +{ + if (!audio_backend_initialised) + return; + + AudioBackend_SetOrganyaTimer(0); + + // Stop notes + for (int i = 0; i < MAXMELODY; i++) + PlayOrganObject(0, 2, i, 0); + + memset(old_key, 255, sizeof(old_key)); + memset(key_on, 0, sizeof(key_on)); + memset(key_twin, 0, sizeof(key_twin)); + + // Put the main thread to sleep for 100 milliseconds... but why? + // Really, what's the point? All this does is cause an annoying + // stutter when a new song loads. + // I'd guess it avoids a race-condition with the Organya thread, + // but the earlier QuitMMTimer call already disables it. + Backend_Delay(100); +} + +void SetOrganyaFadeout(void) +{ + bFadeout = TRUE; +} + +void EndOrganya(void) +{ + if (!audio_backend_initialised) + return; + + AudioBackend_SetOrganyaTimer(0); + + // Release everything related to org + org_data.ReleaseNote(); + + for (int i = 0; i < MAXMELODY; i++) + { + PlayOrganObject(0, 0, i, 0); + ReleaseOrganyaObject(i); + } +} diff --git a/src/Organya.h b/src/Organya.h new file mode 100644 index 0000000..a00af5d --- /dev/null +++ b/src/Organya.h @@ -0,0 +1,29 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#define MAXTRACK 16 +#define MAXMELODY 8 +#define MAXDRAM 8 + +extern BOOL g_mute[MAXTRACK]; // Used by the debug Mute menu + +BOOL MakeOrganyaWave(signed char track, signed char wave_no, signed char pipi); +void OrganyaPlayData(void); +void SetPlayPointer(long x); +BOOL LoadOrganya(const char *name); +void SetOrganyaPosition(unsigned int x); +unsigned int GetOrganyaPosition(void); +void PlayOrganyaMusic(void); +BOOL ChangeOrganyaVolume(signed int volume); +void StopOrganyaMusic(void); +void SetOrganyaFadeout(void); +BOOL StartOrganya(const char *wave_filename); +void EndOrganya(void); diff --git a/src/Pause.cpp b/src/Pause.cpp new file mode 100644 index 0000000..86b4b48 --- /dev/null +++ b/src/Pause.cpp @@ -0,0 +1,2404 @@ + +#include "Pause.h" + +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "Back.h" +#include "Backends/Controller.h" +#include "Backends/Misc.h" +#include "CommonDefines.h" +#include "Config.h" +#include "Bitmap.h" +#include "Boss.h" +#include "Draw.h" +#include "Escape.h" +#include "Flash.h" +#include "Game.h" +#include "Generic.h" +#include "KeyControl.h" +#include "Main.h" +#include "Organya.h" +#include "Sound.h" +#include "Stage.h" +#include "NpcHit.h" +#include "MyChar.h" +#include "MycHit.h" +#include "Shoot.h" +#include "ArmsItem.h" +#include "Frame.h" +#include "GenericLoad.h" + +#define MAX_OPTIONS ((WINDOW_HEIGHT / 20) - 4) // The maximum number of options we can fit on-screen at once + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +enum +{ + CALLBACK_CONTINUE = -1, + CALLBACK_PREVIOUS_MENU = -2, + CALLBACK_RESET = -3, + CALLBACK_EXIT = -4, +}; + +typedef enum CallbackAction +{ + ACTION_INIT, + ACTION_DEINIT, + ACTION_UPDATE, + ACTION_OK, + ACTION_LEFT, + ACTION_RIGHT +} CallbackAction; + +typedef struct Option +{ + const char *name; + int (*callback)(struct OptionsMenu *parent_menu, size_t this_option, CallbackAction action); + void *user_data; + const char *value_string; + long value; + BOOL disabled; + long attribute_size; + long attribute_index; +} Option; + +typedef struct OptionsMenu +{ + const char *title; + const char *subtitle; + struct Option *options; + size_t total_options; + int x_offset; + BOOL submenu; +} OptionsMenu; + +static BOOL restart_required; +static BOOL tweaks_restart_required; + +static const RECT rcMyChar[4] = { + {0, 16, 16, 32}, + {16, 16, 32, 32}, + {0, 16, 16, 32}, + {32, 16, 48, 32}, +}; + +unsigned int bMode; + +static const char* GetKeyName(int key) +{ + switch (key) + { + case BACKEND_KEYBOARD_A: + return "A"; + + case BACKEND_KEYBOARD_B: + return "B"; + + case BACKEND_KEYBOARD_C: + return "C"; + + case BACKEND_KEYBOARD_D: + return "D"; + + case BACKEND_KEYBOARD_E: + return "E"; + + case BACKEND_KEYBOARD_F: + return "F"; + + case BACKEND_KEYBOARD_G: + return "G"; + + case BACKEND_KEYBOARD_H: + return "H"; + + case BACKEND_KEYBOARD_I: + return "I"; + + case BACKEND_KEYBOARD_J: + return "J"; + + case BACKEND_KEYBOARD_K: + return "K"; + + case BACKEND_KEYBOARD_L: + return "L"; + + case BACKEND_KEYBOARD_M: + return "M"; + + case BACKEND_KEYBOARD_N: + return "N"; + + case BACKEND_KEYBOARD_O: + return "O"; + + case BACKEND_KEYBOARD_P: + return "P"; + + case BACKEND_KEYBOARD_Q: + return "Q"; + + case BACKEND_KEYBOARD_R: + return "R"; + + case BACKEND_KEYBOARD_S: + return "S"; + + case BACKEND_KEYBOARD_T: + return "T"; + + case BACKEND_KEYBOARD_U: + return "U"; + + case BACKEND_KEYBOARD_V: + return "V"; + + case BACKEND_KEYBOARD_W: + return "W"; + + case BACKEND_KEYBOARD_X: + return "X"; + + case BACKEND_KEYBOARD_Y: + return "Y"; + + case BACKEND_KEYBOARD_Z: + return "Z"; + + case BACKEND_KEYBOARD_0: + return "0"; + + case BACKEND_KEYBOARD_1: + return "1"; + + case BACKEND_KEYBOARD_2: + return "2"; + + case BACKEND_KEYBOARD_3: + return "3"; + + case BACKEND_KEYBOARD_4: + return "4"; + + case BACKEND_KEYBOARD_5: + return "5"; + + case BACKEND_KEYBOARD_6: + return "6"; + + case BACKEND_KEYBOARD_7: + return "7"; + + case BACKEND_KEYBOARD_8: + return "8"; + + case BACKEND_KEYBOARD_9: + return "9"; + + case BACKEND_KEYBOARD_F1: + return "F1"; + + case BACKEND_KEYBOARD_F2: + return "F2"; + + case BACKEND_KEYBOARD_F3: + return "F3"; + + case BACKEND_KEYBOARD_F4: + return "F4"; + + case BACKEND_KEYBOARD_F5: + return "F5"; + + case BACKEND_KEYBOARD_F6: + return "F6"; + + case BACKEND_KEYBOARD_F7: + return "F7"; + + case BACKEND_KEYBOARD_F8: + return "F8"; + + case BACKEND_KEYBOARD_F9: + return "F9"; + + case BACKEND_KEYBOARD_F10: + return "F10"; + + case BACKEND_KEYBOARD_F11: + return "F11"; + + case BACKEND_KEYBOARD_F12: + return "F12"; + + case BACKEND_KEYBOARD_UP: + return "Up"; + + case BACKEND_KEYBOARD_DOWN: + return "Down"; + + case BACKEND_KEYBOARD_LEFT: + return "Left"; + + case BACKEND_KEYBOARD_RIGHT: + return "Right"; + + case BACKEND_KEYBOARD_ESCAPE: + return "Escape"; + + case BACKEND_KEYBOARD_BACK_QUOTE: + return "`"; + + case BACKEND_KEYBOARD_TAB: + return "Tab"; + + case BACKEND_KEYBOARD_CAPS_LOCK: + return "Caps Lock"; + + case BACKEND_KEYBOARD_LEFT_SHIFT: + return "Left Shift"; + + case BACKEND_KEYBOARD_LEFT_CTRL: + return "Left Ctrl"; + + case BACKEND_KEYBOARD_LEFT_ALT: + return "Left Alt"; + + case BACKEND_KEYBOARD_SPACE: + return "Space"; + + case BACKEND_KEYBOARD_RIGHT_ALT: + return "Right Alt"; + + case BACKEND_KEYBOARD_RIGHT_CTRL: + return "Right Ctrl"; + + case BACKEND_KEYBOARD_RIGHT_SHIFT: + return "Right Shift"; + + case BACKEND_KEYBOARD_ENTER: + return "Enter"; + + case BACKEND_KEYBOARD_BACKSPACE: + return "Backspace"; + + case BACKEND_KEYBOARD_MINUS: + return "-"; + + case BACKEND_KEYBOARD_EQUALS: + return "="; + + case BACKEND_KEYBOARD_LEFT_BRACKET: + return "["; + + case BACKEND_KEYBOARD_RIGHT_BRACKET: + return "]"; + + case BACKEND_KEYBOARD_BACK_SLASH: + return "\\"; + + case BACKEND_KEYBOARD_SEMICOLON: + return ";"; + + case BACKEND_KEYBOARD_APOSTROPHE: + return "'"; + + case BACKEND_KEYBOARD_COMMA: + return ","; + + case BACKEND_KEYBOARD_PERIOD: + return "."; + + case BACKEND_KEYBOARD_FORWARD_SLASH: + return "/"; + } + + return "Unknown"; +} + +static void PutTextCentred(int x, int y, const char *text, unsigned long color) +{ + size_t string_width = 0; + size_t string_height = font_height; + + for (const char *text_pointer = text; *text_pointer != '\0';) + { + if (IsShiftJIS(*text_pointer)) + { + text_pointer += 2; + string_width += font_width * 2; + } + else + { + text_pointer += 1; + string_width += font_width/2; + } + } + + PutText(x - string_width / 2, y - string_height / 2, text, color); +} + +static void PutTitleTextCentered(int x, int y, const char *text, unsigned long color) +{ + size_t string_width = 0; + size_t string_height = title_height; + + for (const char *text_pointer = text; *text_pointer != '\0';) + { + if (IsShiftJIS(*text_pointer)) + { + text_pointer += 2; + string_width += font_width * 2; + } + else + { + text_pointer += 1; + string_width += font_width; + } + } + + PutTitleText(x - string_width / 2, y - string_height / 2, text, color); +} + + +static int EnterOptionsMenu(OptionsMenu *options_menu, size_t selected_option) +{ + int scroll = 0; + int frame_x; + int frame_y; + + unsigned int anime = 0; + + int return_value; + + // Initialise options + for (size_t i = 0; i < options_menu->total_options; ++i) + options_menu->options[i].callback(options_menu, i, ACTION_INIT); + + RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + + for (;;) + { + // Get pressed keys + GetTrg(); + + // Allow unpausing by pressing the pause button only when in the main pause menu (not submenus) + if (!options_menu->submenu && gKeyTrg & KEY_PAUSE) + { + return_value = CALLBACK_CONTINUE; + break; + } + + // Go back one submenu when the 'cancel' button is pressed + if (gKeyTrg & gKeyCancel) + { + return_value = CALLBACK_CONTINUE; + break; + } + + // Handling up/down input + if (gKeyTrg & (gKeyUp | gKeyDown)) + { + const size_t old_selection = selected_option; + + if (gKeyTrg & gKeyDown) + if (selected_option++ == options_menu->total_options - 1) + selected_option = 0; + + if (gKeyTrg & gKeyUp) + if (selected_option-- == 0) + selected_option = options_menu->total_options - 1; + + // Update the menu-scrolling, if there are more options than can be fit on the screen + if (selected_option < old_selection) + scroll = MAX(0, MIN(scroll, (int)selected_option - 1)); + + if (selected_option > old_selection) + scroll = MIN(MAX(0, (int)options_menu->total_options - MAX_OPTIONS), MAX(scroll, (int)selected_option - (MAX_OPTIONS - 2))); + + PlaySoundObject(SND_SWITCH_WEAPON, SOUND_MODE_PLAY); + } + + // Run option callbacks + for (size_t i = 0; i < options_menu->total_options; ++i) + { + if (!options_menu->options[i].disabled) + { + CallbackAction action = ACTION_UPDATE; + + if (i == selected_option) + { + if (gKeyTrg & gKeyOk) + action = ACTION_OK; + else if (gKeyTrg & gKeyLeft) + action = ACTION_LEFT; + else if (gKeyTrg & gKeyRight) + action = ACTION_RIGHT; + } + + return_value = options_menu->options[i].callback(options_menu, i, action); + + // If the callback returned something other than CALLBACK_CONTINUE, it's time to exit this submenu + if (return_value != CALLBACK_CONTINUE) + break; + } + } + + if (return_value != CALLBACK_CONTINUE) + break; + + // Update Quote animation counter + if (++anime >= 80) + anime = 0; + + // Draw screen + if (bMode == 1) { // Action Mode + PutBitmap3(&rcView, 0, 0, &pauseView, SURFACE_ID_SCREEN_GRAB); + PutBitmap3(&rcView, 0, 0, &pauseView, SURFACE_ID_MENU_OVERLAY); + } + else if (bMode == 2){ + CortBox(&rcView,0x202020); + } + else{ + if(anime % 2 == 0) + ActBack(); + + GetFramePosition(&frame_x, &frame_y); + PutBack(frame_x, frame_y); + PutBitmap3(&rcView, 0, 0, &pauseView, SURFACE_ID_MENU_OVERLAY); + } + + const size_t visible_options = MIN(MAX_OPTIONS, options_menu->total_options); + + int y = (WINDOW_HEIGHT / 2) - ((visible_options * 20) / 2) - (40 / 2); + + // Draw title + PutTitleTextCentered(WINDOW_WIDTH / 2, y, options_menu->title, RGB(0x73, 0x73, 0x73)); + + // Draw subtitle + if (options_menu->subtitle != NULL) + PutTextCentred(WINDOW_WIDTH / 2, y + 14, options_menu->subtitle, RGB(0xFF, 0xFF, 0xFF)); + + y += 40; + + RECT top_arrow_view = {181,124,195,138}; + RECT bottom_arrow_view = {196,124,210,138}; + + + if(scroll != 0){ + PutBitmap3(&rcView, PixelToScreenCoord((WINDOW_WIDTH / 2) + options_menu->x_offset - 19), PixelToScreenCoord( (WINDOW_HEIGHT / 2) + (10 * 1) - (((visible_options - 1) * 20) / 2) - 22 - abs(static_cast(anime / 20 % 4 - 1))), &top_arrow_view, SURFACE_ID_CARET); + } + + if(scroll + visible_options < options_menu->total_options && options_menu->total_options > MAX_OPTIONS){ + PutBitmap3(&rcView, PixelToScreenCoord((WINDOW_WIDTH / 2) + options_menu->x_offset - 19), PixelToScreenCoord((WINDOW_HEIGHT / 2) + (10 * 1) - (((visible_options - 1) * 20) / 2) + 133 + abs(static_cast(anime / 20 % 4 - 1))), &bottom_arrow_view, SURFACE_ID_CARET); + } + + for (size_t i = scroll; i < scroll + visible_options; ++i) + { + const int x = (WINDOW_WIDTH / 2) + options_menu->x_offset; + const int y = (WINDOW_HEIGHT / 2) + (10 * 1) - (((visible_options - 1) * 20) / 2) + ((i - scroll) * 20) - 10; + + // Draw Quote next to the selected option + if (i == selected_option) + PutBitmap3(&rcView, PixelToScreenCoord(x - 20), PixelToScreenCoord(y - 6), &rcMyChar[anime / 10 % 4], SURFACE_ID_MY_CHAR); + + unsigned long option_colour = options_menu->options[i].disabled ? RGB(0x80, 0x80, 0x80) : (i == selected_option? RGB(0xF5, 0xFE, 0x56): RGB(0xF7, 0xF7, 0xEA)); + + // Draw option name + PutText(x, y - font_height / 2, options_menu->options[i].name, option_colour); + + // Draw option value, if it has one + if (options_menu->options[i].value_string != NULL){ + const char* attribute_format = "%s %s %s"; + const char* left_move_arrow = options_menu->options[i].attribute_index > 0 ? "<" : " "; + const char* right_move_arrow = options_menu->options[i].attribute_index < options_menu->options[i].attribute_size -1? ">" : " "; + + char attribute_str[80] = { }; + sprintf(attribute_str, attribute_format, left_move_arrow, options_menu->options[i].value_string, right_move_arrow); + + PutText(x + 130, y - (font_height / 2), attribute_str, option_colour); + } + } + + PutFramePerSecound(); + + if (!Flip_SystemTask()) + { + // Quit if window is closed + return_value = CALLBACK_EXIT; + break; + } + } + + // Deinitialise options + for (size_t i = 0; i < options_menu->total_options; ++i) + options_menu->options[i].callback(options_menu, i, ACTION_DEINIT); + + return return_value; +} + +/////////////////// +// Controls menu // +/////////////////// + +typedef struct Control +{ + const char *name; + size_t binding_index; + unsigned char groups; +} Control; + +// The bitfield on the right determines which 'group' the +// control belongs to - if two controls are in the same group, +// they cannot be bound to the same key. +static const Control controls[] = { + {menu_strings_table[CONTROLS_UP], BINDING_UP, (1 << 0) | (1 << 1)}, + {menu_strings_table[CONTROLS_DOWN], BINDING_DOWN, (1 << 0) | (1 << 1)}, + {menu_strings_table[CONTROLS_LEFT], BINDING_LEFT, (1 << 0) | (1 << 1)}, + {menu_strings_table[CONTROLS_RIGHT], BINDING_RIGHT, (1 << 0) | (1 << 1)}, + {menu_strings_table[CONTROLS_OK], BINDING_OK, 1 << 1}, + {menu_strings_table[CONTROLS_CANCEL], BINDING_CANCEL, 1 << 1}, + {menu_strings_table[CONTROLS_JUMP], BINDING_JUMP, 1 << 0}, + {menu_strings_table[CONTROLS_SHOOT], BINDING_SHOT, 1 << 0}, + {menu_strings_table[CONTROLS_NEXT_WEAPON], BINDING_ARMS, 1 << 0}, + {menu_strings_table[CONTROLS_PREV_WEAPON], BINDING_ARMSREV, 1 << 0}, + {menu_strings_table[CONTROLS_INVENTORY], BINDING_ITEM, 1 << 0}, + {menu_strings_table[CONTROLS_MAP], BINDING_MAP, 1 << 0}, + {menu_strings_table[CONTROLS_PAUSE], BINDING_PAUSE, 1 << 0}, + {menu_strings_table[CONTROLS_STRAFE], BINDING_STRAFE, 1 << 0} + +}; + +static char bound_name_buffers[sizeof(controls) / sizeof(controls[0])][20]; + +static int Callback_ControlsKeyboard_Rebind(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + switch (action) + { + default: + break; + + case ACTION_INIT: + strncpy(bound_name_buffers[this_option], GetKeyName(bindings[controls[this_option].binding_index].keyboard), sizeof(bound_name_buffers[0]) - 1); + break; + + case ACTION_OK: + PlaySoundObject(5, SOUND_MODE_PLAY); + + char timeout_string[2]; + timeout_string[1] = '\0'; + + bool previous_keyboard_state[BACKEND_KEYBOARD_TOTAL]; + memcpy(previous_keyboard_state, gKeyboardState, sizeof(gKeyboardState)); + + // Time-out and exit if the user takes too long (they probably don't want to rebind) + for (unsigned int timeout = (60 * 5) - 1; timeout != 0; --timeout) + { + for (int scancode = 0; scancode < BACKEND_KEYBOARD_TOTAL; ++scancode) + { + // Wait for user to press a key + if (!previous_keyboard_state[scancode] && gKeyboardState[scancode]) + { + const char *key_name = GetKeyName(scancode); + + // If another control in the same group uses this key, swap them + for (size_t other_option = 0; other_option < parent_menu->total_options; ++other_option) + { + if (other_option != this_option && controls[other_option].groups & controls[this_option].groups && bindings[controls[other_option].binding_index].keyboard == scancode) + { + bindings[controls[other_option].binding_index].keyboard = bindings[controls[this_option].binding_index].keyboard; + memcpy(bound_name_buffers[other_option], bound_name_buffers[this_option], sizeof(bound_name_buffers[0])); + break; + } + } + + // Otherwise just overwrite the selected control + bindings[controls[this_option].binding_index].keyboard = scancode; + strncpy(bound_name_buffers[this_option], key_name, sizeof(bound_name_buffers[0]) - 1); + + PlaySoundObject(18, SOUND_MODE_PLAY); + + gKeyTrg = gKey = 0; // Prevent weird input-ghosting by doing this + return CALLBACK_CONTINUE; + } + } + + memcpy(previous_keyboard_state, gKeyboardState, sizeof(gKeyboardState)); + + // Draw screen + CortBox(&grcFull, 0x000000); + + const char *string = menu_strings_table[CONTROLS_PUSH_KEY]; + PutTextCentred((WINDOW_WIDTH / 2), (WINDOW_HEIGHT / 2) - 10, string, RGB(0xFF, 0xFF, 0xFF)); + PutTextCentred((WINDOW_WIDTH / 2) , (WINDOW_HEIGHT / 2) + 10, parent_menu->options[this_option].name, RGB(0xFF, 0xFF, 0xFF)); + + timeout_string[0] = '0' + (timeout / 60) + 1; + PutTextCentred(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2 + 60, timeout_string, RGB(0xFF, 0xFF, 0xFF)); + + PutFramePerSecound(); + + if (!Flip_SystemTask()) + { + // Quit if window is closed + return CALLBACK_EXIT; + } + } + + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_ControlsKeyboard(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + (void)parent_menu; + + if (action != ACTION_OK) + return CALLBACK_CONTINUE; + + Option options[sizeof(controls) / sizeof(controls[0])]; + + for (size_t i = 0; i < sizeof(controls) / sizeof(controls[0]); ++i) + { + options[i].name = controls[i].name; + options[i].callback = Callback_ControlsKeyboard_Rebind; + options[i].value_string = bound_name_buffers[i]; + options[i].disabled = FALSE; + options[i].attribute_index = -1; + options[i].attribute_size = 0; + + strncpy(bound_name_buffers[i], GetKeyName(bindings[controls[i].binding_index].keyboard), sizeof(bound_name_buffers[0]) - 1); + } + + OptionsMenu options_menu = { + menu_strings_table[CONTROLS_KEYBOARD_TITLE], + NULL, + options, + sizeof(options) / sizeof(options[0]), + -60, + TRUE + }; + + PlaySoundObject(5, SOUND_MODE_PLAY); + + const int return_value = EnterOptionsMenu(&options_menu, 0); + + PlaySoundObject(5, SOUND_MODE_PLAY); + + return return_value; +} + +static int Callback_ControlsController_Rebind(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + switch (action) + { + default: + break; + + case ACTION_INIT: + // Name each bound button + if (bindings[controls[this_option].binding_index].controller == 0xFF) + strncpy(bound_name_buffers[this_option], menu_strings_table[CONTROLS_UNBOUND], sizeof(bound_name_buffers[0])); + else + strncpy(bound_name_buffers[this_option], ControllerBackend_GetButtonName(bindings[controls[this_option].binding_index].controller), sizeof(bound_name_buffers[0])); + + break; + + case ACTION_OK: + PlaySoundObject(5, SOUND_MODE_PLAY); + + DIRECTINPUTSTATUS old_state = gJoystickState; + + char timeout_string[2]; + timeout_string[1] = '\0'; + + // Time-out and exit if the user takes too long (they probably don't want to rebind) + for (unsigned int timeout = (60 * 5) - 1; timeout != 0; --timeout) + { + for (int button = 0; button < sizeof(gJoystickState.bButton) / sizeof(gJoystickState.bButton[0]); ++button) + { + // Wait for user to press a button + if (!old_state.bButton[button] && gJoystickState.bButton[button]) + { + // If another control in the same group uses this button, swap them + for (size_t other_option = 0; other_option < parent_menu->total_options; ++other_option) + { + if (other_option != this_option && controls[other_option].groups & controls[this_option].groups && bindings[controls[other_option].binding_index].controller == button) + { + bindings[controls[other_option].binding_index].controller = bindings[controls[this_option].binding_index].controller; + memcpy(bound_name_buffers[other_option], bound_name_buffers[this_option], sizeof(bound_name_buffers[0])); + break; + } + } + + // Otherwise just overwrite the selected control + bindings[controls[this_option].binding_index].controller = button; + strncpy(bound_name_buffers[this_option], ControllerBackend_GetButtonName(button), sizeof(bound_name_buffers[0])); + + PlaySoundObject(18, SOUND_MODE_PLAY); + + gKeyTrg = gKey = 0; // Prevent weird input-ghosting by doing this + return CALLBACK_CONTINUE; + } + } + + old_state = gJoystickState; + + // Draw screen + CortBox(&grcFull, 0x000000); + + const char *string = menu_strings_table[CONTROLS_PUSH_BUTTON]; + PutTextCentred((WINDOW_WIDTH / 2) , (WINDOW_HEIGHT / 2) - 10, string, RGB(0xFF, 0xFF, 0xFF)); + PutTextCentred((WINDOW_WIDTH / 2) , (WINDOW_HEIGHT / 2) + 10, parent_menu->options[this_option].name, RGB(0xFF, 0xFF, 0xFF)); + + timeout_string[0] = '0' + (timeout / 60) + 1; + PutTextCentred(WINDOW_WIDTH, WINDOW_HEIGHT / 2 + 60, timeout_string, RGB(0xFF, 0xFF, 0xFF)); + + PutFramePerSecound(); + + if (!Flip_SystemTask()) + { + // Quit if window is closed + return CALLBACK_EXIT; + } + } + + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_ControlsController(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + (void)parent_menu; + + if (action != ACTION_OK) + return CALLBACK_CONTINUE; + + Option options[sizeof(controls) / sizeof(controls[0])]; + + for (size_t i = 0; i < sizeof(controls) / sizeof(controls[0]); ++i) + { + options[i].name = controls[i].name; + options[i].callback = Callback_ControlsController_Rebind; + options[i].value_string = bound_name_buffers[i]; + options[i].disabled = FALSE; + options[i].attribute_index = -1; + options[i].attribute_size = 0; + } + + OptionsMenu options_menu = { + #if !defined(__WIIU__) && !defined(_3DS) + menu_strings_table[CONTROLS_TITLE], + NULL, + #else + menu_strings_table[CONTROLS_GAMEPAD_TITLE], + ControllerBackend_GetControllerName(), + #endif + options, + sizeof(options) / sizeof(options[0]), + -70, + TRUE + }; + + PlaySoundObject(5, SOUND_MODE_PLAY); + + const int return_value = EnterOptionsMenu(&options_menu, 0); + + PlaySoundObject(18, SOUND_MODE_PLAY); + + return return_value; +} + +///////////////////// +// Soundtrack menu // +///////////////////// + +static int Callback_Soundtrack_Option(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + switch (action) + { + default: + break; + + case ACTION_INIT: + parent_menu->options[this_option].disabled = !CheckSoundtrackExists(this_option); + break; + + case ACTION_OK: + conf->soundtrack = gSoundtrack = this_option; + + // Restart the songs, with the new soundtrack setting + MusicID current_song = gMusicNo; + MusicID previous_song = gOldNo; + gMusicNo = gOldNo = MUS_SILENCE; + ChangeMusic(previous_song); + ChangeMusic(current_song); + + return CALLBACK_PREVIOUS_MENU; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_Soundtrack(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + (void)parent_menu; + + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + if (action != ACTION_OK) + return CALLBACK_CONTINUE; + + const char *strings[] = {"Organya", "NES", "SNES", "Arranged", "New", "Remastered", "Famitracks", "Ridiculon"}; + + Option options[sizeof(strings) / sizeof(strings[0])]; + + for (size_t i = 0; i < sizeof(strings) / sizeof(strings[0]); ++i) + { + options[i].name = strings[i]; + options[i].callback = Callback_Soundtrack_Option; + options[i].user_data = conf; + options[i].value_string = NULL; + } + + OptionsMenu options_menu = { + menu_strings_table[SELECT_SOUNDTRACK], + "Check data/Soundtracks to obtain greyed-out soundtracks", + options, + sizeof(options) / sizeof(options[0]), + -30, + TRUE + }; + + PlaySoundObject(5, SOUND_MODE_PLAY); + + int return_value = EnterOptionsMenu(&options_menu, conf->soundtrack); + + // Check if we just want to go back to the previous menu + if (return_value == CALLBACK_PREVIOUS_MENU) + { + return_value = CALLBACK_CONTINUE; + + PlaySoundObject(18, SOUND_MODE_PLAY); + } + else + { + PlaySoundObject(5, SOUND_MODE_PLAY); + } + + return return_value; +} + +////////////////// +// Options menu // +////////////////// + +static int Callback_Framerate(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {menu_strings_table[FRAMERATE_50], menu_strings_table[FRAMERATE_60]}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->b60fps; + parent_menu->options[this_option].value_string = strings[conf->b60fps]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->b60fps = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + // Increment value (with wrapping) + parent_menu->options[this_option].value = (parent_menu->options[this_option].value + 1) % (sizeof(strings) / sizeof(strings[0])); + + gb60fps = parent_menu->options[this_option].value; + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_Font(OptionsMenu *parent_menu, size_t this_option, CallbackAction action){ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {"OpenDyslexic", "Monogram", "Lekton", "Courier New"}; + + const FONT_DATA f_data[] = { + {"opendyslexic", 15, 15, 29, 30}, + {"monogram", 13, 13, 26, 26}, + {"lekton", 12, 12, 26, 26}, + {"courier", 12, 12, 26, 26}, + }; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->font_select; + parent_menu->options[this_option].value_string = strings[conf->font_select]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->font_select = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + // Increment value (with wrapping) + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + gbFontData = f_data[parent_menu->options[this_option].value]; + +#if !defined(_3DS) + InitTextObject("hi"); +#else + parent_menu->subtitle = menu_strings_table[RESTART_REQUIRED]; +#endif + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_Vsync(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {menu_strings_table[OFF], menu_strings_table[ON]}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->bVsync; + parent_menu->options[this_option].value_string = strings[conf->bVsync]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->bVsync = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + restart_required = TRUE; + parent_menu->subtitle = menu_strings_table[RESTART_REQUIRED]; + + // Increment value (with wrapping) + parent_menu->options[this_option].value = (parent_menu->options[this_option].value + 1) % (sizeof(strings) / sizeof(strings[0])); + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_ScreenShake(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {menu_strings_table[OFF], menu_strings_table[ON]}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->bScreenShake; + parent_menu->options[this_option].value_string = strings[conf->bScreenShake]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->bScreenShake = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + // Increment value (with wrapping) + parent_menu->options[this_option].value = (parent_menu->options[this_option].value + 1) % (sizeof(strings) / sizeof(strings[0])); + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + gbScreenShake = parent_menu->options[this_option].value; + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_Resolution(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = { + menu_strings_table[RESOLUTION_FULL], + menu_strings_table[RESOLUTION_240], + menu_strings_table[RESOLUTION_480], + menu_strings_table[RESOLUTION_720], + menu_strings_table[RESOLUTION_960] + }; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->display_mode; + parent_menu->options[this_option].value_string = strings[conf->display_mode]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->display_mode = parent_menu->options[this_option].value; + break; + + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + restart_required = TRUE; + parent_menu->subtitle = menu_strings_table[RESTART_REQUIRED]; + + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_SmoothScrolling(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {menu_strings_table[OFF], menu_strings_table[ON]}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->bSmoothScrolling; + parent_menu->options[this_option].value_string = strings[conf->bSmoothScrolling]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->bSmoothScrolling = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + // Increment value (with wrapping) + parent_menu->options[this_option].value = (parent_menu->options[this_option].value + 1) % (sizeof(strings) / sizeof(strings[0])); + + gbSmoothScrolling = parent_menu->options[this_option].value; + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_ColorFilters(OptionsMenu *parent_menu, size_t this_option, CallbackAction action){ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = { + menu_strings_table[COLOR_NONE], + menu_strings_table[COLOR_PROTANOMALY], + menu_strings_table[COLOR_PROTANOPIA], + menu_strings_table[COLOR_DEUTERANOMALY], + menu_strings_table[COLOR_DEUTERANOPIA], + menu_strings_table[COLOR_TRITANOMALY], + menu_strings_table[COLOR_TRITANOPIA], + menu_strings_table[COLOR_GRAYSCALE], + menu_strings_table[COLOR_GENESIS], + menu_strings_table[COLOR_MSX], + menu_strings_table[COLOR_GAME_BOY] + }; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->color_filter; + parent_menu->options[this_option].value_string = strings[conf->color_filter]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->color_filter = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + gFilterIndex = parent_menu->options[this_option].value; + ReloadAll(); + if (bMode == 1){ + Reload_CurrentStageTiles(); + } + else if (bMode == 0){ + Reload_MenuBackground(); + } + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_FlashMode(OptionsMenu *parent_menu, size_t this_option, CallbackAction action){ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = { + menu_strings_table[PERCENT_100], + menu_strings_table[PERCENT_50], + menu_strings_table[PERCENT_0] + }; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->flash_mode; + parent_menu->options[this_option].value_string = strings[conf->flash_mode]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->flash_mode = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + gFlashMode = parent_menu->options[this_option].value; + InitFlash(); + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_ExtendedUI(OptionsMenu *parent_menu, size_t this_option, CallbackAction action){ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {menu_strings_table[OFF], menu_strings_table[ON]}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->bExtendedUI; + parent_menu->options[this_option].value_string = strings[conf->bExtendedUI]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->bExtendedUI = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + parent_menu->options[this_option].value = (parent_menu->options[this_option].value + 1) % (sizeof(strings) / sizeof(strings[0])); + + gExtendedUI = parent_menu->options[this_option].value; + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_EnableController(OptionsMenu *parent_menu, size_t this_option, CallbackAction action){ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {menu_strings_table[OFF], menu_strings_table[ON]}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->bUseJoystick; + parent_menu->options[this_option].value_string = strings[conf->bUseJoystick]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->bUseJoystick = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + parent_menu->options[this_option].value = (parent_menu->options[this_option].value + 1) % (sizeof(strings) / sizeof(strings[0])); + + gbUseJoystick = parent_menu->options[this_option].value; + parent_menu->options[this_option + 1].disabled = !gbUseJoystick; + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_BackgroundBrightness(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {"100%", "75%", "50%", "25%"}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->backgroundBrightness; + parent_menu->options[this_option].value_string = strings[conf->backgroundBrightness]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->backgroundBrightness = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + gDimmingFactor = (4.0 - parent_menu->options[this_option].value)/6; + ReloadAll(); + if (bMode == 1){ + Reload_CurrentStageTiles(); + } + else if (bMode == 0){ + Reload_MenuBackground(); + } + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_Graphics(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {"Original", "Upscaled"}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->graphics_set; + parent_menu->options[this_option].value_string = strings[conf->graphics_set]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->graphics_set = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + gSpriteScale = 1 + parent_menu->options[this_option].value; + gSpritePath = gDataPath + (gSpriteScale == 2? "/sprites_up": "/sprites_og"); + ReloadAll(); + if (bMode == 1){ + Reload_CurrentStageTiles(); + } + else if (bMode == 0){ + Reload_MenuBackground(); + } + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_Options(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + (void)parent_menu; + + if (action != ACTION_OK) + return CALLBACK_CONTINUE; + + // Make the options match the configuration data + CONFIGDATA conf; + if (!LoadConfigData(&conf)) + DefaultConfigData(&conf); + +#if !defined(__WIIU__) && !defined(_3DS) + Option options[] = { + {menu_strings_table[CONTROLS_KEYBOARD], Callback_ControlsKeyboard, NULL, NULL, 0, FALSE}, + {menu_strings_table[CONTROLS_ENABLE_GAMEPAD], Callback_EnableController, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[CONTROLS_GAMEPAD], Callback_ControlsController, NULL, NULL, 0, !gbUseJoystick, 0, 0}, + {menu_strings_table[SOUNDTRACK], Callback_Soundtrack, &conf, NULL, 0, FALSE}, + {menu_strings_table[FRAMERATE], Callback_Framerate, &conf, NULL, 0, FALSE}, + {menu_strings_table[V_SYNC], Callback_Vsync, &conf, NULL, 0, FALSE}, + {menu_strings_table[RESOLUTION], Callback_Resolution, &conf, NULL, 0, FALSE}, + {menu_strings_table[SMOOTH_SCROLLING], Callback_SmoothScrolling, &conf, NULL, 0, FALSE}, + {menu_strings_table[SCREEN_SHAKE], Callback_ScreenShake, &conf, NULL, 0, FALSE, 0, 0}, + #if GAMELANG != JP + {"Font", Callback_Font, &conf, NULL, 0, FALSE, 0, 0}, + #endif + {menu_strings_table[COLOR_FILTERS], Callback_ColorFilters, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[SCREEN_FLASHING], Callback_FlashMode, &conf, NULL, 0, FALSE, 0, 0}, + {"Background Brightness", Callback_BackgroundBrightness, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[EXTENDED_UI], Callback_ExtendedUI, &conf, NULL, 0, FALSE, 0, 0} + }; +#else + Option options[] = { + {menu_strings_table[CONTROLS], Callback_ControlsController, NULL, NULL, 0, FALSE}, + {menu_strings_table[SOUNDTRACK], Callback_Soundtrack, &conf, NULL, 0, FALSE}, + {menu_strings_table[FRAMERATE], Callback_Framerate, &conf, NULL, 0, FALSE}, + {menu_strings_table[SMOOTH_SCROLLING], Callback_SmoothScrolling, &conf, NULL, 0, FALSE}, + {menu_strings_table[SCREEN_SHAKE], Callback_ScreenShake, &conf, NULL, 0, FALSE, 0, 0}, +#if GAMELANG != JP + {"Font", Callback_Font, &conf, NULL, 0, FALSE, 0, 0}, +#endif + {menu_strings_table[COLOR_FILTERS], Callback_ColorFilters, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[SCREEN_FLASHING], Callback_FlashMode, &conf, NULL, 0, FALSE, 0, 0}, + {"Background Brightness", Callback_BackgroundBrightness, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[EXTENDED_UI], Callback_ExtendedUI, &conf, NULL, 0, FALSE, 0, 0} + }; +#endif + + OptionsMenu options_menu = { + menu_strings_table[OPTIONS_TITLE], + restart_required ? menu_strings_table[RESTART_REQUIRED] : NULL, + options, + (sizeof(options) / sizeof(options[0])), + -130, + TRUE + }; + + PlaySoundObject(5, SOUND_MODE_PLAY); + + const int return_value = EnterOptionsMenu(&options_menu, 0); + + PlaySoundObject(18, SOUND_MODE_PLAY); + + // Save our changes to the configuration file + memcpy(conf.bindings, bindings, sizeof(bindings)); + + SaveConfigData(&conf); + + return return_value; +} + +///////////////// +// Tweaks Menu // +///////////////// + +static int Callback_NoExpDrops(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {menu_strings_table[OFF], menu_strings_table[ON]}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->bNoExpDrops; + parent_menu->options[this_option].value_string = strings[conf->bNoExpDrops]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->bNoExpDrops = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + // Increment value (with wrapping) + parent_menu->options[this_option].value = (parent_menu->options[this_option].value + 1) % (sizeof(strings) / sizeof(strings[0])); + + gbNoExpDrops = parent_menu->options[this_option].value; + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_DamageModifier(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = { + menu_strings_table[PERCENT_100], + menu_strings_table[PERCENT_200], + menu_strings_table[DAMAGE_OHKO], + menu_strings_table[PERCENT_0], + menu_strings_table[PERCENT_50] + }; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->damage_modifier; + parent_menu->options[this_option].value_string = strings[conf->damage_modifier]; + parent_menu->options[this_option].attribute_index = (parent_menu->options[this_option].value +2) % 5; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->damage_modifier = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + switch(parent_menu->options[this_option].value){ + case 0: + gbDamageModifier = 1; + break; + case 1: + gbDamageModifier = 2; + break; + case 2: + gbDamageModifier = -1; + break; + case 3: + gbDamageModifier = 0; + break; + case 4: + gbDamageModifier = 0.5; + break; + } + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = (parent_menu->options[this_option].value +2) % 5; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_AutoFire(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = { + menu_strings_table[OFF], + menu_strings_table[AUTOFIRE_HOLD], + menu_strings_table[AUTOFIRE_SWITCH] + }; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->autoFire; + parent_menu->options[this_option].value_string = strings[conf->autoFire]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->autoFire = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + gbAutoFire = parent_menu->options[this_option].value; + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_InfiniteAmmo(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {menu_strings_table[OFF], menu_strings_table[ON]}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->bInfiniteAmmo; + parent_menu->options[this_option].value_string = strings[conf->bInfiniteAmmo]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->bInfiniteAmmo = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + // Increment value (with wrapping) + parent_menu->options[this_option].value = (parent_menu->options[this_option].value + 1) % (sizeof(strings) / sizeof(strings[0])); + + gbInfiniteAmmo = parent_menu->options[this_option].value; + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_DefaultBooster(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = { + menu_strings_table[DEFAULT_BOOSTER_NONE], + menu_strings_table[DEFAULT_BOOSTER_08], + menu_strings_table[DEFAULT_BOOSTER_20] + }; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->defaultBooster; + parent_menu->options[this_option].value_string = strings[conf->defaultBooster]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->defaultBooster = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + gDefaultBooster = parent_menu->options[this_option].value; + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_InfiniteBooster(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {menu_strings_table[OFF], menu_strings_table[ON]}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->bInfiniteBooster; + parent_menu->options[this_option].value_string = strings[conf->bInfiniteBooster]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->bInfiniteBooster = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + // Increment value (with wrapping) + parent_menu->options[this_option].value = (parent_menu->options[this_option].value + 1) % (sizeof(strings) / sizeof(strings[0])); + + gbInfiniteBoost = parent_menu->options[this_option].value; + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_GraceJump(OptionsMenu *parent_menu, size_t this_option, CallbackAction action){ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = {menu_strings_table[OFF], menu_strings_table[ON]}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->bGraceJumps; + parent_menu->options[this_option].value_string = strings[conf->bGraceJumps]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->bGraceJumps = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + // Increment value (with wrapping) + parent_menu->options[this_option].value = (parent_menu->options[this_option].value + 1) % (sizeof(strings) / sizeof(strings[0])); + + gbGraceJump = parent_menu->options[this_option].value; + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_GameSpeed(OptionsMenu *parent_menu, size_t this_option, CallbackAction action){ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = { + menu_strings_table[PERCENT_50], + menu_strings_table[PERCENT_60], + menu_strings_table[PERCENT_70], + menu_strings_table[PERCENT_80], + menu_strings_table[PERCENT_90], + menu_strings_table[PERCENT_100], + menu_strings_table[PERCENT_110], + menu_strings_table[PERCENT_120], + menu_strings_table[PERCENT_130], + menu_strings_table[PERCENT_140], + menu_strings_table[PERCENT_150], + }; + + const double values[] = {0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5}; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->game_speed_multiplier; + parent_menu->options[this_option].value_string = strings[conf->game_speed_multiplier]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->game_speed_multiplier = parent_menu->options[this_option].value; + gCounter = gCorrectedCounter = 0; + gSpeedMultiplier = values[parent_menu->options[this_option].value]; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + // Increment value (with wrapping) + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = parent_menu->options[this_option].value; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_BossHealthModifier(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + CONFIGDATA *conf = (CONFIGDATA*)parent_menu->options[this_option].user_data; + + const char *strings[] = { + menu_strings_table[PERCENT_100], + menu_strings_table[PERCENT_150], + menu_strings_table[PERCENT_200], + menu_strings_table[BOSS_1_HP], + menu_strings_table[PERCENT_50], + }; + + switch (action) + { + case ACTION_INIT: + parent_menu->options[this_option].value = conf->boss_health_multiplier; + parent_menu->options[this_option].value_string = strings[conf->boss_health_multiplier]; + parent_menu->options[this_option].attribute_index = (parent_menu->options[this_option].value + 2) % 5; + parent_menu->options[this_option].attribute_size = sizeof(strings)/sizeof(strings[0]); + break; + + case ACTION_DEINIT: + conf->boss_health_multiplier = parent_menu->options[this_option].value; + break; + + case ACTION_OK: + case ACTION_LEFT: + case ACTION_RIGHT: + + if (action == ACTION_LEFT) + { + // Decrement value (with wrapping) + if (--parent_menu->options[this_option].value < 0) + parent_menu->options[this_option].value = (sizeof(strings) / sizeof(strings[0])) - 1; + } + else + { + // Increment value (with wrapping) + if (++parent_menu->options[this_option].value > (sizeof(strings) / sizeof(strings[0])) - 1) + parent_menu->options[this_option].value = 0; + } + + switch(parent_menu->options[this_option].value){ + case 0: + gBossHPMultiplier = 1; + break; + case 1: + gBossHPMultiplier = 1.5; + break; + case 2: + gBossHPMultiplier = 2; + break; + case 3: + gBossHPMultiplier = -1; + break; + case 4: + gBossHPMultiplier = 0.5; + break; + } + + PlaySoundObject(SND_YES_NO_CHANGE_CHOICE, SOUND_MODE_PLAY); + + parent_menu->options[this_option].value_string = strings[parent_menu->options[this_option].value]; + parent_menu->options[this_option].attribute_index = (parent_menu->options[this_option].value + 2) % 5; + break; + + case ACTION_UPDATE: + break; + } + + return CALLBACK_CONTINUE; +} + +static int Callback_Tweaks(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + (void)parent_menu; + + if (action != ACTION_OK) + return CALLBACK_CONTINUE; + + // Make the options match the configuration data + CONFIGDATA conf; + if (!LoadConfigData(&conf)) + DefaultConfigData(&conf); + + Option submenu_options[] = { + {menu_strings_table[DAMAGE_RECEIVED], Callback_DamageModifier, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[BOSS_HP], Callback_BossHealthModifier, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[AUTOFIRE], Callback_AutoFire, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[INFINITE_AMMO], Callback_InfiniteAmmo, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[DEFAULT_BOOSTER], Callback_DefaultBooster, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[INFINITE_BOOSTER], Callback_InfiniteBooster, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[GRACE_JUMPS], Callback_GraceJump, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[NO_EXPERIENCE_DROPS], Callback_NoExpDrops, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[GAME_SPEED], Callback_GameSpeed, &conf, NULL, 0, FALSE, 0, 0} + }; + + OptionsMenu options_menu = { + menu_strings_table[TWEAKS_TITLE], + tweaks_restart_required ? menu_strings_table[RESTART_REQUIRED] : NULL, + submenu_options, + (sizeof(submenu_options) / sizeof(submenu_options[0])), + -130, + TRUE + }; + + PlaySoundObject(5, SOUND_MODE_PLAY); + + const int return_value = EnterOptionsMenu(&options_menu, 0); + + PlaySoundObject(18, SOUND_MODE_PLAY); + + // Save our changes to the configuration file + memcpy(conf.bindings, bindings, sizeof(bindings)); + + SaveConfigData(&conf); + + return return_value; +} + + +//////////////// +// Pause menu // +//////////////// + +static int PromptAreYouSure(void) +{ + struct FunctionHolder + { + static int Callback_Yes(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) + { + (void)parent_menu; + (void)this_option; + + if (action != ACTION_OK) + return CALLBACK_CONTINUE; + + return 1; // Yes + } + + static int Callback_No(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) + { + (void)parent_menu; + (void)this_option; + + if (action != ACTION_OK) + return CALLBACK_CONTINUE; + + return 0; // No + } + }; + + Option options[] = { + {menu_strings_table[YES], FunctionHolder::Callback_Yes, NULL, NULL, 0, FALSE}, + {menu_strings_table[NO], FunctionHolder::Callback_No, NULL, NULL, 0, FALSE} + }; + + OptionsMenu options_menu = { + menu_strings_table[ARE_YOU_SURE], + menu_strings_table[UNSAVED_PROGRESS], + options, + sizeof(options) / sizeof(options[0]), + -10, + TRUE + }; + + PlaySoundObject(5, SOUND_MODE_PLAY); + + int return_value = EnterOptionsMenu(&options_menu, 1); + + PlaySoundObject(18, SOUND_MODE_PLAY); + + return return_value; +} + +static int Callback_Resume(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + (void)parent_menu; + + if (action != ACTION_OK) + return CALLBACK_CONTINUE; + + PlaySoundObject(18, SOUND_MODE_PLAY); + return enum_ESCRETURN_continue; +} + +static int Callback_Reset(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + (void)parent_menu; + + if (action != ACTION_OK) + return CALLBACK_CONTINUE; + + int return_value = PromptAreYouSure(); + + switch (return_value) + { + case 0: + return_value = CALLBACK_CONTINUE; // Go back to previous menu + break; + + case 1: + return_value = CALLBACK_RESET; // Restart game + break; + } + + return return_value; +} + +static int Callback_Quit(OptionsMenu *parent_menu, size_t this_option, CallbackAction action) +{ + (void)parent_menu; + + if (action != ACTION_OK) + return CALLBACK_CONTINUE; + + int return_value = PromptAreYouSure(); + + switch (return_value) + { + case 0: + return_value = CALLBACK_CONTINUE; // Go back to previous menu + break; + + case 1: + return_value = CALLBACK_EXIT; // Exit game + break; + } + + return return_value; +} + +int Call_Pause(unsigned int mode_action) +{ + Option options[] = { + {menu_strings_table[RESUME], Callback_Resume, NULL, NULL, 0, FALSE}, + {menu_strings_table[RESET], Callback_Reset, NULL, NULL, 0, FALSE}, + {menu_strings_table[OPTIONS], Callback_Options, NULL, NULL, 0, FALSE}, + {menu_strings_table[TWEAKS], Callback_Tweaks, NULL, NULL, 0, FALSE}, + {menu_strings_table[QUIT], Callback_Quit, NULL, NULL, 0, FALSE} + }; + + OptionsMenu options_menu = { + menu_strings_table[PAUSED], + NULL, + options, + sizeof(options) / sizeof(options[0]), + -24, + FALSE + }; + + bMode = mode_action; + + int return_value = EnterOptionsMenu(&options_menu, 0); + + // Filter internal return values to something Cave Story can understand + switch (return_value) + { + case CALLBACK_CONTINUE: + return_value = enum_ESCRETURN_continue; + break; + + case CALLBACK_RESET: + return_value = enum_ESCRETURN_restart; + break; + + case CALLBACK_EXIT: + return_value = enum_ESCRETURN_exit; + break; + } + + gKeyTrg = gKey = 0; // Avoid input-ghosting + + return return_value; +} + +int Call_Options(unsigned int mode_action) +{ + // Make the options match the configuration data + CONFIGDATA conf; + if (!LoadConfigData(&conf)) + DefaultConfigData(&conf); + +#if !defined(__WIIU__) && !defined(_3DS) + Option options[] = { + {menu_strings_table[CONTROLS_KEYBOARD], Callback_ControlsKeyboard, NULL, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[CONTROLS_ENABLE_GAMEPAD], Callback_EnableController, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[CONTROLS_GAMEPAD], Callback_ControlsController, NULL, NULL, 0, !gbUseJoystick, 0, 0}, + {menu_strings_table[SOUNDTRACK], Callback_Soundtrack, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[FRAMERATE], Callback_Framerate, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[V_SYNC], Callback_Vsync, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[RESOLUTION], Callback_Resolution, &conf, NULL, 0, FALSE, 0, 0}, + #if !defined(JAPANESE) && !defined(SPANISH) + {"Graphics Set", Callback_Graphics, &conf, NULL, 0, FALSE, 0, 0}, + #endif + {menu_strings_table[SMOOTH_SCROLLING], Callback_SmoothScrolling, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[SCREEN_SHAKE], Callback_ScreenShake, &conf, NULL, 0, FALSE, 0, 0}, + #ifndef JAPANESE + {"Font", Callback_Font, &conf, NULL, 0, FALSE, 0, 0}, + #endif + {menu_strings_table[COLOR_FILTERS], Callback_ColorFilters, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[SCREEN_FLASHING], Callback_FlashMode, &conf, NULL, 0, FALSE, 0, 0}, + {"Background Brightness", Callback_BackgroundBrightness, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[EXTENDED_UI], Callback_ExtendedUI, &conf, NULL, 0, FALSE, 0, 0} + }; +#else + Option options[] = { + {menu_strings_table[CONTROLS], Callback_ControlsController, NULL, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[SOUNDTRACK], Callback_Soundtrack, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[FRAMERATE], Callback_Framerate, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[SMOOTH_SCROLLING], Callback_SmoothScrolling, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[SCREEN_SHAKE], Callback_ScreenShake, &conf, NULL, 0, FALSE, 0, 0}, + #ifndef JAPANESE + {"Font", Callback_Font, &conf, NULL, 0, FALSE, 0, 0}, + #endif + {menu_strings_table[COLOR_FILTERS], Callback_ColorFilters, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[SCREEN_FLASHING], Callback_FlashMode, &conf, NULL, 0, FALSE, 0, 0}, + {"Background Brightness", Callback_BackgroundBrightness, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[EXTENDED_UI], Callback_ExtendedUI, &conf, NULL, 0, FALSE, 0, 0} + }; +#endif + + + OptionsMenu options_menu = { + menu_strings_table[OPTIONS_TITLE], + restart_required ? menu_strings_table[RESTART_REQUIRED] : NULL, + options, + (sizeof(options) / sizeof(options[0])), + -130, + TRUE + }; + + PlaySoundObject(5, SOUND_MODE_PLAY); + + bMode = mode_action; + + int return_value = EnterOptionsMenu(&options_menu, 0); + + PlaySoundObject(18, SOUND_MODE_PLAY); + + // Save our changes to the configuration file + memcpy(conf.bindings, bindings, sizeof(bindings)); + + SaveConfigData(&conf); + + // Filter internal return values to something Cave Story can understand + switch (return_value) + { + case CALLBACK_CONTINUE: + return_value = enum_ESCRETURN_continue; + break; + + case CALLBACK_RESET: + return_value = enum_ESCRETURN_restart; + break; + + case CALLBACK_EXIT: + return_value = enum_ESCRETURN_exit; + break; + } + + gKeyTrg = gKey = 0; // Avoid input-ghosting + + return return_value; +} + +int Call_Tweaks(unsigned int mode_action) +{ + // Make the options match the configuration data + CONFIGDATA conf; + if (!LoadConfigData(&conf)) + DefaultConfigData(&conf); + + Option submenu_options[] = { + {menu_strings_table[DAMAGE_RECEIVED], Callback_DamageModifier, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[BOSS_HP], Callback_BossHealthModifier, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[AUTOFIRE], Callback_AutoFire, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[INFINITE_AMMO], Callback_InfiniteAmmo, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[DEFAULT_BOOSTER], Callback_DefaultBooster, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[INFINITE_BOOSTER], Callback_InfiniteBooster, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[GRACE_JUMPS], Callback_GraceJump, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[NO_EXPERIENCE_DROPS], Callback_NoExpDrops, &conf, NULL, 0, FALSE, 0, 0}, + {menu_strings_table[GAME_SPEED], Callback_GameSpeed, &conf, NULL, 0, FALSE, 0, 0} + }; + + OptionsMenu options_menu = { + menu_strings_table[TWEAKS_TITLE], + tweaks_restart_required ? menu_strings_table[RESTART_REQUIRED] : NULL, + submenu_options, + (sizeof(submenu_options) / sizeof(submenu_options[0])), + -130, + TRUE + }; + + PlaySoundObject(5, SOUND_MODE_PLAY); + + int return_value = EnterOptionsMenu(&options_menu, 0); + + PlaySoundObject(18, SOUND_MODE_PLAY); + + SaveConfigData(&conf); + + // Filter internal return values to something Cave Story can understand + switch (return_value) + { + case CALLBACK_CONTINUE: + return_value = enum_ESCRETURN_continue; + break; + + case CALLBACK_RESET: + return_value = enum_ESCRETURN_restart; + break; + + case CALLBACK_EXIT: + return_value = enum_ESCRETURN_exit; + break; + } + + gKeyTrg = gKey = 0; // Avoid input-ghosting + + return return_value; +} \ No newline at end of file diff --git a/src/Pause.h b/src/Pause.h new file mode 100644 index 0000000..8a30200 --- /dev/null +++ b/src/Pause.h @@ -0,0 +1,411 @@ +#pragma once + +#include "WindowsWrapper.h" + +extern RECT pauseView; + +int Call_Pause(unsigned int mode_action); +int Call_Options(unsigned int mode_action); +int Call_Tweaks(unsigned int mode_action); + +static const char* menu_strings_table[98] = { +#ifdef JAPANESE + "\x8E\x6E\x82\xDF\x82\xA9\x82\xE7", /* 始めから */ + "\x91\xB1\x82\xAB\x82\xA9\x82\xE7", /* 続きから */ + "\x90\xDD\x92\xE8", /* 設定 */ + "\x90\xDD\x92\xE8", /* 設定 */ + "\x91\x80\x8D\xEC", /* 操作 */ + "\x91\x80\x8D\xEC", /* 操作 */ + "\x91\x80\x8D\xEC\x81\x69\x83\x4C\x81\x5B\x83\x7B\x81\x5B\x83\x68\x81\x6A", /* 操作(キーボード) */ + "\x91\x80\x8D\xEC\x81\x69\x83\x4C\x81\x5B\x83\x7B\x81\x5B\x83\x68\x81\x6A", /* 操作(キーボード) */ + "\x91\x80\x8D\xEC\x81\x69\x83\x52\x83\x93\x83\x67\x83\x8D\x81\x5B\x83\x89\x81\x5B\x81\x6A", /* 操作(コントローラー) */ + "\x91\x80\x8D\xEC\x81\x69\x83\x52\x83\x93\x83\x67\x83\x8D\x81\x5B\x83\x89\x81\x5B\x81\x6A", /* 操作(コントローラー) */ + "\x8F\xE3", /* 上 */ + "\x89\xBA", /* 下 */ + "\x8D\xB6", /* 左 */ + "\x89\x45", /* 右 */ + "\x82\x6E\x82\x6A", /* OK */ + "\x83\x4C\x83\x83\x83\x93\x83\x5A\x83\x8B", /* キャンセル */ + "\x83\x57\x83\x83\x83\x93\x83\x76", /* ジャンプ */ + "\x94\xAD\x96\x43", /* 発砲 */ + "\x8E\x9F\x82\xCC\x95\x90\x8A\xED", /* 次の武器 */ + "\x91\x4F\x82\xCC\x95\x90\x8A\xED", /* 前の武器 */ + "\x93\xB9\x8B\xEF", /* 道具 */ + "\x83\x7D\x83\x62\x83\x76", /* マップ */ + "\x83\x7C\x81\x5B\x83\x59", /* ポーズ */ + "\x8C\xFC\x82\xAB\x82\xF0\x95\xCF\x82\xA6\x82\xB8\x82\xC9\x88\xDA\x93\xAE", /* 向きを変えずに移動 */ + "\x81\x6D\x96\xB3\x82\xB5\x81\x6E", /* [無し] */ + "\x82\xB1\x82\xCC\x93\xAE\x8D\xEC\x82\xC9\x8A\x84\x82\xE8\x93\x96\x82\xC4\x82\xE9\x83\x4C\x81\x5B\x82\xF0\x89\x9F\x82\xB5\x82\xC4\x82\xAD\x82\xBE\x82\xB3\x82\xA2", /* この動作に割り当てるキーを押してください */ + "\x82\xB1\x82\xCC\x93\xAE\x8D\xEC\x82\xC9\x8A\x84\x82\xE8\x93\x96\x82\xC4\x82\xE9\x83\x7B\x83\x5E\x83\x93\x82\xF0\x89\x9F\x82\xB5\x82\xC4\x82\xAD\x82\xBE\x82\xB3\x82\xA2", /* この動作に割り当てるボタンを押してください */ + "\x83\x52\x83\x93\x83\x67\x83\x8D\x81\x5B\x83\x89\x81\x5B\x8E\x67\x97\x70", /* コントローラー使用 */ + "\x83\x49\x83\x74", /* オフ */ + "\x83\x49\x83\x93", /* オン */ + "\x83\x54\x83\x45\x83\x93\x83\x68\x83\x67\x83\x89\x83\x62\x83\x4E", /* サウンドトラック */ + "\x83\x54\x83\x45\x83\x93\x83\x68\x83\x67\x83\x89\x83\x62\x83\x4E\x91\x49\x91\xF0", /* サウンドトラック選択 */ + "\x83\x74\x83\x8C\x81\x5B\x83\x80\x83\x8C\x81\x5B\x83\x67", /* フレームレート */ + "\x82\x54\x82\x4F\x82\x65\x82\x6F\x82\x72", /* 50FPS */ + "\x82\x55\x82\x4F\x82\x65\x82\x6F\x82\x72", /* 60FPS */ + "\x82\x75\x81\x5D\x82\x72\x82\x78\x82\x6D\x82\x62", /* V‐SYNC */ + "\x89\xF0\x91\x9C\x93\x78", /* 解像度 */ + "\x91\x53\x89\xE6\x96\xCA\x83\x82\x81\x5B\x83\x68", /* 全画面モード */ + "\x83\x45\x83\x42\x83\x93\x83\x68\x83\x45\x83\x82\x81\x5B\x83\x68\x81\x40\x82\x53\x82\x51\x82\x55\x82\x98\x82\x51\x82\x53\x82\x4F", /* ウィンドウモード 426x240 */ + "\x83\x45\x83\x42\x83\x93\x83\x68\x83\x45\x83\x82\x81\x5B\x83\x68\x81\x40\x82\x57\x82\x54\x82\x51\x82\x98\x82\x53\x82\x57\x82\x4F", /* ウィンドウモード 852x480 */ + "\x83\x45\x83\x42\x83\x93\x83\x68\x83\x45\x83\x82\x81\x5B\x83\x68\x81\x40\x82\x50\x82\x51\x82\x56\x82\x57\x82\x98\x82\x56\x82\x51\x82\x4F", /* ウィンドウモード 1278x720 */ + "\x83\x45\x83\x42\x83\x93\x83\x68\x83\x45\x83\x82\x81\x5B\x83\x68\x81\x40\x82\x50\x82\x56\x82\x4F\x82\x53\x82\x98\x82\x58\x82\x55\x82\x4F", /* ウィンドウモード 1704x960 */ + "\x83\x58\x83\x80\x81\x5B\x83\x59\x83\x58\x83\x4E\x83\x8D\x81\x5B\x83\x8B", /* スムーズスクロール */ + "\x89\xE6\x96\xCA\x90\x6B\x93\xAE\x8C\xF8\x89\xCA", /* 画面震動効果 */ + "\x83\x4A\x83\x89\x81\x5B\x83\x74\x83\x42\x83\x8B\x83\x5E\x81\x5B", /* カラーフィルター */ + "\x96\xB3\x82\xB5", /* 無し */ + "\x90\x46\x8A\x6F\x88\xD9\x8F\xED\x81\x69\x82\x50\x8C\x5E\x82\x52\x90\x46\x8A\x6F\x81\x41\x90\xD4\x90\x46\x8E\xE3\x81\x6A", /* 色覚異常(1型3色覚、赤色弱) */ + "\x90\x46\x8A\x6F\x88\xD9\x8F\xED\x81\x69\x82\x50\x8C\x5E\x82\x51\x90\x46\x8A\x6F\x81\x41\x90\xD4\x90\x46\x96\xD3\x81\x6A", /* 色覚異常(1型2色覚、赤色盲) */ + "\x90\x46\x8A\x6F\x88\xD9\x8F\xED\x81\x69\x82\x51\x8C\x5E\x82\x52\x90\x46\x8A\x6F\x81\x41\x97\xCE\x90\x46\x8E\xE3\x81\x6A", /* 色覚異常(2型3色覚、緑色弱) */ + "\x90\x46\x8A\x6F\x88\xD9\x8F\xED\x81\x69\x82\x51\x8C\x5E\x82\x51\x90\x46\x8A\x6F\x81\x41\x97\xCE\x90\x46\x96\xD3\x81\x6A", /* 色覚異常(2型2色覚、緑色盲) */ + "\x90\x46\x8A\x6F\x88\xD9\x8F\xED\x81\x69\x82\x52\x8C\x5E\x82\x52\x90\x46\x8A\x6F\x81\x41\x90\xC2\x90\x46\x8E\xE3\x81\x6A", /* 色覚異常(3型3色覚、青色弱) */ + "\x90\x46\x8A\x6F\x88\xD9\x8F\xED\x81\x69\x82\x52\x8C\x5E\x82\x51\x90\x46\x8A\x6F\x81\x41\x90\xC2\x90\x46\x96\xD3\x81\x6A", /* 色覚異常(3型2色覚、青色盲) */ + "\x83\x82\x83\x6D\x83\x4E\x83\x8D", /* モノクロ */ + "\x83\x81\x83\x4B\x83\x68\x83\x89\x83\x43\x83\x75", /* メガドライブ */ + "\x82\x6C\x82\x72\x82\x77", /* MSX */ + "\x83\x51\x81\x5B\x83\x80\x83\x7B\x81\x5B\x83\x43", /* ゲームボーイ */ + "\x89\xE6\x96\xCA\x83\x74\x83\x89\x83\x62\x83\x56\x83\x85\x8C\xF8\x89\xCA", /* 画面フラッシュ効果 */ + "\x82\x51\x82\x4F\x82\x4F\x81\x93", /* 200% */ + "\x82\x50\x82\x54\x82\x4F\x81\x93", /* 150% */ + "\x82\x50\x82\x53\x82\x4F\x81\x93", /* 140% */ + "\x82\x50\x82\x52\x82\x4F\x81\x93", /* 130% */ + "\x82\x50\x82\x51\x82\x4F\x81\x93", /* 120% */ + "\x82\x50\x82\x50\x82\x4F\x81\x93", /* 110% */ + "\x82\x50\x82\x4F\x82\x4F\x81\x93", /* 100% */ + "\x82\x58\x82\x4F\x81\x93", /* 90% */ + "\x82\x57\x82\x4F\x81\x93", /* 80% */ + "\x82\x56\x82\x4F\x81\x93", /* 70% */ + "\x82\x55\x82\x4F\x81\x93", /* 60% */ + "\x82\x54\x82\x4F\x81\x93", /* 50% */ + "\x82\x4F\x81\x93", /* 50% */ + "\x8A\x67\x92\xA3\x83\x43\x83\x93\x83\x5E\x83\x74\x83\x46\x81\x5B\x83\x58", /* 拡張インタフェース */ + "\x92\xB2\x90\xAE", /* 調整 */ + "\x92\xB2\x90\xAE", /* 調整 */ + "\x8E\xF3\x82\xAF\x82\xE9\x83\x5F\x83\x81\x81\x5B\x83\x57", /* 受けるダメージ */ + "\x88\xEA\x8C\x82\x82\xC5\x93\x7C\x82\xEA\x82\xE9", /* 一撃で倒れる */ + "\x83\x7B\x83\x58\x82\x67\x82\x6F", /* ボスHP */ + "\x82\x50\x82\x67\x82\x6F", /* 1HP */ + "\x98\x41\x8E\xCB\x8B\x40\x94\x5C", /* 連射機能 */ + "\x92\xB7\x89\x9F\x82\xB5", /* 長押し */ + "\x93\xFC\x82\xEA\x91\xD6\x82\xA6", /* 入れ替え */ + "\x96\xB3\x8C\xC0\x92\x65\x96\xF2", /* 無限弾薬 */ + "\x83\x66\x83\x42\x83\x74\x83\x48\x83\x8B\x83\x67\x83\x75\x81\x5B\x83\x58\x83\x5E\x81\x5B", /* ディフォルトブースター */ + "\x96\xB3\x82\xB5", /* 無し */ + "\x83\x75\x81\x5B\x83\x58\x83\x5E\x81\x5B\x82\x96\x82\x4F\x81\x44\x82\x57", /* ブースターv0.8 */ + "\x83\x75\x81\x5B\x83\x58\x83\x5E\x81\x5B\x82\x96\x82\x51\x81\x44\x82\x4F", /* ブースターv2.0 */ + "\x96\xB3\x8C\xC0\x83\x75\x81\x5B\x83\x58\x83\x5E\x81\x5B", /* 無限ブースター */ + "\x83\x57\x83\x83\x83\x93\x83\x76\x97\x5D\x97\x54", /* ジャンプ余裕 */ + "\x8C\x6F\x8C\xB1\x92\x6C\x82\xAA\x97\x8E\x82\xC6\x82\xB3\x82\xEA\x82\xC8\x82\xA2", /* 経験値が落とされない */ + "\x83\x51\x81\x5B\x83\x80\x91\xAC\x93\x78", /* ゲーム速度 */ + "\x83\x51\x81\x5B\x83\x80\x8F\x49\x97\xB9", /* ゲーム終了 */ + "\x82\xE6\x82\xEB\x82\xB5\x82\xA2\x82\xC5\x82\xB7\x82\xA9\x81\x48", /* よろしいですか? */ + "\x83\x5A\x81\x5B\x83\x75\x82\xB3\x82\xEA\x82\xC4\x82\xA2\x82\xC8\x82\xA2\x90\x69\x8D\x73\x93\xE0\x97\x65\x82\xAA\x8E\xB8\x82\xED\x82\xEA\x82\xDC\x82\xB7\x81\x42", /* セーブされていない進行内容が失われます。 */ + "\x82\xCD\x82\xA2", /* はい */ + "\x82\xA2\x82\xA2\x82\xA6", /* いいえ */ + "\x82\x6F\x82\x60\x82\x74\x82\x72\x82\x64", /* PAUSE */ + "\x91\xB1\x82\xAF\x82\xE9", /* 続ける */ + "\x83\x8A\x83\x5A\x83\x62\x83\x67", /* リセット */ + "\x81\x69\x83\x51\x81\x5B\x83\x80\x8D\xC4\x8B\x4E\x93\xAE\x95\x4B\x97\x76\x81\x6A" /* (ゲーム再起動必要) */ +#elif defined(SPANISH) + "Nueva Partida", + "Continuar", + "Opciones", + "OPCIONES", + "Controles", + "CONTROLES", + "Controles (Teclado)", + "CONTROLES (TECLADO)", + "Controles (Gamepad)", + "CONTROLES (GAMEPAD)", + "Arriba", + "Abajo", + "Izquierda", + "Derecha", + "Aceptar", + "Cancelar", + "Saltar", + "Disparar", + "Arma Siguiente", + "Arma Anterior", + "Inventario", + "Mapa", + "Pausa", + "Bloq. Dirección", + "[No asignado]", + "Presiona una tecla para asignarla a esta acción", + "Presiona un bot󮠰ara asignarlo a esta acción", + "Usar Gamepad", + "Off", + "On", + "Soundtrack", + "SELECCIONAR SOUNDTRACK", + "Framerate", + "50 FPS", + "60 FPS", + "V-sync", + "Resolución", + "Pantalla Completa", + "Ventana 426x240", + "Ventana 852x480", + "Ventana 1278x720", + "Ventana 1704x960", + "Scroll Continuo", + "Sacudidas de Pantalla", + "Filtros de color", + "Ninguno", + "Protanopia (debil)", + "Protanopia (fuerte)", + "Deuteranopia (débill)", + "Deuteranopia (fuerte)", + "Tritanopia (débil)", + "Tritanopia (fuerte)", + "Monocromo", + "Sega Genesis", + "MSX", + "Game Boy", + "Screen Flashing", + "200%", + "150%", + "140%", + "130%", + "120%", + "110%", + "100%", + "90%", + "80%", + "70%", + "60%", + "50%", + "0%", + "UI Extendida", + "Ajustes", + "AJUSTES", + "Daño Recibido", + "One-hit KO", + "HP de Jefes", + "1 HP", + "Autofire", + "Hold", + "Switch", + "Munición Infinita", + "Booster por defecto", + "Ninguno", + "Booster 0.8", + "Booster 2.0", + "Booster Infinito", + "Grace Jumps", + "Desh. Experiencia", + "Velocidad", + "Salir", + "Estás Seguro/a?", + "Se perderá el progreso que no hayas guardado", + "Sí", + "No", + "PAUSA", + "Retomar", + "Reiniciar", + "REQUIERE UN REINICIO" +#else + "New Game", + "Continue", + "Options", + "OPTIONS", + "Controls", + "CONTROLS", + "Controls (Keyboard)", + "CONTROLS (KEYBOARD)", + "Controls (Gamepad)", + "CONTROLS (GAMEPAD)", + "Up", + "Down", + "Left", + "Right", + "OK", + "Cancel", + "Jump", + "Shoot", + "Next Weapon", + "Previous Weapon", + "Inventory", + "Map", + "Pause", + "Strafe", + "[Unbound]", + "Press a key to bind to this action", + "Press a button to bind to this action", + "Enable Gamepad", + "Off", + "On", + "Soundtrack", + "SELECT SOUNDTRACK", + "Framerate", + "50 FPS", + "60 FPS", + "V-sync", + "Resolution", + "Full Screen", + "Windowed 426x240", + "Windowed 852x480", + "Windowed 1278x720", + "Windowed 1704x960", + "Smooth Scrolling", + "Screen Shake", + "Color Filters", + "None", + "Protanomaly", + "Protanopia", + "Deuteranomaly", + "Deuteranopia", + "Tritanomaly", + "Tritanopia", + "Grayscale", + "Genesis", + "MSX", + "Game Boy", + "Screen Flashing", + "200%", + "150%", + "140%", + "130%", + "120%", + "110%", + "100%", + "90%", + "80%", + "70%", + "60%", + "50%", + "0%", + "Extended UI", + "Tweaks", + "TWEAKS", + "Damage Received", + "One-hit KO", + "Boss Health", + "1 HP", + "Autofire", + "Hold", + "Switch", + "Infinite Ammo", + "Default Booster", + "None", + "Booster 0.8", + "Booster 2.0", + "Infinite Booster", + "Grace Jumps", + "No Exp Drops", + "Game Speed", + "Quit", + "ARE YOU SURE?", + "Unsaved Progress will be lost", + "Yes", + "No", + "PAUSED", + "Resume", + "Reset", + "RESTART REQUIRED" +#endif +}; + +typedef enum PauseMenuStrings { + NEW_GAME, + CONTINUE, + OPTIONS, + OPTIONS_TITLE, + CONTROLS, + CONTROLS_TITLE, + CONTROLS_KEYBOARD, + CONTROLS_KEYBOARD_TITLE, + CONTROLS_GAMEPAD, + CONTROLS_GAMEPAD_TITLE, + CONTROLS_UP, + CONTROLS_DOWN, + CONTROLS_LEFT, + CONTROLS_RIGHT, + CONTROLS_OK, + CONTROLS_CANCEL, + CONTROLS_JUMP, + CONTROLS_SHOOT, + CONTROLS_NEXT_WEAPON, + CONTROLS_PREV_WEAPON, + CONTROLS_INVENTORY, + CONTROLS_MAP, + CONTROLS_PAUSE, + CONTROLS_STRAFE, + CONTROLS_UNBOUND, + CONTROLS_PUSH_KEY, + CONTROLS_PUSH_BUTTON, + CONTROLS_ENABLE_GAMEPAD, + OFF, + ON, + SOUNDTRACK, + SELECT_SOUNDTRACK, + FRAMERATE, + FRAMERATE_50, + FRAMERATE_60, + V_SYNC, + RESOLUTION, + RESOLUTION_FULL, + RESOLUTION_240, + RESOLUTION_480, + RESOLUTION_720, + RESOLUTION_960, + SMOOTH_SCROLLING, + SCREEN_SHAKE, + COLOR_FILTERS, + COLOR_NONE, + COLOR_PROTANOMALY, + COLOR_PROTANOPIA, + COLOR_DEUTERANOMALY, + COLOR_DEUTERANOPIA, + COLOR_TRITANOMALY, + COLOR_TRITANOPIA, + COLOR_GRAYSCALE, + COLOR_GENESIS, + COLOR_MSX, + COLOR_GAME_BOY, + SCREEN_FLASHING, + PERCENT_200, + PERCENT_150, + PERCENT_140, + PERCENT_130, + PERCENT_120, + PERCENT_110, + PERCENT_100, + PERCENT_90, + PERCENT_80, + PERCENT_70, + PERCENT_60, + PERCENT_50, + PERCENT_0, + EXTENDED_UI, + TWEAKS, + TWEAKS_TITLE, + DAMAGE_RECEIVED, + DAMAGE_OHKO, + BOSS_HP, + BOSS_1_HP, + AUTOFIRE, + AUTOFIRE_HOLD, + AUTOFIRE_SWITCH, + INFINITE_AMMO, + DEFAULT_BOOSTER, + DEFAULT_BOOSTER_NONE, + DEFAULT_BOOSTER_08, + DEFAULT_BOOSTER_20, + INFINITE_BOOSTER, + GRACE_JUMPS, + NO_EXPERIENCE_DROPS, + GAME_SPEED, + QUIT, + ARE_YOU_SURE, + UNSAVED_PROGRESS, + YES, + NO, + PAUSED, + RESUME, + RESET, + RESTART_REQUIRED +} PauseMenuStrings; diff --git a/src/PixTone.cpp b/src/PixTone.cpp new file mode 100644 index 0000000..520fab7 --- /dev/null +++ b/src/PixTone.cpp @@ -0,0 +1,176 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "PixTone.h" + +#include +#include + +#include "WindowsWrapper.h" + +#include "Attributes.h" +#include "Random.h" + +signed char gWaveModelTable[6][0x100]; + +void MakeWaveTables(void) +{ + int i; + + int a; + + // Sine wave + for (i = 0; i < 0x100; ++i) + { + gWaveModelTable[0][i] = (signed char)(sin((i * 6.283184) / 256.0) * 64.0); + a = gWaveModelTable[0][i]; // I have no idea what this line was meant to do + } + + // Triangle wave + for (a = 0, i = 0; i < 0x40; ++i) + { + // Upwards + gWaveModelTable[1][i] = (a * 0x40) / 0x40; + ++a; + } + for (a = 0; i < 0xC0; ++i) + { + // Downwards + gWaveModelTable[1][i] = 0x40 - ((a * 0x40) / 0x40); + ++a; + } + for (a = 0; i < 0x100; ++i) + { + // Back up + gWaveModelTable[1][i] = ((a * 0x40) / 0x40) - 0x40; + ++a; + } + + // Saw up wave + for (i = 0; i < 0x100; ++i) + gWaveModelTable[2][i] = (i / 2) - 0x40; + + // Saw down wave + for (i = 0; i < 0x100; ++i) + gWaveModelTable[3][i] = 0x40 - (i / 2); + + // Square wave + for (i = 0; i < 0x80; ++i) + gWaveModelTable[4][i] = 0x40; + for (; i < 0x100; ++i) + gWaveModelTable[4][i] = -0x40; + + // White noise wave + msvc_srand(0); + for (i = 0; i < 0x100; ++i) + gWaveModelTable[5][i] = (signed char)(msvc_rand() & 0xFF) / 2; +} + +BOOL wave_tables_made; + +ATTRIBUTE_HOT BOOL MakePixelWaveData(const PIXTONEPARAMETER *ptp, unsigned char *pData) +{ + int i; + int a, b, c, d; + + double dPitch; + double dMain; + double dVolume; + + double dEnvelope; + signed char envelopeTable[0x100]; + + double d1, d2, d3; + + // The Linux port added a cute optimisation here, where MakeWaveTables is only called once during the game's execution + if (wave_tables_made != TRUE) + { + MakeWaveTables(); + wave_tables_made = TRUE; + } + + memset(envelopeTable, 0, sizeof(envelopeTable)); + + i = 0; + + dEnvelope = ptp->initial; + while (i < ptp->pointAx) + { + envelopeTable[i] = (signed char)dEnvelope; + dEnvelope = (((double)ptp->pointAy - ptp->initial) / ptp->pointAx) + dEnvelope; + ++i; + } + + dEnvelope = ptp->pointAy; + while (i < ptp->pointBx) + { + envelopeTable[i] = (signed char)dEnvelope; + dEnvelope = (((double)ptp->pointBy - ptp->pointAy) / (double)(ptp->pointBx - ptp->pointAx)) + dEnvelope; + ++i; + } + + dEnvelope = ptp->pointBy; + while (i < ptp->pointCx) + { + envelopeTable[i] = (signed char)dEnvelope; + dEnvelope = ((double)ptp->pointCy - ptp->pointBy) / (double)(ptp->pointCx - ptp->pointBx) + dEnvelope; + ++i; + } + + dEnvelope = ptp->pointCy; + while (i < 0x100) + { + envelopeTable[i] = (signed char)dEnvelope; + dEnvelope = dEnvelope - (ptp->pointCy / (double)(0x100 - ptp->pointCx)); + ++i; + } + + dPitch = ptp->oPitch.offset; + dMain = ptp->oMain.offset; + dVolume = ptp->oVolume.offset; + + if (ptp->oMain.num == 0.0) + d1 = 0.0; + else + d1 = 256.0 / (ptp->size / ptp->oMain.num); + + if (ptp->oPitch.num == 0.0) + d2 = 0.0; + else + d2 = 256.0 / (ptp->size / ptp->oPitch.num); + + if (ptp->oVolume.num == 0.0) + d3 = 0.0; + else + d3 = 256.0 / (ptp->size / ptp->oVolume.num); + + for (i = 0; i < ptp->size; ++i) + { + a = (int)dMain % 0x100; + b = (int)dPitch % 0x100; + c = (int)dVolume % 0x100; + d = (int)((double)(i * 0x100) / ptp->size); + pData[i] = gWaveModelTable[ptp->oMain.model][a] + * ptp->oMain.top + / 64 + * (((gWaveModelTable[ptp->oVolume.model][c] * ptp->oVolume.top) / 64) + 64) + / 64 + * envelopeTable[d] + / 64 + + 128; + + if (gWaveModelTable[ptp->oPitch.model][b] < 0) + dMain += d1 - d1 * 0.5 * -gWaveModelTable[ptp->oPitch.model][b] * ptp->oPitch.top / 64.0 / 64.0; + else + dMain += d1 + d1 * 2.0 * gWaveModelTable[ptp->oPitch.model][b] * ptp->oPitch.top / 64.0 / 64.0; + + dPitch += d2; + dVolume += d3; + } + + return TRUE; +} diff --git a/src/PixTone.h b/src/PixTone.h new file mode 100644 index 0000000..c8e63c8 --- /dev/null +++ b/src/PixTone.h @@ -0,0 +1,39 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +typedef struct PIXTONEPARAMETER2 +{ + int model; + double num; + int top; + int offset; +} PIXTONEPARAMETER2; + +typedef struct PIXTONEPARAMETER +{ + int use; + int size; + PIXTONEPARAMETER2 oMain; + PIXTONEPARAMETER2 oPitch; + PIXTONEPARAMETER2 oVolume; + int initial; + int pointAx; + int pointAy; + int pointBx; + int pointBy; + int pointCx; + int pointCy; +} PIXTONEPARAMETER; + +extern signed char gWaveModelTable[6][0x100]; + +void MakeWaveTables(void); +BOOL MakePixelWaveData(const PIXTONEPARAMETER *ptp, unsigned char *pData); diff --git a/src/Profile.cpp b/src/Profile.cpp new file mode 100644 index 0000000..115a7fe --- /dev/null +++ b/src/Profile.cpp @@ -0,0 +1,444 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Profile.h" + +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "Backends/Misc.h" +#include "ArmsItem.h" +#include "BossLife.h" +#include "Fade.h" +#include "File.h" +#include "Flags.h" +#include "Frame.h" +#include "Game.h" +#include "Main.h" +#include "MiniMap.h" +#include "MyChar.h" +#include "NpChar.h" +#include "SelStage.h" +#include "Stage.h" +#include "Star.h" +#include "TextScr.h" +#include "ValueView.h" + +const char* const gDefaultName = "Profile.dat"; +const char* const gProfileCode = "Do041220"; +const char* const gProfileCodeExtra = "CSE2E 20200304"; + +BOOL IsProfile(void) +{ + std::string path = gModulePath + '/' + gDefaultName; + + FILE *file = fopen(path.c_str(), "rb"); + if (file == NULL) + return FALSE; + + fclose(file); + return TRUE; +} + +BOOL SaveProfile(const char *name) +{ + FILE *fp; + PROFILEDATA profile; + const char *FLAG = "FLAG"; + + std::string path; + + // Get path + if (name != NULL) + path = gModulePath + '/' + name; + else + path = gModulePath + '/' + gDefaultName; + + // Open file + fp = fopen(path.c_str(), "wb"); + if (fp == NULL) + return FALSE; + + // Set up profile + memset(&profile, 0, sizeof(PROFILEDATA)); + memcpy(profile.code, gProfileCode, sizeof(profile.code)); + memcpy(profile.FLAG, FLAG, sizeof(profile.FLAG)); + profile.stage = gStageNo; + profile.music = gMusicNo; + profile.x = gMC.x; + profile.y = gMC.y; + profile.direct = gMC.direct; + profile.max_life = gMC.max_life; + profile.life = gMC.life; + profile.star = gMC.star; + profile.select_arms = gSelectedArms; + profile.select_item = gSelectedItem; + profile.equip = gMC.equip; + profile.unit = gMC.unit; + profile.counter = gCounter; + memcpy(profile.arms, gArmsData, sizeof(profile.arms)); + memcpy(profile.items, gItemData, sizeof(profile.items)); + memcpy(profile.permitstage, gPermitStage, sizeof(profile.permitstage)); + memcpy(profile.permit_mapping, gMapping, sizeof(profile.permit_mapping)); + memcpy(profile.flags, gFlagNPC, sizeof(profile.flags)); + // Custom + memcpy(profile.extra_code, gProfileCodeExtra, sizeof(profile.extra_code)); + profile.MIMCurrentNum = gMIMCurrentNum; + profile.physics_normal = gMC.physics_normal; + profile.physics_underwater = gMC.physics_underwater; + profile.no_splash_or_air_limit_underwater = gMC.no_splash_or_air_limit_underwater; + + // Write to file + fwrite(profile.code, 8, 1, fp); + File_WriteLE32(profile.stage, fp); + File_WriteLE32(profile.music, fp); + File_WriteLE32(profile.x, fp); + File_WriteLE32(profile.y, fp); + File_WriteLE32(profile.direct, fp); + File_WriteLE16(profile.max_life, fp); + File_WriteLE16(profile.star, fp); + File_WriteLE16(profile.life, fp); + File_WriteLE16(profile.a, fp); + File_WriteLE32(profile.select_arms, fp); + File_WriteLE32(profile.select_item, fp); + File_WriteLE32(profile.equip, fp); + File_WriteLE32(profile.unit, fp); + File_WriteLE32(profile.counter, fp); + for (int arm = 0; arm < 8; arm++) + { + File_WriteLE32(profile.arms[arm].code, fp); + File_WriteLE32(profile.arms[arm].level, fp); + File_WriteLE32(profile.arms[arm].exp, fp); + File_WriteLE32(profile.arms[arm].max_num, fp); + File_WriteLE32(profile.arms[arm].num, fp); + } + for (int item = 0; item < 32; item++) + File_WriteLE32(profile.items[item].code, fp); + for (int stage = 0; stage < 8; stage++) + { + File_WriteLE32(profile.permitstage[stage].index, fp); + File_WriteLE32(profile.permitstage[stage].event, fp); + } + fwrite(profile.permit_mapping, 0x80, 1, fp); + fwrite(FLAG, 4, 1, fp); + fwrite(profile.flags, 1000, 1, fp); + // Custom + fwrite(gProfileCodeExtra, 0x10, 1, fp); + File_WriteLE32(profile.MIMCurrentNum, fp); + File_WriteLE32(profile.physics_normal.max_dash, fp); + File_WriteLE32(profile.physics_normal.max_move, fp); + File_WriteLE32(profile.physics_normal.gravity1, fp); + File_WriteLE32(profile.physics_normal.gravity2, fp); + File_WriteLE32(profile.physics_normal.dash1, fp); + File_WriteLE32(profile.physics_normal.dash2, fp); + File_WriteLE32(profile.physics_normal.resist, fp); + File_WriteLE32(profile.physics_normal.jump, fp); + File_WriteLE32(profile.physics_underwater.max_dash, fp); + File_WriteLE32(profile.physics_underwater.max_move, fp); + File_WriteLE32(profile.physics_underwater.gravity1, fp); + File_WriteLE32(profile.physics_underwater.gravity2, fp); + File_WriteLE32(profile.physics_underwater.dash1, fp); + File_WriteLE32(profile.physics_underwater.dash2, fp); + File_WriteLE32(profile.physics_underwater.resist, fp); + File_WriteLE32(profile.physics_underwater.jump, fp); + File_WriteLE32(profile.no_splash_or_air_limit_underwater, fp); + + fclose(fp); + return TRUE; +} + +BOOL LoadProfile(const char *name) +{ + FILE *fp; + PROFILEDATA profile; + std::string path; + + // Get path + if (name != NULL) + path = name; + else + path = gModulePath + '/' + gDefaultName; + + // Open file + fp = fopen(path.c_str(), "rb"); + if (fp == NULL) + return FALSE; + + // Check header code + fread(profile.code, 8, 1, fp); + if (memcmp(profile.code, gProfileCode, 8) != 0) + { +#ifdef FIX_BUGS + fclose(fp); // The original game forgets to close the file +#endif + return FALSE; + } + + // Read data + fseek(fp, 0, SEEK_SET); + memset(&profile, 0, sizeof(PROFILEDATA)); + fread(profile.code, 8, 1, fp); + profile.stage = File_ReadLE32(fp); + profile.music = (MusicID)File_ReadLE32(fp); + profile.x = File_ReadLE32(fp); + profile.y = File_ReadLE32(fp); + profile.direct = File_ReadLE32(fp); + profile.max_life = File_ReadLE16(fp); + profile.star = File_ReadLE16(fp); + profile.life = File_ReadLE16(fp); + profile.a = File_ReadLE16(fp); + profile.select_arms = File_ReadLE32(fp); + profile.select_item = File_ReadLE32(fp); + profile.equip = File_ReadLE32(fp); + profile.unit = File_ReadLE32(fp); + profile.counter = File_ReadLE32(fp); + for (int arm = 0; arm < 8; arm++) + { + profile.arms[arm].code = File_ReadLE32(fp); + profile.arms[arm].level = File_ReadLE32(fp); + profile.arms[arm].exp = File_ReadLE32(fp); + profile.arms[arm].max_num = File_ReadLE32(fp); + profile.arms[arm].num = File_ReadLE32(fp); + } + for (int item = 0; item < 32; item++) + profile.items[item].code = File_ReadLE32(fp); + for (int stage = 0; stage < 8; stage++) + { + profile.permitstage[stage].index = File_ReadLE32(fp); + profile.permitstage[stage].event = File_ReadLE32(fp); + } + fread(profile.permit_mapping, 0x80, 1, fp); + fread(profile.FLAG, 4, 1, fp); + fread(profile.flags, 1000, 1, fp); + + // Custom + fread(profile.extra_code, 0x10, 1, fp); + + if (memcmp(profile.extra_code, gProfileCodeExtra, 0x10) == 0) + { + profile.MIMCurrentNum = File_ReadLE32(fp); + + profile.physics_normal.max_dash = File_ReadLE32(fp); + profile.physics_normal.max_move = File_ReadLE32(fp); + profile.physics_normal.gravity1 = File_ReadLE32(fp); + profile.physics_normal.gravity2 = File_ReadLE32(fp); + profile.physics_normal.dash1 = File_ReadLE32(fp); + profile.physics_normal.dash2 = File_ReadLE32(fp); + profile.physics_normal.resist = File_ReadLE32(fp); + profile.physics_normal.jump = File_ReadLE32(fp); + + profile.physics_underwater.max_dash = File_ReadLE32(fp); + profile.physics_underwater.max_move = File_ReadLE32(fp); + profile.physics_underwater.gravity1 = File_ReadLE32(fp); + profile.physics_underwater.gravity2 = File_ReadLE32(fp); + profile.physics_underwater.dash1 = File_ReadLE32(fp); + profile.physics_underwater.dash2 = File_ReadLE32(fp); + profile.physics_underwater.resist = File_ReadLE32(fp); + profile.physics_underwater.jump = File_ReadLE32(fp); + + profile.no_splash_or_air_limit_underwater = File_ReadLE32(fp); + } + + fclose(fp); + + // Set things + gSelectedArms = profile.select_arms; + gSelectedItem = profile.select_item; + gCounter = profile.counter; + + memcpy(gArmsData, profile.arms, sizeof(gArmsData)); + memcpy(gItemData, profile.items, sizeof(gItemData)); + memcpy(gPermitStage, profile.permitstage, sizeof(gPermitStage)); + memcpy(gMapping, profile.permit_mapping, sizeof(gMapping)); + memcpy(gFlagNPC, profile.flags, sizeof(gFlagNPC)); + + // Load stage + ChangeMusic(profile.music); + InitMyChar(); + if (!TransferStage(profile.stage, 0, 0, 1)) + return FALSE; + + // Set character properties + gMC.equip = profile.equip; + gMC.unit = profile.unit; + gMC.direct = profile.direct; + gMC.max_life = profile.max_life; + gMC.life = profile.life; + gMC.star = profile.star; + gMC.cond = 0x80; + gMC.air = 1000; + gMC.lifeBr = profile.life; + gMC.x = profile.x; + gMC.y = profile.y; + + // override with tweaks mode data + CONFIGDATA conf; + if (!LoadConfigData(&conf)) + DefaultConfigData(&conf); + + gMC.rect_arms.left = (gArmsData[gSelectedArms].code % 10) * 24; + gMC.rect_arms.right = gMC.rect_arms.left + 24; + gMC.rect_arms.top = (gArmsData[gSelectedArms].code / 10) * 32; + gMC.rect_arms.bottom = gMC.rect_arms.top + 16; + + // Custom + if (memcmp(profile.extra_code, gProfileCodeExtra, 0x10) == 0) + { + gMIMCurrentNum = profile.MIMCurrentNum; + gMC.physics_normal = profile.physics_normal; + gMC.physics_underwater = profile.physics_underwater; + gMC.no_splash_or_air_limit_underwater = profile.no_splash_or_air_limit_underwater; + } + + // Reset stuff + ClearFade(); + SetFrameMyChar(); + SetFrameTargetMyChar(16); + InitBossLife(); + CutNoise(); + InitStar(); + ClearValueView(); + gCurlyShoot_wait = 0; + + return TRUE; +} + +BOOL InitializeGame(void) +{ + InitMyChar(); + gSelectedArms = 0; + gSelectedItem = 0; + gCounter = 0; + ClearArmsData(); + ClearItemData(); + ClearPermitStage(); + StartMapping(); + InitFlags(); + if (!TransferStage(13, 200, 10, 8)) + { + #if !defined(JAPANESE) && defined(FIX_BUGS) // The Aeon Genesis translation didn't translate this + Backend_ShowMessageBox("Error", "Failed to load stage"); + #else + Backend_ShowMessageBox("エラー", "ステージの読み込みに失敗"); + #endif + return FALSE; + } + + ClearFade(); + SetFrameMyChar(); + SetFrameTargetMyChar(16); + InitBossLife(); + CutNoise(); + ClearValueView(); + gCurlyShoot_wait = 0; + SetFadeMask(); + SetFrameTargetMyChar(16); + return TRUE; +} + +int GetProfileStage(const char *name){ + FILE *fp; + PROFILEDATA profile; + std::string path; + + if(!IsProfile()) + return -1; + + // Get path + if (name != NULL) + path = name; + else + path = gModulePath + "/" + gDefaultName; + + // Open file + fp = fopen(path.c_str(), "rb"); + if (fp == NULL) + return FALSE; + + // Check header code + fread(profile.code, 8, 1, fp); + if (memcmp(profile.code, gProfileCode, 8) != 0) + { +#ifdef FIX_BUGS + fclose(fp); // The original game forgets to close the file +#endif + return FALSE; + } + + // Read data + fseek(fp, 0, SEEK_SET); + memset(&profile, 0, sizeof(PROFILEDATA)); + fread(profile.code, 8, 1, fp); + profile.stage = File_ReadLE32(fp); + profile.music = (MusicID)File_ReadLE32(fp); + profile.x = File_ReadLE32(fp); + profile.y = File_ReadLE32(fp); + profile.direct = File_ReadLE32(fp); + profile.max_life = File_ReadLE16(fp); + profile.star = File_ReadLE16(fp); + profile.life = File_ReadLE16(fp); + profile.a = File_ReadLE16(fp); + profile.select_arms = File_ReadLE32(fp); + profile.select_item = File_ReadLE32(fp); + profile.equip = File_ReadLE32(fp); + profile.unit = File_ReadLE32(fp); + profile.counter = File_ReadLE32(fp); + for (int arm = 0; arm < 8; arm++) + { + profile.arms[arm].code = File_ReadLE32(fp); + profile.arms[arm].level = File_ReadLE32(fp); + profile.arms[arm].exp = File_ReadLE32(fp); + profile.arms[arm].max_num = File_ReadLE32(fp); + profile.arms[arm].num = File_ReadLE32(fp); + } + for (int item = 0; item < 32; item++) + profile.items[item].code = File_ReadLE32(fp); + for (int stage = 0; stage < 8; stage++) + { + profile.permitstage[stage].index = File_ReadLE32(fp); + profile.permitstage[stage].event = File_ReadLE32(fp); + } + fread(profile.permit_mapping, 0x80, 1, fp); + fread(profile.FLAG, 4, 1, fp); + fread(profile.flags, 1000, 1, fp); + + // Custom + fread(profile.extra_code, 0x10, 1, fp); + + if (memcmp(profile.extra_code, gProfileCodeExtra, 0x10) == 0) + { + profile.MIMCurrentNum = File_ReadLE32(fp); + + profile.physics_normal.max_dash = File_ReadLE32(fp); + profile.physics_normal.max_move = File_ReadLE32(fp); + profile.physics_normal.gravity1 = File_ReadLE32(fp); + profile.physics_normal.gravity2 = File_ReadLE32(fp); + profile.physics_normal.dash1 = File_ReadLE32(fp); + profile.physics_normal.dash2 = File_ReadLE32(fp); + profile.physics_normal.resist = File_ReadLE32(fp); + profile.physics_normal.jump = File_ReadLE32(fp); + + profile.physics_underwater.max_dash = File_ReadLE32(fp); + profile.physics_underwater.max_move = File_ReadLE32(fp); + profile.physics_underwater.gravity1 = File_ReadLE32(fp); + profile.physics_underwater.gravity2 = File_ReadLE32(fp); + profile.physics_underwater.dash1 = File_ReadLE32(fp); + profile.physics_underwater.dash2 = File_ReadLE32(fp); + profile.physics_underwater.resist = File_ReadLE32(fp); + profile.physics_underwater.jump = File_ReadLE32(fp); + + profile.no_splash_or_air_limit_underwater = File_ReadLE32(fp); + } + + fclose(fp); + + return profile.stage; +} \ No newline at end of file diff --git a/src/Profile.h b/src/Profile.h new file mode 100644 index 0000000..feb4e86 --- /dev/null +++ b/src/Profile.h @@ -0,0 +1,58 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#include "ArmsItem.h" +#include "MyChar.h" +#include "SelStage.h" +#include "Stage.h" + +typedef struct PROFILEDATA +{ + char code[8]; + int stage; + MusicID music; + int x; + int y; + int direct; + short max_life; + short star; + short life; + short a; + int select_arms; + int select_item; + int equip; + int unit; + int counter; + ARMS arms[8]; + ITEM items[32]; + PERMIT_STAGE permitstage[8]; + signed char permit_mapping[0x80]; + char FLAG[4]; + unsigned char flags[1000]; + + // Custom + char extra_code[0x10]; + // > 16) & 0x7FFF; +} + +void msvc_srand(unsigned int seed) +{ + next = seed; +} diff --git a/src/Random.h b/src/Random.h new file mode 100644 index 0000000..b9a2568 --- /dev/null +++ b/src/Random.h @@ -0,0 +1,7 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +int msvc_rand(void); +void msvc_srand(unsigned int seed); diff --git a/src/Resource.cpp b/src/Resource.cpp new file mode 100644 index 0000000..abab4a5 --- /dev/null +++ b/src/Resource.cpp @@ -0,0 +1,42 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#include "Resource.h" + +#include +#include + +#ifndef _WIN32 +static const unsigned char rICON_MINI[] = { + #include "Resource/ICON/ICON_MINI.png.h" +}; +#endif + +static const struct +{ + const char *type; + const char *name; + const unsigned char *data; + size_t size; +} resources[] = { +#ifndef _WIN32 + {"ICON", "ICON_MINI", rICON_MINI, sizeof(rICON_MINI)}, +#endif + {"DUMMY", "DUMMY", NULL, 0} // Just here to prevent errors in the event the array is otherwise empty +}; + +const unsigned char* FindResource(const char *name, const char *type, size_t *size) +{ + for (size_t i = 0; i < sizeof(resources) / sizeof(resources[0]); ++i) + { + if (!strcmp(name, resources[i].name) && !strcmp(type, resources[i].type)) + { + if (size != NULL) + *size = resources[i].size; + + return resources[i].data; + } + } + + return NULL; +} diff --git a/src/Resource.h b/src/Resource.h new file mode 100644 index 0000000..50d0574 --- /dev/null +++ b/src/Resource.h @@ -0,0 +1,8 @@ +// Released under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +const unsigned char* FindResource(const char *name, const char *type, size_t *size); diff --git a/src/SelStage.cpp b/src/SelStage.cpp new file mode 100644 index 0000000..23d68ef --- /dev/null +++ b/src/SelStage.cpp @@ -0,0 +1,253 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "SelStage.h" + +#include +#include + +#include "WindowsWrapper.h" + +#include "CommonDefines.h" +#include "Draw.h" +#include "Escape.h" +#include "KeyControl.h" +#include "Main.h" +#include "Pause.h" +#include "Sound.h" +#include "TextScr.h" + +PERMIT_STAGE gPermitStage[STAGE_MAX]; + +int gSelectedStage; +int gStageSelectTitleY; + +void ClearPermitStage(void) +{ + memset(gPermitStage, 0, sizeof(gPermitStage)); +} + +BOOL AddPermitStage(int index, int event) +{ + int i = 0; + + while (i < STAGE_MAX) + { + if (gPermitStage[i].index == index) + break; + + if (gPermitStage[i].index == 0) + break; + + ++i; + } + + if (i == STAGE_MAX) + return FALSE; + + gPermitStage[i].index = index; + gPermitStage[i].event = event; + + return TRUE; +} + +BOOL SubPermitStage(int index) +{ + int i; + + for (i = 0; i < STAGE_MAX; ++i) + if (gPermitStage[i].index == index) + break; + +#ifdef FIX_BUGS + if (i == STAGE_MAX) +#else + if (i == 32) // Same value as 'ITEM_MAX' +#endif + return FALSE; + + for (++i; i < STAGE_MAX; ++i) + gPermitStage[i - 1] = gPermitStage[i]; + + gPermitStage[i - 1].index = 0; + gPermitStage[i - 1].event = 0; + + return TRUE; +} + +void MoveStageSelectCursor(void) +{ + int stage_num; + int stage_x; + + stage_num = 0; + while (gPermitStage[stage_num].index != 0) + ++stage_num; + + stage_x = (WINDOW_WIDTH - (stage_num * 40)) / 2; // Unused + + if (stage_num == 0) + return; + + if (gKeyTrg & gKeyLeft) + --gSelectedStage; + + if (gKeyTrg & gKeyRight) + ++gSelectedStage; + + if (gSelectedStage < 0) + gSelectedStage = stage_num - 1; + + if (gSelectedStage > stage_num - 1) + gSelectedStage = 0; + + if (gKeyTrg & (gKeyLeft | gKeyRight)) + StartTextScript(gPermitStage[gSelectedStage].index + 1000); + + if (gKeyTrg & (gKeyLeft | gKeyRight)) + PlaySoundObject(1, SOUND_MODE_PLAY); +} + +void PutStageSelectObject(void) +{ + static unsigned int flash; + + int i; + RECT rcStage; + + RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + + RECT rcCur[2] = { + {80, 88, 112, 104}, + {80, 104, 112, 120}, + }; + + RECT rcTitle1 = {80, 64, 144, 72}; + + int stage_num; + int stage_x; + + if (gStageSelectTitleY > (WINDOW_HEIGHT / 2) - 74) + --gStageSelectTitleY; + + PutBitmap3(&rcView, PixelToScreenCoord((WINDOW_WIDTH / 2) - 32), PixelToScreenCoord(gStageSelectTitleY), &rcTitle1, SURFACE_ID_TEXT_BOX); + + stage_num = 0; + while (gPermitStage[stage_num].index) + ++stage_num; + + ++flash; + + if (stage_num != 0) + { + stage_x = (WINDOW_WIDTH - (stage_num * 40)) / 2; + + PutBitmap3(&rcView, PixelToScreenCoord(stage_x + (gSelectedStage * 40)), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 56), &rcCur[flash / 2 % 2], SURFACE_ID_TEXT_BOX); + + for (i = 0; i < STAGE_MAX; ++i) + { + if (gPermitStage[i].index == 0) + break; + + // Interestingly, there's code for reading multiple rows of icons + // from the 'StageImage.pbm' file when there are more than 8 stages, + // despite only 6 icons ever being used. + rcStage.left = (gPermitStage[i].index % 8) * 32; + rcStage.right = rcStage.left + 32; + rcStage.top = (gPermitStage[i].index / 8) * 16; + rcStage.bottom = rcStage.top + 16; + + PutBitmap3(&rcView, PixelToScreenCoord(stage_x + (i * 40)), PixelToScreenCoord((WINDOW_HEIGHT / 2) - 56), &rcStage, SURFACE_ID_STAGE_ITEM); + } + } +} + +int StageSelectLoop(int *p_event) +{ + std::string old_script_path; + + RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; + + gSelectedStage = 0; + BackupSurface(SURFACE_ID_SCREEN_GRAB, &grcFull); + old_script_path = GetTextScriptPath(); + LoadTextScript2("StageSelect.tsc"); + gStageSelectTitleY = (WINDOW_HEIGHT / 2) - 66; + StartTextScript(gPermitStage[gSelectedStage].index + 1000); + + for (;;) + { + GetTrg(); + + if (gKey & KEY_PAUSE) + { + switch (Call_Pause(1)) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + } + + if (gKey & KEY_ESCAPE) + { + switch (Call_Escape()) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + } + + MoveStageSelectCursor(); + + switch (TextScriptProc()) + { + case enum_ESCRETURN_exit: + return enum_ESCRETURN_exit; + + case enum_ESCRETURN_restart: + return enum_ESCRETURN_restart; + } + +#ifdef FIX_BUGS + PutBitmap4(&rcView, 0, 0, &rcView, SURFACE_ID_SCREEN_GRAB); +#else + // The original accidentally drew the screencap with transparency enabled + PutBitmap3(&rcView, 0, 0, &rcView, SURFACE_ID_SCREEN_GRAB); +#endif + PutStageSelectObject(); + PutTextScript(); + + if (gKeyTrg & gKeyOk) + { + StopTextScript(); + break; + } + + if (gKeyTrg & gKeyCancel) + { + StopTextScript(); + LoadTextScript_Stage(old_script_path.c_str()); + *p_event = 0; + return enum_ESCRETURN_continue; + } + + PutFramePerSecound(); + + if (!Flip_SystemTask()) + return enum_ESCRETURN_exit; + } + + LoadTextScript_Stage(old_script_path.c_str()); + *p_event = gPermitStage[gSelectedStage].event; + return enum_ESCRETURN_continue; +} diff --git a/src/SelStage.h b/src/SelStage.h new file mode 100644 index 0000000..1551e37 --- /dev/null +++ b/src/SelStage.h @@ -0,0 +1,30 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#define STAGE_MAX 8 // Note that Cave Story only has 5 stages + +typedef struct PERMIT_STAGE +{ + int index; + int event; +} PERMIT_STAGE; + +extern PERMIT_STAGE gPermitStage[STAGE_MAX]; + +extern int gSelectedStage; +extern int gStageSelectTitleY; + +void ClearPermitStage(void); +BOOL AddPermitStage(int index, int event); +BOOL SubPermitStage(int index); +void MoveStageSelectCursor(void); +void PutStageSelectObject(void); +int StageSelectLoop(int *p_event); diff --git a/src/Shoot.cpp b/src/Shoot.cpp new file mode 100644 index 0000000..0335659 --- /dev/null +++ b/src/Shoot.cpp @@ -0,0 +1,1172 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Shoot.h" + +#include "WindowsWrapper.h" + +#include "ArmsItem.h" +#include "Bullet.h" +#include "Caret.h" +#include "Generic.h" +#include "CommonDefines.h" +#include "KeyControl.h" +#include "MyChar.h" +#include "MycParam.h" +#include "Sound.h" + +static int empty; +int gbAutoFire; +BOOL autofire_switch = FALSE; + +void ShootBullet_Frontia1(int level) +{ + int bul_no; + + switch (level) + { + case 1: + bul_no = 1; + break; + + case 2: + bul_no = 2; + break; + + case 3: + bul_no = 3; + break; + } + + if (CountArmsBullet(1) > 3) + return; + + if ((gbAutoFire == 2 && autofire_switch) || (gbAutoFire == 1? gKey & gKeyShot : gKeyTrg & gKeyShot)) + { + if (!UseArmsEnergy(1)) + { + ChangeToFirstArms(); + } + else + { + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (3 * 0x200), gMC.y - (10 * 0x200), 1); + SetCaret(gMC.x - (3 * 0x200), gMC.y - (10 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (3 * 0x200), gMC.y - (10 * 0x200), 1); + SetCaret(gMC.x + (3 * 0x200), gMC.y - (10 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (3 * 0x200), gMC.y + (10 * 0x200), 3); + SetCaret(gMC.x - (3 * 0x200), gMC.y + (10 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (3 * 0x200), gMC.y + (10 * 0x200), 3); + SetCaret(gMC.x + (3 * 0x200), gMC.y + (10 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (6 * 0x200), gMC.y + (2 * 0x200), 0); + SetCaret(gMC.x - (12 * 0x200), gMC.y + (2 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (6 * 0x200), gMC.y + (2 * 0x200), 2); + SetCaret(gMC.x + (12 * 0x200), gMC.y + (2 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + + PlaySoundObject(33, SOUND_MODE_PLAY); + } + } +} + +void ShootBullet_PoleStar(int level) +{ + int bul_no; + + switch (level) + { + case 1: + bul_no = 4; + break; + + case 2: + bul_no = 5; + break; + + case 3: + bul_no = 6; + break; + } + + if (CountArmsBullet(2) > 1) + return; + + if ((gbAutoFire == 2 && autofire_switch) || (gbAutoFire == 1? gKey & gKeyShot : gKeyTrg & gKeyShot)) + { + if (!UseArmsEnergy(1)) + { + PlaySoundObject(37, SOUND_MODE_PLAY); + } + else + { + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x - (1 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x + (1 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x - (1 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x + (1 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (6 * 0x200), gMC.y + (3 * 0x200), 0); + SetCaret(gMC.x - (12 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (6 * 0x200), gMC.y + (3 * 0x200), 2); + SetCaret(gMC.x + (12 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + + if (level == 3) + PlaySoundObject(49, SOUND_MODE_PLAY); + else + PlaySoundObject(32, SOUND_MODE_PLAY); + } + } +} + +void ShootBullet_FireBall(int level) +{ + int bul_no; + + switch (level) + { + case 1: + if (CountArmsBullet(3) > 1) + return; + + bul_no = 7; + break; + + case 2: + if (CountArmsBullet(3) > 2) + return; + + bul_no = 8; + break; + + case 3: + if (CountArmsBullet(3) > 3) + return; + + bul_no = 9; + break; + } + + if ((gbAutoFire == 2 && autofire_switch) || (gbAutoFire == 1? gKey & gKeyShot : gKeyTrg & gKeyShot)) + { + if (!UseArmsEnergy(1)) + { + ChangeToFirstArms(); + } + else + { + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (4 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x - (4 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (4 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x + (4 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (4 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x - (4 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (4 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x + (4 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (6 * 0x200), gMC.y + (2 * 0x200), 0); + SetCaret(gMC.x - (12 * 0x200), gMC.y + (2 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (6 * 0x200), gMC.y + (2 * 0x200), 2); + SetCaret(gMC.x + (12 * 0x200), gMC.y + (2 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + + PlaySoundObject(34, SOUND_MODE_PLAY); + } + } +} + +void ShootBullet_Machinegun1(int level) +{ + int bul_no; + static int wait; + + if (CountArmsBullet(4) > 4) + return; + + switch (level) + { + case 1: + bul_no = 10; + break; + + case 2: + bul_no = 11; + break; + + case 3: + bul_no = 12; + break; + } + + if (!(gKey & gKeyShot)) + gMC.rensha = 6; + + if ((gbAutoFire == 2 && autofire_switch) || (gKey & gKeyShot)) + { + if (++gMC.rensha < 6) + return; + + gMC.rensha = 0; + + if (!UseArmsEnergy(1)) + { + PlaySoundObject(37, SOUND_MODE_PLAY); + + if (empty == 0) + { + SetCaret(gMC.x, gMC.y, CARET_EMPTY, DIR_LEFT); + empty = 50; + } + + return; + } + + if (gMC.up) + { + if (level == 3) + gMC.ym += 0x100; + + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (3 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x - (3 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (3 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x + (3 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else if (gMC.down) + { + if (level == 3) + { + if (gMC.ym > 0) + gMC.ym /= 2; + + if (gMC.ym > -0x400) + { + gMC.ym -= 0x200; + if (gMC.ym < -0x400) + gMC.ym = -0x400; + } + } + + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (3 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x - (3 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (3 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x + (3 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (12 * 0x200), gMC.y + (3 * 0x200), 0); + SetCaret(gMC.x - (12 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (12 * 0x200), gMC.y + (3 * 0x200), 2); + SetCaret(gMC.x + (12 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + + if (level == 3) + PlaySoundObject(49, SOUND_MODE_PLAY); + else + PlaySoundObject(32, SOUND_MODE_PLAY); + } + else + { + ++wait; + + if (gMC.equip & EQUIP_TURBOCHARGE) + { + if (wait > 1) + { + wait = 0; + ChargeArmsEnergy(1); + } + } + else + { + if (wait > 4) + { + wait = 0; + ChargeArmsEnergy(1); + } + } + } +} + +void ShootBullet_Missile(int level, BOOL bSuper) +{ + int bul_no; + + if (bSuper) + { + switch (level) + { + case 1: + bul_no = 28; + break; + + case 2: + bul_no = 29; + break; + + case 3: + bul_no = 30; + break; + } + + switch (level) + { + case 1: + if (CountArmsBullet(10) > 0) + return; + + if (CountArmsBullet(11) > 0) + return; + + break; + + case 2: + if (CountArmsBullet(10) > 1) + return; + + if (CountArmsBullet(11) > 1) + return; + + break; + + case 3: + if (CountArmsBullet(10) > 3) + return; + + if (CountArmsBullet(11) > 3) + return; + + break; + } + + } + else + { + switch (level) + { + case 1: + bul_no = 13; + break; + + case 2: + bul_no = 14; + break; + + case 3: + bul_no = 15; + break; + } + + switch (level) + { + case 1: + if (CountArmsBullet(5) > 0) + return; + + if (CountArmsBullet(6) > 0) + return; + + break; + + case 2: + if (CountArmsBullet(5) > 1) + return; + + if (CountArmsBullet(6) > 1) + return; + + break; + + case 3: + if (CountArmsBullet(5) > 3) + return; + + if (CountArmsBullet(6) > 3) + return; + + break; + } + } + + if ((gbAutoFire == 2 && autofire_switch) || (gbAutoFire? gKey & gKeyShot : gKeyTrg & gKeyShot)) + { + if (level < 3) + { + if (!UseArmsEnergy(1)) + { + PlaySoundObject(37, SOUND_MODE_PLAY); + + if (empty == 0) + { + SetCaret(gMC.x, gMC.y, CARET_EMPTY, DIR_LEFT); + empty = 50; + } + + return; + } + + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x - (1 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x + (1 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x - (1 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x + (1 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (6 * 0x200), gMC.y, 0); + SetCaret(gMC.x - (12 * 0x200), gMC.y, CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (6 * 0x200), gMC.y, 2); + SetCaret(gMC.x + (12 * 0x200), gMC.y, CARET_SHOOT, DIR_LEFT); + } + } + } + else + { + if (!UseArmsEnergy(1)) + { + PlaySoundObject(37, SOUND_MODE_PLAY); + + if (empty == 0) + { + SetCaret(gMC.x, gMC.y, CARET_EMPTY, DIR_LEFT); + empty = 50; + } + + return; + } + + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x - (1 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + SetBullet(bul_no, gMC.x + (3 * 0x200), gMC.y, 1); + SetBullet(bul_no, gMC.x - (3 * 0x200), gMC.y, 1); + } + else + { + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x + (1 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + SetBullet(bul_no, gMC.x + (3 * 0x200), gMC.y, 1); + SetBullet(bul_no, gMC.x - (3 * 0x200), gMC.y, 1); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x - (1 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + SetBullet(bul_no, gMC.x + (3 * 0x200), gMC.y, 3); + SetBullet(bul_no, gMC.x - (3 * 0x200), gMC.y, 3); + } + else + { + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x + (1 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + SetBullet(bul_no, gMC.x - (3 * 0x200), gMC.y, 3); + SetBullet(bul_no, gMC.x + (3 * 0x200), gMC.y, 3); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (6 * 0x200), gMC.y + (1 * 0x200), 0); + SetCaret(gMC.x - (12 * 0x200), gMC.y + (1 * 0x200), CARET_SHOOT, DIR_LEFT); + SetBullet(bul_no, gMC.x, gMC.y - (8 * 0x200), 0); + SetBullet(bul_no, gMC.x + (4 * 0x200), gMC.y - (1 * 0x200), 0); + } + else + { + SetBullet(bul_no, gMC.x + (6 * 0x200), gMC.y + (1 * 0x200), 2); + SetCaret(gMC.x + (12 * 0x200), gMC.y + (1 * 0x200), CARET_SHOOT, DIR_LEFT); + SetBullet(bul_no, gMC.x, gMC.y - (8 * 0x200), 2); + SetBullet(bul_no, gMC.x - (4 * 0x200), gMC.y - (1 * 0x200), 2); + } + } + } + + PlaySoundObject(32, SOUND_MODE_PLAY); + } +} + +void ShootBullet_Bubblin1(void) +{ + static int wait; + + if (CountArmsBullet(7) > 3) + return; + + if ((gbAutoFire == 2 && autofire_switch) || (gbAutoFire == 1? gKey & gKeyShot : gKeyTrg & gKeyShot)) + { + if (!UseArmsEnergy(1)) + { + PlaySoundObject(37, SOUND_MODE_PLAY); + + if (empty == 0) + { + SetCaret(gMC.x, gMC.y, CARET_EMPTY, DIR_LEFT); + empty = 50; + } + + return; + } + + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(19, gMC.x - (1 * 0x200), gMC.y - (2 * 0x200), 1); + SetCaret(gMC.x - (1 * 0x200), gMC.y - (2 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(19, gMC.x + (1 * 0x200), gMC.y - (2 * 0x200), 1); + SetCaret(gMC.x + (1 * 0x200), gMC.y - (2 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(19, gMC.x - (1 * 0x200), gMC.y + (2 * 0x200), 3); + SetCaret(gMC.x - (1 * 0x200), gMC.y + (2 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(19, gMC.x + (1 * 0x200), gMC.y + (2 * 0x200), 3); + SetCaret(gMC.x + (1 * 0x200), gMC.y + (2 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(19, gMC.x - (6 * 0x200), gMC.y + (3 * 0x200), 0); + SetCaret(gMC.x - (12 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(19, gMC.x + (6 * 0x200), gMC.y + (3 * 0x200), 2); + SetCaret(gMC.x + (12 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + + PlaySoundObject(48, SOUND_MODE_PLAY); + } + else if (++wait > 20) + { + wait = 0; + ChargeArmsEnergy(1); + } +} + +void ShootBullet_Bubblin2(int level) +{ + static int wait; + + if (CountArmsBullet(7) > 15) + return; + + level += 18; + + if (!(gKey & gKeyShot)) + gMC.rensha = 6; + + if ((gbAutoFire == 2 && autofire_switch) || (gKey & gKeyShot)) + { + if (++gMC.rensha < 7) + return; + + gMC.rensha = 0; + + if (!UseArmsEnergy(1)) + { + PlaySoundObject(37, SOUND_MODE_PLAY); + + if (empty == 0) + { + SetCaret(gMC.x, gMC.y, CARET_EMPTY, DIR_LEFT); + empty = 50; + } + + return; + } + + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(level, gMC.x - (3 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x - (3 * 0x200), gMC.y - (16 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(level, gMC.x + (3 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x + (3 * 0x200), gMC.y - (16 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(level, gMC.x - (3 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x - (3 * 0x200), gMC.y + (16 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(level, gMC.x + (3 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x + (3 * 0x200), gMC.y + (16 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(level, gMC.x - (6 * 0x200), gMC.y + (3 * 0x200), 0); + SetCaret(gMC.x - (12 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(level, gMC.x + (6 * 0x200), gMC.y + (3 * 0x200), 2); + SetCaret(gMC.x + (12 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + + PlaySoundObject(48, SOUND_MODE_PLAY); + } + else if (++wait > 1) + { + wait = 0; + ChargeArmsEnergy(1); + } +} + +void ShootBullet_Sword(int level) +{ + int bul_no; + + if (CountArmsBullet(9) > 0) + return; + + switch (level) + { + case 1: + bul_no = 25; + break; + + case 2: + bul_no = 26; + break; + + case 3: + bul_no = 27; + break; + } + + if ((gbAutoFire == 2 && autofire_switch) || (gbAutoFire == 1? gKey & gKeyShot : gKeyTrg & gKeyShot)) + { + if (gMC.up) + { + if (gMC.direct == 0) + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y + (4 * 0x200), 1); + else + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y + (4 * 0x200), 1); + } + else if (gMC.down) + { + if (gMC.direct == 0) + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y - (6 * 0x200), 3); + else + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y - (6 * 0x200), 3); + } + else + { + if (gMC.direct == 0) + SetBullet(bul_no, gMC.x + (6 * 0x200), gMC.y - (3 * 0x200), 0); + else + SetBullet(bul_no, gMC.x - (6 * 0x200), gMC.y - (3 * 0x200), 2); + } + + PlaySoundObject(34, SOUND_MODE_PLAY); + } +} + +void ShootBullet_Nemesis(int level) +{ + int bul_no; + + switch (level) + { + case 1: + bul_no = 34; + break; + + case 2: + bul_no = 35; + break; + + case 3: + bul_no = 36; + break; + } + + if (CountArmsBullet(12) > 1) + return; + + if ((gbAutoFire == 2 && autofire_switch) || (gbAutoFire == 1? gKey & gKeyShot : gKeyTrg & gKeyShot)) + { + if (!UseArmsEnergy(1)) + { + PlaySoundObject(37, SOUND_MODE_PLAY); + } + else + { + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y - (12 * 0x200), 1); + SetCaret(gMC.x - (1 * 0x200), gMC.y - (12 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y - (12 * 0x200), 1); + SetCaret(gMC.x + (1 * 0x200), gMC.y - (12 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y + (12 * 0x200), 3); + SetCaret(gMC.x - (1 * 0x200), gMC.y + (12 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y + (12 * 0x200), 3); + SetCaret(gMC.x + (1 * 0x200), gMC.y + (12 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (22 * 0x200), gMC.y + (3 * 0x200), 0); + SetCaret(gMC.x - (16 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (22 * 0x200), gMC.y + (3 * 0x200), 2); + SetCaret(gMC.x + (16 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + + switch (level) + { + case 1: + PlaySoundObject(117, SOUND_MODE_PLAY); + break; + + case 2: + PlaySoundObject(49, SOUND_MODE_PLAY); + break; + + case 3: + PlaySoundObject(60, SOUND_MODE_PLAY); + break; + } + } + } +} + +int spur_charge; + +void ResetSpurCharge(void) +{ + spur_charge = 0; + + if (gArmsData[gSelectedArms].code == 13) + ZeroExpMyChar(); +} + +void ShootBullet_Spur(int level) +{ + int bul_no; + BOOL bShot; + static BOOL bMax; + + bShot = FALSE; + + if ((gbAutoFire == 2 && autofire_switch) ||( gKey & gKeyShot)) + { + if (gMC.equip & EQUIP_TURBOCHARGE) + AddExpMyChar(3); + else + AddExpMyChar(2); + + if (++spur_charge / 2 % 2) + { + switch (level) + { + case 1: + PlaySoundObject(59, SOUND_MODE_PLAY); + break; + + case 2: + PlaySoundObject(60, SOUND_MODE_PLAY); + break; + + case 3: + if (!IsMaxExpMyChar()) + PlaySoundObject(61, SOUND_MODE_PLAY); + + break; + } + } + } + else if((gbAutoFire == 2 && !autofire_switch) || !(gKey & gKeyShot)) + { + if (spur_charge) + bShot = TRUE; + + spur_charge = 0; + } + + if (IsMaxExpMyChar()) + { + if (!bMax) + { + bMax = TRUE; + PlaySoundObject(65, SOUND_MODE_PLAY); + } + } + else + { + bMax = FALSE; + } + + if(gbAutoFire == 2 && !autofire_switch) + ZeroExpMyChar(); + if (gbAutoFire != 2 && !(gKey & gKeyShot)) + ZeroExpMyChar(); + + switch (level) + { + case 1: + bul_no = 6; + bShot = FALSE; + break; + + case 2: + bul_no = 37; + break; + + case 3: + if (bMax) + bul_no = 39; + else + bul_no = 38; + + break; + } + + if (CountArmsBullet(13) > 0 || CountArmsBullet(14) > 0) + return; + + if (gKeyTrg & gKeyShot || bShot) + { + if (!UseArmsEnergy(1)) + { + PlaySoundObject(37, SOUND_MODE_PLAY); + } + else + { + if (gMC.up) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x - (1 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y - (8 * 0x200), 1); + SetCaret(gMC.x + (1 * 0x200), gMC.y - (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else if (gMC.down) + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (1 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x - (1 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (1 * 0x200), gMC.y + (8 * 0x200), 3); + SetCaret(gMC.x + (1 * 0x200), gMC.y + (8 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + else + { + if (gMC.direct == 0) + { + SetBullet(bul_no, gMC.x - (6 * 0x200), gMC.y + (3 * 0x200), 0); + SetCaret(gMC.x - (12 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + else + { + SetBullet(bul_no, gMC.x + (6 * 0x200), gMC.y + (3 * 0x200), 2); + SetCaret(gMC.x + (12 * 0x200), gMC.y + (3 * 0x200), CARET_SHOOT, DIR_LEFT); + } + } + + switch (bul_no) + { + case 6: + PlaySoundObject(49, SOUND_MODE_PLAY); + break; + + case 37: + PlaySoundObject(62, SOUND_MODE_PLAY); + break; + + case 38: + PlaySoundObject(63, SOUND_MODE_PLAY); + break; + + case 39: + PlaySoundObject(64, SOUND_MODE_PLAY); + break; + } + } + } +} + +void ShootBullet(void) +{ + static int soft_rensha; // 'rensha' is Japanese for 'rapid-fire', apparently + + if (empty != 0) + --empty; + + // Only let the player shoot every 4 frames + if (soft_rensha != 0) + --soft_rensha; + + if(gbAutoFire == 2){ + if(gKeyTrg & gKeyShot) + autofire_switch = !autofire_switch; + } + + if ((gbAutoFire == 2 && autofire_switch && gArmsData[gSelectedArms].code != 13) + || (gbAutoFire == 1? ((gKey & gKeyShot) && gArmsData[gSelectedArms].code != 4 && (gArmsData[gSelectedArms].code != 7 || gArmsData[gSelectedArms].level < 2) && gArmsData[gSelectedArms].code != 13): gKeyTrg & gKeyShot)) + { + if (soft_rensha != 0) + return; + + soft_rensha = 4; + } + + // Run functions + if (gMC.cond & 2) + return; + + switch (gArmsData[gSelectedArms].code) + { + case 1: + ShootBullet_Frontia1(gArmsData[gSelectedArms].level); + break; + + case 2: + ShootBullet_PoleStar(gArmsData[gSelectedArms].level); + break; + + case 3: + ShootBullet_FireBall(gArmsData[gSelectedArms].level); + break; + + case 4: + ShootBullet_Machinegun1(gArmsData[gSelectedArms].level); + break; + + case 5: + ShootBullet_Missile(gArmsData[gSelectedArms].level, FALSE); + break; + + case 7: + switch (gArmsData[gSelectedArms].level) + { + case 1: + ShootBullet_Bubblin1(); + break; + + case 2: + ShootBullet_Bubblin2(2); + break; + + case 3: + ShootBullet_Bubblin2(3); + break; + } + + break; + + case 9: + switch (gArmsData[gSelectedArms].level) + { + case 1: + ShootBullet_Sword(1); + break; + + case 2: + ShootBullet_Sword(2); + break; + + case 3: + ShootBullet_Sword(3); + break; + } + + break; + + case 10: + ShootBullet_Missile(gArmsData[gSelectedArms].level, TRUE); + break; + + case 12: + ShootBullet_Nemesis(gArmsData[gSelectedArms].level); + break; + + case 13: + ShootBullet_Spur(gArmsData[gSelectedArms].level); + break; + } +} diff --git a/src/Shoot.h b/src/Shoot.h new file mode 100644 index 0000000..29b995b --- /dev/null +++ b/src/Shoot.h @@ -0,0 +1,16 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +extern int gbAutoFire; +extern BOOL autofire_switch; + +void ResetSpurCharge(void); +void ShootBullet(void); \ No newline at end of file diff --git a/src/Sound.cpp b/src/Sound.cpp new file mode 100644 index 0000000..cdb6053 --- /dev/null +++ b/src/Sound.cpp @@ -0,0 +1,390 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +// Some of the original source code for this file can be found here: +// https://github.com/shbow/organya/blob/master/source/Sound.cpp + +/* +TODO - Code style +Pixel's code was *extremely* Windows-centric, to the point of using +things like ZeroMemory and LPCSTR instead of standard things like +memset and const char*. For now, the decompilation is accurate despite +not using these since they're just macros that evaluate to the portable +equivalents. +*/ + +#include "Sound.h" + +#include +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "Backends/Audio.h" +#ifdef EXTRA_SOUND_FORMATS +#include "ExtraSoundFormats.h" +#endif +#include "Main.h" +#include "Organya.h" +#include "PixTone.h" +#include "Resource.h" + +BOOL audio_backend_initialised; +AudioBackend_Sound *lpSECONDARYBUFFER[SE_MAX]; + +// DirectSoundの開始 (Starting DirectSound) +BOOL InitDirectSound(void) +{ + int i; + + audio_backend_initialised = AudioBackend_Init(); + + if (!audio_backend_initialised) + { + #ifndef FIX_BUGS + // This makes absolutely no sense here + StartOrganya("Org/Wave.dat"); + #endif + return FALSE; + } + + for (i = 0; i < SE_MAX; i++) + lpSECONDARYBUFFER[i] = NULL; + + StartOrganya("Org/Wave.dat"); + + return TRUE; +} + +// DirectSoundの終了 (Exit DirectSound) +void EndDirectSound(void) +{ + int i; + + if (!audio_backend_initialised) + return; + + EndOrganya(); + + for (i = 0; i < SE_MAX; i++) + if (lpSECONDARYBUFFER[i] != NULL) + AudioBackend_DestroySound(lpSECONDARYBUFFER[i]); + + AudioBackend_Deinit(); +} + +// Below are two completely unused functions for loading .wav files as sound effects. +// Some say that sounds heard in CS Beta footage don't sound like PixTone... + +// There's a bit of a problem with this code: it hardcodes the offsets of various bits +// of data in the WAV header - this makes the code only compatible with very specific +// .wav files. You can check the prototype OrgView EXEs for examples of those. + +// サウンドの設定 (Sound settings) +BOOL InitSoundObject(const char *resname, int no) +{ + const unsigned char *resource_pointer; // リソースのアドレス (Resource address) + + if (!audio_backend_initialised) + return TRUE; + + // リソースの検索 (Search for resources) + resource_pointer = FindResource(resname, "WAVE", NULL); + + if (resource_pointer == NULL) + return FALSE; + + // Get sound properties, and check if it's valid + unsigned long buffer_size = resource_pointer[0x36] | (resource_pointer[0x37] << 8) | (resource_pointer[0x38] << 16) | (resource_pointer[0x39] << 24); + unsigned short format = resource_pointer[0x14] | (resource_pointer[0x15] << 8); + unsigned short channels = resource_pointer[0x16] | (resource_pointer[0x17] << 8); + unsigned long sample_rate = resource_pointer[0x18] | (resource_pointer[0x19] << 8) | (resource_pointer[0x1A] << 16) | (resource_pointer[0x1B] << 24); + unsigned short bits_per_sample = resource_pointer[0x22] | (resource_pointer[0x23] << 8); + + if (format != 1) // 1 is WAVE_FORMAT_PCM + return FALSE; + + if (channels != 1) // The mixer only supports mono right now + return FALSE; + + if (bits_per_sample != 8) // The mixer only supports unsigned 8-bit samples + return FALSE; + + // 二次バッファの生成 (Create secondary buffer) + lpSECONDARYBUFFER[no] = AudioBackend_CreateSound(sample_rate, resource_pointer + 0x3A, buffer_size); + + if (lpSECONDARYBUFFER[no] == NULL) + return FALSE; + + return TRUE; +} + +BOOL LoadSoundObject(const char *file_name, int no) +{ + std::string path; + //unsigned long i; + unsigned long file_size = 0; + char check_box[58]; + FILE *fp; + + path = gModulePath + '/' + file_name; + + if (!audio_backend_initialised) + return TRUE; + + if ((fp = fopen(path.c_str(), "rb")) == NULL) + return FALSE; + + fseek(fp, 0, SEEK_END); + file_size = ftell(fp); + rewind(fp); + + // Let's not throttle disk I/O, shall we... + //for (i = 0; i < 58; i++) + // fread(&check_box[i], sizeof(char), 1, fp); // Holy hell, this is inefficient + fread(check_box, 1, 58, fp); + +#ifdef FIX_MAJOR_BUGS + // The original code forgets to close 'fp' + if (check_box[0] != 'R' || check_box[1] != 'I' || check_box[2] != 'F' || check_box[3] != 'F') + { + fclose(fp); + return FALSE; + } +#else + if (check_box[0] != 'R') + return FALSE; + if (check_box[1] != 'I') + return FALSE; + if (check_box[2] != 'F') + return FALSE; + if (check_box[3] != 'F') + return FALSE; +#endif + + unsigned char *wp; + wp = (unsigned char*)malloc(file_size); // ファイルのワークスペースを作る (Create a file workspace) + +#ifdef FIX_MAJOR_BUGS + if (wp == NULL) + { + fclose(fp); + return FALSE; + } +#endif + + fseek(fp, 0, SEEK_SET); + + // Bloody hell, Pixel, come on... + //for (i = 0; i < file_size; i++) + // fread((BYTE*)wp+i, sizeof(char), 1, fp); // Pixel, stahp + fread(wp, 1, file_size, fp); + + fclose(fp); + + // Get sound properties, and check if it's valid + unsigned long buffer_size = wp[0x36] | (wp[0x37] << 8) | (wp[0x38] << 16) | (wp[0x39] << 24); + unsigned short format = wp[0x14] | (wp[0x15] << 8); + unsigned short channels = wp[0x16] | (wp[0x17] << 8); + unsigned long sample_rate = wp[0x18] | (wp[0x19] << 8) | (wp[0x1A] << 16) | (wp[0x1B] << 24); + unsigned short bits_per_sample = wp[0x22] | (wp[0x23] << 8); + + if (format != 1) // 1 is WAVE_FORMAT_PCM + { + free(wp); + return FALSE; + } + + if (channels != 1) // The mixer only supports mono right now + { + free(wp); + return FALSE; + } + + if (bits_per_sample != 8) // The mixer only supports 8-bit unsigned samples + { + free(wp); + return FALSE; + } + + // セカンダリバッファの生成 (Create secondary buffer) + lpSECONDARYBUFFER[no] = AudioBackend_CreateSound(sample_rate, wp + 0x3A, buffer_size); + + if (lpSECONDARYBUFFER[no] == NULL) + { +#ifdef FIX_MAJOR_BUGS + free(wp); // The updated Organya source code includes this fix +#endif + return FALSE; + } + + free(wp); + + return TRUE; +} + +void PlaySoundObject(int no, SoundMode mode) +{ + if (!audio_backend_initialised) + return; + + if (lpSECONDARYBUFFER[no] != NULL) + { + switch (mode) + { + case SOUND_MODE_STOP: // 停止 (Stop) + AudioBackend_StopSound(lpSECONDARYBUFFER[no]); + break; + + case SOUND_MODE_PLAY: // 再生 (Playback) + AudioBackend_StopSound(lpSECONDARYBUFFER[no]); + AudioBackend_RewindSound(lpSECONDARYBUFFER[no]); + AudioBackend_PlaySound(lpSECONDARYBUFFER[no], FALSE); + break; + + case SOUND_MODE_PLAY_LOOP:// ループ再生 (Loop playback) + AudioBackend_PlaySound(lpSECONDARYBUFFER[no], TRUE); + break; + } + } +#ifdef EXTRA_SOUND_FORMATS + else + { + ExtraSound_PlaySFX(no, mode); + } +#endif +} + +void ChangeSoundFrequency(int no, unsigned long rate) // 100がMIN9999がMAXで2195?がノーマル (100 is MIN, 9999 is MAX, and 2195 is normal) +{ + if (!audio_backend_initialised) + return; + + if (lpSECONDARYBUFFER[no] != NULL) + AudioBackend_SetSoundFrequency(lpSECONDARYBUFFER[no], (rate * 10) + 100); +#ifdef EXTRA_SOUND_FORMATS + else + ExtraSound_SetSFXFrequency(no, (rate * 10) + 100); +#endif +} + +void ChangeSoundVolume(int no, long volume) // 300がMAXで300がノーマル (300 is MAX and 300 is normal) +{ + if (!audio_backend_initialised) + return; + + if (lpSECONDARYBUFFER[no] != NULL) + AudioBackend_SetSoundVolume(lpSECONDARYBUFFER[no], (volume - 300) * 8); +#ifdef EXTRA_SOUND_FORMATS + else + ExtraSound_SetSFXVolume(no, (volume - 300) * 8); +#endif +} + +void ChangeSoundPan(int no, long pan) // 512がMAXで256がノーマル (512 is MAX and 256 is normal) +{ + if (!audio_backend_initialised) + return; + + if (lpSECONDARYBUFFER[no] != NULL) + AudioBackend_SetSoundPan(lpSECONDARYBUFFER[no], (pan - 256) * 10); +#ifdef EXTRA_SOUND_FORMATS + else + ExtraSound_SetSFXPan(no, (pan - 256) * 10); +#endif +} + +// TODO - The stack frame for this function is inaccurate +int MakePixToneObject(const PIXTONEPARAMETER *ptp, int ptp_num, int no) +{ + int sample_count; + int i, j; + const PIXTONEPARAMETER *ptp_pointer; + unsigned char *pcm_buffer; + unsigned char *mixed_pcm_buffer; + + if (!audio_backend_initialised) + return 0; + + ptp_pointer = ptp; + sample_count = 0; + + for (i = 0; i < ptp_num; i++) + { + if (ptp_pointer->size > sample_count) + sample_count = ptp_pointer->size; + + ++ptp_pointer; + } + + pcm_buffer = mixed_pcm_buffer = NULL; + + pcm_buffer = (unsigned char*)malloc(sample_count); + mixed_pcm_buffer = (unsigned char*)malloc(sample_count); + + if (pcm_buffer == NULL || mixed_pcm_buffer == NULL) + { + if (pcm_buffer != NULL) + free(pcm_buffer); + + if (mixed_pcm_buffer != NULL) + free(mixed_pcm_buffer); + + return -1; + } + + memset(pcm_buffer, 0x80, sample_count); + memset(mixed_pcm_buffer, 0x80, sample_count); + + ptp_pointer = ptp; + + for (i = 0; i < ptp_num; i++) + { + if (!MakePixelWaveData(ptp_pointer, pcm_buffer)) + { + if (pcm_buffer != NULL) // This is always true + free(pcm_buffer); + + if (mixed_pcm_buffer != NULL) // This is always true + free(mixed_pcm_buffer); + + return -1; + } + + for (j = 0; j < ptp_pointer->size; j++) + { + if (pcm_buffer[j] + mixed_pcm_buffer[j] - 0x100 < -0x7F) + mixed_pcm_buffer[j] = 0; + else if (pcm_buffer[j] + mixed_pcm_buffer[j] - 0x100 > 0x7F) + mixed_pcm_buffer[j] = 0xFF; + else + mixed_pcm_buffer[j] = mixed_pcm_buffer[j] + pcm_buffer[j] - 0x80; + } + + ++ptp_pointer; + } + + // This is self-assignment, so redundant. Maybe this used to be something to prevent audio popping ? + mixed_pcm_buffer[0] = mixed_pcm_buffer[0]; + mixed_pcm_buffer[sample_count - 1] = mixed_pcm_buffer[sample_count - 1]; + + lpSECONDARYBUFFER[no] = AudioBackend_CreateSound(22050, mixed_pcm_buffer, sample_count); + + if (pcm_buffer != NULL) + free(pcm_buffer); + + if (mixed_pcm_buffer != NULL) + free(mixed_pcm_buffer); + + if (lpSECONDARYBUFFER[no] == NULL) + return -1; + + return sample_count; +} diff --git a/src/Sound.h b/src/Sound.h new file mode 100644 index 0000000..afbe4d7 --- /dev/null +++ b/src/Sound.h @@ -0,0 +1,54 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#include "Backends/Audio.h" +#include "PixTone.h" + +#define SE_MAX 160 // According to the Organya source code release, this is the real name for this constant + +enum SoundEffectNames +{ + SND_YES_NO_CHANGE_CHOICE = 1, + SND_MESSAGE_TYPING = 2, + SND_QUOTE_BUMP_HEAD = 3, + SND_SWITCH_WEAPON = 4, + SND_YES_NO_PROMPT = 5, + // To be continued + SND_SILLY_EXPLOSION = 25, + SND_LARGE_OBJECT_HIT_GROUND = 26, + // To be continued + SND_ENEMY_SHOOT_PROJECTILE = 39, + // To be continued + SND_BEHEMOTH_LARGE_HURT = 52, + // To be continued + SND_EXPLOSION = 72 + // To be continued +}; + +enum SoundMode +{ + SOUND_MODE_PLAY_LOOP = -1, + SOUND_MODE_STOP = 0, + SOUND_MODE_PLAY = 1 +}; + +extern BOOL audio_backend_initialised; +extern AudioBackend_Sound *lpSECONDARYBUFFER[SE_MAX]; + +BOOL InitDirectSound(void); +void EndDirectSound(void); +BOOL InitSoundObject(const char *resname, int no); +BOOL LoadSoundObject(const char *file_name, int no); +void PlaySoundObject(int no, SoundMode mode); +void ChangeSoundFrequency(int no, unsigned long rate); +void ChangeSoundVolume(int no, long volume); +void ChangeSoundPan(int no, long pan); +int MakePixToneObject(const PIXTONEPARAMETER *ptp, int ptp_num, int no); diff --git a/src/Stage.cpp b/src/Stage.cpp new file mode 100644 index 0000000..dd5d63e --- /dev/null +++ b/src/Stage.cpp @@ -0,0 +1,926 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Stage.h" + +#include +#include +#include +#include + +#include "WindowsWrapper.h" +#include "Backends/Misc.h" +#include "Back.h" +#include "Boss.h" +#include "Bullet.h" +#include "Caret.h" +#include "Draw.h" +#include "File.h" +#include "Flash.h" +#include "Frame.h" +#include "Generic.h" +#include "Main.h" +#include "Map.h" +#include "MapName.h" +#include "MyChar.h" +#include "NpChar.h" +#include "Organya.h" +#include "Profile.h" +#ifdef EXTRA_SOUND_FORMATS +#include "ExtraSoundFormats.h" +#endif +#include "TextScr.h" +#include "ValueView.h" + +#ifdef JAPANESE +#define STAGE_ENTRY(parts, map, bkType, back, npc, boss, boss_no, name_en, name_es, name_jp) {parts, map, bkType, back, npc, boss, boss_no, name_jp} +#elif defined(SPANISH) +#define STAGE_ENTRY(parts, map, bkType, back, npc, boss, boss_no, name_en, name_es, name_jp) {parts, map, bkType, back, npc, boss, boss_no, name_es} +#else +#define STAGE_ENTRY(parts, map, bkType, back, npc, boss, boss_no, name_en, name_es, name_jp) {parts, map, bkType, back, npc, boss, boss_no, name_en} +#endif + +int gStageNo; +MusicID gMusicNo; +unsigned int gOldPos; +MusicID gOldNo; +int gSoundtrack; + +unsigned int gMusicNameTimer = 0; +bool gMusicNameFlag = FALSE; + +const STAGE_TABLE gTMTDefault[] = { + STAGE_ENTRY("0", "0", BACKGROUND_TYPE_BLACK, "bk0", "Guest", "0", 0, "Null", "Null", "\x96\xB3"), /* 無 */ + STAGE_ENTRY("Pens", "Pens1", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Guest", "0", 0, "Arthur's House", "Casa de Arthur", "\x83\x41\x81\x5B\x83\x54\x81\x5B\x82\xCC\x89\xC6"), /* アーサーの家 */ + STAGE_ENTRY("Eggs", "Eggs", BACKGROUND_TYPE_MOVE_DISTANT, "bkGreen", "Eggs1", "Ravil", 0, "Egg Corridor", "Pasillo Oval", "\x83\x5E\x83\x7D\x83\x53\x89\xF1\x98\x4C"), /* タマゴ回廊 */ + STAGE_ENTRY("EggX", "EggX", BACKGROUND_TYPE_BLACK, "bk0", "Eggs1", "0", 0, "Egg No. 00", "Huevo No. 00", "\x83\x5E\x83\x7D\x83\x53\x20\x4E\x6F\x2E\x30\x30"), /* タマゴ No.00 */ + STAGE_ENTRY("EggIn", "Egg6", BACKGROUND_TYPE_BLACK, "bk0", "Eggs1", "0", 0, "Egg No. 06", "Huevo No. 06", "\x83\x5E\x83\x7D\x83\x53\x20\x4E\x6F\x2E\x30\x36"), /* タマゴ No.06 */ + STAGE_ENTRY("Store", "EggR", BACKGROUND_TYPE_BLACK, "bk0", "Eggs1", "0", 0, "Egg Observation Room", "Sala de Observación de Huevo", "\x83\x5E\x83\x7D\x83\x53\x8A\xC4\x8E\x8B\x8E\xBA"), /* タマゴ監視室 */ + STAGE_ENTRY("Weed", "Weed", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Weed", "0", 0, "Grasstown", "Villavergel", "\x83\x4E\x83\x54\x83\x80\x83\x89"), /* クサムラ */ + STAGE_ENTRY("Barr", "Santa", BACKGROUND_TYPE_BLACK, "bk0", "Weed", "0", 0, "Santa's House", "Casa de Santa", "\x83\x54\x83\x93\x83\x5E\x82\xCC\x89\xC6"), /* サンタの家 */ + STAGE_ENTRY("Barr", "Chako", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Guest", "0", 0, "Chaco's House", "Casa de Chaco", "\x83\x60\x83\x83\x83\x52\x82\xCC\x89\xC6"), /* チャコの家 */ + STAGE_ENTRY("Maze", "MazeI", BACKGROUND_TYPE_BLACK, "bk0", "Maze", "0", 0, "Labyrinth I", "Laberinto I", "\x96\xC0\x8B\x7B\x82\x68"), /* 迷宮I */ + STAGE_ENTRY("Sand", "Sand", BACKGROUND_TYPE_MOVE_DISTANT, "bkGreen", "Sand", "Omg", 1, "Sand Zone", "Zona Desértica", "\x8D\xBB\x8B\xE6"), /* 砂区 */ + STAGE_ENTRY("Mimi", "Mimi", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Guest", "0", 0, "Mimiga Village", "Pueblo Mimiga", "\x83\x7E\x83\x7E\x83\x4B\x81\x5B\x82\xCC\x91\xBA"), /* ミミガーの村 */ + STAGE_ENTRY("Cave", "Cave", BACKGROUND_TYPE_BLACK, "bk0", "Cemet", "0", 0, "First Cave", "Primera Cueva", "\x8D\xC5\x8F\x89\x82\xCC\x93\xB4\x8C\x41"), /* 最初の洞窟 */ + STAGE_ENTRY("Cave", "Start", BACKGROUND_TYPE_BLACK, "bk0", "Cemet", "0", 0, "Start Point", "Punto de Inicio", "\x83\x58\x83\x5E\x81\x5B\x83\x67\x92\x6E\x93\x5F"), /* スタート地点 */ + STAGE_ENTRY("Mimi", "Barr", BACKGROUND_TYPE_BLACK, "bk0", "Cemet", "Bllg", 0, "Shack", "Cabaña", "\x83\x6F\x83\x89\x83\x62\x83\x4E\x8F\xAC\x89\xAE"), /* バラック小屋 */ + STAGE_ENTRY("Mimi", "Pool", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Guest", "0", 0, "Reservoir", "Depósito", "\x92\x99\x90\x85\x92\x72"), /* 貯水池 */ + STAGE_ENTRY("Mimi", "Cemet", BACKGROUND_TYPE_BLACK, "bk0", "Cemet", "0", 0, "Graveyard", "Cementerio", "\x82\xCD\x82\xA9\x82\xCE"), /* はかば */ + STAGE_ENTRY("Mimi", "Plant", BACKGROUND_TYPE_MOVE_DISTANT, "bkGreen", "Plant", "0", 0, "Yamashita Farm", "Granja Yamashita", "\x8E\x52\x89\xBA\x94\x5F\x89\x80"), /* 山下農園 */ + STAGE_ENTRY("Store", "Shelt", BACKGROUND_TYPE_BLACK, "bk0", "Eggs1", "0", 0, "Shelter", "Refugio", "\x83\x56\x83\x46\x83\x8B\x83\x5E\x81\x5B"), /* シェルター */ + STAGE_ENTRY("Pens", "Comu", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Guest", "0", 0, "Assembly Hall", "Salón de la Asamblea", "\x8F\x57\x89\xEF\x8F\xEA"), /* 集会場 */ + STAGE_ENTRY("Mimi", "MiBox", BACKGROUND_TYPE_BLACK, "bk0", "0", "0", 0, "Save Point", "Punto de Guardado", "\x83\x5A\x81\x5B\x83\x75\x83\x7C\x83\x43\x83\x93\x83\x67"), /* セーブポイント */ + STAGE_ENTRY("Store", "EgEnd1", BACKGROUND_TYPE_BLACK, "bk0", "0", "0", 0, "Side Room", "Sala Contigua", "\x83\x5E\x83\x7D\x83\x53\x89\xF1\x98\x4C\x82\xCC\x8C\xC2\x8E\xBA"), /* タマゴ回廊の個室 */ + STAGE_ENTRY("Store", "Cthu", BACKGROUND_TYPE_BLACK, "bk0", "0", "0", 0, "Cthulhu's Abode", "Choza de Cthulhu", "\x83\x4E\x83\x67\x83\x44\x83\x8B\x81\x5B\x82\xCC\x8F\x5A\x8F\x88"), /* クトゥルーの住処 */ + STAGE_ENTRY("EggIn", "Egg1", BACKGROUND_TYPE_BLACK, "bk0", "Eggs1", "0", 0, "Egg No. 01", "Huevo No. 01", "\x83\x5E\x83\x7D\x83\x53\x20\x4E\x6F\x2E\x30\x31"), /* タマゴ No.01 */ + STAGE_ENTRY("Pens", "Pens2", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Guest", "0", 0, "Arthur's House", "Casa de Arthur", "\x83\x41\x81\x5B\x83\x54\x81\x5B\x82\xCC\x89\xC6"), /* アーサーの家 */ + STAGE_ENTRY("Barr", "Malco", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Weed", "Bllg", 0, "Power Room", "Sala del Generador", "\x93\x64\x8C\xB9\x8E\xBA"), /* 電源室 */ + STAGE_ENTRY("Barr", "WeedS", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "0", "0", 0, "Save Point", "Punto de Guardado", "\x83\x5A\x81\x5B\x83\x75\x83\x7C\x83\x43\x83\x93\x83\x67"), /* セーブポイント */ + STAGE_ENTRY("Store", "WeedD", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "0", "0", 0, "Execution Chamber", "Cámara de Ejecuciones", "\x8F\x88\x8C\x59\x8E\xBA"), /* 処刑室 */ + STAGE_ENTRY("Weed", "Frog", BACKGROUND_TYPE_MOVE_NEAR, "bkGreen", "Weed", "Frog", 2, "Gum", "Chicle", "\x83\x4B\x83\x80"), /* ガム */ + STAGE_ENTRY("Sand", "Curly", BACKGROUND_TYPE_BLACK, "bk0", "Sand", "Curly", 0, "Sand Zone Residence", "Residencia de Zona Desértica", "\x8D\xBB\x8B\xE6\x92\x93\x8D\xDD\x8F\x8A"), /* 砂区駐在所 */ + STAGE_ENTRY("Pens", "WeedB", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Ravil", "0", 0, "Grasstown Hut", "Choza de Villavergal", "\x83\x4E\x83\x54\x83\x80\x83\x89\x82\xCC\x8F\xAC\x89\xAE"), /* クサムラの小屋 */ + STAGE_ENTRY("River", "Stream", BACKGROUND_TYPE_AUTOSCROLL, "bkBlue", "Stream", "IronH", 5, "Main Artery", "Arteria Principal", "\x91\xE5\x93\xAE\x96\xAC"), /* 大動脈 */ + STAGE_ENTRY("Pens", "CurlyS", BACKGROUND_TYPE_BLACK, "bk0", "Sand", "Curly", 0, "Small Room", "Sala Pequeña", "\x8F\xAC\x95\x94\x89\xAE"), /* 小部屋 */ + STAGE_ENTRY("Barr", "Jenka1", BACKGROUND_TYPE_BLACK, "bk0", "Sand", "Bllg", 0, "Jenka's House", "Casa de Jenka", "\x83\x57\x83\x46\x83\x93\x83\x4A\x82\xCC\x89\xC6"), /* ジェンカの家 */ + STAGE_ENTRY("Sand", "Dark", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlack", "Sand", "0", 0, "Deserted House", "Casa Abandonada", "\x94\x70\x89\xAE"), /* 廃屋 */ + STAGE_ENTRY("Gard", "Gard", BACKGROUND_TYPE_MOVE_DISTANT, "bkGard", "Toro", "Bllg", 0, "Sand Zone Storehouse", "Almacén de Zona Desértica", "\x8D\xBB\x8B\xE6\x91\x71\x8C\xC9"), /* 砂区倉庫 */ + STAGE_ENTRY("Barr", "Jenka2", BACKGROUND_TYPE_BLACK, "bk0", "Sand", "Bllg", 0, "Jenka's House", "Casa de Jenka", "\x83\x57\x83\x46\x83\x93\x83\x4A\x82\xCC\x89\xC6"), /* ジェンカの家 */ + STAGE_ENTRY("Sand", "SandE", BACKGROUND_TYPE_MOVE_DISTANT, "bkGreen", "Sand", "Bllg", 0, "Sand Zone", "Zona Desértica", "\x8D\xBB\x8B\xE6"), /* 砂区 */ + STAGE_ENTRY("Maze", "MazeH", BACKGROUND_TYPE_BLACK, "bk0", "Maze", "0", 0, "Labyrinth H", "Laberinto H", "\x96\xC0\x8B\x7B\x82\x67"), /* 迷宮H */ + STAGE_ENTRY("Maze", "MazeW", BACKGROUND_TYPE_MOVE_DISTANT, "bkMaze", "Maze", "X", 3, "Labyrinth W", "Laberinto W", "\x96\xC0\x8B\x7B\x82\x76"), /* 迷宮W */ + STAGE_ENTRY("Maze", "MazeO", BACKGROUND_TYPE_BLACK, "bk0", "Guest", "0", 0, "Camp", "Campamento", "\x83\x4C\x83\x83\x83\x93\x83\x76"), /* キャンプ */ + STAGE_ENTRY("Maze", "MazeD", BACKGROUND_TYPE_BLACK, "bk0", "Guest", "Dark", 0, "Clinic Ruins", "Clínica en Ruinas", "\x90\x66\x97\xC3\x8F\x8A\x90\xD5"), /* 診療所跡 */ + STAGE_ENTRY("Store", "MazeA", BACKGROUND_TYPE_BLACK, "bk0", "Maze", "0", 0, "Labyrinth Shop", "Tienda del Laberinto", "\x96\xC0\x8B\x7B\x82\xCC\x93\x58"), /* 迷宮の店 */ + STAGE_ENTRY("Maze", "MazeB", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Maze", "0", 0, "Labyrinth B", "Laberinto B", "\x96\xC0\x8B\x7B\x82\x61"), /* 迷宮B */ + STAGE_ENTRY("Maze", "MazeS", BACKGROUND_TYPE_MOVE_NEAR, "bkGray", "Maze", "Bllg", 0, "Boulder Chamber", "Cámara de la Roca", "\x91\xE5\x90\xCE\x82\xCC\x8D\xC7\x82\xAE\x8F\x8A"), /* 大石の塞ぐ所 */ + STAGE_ENTRY("Maze", "MazeM", BACKGROUND_TYPE_MOVE_DISTANT, "bkRed", "Maze", "0", 0, "Labyrinth M", "Laberinto M", "\x96\xC0\x8B\x7B\x82\x6C"), /* 迷宮M */ + STAGE_ENTRY("Cave", "Drain", BACKGROUND_TYPE_WATER, "bkWater", "Cemet", "0", 0, "Dark Place", "Lugar Ocsuro", "\x88\xC3\x82\xA2\x8F\x8A"), /* 暗い所 */ + STAGE_ENTRY("Almond", "Almond", BACKGROUND_TYPE_WATER, "bkWater", "Cemet", "Almo1", 4, "Core", "Núcleo", "\x83\x52\x83\x41"), /* コア */ + STAGE_ENTRY("River", "River", BACKGROUND_TYPE_MOVE_NEAR, "bkGreen", "Weed", "0", 0, "Waterway", "Acueducto", "\x90\x85\x98\x48"), /* 水路 */ + STAGE_ENTRY("Eggs", "Eggs2", BACKGROUND_TYPE_MOVE_DISTANT, "bkGreen", "Eggs2", "0", 0, "Egg Corridor?", "¿Pasillo Oval?", "\x83\x5E\x83\x7D\x83\x53\x89\xF1\x98\x4C\x81\x48"), /* タマゴ回廊? */ + STAGE_ENTRY("Store", "Cthu2", BACKGROUND_TYPE_BLACK, "bk0", "Eggs1", "0", 0, "Cthulhu's Abode?", "¿Choza de Cthulhu?", "\x83\x4E\x83\x67\x83\x44\x83\x8B\x81\x5B\x82\xCC\x8F\x5A\x8F\x88\x81\x48"), /* クトゥルーの住処? */ + STAGE_ENTRY("Store", "EggR2", BACKGROUND_TYPE_BLACK, "bk0", "Eggs1", "TwinD", 6, "Egg Observation Room?", "¿Sala de Observación de Huevo?", "\x83\x5E\x83\x7D\x83\x53\x8A\xC4\x8E\x8B\x8E\xBA\x81\x48"), /* タマゴ監視室? */ + STAGE_ENTRY("EggX", "EggX2", BACKGROUND_TYPE_BLACK, "bk0", "Eggs1", "0", 0, "Egg No. 00", "Huevo No. 00", "\x83\x5E\x83\x7D\x83\x53\x20\x4E\x6F\x2E\x30\x30"), /* タマゴ No.00 */ + STAGE_ENTRY("Oside", "Oside", BACKGROUND_TYPE_CLOUDS_WINDY, "bkMoon", "Moon", "0", 0, "Outer Wall", "Muro Exterior", "\x8A\x4F\x95\xC7"), /* 外壁 */ + STAGE_ENTRY("Store", "EgEnd2", BACKGROUND_TYPE_BLACK, "bk0", "Eggs1", "0", 0, "Side Room", "Sala Contigua", "\x83\x5E\x83\x7D\x83\x53\x89\xF1\x98\x4C\x82\xCC\x8C\xC2\x8E\xBA"), /* タマゴ回廊の個室 */ + STAGE_ENTRY("Store", "Itoh", BACKGROUND_TYPE_MOVE_NEAR, "bkBlue", "Guest", "0", 0, "Storehouse", "Almacén", "\x91\x71\x8C\xC9"), /* 倉庫 */ + STAGE_ENTRY("Cent", "Cent", BACKGROUND_TYPE_MOVE_DISTANT, "bkGreen", "Guest", "Cent", 0, "Plantation", "Plantación", "\x91\xE5\x94\x5F\x89\x80"), /* 大農園 */ + STAGE_ENTRY("Jail", "Jail1", BACKGROUND_TYPE_BLACK, "bk0", "Guest", "Cent", 0, "Jail No. 1", "Cárcel No. 1", "\x91\xE6\x82\x50\x98\x53"), /* 第1牢 */ + STAGE_ENTRY("Jail", "Momo", BACKGROUND_TYPE_BLACK, "bk0", "Guest", "0", 0, "Hideout", "Guarida", "\x83\x4A\x83\x4E\x83\x8C\x83\x4B"), /* カクレガ */ + STAGE_ENTRY("Jail", "Lounge", BACKGROUND_TYPE_BLACK, "bk0", "Guest", "0", 0, "Rest Area", "Área de Descanso", "\x8B\x78\x8C\x65\x8F\x8A"), /* 休憩所 */ + STAGE_ENTRY("Store", "CentW", BACKGROUND_TYPE_BLACK, "bk0", "Guest", "Cent", 0, "Teleporter", "Teletransportador", "\x93\x5D\x91\x97\x8E\xBA"), /* 転送室 */ + STAGE_ENTRY("Store", "Jail2", BACKGROUND_TYPE_BLACK, "bk0", "Guest", "Cent", 0, "Jail No. 2", "Cárcel No. 2", "\x91\xE6\x82\x51\x98\x53"), /* 第2牢 */ + STAGE_ENTRY("White", "Blcny1", BACKGROUND_TYPE_CLOUDS, "bkFog", "Ravil", "Heri", 0, "Balcony", "Balcón", "\x83\x6F\x83\x8B\x83\x52\x83\x6A\x81\x5B"), /* バルコニー */ + STAGE_ENTRY("Jail", "Priso1", BACKGROUND_TYPE_BLACK, "bkGray", "Red", "0", 0, "Final Cave", "Última Cueva", "\x8D\xC5\x8C\xE3\x82\xCC\x93\xB4\x8C\x41"), /* 最後の洞窟 */ + STAGE_ENTRY("White", "Ring1", BACKGROUND_TYPE_CLOUDS, "bkFog", "Guest", "Miza", 0, "Throne Room", "Sala del Trono", "\x89\xA4\x82\xCC\x8B\xCA\x8D\xC0"), /* 王の玉座 */ + STAGE_ENTRY("White", "Ring2", BACKGROUND_TYPE_CLOUDS, "bkFog", "Guest", "Dr", 0, "The King's Table", "La Tabla del Rey", "\x89\xA4\x82\xCC\x90\x48\x91\xEC"), /* 王の食卓 */ + STAGE_ENTRY("Pens", "Prefa1", BACKGROUND_TYPE_BLACK, "bk0", "0", "0", 0, "Prefab Building", "Edificio Prefabricado", "\x83\x76\x83\x8C\x83\x6E\x83\x75"), /* プレハブ */ + STAGE_ENTRY("Jail", "Priso2", BACKGROUND_TYPE_BLACK, "bkGray", "Red", "0", 0, "Last Cave (Hidden)", "Última Cueva (Oculta)", "\x8D\xC5\x8C\xE3\x82\xCC\x93\xB4\x8C\x41\x81\x45\x97\xA0"), /* 最後の洞窟・裏 */ + STAGE_ENTRY("White", "Ring3", BACKGROUND_TYPE_BLACK, "bk0", "Miza", "Almo2", 7, "Black Space", "Espacio Negro", "\x8D\x95\x82\xA2\x8D\x4C\x8A\xD4"), /* 黒い広間 */ + STAGE_ENTRY("Pens", "Little", BACKGROUND_TYPE_MOVE_NEAR, "bkBlue", "Guest", "0", 0, "Little House", "Casa Pequeña", "\x83\x8A\x83\x67\x83\x8B\x89\xC6"), /* リトル家 */ + STAGE_ENTRY("White", "Blcny2", BACKGROUND_TYPE_CLOUDS, "bkFog", "Ravil", "Heri", 0, "Balcony", "Balcón", "\x83\x6F\x83\x8B\x83\x52\x83\x6A\x81\x5B"), /* バルコニー */ + STAGE_ENTRY("Fall", "Fall", BACKGROUND_TYPE_MOVE_DISTANT, "bkFall", "Guest", "Heri", 0, "Fall", "Caída", "\x97\x8E\x89\xBA"), /* 落下 */ + STAGE_ENTRY("White", "Kings", BACKGROUND_TYPE_BLACK, "bk0", "Kings", "0", 0, "u", "u", "\x75"), /* u */ + STAGE_ENTRY("Pens", "Pixel", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Guest", "0", 0, "Waterway Cabin", "Cabina del Acueducto", "\x90\x85\x98\x48\x82\xCC\x8F\xAC\x95\x94\x89\xAE"), /* 水路の小部屋 */ + STAGE_ENTRY("Maze", "e_Maze", BACKGROUND_TYPE_MOVE_DISTANT, "bkMaze", "Guest", "Maze", 3, "", "", ""), + STAGE_ENTRY("Barr", "e_Jenk", BACKGROUND_TYPE_BLACK, "bk0", "Sand", "Bllg", 0, "", "", ""), + STAGE_ENTRY("Barr", "e_Malc", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "Weed", "Bllg", 0, "", "", ""), + STAGE_ENTRY("Mimi", "e_Ceme", BACKGROUND_TYPE_BLACK, "bk0", "Plant", "0", 0, "", "", ""), + STAGE_ENTRY("Fall", "e_Sky", BACKGROUND_TYPE_MOVE_DISTANT, "bkFall", "Guest", "Heri", 0, "", "", ""), + STAGE_ENTRY("Pens", "Prefa2", BACKGROUND_TYPE_BLACK, "bk0", "0", "0", 0, "Prefab House", "Edificio Prefabricado", "\x83\x76\x83\x8C\x83\x6E\x83\x75"), /* プレハブ */ + STAGE_ENTRY("Hell", "Hell1", BACKGROUND_TYPE_MOVE_NEAR, "bkRed", "Hell", "0", 0, "Sacred Ground - B1", "Tierra Sagrada – B1", "\x90\xB9\x88\xE6\x92\x6E\x89\xBA\x82\x50\x8A\x4B"), /* 聖域地下1階 */ + STAGE_ENTRY("Hell", "Hell2", BACKGROUND_TYPE_MOVE_NEAR, "bkRed", "Hell", "0", 0, "Sacred Ground - B2", "Tierra Sagrada – B2", "\x90\xB9\x88\xE6\x92\x6E\x89\xBA\x82\x51\x8A\x4B"), /* 聖域地下2階 */ + STAGE_ENTRY("Hell", "Hell3", BACKGROUND_TYPE_MOVE_DISTANT, "bkRed", "Hell", "Press", 8, "Sacred Ground - B3", "Tierra Sagrada – B3", "\x90\xB9\x88\xE6\x92\x6E\x89\xBA\x82\x52\x8A\x4B"), /* 聖域地下3階 */ + STAGE_ENTRY("Cave", "Mapi", BACKGROUND_TYPE_MOVE_NEAR, "bk0", "Cemet", "0", 0, "Storage", "Almacén", "\x95\xA8\x92\x75"), /* 物置 */ + STAGE_ENTRY("Hell", "Hell4", BACKGROUND_TYPE_BLACK, "bk0", "Hell", "0", 0, "Passage?", "¿Pasaje?", "\x92\xCA\x98\x48\x81\x48"), /* 通路? */ + STAGE_ENTRY("Hell", "Hell42", BACKGROUND_TYPE_BLACK, "bk0", "Hell", "Press", 8, "Passage?", "¿Pasaje?", "\x92\xCA\x98\x48\x81\x48"), /* 通路? */ + STAGE_ENTRY("Hell", "Statue", BACKGROUND_TYPE_MOVE_DISTANT, "bkBlue", "0", "Cent", 0, "Statue Chamber", "Cámara de las Estatuas", "\x90\xCE\x91\x9C\x82\xCC\x8A\xD4"), /* 石像の間 */ + STAGE_ENTRY("Hell", "Ballo1", BACKGROUND_TYPE_MOVE_NEAR, "bkBlue", "Priest", "Ballos", 9, "Seal Chamber", "Cámara Sellada", "\x95\x95\x88\xF3\x82\xCC\x8A\xD4"), /* 封印の間 */ + STAGE_ENTRY("White", "Ostep", BACKGROUND_TYPE_CLOUDS, "bkFog", "0", "0", 0, "Corridor", "Pasillo", "\x82\xED\x82\xBD\x82\xE8\x98\x4C\x89\xBA"), /* わたり廊下 */ + STAGE_ENTRY("Labo", "e_Labo", BACKGROUND_TYPE_BLACK, "bk0", "Guest", "0", 0, "", "", ""), + STAGE_ENTRY("Cave", "Pole", BACKGROUND_TYPE_BLACK, "bk0", "Guest", "0", 0, "Hermit Gunsmith", "Artesano Ermitaño", "\x82\xCD\x82\xAE\x82\xEA\x8F\x65\x92\x62\x96\xE8"), /* はぐれ銃鍛冶 */ + STAGE_ENTRY("0", "Island", BACKGROUND_TYPE_BLACK, "bk0", "Island", "0", 0, "", "", ""), + STAGE_ENTRY("Hell", "Ballo2", BACKGROUND_TYPE_MOVE_NEAR, "bkBlue", "Priest", "Bllg", 9, "Seal Chamber", "Cámara Sellada", "\x95\x95\x88\xF3\x82\xCC\x8A\xD4"), /* 封印の間 */ + STAGE_ENTRY("White", "e_Blcn", BACKGROUND_TYPE_CLOUDS, "bkFog", "Miza", "0", 9, "", "", ""), + STAGE_ENTRY("Oside", "Clock", BACKGROUND_TYPE_CLOUDS_WINDY, "bkMoon", "Moon", "0", 0, "Clock Room", "Sala del Reloj", "\x8E\x9E\x8C\x76\x89\xAE"), /* 時計屋 */ +}; + +const STAGE_TABLE *gTMT = gTMTDefault; + +BOOL LoadStageTable(void) +{ + std::string path; + + unsigned char *file_buffer; + size_t file_size; + + // Try to load stage.tbl + path = gDataPath + "/stage.tbl"; + file_buffer = LoadFileToMemory(path.c_str(), &file_size); + + if (file_buffer != NULL) + { + const unsigned long entry_count = file_size / 0xE5; + + STAGE_TABLE *pTMT = (STAGE_TABLE*)malloc(entry_count * sizeof(STAGE_TABLE)); + + if (pTMT != NULL) + { + for (unsigned long i = 0; i < entry_count; ++i) + { + unsigned char *entry = file_buffer + i * 0xE5; + + memcpy(pTMT[i].parts, entry, 0x20); + memcpy(pTMT[i].map, entry + 0x20, 0x20); + pTMT[i].bkType = (entry[0x40 + 3] << 24) | (entry[0x40 + 2] << 16) | (entry[0x40 + 1] << 8) | entry[0x40]; + memcpy(pTMT[i].back, entry + 0x44, 0x20); + memcpy(pTMT[i].npc, entry + 0x64, 0x20); + memcpy(pTMT[i].boss, entry + 0x84, 0x20); + pTMT[i].boss_no = entry[0xA4]; +#ifdef JAPANESE + memcpy(pTMT[i].name, entry + 0xA5, 0x20); +#else + memcpy(pTMT[i].name, entry + 0xC5, 0x20); +#endif + } + + gTMT = pTMT; + free(file_buffer); + return TRUE; + } + + free(file_buffer); + } + + // Try to load mrmap.bin + path = gDataPath + "/mrmap.bin"; + file_buffer = LoadFileToMemory(path.c_str(), &file_size); + + if (file_buffer != NULL) + { + const unsigned long entry_count = file_buffer[0] | (file_buffer[1] << 8) | (file_buffer[2] << 16) | (file_buffer[3] << 24); + + STAGE_TABLE *pTMT = (STAGE_TABLE*)malloc(entry_count * sizeof(STAGE_TABLE)); + + if (pTMT != NULL) + { + for (unsigned long i = 0; i < entry_count; ++i) + { + // For compatibility with Booster's Lab, we store our stage table in "MOD_MR" format. + // This way, BL will load the sprites as PNG files instead of BMP. + unsigned char *entry = file_buffer + 4 + i * 0x74; + + memcpy(pTMT[i].parts, entry, 0x10); + memcpy(pTMT[i].map, entry + 0x10, 0x10); + pTMT[i].bkType = entry[0x20]; + memcpy(pTMT[i].back, entry + 0x21, 0x10); + memcpy(pTMT[i].npc, entry + 0x31, 0x10); + memcpy(pTMT[i].boss, entry + 0x41, 0x10); + pTMT[i].boss_no = entry[0x51]; + memcpy(pTMT[i].name, entry + 0x52, 0x22); + } + + gTMT = pTMT; + free(file_buffer); + return TRUE; + } + + free(file_buffer); + } + + printf("Failed to load stage.tbl/mrmap.bin\n"); + return FALSE; +} + +BOOL TransferStage(int no, int w, int x, int y) +{ + std::string path; + std::string path_dir; + BOOL bError; + + // Move character + SetMyCharPosition(x * 0x10 * 0x200, y * 0x10 * 0x200); + + bError = FALSE; + + // Get path + path_dir = "Stage"; + + // Load tileset + path = path_dir + "/Prt" + gTMT[no].parts; + if (!ReloadBitmap_File(path.c_str(), SURFACE_ID_LEVEL_TILESET, true, true)){ + Backend_ShowMessageBox("ERROR", "Failed to load tileset 1"); + bError = TRUE; + } + + + if (!ReloadBitmap_File(path.c_str(), SURFACE_ID_LEVEL_TILESET_2, true, true)){ + Backend_ShowMessageBox("ERROR", "Failed to load tileset 2"); + bError = TRUE; + } + + path = path_dir + '/' + gTMT[no].parts + ".pxa"; + if (!LoadAttributeData(path.c_str())){ + Backend_ShowMessageBox("ERROR", "Failed to load Attribute Data"); + bError = TRUE; + } + + + // Load tilemap + path = path_dir + '/' + gTMT[no].map + ".pxm"; + if (!LoadMapData2(path.c_str())){ + Backend_ShowMessageBox("ERROR", "Failed to load Map data"); + bError = TRUE; + } + + // Load NPCs + path = path_dir + '/' + gTMT[no].map + ".pxe"; + if (!LoadEvent(path.c_str())){ + Backend_ShowMessageBox("ERROR", "Failed to load Event Data"); + bError = TRUE; + } + + // Load script + path = path_dir + '/' + gTMT[no].map + ".tsc"; + if (!LoadTextScript_Stage(path.c_str())){ + Backend_ShowMessageBox("ERROR", "Failed to load Scripts"); + bError = TRUE; + } + + // Load background + path = gTMT[no].back; + if (!InitBack(path.c_str(), gTMT[no].bkType)){ + Backend_ShowMessageBox("ERROR", "Failed to load Background"); + bError = TRUE; + } + + // Get path + path_dir = "Npc"; + + // Load NPC sprite sheets + path = path_dir + "/Npc" + gTMT[no].npc; + if (!ReloadBitmap_File(path.c_str(), SURFACE_ID_LEVEL_SPRITESET_1, false, false)){ + Backend_ShowMessageBox("ERROR", "Failed to load Level 1"); + bError = TRUE; + } + + path = path_dir + "/Npc" + gTMT[no].boss; + if (!ReloadBitmap_File(path.c_str(), SURFACE_ID_LEVEL_SPRITESET_2, false, false)){ + bError = TRUE; + Backend_ShowMessageBox("ERROR", "Failed to load Level 1"); + } + + if (bError) + return FALSE; + + // Load map name + ReadyMapName(gTMT[no].name); + + StartTextScript(w); + SetFrameMyChar(); + ClearBullet(); + InitCaret(); + ClearValueView(); + ResetQuake(); + InitBossChar(gTMT[no].boss_no); + ResetFlash(); + gStageNo = no; + + return TRUE; +} + +bool Reload_CurrentStageTiles(void){ + std::string path; + std::string path_dir; + BOOL bError; + + const int no = gStageNo; + + // Get path + path_dir = "Stage"; + + // reload tileset + path = path_dir + "/Prt" + gTMT[no].parts; + if (!ReloadBitmap_File(path.c_str(), SURFACE_ID_LEVEL_TILESET, true, true)) + bError = TRUE; + + if (!ReloadBitmap_File(path.c_str(), SURFACE_ID_LEVEL_TILESET_2, true, true)) + bError = TRUE; + + // Load background + path = gTMT[no].back; + if (!InitBack(path.c_str(), gTMT[no].bkType)) + bError = TRUE; + + // Get path + path_dir = "Npc"; + + // Load NPC sprite sheets + path = path_dir + "/Npc" + gTMT[no].npc; + if (!ReloadBitmap_File(path.c_str(), SURFACE_ID_LEVEL_SPRITESET_1, false, false)) + bError = TRUE; + + path = path_dir + "/Npc" + gTMT[no].boss; + if (!ReloadBitmap_File(path.c_str(), SURFACE_ID_LEVEL_SPRITESET_2, false, false)) + bError = TRUE; + + return bError; +} + +BOOL Reload_MenuBackground(void){ + std::string path; + bool bError = FALSE; + int background_id = 53; + + if (IsProfile()){ + const int save_room = GetProfileStage(NULL); + + //replace if saved in prefab + if(save_room == 66 || save_room == 79){ + background_id = 62; + } + } + + // Load background + path = gTMT[background_id].back; + if (!InitBack(path.c_str(), gTMT[background_id].bkType)) + bError = TRUE; + + return bError; +} + +//Music + +enum +{ + MUSIC_TYPE_ORGANYA, + MUSIC_TYPE_OTHER +}; + +typedef struct MusicListEntry +{ + const char *intro_file_path; + const char *loop_file_path; + int type; + bool loop; // Only applicable to non-Organya songs +} MusicListEntry; + +static const MusicListEntry music_table_organya[42] = { + {"Resource/ORG/XXXX.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Wanpaku.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Anzen.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Gameover.org", NULL, MUSIC_TYPE_ORGANYA, false}, + {"Resource/ORG/Gravity.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Weed.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/MDown2.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/FireEye.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Vivi.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Mura.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Fanfale1.org", NULL, MUSIC_TYPE_ORGANYA, false}, + {"Resource/ORG/Ginsuke.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Cemetery.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Plant.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Kodou.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Fanfale3.org", NULL, MUSIC_TYPE_ORGANYA, false}, + {"Resource/ORG/Fanfale2.org", NULL, MUSIC_TYPE_ORGANYA, false}, + {"Resource/ORG/Dr.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Escape.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Jenka.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Maze.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Access.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/ironH.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Grand.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Curly.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Oside.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Requiem.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Wanpak2.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/quiet.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/LastCave.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Balcony.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/LastBtl.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/LastBtl3.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Ending.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Zonbie.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/BreakDown.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Hell.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Jenka2.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Marine.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Ballos.org", NULL, MUSIC_TYPE_ORGANYA, true}, + {"Resource/ORG/Toroko.org", NULL, MUSIC_TYPE_ORGANYA, false}, + {"Resource/ORG/White.org", NULL, MUSIC_TYPE_ORGANYA, true} +}; + +static const MusicListEntry music_table_new[42] = { + {NULL, NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/wanpaku.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/anzen.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/gameover.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/New/gravity.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/weed.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/mdown2.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/fireeye.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/vivi.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/mura.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/fanfale1.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/New/ginsuke.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/cemetery.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/plant.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/kodou.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/fanfale3.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/New/fanfale2.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/New/dr.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/escape.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/jenka.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/maze.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/access.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/ironh.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/grand.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/curly.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/oside.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/requiem.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/wanpak2.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/quiet.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/lastcave.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/balcony.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/lastbtl.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/lastbt3.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/ending.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/zonbie.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/bdown.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/hell.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/jenka2.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/marine.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/ballos.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/New/toroko.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/New/white.ogg", NULL, MUSIC_TYPE_OTHER, true} +}; + +static const MusicListEntry music_table_remastered[42] = { + {NULL, NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/wanpaku_intro.ogg", "Soundtracks/Remastered/wanpaku_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/anzen_intro.ogg", "Soundtracks/Remastered/anzen_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/gameover_intro.ogg", "Soundtracks/Remastered/gameover_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Remastered/gravity_intro.ogg", "Soundtracks/Remastered/gravity_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/weed_intro.ogg", "Soundtracks/Remastered/weed_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/mdown2_intro.ogg", "Soundtracks/Remastered/mdown2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/fireeye_intro.ogg", "Soundtracks/Remastered/fireeye_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/vivi_intro.ogg", "Soundtracks/Remastered/vivi_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/mura_intro.ogg", "Soundtracks/Remastered/mura_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/fanfale1_intro.ogg", "Soundtracks/Remastered/fanfale1_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Remastered/ginsuke_intro.ogg", "Soundtracks/Remastered/ginsuke_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/cemetery_intro.ogg", "Soundtracks/Remastered/cemetery_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/plant_intro.ogg", "Soundtracks/Remastered/plant_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/kodou_intro.ogg", "Soundtracks/Remastered/kodou_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/fanfale3_intro.ogg", "Soundtracks/Remastered/fanfale3_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Remastered/fanfale2_intro.ogg", "Soundtracks/Remastered/fanfale2_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Remastered/dr_intro.ogg", "Soundtracks/Remastered/dr_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/escape_intro.ogg", "Soundtracks/Remastered/escape_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/jenka_intro.ogg", "Soundtracks/Remastered/jenka_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/maze_intro.ogg", "Soundtracks/Remastered/maze_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/access_intro.ogg", "Soundtracks/Remastered/access_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/ironh_intro.ogg", "Soundtracks/Remastered/ironh_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/grand_intro.ogg", "Soundtracks/Remastered/grand_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/curly_intro.ogg", "Soundtracks/Remastered/curly_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/oside_intro.ogg", "Soundtracks/Remastered/oside_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/requiem_intro.ogg", "Soundtracks/Remastered/requiem_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/wanpak2_intro.ogg", "Soundtracks/Remastered/wanpak2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/quiet_intro.ogg", "Soundtracks/Remastered/quiet_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/lastcave_intro.ogg", "Soundtracks/Remastered/lastcave_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/balcony_intro.ogg", "Soundtracks/Remastered/balcony_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/lastbtl.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/lastbt3_intro.ogg", "Soundtracks/Remastered/lastbt3_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/ending_intro.ogg", "Soundtracks/Remastered/ending_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/zonbie_intro.ogg", "Soundtracks/Remastered/zonbie_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/bdown_intro.ogg", "Soundtracks/Remastered/bdown_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/hell_intro.ogg", "Soundtracks/Remastered/hell_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/jenka2_intro.ogg", "Soundtracks/Remastered/jenka2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/marine_intro.ogg", "Soundtracks/Remastered/marine_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/ballos_intro.ogg", "Soundtracks/Remastered/ballos_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Remastered/toroko_intro.ogg", "Soundtracks/Remastered/toroko_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Remastered/white_intro.ogg", "Soundtracks/Remastered/white_loop.ogg", MUSIC_TYPE_OTHER, true} +}; + +static const MusicListEntry music_table_famitracks[42] = { + {NULL, NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/wanpaku_intro.ogg", "Soundtracks/Famitracks/wanpaku_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/anzen_intro.ogg", "Soundtracks/Famitracks/anzen_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/gameover.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Famitracks/gravity_intro.ogg", "Soundtracks/Famitracks/gravity_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/weed_intro.ogg", "Soundtracks/Famitracks/weed_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/mdown2.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/fireeye_intro.ogg", "Soundtracks/Famitracks/fireeye_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/vivi_intro.ogg", "Soundtracks/Famitracks/vivi_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/mura.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/fanfale1.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Famitracks/ginsuke.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/cemetery_intro.ogg", "Soundtracks/Famitracks/cemetery_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/plant_intro.ogg", "Soundtracks/Famitracks/plant_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/kodou_intro.ogg", "Soundtracks/Famitracks/kodou_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/fanfale3.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Famitracks/fanfale2.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Famitracks/dr.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/escape.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/jenka_intro.ogg", "Soundtracks/Famitracks/jenka_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/maze.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/access.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/ironh_intro.ogg", "Soundtracks/Famitracks/ironh_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/grand_intro.ogg", "Soundtracks/Famitracks/grand_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/curly_intro.ogg", "Soundtracks/Famitracks/curly_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/oside_intro.ogg", "Soundtracks/Famitracks/oside_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/requiem_intro.ogg", "Soundtracks/Famitracks/requiem_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/wanpak2_intro.ogg", "Soundtracks/Famitracks/wanpak2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/quiet_intro.ogg", "Soundtracks/Famitracks/quiet_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/lastcave_intro.ogg", "Soundtracks/Famitracks/lastcave_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/balcony_intro.ogg", "Soundtracks/Famitracks/balcony_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/lastbtl.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/lastbt3_intro.ogg", "Soundtracks/Famitracks/lastbt3_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/ending_intro.ogg", "Soundtracks/Famitracks/ending_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/zonbie_intro.ogg", "Soundtracks/Famitracks/zonbie_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/bdown_intro.ogg", "Soundtracks/Famitracks/bdown_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/hell_intro.ogg", "Soundtracks/Famitracks/hell_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/jenka2.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/marine.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/ballos_intro.ogg", "Soundtracks/Famitracks/ballos_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Famitracks/toroko.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Famitracks/white_intro.ogg", "Soundtracks/Famitracks/white_loop.ogg", MUSIC_TYPE_OTHER, true} +}; + +static const MusicListEntry music_table_ridiculon[42] = { + {NULL, NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/wanpaku.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/anzen.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/gameover.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Ridiculon/gravity.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/weed.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/mdown2.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/fireeye.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/vivi.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/mura.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/fanfale1.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Ridiculon/ginsuke.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/cemetery.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/plant.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/kodou.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/fanfale3.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Ridiculon/fanfale2.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Ridiculon/dr.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/escape.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/jenka.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/maze.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/access.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/ironh.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/grand.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/curly.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/oside.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/requiem.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/wanpak2.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/quiet.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/lastcave.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/balcony.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/lastbtl.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/lastbt3.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/ending.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/zonbie.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/bdown.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/hell.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/jenka2.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/marine.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/ballos.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Ridiculon/toroko.ogg", NULL, MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Ridiculon/white.ogg", NULL, MUSIC_TYPE_OTHER, true} +}; + +static const MusicListEntry music_table_snes[42] = { + {NULL, NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/wanpaku_intro.ogg", "Soundtracks/SNES/wanpaku_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/anzen_intro.ogg", "Soundtracks/SNES/anzen_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/gameover_intro.ogg", "Soundtracks/SNES/gameover_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/SNES/gravity_intro.ogg", "Soundtracks/SNES/gravity_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/weed_intro.ogg", "Soundtracks/SNES/weed_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/mdown2_intro.ogg", "Soundtracks/SNES/mdown2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/fireeye_intro.ogg", "Soundtracks/SNES/fireeye_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/vivi_intro.ogg", "Soundtracks/SNES/vivi_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/mura_intro.ogg", "Soundtracks/SNES/mura_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/fanfale1_intro.ogg", "Soundtracks/SNES/fanfale1_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/SNES/ginsuke_intro.ogg", "Soundtracks/SNES/ginsuke_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/cemetery_intro.ogg", "Soundtracks/SNES/cemetery_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/plant_intro.ogg", "Soundtracks/SNES/plant_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/kodou_intro.ogg", "Soundtracks/SNES/kodou_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/fanfale3_intro.ogg", "Soundtracks/SNES/fanfale3_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/SNES/fanfale2_intro.ogg", "Soundtracks/SNES/fanfale2_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/SNES/dr_intro.ogg", "Soundtracks/SNES/dr_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/escape_intro.ogg", "Soundtracks/SNES/escape_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/jenka_intro.ogg", "Soundtracks/SNES/jenka_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/maze_intro.ogg", "Soundtracks/SNES/maze_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/access_intro.ogg", "Soundtracks/SNES/access_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/ironh_intro.ogg", "Soundtracks/SNES/ironh_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/grand_intro.ogg", "Soundtracks/SNES/grand_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/curly_intro.ogg", "Soundtracks/SNES/curly_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/oside_intro.ogg", "Soundtracks/SNES/oside_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/requiem_intro.ogg", "Soundtracks/SNES/requiem_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/wanpak2_intro.ogg", "Soundtracks/SNES/wanpak2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/quiet_intro.ogg", "Soundtracks/SNES/quiet_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/lastcave_intro.ogg", "Soundtracks/SNES/lastcave_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/balcony_intro.ogg", "Soundtracks/SNES/balcony_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/lastbtl.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/lastbt3_intro.ogg", "Soundtracks/SNES/lastbt3_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/ending_intro.ogg", "Soundtracks/SNES/ending_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/zonbie_intro.ogg", "Soundtracks/SNES/zonbie_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/bdown_intro.ogg", "Soundtracks/SNES/bdown_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/hell_intro.ogg", "Soundtracks/SNES/hell_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/jenka2_intro.ogg", "Soundtracks/SNES/jenka2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/marine_intro.ogg", "Soundtracks/SNES/marine_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/ballos_intro.ogg", "Soundtracks/SNES/ballos_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/SNES/toroko_intro.ogg", "Soundtracks/SNES/toroko_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/SNES/white_intro.ogg", "Soundtracks/SNES/white_loop.ogg", MUSIC_TYPE_OTHER, true} +}; + +static const MusicListEntry music_table_arranged[42] = { + {NULL, NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/wanpaku_intro.ogg", "Soundtracks/Arranged/wanpaku_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/anzen_intro.ogg", "Soundtracks/Arranged/anzen_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/gameover_intro.ogg", "Soundtracks/Arranged/gameover_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Arranged/gravity_intro.ogg", "Soundtracks/Arranged/gravity_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/weed_intro.ogg", "Soundtracks/Arranged/weed_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/mdown2.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/fireeye_intro.ogg", "Soundtracks/Arranged/fireeye_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/vivi_intro.ogg", "Soundtracks/Arranged/vivi_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/mura_intro.ogg", "Soundtracks/Arranged/mura_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/fanfale1_intro.ogg", "Soundtracks/Arranged/fanfale1_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Arranged/ginsuke_intro.ogg", "Soundtracks/Arranged/ginsuke_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/cemetery_intro.ogg", "Soundtracks/Arranged/cemetery_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/plant_intro.ogg", "Soundtracks/Arranged/plant_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/kodou_intro.ogg", "Soundtracks/Arranged/kodou_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/fanfale3_intro.ogg", "Soundtracks/Arranged/fanfale3_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Arranged/fanfale2_intro.ogg", "Soundtracks/Arranged/fanfale2_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Arranged/dr_intro.ogg", "Soundtracks/Arranged/dr_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/escape_intro.ogg", "Soundtracks/Arranged/escape_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/jenka_intro.ogg", "Soundtracks/Arranged/jenka_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/maze_intro.ogg", "Soundtracks/Arranged/maze_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/access_intro.ogg", "Soundtracks/Arranged/access_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/ironh_intro.ogg", "Soundtracks/Arranged/ironh_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/grand_intro.ogg", "Soundtracks/Arranged/grand_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/curly_intro.ogg", "Soundtracks/Arranged/curly_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/oside_intro.ogg", "Soundtracks/Arranged/oside_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/requiem_intro.ogg", "Soundtracks/Arranged/requiem_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/wanpak2_intro.ogg", "Soundtracks/Arranged/wanpak2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/quiet_intro.ogg", "Soundtracks/Arranged/quiet_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/lastcave_intro.ogg", "Soundtracks/Arranged/lastcave_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/balcony_intro.ogg", "Soundtracks/Arranged/balcony_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/lastbtl.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/lastbt3_intro.ogg", "Soundtracks/Arranged/lastbt3_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/ending_intro.ogg", "Soundtracks/Arranged/ending_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/zonbie_intro.ogg", "Soundtracks/Arranged/zonbie_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/bdown_intro.ogg", "Soundtracks/Arranged/bdown_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/hell_intro.ogg", "Soundtracks/Arranged/hell_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/jenka2_intro.ogg", "Soundtracks/Arranged/jenka2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/marine_intro.ogg", "Soundtracks/Arranged/marine_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/ballos_intro.ogg", "Soundtracks/Arranged/ballos_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/Arranged/toroko_intro.ogg", "Soundtracks/Arranged/toroko_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/Arranged/white_intro.ogg", "Soundtracks/Arranged/white_loop.ogg", MUSIC_TYPE_OTHER, true} +}; + +static const MusicListEntry music_table_nes[42] = { + {NULL, NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/wanpaku_intro.ogg", "Soundtracks/NES/wanpaku_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/anzen_intro.ogg", "Soundtracks/NES/anzen_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/gameover_intro.ogg", "Soundtracks/NES/gameover_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/NES/gravity_intro.ogg", "Soundtracks/NES/gravity_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/weed_intro.ogg", "Soundtracks/NES/weed_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/mdown2_intro.ogg", "Soundtracks/NES/mdown2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/fireeye_intro.ogg", "Soundtracks/NES/fireeye_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/vivi_intro.ogg", "Soundtracks/NES/vivi_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/mura_intro.ogg", "Soundtracks/NES/mura_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/fanfale1_intro.ogg", "Soundtracks/NES/fanfale1_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/NES/ginsuke_intro.ogg", "Soundtracks/NES/ginsuke_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/cemetery_intro.ogg", "Soundtracks/NES/cemetery_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/plant_intro.ogg", "Soundtracks/NES/plant_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/kodou_intro.ogg", "Soundtracks/NES/kodou_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/fanfale3_intro.ogg", "Soundtracks/NES/fanfale3_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/NES/fanfale2_intro.ogg", "Soundtracks/NES/fanfale2_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/NES/dr_intro.ogg", "Soundtracks/NES/dr_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/escape_intro.ogg", "Soundtracks/NES/escape_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/jenka_intro.ogg", "Soundtracks/NES/jenka_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/maze_intro.ogg", "Soundtracks/NES/maze_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/access_intro.ogg", "Soundtracks/NES/access_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/ironh_intro.ogg", "Soundtracks/NES/ironh_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/grand_intro.ogg", "Soundtracks/NES/grand_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/curly_intro.ogg", "Soundtracks/NES/curly_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/oside_intro.ogg", "Soundtracks/NES/oside_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/requiem_intro.ogg", "Soundtracks/NES/requiem_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/wanpak2_intro.ogg", "Soundtracks/NES/wanpak2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/quiet_intro.ogg", "Soundtracks/NES/quiet_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/lastcave_intro.ogg", "Soundtracks/NES/lastcave_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/balcony_intro.ogg", "Soundtracks/NES/balcony_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/lastbtl.ogg", NULL, MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/lastbt3_intro.ogg", "Soundtracks/NES/lastbt3_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/ending_intro.ogg", "Soundtracks/NES/ending_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/zonbie_intro.ogg", "Soundtracks/NES/zonbie_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/bdown_intro.ogg", "Soundtracks/NES/bdown_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/hell_intro.ogg", "Soundtracks/NES/hell_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/jenka2_intro.ogg", "Soundtracks/NES/jenka2_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/marine_intro.ogg", "Soundtracks/NES/marine_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/ballos_intro.ogg", "Soundtracks/NES/ballos_loop.ogg", MUSIC_TYPE_OTHER, true}, + {"Soundtracks/NES/toroko_intro.ogg", "Soundtracks/NES/toroko_loop.ogg", MUSIC_TYPE_OTHER, false}, + {"Soundtracks/NES/white_intro.ogg", "Soundtracks/NES/white_loop.ogg", MUSIC_TYPE_OTHER, true} +}; + +static const struct +{ + const MusicListEntry *music_table; + unsigned short volume; // Logarithmic - 0 is silent, 0x80 is half-volume, 0x100 is full-volume (this only affects non-Organya music) + const char* composer; +} soundtracks[8] = { + {music_table_organya, 0x100, "Daisuke Amaya"}, + {music_table_nes, 0xD0, "DynamiteManEXE"}, + {music_table_snes, 0x100, "vince94"}, + {music_table_arranged, 0xF0, "DM DOKURO"}, + {music_table_new, 0xC0, "Yann van de Cruyssen"}, + {music_table_remastered, 0xC0, "DannyB"}, + {music_table_famitracks, 0xE0, "RushJet1"}, + {music_table_ridiculon, 0xE0, "Ridiculon"}, +}; + +void ChangeMusic(MusicID no) +{ + if (no != MUS_SILENCE && no == gMusicNo) + return; + + // Stop and keep track of old song + gOldPos = GetOrganyaPosition(); + gOldNo = gMusicNo; + StopOrganyaMusic(); +#ifdef EXTRA_SOUND_FORMATS + ExtraSound_PauseMusic(); +#endif + + const MusicListEntry *music_table = soundtracks[gSoundtrack].music_table; + + std::string intro_file_path; + if (music_table[no].intro_file_path != NULL) + intro_file_path = gDataPath + '/' + music_table[no].intro_file_path; + + std::string loop_file_path; + if (music_table[no].loop_file_path != NULL) + loop_file_path = gDataPath + '/' + music_table[no].loop_file_path; + + switch (music_table[no].type) + { + case MUSIC_TYPE_ORGANYA: + // Load .org + LoadOrganya(intro_file_path.c_str()); + + // Reset position, volume, and then play the song + ChangeOrganyaVolume(100); + SetOrganyaPosition(0); + PlayOrganyaMusic(); + +#ifdef EXTRA_SOUND_FORMATS + ExtraSound_LoadMusic(NULL, NULL, false); // Play a null song so any current song gets pushed back to the backup slot +#endif + break; + +#ifdef EXTRA_SOUND_FORMATS + case MUSIC_TYPE_OTHER: + ExtraSound_LoadMusic(music_table[no].intro_file_path != NULL ? intro_file_path.c_str() : NULL, music_table[no].loop_file_path != NULL ? loop_file_path.c_str() : NULL, music_table[no].loop); + ExtraSound_SetMusicVolume(soundtracks[gSoundtrack].volume); + ExtraSound_UnpauseMusic(); + + // Play a null Organya song so focussing and refocussing the window doesn't cause the old Organya song to start playing again + intro_file_path = gDataPath + '/' + music_table_organya[0].intro_file_path; + LoadOrganya(intro_file_path.c_str()); + + ChangeOrganyaVolume(100); + SetOrganyaPosition(0); + PlayOrganyaMusic(); + break; +#endif + } + + gMusicNo = no; + gMusicNameFlag = TRUE; + gMusicNameTimer = 0; +} + +void ReCallMusic(void) +{ + std::string path; + + // Stop old song + StopOrganyaMusic(); +#ifdef EXTRA_SOUND_FORMATS + ExtraSound_PauseMusic(); +#endif + + const MusicListEntry *music_table = soundtracks[gSoundtrack].music_table; + + switch (music_table[gOldNo].type) + { + case MUSIC_TYPE_ORGANYA: + // Load .org that was playing before + path = gDataPath + '/' + music_table[gOldNo].intro_file_path; + LoadOrganya(path.c_str()); + + // Reset position, volume, and then play the song + SetOrganyaPosition(gOldPos); + ChangeOrganyaVolume(100); + PlayOrganyaMusic(); + break; + +#ifdef EXTRA_SOUND_FORMATS + case MUSIC_TYPE_OTHER: + ExtraSound_LoadPreviousMusic(); + ExtraSound_UnpauseMusic(); + break; +#endif + } + + gMusicNo = gOldNo; +} + +BOOL CheckSoundtrackExists(int soundtrack) +{ + if (soundtrack >= sizeof(soundtracks) / sizeof(soundtracks[0])) + return FALSE; + + // Just check if the first file exists + std::string path = gDataPath + '/' + soundtracks[soundtrack].music_table[1].intro_file_path; + + FILE *file = fopen(path.c_str(), "rb"); + + if (file == NULL) + return FALSE; + + fclose(file); + return TRUE; +} + +void PutMusicName(void){ + if(!gMusicNameFlag){ + return; + } + + RECT rc_note = {228, 126, 244, 142}; + RECT rc_background = {0, 0, 180, 18}; + + char music_name[70]; + sprintf(music_name, "%s - %s", music_name_table[gMusicNo], soundtracks[gSoundtrack].composer); + + PutBitmap3(&grcGame, PixelToScreenCoord(0), PixelToScreenCoord(WINDOW_HEIGHT - 21), &rc_background, SURFACE_ID_MENU_OVERLAY); + + PutText(24, WINDOW_HEIGHT - 20, music_name, RGB(0xff,0xff,0xfe)); + PutBitmap3(&grcGame, PixelToScreenCoord(4), PixelToScreenCoord(WINDOW_HEIGHT - 20), &rc_note, SURFACE_ID_TEXT_BOX); + + gMusicNameTimer++; + + if(gMusicNameTimer > 150){ + gMusicNameFlag = FALSE; + gMusicNameTimer = 0; + } +} diff --git a/src/Stage.h b/src/Stage.h new file mode 100644 index 0000000..80c41bd --- /dev/null +++ b/src/Stage.h @@ -0,0 +1,128 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +typedef enum MusicID +{ + MUS_SILENCE = 0x0, + MUS_MISCHIEVOUS_ROBOT = 0x1, + MUS_SAFETY = 0x2, + MUS_GAME_OVER = 0x3, + MUS_GRAVITY = 0x4, + MUS_ON_TO_GRASSTOWN = 0x5, + MUS_MELTDOWN2 = 0x6, + MUS_EYES_OF_FLAME = 0x7, + MUS_GESTATION = 0x8, + MUS_MIMIGA_TOWN = 0x9, + MUS_GOT_ITEM = 0xA, + MUS_BALROGS_THEME = 0xB, + MUS_CEMETERY = 0xC, + MUS_PLANT = 0xD, + MUS_PULSE = 0xE, + MUS_VICTORY = 0xF, + MUS_GET_HEART_TANK = 0x10, + MUS_TYRANT = 0x11, + MUS_RUN = 0x12, + MUS_JENKA1 = 0x13, + MUS_LABYRINTH_FIGHT = 0x14, + MUS_ACCESS = 0x15, + MUS_OPPRESSION = 0x16, + MUS_GEOTHERMAL = 0x17, + MUS_CAVE_STORY = 0x18, + MUS_MOONSONG = 0x19, + MUS_HEROS_END = 0x1A, + MUS_SCORCHING_BACK = 0x1B, + MUS_QUIET = 0x1C, + MUS_LAST_CAVE = 0x1D, + MUS_BALCONY = 0x1E, + MUS_CHARGE = 0x1F, + MUS_LAST_BATTLE = 0x20, + MUS_THE_WAY_BACK_HOME = 0x21, + MUS_ZOMBIE = 0x22, + MUS_BREAK_DOWN = 0x23, + MUS_RUNNING_HELL = 0x24, + MUS_JENKA2 = 0x25, + MUS_LIVING_WATERWAY = 0x26, + MUS_SEAL_CHAMBER = 0x27, + MUS_TOROKOS_THEME = 0x28, + MUS_WHITE = 0x29 +} MusicID; + +typedef struct STAGE_TABLE +{ + char parts[0x20]; + char map[0x20]; + int bkType; + char back[0x20]; + char npc[0x20]; + char boss[0x20]; + signed char boss_no; + char name[0x22]; +} STAGE_TABLE; + +extern int gStageNo; +extern MusicID gMusicNo; +extern unsigned int gOldPos; +extern MusicID gOldNo; +extern int gSoundtrack; + +extern const STAGE_TABLE *gTMT; + +BOOL LoadStageTable(); +BOOL TransferStage(int no, int w, int x, int y); +void ChangeMusic(MusicID no); +void ReCallMusic(void); +BOOL CheckSoundtrackExists(int soundtrack); +bool Reload_CurrentStageTiles(void); +BOOL Reload_MenuBackground(void); +void PutMusicName(void); + +static const char* music_name_table[40] = { + "[Silence]", + "Mischevious Robot", + "Safety", + "Game Over", + "Gravity", + "On To Grasstown", + "Meltdown 2", + "Eyes of Flame", + "Gestation", + "Mimiga Town", + "Got Item!", + "Balrog's Theme", + "Cemetery", + "Plant", + "Pulse", + "Victory!", + "Got Heart Tank!", + "Tyrant", + "Run!", + "Jenka", + "Labyrinth Fight", + "Access", + "Oppression", + "Geothermal", + "Cave Story", + "Moonsong", + "Hero's End", + "Scorching Back", + "Quiet", + "Last Cave", + "Balcony", + "Charge", + "Last Battle", + "The Way Back Home", + "Zombie", + "Break Down", + "Running Hell", + "Jenka 2", + "Living Waterway", + "Seal Chamber" +}; \ No newline at end of file diff --git a/src/Star.cpp b/src/Star.cpp new file mode 100644 index 0000000..ea032db --- /dev/null +++ b/src/Star.cpp @@ -0,0 +1,146 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "Star.h" + +#include + +#include "WindowsWrapper.h" + +#include "Bullet.h" +#include "Draw.h" +#include "Game.h" +#include "MyChar.h" + +static struct +{ + int cond; + int code; + int direct; + int x; + int y; + int xm; + int ym; + int act_no; + int act_wait; + int ani_no; + int ani_wait; + int view_left; + int view_top; + RECT rect; +} star[3]; + +void InitStar(void) +{ + // Clear stars + memset(star, 0, sizeof(star)); + + // Position + star[0].x = gMC.x; + star[0].y = gMC.y; + + star[1].x = gMC.x; + star[1].y = gMC.y; + + star[2].x = gMC.x; + star[2].y = gMC.y; + + // Speed + star[0].xm = 0x400; + star[0].ym = -0x200; + + star[1].xm = -0x200; + star[1].ym = 0x400; + + star[2].xm = 0x200; + star[2].ym = 0x200; +} + +void ActStar(void) +{ + int i; + static int a; + + ++a; + a %= 3; + + for (i = 0; i < 3; ++i) + { + if (i != 0) + { + if (star[i - 1].x < star[i].x) + star[i].xm -= 0x80; + else + star[i].xm += 0x80; + + if (star[i - 1].y < star[i].y) + star[i].ym -= 0xAA; + else + star[i].ym += 0xAA; + } + else + { + if (gMC.x < star[i].x) + star[i].xm -= 0x80; + else + star[i].xm += 0x80; + + if (gMC.y < star[i].y) + star[i].ym -= 0xAA; + else + star[i].ym += 0xAA; + } + + if (star[i].xm > 0xA00) + star[i].xm = 0xA00; + if (star[i].xm < -0xA00) + star[i].xm = -0xA00; + + if (star[i].ym > 0xA00) + star[i].ym = 0xA00; + if (star[i].ym < -0xA00) + star[i].ym = -0xA00; + + // Duplicate of the past 8 lines of code + if (star[i].xm > 0xA00) + star[i].xm = 0xA00; + if (star[i].xm < -0xA00) + star[i].xm = -0xA00; + + if (star[i].ym > 0xA00) + star[i].ym = 0xA00; + if (star[i].ym < -0xA00) + star[i].ym = -0xA00; + + star[i].x += star[i].xm; + star[i].y += star[i].ym; + + if (i < gMC.star && (gMC.equip & EQUIP_WHIMSICAL_STAR) && (g_GameFlags & 2) && a == i) + SetBullet(45, star[a].x, star[a].y, 0); + } +} + +void PutStar(int fx, int fy) +{ + RECT rc[3] = { + {192, 0, 200, 8}, + {192, 8, 200, 16}, + {192, 16, 200, 24}, + }; + + int i; + + if (gMC.cond & 2) + return; + + if (!(gMC.equip & EQUIP_WHIMSICAL_STAR)) + return; + + for (i = 0; i < 3; ++i) + if (i < gMC.star) + PutBitmap3(&grcGame, SubpixelToScreenCoord(star[i].x) - SubpixelToScreenCoord(fx) - PixelToScreenCoord(4), SubpixelToScreenCoord(star[i].y) - SubpixelToScreenCoord(fy) - PixelToScreenCoord(4), &rc[i], SURFACE_ID_MY_CHAR); +} diff --git a/src/Star.h b/src/Star.h new file mode 100644 index 0000000..e107f34 --- /dev/null +++ b/src/Star.h @@ -0,0 +1,12 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +void InitStar(void); +void ActStar(void); +void PutStar(int fx, int fy); diff --git a/src/Tags.h b/src/Tags.h new file mode 100644 index 0000000..95e166c --- /dev/null +++ b/src/Tags.h @@ -0,0 +1,11 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +// Apparently this used to contain a bunch of structs? +// For now, the structs are in header files matching their purpose. diff --git a/src/TextScr.cpp b/src/TextScr.cpp new file mode 100644 index 0000000..666b116 --- /dev/null +++ b/src/TextScr.cpp @@ -0,0 +1,1675 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "TextScr.h" + +#include +#include +#include +#include +#include + +#include "WindowsWrapper.h" + +#include "Backends/Misc.h" +#include "ArmsItem.h" +#include "Bitmap.h" +#include "Boss.h" +#include "BossLife.h" +#include "CommonDefines.h" +#include "Draw.h" +#include "Ending.h" +#include "Escape.h" +#include "Fade.h" +#include "Flags.h" +#include "Flash.h" +#include "Frame.h" +#include "Game.h" +#include "Generic.h" +#include "KeyControl.h" +#include "Main.h" +#include "Map.h" +#include "MapName.h" +#include "MiniMap.h" +#include "MyChar.h" +#include "MycParam.h" +#include "NpChar.h" +#ifdef EXTRA_SOUND_FORMATS +#include "ExtraSoundFormats.h" +#endif +#include "Organya.h" +#include "Profile.h" +#include "SelStage.h" +#include "Sound.h" +#include "Stage.h" + +#define TEXT_LEFT (WINDOW_WIDTH / 2 - 108) + +#define IS_COMMAND(c1, c2, c3) (gTS.data[gTS.p_read + 1] == (c1) && gTS.data[gTS.p_read + 2] == (c2) && gTS.data[gTS.p_read + 3] == (c3)) + +TEXT_SCRIPT gTS; + +static char text[4][0x40]; + +const RECT gRect_line = {0, 0, 216, 16}; + +#ifdef FIX_BUGS +static unsigned long nod_color; +#endif + +unsigned int gMIMCurrentNum = 0; + +// Initialize and end tsc +BOOL InitTextScript2(void) +{ + int i; + +#ifdef FIX_BUGS + nod_color = GetCortBoxColor(RGB(0xFF, 0xFF, 0xFE)); +#endif + + // Clear flags + gTS.mode = 0; + g_GameFlags &= ~4; + + // Create line surfaces + for (i = 0; i < 4; ++i) + MakeSurface_Generic(gRect_line.right, gRect_line.bottom, (SurfaceID)(SURFACE_ID_TEXT_LINE1 + i), FALSE, TRUE); + + // Clear text + memset(text, 0, sizeof(text)); + + return TRUE; +} + +void EndTextScript(void) +{ + int i; + + // Free TSC buffer + free(gTS.data); + + // Release buffers + ReleaseSurface(SURFACE_ID_TEXT_BOX); + + for (i = 0; i < 4; ++i) + ReleaseSurface((SurfaceID)(SURFACE_ID_TEXT_LINE1 + i)); +} + +// Decrypt .tsc +void EncryptionBinaryData2(unsigned char *pData, long size) +{ + int i; + int work; + + int half; + int val1; + + half = size / 2; + + if (pData[half] == 0) + val1 = -7; + else + val1 = (pData[half] % 0x100) * -1; + + for (i = 0; i < size; ++i) + { + work = pData[i]; + work += val1; + + if (i != half) + pData[i] = work % 0x100; + } +} + +// Load generic .tsc +BOOL LoadTextScript2(const char *name) +{ + FILE *fp; + std::string path; + + // Get path + path = gDataPath + '/' + name; + + gTS.size = GetFileSizeLong(path.c_str()); + if (gTS.size == -1) + return FALSE; + + free(gTS.data); + gTS.data = (char*)malloc(gTS.size + 1); + if (gTS.data == NULL) + return FALSE; + + // Open file + fp = fopen(path.c_str(), "rb"); + if (fp == NULL) + return FALSE; + + // Read data + fread(gTS.data, 1, gTS.size, fp); + gTS.data[gTS.size] = '\0'; + fclose(fp); + + // Set path + gTS.path = name; + + // Decrypt data + EncryptionBinaryData2((unsigned char*)gTS.data, gTS.size); + + return TRUE; +} + +// Load stage .tsc +BOOL LoadTextScript_Stage(const char *name) +{ + FILE *fp_head, *fp_body; + std::string path; + long head_size; + long body_size; + + // Open Head.tsc and the stage's .tsc + path = gDataPath + "/Head.tsc"; + + head_size = GetFileSizeLong(path.c_str()); + if (head_size == -1) + return FALSE; + + fp_head = fopen(path.c_str(), "rb"); + if (fp_head == NULL) + return FALSE; + + path = gDataPath + '/' + name; + + body_size = GetFileSizeLong(path.c_str()); + if (body_size == -1) + return FALSE; + + fp_body = fopen(path.c_str(), "rb"); + if (fp_body == NULL) + return FALSE; + + free(gTS.data); + gTS.data = (char*)malloc(head_size + body_size + 1); + if (gTS.data == NULL) + return FALSE; + + // Read Head.tsc + fread(gTS.data, 1, head_size, fp_head); + EncryptionBinaryData2((unsigned char*)gTS.data, head_size); + gTS.data[head_size] = '\0'; + fclose(fp_head); + + fread(&gTS.data[head_size], 1, body_size, fp_body); + EncryptionBinaryData2((unsigned char*)&gTS.data[head_size], body_size); + gTS.data[head_size + body_size] = '\0'; + fclose(fp_body); + + // Set parameters + gTS.size = head_size + body_size; + gTS.path = name; + + return TRUE; +} + +// Get current path +std::string GetTextScriptPath(void) +{ + return gTS.path; +} + +// Get 4 digit number from TSC data +int GetTextScriptNo(int a) +{ + int b = 0; + b += (gTS.data[a++] - '0') * 1000; + b += (gTS.data[a++] - '0') * 100; + b += (gTS.data[a++] - '0') * 10; + b += gTS.data[a] - '0'; + return b; +} + +// Start TSC event +BOOL StartTextScript(int no) +{ + //int i; + + // Reset state + gTS.mode = 1; + g_GameFlags |= 5; + gTS.line = 0; + gTS.p_write = 0; + gTS.wait = 4; + gTS.flags = 0; + gTS.wait_beam = 0; + gTS.face = 0; + gTS.item = 0; + gTS.offsetY = 0; + + gMC.shock = 0; + + gTS.rcText.left = TEXT_LEFT; + gTS.rcText.top = WINDOW_HEIGHT - 56; + gTS.rcText.right = WINDOW_WIDTH - TEXT_LEFT; + gTS.rcText.bottom = gTS.rcText.top + 48; + + /* This is present in the Linux port, but not the Windows version (1.0.0.6, at least) + // Clear text lines + for (i = 0; i < 4; ++i) + { + gTS.ypos_line[i] = i * 16; + CortBox2(&gRect_line, 0x000000, (SurfaceID)(SURFACE_ID_TEXT_LINE1 + i)); + memset(text[i], 0, sizeof(text[0])); + }*/ + + // Find where event starts + gTS.p_read = 0; + while (1) + { + // Check if we are still in the proper range + if (gTS.data[gTS.p_read] == '\0') + return FALSE; + + // Check if we are at an event + if (gTS.data[gTS.p_read] == '#') + { + // Check if this is our event + int event_no = GetTextScriptNo(++gTS.p_read); + + if (no == event_no) + break; + if (no < event_no) + return FALSE; + } + + ++gTS.p_read; + } + + // Advance until new-line + while (gTS.data[gTS.p_read] != '\n') + ++gTS.p_read; + ++gTS.p_read; + + return TRUE; +} + +BOOL JumpTextScript(int no) +{ + int i; + + // Set state + gTS.mode = 1; + g_GameFlags |= 4; + gTS.line = 0; + gTS.p_write = 0; + gTS.wait = 4; + gTS.wait_beam = 0; + + // Clear text lines + for (i = 0; i < 4; ++i) + { + gTS.ypos_line[i] = i * 16; + CortBox2(&gRect_line, 0x000000, (SurfaceID)(SURFACE_ID_TEXT_LINE1 + i)); + memset(text[i], 0, sizeof(text[0])); + } + + // Find where event starts + gTS.p_read = 0; + + while(1) + { + // Check if we are still in the proper range + if (gTS.data[gTS.p_read] == '\0') + return FALSE; + + // Check if we are at an event + if (gTS.data[gTS.p_read] == '#') + { + // Check if this is our event + int event_no = GetTextScriptNo(++gTS.p_read); + + if (no == event_no) + break; + if (no < event_no) + return FALSE; + } + + ++gTS.p_read; + } + + // Advance until new-line + while (gTS.data[gTS.p_read] != '\n') + ++gTS.p_read; + + ++gTS.p_read; + + return TRUE; +} + +// End event +void StopTextScript(void) +{ + // End TSC and reset flags + gTS.mode = 0; + g_GameFlags &= ~4; + g_GameFlags |= 3; + gTS.flags = 0; +} + +// Prepare a new line +void CheckNewLine(void) +{ + if (gTS.ypos_line[gTS.line % 4] == 48) + { + gTS.mode = 3; + g_GameFlags |= 4; + CortBox2(&gRect_line, 0, (SurfaceID)(SURFACE_ID_TEXT_LINE1 + (gTS.line % 4))); + memset(text[gTS.line % 4], 0, sizeof(text[0])); + } +} + +int gNumberTextScript[4]; + +// Type a number into the text buffer +void SetNumberTextScript(int index) +{ + char str[5]; + BOOL bZero; + int a; + int b; + int offset; + int i; + + // Get digit table + int table[3]; + table[0] = 1000; + table[1] = 100; + table[2] = 10; + + // Get number to print + a = gNumberTextScript[index]; + + bZero = FALSE; + offset = 0; + + // Trim leading zeroes + for (i = 0; i < 3; ++i) + { + if (a / table[i] || bZero) + { + b = a / table[i]; + str[offset] = '0' + (char)b; + bZero = TRUE; + a -= b * table[i]; + ++offset; + } + } + + // Set last digit of string, and add null terminator + str[offset] = '0' + (char)a; + str[offset + 1] = '\0'; + + // Append number to line + PutText2(gTS.p_write * 6, 0, str, RGB(0xFF, 0xFF, 0xFE), (SurfaceID)(SURFACE_ID_TEXT_LINE1 + (gTS.line % 4))); + strcat(text[gTS.line % 4], str); + + // Play sound and reset blinking cursor + PlaySoundObject(2, SOUND_MODE_PLAY); + gTS.wait_beam = 0; + + // Check if should move to next line (prevent a memory overflow, come on guys, this isn't a leftover of pixel trying to make text wrapping) + gTS.p_write += (int)strlen(str); + + if (gTS.p_write >= 35) + { + gTS.p_write = 0; + ++gTS.line; + CheckNewLine(); + } +} + +// Clear text lines +void ClearTextLine(void) +{ + int i; + + gTS.line = 0; + gTS.p_write = 0; + gTS.offsetY = 0; + + for (i = 0; i < 4; ++i) + { + gTS.ypos_line[i] = i * 16; + CortBox2(&gRect_line, 0x000000, (SurfaceID)(SURFACE_ID_TEXT_LINE1 + i)); + memset(text[i], 0, sizeof(text[0])); + } +} + +// Draw textbox and whatever else +void PutTextScript(void) +{ + int i; + RECT rect; + int text_offset; + + if (gTS.mode == 0) + return; + + if ((gTS.flags & 1) == 0) + return; + + // Set textbox position + if (gTS.flags & 0x20) + { + gTS.rcText.top = 32; + gTS.rcText.bottom = gTS.rcText.top + 48; + } + else + { + gTS.rcText.top = WINDOW_HEIGHT - 56; + gTS.rcText.bottom = gTS.rcText.top + 48; + } + + // Draw textbox + if (gTS.flags & 2) + { + RECT rcFrame1 = {0, 0, 244, 8}; + RECT rcFrame2 = {0, 8, 244, 16}; + RECT rcFrame3 = {0, 16, 244, 24}; + + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) - 122), PixelToScreenCoord(gTS.rcText.top - 10), &rcFrame1, SURFACE_ID_TEXT_BOX); + for (i = 1; i < 7; ++i) + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) - 122), PixelToScreenCoord((i * 8) + gTS.rcText.top - 10), &rcFrame2, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) - 122), PixelToScreenCoord((i * 8) + gTS.rcText.top - 10), &rcFrame3, SURFACE_ID_TEXT_BOX); + } + + // Draw face picture + RECT rcFace; + rcFace.left = (gTS.face % 6) * 48; + rcFace.top = (gTS.face / 6) * 48; + rcFace.right = rcFace.left + 48; + rcFace.bottom = rcFace.top + 48; + + if (gTS.face_x < (TEXT_LEFT * 0x200)) + gTS.face_x += 0x1000; + +#ifdef FIX_BUGS + gTS.rcText.top -= 2; + PutBitmap3(&gTS.rcText, SubpixelToScreenCoord(gTS.face_x), PixelToScreenCoord(gTS.rcText.top), &rcFace, SURFACE_ID_FACE); + gTS.rcText.top += 2; +#else + // The top few rows of pixels are cut off by the clip rectangle, and the facepic is off-centre + PutBitmap3(&gTS.rcText, SubpixelToScreenCoord(gTS.face_x), PixelToScreenCoord(gTS.rcText.top - 3), &rcFace, SURFACE_ID_FACE); +#endif + + // Draw text + if (gTS.face != 0) + text_offset = 56; + else + text_offset = 0; + + for (i = 0; i < 4; ++i){ + if(gColorFilters[gFilterIndex].name == "Game Boy"){ + PutBitmap4(&gTS.rcText, PixelToScreenCoord(TEXT_LEFT + text_offset), PixelToScreenCoord(gTS.offsetY + gTS.ypos_line[i] + gTS.rcText.top), &gRect_line, (SurfaceID)(SURFACE_ID_TEXT_LINE1 + i)); + } + else{ + PutBitmap3(&gTS.rcText, PixelToScreenCoord(TEXT_LEFT + text_offset), PixelToScreenCoord(gTS.offsetY + gTS.ypos_line[i] + gTS.rcText.top), &gRect_line, (SurfaceID)(SURFACE_ID_TEXT_LINE1 + i)); + } + } + + // Draw NOD cursor + if ((gTS.wait_beam++ % 20 > 12) && gTS.mode == 2) + { + rect.left = TEXT_LEFT + (gTS.p_write * 6) + text_offset; + rect.top = gTS.ypos_line[gTS.line % 4] + gTS.rcText.top + gTS.offsetY; + rect.right = rect.left + 5; + rect.bottom = rect.top + 11; +#ifdef FIX_BUGS + CortBox(&rect, nod_color); + + // This is how the Linux port fixed this, but it isn't done + // the way Pixel would do it (he only calls GetCortBoxColor + // once, during init functions, so our fix does it that way + // instead). + // CortBox(&rect, GetCortBoxColor(RGB(0xFF, 0xFF, 0xFE)); +#else + // This accidentally uses a BGR value directly, without + // running it though GetCortBoxColor first + CortBox(&rect, RGB(0xFF, 0xFF, 0xFE)); +#endif + } + + // Draw GIT + RECT rcItemBox1 = {0, 0, 72, 16}; + RECT rcItemBox2 = {0, 8, 72, 24}; + RECT rcItemBox3 = {240, 0, 244, 8}; + RECT rcItemBox4 = {240, 8, 244, 16}; + RECT rcItemBox5 = {240, 16, 244, 24}; + + if (gTS.item != 0) + { + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) - 40), PixelToScreenCoord(WINDOW_HEIGHT - 112), &rcItemBox1, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) - 40), PixelToScreenCoord(WINDOW_HEIGHT - 96), &rcItemBox2, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) + 32), PixelToScreenCoord(WINDOW_HEIGHT - 112), &rcItemBox3, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) + 32), PixelToScreenCoord(WINDOW_HEIGHT - 104), &rcItemBox4, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) + 32), PixelToScreenCoord(WINDOW_HEIGHT - 96), &rcItemBox4, SURFACE_ID_TEXT_BOX); + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) + 32), PixelToScreenCoord(WINDOW_HEIGHT - 88), &rcItemBox5, SURFACE_ID_TEXT_BOX); + + if (gTS.item_y < WINDOW_HEIGHT - 104) + ++gTS.item_y; + + if (gTS.item < 1000) + { + rect.left = (gTS.item % 16) * 16; + rect.right = rect.left + 16; + rect.top = (gTS.item / 16) * 16; + rect.bottom = rect.top + 16; + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) - 12), PixelToScreenCoord(gTS.item_y), &rect, SURFACE_ID_ARMS_IMAGE); + } + else + { + rect.left = 32 * ((gTS.item - 1000) % 8); + rect.right = rect.left + 32; + rect.top = 16 * ((gTS.item - 1000) / 8); + rect.bottom = rect.top + 16; + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) - 20), PixelToScreenCoord(gTS.item_y), &rect, SURFACE_ID_ITEM_IMAGE); + } + } + + // Draw Yes / No selection + RECT rect_yesno = {152, 48, 244, 80}; + RECT rect_cur = {112, 88, 128, 104}; + + if (gTS.mode == 6) + { + if (gTS.wait < 2) + i = (WINDOW_HEIGHT - 96) + (2 - gTS.wait) * 4; + else + i = WINDOW_HEIGHT - 96; + + PutBitmap3(&grcFull, PixelToScreenCoord((WINDOW_WIDTH / 2) + 56), PixelToScreenCoord(i), &rect_yesno, SURFACE_ID_TEXT_BOX); + if (gTS.wait == 16) + PutBitmap3(&grcFull, PixelToScreenCoord((gTS.select * 41) + (WINDOW_WIDTH / 2) + 51), PixelToScreenCoord(WINDOW_HEIGHT - 86), &rect_cur, SURFACE_ID_TEXT_BOX); + } +} + +// Parse TSC +int TextScriptProc(void) +{ + int i; + char c[3]; + char str[72]; + int w, x, y, z; + + BOOL bExit; + + RECT rcSymbol = {64, 48, 72, 56}; + + switch (gTS.mode) + { + case 1: // PARSE + // Type out (faster if ok or cancel are held) + ++gTS.wait; + + if (!(g_GameFlags & 2) && gKey & (gKeyOk | gKeyCancel)) + gTS.wait += 4; + + if (gTS.wait < 4) + break; + + gTS.wait = 0; + + // Parsing time + bExit = FALSE; + + while (!bExit) + { + if (gTS.data[gTS.p_read] == '<') + { + if (IS_COMMAND('E','N','D')) + { + gTS.mode = 0; + gMC.cond &= ~1; + g_GameFlags |= 3; + gTS.face = 0; + bExit = TRUE; + } + else if (IS_COMMAND('L','I','+')) + { + x = GetTextScriptNo(gTS.p_read + 4); + AddLifeMyChar(x); + gTS.p_read += 8; + } + else if (IS_COMMAND('M','L','+')) + { + z = GetTextScriptNo(gTS.p_read + 4); + AddMaxLifeMyChar(z); + gTS.p_read += 8; + } + else if (IS_COMMAND('A','E','+')) + { + FullArmsEnergy(); + gTS.p_read += 4; + } + else if (IS_COMMAND('I','T','+')) + { + x = GetTextScriptNo(gTS.p_read + 4); + PlaySoundObject(38, SOUND_MODE_PLAY); + AddItemData(x); + gTS.p_read += 8; + } + else if (IS_COMMAND('I','T','-')) + { + z = GetTextScriptNo(gTS.p_read + 4); + SubItemData(z); + gTS.p_read += 8; + } + else if (IS_COMMAND('E','Q','+')) + { + z = GetTextScriptNo(gTS.p_read + 4); + EquipItem(z, TRUE); + gTS.p_read += 8; + } + else if (IS_COMMAND('E','Q','-')) + { + z = GetTextScriptNo(gTS.p_read + 4); + EquipItem(z, FALSE); + gTS.p_read += 8; + } + else if (IS_COMMAND('A','M','+')) + { + w = GetTextScriptNo(gTS.p_read + 4); + x = GetTextScriptNo(gTS.p_read + 9); + + gNumberTextScript[0] = x; + #ifndef FIX_MAJOR_BUGS + // z is uninitialised. Probably a leftover from copypasting this from elsewhere. + gNumberTextScript[1] = z; + #endif + + PlaySoundObject(38, SOUND_MODE_PLAY); + AddArmsData(w, x); + gTS.p_read += 13; + } + else if (IS_COMMAND('A','M','-')) + { + z = GetTextScriptNo(gTS.p_read + 4); + SubArmsData(z); + gTS.p_read += 8; + } + else if (IS_COMMAND('Z','A','M')) + { + ZeroArmsEnergy_All(); + gTS.p_read += 4; + } + else if (IS_COMMAND('T','A','M')) + { + x = GetTextScriptNo(gTS.p_read + 4); + y = GetTextScriptNo(gTS.p_read + 9); + z = GetTextScriptNo(gTS.p_read + 14); + TradeArms(x, y, z); + gTS.p_read += 18; + } + else if (IS_COMMAND('P','S','+')) + { + x = GetTextScriptNo(gTS.p_read + 4); + y = GetTextScriptNo(gTS.p_read + 9); + AddPermitStage(x, y); + gTS.p_read += 13; + } + else if (IS_COMMAND('M','P','+')) + { + x = GetTextScriptNo(gTS.p_read + 4); + SetMapping(x); + gTS.p_read += 8; + } + else if (IS_COMMAND('U','N','I')) + { + z = GetTextScriptNo(gTS.p_read + 4); + ChangeMyUnit(z); + gTS.p_read += 8; + } + else if (IS_COMMAND('S','T','C')) + { + SaveTimeCounter(); + gTS.p_read += 4; + } + else if (IS_COMMAND('T','R','A')) + { + z = GetTextScriptNo(gTS.p_read + 4); + w = GetTextScriptNo(gTS.p_read + 9); + x = GetTextScriptNo(gTS.p_read + 14); + y = GetTextScriptNo(gTS.p_read + 19); + + if (!TransferStage(z, w, x, y)) + { + #if !defined(JAPANESE) && defined(FIX_BUGS) // The Aeon Genesis translation didn't translate this + Backend_ShowMessageBox("Error", "Failed to load stage"); + #else + Backend_ShowMessageBox("エラー", "ステージの読み込みに失敗"); + #endif + return enum_ESCRETURN_exit; + } + } + else if (IS_COMMAND('M','O','V')) + { + x = GetTextScriptNo(gTS.p_read + 4); + y = GetTextScriptNo(gTS.p_read + 9); + SetMyCharPosition(x * 0x200 * 0x10, y * 0x200 * 0x10); + gTS.p_read += 13; + } + else if (IS_COMMAND('H','M','C')) + { + ShowMyChar(FALSE); + gTS.p_read += 4; + } + else if (IS_COMMAND('S','M','C')) + { + ShowMyChar(TRUE); + gTS.p_read += 4; + } + else if (IS_COMMAND('F','L','+')) + { + z = GetTextScriptNo(gTS.p_read + 4); + SetNPCFlag(z); + gTS.p_read += 8; + } + else if (IS_COMMAND('F','L','-')) + { + z = GetTextScriptNo(gTS.p_read + 4); + CutNPCFlag(z); + gTS.p_read += 8; + } + else if (IS_COMMAND('S','K','+')) + { + z = GetTextScriptNo(gTS.p_read + 4); + SetSkipFlag(z); + gTS.p_read += 8; + } + else if (IS_COMMAND('S','K','-')) + { + z = GetTextScriptNo(gTS.p_read + 4); + CutSkipFlag(z); + gTS.p_read += 8; + } + else if (IS_COMMAND('K','E','Y')) + { + g_GameFlags &= ~2; + g_GameFlags |= 1; + gMC.up = FALSE; + gMC.shock = 0; + gTS.p_read += 4; + } + else if (IS_COMMAND('P','R','I')) + { + g_GameFlags &= ~3; + gMC.shock = 0; + gTS.p_read += 4; + } + else if (IS_COMMAND('F','R','E')) + { + g_GameFlags |= 3; + gTS.p_read += 4; + } + else if (IS_COMMAND('N','O','D')) + { + gTS.mode = 2; + gTS.p_read += 4; + bExit = TRUE; + } + else if (IS_COMMAND('C','L','R')) + { + ClearTextLine(); + gTS.p_read += 4; + } + else if (IS_COMMAND('M','S','G')) + { + ClearTextLine(); + gTS.flags |= 0x03; + gTS.flags &= ~0x30; + if (gTS.flags & 0x40) + gTS.flags |= 0x10; + gTS.p_read += 4; + bExit = TRUE; + } + else if (IS_COMMAND('M','S','2')) + { + ClearTextLine(); + gTS.flags &= ~0x12; + gTS.flags |= 0x21; + if (gTS.flags & 0x40) + gTS.flags |= 0x10; + gTS.face = 0; + gTS.p_read += 4; + bExit = TRUE; + } + else if (IS_COMMAND('M','S','3')) + { + ClearTextLine(); + gTS.flags &= ~0x10; + gTS.flags |= 0x23; + if (gTS.flags & 0x40) + gTS.flags |= 0x10; + gTS.p_read += 4; + bExit = TRUE; + } + else if (IS_COMMAND('M','S','4')) + { + ClearTextLine(); + gTS.flags |= 0x01; + gTS.flags &= ~0x32; + if (gTS.flags & 0x40) + gTS.flags |= 0x10; + gTS.face = 0; + gTS.p_read += 4; + bExit = TRUE; + } + else if (IS_COMMAND('W','A','I')) + { + gTS.mode = 4; + gTS.wait_next = GetTextScriptNo(gTS.p_read + 4); + gTS.p_read += 8; + bExit = TRUE; + } + else if (IS_COMMAND('W','A','S')) + { + gTS.mode = 7; + gTS.p_read += 4; + bExit = TRUE; + } + else if (IS_COMMAND('T','U','R')) + { + gTS.p_read += 4; + gTS.flags |= 0x10; + } + else if (IS_COMMAND('S','A','T')) + { + gTS.p_read += 4; + gTS.flags |= 0x40; + } + else if (IS_COMMAND('C','A','T')) + { + gTS.p_read += 4; + gTS.flags |= 0x40; + } + else if (IS_COMMAND('C','L','O')) + { + gTS.flags &= ~0x33; + gTS.p_read += 4; + } + else if (IS_COMMAND('E','V','E')) + { + z = GetTextScriptNo(gTS.p_read + 4); + JumpTextScript(z); + } + else if (IS_COMMAND('Y','N','J')) + { + gTS.next_event = GetTextScriptNo(gTS.p_read + 4); + gTS.p_read += 8; + gTS.mode = 6; + PlaySoundObject(5, SOUND_MODE_PLAY); + gTS.wait = 0; + gTS.select = 0; + bExit = TRUE; + } + else if (IS_COMMAND('F','L','J')) + { + x = GetTextScriptNo(gTS.p_read + 4); + z = GetTextScriptNo(gTS.p_read + 9); + + #ifdef FIX_MAJOR_BUGS + // Some versions of the Waterway TSC script contain a bug: + // = 35) + CheckNewLine(); + + bExit = TRUE; + } + else + { + // Get text to print + c[0] = gTS.data[gTS.p_read]; + + if (c[0] & 0x80) + { + #ifdef JAPANESE + c[1] = gTS.data[gTS.p_read + 1]; + #else + // Performs CP-1252 to UTF-8 conversion if necessary (This will only work for Latin-1 languages) + if (c[0] < 0xC0) + { + c[1] = (char)c[0]; + c[0] = (char)0xC2; + } + else + { + c[1] = (char)(c[0] - 0x40); + c[0] = (char)0xC3; + } + #endif + c[2] = '\0'; + } + else + { + c[1] = '\0'; + } + + // Print text + if (c[0] == '=') + { + Surface2Surface(gTS.p_write * 6, 1, &rcSymbol, (SurfaceID)(SURFACE_ID_TEXT_LINE1 + (gTS.line % 4)), SURFACE_ID_TEXT_BOX); + } + else + { + PutText2(gTS.p_write * 6, -1, c, RGB(0xFF, 0xFF, 0xFE), (SurfaceID)(SURFACE_ID_TEXT_LINE1 + (gTS.line % 4))); + } + + strcat(text[gTS.line % 4], c); + PlaySoundObject(2, SOUND_MODE_PLAY); + gTS.wait_beam = 0; + + // Offset read and write positions + if (c[0] & 0x80) + { + #ifdef JAPANESE + gTS.p_read += 2; + gTS.p_write += 2; + #else + gTS.p_read += 1; + gTS.p_write += 1; + #endif + } + else + { + gTS.p_read += 1; + gTS.p_write += 1; + } + + if (gTS.p_write >= 35) + { + CheckNewLine(); + gTS.p_write = 0; + ++gTS.line; + CheckNewLine(); + } + + bExit = TRUE; + } + } + } + break; + + case 2: // NOD + if (gKeyTrg & (gKeyOk | gKeyCancel)) + gTS.mode = 1; + break; + + case 3: // NEW LINE + for (i = 0; i < 4; ++i) + { + gTS.ypos_line[i] -= 4; + + if (gTS.ypos_line[i] == 0) + gTS.mode = 1; + + if (gTS.ypos_line[i] == -16) + gTS.ypos_line[i] = 48; + } + break; + + case 4: // WAI + if (gTS.wait_next == 9999) + break; + + if (gTS.wait != 9999) + ++gTS.wait; + + if (gTS.wait < gTS.wait_next) + break; + + gTS.mode = 1; + gTS.wait_beam = 0; + break; + + case 5: // FAI/FAO + if (GetFadeActive()) + break; + + gTS.mode = 1; + gTS.wait_beam = 0; + break; + + case 7: // WAS + if ((gMC.flag & 8) == 0) + break; + + gTS.mode = 1; + gTS.wait_beam = 0; + break; + + case 6: // YNJ + if (gTS.wait < 16) + { + ++gTS.wait; + } + else + { + // Select option + if (gKeyTrg & gKeyOk) + { + PlaySoundObject(18, SOUND_MODE_PLAY); + + if (gTS.select == 1) + { + JumpTextScript(gTS.next_event); + } + else + { + gTS.mode = 1; + gTS.wait_beam = 0; + } + } + // Yes + else if (gKeyTrg & gKeyLeft) + { + gTS.select = 0; + PlaySoundObject(1, SOUND_MODE_PLAY); + } + // No + else if (gKeyTrg & gKeyRight) + { + gTS.select = 1; + PlaySoundObject(1, SOUND_MODE_PLAY); + } + } + break; + } + + if (gTS.mode == 0) + g_GameFlags &= ~4; + else + g_GameFlags |= 4; + + return enum_ESCRETURN_continue; +} + +void RestoreTextScript(void) +{ + int i; + + for (i = 0; i < 4; ++i) + { + CortBox2(&gRect_line, 0x000000, (SurfaceID)(SURFACE_ID_TEXT_LINE1 + i)); + PutText2(0, 0, text[i], RGB(0xFF, 0xFF, 0xFE), (SurfaceID)(SURFACE_ID_TEXT_LINE1 + i)); + } +} diff --git a/src/TextScr.h b/src/TextScr.h new file mode 100644 index 0000000..df71b08 --- /dev/null +++ b/src/TextScr.h @@ -0,0 +1,94 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include + +#include "WindowsWrapper.h" + +typedef struct FONT_DATA +{ + char name[255]; + int x_scaling; + int y_scaling; + int x_title_scaling; + int y_title_scaling; +} FONT_DATA; + +typedef struct TEXT_SCRIPT +{ + // Path (reload when exit teleporter menu/inventory) + std::string path; + + // Script buffer + long size; + char *data; + + // Mode (ex. NOD, WAI) + signed char mode; + + // Flags + signed char flags; + + // Current positions (read position in buffer, x position in line) + int p_read; + int p_write; + + // Current line to write to + int line; + + // Line y positions + int ypos_line[4]; + + // Event stuff + int wait; + int wait_next; + int next_event; + + // Yes/no selected + signed char select; + + // Current face + int face; + int face_x; + + // Current item + int item; + int item_y; + + // Text rect + RECT rcText; + + // ..? + int offsetY; + + // NOD cursor blink + unsigned char wait_beam; +} TEXT_SCRIPT; + +extern TEXT_SCRIPT gTS; + +extern const RECT gRect_line; + +/// Contains the latest value given through + +int gSin[0x100]; +short gTan[0x21]; + +void InitTriangleTable(void) +{ + int i; + + // Sine + for (i = 0; i < 0x100; ++i) + gSin[i] = (int)(sin(i * 6.2831998 / 256.0) * 512.0); + + float a, b; + + // Tangent + for (i = 0; i < 0x21; ++i) + { + a = (float)(i * 6.2831855f / 256.0f); + b = (float)sin(a) / (float)cos(a); + gTan[i] = (short)(b * 8192.0f); + } +} + +int GetSin(unsigned char deg) +{ + return gSin[deg]; +} + +int GetCos(unsigned char deg) +{ + deg += 0x40; + return gSin[deg]; +} + +unsigned char GetArktan(int x, int y) +{ + short k; + unsigned char a; + + x *= -1; + y *= -1; + + a = 0; + + if (x > 0) + { + if (y > 0) + { + if (x > y) + { + k = (y * 0x2000) / x; + while (k > gTan[a]) + ++a; + } + else + { + k = (x * 0x2000) / y; + while (k > gTan[a]) + ++a; + a = 0x40 - a; + } + } + else + { + if (x > -y) + { + k = (-y * 0x2000) / x; + while (k > gTan[a]) + ++a; + a = 0x100 - a; + } + else + { + k = (x * 0x2000) / -y; + while (k > gTan[a]) + ++a; + a = 0x100 - 0x40 + a; + } + } + } + else + { + if (y > 0) + { + if (-x > y) + { + k = (y * 0x2000) / -x; + while (k > gTan[a]) + ++a; + a = 0x80 - a; + } + else + { + k = (-x * 0x2000) / y; + while (k > gTan[a]) + ++a; + a = 0x40 + a; + } + } + else + { + if (-x > -y) + { + k = (-y * 0x2000) / -x; + while (k > gTan[a]) + ++a; + a = 0x80 + a; + } + else + { + k = (-x * 0x2000) / -y; + while (k > gTan[a]) + ++a; + a = 0x100 - 0x40 - a; + } + } + } + + return a; +} diff --git a/src/Triangle.h b/src/Triangle.h new file mode 100644 index 0000000..99a6917 --- /dev/null +++ b/src/Triangle.h @@ -0,0 +1,16 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +extern int gSin[0x100]; +extern short gTan[0x21]; + +void InitTriangleTable(void); +int GetSin(unsigned char deg); +int GetCos(unsigned char deg); +unsigned char GetArktan(int x, int y); diff --git a/src/ValueView.cpp b/src/ValueView.cpp new file mode 100644 index 0000000..461c0e1 --- /dev/null +++ b/src/ValueView.cpp @@ -0,0 +1,208 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#include "ValueView.h" + +#include + +#include "WindowsWrapper.h" +#include "CommonDefines.h" + +#include "Draw.h" + +VALUEVIEW gVV[VALUEVIEW_MAX]; +int gVVIndex; + +void ClearValueView(void) +{ + memset(gVV, 0, sizeof(gVV)); + gVVIndex = 0; +} + +void SetValueView(int *px, int *py, int value) +{ + BOOL minus; + int v; + + int index; + int i; + + for (i = 0; i < VALUEVIEW_MAX; ++i) + { + if (gVV[i].flag && gVV[i].px == px) + { + if (gVV[i].value < 0 && value < 0) + break; + + if (gVV[i].value > 0 && value > 0) + break; + } + } + + if (i == VALUEVIEW_MAX) + { + index = gVVIndex++; + + if (gVVIndex == VALUEVIEW_MAX) + gVVIndex = 0; + + gVV[index].count = 0; + gVV[index].offset_y = 0; + gVV[index].value = value; + } + else + { + index = i; + + gVV[index].count = 32; + gVV[index].value += value; + value = gVV[index].value; + } + + // Get if negative or not + if (value < 0) + { + value *= -1; + minus = TRUE; + } + else + { + minus = FALSE; + } + + // Get width + v = value; + + int width; + + if (value > 999) + width = 40; + else if (value > 99) + width = 32; + else if (value > 9) + width = 24; + else + width = 16; + + // Set properties + gVV[index].flag = TRUE; + gVV[index].px = px; + gVV[index].py = py; + gVV[index].rect.left = 40 - width; + gVV[index].rect.top = 8 * index; + gVV[index].rect.right = 40; + gVV[index].rect.bottom = 8 * (index + 1); + + RECT rect[20] = { + {0, 56, 8, 64}, + {8, 56, 16, 64}, + {16, 56, 24, 64}, + {24, 56, 32, 64}, + {32, 56, 40, 64}, + {40, 56, 48, 64}, + {48, 56, 56, 64}, + {56, 56, 64, 64}, + {64, 56, 72, 64}, + {72, 56, 80, 64}, + {0, 64, 8, 72}, + {8, 64, 16, 72}, + {16, 64, 24, 72}, + {24, 64, 32, 72}, + {32, 64, 40, 72}, + {40, 64, 48, 72}, + {48, 64, 56, 72}, + {56, 64, 64, 72}, + {64, 64, 72, 72}, + {72, 64, 80, 72}, + }; + + // Get digits + int dig[4]; + int fig[4]; + dig[0] = 1; + dig[1] = 10; + dig[2] = 100; + dig[3] = 1000; + + for (i = 3; i >= 0; --i) + { + fig[i] = 0; + + while (v >= dig[i]) + { + v -= dig[i]; + ++fig[i]; + } + } + + BOOL sw = FALSE; + + RECT rcPlus = {32, 48, 40, 56}; + RECT rcMinus = {40, 48, 48, 56}; + + // Draw value + CortBox2(&gVV[index].rect, 0x000000, SURFACE_ID_VALUE_VIEW); + + if (minus) + Surface2Surface(gVV[index].rect.left, gVV[index].rect.top, &rcMinus, SURFACE_ID_VALUE_VIEW, SURFACE_ID_TEXT_BOX); + else + Surface2Surface(gVV[index].rect.left, gVV[index].rect.top, &rcPlus, SURFACE_ID_VALUE_VIEW, SURFACE_ID_TEXT_BOX); + + for (i = 3; i >= 0; i--) + { + if (!sw && i != 0 && fig[i] == 0) + continue; + + sw = TRUE; + + if (minus) + fig[i] += 10; + + Surface2Surface(((3 - i) * 8) + 8, gVV[index].rect.top, &rect[fig[i]], SURFACE_ID_VALUE_VIEW, SURFACE_ID_TEXT_BOX); + } +} + +void ActValueView(void) +{ + int v; + + for (v = 0; v < VALUEVIEW_MAX; ++v) + { + if (gVV[v].flag == FALSE) + continue; + + if (++gVV[v].count < 32) + gVV[v].offset_y -= 0x100; + + if (gVV[v].count > 72) + ++gVV[v].rect.top; + + if (gVV[v].count > 80) + gVV[v].flag = FALSE; + } +} + +void PutValueView(int flx, int fly) +{ + int offset_x; + int v; + + for (v = 0; v < VALUEVIEW_MAX; ++v) + { + if (gVV[v].flag == FALSE) + continue; + + offset_x = (gVV[v].rect.right - gVV[v].rect.left) / 2; + + PutBitmap3( + &grcGame, + (SubpixelToScreenCoord(*gVV[v].px) - PixelToScreenCoord(offset_x) - SubpixelToScreenCoord(flx)), + SubpixelToScreenCoord(*gVV[v].py) + SubpixelToScreenCoord(gVV[v].offset_y) - PixelToScreenCoord(4) - SubpixelToScreenCoord(fly), + &gVV[v].rect, + SURFACE_ID_VALUE_VIEW); + } +} diff --git a/src/ValueView.h b/src/ValueView.h new file mode 100644 index 0000000..7e72a7c --- /dev/null +++ b/src/ValueView.h @@ -0,0 +1,31 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#include "WindowsWrapper.h" + +#define VALUEVIEW_MAX 0x10 + +typedef struct VALUEVIEW +{ + BOOL flag; + int *px; + int *py; + int offset_y; + int value; + int count; + RECT rect; +} VALUEVIEW; + +extern VALUEVIEW gVV[VALUEVIEW_MAX]; +extern int gVVIndex; + +void ClearValueView(void); +void SetValueView(int *px, int *py, int value); +void ActValueView(void); +void PutValueView(int flx, int fly); diff --git a/src/WindowsWrapper.h b/src/WindowsWrapper.h new file mode 100644 index 0000000..5a04038 --- /dev/null +++ b/src/WindowsWrapper.h @@ -0,0 +1,26 @@ +// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK. +// +// The original code belongs to Daisuke "Pixel" Amaya. +// +// Modifications and custom code are under the MIT licence. +// See LICENCE.txt for details. + +#pragma once + +#define RGB(r,g,b) ((r) | ((g) << 8) | ((b) << 16)) + +// This isn't defined by `windows.h` - it's custom +#define RGBA(r,g,b,a) ((r) | ((g) << 8) | ((b) << 16) | ((a) << 24)) + +typedef bool BOOL; + +#define FALSE false +#define TRUE true + +struct RECT +{ + long left; + long top; + long right; + long bottom; +};