Initial boot
@@ -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
|
||||
@@ -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}")
|
||||
@@ -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": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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;">⇳</span> Navigate</label>
|
||||
<label><span style="font-family:promptfont;">↧</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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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 |
@@ -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 |
@@ -0,0 +1,11 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M29 16L25 21" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M25 11L29 16" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M12 16L27 16" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M7 5L20 5" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M7 27L7 5" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M7 27L20 27" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M20 27V22" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M20 10V5" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 781 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="20" cy="20" r="18" stroke="#FFFFFF" stroke-opacity="1.0" stroke-width="3"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 195 B |
@@ -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="M27.6949 10.3162C25.5859 5.98481 21.1415 3 16 3C8.8203 3 3 8.8203 3 16C3 23.1797 8.8203 29 16 29C21.1415 29 25.5859 26.0152 27.6949 21.6838" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M29.052 11.0519V5.0519" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M29.052 11.0519H23.052" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 555 B |
@@ -0,0 +1,8 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M29 5L3 5" stroke="#ffffff" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M8 29L6 7" stroke="#ffffff" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M24 29L26 7" stroke="#ffffff" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M12 3L20 3" stroke="#ffffff" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M8 29L24 29" stroke="#ffffff" stroke-width="4" stroke-linecap="round"/>
|
||||
<path d="M10.4403 25.2837L9.12975 9.55699C9.0599 8.71884 9.72133 8 10.5624 8C11.3564 8 12 8.64364 12 9.43761V25.2188C12 25.6502 11.6502 26 11.2188 26C10.8125 26 10.474 25.6886 10.4403 25.2837Z" fill="#F2F2F2"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 738 B |
@@ -0,0 +1,5 @@
|
||||
<svg width="84" height="84" viewBox="0 0 84 84" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="42" cy="42" r="42" fill="#FFFFFF" fill-opacity="0.2"/>
|
||||
<circle cx="42" cy="42" r="40" stroke="#FFFFFF" stroke-opacity="0.8" stroke-width="3"/>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 270 B |
@@ -0,0 +1,4 @@
|
||||
<svg width="76" height="76" viewBox="0 0 76 76" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="38" cy="38" r="38" fill="#FFFFFF" fill-opacity="0.2"/>
|
||||
<circle cx="38" cy="38" r="36" stroke="#FFFFFF" stroke-opacity="0.8" stroke-width="3"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 266 B |
@@ -0,0 +1,5 @@
|
||||
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="32" cy="32" r="32" fill="#FFFFFF" fill-opacity="0.2"/>
|
||||
<circle cx="32" cy="32" r="30" stroke="#FFFFFF" stroke-opacity="0.8" stroke-width="3"/>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 270 B |
@@ -0,0 +1,10 @@
|
||||
<svg width="192" height="192" viewBox="0 0 192 192" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M69.033 192C66.6344 192 64.6805 190.046 64.6805 187.648V133.706C64.6805 130.189 61.817 127.333 58.3068 127.333H4.35246C1.95389 127.333 0 125.379 0 122.981V69.0392C0 66.6408 1.95389 64.6872 4.35246 64.6872H58.3C61.817 64.6872 64.6738 61.824 64.6738 58.3141V4.352C64.6738 1.95368 66.6276 0 69.0262 0H122.974C125.372 0 127.326 1.95368 127.326 4.352V58.2939C127.326 61.8105 130.19 64.6669 133.7 64.6669H187.648C190.046 64.6669 192 66.6206 192 69.019V122.961C192 125.359 190.046 127.313 187.648 127.313H133.7C130.183 127.313 127.326 130.176 127.326 133.686V187.628C127.326 190.026 125.372 191.98 122.974 191.98H69.0262L69.033 192Z"
|
||||
fill="#FFFFFF" fill-opacity="0.1" />
|
||||
<path
|
||||
d="M69.0262 190.48H68.6932C67.2818 190.311 66.1805 189.103 66.1805 187.648V133.706C66.1805 129.36 62.6443 125.833 58.3068 125.833H4.35246C2.78217 125.833 1.5 124.551 1.5 122.981V69.0392C1.5 67.4694 2.78217 66.1872 4.35246 66.1872H58.3C62.6463 66.1872 66.1738 62.6515 66.1738 58.3141V4.352C66.1738 2.78226 67.4559 1.5 69.0262 1.5H122.974C124.544 1.5 125.826 2.78226 125.826 4.352V58.2939C125.826 62.6401 129.362 66.1669 133.7 66.1669H187.648C189.218 66.1669 190.5 67.4492 190.5 69.019V122.961C190.5 124.531 189.218 125.813 187.648 125.813H133.7C129.354 125.813 125.826 129.348 125.826 133.686V187.628C125.826 189.198 124.544 190.48 122.974 190.48H69.0262Z"
|
||||
stroke="#FFFFFF" stroke-opacity="0.3" stroke-width="3" />
|
||||
<circle cx="96" cy="96" r="20" fill="#FFFFFF" fill-opacity="0.1" />
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,7 @@
|
||||
<!-- Facing up by default, and positioned right against edge -->
|
||||
<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M27.4019 4.5C28.5566 2.5 31.4434 2.5 32.5981 4.5L53.3827 40.5C54.5374 42.5 53.094 45 50.7846 45H9.21539C6.90599 45 5.46261 42.5 6.61731 40.5L27.4019 4.5Z"
|
||||
fill="#ffffff" fill-opacity="0.2" />
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 394 B |
@@ -0,0 +1,4 @@
|
||||
<svg width="136" height="136" viewBox="0 0 136 136" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="136" height="136" rx="8" fill="#ffffff" fill-opacity="0.2"/>
|
||||
<rect x="1.5" y="1.5" width="133" height="133" rx="6.5" stroke="#ffffff" stroke-opacity="0.8" stroke-width="3"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 302 B |
@@ -0,0 +1,19 @@
|
||||
<svg width="96" height="96" viewBox="0 0 96 96" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_162_1238)">
|
||||
<mask id="path-1-inside-1_162_1238" fill="white">
|
||||
<path
|
||||
d="M48.011 0.0243377C43.618 3.24908 38.8843 6.57117 33.2015 9.78375C24.3182 14.7973 15.9217 18.3628 8.59609 20.9304C7.91464 27.8058 9.89816 53.4821 19.256 69.3137C28.6138 85.1454 41.671 92.5684 48.011 96V95.9757C54.3388 92.544 67.3229 85.2306 76.7416 69.2894C86.1603 53.3482 88.083 27.7815 87.4015 20.9061C80.0759 18.3384 71.6794 14.773 62.7961 9.75941C57.1133 6.54684 52.3796 3.22474 47.9866 0" />
|
||||
</mask>
|
||||
<path
|
||||
d="M48.011 0.0243377C43.618 3.24908 38.8843 6.57117 33.2015 9.78375C24.3182 14.7973 15.9217 18.3628 8.59609 20.9304C7.91464 27.8058 9.89816 53.4821 19.256 69.3137C28.6138 85.1454 41.671 92.5684 48.011 96V95.9757C54.3388 92.544 67.3229 85.2306 76.7416 69.2894C86.1603 53.3482 88.083 27.7815 87.4015 20.9061C80.0759 18.3384 71.6794 14.773 62.7961 9.75941C57.1133 6.54684 52.3796 3.22474 47.9866 0"
|
||||
fill="#3333FF" fill-opacity="0.2" />
|
||||
<path
|
||||
d="M33.2015 9.78375L34.676 12.3964L34.6778 12.3953L33.2015 9.78375ZM8.59609 20.9304L7.60378 18.0993L5.79931 18.7317L5.61072 20.6345L8.59609 20.9304ZM48.011 96L46.5829 98.6383L51.011 101.035V96H48.011ZM48.011 95.9757L46.5808 93.3385L45.011 94.1898V95.9757H48.011ZM87.4015 20.9061L90.3869 20.6102L90.1983 18.7074L88.3938 18.0749L87.4015 20.9061ZM62.7961 9.75941L61.3198 12.371L61.3216 12.372L62.7961 9.75941ZM46.2357 -2.39402C41.8799 0.803476 37.2563 4.04532 31.7251 7.17217L34.6778 12.3953C40.5123 9.09703 45.3562 5.69469 49.7862 2.4427L46.2357 -2.39402ZM31.727 7.17113C23.0183 12.0861 14.7865 15.5817 7.60378 18.0993L9.5884 23.7615C17.0569 21.1438 25.6181 17.5085 34.676 12.3964L31.727 7.17113ZM5.61072 20.6345C5.23291 24.4463 5.60118 32.8792 7.20409 42.2683C8.81006 51.6754 11.724 62.4668 16.6734 70.8402L21.8386 67.7872C17.4302 60.329 14.6734 50.3664 13.1185 41.2586C11.5606 32.1329 11.2778 24.2899 11.5815 21.2263L5.61072 20.6345ZM16.6734 70.8402C26.4559 87.3904 40.1088 95.1341 46.5829 98.6383L49.439 93.3617C43.2332 90.0027 30.7718 82.9004 21.8386 67.7872L16.6734 70.8402ZM51.011 96V95.9757H45.011V96H51.011ZM49.4411 98.6128C55.898 95.1112 69.4802 87.4768 79.3245 70.8154L74.1587 67.7633C65.1656 82.9843 52.7795 89.9769 46.5808 93.3385L49.4411 98.6128ZM79.3245 70.8154C84.3035 62.3884 87.2177 51.5981 88.8166 42.2013C90.4125 32.8221 90.7644 24.4186 90.3869 20.6102L84.4161 21.202C84.7201 24.2689 84.4514 32.0865 82.9016 41.1948C81.3548 50.2856 78.5984 60.2492 74.1587 67.7633L79.3245 70.8154ZM88.3938 18.0749C81.2111 15.5574 72.9792 12.0618 64.2706 7.14679L61.3216 12.372C70.3795 17.4842 78.9407 21.1195 86.4092 23.7372L88.3938 18.0749ZM64.2725 7.14783C58.7413 4.02098 54.1177 0.779138 49.7619 -2.41836L46.2114 2.41836C50.6414 5.67035 55.4853 9.07269 61.3198 12.371L64.2725 7.14783Z"
|
||||
fill="white" fill-opacity="0.8" mask="url(#path-1-inside-1_162_1238)" />
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_162_1238">
|
||||
<rect width="79.052" height="96" fill="white" transform="translate(8.47388)" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
@@ -0,0 +1,46 @@
|
||||
<svg width="154" height="154" viewBox="0 0 154 154" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="9" y="9" width="136" height="136" rx="68" fill="white" fill-opacity="0.05" />
|
||||
<g clip-path="url(#clip0_162_1132)">
|
||||
<path d="M76.9995 37L61.4111 22H92.588L76.9995 37Z" fill="#FFFFFF" />
|
||||
<path d="M36.9995 77L21.9995 92.5885L21.9995 61.4115L36.9995 77Z" fill="#FFFFFF" />
|
||||
<path d="M117 77L132 61.4115V92.5885L117 77Z" fill="#FFFFFF" />
|
||||
<path d="M76.9995 117L92.588 132H61.4111L76.9995 117Z" fill="#FFFFFF" />
|
||||
</g>
|
||||
<g opacity="0.1">
|
||||
<g clip-path="url(#clip1_162_1132)">
|
||||
<path d="M83.9453 37.6077L71.1984 20.1287L101.902 25.5425L83.9453 37.6077Z"
|
||||
fill="#FFFFFF" />
|
||||
<path d="M37.6072 70.0542L20.1282 82.8011L25.542 52.0978L37.6072 70.0542Z"
|
||||
fill="#FFFFFF" />
|
||||
<path d="M116.392 83.9461L133.871 71.1992L128.457 101.902L116.392 83.9461Z"
|
||||
fill="#FFFFFF" />
|
||||
<path d="M70.0532 116.393L82.8001 133.872L52.0968 128.458L70.0532 116.393Z"
|
||||
fill="#FFFFFF" />
|
||||
</g>
|
||||
</g>
|
||||
<g opacity="0.05">
|
||||
<g clip-path="url(#clip2_162_1132)">
|
||||
<path d="M90.6807 39.4122L81.1627 19.9853L110.459 30.6484L90.6807 39.4122Z"
|
||||
fill="#FFFFFF" />
|
||||
<path d="M39.4125 63.319L19.9855 72.8371L30.6487 43.5403L39.4125 63.319Z" fill="#FFFFFF" />
|
||||
<path d="M114.588 90.6807L134.014 81.1627L123.351 110.459L114.588 90.6807Z"
|
||||
fill="#FFFFFF" />
|
||||
<path d="M63.3193 114.588L72.8373 134.014L43.5406 123.351L63.3193 114.588Z"
|
||||
fill="#FFFFFF" />
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_162_1132">
|
||||
<rect x="16.9995" y="17" width="120" height="120" rx="60" fill="white" />
|
||||
</clipPath>
|
||||
<clipPath id="clip1_162_1132">
|
||||
<rect x="28.3301" y="7.49268" width="120" height="120" rx="60"
|
||||
transform="rotate(10 28.3301 7.49268)" fill="white" />
|
||||
</clipPath>
|
||||
<clipPath id="clip2_162_1132">
|
||||
<rect x="41.1396" y="0.097168" width="120" height="120" rx="60"
|
||||
transform="rotate(20 41.1396 0.097168)" fill="white" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
@@ -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="M7.51465 7.51472L24.4852 24.4853" stroke="#FFFFFF" stroke-width="8" stroke-linecap="round"/>
|
||||
<path d="M7.51465 24.4853L24.4852 7.51471" stroke="#FFFFFF" stroke-width="8" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 319 B |
@@ -0,0 +1,70 @@
|
||||
<rml>
|
||||
<head>
|
||||
<title>Launcher</title>
|
||||
<link type="text/rcss" href="rml.rcss"/>
|
||||
<link type="text/rcss" href="recomp.rcss"/>
|
||||
<style>
|
||||
body
|
||||
{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="window" data-model="launcher_model">
|
||||
<div class="launcher">
|
||||
<!--<div class="launcher__vertical-split">
|
||||
<div class="launcher__title-quadrant">
|
||||
<button class="subtitle-title" disabled>
|
||||
<div><h3>Banjo: Recompiled</h3></div>
|
||||
<div><h1>Banjo-Tooie</h1></div>
|
||||
<div class="subtitle-title__disclaimer">Coming Soon™</div>
|
||||
</button>
|
||||
</div>
|
||||
<div class="launcher__content-quadrant"></div>
|
||||
</div>-->
|
||||
<div class="launcher__vertical-split launcher__vertical-split--right">
|
||||
<div class="launcher__background-wrapper">
|
||||
<!-- <svg src="[changeme].svg" class="launcher__background-bk" /> -->
|
||||
</div>
|
||||
<div class="launcher__title-quadrant launcher__title-quadrant--right">
|
||||
<button class="subtitle-title subtitle-title--right" selected>
|
||||
<div><h3>Banjo: Recompiled</h3></div>
|
||||
<div><h1>Banjo-Kazooie</h1></div>
|
||||
</button>
|
||||
</div>
|
||||
<div class="launcher__content-quadrant">
|
||||
<button data-if="!bk_rom_valid" onclick="select_rom" class="menu-list-item menu-list-item--right" autofocus>
|
||||
<div class="menu-list-item__bullet">•</div>
|
||||
<div class="menu-list-item__label">Select ROM</div>
|
||||
</button>
|
||||
<button data-if="bk_rom_valid" onclick="start_game" class="menu-list-item menu-list-item--right" autofocus>
|
||||
<div class="menu-list-item__bullet">•</div>
|
||||
<div class="menu-list-item__label">Start game</div>
|
||||
</button>
|
||||
<button onclick="open_controls" class="menu-list-item menu-list-item--right">
|
||||
<div class="menu-list-item__bullet">•</div>
|
||||
<div class="menu-list-item__label">Setup controls</div>
|
||||
</button>
|
||||
<button onclick="open_settings" class="menu-list-item menu-list-item--right">
|
||||
<div class="menu-list-item__bullet">•</div>
|
||||
<div class="menu-list-item__label">Settings</div>
|
||||
</button>
|
||||
<button onclick="open_mods" class="menu-list-item menu-list-item--right">
|
||||
<div class="menu-list-item__bullet">•</div>
|
||||
<div class="menu-list-item__label">Mods</div>
|
||||
</button>
|
||||
<button onclick="exit_game" class="menu-list-item menu-list-item--right">
|
||||
<div class="menu-list-item__bullet">•</div>
|
||||
<div class="menu-list-item__label">Exit</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom-left">
|
||||
<label>v{{version_number}}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</rml>
|
||||
@@ -0,0 +1,91 @@
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1. This license is copied below, and is also available
|
||||
with a FAQ at <http://scripts.sil.org/OFL>
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
@@ -0,0 +1,23 @@
|
||||
## About PromptFont
|
||||
This is a font designed for button prompts in games. It includes the base alphabet, as well as icons for modifier and control keys, and gamepad buttons. All the icons included in the font are custom made and available under the same [SIL Open Font Licence](LICENSE.txt). Included trademarks however of course still belong to their respective owners.
|
||||
|
||||
PromptFont is based on the Xolonium font by Severin Meyer.
|
||||
|
||||
## Attribution
|
||||
If you use this font in your project please leave an attribution notice in your credits like this:
|
||||
|
||||
> PromptFont by Yukari "Shinmera" Hafner, available at https://shinmera.com/promptfont
|
||||
|
||||
## Special Glyphs
|
||||
Please see the included ``glyphs.json`` file for all the relevant glyphs in the font. It includes the code point of every glyph along with a unique name to address it with and a general category. You should be able to use it to create an equivalent mapping of glyphs in your engine of choice.
|
||||
|
||||
## Engine Specifics
|
||||
Since there's far too many engines out there and their methods vary a lot, we can't include guides in this repository. For specifics on how to use this font in your engine of choice, please consult their documentation on importing custom fonts and custom glyph ranges, and how to write text with specific unicode codepoints. Since this is literally just a font, it should not prove too difficult.
|
||||
|
||||
## Contributing Glyphs
|
||||
For a brief guide on what to watch out for if you'd like to contribute to this font, please see the [CONTRIBUTING.md](CONTRIBUTING.md) file. If you'd like to request new glyphs to be added, please comment on the [issue ticket]().
|
||||
|
||||
## Support
|
||||
If you'd like to support the continued development of PromptFont, please consider becoming a backer on Patreon:
|
||||
|
||||
[](https://patreon.com/shinmera)
|
||||
@@ -0,0 +1,335 @@
|
||||
@font-face{font-family:'promptfont'; src:url('promptfont.ttf');}
|
||||
.pf{font-family:promptfont;}
|
||||
.pf-exchange::after{content:'\u2194';}
|
||||
.pf-reverse::after{content:'\u2195';}
|
||||
.pf-left-trigger-lt::after{content:'\u2196';}
|
||||
.pf-right-trigger-rt::after{content:'\u2197';}
|
||||
.pf-left-shoulder-lb::after{content:'\u2198';}
|
||||
.pf-right-shoulder-rb::after{content:'\u2199';}
|
||||
.pf-left-trigger-zl::after{content:'\u219A';}
|
||||
.pf-right-trigger-zr::after{content:'\u219B';}
|
||||
.pf-left-shoulder-l::after{content:'\u219C';}
|
||||
.pf-right-shoulder-r::after{content:'\u219D';}
|
||||
.pf-dpad-left::after{content:'\u219E';}
|
||||
.pf-dpad-up::after{content:'\u219F';}
|
||||
.pf-dpad-right::after{content:'\u21A0';}
|
||||
.pf-dpad-down::after{content:'\u21A1';}
|
||||
.pf-dpad-left-right::after{content:'\u21A2';}
|
||||
.pf-dpad-up-down::after{content:'\u21A3';}
|
||||
.pf-button-left-x::after{content:'\u21A4';}
|
||||
.pf-button-up-y::after{content:'\u21A5';}
|
||||
.pf-button-right-b::after{content:'\u21A6';}
|
||||
.pf-button-down-a::after{content:'\u21A7';}
|
||||
.pf-left-analog-clockwise::after{content:'\u21A9';}
|
||||
.pf-left-analog-counter::after{content:'\u21AA';}
|
||||
.pf-right-analog-clockwise::after{content:'\u21AB';}
|
||||
.pf-right-analog-counter::after{content:'\u21AC';}
|
||||
.pf-both-analog-clockwise::after{content:'\u21AD';}
|
||||
.pf-both-analog-counter::after{content:'\u21AE';}
|
||||
.pf-left-shoulder-l1::after{content:'\u21B0';}
|
||||
.pf-right-shoulder-r1::after{content:'\u21B1';}
|
||||
.pf-left-trigger-l2::after{content:'\u21B2';}
|
||||
.pf-right-trigger-r2::after{content:'\u21B3';}
|
||||
.pf-dpad-left-down::after{content:'\u21B4';}
|
||||
.pf-dpad-up-right::after{content:'\u21B5';}
|
||||
.pf-analog-clockwise::after{content:'\u21B6';}
|
||||
.pf-analog-counter::after{content:'\u21B7';}
|
||||
.pf-both-analog-click::after{content:'\u21B9';}
|
||||
.pf-left-analog-click::after{content:'\u21BA';}
|
||||
.pf-right-analog-click::after{content:'\u21BB';}
|
||||
.pf-left-analog-left::after{content:'\u21BC';}
|
||||
.pf-right-analog-left::after{content:'\u21BD';}
|
||||
.pf-left-analog-up::after{content:'\u21BE';}
|
||||
.pf-right-analog-up::after{content:'\u21BF';}
|
||||
.pf-left-analog-right::after{content:'\u21C0';}
|
||||
.pf-right-analog-right::after{content:'\u21C1';}
|
||||
.pf-left-analog-down::after{content:'\u21C2';}
|
||||
.pf-right-analog-down::after{content:'\u21C3';}
|
||||
.pf-left-analog-left-right::after{content:'\u21C4';}
|
||||
.pf-left-analog-up-down::after{content:'\u21C5';}
|
||||
.pf-right-analog-left-right::after{content:'\u21C6';}
|
||||
.pf-analog-left::after{content:'\u21C7';}
|
||||
.pf-analog-up::after{content:'\u21C8';}
|
||||
.pf-analog-right::after{content:'\u21C9';}
|
||||
.pf-analog-down::after{content:'\u21CA';}
|
||||
.pf-left-analog::after{content:'\u21CB';}
|
||||
.pf-right-analog::after{content:'\u21CC';}
|
||||
.pf-dpad::after{content:'\u21CE';}
|
||||
.pf-button-x::after{content:'\u21D0';}
|
||||
.pf-button-y::after{content:'\u21D1';}
|
||||
.pf-button-b::after{content:'\u21D2';}
|
||||
.pf-button-a::after{content:'\u21D3';}
|
||||
.pf-analog-left-right::after{content:'\u21D4';}
|
||||
.pf-analog-up-down::after{content:'\u21D5';}
|
||||
.pf-analog-up-left::after{content:'\u21D6';}
|
||||
.pf-analog-up-right::after{content:'\u21D7';}
|
||||
.pf-analog-down-right::after{content:'\u21D8';}
|
||||
.pf-analog-down-left::after{content:'\u21D9';}
|
||||
.pf-left-analog-touch::after{content:'\u21DA';}
|
||||
.pf-right-analog-touch::after{content:'\u21DB';}
|
||||
.pf-left-trigger-pull::after{content:'\u21DC';}
|
||||
.pf-right-trigger-pull::after{content:'\u21DD';}
|
||||
.pf-dpad-right-down::after{content:'\u21DE';}
|
||||
.pf-dpad-left-up::after{content:'\u21DF';}
|
||||
.pf-button-square::after{content:'\u21E0';}
|
||||
.pf-button-triangle::after{content:'\u21E1';}
|
||||
.pf-button-circle::after{content:'\u21E2';}
|
||||
.pf-button-cross::after{content:'\u21E3';}
|
||||
.pf-steam-menu::after{content:'\u21E4';}
|
||||
.pf-options-menu::after{content:'\u21E5';}
|
||||
.pf-dualshock-share::after{content:'\u21E6';}
|
||||
.pf-dualshock-touchpad::after{content:'\u21E7';}
|
||||
.pf-dualshock-options::after{content:'\u21E8';}
|
||||
.pf-gamecube-z::after{content:'\u21E9';}
|
||||
.pf-back-trigger-z::after{content:'\u21EA';}
|
||||
.pf-button-c::after{content:'\u21EB';}
|
||||
.pf-button-z::after{content:'\u21EC';}
|
||||
.pf-button-alt-1::after{content:'\u21ED';}
|
||||
.pf-button-alt-2::after{content:'\u21EE';}
|
||||
.pf-left-analog-any::after{content:'\u21F1';}
|
||||
.pf-right-analog-any::after{content:'\u21F2';}
|
||||
.pf-analog-any::after{content:'\u21F3';}
|
||||
.pf-right-analog-up-down::after{content:'\u21F5';}
|
||||
.pf-select-share::after{content:'\u21F7';}
|
||||
.pf-start::after{content:'\u21F8';}
|
||||
.pf-home-menu::after{content:'\u21F9';}
|
||||
.pf-share-capture::after{content:'\u21FA';}
|
||||
.pf-burger-menu::after{content:'\u21FB';}
|
||||
.pf-minus::after{content:'\u21FD';}
|
||||
.pf-plus::after{content:'\u21FE';}
|
||||
.pf-joycon-dpad-left::after{content:'\u21FF';}
|
||||
.pf-joycon-dpad-up::after{content:'\u2200';}
|
||||
.pf-joycon-dpad-right::after{content:'\u2201';}
|
||||
.pf-joycon-dpad-down::after{content:'\u2202';}
|
||||
.pf-joycon-sl::after{content:'\u2203';}
|
||||
.pf-joycon-sr::after{content:'\u2204';}
|
||||
.pf-lenovo-legion-quick-settings::after{content:'\u2205';}
|
||||
.pf-dualsense-share::after{content:'\u2206';}
|
||||
.pf-dualsense-touchpad::after{content:'\u2207';}
|
||||
.pf-dualsense-options::after{content:'\u2208';}
|
||||
.pf-ayaneo-lc::after{content:'\u2209';}
|
||||
.pf-ayaneo-rc::after{content:'\u220A';}
|
||||
.pf-ayaneo-wave::after{content:'\u220B';}
|
||||
.pf-ayn-home::after{content:'\u220C';}
|
||||
.pf-ayn-lcc::after{content:'\u220D';}
|
||||
.pf-gpd-c1::after{content:'\u220E';}
|
||||
.pf-gpd-c2::after{content:'\u220F';}
|
||||
.pf-onexplayer-keyboard::after{content:'\u2210';}
|
||||
.pf-onexplayer-turbo::after{content:'\u2211';}
|
||||
.pf-m1::after{content:'\u2212';}
|
||||
.pf-m2::after{content:'\u2213';}
|
||||
.pf-m3::after{content:'\u2214';}
|
||||
.pf-y1::after{content:'\u2215';}
|
||||
.pf-y2::after{content:'\u2216';}
|
||||
.pf-y3::after{content:'\u2217';}
|
||||
.pf-onexplayer-function::after{content:'\u2218';}
|
||||
.pf-onexplayer-home::after{content:'\u2219';}
|
||||
.pf-left-trackpad-any::after{content:'\u2264';}
|
||||
.pf-right-trackpad-any::after{content:'\u2265';}
|
||||
.pf-left-trackpad-click::after{content:'\u2266';}
|
||||
.pf-right-trackpad-click::after{content:'\u2267';}
|
||||
.pf-left-trackpad-touch::after{content:'\u2268';}
|
||||
.pf-right-trackpad-touch::after{content:'\u2269';}
|
||||
.pf-left-trackpad-left::after{content:'\u226E';}
|
||||
.pf-right-trackpad-left::after{content:'\u226F';}
|
||||
.pf-left-trackpad-up::after{content:'\u2270';}
|
||||
.pf-right-trackpad-up::after{content:'\u2271';}
|
||||
.pf-left-trackpad-right::after{content:'\u2272';}
|
||||
.pf-right-trackpad-right::after{content:'\u2273';}
|
||||
.pf-left-trackpad-down::after{content:'\u2274';}
|
||||
.pf-right-trackpad-down::after{content:'\u2275';}
|
||||
.pf-steamdeck-l4::after{content:'\u2276';}
|
||||
.pf-steamdeck-r4::after{content:'\u2277';}
|
||||
.pf-steamdeck-l5::after{content:'\u2278';}
|
||||
.pf-steamdeck-r5::after{content:'\u2279';}
|
||||
.pf-xbox-dpad-left::after{content:'\u227A';}
|
||||
.pf-xbox-dpad-up::after{content:'\u227B';}
|
||||
.pf-xbox-dpad-right::after{content:'\u227C';}
|
||||
.pf-xbox-dpad-down::after{content:'\u227D';}
|
||||
.pf-xbox-dpad-left-right::after{content:'\u227E';}
|
||||
.pf-xbox-dpad-up-down::after{content:'\u227F';}
|
||||
.pf-xbox-dpad-left-up::after{content:'\u2280';}
|
||||
.pf-xbox-dpad-right-up::after{content:'\u2281';}
|
||||
.pf-xbox-dpad-left-down::after{content:'\u2282';}
|
||||
.pf-xbox-dpad-right-down::after{content:'\u2283';}
|
||||
.pf-xbox-dpad::after{content:'\u2284';}
|
||||
.pf-pin::after{content:'\u2316';}
|
||||
.pf-tabs::after{content:'\u23CD';}
|
||||
.pf-back::after{content:'\u23CE';}
|
||||
.pf-home-screen::after{content:'\u23CF';}
|
||||
.pf-horizontal-dots::after{content:'\u23D0';}
|
||||
.pf-vertical-dots::after{content:'\u23D1';}
|
||||
.pf-hamburger-menu::after{content:'\u23D2';}
|
||||
.pf-arrow-left::after{content:'\u23F4';}
|
||||
.pf-arrow-up::after{content:'\u23F5';}
|
||||
.pf-arrow-right::after{content:'\u23F6';}
|
||||
.pf-arrow-down::after{content:'\u23F7';}
|
||||
.pf-wasd::after{content:'\u2423';}
|
||||
.pf-arrow-keys::after{content:'\u2424';}
|
||||
.pf-ijkl::after{content:'\u2425';}
|
||||
.pf-fn::after{content:'\u2426';}
|
||||
.pf-ctrl::after{content:'\u2427';}
|
||||
.pf-alt::after{content:'\u2428';}
|
||||
.pf-shift::after{content:'\u2429';}
|
||||
.pf-super::after{content:'\u242A';}
|
||||
.pf-tab::after{content:'\u242B';}
|
||||
.pf-caps::after{content:'\u242C';}
|
||||
.pf-backspace::after{content:'\u242D';}
|
||||
.pf-enter::after{content:'\u242E';}
|
||||
.pf-esc::after{content:'\u242F';}
|
||||
.pf-prtsc::after{content:'\u2430';}
|
||||
.pf-scrlk::after{content:'\u2431';}
|
||||
.pf-pause::after{content:'\u2432';}
|
||||
.pf-numlock::after{content:'\u2433';}
|
||||
.pf-insert::after{content:'\u2434';}
|
||||
.pf-home::after{content:'\u2435';}
|
||||
.pf-page-up::after{content:'\u2436';}
|
||||
.pf-delete::after{content:'\u2437';}
|
||||
.pf-end::after{content:'\u2438';}
|
||||
.pf-page-down::after{content:'\u2439';}
|
||||
.pf-space::after{content:'\u243A';}
|
||||
.pf-gamepad::after{content:'\u243C';}
|
||||
.pf-keyboard::after{content:'\u243D';}
|
||||
.pf-mouse::after{content:'\u243E';}
|
||||
.pf-mouse-and-keyboard::after{content:'\u243F';}
|
||||
.pf-f1::after{content:'\u2460';}
|
||||
.pf-f2::after{content:'\u2461';}
|
||||
.pf-f3::after{content:'\u2462';}
|
||||
.pf-f4::after{content:'\u2463';}
|
||||
.pf-f5::after{content:'\u2464';}
|
||||
.pf-f6::after{content:'\u2465';}
|
||||
.pf-f7::after{content:'\u2466';}
|
||||
.pf-f8::after{content:'\u2467';}
|
||||
.pf-f9::after{content:'\u2468';}
|
||||
.pf-f10::after{content:'\u2469';}
|
||||
.pf-f11::after{content:'\u246A';}
|
||||
.pf-f12::after{content:'\u246B';}
|
||||
.pf-empty-keycap::after{content:'\u248F';}
|
||||
.pf-1::after{content:'\u24F5';}
|
||||
.pf-2::after{content:'\u24F6';}
|
||||
.pf-3::after{content:'\u24F7';}
|
||||
.pf-4::after{content:'\u24F8';}
|
||||
.pf-5::after{content:'\u24F9';}
|
||||
.pf-6::after{content:'\u24FA';}
|
||||
.pf-7::after{content:'\u24FB';}
|
||||
.pf-8::after{content:'\u24FC';}
|
||||
.pf-9::after{content:'\u24FD';}
|
||||
.pf-0::after{content:'\u24FF';}
|
||||
.pf-star::after{content:'\u2605';}
|
||||
.pf-skull::after{content:'\u2620';}
|
||||
.pf-frown::after{content:'\u2639';}
|
||||
.pf-smile::after{content:'\u263A';}
|
||||
.pf-empty-heart::after{content:'\u2661';}
|
||||
.pf-heart::after{content:'\u2665';}
|
||||
.pf-d4::after{content:'\u2673';}
|
||||
.pf-d6::after{content:'\u2674';}
|
||||
.pf-d8::after{content:'\u2675';}
|
||||
.pf-d10::after{content:'\u2676';}
|
||||
.pf-d12::after{content:'\u2677';}
|
||||
.pf-d20::after{content:'\u2678';}
|
||||
.pf-d6-1::after{content:'\u2680';}
|
||||
.pf-d6-2::after{content:'\u2681';}
|
||||
.pf-d6-3::after{content:'\u2682';}
|
||||
.pf-d6-4::after{content:'\u2683';}
|
||||
.pf-d6-5::after{content:'\u2684';}
|
||||
.pf-d6-6::after{content:'\u2685';}
|
||||
.pf-flag::after{content:'\u2691';}
|
||||
.pf-gears-options-settings::after{content:'\u2699';}
|
||||
.pf-cross::after{content:'\u2717';}
|
||||
.pf-question::after{content:'\u2753';}
|
||||
.pf-exclamation::after{content:'\u2757';}
|
||||
.pf-mouse-button-1::after{content:'\u278A';}
|
||||
.pf-mouse-button-2::after{content:'\u278B';}
|
||||
.pf-mouse-button-3::after{content:'\u278C';}
|
||||
.pf-mouse-button-4::after{content:'\u278D';}
|
||||
.pf-mouse-button-5::after{content:'\u278E';}
|
||||
.pf-mouse-button-6::after{content:'\u278F';}
|
||||
.pf-mouse-button-7::after{content:'\u2790';}
|
||||
.pf-mouse-button-8::after{content:'\u2791';}
|
||||
.pf-scroll-up::after{content:'\u27F0';}
|
||||
.pf-scroll-down::after{content:'\u27F1';}
|
||||
.pf-left-click::after{content:'\u27F5';}
|
||||
.pf-right-click::after{content:'\u27F6';}
|
||||
.pf-middle-click::after{content:'\u27F7';}
|
||||
.pf-mouse-left-right::after{content:'\u27FA';}
|
||||
.pf-mouse-up-down::after{content:'\u27FB';}
|
||||
.pf-mouse-any::after{content:'\u27FC';}
|
||||
.pf-box-crate::after{content:'\u2B1B';}
|
||||
.pf-playstation::after{content:'\uE000';}
|
||||
.pf-xbox::after{content:'\uE001';}
|
||||
.pf-nintendo-switch::after{content:'\uE002';}
|
||||
.pf-ayaneo::after{content:'\uE003';}
|
||||
.pf-lenovo-legion::after{content:'\uE004';}
|
||||
.pf-rog-ally-armoury::after{content:'\uE005';}
|
||||
.pf-rog-alloy-command::after{content:'\uE006';}
|
||||
.pf-apple-mac::after{content:'\uE007';}
|
||||
.pf-windows::after{content:'\uE008';}
|
||||
.pf-linux::after{content:'\uE009';}
|
||||
.pf-bsd::after{content:'\uE00A';}
|
||||
.pf-key-0::after{content:'\uFF10';}
|
||||
.pf-key-1::after{content:'\uFF11';}
|
||||
.pf-key-2::after{content:'\uFF12';}
|
||||
.pf-key-3::after{content:'\uFF13';}
|
||||
.pf-key-4::after{content:'\uFF14';}
|
||||
.pf-key-5::after{content:'\uFF15';}
|
||||
.pf-key-6::after{content:'\uFF16';}
|
||||
.pf-key-7::after{content:'\uFF17';}
|
||||
.pf-key-8::after{content:'\uFF18';}
|
||||
.pf-key-9::after{content:'\uFF19';}
|
||||
.pf-key-a::after{content:'\uFF21';}
|
||||
.pf-key-b::after{content:'\uFF22';}
|
||||
.pf-key-c::after{content:'\uFF23';}
|
||||
.pf-key-d::after{content:'\uFF24';}
|
||||
.pf-key-e::after{content:'\uFF25';}
|
||||
.pf-key-f::after{content:'\uFF26';}
|
||||
.pf-key-g::after{content:'\uFF27';}
|
||||
.pf-key-h::after{content:'\uFF28';}
|
||||
.pf-key-i::after{content:'\uFF29';}
|
||||
.pf-key-j::after{content:'\uFF2A';}
|
||||
.pf-key-k::after{content:'\uFF2B';}
|
||||
.pf-key-l::after{content:'\uFF2C';}
|
||||
.pf-key-m::after{content:'\uFF2D';}
|
||||
.pf-key-n::after{content:'\uFF2E';}
|
||||
.pf-key-o::after{content:'\uFF2F';}
|
||||
.pf-key-p::after{content:'\uFF30';}
|
||||
.pf-key-q::after{content:'\uFF31';}
|
||||
.pf-key-r::after{content:'\uFF32';}
|
||||
.pf-key-s::after{content:'\uFF33';}
|
||||
.pf-key-t::after{content:'\uFF34';}
|
||||
.pf-key-u::after{content:'\uFF35';}
|
||||
.pf-key-v::after{content:'\uFF36';}
|
||||
.pf-key-w::after{content:'\uFF37';}
|
||||
.pf-key-x::after{content:'\uFF38';}
|
||||
.pf-key-y::after{content:'\uFF39';}
|
||||
.pf-key-z::after{content:'\uFF3A';}
|
||||
.pf-headphones::after{content:'\u1F3A7';}
|
||||
.pf-music::after{content:'\u1F3B6';}
|
||||
.pf-fish::after{content:'\u1F41F';}
|
||||
.pf-dance-pad::after{content:'\u1F483';}
|
||||
.pf-laptop::after{content:'\u1F4BB';}
|
||||
.pf-diskette::after{content:'\u1F4BE';}
|
||||
.pf-write::after{content:'\u1F4DD';}
|
||||
.pf-phone::after{content:'\u1F4F1';}
|
||||
.pf-camera::after{content:'\u1F4F7';}
|
||||
.pf-speaker::after{content:'\u1F508';}
|
||||
.pf-light-gun::after{content:'\u1F52B';}
|
||||
.pf-sfx-sound-effect-noise::after{content:'\u1F56C';}
|
||||
.pf-steering-wheel::after{content:'\u1F578';}
|
||||
.pf-fight-stick-joystick::after{content:'\u1F579';}
|
||||
.pf-vr-headset::after{content:'\u1F57B';}
|
||||
.pf-vr-controller::after{content:'\u1F57C';}
|
||||
.pf-flight-stick::after{content:'\u1F57D';}
|
||||
.pf-cpu-processor::after{content:'\u1F5A5';}
|
||||
.pf-web-internet-link::after{content:'\u1F5A7';}
|
||||
.pf-gpu-graphics-card::after{content:'\u1F5A8';}
|
||||
.pf-ram-memory::after{content:'\u1F5AA';}
|
||||
.pf-usb-stick::after{content:'\u1F5AB';}
|
||||
.pf-database::after{content:'\u1F5AC';}
|
||||
.pf-hard-disk-drive::after{content:'\u1F5B4';}
|
||||
.pf-screen-video::after{content:'\u1F5B5';}
|
||||
.pf-text-entry-edit::after{content:'\u1F5B9';}
|
||||
.pf-speaking-voice::after{content:'\u1F5E3';}
|
||||
.pf-language::after{content:'\u1F5E9';}
|
||||
.pf-exit-quit-leave::after{content:'\u1F6AA';}
|
||||
.pf-information::after{content:'\u1F6C8';}
|
||||
.pf-shopping-cart::after{content:'\u1F6D2';}
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Default styles for all the basic elements.
|
||||
*/
|
||||
|
||||
div
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
|
||||
p
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
|
||||
h1
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
|
||||
em
|
||||
{
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
strong
|
||||
{
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
select
|
||||
{
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
tabset tabs
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
|
||||
table {
|
||||
box-sizing: border-box;
|
||||
display: table;
|
||||
}
|
||||
tr {
|
||||
box-sizing: border-box;
|
||||
display: table-row;
|
||||
}
|
||||
td {
|
||||
box-sizing: border-box;
|
||||
display: table-cell;
|
||||
}
|
||||
col {
|
||||
box-sizing: border-box;
|
||||
display: table-column;
|
||||
}
|
||||
colgroup {
|
||||
display: table-column-group;
|
||||
}
|
||||
thead, tbody, tfoot {
|
||||
display: table-row-group;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
iron
|
||||
@@ -0,0 +1,99 @@
|
||||
{
|
||||
"extends": [
|
||||
"stylelint-config-recommended",
|
||||
"stylelint-config-standard",
|
||||
"stylelint-config-sass-guidelines",
|
||||
"stylelint-config-property-sort-order-smacss",
|
||||
"stylelint-config-standard-scss"
|
||||
],
|
||||
"plugins": ["stylelint-scss"],
|
||||
"overrides": [{
|
||||
"files": ["**/*.scss"],
|
||||
"customSyntax": "postcss-scss"
|
||||
}],
|
||||
"rules": {
|
||||
"no-descending-specificity": null,
|
||||
"declaration-empty-line-before": null,
|
||||
"declaration-colon-newline-after": null,
|
||||
"declaration-block-no-duplicate-properties": true,
|
||||
"declaration-block-trailing-semicolon": null,
|
||||
"declaration-no-important": true,
|
||||
"declaration-property-value-disallowed-list": {
|
||||
"/^transition/": ["/all/"]
|
||||
},
|
||||
"block-closing-brace-newline-after": null,
|
||||
"max-empty-lines": null,
|
||||
"selector-list-comma-newline-after": null,
|
||||
"at-rule-empty-line-before": null,
|
||||
"at-rule-semicolon-newline-after": null,
|
||||
"selector-pseudo-element-colon-notation": "single",
|
||||
"color-no-hex": true,
|
||||
"function-url-quotes": "always",
|
||||
"max-nesting-depth": [
|
||||
4,
|
||||
{
|
||||
"ignoreAtRules": ["each", "media", "supports", "include"],
|
||||
"severity": "warning"
|
||||
}
|
||||
],
|
||||
"number-leading-zero": null,
|
||||
"order/order": [
|
||||
[
|
||||
"custom-properties",
|
||||
"dollar-variables",
|
||||
{
|
||||
"type": "at-rule",
|
||||
"name": "extend"
|
||||
},
|
||||
{
|
||||
"type": "at-rule",
|
||||
"name": "include"
|
||||
},
|
||||
"declarations",
|
||||
"rules"
|
||||
]
|
||||
],
|
||||
"order/properties-alphabetical-order": null,
|
||||
"property-no-vendor-prefix": [
|
||||
true,
|
||||
{
|
||||
"severity": "warning"
|
||||
}
|
||||
],
|
||||
"value-no-vendor-prefix": [
|
||||
true,
|
||||
{
|
||||
"severity": "warning"
|
||||
}
|
||||
],
|
||||
"scss/selector-no-redundant-nesting-selector": null,
|
||||
"selector-class-pattern": null,
|
||||
"selector-max-compound-selectors": [
|
||||
4,
|
||||
{
|
||||
"severity": "warning"
|
||||
}
|
||||
],
|
||||
"selector-no-qualifying-type": null,
|
||||
"string-quotes": null,
|
||||
"max-line-length": null,
|
||||
"keyframes-name-pattern": null,
|
||||
"scss/double-slash-comment-empty-line-before": null,
|
||||
"scss/double-slash-comment-whitespace-inside": null,
|
||||
"scss/dollar-variable-empty-line-before": null,
|
||||
"scss/dollar-variable-pattern": "[a-z-]",
|
||||
"scss/at-import-partial-extension": null,
|
||||
"declaration-block-no-redundant-longhand-properties": null,
|
||||
"color-function-notation": null,
|
||||
"alpha-value-notation": null,
|
||||
"at-rule-no-unknown": null,
|
||||
"property-no-unknown": null,
|
||||
"scss/at-rule-no-unknown": true,
|
||||
"selector-pseudo-class-no-unknown": [true, { "ignorePseudoClasses": ["selected"] }],
|
||||
"font-family-no-missing-generic-family-keyword": null,
|
||||
"scss/no-global-function-names": null,
|
||||
"unit-no-unknown": [true, { "ignoreUnits": ["dp"] }],
|
||||
"selector-type-no-unknown": [true, { "ignore": ["custom-elements", "default-namespace"] }],
|
||||
"value-keyword-case": null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
@import "styles/base";
|
||||
@import "styles/global";
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "mmrecomp-ui-scss",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "npm run watch",
|
||||
"watch": "sass --no-source-map --no-charset --style=compressed main.scss ..\\recomp.rcss --watch",
|
||||
"watch:debug": "sass --no-source-map --no-charset main.scss ..\\recomp.rcss --watch",
|
||||
"build": "sass --no-source-map --no-charset --style=compressed main.scss ..\\recomp.rcss",
|
||||
"build:debug": "sass --no-source-map --no-charset main.scss ..\\recomp.rcss",
|
||||
"lint": "stylelint '.\\**\\*.scss'"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"postcss-scss": "^4.0.9",
|
||||
"stylelint": "^15.11.0",
|
||||
"stylelint-config-property-sort-order-smacss": "^9.1.0",
|
||||
"stylelint-config-sass-guidelines": "^10.0.0",
|
||||
"stylelint-config-scss": "^1.0.0-security",
|
||||
"stylelint-config-standard": "^34.0.0",
|
||||
"stylelint-config-standard-scss": "^11.1.0",
|
||||
"stylelint-scss": "^5.3.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"sass": "^1.75.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
@use 'sass:math';
|
||||
@import "./functions/spacing";
|
||||
@import "./vars/spacing";
|
||||
@import "./vars/colors";
|
||||
@import "./vars/borders";
|
||||
@import "./vars/gradients";
|
||||
@import "./vars/transitions";
|
||||
@import "./vars/animations";
|
||||
@import "./mixins/typography";
|
||||
@import "./mixins/transitions";
|
||||
@import "./mixins/helpers";
|
||||
@@ -0,0 +1,14 @@
|
||||
@use 'sass:math';
|
||||
|
||||
.bottom-left {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
bottom: space(4);
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
width: 100%;
|
||||
max-width: space($base-modal-max-width);
|
||||
height: auto;
|
||||
margin: 0 space(4);
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
@use 'sass:color';
|
||||
|
||||
@mixin create-button-variation($base-col) {
|
||||
border-color: rgba($base-col, 0.8);
|
||||
background-color: rgba($base-col, 0.05);
|
||||
color: $color-text-dim;
|
||||
|
||||
&:focus, &:hover {
|
||||
border-color: $base-col;
|
||||
background-color: rgba($base-col, 0.3);
|
||||
color: $color-text;
|
||||
}
|
||||
|
||||
&:disabled,&[disabled] {
|
||||
color: $color-text-inactive;
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: rgba($base-col, 0.2);
|
||||
color: color.scale($color-text, $lightness: 20%);
|
||||
}
|
||||
}
|
||||
|
||||
.button {
|
||||
@extend %label-md;
|
||||
@extend %nav-all;
|
||||
@include create-button-variation($color-primary);
|
||||
@include trans-colors;
|
||||
|
||||
display: block;
|
||||
width: auto;
|
||||
height: auto;
|
||||
// leave 1dp room for border expansion
|
||||
padding: space(24 - 1);
|
||||
border-width: $border-width-thickness;
|
||||
|
||||
border-radius: $border-radius-md;
|
||||
|
||||
// Setting it by default for convenience
|
||||
&--primary {
|
||||
@include create-button-variation($color-primary);
|
||||
}
|
||||
|
||||
&--large {
|
||||
@extend %label-lg;
|
||||
}
|
||||
|
||||
&--secondary {
|
||||
@include create-button-variation($color-secondary);
|
||||
}
|
||||
|
||||
&--tertiary {
|
||||
@include create-button-variation($color-text);
|
||||
}
|
||||
|
||||
&--success {
|
||||
@include create-button-variation($color-success);
|
||||
}
|
||||
|
||||
&--error {
|
||||
@include create-button-variation($color-error);
|
||||
}
|
||||
|
||||
&--warning {
|
||||
@include create-button-variation($color-warning);
|
||||
}
|
||||
|
||||
&:not([disabled]) {
|
||||
@extend %nav-all;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&:disabled,&[disabled] {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
&__label {
|
||||
width: auto;
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
@use 'sass:math';
|
||||
|
||||
.centered-page {
|
||||
display: flex;
|
||||
// visibility: hidden;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
padding: space($page-margin);
|
||||
background-color: $color-border-soft;
|
||||
}
|
||||
|
||||
.centered-page__modal {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex: 1 1 100%;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
max-width: space($base-modal-max-width);
|
||||
height: 100%;
|
||||
margin: auto;
|
||||
border-width: $border-width-thickness;
|
||||
border-radius: $border-radius-modal;
|
||||
border-color: $color-border;
|
||||
background: $color-modal-overlay;
|
||||
|
||||
> .tabs {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex: 1 1 100%;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
max-width: space($base-modal-max-width);
|
||||
height: 100%;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
panels {
|
||||
flex: 1 1 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.centered-page__controls {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
bottom: space(24);
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
max-width: space($base-modal-max-width);
|
||||
height: auto;
|
||||
margin: 0 auto;
|
||||
|
||||
> label {
|
||||
@extend %label-sm;
|
||||
display: inline-block;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: auto;
|
||||
height: space(24);
|
||||
|
||||
&:not(:last-child) {
|
||||
margin-right: space(40);
|
||||
}
|
||||
|
||||
> span:first-child {
|
||||
margin-right: space(4);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
|
||||
.config__icon-buttons {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: space(8);
|
||||
right: space(0);
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
width: auto;
|
||||
|
||||
.icon-button {
|
||||
margin: 0 space(8);
|
||||
}
|
||||
}
|
||||
|
||||
.config__form {
|
||||
@include border-top($color-border-soft);
|
||||
display: flex;
|
||||
flex: 1 1 100%;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-bottom-right-radius: $border-radius-modal;
|
||||
border-bottom-left-radius: $border-radius-modal;
|
||||
}
|
||||
|
||||
.config__wrapper {
|
||||
flex: 1 1 100%;
|
||||
width: auto;
|
||||
height: auto;
|
||||
padding: space(16);
|
||||
border-radius: 0dp;
|
||||
border-bottom-right-radius: $border-radius-modal;
|
||||
border-bottom-left-radius: $border-radius-modal;
|
||||
background-color: $color-bg-shadow;
|
||||
text-align: left;
|
||||
|
||||
p {
|
||||
@extend %body;
|
||||
padding: space(16);
|
||||
line-height: space(28);
|
||||
white-space: pre-line;
|
||||
|
||||
b {
|
||||
color: $color-primary;
|
||||
}
|
||||
|
||||
i {
|
||||
color: $color-warning;
|
||||
font-style: normal;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.config__hz-wrapper {
|
||||
display: flex;
|
||||
flex: 1 1 100%;
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 0dp;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.config__header, .config__footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
background-color: $color-bg-shadow;
|
||||
}
|
||||
|
||||
.config__header {
|
||||
@include border-bottom($color-border-soft);
|
||||
padding: space(12) space(20);
|
||||
}
|
||||
|
||||
.config__footer {
|
||||
@include border-top($color-border-soft);
|
||||
padding: space(20) space(20);
|
||||
border-bottom-right-radius: $border-radius-modal;
|
||||
border-bottom-left-radius: $border-radius-modal;
|
||||
}
|
||||
|
||||
.config__header-left {
|
||||
display: flex;
|
||||
flex: 1 1 auto;
|
||||
flex-direction: row;
|
||||
|
||||
> :not(:first-child) {
|
||||
margin-left: space(8);
|
||||
}
|
||||
}
|
||||
|
||||
.config__row {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
.config-description {
|
||||
flex: 1 1 100%;
|
||||
width: auto;
|
||||
height: auto;
|
||||
padding: space(16);
|
||||
border-radius: 0dp;
|
||||
border-bottom-right-radius: $border-radius-modal;
|
||||
border-bottom-left-radius: $border-radius-modal;
|
||||
background-color: $color-bg-shadow;
|
||||
text-align: left;
|
||||
|
||||
&__contents {
|
||||
@extend %body;
|
||||
padding: space(16);
|
||||
line-height: space(28);
|
||||
white-space: pre-line;
|
||||
|
||||
b {
|
||||
color: $color-primary;
|
||||
}
|
||||
|
||||
i {
|
||||
color: $color-warning;
|
||||
font-style: normal;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
|
||||
.config-group {
|
||||
position: relative;
|
||||
|
||||
&--scrollable {
|
||||
flex: 1 1 100%;
|
||||
width: auto;
|
||||
height: auto;
|
||||
padding: 0 0 0 space(16);
|
||||
|
||||
.config-group__wrapper {
|
||||
max-height: 100%;
|
||||
overflow-y: auto;
|
||||
}
|
||||
}
|
||||
|
||||
&__title {
|
||||
@extend %label-md;
|
||||
color: $color-primary;
|
||||
|
||||
&--hidden {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&__wrapper {
|
||||
padding: space(16) 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,413 @@
|
||||
.config-option {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
margin: space(16) space(0) space(24);
|
||||
|
||||
&--hz {
|
||||
flex-direction: row-reverse;
|
||||
align-items: center;
|
||||
margin-top: space(4);
|
||||
margin-bottom: space(4);
|
||||
|
||||
.config-option__title {
|
||||
@extend %label-md;
|
||||
flex: 1 1 100%;
|
||||
}
|
||||
|
||||
.config-option__list {
|
||||
flex: 1 1 auto;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
&:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.config-option__title {
|
||||
@extend %label-md;
|
||||
padding: 0 space(12);
|
||||
}
|
||||
|
||||
.config-option__radio-tabs,
|
||||
.config-option__list {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
padding: 0;
|
||||
|
||||
input:first-of-type {
|
||||
nav-left: none;
|
||||
}
|
||||
|
||||
input:last-of-type {
|
||||
nav-right: none;
|
||||
}
|
||||
|
||||
.config-option__tab-label {
|
||||
@extend %label-sm;
|
||||
@include trans-colors-opa;
|
||||
display: block;
|
||||
position: relative;
|
||||
height: auto;
|
||||
margin: space(4) space(12) 0;
|
||||
padding: space(8) 0;
|
||||
color: $color-text-inactive;
|
||||
tab-index: none;
|
||||
|
||||
&:hover {
|
||||
color: $color-text;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.config-option__checkbox-wrapper {
|
||||
@include trans-colors-opa;
|
||||
width: space(32);
|
||||
height: space(32);
|
||||
margin: space(4) space(12) 0;
|
||||
border-radius: $border-radius-sm;
|
||||
opacity: 0.5;
|
||||
background-color: $color-bg-overlay;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
&[checked] {
|
||||
background-color: $color-a;
|
||||
}
|
||||
}
|
||||
|
||||
.config-option__checkbox {
|
||||
@extend %nav-all;
|
||||
@include trans-colors-opa;
|
||||
visibility: visible;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
// TODO: Remove & Replace old stylings
|
||||
input.radio {
|
||||
@extend %nav-all;
|
||||
@include trans-colors-opa;
|
||||
visibility: visible;
|
||||
width: 0;
|
||||
height: 0;
|
||||
|
||||
&:not(:disabled) {
|
||||
&:checked + .config-option__tab-label {
|
||||
border-bottom: 1dp;
|
||||
border-color: $color-text;
|
||||
color: $color-text;
|
||||
|
||||
&:hover {
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
.rmlui-window:not([mouse-active]) &:focus + .config-option__tab-label {
|
||||
transition: none;
|
||||
animation: $focus-anim-border;
|
||||
border-color: $color-secondary;
|
||||
color: $color-secondary;
|
||||
}
|
||||
|
||||
&:focus + .config-option__tab-label,
|
||||
&:hover + .config-option__tab-label {
|
||||
color: $color-text;
|
||||
}
|
||||
}
|
||||
|
||||
&:disabled + .config-option__tab-label {
|
||||
opacity: 0.5;
|
||||
|
||||
&:hover {
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
input.range slidertrack {
|
||||
@include trans-colors;
|
||||
height: 2dp;
|
||||
margin-top: space(8);
|
||||
background-color: $color-border;
|
||||
}
|
||||
|
||||
input.range sliderbar {
|
||||
@include trans-colors;
|
||||
width: space(16);
|
||||
height: space(16);
|
||||
margin-top: space(1);
|
||||
margin-right: space(-8);
|
||||
margin-left: space(-8);
|
||||
transition: background-color $transition-quick;
|
||||
border-radius: 8dp;
|
||||
background-color: $color-text-dim;
|
||||
|
||||
.rmlui-window:not([mouse-active]) &:focus {
|
||||
@include border($color-a);
|
||||
animation: $focus-anim-bg;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: $color-text;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
input.range sliderbar:active,
|
||||
input.range slidertrack:active + sliderbar {
|
||||
background-color: $color-secondary;
|
||||
}
|
||||
|
||||
input.range sliderarrowdec,
|
||||
input.range sliderarrowinc {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.config-option__details {
|
||||
@extend %label-xs;
|
||||
height: space(18);
|
||||
margin: space(14) space(12) 0;
|
||||
color: $color-primary;
|
||||
}
|
||||
|
||||
.config-option-color {
|
||||
width: 100%;
|
||||
max-width: space(360);
|
||||
height: auto;
|
||||
margin-top: space(4);
|
||||
margin-left: space(12);
|
||||
padding: 0;
|
||||
|
||||
&__preview-wrapper {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
height: space(8 * 9);
|
||||
}
|
||||
|
||||
&__preview-block {
|
||||
display: block;
|
||||
width: space(8 * 11);
|
||||
height: 100%;
|
||||
border-width: $border-width-thickness;
|
||||
border-radius: $border-radius-lg;
|
||||
border-color: $color-border;
|
||||
}
|
||||
|
||||
&__hsv-wrapper {
|
||||
display: flex;
|
||||
flex: 1 1 100%;
|
||||
flex-direction: column;
|
||||
width: auto;
|
||||
height: auto;
|
||||
padding-left: space(8);
|
||||
|
||||
.config-option-range {
|
||||
flex: 1 1 auto;
|
||||
|
||||
label {
|
||||
min-width: space(72);
|
||||
}
|
||||
|
||||
input {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.config-option-range {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
width: 100%;
|
||||
max-width: space(360);
|
||||
height: auto;
|
||||
margin-top: space(4);
|
||||
padding: 0;
|
||||
|
||||
&__label {
|
||||
@extend %label-sm;
|
||||
|
||||
display: block;
|
||||
width: space(56);
|
||||
margin: 0 12dp;
|
||||
margin-right: space(16);
|
||||
padding: 0;
|
||||
color: $color-text;
|
||||
tab-index: none;
|
||||
}
|
||||
|
||||
&__range-input {
|
||||
flex: 1;
|
||||
|
||||
slidertrack {
|
||||
@include trans-colors;
|
||||
height: 2dp;
|
||||
margin-top: space(8);
|
||||
background-color: $color-border;
|
||||
}
|
||||
|
||||
sliderbar {
|
||||
@include trans-colors;
|
||||
width: space(16);
|
||||
height: space(16);
|
||||
margin-top: space(1);
|
||||
margin-right: space(-8);
|
||||
margin-left: space(-8);
|
||||
transition: background-color $transition-quick;
|
||||
border-radius: 8dp;
|
||||
background-color: $color-text-dim;
|
||||
|
||||
.rmlui-window:not([mouse-active]) &:focus {
|
||||
@include border($color-a);
|
||||
animation: $focus-anim-bg;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: $color-text;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
sliderbar:active,
|
||||
slidertrack:active + sliderbar {
|
||||
background-color: $color-secondary;
|
||||
}
|
||||
|
||||
sliderarrowdec,
|
||||
sliderarrowinc {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.config-option__range-wrapper {
|
||||
max-width: space(360);
|
||||
margin-top: space(4);
|
||||
}
|
||||
|
||||
.config-option__range-label {
|
||||
@extend %label-sm;
|
||||
|
||||
display: block;
|
||||
// flex: 0 0 space(32);
|
||||
width: space(56);
|
||||
margin: 0 12dp;
|
||||
margin-right: space(16);
|
||||
padding: 0;
|
||||
color: $color-text;
|
||||
tab-index: none;
|
||||
}
|
||||
|
||||
.config-option-dropdown, .config-option-textfield {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex: 1 1 100%;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
width: auto;
|
||||
height: auto;
|
||||
padding: space(8) space(24) space(8) space(12);
|
||||
|
||||
&__select {
|
||||
display: block;
|
||||
height: space(48);
|
||||
padding: space(14);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&__wrapper {
|
||||
// Cursed guess & check so that this appears to be the same height as the select
|
||||
$extra-space: 2;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
padding: space(0 + $extra-space) 0 space(10 + $extra-space);
|
||||
cursor: text;
|
||||
|
||||
input {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
|
||||
&__select, &__wrapper {
|
||||
@extend %body;
|
||||
@extend %nav-all;
|
||||
@include trans-colors-border;
|
||||
@include border($color-white-a50);
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
flex: 1 1 100%;
|
||||
|
||||
width: auto;
|
||||
border-radius: $border-radius-md;
|
||||
background-color: $color-white-a5;
|
||||
|
||||
&:hover, &:focus {
|
||||
@include border($color-white-a80);
|
||||
background-color: $color-white-a20;
|
||||
}
|
||||
|
||||
selectvalue {
|
||||
display: inline;
|
||||
height: auto;
|
||||
margin: auto 0;
|
||||
}
|
||||
|
||||
selectbox {
|
||||
@include border($color-border);
|
||||
margin-top: space(2);
|
||||
padding: space(4) 0;
|
||||
border-radius: $border-radius-md;
|
||||
background-color: $color-background-3;
|
||||
|
||||
option {
|
||||
@extend %nav-all;
|
||||
@include trans-colors;
|
||||
padding: space(8) space(12);
|
||||
background-color: $color-transparent;
|
||||
color: $color-text-dim;
|
||||
font-weight: 400;
|
||||
|
||||
&:hover, &:focus {
|
||||
background-color: $color-white-a20;
|
||||
}
|
||||
|
||||
&:hover:not(:checked) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&:checked {
|
||||
background-color: $color-white-a5;
|
||||
color: $color-white;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,170 @@
|
||||
@use 'sass:color';
|
||||
@use 'sass:math';
|
||||
|
||||
.control-option {
|
||||
@include set-color($color-text-dim);
|
||||
@include trans-colors-svg;
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
padding: space(4) space(16) space(4) space(20);
|
||||
border-radius: $border-radius-sm;
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
|
||||
&:focus-visible:not(:disabled, [disabled]),
|
||||
&:hover:not(:disabled, [disabled]) {
|
||||
@include set-color($color-text);
|
||||
background-color: $color-bg-overlay;
|
||||
}
|
||||
|
||||
&:disabled, &[disabled] {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
&--active {
|
||||
// while actively looking for inputs, set styles to the correct slots
|
||||
$valid-binding-slots: 0, 1;
|
||||
@each $slot in $valid-binding-slots {
|
||||
// global attr -> this active row -> binding slot
|
||||
[cur-binding-slot="#{$slot}"] & .control-option__binding[bind-slot="#{$slot}"] {
|
||||
border-color: $color-error;
|
||||
|
||||
.control-option__binding-icon {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.control-option__binding-recording {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.icon-button {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
}
|
||||
|
||||
.control-option__label {
|
||||
@extend %label-md;
|
||||
flex: 2 1 space(300);
|
||||
height: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.control-option__bindings {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex: 2 1 space(400);
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
height: space(56);
|
||||
padding: 0 space(12) 0 space(4);
|
||||
}
|
||||
|
||||
.control-option__binding {
|
||||
@include set-color($color-text-dim);
|
||||
@include trans-colors-border;
|
||||
display: flex;
|
||||
position: relative;
|
||||
|
||||
flex: 1 1 100%;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: space(56);
|
||||
margin: 0 space(4);
|
||||
padding: space(8);
|
||||
border-width: $border-width-thickness;
|
||||
border-radius: $border-radius-sm;
|
||||
border-color: $color-bg-overlay;
|
||||
background-color: $color-bg-overlay;
|
||||
|
||||
&:focus, &:hover {
|
||||
@include set-color($color-text);
|
||||
border-color: $color-text;
|
||||
background-color: $color-border-soft;
|
||||
}
|
||||
|
||||
&:active {
|
||||
@include set-color(color.scale($color-text, $lightness: 20%));
|
||||
}
|
||||
|
||||
&:disabled, &[disabled] {
|
||||
@include set-color($color-text-dim);
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
&:not([disabled]) {
|
||||
@extend %nav-all;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.control-option__binding-icon {
|
||||
@include trans-colors-opa;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@keyframes control-option__binding-recording-scale {
|
||||
0% {
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
50% {
|
||||
transform: scale(0.85);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
.control-option__binding-recording {
|
||||
@include trans-colors-opa;
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
opacity: 0;
|
||||
|
||||
.control-option__binding-circle {
|
||||
$rec-size: 24;
|
||||
|
||||
width: space($rec-size);
|
||||
height: space($rec-size);
|
||||
animation: 1.5s sine-in-out infinite control-option__binding-recording-scale;
|
||||
border-radius: space($rec-size);
|
||||
background-color: $color-error;
|
||||
}
|
||||
|
||||
.control-option__binding-edge {
|
||||
$edge-size: 36;
|
||||
$h-edge-size: math.div($edge-size, 2);
|
||||
|
||||
position: absolute;
|
||||
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: space($edge-size);
|
||||
height: space($edge-size);
|
||||
|
||||
transform: translate(-50%, -50%);
|
||||
|
||||
> svg.control-option__binding-edge-svg {
|
||||
width: space($edge-size);
|
||||
height: space($edge-size);
|
||||
image-color: $color-error;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
@use 'sass:color';
|
||||
|
||||
/*
|
||||
<button
|
||||
class="icon-button icon-button--error"
|
||||
>
|
||||
<svg src="icons/Trash.svg" />
|
||||
</button>
|
||||
*/
|
||||
@mixin create-icon-button-variation($base-col) {
|
||||
border-color: rgba($base-col, 0.8);
|
||||
background-color: rgba($base-col, 0.05);
|
||||
|
||||
&:focus, &:hover {
|
||||
border-color: $base-col;
|
||||
background-color: rgba($base-col, 0.3);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: rgba($base-col, 0.2);
|
||||
}
|
||||
}
|
||||
|
||||
$icon-button-size: 56 - ($border-width-thickness-num * 2);
|
||||
|
||||
.icon-button {
|
||||
@include set-color($color-text-dim);
|
||||
@include trans-colors-border;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: space($icon-button-size);
|
||||
min-width: space($icon-button-size);
|
||||
max-width: space($icon-button-size);
|
||||
height: space($icon-button-size);
|
||||
min-height: space($icon-button-size);
|
||||
max-height: space($icon-button-size);
|
||||
border-width: $border-width-thickness;
|
||||
border-radius: space($icon-button-size * 0.5);
|
||||
border-color: $color-transparent;
|
||||
background-color: $color-transparent;
|
||||
|
||||
&:focus, &:hover {
|
||||
@include set-color($color-text);
|
||||
background-color: $color-border;
|
||||
}
|
||||
|
||||
&:active {
|
||||
@include set-color(color.scale($color-text, $lightness: 20%));
|
||||
background-color: $color-border-soft;
|
||||
}
|
||||
|
||||
&:disabled,&[disabled] {
|
||||
@include set-color($color-text-dim);
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
&:not([disabled]) {
|
||||
@extend %nav-all;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
svg {
|
||||
width: space(32);
|
||||
height: space(32);
|
||||
}
|
||||
|
||||
&--primary {
|
||||
@include create-icon-button-variation($color-primary);
|
||||
}
|
||||
|
||||
&--secondary {
|
||||
@include create-icon-button-variation($color-secondary);
|
||||
}
|
||||
|
||||
&--tertiary {
|
||||
@include create-icon-button-variation($color-text);
|
||||
}
|
||||
|
||||
&--success {
|
||||
@include create-icon-button-variation($color-success);
|
||||
}
|
||||
|
||||
&--error {
|
||||
@include create-icon-button-variation($color-error);
|
||||
}
|
||||
|
||||
&--warning {
|
||||
@include create-icon-button-variation($color-warning);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,347 @@
|
||||
@use 'sass:math';
|
||||
|
||||
// Probably will need to adjust for other langs...
|
||||
$mapping-min-width: 80 * 8;
|
||||
$visual-max-width: $base-modal-max-width - $mapping-min-width - $scrollbar-width;
|
||||
|
||||
.input-config {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.input-config__horizontal-split {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex-direction: row;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.input-config__mappings {
|
||||
display: block;
|
||||
flex: 1 1 auto;
|
||||
min-width: space($mapping-min-width);
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.input-config__mappings-scroll {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-height: 100%;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.input-config__mappings-wrapper {
|
||||
padding: space(8);
|
||||
}
|
||||
|
||||
.input-config__visual-wrapper {
|
||||
display: block;
|
||||
flex: 1 1 100%;
|
||||
width: auto;
|
||||
max-width: space($visual-max-width);
|
||||
height: auto;
|
||||
max-height: space(math.div($visual-max-width, 4) * 3);
|
||||
margin: auto 0;
|
||||
}
|
||||
|
||||
.input-config__visual-aspect {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
margin: auto 0;
|
||||
padding-bottom: 75%;
|
||||
background-color: $color-bg-shadow;
|
||||
}
|
||||
|
||||
.input-config__visual {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: space(16);
|
||||
right: space(16);
|
||||
bottom: space(16);
|
||||
left: space(16);
|
||||
flex-direction: column;
|
||||
border-radius: space(108);
|
||||
background-color: $color-white-a5;
|
||||
}
|
||||
|
||||
.input-config__visual-half {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex: 1 1 100%;
|
||||
flex-direction: row;
|
||||
padding: 6%;
|
||||
|
||||
&--bottom {
|
||||
align-items: flex-end;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
|
||||
.input-config__visual-quarter-left {
|
||||
display: flex;
|
||||
flex: 1 1 50%;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.input-config__visual-quarter-right {
|
||||
display: flex;
|
||||
flex: 1 1 100%;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.input-config__visual-stick-wrapper {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.input-viz {
|
||||
@include trans-colors-opa;
|
||||
display: flex;
|
||||
position: relative;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
> svg:not(.input-viz__dpad-arrow) {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
&__mappings div {
|
||||
@extend %prompt-font-sm;
|
||||
}
|
||||
}
|
||||
|
||||
$all-inputs: A,
|
||||
B,
|
||||
Z,
|
||||
START,
|
||||
DPAD_UP,
|
||||
DPAD_DOWN,
|
||||
DPAD_LEFT,
|
||||
DPAD_RIGHT,
|
||||
L,
|
||||
R,
|
||||
C_UP,
|
||||
C_DOWN,
|
||||
C_LEFT,
|
||||
C_RIGHT,
|
||||
X_AXIS_NEG,
|
||||
X_AXIS_POS,
|
||||
Y_AXIS_NEG,
|
||||
Y_AXIS_POS;
|
||||
|
||||
// Show default state while no inputs are active
|
||||
[cur-input="NONE"] .input-viz[visual-input] {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@each $inp in $all-inputs {
|
||||
.input-viz[visual-input~="#{$inp}"] {
|
||||
opacity: 0.25;
|
||||
|
||||
[cur-input="#{$inp}"] & {
|
||||
opacity: 1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin set-sizes($sz) {
|
||||
width: space($sz);
|
||||
height: space($sz);
|
||||
|
||||
> svg {
|
||||
width: space($sz);
|
||||
height: space($sz);
|
||||
}
|
||||
}
|
||||
|
||||
.input-viz__button {
|
||||
@include set-color($color-text);
|
||||
|
||||
&--sm {
|
||||
@include set-sizes(64);
|
||||
}
|
||||
|
||||
&--md {
|
||||
@include set-sizes(76);
|
||||
}
|
||||
|
||||
&--lg {
|
||||
@include set-sizes(84);
|
||||
}
|
||||
|
||||
&--C {
|
||||
@include set-svgs-color($color-warning);
|
||||
}
|
||||
|
||||
&--A {
|
||||
@include set-svgs-color($color-a);
|
||||
margin-top: auto;
|
||||
}
|
||||
|
||||
&--B {
|
||||
@include set-svgs-color($color-success);
|
||||
}
|
||||
|
||||
&--Start {
|
||||
@include set-svgs-color($color-error);
|
||||
}
|
||||
}
|
||||
|
||||
.input-viz__Z {
|
||||
@include set-svgs-color($color-warning);
|
||||
@include set-sizes(136);
|
||||
}
|
||||
|
||||
$dpad-size: 192;
|
||||
|
||||
.input-viz.input-viz__dpad {
|
||||
@include set-svgs-color($color-text);
|
||||
@include set-sizes($dpad-size);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
$stick-size: 200;
|
||||
|
||||
.input-config__visual-stick {
|
||||
display: flex;
|
||||
position: relative;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: space($stick-size);
|
||||
height: space($stick-size);
|
||||
border-radius: space(math.div($stick-size, 2));
|
||||
background-color: $color-white-a5;
|
||||
}
|
||||
|
||||
.input-viz__dpad-split,
|
||||
.input-viz__stick-split {
|
||||
@include inset-block(0);
|
||||
display: flex;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
&--vertical {
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
&--horizontal {
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
> div {
|
||||
display: flex;
|
||||
flex: 1 1 100%;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
.input-viz__dpad-split > div {
|
||||
width: space(math.div($dpad-size, 3));
|
||||
height: space(math.div($dpad-size, 3));
|
||||
}
|
||||
|
||||
.input-viz__stick-split > div {
|
||||
width: space(math.div($stick-size, 3));
|
||||
height: space(math.div($stick-size, 3));
|
||||
}
|
||||
|
||||
.input-viz__dpad-arrow {
|
||||
$edge-dist: space(4);
|
||||
position: absolute;
|
||||
width: space(60);
|
||||
height: space(60);
|
||||
|
||||
&--up {
|
||||
top: $edge-dist;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
&--down {
|
||||
bottom: $edge-dist;
|
||||
margin: 0 auto;
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
&--left {
|
||||
left: $edge-dist;
|
||||
margin: auto 0;
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
|
||||
&--right {
|
||||
right: $edge-dist;
|
||||
margin: auto 0;
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
}
|
||||
|
||||
.input-viz__R {
|
||||
@include set-svgs-color($color-white);
|
||||
@include set-sizes(96);
|
||||
}
|
||||
|
||||
.input-viz__L {
|
||||
@include set-svgs-color($color-secondary);
|
||||
@include set-sizes(136);
|
||||
}
|
||||
|
||||
.input-config__c-buttons {
|
||||
position: relative;
|
||||
width: space(76 + 76 + 56);
|
||||
height: space(76 + 56);
|
||||
|
||||
&-lr, &-du {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
&-lr {
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
&-du {
|
||||
flex-direction: column-reverse;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.input-viz {
|
||||
&[visual-input="C_UP"] {
|
||||
margin-top: space(-32);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.input-config__main-buttons {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
width: space(268);
|
||||
height: space(128);
|
||||
margin-right: space(10);
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
|
||||
// TODO: Affect all elements with launcher fade-in
|
||||
// @keyframes fade-launcher-in {
|
||||
// 0% {
|
||||
// opacity: 0;
|
||||
// }
|
||||
// to {
|
||||
// opacity: 1;
|
||||
// }
|
||||
// }
|
||||
|
||||
.launcher {
|
||||
display: block;
|
||||
position: relative;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: $color-background-1;
|
||||
}
|
||||
|
||||
.launcher__vertical-split {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 50%;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
|
||||
&--right {
|
||||
right: 0;
|
||||
left: 50%;
|
||||
align-items: flex-end;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@keyframes slide-mm-bg-over {
|
||||
0% {
|
||||
transform: translateX(space(100));
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateX(space(0));
|
||||
}
|
||||
}
|
||||
|
||||
.launcher__background-wrapper {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: -55vw;
|
||||
right: -100%;
|
||||
bottom: -50vw;
|
||||
left: -70vw;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
transform: translateX(space(0));
|
||||
animation: 25s cubic-out 1 slide-mm-bg-over;
|
||||
}
|
||||
|
||||
@keyframes fade-mm-in {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
.launcher__background-bk {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: auto;
|
||||
height: 100%;
|
||||
animation: 2.5s cubic-in-out 1 fade-mm-in;
|
||||
opacity: 0.1;
|
||||
}
|
||||
|
||||
.launcher__title-quadrant {
|
||||
flex: 1 1 auto;
|
||||
width: auto;
|
||||
height: auto;
|
||||
padding-top: space(96);
|
||||
padding-left: space(96);
|
||||
|
||||
&--right {
|
||||
padding-right: space(96);
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.launcher__content-quadrant {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex: 1 1 100%;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-end;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
padding: space(32);
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
|
||||
/*
|
||||
Example layout:
|
||||
<button class="menu-list-item menu-list-item--right">
|
||||
<div class="menu-list-item__bullet">•</div>
|
||||
<div class="menu-list-item__label">Setup controls</div>
|
||||
</button>
|
||||
- Variants:
|
||||
.menu-list-item--right (align to right side)
|
||||
- Optional:
|
||||
- <div class="subtitle-title__disclaimer">Coming Soon™</div>
|
||||
|
||||
*/
|
||||
|
||||
.menu-list-item {
|
||||
@include set-color($color-text-dim);
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
padding: space(16);
|
||||
border-radius: $border-radius-sm;
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
cursor: pointer;
|
||||
|
||||
&--right {
|
||||
flex-direction: row-reverse;
|
||||
align-content: flex-end;
|
||||
|
||||
.menu-list-item__bullet {
|
||||
margin-left: space(12);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
&.menu-list-item:focus:not(:disabled, [disabled]),
|
||||
&.menu-list-item:hover:not(:disabled, [disabled]) {
|
||||
decorator: $primary-rl-fade;
|
||||
}
|
||||
}
|
||||
|
||||
&:focus:not(:disabled, [disabled]),
|
||||
&:hover:not(:disabled, [disabled]) {
|
||||
@include set-color($color-primary);
|
||||
decorator: $primary-lr-fade;
|
||||
|
||||
.menu-list-item__bullet {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
&:not(:disabled, [disabled]) {
|
||||
@extend %nav-all;
|
||||
}
|
||||
|
||||
&:disabled, &[disabled] {
|
||||
opacity: 0.5;
|
||||
tab-index: none;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.menu-list-item__label {
|
||||
@extend %label-lg;
|
||||
}
|
||||
|
||||
.menu-list-item__bullet {
|
||||
margin-right: space(12);
|
||||
opacity: 0;
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
@use 'sass:math';
|
||||
|
||||
$prompt-space: 24;
|
||||
|
||||
.prompt {
|
||||
&__overlay {
|
||||
background-color: $color-bg-overlay;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
&__overlay,
|
||||
&__content-wrapper {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
&__content-wrapper {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
&__content {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex: 1 1 100%;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
max-width: space(700);
|
||||
height: auto;
|
||||
margin: auto;
|
||||
border-width: $border-width-thickness;
|
||||
border-radius: $border-radius-modal;
|
||||
border-color: $color-border;
|
||||
background: $color-modal-overlay;
|
||||
|
||||
h3, p {
|
||||
margin: space($prompt-space);
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&__controls {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
padding: space($prompt-space) space(math.div($prompt-space, 2));
|
||||
border-top-width: $border-width-thickness;
|
||||
border-top-color: $color-border-soft;
|
||||
|
||||
.button {
|
||||
min-width: space(math.div(700, 3));
|
||||
margin: 0 space(math.div($prompt-space, 2));
|
||||
text-align: center;
|
||||
nav-up: none;
|
||||
nav-down: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
Example layout:
|
||||
|
||||
<button class="subtitle-title" disabled>
|
||||
<h3>Zelda 64: Recompiled</h3>
|
||||
<h1>Ocarina of Time</h1>
|
||||
<div class="subtitle-title__disclaimer">Coming Soon™</div>
|
||||
</button>
|
||||
- Variants:
|
||||
.subtitle-title--right (align to right side)
|
||||
- Optional:
|
||||
- <div class="subtitle-title__disclaimer">Coming Soon™</div>
|
||||
|
||||
*/
|
||||
|
||||
.subtitle-title {
|
||||
display: block;
|
||||
position: relative;
|
||||
flex-direction: column;
|
||||
align-content: flex-start;
|
||||
align-items: flex-start;
|
||||
width: auto;
|
||||
height: auto;
|
||||
padding: 0;
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
color: $color-text-dim;
|
||||
text-align: left;
|
||||
cursor: pointer;
|
||||
|
||||
&--right {
|
||||
align-content: flex-end;
|
||||
}
|
||||
|
||||
&--right, &--right > * {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
&[selected] {
|
||||
color: $color-text;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
&:focus:not(:disabled, [disabled]),
|
||||
&:hover:not(:disabled, [disabled], [selected]) {
|
||||
color: $color-primary;
|
||||
}
|
||||
|
||||
&:not(:disabled, [disabled]) {
|
||||
@extend %nav-all;
|
||||
}
|
||||
|
||||
&:disabled, &[disabled] {
|
||||
opacity: 0.5;
|
||||
cursor: default;
|
||||
tab-index: none;
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin-bottom: space(6);
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin-top: space(6);
|
||||
}
|
||||
|
||||
&__disclaimer {
|
||||
@extend %label-sm;
|
||||
|
||||
margin-top: space(16);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
Example:
|
||||
<tab class="tab">
|
||||
<div>Graphics</div>
|
||||
<div class="tab__indicator"></div>
|
||||
</tab>
|
||||
*/
|
||||
|
||||
.tabs tabs {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.tab {
|
||||
@extend %nav-all;
|
||||
@extend %header-3;
|
||||
display: block;
|
||||
position: relative;
|
||||
margin: 0;
|
||||
padding: space(20) space(24);
|
||||
transition: color $transition-quick;
|
||||
opacity: 0.9;
|
||||
background-color: rgba(0,0,0,0);
|
||||
color: $color-text-inactive;
|
||||
|
||||
&:selected {
|
||||
color: $color-text;
|
||||
|
||||
.tab__indicator {
|
||||
background-color: $color-border-solid;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
.rmlui-window:not([mouse-active]) &:focus {
|
||||
transition: none;
|
||||
animation: $focus-anim-border;
|
||||
|
||||
&:selected .tab__indicator {
|
||||
animation: $focus-anim-bg;
|
||||
}
|
||||
}
|
||||
|
||||
&:focus, &:hover {
|
||||
opacity: 1;
|
||||
color: $color-text;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.tab__indicator {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 2dp;
|
||||
left: 0;
|
||||
height: 2dp;
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
@use "sass:math";
|
||||
|
||||
$toggle-width: 162;
|
||||
$toggle-height: 72;
|
||||
|
||||
$toggle-floater-width: 80;
|
||||
$toggle-floater-height: 64;
|
||||
$toggle-floater-margin: 4;
|
||||
$toggle-checked-left-offset: $toggle-width - $toggle-floater-margin - $toggle-floater-width;
|
||||
|
||||
.toggle {
|
||||
@extend %nav-all;
|
||||
@include trans-colors-opa;
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: space($toggle-width);
|
||||
height: space($toggle-height);
|
||||
border-radius: space(math.div($toggle-height, 2));
|
||||
opacity: 0.9;
|
||||
background: $color-transparent;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover, &:focus-visible, &:focus {
|
||||
opacity: 1;
|
||||
background-color: $color-secondary-a30;
|
||||
}
|
||||
|
||||
&:active {
|
||||
opacity: 1;
|
||||
background-color: $color-secondary-a5;
|
||||
}
|
||||
|
||||
.toggle__border {
|
||||
@include inner-border-block($color-secondary-l);
|
||||
border-radius: space(math.div($toggle-height, 2));
|
||||
}
|
||||
|
||||
.toggle__floater {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: space($toggle-floater-margin);
|
||||
width: space($toggle-floater-width);
|
||||
height: space($toggle-floater-height);
|
||||
transform: translateY(-50%);
|
||||
border-radius: space(math.div($toggle-floater-height, 2));
|
||||
background: $color-secondary-d;
|
||||
}
|
||||
|
||||
&--checked {
|
||||
.toggle__floater {
|
||||
left: space($toggle-checked-left-offset);
|
||||
}
|
||||
|
||||
.toggle__icon {
|
||||
&.toggle__icon--left {
|
||||
opacity: 0.9;
|
||||
color: $color-secondary-l;
|
||||
}
|
||||
|
||||
&.toggle__icon--right {
|
||||
opacity: 1.0;
|
||||
color: $color-text;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.toggle__icons {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: space(16);
|
||||
left: space(16);
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
height: space(56);
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.toggle__icon {
|
||||
@extend %prompt-font-lg;
|
||||
@include trans-colors;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: space(56);
|
||||
height: space(56);
|
||||
color: $color-text;
|
||||
|
||||
&--right {
|
||||
opacity: 1;
|
||||
color: $color-secondary-l;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
@import "./CenteredPage";
|
||||
@import "./ControlOption";
|
||||
@import "./Tabs";
|
||||
@import "./Config";
|
||||
@import "./ConfigGroup";
|
||||
@import "./ConfigOption";
|
||||
@import "./ConfigDescription";
|
||||
@import "./InputConfig";
|
||||
@import "./Button";
|
||||
@import "./IconButton";
|
||||
@import "./Launcher";
|
||||
@import "./MenuListItem";
|
||||
@import "./SubtitleTitle";
|
||||
@import "./Toggle";
|
||||
@import "./BottomLeft";
|
||||
@import "./Prompt";
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
@function space($amt) {
|
||||
@return #{$amt}dp;
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
@import "./base";
|
||||
@import "./globals/old";
|
||||
@import "./globals/scrollbars";
|
||||
@import "./components/components";
|
||||
@import "./pages/pages";
|
||||
|
||||
$font-size: 20dp;
|
||||
|
||||
body
|
||||
{
|
||||
@extend %body;
|
||||
box-sizing: border-box;
|
||||
color: $color-text;
|
||||
font-family: $font-stack;
|
||||
}
|
||||
|
||||
.rmlui-window {
|
||||
opacity: 1;
|
||||
|
||||
&--hidden {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
&:not([mouse-active]) {
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-vert {
|
||||
@extend %nav-vert;
|
||||
}
|
||||
|
||||
.nav-horiz {
|
||||
@extend %nav-horiz;
|
||||
}
|
||||
|
||||
.nav-dir {
|
||||
@extend %nav-dir;
|
||||
}
|
||||
|
||||
.nav-foc {
|
||||
@extend %nav-foc;
|
||||
}
|
||||
|
||||
.nav-all {
|
||||
@extend %nav-all;
|
||||
}
|
||||
|
||||
*, *:before, *:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
h1 {
|
||||
@extend %header-1;
|
||||
}
|
||||
|
||||
h2 {
|
||||
@extend %header-2;
|
||||
}
|
||||
|
||||
h3 {
|
||||
@extend %header-3;
|
||||
}
|
||||
|
||||
.label-lg {
|
||||
@extend %label-lg;
|
||||
}
|
||||
|
||||
.label-md {
|
||||
@extend %label-md;
|
||||
}
|
||||
|
||||
.label-sm {
|
||||
@extend %label-sm;
|
||||
}
|
||||
|
||||
.prompt-font {
|
||||
@extend %prompt-font;
|
||||
}
|
||||
|
||||
.prompt-font-sm {
|
||||
@extend %prompt-font-sm;
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: $color-primary-d;
|
||||
}
|
||||
|
||||
@keyframes blue-pulse {
|
||||
0% {
|
||||
color: $color-secondary;
|
||||
}
|
||||
|
||||
50% {
|
||||
color: $color-secondary-l;
|
||||
}
|
||||
|
||||
100% {
|
||||
color: $color-secondary;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes blue-pulse-with-border {
|
||||
0% {
|
||||
border-color: $color-secondary;
|
||||
color: $color-secondary;
|
||||
}
|
||||
|
||||
50% {
|
||||
border-color: $color-secondary-l;
|
||||
color: $color-secondary-l;
|
||||
}
|
||||
|
||||
100% {
|
||||
border-color: $color-secondary;
|
||||
color: $color-secondary;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes blue-pulse-background {
|
||||
0% {
|
||||
background-color: $color-secondary;
|
||||
}
|
||||
|
||||
50% {
|
||||
background-color: $color-secondary-l;
|
||||
}
|
||||
|
||||
100% {
|
||||
background-color: $color-secondary;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,212 @@
|
||||
/* stylelint-disable color-no-hex */
|
||||
/* stylelint-disable selector-max-id */
|
||||
|
||||
* {
|
||||
box-sizing:border-box;
|
||||
}
|
||||
|
||||
hr {
|
||||
display:block;
|
||||
padding:1.5dp;
|
||||
background: $color-background-1;
|
||||
}
|
||||
|
||||
body {
|
||||
color: #fff;
|
||||
font-family: LatoLatin;
|
||||
font-size: 20dp;
|
||||
font-style: normal;
|
||||
font-weight: normal
|
||||
}
|
||||
|
||||
/* div {
|
||||
focus:none;
|
||||
tab-index:none;
|
||||
} */
|
||||
|
||||
div#window {
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-color: $color-border;
|
||||
background-color: $color-background-2;
|
||||
}
|
||||
|
||||
div#content {
|
||||
z-index: 2;
|
||||
width: auto;
|
||||
height: 100%;
|
||||
overflow: hidden auto;
|
||||
text-align: center
|
||||
}
|
||||
|
||||
p {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
input.submit {
|
||||
margin-left: 0
|
||||
}
|
||||
|
||||
|
||||
input.text,
|
||||
input.password {
|
||||
box-sizing: border-box;
|
||||
height: 31dp;
|
||||
padding: 11dp 10dp 0;
|
||||
text-align: left;
|
||||
cursor: text
|
||||
}
|
||||
|
||||
textarea {
|
||||
padding: 14dp 12dp 10dp;
|
||||
text-align: left;
|
||||
cursor: text
|
||||
}
|
||||
|
||||
input.text,
|
||||
input.password,
|
||||
select,
|
||||
textarea {
|
||||
/* color: #333; */
|
||||
|
||||
/* font-size: 13dp */
|
||||
height: auto;
|
||||
}
|
||||
|
||||
table input.text {
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
|
||||
/* height: 18dp; */
|
||||
margin: 0;
|
||||
border-width: $border-width-thickness;
|
||||
border-color: #000;
|
||||
background-color: #fff;
|
||||
font-size: 15dp;
|
||||
|
||||
/* padding: 0 5dp; */
|
||||
line-height: 1;
|
||||
decorator: none;
|
||||
|
||||
/* vertical-align: center; */
|
||||
}
|
||||
|
||||
select {
|
||||
// display: inline-block;
|
||||
// /* width: 175dp; */
|
||||
// /* height: 37dp; */
|
||||
// /* height: auto; */
|
||||
// text-align: left;
|
||||
// box-sizing:border-box;
|
||||
// /* padding: 4dp; */
|
||||
// vertical-align: center;
|
||||
// padding: 4dp;
|
||||
// border-radius: 5dp;
|
||||
// background-color: rgb(120, 120, 120);
|
||||
// width: 100%;
|
||||
}
|
||||
// select {
|
||||
// @extend %body;
|
||||
// display: flex;
|
||||
// align-items: center;
|
||||
// justify-content: flex-start;
|
||||
// box-sizing: border-box;
|
||||
// padding: space(16);
|
||||
// flex: 1 1 100%;
|
||||
// // width: auto;
|
||||
// height: space(1000);
|
||||
// border-radius: $border-radius-lg;
|
||||
// background-color: $color-white-a20;
|
||||
// }
|
||||
|
||||
// select selectvalue {
|
||||
// height: auto;
|
||||
// /* padding: 4dp; */
|
||||
// /* margin-right: 30dp; */
|
||||
// /* height: 25dp; */
|
||||
// /* padding: 4dp; */
|
||||
// /* decorator: image(selectvalue) */
|
||||
// }
|
||||
|
||||
// select:hover selectvalue {
|
||||
// /* margin-right: 30dp; */
|
||||
// /* height: 25dp; */
|
||||
// /* padding: 4dp; */
|
||||
// background-color: rgb(150, 150, 150);
|
||||
// /* decorator: image(selectvalue) */
|
||||
// }
|
||||
|
||||
// select selectarrow {
|
||||
// /* width: 30dp; */
|
||||
// /* height: 37dp; */
|
||||
// /* decorator: image(selectarrow) */
|
||||
// /* background-color: black; */
|
||||
// /* appearance: none; */
|
||||
// }
|
||||
|
||||
// select:hover selectarrow {
|
||||
// /* decorator: image(selectarrow-hover) */
|
||||
// }
|
||||
|
||||
// select:active selectarrow,
|
||||
// select selectarrow:checked {
|
||||
// /* decorator: image(selectarrow-active) */
|
||||
// }
|
||||
|
||||
// select selectbox {
|
||||
// /* margin-left: 1dp; */
|
||||
// /* margin-top: -7dp; */
|
||||
// /* margin-bottom: -10dp; */
|
||||
// /* width: 162dp; */
|
||||
// /* padding: 1dp 4dp 4dp 4dp */
|
||||
// }
|
||||
|
||||
// select selectbox,
|
||||
// tbody {
|
||||
// background-color: rgb(120,120,120);
|
||||
// /* decorator: tiled-box(selectbox-tl, selectbox-t, selectbox-tr, selectbox-l, selectbox-c, auto, selectbox-bl, selectbox-b, selectbox-br) */
|
||||
// }
|
||||
|
||||
// select selectbox option {
|
||||
// width: auto;
|
||||
// background-color: rgb(120, 120, 120)
|
||||
// }
|
||||
|
||||
// select selectbox option:nth-child(even),
|
||||
// tr:nth-child(even) {
|
||||
// background-color: rgb(100, 100, 100)
|
||||
// }
|
||||
|
||||
// select selectbox option:checked {
|
||||
// font-weight:bold;
|
||||
// color:rgb(255,255,255);
|
||||
// }
|
||||
|
||||
// select selectbox option:hover {
|
||||
// background: rgb(150,150,150)
|
||||
// }
|
||||
|
||||
input.radio {
|
||||
flex: 0;
|
||||
width:0dp;
|
||||
nav-up:auto;
|
||||
nav-right:auto;
|
||||
nav-down:auto;
|
||||
nav-left:auto;
|
||||
tab-index:auto;
|
||||
focus:auto;
|
||||
}
|
||||
|
||||
input.checkbox {
|
||||
width: space(20);
|
||||
height: space(20);
|
||||
nav-up:auto;
|
||||
nav-right:auto;
|
||||
nav-down:auto;
|
||||
nav-left:auto;
|
||||
tab-index:auto;
|
||||
focus:auto;
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
@use 'sass:math';
|
||||
|
||||
$scrollbar-width: 12;
|
||||
|
||||
@mixin _set-scroll-size($size-key) {
|
||||
#{$size-key}: space($scrollbar-width);
|
||||
|
||||
slidertrack {
|
||||
#{$size-key}: space($scrollbar-width);
|
||||
}
|
||||
|
||||
sliderbar {
|
||||
#{$size-key}: space($scrollbar-width);
|
||||
}
|
||||
}
|
||||
|
||||
scrollbarvertical,scrollbarhorizontal {
|
||||
margin: 0;
|
||||
border: 0;
|
||||
|
||||
slidertrack {
|
||||
background: $color-primary-l;
|
||||
opacity: 0.05;
|
||||
}
|
||||
|
||||
sliderbar {
|
||||
border-radius: space(math.div($scrollbar-width, 2) - 1);
|
||||
background: $color-primary-l;
|
||||
opacity: 0.1;
|
||||
|
||||
&:hover:not(:active) {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
&:active {
|
||||
opacity: 0.3;
|
||||
}
|
||||
}
|
||||
|
||||
sliderarrowdec, sliderarrowinc {
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
}
|
||||
|
||||
scrollbarvertical {
|
||||
@include _set-scroll-size(width);
|
||||
}
|
||||
|
||||
scrollbarhorizontal {
|
||||
@include _set-scroll-size(height);
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
|
||||
%nav-vert {
|
||||
nav-up: auto;
|
||||
nav-down: auto;
|
||||
}
|
||||
|
||||
%nav-horiz {
|
||||
nav-right: auto;
|
||||
nav-left: auto;
|
||||
}
|
||||
|
||||
%nav-dir {
|
||||
@extend %nav-vert;
|
||||
@extend %nav-horiz;
|
||||
}
|
||||
|
||||
%nav-foc {
|
||||
focus: auto;
|
||||
tab-index: auto;
|
||||
}
|
||||
|
||||
%nav-all {
|
||||
@extend %nav-dir;
|
||||
@extend %nav-foc;
|
||||
}
|
||||
|
||||
@mixin set-svgs-color($col) {
|
||||
svg {
|
||||
image-color: $col;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@include set-color(COLOR);
|
||||
*/
|
||||
@mixin set-color($col) {
|
||||
@include set-svgs-color($col);
|
||||
color: $col;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
/*
|
||||
@include trans-colors;
|
||||
*/
|
||||
@mixin trans-colors {
|
||||
transition: color $transition-quick, background-color $transition-quick;
|
||||
}
|
||||
|
||||
/*
|
||||
@include trans-colors-opa;
|
||||
*/
|
||||
@mixin trans-colors-opa {
|
||||
transition: color $transition-quick, background-color $transition-quick, opacity $transition-quick;
|
||||
}
|
||||
|
||||
/*
|
||||
@include trans-colors-svg;
|
||||
*/
|
||||
@mixin trans-colors-svg {
|
||||
transition: color $transition-quick, background-color $transition-quick, opacity $transition-quick;
|
||||
|
||||
svg {
|
||||
transition: image-color $transition-quick, background-color $transition-quick;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@include trans-colors-border;
|
||||
*/
|
||||
@mixin trans-colors-border {
|
||||
transition: color $transition-quick, background-color $transition-quick, opacity $transition-quick, border-color $transition-quick;
|
||||
|
||||
svg {
|
||||
transition: image-color $transition-quick, background-color $transition-quick;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
|
||||
$font-stack: LatoLatin;
|
||||
|
||||
@mixin set-font-sizing($sz, $spacing) {
|
||||
// font-family: $font-stack;
|
||||
$sz-add: $sz + 4;
|
||||
font-size: space($sz-add);
|
||||
letter-spacing: space($sz-add * $spacing);
|
||||
line-height: space($sz-add);
|
||||
}
|
||||
|
||||
%header-1 {
|
||||
@include set-font-sizing(64, 0.07);
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
%header-2 {
|
||||
@include set-font-sizing(48, 0.07);
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
%header-3 {
|
||||
@include set-font-sizing(32, 0.07);
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
%label-lg {
|
||||
@include set-font-sizing(32, 0.11);
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
%label-md {
|
||||
@include set-font-sizing(24, 0.11);
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
%label-sm {
|
||||
@include set-font-sizing(16, 0.14);
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
%label-xs {
|
||||
@include set-font-sizing(14, 0.14);
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
%body {
|
||||
@include set-font-sizing(16, 0.0);
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
%prompt-font-lg {
|
||||
font-family: promptfont;
|
||||
font-size: space(56);
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
line-height: space(56);
|
||||
}
|
||||
|
||||
%prompt-font {
|
||||
font-family: promptfont;
|
||||
font-size: space(40);
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
line-height: space(40);
|
||||
}
|
||||
|
||||
%prompt-font-sm {
|
||||
font-family: promptfont;
|
||||
font-size: space(32);
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
line-height: space(32);
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
@import "./config/config";
|
||||
@@ -0,0 +1 @@
|
||||
@import "./debug";
|
||||
@@ -0,0 +1,178 @@
|
||||
|
||||
.config-debug {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-height: 100%;
|
||||
padding: space(8);
|
||||
}
|
||||
|
||||
.config-debug__scroll {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-height: 100%;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.config-debug-option {
|
||||
@include set-color($color-text-dim);
|
||||
@include trans-colors-svg;
|
||||
@include border-bottom($color-border-soft);
|
||||
display: block;
|
||||
position: relative;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
padding: space(12) space(4);
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
|
||||
&:focus:not(:disabled, [disabled]),
|
||||
&:focus-visible:not(:disabled, [disabled]),
|
||||
&:hover:not(:disabled, [disabled]) {
|
||||
@include set-color($color-text);
|
||||
background-color: $color-bg-overlay;
|
||||
}
|
||||
|
||||
&:disabled, &[disabled] {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.icon-button {
|
||||
margin-left: space(8);
|
||||
}
|
||||
}
|
||||
|
||||
.config-debug__option-split {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.config-debug-option__label {
|
||||
@extend %label-md;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
padding: space(4) space(16) space(12);
|
||||
width: auto;
|
||||
height: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.config-debug__option-controls {
|
||||
display: block;
|
||||
position: relative;
|
||||
flex: 1 1 auto;
|
||||
height: auto;
|
||||
width: auto;
|
||||
max-width: space(800);
|
||||
padding: 0 space(12);
|
||||
}
|
||||
|
||||
.config-debug__option-trigger {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
||||
.config-debug__select-wrapper {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
flex: 1 1 100%;
|
||||
width: auto;
|
||||
max-width: space(800);
|
||||
height: auto;
|
||||
padding: space(4);
|
||||
|
||||
.config-debug__select-label {
|
||||
@extend %label-sm;
|
||||
padding-right: space(16);
|
||||
flex: auto;
|
||||
width: space(196);
|
||||
|
||||
> div {
|
||||
display: inline;
|
||||
width: auto;
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
|
||||
input {
|
||||
@extend %body;
|
||||
@extend %nav-all;
|
||||
display: block;
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
padding: 0;
|
||||
flex: 1 1 100%;
|
||||
width: auto;
|
||||
height: space(20);
|
||||
margin: auto 0;
|
||||
}
|
||||
|
||||
select {
|
||||
@extend %body;
|
||||
@extend %nav-all;
|
||||
@include trans-colors-border;
|
||||
@include border($color-white-a50);
|
||||
display: block;
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
padding: 0;
|
||||
flex: 1 1 100%;
|
||||
width: auto;
|
||||
height: space(48);
|
||||
border-radius: $border-radius-md;
|
||||
background-color: $color-white-a5;
|
||||
cursor: pointer;
|
||||
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
padding: space(14);
|
||||
|
||||
&:hover, &:focus {
|
||||
@include border($color-white-a80);
|
||||
background-color: $color-white-a20;
|
||||
}
|
||||
|
||||
selectvalue {
|
||||
display: inline;
|
||||
margin: auto 0;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
selectbox {
|
||||
@include border($color-white-a80);
|
||||
background-color: $color-background-3;
|
||||
padding: space(4) 0;
|
||||
margin-top: space(2);
|
||||
border-radius: $border-radius-md;
|
||||
|
||||
option {
|
||||
@extend %nav-all;
|
||||
@include trans-colors;
|
||||
padding: space(8) space(12);
|
||||
background-color: $color-transparent;
|
||||
color: $color-text-dim;
|
||||
font-weight: 400;
|
||||
|
||||
&:hover, &:focus {
|
||||
background-color: $color-white-a20;
|
||||
}
|
||||
|
||||
&:hover:not(:checked) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&:checked {
|
||||
color: $color-white;
|
||||
background-color: $color-white-a5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
$focus-anim: blue-pulse-with-border 0.75s infinite;
|
||||
$focus-anim-border: blue-pulse 0.75s infinite;
|
||||
$focus-anim-bg: blue-pulse-background 0.75s infinite;
|
||||
@@ -0,0 +1,42 @@
|
||||
|
||||
$border-radius-sm: 8dp;
|
||||
$border-radius-md: 12dp;
|
||||
// modals/pages
|
||||
$border-radius-lg: 16dp;
|
||||
|
||||
$border-radius-modal: $border-radius-lg;
|
||||
|
||||
$border-width-thickness-num: 1.1;
|
||||
// $border-width-thickness-num: 1.5;
|
||||
$border-width-thickness: space($border-width-thickness-num);
|
||||
|
||||
@mixin border($col: $color-border) {
|
||||
border-width: $border-width-thickness;
|
||||
border-color: $col;
|
||||
}
|
||||
|
||||
@mixin border-top($col: $color-border) {
|
||||
border-top-width: $border-width-thickness;
|
||||
border-top-color: $col;
|
||||
}
|
||||
|
||||
@mixin border-bottom($col: $color-border) {
|
||||
border-bottom-width: $border-width-thickness;
|
||||
border-bottom-color: $col;
|
||||
}
|
||||
|
||||
@mixin inset-block($inset-amt) {
|
||||
position: absolute;
|
||||
top: $inset-amt;
|
||||
right: $inset-amt;
|
||||
bottom: $inset-amt;
|
||||
left: $inset-amt;
|
||||
}
|
||||
|
||||
// add this to a child of the container that needs a border.
|
||||
// parent must have `position: relative`
|
||||
@mixin inner-border-block($col: $color-border) {
|
||||
@include inset-block($border-width-thickness);
|
||||
@include border($col);
|
||||
display: block;
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
/* stylelint-disable color-no-hex, color-hex-length */
|
||||
|
||||
$color-background-1: #08070D;
|
||||
$color-background-2: #121018;
|
||||
$color-background-3: #191622;
|
||||
$color-bg-overlay: rgba(190, 184, 219, 0.1000);
|
||||
$color-modal-overlay: rgba(8, 7, 13, 0.9000);
|
||||
$color-bg-shadow: rgba(0, 0, 0, 0.3500);
|
||||
$color-bg-shadow-2: rgba(8, 7, 13, 0.7200);
|
||||
$color-text: #F2F2F2;
|
||||
$color-text-dim: #CCCCCC;
|
||||
$color-text-inactive: rgba(255, 255, 255, 0.6000);
|
||||
$color-primary: #B97DF2;
|
||||
$color-primary-l: #DABAF7;
|
||||
$color-primary-d: #7A2AC6;
|
||||
$color-primary-a5: rgba(185, 125, 242, 0.0500);
|
||||
$color-primary-a20: rgba(185, 125, 242, 0.2000);
|
||||
$color-primary-a30: rgba(185, 125, 242, 0.3000);
|
||||
$color-primary-a50: rgba(185, 125, 242, 0.5000);
|
||||
$color-primary-a80: rgba(185, 125, 242, 0.8000);
|
||||
$color-secondary: #17D6E8;
|
||||
$color-secondary-l: #A2EFF6;
|
||||
$color-secondary-d: #25A1AD;
|
||||
$color-secondary-a5: rgba(23, 214, 232, 0.0500);
|
||||
$color-secondary-a20: rgba(23, 214, 232, 0.2000);
|
||||
$color-secondary-a30: rgba(23, 214, 232, 0.3000);
|
||||
$color-secondary-a50: rgba(23, 214, 232, 0.5000);
|
||||
$color-secondary-a80: rgba(23, 214, 232, 0.8000);
|
||||
$color-warning: #E9CD35;
|
||||
$color-warning-l: #F9E57C;
|
||||
$color-warning-d: #C5AA16;
|
||||
$color-warning-a5: rgba(233, 205, 53, 0.0500);
|
||||
$color-warning-a20: rgba(233, 205, 53, 0.2000);
|
||||
$color-warning-a30: rgba(233, 205, 53, 0.3000);
|
||||
$color-warning-a50: rgba(233, 205, 53, 0.5000);
|
||||
$color-warning-a80: rgba(233, 205, 53, 0.8000);
|
||||
$color-error: #F86039;
|
||||
$color-error-l: #FE8667;
|
||||
$color-error-d: #B23919;
|
||||
$color-error-a5: rgba(248, 96, 57, 0.0500);
|
||||
$color-error-a20: rgba(248, 96, 57, 0.2000);
|
||||
$color-error-a30: rgba(248, 96, 57, 0.3000);
|
||||
$color-error-a50: rgba(248, 96, 57, 0.5000);
|
||||
$color-error-a80: rgba(248, 96, 57, 0.8000);
|
||||
$color-success: #45D043;
|
||||
$color-success-l: #AAEAA9;
|
||||
$color-success-d: #2CA72A;
|
||||
$color-success-a5: rgba(69, 208, 67, 0.0500);
|
||||
$color-success-a20: rgba(69, 208, 67, 0.2000);
|
||||
$color-success-a30: rgba(69, 208, 67, 0.3000);
|
||||
$color-success-a50: rgba(69, 208, 67, 0.5000);
|
||||
$color-success-a80: rgba(69, 208, 67, 0.8000);
|
||||
$color-border: rgba(255, 255, 255, 0.2000);
|
||||
$color-border-soft: rgba(255, 255, 255, 0.1000);
|
||||
$color-border-hard: rgba(255, 255, 255, 0.3000);
|
||||
$color-border-solid: rgba(255, 255, 255, 0.6000);
|
||||
$color-transparent: rgba(0, 0, 0, 0.0000);
|
||||
$color-a: #3333FF;
|
||||
$color-a-l: #B2B2FF;
|
||||
$color-a-d: #2020AC;
|
||||
$color-a-a5: rgba(51, 51, 255, 0.0500);
|
||||
$color-a-a20: rgba(51, 51, 255, 0.2000);
|
||||
$color-a-a30: rgba(51, 51, 255, 0.3000);
|
||||
$color-a-a50: rgba(51, 51, 255, 0.5000);
|
||||
$color-a-a80: rgba(51, 51, 255, 0.8000);
|
||||
$color-white: #FFFFFF;
|
||||
$color-white-a5: rgba(255, 255, 255, 0.0500);
|
||||
$color-white-a20: rgba(255, 255, 255, 0.2000);
|
||||
$color-white-a30: rgba(255, 255, 255, 0.3000);
|
||||
$color-white-a50: rgba(255, 255, 255, 0.5000);
|
||||
$color-white-a80: rgba(255, 255, 255, 0.8000);
|
||||
@@ -0,0 +1,7 @@
|
||||
|
||||
// Not supported yet, need to use decorator: gradient atm
|
||||
// $primary-lr-fade: linear-gradient(90deg, rgba($color-primary-l, 0.08) 0%, rgba($color-primary-l, 0.00) 100%);
|
||||
// $primary-rl-fade: linear-gradient(90deg, rgba($color-primary-l, 0.00) 0%, rgba($color-primary-l, 0.08) 100%);
|
||||
|
||||
$primary-lr-fade: horizontal-gradient(#{$color-primary-d}14 #{$color-primary-l}00);
|
||||
$primary-rl-fade: horizontal-gradient(#{$color-primary-d}00 #{$color-primary-l}14);
|
||||
@@ -0,0 +1,7 @@
|
||||
@use 'sass:math';
|
||||
|
||||
// $page-margin: 32;
|
||||
$page-margin: 64;
|
||||
$base-height: 1080;
|
||||
$base-modal-height: $base-height - ($page-margin * 2);
|
||||
$base-modal-max-width: math.div($base-modal-height * 16, 9);
|
||||
@@ -0,0 +1,3 @@
|
||||
// see: lib/RmlUi/Source/Core/PropertyParserAnimation.cpp
|
||||
$transition-quick: 0.05s linear-in-out;
|
||||
// $transition-quick: 0.033s linear-in-out;
|
||||
@@ -0,0 +1,131 @@
|
||||
# Config file for Banjo-Kazooie NTSC 1.0 Recompilation.
|
||||
|
||||
[input]
|
||||
entrypoint = 0x80000400
|
||||
# Paths are relative to the location of this config file.
|
||||
output_func_path = "RecompiledFuncs"
|
||||
# symbols_file_path = "BanjoRecompSyms/bk.us.rev0.syms.toml"
|
||||
rom_file_path = "banjo.us.v10.decompressed.z64"
|
||||
elf_path = "banjo.us.v10.elf"
|
||||
|
||||
manual_funcs = [
|
||||
{ name = "__n_CSPVoiceHandler", section = ".core1", vram = 0x8025E438, size = 0x684 },
|
||||
{ name = "__code7AF80_func_803036A0", section = ".core2", vram = 0x803036A0, size = 0x160 },
|
||||
{ name = "__code7AF80_func_80303960", section = ".core2", vram = 0x80303960, size = 0x190 },
|
||||
{ name = "_gcdialog_freeZoomboxes", section = ".core2", vram = 0x8030F030, size = 0x48 },
|
||||
{ name = "__actor_free", section = ".core2", vram = 0x80328028, size = 0xF4 },
|
||||
{ name = "_baModel_preDraw", section = ".core2", vram = 0x80291ac4, size = 0x2C },
|
||||
{ name = "__chFrogMinigame_spawnJiggy", section = ".BGS", vram = 0x8038cb20, size = 0x28 },
|
||||
{ name = "__chFrogMinigame_textCallback", section = ".BGS", vram = 0x8038cb48, size = 0x6C },
|
||||
]
|
||||
|
||||
[patches]
|
||||
stubs = [
|
||||
]
|
||||
|
||||
renamed = [
|
||||
"wmemcpy"
|
||||
]
|
||||
|
||||
ignored = [
|
||||
# Boot segment libultra duplicates
|
||||
"boot___ll_div",
|
||||
"boot___ll_lshift",
|
||||
"boot___ll_mod",
|
||||
"boot___ll_mul",
|
||||
"boot___ll_rem",
|
||||
"boot___ll_rshift",
|
||||
"boot___ull_div",
|
||||
"boot___ull_divremi",
|
||||
"boot___ull_rem",
|
||||
"boot___ull_rshift",
|
||||
"boot___osInitialize_common",
|
||||
"boot_osPiRawStartDma",
|
||||
"boot_osPiGetStatus",
|
||||
"boot___osSetSR",
|
||||
"boot___osGetSR",
|
||||
"boot___osSetFpcCsr",
|
||||
"boot___osSiRawReadIo",
|
||||
"boot___osSiRawWriteIo",
|
||||
"boot___osExceptionPreamble",
|
||||
"boot___osExceptionPreamble2",
|
||||
"boot___osException",
|
||||
"boot_send_mesg",
|
||||
"boot_handle_CpU",
|
||||
"boot___osEnqueueAndYield",
|
||||
"boot___osEnqueueThread",
|
||||
"boot___osPopThread",
|
||||
"boot___osDispatchThread",
|
||||
"boot___osCleanupThread",
|
||||
"boot_osWritebackDCache",
|
||||
"boot_osInvalICache",
|
||||
"boot_osMapTLBRdb",
|
||||
"boot_osPiRawReadIo",
|
||||
"boot_osVirtualToPhysical",
|
||||
"boot___osSiDeviceBusy",
|
||||
"boot___osDequeueThread",
|
||||
"boot___osLeoInterrupt",
|
||||
"boot_osSetEventMesg",
|
||||
"boot_func_80003A30",
|
||||
"boot_osDestroyThread",
|
||||
"boot___osProbeTLB",
|
||||
"boot_osLeoDiskInit",
|
||||
"boot_osEPiRawStartDma",
|
||||
"boot___osDisableInt",
|
||||
"boot___osRestoreInt",
|
||||
"boot_osCreatePiManager",
|
||||
"boot_osCartRomInit",
|
||||
"boot_osCreateMesgQueue",
|
||||
"boot___osPiCreateAccessQueue",
|
||||
"boot___osPiGetAccess",
|
||||
"boot___osPiRelAccess",
|
||||
"boot_osGetThreadPri",
|
||||
"boot_osSetThreadPri",
|
||||
"boot_osCreateThread",
|
||||
"boot___osDevMgrMain",
|
||||
"boot_osStartThread",
|
||||
"boot_osSendMesg",
|
||||
"boot_osRecvMesg",
|
||||
"boot___osResetGlobalIntMask",
|
||||
"boot_osEPiRawWriteIo",
|
||||
"boot_osEPiRawReadIo",
|
||||
"boot___osSetGlobalIntMask",
|
||||
"boot_osYieldThread",
|
||||
# Unnamed exceptasm functions:
|
||||
"func_8026A2E0",
|
||||
"func_8026A824",
|
||||
# Misspelled functions
|
||||
"osWriteBackDCacheAll",
|
||||
]
|
||||
|
||||
# Single-instruction patches
|
||||
|
||||
[[patches.instruction]]
|
||||
func = "viewport_setRenderPerspectiveMatrix"
|
||||
vram = 0x8024C9A8
|
||||
value = 0x3C0E8000 # lui $t6, 0xA000 -> lui $t6, 0x8000
|
||||
|
||||
[[patches.instruction]]
|
||||
func = "anctrl_setDuration"
|
||||
vram = 0x8028768C
|
||||
value = 0x3C0E8000 # lui $t6, 0xA000 -> lui $t6, 0x8000
|
||||
|
||||
[[patches.instruction]]
|
||||
func = "func_802D3DA4"
|
||||
vram = 0x802D3DAC
|
||||
value = 0x3C0E8000 # lui $t6, 0xA000 -> lui $t6, 0x8000
|
||||
|
||||
[[patches.instruction]]
|
||||
func = "func_8038F4C0"
|
||||
vram = 0x8038F4E0
|
||||
value = 0x3C0E8000 # lui $t6, 0xA000 -> lui $t6, 0x8000
|
||||
|
||||
[[patches.instruction]]
|
||||
func = "func_8038AC04"
|
||||
vram = 0x8038AC0C
|
||||
value = 0x3C0E8000 # lui $t6, 0xA000 -> lui $t6, 0x8000
|
||||
|
||||
[[patches.instruction]]
|
||||
func = "func_80388D48"
|
||||
vram = 0x80388D50
|
||||
value = 0x3C0E8000 # lui $t6, 0xA000 -> lui $t6, 0x8000
|
||||
@@ -0,0 +1,65 @@
|
||||
#ifndef __BANJO_CONFIG_H__
|
||||
#define __BANJO_CONFIG_H__
|
||||
|
||||
#include <filesystem>
|
||||
#include <string_view>
|
||||
#include "ultramodern/config.hpp"
|
||||
#include "recomp_input.h"
|
||||
|
||||
namespace banjo {
|
||||
constexpr std::u8string_view program_id = u8"BanjoRecompiled";
|
||||
constexpr std::string_view program_name = "Banjo: Recompiled";
|
||||
|
||||
// TODO: Move loading configs to the runtime once we have a way to allow per-project customization.
|
||||
void load_config();
|
||||
void save_config();
|
||||
|
||||
void reset_input_bindings();
|
||||
void reset_cont_input_bindings();
|
||||
void reset_kb_input_bindings();
|
||||
void reset_single_input_binding(recomp::InputDevice device, recomp::GameInput input);
|
||||
|
||||
std::filesystem::path get_app_folder_path();
|
||||
|
||||
bool get_debug_mode_enabled();
|
||||
void set_debug_mode_enabled(bool enabled);
|
||||
|
||||
enum class CameraInvertMode {
|
||||
InvertNone,
|
||||
InvertX,
|
||||
InvertY,
|
||||
InvertBoth,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(banjo::CameraInvertMode, {
|
||||
{banjo::CameraInvertMode::InvertNone, "InvertNone"},
|
||||
{banjo::CameraInvertMode::InvertX, "InvertX"},
|
||||
{banjo::CameraInvertMode::InvertY, "InvertY"},
|
||||
{banjo::CameraInvertMode::InvertBoth, "InvertBoth"}
|
||||
});
|
||||
|
||||
CameraInvertMode get_camera_invert_mode();
|
||||
void set_camera_invert_mode(CameraInvertMode mode);
|
||||
|
||||
CameraInvertMode get_analog_camera_invert_mode();
|
||||
void set_analog_camera_invert_mode(CameraInvertMode mode);
|
||||
|
||||
enum class AnalogCamMode {
|
||||
On,
|
||||
Off,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(banjo::AnalogCamMode, {
|
||||
{banjo::AnalogCamMode::On, "On"},
|
||||
{banjo::AnalogCamMode::Off, "Off"}
|
||||
});
|
||||
|
||||
AnalogCamMode get_analog_cam_mode();
|
||||
void set_analog_cam_mode(AnalogCamMode mode);
|
||||
|
||||
void open_quit_game_prompt();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,4 @@
|
||||
#ifndef __BANJO_DEBUG_H__
|
||||
#define __BANJO_DEBUG_H__
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,14 @@
|
||||
#ifndef __BANJO_GAME_H__
|
||||
#define __BANJO_GAME_H__
|
||||
|
||||
#include <cstdint>
|
||||
#include <span>
|
||||
#include <vector>
|
||||
#include "recomp.h"
|
||||
|
||||
namespace banjo {
|
||||
std::vector<uint8_t> decompress_bk(std::span<const uint8_t> compressed_rom);
|
||||
void bk_on_init(uint8_t* rdram, recomp_context* ctx);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,49 @@
|
||||
#ifndef __BANJO_RENDER_H__
|
||||
#define __BANJO_RENDER_H__
|
||||
|
||||
#include <unordered_set>
|
||||
#include <filesystem>
|
||||
|
||||
#include "common/rt64_user_configuration.h"
|
||||
#include "ultramodern/renderer_context.hpp"
|
||||
#include "librecomp/mods.hpp"
|
||||
|
||||
namespace RT64 {
|
||||
struct Application;
|
||||
}
|
||||
|
||||
namespace banjo {
|
||||
namespace renderer {
|
||||
class RT64Context final : public ultramodern::renderer::RendererContext {
|
||||
public:
|
||||
~RT64Context() override;
|
||||
RT64Context(uint8_t *rdram, ultramodern::renderer::WindowHandle window_handle, bool developer_mode);
|
||||
|
||||
bool valid() override { return static_cast<bool>(app); }
|
||||
|
||||
bool update_config(const ultramodern::renderer::GraphicsConfig &old_config, const ultramodern::renderer::GraphicsConfig &new_config) override;
|
||||
|
||||
void enable_instant_present() override;
|
||||
void send_dl(const OSTask *task) override;
|
||||
void update_screen(uint32_t vi_origin) override;
|
||||
void shutdown() override;
|
||||
uint32_t get_display_framerate() const override;
|
||||
float get_resolution_scale() const override;
|
||||
|
||||
protected:
|
||||
std::unique_ptr<RT64::Application> app;
|
||||
std::unordered_set<std::filesystem::path> enabled_texture_packs;
|
||||
};
|
||||
|
||||
std::unique_ptr<ultramodern::renderer::RendererContext> create_render_context(uint8_t *rdram, ultramodern::renderer::WindowHandle window_handle, bool developer_mode);
|
||||
|
||||
RT64::UserConfiguration::Antialiasing RT64MaxMSAA();
|
||||
bool RT64SamplePositionsSupported();
|
||||
bool RT64HighPrecisionFBEnabled();
|
||||
|
||||
void enable_texture_pack(const recomp::mods::ModHandle& mod);
|
||||
void disable_texture_pack(const recomp::mods::ModHandle& mod);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,12 @@
|
||||
#ifndef __BANJO_SOUND_H__
|
||||
#define __BANJO_SOUND_H__
|
||||
|
||||
namespace banjo {
|
||||
void reset_sound_settings();
|
||||
void set_main_volume(int volume);
|
||||
int get_main_volume();
|
||||
void set_bgm_volume(int volume);
|
||||
int get_bgm_volume();
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef __OVL_PATCHES_HPP__
|
||||
#define __OVL_PATCHES_HPP__
|
||||
|
||||
namespace banjo {
|
||||
void register_bk_overlays();
|
||||
void register_bk_patches();
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,872 @@
|
||||
// PromptFont by Yukari "Shinmera" Hafner, accessible at https://shinmera.com/promptfont
|
||||
#ifndef __PROMPTFONT_H__
|
||||
#define __PROMPTFONT_H__
|
||||
#define PF_ASCII_BANG "!"
|
||||
#define PF_ASCII_BANG_INT 0x00021
|
||||
#define PF_ASCII_DOUBLEQUOTE "\""
|
||||
#define PF_ASCII_DOUBLEQUOTE_INT 0x00022
|
||||
#define PF_ASCII_HASH "#"
|
||||
#define PF_ASCII_HASH_INT 0x00023
|
||||
#define PF_ASCII_DOLLAR "$"
|
||||
#define PF_ASCII_DOLLAR_INT 0x00024
|
||||
#define PF_ASCII_PERCENT "%"
|
||||
#define PF_ASCII_PERCENT_INT 0x00025
|
||||
#define PF_ASCII_AMPERSAND "&"
|
||||
#define PF_ASCII_AMPERSAND_INT 0x00026
|
||||
#define PF_ASCII_QUOTE "'"
|
||||
#define PF_ASCII_QUOTE_INT 0x00027
|
||||
#define PF_ASCII_OPEN_PAREN "("
|
||||
#define PF_ASCII_OPEN_PAREN_INT 0x00028
|
||||
#define PF_ASCII_CLOSE_PAREN ")"
|
||||
#define PF_ASCII_CLOSE_PAREN_INT 0x00029
|
||||
#define PF_ASCII_STAR "*"
|
||||
#define PF_ASCII_STAR_INT 0x0002A
|
||||
#define PF_ASCII_PLUS "+"
|
||||
#define PF_ASCII_PLUS_INT 0x0002B
|
||||
#define PF_ASCII_COMMA ","
|
||||
#define PF_ASCII_COMMA_INT 0x0002C
|
||||
#define PF_ASCII_DASH "-"
|
||||
#define PF_ASCII_DASH_INT 0x0002D
|
||||
#define PF_ASCII_PERIOD "."
|
||||
#define PF_ASCII_PERIOD_INT 0x0002E
|
||||
#define PF_ASCII_SLASH "/"
|
||||
#define PF_ASCII_SLASH_INT 0x0002F
|
||||
#define PF_ASCII_0 "0"
|
||||
#define PF_ASCII_0_INT 0x00030
|
||||
#define PF_ASCII_1 "1"
|
||||
#define PF_ASCII_1_INT 0x00031
|
||||
#define PF_ASCII_2 "2"
|
||||
#define PF_ASCII_2_INT 0x00032
|
||||
#define PF_ASCII_3 "3"
|
||||
#define PF_ASCII_3_INT 0x00033
|
||||
#define PF_ASCII_4 "4"
|
||||
#define PF_ASCII_4_INT 0x00034
|
||||
#define PF_ASCII_5 "5"
|
||||
#define PF_ASCII_5_INT 0x00035
|
||||
#define PF_ASCII_6 "6"
|
||||
#define PF_ASCII_6_INT 0x00036
|
||||
#define PF_ASCII_7 "7"
|
||||
#define PF_ASCII_7_INT 0x00037
|
||||
#define PF_ASCII_8 "8"
|
||||
#define PF_ASCII_8_INT 0x00038
|
||||
#define PF_ASCII_9 "9"
|
||||
#define PF_ASCII_9_INT 0x00039
|
||||
#define PF_ASCII_COLON ":"
|
||||
#define PF_ASCII_COLON_INT 0x0003A
|
||||
#define PF_ASCII_SEMICOLON ";"
|
||||
#define PF_ASCII_SEMICOLON_INT 0x0003B
|
||||
#define PF_ASCII_OPEN_CARET "<"
|
||||
#define PF_ASCII_OPEN_CARET_INT 0x0003C
|
||||
#define PF_ASCII_EQUALS "="
|
||||
#define PF_ASCII_EQUALS_INT 0x0003D
|
||||
#define PF_ASCII_CLOSE_CARET ">"
|
||||
#define PF_ASCII_CLOSE_CARET_INT 0x0003E
|
||||
#define PF_ASCII_QUESTION "?"
|
||||
#define PF_ASCII_QUESTION_INT 0x0003F
|
||||
#define PF_ASCII_AT "@"
|
||||
#define PF_ASCII_AT_INT 0x00040
|
||||
#define PF_ASCII_UPPER_A "A"
|
||||
#define PF_ASCII_UPPER_A_INT 0x00041
|
||||
#define PF_ASCII_UPPER_B "B"
|
||||
#define PF_ASCII_UPPER_B_INT 0x00042
|
||||
#define PF_ASCII_UPPER_C "C"
|
||||
#define PF_ASCII_UPPER_C_INT 0x00043
|
||||
#define PF_ASCII_UPPER_D "D"
|
||||
#define PF_ASCII_UPPER_D_INT 0x00044
|
||||
#define PF_ASCII_UPPER_E "E"
|
||||
#define PF_ASCII_UPPER_E_INT 0x00045
|
||||
#define PF_ASCII_UPPER_F "F"
|
||||
#define PF_ASCII_UPPER_F_INT 0x00046
|
||||
#define PF_ASCII_UPPER_G "G"
|
||||
#define PF_ASCII_UPPER_G_INT 0x00047
|
||||
#define PF_ASCII_UPPER_H "H"
|
||||
#define PF_ASCII_UPPER_H_INT 0x00048
|
||||
#define PF_ASCII_UPPER_I "I"
|
||||
#define PF_ASCII_UPPER_I_INT 0x00049
|
||||
#define PF_ASCII_UPPER_J "J"
|
||||
#define PF_ASCII_UPPER_J_INT 0x0004A
|
||||
#define PF_ASCII_UPPER_K "K"
|
||||
#define PF_ASCII_UPPER_K_INT 0x0004B
|
||||
#define PF_ASCII_UPPER_L "L"
|
||||
#define PF_ASCII_UPPER_L_INT 0x0004C
|
||||
#define PF_ASCII_UPPER_M "M"
|
||||
#define PF_ASCII_UPPER_M_INT 0x0004D
|
||||
#define PF_ASCII_UPPER_N "N"
|
||||
#define PF_ASCII_UPPER_N_INT 0x0004E
|
||||
#define PF_ASCII_UPPER_O "O"
|
||||
#define PF_ASCII_UPPER_O_INT 0x0004F
|
||||
#define PF_ASCII_UPPER_P "P"
|
||||
#define PF_ASCII_UPPER_P_INT 0x00050
|
||||
#define PF_ASCII_UPPER_Q "Q"
|
||||
#define PF_ASCII_UPPER_Q_INT 0x00051
|
||||
#define PF_ASCII_UPPER_R "R"
|
||||
#define PF_ASCII_UPPER_R_INT 0x00052
|
||||
#define PF_ASCII_UPPER_S "S"
|
||||
#define PF_ASCII_UPPER_S_INT 0x00053
|
||||
#define PF_ASCII_UPPER_T "T"
|
||||
#define PF_ASCII_UPPER_T_INT 0x00054
|
||||
#define PF_ASCII_UPPER_U "U"
|
||||
#define PF_ASCII_UPPER_U_INT 0x00055
|
||||
#define PF_ASCII_UPPER_V "V"
|
||||
#define PF_ASCII_UPPER_V_INT 0x00056
|
||||
#define PF_ASCII_UPPER_W "W"
|
||||
#define PF_ASCII_UPPER_W_INT 0x00057
|
||||
#define PF_ASCII_UPPER_X "X"
|
||||
#define PF_ASCII_UPPER_X_INT 0x00058
|
||||
#define PF_ASCII_UPPER_Y "Y"
|
||||
#define PF_ASCII_UPPER_Y_INT 0x00059
|
||||
#define PF_ASCII_UPPER_Z "Z"
|
||||
#define PF_ASCII_UPPER_Z_INT 0x0005A
|
||||
#define PF_ASCII_OPEN_BRACKET "["
|
||||
#define PF_ASCII_OPEN_BRACKET_INT 0x0005B
|
||||
#define PF_ASCII_BACKSLASH "\\"
|
||||
#define PF_ASCII_BACKSLASH_INT 0x0005C
|
||||
#define PF_ASCII_CLOSE_BRACKET "]"
|
||||
#define PF_ASCII_CLOSE_BRACKET_INT 0x0005D
|
||||
#define PF_ASCII_CARET "^"
|
||||
#define PF_ASCII_CARET_INT 0x0005E
|
||||
#define PF_ASCII_UNDERSCORE "_"
|
||||
#define PF_ASCII_UNDERSCORE_INT 0x0005F
|
||||
#define PF_ASCII_BACKTICK "`"
|
||||
#define PF_ASCII_BACKTICK_INT 0x00060
|
||||
#define PF_ASCII_LOWER_A "a"
|
||||
#define PF_ASCII_LOWER_A_INT 0x00061
|
||||
#define PF_ASCII_LOWER_B "b"
|
||||
#define PF_ASCII_LOWER_B_INT 0x00062
|
||||
#define PF_ASCII_LOWER_C "c"
|
||||
#define PF_ASCII_LOWER_C_INT 0x00063
|
||||
#define PF_ASCII_LOWER_D "d"
|
||||
#define PF_ASCII_LOWER_D_INT 0x00064
|
||||
#define PF_ASCII_LOWER_E "e"
|
||||
#define PF_ASCII_LOWER_E_INT 0x00065
|
||||
#define PF_ASCII_LOWER_F "f"
|
||||
#define PF_ASCII_LOWER_F_INT 0x00066
|
||||
#define PF_ASCII_LOWER_G "g"
|
||||
#define PF_ASCII_LOWER_G_INT 0x00067
|
||||
#define PF_ASCII_LOWER_H "h"
|
||||
#define PF_ASCII_LOWER_H_INT 0x00068
|
||||
#define PF_ASCII_LOWER_I "i"
|
||||
#define PF_ASCII_LOWER_I_INT 0x00069
|
||||
#define PF_ASCII_LOWER_J "j"
|
||||
#define PF_ASCII_LOWER_J_INT 0x0006A
|
||||
#define PF_ASCII_LOWER_K "k"
|
||||
#define PF_ASCII_LOWER_K_INT 0x0006B
|
||||
#define PF_ASCII_LOWER_L "l"
|
||||
#define PF_ASCII_LOWER_L_INT 0x0006C
|
||||
#define PF_ASCII_LOWER_M "m"
|
||||
#define PF_ASCII_LOWER_M_INT 0x0006D
|
||||
#define PF_ASCII_LOWER_N "n"
|
||||
#define PF_ASCII_LOWER_N_INT 0x0006E
|
||||
#define PF_ASCII_LOWER_O "o"
|
||||
#define PF_ASCII_LOWER_O_INT 0x0006F
|
||||
#define PF_ASCII_LOWER_P "p"
|
||||
#define PF_ASCII_LOWER_P_INT 0x00070
|
||||
#define PF_ASCII_LOWER_Q "q"
|
||||
#define PF_ASCII_LOWER_Q_INT 0x00071
|
||||
#define PF_ASCII_LOWER_R "r"
|
||||
#define PF_ASCII_LOWER_R_INT 0x00072
|
||||
#define PF_ASCII_LOWER_S "s"
|
||||
#define PF_ASCII_LOWER_S_INT 0x00073
|
||||
#define PF_ASCII_LOWER_T "t"
|
||||
#define PF_ASCII_LOWER_T_INT 0x00074
|
||||
#define PF_ASCII_LOWER_U "u"
|
||||
#define PF_ASCII_LOWER_U_INT 0x00075
|
||||
#define PF_ASCII_LOWER_V "v"
|
||||
#define PF_ASCII_LOWER_V_INT 0x00076
|
||||
#define PF_ASCII_LOWER_W "w"
|
||||
#define PF_ASCII_LOWER_W_INT 0x00077
|
||||
#define PF_ASCII_LOWER_X "x"
|
||||
#define PF_ASCII_LOWER_X_INT 0x00078
|
||||
#define PF_ASCII_LOWER_Y "y"
|
||||
#define PF_ASCII_LOWER_Y_INT 0x00079
|
||||
#define PF_ASCII_LOWER_Z "z"
|
||||
#define PF_ASCII_LOWER_Z_INT 0x0007A
|
||||
#define PF_ASCII_OPEN_BRACE "{"
|
||||
#define PF_ASCII_OPEN_BRACE_INT 0x0007B
|
||||
#define PF_ASCII_BAR "|"
|
||||
#define PF_ASCII_BAR_INT 0x0007C
|
||||
#define PF_ASCII_CLOSE_BRACE "}"
|
||||
#define PF_ASCII_CLOSE_BRACE_INT 0x0007D
|
||||
#define PF_ASCII_TILDE "~"
|
||||
#define PF_ASCII_TILDE_INT 0x0007E
|
||||
#define PF_ICON_EXCHANGE "↔"
|
||||
#define PF_ICON_EXCHANGE_INT 0x02194
|
||||
#define PF_ICON_REVERSE "↕"
|
||||
#define PF_ICON_REVERSE_INT 0x02195
|
||||
#define PF_XBOX_LEFT_TRIGGER "↖"
|
||||
#define PF_XBOX_LEFT_TRIGGER_INT 0x02196
|
||||
#define PF_XBOX_RIGHT_TRIGGER "↗"
|
||||
#define PF_XBOX_RIGHT_TRIGGER_INT 0x02197
|
||||
#define PF_XBOX_LEFT_SHOULDER "↘"
|
||||
#define PF_XBOX_LEFT_SHOULDER_INT 0x02198
|
||||
#define PF_XBOX_RIGHT_SHOULDER "↙"
|
||||
#define PF_XBOX_RIGHT_SHOULDER_INT 0x02199
|
||||
#define PF_NINTENDO_LEFT_TRIGGER "↚"
|
||||
#define PF_NINTENDO_LEFT_TRIGGER_INT 0x0219A
|
||||
#define PF_NINTENDO_RIGHT_TRIGGER "↛"
|
||||
#define PF_NINTENDO_RIGHT_TRIGGER_INT 0x0219B
|
||||
#define PF_NINTENDO_LEFT_SHOULDER "↜"
|
||||
#define PF_NINTENDO_LEFT_SHOULDER_INT 0x0219C
|
||||
#define PF_NINTENDO_RIGHT_SHOULDER "↝"
|
||||
#define PF_NINTENDO_RIGHT_SHOULDER_INT 0x0219D
|
||||
#define PF_DPAD_LEFT "↞"
|
||||
#define PF_DPAD_LEFT_INT 0x0219E
|
||||
#define PF_DPAD_UP "↟"
|
||||
#define PF_DPAD_UP_INT 0x0219F
|
||||
#define PF_DPAD_RIGHT "↠"
|
||||
#define PF_DPAD_RIGHT_INT 0x021A0
|
||||
#define PF_DPAD_DOWN "↡"
|
||||
#define PF_DPAD_DOWN_INT 0x021A1
|
||||
#define PF_DPAD_LEFT_RIGHT "↢"
|
||||
#define PF_DPAD_LEFT_RIGHT_INT 0x021A2
|
||||
#define PF_DPAD_UP_DOWN "↣"
|
||||
#define PF_DPAD_UP_DOWN_INT 0x021A3
|
||||
#define PF_GAMEPAD_X "↤"
|
||||
#define PF_GAMEPAD_X_INT 0x021A4
|
||||
#define PF_GAMEPAD_Y "↥"
|
||||
#define PF_GAMEPAD_Y_INT 0x021A5
|
||||
#define PF_GAMEPAD_B "↦"
|
||||
#define PF_GAMEPAD_B_INT 0x021A6
|
||||
#define PF_GAMEPAD_A "↧"
|
||||
#define PF_GAMEPAD_A_INT 0x021A7
|
||||
#define PF_ANALOG_L_CLOCKWISE "↩"
|
||||
#define PF_ANALOG_L_CLOCKWISE_INT 0x021A9
|
||||
#define PF_ANALOG_L_COUNTER "↪"
|
||||
#define PF_ANALOG_L_COUNTER_INT 0x021AA
|
||||
#define PF_ANALOG_R_CLOCKWISE "↫"
|
||||
#define PF_ANALOG_R_CLOCKWISE_INT 0x021AB
|
||||
#define PF_ANALOG_R_COUNTER "↬"
|
||||
#define PF_ANALOG_R_COUNTER_INT 0x021AC
|
||||
#define PF_ANALOG_LR_BLOCKWISE "↭"
|
||||
#define PF_ANALOG_LR_BLOCKWISE_INT 0x021AD
|
||||
#define PF_ANALOG_LR_COUNTER "↮"
|
||||
#define PF_ANALOG_LR_COUNTER_INT 0x021AE
|
||||
#define PF_SONY_LEFT_SHOULDER "↰"
|
||||
#define PF_SONY_LEFT_SHOULDER_INT 0x021B0
|
||||
#define PF_SONY_RIGHT_SHOULDER "↱"
|
||||
#define PF_SONY_RIGHT_SHOULDER_INT 0x021B1
|
||||
#define PF_SONY_LEFT_TRIGGER "↲"
|
||||
#define PF_SONY_LEFT_TRIGGER_INT 0x021B2
|
||||
#define PF_SONY_RIGHT_TRIGGER "↳"
|
||||
#define PF_SONY_RIGHT_TRIGGER_INT 0x021B3
|
||||
#define PF_DPAD_LEFT_DOWN "↴"
|
||||
#define PF_DPAD_LEFT_DOWN_INT 0x021B4
|
||||
#define PF_GAMEPAD_UP_RIGHT "↵"
|
||||
#define PF_GAMEPAD_UP_RIGHT_INT 0x021B5
|
||||
#define PF_ANALOG_CLOCKWISE "↶"
|
||||
#define PF_ANALOG_CLOCKWISE_INT 0x021B6
|
||||
#define PF_ANALOG_COUNTER "↷"
|
||||
#define PF_ANALOG_COUNTER_INT 0x021B7
|
||||
#define PF_ANALOG_CLICK "↹"
|
||||
#define PF_ANALOG_CLICK_INT 0x021B9
|
||||
#define PF_ANALOG_L_CLICK "↺"
|
||||
#define PF_ANALOG_L_CLICK_INT 0x021BA
|
||||
#define PF_ANALOG_R_CLICK "↻"
|
||||
#define PF_ANALOG_R_CLICK_INT 0x021BB
|
||||
#define PF_ANALOG_L_LEFT "↼"
|
||||
#define PF_ANALOG_L_LEFT_INT 0x021BC
|
||||
#define PF_ANALOG_R_LEFT "↽"
|
||||
#define PF_ANALOG_R_LEFT_INT 0x021BD
|
||||
#define PF_ANALOG_L_UP "↾"
|
||||
#define PF_ANALOG_L_UP_INT 0x021BE
|
||||
#define PF_ANALOG_R_UP "↿"
|
||||
#define PF_ANALOG_R_UP_INT 0x021BF
|
||||
#define PF_ANALOG_L_RIGHT "⇀"
|
||||
#define PF_ANALOG_L_RIGHT_INT 0x021C0
|
||||
#define PF_ANALOG_R_RIGHT "⇁"
|
||||
#define PF_ANALOG_R_RIGHT_INT 0x021C1
|
||||
#define PF_ANALOG_L_DOWN "⇂"
|
||||
#define PF_ANALOG_L_DOWN_INT 0x021C2
|
||||
#define PF_ANALOG_R_DOWN "⇃"
|
||||
#define PF_ANALOG_R_DOWN_INT 0x021C3
|
||||
#define PF_ANALOG_L_LEFT_RIGHT "⇄"
|
||||
#define PF_ANALOG_L_LEFT_RIGHT_INT 0x021C4
|
||||
#define PF_ANALOG_L_UP_DOWN "⇅"
|
||||
#define PF_ANALOG_L_UP_DOWN_INT 0x021C5
|
||||
#define PF_ANALOG_R_LEFT_RIGHT "⇆"
|
||||
#define PF_ANALOG_R_LEFT_RIGHT_INT 0x021C6
|
||||
#define PF_ANALOG_LEFT "⇇"
|
||||
#define PF_ANALOG_LEFT_INT 0x021C7
|
||||
#define PF_ANALOG_UP "⇈"
|
||||
#define PF_ANALOG_UP_INT 0x021C8
|
||||
#define PF_ANALOG_RIGHT "⇉"
|
||||
#define PF_ANALOG_RIGHT_INT 0x021C9
|
||||
#define PF_ANALOG_DOWN "⇊"
|
||||
#define PF_ANALOG_DOWN_INT 0x021CA
|
||||
#define PF_ANALOG_L "⇋"
|
||||
#define PF_ANALOG_L_INT 0x021CB
|
||||
#define PF_ANALOG_R "⇌"
|
||||
#define PF_ANALOG_R_INT 0x021CC
|
||||
#define PF_DPAD "⇎"
|
||||
#define PF_DPAD_INT 0x021CE
|
||||
#define PF_XBOX_X "⇐"
|
||||
#define PF_XBOX_X_INT 0x021D0
|
||||
#define PF_XBOX_Y "⇑"
|
||||
#define PF_XBOX_Y_INT 0x021D1
|
||||
#define PF_XBOX_B "⇒"
|
||||
#define PF_XBOX_B_INT 0x021D2
|
||||
#define PF_XBOX_A "⇓"
|
||||
#define PF_XBOX_A_INT 0x021D3
|
||||
#define PF_ANALOG_LEFT_RIGHT "⇔"
|
||||
#define PF_ANALOG_LEFT_RIGHT_INT 0x021D4
|
||||
#define PF_ANALOG_UP_DOWN "⇕"
|
||||
#define PF_ANALOG_UP_DOWN_INT 0x021D5
|
||||
#define PF_ANALOG_UP_LEFT "⇖"
|
||||
#define PF_ANALOG_UP_LEFT_INT 0x021D6
|
||||
#define PF_ANALOG_UP_RIGHT "⇗"
|
||||
#define PF_ANALOG_UP_RIGHT_INT 0x021D7
|
||||
#define PF_ANALOG_DOWN_RIGHT "⇘"
|
||||
#define PF_ANALOG_DOWN_RIGHT_INT 0x021D8
|
||||
#define PF_ANALOG_DOWN_LEFT "⇙"
|
||||
#define PF_ANALOG_DOWN_LEFT_INT 0x021D9
|
||||
#define PF_ANALOG_L_TOUCH "⇚"
|
||||
#define PF_ANALOG_L_TOUCH_INT 0x021DA
|
||||
#define PF_ANALOG_R_TOUCH "⇛"
|
||||
#define PF_ANALOG_R_TOUCH_INT 0x021DB
|
||||
#define PF_XBOX_LEFT_TRIGGER_PULL "⇜"
|
||||
#define PF_XBOX_LEFT_TRIGGER_PULL_INT 0x021DC
|
||||
#define PF_XBOX_RIGHT_TRIGGER_PULL "⇝"
|
||||
#define PF_XBOX_RIGHT_TRIGGER_PULL_INT 0x021DD
|
||||
#define PF_DPAD_RIGHT_DOWN "⇞"
|
||||
#define PF_DPAD_RIGHT_DOWN_INT 0x021DE
|
||||
#define PF_DUPAD_LEFT_UP "⇟"
|
||||
#define PF_DUPAD_LEFT_UP_INT 0x021DF
|
||||
#define PF_SONY_X "⇠"
|
||||
#define PF_SONY_X_INT 0x021E0
|
||||
#define PF_SONY_Y "⇡"
|
||||
#define PF_SONY_Y_INT 0x021E1
|
||||
#define PF_SONY_B "⇢"
|
||||
#define PF_SONY_B_INT 0x021E2
|
||||
#define PF_SONY_A "⇣"
|
||||
#define PF_SONY_A_INT 0x021E3
|
||||
#define PF_STEAM_MENU "⇤"
|
||||
#define PF_STEAM_MENU_INT 0x021E4
|
||||
#define PF_STEAM_OPTIONS "⇥"
|
||||
#define PF_STEAM_OPTIONS_INT 0x021E5
|
||||
#define PF_SONY_SHARE "⇦"
|
||||
#define PF_SONY_SHARE_INT 0x021E6
|
||||
#define PF_SONY_TOUCHPAD "⇧"
|
||||
#define PF_SONY_TOUCHPAD_INT 0x021E7
|
||||
#define PF_SONY_OPTIONS "⇨"
|
||||
#define PF_SONY_OPTIONS_INT 0x021E8
|
||||
#define PF_NINTENDO_BUTTON_Z "⇩"
|
||||
#define PF_NINTENDO_BUTTON_Z_INT 0x021E9
|
||||
#define PF_NINTENDO_TRIGGER_Z "⇪"
|
||||
#define PF_NINTENDO_TRIGGER_Z_INT 0x021EA
|
||||
#define PF_NINTENDO_C "⇫"
|
||||
#define PF_NINTENDO_C_INT 0x021EB
|
||||
#define PF_NINTENDO_Z "⇬"
|
||||
#define PF_NINTENDO_Z_INT 0x021EC
|
||||
#define PF_NINTENDO_1 "⇭"
|
||||
#define PF_NINTENDO_1_INT 0x021ED
|
||||
#define PF_NINTENDO_2 "⇮"
|
||||
#define PF_NINTENDO_2_INT 0x021EE
|
||||
#define PF_ANALOG_L_ANY "⇱"
|
||||
#define PF_ANALOG_L_ANY_INT 0x021F1
|
||||
#define PF_ANALOG_R_ANY "⇲"
|
||||
#define PF_ANALOG_R_ANY_INT 0x021F2
|
||||
#define PF_ANALOG_ANY "⇳"
|
||||
#define PF_ANALOG_ANY_INT 0x021F3
|
||||
#define PF_ANALOG_R_UP_DOWN "⇵"
|
||||
#define PF_ANALOG_R_UP_DOWN_INT 0x021F5
|
||||
#define PF_GAMEPAD_SELECT "⇷"
|
||||
#define PF_GAMEPAD_SELECT_INT 0x021F7
|
||||
#define PF_GAMEPAD_START "⇸"
|
||||
#define PF_GAMEPAD_START_INT 0x021F8
|
||||
#define PF_GAMEPAD_HOME "⇹"
|
||||
#define PF_GAMEPAD_HOME_INT 0x021F9
|
||||
#define PF_XBOX_VIEW "⇺"
|
||||
#define PF_XBOX_VIEW_INT 0x021FA
|
||||
#define PF_XBOX_MENU "⇻"
|
||||
#define PF_XBOX_MENU_INT 0x021FB
|
||||
#define PF_NINTENDO_MINUS "⇽"
|
||||
#define PF_NINTENDO_MINUS_INT 0x021FD
|
||||
#define PF_NINTENDO_PLUS "⇾"
|
||||
#define PF_NINTENDO_PLUS_INT 0x021FE
|
||||
#define PF_NINTENDO_DPAD_LEFT "⇿"
|
||||
#define PF_NINTENDO_DPAD_LEFT_INT 0x021FF
|
||||
#define PF_NINTENDO_DPAD_UP "∀"
|
||||
#define PF_NINTENDO_DPAD_UP_INT 0x02200
|
||||
#define PF_NINTENDO_DPAD_RIGHT "∁"
|
||||
#define PF_NINTENDO_DPAD_RIGHT_INT 0x02201
|
||||
#define PF_NINTENDO_DPAD_DOWN "∂"
|
||||
#define PF_NINTENDO_DPAD_DOWN_INT 0x02202
|
||||
#define PF_NINTENDO_JOYCON_SL "∃"
|
||||
#define PF_NINTENDO_JOYCON_SL_INT 0x02203
|
||||
#define PF_NINTENDO_JOYCON_SR "∄"
|
||||
#define PF_NINTENDO_JOYCON_SR_INT 0x02204
|
||||
#define PF_LEGION_SETTINGS "∅"
|
||||
#define PF_LEGION_SETTINGS_INT 0x02205
|
||||
#define PF_SONY_DUALSENSE_SHARE "∆"
|
||||
#define PF_SONY_DUALSENSE_SHARE_INT 0x02206
|
||||
#define PF_SONY_DUALSENSE_TOUCHPAD "∇"
|
||||
#define PF_SONY_DUALSENSE_TOUCHPAD_INT 0x02207
|
||||
#define PF_SONY_DUALSENSE_OPTIONS "∈"
|
||||
#define PF_SONY_DUALSENSE_OPTIONS_INT 0x02208
|
||||
#define PF_AYANEO_LC "∉"
|
||||
#define PF_AYANEO_LC_INT 0x02209
|
||||
#define PF_AYANEO_RC "∊"
|
||||
#define PF_AYANEO_RC_INT 0x0220A
|
||||
#define PF_AYANEO_WAVE "∋"
|
||||
#define PF_AYANEO_WAVE_INT 0x0220B
|
||||
#define PF_AYANEO_HOME "∌"
|
||||
#define PF_AYANEO_HOME_INT 0x0220C
|
||||
#define PF_AYANEO_LCC "∍"
|
||||
#define PF_AYANEO_LCC_INT 0x0220D
|
||||
#define PF_GPD_C1 "∎"
|
||||
#define PF_GPD_C1_INT 0x0220E
|
||||
#define PF_GPD_C2 "∏"
|
||||
#define PF_GPD_C2_INT 0x0220F
|
||||
#define PF_ONEXPLAYER_KEYBOARD "∐"
|
||||
#define PF_ONEXPLAYER_KEYBOARD_INT 0x02210
|
||||
#define PF_ONEXPLAYER_TURBO "∑"
|
||||
#define PF_ONEXPLAYER_TURBO_INT 0x02211
|
||||
#define PF_GAMEPAD_M1 "−"
|
||||
#define PF_GAMEPAD_M1_INT 0x02212
|
||||
#define PF_GAMEPAD_M2 "∓"
|
||||
#define PF_GAMEPAD_M2_INT 0x02213
|
||||
#define PF_GAMEPAD_M3 "∔"
|
||||
#define PF_GAMEPAD_M3_INT 0x02214
|
||||
#define PF_GAMEPAD_Y1 "∕"
|
||||
#define PF_GAMEPAD_Y1_INT 0x02215
|
||||
#define PF_GAMEPAD_Y2 "∖"
|
||||
#define PF_GAMEPAD_Y2_INT 0x02216
|
||||
#define PF_GAMEPAD_Y3 "∗"
|
||||
#define PF_GAMEPAD_Y3_INT 0x02217
|
||||
#define PF_ONEXPLAYER_FUNCTION "∘"
|
||||
#define PF_ONEXPLAYER_FUNCTION_INT 0x02218
|
||||
#define PF_ONEXPLAYER_HOME "∙"
|
||||
#define PF_ONEXPLAYER_HOME_INT 0x02219
|
||||
#define PF_TRACKPAD_L_ANY "≤"
|
||||
#define PF_TRACKPAD_L_ANY_INT 0x02264
|
||||
#define PF_TRACKPAD_R_ANY "≥"
|
||||
#define PF_TRACKPAD_R_ANY_INT 0x02265
|
||||
#define PF_TRACKPAD_L_CLICK "≦"
|
||||
#define PF_TRACKPAD_L_CLICK_INT 0x02266
|
||||
#define PF_TRACKPAD_R_CLICK "≧"
|
||||
#define PF_TRACKPAD_R_CLICK_INT 0x02267
|
||||
#define PF_TRACKPAD_L_TOUCH "≨"
|
||||
#define PF_TRACKPAD_L_TOUCH_INT 0x02268
|
||||
#define PF_TRACKPAD_R_TOUCH "≩"
|
||||
#define PF_TRACKPAD_R_TOUCH_INT 0x02269
|
||||
#define PF_TRACKPAD_L_LEFT "≮"
|
||||
#define PF_TRACKPAD_L_LEFT_INT 0x0226E
|
||||
#define PF_TRACKPAD_R_LEFT "≯"
|
||||
#define PF_TRACKPAD_R_LEFT_INT 0x0226F
|
||||
#define PF_TRACKPAD_L_UP "≰"
|
||||
#define PF_TRACKPAD_L_UP_INT 0x02270
|
||||
#define PF_TRACKPAD_R_UP "≱"
|
||||
#define PF_TRACKPAD_R_UP_INT 0x02271
|
||||
#define PF_TRACKPAD_L_RIGHT "≲"
|
||||
#define PF_TRACKPAD_L_RIGHT_INT 0x02272
|
||||
#define PF_TRACKPAD_R_RIGHT "≳"
|
||||
#define PF_TRACKPAD_R_RIGHT_INT 0x02273
|
||||
#define PF_TRACKPAD_L_DOWN "≴"
|
||||
#define PF_TRACKPAD_L_DOWN_INT 0x02274
|
||||
#define PF_TRACKPAD_R_DOWN "≵"
|
||||
#define PF_TRACKPAD_R_DOWN_INT 0x02275
|
||||
#define PF_GAMEPAD_L4 "≶"
|
||||
#define PF_GAMEPAD_L4_INT 0x02276
|
||||
#define PF_GAMEPAD_R4 "≷"
|
||||
#define PF_GAMEPAD_R4_INT 0x02277
|
||||
#define PF_GAMEPAD_L5 "≸"
|
||||
#define PF_GAMEPAD_L5_INT 0x02278
|
||||
#define PF_GAMEPAD_R5 "≹"
|
||||
#define PF_GAMEPAD_R5_INT 0x02279
|
||||
#define PF_XBOX_DPAD_LEFT "≺"
|
||||
#define PF_XBOX_DPAD_LEFT_INT 0x0227A
|
||||
#define PF_XBOX_DPAD_UP "≻"
|
||||
#define PF_XBOX_DPAD_UP_INT 0x0227B
|
||||
#define PF_XBOX_DPAD_RIGHT "≼"
|
||||
#define PF_XBOX_DPAD_RIGHT_INT 0x0227C
|
||||
#define PF_XBOX_DPAD_DOWN "≽"
|
||||
#define PF_XBOX_DPAD_DOWN_INT 0x0227D
|
||||
#define PF_XBOX_DEPAD_LEFT_RIGHT "≾"
|
||||
#define PF_XBOX_DEPAD_LEFT_RIGHT_INT 0x0227E
|
||||
#define PF_XBOX_DPAD_UP_DOWN "≿"
|
||||
#define PF_XBOX_DPAD_UP_DOWN_INT 0x0227F
|
||||
#define PF_XBOX_DPAD_LEFT_UP "⊀"
|
||||
#define PF_XBOX_DPAD_LEFT_UP_INT 0x02280
|
||||
#define PF_XBOX_DPAD_RIGHT_UP "⊁"
|
||||
#define PF_XBOX_DPAD_RIGHT_UP_INT 0x02281
|
||||
#define PF_XBOX_DPAD_LEFT_DOWN "⊂"
|
||||
#define PF_XBOX_DPAD_LEFT_DOWN_INT 0x02282
|
||||
#define PF_XBOX_DPAD_RIGHT_DOWN "⊃"
|
||||
#define PF_XBOX_DPAD_RIGHT_DOWN_INT 0x02283
|
||||
#define PF_XBOX_DPAD "⊄"
|
||||
#define PF_XBOX_DPAD_INT 0x02284
|
||||
#define PF_ICON_PIN "⌖"
|
||||
#define PF_ICON_PIN_INT 0x02316
|
||||
#define PF_ANDROID_TABS "⏍"
|
||||
#define PF_ANDROID_TABS_INT 0x023CD
|
||||
#define PF_ANDROID_BACK "⏎"
|
||||
#define PF_ANDROID_BACK_INT 0x023CE
|
||||
#define PF_ANDROID_HOME "⏏"
|
||||
#define PF_ANDROID_HOME_INT 0x023CF
|
||||
#define PF_ANDROID_HORIZONTAL_DOTS "⏐"
|
||||
#define PF_ANDROID_HORIZONTAL_DOTS_INT 0x023D0
|
||||
#define PF_ANDROID_VERTICAL_DOTS "⏑"
|
||||
#define PF_ANDROID_VERTICAL_DOTS_INT 0x023D1
|
||||
#define PF_ANDROID_HAMBURGER_MENU "⏒"
|
||||
#define PF_ANDROID_HAMBURGER_MENU_INT 0x023D2
|
||||
#define PF_KEYBOARD_LEFT "⏴"
|
||||
#define PF_KEYBOARD_LEFT_INT 0x023F4
|
||||
#define PF_KEYBOARD_UP "⏵"
|
||||
#define PF_KEYBOARD_UP_INT 0x023F5
|
||||
#define PF_KEYBOARD_RIGHT "⏶"
|
||||
#define PF_KEYBOARD_RIGHT_INT 0x023F6
|
||||
#define PF_KEYBOARD_DOWN "⏷"
|
||||
#define PF_KEYBOARD_DOWN_INT 0x023F7
|
||||
#define PF_KEYBOARD_WASD "␣"
|
||||
#define PF_KEYBOARD_WASD_INT 0x02423
|
||||
#define PF_KEYBOARD_ARROWS ""
|
||||
#define PF_KEYBOARD_ARROWS_INT 0x02424
|
||||
#define PF_KEYBOARD_IJKL "␥"
|
||||
#define PF_KEYBOARD_IJKL_INT 0x02425
|
||||
#define PF_KEYBOARD_FN "␦"
|
||||
#define PF_KEYBOARD_FN_INT 0x02426
|
||||
#define PF_KEYBOARD_CONTROL ""
|
||||
#define PF_KEYBOARD_CONTROL_INT 0x02427
|
||||
#define PF_KEYBOARD_ALT ""
|
||||
#define PF_KEYBOARD_ALT_INT 0x02428
|
||||
#define PF_KEYBOARD_SHIFT ""
|
||||
#define PF_KEYBOARD_SHIFT_INT 0x02429
|
||||
#define PF_KEYBOARD_SUPER ""
|
||||
#define PF_KEYBOARD_SUPER_INT 0x0242A
|
||||
#define PF_KEYBOARD_TAB ""
|
||||
#define PF_KEYBOARD_TAB_INT 0x0242B
|
||||
#define PF_KEYBOARD_CAPS ""
|
||||
#define PF_KEYBOARD_CAPS_INT 0x0242C
|
||||
#define PF_KEYBOARD_BACKSPACE ""
|
||||
#define PF_KEYBOARD_BACKSPACE_INT 0x0242D
|
||||
#define PF_KEYBOARD_ENTER ""
|
||||
#define PF_KEYBOARD_ENTER_INT 0x0242E
|
||||
#define PF_KEYBOARD_ESCAPE ""
|
||||
#define PF_KEYBOARD_ESCAPE_INT 0x0242F
|
||||
#define PF_KEYBOARD_PRINT_SCREEN ""
|
||||
#define PF_KEYBOARD_PRINT_SCREEN_INT 0x02430
|
||||
#define PF_KEYBOARD_SCROLL_LOCK ""
|
||||
#define PF_KEYBOARD_SCROLL_LOCK_INT 0x02431
|
||||
#define PF_KEYBOARD_PAUSE ""
|
||||
#define PF_KEYBOARD_PAUSE_INT 0x02432
|
||||
#define PF_KEYBOARD_NUM_LOCK ""
|
||||
#define PF_KEYBOARD_NUM_LOCK_INT 0x02433
|
||||
#define PF_KEYBOARD_INSERT ""
|
||||
#define PF_KEYBOARD_INSERT_INT 0x02434
|
||||
#define PF_KEYBOARD_HOME ""
|
||||
#define PF_KEYBOARD_HOME_INT 0x02435
|
||||
#define PF_KEYBOARD_PAGE_UP ""
|
||||
#define PF_KEYBOARD_PAGE_UP_INT 0x02436
|
||||
#define PF_KEYBOARD_DELETE ""
|
||||
#define PF_KEYBOARD_DELETE_INT 0x02437
|
||||
#define PF_KEYBOARD_END ""
|
||||
#define PF_KEYBOARD_END_INT 0x02438
|
||||
#define PF_KEYBOARD_PAGE_DOWN ""
|
||||
#define PF_KEYBOARD_PAGE_DOWN_INT 0x02439
|
||||
#define PF_KEYBOARD_SPACE ""
|
||||
#define PF_KEYBOARD_SPACE_INT 0x0243A
|
||||
#define PF_DEVICE_GAMEPAD ""
|
||||
#define PF_DEVICE_GAMEPAD_INT 0x0243C
|
||||
#define PF_DEVICE_KEYBOARD ""
|
||||
#define PF_DEVICE_KEYBOARD_INT 0x0243D
|
||||
#define PF_DEVICE_MOUSE ""
|
||||
#define PF_DEVICE_MOUSE_INT 0x0243E
|
||||
#define PF_DEVICE_MOUSE_KEYBOARD ""
|
||||
#define PF_DEVICE_MOUSE_KEYBOARD_INT 0x0243F
|
||||
#define PF_KEYBOARD_F1 "①"
|
||||
#define PF_KEYBOARD_F1_INT 0x02460
|
||||
#define PF_KEYBOARD_F2 "②"
|
||||
#define PF_KEYBOARD_F2_INT 0x02461
|
||||
#define PF_KEYBOARD_F3 "③"
|
||||
#define PF_KEYBOARD_F3_INT 0x02462
|
||||
#define PF_KEYBOARD_F4 "④"
|
||||
#define PF_KEYBOARD_F4_INT 0x02463
|
||||
#define PF_KEYBOARD_F5 "⑤"
|
||||
#define PF_KEYBOARD_F5_INT 0x02464
|
||||
#define PF_KEYBOARD_F6 "⑥"
|
||||
#define PF_KEYBOARD_F6_INT 0x02465
|
||||
#define PF_KEYBOARD_F7 "⑦"
|
||||
#define PF_KEYBOARD_F7_INT 0x02466
|
||||
#define PF_KEYBOARD_F8 "⑧"
|
||||
#define PF_KEYBOARD_F8_INT 0x02467
|
||||
#define PF_KEYBOARD_F9 "⑨"
|
||||
#define PF_KEYBOARD_F9_INT 0x02468
|
||||
#define PF_KEYBOARD_F10 "⑩"
|
||||
#define PF_KEYBOARD_F10_INT 0x02469
|
||||
#define PF_KEYBOARD_F11 "⑪"
|
||||
#define PF_KEYBOARD_F11_INT 0x0246A
|
||||
#define PF_KEYBOARD_F12 "⑫"
|
||||
#define PF_KEYBOARD_F12_INT 0x0246B
|
||||
#define PF_KEYBOARD_KEY "⒏"
|
||||
#define PF_KEYBOARD_KEY_INT 0x0248F
|
||||
#define PF_ICON_1 "⓵"
|
||||
#define PF_ICON_1_INT 0x024F5
|
||||
#define PF_ICON_2 "⓶"
|
||||
#define PF_ICON_2_INT 0x024F6
|
||||
#define PF_ICON_3 "⓷"
|
||||
#define PF_ICON_3_INT 0x024F7
|
||||
#define PF_ICON_4 "⓸"
|
||||
#define PF_ICON_4_INT 0x024F8
|
||||
#define PF_ICON_5 "⓹"
|
||||
#define PF_ICON_5_INT 0x024F9
|
||||
#define PF_ICON_6 "⓺"
|
||||
#define PF_ICON_6_INT 0x024FA
|
||||
#define PF_ICON_7 "⓻"
|
||||
#define PF_ICON_7_INT 0x024FB
|
||||
#define PF_ICON_8 "⓼"
|
||||
#define PF_ICON_8_INT 0x024FC
|
||||
#define PF_ICON_9 "⓽"
|
||||
#define PF_ICON_9_INT 0x024FD
|
||||
#define PF_ICON_0 "⓿"
|
||||
#define PF_ICON_0_INT 0x024FF
|
||||
#define PF_ICON_STAR "★"
|
||||
#define PF_ICON_STAR_INT 0x02605
|
||||
#define PF_ICON_SKULL "☠"
|
||||
#define PF_ICON_SKULL_INT 0x02620
|
||||
#define PF_ICON_FROWN "☹"
|
||||
#define PF_ICON_FROWN_INT 0x02639
|
||||
#define PF_ICON_SMILE "☺"
|
||||
#define PF_ICON_SMILE_INT 0x0263A
|
||||
#define PF_ICON_EMPTY_HEART "♡"
|
||||
#define PF_ICON_EMPTY_HEART_INT 0x02661
|
||||
#define PF_ICON_FULL_HEART "♥"
|
||||
#define PF_ICON_FULL_HEART_INT 0x02665
|
||||
#define PF_ICON_D4 "♳"
|
||||
#define PF_ICON_D4_INT 0x02673
|
||||
#define PF_ICON_D6 "♴"
|
||||
#define PF_ICON_D6_INT 0x02674
|
||||
#define PF_ICON_D8 "♵"
|
||||
#define PF_ICON_D8_INT 0x02675
|
||||
#define PF_ICON_D10 "♶"
|
||||
#define PF_ICON_D10_INT 0x02676
|
||||
#define PF_ICON_D12 "♷"
|
||||
#define PF_ICON_D12_INT 0x02677
|
||||
#define PF_ICON_D20 "♸"
|
||||
#define PF_ICON_D20_INT 0x02678
|
||||
#define PF_ICON_D6_1 "⚀"
|
||||
#define PF_ICON_D6_1_INT 0x02680
|
||||
#define PF_ICON_D6_2 "⚁"
|
||||
#define PF_ICON_D6_2_INT 0x02681
|
||||
#define PF_ICON_D6_3 "⚂"
|
||||
#define PF_ICON_D6_3_INT 0x02682
|
||||
#define PF_ICON_D6_4 "⚃"
|
||||
#define PF_ICON_D6_4_INT 0x02683
|
||||
#define PF_ICON_D6_5 "⚄"
|
||||
#define PF_ICON_D6_5_INT 0x02684
|
||||
#define PF_ICON_D6_6 "⚅"
|
||||
#define PF_ICON_D6_6_INT 0x02685
|
||||
#define PF_ICON_FLAG "⚑"
|
||||
#define PF_ICON_FLAG_INT 0x02691
|
||||
#define PF_ICON_GEARS "⚙"
|
||||
#define PF_ICON_GEARS_INT 0x02699
|
||||
#define PF_ICON_CROSS "✗"
|
||||
#define PF_ICON_CROSS_INT 0x02717
|
||||
#define PF_ICON_QUESTION "❓"
|
||||
#define PF_ICON_QUESTION_INT 0x02753
|
||||
#define PF_ICON_BANG "❗"
|
||||
#define PF_ICON_BANG_INT 0x02757
|
||||
#define PF_MOUSE_1 "➊"
|
||||
#define PF_MOUSE_1_INT 0x0278A
|
||||
#define PF_MOUSE_2 "➋"
|
||||
#define PF_MOUSE_2_INT 0x0278B
|
||||
#define PF_MOUSE_3 "➌"
|
||||
#define PF_MOUSE_3_INT 0x0278C
|
||||
#define PF_MOUSE_4 "➍"
|
||||
#define PF_MOUSE_4_INT 0x0278D
|
||||
#define PF_MOUSE_5 "➎"
|
||||
#define PF_MOUSE_5_INT 0x0278E
|
||||
#define PF_MOUSE_6 "➏"
|
||||
#define PF_MOUSE_6_INT 0x0278F
|
||||
#define PF_MOUSE_7 "➐"
|
||||
#define PF_MOUSE_7_INT 0x02790
|
||||
#define PF_MOUSE_8 "➑"
|
||||
#define PF_MOUSE_8_INT 0x02791
|
||||
#define PF_MOUSE_SCROLL_UP "⟰"
|
||||
#define PF_MOUSE_SCROLL_UP_INT 0x027F0
|
||||
#define PF_MOUSE_SCROLL_DOWN "⟱"
|
||||
#define PF_MOUSE_SCROLL_DOWN_INT 0x027F1
|
||||
#define PF_MOUSE_LEFT "⟵"
|
||||
#define PF_MOUSE_LEFT_INT 0x027F5
|
||||
#define PF_MOUSE_RIGHT "⟶"
|
||||
#define PF_MOUSE_RIGHT_INT 0x027F6
|
||||
#define PF_MOUSE_MIDDLE "⟷"
|
||||
#define PF_MOUSE_MIDDLE_INT 0x027F7
|
||||
#define PF_MOUSE_LEFT_RIGHT "⟺"
|
||||
#define PF_MOUSE_LEFT_RIGHT_INT 0x027FA
|
||||
#define PF_MOUSE_UP_DOWN "⟻"
|
||||
#define PF_MOUSE_UP_DOWN_INT 0x027FB
|
||||
#define PF_MOUSE_ANY "⟼"
|
||||
#define PF_MOUSE_ANY_INT 0x027FC
|
||||
#define PF_ICON_BOX "⬛"
|
||||
#define PF_ICON_BOX_INT 0x02B1B
|
||||
#define PF_ICON_PLAYSTATION ""
|
||||
#define PF_ICON_PLAYSTATION_INT 0x0E000
|
||||
#define PF_ICON_XBOX ""
|
||||
#define PF_ICON_XBOX_INT 0x0E001
|
||||
#define PF_ICON_NINTENDO_SWITCH ""
|
||||
#define PF_ICON_NINTENDO_SWITCH_INT 0x0E002
|
||||
#define PF_ICON_AYANEO ""
|
||||
#define PF_ICON_AYANEO_INT 0x0E003
|
||||
#define PF_ICON_LENOVO_LEGION ""
|
||||
#define PF_ICON_LENOVO_LEGION_INT 0x0E004
|
||||
#define PF_ROG_ALLY_ARMOURY ""
|
||||
#define PF_ROG_ALLY_ARMOURY_INT 0x0E005
|
||||
#define PF_ROG_ALLY_COMMAND ""
|
||||
#define PF_ROG_ALLY_COMMAND_INT 0x0E006
|
||||
#define PF_ICON_MAC ""
|
||||
#define PF_ICON_MAC_INT 0x0E007
|
||||
#define PF_ICON_WINDOWS ""
|
||||
#define PF_ICON_WINDOWS_INT 0x0E008
|
||||
#define PF_ICON_LINUX ""
|
||||
#define PF_ICON_LINUX_INT 0x0E009
|
||||
#define PF_ICON_BSD ""
|
||||
#define PF_ICON_BSD_INT 0x0E00A
|
||||
#define PF_ICON_STEAM ""
|
||||
#define PF_ICON_STEAM_INT 0x0E00B
|
||||
#define PF_ICON_ITCH_IO ""
|
||||
#define PF_ICON_ITCH_IO_INT 0x0E00C
|
||||
#define PF_ICON_HUMBLE ""
|
||||
#define PF_ICON_HUMBLE_INT 0x0E00D
|
||||
#define PF_ICON_EPIC_GAME_STORE ""
|
||||
#define PF_ICON_EPIC_GAME_STORE_INT 0x0E00E
|
||||
#define PF_ICON_GOOD_OLD_GAMES ""
|
||||
#define PF_ICON_GOOD_OLD_GAMES_INT 0x0E00F
|
||||
#define PF_MSI_CLAW_CENTER ""
|
||||
#define PF_MSI_CLAW_CENTER_INT 0x0E010
|
||||
#define PF_MSI_CLAW_QUICK ""
|
||||
#define PF_MSI_CLAW_QUICK_INT 0x0E011
|
||||
#define PF_KEYBOARD_0 "0"
|
||||
#define PF_KEYBOARD_0_INT 0x0FF10
|
||||
#define PF_KEYBOARD_1 "1"
|
||||
#define PF_KEYBOARD_1_INT 0x0FF11
|
||||
#define PF_KEYBOARD_2 "2"
|
||||
#define PF_KEYBOARD_2_INT 0x0FF12
|
||||
#define PF_KEYBOARD_3 "3"
|
||||
#define PF_KEYBOARD_3_INT 0x0FF13
|
||||
#define PF_KEYBOARD_4 "4"
|
||||
#define PF_KEYBOARD_4_INT 0x0FF14
|
||||
#define PF_KEYBOARD_5 "5"
|
||||
#define PF_KEYBOARD_5_INT 0x0FF15
|
||||
#define PF_KEYBOARD_6 "6"
|
||||
#define PF_KEYBOARD_6_INT 0x0FF16
|
||||
#define PF_KEYBOARD_7 "7"
|
||||
#define PF_KEYBOARD_7_INT 0x0FF17
|
||||
#define PF_KEYBOARD_8 "8"
|
||||
#define PF_KEYBOARD_8_INT 0x0FF18
|
||||
#define PF_KEYBOARD_9 "9"
|
||||
#define PF_KEYBOARD_9_INT 0x0FF19
|
||||
#define PF_KEYBOARD_A "A"
|
||||
#define PF_KEYBOARD_A_INT 0x0FF21
|
||||
#define PF_KEYBOARD_B "B"
|
||||
#define PF_KEYBOARD_B_INT 0x0FF22
|
||||
#define PF_KEYBOARD_C "C"
|
||||
#define PF_KEYBOARD_C_INT 0x0FF23
|
||||
#define PF_KEYBOARD_D "D"
|
||||
#define PF_KEYBOARD_D_INT 0x0FF24
|
||||
#define PF_KEYBOARD_E "E"
|
||||
#define PF_KEYBOARD_E_INT 0x0FF25
|
||||
#define PF_KEYBOARD_F "F"
|
||||
#define PF_KEYBOARD_F_INT 0x0FF26
|
||||
#define PF_KEYBOARD_G "G"
|
||||
#define PF_KEYBOARD_G_INT 0x0FF27
|
||||
#define PF_KEYBOARD_H "H"
|
||||
#define PF_KEYBOARD_H_INT 0x0FF28
|
||||
#define PF_KEYBOARD_I "I"
|
||||
#define PF_KEYBOARD_I_INT 0x0FF29
|
||||
#define PF_KEYBOARD_J "J"
|
||||
#define PF_KEYBOARD_J_INT 0x0FF2A
|
||||
#define PF_KEYBOARD_K "K"
|
||||
#define PF_KEYBOARD_K_INT 0x0FF2B
|
||||
#define PF_KEYBOARD_L "L"
|
||||
#define PF_KEYBOARD_L_INT 0x0FF2C
|
||||
#define PF_KEYBOARD_M "M"
|
||||
#define PF_KEYBOARD_M_INT 0x0FF2D
|
||||
#define PF_KEYBOARD_N "N"
|
||||
#define PF_KEYBOARD_N_INT 0x0FF2E
|
||||
#define PF_KEYBOARD_O "O"
|
||||
#define PF_KEYBOARD_O_INT 0x0FF2F
|
||||
#define PF_KEYBOARD_P "P"
|
||||
#define PF_KEYBOARD_P_INT 0x0FF30
|
||||
#define PF_KEYBOARD_Q "Q"
|
||||
#define PF_KEYBOARD_Q_INT 0x0FF31
|
||||
#define PF_KEYBOARD_R "R"
|
||||
#define PF_KEYBOARD_R_INT 0x0FF32
|
||||
#define PF_KEYBOARD_S "S"
|
||||
#define PF_KEYBOARD_S_INT 0x0FF33
|
||||
#define PF_KEYBOARD_T "T"
|
||||
#define PF_KEYBOARD_T_INT 0x0FF34
|
||||
#define PF_KEYBOARD_U "U"
|
||||
#define PF_KEYBOARD_U_INT 0x0FF35
|
||||
#define PF_KEYBOARD_V "V"
|
||||
#define PF_KEYBOARD_V_INT 0x0FF36
|
||||
#define PF_KEYBOARD_W "W"
|
||||
#define PF_KEYBOARD_W_INT 0x0FF37
|
||||
#define PF_KEYBOARD_X "X"
|
||||
#define PF_KEYBOARD_X_INT 0x0FF38
|
||||
#define PF_KEYBOARD_Y "Y"
|
||||
#define PF_KEYBOARD_Y_INT 0x0FF39
|
||||
#define PF_KEYBOARD_Z "Z"
|
||||
#define PF_KEYBOARD_Z_INT 0x0FF3A
|
||||
#define PF_ICON_HEADPHONES "🎧"
|
||||
#define PF_ICON_HEADPHONES_INT 0x1F3A7
|
||||
#define PF_ICON_MUSIC "🎶"
|
||||
#define PF_ICON_MUSIC_INT 0x1F3B6
|
||||
#define PF_ICON_FISH "🐟"
|
||||
#define PF_ICON_FISH_INT 0x1F41F
|
||||
#define PF_DEVICE_DANCE_PAD "💃"
|
||||
#define PF_DEVICE_DANCE_PAD_INT 0x1F483
|
||||
#define PF_ICON_LAPTOP "💻"
|
||||
#define PF_ICON_LAPTOP_INT 0x1F4BB
|
||||
#define PF_ICON_DISKETTE "💾"
|
||||
#define PF_ICON_DISKETTE_INT 0x1F4BE
|
||||
#define PF_ICON_WRITE "📝"
|
||||
#define PF_ICON_WRITE_INT 0x1F4DD
|
||||
#define PF_DEVICE_PHONE "📱"
|
||||
#define PF_DEVICE_PHONE_INT 0x1F4F1
|
||||
#define PF_ICON_CAMERA "📷"
|
||||
#define PF_ICON_CAMERA_INT 0x1F4F7
|
||||
#define PF_ICON_SPEAKER "🔈"
|
||||
#define PF_ICON_SPEAKER_INT 0x1F508
|
||||
#define PF_DEVICE_LIGHT_GUN "🔫"
|
||||
#define PF_DEVICE_LIGHT_GUN_INT 0x1F52B
|
||||
#define PF_ICON_NOISE "🕬"
|
||||
#define PF_ICON_NOISE_INT 0x1F56C
|
||||
#define PF_DEVICE_STEERING_WHEEL "🕸"
|
||||
#define PF_DEVICE_STEERING_WHEEL_INT 0x1F578
|
||||
#define PF_DEVICE_JOY_STICK "🕹"
|
||||
#define PF_DEVICE_JOY_STICK_INT 0x1F579
|
||||
#define PF_DEVICE_VR_HEADSET "🕻"
|
||||
#define PF_DEVICE_VR_HEADSET_INT 0x1F57B
|
||||
#define PF_DEVICE_VR_CONTROLLER "🕼"
|
||||
#define PF_DEVICE_VR_CONTROLLER_INT 0x1F57C
|
||||
#define PF_DEVICE_FLIGHT_STICK "🕽"
|
||||
#define PF_DEVICE_FLIGHT_STICK_INT 0x1F57D
|
||||
#define PF_ICON_PROCESSOR "🖥"
|
||||
#define PF_ICON_PROCESSOR_INT 0x1F5A5
|
||||
#define PF_ICON_INTERNET "🖧"
|
||||
#define PF_ICON_INTERNET_INT 0x1F5A7
|
||||
#define PF_ICON_GRAPHICS_CARD "🖨"
|
||||
#define PF_ICON_GRAPHICS_CARD_INT 0x1F5A8
|
||||
#define PF_ICON_MEMORY "🖪"
|
||||
#define PF_ICON_MEMORY_INT 0x1F5AA
|
||||
#define PF_ICON_USB_STICK "🖫"
|
||||
#define PF_ICON_USB_STICK_INT 0x1F5AB
|
||||
#define PF_ICON_DATABASE "🖬"
|
||||
#define PF_ICON_DATABASE_INT 0x1F5AC
|
||||
#define PF_ICON_HARD_DISK "🖴"
|
||||
#define PF_ICON_HARD_DISK_INT 0x1F5B4
|
||||
#define PF_ICON_SCREEN "🖵"
|
||||
#define PF_ICON_SCREEN_INT 0x1F5B5
|
||||
#define PF_ICON_TEXT_ENTRY "🖹"
|
||||
#define PF_ICON_TEXT_ENTRY_INT 0x1F5B9
|
||||
#define PF_ICON_SPEAK "🗣"
|
||||
#define PF_ICON_SPEAK_INT 0x1F5E3
|
||||
#define PF_ICON_LANGUAGE "🗩"
|
||||
#define PF_ICON_LANGUAGE_INT 0x1F5E9
|
||||
#define PF_ICON_EXIT "🚪"
|
||||
#define PF_ICON_EXIT_INT 0x1F6AA
|
||||
#define PF_ICON_INFORMATION "🛈"
|
||||
#define PF_ICON_INFORMATION_INT 0x1F6C8
|
||||
#define PF_ICON_SHOPPING_CART "🛒"
|
||||
#define PF_ICON_SHOPPING_CART_INT 0x1F6D2
|
||||
#endif
|
||||
@@ -0,0 +1,14 @@
|
||||
#ifndef __RECOMP_FILES_H__
|
||||
#define __RECOMP_FILES_H__
|
||||
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
|
||||
namespace recomp {
|
||||
std::ifstream open_input_file_with_backup(const std::filesystem::path& filepath, std::ios_base::openmode mode = std::ios_base::in);
|
||||
std::ifstream open_input_backup_file(const std::filesystem::path& filepath, std::ios_base::openmode mode = std::ios_base::in);
|
||||
std::ofstream open_output_file_with_backup(const std::filesystem::path& filepath, std::ios_base::openmode mode = std::ios_base::out);
|
||||
bool finalize_output_file_with_backup(const std::filesystem::path& filepath);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,202 @@
|
||||
#ifndef __RECOMP_INPUT_H__
|
||||
#define __RECOMP_INPUT_H__
|
||||
|
||||
#include <cstdint>
|
||||
#include <variant>
|
||||
#include <vector>
|
||||
#include <type_traits>
|
||||
#include <span>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
|
||||
#include "ultramodern/input.hpp"
|
||||
|
||||
#include "json/json.hpp"
|
||||
|
||||
namespace recomp {
|
||||
// x-macros to build input enums and arrays.
|
||||
// First parameter is the enum name, second parameter is the bit field for the input (or 0 if there is no associated one), third is the readable name.
|
||||
// TODO refactor this to allow projects to rename these, or get rid of the readable name and leave that up to individual projects to map.
|
||||
#define DEFINE_N64_BUTTON_INPUTS() \
|
||||
DEFINE_INPUT(A, 0x8000, "A") \
|
||||
DEFINE_INPUT(B, 0x4000, "B") \
|
||||
DEFINE_INPUT(Z, 0x2000, "Z") \
|
||||
DEFINE_INPUT(START, 0x1000, "Start") \
|
||||
DEFINE_INPUT(L, 0x0020, "L") \
|
||||
DEFINE_INPUT(R, 0x0010, "R") \
|
||||
DEFINE_INPUT(C_UP, 0x0008, "C Up") \
|
||||
DEFINE_INPUT(C_LEFT, 0x0002, "C Left") \
|
||||
DEFINE_INPUT(C_DOWN, 0x0004, "C Down") \
|
||||
DEFINE_INPUT(C_RIGHT, 0x0001, "C Right") \
|
||||
DEFINE_INPUT(DPAD_UP, 0x0800, "D Pad Down") \
|
||||
DEFINE_INPUT(DPAD_RIGHT, 0x0100, "D-Pad Down") \
|
||||
DEFINE_INPUT(DPAD_DOWN, 0x0400, "D-Pad Down") \
|
||||
DEFINE_INPUT(DPAD_LEFT, 0x0200, "D-Pad Down")
|
||||
|
||||
#define DEFINE_N64_AXIS_INPUTS() \
|
||||
DEFINE_INPUT(Y_AXIS_POS, 0, "Up") \
|
||||
DEFINE_INPUT(Y_AXIS_NEG, 0, "Down") \
|
||||
DEFINE_INPUT(X_AXIS_NEG, 0, "Left") \
|
||||
DEFINE_INPUT(X_AXIS_POS, 0, "Right") \
|
||||
|
||||
#define DEFINE_RECOMP_UI_INPUTS() \
|
||||
DEFINE_INPUT(TOGGLE_MENU, 0, "Toggle Menu") \
|
||||
DEFINE_INPUT(ACCEPT_MENU, 0, "Accept (Menu)") \
|
||||
DEFINE_INPUT(APPLY_MENU, 0, "Apply (Menu)")
|
||||
|
||||
#define DEFINE_ALL_INPUTS() \
|
||||
DEFINE_N64_BUTTON_INPUTS() \
|
||||
DEFINE_N64_AXIS_INPUTS() \
|
||||
DEFINE_RECOMP_UI_INPUTS()
|
||||
|
||||
// Enum containing every recomp input.
|
||||
#define DEFINE_INPUT(name, value, readable) name,
|
||||
enum class GameInput {
|
||||
DEFINE_ALL_INPUTS()
|
||||
|
||||
COUNT,
|
||||
N64_BUTTON_START = A,
|
||||
N64_BUTTON_COUNT = C_RIGHT - N64_BUTTON_START + 1,
|
||||
N64_AXIS_START = X_AXIS_NEG,
|
||||
N64_AXIS_COUNT = Y_AXIS_POS - N64_AXIS_START + 1,
|
||||
};
|
||||
#undef DEFINE_INPUT
|
||||
|
||||
struct InputField {
|
||||
uint32_t input_type;
|
||||
int32_t input_id;
|
||||
std::string to_string() const;
|
||||
auto operator<=>(const InputField& rhs) const = default;
|
||||
};
|
||||
|
||||
void poll_inputs();
|
||||
float get_input_analog(const InputField& field);
|
||||
float get_input_analog(const std::span<const recomp::InputField> fields);
|
||||
bool get_input_digital(const InputField& field);
|
||||
bool get_input_digital(const std::span<const recomp::InputField> fields);
|
||||
void get_gyro_deltas(float* x, float* y);
|
||||
void get_mouse_deltas(float* x, float* y);
|
||||
void get_right_analog(float* x, float* y);
|
||||
|
||||
enum class InputDevice {
|
||||
Controller,
|
||||
Keyboard,
|
||||
COUNT
|
||||
};
|
||||
|
||||
void start_scanning_input(InputDevice device);
|
||||
void stop_scanning_input();
|
||||
void finish_scanning_input(InputField scanned_field);
|
||||
void cancel_scanning_input();
|
||||
void config_menu_set_cont_or_kb(bool cont_interacted);
|
||||
InputField get_scanned_input();
|
||||
int get_scanned_input_index();
|
||||
|
||||
struct DefaultN64Mappings {
|
||||
std::vector<InputField> a;
|
||||
std::vector<InputField> b;
|
||||
std::vector<InputField> l;
|
||||
std::vector<InputField> r;
|
||||
std::vector<InputField> z;
|
||||
std::vector<InputField> start;
|
||||
|
||||
std::vector<InputField> c_left;
|
||||
std::vector<InputField> c_right;
|
||||
std::vector<InputField> c_up;
|
||||
std::vector<InputField> c_down;
|
||||
|
||||
std::vector<InputField> dpad_left;
|
||||
std::vector<InputField> dpad_right;
|
||||
std::vector<InputField> dpad_up;
|
||||
std::vector<InputField> dpad_down;
|
||||
|
||||
std::vector<InputField> analog_left;
|
||||
std::vector<InputField> analog_right;
|
||||
std::vector<InputField> analog_up;
|
||||
std::vector<InputField> analog_down;
|
||||
|
||||
std::vector<InputField> toggle_menu;
|
||||
std::vector<InputField> accept_menu;
|
||||
std::vector<InputField> apply_menu;
|
||||
};
|
||||
|
||||
inline const std::vector<InputField>& get_default_mapping_for_input(const DefaultN64Mappings& defaults, const GameInput input) {
|
||||
static const std::vector<InputField> empty_input_field{};
|
||||
switch (input) {
|
||||
case GameInput::A: return defaults.a;
|
||||
case GameInput::B: return defaults.b;
|
||||
case GameInput::L: return defaults.l;
|
||||
case GameInput::R: return defaults.r;
|
||||
case GameInput::Z: return defaults.z;
|
||||
case GameInput::START: return defaults.start;
|
||||
case GameInput::C_LEFT: return defaults.c_left;
|
||||
case GameInput::C_RIGHT: return defaults.c_right;
|
||||
case GameInput::C_UP: return defaults.c_up;
|
||||
case GameInput::C_DOWN: return defaults.c_down;
|
||||
case GameInput::DPAD_LEFT: return defaults.dpad_left;
|
||||
case GameInput::DPAD_RIGHT: return defaults.dpad_right;
|
||||
case GameInput::DPAD_UP: return defaults.dpad_up;
|
||||
case GameInput::DPAD_DOWN: return defaults.dpad_down;
|
||||
case GameInput::X_AXIS_NEG: return defaults.analog_left;
|
||||
case GameInput::X_AXIS_POS: return defaults.analog_right;
|
||||
case GameInput::Y_AXIS_POS: return defaults.analog_up;
|
||||
case GameInput::Y_AXIS_NEG: return defaults.analog_down;
|
||||
case GameInput::TOGGLE_MENU: return defaults.toggle_menu;
|
||||
case GameInput::ACCEPT_MENU: return defaults.accept_menu;
|
||||
case GameInput::APPLY_MENU: return defaults.apply_menu;
|
||||
default: return empty_input_field;
|
||||
}
|
||||
}
|
||||
|
||||
extern const DefaultN64Mappings default_n64_keyboard_mappings;
|
||||
extern const DefaultN64Mappings default_n64_controller_mappings;
|
||||
|
||||
constexpr size_t bindings_per_input = 2;
|
||||
|
||||
size_t get_num_inputs();
|
||||
const std::string& get_input_name(GameInput input);
|
||||
const std::string& get_input_enum_name(GameInput input);
|
||||
GameInput get_input_from_enum_name(const std::string_view name);
|
||||
InputField& get_input_binding(GameInput input, size_t binding_index, InputDevice device);
|
||||
void set_input_binding(GameInput input, size_t binding_index, InputDevice device, InputField value);
|
||||
|
||||
bool get_n64_input(int controller_num, uint16_t* buttons_out, float* x_out, float* y_out);
|
||||
void set_rumble(int controller_num, bool);
|
||||
void update_rumble();
|
||||
void handle_events();
|
||||
|
||||
ultramodern::input::connected_device_info_t get_connected_device_info(int controller_num);
|
||||
|
||||
// Rumble strength ranges from 0 to 100.
|
||||
int get_rumble_strength();
|
||||
void set_rumble_strength(int strength);
|
||||
|
||||
// Gyro and mouse sensitivities range from 0 to 100.
|
||||
int get_gyro_sensitivity();
|
||||
int get_mouse_sensitivity();
|
||||
int get_joystick_deadzone();
|
||||
void set_gyro_sensitivity(int strength);
|
||||
void set_mouse_sensitivity(int strength);
|
||||
void set_joystick_deadzone(int strength);
|
||||
void apply_joystick_deadzone(float x_in, float y_in, float* x_out, float* y_out);
|
||||
void set_right_analog_suppressed(bool suppressed);
|
||||
|
||||
enum class BackgroundInputMode {
|
||||
On,
|
||||
Off,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(recomp::BackgroundInputMode, {
|
||||
{recomp::BackgroundInputMode::On, "On"},
|
||||
{recomp::BackgroundInputMode::Off, "Off"}
|
||||
});
|
||||
|
||||
BackgroundInputMode get_background_input_mode();
|
||||
void set_background_input_mode(BackgroundInputMode mode);
|
||||
|
||||
bool game_input_disabled();
|
||||
bool all_input_disabled();
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,116 @@
|
||||
#ifndef __RECOMP_UI__
|
||||
#define __RECOMP_UI__
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
|
||||
// TODO move this file into src/ui
|
||||
|
||||
#include "SDL.h"
|
||||
#include "RmlUi/Core.h"
|
||||
|
||||
#include "../src/ui/util/hsv.h"
|
||||
#include "../src/ui/util/bem.h"
|
||||
|
||||
#include "../src/ui/core/ui_context.h"
|
||||
|
||||
namespace Rml {
|
||||
class ElementDocument;
|
||||
class EventListenerInstancer;
|
||||
class Context;
|
||||
class Event;
|
||||
}
|
||||
|
||||
namespace recompui {
|
||||
class UiEventListenerInstancer;
|
||||
|
||||
// TODO remove this once the UI has been ported over to the new system.
|
||||
class MenuController {
|
||||
public:
|
||||
virtual ~MenuController() {}
|
||||
virtual Rml::ElementDocument* load_document(Rml::Context* context) = 0;
|
||||
virtual void register_events(UiEventListenerInstancer& listener) = 0;
|
||||
virtual void make_bindings(Rml::Context* context) = 0;
|
||||
};
|
||||
|
||||
std::unique_ptr<MenuController> create_launcher_menu();
|
||||
std::unique_ptr<MenuController> create_config_menu();
|
||||
|
||||
using event_handler_t = void(const std::string& param, Rml::Event&);
|
||||
|
||||
void queue_event(const SDL_Event& event);
|
||||
bool try_deque_event(SDL_Event& out);
|
||||
|
||||
std::unique_ptr<UiEventListenerInstancer> make_event_listener_instancer();
|
||||
void register_event(UiEventListenerInstancer& listener, const std::string& name, event_handler_t* handler);
|
||||
|
||||
void show_context(ContextId context, std::string_view param);
|
||||
void hide_context(ContextId context);
|
||||
void hide_all_contexts();
|
||||
bool is_context_shown(ContextId context);
|
||||
bool is_context_taking_input();
|
||||
bool is_any_context_shown();
|
||||
|
||||
ContextId get_launcher_context_id();
|
||||
ContextId get_config_context_id();
|
||||
ContextId get_config_sub_menu_context_id();
|
||||
ContextId get_close_prompt_context_id();
|
||||
|
||||
enum class ConfigTab {
|
||||
General,
|
||||
Controls,
|
||||
Graphics,
|
||||
Sound,
|
||||
Mods,
|
||||
Debug,
|
||||
};
|
||||
|
||||
void set_config_tab(ConfigTab tab);
|
||||
|
||||
enum class ButtonVariant {
|
||||
Primary,
|
||||
Secondary,
|
||||
Tertiary,
|
||||
Success,
|
||||
Error,
|
||||
Warning,
|
||||
NumVariants,
|
||||
};
|
||||
|
||||
void open_prompt(
|
||||
const std::string& headerText,
|
||||
const std::string& contentText,
|
||||
const std::string& confirmLabelText,
|
||||
const std::string& cancelLabelText,
|
||||
std::function<void()> confirmCb,
|
||||
std::function<void()> cancelCb,
|
||||
ButtonVariant _confirmVariant = ButtonVariant::Success,
|
||||
ButtonVariant _cancelVariant = ButtonVariant::Error,
|
||||
bool _focusOnCancel = true,
|
||||
const std::string& _returnElementId = ""
|
||||
);
|
||||
bool is_prompt_open();
|
||||
|
||||
void apply_color_hack();
|
||||
void get_window_size(int& width, int& height);
|
||||
void set_cursor_visible(bool visible);
|
||||
void update_supported_options();
|
||||
void toggle_fullscreen();
|
||||
|
||||
bool get_cont_active(void);
|
||||
void set_cont_active(bool active);
|
||||
void activate_mouse();
|
||||
|
||||
void message_box(const char* msg);
|
||||
|
||||
void set_render_hooks();
|
||||
|
||||
Rml::ElementPtr create_custom_element(Rml::Element* parent, std::string tag);
|
||||
Rml::ElementDocument* load_document(const std::filesystem::path& path);
|
||||
Rml::ElementDocument* create_empty_document();
|
||||
void queue_image_from_bytes(const std::string &src, const std::vector<char> &bytes);
|
||||
void release_image(const std::string &src);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"version": "0.2.1",
|
||||
"defaults": {},
|
||||
"configurations": [
|
||||
{
|
||||
"type": "default",
|
||||
"project": "CMakeLists.txt",
|
||||
"projectTarget": "BanjoRecompiled.exe",
|
||||
"name": "BanjoRecompiled.exe",
|
||||
"currentDir": "${workspaceRoot}"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
# Banjo-Kazooie's n_aspMain
|
||||
text_offset = 0xF4DDC0
|
||||
text_size = 0xC60
|
||||
text_address = 0x04001080
|
||||
rom_file_path = "banjo.us.v10.decompressed.z64"
|
||||
output_file_path = "rsp/n_aspMain.cpp"
|
||||
output_function_name = "n_aspMain"
|
||||
extra_indirect_branch_targets = [
|
||||
# dispatch table
|
||||
0x10F0, 0x13A0, 0x11A0, 0x1A68, 0x11CC, 0x17F0, 0x120C, 0x1280, 0x134C, 0x124C, 0x1C88, 0x12D8, 0x12B0, 0x1388
|
||||
]
|
||||
@@ -0,0 +1,20 @@
|
||||
# Config file for recompiling patches for the Banjo-Kazooie NTSC 1.0 Recompilation.
|
||||
|
||||
[input]
|
||||
# Paths are relative to the location of this config file.
|
||||
elf_path = "patches/patches.elf"
|
||||
output_func_path = "RecompiledPatches"
|
||||
single_file_output = true
|
||||
# Allow absolute symbols to be used as jump targets.
|
||||
use_absolute_symbols = true
|
||||
# Point the recompiler at the symbol files so that it can resolve relocations during recompilation.
|
||||
func_reference_syms_file = "BanjoRecompSyms/bk.us.rev0.syms.toml"
|
||||
data_reference_syms_files = [ "BanjoRecompSyms/bk.us.rev0.datasyms.toml", "BanjoRecompSyms/bk.us.rev0.datasyms_static.toml" ]
|
||||
# Tell the recompiler to write the output binary. Doing this instead of using objcopy allows the recompiler to patch MIPS32 relocs.
|
||||
output_binary_path = "patches/patches.bin"
|
||||
# Do not emit warnings for unpaired LO16 values, as clang produces many of them.
|
||||
unpaired_lo16_warnings = false
|
||||
# Allow exporting functions and events for mods to use.
|
||||
allow_exports = true
|
||||
# # Enable strict patch mode, validates that patched symbols exist and that non-patch functions aren't symbols.
|
||||
strict_patch_mode = true
|
||||
@@ -0,0 +1,6 @@
|
||||
*.d
|
||||
*.o
|
||||
*.elf
|
||||
*.bin
|
||||
./funcs.h
|
||||
patches.map
|
||||
@@ -0,0 +1,27 @@
|
||||
TARGET = patches.elf
|
||||
|
||||
CC ?= clang
|
||||
LD ?= ld.lld
|
||||
|
||||
CFLAGS := -target mips -mips2 -mabi=32 -O2 -G0 -mno-abicalls -mno-odd-spreg -mno-check-zero-division \
|
||||
-fomit-frame-pointer -ffast-math -fno-unsafe-math-optimizations -fno-builtin-memset \
|
||||
-Wall -Wextra -Wno-incompatible-library-redeclaration -Wno-unused-parameter -Wno-unknown-pragmas -Wno-unused-variable -Wno-missing-braces -Wno-unsupported-floating-point-opt
|
||||
CPPFLAGS := -nostdinc -D_LANGUAGE_C -DMIPS -I ../lib/bk-decomp/include -I ../lib/bk-decomp/include/2.0L -I../lib/rt64/include
|
||||
LDFLAGS := -nostdlib -T patches.ld -T syms.ld -Map patches.map --unresolved-symbols=ignore-all --emit-relocs
|
||||
|
||||
C_SRCS := $(wildcard *.c)
|
||||
C_OBJS := $(C_SRCS:.c=.o)
|
||||
C_DEPS := $(C_SRCS:.c=.d)
|
||||
|
||||
$(TARGET): $(C_OBJS) patches.ld syms.ld
|
||||
$(LD) $(C_OBJS) $(LDFLAGS) -o $@
|
||||
|
||||
$(C_OBJS): %.o : %.c
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) $< -MMD -MF $(@:.o=.d) -c -o $@
|
||||
|
||||
clean:
|
||||
rm -rf $(C_OBJS) $(TARGET) $(C_DEPS)
|
||||
|
||||
-include $(C_DEPS)
|
||||
|
||||
.PHONY: clean
|
||||
@@ -0,0 +1,12 @@
|
||||
#ifndef __PATCH_GRAPHICS_H__
|
||||
#define __PATCH_GRAPHICS_H__
|
||||
|
||||
#include "patch_helpers.h"
|
||||
|
||||
DECLARE_FUNC(void, recomp_get_window_resolution, u32*, u32*);
|
||||
DECLARE_FUNC(float, recomp_get_target_aspect_ratio, float);
|
||||
DECLARE_FUNC(s32, recomp_get_target_framerate, s32);
|
||||
DECLARE_FUNC(s32, recomp_high_precision_fb_enabled);
|
||||
DECLARE_FUNC(float, recomp_get_resolution_scale);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef __INPUT_H__
|
||||
#define __INPUT_H__
|
||||
|
||||
#include "patch_helpers.h"
|
||||
|
||||
typedef enum {
|
||||
RECOMP_CAMERA_NORMAL,
|
||||
RECOMP_CAMERA_DUALANALOG,
|
||||
} RecompCameraMode;
|
||||
|
||||
typedef enum {
|
||||
RECOMP_AIMING_OVERRIDE_OFF = 0,
|
||||
RECOMP_AIMING_OVERRIDE_DISABLE_LEFT_STICK = 1,
|
||||
RECOMP_AIMING_OVERRIDE_FORCE_RIGHT_STICK = 2
|
||||
} RecompAimingOverideMode;
|
||||
|
||||
extern RecompCameraMode recomp_camera_mode;
|
||||
extern RecompAimingOverideMode recomp_aiming_override_mode;
|
||||
|
||||
DECLARE_FUNC(void, recomp_get_gyro_deltas, float* x, float* y);
|
||||
DECLARE_FUNC(void, recomp_get_mouse_deltas, float* x, float* y);
|
||||
DECLARE_FUNC(s32, recomp_get_targeting_mode);
|
||||
DECLARE_FUNC(void, recomp_get_inverted_axes, s32* x, s32* y);
|
||||
DECLARE_FUNC(s32, recomp_get_analog_cam_enabled);
|
||||
DECLARE_FUNC(void, recomp_get_analog_inverted_axes, s32* x, s32* y);
|
||||
DECLARE_FUNC(void, recomp_get_camera_inputs, float* x, float* y);
|
||||
DECLARE_FUNC(void, recomp_set_right_analog_suppressed, s32 suppressed);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,10 @@
|
||||
#ifndef __RECOMP_FUNCS_H__
|
||||
#define __RECOMP_FUNCS_H__
|
||||
|
||||
#include "patch_helpers.h"
|
||||
|
||||
DECLARE_FUNC(void, recomp_load_overlays, u32 rom, void* ram, u32 size);
|
||||
DECLARE_FUNC(void, recomp_puts, const char* data, u32 size);
|
||||
DECLARE_FUNC(void, recomp_exit);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,38 @@
|
||||
#ifndef __N64_TYPES_H__
|
||||
#define __N64_TYPES_H__
|
||||
|
||||
#define va_list __builtin_va_list
|
||||
#define va_start __builtin_va_start
|
||||
#define va_arg __builtin_va_arg
|
||||
#define va_end __builtin_va_end
|
||||
|
||||
typedef unsigned int size_t;
|
||||
|
||||
typedef unsigned char u8;
|
||||
typedef unsigned short u16;
|
||||
typedef unsigned long u32;
|
||||
typedef unsigned long long u64;
|
||||
|
||||
typedef signed char s8;
|
||||
typedef short s16;
|
||||
typedef long s32;
|
||||
typedef long long s64;
|
||||
|
||||
typedef volatile unsigned char vu8;
|
||||
typedef volatile unsigned short vu16;
|
||||
typedef volatile unsigned long vu32;
|
||||
typedef volatile unsigned long long vu64;
|
||||
|
||||
typedef volatile signed char vs8;
|
||||
typedef volatile short vs16;
|
||||
typedef volatile long vs32;
|
||||
typedef volatile long long vs64;
|
||||
|
||||
typedef float f32;
|
||||
typedef double f64;
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#define NULL 0
|
||||
|
||||
#endif
|
||||