Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 21-installer-nodd
  • 2210-pre1
  • 2210-pre2
  • 2210-rc1
  • 2210-rc2
  • 2210-rc3
  • 2211-pre1
  • 2211-pre2
  • 2211-rc1
  • 2212-pre1
  • 2212-pre2
  • 2212-pre3
  • 2212-rc1
  • 2213
  • 2214-pre1
  • 2214-pre2
  • 2214-pre3
  • 2214-pre4
  • 2_2_12
  • 64-gl-log
  • COM_ImmedExecute-lua
  • DJGPP
  • accel-momentum
  • acs
  • action-args
  • alpha-fixes
  • any-resolution
  • appveyor
  • blend-locking
  • blentran
  • blua-unary-not-fix
  • boost-tickrate
  • bustablesoundz
  • cleanup-opengl
  • cleanupmusic
  • clipmidtex
  • cmake-valgrind
  • crawlacommander-sprites
  • custom-map-names
  • custom-teams
  • cutscene-cleanup
  • dd-music-bypass
  • dd-music-fix
  • delfile2
  • deprecate-lua-dedicated-server
  • dpl-2
  • dropshadows-spawning
  • dynabsp
  • emblem-drawing
  • exchndl-xp-fix
  • extra-textures
  • few-kart-lua-changes
  • ffloorclip
  • fix-167
  • fix-cvar-conflicts
  • fix-opengl-parameter-crash
  • fix-opengl-shear-roll
  • flipfuncpointers
  • fof-lightlist-fixes
  • font-FUCK
  • frictionrefactor
  • fuck-macros-1
  • gamepad-luakeydown
  • gamepad-morefixes
  • gamepad_experiments
  • gametype-refactor
  • gametype-refactor-1
  • gametype-refactor-player-spawns
  • ghost-networking
  • gif-splitting
  • grr-lj
  • hitboxviewer
  • hwr-texture-cache-refactor
  • hwrender2
  • improve-439
  • increase-maxconditionsets
  • increase-packet-tics
  • input-display
  • input-display-translucency
  • io
  • joystick-juggling-maz
  • just-in-case
  • keycodes-only
  • ksf-wadfiles
  • ld413-mp-fix
  • levelstruct
  • libpng-version-support
  • linedef-actions
  • lj-test
  • lol-states
  • loopedsounds
  • lower-unpegged-fix
  • lua-change-gametype
  • lua-command-netids
  • lua-gfx-2
  • lua-gfx-sprites
  • lua-local
  • makefile-auto-mingw-gcc
  • makefile-tinkering
  • map-components-signedness-fixes
  • SRB2_release_2.1
  • SRB2_release_2.1.1
  • SRB2_release_2.1.10
  • SRB2_release_2.1.11
  • SRB2_release_2.1.12
  • SRB2_release_2.1.14
  • SRB2_release_2.1.15
  • SRB2_release_2.1.16
  • SRB2_release_2.1.16a
  • SRB2_release_2.1.17
  • SRB2_release_2.1.18
  • SRB2_release_2.1.19
  • SRB2_release_2.1.2
  • SRB2_release_2.1.20
  • SRB2_release_2.1.21
  • SRB2_release_2.1.22
  • SRB2_release_2.1.23
  • SRB2_release_2.1.24
  • SRB2_release_2.1.25
  • SRB2_release_2.1.3
  • SRB2_release_2.1.4
  • SRB2_release_2.1.5
  • SRB2_release_2.1.6
  • SRB2_release_2.1.7
  • SRB2_release_2.1.8
  • SRB2_release_2.1.9
  • SRB2_release_2.2.0
  • SRB2_release_2.2.1
  • SRB2_release_2.2.10
  • SRB2_release_2.2.11
  • SRB2_release_2.2.12
  • SRB2_release_2.2.13
  • SRB2_release_2.2.15
  • SRB2_release_2.2.2
  • SRB2_release_2.2.3
  • SRB2_release_2.2.4
  • SRB2_release_2.2.5
  • SRB2_release_2.2.6
  • SRB2_release_2.2.7
  • SRB2_release_2.2.8
  • SRB2_release_2.2.9
  • td-release-v1.0.0
142 results

Target

Select target project
  • STJr/SRB2
  • Sryder/SRB2
  • wolfy852/SRB2
  • Alpha2244/SRB2
  • Inuyasha/SRB2
  • yoshibot/SRB2
  • TehRealSalt/SRB2
  • PrisimaTF/SRB2
  • Hatninja/SRB2
  • SteelT/SRB2
  • james/SRB2
  • ShaderWraith/SRB2
  • SinnamonLat/SRB2
  • mazmazz_/SRB2
  • filpAM/SRB2
  • chaoloveicemdboy/SRB2
  • Whooa21/SRB2
  • Machturne/SRB2
  • Golden/SRB2
  • Tatsuru/SRB2
  • Snu/SRB2
  • Zwip-Zwap_Zapony/SRB2
  • fickleheart/SRB2
  • alphaRexJames/SRB2
  • JJK/SRB2
  • diskpoppy/SRB2
  • Hannu_Hanhi/SRB2
  • ZipperQR/SRB2
  • kays/SRB2
  • spherallic/SRB2
  • Zippy_Zolton/SRB2
  • namiishere/SRB2
  • Ors/SRB2
  • SMS_Alfredo/SRB2
  • sonic_edge/SRB2
  • lavla/SRB2
  • ashi/SRB2
  • X.organic/SRB2
  • Fafabis/SRB2
  • Meziu/SRB2
  • v-rob/SRB2
  • tertu/SRB2
  • bitten2up/SRB2
  • flarn2006/SRB2
  • Krabs/SRB2
  • clairebun/SRB2
  • Lactozilla/SRB2
  • thehackstack/SRB2
  • Spice/SRB2
  • win8linux/SRB2
  • JohnFrostFox/SRB2
  • talktoneon726/SRB2
  • Wane/SRB2
  • Lamibe/SRB2
  • spectrumuk2/srb-2
  • nerdyminer18/srb-2
  • 256nil/SRB2
  • ARJr/SRB2
  • Alam/SRB2
  • Zenya/srb-2-marathon-demos
  • Acelite/srb-2-archivedmodifications
  • MIDIMan/SRB2
  • Lach/SRB2
  • Frostiikin/bounce-tweaks
  • Jaden/SRB2
  • Tyron/SRB2
  • Astronight/SRB2
  • Mari0shi06/SRB2
  • aiire/SRB2
  • Galactice/SRB2
  • srb2-ports/srb2-dreamcast
  • sdasdas/SRB2
  • chreas/srb-2-vr
  • StarManiaKG/the-story-of-sinically-rocketing-and-botching-the-2nd
  • LoganAir/SRB2
  • NepDisk/srb-2
  • alufolie91/SRB2
  • Felicia.iso/SRB2
  • twi/SRB2
  • BarrelsOFun/SRB2
  • Speed2411/SRB2
  • Leather_Realms/SRB2
  • Ayemar/SRB2
  • Acelite/SRB2
  • VladDoc/SRB2
  • kaldrum/model-features
  • strawberryfox417/SRB2
  • Lugent/SRB2
  • Rem/SRB2
  • Refrag/SRB2
  • Henry_3230/srb-3230
  • TehPuertoRicanSpartan2/tprs-srb2
  • Leminn/srb-2-marathon-stuff
  • chromaticpipe2/SRB2
  • MiguelGustavo15/SRB2
  • Maru/srb-2-tests
  • SilicDev/SRB2
  • UnmatchedBracket/SRB2
  • HybridDog/SRB2
  • xordspar0/SRB2
  • jsjhbewfhh/SRB2
  • Fancy2209/SRB2
  • Lorsoen/SRB2
  • shindoukin/SRB2
  • GamerOfDays/SRB2
  • Craftyawesome/SRB2
  • tenshi-tensai-tennoji/SRB2
  • Scarfdudebalder/SRB2
  • luigi-budd/srb-2-fix-interplag-lockon
  • mskluesner/SRB2
  • johnpetersa19/SRB2
  • Pheazant/SRB2
  • chromaticpipe2/srb2classic
  • romoney5/SRB2
  • PAS/SRB2Classic
  • BlueStaggo/SRB2
  • Jisk/srb-2-beef-jerky
117 results
Select Git revision
  • 21-installer-nodd
  • 2210-pre1
  • 2210-pre2
  • 2210-rc1
  • 2210-rc2
  • 2210-rc3
  • 2211-pre1
  • 2211-pre2
  • 2211-rc1
  • 2212-pre1
  • 2212-pre2
  • 2212-pre3
  • 2212-rc1
  • 2213
  • 2_2_12
  • 64-gl-log
  • COM_ImmedExecute-lua
  • DJGPP
  • accel-momentum
  • acs
  • action-args
  • alpha-fixes
  • any-resolution
  • appveyor
  • better-player-states
  • blend-locking
  • blentran
  • blua-unary-not-fix
  • boost-tickrate
  • bustablesoundz
  • cleanup-opengl
  • cleanupmusic
  • clipmidtex
  • cmake-valgrind
  • crawlacommander-sprites
  • custom-map-names
  • custom-teams
  • cutscene-cleanup
  • dd-music-bypass
  • dd-music-fix
  • delfile2
  • deprecate-lua-dedicated-server
  • dpl-2
  • dropshadows-spawning
  • dynabsp
  • emblem-drawing
  • exchndl-xp-fix
  • extra-textures
  • few-kart-lua-changes
  • ffloorclip
  • fix-1215
  • fix-1247
  • fix-167
  • fix-cvar-conflicts
  • fix-equation-slopes-near-edges
  • fix-opengl-shear-roll
  • flipfuncpointers
  • fof-lightlist-fixes
  • font-FUCK
  • frictionrefactor
  • fuck-macros-1
  • gamepad-luakeydown
  • gamepad-morefixes
  • gamepad_experiments
  • gametype-refactor
  • gametype-refactor-1
  • gametype-refactor-player-spawns
  • ghost-networking
  • gif-splitting
  • gitlab-ci
  • grr-lj
  • hitboxviewer
  • hwr-texture-cache-refactor
  • hwrender2
  • improve-439
  • increase-packet-tics
  • input-display
  • input-display-translucency
  • io
  • joystick-juggling-maz
  • keycodes-only
  • ksf-wadfiles
  • ld413-mp-fix
  • lessthan3emeraldshards
  • levelstruct
  • libpng-version-support
  • linedef-actions
  • lj-test
  • lol-states
  • loopedsounds
  • lower-unpegged-fix
  • lua-change-gametype
  • lua-command-netids
  • lua-debug-library
  • lua-gfx-2
  • lua-gfx-sprites
  • lua-local
  • makefile-auto-mingw-gcc
  • makefile-tinkering
  • map-components-signedness-fixes
  • SRB2_release_2.1
  • SRB2_release_2.1.1
  • SRB2_release_2.1.10
  • SRB2_release_2.1.11
  • SRB2_release_2.1.12
  • SRB2_release_2.1.14
  • SRB2_release_2.1.15
  • SRB2_release_2.1.16
  • SRB2_release_2.1.16a
  • SRB2_release_2.1.17
  • SRB2_release_2.1.18
  • SRB2_release_2.1.19
  • SRB2_release_2.1.2
  • SRB2_release_2.1.20
  • SRB2_release_2.1.21
  • SRB2_release_2.1.22
  • SRB2_release_2.1.23
  • SRB2_release_2.1.24
  • SRB2_release_2.1.25
  • SRB2_release_2.1.3
  • SRB2_release_2.1.4
  • SRB2_release_2.1.5
  • SRB2_release_2.1.6
  • SRB2_release_2.1.7
  • SRB2_release_2.1.8
  • SRB2_release_2.1.9
  • SRB2_release_2.2.0
  • SRB2_release_2.2.1
  • SRB2_release_2.2.10
  • SRB2_release_2.2.11
  • SRB2_release_2.2.12
  • SRB2_release_2.2.13
  • SRB2_release_2.2.2
  • SRB2_release_2.2.3
  • SRB2_release_2.2.4
  • SRB2_release_2.2.5
  • SRB2_release_2.2.6
  • SRB2_release_2.2.7
  • SRB2_release_2.2.8
  • SRB2_release_2.2.9
  • td-release-v1.0.0
141 results
Show changes
Showing
with 271 additions and 605 deletions
include(LibFindMacros)
libfind_pkg_check_modules(libopenmpt_PKGCONF openmpt libopenmpt)
find_path(libopenmpt_INCLUDE_DIR
NAMES libopenmpt.h
PATHS
${libopenmpt_PKGCONF_INCLUDE_DIRS}
"${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include"
"/usr/include"
"/usr/local/include"
PATH_SUFFIXES
+ libopenmpt
)
find_library(libopenmpt_LIBRARY
NAMES openmpt
PATHS
${libopenmpt_PKGCONF_LIBRARY_DIRS}
"/usr/lib"
"/usr/local/lib"
)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(libopenmpt
REQUIRED_VARS libopenmpt_LIBRARY libopenmpt_INCLUDE_DIR)
if(libopenmpt_FOUND AND NOT TARGET openmpt)
add_library(openmpt UNKNOWN IMPORTED)
set_target_properties(
openmpt
PROPERTIES
IMPORTED_LOCATION "${libopenmpt_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${libopenmpt_INCLUDE_DIR}"
)
add_library(libopenmpt::libopenmpt ALIAS openmpt)
endif()
mark_as_advanced(libopenmpt_LIBRARY libopenmpt_INCLUDE_DIR)
include(LibFindMacros)
libfind_pkg_check_modules(libminiupnpc_PKGCONF miniupnpc libminiupnpc)
find_path(libminiupnpc_INCLUDE_DIR
NAMES miniupnpc.h
PATHS
${libminiupnpc_PKGCONF_INCLUDE_DIRS}
"${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include"
"/usr/include"
"/usr/local/include"
PATH_SUFFIXES
miniupnpc
)
find_library(libminiupnpc_LIBRARY
NAMES miniupnpc
PATHS
${libminiupnpc_PKGCONF_LIBRARY_DIRS}
"/usr/lib"
"/usr/local/lib"
)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(miniupnpc
REQUIRED_VARS libminiupnpc_LIBRARY libminiupnpc_INCLUDE_DIR)
if(miniupnpc_FOUND AND NOT TARGET miniupnpc)
add_library(miniupnpc UNKNOWN IMPORTED)
set_target_properties(
miniupnpc
PROPERTIES
IMPORTED_LOCATION "${libminiupnpc_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${libminiupnpc_INCLUDE_DIR}"
)
add_library(miniupnpc::miniupnpc ALIAS miniupnpc)
endif()
mark_as_advanced(libminiupnpc_LIBRARY libminiupnpc_INCLUDE_DIR)
# use GNU Patch from any platform
if(WIN32)
# prioritize Git Patch on Windows as other Patches may be very old and incompatible.
find_package(Git)
if(Git_FOUND)
get_filename_component(GIT_DIR ${GIT_EXECUTABLE} DIRECTORY)
get_filename_component(GIT_DIR ${GIT_DIR} DIRECTORY)
endif()
endif()
find_program(PATCH
NAMES patch
HINTS ${GIT_DIR}
PATH_SUFFIXES usr/bin
)
if(NOT PATCH)
message(FATAL_ERROR "Did not find GNU Patch")
endif()
execute_process(COMMAND ${PATCH} ${in_file} --input=${patch_file} --output=${out_file} --ignore-whitespace
TIMEOUT 15
COMMAND_ECHO STDOUT
RESULT_VARIABLE ret
)
if(NOT ret EQUAL 0)
message(FATAL_ERROR "Failed to apply patch ${patch_file} to ${in_file} with ${PATCH}")
endif()
\ No newline at end of file
set(CMAKE_SYSTEM_NAME Windows)
set(TOOLCHAIN_PREFIX i686-w64-mingw32)
# cross compilers to use for C, C++ and Fortran
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_Fortran_COMPILER ${TOOLCHAIN_PREFIX}-gfortran)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)
# target environment on the build host system
set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})
# modify default behavior of FIND_XXX() commands
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_SYSTEM_NAME Windows)
set(TOOLCHAIN_PREFIX x86_64-w64-mingw32)
# cross compilers to use for C, C++ and Fortran
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_Fortran_COMPILER ${TOOLCHAIN_PREFIX}-gfortran)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)
# target environment on the build host system
set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})
# modify default behavior of FIND_XXX() commands
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
......@@ -12,7 +12,7 @@ Upstream Author(s):
Copyright:
Copyright (C) 1998-2018 by Sonic Team Junior
Copyright (C) 1998-2025 by Sonic Team Junior
License:
......@@ -21,7 +21,7 @@ License:
The Debian packaging is:
Copyright (C) 2010 Callum Dickinson <gcfreak_ag20@hotmail.com>
Copyright (C) 2010-2018 by Sonic Team Junior <stjr@srb2.org>
Copyright (C) 2010-2025 by Sonic Team Junior <stjr@srb2.org>
and is licensed under the GPL version 2,
see "/usr/share/common-licenses/GPL-2".
===============================================================================
Universal Doom Map Format Sonic Robo Blast 2 extensions v1.0 19.02.2024
Universal Doom Map Format Sonic Robo Blast 2 extensions v1.0 19.06.2024
Copyright (c) 2024 Sonic Team Junior
uses Universal Doom Map Format Specification v1.1 as a template,
......@@ -126,7 +126,7 @@ Sonic Robo Blast 2 defines the following standardized fields:
texturebottom = <string>; // Lower texture. Default = "-".
texturemiddle = <string>; // Middle texture. Default = "-".
repeatcnt = <string>; // Number of middle texture repetitions. Default = 0
repeatcnt = <integer>; // Number of middle texture repetitions. Default = 0.
sector = <integer>; // Sector index. No valid default.
......@@ -143,6 +143,9 @@ Sonic Robo Blast 2 defines the following standardized fields:
offsetx_bottom = <float>; // X offset for lower texture. Default = 0.0.
offsety_bottom = <float>; // Y offset for lower texture. Default = 0.0.
light = <integer>; // Light level, relative to 'sector' light level. Default = 0.
lightabsolute = <bool>; // true = 'light' is an absolute value, ignoring 'sector' light level.
comment = <string>; // A comment. Implementors should attach no special
// semantic meaning to this field.
}
......@@ -228,6 +231,8 @@ Sonic Robo Blast 2 defines the following standardized fields:
ropehang = <bool>; // Sector is a rope hang. Must be applied to a 3D floor.
jumpflip = <bool>; // Sector flips the gravity of players who jump from it.
gravityoverride = <bool>; // Reverse gravity effect is only applied when an object is in the sector.
nophysics_floor = <bool>; // Disables floor slope physics if created through a plane equation.
nophysics_ceiling = <bool>; // Disables ceiling slope physics if created through a plane equation.
friction = <float>; // Sector's friction factor.
gravity = <float>; // Sector's gravity. Default is 1.0.
......
......@@ -39,6 +39,7 @@ common
defaulttexturescale = 1.0f;
defaultflatscale = 1.0f;
scaledtextureoffsets = true;
scaledflatoffsets = true;
// Colormap/fade related options
maxcolormapalpha = 25;
......@@ -114,7 +115,7 @@ mapformat_udmf
// Enables setting distinct brightness for floor, ceiling, and walls
distinctfloorandceilingbrightness = true;
distinctwallbrightness = false;
distinctwallbrightness = true;
// Enables setting distinct brightness for upper, middle, and lower sidedef parts
distinctsidedefpartbrightness = false;
......
......@@ -7,13 +7,11 @@ udmf
0
{
title = "None";
prefix = "(0)";
}
6
{
title = "Sector Set Portal";
prefix = "(6)";
arg0
{
title = "Target sector tag";
......@@ -52,7 +50,6 @@ udmf
7
{
title = "Sector Flat Alignment";
prefix = "(7)";
arg0
{
title = "Target sector tag";
......@@ -70,7 +67,6 @@ udmf
10
{
title = "Culling Plane";
prefix = "(10)";
arg0
{
title = "Target sector tag";
......@@ -91,20 +87,17 @@ udmf
40
{
title = "Visual Portal Between Tagged Linedefs";
prefix = "(40)";
}
41
{
title = "Horizon Effect";
id = "srb2_horizonline";
prefix = "(41)";
}
63
{
title = "Fake Floor/Ceiling Planes";
prefix = "(63)";
arg0
{
title = "Target sector tag";
......@@ -120,7 +113,6 @@ udmf
2
{
title = "Custom Exit";
prefix = "(2)";
arg0
{
title = "Next map";
......@@ -144,7 +136,6 @@ udmf
3
{
title = "Zoom Tube Parameters";
prefix = "(3)";
arg0
{
title = "Speed";
......@@ -166,7 +157,6 @@ udmf
4
{
title = "Speed Pad Parameters";
prefix = "(4)";
arg0
{
title = "Speed";
......@@ -193,7 +183,6 @@ udmf
8
{
title = "Set Camera Collision Planes";
prefix = "(8)";
arg0
{
title = "Target sector tag";
......@@ -204,7 +193,6 @@ udmf
11
{
title = "Rope Hang Parameters";
prefix = "(11)";
arg0
{
title = "Speed";
......@@ -226,7 +214,6 @@ udmf
14
{
title = "Bustable Block Parameters";
prefix = "(14)";
arg0
{
title = "Debris spacing";
......@@ -252,13 +239,11 @@ udmf
15
{
title = "Fan Particle Generator Heights";
prefix = "(15)";
}
16
{
title = "Minecart Parameters";
prefix = "(16)";
arg0
{
title = "Order";
......@@ -268,7 +253,6 @@ udmf
64
{
title = "Continuously Appearing/Disappearing FOF";
prefix = "(64)";
arg0
{
title = "Control linedef tag";
......@@ -307,7 +291,6 @@ udmf
20
{
title = "PolyObject First Line";
prefix = "(20)";
arg0
{
title = "PolyObject tag";
......@@ -348,7 +331,6 @@ udmf
30
{
title = "Waving PolyObject Flag";
prefix = "(30)";
arg0
{
title = "PolyObject tag";
......@@ -369,7 +351,6 @@ udmf
31
{
title = "Move PolyObject by Front Sector Displacement";
prefix = "(31)";
arg0
{
title = "PolyObject tag";
......@@ -385,7 +366,6 @@ udmf
32
{
title = "Rotate PolyObject by Front Sector Displacement";
prefix = "(32)";
arg0
{
title = "PolyObject tag";
......@@ -421,7 +401,6 @@ udmf
52
{
title = "Continuously Falling Sector";
prefix = "(52)";
arg0
{
title = "Speed";
......@@ -442,7 +421,6 @@ udmf
53
{
title = "Continuous Plane Mover (Slowdown)";
prefix = "(53)";
arg0
{
title = "Target sector tag";
......@@ -477,7 +455,6 @@ udmf
56
{
title = "Continuous Plane Mover (Constant)";
prefix = "(56)";
arg0
{
title = "Target sector tag";
......@@ -512,7 +489,6 @@ udmf
60
{
title = "Activate Moving Platform";
prefix = "(60)";
arg0
{
title = "Target sector tag";
......@@ -542,7 +518,6 @@ udmf
61
{
title = "Ceiling Crusher";
prefix = "(61)";
arg0
{
title = "Target sector tag";
......@@ -573,7 +548,6 @@ udmf
66
{
title = "Move Planes by Front Sector Displacement";
prefix = "(66)";
arg0
{
title = "Target sector tag";
......@@ -600,7 +574,6 @@ udmf
70
{
title = "Add Raise Thinker";
prefix = "(70)";
arg0
{
title = "Control linedef tag";
......@@ -626,7 +599,6 @@ udmf
71
{
title = "Add Air Bobbing Thinker";
prefix = "(71)";
arg0
{
title = "Control linedef tag";
......@@ -652,7 +624,6 @@ udmf
72
{
title = "Add Thwomp Thinker";
prefix = "(72)";
arg0
{
title = "Control linedef tag";
......@@ -679,7 +650,6 @@ udmf
73
{
title = "Add Laser Thinker";
prefix = "(73)";
arg0
{
title = "Control linedef tag";
......@@ -696,7 +666,6 @@ udmf
74
{
title = "Make FOF Bustable";
prefix = "(74)";
arg0
{
title = "Control linedef tag";
......@@ -735,7 +704,6 @@ udmf
75
{
title = "Make FOF Quicksand";
prefix = "(75)";
arg0
{
title = "Control linedef tag";
......@@ -755,7 +723,6 @@ udmf
76
{
title = "Make FOF Bouncy";
prefix = "(76)";
arg0
{
title = "Control linedef tag";
......@@ -775,7 +742,6 @@ udmf
100
{
title = "Solid";
prefix = "(100)";
id = "srb2_fofsolid";
arg0
{
......@@ -819,7 +785,6 @@ udmf
120
{
title = "Water";
prefix = "(120)";
id = "srb2_fofwater";
arg0
{
......@@ -857,7 +822,6 @@ udmf
150
{
title = "Air Bobbing";
prefix = "(150)";
id = "srb2_fofsolidopaque";
arg0
{
......@@ -884,7 +848,6 @@ udmf
160
{
title = "Water Bobbing";
prefix = "(160)";
id = "srb2_fofsolidopaque";
arg0
{
......@@ -896,7 +859,6 @@ udmf
170
{
title = "Crumbling";
prefix = "(170)";
id = "srb2_fofcrumbling";
arg0
{
......@@ -939,7 +901,6 @@ udmf
190
{
title = "Rising";
prefix = "(190)";
id = "srb2_fofsolid";
arg0
{
......@@ -998,7 +959,6 @@ udmf
200
{
title = "Light Block";
prefix = "(200)";
id = "srb2_foflight";
arg0
{
......@@ -1016,7 +976,6 @@ udmf
202
{
title = "Fog Block";
prefix = "(202)";
id = "srb2_foffog";
arg0
{
......@@ -1028,7 +987,6 @@ udmf
220
{
title = "Intangible";
prefix = "(220)";
id = "srb2_fofintangible";
arg0
{
......@@ -1066,7 +1024,6 @@ udmf
223
{
title = "Intangible, Invisible";
prefix = "(223)";
id = "srb2_fofintangibleinvisible";
arg0
{
......@@ -1078,7 +1035,6 @@ udmf
250
{
title = "Mario Block";
prefix = "(250)";
id = "srb2_fofsolidopaque";
arg0
{
......@@ -1100,7 +1056,6 @@ udmf
251
{
title = "Thwomp Block";
prefix = "(251)";
id = "srb2_fofsolidopaque";
arg0
{
......@@ -1128,7 +1083,6 @@ udmf
254
{
title = "Bustable Block";
prefix = "(254)";
id = "srb2_fofbustable";
arg0
{
......@@ -1181,7 +1135,6 @@ udmf
257
{
title = "Quicksand";
prefix = "(257)";
id = "srb2_fofsolidopaque";
arg0
{
......@@ -1208,7 +1161,6 @@ udmf
258
{
title = "Laser";
prefix = "(258)";
id = "srb2_foflaser";
arg0
{
......@@ -1242,7 +1194,6 @@ udmf
259
{
title = "Custom";
prefix = "(259)";
id = "srb2_fofcustom";
arg0
{
......@@ -1307,7 +1258,6 @@ udmf
300
{
title = "Basic";
prefix = "(300)";
arg0
{
title = "Trigger type";
......@@ -1319,7 +1269,6 @@ udmf
303
{
title = "Ring Count";
prefix = "(303)";
arg0
{
title = "Trigger type";
......@@ -1347,7 +1296,6 @@ udmf
305
{
title = "Character Ability";
prefix = "(305)";
arg0
{
title = "Trigger type";
......@@ -1383,7 +1331,6 @@ udmf
308
{
title = "Gametype";
prefix = "(308)";
arg0
{
title = "Trigger type";
......@@ -1441,7 +1388,6 @@ udmf
309
{
title = "CTF Team";
prefix = "(309)";
arg0
{
title = "Trigger type";
......@@ -1459,7 +1405,6 @@ udmf
313
{
title = "No More Enemies";
prefix = "(313)";
arg0
{
title = "Target sector tag";
......@@ -1470,7 +1415,6 @@ udmf
314
{
title = "Number of Pushables";
prefix = "(314)";
arg0
{
title = "Trigger type";
......@@ -1492,7 +1436,6 @@ udmf
317
{
title = "Condition Set Trigger";
prefix = "(317)";
arg0
{
title = "Trigger type";
......@@ -1508,7 +1451,6 @@ udmf
319
{
title = "Unlockable";
prefix = "(319)";
arg0
{
title = "Trigger type";
......@@ -1524,7 +1466,6 @@ udmf
321
{
title = "Trigger After X Calls";
prefix = "(321)";
arg0
{
title = "Trigger type";
......@@ -1550,7 +1491,6 @@ udmf
323
{
title = "NiGHTSerize";
prefix = "(323)";
arg0
{
title = "Trigger type";
......@@ -1617,7 +1557,6 @@ udmf
325
{
title = "De-NiGHTSerize";
prefix = "(325)";
arg0
{
title = "Trigger type";
......@@ -1680,7 +1619,6 @@ udmf
327
{
title = "NiGHTS Lap";
prefix = "(327)";
arg0
{
title = "Trigger type";
......@@ -1732,7 +1670,6 @@ udmf
329
{
title = "Ideya Capture Touch";
prefix = "(329)";
arg0
{
title = "Trigger type";
......@@ -1800,7 +1737,6 @@ udmf
331
{
title = "Player Skin";
prefix = "(331)";
arg0
{
title = "Trigger type";
......@@ -1823,7 +1759,6 @@ udmf
334
{
title = "Object Dye";
prefix = "(334)";
arg0
{
title = "Trigger type";
......@@ -1846,7 +1781,6 @@ udmf
337
{
title = "Emerald Check";
prefix = "(337)";
arg0
{
title = "Trigger type";
......@@ -1879,7 +1813,6 @@ udmf
340
{
title = "NiGHTS Mare";
prefix = "(340)";
arg0
{
title = "Trigger type";
......@@ -1901,7 +1834,6 @@ udmf
343
{
title = "Gravity Check";
prefix = "(343)";
arg0
{
title = "Trigger type";
......@@ -1924,7 +1856,6 @@ udmf
399
{
title = "Level Load";
prefix = "(399)";
}
}
......@@ -1935,7 +1866,6 @@ udmf
400
{
title = "Set Tagged Sector's Heights/Textures";
prefix = "(400)";
arg0
{
title = "Target sector tag";
......@@ -1958,7 +1888,6 @@ udmf
402
{
title = "Copy Light Level to Tagged Sectors";
prefix = "(402)";
arg0
{
title = "Target sector tag";
......@@ -1980,7 +1909,6 @@ udmf
408
{
title = "Set Tagged Sector's Flats";
prefix = "(408)";
arg0
{
title = "Target sector tag";
......@@ -1997,7 +1925,6 @@ udmf
409
{
title = "Change Tagged Sector's Tag";
prefix = "(409)";
arg0
{
title = "Target sector tag";
......@@ -2025,7 +1952,6 @@ udmf
410
{
title = "Change Front Sector's Tag";
prefix = "(410)";
arg0
{
title = "Tag";
......@@ -2048,7 +1974,6 @@ udmf
416
{
title = "Start Adjustable Flickering Light";
prefix = "(416)";
arg0
{
title = "Target sector tag";
......@@ -2077,7 +2002,6 @@ udmf
417
{
title = "Start Adjustable Pulsating Light";
prefix = "(417)";
arg0
{
title = "Target sector tag";
......@@ -2106,7 +2030,6 @@ udmf
418
{
title = "Start Adjustable Blinking Light";
prefix = "(418)";
arg0
{
title = "Target sector tag";
......@@ -2143,7 +2066,6 @@ udmf
420
{
title = "Fade Light Level";
prefix = "(420)";
arg0
{
title = "Target sector tag";
......@@ -2173,7 +2095,6 @@ udmf
421
{
title = "Stop Lighting Effect";
prefix = "(421)";
arg0
{
title = "Target sector tag";
......@@ -2184,7 +2105,6 @@ udmf
435
{
title = "Change Plane Scroller Direction";
prefix = "(435)";
arg0
{
title = "Target sector tag";
......@@ -2200,7 +2120,6 @@ udmf
467
{
title = "Set Tagged Sector's Light Level";
prefix = "(467)";
arg0
{
title = "Target sector tag";
......@@ -2232,7 +2151,6 @@ udmf
469
{
title = "Change Tagged Sector's Gravity";
prefix = "(469)";
arg0
{
title = "Target sector tag";
......@@ -2284,7 +2202,6 @@ udmf
403
{
title = "Move Tagged Sector's Planes";
prefix = "(403)";
arg0
{
title = "Target sector tag";
......@@ -2317,7 +2234,6 @@ udmf
405
{
title = "Move Planes by Set Distance";
prefix = "(405)";
arg0
{
title = "Target sector tag";
......@@ -2349,7 +2265,6 @@ udmf
411
{
title = "Stop Plane Movement";
prefix = "(411)";
arg0
{
title = "Target sector tag";
......@@ -2360,7 +2275,6 @@ udmf
428
{
title = "Start Platform Movement";
prefix = "(428)";
arg0
{
title = "Target sector tag";
......@@ -2394,7 +2308,6 @@ udmf
429
{
title = "Crush Planes Once";
prefix = "(429)";
arg0
{
title = "Target sector tag";
......@@ -2426,7 +2339,6 @@ udmf
412
{
title = "Teleporter";
prefix = "(412)";
arg0
{
title = "Destination thing tag";
......@@ -2461,7 +2373,6 @@ udmf
425
{
title = "Change Object State";
prefix = "(425)";
stringarg0
{
title = "State";
......@@ -2472,7 +2383,6 @@ udmf
426
{
title = "Stop Object";
prefix = "(426)";
arg0
{
title = "Move to center?";
......@@ -2484,7 +2394,6 @@ udmf
427
{
title = "Award Score";
prefix = "(427)";
arg0
{
title = "Score";
......@@ -2494,7 +2403,6 @@ udmf
432
{
title = "Enable/Disable 2D Mode";
prefix = "(432)";
arg0
{
title = "Mode";
......@@ -2510,7 +2418,6 @@ udmf
433
{
title = "Enable/Disable Gravity Flip";
prefix = "(433)";
arg0
{
title = "Set gravity";
......@@ -2546,7 +2453,6 @@ udmf
434
{
title = "Award Power-Up";
prefix = "(434)";
stringarg0
{
title = "Power";
......@@ -2562,7 +2468,6 @@ udmf
437
{
title = "Disable Player Control";
prefix = "(437)";
arg0
{
title = "Time";
......@@ -2578,7 +2483,6 @@ udmf
438
{
title = "Change Object Size";
prefix = "(438)";
arg0
{
title = "Size (%)";
......@@ -2589,7 +2493,6 @@ udmf
442
{
title = "Change Object Type State";
prefix = "(442)";
arg0
{
title = "Target sector tag";
......@@ -2620,7 +2523,6 @@ udmf
457
{
title = "Track Object's Angle";
prefix = "(457)";
arg0
{
title = "Anchor tag";
......@@ -2651,13 +2553,11 @@ udmf
458
{
title = "Stop Tracking Object's Angle";
prefix = "(458)";
}
460
{
title = "Award Rings";
prefix = "(460)";
arg0
{
title = "Rings";
......@@ -2671,7 +2571,6 @@ udmf
461
{
title = "Spawn Object";
prefix = "(461)";
arg0
{
title = "X position";
......@@ -2717,13 +2616,11 @@ udmf
462
{
title = "Stop Timer/Exit Stage in Record Attack";
prefix = "(462)";
}
463
{
title = "Dye Object";
prefix = "(463)";
stringarg0
{
title = "Skin color";
......@@ -2734,7 +2631,6 @@ udmf
464
{
title = "Trigger Egg Capsule";
prefix = "(464)";
arg0
{
title = "Egg Capsule tag";
......@@ -2751,7 +2647,6 @@ udmf
466
{
title = "Set Level Failure State";
prefix = "(466)";
arg0
{
title = "State";
......@@ -2772,7 +2667,6 @@ udmf
413
{
title = "Change Music";
prefix = "(413)";
arg0
{
title = "Flags";
......@@ -2823,7 +2717,6 @@ udmf
414
{
title = "Play Sound Effect";
prefix = "(414)";
arg0
{
title = "Source";
......@@ -2863,7 +2756,6 @@ udmf
415
{
title = "Run Script";
prefix = "(415)";
stringarg0
{
title = "Lump name";
......@@ -2874,7 +2766,6 @@ udmf
422
{
title = "Switch to Cut-Away View";
prefix = "(422)";
arg0
{
title = "Viewpoint tag";
......@@ -2889,7 +2780,6 @@ udmf
423
{
title = "Change Sky";
prefix = "(423)";
arg0
{
title = "Sky number";
......@@ -2905,7 +2795,6 @@ udmf
424
{
title = "Change Weather";
prefix = "(424)";
arg0
{
title = "Weather";
......@@ -2932,7 +2821,6 @@ udmf
436
{
title = "Shatter FOF";
prefix = "(436)";
arg0
{
title = "Target sector tag";
......@@ -2948,7 +2836,6 @@ udmf
439
{
title = "Change Tagged Linedef's Textures";
prefix = "(439)";
arg0
{
title = "Target linedef tag";
......@@ -2977,13 +2864,11 @@ udmf
440
{
title = "Start Metal Sonic Race";
prefix = "(440)";
}
441
{
title = "Condition Set Trigger";
prefix = "(441)";
arg0
{
title = "Trigger number";
......@@ -2993,7 +2878,6 @@ udmf
443
{
title = "Call Lua Function";
prefix = "(443)";
stringarg0
{
title = "Function name";
......@@ -3004,7 +2888,6 @@ udmf
444
{
title = "Earthquake";
prefix = "(444)";
arg0
{
title = "Duration";
......@@ -3018,7 +2901,6 @@ udmf
445
{
title = "Make FOF Disappear/Reappear";
prefix = "(445)";
arg0
{
title = "Target sector tag";
......@@ -3044,7 +2926,6 @@ udmf
446
{
title = "Make FOF Crumble";
prefix = "(446)";
arg0
{
title = "Target sector tag";
......@@ -3072,7 +2953,6 @@ udmf
447
{
title = "Change Tagged Sector's Colormap";
prefix = "(447)";
arg0
{
title = "Target sector tag";
......@@ -3108,7 +2988,6 @@ udmf
448
{
title = "Change Skybox";
prefix = "(448)";
arg0
{
title = "Viewpoint thing tag";
......@@ -3139,7 +3018,6 @@ udmf
449
{
title = "Enable Bosses with Parameter";
prefix = "(449)";
arg0
{
title = "Boss ID";
......@@ -3159,7 +3037,6 @@ udmf
450
{
title = "Execute Linedef Executor (specific tag)";
prefix = "(450)";
arg0
{
title = "Trigger linedef tag";
......@@ -3170,7 +3047,6 @@ udmf
451
{
title = "Execute Linedef Executor (random tag in range)";
prefix = "(451)";
arg0
{
title = "Start of tag range";
......@@ -3186,7 +3062,6 @@ udmf
452
{
title = "Set FOF Translucency";
prefix = "(452)";
arg0
{
title = "Target sector tag";
......@@ -3217,7 +3092,6 @@ udmf
453
{
title = "Fade FOF";
prefix = "(453)";
arg0
{
title = "Target sector tag";
......@@ -3260,7 +3134,6 @@ udmf
454
{
title = "Stop Fading FOF";
prefix = "(454)";
arg0
{
title = "Target sector tag";
......@@ -3282,7 +3155,6 @@ udmf
455
{
title = "Fade Tagged Sector's Colormap";
prefix = "(455)";
arg0
{
title = "Target sector tag";
......@@ -3324,7 +3196,6 @@ udmf
456
{
title = "Stop Fading Tagged Sector's Colormap";
prefix = "(456)";
arg0
{
title = "Target sector tag";
......@@ -3335,7 +3206,6 @@ udmf
459
{
title = "Control Text Prompt";
prefix = "(459)";
arg0
{
title = "Prompt number";
......@@ -3371,7 +3241,6 @@ udmf
465
{
title = "Set Linedef Executor Delay";
prefix = "(465)";
arg0
{
title = "Linedef tag";
......@@ -3392,7 +3261,6 @@ udmf
468
{
title = "Change Linedef Argument";
prefix = "(468)";
arg0
{
title = "Linedef tag";
......@@ -3422,7 +3290,6 @@ udmf
480
{
title = "PolyObject Door Slide";
prefix = "(480)";
arg0
{
title = "PolyObject tag";
......@@ -3446,7 +3313,6 @@ udmf
481
{
title = "PolyObject Door Swing";
prefix = "(481)";
arg0
{
title = "PolyObject tag";
......@@ -3471,7 +3337,6 @@ udmf
482
{
title = "Move PolyObject";
prefix = "(482)";
arg0
{
title = "PolyObject tag";
......@@ -3497,7 +3362,6 @@ udmf
484
{
title = "Rotate PolyObject";
prefix = "(484)";
arg0
{
title = "PolyObject tag";
......@@ -3531,7 +3395,6 @@ udmf
488
{
title = "Move PolyObject by Waypoints";
prefix = "(488)";
arg0
{
title = "PolyObject tag";
......@@ -3573,7 +3436,6 @@ udmf
489
{
title = "Set PolyObject Visibility/Tangibility";
prefix = "(489)";
arg0
{
title = "PolyObject tag";
......@@ -3606,7 +3468,6 @@ udmf
491
{
title = "Set PolyObject Translucency";
prefix = "(491)";
arg0
{
title = "PolyObject tag";
......@@ -3628,7 +3489,6 @@ udmf
492
{
title = "Fade PolyObject Translucency";
prefix = "(492)";
arg0
{
title = "PolyObject tag";
......@@ -3666,7 +3526,6 @@ udmf
500
{
title = "Scroll Wall";
prefix = "(500)";
arg0
{
title = "Side";
......@@ -3686,7 +3545,6 @@ udmf
502
{
title = "Scroll Tagged Walls";
prefix = "(502)";
arg0
{
title = "Linedef tag";
......@@ -3717,7 +3575,6 @@ udmf
510
{
title = "Scroll Planes";
prefix = "(510)";
arg0
{
title = "Sector tag";
......@@ -3755,7 +3612,6 @@ udmf
541
{
title = "Wind/Current";
prefix = "(541)";
arg0
{
title = "Sector tag";
......@@ -3800,7 +3656,6 @@ udmf
600
{
title = "Copy Light Level to Tagged Sector's Planes";
prefix = "(600)";
arg0
{
title = "Target sector tag";
......@@ -3817,7 +3672,6 @@ udmf
602
{
title = "Adjustable Pulsating Light";
prefix = "(602)";
arg0
{
title = "Target sector tag";
......@@ -3846,7 +3700,6 @@ udmf
603
{
title = "Adjustable Flickering Light";
prefix = "(603)";
arg0
{
title = "Target sector tag";
......@@ -3875,7 +3728,6 @@ udmf
604
{
title = "Adjustable Blinking Light";
prefix = "(604)";
arg0
{
title = "Target sector tag";
......@@ -3912,7 +3764,6 @@ udmf
606
{
title = "Copy Colormap";
prefix = "(606)";
arg0
{
title = "Target sector tag";
......@@ -3933,7 +3784,6 @@ udmf
700
{
title = "Create Sector-Based Slope";
prefix = "(700)";
id = "plane_align";
arg0
{
......@@ -3963,7 +3813,6 @@ udmf
704
{
title = "Create Vertex-Based Slope";
prefix = "(704)";
id = "srb2_vertexslope";
arg0
{
......@@ -4007,7 +3856,6 @@ udmf
720
{
title = "Copy Slope";
prefix = "(720)";
id = "plane_copy";
arg0
{
......@@ -4046,7 +3894,6 @@ udmf
799
{
title = "Set Tagged Dynamic Slope Vertex to Front Sector Height";
prefix = "(799)";
arg0
{
title = "Apply height";
......
......@@ -78,6 +78,8 @@ sectorflags
ropehang = "Rope Hang";
jumpflip = "Flip Gravity on Jump";
gravityoverride = "Make Reverse Gravity Temporary";
nophysics_floor = "Disable Floor Slope Physics";
nophysics_ceiling = "Disable Ceiling Slope Physics";
flipspecial_nofloor = "No Trigger on Floor Touch";
flipspecial_ceiling = "Trigger on Ceiling Touch";
triggerspecial_touch = "Trigger on Edge Touch";
......@@ -114,6 +116,8 @@ sectorflagscategories
ropehang = "special";
jumpflip = "special";
gravityoverride = "special";
nophysics_floor = "special";
nophysics_ceiling = "special";
flipspecial_nofloor = "trigger";
flipspecial_ceiling = "trigger";
triggerspecial_touch = "trigger";
......@@ -276,18 +280,18 @@ universalfields
default = "";
}
//light
//{
// type = 0;
// default = 0;
//}
//
//lightabsolute
//{
// type = 3;
// default = false;
//}
//
light
{
type = 0;
default = 0;
}
lightabsolute
{
type = 3;
default = false;
}
//light_top
//{
// type = 0;
......@@ -586,6 +590,12 @@ universalfields
type = 3;
default = false;
}
triggertag
{
type = 0;
default = 0;
}
}
}
......
......@@ -3938,6 +3938,7 @@ udmf
width = 30;
height = 32;
color = 17;
hangs = 1;
arg0
{
title = "Initial delay";
......
This is a list of major changes in SDL's version history.
---------------------------------------------------------------------------
2.30.0:
---------------------------------------------------------------------------
General:
* Added support for 2 bits-per-pixel indexed surface formats
* Added the function SDL_GameControllerGetSteamHandle() to get the Steam API handle for a controller, if available
* Added the event SDL_CONTROLLERSTEAMHANDLEUPDATED which is sent when the Steam API handle for a controller changes. This could also change the name, VID, and PID of the controller.
* Added the environment variable SDL_LOGGING to control default log output
macOS:
* Added the hint SDL_HINT_JOYSTICK_IOKIT to control whether the IOKit controller driver should be used
* Added the hint SDL_HINT_JOYSTICK_MFI to control whether the GCController controller driver should be used
* Added the hint SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE to choose whether high or low power GPU should be used for rendering, in the case where there are multiple GPUs available
Xbox:
* Added the function SDL_GDKGetDefaultUser()
---------------------------------------------------------------------------
2.28.2:
---------------------------------------------------------------------------
General:
* Added the hint SDL_HINT_JOYSTICK_WGI to control whether to use Windows.Gaming.Input for controllers
......
......@@ -35,7 +35,7 @@ SDL now has, internally, a table of function pointers. So, this is what SDL_Init
now looks like:
```c
Uint32 SDL_Init(Uint32 flags)
UInt32 SDL_Init(Uint32 flags)
{
return jump_table.SDL_Init(flags);
}
......@@ -100,7 +100,7 @@ a shared library of its own). If so, it loads that library and looks for and
calls a single function:
```c
Sint32 SDL_DYNAPI_entry(Uint32 version, void *table, Uint32 tablesize);
SInt32 SDL_DYNAPI_entry(Uint32 version, void *table, Uint32 tablesize);
```
That function takes a version number (more on that in a moment), the address of
......
# Emscripten
## The state of things
(This documentation is not very robust; we will update and expand this later.)
(As of September 2023, but things move quickly and we don't update this
document often.)
In modern times, all the browsers you probably care about (Chrome, Firefox,
Edge, and Safari, on Windows, macOS, Linux, iOS and Android), support some
reasonable base configurations:
- WebAssembly (don't bother with asm.js any more)
- WebGL (which will look like OpenGL ES 2 or 3 to your app).
- Threads (see caveats, though!)
- Game controllers
- Autoupdating (so you can assume they have a recent version of the browser)
All this to say we're at the point where you don't have to make a lot of
concessions to get even a fairly complex SDL-based game up and running.
## RTFM
This document is a quick rundown of some high-level details. The
documentation at [emscripten.org](https://emscripten.org/) is vast
and extremely detailed for a wide variety of topics, and you should at
least skim through it at some point.
## Porting your app to Emscripten
Many many things just need some simple adjustments and they'll compile
like any other C/C++ code, as long as SDL was handling the platform-specific
work for your program.
First, you probably need this in at least one of your source files:
```c
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif
```
Second: assembly language code has to go. Replace it with C. You can even use
[x86 SIMD intrinsic functions in Emscripten](https://emscripten.org/docs/porting/simd.html)!
Third: Middleware has to go. If you have a third-party library you link
against, you either need an Emscripten port of it, or the source code to it
to compile yourself, or you need to remove it.
Fourth: You still start in a function called main(), but you need to get out of
it and into a function that gets called repeatedly, and returns quickly,
called a mainloop.
Somewhere in your program, you probably have something that looks like a more
complicated version of this:
```c
void main(void)
{
initialize_the_game();
while (game_is_still_running) {
check_for_new_input();
think_about_stuff();
draw_the_next_frame();
}
deinitialize_the_game();
}
```
This will not work on Emscripten, because the main thread needs to be free
to do stuff and can't sit in this loop forever. So Emscripten lets you set up
a [mainloop](https://emscripten.org/docs/porting/emscripten-runtime-environment.html#browser-main-loop).
```c
static void mainloop(void) /* this will run often, possibly at the monitor's refresh rate */
{
if (!game_is_still_running) {
deinitialize_the_game();
#ifdef __EMSCRIPTEN__
emscripten_cancel_main_loop(); /* this should "kill" the app. */
#else
exit(0);
#endif
}
check_for_new_input();
think_about_stuff();
draw_the_next_frame();
}
void main(void)
{
initialize_the_game();
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(mainloop, 0, 1);
#else
while (1) { mainloop(); }
#endif
}
```
Basically, `emscripten_set_main_loop(mainloop, 0, 1);` says "run
`mainloop` over and over until I end the program." The function will
run, and return, freeing the main thread for other tasks, and then
run again when it's time. The `1` parameter does some magic to make
your main() function end immediately; this is useful because you
don't want any shutdown code that might be sitting below this code
to actually run if main() were to continue on, since we're just
getting started.
There's a lot of little details that are beyond the scope of this
document, but that's the biggest intial set of hurdles to porting
your app to the web.
## Do you need threads?
If you plan to use threads, they work on all major browsers now. HOWEVER,
they bring with them a lot of careful considerations. Rendering _must_
be done on the main thread. This is a general guideline for many
platforms, but a hard requirement on the web.
Many other things also must happen on the main thread; often times SDL
and Emscripten make efforts to "proxy" work to the main thread that
must be there, but you have to be careful (and read more detailed
documentation than this for the finer points).
Even when using threads, your main thread needs to set an Emscripten
mainloop that runs quickly and returns, or things will fail to work
correctly.
You should definitely read [Emscripten's pthreads docs](https://emscripten.org/docs/porting/pthreads.html)
for all the finer points. Mostly SDL's thread API will work as expected,
but is built on pthreads, so it shares the same little incompatibilities
that are documented there, such as where you can use a mutex, and when
a thread will start running, etc.
IMPORTANT: You have to decide to either build something that uses
threads or something that doesn't; you can't have one build
that works everywhere. This is an Emscripten (or maybe WebAssembly?
Or just web browsers in general?) limitation. If you aren't using
threads, it's easier to not enable them at all, at build time.
If you use threads, you _have to_ run from a web server that has
[COOP/COEP headers set correctly](https://web.dev/why-coop-coep/)
or your program will fail to start at all.
If building with threads, `__EMSCRIPTEN_PTHREADS__` will be defined
for checking with the C preprocessor, so you can build something
different depending on what sort of build you're compiling.
## Audio
Audio works as expected at the API level, but not exactly like other
platforms.
You'll only see a single default audio device. Audio capture also works;
if the browser pops up a prompt to ask for permission to access the
microphone, the SDL_OpenAudioDevice call will succeed and start producing
silence at a regular interval. Once the user approves the request, real
audio data will flow. If the user denies it, the app is not informed and
will just continue to receive silence.
## A quick note about audio
Modern web browsers will not permit web pages to produce sound before the
user has interacted with them (clicked or tapped on them, usually); this is
for several reasons, not the least of which being that no one likes when a
random browser tab suddenly starts making noise and the user has to scramble
to figure out which and silence it.
SDL will allow you to open the audio device for playback in this
circumstance, and your audio callback will fire, but SDL will throw the audio
data away until the user interacts with the page. This helps apps that depend
on the audio callback to make progress, and also keeps audio playback in sync
once the app is finally allowed to make noise.
There are two reasonable ways to deal with the silence at the app level:
if you are writing some sort of media player thing, where the user expects
there to be a volume control when you mouseover the canvas, just default
that control to a muted state; if the user clicks on the control to unmute
it, on this first click, open the audio device. This allows the media to
play at start, and the user can reasonably opt-in to listening.
user has interacted with them; this is for several reasons, not the least
of which being that no one likes when a random browser tab suddenly starts
making noise and the user has to scramble to figure out which and silence
it.
To solve this, most browsers will refuse to let a web app use the audio
subsystem at all before the user has interacted with (clicked on) the page
in a meaningful way. SDL-based apps also have to deal with this problem; if
the user hasn't interacted with the page, SDL_OpenAudioDevice will fail.
There are two reasonable ways to deal with this: if you are writing some
sort of media player thing, where the user expects there to be a volume
control when you mouseover the canvas, just default that control to a muted
state; if the user clicks on the control to unmute it, on this first click,
open the audio device. This allows the media to play at start, the user can
reasonably opt-in to listening, and you never get access denied to the audio
device.
Many games do not have this sort of UI, and are more rigid about starting
audio along with everything else at the start of the process. For these, your
......@@ -196,179 +36,41 @@ Please see the discussion at https://github.com/libsdl-org/SDL/issues/6385
for some Javascript code to steal for this approach.
## Rendering
If you use SDL's 2D render API, it will use GLES2 internally, which
Emscripten will turn into WebGL calls. You can also use OpenGL ES 2
directly by creating a GL context and drawing into it.
Calling SDL_RenderPresent (or SDL_GL_SwapWindow) will not actually
present anything on the screen until your return from your mainloop
function.
## Building SDL/emscripten
First: do you _really_ need to build SDL from source?
If you aren't developing SDL itself, have a desire to mess with its source
code, or need something on the bleeding edge, don't build SDL. Just use
Emscripten's packaged version!
Compile and link your app with `-sUSE_SDL=2` and it'll use a build of
SDL packaged with Emscripten. This comes from the same source code and
fixes the Emscripten project makes to SDL are generally merged into SDL's
revision control, so often this is much easier for app developers.
`-sUSE_SDL=1` will select Emscripten's JavaScript reimplementation of SDL
1.2 instead; if you need SDL 1.2, this might be fine, but we generally
recommend you don't use SDL 1.2 in modern times.
If you want to build SDL, though...
SDL currently requires at least Emscripten 3.1.35 to build. Newer versions
are likely to work, as well.
Build:
This works on Linux/Unix and macOS. Please send comments about Windows.
Make sure you've [installed emsdk](https://emscripten.org/docs/getting_started/downloads.html)
first, and run `source emsdk_env.sh` at the command line so it finds the
tools.
(These configure options might be overkill, but this has worked for me.)
```bash
cd SDL
mkdir build
cd build
emconfigure ../configure --host=wasm32-unknown-emscripten --disable-pthreads --disable-assembly --disable-cpuinfo CFLAGS="-sUSE_SDL=0 -O3"
emmake make -j4
```
If you want to build with thread support, something like this works:
```bash
emconfigure ../configure --host=wasm32-unknown-emscripten --enable-pthreads --disable-assembly --disable-cpuinfo CFLAGS="-sUSE_SDL=0 -O3 -pthread" LDFLAGS="-pthread"
```
$ mkdir build
$ cd build
$ emconfigure ../configure --host=asmjs-unknown-emscripten --disable-assembly --disable-threads --disable-cpuinfo CFLAGS="-O2"
$ emmake make
Or with cmake:
```bash
mkdir build
cd build
emcmake cmake ..
emmake make -j4
```
$ mkdir build
$ cd build
$ emcmake cmake ..
$ emmake make
To build one of the tests:
```bash
cd test/
emcc -O2 --js-opts 0 -g4 testdraw2.c -I../include ../build/.libs/libSDL2.a ../build/libSDL2_test.a -o a.html
```
## Building your app
You need to compile with `emcc` instead of `gcc` or `clang` or whatever, but
mostly it uses the same command line arguments as Clang.
Link against the SDL/build/.libs/libSDL2.a file you generated by building SDL,
link with `-sUSE_SDL=2` to use Emscripten's prepackaged SDL2 build.
Usually you would produce a binary like this:
```bash
gcc -o mygame mygame.c # or whatever
```
But for Emscripten, you want to output something else:
```bash
emcc -o index.html mygame.c
```
This will produce several files...support Javascript and WebAssembly (.wasm)
files. The `-o index.html` will produce a simple HTML page that loads and
runs your app. You will (probably) eventually want to replace or customize
that file and do `-o index.js` instead to just build the code pieces.
If you're working on a program of any serious size, you'll likely need to
link with `-sALLOW_MEMORY_GROWTH=1 -sMAXIMUM_MEMORY=1gb` to get access
to more memory. If using pthreads, you'll need the `-sMAXIMUM_MEMORY=1gb`
or the app will fail to start on iOS browsers, but this might be a bug that
goes away in the future.
## Data files
Your game probably has data files. Here's how to access them.
Filesystem access works like a Unix filesystem; you have a single directory
tree, possibly interpolated from several mounted locations, no drive letters,
'/' for a path separator. You can access them with standard file APIs like
open() or fopen() or SDL_RWops. You can read or write from the filesystem.
By default, you probably have a "MEMFS" filesystem (all files are stored in
memory, but access to them is immediate and doesn't need to block). There are
other options, like "IDBFS" (files are stored in a local database, so they
don't need to be in RAM all the time and they can persist between runs of the
program, but access is not synchronous). You can mix and match these file
systems, mounting a MEMFS filesystem at one place and idbfs elsewhere, etc,
but that's beyond the scope of this document. Please refer to Emscripten's
[page on the topic](https://emscripten.org/docs/porting/files/file_systems_overview.html)
for more info.
The _easiest_ (but not the best) way to get at your data files is to embed
them in the app itself. Emscripten's linker has support for automating this.
```bash
emcc -o index.html loopwave.c --embed-file=../test/sample.wav@/sounds/sample.wav
```
This will pack ../test/sample.wav in your app, and make it available at
"/sounds/sample.wav" at runtime. Emscripten makes sure this data is available
before your main() function runs, and since it's in MEMFS, you can just
read it like you do on other platforms. `--embed-file` can also accept a
directory to pack an entire tree, and you can specify the argument multiple
times to pack unrelated things into the final installation.
Note that this is absolutely the best approach if you have a few small
files to include and shouldn't worry about the issue further. However, if you
have hundreds of megabytes and/or thousands of files, this is not so great,
since the user will download it all every time they load your page, and it
all has to live in memory at runtime.
[Emscripten's documentation on the matter](https://emscripten.org/docs/porting/files/packaging_files.html)
gives other options and details, and is worth a read.
## Debugging
Debugging web apps is a mixed bag. You should compile and link with
`-gsource-map`, which embeds a ton of source-level debugging information into
the build, and make sure _the app source code is available on the web server_,
which is often a scary proposition for various reasons.
When you debug from the browser's tools and hit a breakpoint, you can step
through the actual C/C++ source code, though, which can be nice.
If you try debugging in Firefox and it doesn't work well for no apparent
reason, try Chrome, and vice-versa. These tools are still relatively new,
and improving all the time.
SDL_Log() (or even plain old printf) will write to the Javascript console,
and honestly I find printf-style debugging to be easier than setting up a build
for proper debugging, so use whatever tools work best for you.
$ cd test/
$ emcc -O2 --js-opts 0 -g4 testdraw2.c -I../include ../build/.libs/libSDL2.a ../build/libSDL2_test.a -o a.html
Uses GLES2 renderer or software
## Questions?
Some other SDL2 libraries can be easily built (assuming SDL2 is installed somewhere):
Please give us feedback on this document at [the SDL bug tracker](https://github.com/libsdl-org/SDL/issues).
If something is wrong or unclear, we want to know!
SDL_mixer (http://www.libsdl.org/projects/SDL_mixer/):
$ EMCONFIGURE_JS=1 emconfigure ../configure
build as usual...
SDL_gfx (http://cms.ferzkopp.net/index.php/software/13-sdl-gfx):
$ EMCONFIGURE_JS=1 emconfigure ../configure --disable-mmx
build as usual...
......@@ -3,7 +3,7 @@ GDK
This port allows SDL applications to run via Microsoft's Game Development Kit (GDK).
Windows (GDK) and Xbox One/Xbox Series (GDKX) are both supported and all the required code is included in this public SDL release. However, only licensed Xbox developers have access to the GDKX libraries which will allow you to build the Xbox targets.
Windows (GDK) and Xbox One/Xbox Series (GDKX) are supported. Although most of the Xbox code is included in the public SDL source code, NDA access is required for a small number of source files. If you have access to GDKX, these required Xbox files are posted on the GDK forums [here](https://forums.xboxlive.com/questions/130003/).
Requirements
......@@ -11,7 +11,6 @@ Requirements
* Microsoft Visual Studio 2022 (in theory, it should also work in 2017 or 2019, but this has not been tested)
* Microsoft GDK June 2022 or newer (public release [here](https://github.com/microsoft/GDK/releases/tag/June_2022))
* For Xbox, you will need the corresponding GDKX version (licensed developers only)
* To publish a package or successfully authenticate a user, you will need to create an app id/configure services in Partner Center. However, for local testing purposes (without authenticating on Xbox Live), the identifiers used by the GDK test programs in the included solution will work.
......@@ -30,12 +29,6 @@ The Windows GDK port supports the full set of Win32 APIs, renderers, controllers
* Global task queue callbacks are dispatched during `SDL_PumpEvents` (which is also called internally if using `SDL_PollEvent`).
* You can get the handle of the global task queue through `SDL_GDKGetTaskQueue`, if needed. When done with the queue, be sure to use `XTaskQueueCloseHandle` to decrement the reference count (otherwise it will cause a resource leak).
* Single-player games have some additional features available:
* Call `SDL_GDKGetDefaultUser` to get the default XUserHandle pointer.
* `SDL_GetPrefPath` still works, but only for single-player titles.
These functions mostly wrap around async APIs, and thus should be treated as synchronous alternatives. Also note that the single-player functions return on any OS errors, so be sure to validate the return values!
* What doesn't work:
* Compilation with anything other than through the included Visual C++ solution file
......@@ -146,20 +139,6 @@ To create the package:
6. Once the package is installed, you can run it from the start menu.
7. As with when running from Visual Studio, if you need to test any Xbox Live functionality you must switch to the correct sandbox.
Xbox GDKX Setup
---------------------
In general, the same process in the Windows GDK instructions work. There are just a few additional notes:
* For Xbox One consoles, use the Gaming.Xbox.XboxOne.x64 target
* For Xbox Series consoles, use the Gaming.Xbox.Scarlett.x64 target
* The Xbox One target sets the `__XBOXONE__` define and the Xbox Series target sets the `__XBOXSERIES__` define
* You don't need to link against the Xbox.Services Thunks lib nor include that dll in your package (it doesn't exist for Xbox)
* The shader blobs for Xbox are created in a pre-build step for the Xbox targets, rather than included in the source (due to NDA and version compatability reasons)
* To create a package, use:
`makepkg pack /f PackageLayout.xml /lt /d . /pd Package`
* To install the package, use:
`xbapp install [PACKAGE].xvc`
* For some reason, if you make changes that require SDL2.dll to build, and you are running through the debugger (instead of a package), you have to rebuild your .exe target for the debugger to recognize the dll has changed and needs to be transferred to the console again
* While there are successful releases of Xbox titles using this port, it is not as extensively tested as other targets
Troubleshooting
---------------
......
......@@ -273,7 +273,7 @@ e.g.
{
... initialize game ...
#ifdef __IPHONEOS__
#if __IPHONEOS__
// Initialize the Game Center for scoring and matchmaking
InitGameCenter();
......
No preview for this file type