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
  • SRB2-Stuff
  • SRB2_Discord
  • Sugoi-2
  • accel-momentum
  • any-resolution
  • appveyor
  • blend-locking
  • blentran
  • blua-unary-not-fix
  • boost-tickrate
  • bustablemobjzfix
  • bustablesoundz
  • cleanup-opengl
  • cleanupmusic
  • cmake-valgrind
  • crawlacommander-sprites
  • cutscene-cleanup
  • dd-music-bypass
  • dd-music-fix
  • delfile2
  • deprecate-lua-dedicated-server
  • dpl-2
  • dropshadows-spawning
  • dynabsp
  • emblem-drawing
  • exchndl-xp-fix
  • few-kart-lua-changes
  • ffloorclip
  • fix-cvar-conflicts
  • fix-opengl-shear-roll
  • flipfuncpointers
  • fof-lightlist-fixes
  • font-FUCK
  • font_drawer
  • frictionrefactor
  • fruits-clipper
  • fuck-macros-1
  • gamepad-luakeydown
  • gamepad-morefixes
  • gamepad_experiments
  • gametype-refactor
  • ghost-networking
  • gif-splitting
  • gitlab-ci
  • grr-lj
  • hitboxviewer
  • hwr-texture-cache-refactor
  • hwrender2
  • improve-439
  • improve-download-refuse-message
  • increase-packet-tics
  • input-display
  • input-display-translucency
  • io
  • joystick-juggling-maz
  • keycodes-only
  • kill-hud-feetoffset
  • ksf-wadfiles
  • ld413-mp-fix
  • levelstruct
  • libpng-version-support
  • linedef-actions
  • lj-test
  • lol-states
  • loopedsounds
  • lower-unpegged-fix
  • lua-change-gametype
  • lua-colorlib
  • lua-command-netids
  • lua-extracolormap
  • lua-local
  • lua-minmax-plus-bruh-moments
  • makefile-auto-mingw-gcc
  • makefile-tinkering
  • map-components-signedness-fixes
  • maretimers
  • master
  • menu-edits
  • mobj-dispoffset
  • more-cleanup
  • multithread
  • musicdef-lua
  • 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 10246 additions and 3478 deletions
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<title>Sonic Robo Blast II - Specials Reference Document</title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="blue" alink="blue">
<h1><big>SRB2 Specials Reference Document</big></h1>
<p><i>Last updated May 27, 2008</i></p>
<p><i>For v1.1 Private Beta</i></p>
<p>This is the SRB2 Specials Reference Document. It is designed to be the ultimate
reference for effects used in SRB2. As such, it is rather technical in areas and quite
concise, and is not something a beginner with level design should be dealing with.</p>
<h1><a name="things"></a>Thing Types</h1>
<p>In general, thing bitsets have 4 flags and 3 digits for their height. The bitset is
0xAAAB, where AAA is the object's height above ground, and B are the Easy, Normal, Hard,
and Deaf flags. To get the bitset on a normal object, multiply the height desired by 16,
and then add the existant B. Some objects use 32 as this number, and they will be noted.
Objects that multiply by 16 can be placed up to 4095 units in the air, while objects that
multiply by 32 can be placed up to 2047 units in the air.
<ul>
<li><u><big><big>Player Starts</big></big></u><ol>
<h3><a name="t1"></a>1 - Player 01 Start</h3>
<p>This is the start for the first player in single player mode, cooperative mode, or race
mode. This start must be placed on every map, as it is what the game defaults to if the
start it is attempting to find isn't there. If there is no Player 1 Start on the map, and
the game is confused over where to spawn the player, the game will crash outright.</p>
<p>The Deaf tag will make the player spawn from the ceiling, and the object needs to be
multiplied by 32 to give height, not 16.</p>
<h3><a name="t2"></a>2 - Player 02 Start</h3>
<p>This is the start for the second player in cooperative and race mode.</p>
<p>The Deaf tag will make the player spawn from the ceiling, and the object needs to be
multiplied by 32 to give height, not 16.</p>
<h3><a name="t3"></a>3 - Player 03 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t4"></a>4 - Player 04 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t5"></a>5 - Player 05 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t6"></a>6 - Player 06 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t7"></a>7 - Player 07 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t8"></a>8 - Player 08 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t9"></a>9 - Player 09 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t10"></a>10 - Player 10 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t11"></a>11 - Player 11 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t12"></a>12 - Player 12 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t13"></a>13 - Player 13 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t14"></a>14 - Player 14 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t15"></a>15 - Player 15 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t16"></a>16 - Player 16 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t17"></a>17 - Player 17 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t18"></a>18 - Player 18 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t19"></a>19 - Player 19 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t20"></a>20 - Player 20 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t21"></a>21 - Player 21 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t22"></a>22 - Player 22 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t23"></a>23 - Player 23 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t24"></a>24 - Player 24 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t25"></a>25 - Player 25 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t26"></a>26 - Player 26 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t27"></a>27 - Player 27 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t28"></a>28 - Player 28 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t29"></a>29 - Player 29 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t30"></a>30 - Player 30 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t31"></a>31 - Player 31 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t32"></a>32 - Player 32 Start</h3>
<p>See Thing <a href="#t2">2</a> for more information.</p>
<h3><a name="t33"></a>33 - Player Match Start</h3>
<p>This is the start for players in Match and Chaos modes. They should also be placed in
Capture the Flag maps as well. There should be 32 of these in a map to assure proper
randomization. While it's unelegant, they can be stacked on top of each other without
negative effect.</p>
<p>The Deaf tag will make the player spawn from the ceiling, and the object needs to be
multiplied by 32 to give height, not 16.</p>
<h3><a name="t34"></a>34 - CTF Team Start (Red)</h3>
<p>This is the start for players on the red team in Capture the Flag mode. There should be
32 of these in a map to assure proper randomization. While it's unelegant, they can be
stacked on top of each other without negative effect.</p>
<p>The Deaf tag will make the player spawn from the ceiling, and the object needs to be
multiplied by 32 to give height, not 16.</p>
<h3><a name="t35"></a>35 - CTF Team Start (Blue)</h3>
<p>This is the start for players on the blue team in Capture the Flag mode. There should
be 32 of these in a map to assure proper randomization. While it's unelegant, they can be
stacked on top of each other without negative effect.</p>
<p>The Deaf tag will make the player spawn from the ceiling, and the object needs to be
multiplied by 32 to give height, not 16.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Enemies</big></big></u><ol>
<h3><a name="t100"></a>100 - Crawla (Blue)</h3>
<p>These are the blue ground enemies found in the one player stages. They can't move off
of cliffs and are exceedingly slow.</p>
<h3><a name="t101"></a>101 - Crawla (Red)</h3>
<p>These are the red ground enemies found in the one player stages. They can't move off
cliffs and are relatively slow.</p>
<h3><a name="t102"></a>102 - Stupid Dumb Unnamed RoboFish (tm)</h3>
<p>This is the little fish in Greenflower Zone. The angle determines the jump height, with
0 being the old jump style. Note that the jump height is based on force, not units, so
experimentation will be necessary to get the correct height.</p>
<h3><a name="t103"></a>103 - Yellow Buzz</h3>
<p>This enemy flies at a moderate speed directly at the player.</p>
<h3><a name="t104"></a>104 - Red Buzz</h3>
<p>This enemy flies at a relatively high speed directly at the player.</p>
<h3><a name="t105"></a>105 - Jetty-Syn Bomber</h3>
<p>This is a highly mobile flying enemy with a bomb that it drops on the player from
directly above. It is considered highly difficult to kill, and should only be used in
situations where the stage is supposed to be difficult.</p>
<h3><a name="t106"></a>106 - Jetty-Syn Gunner</h3>
<p>This is a highly mobile flying enemy with a gun that it fires at the player with high
accuracy. It is considered highly difficult to kill, and should only be used in situations
where the stage is supposed to be difficult.</p>
<h3><a name="t107"></a>107 - Crawla Commander</h3>
<p>This is the grey floating enemy in the opening room of Techno Hill Zone Act 2. It is
quite fast and will start bouncing after taking the first hit. It is significantly
challenging, although a spindash will kill it given time.</p>
<h3><a name="t108"></a>108 - Deton</h3>
<p>This is the red spherical enemy in Techno Hill Zone Act 2. Upon seeing the player, it
makes a mad dash straight for them. With the exception of the <a href="#t404">Armageddon
Shield</a>, Detons are invincible, and must be avoided by running behind a wall or another
enemy.</p>
<h3><a name="t109"></a>109 - Skim</h3>
<p>This is an enemy that floats on the surface of the water, dropping bombs into the water
below. It is not currently used in any of the Single Player stages, but it is fully
operational. The designer does not have to put them on the surface of the water, they know
where it is.</p>
<h3><a name="t110"></a>110 - THZ Turret</h3>
<p>This is the turret from Techno Hill Zone Act 2. It fires large bursts of laser fire at
the player with high accuracy. It is invincible unless it is somehow dipped into water.</p>
<h3><a name="t111"></a>111 - Popup Turret</h3>
<p>This is a small turret that pops up now and then and shoots. The object's angle is a
value defining the delay between shooting.</p>
<h3><a name="t112"></a>112 - Sharp</h3>
<p>This is a blue enemy with spikes on top if it. It starts off by slowly chasing the player,
then it fades to red and runs after the player, and is invincible until it fades back to red.</p>
<h3><a name="t113"></a>113 – Jet Jaw</h3>
<p>This is an underwater enemy that tries to bite at the player, which can be found in
Deep Sea Zone.</p>
<h3><a name="t114"></a>114 – Snailer</h3>
<p>This is an incomplete enemy.</p>
<h3><a name="t115"></a>115 – Bird Aircraft Strike Hazard (B.A.S.H.)</h3>
<p>This is the red vulture-like enemy in Arid Canyon Zone. If it sees a player, it lifts off and
charges at him. Collision with a wall will send it plummeting.</p>
<h3><a name="t116"></a>116 – Pointy</h3>
<p>This is the orbinaut enemy that has spikes circling around it. None of the single player stages
currently use him. You have to place him in a map by using a WAD editor, he can't be placed using
objectplace.</p>
<h3><a name="t117"></a>117 – Robo-Hood</h3>
<p>This is the green enemy from Castle Eggman Zone, which shoots arrows at the player.</p>
<h3><a name="t118"></a>118 – CastleBot FaceStabber</h3>
<p>This is the large grey enemy from Castle Eggman Zone. It slowly trudges towards the player,
and if the player in range, lunges at them with his sword.</p>
<h3><a name="t119"></a>119 – Egg Guard</h3>
<p>This is the enemy from Castle Eggman Zone that wields a protective shield.</p>
<h3><a name="t120"></a>120 – Green Snapper</h3>
<p>This is the green turtle enemy from Arid Canyon Zone. This enemy behaves exactly like a blue
crawla does. The circumference of its shell is covered with spikes, so the only way to destroy it
is by jumping on top of it.</p>
<h3><a name="t121"></a>121 – Minus</h3>
<p>This is the digging enemy from Arid Canyon Zone. It burrows underground towards the player, and
once it's directly underneath, it bursts out from under the ground, jumping up and hurting the player.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Bosses and their associated items (if any)</big></big></u><ol>
<h3><a name="t200"></a>200 - Egg Mobile (Boss 1)</h3>
<p>The boss of Greenflower Zone and Castle Eggman Zone. He moves around firing at the
player, and after taking six hits, he dashes at the player.</p>
<p>Giving the boss the Deaf flag will make him have spikeballs, like CEZ3, and giving him
the Multi flag will make the level end when he is dead. To place him above ground,
multiply by 32 to give height, not 16.</p>
<h3><a name="t201"></a>201 - Egg Slimer (Boss 2)</h3>
<p>This is the boss of Techno Hill Zone. It requires an axis point at the center to
function, and it goes in a circle around the axis point dropping slime. After 6 hits, he
stops going in a circle, and bouncing at the player, spewing a lot more slime.</p>
<p>The Multi flag will make the level end when he is dead.</p>
<h3><a name="t201"></a>202 - Sea Egg (Boss 3)</h3>
<p>This is the boss of Deep Sea Zone. More information will be supplied later.</p>
<p>The Multi flag will make the level end when he is dead.</p>
<h3>203 - Eggscalibur (Boss 4)</h3>
<p>This is the boss of Castle Eggman Zone. More information will be supplied later.</p>
<p>The Multi flag will make the level end when he is dead.</p>
<h3><a name="t290"></a>290 - Boss Flypoint</h3>
<p>This is the location the boss will fly to after being killed.</p>
<h3><a name="t291"></a>291 - Egg Capsule Center</h3>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Collectibles</big></big></u><ol>
<h3><a name="t300"></a>300 - Ring</h3>
<p>This is a normal ring. Pick this up to get one ring.</p>
<p>Giving the deaf tag to a ring will cause it to float 31 units above the ground. This
does stack with bitsets, allowing rings to be a total of 4127 units above the ground at
maximum.</p>
<h3><a name="t301"></a>301 - Bounce Ring</h3>
<p>Picking this up gives you more ammo for this particular ring weapon. You cannot fire
the weapon, however, if you do not have the associated panel.
<h3><a name="t302"></a>302 - Rail Ring</h3>
<p>See thing <a href="#t301">#301</a>.</p>
<h3><a name="t304"></a>304 - Automatic Ring</h3>
<p>See thing <a href="#t301">#301</a>.</p>
<h3><a name="t305"></a>305 - Explosion Ring</h3>
<p>See thing <a href="#t301">#301</a>.</p>
<h3><a name="t305"></a>306 - Scatter Ring</h3>
<p>See thing <a href="#t301">#301</a>.</p>
<h3><a name="t305"></a>307 - Grenade Ring</h3>
<p>See thing <a href="#t301">#301</a>.</p>
<h3>310 - CTF Flag (Red)</h3>
<p>This is the red team's flag in capture the flag mode. If the blue team takes this to
their team base (sector type <a href="#s16384">16384</a>), they score a point.</p>
<h3><a name="t307"></a>311 - CTF Flag (Blue)</h3>
<p>This is the blue team's flag in capture the flag mode. If the red team takes this to
their team base (sector type <a href="#s12288">12288</a>), they score a point.</p>
<h3><a name="t308"></a>312 - Special Stage Token</h3>
<p>This token gives the player a chance at the special stage after the current stage has
ended. If more than one token is collected, the player gets that many chances at the
special stages, continuing until they run out of tokens or have all the emeralds.</p>
<h3><a name="t309"></a>313 - Emerald 1 (Green)</h3>
<p>This object gives the player the first emerald as a pickup object, instead of by
completing a special stage.</p>
<h3><a name="t310"></a>314 - Emerald 2 (Orange)</h3>
<p>This object gives the player the second emerald as a pickup object, instead of by
completing a special stage.</p>
<h3><a name="t311"></a>315 - Emerald 3 (Pink)</h3>
<p>This object gives the player the third emerald as a pickup object, instead of by
completing a special stage.</p>
<h3><a name="t312"></a>316 - Emerald 4 (Blue)</h3>
<p>This object gives the player the fourth emerald as a pickup object, instead of by
completing a special stage.</p>
<h3><a name="t313"></a>317 - Emerald 5 (Red)</h3>
<p>This object gives the player the fifth emerald as a pickup object, instead of by
completing a special stage.</p>
<h3><a name="t314"></a>318 - Emerald 6 (Light Blue)</h3>
<p>This object gives the player the sixth emerald as a pickup object, instead of by
completing a special stage.</p>
<h3><a name="t315"></a>319 - Emerald 7 (Grey)</h3>
<p>This object gives the player the seventh emerald as a pickup object, instead of by
completing a special stage.</p>
<h3><a name="t316"></a>320 - Emerald Hunt Location</h3>
<p>This is one of the three emeralds to be used in Hunting mode.</p>
<h3>323 - Emerald Spawn</h3>
<p>Spawn location for emeralds in Match mode.</p>
<h3><a name="t330"></a>330 - Bounce Ring Panel</h3>
<p>This is a match weapon panel. The Bounce Ring throws a slow ring that will bounce when
it hits walls.</p>
<p>Giving the deaf tag to a panel will cause it to float 31 units above the ground. This
does stack with bitsets, allowing panels to be a total of 4127 units above the ground at
maximum.</p>
<h3><a name="t331"></a>331 - Rail Ring Panel</h3>
<p>This is a match weapon panel. The Rail Ring gives the player an instantaneous shot, that
strikes its target the instant its fired, however there is a long downtime between shots.
Being shot by a rail ring causes more kickback than normal.</p>
<p>Giving the deaf tag to a panel will cause it to float 31 units above the ground. This
does stack with bitsets, allowing panels to be a total of 4127 units above the ground at
maximum.</p>
<h3><a name="t332"></a>332 - Automatic Ring Panel</h3>
<p>This is a match weapon panel. The Automatic Ring gives the player a fire rate of 17.5
rings per second.</p>
<p>Giving the deaf tag to a panel will cause it to float 31 units above the ground. This
does stack with bitsets, allowing panels to be a total of 4127 units above the ground at
maximum.</p>
<h3><a name="t333"></a>333 - Explosion Ring Panel</h3>
<p>This is a match weapon panel. The Explosion Ring throws a slow ring that explodes into
many fragments upon striking a wall or another player. Being struck directly by the
Explosion Ring causes more kickback than usual.</p>
<p>Giving the deaf tag to a panel will cause it to float 31 units above the ground. This
does stack with bitsets, allowing panels to be a total of 4127 units above the ground at
maximum.</p>
<h3><a name="t334"></a>334 - Scatter Ring Panel</h3>
<p>This is a match weapon panel. The Scatter Ring throws 5 rings in a plus-shape.</p>
<p>Giving the deaf tag to a panel will cause it to float 31 units above the ground. This
does stack with bitsets, allowing panels to be a total of 4127 units above the ground at
maximum.</p>
<h3><a name="t335"></a>335 - Grenade Ring Panel</h3>
<p>This is a match weapon panel. The Grenade Ring throws a grenade that will explode
if an opposing player gets too close to it. It will also explode automatically after a
while if left untouched.</p>
<p>Giving the deaf tag to a panel will cause it to float 31 units above the ground. This
does stack with bitsets, allowing panels to be a total of 4127 units above the ground at
maximum.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Boxes</big></big></u><ol>
<h3><a name="t400"></a>400 - Super Ring (10 Rings)</h3>
<p>This monitor gives the player ten rings.</p>
<p>If monitors are given the Deaf tag, they will respawn as a random monitor type (not a ?
monitor) from the weighted table in modes that support respawn. Elsewise, they will
respawn as the same monitor.</p>
<h3><a name="t402"></a>402 - Attraction Shield</h3>
<p>Also known as the yellow shield and god shield, this shield protects the player from a
single hit, then disappears. It also attracts all normal rings, spilled or on the map to
the player with the shield. It also protects the player from electric damage.</p>
<p>If monitors are given the Deaf tag, they will respawn as a random monitor type (not a ?
monitor) from the weighted table in modes that support respawn. Elsewise, they will
respawn as the same monitor.</p>
<h3><a name="t403"></a>403 - Force Shield</h3>
<p>Also known as the blue shield, this shield protects the player from two hits, then
disappears. If the spin&nbsp; button is pressed while jumping, it is also possible to
reflect many projectiles.</p>
<p>If monitors are given the Deaf tag, they will respawn as a random monitor type (not a ?
monitor) from the weighted table in modes that support respawn. Elsewise, they will
respawn as the same monitor.</p>
<h3><a name="t404"></a>404 - Armageddon Shield</h3>
<p>Also known as the black shield, this shield protects the player from a single hit,
triggering upon a hit. The shield can also be triggered by jumping, and then hitting the
spin key in midair. When the shield is triggered, a flash of light damages everything
within a large radius, destroying the shield in the process.</p>
<p>If monitors are given the Deaf tag, they will respawn as a random monitor type (not a ?
monitor) from the weighted table in modes that support respawn. Elsewise, they will
respawn as the same monitor.</p>
<h3><a name="t405"></a>405 - Whirlwind Shield</h3>
<p>This shield protects the player from a single hit, then disappears. If the player does
a jump-spin, they will do a second jump in midair, making the maximum height that the
player can jump with the shield 224.</p>
<p>Versions of SRB2 previous to 1.09 had the Basic Shield in this object number, so make
sure to note that if the player loads the map in an older version, that is what they will
see.</p>
<p>If monitors are given the Deaf tag, they will respawn as a random monitor type (not a ?
monitor) from the weighted table in modes that support respawn. Elsewise, they will
respawn as the same monitor.</p>
<h3><a name="t406"></a>406 - Elemental Shield</h3>
<p>Also known as the green&nbsp; shield, this shield protects the player from a single
hit, then disappears. While this shield is active, the player cannot drown. It also
protects the player from water, fire, and other damage. When the player with this shield
spin-dashes, it leaves a trail of fire, which deals fire damage to any enemy that touches
it.</p>
<p>If monitors are given the Deaf tag, they will respawn as a random monitor type (not a ?
monitor) from the weighted table in modes that support respawn. Elsewise, they will
respawn as the same monitor.</p>
<h3><a name="t407"></a>407 - Super Sneakers</h3>
<p>This is a monitor powerup that gives the player about 2x running speed for 20 seconds.</p>
<h3><a name="t408"></a>408 - Invincibility</h3>
<p>This is a monitor powerup that prevents all damage to the player for 20 seconds.</p>
<h3><a name="t409"></a>409 - Extra Life</h3>
<p>This powerup monitor features the player's face, and provides an extra life when
struck.</p>
<p>If monitors are given the Deaf tag, they will respawn as a random monitor type (not a ?
monitor) from the weighted table in modes that support respawn. Elsewise, they will
respawn as the same monitor.</p>
<h3><a name="t410"></a>410 - Eggman</h3>
<p>This monitor damages the player if they strike it.</p>
<p>If monitors are given the Deaf tag, they will respawn as a random monitor type (not a ?
monitor) from the weighted table in modes that support respawn. Elsewise, they will
respawn as the same monitor.</p>
<h3><a name="t411"></a>411 - Teleporter</h3>
<p>This monitor mixes up all locations of players, teleporting them to the location of a
random other player. It has no effect in Single Player or in multiplayer modes while only
one player is in the game.</p>
<p>If monitors are given the Deaf tag, they will respawn as a random monitor type (not a ?
monitor) from the weighted table in modes that support respawn. Elsewise, they will
respawn as the same monitor.</p>
<h3><a name="t412"></a>412 - Random Box</h3>
<p>Destroy this monitor and you will get a random powerup, like the boxes in Sonic 2 race
mode.</p>
<h3><a name="t412"></a>413 - Gravity Boots Box</h3>
<p>Destroy this monitor and the gravity will be flipped for a short time.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Interactive Objects (friendly or otherwise)</big></big></u><ol>
<h3><a name="t500"></a>500 - Air Bubble Patch</h3>
<p>This is the air bubble patch used underwater to give players air. It spawns big bubbles
randomly which replenish the player's air.</p>
<h3><a name="t501"></a>501 - End Level Sign</h3>
<p>This is the sign at the end of the stage. When the player enters the <a href="#s8192">Exit
Sector</a>, this sign will start to spin, and end on the face of the player. This sign
does not make the stage end, it's just a visual effect for it.</p>
<h3><a name="t502"></a>502 - Star Post</h3>
<p>Star Posts allow the player to respawn after dying at a point other than the beginning
of the stage. There can be up to 32 Star Posts in a map, and they work with the bitsets.</p>
<p>Instead of controlling the difficulty and deaf flags, the final digit of the bitset
determines the number of the Star Post. 0x0000 is the first one and 0x000f is the
sixteenth one. Note that since this overwrites all of the difficulty flags, they will
appear in all difficulties, even though 0x0000 would normally mean it wouldn't appear in
any difficulty level.</p>
<h3><a name="t520"></a>520 - Spikeball</h3>
<p>Just like thing <a href="#t521">521</a>, except they do normal damage to the player on
contact. </p>
<h3><a name="t521"></a>521 - Spikeball (Special Stage)</h3>
<p>These are the spikeballs used in the special stages. They harm the player for damage on
contact, but only if they are carrying rings.</p>
<h3><a name="t522"></a>522 - Ceiling Spike</h3>
<p>This is a downward pointing spike for use on the ceiling. Touching the pointy end of
the spike deals damage to the player.</p>
<p>By default, it attaches itself to the ceiling, and the height part of the bitset
measures how far down from the ceiling, instead of up from the floor.</p>
<h3><a name="t523"></a>523 - Floor Spike</h3>
<p>This is a upward pointing spike for use on the floor. Touching the pointy end of the
spike deals damage to the player.</p>
<h3><a name="t524"></a>524 - Big Floating Mine</h3>
<p>When you get close, this mine will start to follow you. Touches you, and it explodes.</p>
<h3><a name="t540"></a>540 - THZ Fan</h3>
<p>This is the fan used inside the secret passage in Techno Hill Zone Act 1. It pushes the
player slowly up until it reaches the maximum height it can. The maximum height is
determined by the angle, measured in normal fracunits (It can go above 360 just fine).</p>
<h3><a name="t541"></a>541 - THZ Gas Jet</h3>
<p>This is the gas jet used at the end of Techno Hill Zone Act 1. It launches the player
straight up on regular intervals about the same height as a yellow spring pointing up.</p>
<h3><a name="t550"></a>550 - Yellow Spring (Up)</h3>
<p>This is a yellow spring pointing straight up. It has a medium amount of force behind
it.</p>
<h3><a name="t551"></a>551 - Red Spring (Up)</h3>
<p>This is a red spring pointing straight up. It has a large amount of force behind it.</p>
<h3><a name="t552"></a>552 - Blue Spring</h3>
<p>This is a blue spring pointing straight up. It has a small amount of force behind it.
The intent is for this spring to be used underwater. It has about the same effect
underwater as a yellow spring does above water.</p>
<h3><a name="t553"></a>553 - Yellow Spring (Down)</h3>
<p>This is a yellow spring pointing straight down. It has a medium amount of force behind
it.</p>
<h3><a name="t554"></a>554 - Red Spring (Down)</h3>
<p>This is a red spring pointing straight down. It has a large amount of force behind it.</p>
<h3><a name="t555"></a>555 - Yellow Spring (Diagonal Up)</h3>
<p>This is a yellow spring pointing upwards and in the direction the thing is facing. It
has a medium amount of force behind it. When the player touches this spring, he will
automatically turn to face the direction the spring is launching the player.</p>
<h3><a name="t556"></a>556 - Red Spring (Diagonal Up)</h3>
<p>This is a red spring pointing upwards and in the direction the thing is facing. It has
a large amount of force behind it. When the player touches this spring, he will
automatically turn to face the direction the spring is launching the player.</p>
<h3><a name="t557"></a>557 - Yellow Spring (Diagonal Down)</h3>
<p>This is a yellow spring pointing downwards and in the direction the thing is facing. It
has a medium amount of force behind it. When the player touches this spring, he will
automatically turn to face the direction the spring is launching the player.</p>
<h3><a name="t558"></a>558 - Red Spring (Diagonal Down)</h3>
<p>This is a red spring pointing downward and in the direction the thing is facing. It has
a large amount of force behind it. When the player touches this spring, he will
automatically turn to face the direction the spring is launching the player.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Special placement patterns</big></big></u><ol>
<h3><a name="t600"></a>600 - 5 Vertical Rings (Yellow Spring)</h3>
<p>This is a chain of five rings intended to be used with thing <a href="#t550">550</a>.
Do not use ring chain objects in any mode where items respawn, because ring chains do not
respawn. Use bitsets to create chains in any mode with item respawn.</p>
<h3><a name="t601"></a>601 - 5 Vertical Rings (Red Spring)</h3>
<p>This is a chain of five rings intended to be used with thing <a href="#t551">551</a>.
Do not use ring chain objects in any mode where items respawn, because ring chains do not
respawn. Use bitsets to create chains in any mode with item respawn.</p>
<h3><a name="t602"></a>602 - 5 Diagonal Rings (Yellow Spring)</h3>
<p>This is a chain of five rings intended to be used with thing <a href="#t555">555</a>.
Do not use ring chain objects in any mode where items respawn, because ring chains do not
respawn. Use bitsets to create chains in any mode with item respawn.</p>
<h3><a name="t603"></a>603 - 10 Diagonal Rings (Red Spring)</h3>
<p>This is a chain of ten rings intended to be used with thing <a href="#t556">556</a>. Do
not use ring chain objects in any mode where items respawn, because ring chains do not
respawn. Use bitsets to create chains in any mode with item respawn.</p>
<h3><a name="t604"></a>604 - Nights: Circle of Rings</h3>
<h3><a name="t605"></a>605 - Nights: Circle of Rings (Big)</h3>
<h3><a name="t606"></a>606 - Nights: Circle of Wing Logos</h3>
<h3><a name="t607"></a>607 - Nights: Circle of Wing Logos (Big)</h3>
<h3><a name="t608"></a>608 - Nights: Circle of Rings and Wings</h3>
<h3><a name="t609"></a>609 - Nights: Circle of Rings and Wings (Big)</h3>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Powerup indicators/environmental effects/miscellany</big></big></u><ol>
<h3><a name="t700"></a>700 - Ambient Water SFX 1A (Small)</h3>
<h3><a name="t701"></a>701 - Ambient Water SFX 1B (Small)</h3>
<h3><a name="t702"></a>702 - Ambient Water SFX 2A (Medium)</h3>
<h3><a name="t703"></a>703 - Ambient Water SFX 2B (Medium)</h3>
<h3><a name="t704"></a>704 - Ambient Water SFX 3A (Large)</h3>
<h3><a name="t705"></a>705 - Ambient Water SFX 3B (Large)</h3>
<h3><a name="t706"></a>706 - Ambient Water SFX 4A (Extra Large)</h3>
<h3><a name="t707"></a>707 - Ambient Water SFX 4B (Extra Large)</h3>
<h3><a name="t708"></a>708 - Random Ambience 1</h3>
<h3><a name="t709"></a>709 - Random Ambience 2</h3>
<h3><a name="t750"></a>750 - Chaos Mode Enemy Spawn</h3>
<p>This is where the enemies spawn from in Chaos mode. There should be around 12 of these
points on a map with Chaos support.</p>
<h3><a name="t751"></a>751 - Teleport Destination</h3>
<p>This is the thing to be used with linedef type <a href="#l412">412</a>, the linedef
executor that teleports a player. This thing is where the player will spawn in the tagged
sector.</p>
<h3><a name="t752"></a>752 - Alternate View Point</h3>
<p>This is the thing to be used with linedef type <a href="#l422">422</a>, the linedef
executor that changes the camera view. This thing is where the camera will be moved to in
the tagged sector.</p>
<h3><a name="t753"></a>753 - Zoom Tube Waypoint</h3>
<p>Waypoints for zoom tubes. Think of Sonic 2's Metropolis Zone, Sonic 3 &amp; Knuckles's
Death Egg Zone, and Lava Reef Zone. The lower byte of the ANGLE field specifies the
waypoint's number in the sequence, and the upper byte specifies the sequence that the
waypoint belongs to. These are used in conjunction with sector type <a href="#s32768">32768</a>
and <a href="#s36864">36864</a>.</p>
<h3><a name="t754"></a>754 - Push</h3>
<h3><a name="t755"></a>755 - Pull</h3>
<h3><a name="t756"></a>756 - Street Light Source</h3>
<p>This produces a light in OpenGL. It is used in Starlit Warehouse Zone, one of the match
stages, as the street lights.</p>
<h3><a name="t760"></a>760 - PolyObject Anchor</h3>
<p>This is the first of the two points used to set up 'how much to move' a polyobject by
when creating it. Angle is the PolyObject ID#.</p>
<h3><a name="t761"></a>761 - PolyObject SpawnPoint</h3>
<p>This is the second of the two points used to set up 'how much to move' a polyobject by
when creating it. Angle is the PolyObject ID#.</p>
<h3><a name="t762"></a>762 - PolyObject SpawnPoint Crush</h3>
<p>This is the second of the two points used to set up 'how much to move' a polyobject by
when creating it. Angle is the PolyObject ID#. This item tells the PolyObject that it
should hurt the player.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Greenflower Scenery</big></big></u><ol>
<h3><a name="t800"></a>800 - GFZ Flower (Normal)</h3>
<p>This is a scenery object from Greenflower Zone. It is the orange flower seen all
throughout GFZ and most GFZ-themed custom maps.</p>
<h3><a name="t801"></a>801 - GFZ Sunflower</h3>
<p>This is a scenery object from Greenflower Zone. It is the large blue sunflower seen all
throughout GFZ and most GFZ-themed custom maps.</p>
<h3><a name="t802"></a>802 - GFZ Budding Flower</h3>
<p>This is a scenery object from Greenflower Zone. It is the small purple flower seen all
throughout GFZ and most GFZ-themed custom maps.</p>
<h3><a name="t804"></a>804 - Berry Bush</h3>
<p>This is a scenery object from Greenflower Zone. It is the green bush with red berries
seen all throughout GFZ and most GFZ-themed custom maps.</p>
<h3><a name="t805"></a>805 - Bush</h3>
<p>This is a scenery object from Greenflower Zone. It is the green bush without the
berries seen all throughout GFZ and most GFZ-themed custom maps.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Techno Hill Scenery</big></big></u><ol>
<h3><a name="t900"></a>900 - THZ Flower</h3>
<p>This is a scenery object from Techno Hill Zone Act 1. It is the metallic white flower.</p>
<h3><a name="t901"></a>901 - THZ Alarm</h3>
<p>This is a scenery object from Techno Hill Zone Act 2. It is the little alarm in the
passage with the first Star Post. It creates noise, but the red visual effect in THZ2 was
done with a colormap, not this object.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Deep Sea Scenery</big></big></u><ol>
<h3><a name="t1000"></a>1000 - Gargoyle</h3>
<p>Pushable gargoyle. Can be stood on top of as well.</p>
<p>Giving this the Deaf tag will prevent it from being pushable.</p>
<h3><a name="t1001"></a>1001 - Seaweed</h3>
<p>Animated seaweed. Intangible scenery.</p>
<h3><a name="t1002"></a>1002 - Dripping Water</h3>
<p>Water dripping from the ceiling. ANGLE value specifies start delay.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Castle Eggman Scenery</big></big></u><ol>
<h3><a name="t1100"></a>1100 - Hanging Chain</h3>
<p>This is a scenery object from Castle Eggman, a dungeon chain hanging from the ceiling.</p>
<p>By default, it attaches itself to the ceiling, and the height part of the bitset
measures how far down from the ceiling, instead of up from the floor.</p>
<h3><a name="t1101"></a>1101 - CEZ Torch</h3>
<p>This is the torch used in Castle Eggman Zone. It produces light in OpenGL, and it harms
the player for fire damage on contact.</p>
<h3><a name="t1102"></a>1102 - Eggman Statue </h3>
<p>This is the large Eggman statue in Castle Eggman Zone.</p>
<h3><a name="t1103"></a>1103 - CEZ Flower</h3>
<p>This is a scenery object from Castle Eggman Zone. It is the decaying flower.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Arid Canyon Scenery</big></big></u><ol>
<h3><a name="t1200"></a>1200 – Big Tumbleweed</h3>
<p>A large moveable tumbleweed that rolls along the floor.</p>
<h3><a name="t1201"></a>1201 – Little Tumbleweed</h3>
<p>A small movable tumbleweed that rolls along the floor.</p>
<h3><a name="t1202"></a>1202 – Rock Spawner</h3>
<p>An object which randomly spawns falling rocks, which damage the player on impact.<br>
Description on how to use goes here.</p>
</ol>
</li>
<li><u><big><big>Red Volcano Scenery</big></big></u><ol>
<h3><a name="t1300"></a>1300 – Horizontal Flame Jet</h3>
<p>A stready stream of flames comes out horizontally.</p>
<h3><a name="t1301"></a>1301 – Vertial Flame Jet</h3>
<p>A stready stream of flames comes out vertially.</p>
</ol>
</li>
<li><u><big><big>Dark City Scenery</big></big></u><ol>
</ol>
</li>
<li><u><big><big>Doom Ship Scenery</big></big></u><ol>
</ol>
</li>
<li><u><big><big>Egg Rock / Final Fight Scenery</big></big></u><ol>
</ol>
</li>
<li><u><big><big>NiGHTS Items</big></big></u><ol>
<h3><a name="t1700"></a>1700 - Nights: Axis</h3>
<p>Lower 10 bits: Axis number in the mare (0-based) Upper 6 bits: Mare that axis belongs
to (0-based). ANGLE value determines the size of the axis to rotate around. If 16384 is
added to the ANGLE value, the axis will be inverted.</p>
<h3><a name="t1701"></a>1701 - Nights: Axis Transfer (Normal)</h3>
<h3><a name="t1702"></a>1702 - Nights: Axis Transfer Line</h3>
<h3><a name="t1703"></a>1703 - Nights: Ideya Drone</h3>
<p>Angle value sets the NiGHTS timer, in seconds. </p>
<h3><a name="t1704"></a>1704 - Nights: Bumper</h3>
<p>Lower 4 bits of the flags specify the angle of the bumper in 30 degree increments.</p>
<h3><a name="t1705"></a>1705 - Nights: Hoop</h3>
<h3><a name="t1706"></a>1706 - Nights: Wing Logo</h3>
<h3><a name="t1707"></a>1707 - Nights: Super Loop</h3>
<h3><a name="t1708"></a>1708 - Nights: Drill Refill</h3>
<h3><a name="t1709"></a>1709 - Nights: Helper</h3>
<h3><a name="t1710"></a>1710 - Nights: Egg Capsule</h3>
<p>The capsule you need to collect rings to break in NiGHTS. The value of its ANGLE field
determines how many rings you need to break it. Just like the axis points, the upper bits
(value &gt;&gt; 10) determine the mare it belongs to. For example, an angle value of 1024
means it belongs to mare 1 (2nd mare, it's zero based), and requires 0 rings to break.
1030 would be mare 1, and 6 rings to break. 2048 would be mare 2, no rings.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Mario Items</big></big></u><ol>
<h3><a name="t1800"></a>1800 - Coin</h3>
<p>This is a coin, which is essentially a ring with Mario graphics and sound effects.</p>
<h3><a name="t1801"></a>1801 - Overworld Goomba</h3>
<p>These are the enemies in Mario Koopa Blast 1, and are essentially Crawlas with a Mario
graphic.</p>
<h3><a name="t1802"></a>1802 - Underworld Goomba</h3>
<p>These are the enemies in Mario Koopa Blast 2, and are essentially Crawlas with a Mario
graphic.</p>
<h3><a name="t1803"></a>1803 - Fire Flower</h3>
<p>This is the powerup from the Mario Koopa Blast stages. It changes the player to a white
palette, and allows the player to throw fireballs with the fire button. The fireballs fly
in a Mario-style bounce trajectory until they hit an enemy or a wall.</p>
<h3><a name="t1804"></a>1804 - Koopa Shell</h3>
<p>This is the Koopa Shell in Mario Koopa Blast 1. It will bounce around, striking enemies
and players.</p>
<h3><a name="t1805"></a>1805 - Puma (Mario Jumping Fireball)</h3>
<p>This is the fireball used in Mario Koopa Blast 3. The angle determines the jump height,
with 0 being the old jump style. Note that the jump height is based on force, not units,
so experimentation will be necessary to get the correct height.</p>
<h3><a name="t1806"></a>1806 - King Bowser</h3>
<h3><a name="t1807"></a>1807 - Axe</h3>
<p>The axe used to defeat Bowser in the third Mario level.</p>
<h3><a name="t1808"></a>1808 - Bush (Short)</h3>
<p>This is a scenery object from Mario Koopa Blast</p>
<h3><a name="t1809"></a>1809 - Bush (Tall)</h3>
<p>This is a scenery object from Mario Koopa Blast</p>
<h3><a name="t1810"></a>1810 - Toad</h3>
<p>This is Toad at the end of Mario Koopa Blast 3.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Xmas Items</big></big></u><ol>
<h3><a name="t1850"></a>1850 - Xmas Pole</h3>
<p>X-Mas scenery object. Looks like a little barber shop pole.</p>
<h3><a name="t1851"></a>1851 - Candy Cane</h3>
<p>X-Mas scenery object. Looks like a candy cane.</p>
<p>Note that Mystic Realm 4 replaces this object with the Sonic 1 palm tree, so any maps
loaded while Mystic Realm 4 is loaded will overwrite the image, making any candy canes
look like palm trees, which can look kinda stupid.</p>
<h3><a name="t1852"></a>1852 - Snowman</h3>
<p>X-Mas scenery object. Pushable snowman with a happy face. Can be stood on top of as
well. Acts the same as thing <a href="#t1000">1000</a>.</p>
<p>Giving this the Deaf tag will prevent it from being pushable.</p>
<p>&nbsp;</p>
</ol>
</li>
<h1><a name="linetypes"></a>Linedef Types</h1>
<p>Lines may have flags applied to them. The following is a reference of their values.
Unless specified otherwise in a line type, the flags behave as follows:</p>
<div align="left"><table border="1" width="83%">
<tr>
<td width="33%">NAME</td>
<td width="10%">VALUE</td>
<td width="57%">DESCRIPTION</td>
</tr>
<tr>
<td width="33%"><a name="#EFFECT6"></a>EFFECT6</td>
<td width="10%">1</td>
<td width="57%">Special use flag #6.</td>
</tr>
<tr>
<td width="33%"><a name="#BLOCKMONSTERS"></a>BLOCKMONSTERS</td>
<td width="10%">2</td>
<td width="57%">Prevents an enemy from crossing the line. May not work for especially
speedy enemies.</td>
</tr>
<tr>
<td width="33%"><a name="#TWOSIDED"></a>TWOSIDED</td>
<td width="10%">4</td>
<td width="57%">Flag used to indicate if a line is two sided. Do not modify.</td>
</tr>
<tr>
<td width="33%"><a name="#DONTPEGTOP"></a>DONTPEGTOP</td>
<td width="10%">8</td>
<td width="57%">Unpeg upper texture. Good for moving floors.</td>
</tr>
<tr>
<td width="33%"><a name="#DONTPEGBOTTOM"></a>DONTPEGBOTTOM</td>
<td width="10%">16</td>
<td width="57%">Unpeg bottom texture. Good for moving ceilings.</td>
</tr>
<tr>
<td width="33%"><a name="#EFFECT1"></a>EFFECT1</td>
<td width="10%">32</td>
<td width="57%">Special use flag #1.</td>
</tr>
<tr>
<td width="33%"><a name="#NOCLIMB"></a>NOCLIMB</td>
<td width="10%">64</td>
<td width="57%">Don't allow Knuckles to climb on this wall.</td>
</tr>
<tr>
<td width="33%"><a name="#EFFECT2"></a>EFFECT2</td>
<td width="10%">128</td>
<td width="57%">Special use flag #2.</td>
</tr>
<tr>
<td width="33%"><a name="#EFFECT3"></a>EFFECT3</td>
<td width="10%">256</td>
<td width="57%">Special use flag #3.</td>
</tr>
<tr>
<td width="33%"><a name="#EFFECT4"></a>EFFECT4</td>
<td width="10%">512</td>
<td width="57%">Special use flag #4.</td>
</tr>
<tr>
<td width="33%"><a name="#EFFECT5"></a>EFFECT5</td>
<td width="10%">1024</td>
<td width="57%">Special use flag #5.</td>
</tr>
<tr>
<td width="33%"><a name="#NOSONIC"></a>NOSONIC</td>
<td width="10%">2048</td>
<td width="57%">Disable line special if playing as Sonic (Single Player Only).</td>
</tr>
<tr>
<td width="33%"><a name="#NOTAILS"></a>NOTAILS</td>
<td width="10%">4096</td>
<td width="57%">Disable line special if playing as Tails (Single Player Only).</td>
</tr>
<tr>
<td width="33%"><a name="#NOKNUX"></a>NOKNUX</td>
<td width="10%">8192</td>
<td width="57%">Disable line special if playing as Knuckles (Single Player Only).</td>
</tr>
<tr>
<td width="33%"><a name="#BOUNCY"></a>BOUNCY</td>
<td width="10%">16384</td>
<td width="57%">Bounce the player off this line.</td>
</tr>
<tr>
<td width="33%"><a name="#TFERLINE"></a>TFERLINE</td>
<td width="10%">32768</td>
<td width="57%">Use this on a FOF line special to define the texture &amp; offsets for
each side of the FOF. The control sector must have at LEAST the same # of sides as the
target sector(s).</td>
</tr>
</table>
</div><hr>
<li><u><big><big>Level Parameters / Miscellany</big></big></u><ol>
<h3><a name="l1"></a>1 - Per-Sector Gravity</h3>
<p>Sets the gravity of the tagged sector or sectors, as a percentage of global gravity
(which can be set separately using sector type <a href="#s176">176</a>). The floor height
of the control sector is used. If it is 1000, then the target sector will have 100%
gravity. If it is 500, the target sector will have 50% of the global gravity. Negative
values work as well, but players can't jump down; they'll get stuck to the ceiling, unless
the <a href="#NOCLIMB">NOCLIMB</a> flag is checked.</p>
<p>You can apply this special to the control sector of an intangible FOF to change the
gravity only inside that FOF.</p>
<h3><a name="l2"></a>2 - Custom Exit</h3>
<p>Tag this to an Exit Sector (type <a href="#s8192">8192</a>) to exit to a custom level,
overriding the one set in the map header. The map number you go to is indicated by the
front sector's floor. Additionally, if the control linedef's bitset is set to disallow
climbing (with the <a href="#NOCLIMB">NOCLIMB</a> attribute, whose value is 64), skip the
score tally screen when switching to the new map.</p>
<p>If the control linedef has the <a href="#BLOCKMONSTERS">BLOCKMONSTERS</a> flag set,
this effect does something super complicated and fun, going to a different level depending
on whether the player has all emeralds or not. If the player has seven emeralds, the
linedef's front sector's ceiling height will be used. Otherwise, go to the map number
indicated by the linedef's front sector's floor. That's <i>only</i> if you set the <a
href="#BLOCKMONSTERS">BLOCKMONSTERS</a> flag.</p>
<p>If the <a href="#EFFECT4">EFFECT4</a> flag is set, the linedef's front side x offset
will be used as the new gametype after the map change, providing it is in range (from 0 to
4, inclusive).</p>
<h3><a name="l3"></a>3 - Zoom Tube Parameters</h3>
<p>X length = speed. Y length = waypoint sequence #. See sector type <a href="#s32768">32768</a>
for more information.</p>
<h3><a name="l4"></a>4 - Speed Pad</h3>
<p>Creates a speed pad. The linedef direction and indicates the direction of the pad. The
target sector must have type <a href="#s1280">1280</a> or <a href="#s1536">1536</a> for
this to work.</p>
<p>If the <a href="#EFFECT4">EFFECT4</a> flag is set, you will not be teleported to the
center of the sector when the speed pad is activated.</p>
<h3><a name="l5"></a>5 - Camera Scanner</h3>
<p>Modifies camera position while the player is in the target sector. The floor and
ceiling of the control sector and the angle of the control linedef are the values for
CAM_HEIGHT, CAM_DIST, and CAM_ROTATE, respectively. Camera position is reset when the
player steps outside the sector.</p>
<h3><a name="l6"></a>6 - Disable Linedef</h3>
<p>Disables any linedef specials that share the same tag. Will be used in the future to
check if a particular level has been previously cleared or not.</p>
<h3><a name="l7"></a>7 - Flat Alignment</h3>
<p>Aligns floor and/or ceiling flats. The x alignment is specified by the control
linedef's x distance (the difference between the x values of its two vertices), and the y
alignment is specified by the control linedef's y distance.</p>
<p>By default, works on both the floor and ceiling (however, note that skies cannot be
&quot;aligned&quot; ;). Adding the <a href="#NOCLIMB">NOCLIMB</a> flag to the linedef will
align the floor only, while the <a href="#BLOCKMONSTERS">BLOCKMONSTERS</a> flag will make
it align the ceiling only.</p>
<h3><a name="l8"></a>8 - Sector Special Parameters</h3>
<p>Sets special behavior of a sector's type depending on the flag(s) checked:</p>
<p><a href="#NOCLIMB">NOCLIMB</a> - Special only operates when touching ceiling</p>
<p><a href="#EFFECT4">EFFECT4</a> - Special operates when touching either the floor or the
ceiling</p>
<p><a href="#EFFECT3">EFFECT3</a> - Special operates by just touching the sector, rather
than having to be inside of it.</p>
<h3><a name="l9"></a>9 - Chain Parameters</h3>
<p>Sets special behavior of a moving chain as such:</p>
<p>x length - # of links on the chain</p>
<p>y length - Overall speed (0-15)</p>
<p>X offset - Rotation speed on the X axis (0-15)</p>
<p>Y offset - Rotation speed on the Z axis (0-15)</p>
<p>floorheight - angle to start at (0-15)</p>
<p>ceilingheight - maximum rotation speed</p>
<h3><a name="l10"></a>10 - Culling Plane</h3>
<p>Set like <a href="#l1">line 1</a>, this creates an invisible plane in the sector. If
your view is above this plane, lots of things drawn below the height of this plane will be
discarded, and if your view is below the plane, a lot of things drawn above the height of
the plane will be discarded. This is to tell the game to not draw stuff that you aren't
going to see anyway. Do note that the view doesn't have to be in the current sector, you
can also be viewing from the side, which may be undesirable. To prevent this problem, you
can check the <a href="#NOCLIMB">NOCLIMB</a> flag, which will allow you to 'group' a set
of sectors to one control sector in which the culling will only take effect. For example,
you have a control sector set up for culling, and have two culling lines in the control
sector, tagged to sectors 'A' and 'B'. If the player is in sector 'A' or 'B', the culling
will occur, but if the player is in sector 'C', it will not.</p>
<h3>11 - Rope Hang Parameters</h3>
<p>X length = speed. Y length = waypoint sequence #.</p>
<p>EFFECT1 - Don't wrap movement</p>
<p>See sector type 45056 for more information.</p>
<h3>12 - Rock Spawn Parameters</h3>
<p>Sets special behavior of a rock spawner (#1202) as such:</p>
<p>length - momentum strength</p>
<p>line angle - momentum angle</p>
<p>X offset - # of tics to wait until another is spawned</p>
<p>Y offset - Rock crumble sprite to use (0-15)</p>
<p>NOCLIMB - add some randomization to the momentum</p>
<p>&nbsp;</p>
<h3>13 - Heat Wave</h3>
<p>Applies a heat effect to the screen. Tag this to a sector, or to the control sector of a FOF.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Level Parameters / Miscellany</big></big></u><ol>
<h3><a name="l20"></a>20 - Marks first line in PolyObject</h3>
<p>Explain here.</p>
<h3><a name="l21"></a>21 - Explicitly include a PolyObject line</h3>
<p>Explain here.</p>
<h3><a name="l30"></a>30 - PolyObject Parameters</h3>
<p>Explain here.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Level-Load Effects</big></big></u><ol>
<h3><a name="l50"></a>50 - Instant Floor Lower</h3>
<p>Makes the floor instantly lower on level load to be at the same height as the lowest
floor of any bordering sector.</p>
<h3><a name="l51"></a>51 - Instant Ceiling Raise</h3>
<p>Makes the ceiling instantly rise on level load to be the same height as the highest
ceiling of any bordering sector.</p>
<h3><a name="l52"></a>52 - Continuously Falling Sector</h3>
<p>Requires two control sectors. Sector continuously falls until its ceiling reaches the
floor of the line's back sector, then returns to its original position and keeps falling.
Linedef length determines speed. Good for things like intermittently falling lava. If the <a
href="#NOCLIMB">NOCLIMB</a> flag is set, it falls upwards, instead of downwards.</p>
<h3><a name="l53"></a>53 - Continuous Floor/Ceiling Mover</h3>
<p>Must be a two-sided linedef, tagged to another sector on the map. The tagged sector's
floor and ceiling will move, first so that they're equal to the floor and ceiling of the
linedef's front sector, then so they're equal to the floor and ceiling of the linedef's
back sector, then the front sector again, and so on.</p>
<p>The speed of the movement is determined by the linedef's length and uses the same units
as linetype <a href="#l60">60</a>.</p>
<h3><a name="l54"></a>54 - Continuous Floor Mover</h3>
<p>Like linetype <a href="#l53">53</a>, but only moves the floor, not the ceiling. Can be
used to replace floating platforms in some cases, where only the floor was desired to
move.</p>
<h3><a name="l55"></a>55 - Continuous Ceiling Mover</h3>
<p>Like linetype <a href="#l53">53</a>, but only moves the ceiling, not the floor.</p>
<h3><a name="l56"></a>56 - Continuous Two-Speed Floor/Ceiling Mover</h3>
<p>Must be a two-sided linedef, tagged to another sector on the map. The tagged sector's
floor and ceiling will move, first so that they're equal to the floor and ceiling of the
linedef's front sector, then so they're equal to the floor and ceiling of the linedef's
back sector, then the front sector again, and so on.</p>
<p>The speed of the movement is determined by the linedef's x distance (the first way,
towards the front sector) and y distance (the second way, towards the back sector), using
the same units as linetype <a href="#l60">60</a>.</p>
<p>Unlike linetype <a href="#l53">53</a>, this effect does not slow down when it reaches
the end of its movement. Instead, it changes instantly from going in one direction to
going in the other. It's designed for making more sophisticated crushers than the crusher
type allows (i.e. crushers with varying rise/crush speeds, FOF crushers, crushers with
different start points).</p>
<h3><a name="l57"></a>57 - Continuous Two-Speed Floor Mover</h3>
<p>Like linetype <a href="#l56">56</a>, but only moves the floor, not the ceiling.</p>
<h3><a name="l58"></a>58 - Continuous Two-Speed Ceiling Mover</h3>
<p>Like linetype <a href="#l56">56</a>, but only moves the ceiling, not the floor.</p>
<h3><a name="l59"></a>59 - Activate Floating Platform</h3>
<p>This is used to make floating platforms (that move up and down) as well as moving
water. In fact, you can use this to make any type of block move vertically. The way it
works is somewhat confusing - You use three control sectors, all connected by at least one
linedef. Easiest thing to do is make three square sectors together in a row. One of the
linedefs on the middle sector should contain the Floor Over Floor line special that you
want. This will be the Floor Over Floor control sector. The other two sectors represent
the bottommost position you want the Floor Over Floor to reach, and the topmost position
you want the Floor Over Floor to reach. The 59 line can be on any of these sectors, as
long as you tag it to the middle one. If you still don't understand, look at Greenflower
Zone Act 2. If the <a href="#NOCLIMB">NOCLIMB</a> flag is set, the platform will begin
moving upwards, rather than downwards.</p>
<h3><a name="l60"></a>60 - Activate Floating Platform (Adjustable Speed)</h3>
<p>Speed is indicated by linedef length; one unit of speed here is 0.25 fracunits per tic.
(Floating platforms made with type <a href="#l59">59</a> move at 2 fracunits per tic.)
Aside from the linedef length controlling speed, works exactly like linedef type <a
href="#l59">59</a>.</p>
<h3><a name="l61"></a>61 - Crusher 1 (Ceiling to Floor)</h3>
<p>The crush motion is from the ceiling to the floor. Linedef length indicates crusher
speed. See also linetype <a href="#l62">62</a>, Crusher 2.</p>
<h3><a name="l62"></a>62 - Crusher 2 (Floor to Ceiling)</h3>
<p>Like linetype <a href="#l61">61</a>, Crusher 1, except that it starts in a different
place, not synchronised with any crushers that use the Crusher 1 type. The highest ceiling
this crusher reaches will be the highest ceiling height of any bordering sector.</p>
<h3><a name="l63"></a>63 - Fake Floor</h3>
<p>Creates two fake planes, fake floor and fake ceiling. Main textures are not affected,
but as far as above/below textures and floor/ceiling flats are concerned, the floor and
ceiling height are those of the control sector. As far as collisions, walking, etc. are
concerned, the floor and ceiling flats are whatever they normally would be.</p>
<p>Fake floor is useful for railings (THZRAIL and WOODRAIL; see THZ2 for examples) and
snow effects (making a fake floor of snow just a few units above normal floor, so it looks
like the player's feet are buried in the snow).</p>
<h3><a name="l64"></a>64 - Appearing/Disappearing FOF</h3>
<p>Tag this to any FOF <i>line</i> and this will cause it to appear and disappear
intermittently. The line's X length is the amount of time (in tics) that the FOF will
appear, and Y length is the amount of time (in tics) that the FOF will disappear. The
control sector's floor height allows you to specify an offset (in tics) of how much time
will pass before the appearing/disappearing kicks in.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Floor-Over-Floors (FOFs)</big></big></u><ol>
<h3><a name="l100"></a>100 - Floor Over Floor: Solid, Opaque, Shadowcasting</h3>
<p>This is just a regular old FOF. As with any block, the ceiling of the control sector is
the top of the block, and the floor of the control sector is the bottom.
&quot;Shadowcasting&quot; means that the light value used in the control sector is used
for the area below where the actual FOF appears, as opposed to above it.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL-->
<h3><a name="l101"></a>101 - Floor Over Floor: Solid, Opaque, Non-Shadowcasting</h3>
<p>See notes for <a href="#l100">100</a>. &quot;Non-shadowcasting&quot; means that the
light value you set in the control sector will be used for the area above the FOF, instead
of below it.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_NOSHADE|FF_CUTLEVEL-->
<h3><a name="l102"></a>102 - Floor Over Floor: Solid, Translucent</h3>
<p>Useful for windows. The GLASSTEX texture is good for this purpose. You can change the
alpha value of the translucency by setting the control linedef's Above texture to a #
followed by a three-digit decimal number, 000 to 255. #000 is most transparent, #255 is
most opaque. Note that in software mode, there are actually only ten different values that
serve as a 'best guess'.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_NOSHADE|FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA-->
<h3><a name="l103"></a>103 - Floor Over Floor: Solid, Sides Only</h3>
<p>A solid FOF that renders sides only, not planes (floor and ceiling). You were supposed
to be able to use it to place railings (THZRAIL, WOODRAIL, etc.) on FOFs. It doesn't work
for that, because the railings use a different kind of transparency and software mode
won't draw them on FOFs. So this one is going on the list of useless effects, right next
to linetype <a href="#l104">104</a>.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERSIDES|FF_NOSHADE|FF_CUTLEVEL-->
<h3><a name="l104"></a>104 - Floor Over Floor: Solid, No Sides</h3>
<p>Like a 3D floor of type <a href="#l101">101</a>, except that sides are not drawn.
Supposedly a little bit faster than a normal 3D floor. You can use it when the sides
wouldn't be visible anyway.</p>
<p>This type of 3D floor will have shadows if and only if you set the control linedef's <a
href="#NOCLIMB">NOCLIMB</a> flag.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERPLANES|FF_CUTLEVEL
If the <a href="#NOCLIMB">NOCLIMB</a> flag is disabled, it also adds FF_NOSHADE-->
<h3><a name="l105"></a>105 - Floor Over Floor: Solid, Invisible</h3>
<p>For making invisible walls and other strange effects.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_NOSHADE-->
<hr>
<h3><a name="l120"></a>120 - Floor Over Floor: Water, Opaque</h3>
<p>This one looks exactly like linetype <a href="#l100">100</a> ingame, but is a block of
water instead of solid.</p>
<p>The block will have the attribute of linetype <a href="#l200">200</a> if the <a
href="#NOCLIMB">NOCLIMB</a> flag is set.</p>
<p>To use the light level of the target sector, utilize the <a href="#EFFECT4">EFFECT4</a>
flag.</p>
<p>If this is used as lava (Fire Damage), and you set the <a href="#BLOCKMONSTERS">BLOCKMONSTERS</a>
flag, you can still pass through the lava.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_RENDERALL|FF_SWIMMABLE|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES-->
<h3><a name="l121"></a>121 - Floor Over Floor: Water, Translucent</h3>
<p>This one looks exactly like linetype <a href="#l102">102</a> ingame, but is a block of
water instead of solid.</p>
<p>The block will have the attribute of linetype <a href="#l200">200</a> if the <a
href="#NOCLIMB">NOCLIMB</a> flag is set.</p>
<p>To use the light level of the target sector, utilize the <a href="#EFFECT4">EFFECT4</a>
flag.</p>
<p>If this is used as lava (Fire Damage), and you set the <a href="#BLOCKMONSTERS">BLOCKMONSTERS</a>
flag, you can still pass through the lava.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_RENDERALL|FF_TRANSLUCENT|FF_SWIMMABLE|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTEXTRA|FF_EXTRA|
FF_CUTSPRITES-->
<h3><a name="l122"></a>122 - Floor Over Floor: Water, Opaque, No Sides</h3>
<p>Like linetype <a href="#l120">120</a>, but doesn't render sides.</p>
<p>The block will have the attribute of linetype <a href="#l200">200</a> if the <a
href="#NOCLIMB">NOCLIMB</a> flag is set.</p>
<p>To use the light level of the target sector, utilize the <a href="#EFFECT4">EFFECT4</a>
flag.</p>
<p>If this is used as lava (Fire Damage), and you set the <a href="#BLOCKMONSTERS">BLOCKMONSTERS</a>
flag, you can still pass through the lava.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_RENDERPLANES|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES-->
<h3><a name="l123"></a>123 - Floor Over Floor: Water, Translucent, No Sides</h3>
<p>Like linetype <a href="#l121">121</a>, but doesn't render sides. Most of the time this
won't make a difference. It can be useful, however, for windows that have water on one
side and not on the other.</p>
<p>The block will have the attribute of linetype <a href="#l200">200</a> if the <a
href="#NOCLIMB">NOCLIMB</a> flag is set.</p>
<p>To use the light level of the target sector, utilize the <a href="#EFFECT4">EFFECT4</a>
flag.</p>
<p>If this is used as lava (Fire Damage), and you set the <a href="#BLOCKMONSTERS">BLOCKMONSTERS</a>
flag, you can still pass through the lava.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_RENDERPLANES|FF_TRANSLUCENT|FF_SWIMMABLE|FF_BOTHPLANES|FF_CUTEXTRA|FF_EXTRA|
FF_CUTSPRITES-->
<hr>
<h3><a name="l140"></a>140 - Floor Over Floor: Intangible from Bottom, Opaque </h3>
<p>This sector type is solid from the top and walls, but is not solid from the bottom.
This allows the designer to create one-way passages as well as simulate 2D design by
having platforms that players can jump up to from below.</p>
<p>This type of 3D floor will have shadows unless you set the control linedef's <a
href="#NOCLIMB">NOCLIMB</a> flag.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_PLATFORM|FF_BOTHPLANES|FF_ALLSIDES
If the <a href="#NOCLIMB">NOCLIMB</a> flag is enabled, it also adds FF_NOSHADE-->
<h3><a name="l141"></a>141 - Floor Over Floor: Intangible from Bottom, Translucent</h3>
<p>A copy of linetype <a href="#l140">140</a> that is also translucent.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_PLATFORM|FF_TRANSLUCENT|FF_BOTHPLANES|FF_ALLSIDES
If the <a href="#NOCLIMB">NOCLIMB</a> flag is enabled, it also adds FF_NOSHADE-->
<h3><a name="l142"></a>142 - Floor Over Floor: Intangible from Bottom, Translucent, No
Sides</h3>
<p>A platform you can jump up through, like linetype <a href="#l140">140</a> (and decides
the same way whether to have shadows or not), with translucency and that doesn't render
sides. Alpha value supported the same way as linetype <a href="#l102">102</a>.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_CUTLEVEL|FF_RENDERPLANES|FF_TRANSLUCENT|FF_PLATFORM|FF_BOTHPLANES
If the <a href="#NOCLIMB">NOCLIMB</a> flag is enabled, it also adds FF_NOSHADE-->
<hr>
<h3><a name="l150"></a>150 - Floor Over Floor: Bobbing (Air)</h3>
<p>FOF that moves down 16 units when you step on, then returns to its former position when
you step off. The control sector must be connected to another sector with the same floor
and ceiling height. This seemingly redundant sector is used for resetting the heights. (If
you forget to put it in, the bobbing floor when stepped on will go down, keep going down,
and never stop or come back up.) See also linetypes <a href="#l151">151</a> and <a
href="#l152">152</a>. This linedef is obsolete. Please use linetype 190-195.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_AIRBOB-->
<h3><a name="l151"></a>151 - Floor Over Floor: Adjustable Bobbing (Air)</h3>
<p>Like linetype <a href="#l150">150</a>, except that instead of the floor moving down 16
units when you step on it, it moves down the number of units of the control linedef's
length. This linedef is obsolete. Please use linetype 190-195.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_AIRBOB-->
<h3><a name="l152"></a>152 - Floor Over Floor: Reverse Bobbing (Air)</h3>
<p>Like linetype <a href="#l151">151</a>, except in reverse. The platform goes <i>up</i>
when you step on it and back <i>down</i> when you step off. This linedef is obsolete.
Please use linetype 190-195.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_AIRBOB-->
<hr>
<h3><a name="l160"></a>160 - Floor Over Floor: Floating, Bobbing</h3>
<p>Bobs and floats in water. The floating part means that if the water moves or rises,
this platform will rise with it.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_FLOATBOB-->
<hr>
<h3><a name="l170"></a>170 - Floor Over Floor: Crumbling (Respawn)</h3>
<p>Crumbles and falls away, then reappears 15 seconds later.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_CRUMBLE-->
<h3><a name="l171"></a>171 - Floor Over Floor: Crumbling (No Respawn)</h3>
<p>Crumbles and falls away and never comes back.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_CRUMBLE|FF_NORETURN-->
<h3><a name="l172"></a>172 - Floor Over Floor: Crumbling (Respawn)</h3>
<p>A copy of linetype <a href="#l140">140</a> that also crumbles when stood on and
reappears after 15 seconds.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_PLATFORM|FF_CRUMBLE|FF_BOTHPLANES|FF_ALLSIDES
If the <a href="#NOCLIMB">NOCLIMB</a> flag is enabled, it also adds FF_NOSHADE-->
<h3><a name="l173"></a>173 - Floor Over Floor: Crumbling (No Respawn)</h3>
<p>A copy of linetype <a href="#l172">172</a> that stays gone forever after crumbling.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_PLATFORM|FF_CRUMBLE|FF_NORETURN|FF_BOTHPLANES|
FF_ALLSIDES
If the <a href="#NOCLIMB">NOCLIMB</a> flag is enabled, it also adds FF_NOSHADE-->
<h3><a name="l174"></a>174 - Floor Over Floor: Intangible from Bottom, Crumbling
(Respawn), Translucent</h3>
<p>A copy of linetype <a href="#l141">141</a> that also crumbles when stood on and
reappears after 15 seconds.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_PLATFORM|FF_CRUMBLE|FF_TRANSLUCENT|FF_BOTHPLANES|
FF_ALLSIDES
If the <a href="#NOCLIMB">NOCLIMB</a> flag is enabled, it also adds FF_NOSHADE-->
<h3><a name="l175"></a>175 - Floor Over Floor: Intangible from Bottom, Crumbling (No
Respawn), Translucent</h3>
<p>A copy of linetype <a href="#l174">174</a> that stays gone forever after crumbling.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_PLATFORM|FF_CRUMBLE|FF_NORETURN|FF_TRANSLUCENT|
FF_BOTHPLANES|FF_ALLSIDES
If the <a href="#NOCLIMB">NOCLIMB</a> flag is enabled, it also adds FF_NOSHADE-->
<h3><a name="l176"></a>176 - Floor Over Floor: Crumbling (Respawn), Floating, Bobbing</h3>
<p>Crumbles and falls, then floats on water, then bobs when you step on it.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_FLOATBOB|FF_AIRBOB|FF_CRUMBLE-->
<h3><a name="l177"></a>177 - Floor Over Floor: Crumbling (No Respawn), Floating, Bobbing</h3>
<p>Crumbles and falls, then floats on water, then bobs when you step on it. Unlike
linetype <a href="#l176">176</a>, does not return to its former position.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_FLOATBOB|FF_AIRBOB|FF_CRUMBLE|FF_NORETURN-->
<h3><a name="l178"></a>178 - Floor Over Floor: Crumbling (Respawn), Floating</h3>
<p>Crumbles and falls, then floats on water, then reappears up in the air 15 seconds
later.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_CRUMBLE|FF_FLOATBOB-->
<h3><a name="l179"></a>179 - Floor Over Floor: Crumbling (No Respawn), Floating</h3>
<p>Crumbles and falls, then spends the rest of its days floating on water, never to
reappear up in the air.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_CRUMBLE|FF_FLOATBOB|FF_NORETURN-->
<h3><a name="l180"></a>180 - Floor Over Floor: Crumbling (Respawn), Bobbing (Air)</h3>
<p>Bobs, crumbles, and falls when stepped on.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_AIRBOB|FF_CRUMBLE-->
<hr>
<h3><a name="l190"></a>190 - Floor Over Floor: Rising Platform, Solid, Opaque,
Shadowcasting</h3>
<p>Just like <a href="#l100">100</a>, except when a player steps on it, it will rise up to
the control sector's highest adjacent sector. You set the control sectors for this up like
special <a href="#l59">59</a>. Linedef length controls speed like <a href="#l60">60</a>.
If the <a href="#NOCLIMB">NOCLIMB</a> flag is set, it will require the player to spindash
to raise the platform.</p>
<h3><a name="l191"></a>191 - Floor Over Floor: Rising Platform, Solid, Opaque,
Non-Shadowcasting</h3>
<p>Just like <a href="#l101">101</a>, except when a player steps on it, it will rise up to
the control sector's highest adjacent sector. You set the control sectors for this up like
special <a href="#l59">59</a>. Linedef length controls speed like <a href="#l60">60</a>.
If the <a href="#NOCLIMB">NOCLIMB</a> flag is set, it will require the player to spindash
to raise the platform.</p>
<h3><a name="l192"></a>192 - Floor Over Floor: Rising Platform, Solid, Translucent</h3>
<p>Just like <a href="#l102">102</a>, except when a player steps on it, it will rise up to
the control sector's highest adjacent sector. You set the control sectors for this up like
special <a href="#l59">59</a>. Linedef length controls speed like <a href="#l60">60</a>.
If the <a href="#NOCLIMB">NOCLIMB</a> flag is set, it will require the player to spindash
to raise the platform.</p>
<h3><a name="l193"></a>193 - Floor Over Floor: Rising Platform, Solid, Invisible</h3>
<p>Just like <a href="#l105">105</a>, except when a player steps on it, it will rise up to
the control sector's highest adjacent sector. You set the control sectors for this up like
special <a href="#l59">59</a>. Linedef length controls speed like <a href="#l60">60</a>.
If the <a href="#NOCLIMB">NOCLIMB</a> flag is set, it will require the player to spindash
to raise the platform.</p>
<h3><a name="l194"></a>194 - Floor Over Floor: Rising Platform, Intangible from Bottom,
Opaque</h3>
<p>Just like <a href="#l140">140</a>, except when a player steps on it, it will rise up to
the control sector's highest adjacent sector. You set the control sectors for this up like
special <a href="#l59">59</a>. Linedef length controls speed like <a href="#l60">60</a>.
If the <a href="#NOCLIMB">NOCLIMB</a> flag is set, it will require the player to spindash
to raise the platform.</p>
<h3><a name="l195"></a>195 - Floor Over Floor: Rising Platform, Intangible from Bottom,
Translucent</h3>
<p>Just like <a href="#l141">141</a>, except when a player steps on it, it will rise up to
the control sector's highest adjacent sector. You set the control sectors for this up like
special <a href="#l59">59</a>. Linedef length controls speed like <a href="#l60">60</a>.
If the <a href="#NOCLIMB">NOCLIMB</a> flag is set, it will require the player to spindash
to raise the platform.</p>
<hr>
<h3><a name="l200"></a>200 - Floor Over Floor: Light Block</h3>
<p>Like a half light block, but it's really an actual block. That is, the light only comes
down to the control sector's floor, not to the bottom of the level (as with linetype <a
href="#l201">201</a>.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_CUTSPRITES|FF_DOUBLESHADOW-->
<h3><a name="l201"></a>201 - Floor Over Floor: Half Light Block</h3>
<p>Light blocks can be used to set color maps and light values. The light value of the
control sector will be used and any colormap attached to it will be used also. Note that
only the ceiling of the control sector is used; the light goes all the way down to the
bottom of the level. If this isn't what you want, consider using linedef type <a
href="#l200">200</a> instead.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_CUTSPRITES
Note: Although it's not a true FOF, it does still have the same kind of definition, so
the FOF flags are included despite not being a real block.-->
<h3><a name="l202"></a>202 - Floor Over Floor: Fog Block</h3>
<p>Creates a block of colored fog. Attach a colormap (linetype <a href="#l606">606</a>) to
the control sector for the fog block; otherwise you won't see anything out of the
ordinary.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_RENDERALL|FF_FOG|FF_BOTHPLANES|FF_INVERTPLANES|FF_ALLSIDES|FF_INVERTSIDES|FF_CUTEXTRA|
FF_EXTRA|FF_DOUBLESHADOW|FF_CUTSPRITES-->
<hr>
<h3><a name="l220"></a>220 - Floor Over Floor: Intangible, Opaque </h3>
<p>Like <a href="#l120">opaque water</a>, but not swimmable. Good for a snow effect on
FOFs. Can also be used to make hidden rooms, like you would normally do by setting a Main
texture.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_RENDERALL|FF_BOTHPLANES|FF_ALLSIDES|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES-->
<h3><a name="l221"></a>221 - Floor Over Floor: Intangible, Translucent</h3>
<p>See linedef type <a href="#l102">102</a> for how to adjust the translucency, making the
3D floor more transparent or more opaque.</p>
<p>This type of 3D floor will have shadows if and only if you set the control linedef's <a
href="#NOCLIMB">NOCLIMB</a> flag.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_RENDERALL|FF_TRANSLUCENT|FF_EXTRA|FF_CUTEXTRA
If the <a href="#NOCLIMB">NOCLIMB</a> flag is disabled, it also adds FF_NOSHADE-->
<h3><a name="l222"></a>222 - Floor Over Floor: Intangible, Sides Only</h3>
<p>An intangible FOF that renders sides only, not planes (floor and ceiling). It renders
both inside sides and outside sides. You can use it to place sector borders (GFZGRASS,
etc.) on FOFs.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_RENDERSIDES|FF_NOSHADE|FF_ALLSIDES-->
<h3><a name="l223"></a>223 - Floor Over Floor: Intangible, Invisible</h3>
<p>Useful for setting effects, such as wind and gravity.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_NOSHADE-->
<hr>
<h3><a name="l250"></a>250 - Floor Over Floor: Mario Block</h3>
<p>Like a normal FOF, except that the control linedef's Above texture is used after the
block has been hit (the Main texture is used before this). Any things in the control
sector will pop out the top of the block in the order in which they were placed. Rings
will be obtained and the effects of monitors will begin as soon as the block has been hit.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_MARIO-->
<h3><a name="l251"></a>251 - Floor Over Floor: Thwomp Block</h3>
<p>The thwomps are the crazy platforms with faces in Mario Koopa Blast 3. They can crush
you, but you can also ride on them.</p>
<p>Control sector is set up like a <a href="#l100">normal FOF</a>. When a player steps
underneath the thwomp, it will crush down to the floor. You don't need to tell it where
the floor is. It knows.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL-->
<h3><a name="l252"></a>252 - Floor Over Floor: Shatter Block</h3>
<p>Like the bustable block, linetype <a href="#l254">254</a>, except that it shatters on
any sort of contact, whether it's a spindash or not (and whether you're Knuckles or not).</p>
<p>If the <a href="#NOCLIMB">NOCLIMB</a> flag is set, the block is only shatterable from
the bottom, like some things you spring up and break in Launch Base Zone from Sonic 3.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP|FF_SHATTER-->
<h3><a name="l253"></a>253 - Floor Over Floor: Shatter Block, Translucent</h3>
<p>Translucent version of <a href="#l252">252</a> supporting alpha values.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP|FF_SPINBUST|FF_TRANSLUCENT-->
<h3><a name="l254"></a>254 - Floor Over Floor: Bustable Block</h3>
<p>Bustable blocks can be destroyed by spindashing. Additionally, Knuckles can destroy
them by walking or jumping into them, since he is very strong. If the <a href="#NOCLIMB">NOCLIMB</a>
flag is set, only Knuckles can break the block.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP (|FF_ONLYKNUX if <a href="#NOCLIMB">NOCLIMB</a>)-->
<h3><a name="l255"></a>255 - Floor Over Floor: Spin Bust Block</h3>
<p>Like the bustable block, linetype <a href="#l254">254</a>, set off in a different way.
To break, jump onto it or fall down onto it while spinning. Similar to blocks found in
Marble Zone, as well as the ice cubes that would encase buttons and monitors in parts of
Ice Cap Zone.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP|FF_SPINBUST-->
<h3><a name="l256"></a>256 - Floor Over Floor: Spin Bust Block, Translucent</h3>
<p>Translucent version of <a href="#l255">255</a> supporting alpha values.</p>
<h3><a name="l257"></a>257 - Floor Over Floor: Quicksand Block</h3>
<p>It's set up like any block. You can, of course, sink and die in it. X length of the
linedef determines sink speed, Y length determines how &quot;sludgy&quot; movement in the
quicksand is.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES-->
<h3><a name="l258"></a>258 - Floor Over Floor: Laser Block</h3>
<p>Creates a blinking FOF that zaps you if you touch it. You can set the flats and texture
to whatever you want. For a red laser like in THZ2, use REDFLR for the flats and REDWALL
for the texture.</p>
<p>You can also make other colors using BLUEFLR/BLUWALL (blue laser), GREENFLR/GRNWALL
(green laser), and YELFLR/YELWALL (yellow laser). Of course, those colors of lasers are
very expensive, so Eggman doesn't have nearly as many of them. He usually goes with the
cheap red lasers.</p>
<!--Exact FOF flags:
FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA-->
<h3><a name="l259"></a>259 - Floor Over Floor: Custom</h3>
<p>Place the appropriate flag values in hex (do not include the 0x in front of it) in the
line's UPPER TEXTURE field on the 2nd side of the linedef.</p>
</ol>
</li>
<li><u><big><big>Linedef Executor Triggers</big></big></u><ol>
<h3><a name="l300"></a>300 - Trigger Linedef Executor (Continuous)</h3>
<p>Triggers linedef executor in the control sector when a player touches the tagged
sector's floor or steps in the sector (depending on the sector special used). The linedef
executor will keep being triggered over and over again as long as a player is there, hence
the word &quot;continuous&quot; in this linetype's name. Tagged sector must have one of
the <a href="#sCat2">Trigger Linedef Executor</a> types for this to work.</p>
<h3><a name="l301"></a>301 - Trigger Linedef Executor (Each Time)</h3>
<p>Like <a href="#l300">300</a>, except that it only gets triggered once for each time you
fall or jump onto the floor. Tagged sector must have one of the <a href="#sCat2">Trigger
Linedef Executor</a> types for this to work.</p>
<h3><a name="l302"></a>302 - Trigger Linedef Executor (Once)</h3>
<p>Like <a href="#l300">300</a>, except that after that linedef executor executes its
linedefs, it's done. It's over. The linedefs will never be executed again.</p>
<h3><a name="l303"></a>303 - Trigger Linedef Executor (Ring Count - Continuous)</h3>
<p>Triggers linedef executor in the control sector when a player touches the tagged
sector's floor or steps in the sector (depending on the sector special used). The linedef
executor will keep being triggered over and over again as long as a player is there, hence
the word &quot;continuous&quot; in this linetype's name. Tagged sector must have one of
the <a href="#sCat2">Trigger Linedef Executor</a> types for this to work. Executor will be
triggered depending on how many rings the player has:</p>
<p>No flags -&gt; Runs if (rings = line length)</p>
<p><a href="#NOCLIMB">NOCLIMB</a> -&gt; Runs if (rings &lt;= line length)</p>
<p><a href="#BLOCKMONSTERS">BLOCKMONSTERS</a> -&gt; Runs if (rings &gt;= line length)</p>
<p><a href="#EFFECT4">EFFECT4</a> -&gt; Takes the rings of ALL players into account.</p>
<h3><a name="l304"></a>304 - Trigger Linedef Executor (Ring Count - Once)</h3>
<p>Like <a href="#l303">303</a>, except that after that linedef executor executes its
linedefs, it's done. It's over. The linedefs will never be executed again.</p>
<h3><a name="l305"></a>305 - Trigger Linedef Executor (Character Ability - Once)</h3>
<p>Like linetype <a href="#l302">302</a>, but is only activated when the character's
ability number matches the linedef length by multiples of 10. For example:</p>
<p>0-9 = Charability 0</p>
<p>10-19 = Charability 1</p>
<p>20-29 = Charability 2</p>
<p>etc...</p>
<h3><a name="l306"></a>306 - Trigger Linedef Executor (Character Ability - Continuous)</h3>
<p>Like <a href="#l300">300</a>, but only triggers when the character's ability number
matches the linedef length by multiples of 10. See linetype <a href="#l305">305</a> for a
futher description.</p>
<h3><a name="l307"></a>307 - Trigger Linedef Executor (Character Ability - Each Time)</h3>
<p>Like <a href="#l301">301</a>, but only triggers when the character's ability number
matches the linedef length by multiples of 10. See linetype <a href="#l305">305</a> for a
futher description.</p>
<h3><a name="l308"></a>308 - Trigger Linedef Executor (Race Only, Once)</h3>
<p>Like linetype <a href="#l302">302</a>, but is only activated when the gametype is Race.
Useful for doing things like opening doors, pre-solving puzzles, etc. to make race
smoother.</p>
<h3><a name="l309"></a>309 - Trigger Linedef Executor (CTF Red Team - Continuous)</h3>
<p>Like <a href="#l300">300</a>, but only triggers if you are in CTF and on the red team.</p>
<h3><a name="l310"></a>310 - Trigger Linedef Executor (CTF Red Team - Each Time)</h3>
<p>Like <a href="#l301">301</a>, but only triggers if you are in CTF and on the red team.</p>
<h3><a name="l311"></a>311 - Trigger Linedef Executor (CTF Blue Team - Continuous)</h3>
<p>Like <a href="#l300">300</a>, but only triggers if you are in CTF and on the blue team.</p>
<h3><a name="l312"></a>312 - Trigger Linedef Executor (CTF Blue Team - Each Time)</h3>
<p>Like <a href="#l301">301</a>, but only triggers if you are in CTF and on the blue team.</p>
<h3><a name="l313"></a>313 - Trigger Linedef Executor (No More Enemies - Once)</h3>
<p>Like linetype <a href="#l302">302</a>, but is only activated when no more objects of
type MF_ENEMY exist in its tagged area. Think &quot;destroy all enemies in this room for
the door to open to go to the next room&quot;. Tag this to a control sector. It will go
through the lines of the control sector, checking for any lines of type <a href="#l223">223</a>
and checking inside the area occupied by the invisible intangible FOF to see if any
enemies exist. If no alive enemies are in all of the type <a href="#l223">223</a> FOFs,
the linedef executor is run once. The line length is the tag number of the linedef
executor trigger to run.</p>
<h3><a name="l314"></a>314 - Trigger Linedef Executor (# of Pushables - Continuous)</h3>
<p>Like <a href="#l300">300</a>, but only triggers if the number of pushable objects in
the sector compared to the line length is:</p>
<p>No flags -&gt; Runs if (# pushables = line length)</p>
<p><a href="#NOCLIMB">NOCLIMB</a> -&gt; Runs if (# pushables &gt;= line length)</p>
<p><a href="#EFFECT4">EFFECT4</a> -&gt; Runs if (# pushables &lt; line length)</p>
<h3><a name="l315"></a>315 - Trigger Linedef Executor (# of Pushables - Once)</h3>
<p>Like <a href="#l314">314</a>, but only triggers once.</p>
<h3><a name="l316"></a>316 - Trigger Linedef Executor (PolyObject - Land On)</h3>
<p>This will trigger every time you land on the polyobject. Line's tag # is 32000 + the
PolyObject ID #. You must also flag the PolyObject Start (#20) line with <a
href="#NOCLIMB">NOCLIMB</a> to tell the game it has a linedef executor associated with it.</p>
<p>So if you had a PolyObject with an ID of 1, this line would have a tag of 32001.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Linedef Executor Options</big></big></u><ol>
<h3><a name="l400"></a>400 - Linedef Executor: Set Tagged Sector's Floor Height/Pic</h3>
<p>When executed, instantly changes the tagged sector's floor height and flat to the floor
height and flat of the linedef's front sector.</p>
<h3><a name="l401"></a>401 - Linedef Executor: Set Tagged Sector's Ceiling Height/Pic</h3>
<p>When executed, instantly changes the tagged sector's ceiling height and flat to the
ceiling height and flat of the linedef's front sector.</p>
<h3><a name="l402"></a>402 - Linedef Executor: Set Tagged Sector's Light Level</h3>
<p>When executed, instantly changes the tagged sector's light level to that of the
linedef's front sector. Floor and ceiling light settings done with linetypes <a
href="#l601">601</a> and <a href="#l600">600</a> are transferred as well; colormaps are
not.</p>
<p>If there is a lighting effect active in the target sector or sectors at the time (glow,
fade, strobe, flicker), it will be stopped.</p>
<h3><a name="l403"></a>403 - Linedef Executor: Move Tagged Sector's Floor</h3>
<p>When executed, starts moving the tagged sector's floor until it is at the same height
as the linedef's front sector's floor. Speed is indicated in the same units used by
linetype <a href="#l60">60</a>.</p>
<p>If the line used has <a href="#NOCLIMB">NOCLIMB</a> flag, the floor flat will change
after the move, to that on the front sector's floor. This is like what linetype <a
href="#l400">400</a> does.</p>
<p>If the line used has <a href="#BLOCKMONSTERS">BLOCKMONSTERS</a> flag, another linedef
executor will be run when the floor movement is finished. (If multiple sectors finish at
different times, it goes by the lowest numbered sector, but you should probably try to
avoid this scenario.) The tag of the new linedef executor to run is specified by the X
alignment on the front side of the line. The tag number you use must be positive, and this
functionality cannot be combined with changing the floor flat using the <a href="#NOCLIMB">NOCLIMB</a>
flag. Running a linedef executor will take precedence over changing the floor flat.</p>
<h3><a name="l404"></a>404 - Linedef Executor: Move Tagged Sector's Ceiling</h3>
<p>When executed, starts moving the tagged sector's ceiling until it is at the same height
as the linedef's front sector's ceiling. Speed is indicated in the same units used by
linetype <a href="#l60">60</a>.</p>
<p>If the line used has <a href="#NOCLIMB">NOCLIMB</a> flag, the ceiling flat will change
after the move, to that on the front sector's ceiling. This is like what linetype <a
href="#l401">401</a> does.</p>
<p>If the line used has <a href="#BLOCKMONSTERS">BLOCKMONSTERS</a> flag, another linedef
executor will be run when the ceiling movement is finished. (If multiple sectors finish at
different times, it goes by the lowest numbered sector, but you should probably try to
avoid this scenario.) The tag of the new linedef executor to run is specified by the X
alignment on the front side of the line. The tag number you use must be positive, and this
functionality cannot be combined with changing the ceiling flat using the <a
href="#NOCLIMB">NOCLIMB</a> flag. Running a linedef executor will take precedence over
changing the ceiling flat.</p>
<h3><a name="l405"></a>405 - Linedef Executor: Lower Floor by Line</h3>
<p>Speed is indicated by x distance; amount to lower is indicated by y distance.</p>
<h3><a name="l406"></a>406 - Linedef Executor: Raise Floor by Line</h3>
<p>Speed is indicated by x distance; amount to raise is indicated by y distance.</p>
<h3><a name="l407"></a>407 - Linedef Executor: Lower Ceiling by Line</h3>
<p>Speed is indicated by x distance; amount to lower is indicated by y distance.</p>
<h3><a name="l408"></a>408 - Linedef Executor: Raise Ceiling by Line</h3>
<p>Speed is indicated by x distance; amount to raise is indicated by y distance.</p>
<h3><a name="l409"></a>409 - Linedef Executor: Change Calling Sector's Tag</h3>
<p>Changes the tag of the calling sector; that is, the sector on the map that activated
this linedef executor. The new tag is the linedef's length.</p>
<h3><a name="l410"></a>410 - Linedef Executor: Change Front Sector's Tag</h3>
<p>Changes the tag of the linedef's front sector. The new tag is the linedef's length.</p>
<h3><a name="l411"></a>411 - Linedef Executor: Stop Plane Movement</h3>
<p>Stops any and all floor, ceiling, or elevator movement in the tagged sector or sectors.</p>
<h2><a name="l412"></a>412 - Linedef Executor: Teleport Player to Tagged Sector</h2>
<p>The player who triggered the linedef executor will be teleported to the tagged sector.
The player's exact X, Y, Z, and angle are determined by a teleport destination thing, type
<a href="#t751">751</a>, somewhere in the tagged sector.</p>
<p>If the <a href="#BLOCKMONSTERS">BLOCKMONSTERS</a> flag is used, it won't flash and make
the teleport sound effects. If the <a href="#NOCLIMB">NOCLIMB</a> flag is used, it won't
reset the angle to the angle of the teleport destination thing, and if the <a
href="#EFFECT4">EFFECT4</a> flag is used, it will not kill your acceleration/speed upon
teleport.</p>
<h2><a name="l413"></a>413 - Linedef Executor: Change Music</h2>
<p>Linedef length indicates the music slot to use. If the linedef's <a href="#NOCLIMB">NOCLIMB</a>
flag is set, play the music once, otherwise loop it.</p>
<p>If the player dies and goes back to a starpost, the beginning of the level, or the
appropriate multiplayer start, the map music from before will be restored. The linedef
flag <a href="#BLOCKMONSTERS">BLOCKMONSTERS</a> can be set to change this behavior, and
retain the new music even after dying.</p>
<p>If the linedef length isn't a valid music slot, the music is stopped.</p>
<h3><a name="l414"></a>414 - Linedef Executor: Play SFX</h3>
<p>Plays a sound effect. The line length is the sound number to use. The list of sound
effects can be found in sounds.h. The origin of the sound depends on which linedef flags
are set: <ul>
<li><a href="#NOCLIMB">NOCLIMB</a> : The sound is played from nowhere, but only for the
player who triggered it.</li>
<li><a href="#EFFECT4">EFFECT4</a>: The sound is played from nowhere for everyone.</li>
<li><a href="#BLOCKMONSTERS">BLOCKMONSTERS</a>: The sound is played from the center of the
sector that triggered the linedef executor.</li>
</ul>
<p>Otherwise, the sound is played from the location of the player or thing who triggered
it.</p>
<h3><a name="l415"></a>415 - Linedef Executor: Run Script</h3>
<p>Runs a script, the same kind of script you can run on level load with the level header
scriptname attribute. The script that will be run should have a lumpname of the form SCR<i>xxyyy</i>,
where <i>xx</i> is the two-digit map number and <i>yyy</i> is the linedef's sector's floor
height in decimal, with leading zeroes as necessary (or 000 if the floor height exceeds
999 fracunits). For instance, if the linedef is in MAP31 and the floor of its sector is
337 fracunits, the script named SCR31337 will be run.</p>
<h3><a name="l416"></a>416 - Linedef Executor: Start Adjustable Fire Flicker</h3>
<p>Essentially a copy of linetype <a href="#l603">603</a> that waits to activate until the
linedef executor is triggered. It does have an extra feature, though. If you use a
two-sided linedef with the <a href="#NOCLIMB">NOCLIMB</a> flag, the linedef's back sector
will be used as the maximum light level, allowing you to set the target sector (or
sectors) at a different starting light level entirely.</p>
<h3><a name="l417"></a>417 - Linedef Executor: Start Adjustable Glowing Light</h3>
<p>Essentially a copy of linetype <a href="#l602">602</a> that waits to activate until the
linedef executor is triggered. It does have an extra feature, though. If you use a
two-sided linedef with the <a href="#NOCLIMB">NOCLIMB</a> flag, the linedef's back sector
will be used as the maximum light level, allowing you to set the target sector (or
sectors) at a different starting light level entirely.</p>
<h3><a name="l418"></a>418 - Linedef Executor: Start Adjustable Blinking Light
(unsynchronized)</h3>
<p>Essentially a copy of linetype <a href="#l604">604</a> that waits to activate until the
linedef executor is triggered. It does have an extra feature, though. If you use a
two-sided linedef with the <a href="#NOCLIMB">NOCLIMB</a> flag, the linedef's back sector
will be used as the maximum light level, allowing you to set the target sector (or
sectors) at a different starting light level entirely.</p>
<h3><a name="l419"></a>419 - Linedef Executor: Start Adjustable Blinking Light
(synchronized)</h3>
<p>Essentially a copy of linetype <a href="#l605">605</a> that waits to activate until the
linedef executor is triggered. It does have an extra feature, though. If you use a
two-sided linedef with the <a href="#NOCLIMB">NOCLIMB</a> flag, the linedef's back sector
will be used as the maximum light level, allowing you to set the target sector (or
sectors) at a different starting light level entirely.</p>
<h3><a name="l420"></a>420 - Linedef Executor: Fade Light Level</h3>
<p>When executed, gradually fades the tagged sector's light level to that of the linedef's
front sector. Floor and ceiling light settings done with linetypes <a href="#l601">601</a>
and <a href="#l600">600</a> are not affected or used.</p>
<p>If there is a lighting effect already active in the target sector or sectors at the
time (glow, other fade, strobe, flicker), it will be halted in favor of this one.</p>
<p>Linedef length in fracunits indicates speed. Fading from 224 to 64 with a linedef
length of 4 will take 40 fracunits (224 - 64 = 160, 160 / 4 = 40). There are 35 fracunits
in a second.</p>
<h3><a name="l421"></a>421 - Linedef Executor: Stop Lighting Effect</h3>
<p>Stops any lighting effects active in the tagged sector or sectors: glow, fade, strobe,
flicker, etc. The light level, whatever it is at the moment this script line is run, will
be preserved until a new lighting effect or light level change is used.</p>
<p>Note that the lighting effects will all stop other lighting effects when activated. In
other words, you only need to use this when you really want the lighting effect to stop,
not when you want one effect to stop and another to start.</p>
<h3><a name="l422"></a>422 - Linedef Executor: Cut-Away View</h3>
<p>Cuts away to a view from a different place for a moment. Only works for linedef
executors triggered by a player. Tag the line to a sector with an alt view thing (map
thing type 5007) in it at the proper location with the proper Z and angle. The line length
indicates how long to stay in this view, in tics.</p>
<p>By giving the linedef a <a href="#NOCLIMB">NOCLIMB</a> flag, you can adjust the
vertical viewing angle from the cut-away view. Set the x offset on the linedef's front
side to an integer -90 to 90. In software mode the range of viewing angles is actually
about -68 to 68. This is in degrees.</p>
<h3><a name="l423"></a>423 - Linedef Executor: Change Sky</h3>
<p>Changes sky to the # of the control sector's floorheight. This only affects the player
who activates it. If you'd like it to affect all players, make sure you check the <a
href="#NOCLIMB">NOCLIMB</a> flag.</p>
<h3><a name="l424"></a>424 - Linedef Executor: Change Weather</h3>
<p>Changes weather to the control sector's floorheight in powers of 10.</p>
<p>Example:</p>
<div align="left"><table border="1" width="28%">
<tr>
<td width="50%">Linedef Length</td>
<td width="50%">Weather Type</td>
</tr>
<tr>
<td width="50%">10</td>
<td width="50%">None</td>
</tr>
<tr>
<td width="50%">20</td>
<td width="50%">Snow</td>
</tr>
<tr>
<td width="50%">30</td>
<td width="50%">Rain</td>
</tr>
<tr>
<td width="50%">40</td>
<td width="50%">Storm</td>
</tr>
</table>
</div><p>(higher numbers reserved for future use)</p>
<p>This only affects the player who activates it. If you'd like it to affect all players,
make sure you check the <a href="#NOCLIMB">NOCLIMB</a> flag.</p>
<h3><a name="l425"></a>425 - Linedef Executor: Change Object State</h3>
<p>Changes the animation frame of the activating object to the state # indicated by the
length of the control linedef. Be careful how you use this.</p>
<h3><a name="l426"></a>426 - Linedef Executor: Stop Object</h3>
<p>Makes the object that triggered the linedef executor stop moving, after being sent to
the center of the sector it's in (only if <a href="#NOCLIMB">NOCLIMB</a> flag is set), on
the floor. Although it comes to a complete stop, the object can begin moving right away
again. If the object is a player, the player will stop jumping, spinning, or anything
else.</p>
<h3><a name="l427"></a>427 - Linedef Executor: Award Score</h3>
<p>Adds to the score of the player who activated it. Control sector's floorheight = points
to award. This even works with negative values.</p>
<h3><a name="l428"></a>428 - Linedef Executor: Start Platform Movement</h3>
<p>Starts a moving platform in the nature of linetype <a href="#l59">59</a> or <a
href="#l60">60</a>. If the <a href="#NOCLIMB">NOCLIMB</a> flag is set, the platform will
begin moving upwards. Otherwise, it will start moving downwards. Speed of movement is set
just like with linetype <a href="#l60">60</a>.</p>
<h3><a name="l429"></a>429 - Linedef Executor: Crush Ceiling Once</h3>
<p>Ceiling moves down to the floor, then back up. Speed is determined by line length -
every 16 units equals 1 FRACUNIT/tic.</p>
<h3><a name="l430"></a>430 - Linedef Executor: Crush Floor Once</h3>
<p>Floor moves up to the ceiling, then back down. Speed is determined by line length -
every 16 units equals 1 FRACUNIT/tic.</p>
<h3><a name="l431"></a>431 - Linedef Executor: Crush Floor And Ceiling Once</h3>
<p>Floor and ceiling meet in the middle and then return, sandwiching anything that's
inbetween. Speed is determined by line length - every 16 units equals 1 FRACUNIT/tic.</p>
<h3><a name="l432"></a>432 - Linedef Executor: Enable 2D Mode</h3>
<p>Turns on 2D mode within the level. You'll probably only want to use this with a zoom
tube or teleport to guarantee that the player is in the correct position when it switches.</p>
<h3><a name="l433"></a>433 - Linedef Executor: Disable 2D Mode</h3>
<p>Turns off 2D mode within the level.</p>
<h3><a name="l434"></a>434 - Linedef Executor: Award Custom Power</h3>
<p>Awards (or removes!) a power to the calling player.</p>
<p>X length: Power Index + 1</p>
<p>Y length: Power Duration (in 35ths of a second)</p>
<h3><a name="l435"></a>435 - Linedef Executor: Change Scroller Direction</h3>
<p>Changes direction of a scroller (conveyor, texture). Also changes speed if this is not
an accelerative/displacement scroller.</p>
<h3><a name="l436"></a>436 - Linedef Executor: Shatter Block</h3>
<p>Shatters a FOF - of any type. Parameters are as follows:</p>
<p>Texture X Offset: Tag # of FOF target sector</p>
<p>Texture Y Offset: Tag # of FOF control sector</p>
<p>Note that the FOF should only have one target sector.</p>
<h3><a name="l437"></a>437 - Linedef Executor: Disable Player Control</h3>
<p>Disables the controls of the player that triggered the linedef executor. If the
<a href="#NOCLIMB">NOCLIMB</a> flag is set, they will be able to jump, however.</p>
<p>Giving the front texture of the linedef an X offset will make the effect last that amount
of time, in tics. Otherwise, it ends immediately, so you would need to use a continuous
trigger.</p>
<h3><a name="l438"></a>438 - Linedef Executor: Set Object's Scale</h3>
<p>Length of this line determines the scale size of an object, in percentage. Note that there is a max of 400%.</p>
<h3><a name="l450"></a>450 - Linedef Executor: Execute Linedef Executor</h3>
<p>Just what it says. Can be used for recursion. Be careful, because you CAN make a loop
out of this that will freeze the game.</p>
<p>Tag is the linedef executor trigger tag to run.</p>
<h3><a name="l488"></a>488 - Linedef Executor: PolyObject - Move by Waypoints</h3>
<p>Moves a polyobject along a sequence of Zoom Tube waypoints.</p>
<p>Texture X offset: Speed (8 = 1 FRACUNIT).</p>
<p>Texture Y offset: Sequence # of Zoom Tube waypoints.</p>
<p>The movement also depends on which linedef flags are set: <ul>
<li><a href="#EFFECT1">EFFECT1</a> : Moves from highest waypoint # to lowest waypoint #.</li>
<li><a href="#EFFECT2">EFFECT2</a> : Comes back the way it came when the end is reached.</li>
<li><a href="#EFFECT3">EFFECT3</a> : Wrap around the waypoints.</li>
<li><a href="#EFFECT4">EFFECT4</a>:&nbsp; Continuously move (used with EFFECT2 or EFFECT3).</li>
</ul>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Scrollers / Pushers</big></big></u><ol>
<h3><a name="l500"></a>500 - Scroll Wall First Side Left</h3>
<h3><a name="l501"></a>501 - Scroll Wall First Side Opposite Direction</h3>
<h3><a name="l502"></a>502 - Scroll Wall According to Linedef</h3>
<h3><a name="l503"></a>503 - Acc Scroll Wall According to Linedef</h3>
<p>Accelerative scrolling version of <a href="#l502">502</a>.</p>
<h3><a name="l504"></a>504 - Disp Scroll Wall According to Linedef</h3>
<p>Displacement scrolling version of <a href="#l502">502</a>.</p>
<h3><a name="l505"></a>505 - Scroll Texture by Offsets</h3>
<hr>
<h3><a name="l510"></a>510 - Scroll Floor Texture</h3>
<p>Linedef length and direction indicate speed and direction.</p>
<h3><a name="l511"></a>511 - Acc Scroll Floor Texture</h3>
<p>Accelerative scrolling version of <a href="#l510">510</a>.</p>
<h3><a name="l512"></a>512 - Disp Scroll Floor Texture</h3>
<p>Displacement scrolling version of <a href="#l510">510</a>.</p>
<h3><a name="l513"></a>513 - Scroll Ceiling Texture</h3>
<p>Linedef length and direction indicate speed and direction.</p>
<h3><a name="l514"></a>514 - Acc Scroll Ceiling Texture</h3>
<p>Accelerative scrolling version of <a href="#l513">513</a>.</p>
<h3><a name="l515"></a>515 - Disp Scroll Ceiling Texture</h3>
<p>Displacement scrolling version of <a href="#l513">513</a>.</p>
<hr>
<h3><a name="l520"></a>520 - Carry Objects on Floor</h3>
<p>Like linedef type <a href="#l530">530</a>, without scrolling the floor texture, so the
floor doesn't look like it's moving.</p>
<h3><a name="l521"></a>521 - Acc Carry Objects on Floor</h3>
<p>Accelerative scrolling version of <a href="#l520">520</a>.</p>
<h3><a name="l522"></a>522 - Disp Carry Objects on Floor</h3>
<p>Displacement scrolling version of <a href="#l520">520</a>.</p>
<h3><a name="l523"></a>523 - Carry Objects on Ceiling</h3>
<p>For FOF conveyor belts. Like <a href="#l533">533</a>, except without the scrolling to
accompany it.</p>
<h3><a name="l524"></a>524 - Acc Carry Objects on Ceiling</h3>
<p>Accelerative scrolling version of <a href="#l523">523</a>. Untested.</p>
<h3><a name="l525"></a>525 - Disp Carry Objects on Ceiling</h3>
<p>Displacement scrolling version of <a href="#l523">523</a>. Untested.</p>
<hr>
<h3><a name="l530"></a>530 - Scroll Floor Texture and Carry Objects</h3>
<p>Used for conveyor belts, in conjunction with sector type <a href="#s1024">1024</a>
(Conveyor Belt). Linedef length and direction indicate conveyor speed and direction,
respectively. This can also be used to convey items on the underneath of a FOF. See Egg
Rock Zone for an example.</p>
<h3><a name="l531"></a>531 - Acc Scroll Floor Texture and Carry Objects</h3>
<p>Accelerative scrolling version of <a href="#l530">530</a>.</p>
<h3><a name="l532"></a>532 - Disp Scroll Floor Texture and Carry Objects</h3>
<p>Displacement scrolling version of <a href="#l530">530</a>.</p>
<h3><a name="l533"></a>533 - Scroll Ceiling Texture and Carry Objects</h3>
<p>For conveyor belts on the top of FOFs, or for conveying items on a ceiling. Tag this to
the FOF control sector and give the FOF control sector a type of <a href="#s1024">1024</a>,
Conveyor Belt. For realism you might also want to scroll the control sector's floor
texture in the opposite direction (see linetype <a href="#l510">510</a>).</p>
<h3><a name="l534"></a>534 - Acc Scroll Ceiling Texture and Carry Objects</h3>
<p>Accelerative scrolling version of <a href="#l533">533</a>. Untested.</p>
<h3><a name="l535"></a>535 - Disp Scroll Ceiling Texture and Carry Objects</h3>
<p>Displacement scrolling version of <a href="#l533">533</a>. Untested.</p>
<hr>
<h3><a name="l540"></a>540 - Friction</h3>
<p>Linedef lengths greater than 100 indicate slippery ice, while linedef lengths less than
100 can be used for sludge, with extra friction.</p>
<p>If you want friction on a FOF, tag this line to the control sector of the FOF.
Otherwise, tag it to the sector of desired destination.</p>
<h3><a name="l541"></a>541 - Wind</h3>
<p>Speed and direction are indicated by linedef length and direction. The target sector
should be of type <a href="#s512">512</a>, Wind/Current. If being used in a 3D Floor, put
the 512/768 sector type in the control sector, not the target sector. Also tag the line to
the control sector, and not the target sector.</p>
<p>Special flags:</p>
<p><a href="#NOCLIMB">NOCLIMB</a> -&gt; Only this pusher will affect the object - the
object can't have multiple 'pushings' due to being on the edge of a sector, etc.</p>
<p><a href="#EFFECT4">EFFECT4</a> -&gt; Player will go into slide with limited control
(similar to the water and oil slides in Labyrinth and Oil Ocean).</p>
<h3><a name="l542"></a>542 - Upwards Wind</h3>
<p>The length of the linedef is the wind speed. The target sector will need type <a
href="#s512">512</a> or <a href="#s768">768</a>. If being used in a 3D Floor, put the
512/768 sector type in the control sector, not the target sector. Also tag the line to the
control sector, and not the target sector.</p>
<p>NOCLIMB/EFFECT4 flags operate the same as for line <a href="#l541">541</a>.</p>
<h3><a name="l543"></a>543 - Downwards Wind</h3>
<p>Wind speed is determined by the linedef's length. Type <a href="#s512">512</a> or <a
href="#s768">768</a> must be applied to the target sector. If being used in a 3D Floor,
put the 512/768 sector type in the control sector, not the target sector. Also tag the
line to the control sector, and not the target sector.</p>
<p>NOCLIMB/EFFECT4 flags operate the same as for line <a href="#l541">541</a>.</p>
<h3><a name="l544"></a>544 - Current</h3>
<p>Speed and direction are indicated by linedef length and direction. The target sector
should have type <a href="#s512">512</a>, Wind/Current. If being used in a 3D Floor, put
the 512/768 sector type in the control sector, not the target sector. Also tag the line to
the control sector, and not the target sector.</p>
<p>NOCLIMB/EFFECT4 flags operate the same as for line <a href="#l541">541</a>.</p>
<h3><a name="l545"></a>545 - Upwards Current</h3>
<p>Linedef length indicates speed. Target sector needs sector type <a href="#s512">512</a>
or <a href="#s768">768</a>. If being used in a 3D Floor, put the 512/768 sector type in
the control sector, not the target sector. Also tag the line to the control sector, and
not the target sector.</p>
<p>NOCLIMB/EFFECT4 flags operate the same as for line <a href="#l541">541</a>.</p>
<h3><a name="l546"></a>546 - Downwards Current</h3>
<p>Speed is indicated by linedef length. Assign a type of <a href="#s512">512</a> or <a
href="#s768">768</a> to the target sector. If being used in a 3D Floor, put the 512/768
sector type in the control sector, not the target sector. Also tag the line to the control
sector, and not the target sector.</p>
<p>NOCLIMB/EFFECT4 flags operate the same as for line <a href="#l541">541</a>.</p>
<h3><a name="l547"></a>547 - Boom Push/Pull Thing</h3>
<p>Creates a &quot;point pusher,&quot; or a point that pushes you away or pulls you toward
it if you get close enough. Tag the linedef to a sector with type <a href="#s512">512</a>,
Wind/Current, and with a thing on it of type 5001 (push) or 5002 (pull). The control
linedef's length indicates pushing/pulling strength; if length is L, the effect fades away
to nothing when you are 2L away from the point.</p>
<p>If you want to create multiple point pushers/pullers, you'll need to have them in
different target sectors, but they can share the same tag.</p>
<p>NOCLIMB/EFFECT4 flags operate the same as for line <a href="#l541">541</a>.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Lighting</big></big></u><ol>
<h3><a name="l600"></a>600 - Floor Lighting</h3>
<p>Sets the lighting for the floor only. The control sector's light value will be used for
the target sector's floor. Also see type <a href="#l601">601</a>.</p>
<h3><a name="l601"></a>601 - Ceiling Lighting</h3>
<p>Sets the lighting of the ceiling only. The light value of the control sector will be
used for the target sector's ceiling. Also see type <a href="#l600">600</a>.</p>
<h3><a name="l602"></a>602 - Adjustable Pulsating Light</h3>
<p>Linedef length indicates glow speed. The normal speed would be a linedef 32 units long.</p>
<p>The control sector (the linedef's front sector) is used to get what will be the minimum
light level for this effect, while the target sector's light level ends up being the
maximum.</p>
<h3><a name="l603"></a>603 - Adjustable Flickering Light</h3>
<p>Linedef length indicates flicker speed. Normal speed would be a 16 fracunit long
linedef. A longer linedef means more time in between flickers.</p>
<p>The control sector (the linedef's front sector) is used to get what will be the minimum
light level for this effect, while the target sector's light level ends up being the
maximum.</p>
<h3><a name="l604"></a>604 - Adjustable Blinking Light (unsynchronized)</h3>
<p>Line's X length is time for the light to be off, and Y length is the time for the light
to be on.</p>
<p>The control sector (the linedef's front sector) is used to get what will be the minimum
light level for this effect, while the target sector's light level ends up being the
maximum.</p>
<h3><a name="l605"></a>605 - Adjustable Blinking Light (synchronized)</h3>
<p>Line's X length is time for the light to be off, and Y length is the time for the light
to be on.</p>
<p>The control sector (the linedef's front sector) is used to get what will be the minimum
light level for this effect, while the target sector's light level ends up being the
maximum.</p>
<h3><a name="l606"></a>606 - Colormap</h3>
<p>Sets a colormap. Tag the linedef to the sector or sectors affected by the colormap. The
control linedef's front Above texture is used to determine the colormap. The format is
#rrggbba, where rr, gg, and bb are two hexadecimal digits for determining each color: red,
blue, and green. The a stands for alpha, and is a number or letter indicating the
translucency; from A-Z and 0-9, with A being most transparent and 9 being most opaque.</p>
<p>It does not generally matter what sector the colormap linedef belongs to. However, it
should not belong to the same sector as another colormap, as this can cause problems.</p>
</ol>
</li>
<h1><a name="sectortypes"></a>Sector Types</h1>
<p>You can apply up to four different types to one sector, provided that you only choose
ONE from EACH category. Add the numbers together to obtain the final value to use in level
editors.</p>
<li><u><big><big>Section 1</big></big></u><ol>
<h3><a name="s1"></a>1 - Damage (Generic)</h3>
<p>This special hurts, period. It doesn't matter whether you have a liquid shield, fire
shield, attraction shield, or whatever else; step on one of these and suffer.</p>
<h3><a name="s2"></a>2 - Damage (Water)</h3>
<p>Also known as Slime Hurt. Stepping here will be painful, as in shield/ring/life loss
(depending on how you are equipped), unless you happen to have the liquid shield.</p>
<h3><a name="s3"></a>3 - Damage (Fire)</h3>
<p>Stepping here will hurt, unless you happen to have a fire shield.</p>
<h3><a name="s4"></a>4 - Damage (Electrical)</h3>
<p>Hurts players whenever they're in the sector, unless they have the attraction shield.</p>
<p>Usage tip: Give the sector a floor flat that looks electrical and looks like it could
hurt you. </p>
<h3><a name="s5"></a>5 - Spikes</h3>
<p>Making spikes using sectors is rather tedious and difficult. You can use things instead
(<a href="#t523">Floor Spike</a> and <a href="#t522">Ceiling Spike</a>). But the sector
version DOES look cooler. ;)</p>
<h3><a name="s6"></a>6 - Death Pit (Camera Modifications)</h3>
<p>Used for bottomless pits. You'll probably want the sector's floor flat to be either
F_SKY1 (falling from the sky) or PIT (falling into a pit of complete blackness). The
camera modifications keep the camera from following you all the way down, for a Sonic
Adventure-style pit death. If you don't like the camera modifications, use sector type <a
href="#s7">5</a>.</p>
<h3><a name="s7"></a>7 - Death Pit (No Camera Modifications)</h3>
<p>For bottomless pits. Use if the camera modifications of sector type <a href="#s6">6</a>
are not to your taste.</p>
<h3><a name="s8"></a>8 - Instant Kill</h3>
<p>Die right away if you even step into this sector. No need to touch the floor as with
those sissy death pits.</p>
<h3><a name="s9"></a>9 - Ring Drainer (Floor Touch)</h3>
<p>Lose one ring per 15 tics while touching the floor.</p>
<h3><a name="s10"></a>10 - Ring Drainer (No Floor Touch)</h3>
<p>Like sector type <a href="#s9">9</a>, but doesn't require touching floor.</p>
<h3><a name="s11"></a>11 - Special Stage Damage</h3>
<p>If you have rings and no shield, and you step on it, you only lose 10 rings, maximum.
It's just like the special stages!</p>
<h3><a name="s12"></a>12 - Space Countdown</h3>
<p>In space, you have no chance to survive make your time, ha ha ha. Starts an immediate
five-second countdown, like when you drown.</p>
<h3><a name="s13"></a>13 - Ramp Sector</h3>
<p>Doubles the step-up height of the player. Default step-up height is 24 fracunits, but
with this, it becomes 48. Useful for steps and other things if your players seem to be
getting 'stopped' by the stairs while moving quickly.</p>
<h3><a name="s14"></a>14 - Non-Ramp Sector (Don't step down)</h3>
<p>Removes the 'step-down' that a player will normally do when moving to a nearby sector.</p>
<h3><a name="s15"></a>15 - Bouncy Sector (FOF Control Only)</h3>
<p>Use this on a 3D floor's control sector to make it bouncy. Players will bounce off the
top of it. If the 3D floor's control line has the BOUNCY flag set, the linedef length sets
the minimum bounce force. Otherwise, you will slowly come to a stop.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big><a name="sCat2"></a>Section 2</big></big></u><ol>
<h3><a name="s16"></a>16 - Trigger Linedef Executor (Pushable Objects)</h3>
<p>Works like <a href="#s80">80</a> but with a pushable object (gargoyle or snowman)
touching the floor rather than a player.</p>
<h3><a name="s32"></a>32 - Trigger Linedef Executor (Anywhere in Sector) (All Players)</h3>
<p>Sector type <a href="#s64">64</a> with the added requirement that all players who don't
have a game over need to be in the sector, not just one player. Currently does not work in
FOFs.</p>
<h3><a name="s48"></a>48 - Trigger Linedef Executor (Floor Touch) (All Players)</h3>
<p>Sector type <a href="#s80">80</a> with the added requirement that all players who don't
have a game over need to be in the sector, not just one player.</p>
<h3><a name="s64"></a>64 - Trigger Linedef Executor (Anywhere in Sector)</h3>
<p>Like sector type <a href="#s80">80</a>, but you don't have to be touching the floor to
do the triggering. You could be flying high in the air. You should also use this one for
linedef executors triggered by FOFs.</p>
<h3><a name="s80"></a>80 - Trigger Linedef Executor (Floor Touch)</h3>
<p>Required for any of the <a href="#ltriggers">Linedef Executor Triggers</a> to work in
the sector.</p>
<h3><a name="s96"></a>96 - Trigger Linedef Executor (Emerald Check)</h3>
<p>Sector type <a href="#s64">64</a> which will only execute if you have all 7 chaos
emeralds.</p>
<h3><a name="s112"></a>112 - Trigger Linedef Executor (NiGHTS Mare)</h3>
<p>Like sector type <a href="#s64">64</a>, but this is only triggered if you are in a
NiGHTS map, and checks what mare you're on using the following format, depending on what
flags you have set for this line:</p>
<p>No flags -&gt; Runs if (current mare = line length)</p>
<p><a href="#NOCLIMB">NOCLIMB</a> -&gt; Runs if (current mare &lt;= line length)</p>
<p><a href="#BLOCKMONSTERS">BLOCKMONSTERS</a> -&gt; Runs if (current mare &gt;= line
length)</p>
<h3><a name="s128"></a>128 - Check for linedef executor on 3D Floors (ANY object)</h3>
<p>For any item to detect sector type <a href="#l16">16</a> on a 3D floor, the target
sector on the map must have this type. This allows you to have any kind of object trigger
a linedef executor.</p>
<h3><a name="s144"></a>144 - Egg Trap Capsule</h3>
<h3><a name="s160"></a>160 - Special Stage Time/Rings, Par</h3>
<p>For special stages, floor height is time limit in seconds, and ceiling height is rings
required in seconds. If the ceiling height is 0, there is no ring requirement, only a time
limit to find an exit.</p>
<h3><a name="s176"></a>176 - Custom Global Gravity</h3>
<p>Floor height sets global gravity. 500 is normal. 1000 is twice the normal gravity, 250
is half. You can also set per-sector gravity with linetype <a href="#l1">1</a>. This can
also be adjusted in realtime, for some really cool effects.</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Section 3</big></big></u><ol>
<h3><a name="s256"></a>256 - Ice/Sludge</h3>
<p>See linedef type <a href="#l540">540</a>.</p>
<h3><a name="s512"></a>512 - Wind/Current</h3>
<p>See linedef types <a href="#l541">541</a> and <a href="#l544">544</a>.</p>
<h3><a name="s768"></a>768 - Ice/Sludge and Wind/Current</h3>
<p>Combination of sector specials 256 and 512.</p>
<h3><a name="s1024"></a>1024 - Conveyor Belt</h3>
<p>See linedef type <a href="#l520">520</a>.</p>
<h3><a name="s1280"></a>1280 - Speed Pad (No Spin)</h3>
<p>See linedef type <a href="#l4">4</a>.</p>
<h3><a name="s1536"></a>1536 - Speed Pad (Spin)</h3>
<p>See linedef type <a href="#l4">4</a>. This type of speed pad forces you into a spin.</p>
<h3><a name="s1792"></a>1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840 - Bustable
Block Sprite Parameter</h3>
<p>Used in a control sector of a bustable block. Chooses which debris sprite to spawn.</p>
<p>1792 = ROIA</p>
<p>2048 = ROIB</p>
<p>2304 = ROIC</p>
<p>2560 = ROID</p>
<p>2816 = ROIE</p>
<p>3072 = ROIF</p>
<p>3328 = ROIG</p>
<p>3584 = ROIH</p>
<p>3840 = ROII</p>
<p>&nbsp;</p>
</ol>
</li>
<li><u><big><big>Section 4</big></big></u><ol>
<h3><a name="s4096"></a>4096 - Starpost Activator</h3>
<p>Whenever a player steps in the sector, a starpost in that sector will be searched for
and, if found, activated.</p>
<h3><a name="s8192"></a>8192 - Special Stage Goal</h3>
<p>This is like the &quot;GOAL&quot; buttons in Sonic 1's special stages. Ends the special
stage when stepped on.</p>
<h3><a name="s8192a"></a>8192 - Exit Sector</h3>
<p>In single-player, cooperative, or race mode, being in this sector ends the level. You
don't necessarily have to be touching the floor. (If you want the player to have to be
touching the floor, you can use linedef type <a href="#l223">223</a>, an invisible,
intangible FOF, to do the trick. Give the FOF control sector a type of <a href="#s8192">8192</a>.)</p>
<p>See linedef type <a href="#l2">2</a> for a way to exit to any map, not just the one
whose number is specified in the map header. Linedef 2 also allows you to skip the score
tally screen.</p>
<h3><a name="s8192b"></a>8192 - No Tag Zone</h3>
<p>In games of tag, this sector is a safe spot. You cannot be tagged while in it.</p>
<h3><a name="s8192c"></a>8192 - CTF: Flag Return</h3>
<p>In CTF, if the red or blue flag enters this sector, it will automatically return to
base, much like how it behaves when it falls in a pit. This can also be set as a special
on a 3D floor.</p>
<h3><a name="s12288"></a>12288 - CTF: Red Team Base</h3>
<p>The red team has to bring the <a href="#t307">blue flag</a> onto this sector to score.
It's generally a good idea to have the <a href="#t306">red flag</a> here and the <a
href="#t34">red team player starts</a> somewhere close by.</p>
<h3><a name="s16384"></a>16384 - CTF: Blue Team Base</h3>
<p>The blue team has to bring the <a href="#t306">red flag</a> onto this sector to score.
It's generally a good idea to have the <a href="#t307">blue flag</a> here and the <a
href="#t35">blue team player starts</a> somewhere close by.</p>
<h3><a name="s20480"></a>20480 - Fan Sector</h3>
<p>Acts like a fan, pushing the player up at constant speed and activating the proper
animation. Can be used on intangible FOFs.</p>
<h3><a name="s24576"></a>24576 - Super Sonic Transform</h3>
<p>Transforms you into Super Sonic and gives you 50 rings, providing you have all of the
chaos emeralds.</p>
<h3><a name="s28672"></a>28672 - Spinner</h3>
<p>Forces the player into a spin.</p>
<h3><a name="s32768"></a>32768 - Zoom Tube Start</h3>
<p>When the player touches this sector, a line type <a href="#l3">3</a> with the same tag
as the sector is searched for, and if found, the line's X length determines the speed at
which the tube operates, while its Y length determines which zoom tube sequence to use.
Then the player is immediately put into a spin, loses control, and gravitates toward the
first Zoom Tube Waypoint (thing type <a href="#t753">753</a>), which does not have to be
in the same sector. Once they reach the first waypoint, they begin traveling to the 2nd,
3rd, and so on, until the last waypoint is reached.</p>
<p>This can be used with Floor-Over-Floors, just use these specials in the control sector
instead. </p>
<h3><a name="s36864"></a>36864 - Zoom Tube End</h3>
<p>Just like sector type <a href="#s32768">32768</a>, but starts from the last waypoint
and goes to the first.</p>
<h3><a name="s40960"></a>40960 - Finish Line</h3>
<p>The finish line for a race circuit. This increments a lap when you pass it, after
hitting all the star posts in the stage in sequential order. Once the number of laps
specified by the server is reached, the level is completed.</p>
</ol>
</li>
</ul>
</body>
</html>
===============================================================================
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,
original document Copyright (c) 2009 James Haley.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
===============================================================================
This document discusses the UDMF implementation found in Sonic Robo Blast 2's engine.
=======================================
I. Grammar / Syntax
=======================================
No changes.
=======================================
II. Implementation Semantics
=======================================
------------------------------------
II.A : Storage and Retrieval of Data
------------------------------------
No changes.
-----------------------------------
II.B : Storage Within Archive Files
-----------------------------------
No changes.
--------------------------------
II.C : Implementation Dependence
--------------------------------
The SRB2 engine only supports the following namespace:
"srb2"
The engine is allowed to refuse maps with an unsupported namespace,
or emit a warning.
=======================================
III. Standardized Fields
=======================================
The SRB2 engine ignores any user-defined fields.
All boolean fields default to false unless mentioned otherwise.
Sonic Robo Blast 2 defines the following standardized fields:
vertex
{
x = <float>; // X coordinate. No valid default.
y = <float>; // Y coordinate. No valid default.
zfloor = <float>; // Floor height at this vertex. Only applies to triangular sectors
zceiling = <float>; // Ceiling height at this vertex. Only applies to triangular sectors
}
linedef
{
id = <integer>; // ID of line. Interpreted as tag.
moreids = <string>; // Additional line IDs, specified as a space separated list of numbers (e.g. "2 666 1003 4505")
v1 = <integer>; // Index of first vertex. No valid default.
v2 = <integer>; // Index of second vertex. No valid default.
blocking = <bool>; // Line blocks things.
blockmonsters = <bool>; // Line blocks enemies.
twosided = <bool>; // Line is 2S.
dontpegtop = <bool>; // Upper texture unpegged.
dontpegbottom = <bool>; // Lower texture unpegged.
skewtd = <bool>; // Upper and lower textures are skewed.
noclimb = <bool>; // Line is not climbable.
noskew = <bool>; // Middle texture is not skewed.
midpeg = <bool>; // Middle texture is pegged.
midsolid = <bool>; // Middle texture is solid.
wrapmidtex = <bool>; // Line's mid textures are wrapped.
nonet = <bool>; // Special only takes effect in singleplayer games.
netonly = <bool>; // Special only takes effect in multiplayer games.
bouncy = <bool>; // Line is bouncy.
transfer = <bool>; // In 3D floor sides, uses the sidedef properties of the control sector.
alpha = <float>; // Translucency of this line. Default is 1.0
renderstyle = <string>; // Render style. Can be:
// - "translucent"
// - "add"
// - "subtract"
// - "reversesubtract"
// - "modulate"
// - "fog"
// Default is "translucent".
special = <integer>; // Linedef action. Default = 0.
arg0 = <integer>; // Argument 0. Default = 0.
arg1 = <integer>; // Argument 1. Default = 0.
arg2 = <integer>; // Argument 2. Default = 0.
arg3 = <integer>; // Argument 3. Default = 0.
arg4 = <integer>; // Argument 4. Default = 0.
arg5 = <integer>; // Argument 5. Default = 0.
arg6 = <integer>; // Argument 6. Default = 0.
arg7 = <integer>; // Argument 7. Default = 0.
arg8 = <integer>; // Argument 8. Default = 0.
arg9 = <integer>; // Argument 9. Default = 0.
stringarg0 = <string>; // String argument 0.
stringarg1 = <string>; // String argument 1.
sidefront = <integer>; // Sidedef 1 index. No valid default.
sideback = <integer>; // Sidedef 2 index. Default = -1.
comment = <string>; // A comment. Implementors should attach no special
// semantic meaning to this field.
}
sidedef
{
offsetx = <integer>; // X offset. Default = 0.
offsety = <integer>; // Y offset. Default = 0.
texturetop = <string>; // Upper texture. Default = "-".
texturebottom = <string>; // Lower texture. Default = "-".
texturemiddle = <string>; // Middle texture. Default = "-".
repeatcnt = <integer>; // Number of middle texture repetitions. Default = 0.
sector = <integer>; // Sector index. No valid default.
scalex_top = <float>; // X scale for upper texture. Default = 1.0.
scaley_top = <float>; // Y scale for upper texture. Default = 1.0.
scalex_mid = <float>; // X scale for mid texture. Default = 1.0.
scaley_mid = <float>; // Y scale for mid texture. Default = 1.0.
scalex_bottom = <float>; // X scale for lower texture. Default = 1.0.
scaley_bottom = <float>; // Y scale for lower texture. Default = 1.0.
offsetx_top = <float>; // X offset for upper texture. Default = 0.0.
offsety_top = <float>; // Y offset for upper texture. Default = 0.0.
offsetx_mid = <float>; // X offset for mid texture. Default = 0.0.
offsety_mid = <float>; // Y offset for mid texture. Default = 0.0.
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.
}
sector
{
heightfloor = <integer>; // Floor height. Default = 0.
heightceiling = <integer>; // Ceiling height. Default = 0.
texturefloor = <string>; // Floor flat. No valid default.
textureceiling = <string>; // Ceiling flat. No valid default.
lightlevel = <integer>; // Light level. Default = 255.
lightfloor = <integer>; // The floor's light level. Default is 0.
lightceiling = <integer>; // The ceiling's light level. Default is 0.
lightfloorabsolute = <bool>; // true = 'lightfloor' is an absolute value. Default is
// relative to the owning sector's light level.
lightceilingabsolute = <bool>; // true = 'lightceiling' is an absolute value. Default is
// relative to the owning sector's light level.
special = <integer>; // Sector special. Default = 0.
id = <integer>; // Sector tag/id. Default = 0.
moreids = <string>; // Additional sector IDs/tags, specified as a space separated list of numbers (e.g. "2 666 1003 4505")
xpanningfloor = <float>; // X texture offset of floor texture. Default = 0.0.
ypanningfloor = <float>; // Y texture offset of floor texture. Default = 0.0.
xpanningceiling = <float>; // X texture offset of ceiling texture. Default = 0.0.
ypanningceiling = <float>; // Y texture offset of ceiling texture. Default = 0.0.
xscalefloor = <float>; // X texture scale of floor texture. Default = 1.0.
yscalefloor = <float>; // Y texture scale of floor texture. Default = 1.0.
xscaleceiling = <float>; // X texture scale of ceiling texture. Default = 1.0.
yscaleceiling = <float>; // Y texture scale of ceiling texture. Default = 1.0.
rotationfloor = <float>; // Rotation of floor texture in degrees. Default = 0.0.
rotationceiling = <float>; // Rotation of ceiling texture in degrees. Default = 0.0.
ceilingplane_a = <float>; // Define the plane equation for the sector's ceiling. Default is a horizontal plane at 'heightceiling'.
ceilingplane_b = <float>; // 'heightceiling' will still be used to calculate texture alignment.
ceilingplane_c = <float>; // The plane equation will only be used if all 4 values are given.
ceilingplane_d = <float>; // The plane is defined as a*x + b*y + c*z + d = 0 with the normal vector pointing downward.
floorplane_a = <float>; // Define the plane equation for the sector's floor. Default is a horizontal plane at 'heightfloor'.
floorplane_b = <float>; // 'heightfloor' will still be used to calculate texture alignment.
floorplane_c = <float>; // The plane equation will only be used if all 4 values are given.
floorplane_d = <float>; // The plane is defined as a*x + b*y + c*z + d = 0 with the normal vector pointing upward.
lightcolor = <integer>; // Sector's light color as RRGGBB value. Default = 0x000000.
lightalpha = <integer>; // Sector's light opacity. Default = 25.
fadecolor = <integer>; // Sector's fog color as RRGGBB value. Default = 0x000000.
fadealpha = <integer>; // Sector's fog opacity. Default = 25.
fadestart = <integer>; // Sector's fading range start. Default = 0.
fadeend = <integer>; // Sector's fading range end. Default = 31.
colormapfog = <bool>; // Sector's colormap uses fog lighting.
colormapfadesprites = <bool>; // Sector's colormap affects full-bright sprites.
colormapprotected = <bool>; // Sector's colormap is not affected by colormap change specials.
flipspecial_nofloor = <bool>; // Trigger effects that require a plane touch are not executed when the floor is touched.
flipspecial_ceiling = <bool>; // Trigger effects that require a plane touch are executed when the ceiling is touched.
triggerspecial_touch = <bool>; // Trigger effects are executed anywhere in the sector.
triggerspecial_headbump = <bool>; // Trigger effects are executed if the top of the triggerer object touches a plane.
triggerline_plane = <bool>; // Trigger effects require a plane touch to be executed.
triggerline_mobj = <bool>; // Trigger effects can be executed by non-pushable objects.
invertprecip = <bool>; // Inverts the precipitation effect; if the sector is considered to be indoors,
// precipitation is generated, and if the sector is considered to be outdoors,
// precipitation is not generated.
gravityflip = <bool>; // Sector flips any objects in it, if the sector has negative gravity.
heatwave = <bool>; // Sector has the heat wave effect.
noclipcamera = <bool>; // Sector is not tangible to the camera.
outerspace = <bool>; // Sector has the space countdown effect.
doublestepup = <bool>; // Sector has half the vertical height needed for objects to walk into it.
nostepdown = <bool>; // Sector has the staircase effect disabled.
speedpad = <bool>; // Sector is a speed pad.
starpostactivator = <bool>; // Sector activates any Star Posts in it when walked into by a plyer.
exit = <bool>; // Sector is an exit sector.
specialstagepit = <bool>; // Sector is a Special Stage pit.
returnflag = <bool>; // Sector returns any Capture the Flag flags that come in contact with it to their respective bases.
redteambase = <bool>; // Sector is a Red Team base.
blueteambase = <bool>; // Sector is Blue Team base.
fan = <bool>; // Sector is a fan sector.
supertransform = <bool>; // Sector transforms any players that come in contact with it into their 'super' mode.
forcespin = <bool>; // Sector forces any players that come in contact with it to roll.
zoomtubestart = <bool>; // Sector is the starting point of a zoom tube path.
zoomtubeend = <bool>; // Sector is the ending point of a zoom tube path.
finishline = <bool>; // Sector is a Circuit finish line.
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.
damagetype = <integer>; // Damage type for sector damage. Can be:
// - "None"
// - "Generic"
// - "Water"
// - "Fire"
// - "Lava"
// - "Electric"
// - "Spike"
// - "DeathPitTilt"
// - "DeathPitNoTilt"
// - "Instakill"
// - "SpecialStage"
// Default = "None".
triggertag = <integer>; // Tag to trigger when this sector is entered. Default = 0.
triggerer = <string>; // Who can execute the trigger tag when this sector is entered. Can be:
// - "Player"
// - "AllPlayers"
// - "Mobj"
// Default = "Player".
comment = <string>; // A comment. Implementors should attach no special
// semantic meaning to this field.
}
thing
{
id = <integer>; // Thing ID. Default = 0.
moreids = <string>; // Additional thing IDs, specified as a space separated list of numbers (e.g. "2 666 1003 4505")
x = <float>; // X coordinate. No valid default.
y = <float>; // Y coordinate. No valid default.
height = <float>; // Z height relative to floor.
// Relative to ceiling if flip = true.
// Absolute if absolutez = true.
// Default = 0.
angle = <integer>; // Map angle of thing in degrees. Default = 0 (East).
pitch = <integer>; // Pitch of thing in degrees. Default = 0 (horizontal).
roll = <integer>; // Roll of thing in degrees. Default = 0.
scalex = <float>; // Horizontal visual scaling on thing. Default = 1.0.
scaley = <float>; // Vertical visual scaling on thing. Default = 1.0.
scale = <float>; // Vertical and horizontal visual scaling on thing. Default = 1.0.
mobjscale = <float>; // Physical scale of the thing. Default = 1.0.
type = <integer>; // Thing type. No valid default.
flip = <bool>; // Thing spawns flipped, on the ceiling.
absolutez = <bool>; // If true, the thing height is absolute, instead of being relative to the floor or ceiling.
arg0 = <integer>; // Argument 0. Default = 0.
arg1 = <integer>; // Argument 1. Default = 0.
arg2 = <integer>; // Argument 2. Default = 0.
arg3 = <integer>; // Argument 3. Default = 0.
arg4 = <integer>; // Argument 4. Default = 0.
arg5 = <integer>; // Argument 5. Default = 0.
arg6 = <integer>; // Argument 6. Default = 0.
arg7 = <integer>; // Argument 7. Default = 0.
arg8 = <integer>; // Argument 8. Default = 0.
arg9 = <integer>; // Argument 9. Default = 0.
stringarg0 = <string>; // String argument 0.
stringarg1 = <string>; // String argument 1.
comment = <string>; // A comment. Implementors should attach no special
// semantic meaning to this field.
}
=======================================
Changelog
=======================================
1.0: 19.02.2024
Initial version.
===============================================================================
EOF
===============================================================================
\ No newline at end of file
...@@ -41,7 +41,7 @@ linetagindicatesectors = true; ...@@ -41,7 +41,7 @@ linetagindicatesectors = true;
// The format interface handles the map data format - DoomMapSetIO for SRB2DB2, SRB2MapSetIO for Zone Builder // The format interface handles the map data format - DoomMapSetIO for SRB2DB2, SRB2MapSetIO for Zone Builder
formatinterface = "SRB2MapSetIO"; formatinterface = "SRB2MapSetIO";
//Maximum safe map size check (0 means skip check) //Maximum safe map size check (0 means skip check)
safeboundary = 0; safeboundary = 0;
...@@ -502,7 +502,7 @@ gen_sectortypes ...@@ -502,7 +502,7 @@ gen_sectortypes
{ {
0 = "Normal"; 0 = "Normal";
512 = "Wind/Current <deprecated>"; 512 = "Wind/Current <deprecated>";
1024 = "Conveyor Belt <deprecated>"; 1024 = "Conveyor Belt <deprecated>";
1280 = "Speed Pad"; 1280 = "Speed Pad";
1536 = "Flip Gravity on Jump"; 1536 = "Flip Gravity on Jump";
} }
...@@ -3730,7 +3730,7 @@ thingtypes ...@@ -3730,7 +3730,7 @@ thingtypes
3328 = "3D Mode Start"; 3328 = "3D Mode Start";
} }
starts starts
{ {
color = 1; // Blue color = 1; // Blue
......
...@@ -39,8 +39,11 @@ common ...@@ -39,8 +39,11 @@ common
defaulttexturescale = 1.0f; defaulttexturescale = 1.0f;
defaultflatscale = 1.0f; defaultflatscale = 1.0f;
scaledtextureoffsets = true; scaledtextureoffsets = true;
scaledflatoffsets = true;
// Colormap/fade related options
maxcolormapalpha = 25; maxcolormapalpha = 25;
// TODO: change to 255;
// Thing number for start position in 3D Mode // Thing number for start position in 3D Mode
start3dmode = 3328; start3dmode = 3328;
...@@ -93,18 +96,30 @@ mapformat_udmf ...@@ -93,18 +96,30 @@ mapformat_udmf
{ {
include("SRB222_misc.cfg", "universalfields"); include("SRB222_misc.cfg", "universalfields");
} }
// Disable Doom-related modes that don't make sense for SRB2 // Disable Doom-related modes that don't make sense for SRB2
soundsupport = false; soundsupport = false;
automapsupport = false; automapsupport = false;
// When this is set to true, sectors with the same tag will light up when a line is highlighted // When this is set to true, sectors with the same tag will light up when a line is highlighted
linetagindicatesectors = false; linetagindicatesectors = false;
// Enables support for individual offsets of upper/middle/lower sidedef textures
localsidedeftextureoffsets = true; localsidedeftextureoffsets = true;
distinctfloorandceilingbrightness = true;
// Enables support for plane equation slopes
planeequationsupport = true; planeequationsupport = true;
// Enables support for vertex heights
vertexheightsupport = true;
// Enables setting distinct brightness for floor, ceiling, and walls
distinctfloorandceilingbrightness = true;
distinctwallbrightness = true;
// Enables setting distinct brightness for upper, middle, and lower sidedef parts
distinctsidedefpartbrightness = false;
// Special linedefs // Special linedefs
include("SRB222_misc.cfg", "speciallinedefs_udmf"); include("SRB222_misc.cfg", "speciallinedefs_udmf");
...@@ -180,4 +195,4 @@ mapformat_udmf ...@@ -180,4 +195,4 @@ mapformat_udmf
{ {
include("SRB222_linedefs.cfg", "udmf"); include("SRB222_linedefs.cfg", "udmf");
} }
} }
\ No newline at end of file
...@@ -7,13 +7,49 @@ udmf ...@@ -7,13 +7,49 @@ udmf
0 0
{ {
title = "None"; title = "None";
prefix = "(0)"; }
6
{
title = "Sector Set Portal";
arg0
{
title = "Target sector tag";
type = 13;
}
arg1
{
title = "Portal type";
type = 11;
enum
{
0 = "Link to portal with same tag";
1 = "Copy portal from second tag";
2 = "Skybox portal";
3 = "Plane portal";
4 = "Horizon portal";
5 = "Copy portal to line";
6 = "Interactive portal (unimplemented)";
7 = "Link to sector with second tag";
8 = "Link to object with second tag";
}
}
arg2
{
title = "Affected planes";
type = 11;
enum = "floorceiling";
}
arg3
{
title = "Misc";
tooltip = "For type 0 portal: specifies whether the line belongs to the sector viewed\nthrough the portal (1) or the sector in which the portal is seen (0).\nFor type 1 portal: specifies the sector tag of the portal to copy.\nFor type 7 portal: specifies the sector tag to make a portal to.\nFor type 8 portal: specifies the object tag to make a portal to.";
}
} }
7 7
{ {
title = "Sector Flat Alignment"; title = "Sector Flat Alignment";
prefix = "(7)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -31,7 +67,6 @@ udmf ...@@ -31,7 +67,6 @@ udmf
10 10
{ {
title = "Culling Plane"; title = "Culling Plane";
prefix = "(10)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -52,19 +87,17 @@ udmf ...@@ -52,19 +87,17 @@ udmf
40 40
{ {
title = "Visual Portal Between Tagged Linedefs"; title = "Visual Portal Between Tagged Linedefs";
prefix = "(40)";
} }
41 41
{ {
title = "Horizon Effect"; title = "Horizon Effect";
prefix = "(41)"; id = "srb2_horizonline";
} }
63 63
{ {
title = "Fake Floor/Ceiling Planes"; title = "Fake Floor/Ceiling Planes";
prefix = "(63)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -80,7 +113,6 @@ udmf ...@@ -80,7 +113,6 @@ udmf
2 2
{ {
title = "Custom Exit"; title = "Custom Exit";
prefix = "(2)";
arg0 arg0
{ {
title = "Next map"; title = "Next map";
...@@ -104,14 +136,15 @@ udmf ...@@ -104,14 +136,15 @@ udmf
3 3
{ {
title = "Zoom Tube Parameters"; title = "Zoom Tube Parameters";
prefix = "(3)";
arg0 arg0
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg1 arg1
{ {
title = "Sequence"; title = "Waypoint sequence";
tooltip = "The sequence number of (zoom tube) waypoints to use.";
} }
arg2 arg2
{ {
...@@ -124,10 +157,10 @@ udmf ...@@ -124,10 +157,10 @@ udmf
4 4
{ {
title = "Speed Pad Parameters"; title = "Speed Pad Parameters";
prefix = "(4)";
arg0 arg0
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg1 arg1
{ {
...@@ -143,13 +176,13 @@ udmf ...@@ -143,13 +176,13 @@ udmf
{ {
title = "Sound"; title = "Sound";
type = 2; type = 2;
tooltip = "Takes a DS constant.\nExample: DSTHOK";
} }
} }
8 8
{ {
title = "Set Camera Collision Planes"; title = "Set Camera Collision Planes";
prefix = "(8)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -160,14 +193,15 @@ udmf ...@@ -160,14 +193,15 @@ udmf
11 11
{ {
title = "Rope Hang Parameters"; title = "Rope Hang Parameters";
prefix = "(11)";
arg0 arg0
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg1 arg1
{ {
title = "Sequence"; title = "Waypoint sequence";
tooltip = "The sequence number of (zoom tube) waypoints to use.";
} }
arg2 arg2
{ {
...@@ -180,14 +214,13 @@ udmf ...@@ -180,14 +214,13 @@ udmf
14 14
{ {
title = "Bustable Block Parameters"; title = "Bustable Block Parameters";
prefix = "(14)";
arg0 arg0
{ {
title = "Debris spacing"; title = "Debris spacing";
} }
arg1 arg1
{ {
title = "Debris lifetime"; title = "Debris lifetime (tics)";
} }
arg2 arg2
{ {
...@@ -198,6 +231,7 @@ udmf ...@@ -198,6 +231,7 @@ udmf
stringarg0 stringarg0
{ {
title = "Debris object type"; title = "Debris object type";
tooltip = "Uses a MT_ constant.\nExample: MT_ROCKCRUMBLE16\nDefaults to MT_ROCKCRUMBLE1.";
type = 2; type = 2;
} }
} }
...@@ -205,13 +239,11 @@ udmf ...@@ -205,13 +239,11 @@ udmf
15 15
{ {
title = "Fan Particle Generator Heights"; title = "Fan Particle Generator Heights";
prefix = "(15)";
} }
16 16
{ {
title = "Minecart Parameters"; title = "Minecart Parameters";
prefix = "(16)";
arg0 arg0
{ {
title = "Order"; title = "Order";
...@@ -221,7 +253,6 @@ udmf ...@@ -221,7 +253,6 @@ udmf
64 64
{ {
title = "Continuously Appearing/Disappearing FOF"; title = "Continuously Appearing/Disappearing FOF";
prefix = "(64)";
arg0 arg0
{ {
title = "Control linedef tag"; title = "Control linedef tag";
...@@ -259,21 +290,21 @@ udmf ...@@ -259,21 +290,21 @@ udmf
20 20
{ {
title = "First Line"; title = "PolyObject First Line";
prefix = "(20)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
{ {
title = "Parent ID"; title = "Parent PolyObject tag";
type = 14; type = 14;
} }
arg2 arg2
{ {
title = "Translucency"; title = "Translucency level";
tooltip = "Ranges from 0 (fully opaque) to 10 (fully transparent).";
} }
arg3 arg3
{ {
...@@ -299,45 +330,45 @@ udmf ...@@ -299,45 +330,45 @@ udmf
30 30
{ {
title = "Waving Flag"; title = "Waving PolyObject Flag";
prefix = "(30)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
title = "Distance"; title = "Distance";
tooltip = "How far to move in either direction, in fracunits.";
} }
} }
31 31
{ {
title = "Displacement by Front Sector"; title = "Move PolyObject by Front Sector Displacement";
prefix = "(31)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
{ {
title = "Base speed"; title = "Base speed";
tooltip = "How much the front sector displacement translates.\nA value of 256 amounts to a 1:1 translation.";
} }
} }
32 32
{ {
title = "Angular Displacement by Front Sector"; title = "Rotate PolyObject by Front Sector Displacement";
prefix = "(32)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
...@@ -370,10 +401,10 @@ udmf ...@@ -370,10 +401,10 @@ udmf
52 52
{ {
title = "Continuously Falling Sector"; title = "Continuously Falling Sector";
prefix = "(52)";
arg0 arg0
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg1 arg1
{ {
...@@ -390,7 +421,6 @@ udmf ...@@ -390,7 +421,6 @@ udmf
53 53
{ {
title = "Continuous Plane Mover (Slowdown)"; title = "Continuous Plane Mover (Slowdown)";
prefix = "(53)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -405,10 +435,12 @@ udmf ...@@ -405,10 +435,12 @@ udmf
arg2 arg2
{ {
title = "Forward speed"; title = "Forward speed";
tooltip = "In fracunits per tic.";
} }
arg3 arg3
{ {
title = "Return speed"; title = "Return speed";
tooltip = "In fracunits per tic.";
} }
arg4 arg4
{ {
...@@ -423,7 +455,6 @@ udmf ...@@ -423,7 +455,6 @@ udmf
56 56
{ {
title = "Continuous Plane Mover (Constant)"; title = "Continuous Plane Mover (Constant)";
prefix = "(56)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -438,10 +469,12 @@ udmf ...@@ -438,10 +469,12 @@ udmf
arg2 arg2
{ {
title = "Forward speed"; title = "Forward speed";
tooltip = "In fracunits per tic.";
} }
arg3 arg3
{ {
title = "Return speed"; title = "Return speed";
tooltip = "In fracunits per tic.";
} }
arg4 arg4
{ {
...@@ -456,7 +489,6 @@ udmf ...@@ -456,7 +489,6 @@ udmf
60 60
{ {
title = "Activate Moving Platform"; title = "Activate Moving Platform";
prefix = "(60)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -465,10 +497,11 @@ udmf ...@@ -465,10 +497,11 @@ udmf
arg1 arg1
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
title = "Starting delay"; title = "Starting delay (tics)";
} }
arg3 arg3
{ {
...@@ -485,7 +518,6 @@ udmf ...@@ -485,7 +518,6 @@ udmf
61 61
{ {
title = "Ceiling Crusher"; title = "Ceiling Crusher";
prefix = "(61)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -504,17 +536,18 @@ udmf ...@@ -504,17 +536,18 @@ udmf
arg2 arg2
{ {
title = "Crush speed"; title = "Crush speed";
tooltip = "In fracunits per tic.";
} }
arg3 arg3
{ {
title = "Retract speed"; title = "Retract speed";
tooltip = "In fracunits per tic.";
} }
} }
66 66
{ {
title = "Move Planes by Displacement"; title = "Move Planes by Front Sector Displacement";
prefix = "(66)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -541,7 +574,6 @@ udmf ...@@ -541,7 +574,6 @@ udmf
70 70
{ {
title = "Add Raise Thinker"; title = "Add Raise Thinker";
prefix = "(70)";
arg0 arg0
{ {
title = "Control linedef tag"; title = "Control linedef tag";
...@@ -550,6 +582,7 @@ udmf ...@@ -550,6 +582,7 @@ udmf
arg1 arg1
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
...@@ -566,7 +599,6 @@ udmf ...@@ -566,7 +599,6 @@ udmf
71 71
{ {
title = "Add Air Bobbing Thinker"; title = "Add Air Bobbing Thinker";
prefix = "(71)";
arg0 arg0
{ {
title = "Control linedef tag"; title = "Control linedef tag";
...@@ -592,7 +624,6 @@ udmf ...@@ -592,7 +624,6 @@ udmf
72 72
{ {
title = "Add Thwomp Thinker"; title = "Add Thwomp Thinker";
prefix = "(72)";
arg0 arg0
{ {
title = "Control linedef tag"; title = "Control linedef tag";
...@@ -601,14 +632,17 @@ udmf ...@@ -601,14 +632,17 @@ udmf
arg1 arg1
{ {
title = "Falling speed"; title = "Falling speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
title = "Rising speed"; title = "Rising speed";
tooltip = "In fracunits per tic.";
} }
stringarg0 stringarg0
{ {
title = "Crushing sound"; title = "Crushing sound";
tooltip = "Takes a DS constant.\nExample: DSTHOK";
type = 2; type = 2;
} }
} }
...@@ -616,7 +650,6 @@ udmf ...@@ -616,7 +650,6 @@ udmf
73 73
{ {
title = "Add Laser Thinker"; title = "Add Laser Thinker";
prefix = "(73)";
arg0 arg0
{ {
title = "Control linedef tag"; title = "Control linedef tag";
...@@ -633,7 +666,6 @@ udmf ...@@ -633,7 +666,6 @@ udmf
74 74
{ {
title = "Make FOF Bustable"; title = "Make FOF Bustable";
prefix = "(74)";
arg0 arg0
{ {
title = "Control linedef tag"; title = "Control linedef tag";
...@@ -672,7 +704,6 @@ udmf ...@@ -672,7 +704,6 @@ udmf
75 75
{ {
title = "Make FOF Quicksand"; title = "Make FOF Quicksand";
prefix = "(75)";
arg0 arg0
{ {
title = "Control linedef tag"; title = "Control linedef tag";
...@@ -681,6 +712,7 @@ udmf ...@@ -681,6 +712,7 @@ udmf
arg1 arg1
{ {
title = "Sinking speed"; title = "Sinking speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
...@@ -691,7 +723,6 @@ udmf ...@@ -691,7 +723,6 @@ udmf
76 76
{ {
title = "Make FOF Bouncy"; title = "Make FOF Bouncy";
prefix = "(76)";
arg0 arg0
{ {
title = "Control linedef tag"; title = "Control linedef tag";
...@@ -711,7 +742,6 @@ udmf ...@@ -711,7 +742,6 @@ udmf
100 100
{ {
title = "Solid"; title = "Solid";
prefix = "(100)";
id = "srb2_fofsolid"; id = "srb2_fofsolid";
arg0 arg0
{ {
...@@ -722,6 +752,7 @@ udmf ...@@ -722,6 +752,7 @@ udmf
{ {
title = "Alpha"; title = "Alpha";
default = 255; default = 255;
tooltip = "Ranges from 0 (fully transparent) to 255 (fully opaque).";
} }
arg2 arg2
{ {
...@@ -754,7 +785,6 @@ udmf ...@@ -754,7 +785,6 @@ udmf
120 120
{ {
title = "Water"; title = "Water";
prefix = "(120)";
id = "srb2_fofwater"; id = "srb2_fofwater";
arg0 arg0
{ {
...@@ -765,6 +795,7 @@ udmf ...@@ -765,6 +795,7 @@ udmf
{ {
title = "Alpha"; title = "Alpha";
default = 128; default = 128;
tooltip = "Ranges from 0 (fully transparent) to 255 (fully opaque).";
} }
arg2 arg2
{ {
...@@ -791,7 +822,6 @@ udmf ...@@ -791,7 +822,6 @@ udmf
150 150
{ {
title = "Air Bobbing"; title = "Air Bobbing";
prefix = "(150)";
id = "srb2_fofsolidopaque"; id = "srb2_fofsolidopaque";
arg0 arg0
{ {
...@@ -818,7 +848,6 @@ udmf ...@@ -818,7 +848,6 @@ udmf
160 160
{ {
title = "Water Bobbing"; title = "Water Bobbing";
prefix = "(160)";
id = "srb2_fofsolidopaque"; id = "srb2_fofsolidopaque";
arg0 arg0
{ {
...@@ -830,7 +859,6 @@ udmf ...@@ -830,7 +859,6 @@ udmf
170 170
{ {
title = "Crumbling"; title = "Crumbling";
prefix = "(170)";
id = "srb2_fofcrumbling"; id = "srb2_fofcrumbling";
arg0 arg0
{ {
...@@ -841,6 +869,7 @@ udmf ...@@ -841,6 +869,7 @@ udmf
{ {
title = "Alpha"; title = "Alpha";
default = 255; default = 255;
tooltip = "Ranges from 0 (fully transparent) to 255 (fully opaque).";
} }
arg2 arg2
{ {
...@@ -868,11 +897,10 @@ udmf ...@@ -868,11 +897,10 @@ udmf
} }
} }
} }
190 190
{ {
title = "Rising"; title = "Rising";
prefix = "(190)";
id = "srb2_fofsolid"; id = "srb2_fofsolid";
arg0 arg0
{ {
...@@ -883,6 +911,7 @@ udmf ...@@ -883,6 +911,7 @@ udmf
{ {
title = "Alpha"; title = "Alpha";
default = 255; default = 255;
tooltip = "Ranges from 0 (fully transparent) to 255 (fully opaque).";
} }
arg2 arg2
{ {
...@@ -913,6 +942,7 @@ udmf ...@@ -913,6 +942,7 @@ udmf
arg5 arg5
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg6 arg6
{ {
...@@ -929,7 +959,6 @@ udmf ...@@ -929,7 +959,6 @@ udmf
200 200
{ {
title = "Light Block"; title = "Light Block";
prefix = "(200)";
id = "srb2_foflight"; id = "srb2_foflight";
arg0 arg0
{ {
...@@ -947,7 +976,6 @@ udmf ...@@ -947,7 +976,6 @@ udmf
202 202
{ {
title = "Fog Block"; title = "Fog Block";
prefix = "(202)";
id = "srb2_foffog"; id = "srb2_foffog";
arg0 arg0
{ {
...@@ -959,7 +987,6 @@ udmf ...@@ -959,7 +987,6 @@ udmf
220 220
{ {
title = "Intangible"; title = "Intangible";
prefix = "(220)";
id = "srb2_fofintangible"; id = "srb2_fofintangible";
arg0 arg0
{ {
...@@ -970,6 +997,7 @@ udmf ...@@ -970,6 +997,7 @@ udmf
{ {
title = "Alpha"; title = "Alpha";
default = 255; default = 255;
tooltip = "Ranges from 0 (fully transparent) to 255 (fully opaque).";
} }
arg2 arg2
{ {
...@@ -996,7 +1024,6 @@ udmf ...@@ -996,7 +1024,6 @@ udmf
223 223
{ {
title = "Intangible, Invisible"; title = "Intangible, Invisible";
prefix = "(223)";
id = "srb2_fofintangibleinvisible"; id = "srb2_fofintangibleinvisible";
arg0 arg0
{ {
...@@ -1008,7 +1035,6 @@ udmf ...@@ -1008,7 +1035,6 @@ udmf
250 250
{ {
title = "Mario Block"; title = "Mario Block";
prefix = "(250)";
id = "srb2_fofsolidopaque"; id = "srb2_fofsolidopaque";
arg0 arg0
{ {
...@@ -1030,7 +1056,6 @@ udmf ...@@ -1030,7 +1056,6 @@ udmf
251 251
{ {
title = "Thwomp Block"; title = "Thwomp Block";
prefix = "(251)";
id = "srb2_fofsolidopaque"; id = "srb2_fofsolidopaque";
arg0 arg0
{ {
...@@ -1040,14 +1065,17 @@ udmf ...@@ -1040,14 +1065,17 @@ udmf
arg1 arg1
{ {
title = "Falling speed"; title = "Falling speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
title = "Rising speed"; title = "Rising speed";
tooltip = "In fracunits per tic.";
} }
stringarg0 stringarg0
{ {
title = "Crushing sound"; title = "Crushing sound";
tooltip = "Takes a DS constant.\nExample: DSTHOK";
type = 2; type = 2;
} }
} }
...@@ -1055,7 +1083,6 @@ udmf ...@@ -1055,7 +1083,6 @@ udmf
254 254
{ {
title = "Bustable Block"; title = "Bustable Block";
prefix = "(254)";
id = "srb2_fofbustable"; id = "srb2_fofbustable";
arg0 arg0
{ {
...@@ -1066,6 +1093,7 @@ udmf ...@@ -1066,6 +1093,7 @@ udmf
{ {
title = "Alpha"; title = "Alpha";
default = 255; default = 255;
tooltip = "Ranges from 0 (fully transparent) to 255 (fully opaque).";
} }
arg2 arg2
{ {
...@@ -1107,7 +1135,6 @@ udmf ...@@ -1107,7 +1135,6 @@ udmf
257 257
{ {
title = "Quicksand"; title = "Quicksand";
prefix = "(257)";
id = "srb2_fofsolidopaque"; id = "srb2_fofsolidopaque";
arg0 arg0
{ {
...@@ -1123,6 +1150,7 @@ udmf ...@@ -1123,6 +1150,7 @@ udmf
arg2 arg2
{ {
title = "Sinking speed"; title = "Sinking speed";
tooltip = "In fracunits per tic.";
} }
arg3 arg3
{ {
...@@ -1133,7 +1161,6 @@ udmf ...@@ -1133,7 +1161,6 @@ udmf
258 258
{ {
title = "Laser"; title = "Laser";
prefix = "(258)";
id = "srb2_foflaser"; id = "srb2_foflaser";
arg0 arg0
{ {
...@@ -1144,6 +1171,7 @@ udmf ...@@ -1144,6 +1171,7 @@ udmf
{ {
title = "Alpha"; title = "Alpha";
default = 128; default = 128;
tooltip = "Ranges from 0 (fully transparent) to 255 (fully opaque).";
} }
arg2 arg2
{ {
...@@ -1166,7 +1194,6 @@ udmf ...@@ -1166,7 +1194,6 @@ udmf
259 259
{ {
title = "Custom"; title = "Custom";
prefix = "(259)";
id = "srb2_fofcustom"; id = "srb2_fofcustom";
arg0 arg0
{ {
...@@ -1177,6 +1204,7 @@ udmf ...@@ -1177,6 +1204,7 @@ udmf
{ {
title = "Alpha"; title = "Alpha";
default = 255; default = 255;
tooltip = "Ranges from 0 (fully transparent) to 255 (fully opaque).";
} }
arg2 arg2
{ {
...@@ -1230,7 +1258,6 @@ udmf ...@@ -1230,7 +1258,6 @@ udmf
300 300
{ {
title = "Basic"; title = "Basic";
prefix = "(300)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1242,7 +1269,6 @@ udmf ...@@ -1242,7 +1269,6 @@ udmf
303 303
{ {
title = "Ring Count"; title = "Ring Count";
prefix = "(303)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1270,7 +1296,6 @@ udmf ...@@ -1270,7 +1296,6 @@ udmf
305 305
{ {
title = "Character Ability"; title = "Character Ability";
prefix = "(305)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1306,7 +1331,6 @@ udmf ...@@ -1306,7 +1331,6 @@ udmf
308 308
{ {
title = "Gametype"; title = "Gametype";
prefix = "(308)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1364,7 +1388,6 @@ udmf ...@@ -1364,7 +1388,6 @@ udmf
309 309
{ {
title = "CTF Team"; title = "CTF Team";
prefix = "(309)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1382,7 +1405,6 @@ udmf ...@@ -1382,7 +1405,6 @@ udmf
313 313
{ {
title = "No More Enemies"; title = "No More Enemies";
prefix = "(313)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -1393,7 +1415,6 @@ udmf ...@@ -1393,7 +1415,6 @@ udmf
314 314
{ {
title = "Number of Pushables"; title = "Number of Pushables";
prefix = "(314)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1415,7 +1436,6 @@ udmf ...@@ -1415,7 +1436,6 @@ udmf
317 317
{ {
title = "Condition Set Trigger"; title = "Condition Set Trigger";
prefix = "(317)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1431,7 +1451,6 @@ udmf ...@@ -1431,7 +1451,6 @@ udmf
319 319
{ {
title = "Unlockable"; title = "Unlockable";
prefix = "(319)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1447,7 +1466,6 @@ udmf ...@@ -1447,7 +1466,6 @@ udmf
321 321
{ {
title = "Trigger After X Calls"; title = "Trigger After X Calls";
prefix = "(321)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1473,7 +1491,6 @@ udmf ...@@ -1473,7 +1491,6 @@ udmf
323 323
{ {
title = "NiGHTSerize"; title = "NiGHTSerize";
prefix = "(323)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1540,7 +1557,6 @@ udmf ...@@ -1540,7 +1557,6 @@ udmf
325 325
{ {
title = "De-NiGHTSerize"; title = "De-NiGHTSerize";
prefix = "(325)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1603,7 +1619,6 @@ udmf ...@@ -1603,7 +1619,6 @@ udmf
327 327
{ {
title = "NiGHTS Lap"; title = "NiGHTS Lap";
prefix = "(327)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1655,7 +1670,6 @@ udmf ...@@ -1655,7 +1670,6 @@ udmf
329 329
{ {
title = "Ideya Capture Touch"; title = "Ideya Capture Touch";
prefix = "(329)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1723,7 +1737,6 @@ udmf ...@@ -1723,7 +1737,6 @@ udmf
331 331
{ {
title = "Player Skin"; title = "Player Skin";
prefix = "(331)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1746,7 +1759,6 @@ udmf ...@@ -1746,7 +1759,6 @@ udmf
334 334
{ {
title = "Object Dye"; title = "Object Dye";
prefix = "(334)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1769,7 +1781,6 @@ udmf ...@@ -1769,7 +1781,6 @@ udmf
337 337
{ {
title = "Emerald Check"; title = "Emerald Check";
prefix = "(337)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1802,7 +1813,6 @@ udmf ...@@ -1802,7 +1813,6 @@ udmf
340 340
{ {
title = "NiGHTS Mare"; title = "NiGHTS Mare";
prefix = "(340)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1824,7 +1834,6 @@ udmf ...@@ -1824,7 +1834,6 @@ udmf
343 343
{ {
title = "Gravity Check"; title = "Gravity Check";
prefix = "(343)";
arg0 arg0
{ {
title = "Trigger type"; title = "Trigger type";
...@@ -1847,7 +1856,6 @@ udmf ...@@ -1847,7 +1856,6 @@ udmf
399 399
{ {
title = "Level Load"; title = "Level Load";
prefix = "(399)";
} }
} }
...@@ -1858,7 +1866,6 @@ udmf ...@@ -1858,7 +1866,6 @@ udmf
400 400
{ {
title = "Set Tagged Sector's Heights/Textures"; title = "Set Tagged Sector's Heights/Textures";
prefix = "(400)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -1881,7 +1888,6 @@ udmf ...@@ -1881,7 +1888,6 @@ udmf
402 402
{ {
title = "Copy Light Level to Tagged Sectors"; title = "Copy Light Level to Tagged Sectors";
prefix = "(402)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -1903,7 +1909,6 @@ udmf ...@@ -1903,7 +1909,6 @@ udmf
408 408
{ {
title = "Set Tagged Sector's Flats"; title = "Set Tagged Sector's Flats";
prefix = "(408)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -1920,7 +1925,6 @@ udmf ...@@ -1920,7 +1925,6 @@ udmf
409 409
{ {
title = "Change Tagged Sector's Tag"; title = "Change Tagged Sector's Tag";
prefix = "(409)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -1948,7 +1952,6 @@ udmf ...@@ -1948,7 +1952,6 @@ udmf
410 410
{ {
title = "Change Front Sector's Tag"; title = "Change Front Sector's Tag";
prefix = "(410)";
arg0 arg0
{ {
title = "Tag"; title = "Tag";
...@@ -1971,7 +1974,6 @@ udmf ...@@ -1971,7 +1974,6 @@ udmf
416 416
{ {
title = "Start Adjustable Flickering Light"; title = "Start Adjustable Flickering Light";
prefix = "(416)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2000,7 +2002,6 @@ udmf ...@@ -2000,7 +2002,6 @@ udmf
417 417
{ {
title = "Start Adjustable Pulsating Light"; title = "Start Adjustable Pulsating Light";
prefix = "(417)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2029,7 +2030,6 @@ udmf ...@@ -2029,7 +2030,6 @@ udmf
418 418
{ {
title = "Start Adjustable Blinking Light"; title = "Start Adjustable Blinking Light";
prefix = "(418)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2066,7 +2066,6 @@ udmf ...@@ -2066,7 +2066,6 @@ udmf
420 420
{ {
title = "Fade Light Level"; title = "Fade Light Level";
prefix = "(420)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2096,7 +2095,6 @@ udmf ...@@ -2096,7 +2095,6 @@ udmf
421 421
{ {
title = "Stop Lighting Effect"; title = "Stop Lighting Effect";
prefix = "(421)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2107,7 +2105,6 @@ udmf ...@@ -2107,7 +2105,6 @@ udmf
435 435
{ {
title = "Change Plane Scroller Direction"; title = "Change Plane Scroller Direction";
prefix = "(435)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2116,13 +2113,13 @@ udmf ...@@ -2116,13 +2113,13 @@ udmf
arg1 arg1
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
} }
467 467
{ {
title = "Set Tagged Sector's Light Level"; title = "Set Tagged Sector's Light Level";
prefix = "(467)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2154,7 +2151,6 @@ udmf ...@@ -2154,7 +2151,6 @@ udmf
469 469
{ {
title = "Change Tagged Sector's Gravity"; title = "Change Tagged Sector's Gravity";
prefix = "(469)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2206,7 +2202,6 @@ udmf ...@@ -2206,7 +2202,6 @@ udmf
403 403
{ {
title = "Move Tagged Sector's Planes"; title = "Move Tagged Sector's Planes";
prefix = "(403)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2221,6 +2216,7 @@ udmf ...@@ -2221,6 +2216,7 @@ udmf
arg2 arg2
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg3 arg3
{ {
...@@ -2237,8 +2233,7 @@ udmf ...@@ -2237,8 +2233,7 @@ udmf
405 405
{ {
title = "Move Planes by Distance"; title = "Move Planes by Set Distance";
prefix = "(405)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2257,6 +2252,7 @@ udmf ...@@ -2257,6 +2252,7 @@ udmf
arg3 arg3
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg4 arg4
{ {
...@@ -2269,7 +2265,6 @@ udmf ...@@ -2269,7 +2265,6 @@ udmf
411 411
{ {
title = "Stop Plane Movement"; title = "Stop Plane Movement";
prefix = "(411)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2280,7 +2275,6 @@ udmf ...@@ -2280,7 +2275,6 @@ udmf
428 428
{ {
title = "Start Platform Movement"; title = "Start Platform Movement";
prefix = "(428)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2289,14 +2283,15 @@ udmf ...@@ -2289,14 +2283,15 @@ udmf
arg1 arg1
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
title = "Starting delay"; title = "Starting delay (tics)";
} }
arg3 arg3
{ {
title = "Delay before flip"; title = "Delay before flip (tics)";
} }
arg4 arg4
{ {
...@@ -2313,7 +2308,6 @@ udmf ...@@ -2313,7 +2308,6 @@ udmf
429 429
{ {
title = "Crush Planes Once"; title = "Crush Planes Once";
prefix = "(429)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2328,10 +2322,12 @@ udmf ...@@ -2328,10 +2322,12 @@ udmf
arg2 arg2
{ {
title = "Crush speed"; title = "Crush speed";
tooltip = "In fracunits per tic.";
} }
arg3 arg3
{ {
title = "Retract speed"; title = "Retract speed";
tooltip = "In fracunits per tic.";
} }
} }
} }
...@@ -2343,10 +2339,9 @@ udmf ...@@ -2343,10 +2339,9 @@ udmf
412 412
{ {
title = "Teleporter"; title = "Teleporter";
prefix = "(412)";
arg0 arg0
{ {
title = "Destination tag"; title = "Destination thing tag";
type = 14; type = 14;
} }
arg1 arg1
...@@ -2378,7 +2373,6 @@ udmf ...@@ -2378,7 +2373,6 @@ udmf
425 425
{ {
title = "Change Object State"; title = "Change Object State";
prefix = "(425)";
stringarg0 stringarg0
{ {
title = "State"; title = "State";
...@@ -2389,7 +2383,6 @@ udmf ...@@ -2389,7 +2383,6 @@ udmf
426 426
{ {
title = "Stop Object"; title = "Stop Object";
prefix = "(426)";
arg0 arg0
{ {
title = "Move to center?"; title = "Move to center?";
...@@ -2401,7 +2394,6 @@ udmf ...@@ -2401,7 +2394,6 @@ udmf
427 427
{ {
title = "Award Score"; title = "Award Score";
prefix = "(427)";
arg0 arg0
{ {
title = "Score"; title = "Score";
...@@ -2411,7 +2403,6 @@ udmf ...@@ -2411,7 +2403,6 @@ udmf
432 432
{ {
title = "Enable/Disable 2D Mode"; title = "Enable/Disable 2D Mode";
prefix = "(432)";
arg0 arg0
{ {
title = "Mode"; title = "Mode";
...@@ -2427,7 +2418,6 @@ udmf ...@@ -2427,7 +2418,6 @@ udmf
433 433
{ {
title = "Enable/Disable Gravity Flip"; title = "Enable/Disable Gravity Flip";
prefix = "(433)";
arg0 arg0
{ {
title = "Set gravity"; title = "Set gravity";
...@@ -2463,7 +2453,6 @@ udmf ...@@ -2463,7 +2453,6 @@ udmf
434 434
{ {
title = "Award Power-Up"; title = "Award Power-Up";
prefix = "(434)";
stringarg0 stringarg0
{ {
title = "Power"; title = "Power";
...@@ -2479,7 +2468,6 @@ udmf ...@@ -2479,7 +2468,6 @@ udmf
437 437
{ {
title = "Disable Player Control"; title = "Disable Player Control";
prefix = "(437)";
arg0 arg0
{ {
title = "Time"; title = "Time";
...@@ -2495,7 +2483,6 @@ udmf ...@@ -2495,7 +2483,6 @@ udmf
438 438
{ {
title = "Change Object Size"; title = "Change Object Size";
prefix = "(438)";
arg0 arg0
{ {
title = "Size (%)"; title = "Size (%)";
...@@ -2506,7 +2493,6 @@ udmf ...@@ -2506,7 +2493,6 @@ udmf
442 442
{ {
title = "Change Object Type State"; title = "Change Object Type State";
prefix = "(442)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2537,7 +2523,6 @@ udmf ...@@ -2537,7 +2523,6 @@ udmf
457 457
{ {
title = "Track Object's Angle"; title = "Track Object's Angle";
prefix = "(457)";
arg0 arg0
{ {
title = "Anchor tag"; title = "Anchor tag";
...@@ -2568,13 +2553,11 @@ udmf ...@@ -2568,13 +2553,11 @@ udmf
458 458
{ {
title = "Stop Tracking Object's Angle"; title = "Stop Tracking Object's Angle";
prefix = "(458)";
} }
460 460
{ {
title = "Award Rings"; title = "Award Rings";
prefix = "(460)";
arg0 arg0
{ {
title = "Rings"; title = "Rings";
...@@ -2588,7 +2571,6 @@ udmf ...@@ -2588,7 +2571,6 @@ udmf
461 461
{ {
title = "Spawn Object"; title = "Spawn Object";
prefix = "(461)";
arg0 arg0
{ {
title = "X position"; title = "X position";
...@@ -2634,13 +2616,11 @@ udmf ...@@ -2634,13 +2616,11 @@ udmf
462 462
{ {
title = "Stop Timer/Exit Stage in Record Attack"; title = "Stop Timer/Exit Stage in Record Attack";
prefix = "(462)";
} }
463 463
{ {
title = "Dye Object"; title = "Dye Object";
prefix = "(463)";
stringarg0 stringarg0
{ {
title = "Skin color"; title = "Skin color";
...@@ -2651,7 +2631,6 @@ udmf ...@@ -2651,7 +2631,6 @@ udmf
464 464
{ {
title = "Trigger Egg Capsule"; title = "Trigger Egg Capsule";
prefix = "(464)";
arg0 arg0
{ {
title = "Egg Capsule tag"; title = "Egg Capsule tag";
...@@ -2668,7 +2647,6 @@ udmf ...@@ -2668,7 +2647,6 @@ udmf
466 466
{ {
title = "Set Level Failure State"; title = "Set Level Failure State";
prefix = "(466)";
arg0 arg0
{ {
title = "State"; title = "State";
...@@ -2689,7 +2667,6 @@ udmf ...@@ -2689,7 +2667,6 @@ udmf
413 413
{ {
title = "Change Music"; title = "Change Music";
prefix = "(413)";
arg0 arg0
{ {
title = "Flags"; title = "Flags";
...@@ -2732,6 +2709,7 @@ udmf ...@@ -2732,6 +2709,7 @@ udmf
stringarg0 stringarg0
{ {
title = "Music name"; title = "Music name";
tooltip = "Takes a music lump name, without the O_ or D_ prefix. Use - to disable music.\nExample: GFZ1";
type = 2; type = 2;
} }
} }
...@@ -2739,7 +2717,6 @@ udmf ...@@ -2739,7 +2717,6 @@ udmf
414 414
{ {
title = "Play Sound Effect"; title = "Play Sound Effect";
prefix = "(414)";
arg0 arg0
{ {
title = "Source"; title = "Source";
...@@ -2771,6 +2748,7 @@ udmf ...@@ -2771,6 +2748,7 @@ udmf
stringarg0 stringarg0
{ {
title = "Sound name"; title = "Sound name";
tooltip = "Takes a DS constant.\nExample: DSTHOK";
type = 2; type = 2;
} }
} }
...@@ -2778,7 +2756,6 @@ udmf ...@@ -2778,7 +2756,6 @@ udmf
415 415
{ {
title = "Run Script"; title = "Run Script";
prefix = "(415)";
stringarg0 stringarg0
{ {
title = "Lump name"; title = "Lump name";
...@@ -2789,7 +2766,6 @@ udmf ...@@ -2789,7 +2766,6 @@ udmf
422 422
{ {
title = "Switch to Cut-Away View"; title = "Switch to Cut-Away View";
prefix = "(422)";
arg0 arg0
{ {
title = "Viewpoint tag"; title = "Viewpoint tag";
...@@ -2804,7 +2780,6 @@ udmf ...@@ -2804,7 +2780,6 @@ udmf
423 423
{ {
title = "Change Sky"; title = "Change Sky";
prefix = "(423)";
arg0 arg0
{ {
title = "Sky number"; title = "Sky number";
...@@ -2820,7 +2795,6 @@ udmf ...@@ -2820,7 +2795,6 @@ udmf
424 424
{ {
title = "Change Weather"; title = "Change Weather";
prefix = "(424)";
arg0 arg0
{ {
title = "Weather"; title = "Weather";
...@@ -2847,7 +2821,6 @@ udmf ...@@ -2847,7 +2821,6 @@ udmf
436 436
{ {
title = "Shatter FOF"; title = "Shatter FOF";
prefix = "(436)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2863,7 +2836,6 @@ udmf ...@@ -2863,7 +2836,6 @@ udmf
439 439
{ {
title = "Change Tagged Linedef's Textures"; title = "Change Tagged Linedef's Textures";
prefix = "(439)";
arg0 arg0
{ {
title = "Target linedef tag"; title = "Target linedef tag";
...@@ -2892,13 +2864,11 @@ udmf ...@@ -2892,13 +2864,11 @@ udmf
440 440
{ {
title = "Start Metal Sonic Race"; title = "Start Metal Sonic Race";
prefix = "(440)";
} }
441 441
{ {
title = "Condition Set Trigger"; title = "Condition Set Trigger";
prefix = "(441)";
arg0 arg0
{ {
title = "Trigger number"; title = "Trigger number";
...@@ -2908,7 +2878,6 @@ udmf ...@@ -2908,7 +2878,6 @@ udmf
443 443
{ {
title = "Call Lua Function"; title = "Call Lua Function";
prefix = "(443)";
stringarg0 stringarg0
{ {
title = "Function name"; title = "Function name";
...@@ -2919,7 +2888,6 @@ udmf ...@@ -2919,7 +2888,6 @@ udmf
444 444
{ {
title = "Earthquake"; title = "Earthquake";
prefix = "(444)";
arg0 arg0
{ {
title = "Duration"; title = "Duration";
...@@ -2933,7 +2901,6 @@ udmf ...@@ -2933,7 +2901,6 @@ udmf
445 445
{ {
title = "Make FOF Disappear/Reappear"; title = "Make FOF Disappear/Reappear";
prefix = "(445)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2959,7 +2926,6 @@ udmf ...@@ -2959,7 +2926,6 @@ udmf
446 446
{ {
title = "Make FOF Crumble"; title = "Make FOF Crumble";
prefix = "(446)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -2987,7 +2953,6 @@ udmf ...@@ -2987,7 +2953,6 @@ udmf
447 447
{ {
title = "Change Tagged Sector's Colormap"; title = "Change Tagged Sector's Colormap";
prefix = "(447)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3023,14 +2988,13 @@ udmf ...@@ -3023,14 +2988,13 @@ udmf
448 448
{ {
title = "Change Skybox"; title = "Change Skybox";
prefix = "(448)";
arg0 arg0
{ {
title = "Viewpoint ID"; title = "Viewpoint thing tag";
} }
arg1 arg1
{ {
title = "Centerpoint ID"; title = "Centerpoint thing tag";
} }
arg2 arg2
{ {
...@@ -3054,7 +3018,6 @@ udmf ...@@ -3054,7 +3018,6 @@ udmf
449 449
{ {
title = "Enable Bosses with Parameter"; title = "Enable Bosses with Parameter";
prefix = "(449)";
arg0 arg0
{ {
title = "Boss ID"; title = "Boss ID";
...@@ -3074,7 +3037,6 @@ udmf ...@@ -3074,7 +3037,6 @@ udmf
450 450
{ {
title = "Execute Linedef Executor (specific tag)"; title = "Execute Linedef Executor (specific tag)";
prefix = "(450)";
arg0 arg0
{ {
title = "Trigger linedef tag"; title = "Trigger linedef tag";
...@@ -3085,7 +3047,6 @@ udmf ...@@ -3085,7 +3047,6 @@ udmf
451 451
{ {
title = "Execute Linedef Executor (random tag in range)"; title = "Execute Linedef Executor (random tag in range)";
prefix = "(451)";
arg0 arg0
{ {
title = "Start of tag range"; title = "Start of tag range";
...@@ -3101,7 +3062,6 @@ udmf ...@@ -3101,7 +3062,6 @@ udmf
452 452
{ {
title = "Set FOF Translucency"; title = "Set FOF Translucency";
prefix = "(452)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3115,6 +3075,7 @@ udmf ...@@ -3115,6 +3075,7 @@ udmf
arg2 arg2
{ {
title = "Alpha"; title = "Alpha";
tooltip = "Ranges from 0 (fully transparent) to 255 (fully opaque).";
} }
arg3 arg3
{ {
...@@ -3131,7 +3092,6 @@ udmf ...@@ -3131,7 +3092,6 @@ udmf
453 453
{ {
title = "Fade FOF"; title = "Fade FOF";
prefix = "(453)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3145,10 +3105,11 @@ udmf ...@@ -3145,10 +3105,11 @@ udmf
arg2 arg2
{ {
title = "Alpha"; title = "Alpha";
tooltip = "Ranges from 0 (fully transparent) to 255 (fully opaque).";
} }
arg3 arg3
{ {
title = "Fading speed"; title = "Fading speed (tics)";
} }
arg4 arg4
{ {
...@@ -3173,7 +3134,6 @@ udmf ...@@ -3173,7 +3134,6 @@ udmf
454 454
{ {
title = "Stop Fading FOF"; title = "Stop Fading FOF";
prefix = "(454)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3195,7 +3155,6 @@ udmf ...@@ -3195,7 +3155,6 @@ udmf
455 455
{ {
title = "Fade Tagged Sector's Colormap"; title = "Fade Tagged Sector's Colormap";
prefix = "(455)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3237,7 +3196,6 @@ udmf ...@@ -3237,7 +3196,6 @@ udmf
456 456
{ {
title = "Stop Fading Tagged Sector's Colormap"; title = "Stop Fading Tagged Sector's Colormap";
prefix = "(456)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3248,7 +3206,6 @@ udmf ...@@ -3248,7 +3206,6 @@ udmf
459 459
{ {
title = "Control Text Prompt"; title = "Control Text Prompt";
prefix = "(459)";
arg0 arg0
{ {
title = "Prompt number"; title = "Prompt number";
...@@ -3284,7 +3241,6 @@ udmf ...@@ -3284,7 +3241,6 @@ udmf
465 465
{ {
title = "Set Linedef Executor Delay"; title = "Set Linedef Executor Delay";
prefix = "(465)";
arg0 arg0
{ {
title = "Linedef tag"; title = "Linedef tag";
...@@ -3305,7 +3261,6 @@ udmf ...@@ -3305,7 +3261,6 @@ udmf
468 468
{ {
title = "Change Linedef Argument"; title = "Change Linedef Argument";
prefix = "(468)";
arg0 arg0
{ {
title = "Linedef tag"; title = "Linedef tag";
...@@ -3334,16 +3289,16 @@ udmf ...@@ -3334,16 +3289,16 @@ udmf
480 480
{ {
title = "Door Slide"; title = "PolyObject Door Slide";
prefix = "(480)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
...@@ -3351,22 +3306,22 @@ udmf ...@@ -3351,22 +3306,22 @@ udmf
} }
arg3 arg3
{ {
title = "Return delay"; title = "Return delay (tics)";
} }
} }
481 481
{ {
title = "Door Swing"; title = "PolyObject Door Swing";
prefix = "(481)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
...@@ -3375,22 +3330,22 @@ udmf ...@@ -3375,22 +3330,22 @@ udmf
} }
arg3 arg3
{ {
title = "Return delay"; title = "Return delay (tics)";
} }
} }
482 482
{ {
title = "Move"; title = "Move PolyObject";
prefix = "(482)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
...@@ -3406,20 +3361,21 @@ udmf ...@@ -3406,20 +3361,21 @@ udmf
484 484
{ {
title = "Rotate"; title = "Rotate PolyObject";
prefix = "(484)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
{ {
title = "Speed"; title = "Speed";
tooltip = "In degrees per tic.";
} }
arg2 arg2
{ {
title = "Rotation"; title = "Rotation";
tooltip = "How many degrees the PolyObject will rotate.";
type = 8; type = 8;
} }
arg3 arg3
...@@ -3438,20 +3394,21 @@ udmf ...@@ -3438,20 +3394,21 @@ udmf
488 488
{ {
title = "Move by Waypoints"; title = "Move PolyObject by Waypoints";
prefix = "(488)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
{ {
title = "Speed"; title = "Speed";
tooltip = "In fracunits per tic.";
} }
arg2 arg2
{ {
title = "Waypoint sequence"; title = "Waypoint sequence";
tooltip = "The sequence number of (zoom tube) waypoints to use.";
} }
arg3 arg3
{ {
...@@ -3478,11 +3435,10 @@ udmf ...@@ -3478,11 +3435,10 @@ udmf
489 489
{ {
title = "Set Visibility, Tangibility"; title = "Set PolyObject Visibility/Tangibility";
prefix = "(489)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
...@@ -3511,16 +3467,16 @@ udmf ...@@ -3511,16 +3467,16 @@ udmf
491 491
{ {
title = "Set Translucency"; title = "Set PolyObject Translucency";
prefix = "(491)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
{ {
title = "Translucency level"; title = "Translucency level";
tooltip = "Ranges from 0 (fully opaque) to 10 (fully transparent).";
} }
arg2 arg2
{ {
...@@ -3532,16 +3488,16 @@ udmf ...@@ -3532,16 +3488,16 @@ udmf
492 492
{ {
title = "Fade Translucency"; title = "Fade PolyObject Translucency";
prefix = "(492)";
arg0 arg0
{ {
title = "PolyObject ID"; title = "PolyObject tag";
type = 14; type = 14;
} }
arg1 arg1
{ {
title = "Translucency level"; title = "Translucency level";
tooltip = "Ranges from 0 (fully opaque) to 10 (fully transparent).";
} }
arg2 arg2
{ {
...@@ -3569,8 +3525,7 @@ udmf ...@@ -3569,8 +3525,7 @@ udmf
500 500
{ {
title = "Scroll Walls"; title = "Scroll Wall";
prefix = "(500)";
arg0 arg0
{ {
title = "Side"; title = "Side";
...@@ -3589,8 +3544,7 @@ udmf ...@@ -3589,8 +3544,7 @@ udmf
502 502
{ {
title = "Scroll Walls Remotely"; title = "Scroll Tagged Walls";
prefix = "(502)";
arg0 arg0
{ {
title = "Linedef tag"; title = "Linedef tag";
...@@ -3621,11 +3575,11 @@ udmf ...@@ -3621,11 +3575,11 @@ udmf
510 510
{ {
title = "Scroll Planes"; title = "Scroll Planes";
prefix = "(510)";
arg0 arg0
{ {
title = "Sector tag"; title = "Sector tag";
type = 13; type = 13;
tooltip = "A tag of 0 will scroll the planes of this line's front sector.";
} }
arg1 arg1
{ {
...@@ -3658,11 +3612,11 @@ udmf ...@@ -3658,11 +3612,11 @@ udmf
541 541
{ {
title = "Wind/Current"; title = "Wind/Current";
prefix = "(541)";
arg0 arg0
{ {
title = "Sector tag"; title = "Sector tag";
type = 13; type = 13;
tooltip = "A tag of 0 will apply the effect to this line's front sector.";
} }
arg1 arg1
{ {
...@@ -3686,7 +3640,7 @@ udmf ...@@ -3686,7 +3640,7 @@ udmf
{ {
title = "Flags"; title = "Flags";
type = 12; type = 12;
flags enum
{ {
1 = "Slide"; 1 = "Slide";
2 = "Non-exclusive"; 2 = "Non-exclusive";
...@@ -3702,7 +3656,6 @@ udmf ...@@ -3702,7 +3656,6 @@ udmf
600 600
{ {
title = "Copy Light Level to Tagged Sector's Planes"; title = "Copy Light Level to Tagged Sector's Planes";
prefix = "(600)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3719,7 +3672,6 @@ udmf ...@@ -3719,7 +3672,6 @@ udmf
602 602
{ {
title = "Adjustable Pulsating Light"; title = "Adjustable Pulsating Light";
prefix = "(602)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3748,7 +3700,6 @@ udmf ...@@ -3748,7 +3700,6 @@ udmf
603 603
{ {
title = "Adjustable Flickering Light"; title = "Adjustable Flickering Light";
prefix = "(603)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3777,7 +3728,6 @@ udmf ...@@ -3777,7 +3728,6 @@ udmf
604 604
{ {
title = "Adjustable Blinking Light"; title = "Adjustable Blinking Light";
prefix = "(604)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3814,7 +3764,6 @@ udmf ...@@ -3814,7 +3764,6 @@ udmf
606 606
{ {
title = "Copy Colormap"; title = "Copy Colormap";
prefix = "(606)";
arg0 arg0
{ {
title = "Target sector tag"; title = "Target sector tag";
...@@ -3835,7 +3784,6 @@ udmf ...@@ -3835,7 +3784,6 @@ udmf
700 700
{ {
title = "Create Sector-Based Slope"; title = "Create Sector-Based Slope";
prefix = "(700)";
id = "plane_align"; id = "plane_align";
arg0 arg0
{ {
...@@ -3865,7 +3813,6 @@ udmf ...@@ -3865,7 +3813,6 @@ udmf
704 704
{ {
title = "Create Vertex-Based Slope"; title = "Create Vertex-Based Slope";
prefix = "(704)";
id = "srb2_vertexslope"; id = "srb2_vertexslope";
arg0 arg0
{ {
...@@ -3909,7 +3856,6 @@ udmf ...@@ -3909,7 +3856,6 @@ udmf
720 720
{ {
title = "Copy Slope"; title = "Copy Slope";
prefix = "(720)";
id = "plane_copy"; id = "plane_copy";
arg0 arg0
{ {
...@@ -3948,7 +3894,6 @@ udmf ...@@ -3948,7 +3894,6 @@ udmf
799 799
{ {
title = "Set Tagged Dynamic Slope Vertex to Front Sector Height"; title = "Set Tagged Dynamic Slope Vertex to Front Sector Height";
prefix = "(799)";
arg0 arg0
{ {
title = "Apply height"; title = "Apply height";
......
...@@ -78,6 +78,8 @@ sectorflags ...@@ -78,6 +78,8 @@ sectorflags
ropehang = "Rope Hang"; ropehang = "Rope Hang";
jumpflip = "Flip Gravity on Jump"; jumpflip = "Flip Gravity on Jump";
gravityoverride = "Make Reverse Gravity Temporary"; 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_nofloor = "No Trigger on Floor Touch";
flipspecial_ceiling = "Trigger on Ceiling Touch"; flipspecial_ceiling = "Trigger on Ceiling Touch";
triggerspecial_touch = "Trigger on Edge Touch"; triggerspecial_touch = "Trigger on Edge Touch";
...@@ -114,6 +116,8 @@ sectorflagscategories ...@@ -114,6 +116,8 @@ sectorflagscategories
ropehang = "special"; ropehang = "special";
jumpflip = "special"; jumpflip = "special";
gravityoverride = "special"; gravityoverride = "special";
nophysics_floor = "special";
nophysics_ceiling = "special";
flipspecial_nofloor = "trigger"; flipspecial_nofloor = "trigger";
flipspecial_ceiling = "trigger"; flipspecial_ceiling = "trigger";
triggerspecial_touch = "trigger"; triggerspecial_touch = "trigger";
...@@ -229,20 +233,369 @@ Field data types: ...@@ -229,20 +233,369 @@ Field data types:
*/ */
universalfields universalfields
{ {
sector
{
}
linedef linedef
{ {
alpha
{
type = 1;
default = 1.0;
}
comment
{
type = 2;
default = "";
}
renderstyle
{
type = 2;
default = "";
}
stringarg0
{
type = 2;
default = "";
}
stringarg1
{
type = 2;
default = "";
}
executordelay
{
type = 0;
default = 0;
}
} }
sidedef sidedef
{ {
comment
{
type = 2;
default = "";
}
light
{
type = 0;
default = 0;
}
lightabsolute
{
type = 3;
default = false;
}
//light_top
//{
// type = 0;
// default = 0;
//}
//
//lightabsolute_top
//{
// type = 3;
// default = false;
//}
//
//light_mid
//{
// type = 0;
// default = 0;
//}
//
//lightabsolute_mid
//{
// type = 3;
// default = false;
//}
//
//light_bottom
//{
// type = 0;
// default = 0;
//}
//
//lightabsolute_bottom
//{
// type = 3;
// default = false;
//}
offsetx_bottom
{
type = 1;
default = 0.0;
}
offsetx_mid
{
type = 1;
default = 0.0;
}
offsetx_top
{
type = 1;
default = 0.0;
}
offsety_bottom
{
type = 1;
default = 0.0;
}
offsety_mid
{
type = 1;
default = 0.0;
}
offsety_top
{
type = 1;
default = 0.0;
}
scalex_bottom
{
type = 1;
default = 1.0;
}
scalex_mid
{
type = 1;
default = 1.0;
}
scalex_top
{
type = 1;
default = 1.0;
}
scaley_bottom
{
type = 1;
default = 1.0;
}
scaley_mid
{
type = 1;
default = 1.0;
}
scaley_top
{
type = 1;
default = 1.0;
}
} }
thing thing
{ {
comment
{
type = 2;
default = "";
}
pitch
{
type = 0;
}
roll
{
type = 0;
}
scalex
{
type = 1;
default = 1.0;
}
scaley
{
type = 1;
default = 1.0;
}
stringarg0
{
type = 2;
default = "";
}
stringarg1
{
type = 2;
default = "";
}
mobjscale
{
type = 1;
default = 1.0;
managed = false;
}
}
sector
{
comment
{
type = 2;
default = "";
}
damagetype
{
type = 2;
default = "";
}
gravity
{
type = 1;
default = 1.0;
}
lightcolor
{
type = 0;
default = 0;
}
fadecolor
{
type = 0;
default = 0;
}
lightalpha
{
type = 0;
default = 25;
}
fadealpha
{
type = 0;
default = 25;
}
fadestart
{
type = 0;
default = 0;
}
fadeend
{
type = 0;
default = 31;
}
xpanningfloor
{
type = 1;
default = 0.0;
}
ypanningfloor
{
type = 1;
default = 0.0;
}
rotationfloor
{
type = 1;
default = 0.0;
}
xscalefloor
{
type = 1;
default = 1.0;
}
yscalefloor
{
type = 1;
default = 1.0;
}
lightfloor
{
type = 0;
default = 0;
}
lightfloorabsolute
{
type = 3;
default = false;
}
xpanningceiling
{
type = 1;
default = 0.0;
}
ypanningceiling
{
type = 1;
default = 0.0;
}
rotationceiling
{
type = 1;
default = 0.0;
}
xscaleceiling
{
type = 1;
default = 1.0;
}
yscaleceiling
{
type = 1;
default = 1.0;
}
lightceiling
{
type = 0;
default = 0;
}
lightceilingabsolute
{
type = 3;
default = false;
}
triggertag
{
type = 0;
default = 0;
}
} }
} }
......
...@@ -1127,56 +1127,63 @@ udmf ...@@ -1127,56 +1127,63 @@ udmf
} }
} }
} }
290
{ bossinvisibles
arrow = 0;
title = "Boss Escape Point";
width = 8;
height = 16;
sprite = "internal:eggmanend";
}
291
{
arrow = 0;
title = "Egg Capsule Center";
width = 8;
height = 16;
sprite = "internal:capsule";
}
292
{ {
arrow = 0; title = "Misc. Invisible";
title = "Boss Waypoint"; color = 15; // White
width = 8;
height = 16; 290
sprite = "internal:eggmanway"; {
arg0 arrow = 0;
{ title = "Boss Escape Point";
title = "Sea Egg sequence"; width = 8;
height = 16;
sprite = "internal:eggmanend";
}
291
{
arrow = 0;
title = "Egg Capsule Center";
width = 8;
height = 16;
sprite = "internal:capsule";
}
292
{
arrow = 0;
title = "Boss Waypoint";
width = 8;
height = 16;
sprite = "internal:eggmanway";
arg0
{
title = "Sea Egg sequence";
}
arg1
{
title = "Brak Eggman sequence";
}
} }
arg1 293
{ {
title = "Brak Eggman sequence"; title = "Metal Sonic Gather Point";
sprite = "internal:metal";
width = 8;
height = 16;
} }
} 294
293
{
title = "Metal Sonic Gather Point";
sprite = "internal:metal";
width = 8;
height = 16;
}
294
{
title = "Fang Waypoint";
sprite = "internal:eggmanway";
width = 8;
height = 16;
arg0
{ {
title = "Center waypoint?"; title = "Fang Waypoint";
type = 11; sprite = "internal:eggmanway";
enum = "noyes"; width = 8;
height = 16;
arg0
{
title = "Center waypoint?";
type = 11;
enum = "noyes";
}
} }
} }
} }
...@@ -1196,6 +1203,7 @@ udmf ...@@ -1196,6 +1203,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1207,6 +1215,7 @@ udmf ...@@ -1207,6 +1215,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1218,6 +1227,7 @@ udmf ...@@ -1218,6 +1227,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1230,6 +1240,7 @@ udmf ...@@ -1230,6 +1240,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1241,6 +1252,7 @@ udmf ...@@ -1241,6 +1252,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1252,6 +1264,7 @@ udmf ...@@ -1252,6 +1264,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1263,6 +1276,7 @@ udmf ...@@ -1263,6 +1276,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1274,6 +1288,7 @@ udmf ...@@ -1274,6 +1288,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1285,6 +1300,7 @@ udmf ...@@ -1285,6 +1300,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1296,6 +1312,7 @@ udmf ...@@ -1296,6 +1312,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1309,6 +1326,7 @@ udmf ...@@ -1309,6 +1326,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1322,6 +1340,7 @@ udmf ...@@ -1322,6 +1340,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1335,6 +1354,7 @@ udmf ...@@ -1335,6 +1354,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1348,6 +1368,7 @@ udmf ...@@ -1348,6 +1368,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1361,6 +1382,7 @@ udmf ...@@ -1361,6 +1382,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1374,6 +1396,7 @@ udmf ...@@ -1374,6 +1396,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1412,6 +1435,7 @@ udmf ...@@ -1412,6 +1435,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1459,6 +1483,7 @@ udmf ...@@ -1459,6 +1483,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1470,6 +1495,7 @@ udmf ...@@ -1470,6 +1495,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1483,6 +1509,7 @@ udmf ...@@ -1483,6 +1509,7 @@ udmf
arg1 arg1
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1952,7 +1979,7 @@ udmf ...@@ -1952,7 +1979,7 @@ udmf
generic generic
{ {
color = 11; // Light_Cyan color = 11; // Light_Cyan
title = "Generic Items & Hazards"; title = "Generic Objects ";
500 500
{ {
...@@ -1963,6 +1990,7 @@ udmf ...@@ -1963,6 +1990,7 @@ udmf
arg0 arg0
{ {
title = "Distance check?"; title = "Distance check?";
tooltip = "If enabled, bubbles are only spawned a player is within 2048 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -1992,19 +2020,12 @@ udmf ...@@ -1992,19 +2020,12 @@ udmf
enum = "noyes"; enum = "noyes";
} }
} }
520 }
{
title = "Bomb Sphere"; hazards
sprite = "SPHRD0"; {
width = 16; color = 17; // Orange
height = 24; title = "Generic Hazards";
arg0
{
title = "Float?";
type = 11;
enum = "yesno";
}
}
521 521
{ {
title = "Spikeball"; title = "Spikeball";
...@@ -2014,6 +2035,7 @@ udmf ...@@ -2014,6 +2035,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -2162,6 +2184,7 @@ udmf ...@@ -2162,6 +2184,7 @@ udmf
stringarg0 stringarg0
{ {
title = "Color"; title = "Color";
tooltip = "Uses a SKINCOLOR_ constant.\nExample: SKINCOLOR_RED";
} }
} }
550 550
...@@ -2240,6 +2263,7 @@ udmf ...@@ -2240,6 +2263,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 16 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -2254,6 +2278,7 @@ udmf ...@@ -2254,6 +2278,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 16 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -2268,6 +2293,7 @@ udmf ...@@ -2268,6 +2293,7 @@ udmf
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 16 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -2322,7 +2348,7 @@ udmf ...@@ -2322,7 +2348,7 @@ udmf
arrow = 1; arrow = 1;
title = "Special Placement Patterns"; title = "Special Placement Patterns";
width = 16; width = 16;
height = 384; height = 64;
sprite = "RINGA0"; sprite = "RINGA0";
600 600
...@@ -2330,6 +2356,7 @@ udmf ...@@ -2330,6 +2356,7 @@ udmf
arrow = 0; arrow = 0;
title = "5 Vertical Rings (Yellow Spring)"; title = "5 Vertical Rings (Yellow Spring)";
sprite = "internal:ringverticalyellow"; sprite = "internal:ringverticalyellow";
height = 384;
} }
601 601
{ {
...@@ -2363,6 +2390,7 @@ udmf ...@@ -2363,6 +2390,7 @@ udmf
title = "Circle of Rings (Big)"; title = "Circle of Rings (Big)";
sprite = "internal:circlebigring"; sprite = "internal:circlebigring";
width = 192; width = 192;
height = 384;
centerhitbox = true; centerhitbox = true;
} }
606 606
...@@ -2378,6 +2406,7 @@ udmf ...@@ -2378,6 +2406,7 @@ udmf
title = "Circle of Blue Spheres (Big)"; title = "Circle of Blue Spheres (Big)";
sprite = "internal:circlebigsphere"; sprite = "internal:circlebigsphere";
width = 192; width = 192;
height = 384;
centerhitbox = true; centerhitbox = true;
} }
608 608
...@@ -2393,47 +2422,59 @@ udmf ...@@ -2393,47 +2422,59 @@ udmf
title = "Circle of Rings and Spheres (Big)"; title = "Circle of Rings and Spheres (Big)";
sprite = "internal:circlebigringsphere"; sprite = "internal:circlebigringsphere";
width = 192; width = 192;
height = 384;
centerhitbox = true; centerhitbox = true;
} }
610 610
{ {
title = "Row of Items"; title = "Row of Items";
sprite = "RINGA0"; sprite = "internal:customrow";
width = 32;
height = 384;
arg0 arg0
{ {
title = "Number of items"; title = "Number of items";
default = 5;
} }
arg1 arg1
{ {
title = "Horizontal spacing"; title = "Horizontal spacing";
default = 64;
} }
arg2 arg2
{ {
title = "Vertical spacing"; title = "Vertical spacing";
default = 64;
} }
stringarg0 stringarg0
{ {
title = "Object types"; title = "Object types";
tooltip = "A list of MT_ constants to use, separated by spaces.\nExample: MT_RING MT_BLUESPHERE";
} }
} }
611 611
{ {
title = "Circle of Items"; title = "Circle of Items";
sprite = "RINGA0"; sprite = "internal:customcircle";
width = 96; width = 32;
height = 192; height = 64;
centerhitbox = true; centerhitbox = true;
arg0 arg0
{ {
title = "Number of items"; title = "Number of items";
default = 16;
} }
arg1 arg1
{ {
title = "Radius"; title = "Radius";
renderstyle = "circle";
rendercolor = "#6600FF";
default = 128;
} }
stringarg0 stringarg0
{ {
title = "Object types"; title = "Object types";
tooltip = "A list of MT_ constants to use, separated by spaces.\nExample: MT_RING MT_BLUESPHERE";
} }
} }
} }
...@@ -2456,10 +2497,13 @@ udmf ...@@ -2456,10 +2497,13 @@ udmf
arg0 arg0
{ {
title = "Repeat speed"; title = "Repeat speed";
tooltip = "In tics.";
default = 35;
} }
stringarg0 stringarg0
{ {
title = "Sound"; title = "Sound";
tooltip = "Takes a DS constant.\nExample: DSAMWTR3";
} }
} }
...@@ -2495,7 +2539,7 @@ udmf ...@@ -2495,7 +2539,7 @@ udmf
sprite = "internal:zoom"; sprite = "internal:zoom";
arg0 arg0
{ {
title = "Sequence"; title = "Sequence number";
} }
arg1 arg1
{ {
...@@ -2510,6 +2554,7 @@ udmf ...@@ -2510,6 +2554,7 @@ udmf
arg0 arg0
{ {
title = "Radius"; title = "Radius";
renderstyle = "circle";
} }
arg1 arg1
{ {
...@@ -2547,24 +2592,28 @@ udmf ...@@ -2547,24 +2592,28 @@ udmf
height = 16; height = 16;
arg0 arg0
{ {
title = "Particles"; title = "Number of particles";
} }
arg1 arg1
{ {
title = "Radius"; title = "Radius";
renderstyle = "circle";
} }
arg2 arg2
{ {
title = "Rising speed"; title = "Rising speed";
tooltip = "In fracunits per tic.";
} }
arg3 arg3
{ {
title = "Rotation speed"; title = "Rotation speed";
tooltip = "In degrees per tic.";
type = 8; type = 8;
} }
arg4 arg4
{ {
title = "Spawn interval"; title = "Spawn interval";
tooltip = "In tics.";
} }
arg5 arg5
{ {
...@@ -2575,6 +2624,11 @@ udmf ...@@ -2575,6 +2624,11 @@ udmf
title = "Heights control linedef"; title = "Heights control linedef";
type = 15; type = 15;
} }
stringarg0
{
title = "Particle object type";
tooltip = "Uses a MT_ constant.\nExample: MT_PARTICLE\nDefaults to MT_PARTICLE.";
}
} }
758 758
{ {
...@@ -2770,6 +2824,7 @@ udmf ...@@ -2770,6 +2824,7 @@ udmf
sprite = "GARGA1"; sprite = "GARGA1";
width = 16; width = 16;
height = 40; height = 40;
color = 6;
arg0 arg0
{ {
title = "Push behavior"; title = "Push behavior";
...@@ -2785,6 +2840,7 @@ udmf ...@@ -2785,6 +2840,7 @@ udmf
sprite = "GARGB1"; sprite = "GARGB1";
width = 32; width = 32;
height = 80; height = 80;
color = 6;
arg0 arg0
{ {
title = "Push behavior"; title = "Push behavior";
...@@ -2893,6 +2949,7 @@ udmf ...@@ -2893,6 +2949,7 @@ udmf
width = 28; width = 28;
height = 56; height = 56;
sprite = "BMNEA1"; sprite = "BMNEA1";
color = 17;
} }
1013 1013
{ {
...@@ -2922,6 +2979,348 @@ udmf ...@@ -2922,6 +2979,348 @@ udmf
color = 2; // Green color = 2; // Green
title = "Castle Eggman"; title = "Castle Eggman";
macespawns
{
title = "Mace Spawnpoints";
color = 11;
1104
{
title = "Mace Spawn";
sprite = "SMCEA0";
width = 17;
height = 34;
arg0
{
title = "Number of links";
}
arg1
{
title = "Number of extra spokes";
}
arg2
{
title = "Width";
tooltip = "Adds extra maces to both sides.";
}
arg3
{
title = "Speed";
tooltip = "In fracunits per tic.";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum = "maceflags";
}
}
1105
{
title = "Chain & Maces Spawn";
sprite = "SMCEA0";
width = 17;
height = 34;
arg0
{
title = "Number of links";
}
arg1
{
title = "Number of extra spokes";
}
arg2
{
title = "Width";
tooltip = "Adds extra chains/maces to both sides.";
}
arg3
{
title = "Speed";
tooltip = "In fracunits per tic.";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum = "maceflags";
}
}
1106
{
title = "Spring Ball Spawn";
sprite = "YSPBA0";
width = 17;
height = 34;
arg0
{
title = "Number of links";
}
arg1
{
title = "Number of extra spokes";
}
arg2
{
title = "Width";
tooltip = "Adds extra springs to both sides.";
}
arg3
{
title = "Speed";
tooltip = "In fracunits per tic.";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum
{
1 = "Red spring";
2 = "No sounds";
4 = "Player-turnable chain";
8 = "Swing instead of spin";
16 = "Make chain from end item";
32 = "Spawn link at origin";
64 = "Clip inside ground";
128 = "No distance check";
}
}
}
1107
{
title = "Chain Spawn";
sprite = "BMCHA0";
width = 17;
height = 34;
arg0
{
title = "Number of links";
}
arg1
{
title = "Number of extra spokes";
}
arg2
{
title = "Width";
tooltip = "Adds extra chains to both sides.";
}
arg3
{
title = "Speed";
tooltip = "In fracunits per tic.";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum = "maceflags";
}
}
1108
{
arrow = 1;
title = "Hidden Chain Spawn";
sprite = "internal:chain3";
width = 17;
height = 34;
}
1109
{
title = "Firebar Spawn";
sprite = "BFBRA0";
width = 17;
height = 34;
arg0
{
title = "Number of links";
}
arg1
{
title = "Number of extra spokes";
}
arg2
{
title = "Width";
tooltip = "Adds extra firebars to both sides.";
}
arg3
{
title = "Speed";
tooltip = "In fracunits per tic.";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum
{
1 = "Double size";
2 = "No sounds";
4 = "Player-turnable chain";
8 = "Swing instead of spin";
16 = "Omit chain links";
32 = "Spawn link at origin";
64 = "Clip inside ground";
128 = "No distance check";
}
}
}
1110
{
title = "Custom Mace Spawn";
sprite = "SMCEA0";
width = 17;
height = 34;
arg0
{
title = "Number of links";
}
arg1
{
title = "Number of extra spokes";
}
arg2
{
title = "Width";
tooltip = "Adds extra maces to both sides.";
}
arg3
{
title = "Speed";
tooltip = "In fracunits per tic.";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum = "maceflags";
}
stringarg0
{
title = "Mace object type";
tooltip = "Uses a MT_ constant.\nExample: MT_BIGMACE";
type = 2;
}
stringarg1
{
title = "Link object type";
tooltip = "Uses a MT_ constant.\nExample: MT_BIGCHAIN";
type = 2;
}
}
}
1100 1100
{ {
title = "Chain (Decorative)"; title = "Chain (Decorative)";
...@@ -2951,6 +3350,7 @@ udmf ...@@ -2951,6 +3350,7 @@ udmf
sprite = "ESTAA1"; sprite = "ESTAA1";
width = 32; width = 32;
height = 240; height = 240;
color = 6;
arg0 arg0
{ {
title = "Push behavior"; title = "Push behavior";
...@@ -2971,355 +3371,36 @@ udmf ...@@ -2971,355 +3371,36 @@ udmf
width = 16; width = 16;
height = 40; height = 40;
} }
1104 1111
{ {
title = "Mace Spawnpoint"; arrow = 1;
sprite = "SMCEA0"; blocking = 2;
width = 17; title = "Crawla Statue";
height = 34; sprite = "CSTAA1";
width = 16;
height = 40;
color = 6;
arg0 arg0
{ {
title = "Number of links"; title = "Push behavior";
} type = 11;
arg1 enum = "pushablebehavior";
{
title = "Number of spokes";
}
arg2
{
title = "Width";
}
arg3
{
title = "Speed";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum = "maceflags";
} }
} }
1105 1112
{ {
title = "Chain with Maces Spawnpoint"; arrow = 1;
sprite = "SMCEA0"; blocking = 2;
width = 17; title = "Lance-a-Bot Statue";
height = 34; sprite = "CBBSA1";
width = 32;
height = 72;
color = 6;
arg0 arg0
{ {
title = "Number of links"; title = "Push behavior";
} type = 11;
arg1 enum = "pushablebehavior";
{
title = "Number of spokes";
}
arg2
{
title = "Width";
}
arg3
{
title = "Speed";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum = "maceflags";
}
}
1106
{
title = "Chained Spring Spawnpoint";
sprite = "YSPBA0";
width = 17;
height = 34;
arg0
{
title = "Number of links";
}
arg1
{
title = "Number of spokes";
}
arg2
{
title = "Width";
}
arg3
{
title = "Speed";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum
{
1 = "Red spring";
2 = "No sounds";
4 = "Player-turnable chain";
8 = "Swing instead of spin";
16 = "Make chain from end item";
32 = "Spawn link at origin";
64 = "Clip inside ground";
128 = "No distance check";
}
}
}
1107
{
title = "Chain Spawnpoint";
sprite = "BMCHA0";
width = 17;
height = 34;
arg0
{
title = "Number of links";
}
arg1
{
title = "Number of spokes";
}
arg2
{
title = "Width";
}
arg3
{
title = "Speed";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum = "maceflags";
}
}
1108
{
arrow = 1;
title = "Hidden Chain Spawnpoint";
sprite = "internal:chain3";
width = 17;
height = 34;
}
1109
{
title = "Firebar Spawnpoint";
sprite = "BFBRA0";
width = 17;
height = 34;
arg0
{
title = "Number of links";
}
arg1
{
title = "Number of spokes";
}
arg2
{
title = "Width";
}
arg3
{
title = "Speed";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum
{
1 = "Double size";
2 = "No sounds";
4 = "Player-turnable chain";
8 = "Swing instead of spin";
16 = "Omit chain links";
32 = "Spawn link at origin";
64 = "Clip inside ground";
128 = "No distance check";
}
}
}
1110
{
title = "Custom Mace Spawnpoint";
sprite = "SMCEA0";
width = 17;
height = 34;
arg0
{
title = "Number of links";
}
arg1
{
title = "Number of spokes";
}
arg2
{
title = "Width";
}
arg3
{
title = "Speed";
}
arg4
{
title = "Phase";
type = 8;
}
arg5
{
title = "Pinch";
type = 8;
}
arg6
{
title = "Omitted spokes";
}
arg7
{
title = "Omitted links";
}
arg8
{
title = "Flags";
type = 12;
enum = "maceflags";
}
stringarg0
{
title = "Mace object type";
type = 2;
}
stringarg1
{
title = "Link object type";
type = 2;
}
}
1111
{
arrow = 1;
blocking = 2;
title = "Crawla Statue";
sprite = "CSTAA1";
width = 16;
height = 40;
arg0
{
title = "Push behavior";
type = 11;
enum = "pushablebehavior";
}
}
1112
{
arrow = 1;
blocking = 2;
title = "Lance-a-Bot Statue";
sprite = "CBBSA1";
width = 32;
height = 72;
arg0
{
title = "Push behavior";
type = 11;
enum = "pushablebehavior";
} }
} }
1114 1114
...@@ -3415,6 +3496,7 @@ udmf ...@@ -3415,6 +3496,7 @@ udmf
sprite = "internal:cannonball"; sprite = "internal:cannonball";
width = 8; width = 8;
height = 16; height = 16;
color = 17;
} }
1124 1124
{ {
...@@ -3423,6 +3505,7 @@ udmf ...@@ -3423,6 +3505,7 @@ udmf
sprite = "CBLLA0"; sprite = "CBLLA0";
width = 20; width = 20;
height = 40; height = 40;
color = 6;
arg0 arg0
{ {
title = "Push behavior"; title = "Push behavior";
...@@ -3443,6 +3526,7 @@ udmf ...@@ -3443,6 +3526,7 @@ udmf
sprite = "LCKNC0"; sprite = "LCKNC0";
width = 16; width = 16;
height = 32; height = 32;
color = 15;
} }
1127 1127
{ {
...@@ -3450,6 +3534,7 @@ udmf ...@@ -3450,6 +3534,7 @@ udmf
sprite = "EGR1A1"; sprite = "EGR1A1";
width = 20; width = 20;
height = 72; height = 72;
color = 17;
arg0 arg0
{ {
title = "Movement"; title = "Movement";
...@@ -3485,6 +3570,143 @@ udmf ...@@ -3485,6 +3570,143 @@ udmf
color = 2; // Green color = 2; // Green
title = "Arid Canyon"; title = "Arid Canyon";
cacti
{
title = "Cacti";
color = 17;
1203
{
title = "Tiny Red Flower Cactus";
sprite = "CACTA0";
width = 13;
height = 24;
}
1204
{
title = "Small Red Flower Cactus";
sprite = "CACTB0";
width = 15;
height = 52;
}
1205
{
title = "Tiny Blue Flower Cactus";
sprite = "CACTC0";
width = 13;
height = 24;
}
1206
{
title = "Small Blue Flower Cactus";
sprite = "CACTD0";
width = 15;
height = 52;
}
1207
{
title = "Prickly Pear";
sprite = "CACTE0";
width = 32;
height = 96;
}
1208
{
title = "Barrel Cactus";
sprite = "CACTF0";
width = 20;
height = 128;
}
1209
{
title = "Tall Barrel Cactus";
sprite = "CACTG0";
width = 24;
height = 224;
}
1210
{
title = "Armed Cactus";
sprite = "CACTH0";
width = 24;
height = 256;
}
1211
{
title = "Ball Cactus";
sprite = "CACTI0";
width = 48;
height = 96;
}
1230
{
title = "Tiny Cactus";
sprite = "CACTJ0";
width = 13;
height = 28;
}
1231
{
title = "Small Cactus";
sprite = "CACTK0";
width = 15;
height = 60;
}
}
minecarts
{
title = "Minecart";
color = 11;
1219
{
title = "Minecart Spawner";
sprite = "MCRTCLFR";
width = 22;
height = 32;
}
1220
{
title = "Minecart Stopper";
sprite = "MCRTIR";
width = 32;
height = 32;
}
1221
{
title = "Minecart Saloon Door";
sprite = "SALDARAL";
width = 96;
height = 160;
arg0
{
title = "Allow non-minecart players?";
type = 11;
enum = "noyes";
}
}
1229
{
title = "Minecart Switch Point";
sprite = "internal:zoom";
width = 8;
height = 16;
color = 15;
arg0
{
title = "Type";
type = 11;
enum
{
0 = "Disable";
1 = "Enable";
}
}
}
}
1200 1200
{ {
title = "Tumbleweed (Big)"; title = "Tumbleweed (Big)";
...@@ -3518,6 +3740,7 @@ udmf ...@@ -3518,6 +3740,7 @@ udmf
sprite = "ROIAA0"; sprite = "ROIAA0";
width = 8; width = 8;
height = 16; height = 16;
color = 17;
arg0 arg0
{ {
title = "Speed"; title = "Speed";
...@@ -3538,78 +3761,15 @@ udmf ...@@ -3538,78 +3761,15 @@ udmf
type = 2; type = 2;
} }
} }
1203 1212
{ {
title = "Tiny Red Flower Cactus"; title = "Caution Sign";
sprite = "CACTA0"; sprite = "WWSGAR";
width = 13; width = 22;
height = 24; height = 64;
wallsprite = true;
} }
1204 1213
{
title = "Small Red Flower Cactus";
sprite = "CACTB0";
width = 15;
height = 52;
}
1205
{
title = "Tiny Blue Flower Cactus";
sprite = "CACTC0";
width = 13;
height = 24;
}
1206
{
title = "Small Blue Flower Cactus";
sprite = "CACTD0";
width = 15;
height = 52;
}
1207
{
title = "Prickly Pear";
sprite = "CACTE0";
width = 32;
height = 96;
}
1208
{
title = "Barrel Cactus";
sprite = "CACTF0";
width = 20;
height = 128;
}
1209
{
title = "Tall Barrel Cactus";
sprite = "CACTG0";
width = 24;
height = 224;
}
1210
{
title = "Armed Cactus";
sprite = "CACTH0";
width = 24;
height = 256;
}
1211
{
title = "Ball Cactus";
sprite = "CACTI0";
width = 48;
height = 96;
}
1212
{
title = "Caution Sign";
sprite = "WWSGAR";
width = 22;
height = 64;
wallsprite = true;
}
1213
{ {
title = "Cacti Sign"; title = "Cacti Sign";
sprite = "WWS2AR"; sprite = "WWS2AR";
...@@ -3639,6 +3799,7 @@ udmf ...@@ -3639,6 +3799,7 @@ udmf
sprite = "BARRA1"; sprite = "BARRA1";
width = 24; width = 24;
height = 63; height = 63;
color = 17;
arg0 arg0
{ {
title = "Push behavior"; title = "Push behavior";
...@@ -3652,6 +3813,7 @@ udmf ...@@ -3652,6 +3813,7 @@ udmf
sprite = "REMTA0"; sprite = "REMTA0";
width = 64; width = 64;
height = 40; height = 40;
color = 17;
} }
1218 1218
{ {
...@@ -3659,33 +3821,7 @@ udmf ...@@ -3659,33 +3821,7 @@ udmf
sprite = "TAZDCR"; sprite = "TAZDCR";
width = 80; width = 80;
height = 416; height = 416;
} color = 11;
1219
{
title = "Minecart Spawner";
sprite = "MCRTCLFR";
width = 22;
height = 32;
}
1220
{
title = "Minecart Stopper";
sprite = "MCRTIR";
width = 32;
height = 32;
}
1221
{
title = "Minecart Saloon Door";
sprite = "SALDARAL";
width = 96;
height = 160;
arg0
{
title = "Allow non-minecart players?";
type = 11;
enum = "noyes";
}
} }
1222 1222
{ {
...@@ -3693,6 +3829,7 @@ udmf ...@@ -3693,6 +3829,7 @@ udmf
sprite = "TRAEBRBL"; sprite = "TRAEBRBL";
width = 28; width = 28;
height = 32; height = 32;
color = 15;
} }
1223 1223
{ {
...@@ -3700,6 +3837,7 @@ udmf ...@@ -3700,6 +3837,7 @@ udmf
sprite = "ADSTA0"; sprite = "ADSTA0";
width = 4; width = 4;
height = 4; height = 4;
color = 15;
} }
1224 1224
{ {
...@@ -3707,37 +3845,7 @@ udmf ...@@ -3707,37 +3845,7 @@ udmf
sprite = "STEAA0"; sprite = "STEAA0";
width = 4; width = 4;
height = 4; height = 4;
} color = 15;
1229
{
title = "Minecart Switch Point";
sprite = "internal:zoom";
width = 8;
height = 16;
arg0
{
title = "Type";
type = 11;
enum
{
0 = "Disable";
1 = "Enable";
}
}
}
1230
{
title = "Tiny Cactus";
sprite = "CACTJ0";
width = 13;
height = 28;
}
1231
{
title = "Small Cactus";
sprite = "CACTK0";
width = 15;
height = 60;
} }
} }
...@@ -3753,6 +3861,7 @@ udmf ...@@ -3753,6 +3861,7 @@ udmf
sprite = "internal:flameh"; sprite = "internal:flameh";
width = 16; width = 16;
height = 40; height = 40;
color = 17;
arg0 arg0
{ {
title = "On time"; title = "On time";
...@@ -3782,6 +3891,7 @@ udmf ...@@ -3782,6 +3891,7 @@ udmf
sprite = "internal:flamev"; sprite = "internal:flamev";
width = 16; width = 16;
height = 40; height = 40;
color = 17;
arg0 arg0
{ {
title = "On time"; title = "On time";
...@@ -3811,6 +3921,7 @@ udmf ...@@ -3811,6 +3921,7 @@ udmf
sprite = "internal:flame2"; sprite = "internal:flame2";
width = 16; width = 16;
height = 24; height = 24;
color = 17;
} }
1303 1303
{ {
...@@ -3818,6 +3929,7 @@ udmf ...@@ -3818,6 +3929,7 @@ udmf
sprite = "internal:flame1"; sprite = "internal:flame1";
width = 16; width = 16;
height = 24; height = 24;
color = 17;
} }
1304 1304
{ {
...@@ -3825,6 +3937,8 @@ udmf ...@@ -3825,6 +3937,8 @@ udmf
sprite = "LFALF0"; sprite = "LFALF0";
width = 30; width = 30;
height = 32; height = 32;
color = 17;
hangs = 1;
arg0 arg0
{ {
title = "Initial delay"; title = "Initial delay";
...@@ -3842,6 +3956,7 @@ udmf ...@@ -3842,6 +3956,7 @@ udmf
sprite = "PUMIA1A5"; sprite = "PUMIA1A5";
width = 30; width = 30;
height = 60; height = 60;
color = 11;
arg0 arg0
{ {
title = "Buoyant?"; title = "Buoyant?";
...@@ -3886,293 +4001,233 @@ udmf ...@@ -3886,293 +4001,233 @@ udmf
} }
} }
botanicserenity tutorial
{ {
color = 2; // Green color = 2; // Green
title = "Botanic Serenity"; title = "Tutorial";
width = 16;
height = 32; 799
sprite = "BSZ1A0";
1400
{ {
title = "Tall Flower (Red)"; title = "Tutorial Plant";
sprite = "BSZ1A0"; sprite = "TUPFH0";
width = 40;
height = 144;
arg0
{
title = "Start frame";
}
} }
1401 }
frozenhillside
{
color = 2; // Green
title = "Frozen Hillside";
2100
{ {
title = "Tall Flower (Purple)"; title = "Ice Shard (Small)";
sprite = "BSZ1B0"; sprite = "FHZIA0";
width = 8;
height = 32;
} }
1402 2101
{ {
title = "Tall Flower (Blue)"; title = "Ice Shard (Large)";
sprite = "BSZ1C0"; sprite = "FHZIB0";
width = 8;
height = 32;
} }
1403 2102
{ {
title = "Tall Flower (Cyan)"; title = "Crystal Tree (Aqua)";
sprite = "BSZ1D0"; sprite = "TRE3A0";
width = 20;
height = 200;
} }
1404 2103
{ {
title = "Tall Flower (Yellow)"; title = "Crystal Tree (Pink)";
sprite = "BSZ1E0"; sprite = "TRE3B0";
width = 20;
height = 200;
} }
1405 2104
{ {
title = "Tall Flower (Orange)"; title = "Amy Cameo";
sprite = "BSZ1F0"; sprite = "ROSYA1";
width = 16;
height = 48;
color = 11;
arg0
{
title = "Grayscale?";
type = 11;
enum = "noyes";
}
} }
1410 2105
{ {
title = "Medium Flower (Red)"; title = "Mistletoe";
sprite = "BSZ2A0"; sprite = "XMS6A0";
width = 52;
height = 106;
} }
1411 }
hauntedheights
{
color = 2; // Green
title = "Haunted Heights";
2000
{ {
title = "Medium Flower (Purple)"; title = "Smashing Spikeball";
sprite = "BSZ2B0"; sprite = "FMCEA0";
width = 18;
height = 28;
color = 17;
arg0
{
title = "Initial delay";
}
} }
1412 2001
{ {
title = "Medium Flower (Blue)"; title = "HHZ Grass";
sprite = "BSZ2C0"; sprite = "HHZMA0";
width = 16;
height = 40;
} }
1413 2002
{ {
title = "Medium Flower (Cyan)"; title = "HHZ Tentacle 1";
sprite = "BSZ2D0"; sprite = "HHZMB0";
width = 16;
height = 40;
} }
1414 2003
{ {
title = "Medium Flower (Yellow)"; title = "HHZ Tentacle 2";
sprite = "BSZ2E0"; sprite = "HHZMC0";
width = 16;
height = 40;
} }
1415 2004
{ {
title = "Medium Flower (Orange)"; title = "HHZ Stalagmite (Tall)";
sprite = "BSZ2F0"; sprite = "HHZME0";
width = 16;
height = 40;
} }
1420 2005
{ {
title = "Short Flower (Red)"; title = "HHZ Stalagmite (Short)";
sprite = "BSZ3A0"; sprite = "HHZMF0";
width = 16;
height = 40;
} }
1421 2006
{ {
title = "Short Flower (Purple)"; title = "Jack-o'-lantern 1";
sprite = "BSZ3B0"; sprite = "PUMKA0";
width = 16;
height = 40;
arg0
{
title = "Flicker";
type = 11;
enum = "yesno";
}
} }
1422 2007
{ {
title = "Short Flower (Blue)"; title = "Jack-o'-lantern 2";
sprite = "BSZ3C0"; sprite = "PUMKB0";
width = 16;
height = 40;
arg0
{
title = "Flicker";
type = 11;
enum = "yesno";
}
} }
1423 2008
{ {
title = "Short Flower (Cyan)"; title = "Jack-o'-lantern 3";
sprite = "BSZ3D0"; sprite = "PUMKC0";
width = 16;
height = 40;
arg0
{
title = "Flicker";
type = 11;
enum = "yesno";
}
} }
1424 2009
{ {
title = "Short Flower (Yellow)"; title = "Purple Mushroom";
sprite = "BSZ3E0"; sprite = "SHRMD0";
width = 16;
height = 48;
} }
1425 2010
{ {
title = "Short Flower (Orange)"; title = "HHZ Tree";
sprite = "BSZ3F0"; sprite = "HHPLC0";
width = 12;
height = 40;
} }
1430 }
azuretemple
{
color = 2; // Green
title = "Azure Temple";
1500
{ {
title = "Tulip (Red)"; arrow = 1;
sprite = "BST1A0"; blocking = 2;
title = "Glaregoyle";
sprite = "BGARA1";
width = 16;
height = 40;
color = 17;
arg0
{
title = "Push behavior";
type = 11;
enum = "pushablebehavior";
}
arg1
{
title = "Starting delay";
}
} }
1431 1501
{ {
title = "Tulip (Purple)"; arrow = 1;
sprite = "BST2A0"; blocking = 2;
title = "Glaregoyle (Up)";
sprite = "BGARA1";
width = 16;
height = 40;
color = 17;
arg0
{
title = "Push behavior";
type = 11;
enum = "pushablebehavior";
}
arg1
{
title = "Starting delay";
}
} }
1432 1502
{
title = "Tulip (Blue)";
sprite = "BST3A0";
}
1433
{
title = "Tulip (Cyan)";
sprite = "BST4A0";
}
1434
{
title = "Tulip (Yellow)";
sprite = "BST5A0";
}
1435
{
title = "Tulip (Orange)";
sprite = "BST6A0";
}
1440
{
title = "Cluster (Red)";
sprite = "BSZ5A0";
}
1441
{
title = "Cluster (Purple)";
sprite = "BSZ5B0";
}
1442
{
title = "Cluster (Blue)";
sprite = "BSZ5C0";
}
1443
{
title = "Cluster (Cyan)";
sprite = "BSZ5D0";
}
1444
{
title = "Cluster (Yellow)";
sprite = "BSZ5E0";
}
1445
{
title = "Cluster (Orange)";
sprite = "BSZ5F0";
}
1450
{
title = "Bush (Red)";
sprite = "BSZ6A0";
}
1451
{
title = "Bush (Purple)";
sprite = "BSZ6B0";
}
1452
{
title = "Bush (Blue)";
sprite = "BSZ6C0";
}
1453
{
title = "Bush (Cyan)";
sprite = "BSZ6D0";
}
1454
{
title = "Bush (Yellow)";
sprite = "BSZ6E0";
}
1455
{
title = "Bush (Orange)";
sprite = "BSZ6F0";
}
1460
{
title = "Vine (Red)";
sprite = "BSZ7A0";
}
1461
{
title = "Vine (Purple)";
sprite = "BSZ7B0";
}
1462
{
title = "Vine (Blue)";
sprite = "BSZ7C0";
}
1463
{
title = "Vine (Cyan)";
sprite = "BSZ7D0";
}
1464
{
title = "Vine (Yellow)";
sprite = "BSZ7E0";
}
1465
{
title = "Vine (Orange)";
sprite = "BSZ7F0";
}
1470
{
title = "BSZ Shrub";
sprite = "BSZ8A0";
}
1471
{
title = "BSZ Clover";
sprite = "BSZ8B0";
}
1473
{
title = "Palm Tree (Big)";
width = 16;
height = 160;
sprite = "BSZ8D0";
}
1475
{
title = "Palm Tree (Small)";
width = 16;
height = 80;
sprite = "BSZ8F0";
}
}
azuretemple
{
color = 2; // Green
title = "Azure Temple";
1500
{
arrow = 1;
blocking = 2;
title = "Glaregoyle";
sprite = "BGARA1";
width = 16;
height = 40;
arg0
{
title = "Push behavior";
type = 11;
enum = "pushablebehavior";
}
arg1
{
title = "Starting delay";
}
}
1501
{
arrow = 1;
blocking = 2;
title = "Glaregoyle (Up)";
sprite = "BGARA1";
width = 16;
height = 40;
arg0
{
title = "Push behavior";
type = 11;
enum = "pushablebehavior";
}
arg1
{
title = "Starting delay";
}
}
1502
{ {
arrow = 1; arrow = 1;
blocking = 2; blocking = 2;
...@@ -4180,6 +4235,7 @@ udmf ...@@ -4180,6 +4235,7 @@ udmf
sprite = "BGARA1"; sprite = "BGARA1";
width = 16; width = 16;
height = 40; height = 40;
color = 17;
arg0 arg0
{ {
title = "Push behavior"; title = "Push behavior";
...@@ -4199,6 +4255,7 @@ udmf ...@@ -4199,6 +4255,7 @@ udmf
sprite = "BGARA1"; sprite = "BGARA1";
width = 16; width = 16;
height = 40; height = 40;
color = 17;
arg0 arg0
{ {
title = "Push behavior"; title = "Push behavior";
...@@ -4216,6 +4273,7 @@ udmf ...@@ -4216,6 +4273,7 @@ udmf
sprite = "RCRYB0"; sprite = "RCRYB0";
width = 24; width = 24;
height = 32; height = 32;
color = 11;
} }
1505 1505
{ {
...@@ -4223,6 +4281,7 @@ udmf ...@@ -4223,6 +4281,7 @@ udmf
sprite = "CFLMA0E0"; sprite = "CFLMA0E0";
width = 8; width = 8;
height = 32; height = 32;
color = 17;
} }
1506 1506
{ {
...@@ -4232,6 +4291,7 @@ udmf ...@@ -4232,6 +4291,7 @@ udmf
sprite = "BGARD1"; sprite = "BGARD1";
width = 16; width = 16;
height = 40; height = 40;
color = 6;
arg0 arg0
{ {
title = "Push behavior"; title = "Push behavior";
...@@ -4241,44 +4301,10 @@ udmf ...@@ -4241,44 +4301,10 @@ udmf
} }
} }
dreamhill
{
color = 2; // Green
title = "Dream Hill";
1600
{
title = "Spring Tree";
sprite = "TRE6A0";
width = 16;
height = 32;
}
1601
{
title = "Shleep";
sprite = "SHLPA0";
width = 24;
height = 32;
}
1602
{
title = "Nightopian";
sprite = "NTPNA1";
width = 16;
height = 40;
arg0
{
title = "Can move?";
type = 11;
enum = "yesno";
}
}
}
nightstrk nightstrk
{ {
color = 16; // Light Pink color = 16; // Light Pink
title = "NiGHTS Track & Misc."; title = "NiGHTS Track";
width = 8; width = 8;
height = 4096; height = 4096;
sprite = "UNKNA0"; sprite = "UNKNA0";
...@@ -4299,6 +4325,7 @@ udmf ...@@ -4299,6 +4325,7 @@ udmf
arg2 arg2
{ {
title = "Radius"; title = "Radius";
default = 256;
} }
arg3 arg3
{ {
...@@ -4337,12 +4364,21 @@ udmf ...@@ -4337,12 +4364,21 @@ udmf
title = "Order"; title = "Order";
} }
} }
}
nights
{
color = 13; // Pink
title = "NiGHTS Items & Misc.";
width = 16;
height = 32;
1703 1703
{ {
title = "Ideya Drone"; title = "Ideya Drone";
sprite = "NDRNA1"; sprite = "NDRNA1";
width = 16; width = 16;
height = 56; height = 56;
color = 16;
arg0 arg0
{ {
title = "Time limit"; title = "Time limit";
...@@ -4380,6 +4416,7 @@ udmf ...@@ -4380,6 +4416,7 @@ udmf
sprite = "CAPSA0"; sprite = "CAPSA0";
width = 72; width = 72;
height = 144; height = 144;
color = 16;
arg0 arg0
{ {
title = "Mare"; title = "Mare";
...@@ -4395,20 +4432,12 @@ udmf ...@@ -4395,20 +4432,12 @@ udmf
sprite = "internal:ideya"; sprite = "internal:ideya";
width = 8; width = 8;
height = 16; height = 16;
color = 16;
arg0 arg0
{ {
title = "Mare"; title = "Mare";
} }
} }
}
nights
{
color = 13; // Pink
title = "NiGHTS Items";
width = 16;
height = 32;
1704 1704
{ {
arrow = 1; arrow = 1;
...@@ -4416,6 +4445,22 @@ udmf ...@@ -4416,6 +4445,22 @@ udmf
sprite = "NBMPG3G7"; sprite = "NBMPG3G7";
width = 32; width = 32;
height = 64; height = 64;
color = 12;
}
520
{
title = "Bomb Sphere";
sprite = "SPHRD0";
width = 16;
height = 24;
color = 17;
arg0
{
title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11;
enum = "yesno";
}
} }
1706 1706
{ {
...@@ -4423,9 +4468,11 @@ udmf ...@@ -4423,9 +4468,11 @@ udmf
sprite = "SPHRA0"; sprite = "SPHRA0";
width = 16; width = 16;
height = 24; height = 24;
color = 14;
arg0 arg0
{ {
title = "Float?"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
...@@ -4513,231 +4560,310 @@ udmf ...@@ -4513,231 +4560,310 @@ udmf
width = 80; width = 80;
height = 160; height = 160;
centerhitbox = true; centerhitbox = true;
color = 14;
arg0 arg0
{ {
title = "Radius"; title = "Radius";
default = 96;
} }
} }
} }
mario dreamhill
{ {
color = 6; // Brown color = 2; // Green
title = "Mario"; title = "Dream Hill";
1800 1600
{ {
title = "Coin"; title = "Spring Tree";
sprite = "COINA0"; sprite = "TRE6A0";
width = 16; width = 16;
height = 24;
arg0
{
title = "Float?";
type = 11;
enum = "yesno";
}
}
1801
{
arrow = 1;
title = "Goomba";
sprite = "GOOMA0";
width = 24;
height = 32; height = 32;
} }
1802 1601
{ {
arrow = 1; title = "Shleep";
title = "Goomba (Blue)"; sprite = "SHLPA0";
sprite = "BGOMA0";
width = 24; width = 24;
height = 32; height = 32;
color = 9;
} }
1803 1602
{
title = "Fire Flower";
sprite = "FFWRB0";
width = 16;
height = 32;
}
1804
{
title = "Koopa Shell";
sprite = "SHLLA1";
width = 16;
height = 20;
}
1805
{
title = "Puma (Jumping Fireball)";
sprite = "PUMAA0";
width = 8;
height = 16;
arg0
{
title = "Jump strength";
}
}
1806
{ {
title = "King Bowser"; title = "Nightopian";
sprite = "KOOPA0"; sprite = "NTPNA1";
width = 16; width = 16;
height = 48; height = 40;
arg0 color = 19;
{
title = "Death trigger tag";
type = 15;
}
}
1807
{
title = "Axe";
sprite = "MAXEA0";
width = 8;
height = 16;
arg0 arg0
{ {
title = "Death trigger tag"; title = "Can move?";
type = 15; type = 11;
enum = "yesno";
} }
} }
1808
{
title = "Bush (Short)";
sprite = "MUS1A0";
width = 16;
height = 32;
}
1809
{
title = "Bush (Tall)";
sprite = "MUS2A0";
width = 16;
height = 32;
}
1810
{
title = "Toad";
sprite = "TOADA0";
width = 8;
height = 32;
}
} }
christmasdisco botanicserenity
{ {
color = 2; // Green color = 2; // Green
title = "Christmas & Disco"; title = "Botanic Serenity";
width = 16;
height = 32;
1850 flowers
{
title = "Christmas Pole";
sprite = "XMS1A0";
width = 16;
height = 40;
}
1851
{
title = "Candy Cane";
sprite = "XMS2A0";
width = 8;
height = 32;
}
1852
{ {
blocking = 2; title = "Flowers";
title = "Snowman"; 1400
sprite = "XMS3A0";
width = 16;
height = 64;
arg0
{ {
title = "Push behavior"; title = "Tall Flower (Red)";
type = 11; sprite = "BSZ1A0";
enum = "pushablebehavior";
} }
} 1401
1853
{
blocking = 2;
title = "Snowman (With Hat)";
sprite = "XMS3B0";
width = 16;
height = 80;
arg0
{ {
title = "Push behavior"; title = "Tall Flower (Purple)";
type = 11; sprite = "BSZ1B0";
enum = "pushablebehavior"; }
1402
{
title = "Tall Flower (Blue)";
sprite = "BSZ1C0";
}
1403
{
title = "Tall Flower (Cyan)";
sprite = "BSZ1D0";
}
1404
{
title = "Tall Flower (Yellow)";
sprite = "BSZ1E0";
}
1405
{
title = "Tall Flower (Orange)";
sprite = "BSZ1F0";
}
1410
{
title = "Medium Flower (Red)";
sprite = "BSZ2A0";
}
1411
{
title = "Medium Flower (Purple)";
sprite = "BSZ2B0";
}
1412
{
title = "Medium Flower (Blue)";
sprite = "BSZ2C0";
}
1413
{
title = "Medium Flower (Cyan)";
sprite = "BSZ2D0";
}
1414
{
title = "Medium Flower (Yellow)";
sprite = "BSZ2E0";
}
1415
{
title = "Medium Flower (Orange)";
sprite = "BSZ2F0";
}
1420
{
title = "Short Flower (Red)";
sprite = "BSZ3A0";
}
1421
{
title = "Short Flower (Purple)";
sprite = "BSZ3B0";
}
1422
{
title = "Short Flower (Blue)";
sprite = "BSZ3C0";
}
1423
{
title = "Short Flower (Cyan)";
sprite = "BSZ3D0";
}
1424
{
title = "Short Flower (Yellow)";
sprite = "BSZ3E0";
}
1425
{
title = "Short Flower (Orange)";
sprite = "BSZ3F0";
} }
} }
1854
tulips
{ {
title = "Lamp Post"; title = "Tulips";
sprite = "XMS4A0"; 1430
width = 8; {
height = 120; title = "Tulip (Red)";
sprite = "BST1A0";
}
1431
{
title = "Tulip (Purple)";
sprite = "BST2A0";
}
1432
{
title = "Tulip (Blue)";
sprite = "BST3A0";
}
1433
{
title = "Tulip (Cyan)";
sprite = "BST4A0";
}
1434
{
title = "Tulip (Yellow)";
sprite = "BST5A0";
}
1435
{
title = "Tulip (Orange)";
sprite = "BST6A0";
}
1440
{
title = "Cluster (Red)";
sprite = "BSZ5A0";
}
1441
{
title = "Cluster (Purple)";
sprite = "BSZ5B0";
}
1442
{
title = "Cluster (Blue)";
sprite = "BSZ5C0";
}
1443
{
title = "Cluster (Cyan)";
sprite = "BSZ5D0";
}
1444
{
title = "Cluster (Yellow)";
sprite = "BSZ5E0";
}
1445
{
title = "Cluster (Orange)";
sprite = "BSZ5F0";
}
} }
1855
bushes
{ {
title = "Lamp Post (Snow)"; title = "Bushes";
sprite = "XMS4B0"; 1450
width = 8; {
height = 120; title = "Bush (Red)";
sprite = "BSZ6A0";
}
1451
{
title = "Bush (Purple)";
sprite = "BSZ6B0";
}
1452
{
title = "Bush (Blue)";
sprite = "BSZ6C0";
}
1453
{
title = "Bush (Cyan)";
sprite = "BSZ6D0";
}
1454
{
title = "Bush (Yellow)";
sprite = "BSZ6E0";
}
1455
{
title = "Bush (Orange)";
sprite = "BSZ6F0";
}
} }
1856
vines
{ {
title = "Hanging Star"; title = "Vines";
sprite = "XMS5A0"; 1460
width = 4; {
height = 80; title = "Vine (Red)";
hangs = 1; sprite = "BSZ7A0";
}
1461
{
title = "Vine (Purple)";
sprite = "BSZ7B0";
}
1462
{
title = "Vine (Blue)";
sprite = "BSZ7C0";
}
1463
{
title = "Vine (Cyan)";
sprite = "BSZ7D0";
}
1464
{
title = "Vine (Yellow)";
sprite = "BSZ7E0";
}
1465
{
title = "Vine (Orange)";
sprite = "BSZ7F0";
}
} }
1857 1470
{ {
title = "Berry Bush (Snow)"; title = "BSZ Shrub";
sprite = "BUS1B0"; sprite = "BSZ8A0";
width = 16;
height = 32;
} }
1858 1471
{ {
title = "Bush (Snow)"; title = "BSZ Clover";
sprite = "BUS2B0"; sprite = "BSZ8B0";
width = 16;
height = 32;
} }
1859 1473
{ {
title = "Blueberry Bush (Snow)"; title = "Palm Tree (Big)";
sprite = "BUS3B0";
width = 16; width = 16;
height = 32; height = 160;
sprite = "BSZ8D0";
} }
1875 1475
{ {
title = "Disco Ball"; title = "Palm Tree (Small)";
sprite = "DBALA0";
width = 16; width = 16;
height = 54; height = 80;
hangs = 1; sprite = "BSZ8F0";
}
1876
{
arrow = 1;
blocking = 2;
title = "Eggman Disco Statue";
sprite = "ESTAB1";
width = 20;
height = 96;
arg0
{
title = "Push behavior";
type = 11;
enum = "pushablebehavior";
}
} }
} }
...@@ -4811,197 +4937,254 @@ udmf ...@@ -4811,197 +4937,254 @@ udmf
width = 16; width = 16;
height = 40; height = 40;
} }
1909 1909
{
title = "Blue Stalagmite";
sprite = "STLGJ0";
width = 16;
height = 40;
}
}
christmasdisco
{
color = 2; // Green
title = "Christmas & Disco";
1850
{
title = "Christmas Pole";
sprite = "XMS1A0";
width = 16;
height = 40;
}
1851
{
title = "Candy Cane";
sprite = "XMS2A0";
width = 8;
height = 32;
}
1852
{
blocking = 2;
title = "Snowman";
sprite = "XMS3A0";
width = 16;
height = 64;
color = 6;
arg0
{
title = "Push behavior";
type = 11;
enum = "pushablebehavior";
}
}
1853
{ {
title = "Blue Stalagmite"; blocking = 2;
sprite = "STLGJ0"; title = "Snowman (With Hat)";
sprite = "XMS3B0";
width = 16; width = 16;
height = 40; height = 80;
} color = 6;
}
hauntedheights
{
color = 2; // Green
title = "Haunted Heights";
2000
{
title = "Smashing Spikeball";
sprite = "FMCEA0";
width = 18;
height = 28;
arg0 arg0
{ {
title = "Initial delay"; title = "Push behavior";
type = 11;
enum = "pushablebehavior";
} }
} }
2001 1854
{ {
title = "HHZ Grass"; title = "Lamp Post";
sprite = "HHZMA0"; sprite = "XMS4A0";
width = 16; width = 8;
height = 40; height = 120;
} }
2002 1855
{ {
title = "HHZ Tentacle 1"; title = "Lamp Post (Snow)";
sprite = "HHZMB0"; sprite = "XMS4B0";
width = 16; width = 8;
height = 40; height = 120;
} }
2003 1856
{ {
title = "HHZ Tentacle 2"; title = "Hanging Star";
sprite = "HHZMC0"; sprite = "XMS5A0";
width = 16; width = 4;
height = 40; height = 80;
hangs = 1;
} }
2004 1857
{ {
title = "HHZ Stalagmite (Tall)"; title = "Berry Bush (Snow)";
sprite = "HHZME0"; sprite = "BUS1B0";
width = 16; width = 16;
height = 40; height = 32;
} }
2005 1858
{ {
title = "HHZ Stalagmite (Short)"; title = "Bush (Snow)";
sprite = "HHZMF0"; sprite = "BUS2B0";
width = 16; width = 16;
height = 40; height = 32;
} }
2006 1859
{ {
title = "Jack-o'-lantern 1"; title = "Blueberry Bush (Snow)";
sprite = "PUMKA0"; sprite = "BUS3B0";
width = 16; width = 16;
height = 40; height = 32;
arg0
{
title = "Flicker";
type = 11;
enum = "yesno";
}
} }
2007 1875
{ {
title = "Jack-o'-lantern 2"; title = "Disco Ball";
sprite = "PUMKB0"; sprite = "DBALA0";
width = 16; width = 16;
height = 40; height = 54;
hangs = 1;
}
1876
{
arrow = 1;
blocking = 2;
title = "Eggman Disco Statue";
sprite = "ESTAB1";
width = 20;
height = 96;
color = 6;
arg0 arg0
{ {
title = "Flicker"; title = "Push behavior";
type = 11; type = 11;
enum = "yesno"; enum = "pushablebehavior";
} }
} }
2008 }
mario
{
color = 2; // Green
title = "Mario";
1800
{ {
title = "Jack-o'-lantern 3"; title = "Coin";
sprite = "PUMKC0"; sprite = "COINA0";
width = 16; width = 16;
height = 40; height = 24;
color = 14;
arg0 arg0
{ {
title = "Flicker"; title = "Float?";
tooltip = "This raises the object by 24 fracunits.";
type = 11; type = 11;
enum = "yesno"; enum = "yesno";
} }
} }
2009 1801
{
title = "Purple Mushroom";
sprite = "SHRMD0";
width = 16;
height = 48;
}
2010
{ {
title = "HHZ Tree"; arrow = 1;
sprite = "HHPLC0"; title = "Goomba";
width = 12; sprite = "GOOMA0";
height = 40; width = 24;
height = 32;
color = 9;
} }
} 1802
frozenhillside
{
color = 2; // Green
title = "Frozen Hillside";
2100
{ {
title = "Ice Shard (Small)"; arrow = 1;
sprite = "FHZIA0"; title = "Goomba (Blue)";
width = 8; sprite = "BGOMA0";
width = 24;
height = 32; height = 32;
color = 9;
} }
2101 1803
{ {
title = "Ice Shard (Large)"; title = "Fire Flower";
sprite = "FHZIB0"; sprite = "FFWRB0";
width = 8; width = 16;
height = 32; height = 32;
color = 14;
} }
2102 1804
{ {
title = "Crystal Tree (Aqua)"; title = "Koopa Shell";
sprite = "TRE3A0"; sprite = "SHLLA1";
width = 20; width = 16;
height = 200; height = 20;
color = 11;
} }
2103 1805
{ {
title = "Crystal Tree (Pink)"; title = "Puma (Jumping Fireball)";
sprite = "TRE3B0"; sprite = "PUMAA0";
width = 20; width = 8;
height = 200; height = 16;
color = 17;
arg0
{
title = "Jump strength";
}
} }
2104 1806
{ {
title = "Amy Cameo"; title = "King Bowser";
sprite = "ROSYA1"; sprite = "KOOPA0";
width = 16; width = 16;
height = 48; height = 48;
color = 4;
arg0 arg0
{ {
title = "Grayscale?"; title = "Death trigger tag";
type = 11; type = 15;
enum = "noyes";
} }
} }
2105 1807
{
title = "Mistletoe";
sprite = "XMS6A0";
width = 52;
height = 106;
}
}
tutorial
{
color = 2; // Green
title = "Tutorial";
799
{ {
title = "Tutorial Plant"; title = "Axe";
sprite = "TUPFH0"; sprite = "MAXEA0";
width = 40; width = 8;
height = 144; height = 16;
color = 11;
arg0 arg0
{ {
title = "Start frame"; title = "Death trigger tag";
type = 15;
} }
} }
1808
{
title = "Bush (Short)";
sprite = "MUS1A0";
width = 16;
height = 32;
color = 2;
}
1809
{
title = "Bush (Tall)";
sprite = "MUS2A0";
width = 16;
height = 32;
color = 2;
}
1810
{
title = "Toad";
sprite = "TOADA0";
width = 8;
height = 32;
color = 2;
}
} }
flickies flickies
{ {
color = 2; // Green color = 6; // Brown
title = "Flickies"; title = "Flickies";
width = 8; width = 8;
height = 20; height = 20;
...@@ -5391,7 +5574,7 @@ udmf ...@@ -5391,7 +5574,7 @@ udmf
} }
} }
} }
editor editor
{ {
color = 15; // White color = 15; // White
...@@ -5404,4 +5587,4 @@ udmf ...@@ -5404,4 +5587,4 @@ udmf
3328 = "3D Mode Start"; 3328 = "3D Mode Start";
} }
} }
\ No newline at end of file
/*********************************************************\
Zone Builder Game Configuration
For Sonic Robo Blast 2 Version 2.2
Contributors (alphabetical):
* Foxboy
* FuriousFox
* JJames19119
* Kalaron
* Kristos
* MascaraSnake
* mazmazz
* Morpheus
* Neo Chaotikal
* Nev3r
* Oogaland
* Rob
* Shadow Hog
* sphere
* SRB2-Playah
* SSNTails
* SteelT
* ST218
* toaster
* Viola
\*********************************************************/
// This is required to prevent accidental use of a different configuration
type = "Doom Builder 2 Game Configuration";
// This is the title to show for this game
game = "Sonic Robo Blast 2 - 2.2 (legacy)";
//GZDB specific. Don't try to load lumps that don't exist.
basegame = "doom";
// This is the simplified game engine/sourceport name
engine = "zdoom";
// When this is set to true, sectors with the same tag will light up when a line is highlighted
linetagindicatesectors = true;
// The format interface handles the map data format - DoomMapSetIO for SRB2DB2, SRB2MapSetIO for Zone Builder
formatinterface = "DoomMapSetIO";
//Maximum safe map size check (0 means skip check)
safeboundary = 0;
//Sky textures for vanilla maps
defaultskytextures
{
SKY1 = "MAP01,MAP02,MAP03,MAP33,MAP50,MAP60,MAPF0,MAPM0";
SKY2 = "MAPM7,MAPMB";
SKY4 = "MAP04,MAP06,MAP61,MAPF6,MAPM1";
SKY6 = "MAP05,MAP51,MAPMA";
SKY7 = "MAPM2,MAPM5";
SKY8 = "MAP07,MAP08,MAP09,MAP52,MAP62,MAPF1";
SKY10 = "MAP10,MAP12,MAP53,MAP63,MAPM3";
SKY11 = "MAP11,MAPF7";
SKY13 = "MAP13,MAP64";
SKY14 = "MAP14";
SKY15 = "MAP15,MAP54";
SKY17 = "MAP70";
SKY20 = "MAP32,MAP55,MAP65,MAPF2,MAPF5";
SKY21 = "MAPM4";
SKY22 = "MAP22,MAP23,MAP25,MAP26,MAP27,MAP56,MAP66,MAPF4,MAPM6";
SKY30 = "MAP30";
SKY31 = "MAP31";
SKY35 = "MAP42";
SKY40 = "MAP41,MAP71,MAPM9";
SKY55 = "MAPF3,MAPM8";
SKY68 = "MAPF8";
SKY99 = "MAP57,MAPZ0";
SKY159 = "MAP16";
SKY172 = "MAP40";
SKY300 = "MAP72";
SKY301 = "MAP73";
}
// Default lump name for new map
defaultlumpname = "MAP01";
// Default testing parameters
testparameters = "-folder \"%AF\" -file \"%AA\" \"%F\" -warp %L";
testshortpaths = true;
// Default nodebuilder configurations
defaultsavecompiler = "zennode_normal";
defaulttestcompiler = "zennode_fast";
// Skill levels
skills
{
1 = "Normal";
}
// Skins
skins
{
Sonic;
Tails;
Knuckles;
Amy;
Fang;
Metalsonic;
}
// Gametypes
gametypes
{
-1 = "Single Player";
0 = "Co-op";
1 = "Competition";
2 = "Race";
3 = "Match";
4 = "Team Match";
5 = "Tag";
6 = "Hide and Seek";
7 = "CTF";
}
// Special linedefs
soundlinedefflag = 64; // See linedefflags
singlesidedflag = 1; // See linedefflags
doublesidedflag = 4; // See linedefflags
impassableflag = 1;
upperunpeggedflag = 8;
lowerunpeggedflag = 16;
repeatmidtextureflag = 1024;
pegmidtextureflag = 256;
// Generalized actions
generalizedlinedefs = false;
generalizedsectors = true;
// Texture loading options
defaultwalltexture = "GFZROCK";
defaultfloortexture = "GFZFLR01";
defaultceilingtexture = "F_SKY1";
mixtexturesflats = true;
defaulttexturescale = 1.0f;
defaultflatscale = 1.0f;
// Thing number for start position in 3D Mode
start3dmode = 3328;
/*
TEXTURES AND FLAT SOURCES
This tells Doom Builder where to find the information for textures
and flats in the IWAD file, Addition WAD file and Map WAD file.
Start and end lumps must be given in a structure (of which the
key name doesnt matter) and any textures or flats in between them
are loaded in either the textures category or flats category.
For textures: PNAMES, TEXTURE1 and TEXTURE2 are loaded by default.
Kalaron: and now TX_START
*/
// Texture sources
textures
{
zdoom1
{
start = "TX_START";
end = "TX_END";
}
}
// Patch sources
patches
{
standard1
{
start = "P_START";
end = "P_END";
}
standard2
{
start = "PP_START";
end = "PP_END";
}
}
// Sprite sources
sprites
{
standard1
{
start = "S_START";
end = "S_END";
}
standard2
{
start = "SS_START";
end = "SS_END";
}
}
// Flat sources
flats
{
standard1
{
start = "F_START";
end = "F_END";
}
standard2
{
start = "FF_START";
end = "FF_END";
}
standard3
{
start = "FF_START";
end = "F_END";
}
standard4
{
start = "F_START";
end = "FF_END";
}
}
/*
GAME DETECT PATTERN
Used to guess the game for which a WAD file is made.
1 = One of these lumps must exist
2 = None of these lumps must exist
3 = All of these lumps must exist
*/
gamedetect
{
EXTENDED = 2;
BEHAVIOR = 2;
E#M# = 2;
MAP?? = 1;
}
/*
MAP LUMP NAMES
Map lumps are loaded with the map as long as they are right after each other. When the editor
meets a lump which is not defined in this list it will ignore the map if not satisfied.
The order of items defines the order in which lumps will be written to WAD file on save.
To indicate the map header lump, use ~MAP
Legenda:
required = Lump is required to exist.
blindcopy = Lump will be copied along with the map blindly. (usefull for lumps Doom Builder doesn't use)
nodebuild = The nodebuilder generates this lump.
allowempty = The nodebuilder is allowed to leave this lump empty.
script = This lump is a text-based script. Specify the filename of the script configuration to use.
*/
maplumpnames
{
~MAP
{
required = true;
blindcopy = true;
nodebuild = false;
}
THINGS
{
required = true;
nodebuild = true;
allowempty = true;
}
LINEDEFS
{
required = true;
nodebuild = true;
allowempty = false;
}
SIDEDEFS
{
required = true;
nodebuild = true;
allowempty = false;
}
VERTEXES
{
required = true;
nodebuild = true;
allowempty = false;
}
SEGS
{
required = false;
nodebuild = true;
allowempty = false;
}
SSECTORS
{
required = false;
nodebuild = true;
allowempty = false;
}
NODES
{
required = false;
nodebuild = true;
allowempty = false;
}
SECTORS
{
required = true;
nodebuild = true;
allowempty = false;
}
REJECT
{
required = false;
nodebuild = true;
allowempty = false;
}
BLOCKMAP
{
required = false;
nodebuild = true;
allowempty = true;
}
}
scriptlumpnames
{
MAINCFG
{
script = "SOC.cfg";
}
OBJCTCFG
{
script = "SOC.cfg";
}
SOC_
{
script = "SOC.cfg";
isprefix = true;
}
LUA_
{
script = "Lua.cfg";
isprefix = true;
}
}
// DEFAULT SECTOR BRIGHTNESS LEVELS
sectorbrightness
{
255;
248;
240;
232;
224;
216;
208;
200;
192;
184;
176;
168;
160;
152;
144;
136;
128;
120;
112;
104;
96;
88;
80;
72;
64;
56;
48;
40;
32;
24;
16;
8;
0;
}
// SECTOR TYPES-----------------------------------------------------------------
sectortypes
{
0 = "Normal";
1 = "Damage";
2 = "Damage (Water)";
3 = "Damage (Fire)";
4 = "Damage (Electrical)";
5 = "Spikes";
6 = "Death Pit (Camera Tilt)";
7 = "Death Pit (No Camera Tilt)";
8 = "Instant Kill";
9 = "Ring Drainer (Floor Touch)";
10 = "Ring Drainer (Anywhere in Sector)";
11 = "Special Stage Damage";
12 = "Space Countdown";
13 = "Ramp Sector (double step-up/down)";
14 = "Non-Ramp Sector (no step-down)";
15 = "Bouncy FOF <deprecated>";
16 = "Trigger Line Ex. (Pushable Objects)";
32 = "Trigger Line Ex. (Anywhere, All Players)";
48 = "Trigger Line Ex. (Floor Touch, All Players)";
64 = "Trigger Line Ex. (Anywhere in Sector)";
80 = "Trigger Line Ex. (Floor Touch)";
96 = "Trigger Line Ex. (Emerald Check) <deprecated>";
112 = "Trigger Line Ex. (NiGHTS Mare) <deprecated>";
128 = "Check for Linedef Executor on FOFs";
144 = "Egg Capsule";
160 = "Special Stage Time/Spheres Parameters <deprecated>";
176 = "Custom Global Gravity <deprecated>";
512 = "Wind/Current <deprecated>";
1024 = "Conveyor Belt <deprecated>";
1280 = "Speed Pad";
1536 = "Flip Gravity on Jump";
4096 = "Star Post Activator";
8192 = "Exit/Special Stage Pit/Return Flag";
12288 = "CTF Red Team Base";
16384 = "CTF Blue Team Base";
20480 = "Fan Sector";
24576 = "Super Sonic Transform";
28672 = "Force Spin";
32768 = "Zoom Tube Start";
36864 = "Zoom Tube End";
40960 = "Circuit Finish Line";
45056 = "Rope Hang";
49152 = "Intangible to the Camera";
}
// GENERALISED SECTOR TYPES-----------------------------------------------------------------
gen_sectortypes
{
first
{
0 = "Normal";
1 = "Damage";
2 = "Damage (Water)";
3 = "Damage (Fire)";
4 = "Damage (Electrical)";
5 = "Spikes";
6 = "Death Pit (Camera Tilt)";
7 = "Death Pit (No Camera Tilt)";
8 = "Instant Kill";
9 = "Ring Drainer (Floor Touch)";
10 = "Ring Drainer (Anywhere in Sector)";
11 = "Special Stage Damage";
12 = "Space Countdown";
13 = "Ramp Sector (double step-up/down)";
14 = "Non-Ramp Sector (no step-down)";
15 = "Bouncy FOF <deprecated>";
}
second
{
0 = "Normal";
16 = "Trigger Line Ex. (Pushable Objects)";
32 = "Trigger Line Ex. (Anywhere, All Players)";
48 = "Trigger Line Ex. (Floor Touch, All Players)";
64 = "Trigger Line Ex. (Anywhere in Sector)";
80 = "Trigger Line Ex. (Floor Touch)";
96 = "Trigger Line Ex. (Emerald Check) <deprecated>";
112 = "Trigger Line Ex. (NiGHTS Mare) <deprecated>";
128 = "Check for Linedef Executor on FOFs";
144 = "Egg Capsule";
160 = "Special Stage Time/Spheres Parameters <deprecated>";
176 = "Custom Global Gravity <deprecated>";
}
third
{
0 = "Normal";
512 = "Wind/Current <deprecated>";
1024 = "Conveyor Belt <deprecated>";
1280 = "Speed Pad";
1536 = "Flip Gravity on Jump";
}
fourth
{
0 = "Normal";
4096 = "Star Post Activator";
8192 = "Exit/Special Stage Pit/Return Flag";
12288 = "CTF Red Team Base";
16384 = "CTF Blue Team Base";
20480 = "Fan Sector";
24576 = "Super Sonic Transform";
28672 = "Force Spin";
32768 = "Zoom Tube Start";
36864 = "Zoom Tube End";
40960 = "Circuit Finish Line";
45056 = "Rope Hang";
49152 = "Intangible to the Camera";
}
}
// LINEDEF FLAGS
linedefflags
{
1 = "[0] Impassable";
2 = "[1] Block Enemies";
4 = "[2] Double-Sided";
8 = "[3] Upper Unpegged";
16 = "[4] Lower Unpegged";
32 = "[5] Slope Skew (E1)";
64 = "[6] Not Climbable";
128 = "[7] No Midtexture Skew (E2)";
256 = "[8] Peg Midtexture (E3)";
512 = "[9] Solid Midtexture (E4)";
1024 = "[10] Repeat Midtexture (E5)";
2048 = "[11] Netgame Only";
4096 = "[12] No Netgame";
8192 = "[13] Effect 6";
16384 = "[14] Bouncy Wall";
32768 = "[15] Transfer Line";
}
// Linedef flags UDMF translation table
// This is needed for copy/paste and prefabs to work properly
// When the UDMF field name is prefixed with ! it is inverted
linedefflagstranslation
{
1 = "blocking";
2 = "blockmonsters";
4 = "twosided";
8 = "dontpegtop";
16 = "dontpegbottom";
32 = "secret";
64 = "blocksound";
128 = "dontdraw";
256 = "mapped";
}
// LINEDEF ACTIVATIONS
linedefactivations
{
}
// LINEDEF TYPES
linedeftypes
{
misc
{
title = "Miscellaneous";
0
{
title = "None";
prefix = "(0)";
}
1
{
title = "Per-Sector Gravity";
prefix = "(1)";
flags64text = "[6] Flip in reverse gravity";
flags8192text = "[13] Cancel MF2_OBJECTFLIP";
}
5
{
title = "Camera Scanner";
prefix = "(5)";
}
7
{
title = "Sector Flat Alignment";
prefix = "(7)";
flags2048text = "[11] Don't align floor";
flags4096text = "[12] Don't align ceiling";
flags8192text = "[13] Use texture offsets";
}
10
{
title = "Culling Plane";
prefix = "(10)";
flags64text = "[6] Cull only while in sector";
}
13
{
title = "Heat Wave Effect";
prefix = "(13)";
}
40
{
title = "Visual Portal Between Tagged Linedefs";
prefix = "(40)";
}
41
{
title = "Horizon Effect";
prefix = "(41)";
}
50
{
title = "Instantly Lower Floor on Level Load";
prefix = "(50)";
}
51
{
title = "Instantly Raise Ceiling on Level Load";
prefix = "(51)";
}
63
{
title = "Fake Floor/Ceiling Planes";
prefix = "(63)";
}
96
{
title = "Add Front Sector Tag to Tagged Sectors";
prefix = "(96)";
flags1024text = "[10] Offsets are target tags";
flags8192text = "[13] Add front side offsets";
flags32768text = "[15] Add back side offsets";
}
97
{
title = "Add Tag to Front Sector";
prefix = "(97)";
flags8192text = "[13] Add front side offsets";
flags32768text = "[15] Add back side offsets";
}
98
{
title = "Add Tag to Back Sector";
prefix = "(98)";
flags8192text = "[13] Add front side offsets";
flags32768text = "[15] Add back side offsets";
}
99
{
title = "Add Tag to Front and Back Sectors";
prefix = "(99)";
flags8192text = "[13] Add front side offsets";
flags32768text = "[15] Add back side offsets";
}
540
{
title = "Floor Friction";
prefix = "(540)";
}
}
parameters
{
title = "Parameters";
2
{
title = "Custom Exit";
prefix = "(2)";
flags2text = "[1] Check emeralds";
flags64text = "[6] Skip score tally";
}
3
{
title = "Zoom Tube Parameters";
prefix = "(3)";
flags512text = "[9] Ignore player direction";
}
4
{
title = "Speed Pad Parameters";
prefix = "(4)";
flags512text = "[9] No teleport to center";
flags1024text = "[10] Force spinning frames";
}
8
{
title = "Special Sector Properties";
prefix = "(8)";
flags32text = "[5] Invert precipitation";
flags64text = "[6] Touch only ceiling";
flags128text = "[7] Allow opposite gravity";
flags256text = "[8] Touch sector edge";
flags512text = "[9] Touch floor or ceiling";
}
9
{
title = "Chain Parameters";
prefix = "(9)";
flags32text = "[5] Swing instead of spin";
flags128text = "[7] Make chain from end item";
flags64text = "[6] Player-turnable chain";
flags256text = "[8] Spawn link at origin";
flags512text = "[9] Don't clip inside ground";
flags1024text = "[10] No distance check";
}
11
{
title = "Rope Hang Parameters";
prefix = "(11)";
flags32text = "[5] Don't loop";
flags64text = "[6] Static";
}
12
{
title = "Rock Spawner Parameters";
prefix = "(12)";
flags64text = "[6] Randomize speed";
}
14
{
title = "Bustable Block Parameters";
prefix = "(14)";
flags32text = "[5] Particles launch from center";
}
15
{
title = "Fan Particle Spawner Parameters";
prefix = "(15)";
}
16
{
title = "Minecart Parameters";
prefix = "(16)";
}
64
{
title = "Continuously Appearing/Disappearing FOF";
prefix = "(64)";
flags2text = "[1] Use control sector tag";
flags64text = "[6] No sound effect";
}
76
{
title = "Make FOF Bouncy";
prefix = "(76)";
}
}
polyobject
{
title = "PolyObject";
20
{
title = "PolyObject First Line";
prefix = "(20)";
}
22
{
title = "PolyObject Parameters";
prefix = "(22)";
flags8text = "[3] Set translucency by X offset";
flags32text = "[5] Render outer sides only";
flags64text = "[6] Trigger linedef executor";
flags128text = "[7] Intangible";
flags256text = "[8] Stopped by pushables";
flags512text = "[9] Render flats";
flags8192text = "[13] Cut cyan flat pixels";
}
30
{
title = "PolyObject Waving Flag";
prefix = "(30)";
}
31
{
title = "Move PolyObject by Front Sector Displacement";
prefix = "(31)";
}
32
{
title = "Rotate PolyObject by Front Sector Displacement";
prefix = "(32)";
flags64text = "[6] Don't turn players";
flags512text = "[9] Turn all objects";
}
}
planemove
{
title = "Plane Movement";
52
{
title = "Continuously Falling Sector";
prefix = "(52)";
flags64text = "[6] Continuously rising";
}
53
{
title = "Continuous Floor/Ceiling Mover";
prefix = "(53)";
}
54
{
title = "Continuous Floor Mover";
prefix = "(54)";
}
55
{
title = "Continuous Ceiling Mover";
prefix = "(55)";
}
56
{
title = "Continuous Two-Speed Floor/Ceiling Mover";
prefix = "(56)";
}
57
{
title = "Continuous Two-Speed Floor Mover";
prefix = "(57)";
}
58
{
title = "Continuous Two-Speed Ceiling Mover";
prefix = "(58)";
}
59
{
title = "Activate Moving Platform";
prefix = "(59)";
flags64text = "[6] Move upwards at start";
}
60
{
title = "Activate Moving Platform (Adjustable Speed)";
prefix = "(60)";
flags64text = "[6] Move upwards at start";
}
61
{
title = "Crusher (Ceiling to Floor)";
prefix = "(61)";
flags512text = "[9] Double, constant speed";
}
62
{
title = "Crusher (Floor to Ceiling)";
prefix = "(62)";
flags512text = "[9] Double, constant speed";
}
66
{
title = "Move Floor by Displacement";
prefix = "(66)";
flags64text = "[6] Inverse movement";
}
67
{
title = "Move Ceiling by Displacement";
prefix = "(67)";
flags64text = "[6] Inverse movement";
}
68
{
title = "Move Floor and Ceiling by Displacement";
prefix = "(68)";
flags64text = "[6] Inverse movement";
}
}
fofsolid
{
title = "FOF (solid)";
100
{
title = "Solid, Opaque";
prefix = "(100)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "19F";
}
101
{
title = "Solid, Opaque, No Shadow";
prefix = "(101)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "1DF";
}
102
{
title = "Solid, Translucent";
prefix = "(102)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Render insides";
flags128text = "[7] Only block non-players";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "195F";
flags643dfloorflagsadd = "7C80";
}
103
{
title = "Solid, Sides Only";
prefix = "(103)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "1CF";
}
104
{
title = "Solid, No Sides";
prefix = "(104)";
flags32text = "[5] Only block player";
flags64text = "[6] Cast shadow";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "1D7";
flags643dfloorflagsremove = "40";
}
105
{
title = "Solid, Invisible";
prefix = "(105)";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "47";
invisiblefof = true;
}
140
{
title = "Intangible from Bottom, Opaque";
prefix = "(140)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Don't cast shadow";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "200841F";
flags643dfloorflagsadd = "40";
}
141
{
title = "Intangible from Bottom, Translucent";
prefix = "(141)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Don't cast shadow";
flags128text = "[7] Render insides/block non-plr";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "200191F";
flags1283dfloorflagsadd = "7C80";
flags643dfloorflagsadd = "40";
}
142
{
title = "Intangible from Bottom, Translucent, No Sides";
prefix = "(142)";
flags32text = "[5] Only block player";
flags64text = "[6] Don't cast shadow";
flags128text = "[7] Render insides/block non-plr";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "2001917";
flags1283dfloorflagsadd = "7C80";
flags643dfloorflagsadd = "40";
}
143
{
title = "Intangible from Top, Opaque";
prefix = "(143)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Don't cast shadow";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "400841F";
flags643dfloorflagsadd = "40";
}
144
{
title = "Intangible from Top, Translucent";
prefix = "(144)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Don't cast shadow";
flags128text = "[7] Render insides/block non-plr";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "400191F";
flags1283dfloorflagsadd = "7C80";
flags643dfloorflagsadd = "40";
}
145
{
title = "Intangible from Top, Translucent, No Sides";
prefix = "(145)";
flags32text = "[5] Only block player";
flags64text = "[6] Don't cast shadow";
flags128text = "[7] Render insides/block non-plr";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "4001917";
flags1283dfloorflagsadd = "7C80";
flags643dfloorflagsadd = "40";
}
146
{
title = "Only Tangible from Sides";
prefix = "(146)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "600800F";
}
}
fofintangible
{
title = "FOF (intangible)";
120
{
title = "Water, Opaque";
prefix = "(120)";
flags2text = "[1] Make lava intangible";
flags8text = "[3] Slope skew sides";
flags64text = "[6] Use two light levels";
flags512text = "[9] Use target light level";
flags1024text = "[10] Ripple effect";
3dfloor = true;
3dfloorflags = "8F39";
flags643dfloorflagsadd = "20000";
flags5123dfloorflagsadd = "80000000";
flags10243dfloorflagsadd = "40000000";
}
121
{
title = "Water, Translucent";
prefix = "(121)";
flags2text = "[1] Make lava intangible";
flags8text = "[3] Slope skew sides";
flags64text = "[6] Use two light levels";
flags512text = "[9] Use target light level";
flags1024text = "[10] Ripple effect";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "9F39";
flags643dfloorflagsadd = "20000";
flags5123dfloorflagsadd = "80000000";
flags10243dfloorflagsadd = "40000000";
}
122
{
title = "Water, Opaque, No Sides";
prefix = "(122)";
flags2text = "[1] Make lava intangible";
flags64text = "[6] Use two light levels";
flags512text = "[9] Use target light level";
flags1024text = "[10] Ripple effect";
3dfloor = true;
3dfloorflags = "F31";
flags643dfloorflagsadd = "20000";
flags5123dfloorflagsadd = "80000000";
flags10243dfloorflagsadd = "40000000";
}
123
{
title = "Water, Translucent, No Sides";
prefix = "(123)";
flags2text = "[1] Make lava intangible";
flags64text = "[6] Use two light levels";
flags512text = "[9] Use target light level";
flags1024text = "[10] Ripple effect";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "1F31";
flags643dfloorflagsadd = "20000";
flags5123dfloorflagsadd = "80000000";
flags10243dfloorflagsadd = "40000000";
}
124
{
title = "Goo Water, Translucent";
prefix = "(124)";
flags2text = "[1] Make lava intangible";
flags8text = "[3] Slope skew sides";
flags64text = "[6] Use two light levels";
flags512text = "[9] Use target light level";
flags1024text = "[10] Ripple effect";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "209F39";
flags643dfloorflagsadd = "20000";
flags5123dfloorflagsadd = "80000000";
flags10243dfloorflagsadd = "40000000";
}
125
{
title = "Goo Water, Translucent, No Sides";
prefix = "(125)";
flags2text = "[1] Make lava intangible";
flags64text = "[6] Use two light levels";
flags512text = "[9] Use target light level";
flags1024text = "[10] Ripple effect";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "201F31";
flags643dfloorflagsadd = "20000";
flags5123dfloorflagsadd = "80000000";
flags10243dfloorflagsadd = "40000000";
}
220
{
title = "Intangible, Opaque";
prefix = "(220)";
flags8text = "[3] Slope skew sides";
3dfloor = true;
3dfloorflags = "8F19";
}
221
{
title = "Intangible, Translucent";
prefix = "(221)";
flags8text = "[3] Slope skew sides";
flags64text = "[6] Cast shadow";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "1B59";
flags643dfloorflagsremove = "40";
}
222
{
title = "Intangible, Sides Only";
prefix = "(222)";
flags8text = "[3] Slope skew sides";
flags64text = "[6] Cast shadow";
3dfloor = true;
3dfloorflags = "8249";
flags643dfloorflagsremove = "240";
}
223
{
title = "Intangible, Invisible";
prefix = "(223)";
3dfloor = true;
3dfloorflags = "41";
invisiblefof = true;
}
}
fofmoving
{
title = "FOF (moving)";
150
{
title = "Air Bobbing";
prefix = "(150)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "19F";
}
151
{
title = "Air Bobbing (Adjustable)";
prefix = "(151)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "19F";
}
152
{
title = "Reverse Air Bobbing (Adjustable)";
prefix = "(152)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "19F";
}
153
{
title = "Dynamically Sinking Platform";
prefix = "(153)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "19F";
}
160
{
title = "Water Bobbing";
prefix = "(160)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "4019F";
}
190
{
title = "Rising Platform, Solid, Opaque";
prefix = "(190)";
flags2text = "[1] Sink when stepped on";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "19F";
}
191
{
title = "Rising Platform, Solid, Opaque, No Shadow";
prefix = "(191)";
flags2text = "[1] Sink when stepped on";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "1DF";
}
192
{
title = "Rising Platform, Solid, Translucent";
prefix = "(192)";
flags2text = "[1] Sink when stepped on";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "195F";
}
193
{
title = "Rising Platform, Solid, Invisible";
prefix = "(193)";
flags2text = "[1] Sink when stepped on";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "47";
}
194
{
title = "Rising Platform, Intangible from Bottom, Opaque";
prefix = "(194)";
flags2text = "[1] Sink when stepped on";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash, no shadow";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "200841F";
flags643dfloorflagsadd = "40";
}
195
{
title = "Rising Platform, Intangible from Bottom, Translucent";
prefix = "(195)";
flags2text = "[1] Sink when stepped on";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash, no shadow";
flags128text = "[7] Only block non-players";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "2009D1F";
flags643dfloorflagsadd = "40";
}
}
fofcrumbling
{
title = "FOF (crumbling)";
170
{
title = "Crumbling, Respawn";
prefix = "(170)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "10019F";
}
171
{
title = "Crumbling, No Respawn";
prefix = "(171)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "80019F";
}
172
{
title = "Crumbling, Respawn, Intangible from Bottom";
prefix = "(172)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Don't cast shadow";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "210841F";
flags643dfloorflagsadd = "40";
}
173
{
title = "Crumbling, No Respawn, Intangible from Bottom";
prefix = "(173)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Don't cast shadow";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "218841F";
flags643dfloorflagsadd = "40";
}
174
{
title = "Crumbling, Respawn, Int. from Bottom, Translucent";
prefix = "(174)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Don't cast shadow";
flags128text = "[7] Only block non-players";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "210959F";
flags643dfloorflagsadd = "40";
}
175
{
title = "Crumbling, No Respawn, Int. from Bottom, Translucent";
prefix = "(175)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Don't cast shadow";
flags128text = "[7] Only block non-players";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "218959F";
flags643dfloorflagsadd = "40";
}
176
{
title = "Crumbling, Respawn, Floating, Bobbing";
prefix = "(176)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "14019F";
}
177
{
title = "Crumbling, No Respawn, Floating, Bobbing";
prefix = "(177)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "1C019F";
}
178
{
title = "Crumbling, Respawn, Floating";
prefix = "(178)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "14019F";
}
179
{
title = "Crumbling, No Respawn, Floating";
prefix = "(179)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "1C019F";
}
180
{
title = "Crumbling, Respawn, Air Bobbing";
prefix = "(180)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Spindash to move";
flags128text = "[7] Only block non-players";
3dfloor = true;
3dfloorflags = "10019F";
}
}
fofspecial
{
title = "FOF (special)";
200
{
title = "Light Block";
prefix = "(200)";
3dfloor = true;
3dfloorflags = "20201";
invisiblefof = true;
}
201
{
title = "Half Light Block";
prefix = "(201)";
3dfloor = true;
3dfloorflags = "201";
invisiblefof = true;
}
202
{
title = "Fog Block";
prefix = "(202)";
3dfloor = true;
3dfloorflags = "3EF01";
invisiblefof = true;
}
250
{
title = "Mario Block";
prefix = "(250)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Invisible block";
flags64text = "[6] Brick block";
3dfloor = true;
3dfloorflags = "40019F";
flags323dfloorflagsremove = "19E";
flags643dfloorflagsadd = "200000";
}
251
{
title = "Thwomp Block";
prefix = "(251)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
flags512text = "[9] Custom crushing sound";
flags1024text = "[10] Custom speed";
3dfloor = true;
3dfloorflags = "19F";
}
252
{
title = "Shatter Block";
prefix = "(252)";
flags8text = "[3] Slope skew sides";
flags64text = "[6] Shatter only from below";
flags512text = "[9] Shattered by pushables";
flags1024text = "[10] Trigger linedef executor";
3dfloor = true;
3dfloorflags = "880001D";
flags643dfloorflagsadd = "200002";
}
253
{
title = "Shatter Block, Translucent";
prefix = "(253)";
flags8text = "[3] Slope skew sides";
flags512text = "[9] Shattered by pushables";
flags1024text = "[10] Trigger linedef executor";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "880101D";
}
254
{
title = "Bustable Block";
prefix = "(254)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags64text = "[6] Strong characters only";
flags128text = "[7] Only block non-players";
flags512text = "[9] Shattered by pushables";
flags1024text = "[10] Trigger linedef executor";
3dfloor = true;
3dfloorflags = "80001F";
flags643dfloorflagsadd = "20000000";
}
255
{
title = "Spin-Bustable Block";
prefix = "(255)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
flags512text = "[9] Shattered by pushables";
flags1024text = "[10] Trigger linedef executor";
3dfloor = true;
3dfloorflags = "1080001F";
}
256
{
title = "Spin-Bustable Block, Translucent";
prefix = "(256)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
flags512text = "[9] Shattered by pushables";
flags1024text = "[10] Trigger linedef executor";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "1080101F";
}
257
{
title = "Quicksand";
prefix = "(257)";
flags8text = "[3] Slope skew sides";
flags1024text = "[10] Ripple effect";
3dfloor = true;
3dfloorflags = "1008219";
flags10243dfloorflagsadd = "40000000";
}
258
{
title = "Laser";
prefix = "(258)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Don't damage bosses";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorflags = "959";
}
259
{
title = "Custom FOF";
prefix = "(259)";
flags8text = "[3] Slope skew sides";
flags32text = "[5] Only block player";
flags128text = "[7] Only block non-players";
flags512text = "[9] Shattered by pushables";
flags1024text = "[10] Trigger linedef executor";
flags8192text = "[13] Cut cyan flat pixels";
3dfloor = true;
3dfloorcustom = true;
}
}
linedeftrigger
{
title = "Linedef Executor Trigger";
300
{
title = "Continuous";
prefix = "(300)";
flags1024text = "[10] Use faster, unordered execution";
}
301
{
title = "Each Time";
prefix = "(301)";
flags1024text = "[10] Use faster, unordered execution";
flags16384text = "[14] Also trigger on exit";
}
302
{
title = "Once";
prefix = "(302)";
flags1024text = "[10] Use faster, unordered execution";
}
303
{
title = "Ring Count - Continuous";
prefix = "(303)";
flags2text = "[1] Rings greater or equal";
flags64text = "[6] Rings less or equal";
flags512text = "[9] Consider all players";
flags1024text = "[10] Use faster, unordered execution";
}
304
{
title = "Ring Count - Once";
prefix = "(304)";
flags2text = "[1] Rings greater or equal";
flags64text = "[6] Rings less or equal";
flags512text = "[9] Consider all players";
flags1024text = "[10] Use faster, unordered execution";
}
305
{
title = "Character Ability - Continuous";
prefix = "(305)";
flags1024text = "[10] Use faster, unordered execution";
}
306
{
title = "Character Ability - Each Time";
prefix = "(306)";
flags1024text = "[10] Use faster, unordered execution";
flags16384text = "[14] Also trigger on exit";
}
307
{
title = "Character Ability - Once";
prefix = "(307)";
flags1024text = "[10] Use faster, unordered execution";
}
308
{
title = "Race Only - Once";
prefix = "(308)";
flags1024text = "[10] Use faster, unordered execution";
}
309
{
title = "CTF Red Team - Continuous";
prefix = "(309)";
flags1024text = "[10] Use faster, unordered execution";
}
310
{
title = "CTF Red Team - Each Time";
prefix = "(310)";
flags1024text = "[10] Use faster, unordered execution";
flags16384text = "[14] Also trigger on exit";
}
311
{
title = "CTF Blue Team - Continuous";
prefix = "(311)";
flags1024text = "[10] Use faster, unordered execution";
}
312
{
title = "CTF Blue Team - Each Time";
prefix = "(312)";
flags1024text = "[10] Use faster, unordered execution";
flags16384text = "[14] Also trigger on exit";
}
313
{
title = "No More Enemies - Once";
prefix = "(313)";
flags1024text = "[10] Use faster, unordered execution";
}
314
{
title = "Number of Pushables - Continuous";
prefix = "(314)";
flags64text = "[6] Number greater or equal";
flags512text = "[9] Number less";
flags1024text = "[10] Use faster, unordered execution";
}
315
{
title = "Number of Pushables - Once";
prefix = "(315)";
flags64text = "[6] Number greater or equal";
flags512text = "[9] Number less";
flags1024text = "[10] Use faster, unordered execution";
}
317
{
title = "Condition Set Trigger - Continuous";
prefix = "(317)";
flags1024text = "[10] Use faster, unordered execution";
}
318
{
title = "Condition Set Trigger - Once";
prefix = "(318)";
flags1024text = "[10] Use faster, unordered execution";
}
319
{
title = "Unlockable - Continuous";
prefix = "(319)";
flags1024text = "[10] Use faster, unordered execution";
}
320
{
title = "Unlockable - Once";
prefix = "(320)";
flags1024text = "[10] Use faster, unordered execution";
}
321
{
title = "Trigger After X Calls - Continuous";
prefix = "(321)";
flags64text = "[6] Trigger more than once";
flags1024text = "[10] Use faster, unordered execution";
}
322
{
title = "Trigger After X Calls - Each Time";
prefix = "(322)";
flags64text = "[6] Trigger more than once";
flags1024text = "[10] Use faster, unordered execution";
}
323
{
title = "NiGHTSerize - Each Time";
prefix = "(323)";
flags2text = "[1] Mare >= Front X Offset";
flags8text = "[3] Run only if player is NiGHTS";
flags16text = "[4] Count from lowest of players";
flags32text = "[5] Lap <= Front Y Offset";
flags64text = "[6] Mare <= Front X Offset";
flags128text = "[7] Lap >= Front Y Offset";
flags256text = "[8] Count laps from Bonus Time";
flags512text = "[9] Count from triggering player";
flags1024text = "[10] Use faster, unordered execution";
flags16384text = "[14] Run if no more mares";
flags32768text = "[15] Run if player is not NiGHTS";
}
324
{
title = "NiGHTSerize - Once";
prefix = "(324)";
flags2text = "[1] Mare >= Front X Offset";
flags8text = "[3] Run only if player is NiGHTS";
flags16text = "[4] Count from lowest of players";
flags32text = "[5] Lap <= Front Y Offset";
flags64text = "[6] Mare <= Front X Offset";
flags128text = "[7] Lap >= Front Y Offset";
flags256text = "[8] Count laps from Bonus Time";
flags512text = "[9] Count from triggering player";
flags1024text = "[10] Use faster, unordered execution";
flags16384text = "[14] Run if no more mares";
flags32768text = "[15] Run if player is not NiGHTS";
}
325
{
title = "De-NiGHTSerize - Each Time";
prefix = "(325)";
flags2text = "[1] Mare >= Front X Offset";
flags8text = "[3] Run if anyone is NiGHTS";
flags16text = "[4] Count from lowest of players";
flags32text = "[5] Lap <= Front Y Offset";
flags64text = "[6] Mare <= Front X Offset";
flags128text = "[7] Lap >= Front Y Offset";
flags256text = "[8] Count laps from Bonus Time";
flags512text = "[9] Count from triggering player";
flags1024text = "[10] Use faster, unordered execution";
flags32768text = "[15] Run if no one is NiGHTS";
}
326
{
title = "De-NiGHTSerize - Once";
prefix = "(326)";
flags2text = "[1] Mare >= Front X Offset";
flags8text = "[3] Run if anyone is NiGHTS";
flags16text = "[4] Count from lowest of players";
flags32text = "[5] Lap <= Front Y Offset";
flags64text = "[6] Mare <= Front X Offset";
flags128text = "[7] Lap >= Front Y Offset";
flags256text = "[8] Count laps from Bonus Time";
flags512text = "[9] Count from triggering player";
flags1024text = "[10] Use faster, unordered execution";
flags32768text = "[15] Run if no one is NiGHTS";
}
327
{
title = "NiGHTS Lap - Each Time";
prefix = "(327)";
flags2text = "[1] Mare >= Front X Offset";
flags16text = "[4] Count from lowest of players";
flags32text = "[5] Lap <= Front Y Offset";
flags64text = "[6] Mare <= Front X Offset";
flags128text = "[7] Lap >= Front Y Offset";
flags256text = "[8] Count laps from Bonus Time";
flags512text = "[9] Count from triggering player";
flags1024text = "[10] Use faster, unordered execution";
}
328
{
title = "NiGHTS Lap - Once";
prefix = "(328)";
flags2text = "[1] Mare >= Front X Offset";
flags16text = "[4] Count from lowest of players";
flags32text = "[5] Lap <= Front Y Offset";
flags64text = "[6] Mare <= Front X Offset";
flags128text = "[7] Lap >= Front Y Offset";
flags256text = "[8] Count laps from Bonus Time";
flags512text = "[9] Count from triggering player";
flags1024text = "[10] Use faster, unordered execution";
}
329
{
title = "Ideya Capture Touch - Each Time";
prefix = "(329)";
flags2text = "[1] Mare >= Front X Offset";
flags8text = "[3] Run regardless of spheres";
flags16text = "[4] Count from lowest of players";
flags32text = "[5] Lap <= Front Y Offset";
flags64text = "[6] Mare <= Front X Offset";
flags128text = "[7] Lap >= Front Y Offset";
flags256text = "[8] Count laps from Bonus Time";
flags512text = "[9] Count from triggering player";
flags1024text = "[10] Use faster, unordered execution";
flags16384text = "[14] Only if not enough spheres";
flags32768text = "[15] Run when entering Capture";
}
330
{
title = "Ideya Capture Touch - Once";
prefix = "(330)";
flags2text = "[1] Mare >= Front X Offset";
flags8text = "[3] Run regardless of spheres";
flags16text = "[4] Count from lowest of players";
flags32text = "[5] Lap <= Front Y Offset";
flags64text = "[6] Mare <= Front X Offset";
flags128text = "[7] Lap >= Front Y Offset";
flags256text = "[8] Count laps from Bonus Time";
flags512text = "[9] Count from triggering player";
flags1024text = "[10] Use faster, unordered execution";
flags16384text = "[14] Only if not enough spheres";
flags32768text = "[15] Run when entering Capture";
}
331
{
title = "Player Skin - Continuous";
prefix = "(331)";
flags64text = "[6] Disable for this skin";
flags1024text = "[10] Use faster, unordered execution";
}
332
{
title = "Player Skin - Each Time";
prefix = "(332)";
flags64text = "[6] Disable for this skin";
flags1024text = "[10] Use faster, unordered execution";
}
333
{
title = "Player Skin - Once";
prefix = "(333)";
flags64text = "[6] Disable for this skin";
flags1024text = "[10] Use faster, unordered execution";
}
334
{
title = "Object Dye - Continuous";
prefix = "(334)";
flags64text = "[6] Disable for this color";
flags1024text = "[10] Use faster, unordered execution";
}
335
{
title = "Object Dye - Each Time";
prefix = "(335)";
flags64text = "[6] Disable for this color";
flags1024text = "[10] Use faster, unordered execution";
}
336
{
title = "Object Dye - Once";
prefix = "(336)";
flags64text = "[6] Disable for this color";
flags1024text = "[10] Use faster, unordered execution";
}
337
{
title = "Emerald Check - Continuous";
prefix = "(337)";
}
338
{
title = "Emerald Check - Each Time";
prefix = "(338)";
}
339
{
title = "Emerald Check - Once";
prefix = "(339)";
}
340
{
title = "NiGHTS Mare - Continuous";
flags2text = "[1] Mare greater or equal";
flags64text = "[6] Mare less or equal";
prefix = "(340)";
}
341
{
title = "NiGHTS Mare - Each Time";
flags2text = "[1] Mare greater or equal";
flags64text = "[6] Mare less or equal";
prefix = "(341)";
}
342
{
title = "NiGHTS Mare - Once";
flags2text = "[1] Mare greater or equal";
flags64text = "[6] Mare less or equal";
prefix = "(342)";
}
343
{
title = "Gravity Check - Continuous";
flags2text = "[1] Check temporary reverse gravity";
flags64text = "[6] Check for reverse gravity";
prefix = "(343)";
}
344
{
title = "Gravity Check - Each Time";
flags2text = "[1] Check temporary reverse gravity";
flags64text = "[6] Check for reverse gravity";
prefix = "(344)";
}
345
{
title = "Gravity Check - Once";
flags2text = "[1] Check temporary reverse gravity";
flags64text = "[6] Check for reverse gravity";
prefix = "(345)";
}
399
{
title = "Level Load";
prefix = "(399)";
flags1024text = "[10] Use faster, unordered execution";
}
}
linedefexecsector
{
title = "Linedef Executor (sector)";
400
{
title = "Set Tagged Sector's Floor Height/Texture";
prefix = "(400)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Don't change floor texture";
}
401
{
title = "Set Tagged Sector's Ceiling Height/Texture";
prefix = "(401)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Don't change ceiling texture";
}
402
{
title = "Copy Light Level to Tagged Sectors";
prefix = "(402)";
flags8text = "[3] Set delay by backside sector";
}
408
{
title = "Set Tagged Sector's Flats";
prefix = "(408)";
flags64text = "[6] Don't set floor flat";
flags512text = "[9] Don't set ceiling flat";
}
409
{
title = "Change Tagged Sector's Tag";
prefix = "(409)";
flags2text = "[1] Remove tag";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Add tag";
}
410
{
title = "Change Front Sector's Tag";
prefix = "(410)";
flags2text = "[1] Remove tag";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Add tag";
}
416
{
title = "Start Adjustable Flickering Light";
prefix = "(416)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Second level from back";
}
417
{
title = "Start Adjustable Pulsating Light";
prefix = "(417)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Second level from back";
}
418
{
title = "Start Adjustable Blinking Light (unsynchronized)";
prefix = "(418)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Second level from back";
}
419
{
title = "Start Adjustable Blinking Light (synchronized)";
prefix = "(419)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Second level from back";
}
420
{
title = "Fade Light Level";
prefix = "(420)";
flags8text = "[3] Set delay by backside sector";
flags16text = "[4] Set params by X/Y offsets";
flags512text = "[9] Speed = Tic Duration";
flags1024text = "[10] Override existing fade";
}
421
{
title = "Stop Lighting Effect";
prefix = "(421)";
flags8text = "[3] Set delay by backside sector";
}
435
{
title = "Change Plane Scroller Direction";
prefix = "(435)";
flags8text = "[3] Set delay by backside sector";
}
467
{
title = "Set Tagged Sector's Light Level";
prefix = "(467)";
flags8text = "[3] Set delay by backside sector";
flags256text = "[8] Set relative to current";
}
}
linedefexecplane
{
title = "Linedef Executor (plane movement)";
403
{
title = "Move Tagged Sector's Floor";
prefix = "(403)";
flags2text = "[1] Trigger linedef executor";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Change floor texture";
}
404
{
title = "Move Tagged Sector's Ceiling";
prefix = "(404)";
flags2text = "[1] Trigger linedef executor";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Change ceiling texture";
}
405
{
title = "Move Floor According to Front Texture Offsets";
prefix = "(405)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Move instantly";
}
407
{
title = "Move Ceiling According to Front Texture Offsets";
prefix = "(407)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Move instantly";
}
411
{
title = "Stop Plane Movement";
prefix = "(411)";
flags8text = "[3] Set delay by backside sector";
}
428
{
title = "Start Platform Movement";
prefix = "(428)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Move upwards at start";
}
429
{
title = "Crush Ceiling Once";
prefix = "(429)";
flags8text = "[3] Set delay by backside sector";
flags512text = "[9] Double, constant speed";
}
430
{
title = "Crush Floor Once";
prefix = "(430)";
flags8text = "[3] Set delay by backside sector";
}
431
{
title = "Crush Floor and Ceiling Once";
prefix = "(431)";
flags8text = "[3] Set delay by backside sector";
flags512text = "[9] Double, constant speed";
}
}
linedefexecplayer
{
title = "Linedef Executor (player/object)";
412
{
title = "Teleporter";
prefix = "(412)";
flags2text = "[1] Silent";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Retain angle";
flags256text = "[8] Relative, silent";
flags512text = "[9] Retain momentum";
}
425
{
title = "Change Object State";
prefix = "(425)";
flags8text = "[3] Set delay by backside sector";
}
426
{
title = "Stop Object";
prefix = "(426)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Teleport to sector center";
}
427
{
title = "Award Score";
prefix = "(427)";
flags8text = "[3] Set delay by backside sector";
}
432
{
title = "Enable/Disable 2D Mode";
prefix = "(432)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Return to 3D";
}
433
{
title = "Enable/Disable Gravity Flip";
prefix = "(433)";
flags2text = "[1] Force MFE_VERTICALFLIP";
flags8text = "[3] Set delay by backside sector";
flags32text = "[5] Invert current gravity";
flags64text = "[6] Return to normal";
}
434
{
title = "Award Power-Up";
prefix = "(434)";
flags2text = "[1] Use back upper texture";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] No time limit";
}
437
{
title = "Disable Player Control";
prefix = "(437)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Allow jumping";
}
438
{
title = "Change Object Size";
prefix = "(438)";
flags8text = "[3] Set delay by backside sector";
}
442
{
title = "Change Object Type State";
prefix = "(442)";
flags8text = "[3] Set delay by backside sector";
}
449
{
title = "Enable Bosses with Parameter";
prefix = "(449)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Disable bosses";
}
457
{
title = "Track Object's Angle";
prefix = "(457)";
flags8text = "[3] Set delay by backside sector";
flags128text = "[7] Don't stop after first fail";
}
458
{
title = "Stop Tracking Object's Angle";
prefix = "(458)";
flags8text = "[3] Set delay by backside sector";
}
460
{
title = "Award Rings";
prefix = "(460)";
flags8text = "[3] Set delay by backside sector";
}
461
{
title = "Spawn Object";
prefix = "(461)";
flags8text = "[3] Set delay by backside sector";
flags32text = "[5] Use line angle for object";
flags64text = "[6] Spawn inside a range";
}
462
{
title = "Stop Timer/Exit Stage in Record Attack";
prefix = "(462)";
flags8text = "[3] Set delay by backside sector";
}
463
{
title = "Dye Object";
prefix = "(463)";
}
464
{
title = "Trigger Egg Capsule";
prefix = "(464)";
flags64text = "[6] Don't end level";
}
}
linedefexecmisc
{
title = "Linedef Executor (misc.)";
413
{
title = "Change Music";
prefix = "(413)";
flags2text = "[1] Keep after death";
flags8text = "[3] Set delay by backside sector";
flags32text = "[5] Seek from current position";
flags64text = "[6] For everyone";
flags128text = "[7] Fade to custom volume";
flags512text = "[9] Don't loop";
flags16384text = "[14] Force music reload";
}
414
{
title = "Play Sound Effect";
prefix = "(414)";
flags2text = "[1] From calling sector";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] From nowhere for triggerer";
flags512text = "[9] From nowhere for everyone";
flags1024text = "[10] From tagged sectors";
}
415
{
title = "Run Script";
prefix = "(415)";
flags8text = "[3] Set delay by backside sector";
}
422
{
title = "Switch to Cut-Away View";
prefix = "(422)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Adjust pitch";
}
423
{
title = "Change Sky";
prefix = "(423)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] For everyone";
}
424
{
title = "Change Weather";
prefix = "(424)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] For everyone";
}
436
{
title = "Shatter FOF";
prefix = "(436)";
flags8text = "[3] Set delay by backside sector";
}
439
{
title = "Change Tagged Linedef's Textures";
prefix = "(439)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Only existing";
flags8192text = "[13] Use backside textures";
}
440
{
title = "Start Metal Sonic Race";
prefix = "(440)";
flags8text = "[3] Set delay by backside sector";
}
441
{
title = "Condition Set Trigger";
prefix = "(441)";
flags8text = "[3] Set delay by backside sector";
}
443
{
title = "Call Lua Function";
prefix = "(443)";
flags8text = "[3] Set delay by backside sector";
}
444
{
title = "Earthquake";
prefix = "(444)";
flags8text = "[3] Set delay by backside sector";
}
445
{
title = "Make FOF Disappear/Reappear";
prefix = "(445)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Reappear";
}
446
{
title = "Make FOF Crumble";
prefix = "(446)";
flags2text = "[1] Flags determine respawn";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Don't respawn";
}
447
{
title = "Change Tagged Sector's Colormap";
prefix = "(447)";
flags8text = "[3] Set delay by backside sector";
flags16text = "[4] Front X/Y = Alpha";
flags32text = "[5] Subtract Red value";
flags64text = "[6] Subtract Green value";
flags128text = "[7] Subtract Blue value";
flags256text = "[8] Set relative to current";
flags32768text = "[15] Use backside colormap";
}
448
{
title = "Change Skybox";
prefix = "(448)";
flags2text = "[1] Change centerpoint";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] For everyone";
flags512text = "[9] Don't change viewpoint";
}
450
{
title = "Execute Linedef Executor (specific tag)";
prefix = "(450)";
flags8text = "[3] Set delay by backside sector";
}
451
{
title = "Execute Linedef Executor (random tag in range)";
prefix = "(451)";
flags8text = "[3] Set delay by backside sector";
}
452
{
title = "Set FOF Translucency";
prefix = "(452)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Do not handle FF_TRANS";
flags256text = "[8] Set relative to current";
}
453
{
title = "Fade FOF";
prefix = "(453)";
flags2text = "[1] Do not handle FF_EXISTS";
flags8text = "[3] Set delay by backside sector";
flags32text = "[5] No collision during fade";
flags64text = "[6] Do not handle FF_TRANS";
flags128text = "[7] Do not handle lighting";
flags256text = "[8] Set relative to current";
flags512text = "[9] Speed = Tic Duration";
flags1024text = "[10] Override existing fade";
flags16384text = "[14] Do not handle collision";
flags32768text = "[15] Use exact alpha in OGL";
}
454
{
title = "Stop Fading FOF";
prefix = "(454)";
flags2text = "[1] Do not finalize collision";
flags8text = "[3] Set delay by backside sector";
}
455
{
title = "Fade Tagged Sector's Colormap";
prefix = "(455)";
flags8text = "[3] Set delay by backside sector";
flags16text = "[4] Front X/Y = Alpha";
flags32text = "[5] Subtract Red value";
flags64text = "[6] Subtract Green value";
flags128text = "[7] Subtract Blue value";
flags256text = "[8] Set relative to current";
flags512text = "[9] Speed = Tic Duration";
flags1024text = "[10] Override existing fade";
flags16384text = "[14] Fade from invisible black";
flags32768text = "[15] Use backside colormap";
}
456
{
title = "Stop Fading Tagged Sector's Colormap";
prefix = "(456)";
flags8text = "[3] Set delay by backside sector";
}
459
{
title = "Control Text Prompt";
prefix = "(459)";
flags2text = "[1] Close text prompt";
flags8text = "[3] Set delay by backside sector";
flags32text = "[5] Run executor tag on close";
flags128text = "[7] Don't disable controls";
flags32768text = "[15] Find prompt by name";
}
}
linedefexecpoly
{
title = "Linedef Executor (polyobject)";
480
{
title = "PolyObject Door Slide";
prefix = "(480)";
flags8text = "[3] Set delay by backside sector";
}
481
{
title = "PolyObject Door Swing";
prefix = "(481)";
flags8text = "[3] Set delay by backside sector";
}
482
{
title = "Move PolyObject";
prefix = "(482)";
flags8text = "[3] Set delay by backside sector";
}
483
{
title = "Move PolyObject, Override";
prefix = "(483)";
flags8text = "[3] Set delay by backside sector";
}
484
{
title = "Rotate PolyObject Right";
prefix = "(484)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Don't turn players";
flags512text = "[9] Turn all objects";
}
485
{
title = "Rotate PolyObject Right, Override";
prefix = "(485)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Don't turn players";
flags512text = "[9] Turn all objects";
}
486
{
title = "Rotate PolyObject Left";
prefix = "(486)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Don't turn players";
flags512text = "[9] Turn all objects";
}
487
{
title = "Rotate PolyObject Left, Override";
prefix = "(487)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Don't turn players";
flags512text = "[9] Turn all objects";
}
488
{
title = "Move PolyObject by Waypoints";
prefix = "(488)";
flags8text = "[3] Set delay by backside sector";
flags32text = "[5] Reverse order";
flags128text = "[7] There and back";
flags256text = "[8] Return when done";
flags512text = "[9] Loop movement";
}
489
{
title = "Turn PolyObject Invisible, Intangible";
prefix = "(489)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Only invisible";
}
490
{
title = "Turn PolyObject Visible, Tangible";
prefix = "(490)";
flags8text = "[3] Set delay by backside sector";
flags64text = "[6] Only visible";
}
491
{
title = "Set PolyObject Translucency";
prefix = "(491)";
flags8text = "[3] Set delay by backside sector";
flags16text = "[4] Set raw alpha by Front X";
flags256text = "[8] Set relative to current";
}
492
{
title = "Fade PolyObject Translucency";
prefix = "(492)";
flags8text = "[3] Set delay by backside sector";
flags16text = "[4] Set raw alpha by Front X";
flags32text = "[5] No collision during fade";
flags256text = "[8] Set relative to current";
flags512text = "[9] Speed = Tic Duration";
flags1024text = "[10] Override existing fade";
flags16384text = "[14] Do not handle collision";
}
}
wallscroll
{
title = "Wall Scrolling";
500
{
title = "Scroll Front Wall Left";
prefix = "(500)";
}
501
{
title = "Scroll Front Wall Right";
prefix = "(501)";
}
502
{
title = "Scroll Tagged Walls";
prefix = "(502)";
flags128text = "[7] Use texture offsets";
flags256text = "[8] Scroll back side";
}
503
{
title = "Scroll Tagged Walls (Accelerative)";
prefix = "(503)";
flags128text = "[7] Use texture offsets";
flags256text = "[8] Scroll back side";
}
504
{
title = "Scroll Tagged Walls (Displacement)";
prefix = "(504)";
flags128text = "[7] Use texture offsets";
flags256text = "[8] Scroll back side";
}
505
{
title = "Scroll Front Wall by Front Side Offsets";
prefix = "(505)";
}
506
{
title = "Scroll Front Wall by Back Side Offsets";
prefix = "(506)";
}
507
{
title = "Scroll Back Wall by Front Side Offsets";
prefix = "(507)";
}
508
{
title = "Scroll Back Wall by Back Side Offsets";
prefix = "(508)";
}
}
planescroll
{
title = "Plane Scrolling";
510
{
title = "Scroll Floor Texture";
prefix = "(510)";
}
511
{
title = "Scroll Floor Texture (Accelerative)";
prefix = "(511)";
}
512
{
title = "Scroll Floor Texture (Displacement)";
prefix = "(512)";
}
513
{
title = "Scroll Ceiling Texture";
prefix = "(513)";
}
514
{
title = "Scroll Ceiling Texture (Accelerative)";
prefix = "(514)";
}
515
{
title = "Scroll Ceiling Texture (Displacement)";
prefix = "(515)";
}
520
{
title = "Carry Objects on Floor";
prefix = "(520)";
flags64text = "[6] Exclusive";
}
521
{
title = "Carry Objects on Floor (Accelerative)";
prefix = "(521)";
flags64text = "[6] Exclusive";
}
522
{
title = "Carry Objects on Floor (Displacement)";
prefix = "(522)";
flags64text = "[6] Exclusive";
}
523
{
title = "Carry Objects on Ceiling";
prefix = "(523)";
flags64text = "[6] Exclusive";
}
524
{
title = "Carry Objects on Ceiling (Accelerative)";
prefix = "(524)";
flags64text = "[6] Exclusive";
}
525
{
title = "Carry Objects on Ceiling (Displacement)";
prefix = "(525)";
flags64text = "[6] Exclusive";
}
530
{
title = "Scroll Floor Texture and Carry Objects";
prefix = "(530)";
flags64text = "[6] Exclusive";
}
531
{
title = "Scroll Floor Texture and Carry Objects (Accelerative)";
prefix = "(531)";
flags64text = "[6] Exclusive";
}
532
{
title = "Scroll Floor Texture and Carry Objects (Displacement)";
prefix = "(532)";
flags64text = "[6] Exclusive";
}
533
{
title = "Scroll Ceiling Texture and Carry Objects";
prefix = "(533)";
flags64text = "[6] Exclusive";
}
534
{
title = "Scroll Ceiling Texture and Carry Objects (Accelerative)";
prefix = "(534)";
flags64text = "[6] Exclusive";
}
535
{
title = "Scroll Ceiling Texture and Carry Objects (Displacement)";
prefix = "(535)";
flags64text = "[6] Exclusive";
}
}
pusher
{
title = "Pusher";
541
{
title = "Wind";
prefix = "(541)";
flags512text = "[9] Player slides";
flags64text = "[6] Exclusive";
}
542
{
title = "Upwards Wind";
prefix = "(542)";
flags512text = "[9] Player slides";
flags64text = "[6] Exclusive";
}
543
{
title = "Downwards Wind";
prefix = "(543)";
flags512text = "[9] Player slides";
flags64text = "[6] Exclusive";
}
544
{
title = "Current";
prefix = "(544)";
flags512text = "[9] Player slides";
flags64text = "[6] Exclusive";
}
545
{
title = "Upwards Current";
prefix = "(545)";
flags512text = "[9] Player slides";
flags64text = "[6] Exclusive";
}
546
{
title = "Downwards Current";
prefix = "(546)";
flags512text = "[9] Player slides";
flags64text = "[6] Exclusive";
}
547
{
title = "Push/Pull";
prefix = "(547)";
flags64text = "[6] Exclusive";
}
}
light
{
title = "Lighting";
600
{
title = "Floor Lighting";
prefix = "(600)";
}
601
{
title = "Ceiling Lighting";
prefix = "(601)";
}
602
{
title = "Adjustable Pulsating Light";
prefix = "(602)";
}
603
{
title = "Adjustable Flickering Light";
prefix = "(603)";
}
604
{
title = "Adjustable Blinking Light (unsynchronized)";
prefix = "(604)";
}
605
{
title = "Adjustable Blinking Light (synchronized)";
prefix = "(605)";
}
606
{
title = "Colormap";
prefix = "(606)";
}
}
slope
{
title = "Slope";
700
{
title = "Slope Frontside Floor";
prefix = "(700)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags32768text = "[15] Copy to other side";
slope = "regular";
slopeargs = 1;
copyslopeargs = 1;
}
701
{
title = "Slope Frontside Ceiling";
prefix = "(701)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags32768text = "[15] Copy to other side";
slope = "regular";
slopeargs = 2;
copyslopeargs = 4;
}
702
{
title = "Slope Frontside Floor and Ceiling";
prefix = "(702)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags32768text = "[15] Copy to other side";
slope = "regular";
slopeargs = 3;
copyslopeargs = 5;
}
703
{
title = "Slope Frontside Floor and Backside Ceiling";
prefix = "(703)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags32768text = "[15] Copy to other side";
slope = "regular";
slopeargs = 9;
copyslopeargs = 8;
}
704
{
title = "Slope Frontside Floor by 3 Tagged Vertex Things";
prefix = "(704)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags8192text = "[13] Use tag and offsets";
slope = "vertex";
slopeargs = 0;
}
705
{
title = "Slope Frontside Ceiling by 3 Tagged Vertex Things";
prefix = "(705)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags8192text = "[13] Use tag and offsets";
slope = "vertex";
slopeargs = 1;
}
710
{
title = "Slope Backside Floor";
prefix = "(710)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags32768text = "[15] Copy to other side";
slope = "regular";
slopeargs = 4;
copyslopeargs = 2;
}
711
{
title = "Slope Backside Ceiling";
prefix = "(711)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags32768text = "[15] Copy to other side";
slope = "regular";
slopeargs = 8;
copyslopeargs = 8;
}
712
{
title = "Slope Backside Floor and Ceiling";
prefix = "(712)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags32768text = "[15] Copy to other side";
slope = "regular";
slopeargs = 12;
copyslopeargs = 10;
}
713
{
title = "Slope Backside Floor and Frontside Ceiling";
prefix = "(713)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags32768text = "[15] Copy to other side";
slope = "regular";
slopeargs = 6;
copyslopeargs = 6;
}
714
{
title = "Slope Backside Floor by 3 Tagged Vertex Things";
prefix = "(714)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags8192text = "[13] Use tag and offsets";
slope = "vertex";
slopeargs = 2;
}
715
{
title = "Slope Backside Ceiling by 3 Tagged Vertex Things";
prefix = "(715)";
flags2048text = "[11] No physics";
flags4096text = "[12] Dynamic";
flags8192text = "[13] Use tag and offsets";
slope = "vertex";
slopeargs = 3;
}
720
{
title = "Copy Frontside Floor Slope from Line Tag";
prefix = "(720)";
slope = "copy";
slopeargs = 1;
}
721
{
title = "Copy Frontside Ceiling Slope from Line Tag";
prefix = "(721)";
slope = "copy";
slopeargs = 2;
}
722
{
title = "Copy Frontside Floor and Ceiling Slope from Line Tag";
prefix = "(722)";
slope = "copy";
slopeargs = 3;
}
723
{
title = "Copy Backside Floor Slope from Line Tag";
prefix = "(723)";
slope = "copy";
slopeargs = 4;
}
724
{
title = "Copy Backside Ceiling Slope from Line Tag";
prefix = "(724)";
slope = "copy";
slopeargs = 8;
}
725
{
title = "Copy Backside Floor and Ceiling Slope from Line Tag";
prefix = "(725)";
slope = "copy";
slopeargs = 12;
}
730
{
title = "Copy Frontside Floor Slope to Backside";
prefix = "(730)";
slope = "copy";
copyslopeargs = 1;
}
731
{
title = "Copy Frontside Ceiling Slope to Backside";
prefix = "(731)";
slope = "copy";
copyslopeargs = 4;
}
732
{
title = "Copy Frontside Floor and Ceiling Slope to Backside";
prefix = "(732)";
slope = "copy";
copyslopeargs = 5;
}
733
{
title = "Copy Backside Floor Slope to Frontside";
prefix = "(733)";
slope = "copy";
copyslopeargs = 2;
}
734
{
title = "Copy Backside Ceiling Slope to Frontside";
prefix = "(734)";
slope = "copy";
copyslopeargs = 8;
}
735
{
title = "Copy Backside Floor and Ceiling Slope to Frontside";
prefix = "(735)";
slope = "copy";
copyslopeargs = 10;
}
799
{
title = "Set Tagged Dynamic Slope Vertex to Front Sector Height";
prefix = "(799)";
flags64text = "[6] Use relative heights";
}
}
transwall
{
title = "Translucent Walls";
900
{
title = "90% Opaque";
prefix = "(900)";
}
901
{
title = "80% Opaque";
prefix = "(901)";
}
902
{
title = "70% Opaque";
prefix = "(902)";
}
903
{
title = "60% Opaque";
prefix = "(903)";
}
904
{
title = "50% Opaque";
prefix = "(904)";
}
905
{
title = "40% Opaque";
prefix = "(905)";
}
906
{
title = "30% Opaque";
prefix = "(906)";
}
907
{
title = "20% Opaque";
prefix = "(907)";
}
908
{
title = "10% Opaque";
prefix = "(908)";
}
909
{
title = "Fog Wall";
prefix = "(909)";
}
910
{
title = "100% Additive";
prefix = "(910)";
}
911
{
title = "90% Additive";
prefix = "(911)";
}
912
{
title = "80% Additive";
prefix = "(912)";
}
913
{
title = "70% Additive";
prefix = "(913)";
}
914
{
title = "60% Additive";
prefix = "(914)";
}
915
{
title = "50% Additive";
prefix = "(915)";
}
916
{
title = "40% Additive";
prefix = "(916)";
}
917
{
title = "30% Additive";
prefix = "(917)";
}
918
{
title = "20% Additive";
prefix = "(918)";
}
919
{
title = "10% Additive";
prefix = "(919)";
}
920
{
title = "100% Subtractive";
prefix = "(920)";
}
921
{
title = "90% Subtractive";
prefix = "(921)";
}
922
{
title = "80% Subtractive";
prefix = "(922)";
}
923
{
title = "70% Subtractive";
prefix = "(923)";
}
924
{
title = "60% Subtractive";
prefix = "(924)";
}
925
{
title = "50% Subtractive";
prefix = "(925)";
}
926
{
title = "40% Subtractive";
prefix = "(926)";
}
927
{
title = "30% Subtractive";
prefix = "(927)";
}
928
{
title = "20% Subtractive";
prefix = "(928)";
}
929
{
title = "10% Subtractive";
prefix = "(929)";
}
930
{
title = "100% Reverse Subtractive";
prefix = "(930)";
}
931
{
title = "90% Reverse Subtractive";
prefix = "(931)";
}
932
{
title = "80% Reverse Subtractive";
prefix = "(932)";
}
933
{
title = "70% Reverse Subtractive";
prefix = "(933)";
}
934
{
title = "60% Reverse Subtractive";
prefix = "(934)";
}
935
{
title = "50% Reverse Subtractive";
prefix = "(935)";
}
936
{
title = "40% Reverse Subtractive";
prefix = "(936)";
}
937
{
title = "30% Reverse Subtractive";
prefix = "(937)";
}
938
{
title = "20% Reverse Subtractive";
prefix = "(938)";
}
939
{
title = "10% Reverse Subtractive";
prefix = "(939)";
}
940
{
title = "Modulate";
prefix = "(940)";
}
}
}
// THING FLAGS
thingflags
{
1 = "[1] Extra";
2 = "[2] Flip";
4 = "[4] Special";
8 = "[8] Ambush";
}
// Thing flags UDMF translation table
// This is needed for copy/paste and prefabs to work properly
// When the UDMF field name is prefixed with ! it is inverted
thingflagstranslation
{
1 = "skill1";
2 = "skill2";
4 = "skill3";
8 = "ambush";
}
// THING FLAGS ERROR MASK
// Mask for the thing flags which indicates the options
// that make the same thing appear in the same modes
thingflagsmask1 = 7; // 1 + 2 + 4
thingflagsmask2 = 0;
// THING TYPES------------------------------------------------------------------
// Color values: 1-Dark_Blue 2-Dark_Green 3-Turqoise 4-Dark_Red 5-Purple 6-Brown 7-Gray
// 8-Dark_Gray 9-Blue 10-Green 11-Cyan 12-Red 13-Magenta
// 14-Yellow 15-White 16-Pink 17-Orange 18-Gold 19-Cream
thingtypes
{
editor
{
color = 15; // White
arrow = 1;
title = "<Editor Things>";
error = -1;
width = 8;
height = 16;
sort = 1;
3328 = "3D Mode Start";
}
starts
{
color = 1; // Blue
arrow = 1;
title = "Player Starts";
width = 16;
height = 48;
flags8text = "[8] Spawn on ceiling";
sprite = "PLAYA0";
1
{
title = "Player 01 Start";
sprite = "PLAYA0";
}
2
{
title = "Player 02 Start";
sprite = "PLAYA0";
}
3
{
title = "Player 03 Start";
sprite = "PLAYA0";
}
4
{
title = "Player 04 Start";
sprite = "PLAYA0";
}
5
{
title = "Player 05 Start";
sprite = "PLAYA0";
}
6
{
title = "Player 06 Start";
sprite = "PLAYA0";
}
7
{
title = "Player 07 Start";
sprite = "PLAYA0";
}
8
{
title = "Player 08 Start";
sprite = "PLAYA0";
}
9
{
title = "Player 09 Start";
sprite = "PLAYA0";
}
10
{
title = "Player 10 Start";
sprite = "PLAYA0";
}
11
{
title = "Player 11 Start";
sprite = "PLAYA0";
}
12
{
title = "Player 12 Start";
sprite = "PLAYA0";
}
13
{
title = "Player 13 Start";
sprite = "PLAYA0";
}
14
{
title = "Player 14 Start";
sprite = "PLAYA0";
}
15
{
title = "Player 15 Start";
sprite = "PLAYA0";
}
16
{
title = "Player 16 Start";
sprite = "PLAYA0";
}
17
{
title = "Player 17 Start";
sprite = "PLAYA0";
}
18
{
title = "Player 18 Start";
sprite = "PLAYA0";
}
19
{
title = "Player 19 Start";
sprite = "PLAYA0";
}
20
{
title = "Player 20 Start";
sprite = "PLAYA0";
}
21
{
title = "Player 21 Start";
sprite = "PLAYA0";
}
22
{
title = "Player 22 Start";
sprite = "PLAYA0";
}
23
{
title = "Player 23 Start";
sprite = "PLAYA0";
}
24
{
title = "Player 24 Start";
sprite = "PLAYA0";
}
25
{
title = "Player 25 Start";
sprite = "PLAYA0";
}
26
{
title = "Player 26 Start";
sprite = "PLAYA0";
}
27
{
title = "Player 27 Start";
sprite = "PLAYA0";
}
28
{
title = "Player 28 Start";
sprite = "PLAYA0";
}
29
{
title = "Player 29 Start";
sprite = "PLAYA0";
}
30
{
title = "Player 30 Start";
sprite = "PLAYA0";
}
31
{
title = "Player 31 Start";
sprite = "PLAYA0";
}
32
{
title = "Player 32 Start";
sprite = "PLAYA0";
}
33
{
title = "Match Start";
sprite = "NDRNA2A8";
}
34
{
title = "CTF Red Team Start";
sprite = "SIGNG0";
}
35
{
title = "CTF Blue Team Start";
sprite = "SIGNE0";
}
}
enemies
{
color = 9; // Light Blue
arrow = 1;
title = "Enemies";
100
{
title = "Crawla (Blue)";
sprite = "POSSA1";
width = 24;
height = 32;
}
101
{
title = "Crawla (Red)";
sprite = "SPOSA1";
width = 24;
height = 32;
}
102
{
title = "Stupid Dumb Unnamed RoboFish";
sprite = "FISHA0";
width = 8;
height = 28;
angletext = "Jump strength";
fixedrotation = 1;
}
103
{
title = "Buzz (Gold)";
sprite = "BUZZA1";
width = 28;
height = 40;
flags8text = "[8] Cannot move";
}
104
{
title = "Buzz (Red)";
sprite = "RBUZA1";
width = 28;
height = 40;
flags8text = "[8] Cannot move";
}
108
{
title = "Deton";
sprite = "DETNA1";
width = 20;
height = 32;
}
110
{
title = "Turret";
sprite = "TRETA1";
width = 16;
height = 32;
}
111
{
title = "Pop-up Turret";
sprite = "TURRI1";
width = 12;
height = 64;
angletext = "Firing delay";
fixedrotation = 1;
}
122
{
title = "Spring Shell (Green)";
sprite = "SSHLA1";
width = 24;
height = 40;
}
125
{
title = "Spring Shell (Yellow)";
sprite = "SSHLI1";
width = 24;
height = 40;
}
109
{
title = "Skim";
sprite = "SKIMA1";
width = 16;
height = 24;
}
113
{
title = "Jet Jaw";
sprite = "JJAWA3A7";
width = 12;
height = 20;
}
126
{
title = "Crushstacean";
sprite = "CRABA0";
width = 24;
height = 32;
flags8text = "[8] Move left from spawn";
}
138
{
title = "Banpyura";
sprite = "CR2BA0";
width = 24;
height = 32;
flags8text = "[8] Move left from spawn";
}
117
{
title = "Robo-Hood";
sprite = "ARCHA1";
width = 24;
height = 32;
flags8text = "[8] Don't jump away";
}
118
{
title = "Lance-a-Bot";
sprite = "CBFSA1";
width = 32;
height = 72;
}
1113
{
title = "Suspicious Lance-a-Bot Statue";
sprite = "CBBSA1";
width = 32;
height = 72;
}
119
{
title = "Egg Guard";
sprite = "ESHIA1";
width = 16;
height = 48;
flags1text = "[1] 90 degrees clockwise";
flags4text = "[4] 90 degrees counter-clockwise";
flags8text = "[8] Double speed";
}
115
{
title = "Bird Aircraft Strike Hazard";
sprite = "VLTRF1";
width = 12;
height = 24;
}
120
{
title = "Green Snapper";
sprite = "GSNPA1";
width = 24;
height = 24;
}
121
{
title = "Minus";
sprite = "MNUSA0";
width = 24;
height = 32;
}
134
{
title = "Canarivore";
sprite = "CANAA0";
width = 12;
height = 80;
hangs = 1;
}
123
{
title = "Unidus";
sprite = "UNIDA1";
width = 18;
height = 36;
}
135
{
title = "Pterabyte Spawner";
sprite = "PTERA2A8";
width = 24;
height = 48;
parametertext = "Spawns +1";
arrow = 0;
}
136
{
title = "Pyre Fly";
sprite = "PYREA0";
width = 24;
height = 34;
flags8text = "[8] Start on fire";
}
137
{
title = "Dragonbomber";
sprite = "DRABA1";
width = 28;
height = 48;
}
105
{
title = "Jetty-Syn Bomber";
sprite = "JETBB1";
width = 20;
height = 50;
flags8text = "[8] Cannot move";
}
106
{
title = "Jetty-Syn Gunner";
sprite = "JETGB1";
width = 20;
height = 48;
flags8text = "[8] Cannot move";
}
112
{
title = "Spincushion";
sprite = "SHRPA1";
width = 16;
height = 24;
}
114
{
title = "Snailer";
sprite = "SNLRA3A7";
width = 24;
height = 48;
}
129
{
title = "Penguinator";
sprite = "PENGA1";
width = 24;
height = 32;
}
130
{
title = "Pophat";
sprite = "POPHA1";
width = 24;
height = 32;
}
107
{
title = "Crawla Commander";
sprite = "CCOMA1";
width = 16;
height = 32;
}
131
{
title = "Spinbobert";
sprite = "SBOBB0";
width = 32;
height = 32;
}
132
{
title = "Cacolantern";
sprite = "CACOA0";
width = 32;
height = 32;
flags8text = "[8] Cannot move";
}
133
{
title = "Hangster";
sprite = "HBATC1";
width = 24;
height = 24;
hangs = 1;
}
127
{
title = "Hive Elemental";
sprite = "HIVEA0";
width = 32;
height = 80;
parametertext = "No. bees";
}
128
{
title = "Bumblebore";
sprite = "BUMBA1";
width = 16;
height = 32;
flags8text = "[8] Cannot move";
}
124
{
title = "Buggle";
sprite = "BBUZA1";
width = 20;
height = 24;
}
116
{
title = "Pointy";
sprite = "PNTYA1";
width = 8;
height = 16;
}
}
bosses
{
color = 4; // Dark Red
arrow = 1;
title = "Bosses";
200
{
title = "Egg Mobile";
sprite = "EGGMA1";
width = 36;
height = 84;
flags4text = "[4] End level on death";
}
201
{
title = "Egg Slimer";
sprite = "EGGNA1";
width = 36;
height = 84;
flags4text = "[4] End level on death";
flags8text = "[8] Speed up when hit";
}
202
{
title = "Sea Egg";
sprite = "EGGOA1";
width = 36;
height = 116;
flags4text = "[4] End level on death";
}
203
{
title = "Egg Colosseum";
sprite = "EGGPA1";
width = 36;
height = 84;
flags4text = "[4] End level on death";
}
204
{
title = "Fang";
sprite = "FANGA1";
width = 24;
height = 60;
flags1text = "[1] Grayscale mode";
flags4text = "[4] End level on death";
flags8text = "[8] Skip intro";
}
206
{
title = "Brak Eggman (Old)";
sprite = "BRAKB1";
width = 48;
height = 160;
flags4text = "[4] End level on death";
}
207
{
title = "Metal Sonic (Race)";
sprite = "METLI1";
width = 16;
height = 48;
flags1text = "[1] Grayscale mode";
}
208
{
title = "Metal Sonic (Battle)";
sprite = "METLC1";
width = 16;
height = 48;
flags1text = "[1] Grayscale mode";
flags4text = "[4] End level on death";
}
209
{
title = "Brak Eggman";
sprite = "BRAK01";
width = 48;
height = 160;
flags1text = "[1] No origin-fling death";
flags4text = "[4] End level on death";
flags8text = "[8] Electric barrier";
}
290
{
arrow = 0;
title = "Boss Escape Point";
width = 8;
height = 16;
sprite = "internal:eggmanend";
}
291
{
arrow = 0;
title = "Egg Capsule Center";
width = 8;
height = 16;
sprite = "internal:capsule";
angletext = "Tag";
fixedrotation = 1;
tagthing = true;
}
292
{
arrow = 0;
title = "Boss Waypoint";
width = 8;
height = 16;
flags8text = "[8] Sea Egg shooting point";
sprite = "internal:eggmanway";
angletext = "No. (Sea Egg)";
fixedrotation = 1;
flagsvaluetext = "No. (Brak)";
parametertext = "Next";
}
293
{
arrow = 0;
title = "Metal Sonic Gather Point";
sprite = "internal:metal";
width = 8;
height = 16;
}
294
{
arrow = 0;
title = "Fang Waypoint";
flags8text = "[8] Center waypoint";
sprite = "internal:eggmanway";
width = 8;
height = 16;
}
}
rings
{
color = 14; // Yellow
title = "Rings and Weapon Panels";
width = 24;
height = 24;
flags8height = 24;
flags8text = "[8] Float";
sprite = "RINGA0";
300
{
title = "Ring";
sprite = "RINGA0";
width = 16;
}
301
{
title = "Bounce Ring";
sprite = "RNGBA0";
}
302
{
title = "Rail Ring";
sprite = "RNGRA0";
}
303
{
title = "Infinity Ring";
sprite = "RNGIA0";
}
304
{
title = "Automatic Ring";
sprite = "RNGAA0";
}
305
{
title = "Explosion Ring";
sprite = "RNGEA0";
}
306
{
title = "Scatter Ring";
sprite = "RNGSA0";
}
307
{
title = "Grenade Ring";
sprite = "RNGGA0";
}
308
{
title = "CTF Team Ring (Red)";
sprite = "internal:TRNGA0R";
width = 16;
}
309
{
title = "CTF Team Ring (Blue)";
sprite = "internal:TRNGA0B";
width = 16;
}
330
{
title = "Bounce Ring Panel";
sprite = "PIKBA0";
}
331
{
title = "Rail Ring Panel";
sprite = "PIKRA0";
}
332
{
title = "Automatic Ring Panel";
sprite = "PIKAA0";
}
333
{
title = "Explosion Ring Panel";
sprite = "PIKEA0";
}
334
{
title = "Scatter Ring Panel";
sprite = "PIKSA0";
}
335
{
title = "Grenade Ring Panel";
sprite = "PIKGA0";
}
}
collectibles
{
color = 10; // Light Green
title = "Other Collectibles";
width = 16;
height = 32;
sort = 1;
sprite = "CEMGA0";
310
{
title = "CTF Red Flag";
sprite = "RFLGA0";
width = 24;
height = 64;
}
311
{
title = "CTF Blue Flag";
sprite = "BFLGA0";
width = 24;
height = 64;
}
312
{
title = "Emerald Token";
sprite = "TOKEA0";
width = 16;
height = 32;
flags8height = 24;
flags8text = "[8] Float";
}
313
{
title = "Chaos Emerald 1 (Green)";
sprite = "CEMGA0";
}
314
{
title = "Chaos Emerald 2 (Purple)";
sprite = "CEMGB0";
}
315
{
title = "Chaos Emerald 3 (Blue)";
sprite = "CEMGC0";
}
316
{
title = "Chaos Emerald 4 (Cyan)";
sprite = "CEMGD0";
}
317
{
title = "Chaos Emerald 5 (Orange)";
sprite = "CEMGE0";
}
318
{
title = "Chaos Emerald 6 (Red)";
sprite = "CEMGF0";
}
319
{
title = "Chaos Emerald 7 (Gray)";
sprite = "CEMGG0";
}
320
{
title = "Emerald Hunt Location";
sprite = "SHRDA0";
flags8height = 24;
flags8text = "[8] Float";
}
321
{
title = "Match Chaos Emerald Spawn";
sprite = "CEMGA0";
flags8height = 24;
flags8text = "[8] Float";
}
322
{
title = "Emblem";
sprite = "EMBMA0";
width = 16;
height = 30;
flags8height = 24;
flags8text = "[8] Float";
angletext = "Tag";
fixedrotation = 1;
}
}
boxes
{
color = 7; // Gray
blocking = 2;
title = "Monitors";
width = 18;
height = 40;
flags1text = "[1] Run linedef executor on pop";
flags4text = "[4] Random (Strong)";
flags8text = "[8] Random (Weak)";
angletext = "Tag";
fixedrotation = 1;
tagthing = true;
400
{
title = "Super Ring (10 Rings)";
sprite = "TVRIA0";
}
401
{
title = "Pity Shield";
sprite = "TVPIA0";
}
402
{
title = "Attraction Shield";
sprite = "TVATA0";
}
403
{
title = "Force Shield";
sprite = "TVFOA0";
}
404
{
title = "Armageddon Shield";
sprite = "TVARA0";
}
405
{
title = "Whirlwind Shield";
sprite = "TVWWA0";
}
406
{
title = "Elemental Shield";
sprite = "TVELA0";
}
407
{
title = "Super Sneakers";
sprite = "TVSSA0";
}
408
{
title = "Invincibility";
sprite = "TVIVA0";
}
409
{
title = "Extra Life";
sprite = "TV1UA0";
flags4text = "[4] Random (Strong) / 10k points";
flags8text = "[8] Random (Weak) / 10k points";
}
410
{
title = "Eggman";
sprite = "TVEGA0";
flags4text = "[4] Special";
flags8text = "[8] Ambush";
}
411
{
title = "Teleporter";
sprite = "TVMXA0";
}
413
{
title = "Gravity Boots";
sprite = "TVGVA0";
flags4text = "[4] Special";
flags8text = "[8] Ambush";
}
414
{
title = "CTF Team Ring Monitor (Red)";
sprite = "TRRIA0";
flags4text = "[4] Special";
flags8text = "[8] Ambush";
}
415
{
title = "CTF Team Ring Monitor (Blue)";
sprite = "TBRIA0";
flags4text = "[4] Special";
flags8text = "[8] Ambush";
}
416
{
title = "Recycler";
sprite = "TVRCA0";
}
418
{
title = "Score (1,000 Points)";
sprite = "TV1KA0";
flags4text = "[4] Special";
flags8text = "[8] Ambush";
}
419
{
title = "Score (10,000 Points)";
sprite = "TVTKA0";
flags4text = "[4] Special";
flags8text = "[8] Ambush";
}
420
{
title = "Flame Shield";
sprite = "TVFLA0";
}
421
{
title = "Water Shield";
sprite = "TVBBA0";
}
422
{
title = "Lightning Shield";
sprite = "TVZPA0";
}
}
boxes2
{
color = 18; // Gold
blocking = 2;
title = "Monitors (Respawning)";
width = 20;
height = 44;
flags1text = "[1] Run linedef executor on pop";
angletext = "Tag";
fixedrotation = 1;
tagthing = true;
431
{
title = "Pity Shield (Respawn)";
sprite = "TVPIB0";
}
432
{
title = "Attraction Shield (Respawn)";
sprite = "TVATB0";
}
433
{
title = "Force Shield (Respawn)";
sprite = "TVFOB0";
}
434
{
title = "Armageddon Shield (Respawn)";
sprite = "TVARB0";
}
435
{
title = "Whirlwind Shield (Respawn)";
sprite = "TVWWB0";
}
436
{
title = "Elemental Shield (Respawn)";
sprite = "TVELB0";
}
437
{
title = "Super Sneakers (Respawn)";
sprite = "TVSSB0";
}
438
{
title = "Invincibility (Respawn)";
sprite = "TVIVB0";
}
440
{
title = "Eggman (Respawn)";
sprite = "TVEGB0";
}
443
{
title = "Gravity Boots (Respawn)";
sprite = "TVGVB0";
}
450
{
title = "Flame Shield (Respawn)";
sprite = "TVFLB0";
}
451
{
title = "Water Shield (Respawn)";
sprite = "TVBBB0";
}
452
{
title = "Lightning Shield (Respawn)";
sprite = "TVZPB0";
}
}
generic
{
color = 11; // Light Cyan
title = "Generic Items & Hazards";
500
{
title = "Air Bubble Patch";
sprite = "BUBLE0";
width = 8;
height = 16;
flags8text = "[8] No distance check";
}
501
{
title = "Signpost";
sprite = "SIGND0";
width = 8;
height = 32;
}
502
{
arrow = 1;
title = "Star Post";
sprite = "STPTA0M0";
width = 64;
height = 128;
flags4text = "[4] Respawn at center";
angletext = "Angle/Order";
fixedrotation = 1;
parametertext = "Order";
}
520
{
title = "Bomb Sphere";
sprite = "SPHRD0";
width = 16;
height = 24;
flags8height = 24;
flags8text = "[8] Float";
unflippable = true;
}
521
{
title = "Spikeball";
sprite = "SPIKA0";
width = 12;
height = 8;
flags8height = 24;
flags8text = "[8] Float";
}
522
{
title = "Wall Spike";
sprite = "WSPKALAR";
width = 16;
height = 14;
arrow = 1;
flags1text = "[1] Start retracted";
flags4text = "[4] Retractable";
flags8text = "[8] Intangible";
parametertext = "Start delay";
}
523
{
title = "Spike";
sprite = "USPKA0";
width = 8;
height = 32;
flags1text = "[1] Start retracted";
flags4text = "[4] Retractable";
flags8text = "[8] Intangible";
angletext = "Retraction interval";
fixedrotation = 1;
parametertext = "Start delay";
}
1130
{
title = "Small Mace";
sprite = "SMCEA0";
width = 17;
height = 34;
}
1131
{
title = "Big Mace";
sprite = "BMCEA0";
width = 34;
height = 68;
}
1136
{
title = "Small Fireball";
sprite = "SFBRA0";
width = 17;
height = 34;
}
1137
{
title = "Large Fireball";
sprite = "BFBRA0";
width = 34;
height = 68;
}
}
springs
{
color = 12; // Light Red
title = "Springs and Fans";
width = 20;
height = 16;
sprite = "RSPRD2";
540
{
title = "Fan";
sprite = "FANSA0D0";
width = 16;
height = 8;
flags4text = "[4] Invisible";
flags8text = "[8] No distance check";
angletext = "Lift height";
fixedrotation = 1;
}
541
{
title = "Gas Jet";
sprite = "STEMD0";
flags8text = "[8] No sounds";
width = 32;
}
542
{
title = "Bumper";
sprite = "BUMPA0";
width = 32;
height = 64;
angletext = "Strength";
fixedrotation = 1;
}
543
{
title = "Balloon";
sprite = "BLONA0";
width = 32;
height = 64;
flags8text = "[8] Respawn";
angletext = "Color";
fixedrotation = 1;
}
550
{
title = "Yellow Spring";
sprite = "SPRYA0";
}
551
{
title = "Red Spring";
sprite = "SPRRA0";
}
552
{
title = "Blue Spring";
sprite = "SPRBA0";
}
555
{
arrow = 1;
title = "Diagonal Yellow Spring";
sprite = "YSPRD2";
width = 16;
flags4text = "[4] Ignore gravity";
flags8text = "[8] Rotate 22.5° CCW";
}
556
{
arrow = 1;
title = "Diagonal Red Spring";
sprite = "RSPRD2";
width = 16;
flags4text = "[4] Ignore gravity";
flags8text = "[8] Rotate 22.5° CCW";
}
557
{
arrow = 1;
title = "Diagonal Blue Spring";
sprite = "BSPRD2";
width = 16;
flags4text = "[4] Ignore gravity";
flags8text = "[8] Rotate 22.5° CCW";
}
558
{
arrow = 1;
title = "Horizontal Yellow Spring";
sprite = "SSWYD2D8";
flags8height = 16;
flags8text = "[8] Float";
width = 16;
height = 32;
}
559
{
arrow = 1;
title = "Horizontal Red Spring";
sprite = "SSWRD2D8";
flags8height = 16;
flags8text = "[8] Float";
width = 16;
height = 32;
}
560
{
arrow = 1;
title = "Horizontal Blue Spring";
sprite = "SSWBD2D8";
flags8height = 16;
flags8text = "[8] Float";
width = 16;
height = 32;
}
1134
{
title = "Yellow Spring Ball";
sprite = "YSPBA0";
width = 17;
height = 34;
}
1135
{
title = "Red Spring Ball";
sprite = "RSPBA0";
width = 17;
height = 34;
}
544
{
arrow = 1;
title = "Yellow Boost Panel";
sprite = "BSTYA0";
flags8text = "[8] Force spin";
width = 28;
height = 2;
}
545
{
arrow = 1;
title = "Red Boost Panel";
sprite = "BSTRA0";
flags8text = "[8] Force spin";
width = 28;
height = 2;
}
}
patterns
{
color = 5; // Magenta
arrow = 1;
title = "Special Placement Patterns";
width = 16;
height = 384;
sprite = "RINGA0";
600
{
arrow = 0;
title = "5 Vertical Rings (Yellow Spring)";
sprite = "internal:ringverticalyellow";
}
601
{
arrow = 0;
title = "5 Vertical Rings (Red Spring)";
sprite = "internal:ringverticalred";
height = 1024;
}
602
{
title = "5 Diagonal Rings (Yellow Spring)";
sprite = "RINGA0";
height = 32;
}
603
{
title = "10 Diagonal Rings (Red Spring)";
sprite = "RINGA0";
height = 32;
}
604
{
title = "Circle of Rings";
sprite = "internal:circlering";
width = 96;
height = 192;
unflippable = true;
centerHitbox = true;
}
605
{
title = "Circle of Rings (Big)";
sprite = "internal:circlebigring";
width = 192;
unflippable = true;
centerHitbox = true;
}
606
{
title = "Circle of Blue Spheres";
sprite = "internal:circlesphere";
width = 96;
height = 192;
unflippable = true;
centerHitbox = true;
}
607
{
title = "Circle of Blue Spheres (Big)";
sprite = "internal:circlebigsphere";
width = 192;
unflippable = true;
centerHitbox = true;
}
608
{
title = "Circle of Rings and Spheres";
sprite = "internal:circleringsphere";
width = 96;
height = 192;
unflippable = true;
centerHitbox = true;
}
609
{
title = "Circle of Rings and Spheres (Big)";
sprite = "internal:circlebigringsphere";
width = 192;
unflippable = true;
centerHitbox = true;
}
}
ambience
{
color = 8; // Dark Gray
title = "Ambience";
width = 8;
height = 16;
sprite = "internal:ambiance";
700
{
title = "Water Ambience A (Large)";
}
701
{
title = "Water Ambience B (Large)";
}
702
{
title = "Water Ambience C (Medium)";
}
703
{
title = "Water Ambience D (Medium)";
}
704
{
title = "Water Ambience E (Small)";
}
705
{
title = "Water Ambience F (Small)";
}
706
{
title = "Water Ambience G (Extra Large)";
}
707
{
title = "Water Ambience H (Extra Large)";
}
708
{
title = "Disco Ambience";
}
709
{
title = "Volcano Ambience";
}
710
{
title = "Machine Ambience";
}
}
invisible
{
color = 15; // White
title = "Misc. Invisible";
width = 8;
height = 16;
sprite = "UNKNA0";
750
{
title = "Slope Vertex";
sprite = "internal:vertexslope";
angletext = "Tag";
fixedrotation = 1;
parametertext = "Absolute?";
flagsvaluetext = "Absolute Z";
tagthing = true;
}
751
{
arrow = 1;
title = "Teleport Destination";
sprite = "internal:tele";
}
752
{
arrow = 1;
title = "Alternate View Point";
sprite = "internal:view";
}
753
{
title = "Zoom Tube Waypoint";
sprite = "internal:zoom";
angletext = "Order";
fixedrotation = 1;
}
754
{
title = "Push Point";
flags4text = "[4] Fades using XY";
flags8text = "[8] Push using XYZ";
sprite = "GWLGA0";
angletext = "Radius";
fixedrotation = 1;
}
755
{
title = "Pull Point";
flags4text = "[4] Fades using XY";
flags8text = "[8] Pull using XYZ";
sprite = "GWLRA0";
angletext = "Radius";
fixedrotation = 1;
}
756
{
title = "Blast Linedef Executor";
sprite = "internal:blastexec";
width = 32;
height = 16;
angletext = "Tag";
fixedrotation = 1;
tagthing = true;
}
757
{
title = "Fan Particle Generator";
sprite = "internal:fanparticles";
width = 8;
height = 16;
angletext = "Tag";
fixedrotation = 1;
tagthing = true;
}
758
{
title = "Object Angle Anchor";
sprite = "internal:view";
}
760
{
title = "PolyObject Anchor";
sprite = "internal:polyanchor";
angletext = "Tag";
fixedrotation = 1;
tagthing = true;
unflippable = true;
}
761
{
title = "PolyObject Spawn Point";
sprite = "internal:polycenter";
angletext = "Tag";
fixedrotation = 1;
tagthing = true;
unflippable = true;
}
762
{
title = "PolyObject Spawn Point (Crush)";
sprite = "internal:polycentercrush";
angletext = "Tag";
fixedrotation = 1;
tagthing = true;
unflippable = true;
}
780
{
title = "Skybox View Point";
sprite = "internal:skyb";
flags4text = "[4] In-map centerpoint";
parametertext = "ID";
fixedrotation = 1;
}
}
greenflower
{
color = 2; // Green
title = "Greenflower";
800
{
title = "GFZ Flower";
sprite = "FWR1A0";
width = 16;
height = 40;
}
801
{
title = "Sunflower";
sprite = "FWR2A0";
width = 16;
height = 96;
}
802
{
title = "Budding Flower";
sprite = "FWR3A0";
width = 8;
height = 32;
}
803
{
title = "Blueberry Bush";
sprite = "BUS3A0";
width = 16;
height = 32;
}
804
{
title = "Berry Bush";
sprite = "BUS1A0";
width = 16;
height = 32;
}
805
{
title = "Bush";
sprite = "BUS2A0";
width = 16;
height = 32;
}
806
{
title = "GFZ Tree";
sprite = "TRE1A0";
width = 20;
height = 128;
}
807
{
title = "GFZ Berry Tree";
sprite = "TRE1B0";
width = 20;
height = 128;
}
808
{
title = "GFZ Cherry Tree";
sprite = "TRE1C0";
width = 20;
height = 128;
}
809
{
title = "Checkered Tree";
sprite = "TRE2A0";
width = 20;
height = 200;
}
810
{
title = "Checkered Tree (Sunset)";
sprite = "TRE2B0";
width = 20;
height = 200;
}
811
{
title = "Polygon Tree";
sprite = "TRE4A0";
width = 20;
height = 200;
}
812
{
title = "Bush Tree";
sprite = "TRE5A0";
width = 20;
height = 200;
}
813
{
title = "Red Bush Tree";
sprite = "TRE5B0";
width = 20;
height = 200;
}
}
technohill
{
color = 2; // Green
title = "Techno Hill";
900
{
title = "THZ Steam Flower";
sprite = "THZPA0";
width = 8;
height = 32;
}
901
{
title = "Alarm";
sprite = "ALRMA0";
width = 8;
height = 16;
hangs = 1;
}
902
{
title = "THZ Spin Flower (Red)";
sprite = "FWR5A0";
width = 16;
height = 64;
}
903
{
title = "THZ Spin Flower (Yellow)";
sprite = "FWR6A0";
width = 16;
height = 64;
}
904
{
arrow = 1;
title = "Whistlebush";
sprite = "THZTA0";
width = 16;
height = 64;
}
}
deepsea
{
color = 2; // Green
title = "Deep Sea";
1000
{
arrow = 1;
blocking = 2;
title = "Gargoyle";
sprite = "GARGA1";
width = 16;
height = 40;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1009
{
arrow = 1;
blocking = 2;
title = "Gargoyle (Big)";
sprite = "GARGB1";
width = 32;
height = 80;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1001
{
title = "Seaweed";
sprite = "SEWEA0";
width = 24;
height = 56;
}
1002
{
title = "Dripping Water";
sprite = "DRIPD0";
width = 8;
height = 16;
hangs = 1;
angletext = "Dripping delay";
fixedrotation = 1;
}
1003
{
title = "Coral (Green)";
sprite = "CORLA0";
width = 29;
height = 40;
}
1004
{
title = "Coral (Red)";
sprite = "CORLB0";
width = 30;
height = 53;
}
1005
{
title = "Coral (Orange)";
sprite = "CORLC0";
width = 28;
height = 41;
}
1006
{
title = "Blue Crystal";
sprite = "BCRYA1";
width = 8;
height = 16;
}
1007
{
title = "Kelp";
sprite = "KELPA0";
width = 16;
height = 292;
flags4text = "[4] Double size";
}
1008
{
title = "Stalagmite (DSZ1)";
sprite = "DSTGA0";
width = 8;
height = 116;
flags4text = "[4] Double size";
}
1010
{
arrow = 1;
title = "Light Beam";
sprite = "LIBEARAL";
width = 16;
height = 16;
}
1011
{
title = "Stalagmite (DSZ2)";
sprite = "DSTGB0";
width = 8;
height = 116;
flags4text = "[4] Double size";
}
1012
{
arrow = 1;
title = "Big Floating Mine";
width = 28;
height = 56;
sprite = "BMNEA1";
}
1013
{
title = "Animated Kelp";
sprite = "ALGAA0";
width = 48;
height = 120;
}
1014
{
title = "Large Coral (Brown)";
sprite = "CORLD0";
width = 56;
height = 112;
}
1015
{
title = "Large Coral (Beige)";
sprite = "CORLE0";
width = 56;
height = 112;
}
}
castleeggman
{
color = 2; // Green
title = "Castle Eggman";
1100
{
title = "Chain (Decorative)";
sprite = "CHANA0";
width = 4;
height = 128;
hangs = 1;
}
1101
{
title = "Torch";
sprite = "FLAMA0E0";
width = 8;
height = 32;
flags1text = "[1] Add corona";
}
1102
{
arrow = 1;
blocking = 2;
title = "Eggman Statue";
sprite = "ESTAA1";
width = 32;
height = 240;
flags1text = "[1] Solid gold";
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1103
{
title = "CEZ Flower";
sprite = "FWR4A0";
width = 16;
height = 40;
}
1104
{
title = "Mace Spawnpoint";
sprite = "SMCEA0";
width = 17;
height = 34;
flags4text = "[4] No sounds";
flags8text = "[8] Double size";
angletext = "Tag";
parametertext = "Spokes";
fixedrotation = 1;
tagthing = true;
}
1105
{
title = "Chain with Maces Spawnpoint";
sprite = "SMCEA0";
width = 17;
height = 34;
flags4text = "[4] No sounds";
flags8text = "[8] Double size";
angletext = "Tag";
parametertext = "Spokes";
fixedrotation = 1;
tagthing = true;
}
1106
{
title = "Chained Spring Spawnpoint";
sprite = "YSPBA0";
width = 17;
height = 34;
flags4text = "[4] No sounds";
flags8text = "[8] Red spring";
angletext = "Tag";
parametertext = "Spokes";
fixedrotation = 1;
tagthing = true;
}
1107
{
title = "Chain Spawnpoint";
sprite = "BMCHB0";
width = 17;
height = 34;
flags8text = "[8] Double size";
angletext = "Tag";
parametertext = "Spokes";
fixedrotation = 1;
tagthing = true;
}
1108
{
arrow = 1;
title = "Hidden Chain Spawnpoint";
sprite = "SMCHA0";
width = 17;
height = 34;
flags8text = "[8] Double size";
}
1109
{
title = "Firebar Spawnpoint";
sprite = "BFBRA0";
width = 17;
height = 34;
flags4text = "[4] No sounds";
flags8text = "[8] Double size";
angletext = "Tag";
parametertext = "Spokes";
fixedrotation = 1;
tagthing = true;
}
1110
{
title = "Custom Mace Spawnpoint";
sprite = "SMCEA0";
width = 17;
height = 34;
flags4text = "[4] No sounds";
angletext = "Tag";
parametertext = "Spokes";
fixedrotation = 1;
tagthing = true;
}
1111
{
arrow = 1;
blocking = 2;
title = "Crawla Statue";
sprite = "CSTAA1";
width = 16;
height = 40;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1112
{
arrow = 1;
blocking = 2;
title = "Lance-a-Bot Statue";
sprite = "CBBSA1";
width = 32;
height = 72;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1114
{
title = "Pine Tree";
sprite = "PINEA0";
width = 16;
height = 628;
}
1115
{
title = "CEZ Shrub (Small)";
sprite = "CEZBA0";
width = 16;
height = 24;
}
1116
{
title = "CEZ Shrub (Large)";
sprite = "CEZBB0";
width = 32;
height = 48;
}
1117
{
arrow = 1;
title = "Pole Banner (Red)";
sprite = "BANRA0";
width = 40;
height = 224;
}
1118
{
arrow = 1;
title = "Pole Banner (Blue)";
sprite = "BANRA0";
width = 40;
height = 224;
}
1119
{
title = "Candle";
sprite = "CNDLA0";
width = 8;
height = 48;
flags1text = "[1] Add corona";
}
1120
{
title = "Candle Pricket";
sprite = "CNDLB0";
width = 8;
height = 176;
flags1text = "[1] Add corona";
}
1121
{
title = "Flame Holder";
sprite = "FLMHA0";
width = 24;
height = 80;
flags1text = "[1] Add corona";
flags4text = "[4] No flame";
}
1122
{
title = "Fire Torch";
sprite = "CTRCA0";
width = 16;
height = 80;
}
1123
{
title = "Cannonball Launcher";
sprite = "internal:cannonball";
width = 8;
height = 16;
}
1124
{
blocking = 2;
title = "Cannonball";
sprite = "CBLLA0";
width = 20;
height = 40;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1125
{
title = "Brambles";
sprite = "CABRALAR";
width = 48;
height = 32;
}
1126
{
title = "Invisible Lockon Object";
sprite = "LCKNC0";
width = 16;
height = 32;
}
1127
{
title = "Spectator Eggrobo";
sprite = "EGR1A1";
width = 20;
height = 72;
arrow = 1;
flags4text = "[4] Move right";
flags8text = "[8] Move left";
}
1128
{
arrow = 1;
title = "Waving Flag (Red)";
sprite = "CFLGA0";
width = 8;
height = 208;
}
1129
{
arrow = 1;
title = "Waving Flag (Blue)";
sprite = "CFLGA0";
width = 8;
height = 208;
}
}
aridcanyon
{
color = 2; // Green
title = "Arid Canyon";
1200
{
title = "Tumbleweed (Big)";
sprite = "BTBLA0";
width = 24;
height = 48;
flags8text = "[8] Moves perpetually";
}
1201
{
title = "Tumbleweed (Small)";
sprite = "STBLA0";
width = 12;
height = 24;
flags8text = "[8] Moves perpetually";
}
1202
{
arrow = 1;
title = "Rock Spawner";
sprite = "ROIAA0";
width = 8;
height = 16;
angletext = "Tag";
fixedrotation = 1;
tagthing = true;
}
1203
{
title = "Tiny Red Flower Cactus";
sprite = "CACTA0";
width = 13;
height = 24;
}
1204
{
title = "Small Red Flower Cactus";
sprite = "CACTB0";
width = 15;
height = 52;
}
1205
{
title = "Tiny Blue Flower Cactus";
sprite = "CACTC0";
width = 13;
height = 24;
}
1206
{
title = "Small Blue Flower Cactus";
sprite = "CACTD0";
width = 15;
height = 52;
}
1207
{
title = "Prickly Pear";
sprite = "CACTE0";
width = 32;
height = 96;
}
1208
{
title = "Barrel Cactus";
sprite = "CACTF0";
width = 20;
height = 128;
}
1209
{
title = "Tall Barrel Cactus";
sprite = "CACTG0";
width = 24;
height = 224;
}
1210
{
title = "Armed Cactus";
sprite = "CACTH0";
width = 24;
height = 256;
}
1211
{
title = "Ball Cactus";
sprite = "CACTI0";
width = 48;
height = 96;
}
1212
{
title = "Caution Sign";
sprite = "WWSGAR";
width = 22;
height = 64;
arrow = 1;
}
1213
{
title = "Cacti Sign";
sprite = "WWS2AR";
width = 22;
height = 64;
arrow = 1;
}
1214
{
title = "Sharp Turn Sign";
sprite = "WWS3ALAR";
width = 16;
height = 192;
arrow = 1;
}
1215
{
title = "Mine Oil Lamp";
sprite = "OILLA0";
width = 22;
height = 64;
hangs = 1;
}
1216
{
title = "TNT Barrel";
sprite = "BARRA1";
width = 24;
height = 63;
arrow = 1;
flags8text = "[8] Not pushable";
}
1217
{
title = "TNT Proximity Shell";
sprite = "REMTA0";
width = 64;
height = 40;
}
1218
{
title = "Dust Devil";
sprite = "TAZDCR";
width = 80;
height = 416;
}
1219
{
title = "Minecart Spawner";
sprite = "MCRTCLFR";
width = 22;
height = 32;
arrow = 1;
}
1220
{
title = "Minecart Stopper";
sprite = "MCRTIR";
width = 32;
height = 32;
arrow = 1;
}
1221
{
title = "Minecart Saloon Door";
sprite = "SALDARAL";
width = 96;
height = 160;
arrow = 1;
flags8text = "[8] Allow non-minecart players";
}
1222
{
title = "Train Cameo Spawner";
sprite = "TRAEBRBL";
width = 28;
height = 32;
}
1223
{
title = "Train Dust Spawner";
sprite = "ADSTA0";
width = 4;
height = 4;
}
1224
{
title = "Train Steam Spawner";
sprite = "STEAA0";
width = 4;
height = 4;
}
1229
{
title = "Minecart Switch Point";
sprite = "internal:zoom";
width = 8;
height = 16;
flags8text = "[8] Enable switching";
}
1230
{
title = "Tiny Cactus";
sprite = "CACTJ0";
width = 13;
height = 28;
}
1231
{
title = "Small Cactus";
sprite = "CACTK0";
width = 15;
height = 60;
}
}
redvolcano
{
color = 2; // Green
title = "Red Volcano";
1300
{
arrow = 1;
title = "Flame Jet (Horizontal)";
sprite = "internal:flameh";
width = 16;
height = 40;
flags8text = "[8] Waves vertically";
angletext = "On/Off time";
fixedrotation = 1;
parametertext = "Strength";
}
1301
{
title = "Flame Jet (Vertical)";
sprite = "internal:flamev";
width = 16;
height = 40;
flags8text = "[8] Shoot downwards";
angletext = "On/Off time";
fixedrotation = 1;
parametertext = "Strength";
}
1302
{
title = "Spinning Flame Jet (Counter-Clockwise)";
sprite = "internal:flame2";
width = 16;
height = 24;
}
1303
{
title = "Spinning Flame Jet (Clockwise)";
sprite = "internal:flame1";
width = 16;
height = 24;
}
1304
{
title = "Lavafall";
sprite = "LFALF0";
width = 30;
height = 32;
angletext = "Initial delay";
fixedrotation = 1;
hangs = 1;
flags8text = "[8] Double size";
}
1305
{
title = "Rollout Rock";
sprite = "PUMIA1A5";
width = 30;
height = 60;
flags8text = "[8] Non-buoyant";
}
1306
{
title = "Big Fern";
sprite = "JPLAB0";
width = 32;
height = 48;
}
1307
{
title = "Jungle Palm";
sprite = "JPLAC0";
width = 32;
height = 48;
}
1308
{
title = "Torch Flower";
sprite = "TFLOA0";
width = 14;
height = 110;
}
1309
{
title = "RVZ1 Wall Vine (Long)";
sprite = "WVINALAR";
width = 1;
height = 288;
arrow = 1;
}
1310
{
title = "RVZ1 Wall Vine (Short)";
sprite = "WVINBLBR";
width = 1;
height = 288;
arrow = 1;
}
}
botanicserenity
{
color = 2; // Green
title = "Botanic Serenity";
width = 16;
height = 32;
sprite = "BSZ1A0";
1400
{
title = "Tall Flower (Red)";
sprite = "BSZ1A0";
}
1401
{
title = "Tall Flower (Purple)";
sprite = "BSZ1B0";
}
1402
{
title = "Tall Flower (Blue)";
sprite = "BSZ1C0";
}
1403
{
title = "Tall Flower (Cyan)";
sprite = "BSZ1D0";
}
1404
{
title = "Tall Flower (Yellow)";
sprite = "BSZ1E0";
}
1405
{
title = "Tall Flower (Orange)";
sprite = "BSZ1F0";
}
1410
{
title = "Medium Flower (Red)";
sprite = "BSZ2A0";
}
1411
{
title = "Medium Flower (Purple)";
sprite = "BSZ2B0";
}
1412
{
title = "Medium Flower (Blue)";
sprite = "BSZ2C0";
}
1413
{
title = "Medium Flower (Cyan)";
sprite = "BSZ2D0";
}
1414
{
title = "Medium Flower (Yellow)";
sprite = "BSZ2E0";
}
1415
{
title = "Medium Flower (Orange)";
sprite = "BSZ2F0";
}
1420
{
title = "Short Flower (Red)";
sprite = "BSZ3A0";
}
1421
{
title = "Short Flower (Purple)";
sprite = "BSZ3B0";
}
1422
{
title = "Short Flower (Blue)";
sprite = "BSZ3C0";
}
1423
{
title = "Short Flower (Cyan)";
sprite = "BSZ3D0";
}
1424
{
title = "Short Flower (Yellow)";
sprite = "BSZ3E0";
}
1425
{
title = "Short Flower (Orange)";
sprite = "BSZ3F0";
}
1430
{
title = "Tulip (Red)";
sprite = "BST1A0";
}
1431
{
title = "Tulip (Purple)";
sprite = "BST2A0";
}
1432
{
title = "Tulip (Blue)";
sprite = "BST3A0";
}
1433
{
title = "Tulip (Cyan)";
sprite = "BST4A0";
}
1434
{
title = "Tulip (Yellow)";
sprite = "BST5A0";
}
1435
{
title = "Tulip (Orange)";
sprite = "BST6A0";
}
1440
{
title = "Cluster (Red)";
sprite = "BSZ5A0";
}
1441
{
title = "Cluster (Purple)";
sprite = "BSZ5B0";
}
1442
{
title = "Cluster (Blue)";
sprite = "BSZ5C0";
}
1443
{
title = "Cluster (Cyan)";
sprite = "BSZ5D0";
}
1444
{
title = "Cluster (Yellow)";
sprite = "BSZ5E0";
}
1445
{
title = "Cluster (Orange)";
sprite = "BSZ5F0";
}
1450
{
title = "Bush (Red)";
sprite = "BSZ6A0";
}
1451
{
title = "Bush (Purple)";
sprite = "BSZ6B0";
}
1452
{
title = "Bush (Blue)";
sprite = "BSZ6C0";
}
1453
{
title = "Bush (Cyan)";
sprite = "BSZ6D0";
}
1454
{
title = "Bush (Yellow)";
sprite = "BSZ6E0";
}
1455
{
title = "Bush (Orange)";
sprite = "BSZ6F0";
}
1460
{
title = "Vine (Red)";
sprite = "BSZ7A0";
}
1461
{
title = "Vine (Purple)";
sprite = "BSZ7B0";
}
1462
{
title = "Vine (Blue)";
sprite = "BSZ7C0";
}
1463
{
title = "Vine (Cyan)";
sprite = "BSZ7D0";
}
1464
{
title = "Vine (Yellow)";
sprite = "BSZ7E0";
}
1465
{
title = "Vine (Orange)";
sprite = "BSZ7F0";
}
1470
{
title = "BSZ Shrub";
sprite = "BSZ8A0";
}
1471
{
title = "BSZ Clover";
sprite = "BSZ8B0";
}
1473
{
title = "Palm Tree (Big)";
width = 16;
height = 160;
sprite = "BSZ8D0";
}
1475
{
title = "Palm Tree (Small)";
width = 16;
height = 80;
sprite = "BSZ8F0";
}
}
azuretemple
{
color = 2; // Green
title = "Azure Temple";
1500
{
arrow = 1;
blocking = 2;
title = "Glaregoyle";
sprite = "BGARA1";
width = 16;
height = 40;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1501
{
arrow = 1;
blocking = 2;
title = "Glaregoyle (Up)";
sprite = "BGARA1";
width = 16;
height = 40;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1502
{
arrow = 1;
blocking = 2;
title = "Glaregoyle (Down)";
sprite = "BGARA1";
width = 16;
height = 40;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1503
{
arrow = 1;
blocking = 2;
title = "Glaregoyle (Long)";
sprite = "BGARA1";
width = 16;
height = 40;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1504
{
title = "ATZ Target";
sprite = "RCRYB0";
width = 24;
height = 32;
}
1505
{
title = "Green Flame";
sprite = "CFLMA0E0";
width = 8;
height = 32;
}
1506
{
arrow = 1;
blocking = 2;
title = "Blue Gargoyle";
sprite = "BGARD1";
width = 16;
height = 40;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
}
dreamhill
{
color = 2; // Green
title = "Dream Hill";
1600
{
title = "Spring Tree";
sprite = "TRE6A0";
width = 16;
height = 32;
}
1601
{
title = "Shleep";
sprite = "SHLPA0";
width = 24;
height = 32;
}
1602
{
title = "Nightopian";
sprite = "NTPNA1";
width = 16;
height = 40;
}
}
nightstrk
{
color = 16; // Light Pink
title = "NiGHTS Track & Basics";
width = 8;
height = 4096;
sprite = "UNKNA0";
fixedrotation = 1;
1700
{
title = "Axis";
sprite = "internal:axis1";
circle = 1;
unflippable = true;
ignoreZ = true;
flagsvaluetext = "Order";
angletext = "Radius/Direction";
parametertext = "Mare";
}
1701
{
title = "Axis Transfer";
sprite = "internal:axis2";
unflippable = true;
ignoreZ = true;
flagsvaluetext = "Order";
parametertext = "Mare";
}
1702
{
title = "Axis Transfer Line";
sprite = "internal:axis3";
unflippable = true;
ignoreZ = true;
flagsvaluetext = "Order";
parametertext = "Mare";
}
1703
{
title = "Ideya Drone";
sprite = "NDRNA1";
width = 16;
height = 56;
flags1text = "[1] Align player to middle";
flags4text = "[4] Align player to top";
flags8text = "[8] Die upon time up";
angletext = "Time limit";
fixedrotation = 1;
parametertext = "Height";
}
1710
{
title = "Ideya Capture";
sprite = "CAPSA0";
width = 72;
height = 144;
angletext = "Spheres";
parametertext = "Mare";
}
}
nights
{
color = 13; // Pink
title = "NiGHTS Items";
width = 16;
height = 32;
1704
{
arrow = 1;
title = "NiGHTS Bumper";
sprite = "NBMPG3G7";
width = 32;
height = 64;
unflippable = true;
flagsvaluetext = "Pitch";
angletext = "Yaw";
}
1705
{
arrow = 1;
title = "Hoop (Generic)";
sprite = "internal:nightshoop";
width = 80;
height = 160;
unflippable = true;
centerHitbox = true;
flagsvaluetext = "Height";
angletext = "Pitch/Yaw";
parametertext = "Degrees?";
}
1706
{
title = "Blue Sphere";
sprite = "SPHRA0";
width = 16;
height = 24;
flags8height = 24;
flags8text = "[8] Float";
}
1707
{
title = "Super Paraloop";
sprite = "NPRUA0";
flags4text = "[4] Bonus time only";
flags8text = "[8] Spawn immediately";
}
1708
{
title = "Drill Refill";
sprite = "NPRUB0";
flags4text = "[4] Bonus time only";
flags8text = "[8] Spawn immediately";
}
1709
{
title = "Nightopian Helper";
sprite = "NPRUC0";
flags4text = "[4] Bonus time only";
flags8text = "[8] Spawn immediately";
}
1711
{
title = "Extra Time";
sprite = "NPRUD0";
flags4text = "[4] Bonus time only";
flags8text = "[8] Spawn immediately";
}
1712
{
title = "Link Freeze";
sprite = "NPRUE0";
flags4text = "[4] Bonus time only";
flags8text = "[8] Spawn immediately";
}
1713
{
arrow = 1;
title = "Hoop (Customizable)";
flags1text = "[1] Radius +16";
flags2text = "[2] Radius +32";
flags4text = "[4] Radius +64";
flags8text = "[8] Radius +128";
sprite = "internal:nightshoop";
width = 80;
height = 160;
unflippable = true;
centerHitbox = true;
angletext = "Pitch/Yaw";
parametertext = "Degrees?";
}
1714
{
title = "Ideya Anchor Point";
sprite = "internal:axis1";
width = 8;
height = 16;
parametertext = "Ideya";
}
}
mario
{
color = 6; // Brown
title = "Mario";
1800
{
title = "Coin";
sprite = "COINA0";
width = 16;
height = 24;
flags8height = 24;
flags8text = "[8] Float";
}
1801
{
arrow = 1;
title = "Goomba";
sprite = "GOOMA0";
width = 24;
height = 32;
}
1802
{
arrow = 1;
title = "Goomba (Blue)";
sprite = "BGOMA0";
width = 24;
height = 32;
}
1803
{
title = "Fire Flower";
sprite = "FFWRB0";
width = 16;
height = 32;
}
1804
{
title = "Koopa Shell";
sprite = "SHLLA1";
width = 16;
height = 20;
}
1805
{
title = "Puma (Jumping Fireball)";
sprite = "PUMAA0";
width = 8;
height = 16;
angletext = "Jump strength";
fixedrotation = 1;
}
1806
{
title = "King Bowser";
sprite = "KOOPA0";
width = 16;
height = 48;
}
1807
{
title = "Axe";
sprite = "MAXEA0";
width = 8;
height = 16;
}
1808
{
title = "Bush (Short)";
sprite = "MUS1A0";
width = 16;
height = 32;
}
1809
{
title = "Bush (Tall)";
sprite = "MUS2A0";
width = 16;
height = 32;
}
1810
{
title = "Toad";
sprite = "TOADA0";
width = 8;
height = 32;
}
}
christmasdisco
{
color = 2; // Green
title = "Christmas & Disco";
1850
{
title = "Christmas Pole";
sprite = "XMS1A0";
width = 16;
height = 40;
}
1851
{
title = "Candy Cane";
sprite = "XMS2A0";
width = 8;
height = 32;
}
1852
{
blocking = 2;
title = "Snowman";
sprite = "XMS3A0";
width = 16;
height = 64;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1853
{
blocking = 2;
title = "Snowman (With Hat)";
sprite = "XMS3B0";
width = 16;
height = 80;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
1854
{
title = "Lamp Post";
sprite = "XMS4A0";
width = 8;
height = 120;
}
1855
{
title = "Lamp Post (Snow)";
sprite = "XMS4B0";
width = 8;
height = 120;
}
1856
{
title = "Hanging Star";
sprite = "XMS5A0";
width = 4;
height = 80;
hangs = 1;
}
1857
{
title = "Berry Bush (Snow)";
sprite = "BUS1B0";
width = 16;
height = 32;
}
1858
{
title = "Bush (Snow)";
sprite = "BUS2B0";
width = 16;
height = 32;
}
1859
{
title = "Blueberry Bush (Snow)";
sprite = "BUS3B0";
width = 16;
height = 32;
}
1875
{
title = "Disco Ball";
sprite = "DBALA0";
width = 16;
height = 54;
hangs = 1;
}
1876
{
arrow = 1;
blocking = 2;
title = "Eggman Disco Statue";
sprite = "ESTAB1";
width = 20;
height = 96;
flags4text = "[4] Slides when pushed";
flags8text = "[8] Not pushable";
}
}
stalagmites
{
color = 2; // Green
title = "Stalagmites";
width = 16;
height = 40;
1900
{
title = "Brown Stalagmite (Tall)";
sprite = "STLGA0";
width = 16;
height = 40;
}
1901
{
title = "Brown Stalagmite";
sprite = "STLGB0";
width = 16;
height = 40;
}
1902
{
title = "Orange Stalagmite (Tall)";
sprite = "STLGC0";
width = 16;
height = 40;
}
1903
{
title = "Orange Stalagmite";
sprite = "STLGD0";
width = 16;
height = 40;
}
1904
{
title = "Red Stalagmite (Tall)";
sprite = "STLGE0";
width = 16;
height = 40;
}
1905
{
title = "Red Stalagmite";
sprite = "STLGF0";
width = 16;
height = 40;
}
1906
{
title = "Gray Stalagmite (Tall)";
sprite = "STLGG0";
width = 24;
height = 96;
}
1907
{
title = "Gray Stalagmite";
sprite = "STLGH0";
width = 16;
height = 40;
}
1908
{
title = "Blue Stalagmite (Tall)";
sprite = "STLGI0";
width = 16;
height = 40;
}
1909
{
title = "Blue Stalagmite";
sprite = "STLGJ0";
width = 16;
height = 40;
}
}
hauntedheights
{
color = 2; // Green
title = "Haunted Heights";
2000
{
title = "Smashing Spikeball";
sprite = "FMCEA0";
width = 18;
height = 28;
angletext = "Initial delay";
fixedrotation = 1;
}
2001
{
title = "HHZ Grass";
sprite = "HHZMA0";
width = 16;
height = 40;
}
2002
{
title = "HHZ Tentacle 1";
sprite = "HHZMB0";
width = 16;
height = 40;
}
2003
{
title = "HHZ Tentacle 2";
sprite = "HHZMC0";
width = 16;
height = 40;
}
2004
{
title = "HHZ Stalagmite (Tall)";
sprite = "HHZME0";
width = 16;
height = 40;
}
2005
{
title = "HHZ Stalagmite (Short)";
sprite = "HHZMF0";
width = 16;
height = 40;
}
2006
{
title = "Jack-o'-lantern 1";
sprite = "PUMKA0";
width = 16;
height = 40;
flags1text = "[1] Don't flicker";
}
2007
{
title = "Jack-o'-lantern 2";
sprite = "PUMKB0";
width = 16;
height = 40;
flags1text = "[1] Don't flicker";
}
2008
{
title = "Jack-o'-lantern 3";
sprite = "PUMKC0";
width = 16;
height = 40;
flags1text = "[1] Don't flicker";
}
2009
{
title = "Purple Mushroom";
sprite = "SHRMD0";
width = 16;
height = 48;
}
2010
{
title = "HHZ Tree";
sprite = "HHPLC0";
width = 12;
height = 40;
}
}
frozenhillside
{
color = 2; // Green
title = "Frozen Hillside";
2100
{
title = "Ice Shard (Small)";
sprite = "FHZIA0";
width = 8;
height = 32;
}
2101
{
title = "Ice Shard (Large)";
sprite = "FHZIB0";
width = 8;
height = 32;
}
2102
{
title = "Crystal Tree (Aqua)";
sprite = "TRE3A0";
width = 20;
height = 200;
}
2103
{
title = "Crystal Tree (Pink)";
sprite = "TRE3B0";
width = 20;
height = 200;
}
2104
{
title = "Amy Cameo";
sprite = "ROSYA1";
width = 16;
height = 48;
flags1text = "[1] Grayscale mode";
}
2105
{
title = "Mistletoe";
sprite = "XMS6A0";
width = 52;
height = 106;
hangs = 1;
}
}
tutorial
{
color = 2; // Green
title = "Tutorial";
799
{
title = "Tutorial Plant";
sprite = "TUPFH0";
width = 40;
height = 144;
parametertext = "Start frame";
}
}
flickies
{
color = 3; // Teal
title = "Flickies";
width = 8;
height = 20;
flags1text = "[1] Move aimlessly";
flags4text = "[4] No movement";
flags8text = "[8] Hop";
angletext = "Radius";
fixedrotation = 1;
2200
{
title = "Bluebird";
sprite = "FL01A1";
}
2201
{
title = "Rabbit";
sprite = "FL02A1";
}
2202
{
title = "Chicken";
sprite = "FL03A1";
}
2203
{
title = "Seal";
sprite = "FL04A1";
}
2204
{
title = "Pig";
sprite = "FL05A1";
}
2205
{
title = "Chipmunk";
sprite = "FL06A1";
}
2206
{
title = "Penguin";
sprite = "FL07A1";
}
2207
{
title = "Fish";
sprite = "FL08A1";
parametertext = "Color";
}
2208
{
title = "Ram";
sprite = "FL09A1";
}
2209
{
title = "Puffin";
sprite = "FL10A1";
}
2210
{
title = "Cow";
sprite = "FL11A1";
}
2211
{
title = "Rat";
sprite = "FL12A1";
}
2212
{
title = "Bear";
sprite = "FL13A1";
}
2213
{
title = "Dove";
sprite = "FL14A1";
}
2214
{
title = "Cat";
sprite = "FL15A1";
}
2215
{
title = "Canary";
sprite = "FL16A1";
}
2216
{
title = "Spider";
sprite = "FS01A1";
}
2217
{
title = "Bat";
sprite = "FS02A0";
}
}
}
//Default things filters
thingsfilters
{
filter0
{
name = "Player starts";
category = "starts";
type = -1;
}
filter1
{
name = "Enemies";
category = "enemies";
type = -1;
}
filter2
{
name = "NiGHTS Track";
category = "nightstrk";
type = -1;
}
filter3
{
name = "Normal Gravity";
category = "";
type = -1;
fields
{
2 = false;
}
}
filter4
{
name = "Reverse Gravity";
category = "";
type = -1;
fields
{
2 = true;
}
}
}
This is a list of major changes in SDL's version history. This is a list of major changes in SDL's version history.
---------------------------------------------------------------------------
2.28.2:
---------------------------------------------------------------------------
General:
* Added the hint SDL_HINT_JOYSTICK_WGI to control whether to use Windows.Gaming.Input for controllers
---------------------------------------------------------------------------
2.28.0:
---------------------------------------------------------------------------
General:
* Added SDL_HasWindowSurface() and SDL_DestroyWindowSurface() to switch between the window surface and rendering APIs
* Added a display event SDL_DISPLAYEVENT_MOVED which is sent when the primary monitor changes or displays change position relative to each other
* Added the hint SDL_HINT_ENABLE_SCREEN_KEYBOARD to control whether the on-screen keyboard should be shown when text input is active
---------------------------------------------------------------------------
2.26.0:
---------------------------------------------------------------------------
General:
* Updated OpenGL headers to the latest API from The Khronos Group Inc.
* Added SDL_GetWindowSizeInPixels() to get the window size in pixels, which may differ from the window coordinate size for windows with high-DPI support
* Added simulated vsync synchronization for the software renderer
* Added the mouse position to SDL_MouseWheelEvent
* Added SDL_ResetHints() to reset all hints to their default values
* Added SDL_GetJoystickGUIDInfo() to get device information encoded in a joystick GUID
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 to control whether the HIDAPI driver for XBox 360 controllers should be used
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED to control whether the player LEDs should be lit to indicate which player is associated with an Xbox 360 controller
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS to control whether the HIDAPI driver for XBox 360 wireless controllers should be used
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE to control whether the HIDAPI driver for XBox One controllers should be used
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED to control the brightness of the XBox One guide button LED
* Added support for PS3 controllers to the HIDAPI driver, enabled by default on macOS, controlled by the SDL_HINT_JOYSTICK_HIDAPI_PS3 hint
* Added support for Nintendo Wii controllers to the HIDAPI driver, not enabled by default, controlled by the SDL_HINT_JOYSTICK_HIDAPI_WII hint
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED to control whether the player LED should be lit on the Nintendo Wii controllers
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS to control whether Nintendo Switch Joy-Con controllers will be in vertical mode when using the HIDAPI driver
* Added access to the individual left and right gyro sensors of the combined Joy-Cons controller
* Added a microsecond timestamp to SDL_SensorEvent and SDL_ControllerSensorEvent, when the hardware provides that information
* Added SDL_SensorGetDataWithTimestamp() and SDL_GameControllerGetSensorDataWithTimestamp() to retrieve the last sensor data with the associated microsecond timestamp
* Added the hint SDL_HINT_HIDAPI_IGNORE_DEVICES to have the SDL HID API ignore specific devices
* SDL_GetRevision() now includes more information about the SDL build, including the git commit hash if available
Windows:
* Added the hint SDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE to control whether the system mouse acceleration curve is used for relative mouse motion
macOS:
* Implemented vsync synchronization on macOS 12
Linux:
* Added SDL_SetPrimarySelectionText(), SDL_GetPrimarySelectionText(), and SDL_HasPrimarySelectionText() to interact with the X11 primary selection clipboard
* Added the hint SDL_HINT_VIDEO_WAYLAND_EMULATE_MOUSE_WARP to control whether mouse pointer warp emulation is enabled under Wayland
Android:
* Enabled IME soft keyboard input
* Added version checking to make sure the SDL Java and C code are compatible
---------------------------------------------------------------------------
2.24.0:
---------------------------------------------------------------------------
General:
* New version numbering scheme, similar to GLib and Flatpak.
* An even number in the minor version (second component) indicates a production-ready stable release such as 2.24.0, which would have been 2.0.24 under the old system.
* The patchlevel (micro version, third component) indicates a bugfix-only update: for example, 2.24.1 would be a bugfix-only release to fix bugs in 2.24.0, without adding new features.
* An odd number in the minor version indicates a prerelease such as 2.23.0. Stable distributions should not use these prereleases.
* The patchlevel indicates successive prereleases, for example 2.23.1 and 2.23.2 would be prereleases during development of the SDL 2.24.0 stable release.
* Added SDL_GetPointDisplayIndex() and SDL_GetRectDisplayIndex() to get the display associated with a point and rectangle in screen space
* Added SDL_bsearch(), SDL_crc16(), and SDL_utf8strnlen() to the stdlib routines
* Added SDL_CPUPauseInstruction() as a macro in SDL_atomic.h
* Added SDL_size_mul_overflow() and SDL_size_add_overflow() for better size overflow protection
* Added SDL_ResetHint() to reset a hint to the default value
* Added SDL_ResetKeyboard() to reset SDL's internal keyboard state, generating key up events for all currently pressed keys
* Added the hint SDL_HINT_MOUSE_RELATIVE_WARP_MOTION to control whether mouse warping generates motion events in relative mode. This hint defaults off.
* Added the hint SDL_HINT_TRACKPAD_IS_TOUCH_ONLY to control whether trackpads are treated as touch devices or mice. By default touchpads are treated as mouse input.
* The hint SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS now defaults on
* Added support for mini-gamepad mode for Nintendo Joy-Con controllers using the HIDAPI driver
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS to control whether Joy-Con controllers are automatically merged into a unified gamepad when using the HIDAPI driver. This hint defaults on.
* The hint SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED can be set to a floating point value to set the brightness of the Home LED on Nintendo Switch controllers
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED to set the Home LED brightness for the Nintendo Joy-Con controllers. By default the Home LED is not modified.
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED to control whether the player LED should be lit on the Nintendo Joy-Con controllers
* Added support for Nintendo Online classic controllers using the HIDAPI driver
* Added the hint SDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC to control whether the HIDAPI driver for Nintendo Online classic controllers should be used
* Added support for the NVIDIA Shield Controller to the HIDAPI driver, supporting rumble and battery status
* Added support for NVIDIA SHIELD controller to the HIDAPI driver, and a hint SDL_HINT_JOYSTICK_HIDAPI_SHIELD to control whether this is used
* Added functions to get the platform dependent name for a joystick or game controller:
* SDL_JoystickPathForIndex()
* SDL_JoystickPath()
* SDL_GameControllerPathForIndex()
* SDL_GameControllerPath()
* Added SDL_GameControllerGetFirmwareVersion() and SDL_JoystickGetFirmwareVersion(), currently implemented for DualSense(tm) Wireless Controllers using HIDAPI
* Added SDL_JoystickAttachVirtualEx() for extended virtual controller support
* Added joystick event SDL_JOYBATTERYUPDATED for when battery status changes
* Added SDL_GUIDToString() and SDL_GUIDFromString() to convert between SDL GUID and string
* Added SDL_HasLSX() and SDL_HasLASX() to detect LoongArch SIMD support
* Added SDL_GetOriginalMemoryFunctions()
* Added SDL_GetDefaultAudioInfo() to get the name and format of the default audio device, currently implemented for PipeWire, PulseAudio, WASAPI, and DirectSound
* Added HIDAPI driver for the NVIDIA SHIELD controller (2017 model) to enable support for battery status and rumble
* Added support for opening audio devices with 3 or 5 channels (2.1, 4.1). All channel counts from Mono to 7.1 are now supported.
* Rewrote audio channel converters used by SDL_AudioCVT, based on the channel matrix coefficients used as the default for FAudio voices
* SDL log messages are no longer limited to 4K and can be any length
* Fixed a long-standing calling convention issue with dynapi affecting OpenWatcom or OS/2 builds
Windows:
* Added initial support for building for Windows and Xbox with Microsoft's Game Development Kit (GDK), see docs/README-gdk.md for details
* Added a D3D12 renderer implementation and SDL_RenderGetD3D12Device() to retrieve the D3D12 device associated with it
* Added the hint SDL_HINT_WINDOWS_DPI_AWARENESS to set whether the application is DPI-aware. This hint must be set before initializing the video subsystem
* Added the hint SDL_HINT_WINDOWS_DPI_SCALING to control whether the SDL coordinates are in DPI-scaled points or pixels
* Added the hint SDL_HINT_DIRECTINPUT_ENABLED to control whether the DirectInput driver should be used
* Added support for SDL_GetAudioDeviceSpec to the DirectSound backend
Linux:
* Support for XVidMode has been removed, mode changes are only supported using the XRandR extension
* Added the hint SDL_HINT_VIDEO_WAYLAND_MODE_EMULATION to control whether to expose a set of emulated modes in addition to the native resolution modes available on Wayland
* Added the hint SDL_HINT_KMSDRM_DEVICE_INDEX to specify which KMSDRM device to use if the default is not desired
* Added the hint SDL_HINT_LINUX_DIGITAL_HATS to control whether to treat hats as digital rather than checking to see if they may be analog
* Added the hint SDL_HINT_LINUX_HAT_DEADZONES to control whether to use deadzones on analog hats
macOS:
* Bumped minimum OS deployment version to macOS 10.9
* Added SDL_GL_FLOATBUFFERS to allow Cocoa GL contexts to use EDR
* Added the hint SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH to control whether dispatching OpenGL context updates should block the dispatching thread until the main thread finishes processing. This hint defaults to blocking, which is the safer option on modern macOS.
---------------------------------------------------------------------------
2.0.22:
---------------------------------------------------------------------------
General:
* Added SDL_RenderGetWindow() to get the window associated with a renderer
* Added floating point rectangle functions:
* SDL_PointInFRect()
* SDL_FRectEmpty()
* SDL_FRectEquals()
* SDL_FRectEqualsEpsilon()
* SDL_HasIntersectionF()
* SDL_IntersectFRect()
* SDL_UnionFRect()
* SDL_EncloseFPoints()
* SDL_IntersectFRectAndLine()
* Added SDL_IsTextInputShown() which returns whether the IME window is currently shown
* Added SDL_ClearComposition() to dismiss the composition window without disabling IME input
* Added SDL_TEXTEDITING_EXT event for handling long composition text, and a hint SDL_HINT_IME_SUPPORT_EXTENDED_TEXT to enable it
* Added the hint SDL_HINT_MOUSE_RELATIVE_MODE_CENTER to control whether the mouse should be constrained to the whole window or the center of the window when relative mode is enabled
* The mouse is now automatically captured when mouse buttons are pressed, and the hint SDL_HINT_MOUSE_AUTO_CAPTURE allows you to control this behavior
* Added the hint SDL_HINT_VIDEO_FOREIGN_WINDOW_OPENGL to let SDL know that a foreign window will be used with OpenGL
* Added the hint SDL_HINT_VIDEO_FOREIGN_WINDOW_VULKAN to let SDL know that a foreign window will be used with Vulkan
* Added the hint SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE to specify whether an SDL_QUIT event will be delivered when the last application window is closed
* Added the hint SDL_HINT_JOYSTICK_ROG_CHAKRAM to control whether ROG Chakram mice show up as joysticks
Windows:
* Added support for SDL_BLENDOPERATION_MINIMUM and SDL_BLENDOPERATION_MAXIMUM to the D3D9 renderer
Linux:
* Compiling with Wayland support requires libwayland-client version 1.18.0 or later
* Added the hint SDL_HINT_X11_WINDOW_TYPE to specify the _NET_WM_WINDOW_TYPE of SDL windows
* Added the hint SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR to allow using libdecor with compositors that support xdg-decoration
Android:
* Added SDL_AndroidSendMessage() to send a custom command to the SDL java activity
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
2.0.20: 2.0.20:
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
...@@ -499,7 +662,7 @@ iOS: ...@@ -499,7 +662,7 @@ iOS:
tvOS: tvOS:
* Added support for Apple TV * Added support for Apple TV
* Added a hint SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION to control whether he Apple TV remote's joystick axes will automatically match the rotation of the remote. * Added a hint SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION to control whether he Apple TV remote's joystick axes will automatically match the rotation of the remote.
Android: Android:
* Fixed SDL not resizing window when Android screen resolution changes * Fixed SDL not resizing window when Android screen resolution changes
...@@ -644,8 +807,8 @@ Linux: ...@@ -644,8 +807,8 @@ Linux:
* Added experimental Wayland and Mir support, disabled by default * Added experimental Wayland and Mir support, disabled by default
Android: Android:
* Joystick support (minimum SDK version required to build SDL is now 12, * Joystick support (minimum SDK version required to build SDL is now 12,
the required runtime version remains at 10, but on such devices joystick the required runtime version remains at 10, but on such devices joystick
support won't be available). support won't be available).
* Hotplugging support for joysticks * Hotplugging support for joysticks
* Added a hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK to control whether the accelerometer should be listed as a 3 axis joystick, which it will by default. * Added a hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK to control whether the accelerometer should be listed as a 3 axis joystick, which it will by default.
...@@ -698,7 +861,7 @@ iOS: ...@@ -698,7 +861,7 @@ iOS:
Android: Android:
IMPORTANT: You MUST get the updated SDLActivity.java to match C code IMPORTANT: You MUST get the updated SDLActivity.java to match C code
* Moved EGL initialization to native code * Moved EGL initialization to native code
* Fixed the accelerometer axis rotation relative to the device rotation * Fixed the accelerometer axis rotation relative to the device rotation
* Fixed race conditions when handling the EGL context on pause/resume * Fixed race conditions when handling the EGL context on pause/resume
* Touch devices are available for enumeration immediately after init * Touch devices are available for enumeration immediately after init
......
# based on the files generated by CMake's write_basic_package_version_file
# SDL2 CMake version configuration file:
# This file is meant to be placed in a cmake subfolder of SDL2-devel-2.x.y-VC
if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/../include/SDL_version.h")
message(AUTHOR_WARNING "Could not find SDL_version.h. This script is meant to be placed in the root of SDL2-devel-2.x.y-VC")
return()
endif()
file(READ "${CMAKE_CURRENT_LIST_DIR}/../include/SDL_version.h" _sdl_version_h)
string(REGEX MATCH "#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)" _sdl_major_re "${_sdl_version_h}")
set(_sdl_major "${CMAKE_MATCH_1}")
string(REGEX MATCH "#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)" _sdl_minor_re "${_sdl_version_h}")
set(_sdl_minor "${CMAKE_MATCH_1}")
string(REGEX MATCH "#define[ \t]+SDL_PATCHLEVEL[ \t]+([0-9]+)" _sdl_patch_re "${_sdl_version_h}")
set(_sdl_patch "${CMAKE_MATCH_1}")
if(_sdl_major_re AND _sdl_minor_re AND _sdl_patch_re)
set(PACKAGE_VERSION "${_sdl_major}.${_sdl_minor}.${_sdl_patch}")
else()
message(AUTHOR_WARNING "Could not extract version from SDL_version.h.")
return()
endif()
if(PACKAGE_FIND_VERSION_RANGE)
# Package version must be in the requested version range
if ((PACKAGE_FIND_VERSION_RANGE_MIN STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MIN)
OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_GREATER PACKAGE_FIND_VERSION_MAX)
OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_GREATER_EQUAL PACKAGE_FIND_VERSION_MAX)))
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
set(PACKAGE_VERSION_COMPATIBLE TRUE)
endif()
else()
if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
set(PACKAGE_VERSION_COMPATIBLE TRUE)
if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
set(PACKAGE_VERSION_EXACT TRUE)
endif()
endif()
endif()
# if the using project doesn't have CMAKE_SIZEOF_VOID_P set, fail.
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "")
set(PACKAGE_VERSION_UNSUITABLE TRUE)
endif()
# check that the installed version has the same 32/64bit-ness as the one which is currently searching:
if(NOT (CMAKE_SIZEOF_VOID_P STREQUAL "8" OR CMAKE_SIZEOF_VOID_P STREQUAL "4"))
set(PACKAGE_VERSION "${PACKAGE_VERSION} (32+64bit)")
set(PACKAGE_VERSION_UNSUITABLE TRUE)
endif()
# SDL2 CMake configuration file:
# This file is meant to be placed in a cmake subfolder of SDL2-devel-2.x.y-VC
cmake_minimum_required(VERSION 3.0...3.5)
include(FeatureSummary)
set_package_properties(SDL2 PROPERTIES
URL "https://www.libsdl.org/"
DESCRIPTION "low level access to audio, keyboard, mouse, joystick, and graphics hardware"
)
# Copied from `configure_package_config_file`
macro(set_and_check _var _file)
set(${_var} "${_file}")
if(NOT EXISTS "${_file}")
message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
endif()
endmacro()
# Copied from `configure_package_config_file`
macro(check_required_components _NAME)
foreach(comp ${${_NAME}_FIND_COMPONENTS})
if(NOT ${_NAME}_${comp}_FOUND)
if(${_NAME}_FIND_REQUIRED_${comp})
set(${_NAME}_FOUND FALSE)
endif()
endif()
endforeach()
endmacro()
set(SDL2_FOUND TRUE)
if(CMAKE_SIZEOF_VOID_P STREQUAL "4")
set(_sdl_arch_subdir "x86")
elseif(CMAKE_SIZEOF_VOID_P STREQUAL "8")
set(_sdl_arch_subdir "x64")
else()
set(SDL2_FOUND FALSE)
return()
endif()
# For compatibility with autotools sdl2-config.cmake, provide SDL2_* variables.
set_and_check(SDL2_PREFIX "${CMAKE_CURRENT_LIST_DIR}/..")
set_and_check(SDL2_EXEC_PREFIX "${CMAKE_CURRENT_LIST_DIR}/..")
set_and_check(SDL2_INCLUDE_DIR "${SDL2_PREFIX}/include")
set(SDL2_INCLUDE_DIRS "${SDL2_INCLUDE_DIR}")
set_and_check(SDL2_BINDIR "${SDL2_PREFIX}/lib/${_sdl_arch_subdir}")
set_and_check(SDL2_LIBDIR "${SDL2_PREFIX}/lib/${_sdl_arch_subdir}")
set(SDL2_LIBRARIES SDL2::SDL2main SDL2::SDL2)
set(SDL2MAIN_LIBRARY SDL2::SDL2main)
set(SDL2TEST_LIBRARY SDL2::SDL2test)
# All targets are created, even when some might not be requested though COMPONENTS.
# This is done for compatibility with CMake generated SDL2-target.cmake files.
set(_sdl2_library "${SDL2_LIBDIR}/SDL2.lib")
set(_sdl2_dll_library "${SDL2_BINDIR}/SDL2.dll")
if(EXISTS "${_sdl2_library}" AND EXISTS "${_sdl2_dll_library}")
if(NOT TARGET SDL2::SDL2)
add_library(SDL2::SDL2 SHARED IMPORTED)
set_target_properties(SDL2::SDL2
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIRS}"
IMPORTED_IMPLIB "${_sdl2_library}"
IMPORTED_LOCATION "${_sdl2_dll_library}"
COMPATIBLE_INTERFACE_BOOL "SDL2_SHARED"
INTERFACE_SDL2_SHARED "ON"
COMPATIBLE_INTERFACE_STRING "SDL_VERSION"
INTERFACE_SDL_VERSION "SDL2"
)
endif()
set(SDL2_SDL2_FOUND TRUE)
else()
set(SDL2_SDL2_FOUND FALSE)
endif()
unset(_sdl2_library)
unset(_sdl2_dll_library)
set(_sdl2main_library "${SDL2_LIBDIR}/SDL2main.lib")
if(EXISTS "${_sdl2main_library}")
if(NOT TARGET SDL2::SDL2main)
add_library(SDL2::SDL2main STATIC IMPORTED)
set_target_properties(SDL2::SDL2main
PROPERTIES
IMPORTED_LOCATION "${_sdl2main_library}"
COMPATIBLE_INTERFACE_STRING "SDL_VERSION"
INTERFACE_SDL_VERSION "SDL2"
)
endif()
set(SDL2_SDL2main_FOUND TRUE)
else()
set(SDL2_SDL2_FOUND FALSE)
endif()
unset(_sdl2main_library)
set(_sdl2test_library "${SDL2_LIBDIR}/SDL2test.lib")
if(EXISTS "${_sdl2test_library}")
if(NOT TARGET SDL2::SDL2test)
add_library(SDL2::SDL2test STATIC IMPORTED)
set_target_properties(SDL2::SDL2test
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIRS}"
IMPORTED_LOCATION "${_sdl2test_library}"
COMPATIBLE_INTERFACE_STRING "SDL_VERSION"
INTERFACE_SDL_VERSION "SDL2"
)
endif()
set(SDL2_SDL2test_FOUND TRUE)
else()
set(SDL2_SDL2_FOUND FALSE)
endif()
unset(_sdl2test_library)
check_required_components(SDL2)
# Contributing to SDL
We appreciate your interest in contributing to SDL, this document will describe how to report bugs, contribute code or ideas or edit documentation.
**Table Of Contents**
- [Filing a GitHub issue](#filing-a-github-issue)
- [Reporting a bug](#reporting-a-bug)
- [Suggesting enhancements](#suggesting-enhancements)
- [Contributing code](#contributing-code)
- [Forking the project](#forking-the-project)
- [Following the style guide](#following-the-style-guide)
- [Running the tests](#running-the-tests)
- [Opening a pull request](#opening-a-pull-request)
- [Contributing to the documentation](#contributing-to-the-documentation)
- [Editing a function documentation](#editing-a-function-documentation)
- [Editing the wiki](#editing-the-wiki)
## Filing a GitHub issue
### Reporting a bug
If you think you have found a bug and would like to report it, here are the steps you should take:
- Before opening a new issue, ensure your bug has not already been reported on the [GitHub Issues page](https://github.com/libsdl-org/SDL/issues).
- On the issue tracker, click on [New Issue](https://github.com/libsdl-org/SDL/issues/new).
- Include details about your environment, such as your Operating System and SDL version.
- If possible, provide a small example that reproduces your bug.
### Suggesting enhancements
If you want to suggest changes for the project, here are the steps you should take:
- Check if the suggestion has already been made on:
- the [issue tracker](https://github.com/libsdl-org/SDL/issues);
- the [discourse forum](https://discourse.libsdl.org/);
- or if a [pull request](https://github.com/libsdl-org/SDL/pulls) already exists.
- On the issue tracker, click on [New Issue](https://github.com/libsdl-org/SDL/issues/new).
- Describe what change you would like to happen.
## Contributing code
This section will cover how the process of forking the project, making a change and opening a pull request.
### Forking the project
The first step consists in making a fork of the project, this is only necessary for the first contribution.
Head over to https://github.com/libsdl-org/SDL and click on the `Fork` button in the top right corner of your screen, you may leave the fields unchanged and click `Create Fork`.
You will be redirected to your fork of the repository, click the green `Code` button and copy the git clone link.
If you had already forked the repository, you may update it from the web page using the `Fetch upstream` button.
### Following the style guide
Code formatting is done using a custom `.clang-format` file, you can learn more about how to run it [here](https://clang.llvm.org/docs/ClangFormat.html).
Some legacy code may not be formatted, as such avoid formatting the whole file at once and only format around your changes.
For your commit message to be properly displayed on GitHub, it should contain:
- A short description of the commit of 50 characters or less on the first line.
- If necessary, add a blank line followed by a long description, each line should be 72 characters or less.
For example:
```
Fix crash in SDL_FooBar.
This addresses the issue #123456 by making sure Foo was successful
before calling Bar.
```
### Running the tests
Tests allow you to verify if your changes did not break any behaviour, here are the steps to follow:
- Before pushing, run the `testautomation` suite on your machine, there should be no more failing tests after your change than before.
- After pushing to your fork, Continuous Integration (GitHub Actions) will ensure compilation and tests still pass on other systems.
### Opening a pull request
- Head over to your fork's GitHub page.
- Click on the `Contribute` button and `Open Pull Request`.
- Fill out the pull request template.
- If any changes are requested, you can add new commits to your fork and they will be automatically added to the pull request.
## Contributing to the documentation
### Editing a function documentation
The wiki documentation for API functions is synchronised from the headers' doxygen comments. As such, all modifications to syntax; function parameters; return value; version; related functions should be done in the header directly.
### Editing the wiki
Other changes to the wiki should done directly from https://wiki.libsdl.org/
...@@ -13,22 +13,22 @@ supported, but you can use the "android-project-ant" directory as a template. ...@@ -13,22 +13,22 @@ supported, but you can use the "android-project-ant" directory as a template.
Requirements Requirements
================================================================================ ================================================================================
Android SDK (version 26 or later) Android SDK (version 34 or later)
https://developer.android.com/sdk/index.html https://developer.android.com/sdk/index.html
Android NDK r15c or later Android NDK r15c or later
https://developer.android.com/tools/sdk/ndk/index.html https://developer.android.com/tools/sdk/ndk/index.html
Minimum API level supported by SDL: 16 (Android 4.1) Minimum API level supported by SDL: 19 (Android 4.4)
How the port works How the port works
================================================================================ ================================================================================
- Android applications are Java-based, optionally with parts written in C - Android applications are Java-based, optionally with parts written in C
- As SDL apps are C-based, we use a small Java shim that uses JNI to talk to - As SDL apps are C-based, we use a small Java shim that uses JNI to talk to
the SDL library the SDL library
- This means that your application C code must be placed inside an Android - This means that your application C code must be placed inside an Android
Java project, along with some C support code that communicates with Java Java project, along with some C support code that communicates with Java
- This eventually produces a standard Android .apk package - This eventually produces a standard Android .apk package
...@@ -68,14 +68,22 @@ Finally, a word of caution: re running androidbuild.sh wipes any changes you may ...@@ -68,14 +68,22 @@ Finally, a word of caution: re running androidbuild.sh wipes any changes you may
done in the build directory for the app! done in the build directory for the app!
For more complex projects, follow these instructions: For more complex projects, follow these instructions:
1. Copy the android-project directory wherever you want to keep your projects
and rename it to the name of your project.
2. Move or symlink this SDL directory into the "<project>/app/jni" directory
3. Edit "<project>/app/jni/src/Android.mk" to include your source files
4a. If you want to use Android Studio, simply open your <project> directory and start building. 1. Get the source code for SDL and copy the 'android-project' directory located at SDL/android-project to a suitable location. Also make sure to rename it to your project name (In these examples: YOURPROJECT).
(The 'android-project' directory can basically be seen as a sort of starting point for the android-port of your project. It contains the glue code between the Android Java 'frontend' and the SDL code 'backend'. It also contains some standard behaviour, like how events should be handled, which you will be able to change.)
2. Move or [symlink](https://en.wikipedia.org/wiki/Symbolic_link) the SDL directory into the "YOURPROJECT/app/jni" directory
(This is needed as the source of SDL has to be compiled by the Android compiler)
3. Edit "YOURPROJECT/app/jni/src/Android.mk" to include your source files.
(They should be separated by spaces after the "LOCAL_SRC_FILES := " declaration)
4a. If you want to use Android Studio, simply open your 'YOURPROJECT' directory and start building.
4b. If you want to build manually, run './gradlew installDebug' in the project directory. This compiles the .java, creates an .apk with the native code embedded, and installs it on any connected Android device 4b. If you want to build manually, run './gradlew installDebug' in the project directory. This compiles the .java, creates an .apk with the native code embedded, and installs it on any connected Android device
...@@ -83,9 +91,9 @@ For more complex projects, follow these instructions: ...@@ -83,9 +91,9 @@ For more complex projects, follow these instructions:
If you already have a project that uses CMake, the instructions change somewhat: If you already have a project that uses CMake, the instructions change somewhat:
1. Do points 1 and 2 from the instruction above. 1. Do points 1 and 2 from the instruction above.
2. Edit "<project>/app/build.gradle" to comment out or remove sections containing ndk-build 2. Edit "YOURPROJECT/app/build.gradle" to comment out or remove sections containing ndk-build
and uncomment the cmake sections. Add arguments to the CMake invocation as needed. and uncomment the cmake sections. Add arguments to the CMake invocation as needed.
3. Edit "<project>/app/jni/CMakeLists.txt" to include your project (it defaults to 3. Edit "YOURPROJECT/app/jni/CMakeLists.txt" to include your project (it defaults to
adding the "src" subdirectory). Note that you'll have SDL2, SDL2main and SDL2-static adding the "src" subdirectory). Note that you'll have SDL2, SDL2main and SDL2-static
as targets in your project, so you should have "target_link_libraries(yourgame SDL2 SDL2main)" as targets in your project, so you should have "target_link_libraries(yourgame SDL2 SDL2main)"
in your CMakeLists.txt file. Also be aware that you should use add_library() instead of in your CMakeLists.txt file. Also be aware that you should use add_library() instead of
...@@ -132,15 +140,15 @@ Here's an example of a minimal class file: ...@@ -132,15 +140,15 @@ Here's an example of a minimal class file:
--- MyGame.java -------------------------- --- MyGame.java --------------------------
package com.gamemaker.game; package com.gamemaker.game;
import org.libsdl.app.SDLActivity; import org.libsdl.app.SDLActivity;
/** /**
* A sample wrapper class that just calls SDLActivity * A sample wrapper class that just calls SDLActivity
*/ */
public class MyGame extends SDLActivity { } public class MyGame extends SDLActivity { }
------------------------------------------ ------------------------------------------
Then replace "SDLActivity" in AndroidManifest.xml with the name of your Then replace "SDLActivity" in AndroidManifest.xml with the name of your
...@@ -179,7 +187,7 @@ may want to keep this fact in mind when building your APK, specially when large ...@@ -179,7 +187,7 @@ may want to keep this fact in mind when building your APK, specially when large
files are involved. files are involved.
For more information on which extensions get compressed by default and how to For more information on which extensions get compressed by default and how to
disable this behaviour, see for example: disable this behaviour, see for example:
http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/ http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/
...@@ -206,6 +214,9 @@ You should not use the SDL renderer API while the app going in background: ...@@ -206,6 +214,9 @@ You should not use the SDL renderer API while the app going in background:
after you read this message, GL context gets backed-up and you should not after you read this message, GL context gets backed-up and you should not
use the SDL renderer API. use the SDL renderer API.
When this event is received, you have to set the render target to NULL, if you're using it.
(eg call SDL_SetRenderTarget(renderer, NULL))
- SDL_APP_DIDENTERFOREGROUND: - SDL_APP_DIDENTERFOREGROUND:
GL context is restored, and the SDL renderer API is available (unless you GL context is restored, and the SDL renderer API is available (unless you
receive SDL_RENDER_DEVICE_RESET). receive SDL_RENDER_DEVICE_RESET).
...@@ -347,7 +358,7 @@ I get output from addr2line showing that it's in the quit function, in testsprit ...@@ -347,7 +358,7 @@ I get output from addr2line showing that it's in the quit function, in testsprit
You can add logging to your code to help show what's happening: You can add logging to your code to help show what's happening:
#include <android/log.h> #include <android/log.h>
__android_log_print(ANDROID_LOG_INFO, "foo", "Something happened! x = %d", x); __android_log_print(ANDROID_LOG_INFO, "foo", "Something happened! x = %d", x);
If you need to build without optimization turned on, you can create a file called If you need to build without optimization turned on, you can create a file called
...@@ -420,13 +431,13 @@ The Tegra Graphics Debugger is available from NVidia here: ...@@ -420,13 +431,13 @@ The Tegra Graphics Debugger is available from NVidia here:
https://developer.nvidia.com/tegra-graphics-debugger https://developer.nvidia.com/tegra-graphics-debugger
Why is API level 16 the minimum required? Why is API level 19 the minimum required?
================================================================================ ================================================================================
The latest NDK toolchain doesn't support targeting earlier than API level 16. The latest NDK toolchain doesn't support targeting earlier than API level 19.
As of this writing, according to https://developer.android.com/about/dashboards/index.html As of this writing, according to https://www.composables.com/tools/distribution-chart
about 99% of the Android devices accessing Google Play support API level 16 or about 99.7% of the Android devices accessing Google Play support API level 19 or
higher (January 2018). higher (August 2023).
A note regarding the use of the "dirty rectangles" rendering technique A note regarding the use of the "dirty rectangles" rendering technique
...@@ -437,7 +448,7 @@ where you only update a portion of the screen on each frame, you may notice a ...@@ -437,7 +448,7 @@ where you only update a portion of the screen on each frame, you may notice a
variety of visual glitches on Android, that are not present on other platforms. variety of visual glitches on Android, that are not present on other platforms.
This is caused by SDL's use of EGL as the support system to handle OpenGL ES/ES2 This is caused by SDL's use of EGL as the support system to handle OpenGL ES/ES2
contexts, in particular the use of the eglSwapBuffers function. As stated in the contexts, in particular the use of the eglSwapBuffers function. As stated in the
documentation for the function "The contents of ancillary buffers are always documentation for the function "The contents of ancillary buffers are always
undefined after calling eglSwapBuffers". undefined after calling eglSwapBuffers".
Setting the EGL_SWAP_BEHAVIOR attribute of the surface to EGL_BUFFER_PRESERVED Setting the EGL_SWAP_BEHAVIOR attribute of the surface to EGL_BUFFER_PRESERVED
is not possible for SDL as it requires EGL 1.4, available only on the API level is not possible for SDL as it requires EGL 1.4, available only on the API level
...@@ -456,7 +467,7 @@ Two legitimate ways: ...@@ -456,7 +467,7 @@ Two legitimate ways:
Activity by calling Activity.finish(). Activity by calling Activity.finish().
- Android OS can decide to terminate your application by calling onDestroy() - Android OS can decide to terminate your application by calling onDestroy()
(see Activity life cycle). Your application will receive a SDL_QUIT event you (see Activity life cycle). Your application will receive a SDL_QUIT event you
can handle to save things and quit. can handle to save things and quit.
Don't call exit() as it stops the activity badly. Don't call exit() as it stops the activity badly.
......
CMake # CMake
================================================================================
(www.cmake.org) (www.cmake.org)
SDL's build system was traditionally based on autotools. Over time, this SDL's build system was traditionally based on autotools. Over time, this
approach has suffered from several issues across the different supported approach has suffered from several issues across the different supported
platforms. platforms.
To solve these problems, a new build system based on CMake is under development. To solve these problems, a new build system based on CMake was introduced.
It works in parallel to the legacy system, so users can experiment with it It is developed in parallel to the legacy autotools build system, so users
without complication. can experiment with it without complication.
While still experimental, the build system should be usable on the following
platforms: The CMake build system is supported on the following platforms:
* FreeBSD * FreeBSD
* Linux * Linux
* VS.NET 2010 * Microsoft Visual C
* MinGW and Msys * MinGW and Msys
* macOS, iOS, and tvOS, with support for XCode * macOS, iOS, and tvOS, with support for XCode
* Android
* Emscripten
* RiscOS
* Playstation Vita
## Building SDL
Assuming the source for SDL is located at `~/sdl`
```sh
cd ~
mkdir build
cd build
cmake ~/sdl
cmake --build .
```
This will build the static and dynamic versions of SDL in the `~/build` directory.
Installation can be done using:
```sh
cmake --install . # '--install' requires CMake 3.15, or newer
```
## Including SDL in your project
SDL can be included in your project in 2 major ways:
- using a system SDL library, provided by your (*nix) distribution or a package manager
- using a vendored SDL library: this is SDL copied or symlinked in a subfolder.
The following CMake script supports both, depending on the value of `MYGAME_VENDORED`.
```cmake
cmake_minimum_required(VERSION 3.5)
project(mygame)
# Create an option to switch between a system sdl library and a vendored sdl library
option(MYGAME_VENDORED "Use vendored libraries" OFF)
================================================================================ if(MYGAME_VENDORED)
Usage add_subdirectory(vendored/sdl EXCLUDE_FROM_ALL)
================================================================================ else()
# 1. Look for a SDL2 package, 2. look for the SDL2 component and 3. fail if none can be found
find_package(SDL2 REQUIRED CONFIG REQUIRED COMPONENTS SDL2)
Assuming the source for SDL is located at ~/sdl # 1. Look for a SDL2 package, 2. Look for the SDL2maincomponent and 3. DO NOT fail when SDL2main is not available
find_package(SDL2 REQUIRED CONFIG COMPONENTS SDL2main)
endif()
cd ~ # Create your game executable target as usual
mkdir build add_executable(mygame WIN32 mygame.c)
cd build
cmake ../sdl
This will build the static and dynamic versions of SDL in the ~/build directory. # SDL2::SDL2main may or may not be available. It is e.g. required by Windows GUI applications
if(TARGET SDL2::SDL2main)
# It has an implicit dependency on SDL2 functions, so it MUST be added before SDL2::SDL2 (or SDL2::SDL2-static)
target_link_libraries(mygame PRIVATE SDL2::SDL2main)
endif()
# Link to the actual SDL2 library. SDL2::SDL2 is the shared SDL library, SDL2::SDL2-static is the static SDL libarary.
target_link_libraries(mygame PRIVATE SDL2::SDL2)
```
================================================================================ ### A system SDL library
Usage, iOS/tvOS
================================================================================ For CMake to find SDL, it must be installed in [a default location CMake is looking for](https://cmake.org/cmake/help/latest/command/find_package.html#config-mode-search-procedure).
The following components are available, to be used as an argument of `find_package`.
| Component name | Description |
|----------------|--------------------------------------------------------------------------------------------|
| SDL2 | The SDL2 shared library, available through the `SDL2::SDL2` target [^SDL_TARGET_EXCEPTION] |
| SDL2-static | The SDL2 static library, available through the `SDL2::SDL2-static` target |
| SDL2main | The SDL2main static library, available through the `SDL2::SDL2main` target |
| SDL2test | The SDL2test static library, available through the `SDL2::SDL2test` target |
### Using a vendored SDL
This only requires a copy of SDL in a subdirectory.
## CMake configuration options for platforms
### iOS/tvOS
CMake 3.14+ natively includes support for iOS and tvOS. SDL binaries may be built CMake 3.14+ natively includes support for iOS and tvOS. SDL binaries may be built
using Xcode or Make, possibly among other build-systems. using Xcode or Make, possibly among other build-systems.
...@@ -53,32 +115,49 @@ To use, set the following CMake variables when running CMake's configuration sta ...@@ -53,32 +115,49 @@ To use, set the following CMake variables when running CMake's configuration sta
- `CMAKE_OSX_ARCHITECTURES=<semicolon-separated list of CPU architectures>` (example: "arm64;armv7s;x86_64") - `CMAKE_OSX_ARCHITECTURES=<semicolon-separated list of CPU architectures>` (example: "arm64;armv7s;x86_64")
### Examples (for iOS/tvOS): #### Examples
- for iOS-Simulator, using the latest, installed SDK: - for iOS-Simulator, using the latest, installed SDK:
`cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64` ```bash
cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64
```
- for iOS-Device, using the latest, installed SDK, 64-bit only - for iOS-Device, using the latest, installed SDK, 64-bit only
`cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES=arm64` ```bash
cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES=arm64
```
- for iOS-Device, using the latest, installed SDK, mixed 32/64 bit - for iOS-Device, using the latest, installed SDK, mixed 32/64 bit
`cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES="arm64;armv7s"` ```cmake
cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES="arm64;armv7s"
```
- for iOS-Device, using a specific SDK revision (iOS 12.4, in this example): - for iOS-Device, using a specific SDK revision (iOS 12.4, in this example):
`cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos12.4 -DCMAKE_OSX_ARCHITECTURES=arm64` ```cmake
cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos12.4 -DCMAKE_OSX_ARCHITECTURES=arm64
```
- for iOS-Simulator, using the latest, installed SDK, and building SDL test apps (as .app bundles): - for iOS-Simulator, using the latest, installed SDK, and building SDL test apps (as .app bundles):
`cmake ~/sdl -DSDL_TEST=1 -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64` ```cmake
cmake ~/sdl -DSDL_TESTS=1 -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64
```
- for tvOS-Simulator, using the latest, installed SDK: - for tvOS-Simulator, using the latest, installed SDK:
`cmake ~/sdl -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvsimulator -DCMAKE_OSX_ARCHITECTURES=x86_64` ```cmake
cmake ~/sdl -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvsimulator -DCMAKE_OSX_ARCHITECTURES=x86_64
```
- for tvOS-Device, using the latest, installed SDK: - for tvOS-Device, using the latest, installed SDK:
`cmake ~/sdl -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvos -DCMAKE_OSX_ARCHITECTURES=arm64` ```cmake
cmake ~/sdl -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvos -DCMAKE_OSX_ARCHITECTURES=arm64`
```
[^SDL_TARGET_EXCEPTION]: `SDL2::SDL2` can be an ALIAS to a static `SDL2::SDL2-static` target for multiple reasons.
...@@ -12,40 +12,47 @@ Supports: ...@@ -12,40 +12,47 @@ Supports:
What you need: What you need:
* DirectFB 1.0.1, 1.2.x, 1.3.0 * DirectFB 1.0.1, 1.2.x, 1.3.0
* Kernel-Framebuffer support: required: vesafb, radeonfb .... * Kernel-Framebuffer support: required: vesafb, radeonfb ....
* Mesa 7.0.x - optional for OpenGL * Mesa 7.0.x - optional for OpenGL
/etc/directfbrc The `/etc/directfbrc` file should contain the following lines to make
This file should contain the following lines to make
your joystick work and avoid crashes: your joystick work and avoid crashes:
------------------------
```
disable-module=joystick disable-module=joystick
disable-module=cle266 disable-module=cle266
disable-module=cyber5k disable-module=cyber5k
no-linux-input-grab no-linux-input-grab
------------------------ ```
To disable to use x11 backend when DISPLAY variable is found use To disable to use x11 backend when DISPLAY variable is found use
```
export SDL_DIRECTFB_X11_CHECK=0 export SDL_DIRECTFB_X11_CHECK=0
```
To disable the use of linux input devices, i.e. multimice/multikeyboard support, To disable the use of linux input devices, i.e. multimice/multikeyboard support,
use use
```
export SDL_DIRECTFB_LINUX_INPUT=0 export SDL_DIRECTFB_LINUX_INPUT=0
```
To use hardware accelerated YUV-overlays for YUV-textures, use: To use hardware accelerated YUV-overlays for YUV-textures, use:
```
export SDL_DIRECTFB_YUV_DIRECT=1 export SDL_DIRECTFB_YUV_DIRECT=1
```
This is disabled by default. It will only support one This is disabled by default. It will only support one
YUV texture, namely the first. Every other YUV texture will be YUV texture, namely the first. Every other YUV texture will be
rendered in software. rendered in software.
In addition, you may use (directfb-1.2.x) In addition, you may use (directfb-1.2.x)
```
export SDL_DIRECTFB_YUV_UNDERLAY=1 export SDL_DIRECTFB_YUV_UNDERLAY=1
```
to make the YUV texture an underlay. This will make the cursor to to make the YUV texture an underlay. This will make the cursor to
be shown. be shown.
...@@ -54,14 +61,18 @@ Simple Window Manager ...@@ -54,14 +61,18 @@ Simple Window Manager
===================== =====================
The driver has support for a very, very basic window manager you may The driver has support for a very, very basic window manager you may
want to use when running with "wm=default". Use want to use when running with `wm=default`. Use
```
export SDL_DIRECTFB_WM=1 export SDL_DIRECTFB_WM=1
```
to enable basic window borders. In order to have the window title rendered, to enable basic window borders. In order to have the window title rendered,
you need to have the following font installed: you need to have the following font installed:
```
/usr/share/fonts/truetype/freefont/FreeSans.ttf /usr/share/fonts/truetype/freefont/FreeSans.ttf
```
OpenGL Support OpenGL Support
============== ==============
...@@ -71,21 +82,25 @@ works at least on all directfb supported platforms. ...@@ -71,21 +82,25 @@ works at least on all directfb supported platforms.
As of this writing 20100802 you need to pull Mesa from git and do the following: As of this writing 20100802 you need to pull Mesa from git and do the following:
------------------------ ```
git clone git://anongit.freedesktop.org/git/mesa/mesa git clone git://anongit.freedesktop.org/git/mesa/mesa
cd mesa cd mesa
git checkout 2c9fdaf7292423c157fc79b5ce43f0f199dd753a git checkout 2c9fdaf7292423c157fc79b5ce43f0f199dd753a
------------------------ ```
Edit `configs/linux-directfb` so that the Directories-section looks like this:
Edit configs/linux-directfb so that the Directories-section looks like ```
------------------------
# Directories # Directories
SRC_DIRS = mesa glu SRC_DIRS = mesa glu
GLU_DIRS = sgi GLU_DIRS = sgi
DRIVER_DIRS = directfb DRIVER_DIRS = directfb
PROGRAM_DIRS = PROGRAM_DIRS =
------------------------ ```
Then do the following:
```
make linux-directfb make linux-directfb
make make
...@@ -95,13 +110,14 @@ sudo make install INSTALL_DIR=/usr/local/dfb_GL ...@@ -95,13 +110,14 @@ sudo make install INSTALL_DIR=/usr/local/dfb_GL
cd src/mesa/drivers/directfb cd src/mesa/drivers/directfb
make make
sudo make install INSTALL_DIR=/usr/local/dfb_GL sudo make install INSTALL_DIR=/usr/local/dfb_GL
------------------------ ```
To run the SDL - testprograms: To run the SDL - testprograms:
```
export SDL_VIDEODRIVER=directfb export SDL_VIDEODRIVER=directfb
export LD_LIBRARY_PATH=/usr/local/dfb_GL/lib export LD_LIBRARY_PATH=/usr/local/dfb_GL/lib
export LD_PRELOAD=/usr/local/dfb_GL/libGL.so.7 export LD_PRELOAD=/usr/local/dfb_GL/libGL.so.7
./testgl ./testgl
```
...@@ -4,29 +4,29 @@ Originally posted on Ryan's Google+ account. ...@@ -4,29 +4,29 @@ Originally posted on Ryan's Google+ account.
Background: Background:
- The Steam Runtime has (at least in theory) a really kick-ass build of SDL2, - The Steam Runtime has (at least in theory) a really kick-ass build of SDL2,
but developers are shipping their own SDL2 with individual Steam games. but developers are shipping their own SDL2 with individual Steam games.
These games might stop getting updates, but a newer SDL2 might be needed later. These games might stop getting updates, but a newer SDL2 might be needed later.
Certainly we'll always be fixing bugs in SDL, even if a new video target isn't Certainly we'll always be fixing bugs in SDL, even if a new video target isn't
ever needed, and these fixes won't make it to a game shipping its own SDL. ever needed, and these fixes won't make it to a game shipping its own SDL.
- Even if we replace the SDL2 in those games with a compatible one, that is to - Even if we replace the SDL2 in those games with a compatible one, that is to
say, edit a developer's Steam depot (yuck!), there are developers that are say, edit a developer's Steam depot (yuck!), there are developers that are
statically linking SDL2 that we can't do this for. We can't even force the statically linking SDL2 that we can't do this for. We can't even force the
dynamic loader to ignore their SDL2 in this case, of course. dynamic loader to ignore their SDL2 in this case, of course.
- If you don't ship an SDL2 with the game in some form, people that disabled the - If you don't ship an SDL2 with the game in some form, people that disabled the
Steam Runtime, or just tried to run the game from the command line instead of Steam Runtime, or just tried to run the game from the command line instead of
Steam might find themselves unable to run the game, due to a missing dependency. Steam might find themselves unable to run the game, due to a missing dependency.
- If you want to ship on non-Steam platforms like GOG or Humble Bundle, or target - If you want to ship on non-Steam platforms like GOG or Humble Bundle, or target
generic Linux boxes that may or may not have SDL2 installed, you have to ship generic Linux boxes that may or may not have SDL2 installed, you have to ship
the library or risk a total failure to launch. So now, you might have to have the library or risk a total failure to launch. So now, you might have to have
a non-Steam build plus a Steam build (that is, one with and one without SDL2 a non-Steam build plus a Steam build (that is, one with and one without SDL2
included), which is inconvenient if you could have had one universal build included), which is inconvenient if you could have had one universal build
that works everywhere. that works everywhere.
- We like the zlib license, but the biggest complaint from the open source - We like the zlib license, but the biggest complaint from the open source
community about the license change is the static linking. The LGPL forced this community about the license change is the static linking. The LGPL forced this
as a legal, not technical issue, but zlib doesn't care. Even those that aren't as a legal, not technical issue, but zlib doesn't care. Even those that aren't
concerned about the GNU freedoms found themselves solving the same problems: concerned about the GNU freedoms found themselves solving the same problems:
swapping in a newer SDL to an older game often times can save the day. swapping in a newer SDL to an older game often times can save the day.
Static linking stops this dead. Static linking stops this dead.
So here's what we did: So here's what we did:
...@@ -45,7 +45,7 @@ Except that is all done with a bunch of macro magic so we don't have to maintain ...@@ -45,7 +45,7 @@ Except that is all done with a bunch of macro magic so we don't have to maintain
every one of these. every one of these.
What is jump_table.SDL_init()? Eventually, that's a function pointer of the real What is jump_table.SDL_init()? Eventually, that's a function pointer of the real
SDL_Init() that you've been calling all this time. But at startup, it looks more SDL_Init() that you've been calling all this time. But at startup, it looks more
like this: like this:
```c ```c
...@@ -56,12 +56,12 @@ Uint32 SDL_Init_DEFAULT(Uint32 flags) ...@@ -56,12 +56,12 @@ Uint32 SDL_Init_DEFAULT(Uint32 flags)
} }
``` ```
SDL_InitDynamicAPI() fills in jump_table with all the actual SDL function SDL_InitDynamicAPI() fills in jump_table with all the actual SDL function
pointers, which means that this `_DEFAULT` function never gets called again. pointers, which means that this `_DEFAULT` function never gets called again.
First call to any SDL function sets the whole thing up. First call to any SDL function sets the whole thing up.
So you might be asking, what was the value in that? Isn't this what the operating So you might be asking, what was the value in that? Isn't this what the operating
system's dynamic loader was supposed to do for us? Yes, but now we've got this system's dynamic loader was supposed to do for us? Yes, but now we've got this
level of indirection, we can do things like this: level of indirection, we can do things like this:
```bash ```bash
...@@ -69,34 +69,34 @@ export SDL_DYNAMIC_API=/my/actual/libSDL-2.0.so.0 ...@@ -69,34 +69,34 @@ export SDL_DYNAMIC_API=/my/actual/libSDL-2.0.so.0
./MyGameThatIsStaticallyLinkedToSDL2 ./MyGameThatIsStaticallyLinkedToSDL2
``` ```
And now, this game that is statically linked to SDL, can still be overridden And now, this game that is statically linked to SDL, can still be overridden
with a newer, or better, SDL. The statically linked one will only be used as with a newer, or better, SDL. The statically linked one will only be used as
far as calling into the jump table in this case. But in cases where no override far as calling into the jump table in this case. But in cases where no override
is desired, the statically linked version will provide its own jump table, is desired, the statically linked version will provide its own jump table,
and everyone is happy. and everyone is happy.
So now: So now:
- Developers can statically link SDL, and users can still replace it. - Developers can statically link SDL, and users can still replace it.
(We'd still rather you ship a shared library, though!) (We'd still rather you ship a shared library, though!)
- Developers can ship an SDL with their game, Valve can override it for, say, - Developers can ship an SDL with their game, Valve can override it for, say,
new features on SteamOS, or distros can override it for their own needs, new features on SteamOS, or distros can override it for their own needs,
but it'll also just work in the default case. but it'll also just work in the default case.
- Developers can ship the same package to everyone (Humble Bundle, GOG, etc), - Developers can ship the same package to everyone (Humble Bundle, GOG, etc),
and it'll do the right thing. and it'll do the right thing.
- End users (and Valve) can update a game's SDL in almost any case, - End users (and Valve) can update a game's SDL in almost any case,
to keep abandoned games running on newer platforms. to keep abandoned games running on newer platforms.
- Everyone develops with SDL exactly as they have been doing all along. - Everyone develops with SDL exactly as they have been doing all along.
Same headers, same ABI. Just get the latest version to enable this magic. Same headers, same ABI. Just get the latest version to enable this magic.
A little more about SDL_InitDynamicAPI(): A little more about SDL_InitDynamicAPI():
Internally, InitAPI does some locking to make sure everything waits until a Internally, InitAPI does some locking to make sure everything waits until a
single thread initializes everything (although even SDL_CreateThread() goes single thread initializes everything (although even SDL_CreateThread() goes
through here before spinning a thread, too), and then decides if it should use through here before spinning a thread, too), and then decides if it should use
an external SDL library. If not, it sets up the jump table using the current an external SDL library. If not, it sets up the jump table using the current
SDL's function pointers (which might be statically linked into a program, or in SDL's function pointers (which might be statically linked into a program, or in
a shared library of its own). If so, it loads that library and looks for and a shared library of its own). If so, it loads that library and looks for and
calls a single function: calls a single function:
```c ```c
...@@ -104,35 +104,35 @@ SInt32 SDL_DYNAPI_entry(Uint32 version, void *table, Uint32 tablesize); ...@@ -104,35 +104,35 @@ 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 That function takes a version number (more on that in a moment), the address of
the jump table, and the size, in bytes, of the table. the jump table, and the size, in bytes, of the table.
Now, we've got policy here: this table's layout never changes; new stuff gets Now, we've got policy here: this table's layout never changes; new stuff gets
added to the end. Therefore SDL_DYNAPI_entry() knows that it can provide all added to the end. Therefore SDL_DYNAPI_entry() knows that it can provide all
the needed functions if tablesize <= sizeof its own jump table. If tablesize is the needed functions if tablesize <= sizeof its own jump table. If tablesize is
bigger (say, SDL 2.0.4 is trying to load SDL 2.0.3), then we know to abort, but bigger (say, SDL 2.0.4 is trying to load SDL 2.0.3), then we know to abort, but
if it's smaller, we know we can provide the entire API that the caller needs. if it's smaller, we know we can provide the entire API that the caller needs.
The version variable is a failsafe switch. The version variable is a failsafe switch.
Right now it's always 1. This number changes when there are major API changes Right now it's always 1. This number changes when there are major API changes
(so we know if the tablesize might be smaller, or entries in it have changed). (so we know if the tablesize might be smaller, or entries in it have changed).
Right now SDL_DYNAPI_entry gives up if the version doesn't match, but it's not Right now SDL_DYNAPI_entry gives up if the version doesn't match, but it's not
inconceivable to have a small dispatch library that only supplies this one inconceivable to have a small dispatch library that only supplies this one
function and loads different, otherwise-incompatible SDL libraries and has the function and loads different, otherwise-incompatible SDL libraries and has the
right one initialize the jump table based on the version. For something that right one initialize the jump table based on the version. For something that
must generically catch lots of different versions of SDL over time, like the must generically catch lots of different versions of SDL over time, like the
Steam Client, this isn't a bad option. Steam Client, this isn't a bad option.
Finally, I'm sure some people are reading this and thinking, Finally, I'm sure some people are reading this and thinking,
"I don't want that overhead in my project!" "I don't want that overhead in my project!"
To which I would point out that the extra function call through the jump table To which I would point out that the extra function call through the jump table
probably wouldn't even show up in a profile, but lucky you: this can all be probably wouldn't even show up in a profile, but lucky you: this can all be
disabled. You can build SDL without this if you absolutely must, but we would disabled. You can build SDL without this if you absolutely must, but we would
encourage you not to do that. However, on heavily locked down platforms like encourage you not to do that. However, on heavily locked down platforms like
iOS, or maybe when debugging, it makes sense to disable it. The way this is iOS, or maybe when debugging, it makes sense to disable it. The way this is
designed in SDL, you just have to change one #define, and the entire system designed in SDL, you just have to change one #define, and the entire system
vaporizes out, and SDL functions exactly like it always did. Most of it is vaporizes out, and SDL functions exactly like it always did. Most of it is
macro magic, so the system is contained to one C file and a few headers. macro magic, so the system is contained to one C file and a few headers.
However, this is on by default and you have to edit a header file to turn it However, this is on by default and you have to edit a header file to turn it
off. Our hopes is that if we make it easy to disable, but not too easy, off. Our hopes is that if we make it easy to disable, but not too easy,
everyone will ultimately be able to get what they want, but we've gently everyone will ultimately be able to get what they want, but we've gently
nudged everyone towards what we think is the best solution. nudged everyone towards what we think is the best solution.
Emscripten # Emscripten
================================================================================
(This documentation is not very robust; we will update and expand this later.)
## A quick note about audio
Modern web browsers will not permit web pages to produce sound before the
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
best bet is to write a little Javascript that puts up a "Click here to play!"
UI, and upon the user clicking, remove that UI and then call the Emscripten
app's main() function. As far as the application knows, the audio device was
available to be opened as soon as the program started, and since this magic
happens in a little Javascript, you don't have to change your C/C++ code at
all to make it happen.
Please see the discussion at https://github.com/libsdl-org/SDL/issues/6385
for some Javascript code to steal for this approach.
## Building SDL/emscripten
SDL currently requires at least Emscripten 3.1.35 to build. Newer versions
are likely to work, as well.
Build: Build:
......
GDK
=====
This port allows SDL applications to run via Microsoft's Game Development Kit (GDK).
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
------------
* 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))
* 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.
Windows GDK Status
------
The Windows GDK port supports the full set of Win32 APIs, renderers, controllers, input devices, etc., as the normal Windows x64 build of SDL.
* Additionally, the GDK port adds the following:
* Compile-time platform detection for SDL programs. The `__GDK__` is `#define`d on every GDK platform, and the `__WINGDK__` is `#define`d on Windows GDK, specifically. (This distinction exists because other GDK platforms support a smaller subset of functionality. This allows you to mark code for "any" GDK separate from Windows GDK.)
* GDK-specific setup:
* Initializing/uninitializing the game runtime, and initializing Xbox Live services
* Creating a global task queue and setting it as the default for the process. When running any async operations, passing in `NULL` as the task queue will make the task get added to the global task queue.
* An implementation on `WinMain` that performs the above GDK setup (you should link against SDL2main.lib, as in Windows x64). If you are unable to do this, you can instead manually call `SDL_GDKRunApp` from your entry point, passing in your `SDL_main` function and `NULL` as the parameters.
* 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).
* What doesn't work:
* Compilation with anything other than through the included Visual C++ solution file
## VisualC-GDK Solution
The included `VisualC-GDK/SDL.sln` solution includes the following targets for the Gaming.Desktop.x64 configuration:
* SDL2 (DLL) - This is the typical SDL2.dll, but for Gaming.Desktop.x64.
* SDL2main (lib) - This contains a drop-in implementation of `WinMain` that is used as the entry point for GDK programs.
* tests/testgamecontroller - Standard SDL test program demonstrating controller functionality.
* tests/testgdk - GDK-specific test program that demonstrates using the global task queue to login a user into Xbox Live.
*NOTE*: As of the June 2022 GDK, you cannot test user logins without a valid Title ID and MSAAppId. You will need to manually change the identifiers in the `MicrosoftGame.config` to your valid IDs from Partner Center if you wish to test this.
* tests/testsprite2 - Standard SDL test program demonstrating sprite drawing functionality.
If you set one of the test programs as a startup project, you can run it directly from Visual Studio.
Windows GDK Setup, Detailed Steps
---------------------
These steps assume you already have a game using SDL that runs on Windows x64 along with a corresponding Visual Studio solution file for the x64 version. If you don't have this, it's easiest to use one of the test program vcxproj files in the `VisualC-GDK` directory as a starting point, though you will still need to do most of the steps below.
### 1. Add a Gaming.Desktop.x64 Configuration ###
In your game's existing Visual Studio Solution, go to Build > Configuration Manager. From the "Active solution platform" drop-down select "New...". From the drop-down list, select Gaming.Desktop.x64 and copy the settings from the x64 configuration.
### 2. Build SDL2 and SDL2main for GDK ###
Open `VisualC-GDK/SDL.sln` in Visual Studio, you need to build the SDL2 and SDL2main targets for the Gaming.Desktop.x64 platform (Release is recommended). You will need to copy/keep track of the `SDL2.dll`, `XCurl.dll` (which is output by Gaming.Desktop.x64), `SDL2.lib`, and `SDL2main.lib` output files for your game project.
*Alternatively*, you could setup your solution file to instead reference the SDL2/SDL2main project file targets from the SDL source, and add those projects as a dependency. This would mean that SDL2 and SDL2main would both be built when your game is built.
### 3. Configuring Project Settings ###
While the Gaming.Desktop.x64 configuration sets most of the required settings, there are some additional items to configure for your game project under the Gaming.Desktop.x64 Configuration:
* Under C/C++ > General > Additional Include Directories, make sure the `SDL/include` path is referenced
* Under Linker > General > Additional Library Directories, make sure to reference the path where the newly-built SDL2.lib and SDL2main.lib are
* Under Linker > Input > Additional Dependencies, you need the following:
* `SDL2.lib`
* `SDL2main.lib` (unless not using)
* `xgameruntime.lib`
* `../Microsoft.Xbox.Services.141.GDK.C.Thunks.lib`
* Note that in general, the GDK libraries depend on the MSVC C/C++ runtime, so there is no way to remove this dependency from a GDK program that links against GDK.
### 4. Setting up SDL_main ###
Rather than using your own implementation of `WinMain`, it's recommended that you instead `#include "SDL_main.h"` and declare a standard main function. If you are unable to do this, you can instead manually call `SDL_GDKRunApp` from your entry point, passing in your `SDL_main` function and `NULL` as the parameters.
### 5. Required DLLs ###
The game will not launch in the debugger unless required DLLs are included in the directory that contains the game's .exe file. You need to make sure that the following files are copied into the directory:
* Your SDL2.dll
* "$(Console_GRDKExtLibRoot)Xbox.Services.API.C\DesignTime\CommonConfiguration\Neutral\Lib\Release\Microsoft.Xbox.Services.141.GDK.C.Thunks.dll"
* XCurl.dll
You can either copy these in a post-build step, or you can add the dlls into the project and set its Configuration Properties > General > Item type to "Copy file," which will also copy them into the output directory.
### 6. Setting up MicrosoftGame.config ###
You can copy `VisualC-GDK/tests/testgdk/MicrosoftGame.config` and use that as a starting point in your project. Minimally, you will want to change the Executable Name attribute, the DefaultDisplayName, and the Description.
This file must be copied into the same directory as the game's .exe file. As with the DLLs, you can either use a post-build step or the "Copy file" item type.
For basic testing, you do not need to change anything else in `MicrosoftGame.config`. However, if you want to test any Xbox Live services (such as logging in users) _or_ publish a package, you will need to setup a Game app on Partner Center.
Then, you need to set the following values to the values from Partner Center:
* Identity tag - Name and Publisher attributes
* TitleId
* MSAAppId
### 7. Adding Required Logos
Several logo PNG files are required to be able to launch the game, even from the debugger. You can use the sample logos provided in `VisualC-GDK/logos`. As with the other files, they must be copied into the same directory as the game's .exe file.
### 8. Copying any Data Files ###
When debugging GDK games, there is no way to specify a working directory. Therefore, any required game data must also be copied into the output directory, likely in a post-build step.
### 9. Build and Run from Visual Studio ###
At this point, you should be able to build and run your game from the Visual Studio Debugger. If you get any linker errors, make sure you double-check that you referenced all the required libs.
If you are testing Xbox Live functionality, it's likely you will need to change to the Sandbox for your title. To do this:
1. Run "Desktop VS 2022 Gaming Command Prompt" from the Start Menu
2. Switch the sandbox name with:
`XblPCSandbox SANDBOX.#`
3. (To switch back to the retail sandbox):
`XblPCSandbox RETAIL`
### 10. Packaging and Installing Locally
You can use one of the test program's `PackageLayout.xml` as a starting point. Minimally, you will need to change the exe to the correct name and also reference any required game data. As with the other data files, it's easiest if you have this copy to the output directory, although it's not a requirement as you can specify relative paths to files.
To create the package:
1. Run "Desktop VS 2022 Gaming Command Prompt" from the Start Menu
2. `cd` to the directory containing the `PackageLayout.xml` with the correct paths (if you use the local path as in the sample package layout, this would be from your .exe output directory)
3. `mkdir Package` to create an output directory
4. To package the file into the `Package` directory, use:
`makepkg pack /f PackageLayout.xml /lt /d . /nogameos /pc /pd Package`
5. To install the package, use:
`wdapp install PACKAGENAME.msixvc`
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.
Troubleshooting
---------------
#### Xbox Live Login does not work
As of June 2022 GDK, you must have a valid Title Id and MSAAppId in order to test Xbox Live functionality such as user login. Make sure these are set correctly in the `MicrosoftGame.config`. This means that even testgdk will not let you login without setting these properties to valid values.
Furthermore, confirm that your PC is set to the correct sandbox.
#### "The current user has already installed an unpackaged version of this app. A packaged version cannot replace this." error when installing
Prior to June 2022 GDK, running from the Visual Studio debugger would still locally register the app (and it would appear on the start menu). To fix this, you have to uninstall it (it's simplest to right click on it from the start menu to uninstall it).
...@@ -2,7 +2,7 @@ Dollar Gestures ...@@ -2,7 +2,7 @@ Dollar Gestures
=========================================================================== ===========================================================================
SDL provides an implementation of the $1 gesture recognition system. This allows for recording, saving, loading, and performing single stroke gestures. SDL provides an implementation of the $1 gesture recognition system. This allows for recording, saving, loading, and performing single stroke gestures.
Gestures can be performed with any number of fingers (the centroid of the fingers must follow the path of the gesture), but the number of fingers must be constant (a finger cannot go down in the middle of a gesture). The path of a gesture is considered the path from the time when the final finger went down, to the first time any finger comes up. Gestures can be performed with any number of fingers (the centroid of the fingers must follow the path of the gesture), but the number of fingers must be constant (a finger cannot go down in the middle of a gesture). The path of a gesture is considered the path from the time when the final finger went down, to the first time any finger comes up.
Dollar gestures are assigned an Id based on a hash function. This is guaranteed to remain constant for a given gesture. There is a (small) chance that two different gestures will be assigned the same ID. In this case, simply re-recording one of the gestures should result in a different ID. Dollar gestures are assigned an Id based on a hash function. This is guaranteed to remain constant for a given gesture. There is a (small) chance that two different gestures will be assigned the same ID. In this case, simply re-recording one of the gestures should result in a different ID.
...@@ -42,7 +42,7 @@ Both functions return the number of gestures successfully saved. ...@@ -42,7 +42,7 @@ Both functions return the number of gestures successfully saved.
Loading: Loading:
-------- --------
To load templates from a file, call SDL_LoadDollarTemplates(touchId,src) where touchId is the id of the touch to load to (or -1 to load to all touch devices), and src is an SDL_RWops pointer to a gesture save file. To load templates from a file, call SDL_LoadDollarTemplates(touchId,src) where touchId is the id of the touch to load to (or -1 to load to all touch devices), and src is an SDL_RWops pointer to a gesture save file.
SDL_LoadDollarTemplates returns the number of templates successfully loaded. SDL_LoadDollarTemplates returns the number of templates successfully loaded.
...@@ -51,7 +51,7 @@ SDL_LoadDollarTemplates returns the number of templates successfully loaded. ...@@ -51,7 +51,7 @@ SDL_LoadDollarTemplates returns the number of templates successfully loaded.
=========================================================================== ===========================================================================
Multi Gestures Multi Gestures
=========================================================================== ===========================================================================
SDL provides simple support for pinch/rotate/swipe gestures. SDL provides simple support for pinch/rotate/swipe gestures.
Every time a finger is moved an SDL_MULTIGESTURE event is sent with the following fields: Every time a finger is moved an SDL_MULTIGESTURE event is sent with the following fields:
* event.mgesture.touchId - the Id of the touch on which the gesture was performed. * event.mgesture.touchId - the Id of the touch on which the gesture was performed.
......
iOS iOS
====== ======
Building the Simple DirectMedia Layer for iOS 5.1+ Building the Simple DirectMedia Layer for iOS 9.0+
============================================================================== ==============================================================================
Requirements: Mac OS X 10.8 or later and the iOS 7+ SDK. Requirements: Mac OS X 10.9 or later and the iOS 9.0 or newer SDK.
Instructions: Instructions:
...@@ -111,17 +111,17 @@ e.g. ...@@ -111,17 +111,17 @@ e.g.
return 1; return 1;
} }
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
SDL_SetEventFilter(HandleAppEvents, NULL); SDL_SetEventFilter(HandleAppEvents, NULL);
... run your main loop ... run your main loop
return 0; return 0;
} }
Notes -- Accelerometer as Joystick Notes -- Accelerometer as Joystick
============================================================================== ==============================================================================
...@@ -185,12 +185,44 @@ Once your application is installed its directory tree looks like: ...@@ -185,12 +185,44 @@ Once your application is installed its directory tree looks like:
Preferences/ Preferences/
tmp/ tmp/
When your SDL based iPhone application starts up, it sets the working directory to the main bundle (MySDLApp Home/MySDLApp.app), where your application resources are stored. You cannot write to this directory. Instead, I advise you to write document files to "../Documents/" and preferences to "../Library/Preferences". When your SDL based iPhone application starts up, it sets the working directory to the main bundle (MySDLApp Home/MySDLApp.app), where your application resources are stored. You cannot write to this directory. Instead, I advise you to write document files to "../Documents/" and preferences to "../Library/Preferences".
More information on this subject is available here: More information on this subject is available here:
http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html
Notes -- xcFramework
==============================================================================
The SDL.xcodeproj file now includes a target to build SDL2.xcframework. An xcframework is a new (Xcode 11) uber-framework which can handle any combination of processor type and target OS platform.
In the past, iOS devices were always an ARM variant processor, and the simulator was always i386 or x86_64, and thus libraries could be combined into a single framework for both simulator and device. With the introduction of the Apple Silicon ARM-based machines, regular frameworks would collide as CPU type was no longer sufficient to differentiate the platform. So Apple created the new xcframework library package.
The xcframework target builds into a Products directory alongside the SDL.xcodeproj file, as SDL2.xcframework. This can be brought in to any iOS project and will function properly for both simulator and device, no matter their CPUs. Note that Intel Macs cannot cross-compile for Apple Silicon Macs. If you need AS compatibility, perform this build on an Apple Silicon Mac.
This target requires Xcode 11 or later. The target will simply fail to build if attempted on older Xcodes.
In addition, on Apple platforms, main() cannot be in a dynamically loaded library. This means that iOS apps which used the statically-linked libSDL2.lib and now link with the xcframwork will need to define their own main() to call SDL_UIKitRunApp(), like this:
#ifndef SDL_MAIN_HANDLED
#ifdef main
#undef main
#endif
int
main(int argc, char *argv[])
{
return SDL_UIKitRunApp(argc, argv, SDL_main);
}
#endif /* !SDL_MAIN_HANDLED */
Using an xcFramework is similar to using a regular framework. However, issues have been seen with the build system not seeing the headers in the xcFramework. To remedy this, add the path to the xcFramework in your app's target ==> Build Settings ==> Framework Search Paths and mark it recursive (this is critical). Also critical is to remove "*.framework" from Build Settings ==> Sub-Directories to Exclude in Recursive Searches. Clean the build folder, and on your next build the build system should be able to see any of these in your code, as expected:
#include "SDL_main.h"
#include <SDL.h>
#include <SDL_main.h>
Notes -- iPhone SDL limitations Notes -- iPhone SDL limitations
============================================================================== ==============================================================================
...@@ -220,7 +252,7 @@ to your Info.plist: ...@@ -220,7 +252,7 @@ to your Info.plist:
<string>MyApp would like to remain connected to nearby bluetooth Game Controllers and Game Pads even when you're not using the app.</string> <string>MyApp would like to remain connected to nearby bluetooth Game Controllers and Game Pads even when you're not using the app.</string>
Game Center Game Center
============================================================================== ==============================================================================
Game Center integration might require that you break up your main loop in order to yield control back to the system. In other words, instead of running an endless main loop, you run each frame in a callback function, using: Game Center integration might require that you break up your main loop in order to yield control back to the system. In other words, instead of running an endless main loop, you run each frame in a callback function, using:
...@@ -236,15 +268,15 @@ e.g. ...@@ -236,15 +268,15 @@ e.g.
{ {
... do event handling, frame logic and rendering ... ... do event handling, frame logic and rendering ...
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
... initialize game ... ... initialize game ...
#if __IPHONEOS__ #if __IPHONEOS__
// Initialize the Game Center for scoring and matchmaking // Initialize the Game Center for scoring and matchmaking
InitGameCenter(); InitGameCenter();
// Set up the game to run in the window animation callback on iOS // Set up the game to run in the window animation callback on iOS
// so that Game Center and so forth works correctly. // so that Game Center and so forth works correctly.
SDL_iPhoneSetAnimationCallback(window, 1, ShowFrame, NULL); SDL_iPhoneSetAnimationCallback(window, 1, ShowFrame, NULL);
...@@ -261,7 +293,7 @@ e.g. ...@@ -261,7 +293,7 @@ e.g.
Deploying to older versions of iOS Deploying to older versions of iOS
============================================================================== ==============================================================================
SDL supports deploying to older versions of iOS than are supported by the latest version of Xcode, all the way back to iOS 6.1 SDL supports deploying to older versions of iOS than are supported by the latest version of Xcode, all the way back to iOS 8.0
In order to do that you need to download an older version of Xcode: In order to do that you need to download an older version of Xcode:
https://developer.apple.com/download/more/?name=Xcode https://developer.apple.com/download/more/?name=Xcode
......