Initial boot

This commit is contained in:
Mr-Wiseguy
2025-02-17 21:45:16 -05:00
parent bed19575f3
commit ff73b2107b
168 changed files with 23034 additions and 2 deletions
+64
View File
@@ -0,0 +1,64 @@
# VSCode file settings
.vscode/settings.json
.vscode/c_cpp_properties.json
.vscode/launch.json
# Input elf and rom files
*.elf
*.z64
# Output C files
RecompiledFuncs/
RecompiledPatches/
# Linux build output
build/
*.o
# Windows build output
*.exe
*.dll
*.lib
*.pdb
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
out/
# Visual Studio 2015/2017 cache/options directory
.vs/
vcpkg_installed/
# Runtime files
imgui.ini
rt64.log
node_modules/
# Recompiler Linux binary
N64Recomp
RSPRecomp
.DS_Store
# Controller mappings file
gamecontrollerdb.txt
+354
View File
@@ -0,0 +1,354 @@
cmake_minimum_required(VERSION 3.20)
project(BanjoRecompiled)
set(CMAKE_C_STANDARD 17)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-everything /W4")
endif()
# Opt out of constexpr mutex constructor on windows to prevent vcredist issues
if (WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR")
endif()
# Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24:
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
cmake_policy(SET CMP0135 NEW)
endif()
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
if (WIN32)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/lib/")
endif()
set(RT64_STATIC TRUE)
set(RT64_SDL_WINDOW_VULKAN TRUE)
add_compile_definitions(HLSL_CPU)
add_subdirectory(${CMAKE_SOURCE_DIR}/lib/rt64 ${CMAKE_BINARY_DIR}/rt64)
# set(BUILD_SHARED_LIBS_SAVED "${BUILD_SHARED_LIBS}")
set(BUILD_SHARED_LIBS OFF)
SET(LUNASVG_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(${CMAKE_SOURCE_DIR}/lib/lunasvg)
# set(BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS_SAVED}")
SET(RMLUI_SVG_PLUGIN ON CACHE BOOL "" FORCE)
SET(RMLUI_TESTS_ENABLED OFF CACHE BOOL "" FORCE)
add_subdirectory(${CMAKE_SOURCE_DIR}/lib/RmlUi)
add_subdirectory(${CMAKE_SOURCE_DIR}/lib/N64ModernRuntime)
target_include_directories(rt64 PRIVATE ${CMAKE_BINARY_DIR}/rt64/src)
# RecompiledFuncs - Library containing the primary recompiler output
add_library(RecompiledFuncs STATIC)
target_compile_options(RecompiledFuncs PRIVATE
# -Wno-unused-but-set-variable
-fno-strict-aliasing
-Wno-unused-variable
-Wno-implicit-function-declaration
)
target_include_directories(RecompiledFuncs PRIVATE
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/lib/N64ModernRuntime/ultramodern/include
${CMAKE_SOURCE_DIR}/lib/N64ModernRuntime/librecomp/include
${CMAKE_SOURCE_DIR}/lib/N64ModernRuntime/N64Recomp/include
)
file(GLOB FUNC_C_SOURCES ${CMAKE_SOURCE_DIR}/RecompiledFuncs/*.c)
file(GLOB FUNC_CXX_SOURCES ${CMAKE_SOURCE_DIR}/RecompiledFuncs/*.cpp)
target_sources(RecompiledFuncs PRIVATE ${FUNC_C_SOURCES} ${FUNC_CXX_SOURCES})
# PatchesLib - Library containing the recompiled output for any custom function patches
add_library(PatchesLib STATIC)
target_compile_options(PatchesLib PRIVATE
# -Wno-unused-but-set-variable
-fno-strict-aliasing
-Wno-unused-variable
-Wno-implicit-function-declaration
)
target_include_directories(PatchesLib PRIVATE
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/lib/N64ModernRuntime/ultramodern/include
${CMAKE_SOURCE_DIR}/lib/N64ModernRuntime/librecomp/include
${CMAKE_SOURCE_DIR}/lib/N64ModernRuntime/N64Recomp/include
)
target_sources(PatchesLib PRIVATE
${CMAKE_SOURCE_DIR}/RecompiledPatches/patches.c
${CMAKE_SOURCE_DIR}/RecompiledPatches/patches_bin.c
)
set_source_files_properties(${CMAKE_SOURCE_DIR}/RecompiledPatches/patches.c PROPERTIES COMPILE_FLAGS -fno-strict-aliasing)
# Build patches elf
if(NOT DEFINED PATCHES_C_COMPILER)
set(PATCHES_C_COMPILER clang)
endif()
if(NOT DEFINED PATCHES_LD)
set(PATCHES_LD ld.lld)
endif()
add_custom_target(PatchesBin
COMMAND ${CMAKE_COMMAND} -E env CC=${PATCHES_C_COMPILER} LD=${PATCHES_LD} make
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/patches
BYPRODUCTS ${CMAKE_SOURCE_DIR}/patches/patches.elf
)
# Generate patches_bin.c from patches.bin
add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/RecompiledPatches/patches_bin.c
COMMAND file_to_c ${CMAKE_SOURCE_DIR}/patches/patches.bin bk_patches_bin ${CMAKE_SOURCE_DIR}/RecompiledPatches/patches_bin.c ${CMAKE_SOURCE_DIR}/RecompiledPatches/patches_bin.h
DEPENDS ${CMAKE_SOURCE_DIR}/patches/patches.bin
)
# Recompile patches elf into patches.c and patches.bin
add_custom_command(OUTPUT
${CMAKE_SOURCE_DIR}/patches/patches.bin
${CMAKE_SOURCE_DIR}/RecompiledPatches/patches.c
${CMAKE_SOURCE_DIR}/RecompiledPatches/recomp_overlays.inl
${CMAKE_SOURCE_DIR}/RecompiledPatches/funcs.h
# TODO: Look into why modifying patches requires two builds to take
COMMAND ./N64Recomp patches.toml
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
DEPENDS ${CMAKE_SOURCE_DIR}/patches/patches.elf
)
# Download controller db file for controller support via SDL2
set(GAMECONTROLLERDB_COMMIT "b1e4090b3d4266e55feb0793efa35792e05faf66")
set(GAMECONTROLLERDB_URL "https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/${GAMECONTROLLERDB_COMMIT}/gamecontrollerdb.txt")
file(DOWNLOAD ${GAMECONTROLLERDB_URL} ${CMAKE_SOURCE_DIR}/gamecontrollerdb.txt
TLS_VERIFY ON)
add_custom_target(DownloadGameControllerDB
DEPENDS ${CMAKE_SOURCE_DIR}/gamecontrollerdb.txt)
# Main executable
add_executable(BanjoRecompiled)
add_dependencies(BanjoRecompiled DownloadGameControllerDB)
set (SOURCES
${CMAKE_SOURCE_DIR}/src/main/main.cpp
${CMAKE_SOURCE_DIR}/src/main/register_overlays.cpp
${CMAKE_SOURCE_DIR}/src/main/register_patches.cpp
${CMAKE_SOURCE_DIR}/src/main/rt64_render_context.cpp
${CMAKE_SOURCE_DIR}/src/game/input.cpp
${CMAKE_SOURCE_DIR}/src/game/controls.cpp
${CMAKE_SOURCE_DIR}/src/game/config.cpp
${CMAKE_SOURCE_DIR}/src/game/debug.cpp
${CMAKE_SOURCE_DIR}/src/game/recomp_api.cpp
${CMAKE_SOURCE_DIR}/src/game/rom_decompression.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_renderer.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_state.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_launcher.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_config.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_config_sub_menu.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_color_hack.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_rml_hacks.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_elements.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_mod_details_panel.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_mod_menu.cpp
${CMAKE_SOURCE_DIR}/src/ui/ui_api.cpp
${CMAKE_SOURCE_DIR}/src/ui/util/hsv.cpp
${CMAKE_SOURCE_DIR}/src/ui/core/ui_context.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_button.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_clickable.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_container.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_element.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_image.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_label.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_radio.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_scroll_container.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_slider.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_style.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_text_input.cpp
${CMAKE_SOURCE_DIR}/src/ui/elements/ui_toggle.cpp
${CMAKE_SOURCE_DIR}/rsp/n_aspMain.cpp
${CMAKE_SOURCE_DIR}/lib/RmlUi/Backends/RmlUi_Platform_SDL.cpp
)
target_include_directories(BanjoRecompiled PRIVATE
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/lib/N64ModernRuntime/N64Recomp/include
${CMAKE_SOURCE_DIR}/lib/concurrentqueue
${CMAKE_SOURCE_DIR}/lib/GamepadMotionHelpers
${CMAKE_SOURCE_DIR}/lib/RmlUi/Include
${CMAKE_SOURCE_DIR}/lib/RmlUi/Backends
${CMAKE_SOURCE_DIR}/lib/rt64/src/contrib
${CMAKE_SOURCE_DIR}/lib/rt64/src/contrib/hlslpp/include
${CMAKE_SOURCE_DIR}/lib/rt64/src/contrib/dxc/inc
${CMAKE_SOURCE_DIR}/lib/rt64/src
${CMAKE_SOURCE_DIR}/lib/rt64/src/rhi
${CMAKE_SOURCE_DIR}/lib/rt64/src/render
${CMAKE_SOURCE_DIR}/lib/freetype-windows-binaries/include
${CMAKE_SOURCE_DIR}/lib/rt64/src/contrib/nativefiledialog-extended/src/include
${CMAKE_SOURCE_DIR}/lib/slot_map/slot_map
${CMAKE_BINARY_DIR}/shaders
${CMAKE_CURRENT_BINARY_DIR}
)
if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64")
target_compile_options(BanjoRecompiled PRIVATE
-march=nehalem
-fno-strict-aliasing
-fms-extensions
)
else()
target_compile_options(BanjoRecompiled PRIVATE
-fno-strict-aliasing
-fms-extensions
)
endif()
if (MSVC)
# Disable identical code folding, since this breaks mod function patching as multiple functions can get merged into one.
target_link_options(BanjoRecompiled PRIVATE /OPT:NOICF)
endif()
if (WIN32)
include(FetchContent)
if (DEFINED ENV{SDL2_VERSION})
set(SDL2_VERSION $ENV{SDL2_VERSION})
else()
set(SDL2_VERSION "2.30.3")
endif()
# Fetch SDL2 on windows
FetchContent_Declare(
sdl2
URL https://github.com/libsdl-org/SDL/releases/download/release-${SDL2_VERSION}/SDL2-devel-${SDL2_VERSION}-VC.zip
)
FetchContent_MakeAvailable(sdl2)
target_include_directories(BanjoRecompiled PRIVATE
${sdl2_SOURCE_DIR}/include
)
target_link_directories(BanjoRecompiled PRIVATE
${sdl2_SOURCE_DIR}/lib/x64
)
# Copy SDL2 and dxc DLLs to output folder as post build step
add_custom_command(TARGET BanjoRecompiled POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${sdl2_SOURCE_DIR}/lib/x64/SDL2.dll"
"${CMAKE_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/x64/dxil.dll"
"${CMAKE_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/x64/dxcompiler.dll"
$<TARGET_FILE_DIR:BanjoRecompiled>)
set_target_properties(
BanjoRecompiled
PROPERTIES
LINK_FLAGS_DEBUG "/SUBSYSTEM:CONSOLE"
LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"
LINK_FLAGS_RELWITHDEBINFO "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"
LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"
)
# target_sources(BanjoRecompiled PRIVATE ${CMAKE_SOURCE_DIR}/icons/app.rc)
endif()
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
find_package(SDL2 REQUIRED)
find_package(X11 REQUIRED)
add_compile_definitions("RT64_SDL_WINDOW_VULKAN")
# Generate icon_bytes.c from the app icon PNG.
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/icon_bytes.c ${CMAKE_CURRENT_BINARY_DIR}/icon_bytes.h
COMMAND file_to_c ${CMAKE_SOURCE_DIR}/icons/512.png icon_bytes ${CMAKE_CURRENT_BINARY_DIR}/icon_bytes.c ${CMAKE_CURRENT_BINARY_DIR}/icon_bytes.h
DEPENDS ${CMAKE_SOURCE_DIR}/icons/512.png
)
target_sources(BanjoRecompiled PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/icon_bytes.c)
message(STATUS "SDL2_FOUND = ${SDL2_FOUND}")
message(STATUS "SDL2_INCLUDE_DIRS = ${SDL2_INCLUDE_DIRS}")
target_include_directories(BanjoRecompiled PRIVATE ${SDL2_INCLUDE_DIRS})
message(STATUS "X11_FOUND = ${X11_FOUND}")
message(STATUS "X11_Xrandr_FOUND = ${X11_Xrandr_FOUND}")
message(STATUS "X11_INCLUDE_DIR = ${X11_INCLUDE_DIR}")
message(STATUS "X11_LIBRARIES = ${X11_LIBRARIES}")
target_include_directories(BanjoRecompiled PRIVATE ${X11_INCLUDE_DIR} ${X11_Xrandr_INCLUDE_PATH})
target_link_libraries(BanjoRecompiled PRIVATE ${X11_LIBRARIES} ${X11_Xrandr_LIB})
find_package(Freetype REQUIRED)
message(STATUS "FREETYPE_FOUND = ${FREETYPE_FOUND}")
message(STATUS "FREETYPE_INCLUDE_DIRS = ${FREETYPE_INCLUDE_DIRS}")
message(STATUS "FREETYPE_LIBRARIES = ${FREETYPE_LIBRARIES}")
include_directories(${FREETYPE_LIBRARIES})
target_link_libraries(BanjoRecompiled PRIVATE ${FREETYPE_LIBRARIES})
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED)
target_link_libraries(BanjoRecompiled PRIVATE "-latomic -static-libstdc++" ${CMAKE_DL_LIBS} Threads::Threads)
endif()
target_link_libraries(BanjoRecompiled PRIVATE
PatchesLib
RecompiledFuncs
SDL2
librecomp
ultramodern
rt64
RmlUi::Core
RmlUi::Debugger
nfd
lunasvg
)
# TODO fix the rt64 CMake script so that this doesn't need to be duplicated here
# For DXC
set (DXC_COMMON_OPTS "-I${PROJECT_SOURCE_DIR}/src")
set (DXC_DXIL_OPTS "-Wno-ignored-attributes")
set (DXC_SPV_OPTS "-spirv" "-fspv-target-env=vulkan1.0" "-fvk-use-dx-layout")
set (DXC_PS_OPTS "${DXC_COMMON_OPTS}" "-E" "PSMain" "-T ps_6_0" "-D DYNAMIC_RENDER_PARAMS")
set (DXC_VS_OPTS "${DXC_COMMON_OPTS}" "-E" "VSMain" "-T vs_6_0" "-D DYNAMIC_RENDER_PARAMS" "-fvk-invert-y")
set (DXC_CS_OPTS "${DXC_COMMON_OPTS}" "-E" "CSMain" "-T cs_6_0")
set (DXC_GS_OPTS "${DXC_COMMON_OPTS}" "-E" "GSMain" "-T gs_6_0")
set (DXC_RT_OPTS "${DXC_COMMON_OPTS}" "-D" "RT_SHADER" "-T" "lib_6_3" "-fspv-target-env=vulkan1.1spirv1.4" "-fspv-extension=SPV_KHR_ray_tracing" "-fspv-extension=SPV_EXT_descriptor_indexing")
if (${WIN32})
set (DXC "${PROJECT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/x64/dxc.exe")
add_compile_definitions(NOMINMAX)
else()
if (APPLE)
# Apple's binary is universal, so it'll work on both x86_64 and arm64
set (DXC "DYLD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/lib/arm64" "${PROJECT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/arm64/dxc-macos")
else()
if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64")
set (DXC "LD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/lib/x64" "${PROJECT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/x64/dxc")
else()
set (DXC "LD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/lib/arm64" "${PROJECT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/arm64/dxc-linux")
endif()
endif()
endif()
build_vertex_shader(BanjoRecompiled "shaders/InterfaceVS.hlsl" "shaders/InterfaceVS.hlsl")
build_pixel_shader(BanjoRecompiled "shaders/InterfacePS.hlsl" "shaders/InterfacePS.hlsl")
target_sources(BanjoRecompiled PRIVATE ${SOURCES})
set_property(TARGET BanjoRecompiled PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
+38
View File
@@ -0,0 +1,38 @@
{
"configurations": [
{
"name": "x64-Debug",
"generator": "Ninja",
"configurationType": "Debug",
"inheritEnvironments": [ "clang_cl_x64" ],
"buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "",
"ctestCommandArgs": ""
},
{
"name": "x64-Release",
"generator": "Ninja",
"configurationType": "Release",
"buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "",
"ctestCommandArgs": "",
"inheritEnvironments": [ "clang_cl_x64" ]
},
{
"name": "x64-ReleaseWithDebInfo",
"generator": "Ninja",
"configurationType": "RelWithDebInfo",
"buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "",
"ctestCommandArgs": "",
"inheritEnvironments": [ "clang_cl_x64" ],
"variables": []
}
]
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+30
View File
@@ -0,0 +1,30 @@
<template name="prompt">
<head>
</head>
<body class="prompt">
<div class="prompt__overlay" />
<div class="prompt__content-wrapper" data-if="promptOpen">
<div class="prompt__content">
<h3>{{ promptHeader }}</h3>
<p>{{ promptContent }}</p>
<div class="prompt__controls">
<button
autofocus="true"
id="prompt__confirm-button"
class="button button--success"
style="nav-left: none; nav-right: #prompt__cancel-button"
>
<div class="button__label" id="prompt__confirm-button-label">{{ promptConfirmLabel }}</div>
</button>
<button
id="prompt__cancel-button"
class="button button--error"
style="nav-right: none; nav-left: #prompt__confirm-button"
>
<div class="button__label" id="prompt__cancel-button-label">{{ promptCancelLabel }}</div>
</button>
</div>
</div>
</div>
</body>
</template>
+137
View File
@@ -0,0 +1,137 @@
<rml>
<head>
<link type="text/rcss" href="rml.rcss"/>
<link type="text/rcss" href="recomp.rcss"/>
<title>Inventory</title>
<style>
body
{
width: 100%;
height: 100%;
}
/* Hide the window icon. */
div#title_bar div#icon
{
display: none;
}
.flex-grid {
display: flex;
}
.col {
flex: 1;
text-align: center;
}
</style>
<link type="text/template" href="config_menu/general.rml" />
<link type="text/template" href="config_menu/controls.rml" />
<link type="text/template" href="config_menu/graphics.rml" />
<link type="text/template" href="config_menu/sound.rml" />
<link type="text/template" href="config_menu/mods.rml" />
<link type="text/template" href="config_menu/debug.rml" />
<link type="text/template" href="components/prompt.rml" />
</head>
<body class="window">
<!-- <handle move_target="#document"> -->
<div id="window" class="rmlui-window" style="display:flex; flex-flow: column; background-color:rgba(0,0,0,0)" onkeydown="config_keydown">
<div class="centered-page" onclick="close_config_menu_backdrop">
<div class="centered-page__modal">
<tabset class="tabs" id="config_tabset">
<tab class="tab" autofocus id="tab_general">
<div>General</div>
<div class="tab__indicator"></div>
</tab>
<panel class="config" data-model="general_model">
<template src="config-menu__general" />
</panel>
<tab class="tab" id="tab_controls">
<div>Controls</div>
<div class="tab__indicator"></div>
</tab>
<panel class="config" data-model="controls_model">
<template src="config-menu__controls" />
</panel>
<tab class="tab" id="tab_graphics">
<div>Graphics</div>
<div class="tab__indicator"></div>
</tab>
<panel class="config" data-model="graphics_model">
<template src="config-menu__graphics" />
</panel>
<tab class="tab" id="tab_sound">
<div>Sound</div>
<div class="tab__indicator"></div>
</tab>
<panel class="config" data-model="sound_options_model">
<template src="config-menu__sound" />
</panel>
<tab class="tab" id="tab_mods">
<div>Mods</div>
<div class="tab__indicator"></div>
</tab>
<panel class="config">
<template src="config-menu__mods" />
</panel>
<tab class="tab" data-model="debug_model" data-if="debug_enabled" id="tab_debug">
<div>Debug</div>
<div class="tab__indicator"></div>
</tab>
<panel class="config" data-model="debug_model">
<template src="config-menu__debug" />
</panel>
</tabset>
<div class="config__icon-buttons">
<button
class="icon-button"
onclick="open_quit_game_prompt"
id="config__quit-game-button"
>
<svg src="icons/Quit.svg" />
</button>
<button
class="icon-button"
onclick="close_config_menu"
id="config__close-menu-button"
>
<svg src="icons/X.svg" />
</button>
</div>
</div>
<div
class="centered-page__controls"
data-model="nav_help_model"
>
<label>
<span>Navigate</span>
<span class="prompt-font-sm">{{nav_help__navigate}}</span>
</label>
<label>
<span>Accept</span>
<span class="prompt-font-sm">{{nav_help__accept}}</span>
</label>
<label>
<span>Exit</span>
<span class="prompt-font-sm">{{nav_help__exit}}</span>
</label>
<!-- <label><span style="font-family:promptfont;">&#x21F3;</span> Navigate</label>
<label><span style="font-family:promptfont;">&#x21A7;</span> Accept</label> -->
</div>
</div>
<!-- <div
id="prompt-root"
data-model="prompt_model"
data-if="prompt__open"
data-alias-promptOpen="prompt__open"
data-alias-promptHeader="prompt__header"
data-alias-promptContent="prompt__content"
data-alias-promptConfirmLabel="prompt__confirmLabel"
data-alias-promptCancelLabel="prompt__cancelLabel"
data-event-click="prompt__on_click"
>
<template src="prompt"/>
</div> -->
</div>
<!-- </handle> -->
<!-- <handle size_target="#document" style="position: absolute; width: 16dp; height: 16dp; bottom: 0px; right: 0px; cursor: resize;"></handle> -->
</body>
</rml>
+360
View File
@@ -0,0 +1,360 @@
<template name="config-menu__controls">
<head>
</head>
<body>
<form class="config__form" data-attr-cur-input="cur_input_row" data-attr-cur-binding-slot="active_binding_slot">
<div class="config__header">
<div class="config__header-left">
<button
class="toggle"
id="cont_kb_toggle"
data-class-toggle--checked="input_device_is_keyboard"
onclick="toggle_input_device"
style="nav-down: #input_row_button_0_0; nav-up: #tab_controls"
>
<div class="toggle__border" />
<div class="toggle__floater" />
<div class="toggle__icons">
<div class="toggle__icon toggle__icon--left"><div>␼</div></div>
<div class="toggle__icon toggle__icon--right"><div>␽</div></div>
</div>
</button>
</div>
<div>
<button
class="button button--warning"
style="nav-down:#input_row_button_0_0"
data-event-click="reset_input_bindings_to_defaults"
>
<div class="button__label">Reset to defaults</div>
</button>
</div>
</div>
<div class="config__wrapper input-config">
<div class="input-config__horizontal-split">
<div class="input-config__mappings" data-event-mouseout="set_input_row_focus(-1)">
<div class="input-config__mappings-scroll">
<div class="input-config__mappings-wrapper">
<div
class="control-option"
data-attr-id="'input_row_' + i"
data-for="input_bindings, i : inputs.array"
data-event-mouseover="set_input_row_focus(i)"
data-class-control-option--active="get_input_enum_name(i)==cur_input_row"
data-if="!input_device_is_keyboard || (get_input_enum_name(i) != 'TOGGLE_MENU' && get_input_enum_name(i) != 'ACCEPT_MENU' && get_input_enum_name(i) != 'APPLY_MENU')"
>
<label
class="control-option__label"
>{{get_input_name(i)}}</label>
<div class="control-option__bindings">
<button
data-attr-id="'input_row_button_' + i + '_' + j"
data-event-blur="set_input_row_focus(-1)"
data-event-focus="set_input_row_focus(i)"
data-for="cur_binding, j : input_bindings"
data-event-click="set_input_binding(i,j)"
class="prompt-font control-option__binding"
data-attr-bind-slot="j"
data-attr-style="i == 0 ? 'nav-up:#cont_kb_toggle' : 'nav-up:auto'"
>
<div class="control-option__binding-recording">
<div class="control-option__binding-circle" />
<div class="control-option__binding-edge">
<svg class="control-option__binding-edge-svg" src="icons/RecordBorder.svg" />
</div>
</div>
<div class="control-option__binding-icon">{{cur_binding}}</div>
</button>
</div>
<button
data-if="get_input_enum_name(i) != 'TOGGLE_MENU' && get_input_enum_name(i) != 'ACCEPT_MENU'"
data-event-blur="set_input_row_focus(-1)"
data-event-focus="set_input_row_focus(i)"
data-event-click="clear_input_bindings(i)"
class="icon-button icon-button--error"
data-attr-style="i == 0 ? 'nav-up:#cont_kb_toggle' : 'nav-up:auto'"
>
<svg src="icons/Trash.svg" />
</button>
<button
data-if="get_input_enum_name(i) == 'TOGGLE_MENU' || get_input_enum_name(i) == 'ACCEPT_MENU'"
data-event-blur="set_input_row_focus(-1)"
data-event-focus="set_input_row_focus(i)"
data-event-click="reset_single_input_binding_to_default(i)"
class="icon-button icon-button--error"
data-attr-style="i == 0 ? 'nav-up:#cont_kb_toggle' : 'nav-up:auto'"
>
<svg src="icons/Reset.svg" />
</button>
</div>
</div>
</div>
</div>
<div class="input-config__visual-wrapper">
<div class="input-config__visual-aspect">
<div class="input-config__visual">
<!-- stick only -->
<div class="input-config__visual-stick-wrapper">
<div
class="input-viz input-config__visual-stick"
visual-input="X_AXIS_NEG X_AXIS_POS Y_AXIS_NEG Y_AXIS_POS"
>
<div class="input-viz__stick-split input-viz__stick-split--vertical">
<div class="input-viz input-viz__mappings" visual-input="Y_AXIS_POS">
<svg class="input-viz__dpad-arrow input-viz__dpad-arrow--up" src="icons/VizMap/DPadArrow.svg" />
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.Y_AXIS_POS"
>
<div>{{cur_binding}}</div>
</div>
</div>
<div class="input-viz__dpad-divider" />
<div class="input-viz input-viz__mappings" visual-input="Y_AXIS_NEG">
<svg class="input-viz__dpad-arrow input-viz__dpad-arrow--down" src="icons/VizMap/DPadArrow.svg" />
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.Y_AXIS_NEG"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
<div class="input-viz__stick-split input-viz__stick-split--horizontal">
<div class="input-viz input-viz__mappings" visual-input="X_AXIS_NEG">
<svg class="input-viz__dpad-arrow input-viz__dpad-arrow--left" src="icons/VizMap/DPadArrow.svg" />
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.X_AXIS_NEG"
>
<div>{{cur_binding}}</div>
</div>
</div>
<div class="input-viz__dpad-divider" />
<div class="input-viz input-viz__mappings" visual-input="X_AXIS_POS">
<svg class="input-viz__dpad-arrow input-viz__dpad-arrow--right" src="icons/VizMap/DPadArrow.svg" />
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.X_AXIS_POS"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
</div>
</div>
<!-- top half -->
<div class="input-config__visual-half">
<div class="input-config__visual-quarter-left">
<div
class="input-viz input-viz__dpad"
visual-input="DPAD_UP DPAD_DOWN DPAD_LEFT DPAD_RIGHT"
>
<svg src="icons/VizMap/DPad.svg" />
<div class="input-viz__dpad-split input-viz__dpad-split--vertical">
<div class="input-viz input-viz__mappings" visual-input="DPAD_UP">
<svg class="input-viz__dpad-arrow input-viz__dpad-arrow--up" src="icons/VizMap/DPadArrow.svg" />
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.DPAD_UP"
>
<div>{{cur_binding}}</div>
</div>
</div>
<div class="input-viz__dpad-divider" />
<div class="input-viz input-viz__mappings" visual-input="DPAD_DOWN">
<svg class="input-viz__dpad-arrow input-viz__dpad-arrow--down" src="icons/VizMap/DPadArrow.svg" />
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.DPAD_DOWN"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
<div class="input-viz__dpad-split input-viz__dpad-split--horizontal">
<div class="input-viz input-viz__mappings" visual-input="DPAD_LEFT">
<svg class="input-viz__dpad-arrow input-viz__dpad-arrow--left" src="icons/VizMap/DPadArrow.svg" />
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.DPAD_LEFT"
>
<div>{{cur_binding}}</div>
</div>
</div>
<div class="input-viz__dpad-divider" />
<div class="input-viz input-viz__mappings" visual-input="DPAD_RIGHT">
<svg class="input-viz__dpad-arrow input-viz__dpad-arrow--right" src="icons/VizMap/DPadArrow.svg" />
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.DPAD_RIGHT"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
</div>
</div>
<div class="input-config__visual-quarter-right">
<div class="input-config__main-buttons">
<div
class="input-viz input-viz__button input-viz__button--sm input-viz__button--Start"
visual-input="START"
>
<svg src="icons/VizMap/ButtonSmall.svg" />
<div class="input-viz__mappings">
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.START"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
<div
class="input-viz input-viz__button input-viz__button--lg input-viz__button--B"
visual-input="B"
>
<svg src="icons/VizMap/ButtonLarge.svg" />
<div class="input-viz__mappings">
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.B"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
<div
class="input-viz input-viz__button input-viz__button--lg input-viz__button--A"
visual-input="A"
>
<svg src="icons/VizMap/ButtonLarge.svg" />
<div class="input-viz__mappings">
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.A"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
</div>
<div class="input-config__c-buttons">
<div class="input-config__c-buttons-lr">
<div
class="input-viz input-viz__button input-viz__button--md input-viz__button--C"
visual-input="C_LEFT"
>
<svg src="icons/VizMap/ButtonMedium.svg" />
<div class="input-viz__mappings">
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.C_LEFT"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
<div
class="input-viz input-viz__button input-viz__button--md input-viz__button--C"
visual-input="C_RIGHT"
>
<svg src="icons/VizMap/ButtonMedium.svg" />
<div class="input-viz__mappings">
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.C_RIGHT"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
</div>
<div class="input-config__c-buttons-du">
<div
class="input-viz input-viz__button input-viz__button--md input-viz__button--C"
visual-input="C_DOWN"
>
<svg src="icons/VizMap/ButtonMedium.svg" />
<div class="input-viz__mappings">
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.C_DOWN"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
<div
class="input-viz input-viz__button input-viz__button--sm input-viz__button--C"
visual-input="C_UP"
>
<svg src="icons/VizMap/ButtonMedium.svg" />
<div class="input-viz__mappings">
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.C_UP"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- bottom half -->
<div class="input-config__visual-half input-config__visual-half--bottom">
<div
class="input-viz input-viz__Z"
visual-input="Z"
>
<svg src="icons/VizMap/Target.svg" />
<div class="input-viz__mappings">
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.Z"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
<div
class="input-viz input-viz__R"
visual-input="R"
>
<svg src="icons/VizMap/Shield.svg" />
<div class="input-viz__mappings">
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.R"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
<div
class="input-viz input-viz__L"
visual-input="L"
>
<svg src="icons/VizMap/Map.svg" />
<div class="input-viz__mappings">
<div
class="input-config__visual-mapping"
data-for="cur_binding, i : inputs.L"
>
<div>{{cur_binding}}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
</body>
</template>
+13
View File
@@ -0,0 +1,13 @@
<template name="config-menu__debug">
<head>
</head>
<body>
<form class="config__form">
<div class="config__wrapper">
<div class="config-debug">
</div>
</div>
</form>
</body>
</template>
+297
View File
@@ -0,0 +1,297 @@
<template name="config-menu__general">
<head>
</head>
<body>
<form class="config__form" id="conf-general__form">
<div class="config__hz-wrapper" id="conf-general__hz-wrapper">
<!-- Options -->
<div class="config__wrapper" data-event-mouseout="set_cur_config_index(-1)" id="conf-general__wrapper">
<!-- rumble strength -->
<div class="config-option" data-event-mouseover="set_cur_config_index(1)">
<label class="config-option__title">Rumble Strength</label>
<div class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{rumble_strength}}%</label>
<input
class="nav-vert"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(1)"
id="rumble_strength_input"
type="range"
min="0"
max="100"
style="flex: 1; margin: 0dp;"
data-value="rumble_strength"
/>
</div>
</div>
<!-- gyro sensitivity -->
<div class="config-option" data-event-mouseover="set_cur_config_index(2)">
<label class="config-option__title">Gyro Sensitivity</label>
<div class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{gyro_sensitivity}}%</label>
<input
class="nav-vert"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(2)"
id="gyro_sensitivity_input"
type="range"
min="0"
max="100"
style="flex: 1; margin: 0dp;"
data-value="gyro_sensitivity"
/>
</div>
</div>
<!-- mouse sensitivity -->
<div class="config-option" data-event-mouseover="set_cur_config_index(3)">
<label class="config-option__title">Mouse Sensitivity</label>
<div class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{mouse_sensitivity}}%</label>
<input
class="nav-vert"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(3)"
id="mouse_sensitivity_input"
type="range"
min="0"
max="100"
style="flex: 1; margin: 0dp;"
data-value="mouse_sensitivity"
/>
</div>
</div>
<!-- joystick deadzone -->
<div class="config-option" data-event-mouseover="set_cur_config_index(4)">
<label class="config-option__title">Joystick Deadzone</label>
<div class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{joystick_deadzone}}%</label>
<input
class="nav-vert"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(4)"
id="joystick_deadzone_input"
type="range"
min="0"
max="100"
style="flex: 1; margin: 0dp; nav-down: #bg_input_enabled"
data-value="joystick_deadzone"
/>
</div>
</div>
<!-- background input -->
<div class="config-option" data-event-mouseover="set_cur_config_index(5)" id="conf-general__Background-Input">
<label class="config-option__title">Background Input</label>
<div class="config-option__list">
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(5)"
name="background_input_mode"
data-checked="background_input_mode"
value="On"
id="bg_input_enabled"
style="nav-up: #joystick_deadzone_input; nav-down: #camera_inversion_none"
/>
<label class="config-option__tab-label" for="bg_input_enabled">On</label>
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(5)"
name="background_input_mode"
data-checked="background_input_mode"
value="Off"
id="bg_input_disabled"
style="nav-up: #joystick_deadzone_input; nav-down: #camera_inversion_x"
/>
<label class="config-option__tab-label" for="bg_input_disabled">Off</label>
</div>
</div>
<!-- camera inversion -->
<div class="config-option" data-event-mouseover="set_cur_config_index(7)">
<label class="config-option__title">Aiming Camera Mode</label>
<div class="config-option__list">
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(7)"
name="camera_invert_mode"
data-checked="camera_invert_mode"
value="InvertNone"
id="camera_inversion_none"
style="nav-up: #bg_input_enabled; nav-down: #analog_cam_enabled"
/>
<label class="config-option__tab-label" for="camera_inversion_none">None</label>
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(7)"
name="camera_invert_mode"
data-checked="camera_invert_mode"
value="InvertX"
id="camera_inversion_x"
style="nav-up: #bg_input_disabled; nav-down: #analog_cam_disabled"
/>
<label class="config-option__tab-label" for="camera_inversion_x">Invert X</label>
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(7)"
name="camera_invert_mode"
data-checked="camera_invert_mode"
value="InvertY"
id="camera_inversion_y"
style="nav-up: #bg_input_disabled; nav-down: #analog_cam_disabled"
/>
<label class="config-option__tab-label" for="camera_inversion_y">Invert Y</label>
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(7)"
name="camera_invert_mode"
data-checked="camera_invert_mode"
value="InvertBoth"
id="camera_inversion_both"
style="nav-up: #bg_input_disabled; nav-down: #analog_cam_disabled"
/>
<label class="config-option__tab-label" for="camera_inversion_both">Invert Both</label>
</div>
</div>
<!-- analog camera -->
<div class="config-option" data-event-mouseover="set_cur_config_index(8)">
<label class="config-option__title">Analog Camera</label>
<div class="config-option__list">
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(8)"
name="analog_cam_mode"
data-checked="analog_cam_mode"
value="On"
id="analog_cam_enabled"
style="nav-up: #camera_inversion_none; nav-down: #analog_camera_inversion_none"
/>
<label class="config-option__tab-label" for="analog_cam_enabled">On</label>
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(8)"
name="analog_cam_mode"
data-checked="analog_cam_mode"
value="Off"
id="analog_cam_disabled"
style="nav-up: #camera_inversion_x; nav-down: #analog_camera_inversion_x"
/>
<label class="config-option__tab-label" for="analog_cam_disabled">Off</label>
</div>
</div>
<!-- analog camera inversion -->
<div class="config-option" data-event-mouseover="set_cur_config_index(9)">
<label class="config-option__title">Analog Camera Mode</label>
<div class="config-option__list">
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(9)"
name="analog_camera_invert_mode"
data-checked="analog_camera_invert_mode"
value="InvertNone"
id="analog_camera_inversion_none"
style="nav-up: #analog_cam_enabled;"
/>
<label class="config-option__tab-label" for="analog_camera_inversion_none">None</label>
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(9)"
name="analog_camera_invert_mode"
data-checked="analog_camera_invert_mode"
value="InvertX"
id="analog_camera_inversion_x"
style="nav-up: #analog_cam_disabled;"
/>
<label class="config-option__tab-label" for="analog_camera_inversion_x">Invert X</label>
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(9)"
name="analog_camera_invert_mode"
data-checked="analog_camera_invert_mode"
value="InvertY"
id="analog_camera_inversion_y"
style="nav-up: #analog_cam_disabled;"
/>
<label class="config-option__tab-label" for="analog_camera_inversion_y">Invert Y</label>
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(9)"
name="analog_camera_invert_mode"
data-checked="analog_camera_invert_mode"
value="InvertBoth"
id="analog_camera_inversion_both"
style="nav-up: #analog_cam_disabled;"
/>
<label class="config-option__tab-label" for="analog_camera_inversion_both">Invert Both</label>
</div>
</div>
</div>
<!-- Descriptions -->
<div class="config__wrapper">
<p data-if="cur_config_index == 1">
Controls the strength of rumble when using a controller that supports it. <b>Setting this to zero will disable rumble.</b>
</p>
<p data-if="cur_config_index == 2">
Controls the sensitivity of gyro aiming when using items in first person for controllers that support it. <b>Setting this to zero will disable gyro.</b>
<br />
<br />
<b>Note: To recalibrate controller gyro, set the controller down on a still, flat surface for 5 seconds.</b>
</p>
<p data-if="cur_config_index == 3">
Controls the sensitivity of mouse aiming when using items in first person. <b>Setting this to zero will disable mouse aiming.</b>
<br />
<br />
<b>Note: This option does not allow mouse buttons to activate items. Mouse aiming is intended to be used with inputs that are mapped to mouse movement, such as gyro on Steam Deck.</b>
</p>
<p data-if="cur_config_index == 4">
Applies a deadzone to joystick inputs.
</p>
<p data-if="cur_config_index == 5">
Allows the game to read controller input when out of focus.
<br/>
<b>This setting does not affect keyboard input.</b>
</p>
<p data-if="cur_config_index == 7">
Inverts the camera controls for first-person aiming. <b>Invert Y</b> is the default and matches the original game.
</p>
<p data-if="cur_config_index == 8">
Enables an analog "free" camera similar to later entries in the series that's mapped to the right analog stick on the controller.
<br/>
<br/>
When you move the right stick, the camera will enter free mode and stop centering behind Link. Press the <b>Target</b> button at any time to go back into the normal camera mode. The camera will also return to normal mode after a cutscene plays or when you move between areas.
<br/>
<br/>
This option also enables right stick control while looking and aiming.
</p>
<p data-if="cur_config_index == 9">
Inverts the camera controls for the analog camera if it's enabled. <b>None</b> is the default.
</p>
</div>
</div>
</form>
</body>
</template>
+325
View File
@@ -0,0 +1,325 @@
<template name="config-menu__graphics">
<head>
</head>
<body>
<form class="config__form">
<div class="config__hz-wrapper">
<div class="config__wrapper" data-event-mouseout="set_cur_config_index(-1)">
<div class="config-option" data-event-mouseover="set_cur_config_index(0)">
<label class="config-option__title">Resolution</label>
<div class="config-option__list">
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(0)"
name="resolution"
data-checked="res_option"
value="Original"
id="res_original"
style="nav-up:#tab_graphics; nav-down: #ds_windowed"
data-attr-style="res_option == 'Auto' ? 'nav-up:#tab_graphics; nav-down: #ar_original' : 'nav-up:#tab_graphics; nav-down: #ds_windowed'"
/>
<label class="config-option__tab-label" for="res_original">Original</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(0)"
name="resolution"
data-checked="res_option"
value="Original2x"
id="res_2x"
style="nav-up:#tab_graphics; nav-down: #ds_2x"
data-attr-style="res_option == 'Auto' ? 'nav-up:#tab_graphics; nav-down: #ar_expand' : 'nav-up:#tab_graphics; nav-down: #ds_2x'"
/>
<label class="config-option__tab-label" for="res_2x">Original 2x</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(0)"
name="resolution"
data-checked="res_option"
value="Auto"
id="res_auto"
style="nav-up:#tab_graphics; nav-down: #ds_4x"
data-attr-style="res_option == 'Auto' ? 'nav-up:#tab_graphics; nav-down: #ar_expand' : 'nav-up:#tab_graphics; nav-down: #ds_4x'"
/>
<label class="config-option__tab-label" for="res_auto">Auto</label>
</div>
</div>
<div class="config-option" data-event-mouseover="set_cur_config_index(1)">
<label class="config-option__title">Downsampling Quality</label>
<div class="config-option__list">
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(1)"
name="downsampling"
data-attrif-disabled="res_option == 'Auto'"
data-checked="ds_option"
value="1"
id="ds_windowed"
style="nav-up: #res_original; nav-down: #ar_original"
/>
<label class="config-option__tab-label" for="ds_windowed">Off</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(1)"
name="downsampling"
data-attrif-disabled="res_option == 'Auto'"
data-checked="ds_option"
value="2"
id="ds_2x"
style="nav-up: #res_2x; nav-down: #ar_expand"
/>
<label class="config-option__tab-label" for="ds_2x">2x</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(1)"
name="downsampling"
data-attrif-disabled="res_option == 'Auto'"
data-checked="ds_option"
value="4"
id="ds_4x"
style="nav-up: #res_auto; nav-down: #ar_expand"
/>
<label class="config-option__tab-label" for="ds_4x">4x</label>
<div class="config-option__details">{{ds_info}}</div>
</div>
</div>
<div class="config-option" data-event-mouseover="set_cur_config_index(2)">
<label class="config-option__title">Aspect Ratio</label>
<div class="config-option__list">
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(2)"
name="aspectratio"
data-checked="ar_option"
value="Original"
id="ar_original"
style="nav-up: #ds_windowed; nav-down: #wm_windowed"
data-attr-style="res_option == 'Auto' ? 'nav-up:#res_original; nav-down: #wm_windowed' : 'nav-up:#ds_windowed; nav-down: #wm_windowed'"
/>
<label class="config-option__tab-label" for="ar_original">Original</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(2)"
name="aspectratio"
data-checked="ar_option"
value="Expand"
id="ar_expand"
style="nav-up: #ds_2x; nav-down: #wm_fullscreen"
data-attr-style="res_option == 'Auto' ? 'nav-up:#res_2x; nav-down: #wm_fullscreen' : 'nav-up:#ds_2x; nav-down: #wm_fullscreen'"
/>
<label class="config-option__tab-label" for="ar_expand">Expand</label>
</div>
</div>
<div class="config-option" data-event-mouseover="set_cur_config_index(3)">
<label class="config-option__title">Window Mode</label>
<div class="config-option__list">
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(3)"
name="windowmode"
data-checked="wm_option"
value="Windowed"
id="wm_windowed"
style="nav-up: #ar_original; nav-down: #rr_original"
/>
<label class="config-option__tab-label" for="wm_windowed">Windowed</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(3)"
name="windowmode"
data-checked="wm_option"
value="Fullscreen"
id="wm_fullscreen"
style="nav-up: #ar_expand; nav-down: #rr_display"
/>
<label class="config-option__tab-label" for="wm_fullscreen">Fullscreen</label>
</div>
</div>
<div class="config-option" data-event-mouseover="set_cur_config_index(4)">
<label class="config-option__title">Framerate</label>
<div class="config-option__list">
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(4)"
name="refreshrate"
data-checked="rr_option"
value="Original"
id="rr_original"
data-attr-style="rr_option=='Manual' ? 'nav-up: #wm_windowed; nav-down: #rr_manual_input' : 'nav-up: #wm_windowed; nav-down: #msaa_none'"
/>
<label class="config-option__tab-label" for="rr_original">Original</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(4)"
name="refreshrate"
data-checked="rr_option"
value="Display"
id="rr_display"
style="nav-up: #wm_fullscreen"
data-style-nav-down="rr_option=='Manual' ? '#rr_manual_input' : (msaa2x_supported ? '#msaa_2x' : '#msaa_none')"
/>
<label class="config-option__tab-label" for="rr_display">Display</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(4)"
name="refreshrate"
data-checked="rr_option"
value="Manual"
id="rr_manual"
style="nav-up: #wm_fullscreen"
data-style-nav-down="rr_option=='Manual' ? '#rr_manual_input' : (msaa4x_supported ? '#msaa_4x' : (msaa2x_supported ? '#msaa_2x' : '#msaa_none'))"
/>
<label class="config-option__tab-label" for="rr_manual">Manual</label>
</div>
<div data-if="rr_option=='Manual'" class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{rr_manual_value}}</label>
<input
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(4)"
id="rr_manual_input"
type="range"
min="20"
max="360"
style="flex:1;margin: 0dp;nav-up:#rr_manual;nav-down:#msaa_none;"
data-value="rr_manual_value"
/>
</div>
</div>
<div class="config-option" data-event-mouseover="set_cur_config_index(5)">
<label class="config-option__title">MS Anti-Aliasing</label>
<div class="config-option__list">
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(5)"
name="antialiasing"
data-checked="msaa_option"
value="None"
id="msaa_none"
data-attr-style="rr_option=='Manual' ? 'nav-up: #rr_manual_input; nav-down: #hr_original' : 'nav-up: #rr_original; nav-down: #hr_original'"
/>
<label class="config-option__tab-label" for="msaa_none">None</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(5)"
name="antialiasing"
data-attrif-disabled="!msaa2x_supported"
data-checked="msaa_option"
value="MSAA2X"
id="msaa_2x"
data-attr-style="rr_option=='Manual' ? 'nav-up: #rr_manual_input; nav-down: #hr_16_9' : 'nav-up: #rr_display; nav-down: #hr_16_9'"
data-style-nav-right="msaa4x_supported ? '#msaa_4x' : 'none'"
/>
<label class="config-option__tab-label" for="msaa_2x">2x</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(5)"
name="antialiasing"
data-attrif-disabled="!msaa4x_supported"
data-checked="msaa_option"
value="MSAA4X"
id="msaa_4x"
data-attr-style="rr_option=='Manual' ? 'nav-up: #rr_manual_input; nav-down: #hr_full' : 'nav-up: #rr_manual; nav-down: #hr_full'"
/>
<label class="config-option__tab-label" for="msaa_4x">4x</label>
<div class="config-option__details" data-if="!sample_positions_supported">Not available (missing sample positions support)</div>
</div>
</div>
<div class="config-option" data-event-mouseover="set_cur_config_index(6)">
<label class="config-option__title">HUD Placement</label>
<div class="config-option__list">
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(6)"
name="hr-option"
data-checked="hr_option"
value="Original"
id="hr_original"
style="nav-up: #msaa_none; nav-down: #apply_button"
/>
<label class="config-option__tab-label" for="hr_original">Original</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(6)"
name="hr-option"
data-checked="hr_option"
value="Clamp16x9"
id="hr_16_9"
style="nav-up: #msaa_2x; nav-down: #apply_button"
data-style-nav-up="msaa2x_supported ? '#msaa_2x' : '#msaa_none'"
/>
<label class="config-option__tab-label" for="hr_16_9">16:9</label>
<input type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(6)"
name="hr-option"
data-checked="hr_option"
value="Full"
id="hr_full"
style="nav-up: #msaa_4x; nav-down: #apply_button"
data-style-nav-up="msaa4x_supported ? '#msaa_4x' : (msaa2x_supported ? '#msaa_2x' : '#msaa_none')"
/>
<label class="config-option__tab-label" for="hr_full">Expand</label>
</div>
</div>
</div>
<div class="config__wrapper">
<p data-if="cur_config_index == 0">
Sets the output resolution of the game. <b>Original</b> matches the game's original 240p resolution. <b>Original 2x</b> will render at 480p. <b>Auto</b> will scale based on the game window's resolution.
</p>
<p data-if="cur_config_index == 1">
Renders at a higher resolution and scales it down to the output resolution for increased quality. Only available in <b>Original</b> and <b>Original 2x</b> resolution.
<br />
<br />
Note: <b>4x</b> downsampling quality at <b>Original 2x</b> resolution may cause performance issues on low end devices, as it will cause the game to render <i>at almost 4k internal resolution</i>.
</p>
<p data-if="cur_config_index == 2">
Sets the horizontal aspect ratio. <b>Original</b> uses the game's original 4:3 aspect ratio. <b>Expand</b> will adjust to match the game window's aspect ratio.
</p>
<p data-if="cur_config_index == 3">
Sets whether the game should display <b>Windowed</b> or <b>Fullscreen</b>. You can also use <b>F11</b> or <b>Alt + Enter</b> to toggle this option.
</p>
<p data-if="cur_config_index == 4">
Sets the game's output framerate. This option does not affect gameplay.
<br />
<br />
Note: If you have issues with <b>Display</b> mode while using an external frame limiter, use <b>Manual</b> mode instead and configure it to that same frame limit.
<br />
<br />
<b>Detected display refresh rate: {{display_refresh_rate}}hz</b>
</p>
<p data-if="cur_config_index == 5">
Sets the multisample anti-aliasing (MSAA) quality level. This reduces jagged edges in the final image at the expense of rendering performance.
<br />
<br />
<b>Note: This option won't be available if your GPU does not support programmable MSAA sample positions, as it is currently required to avoid rendering glitches.</b>
</p>
<p data-if="cur_config_index == 6">
Adjusts the placement of HUD elements to fit the selected aspect ratio. <b>Expand</b> will use the aspect ratio of the game's output window.
</p>
</div>
</div>
<div class="config__footer">
<!-- this empty div makes sure Apply button gets right aligned -->
<div />
<div>
<button
class="button button--secondary"
nav-return="rr_manual"
data-attrif-disabled="!options_changed"
onclick="apply_options"
id="apply_button"
style="nav-up:#hr_original"
>
<div class="button__label">Apply<span class="prompt-font-sm">{{gfx_help__apply}}</span></div>
</button>
</div>
</div>
</form>
</body>
</template>
+9
View File
@@ -0,0 +1,9 @@
<template name="config-menu__mods">
<head>
</head>
<body>
<form class="config__form">
<recomp-mod-menu id="menu_mods" />
</form>
</body>
</template>
+89
View File
@@ -0,0 +1,89 @@
<template name="config-menu__sound">
<head>
</head>
<body>
<form class="config__form">
<div class="config__hz-wrapper">
<!-- Options -->
<div class="config__wrapper" data-event-mouseout="set_cur_config_index(-1)">
<div class="config-option" data-event-mouseover="set_cur_config_index(0)">
<label class="config-option__title">Main Volume</label>
<div class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{main_volume}}%</label>
<input
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(0)"
class="nav-vert"
id="main_volume_input"
type="range"
min="0"
max="100"
style="flex: 1; margin: 0dp; nav-up: #tab_sound; nav-down: #bgm_volume_input;"
data-value="main_volume"
/>
</div>
</div>
<div class="config-option" data-event-mouseover="set_cur_config_index(1)">
<label class="config-option__title">Background Music Volume</label>
<div class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{bgm_volume}}%</label>
<input
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(1)"
class="nav-vert"
id="bgm_volume_input"
type="range"
min="0"
max="100"
style="flex: 1; margin: 0dp; nav-up: #main_volume_input; nav-down: #lhb_on;"
data-value="bgm_volume"
/>
</div>
</div>
<div class="config-option" data-event-mouseover="set_cur_config_index(2)">
<label class="config-option__title">Low Health Beeps</label>
<div class="config-option__list">
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(2)"
name="lhb"
data-checked="low_health_beeps_enabled"
value="1"
id="lhb_on"
style="nav-up: #bgm_volume_input"
/>
<label class="config-option__tab-label" for="lhb_on">On</label>
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(2)"
name="lhb"
data-checked="low_health_beeps_enabled"
value="0"
id="lhb_off"
style="nav-up: #bgm_volume_input"
/>
<label class="config-option__tab-label" for="lhb_off">Off</label>
</div>
</div>
</div>
<!-- Descriptions -->
<div class="config__wrapper">
<p data-if="cur_config_index == 0">
Controls the main volume of the game.
</p>
<p data-if="cur_config_index == 1">
Controls the overall volume of background music.
</p>
<p data-if="cur_config_index == 2">
Toggles whether or not the low-health beeping sound plays.
</p>
</div>
</div>
</form>
</body>
</template>
+70
View File
@@ -0,0 +1,70 @@
<rml>
<head>
<link type="text/rcss" href="rml.rcss"/>
<link type="text/rcss" href="recomp.rcss"/>
<title>Inventory</title>
<style>
body
{
width: 100%;
height: 100%;
}
/* Hide the window icon. */
div#title_bar div#icon
{
display: none;
}
.flex-grid {
display: flex;
}
.col {
flex: 1;
text-align: center;
}
</style>
</head>
<body class="window">
<!-- <handle move_target="#document"> -->
<div id="window" class="rmlui-window" style="display:flex; flex-flow: column; background-color:rgba(0,0,0,0)" onkeydown="config_keydown">
<div class="centered-page" onclick="close_config_menu_backdrop">
<div class="centered-page__modal">
<div class="config__icon-buttons">
<button
class="icon-button"
onclick="open_quit_game_prompt"
id="config__quit-game-button"
>
<svg src="icons/Quit.svg" />
</button>
<button
class="icon-button"
onclick="close_config_menu"
id="config__close-menu-button"
>
<svg src="icons/X.svg" />
</button>
</div>
<recomp-config-sub-menu id="config_sub_menu" />
</div>
<div
class="centered-page__controls"
data-model="nav_help_model"
>
<label>
<span>Navigate</span>
<span class="prompt-font-sm">{{nav_help__navigate}}</span>
</label>
<label>
<span>Accept</span>
<span class="prompt-font-sm">{{nav_help__accept}}</span>
</label>
<label>
<span>Exit</span>
<span class="prompt-font-sm">{{nav_help__exit}}</span>
</label>
</div>
</div>
</div>
</body>
</rml>
+5
View File
@@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28 16L16 28" stroke="#FFFFFF" stroke-width="8" stroke-linecap="round"/>
<path d="M16 4L28 16" stroke="#FFFFFF" stroke-width="8" stroke-linecap="round"/>
<path d="M4 16H28" stroke="#FFFFFF" stroke-width="8" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 356 B

+12
View File
@@ -0,0 +1,12 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_101_783)">
<path d="M16 4V28" stroke="#FFFFFF" stroke-width="8" stroke-linecap="round" />
<path d="M4 16H28" stroke="#FFFFFF" stroke-width="8" stroke-linecap="round" />
</g>
<defs>
<clipPath id="clip0_101_783">
<rect width="32" height="32" fill="white" />
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 469 B

Some files were not shown because too many files have changed in this diff Show More