diff --git a/COPYING.txt b/COPYING.txt
new file mode 100644
index 0000000..ad88de3
--- /dev/null
+++ b/COPYING.txt
@@ -0,0 +1,116 @@
+The following license applies to:
+
+ def/engine.def
+ materials
+ materials/base.mtr
+ materials/dummy.mtr
+ default.cfg
+ guis/chat.gui
+ guis/mphud.gui
+ guis/msg.gui
+ guis/mainmenu.gui
+ script/doom_main.script
+ script/doom_defs.script
+ textures/bigchars.tga
+ textures/dummy_black.tga
+ textures/dummy_light.tga
+ textures/dummy_lighta.tga
+ textures/dummy_white.tga
+
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ Version 2, December 2004
+
+ Copyright (C) 2004 Sam Hocevar
+ 14 rue de Plaisance, 75014 Paris, France
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
+
+################################################################################
+
+The following license applies to:
+
+ textures/layout/*.tga
+
+ Copyright (C) 2009 Stefan Lautner
+ Licensed under DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE version 2,
+ see above for license text.
+
+################################################################################
+
+The following license applies to:
+
+ textures/common/caulk.tga
+ textures/common/cushion.tga
+ textures/common/full_clip.tga
+ textures/common/mirror.tga
+ textures/common/nodraw.tga
+ textures/common/player_clip.tga
+ textures/common/slick.tga
+ textures/triggers/trigger.tga
+
+ Copyright (C) 2000 William Joseph, under Public Domain
+ (according to Xreal, http://xreal.svn.sourceforge.net/viewvc/xreal/trunk/xreal/base/MEDIA.txt)
+
+################################################################################
+
+The following license applies to:
+
+ def/ammo.def
+ def/player.def
+
+ maps/test.map
+ maps/test.cm
+ maps/test.proc
+
+ materials/common.mtr
+ materials/deprecated.mtr
+ materials/layout.mtr
+ materials/triggers.mtr
+
+ strings/english.lang
+
+ textures/common/aasobstacle.tga
+ textures/common/aassolid.tga
+ textures/common/clipplus.tga
+ textures/common/clip.tga
+ textures/common/collision.tga
+ textures/common/deprecated.tga
+ textures/common/entitygui.tga
+ textures/common/entitygui2.tga
+ textures/common/entitygui3.tga
+ textures/common/ikclip.tga
+ textures/common/ladder.tga
+ textures/common/monster_clip.tga
+ textures/common/moveable_clip.tga
+ textures/common/nodrawsolid.tga
+ textures/common/noimpact.tga
+ textures/common/pdagui.tga
+ textures/common/radiochatter.tga
+ textures/common/shadow2.tga
+ textures/common/shadow.tga
+ textures/common/speaker.tga
+ textures/common/visportal.tga
+
+ textures/triggers/trigcount.tga
+ textures/triggers/trigentitynameonce.tga
+ textures/triggers/trigentityname.tga
+ textures/triggers/trigfacing.tga
+ textures/triggers/trigfade.tga
+ textures/triggers/trigflashlight.tga
+ textures/triggers/triggui.tga
+ textures/triggers/trighurt.tga
+ textures/triggers/trigmulti.tga
+ textures/triggers/trigonce.tga
+ textures/triggers/trigrelay.tga
+ textures/triggers/trigtimer.tga
+ textures/triggers/trigtouch.tga
+
+ Copyright (C) 2012 Daniel Gibson, credit would be appreciated, but is not necessary.
+ Licensed under DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE version 2,
+ see above for license text.
diff --git a/README.md b/README.md
index a6fa99c..d9f442e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,48 @@
-d3-base-assets
+D3 Base Assets
==============
-This aims to become a base for standalone games based on the free Doom3 engine
\ No newline at end of file
+This projects aims to create a standalone SDK for games based on the
+"dhewm3" Doom3 port (though it is useful with other ports as well),
+so the Open Source Doom3 Engine can be used for games without using
+any proprietary media from the game itself.
+
+Currently it's rather incomplete, especially the .def files for most
+entities are missing.
+
+The following files are not included and have to be copied from the
+original doom3 (or the demo) until dhewm3 has a working GLSL backend
+and corresponding shaders that are under a free license:
+
+> glprogs/*
+
+Probably it would also be useful to use some files from def/ to have
+more entities available in the level editor.
+I plan to have recreated versions of them with a free license in the
+future.
+
+HOWTO use this
+--------------
+
+ * Clone dhewm3, see (tested revision
+ df81835de056cd83c1692e0cc2ec432873f7ab2b)
+
+ * Apply standalone.patch (`cd /path/to/dhewm3/ ; patch -p1 < /path/to/standalone/standalone.patch`)
+ * Run cmake to create Makefiles
+ - create build dir (in this example: /path/to/build)
+ - `cd /path/to/build`
+ - `cmake -DD3XP=NO -DBASE=NO /path/to/dhewm3/neo/`
+ Note: the given options are just to speed up compiling and you may
+ need additional options to make sure the standalone/ directory
+ is used as data dir (see )
+ * Compile dhewm3. (on Linux: execute `make`)
+ * Now you can execute dhewm3. You'll get a black screen, because there
+ is no main menu GUI yet.
+ But console works as expected, so you can load the test map with
+ `map test` and quit the game with `quit`
+
+Contributions are welcome!
+
+
+Cheers,
+
+Daniel (caedes)
diff --git a/TODO.txt b/TODO.txt
new file mode 100644
index 0000000..c54c963
--- /dev/null
+++ b/TODO.txt
@@ -0,0 +1,22 @@
+Currently (at least) the following is missing:
+ * Definitions for all important entities (in def/), especially:
+ func_*, info_*, path_*, trigger_*, target_*
+
+ * GUIs, especially a main menu would be nice.
+
+ * Examples for:
+ - Player model (incl. corresponding definitions etc)
+ - Melee weapon, e.g. stick, (incl. scripts)
+ - Firewarm, e.g. Pistol, Gun, ... (incl. scripts)
+ - one or more enemies (incl. models, scripts etc; could reuse player model)
+
+ * OpenGL Shaders to replace the stuff from Doom3's glprogs/ directory
+ (maybe one of the GLSL implementations + shaders could be improved)
+
+ * A script that replaces deprecated materials with their alternatives would be nice.
+
+Everything in this SDK should be under a free license that also allows commercial
+use, e.g. WTFPL (http://sam.zoy.org/wtfpl/), a BSD-like license or a permissive
+CC License (e.g. http://creativecommons.org/licenses/by/3.0/deed.en_US).
+GPL may also be ok, but I'm trying to avoid that to make using the included assets
+easier for projects that use other non-free assets.
\ No newline at end of file
diff --git a/sabase/def/ammo.def b/sabase/def/ammo.def
new file mode 100644
index 0000000..3243841
--- /dev/null
+++ b/sabase/def/ammo.def
@@ -0,0 +1 @@
+entityDef ammo_types { }
\ No newline at end of file
diff --git a/sabase/def/engine.def b/sabase/def/engine.def
new file mode 100644
index 0000000..433afa7
--- /dev/null
+++ b/sabase/def/engine.def
@@ -0,0 +1,39 @@
+entityDef worldspawn {
+ "editor_color" "0 .5 .8"
+ "editor_mins" "?"
+ "editor_maxs" "?"
+ "no_stamina" "1"
+ "spawnclass" "idWorldspawn"
+}
+
+entityDef light {
+ "editor_color" "0 1 0"
+ "editor_mins" "-8 -8 -8"
+ "editor_maxs" "8 8 8"
+ "spawnclass" "idLight"
+}
+
+entityDef info_player_start {
+ "editor_color" "1 0 0"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 64"
+ "editor_showangle" "1"
+ "spawnclass" "idPlayerStart"
+}
+
+entityDef info_player_deathmatch {
+ "editor_color" "1 0 0"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 64"
+ "editor_showangle" "1"
+ "spawnclass" "idPlayerStart"
+}
+
+entityDef player_doommarine {
+ "spawnclass" "idPlayer"
+ "scriptobject" "player"
+}
+
+entityDef player_doommarine_mp {
+ "inherit" "player_doommarine"
+}
diff --git a/sabase/def/player.def b/sabase/def/player.def
new file mode 100644
index 0000000..e69de29
diff --git a/sabase/default.cfg b/sabase/default.cfg
new file mode 100644
index 0000000..39a08bd
--- /dev/null
+++ b/sabase/default.cfg
@@ -0,0 +1,10 @@
+unbindall
+
+bind w _forward
+bind a _moveleft
+bind s _back
+bind d _moveright
+
+bind CTRL _movedown
+bind SPACE _moveup
+bind SHIFT _speed
diff --git a/sabase/guis/chat.gui b/sabase/guis/chat.gui
new file mode 100644
index 0000000..66d3213
--- /dev/null
+++ b/sabase/guis/chat.gui
@@ -0,0 +1,6 @@
+windowDef Desktop {
+ rect 0, 0, 640, 480
+
+ backcolor 0, 0, 0, 0
+ nocursor 1
+}
\ No newline at end of file
diff --git a/sabase/guis/mainmenu.gui b/sabase/guis/mainmenu.gui
new file mode 100644
index 0000000..f1e111c
--- /dev/null
+++ b/sabase/guis/mainmenu.gui
@@ -0,0 +1,11 @@
+windowDef Desktop
+{
+ rect 0, 0, 640, 480
+ backcolor 0, 0, 0, 1
+ menugui 1
+
+ onESC
+ {
+ set "cmd" "close" ;
+ }
+}
\ No newline at end of file
diff --git a/sabase/guis/mphud.gui b/sabase/guis/mphud.gui
new file mode 100644
index 0000000..66d3213
--- /dev/null
+++ b/sabase/guis/mphud.gui
@@ -0,0 +1,6 @@
+windowDef Desktop {
+ rect 0, 0, 640, 480
+
+ backcolor 0, 0, 0, 0
+ nocursor 1
+}
\ No newline at end of file
diff --git a/sabase/guis/msg.gui b/sabase/guis/msg.gui
new file mode 100644
index 0000000..96ecd9a
--- /dev/null
+++ b/sabase/guis/msg.gui
@@ -0,0 +1,7 @@
+windowDef Desktop
+{
+ rect 0, 0, 640, 480
+
+ backcolor 0, 0, 0, 0
+ menugui 1
+}
\ No newline at end of file
diff --git a/sabase/maps/test.cm b/sabase/maps/test.cm
new file mode 100644
index 0000000..2a984d1
--- /dev/null
+++ b/sabase/maps/test.cm
@@ -0,0 +1,290 @@
+CM "1.00"
+
+18121552
+
+collisionModel "worldMap" {
+ vertices { /* numVertices = */ 57
+ /* 0 */ ( 448 256 264 )
+ /* 1 */ ( -256 256 264 )
+ /* 2 */ ( -256 -256 264 )
+ /* 3 */ ( 448 -256 264 )
+ /* 4 */ ( 448 -256 256 )
+ /* 5 */ ( 448 256 256 )
+ /* 6 */ ( -248 256 256 )
+ /* 7 */ ( 440 256 256 )
+ /* 8 */ ( 440 -248 256 )
+ /* 9 */ ( -248 -248 256 )
+ /* 10 */ ( -256 -256 256 )
+ /* 11 */ ( -256 256 256 )
+ /* 12 */ ( 440 -248 0 )
+ /* 13 */ ( -248 -248 0 )
+ /* 14 */ ( 448 -256 -8 )
+ /* 15 */ ( 448 -248 -8 )
+ /* 16 */ ( 448 -248 256 )
+ /* 17 */ ( -256 -248 -8 )
+ /* 18 */ ( -256 -256 -8 )
+ /* 19 */ ( -256 -248 256 )
+ /* 20 */ ( 448 256 0 )
+ /* 21 */ ( -256 256 0 )
+ /* 22 */ ( -256 -256 0 )
+ /* 23 */ ( 448 -256 0 )
+ /* 24 */ ( 448 256 -8 )
+ /* 25 */ ( -256 256 -8 )
+ /* 26 */ ( 448 264 264 )
+ /* 27 */ ( -256 264 264 )
+ /* 28 */ ( 448 264 -8 )
+ /* 29 */ ( -256 264 -8 )
+ /* 30 */ ( -248 256 0 )
+ /* 31 */ ( 440 256 0 )
+ /* 32 */ ( -248 256 264 )
+ /* 33 */ ( -256 -248 264 )
+ /* 34 */ ( -248 -248 264 )
+ /* 35 */ ( -248 -248 -8 )
+ /* 36 */ ( -248 256 -8 )
+ /* 37 */ ( 440 256 264 )
+ /* 38 */ ( 440 -248 264 )
+ /* 39 */ ( 448 -248 264 )
+ /* 40 */ ( 448 -248 0 )
+ /* 41 */ ( 440 0 128 )
+ /* 42 */ ( 440 192 128 )
+ /* 43 */ ( 192 192 0 )
+ /* 44 */ ( 192 0 0 )
+ /* 45 */ ( 440 192 112 )
+ /* 46 */ ( 216 192 0 )
+ /* 47 */ ( 440 0 112 )
+ /* 48 */ ( 216 0 0 )
+ /* 49 */ ( -240 64 192 )
+ /* 50 */ ( -248 64 192 )
+ /* 51 */ ( -248 -64 192 )
+ /* 52 */ ( -240 -64 192 )
+ /* 53 */ ( -240 64 64 )
+ /* 54 */ ( -248 64 64 )
+ /* 55 */ ( -240 -64 64 )
+ /* 56 */ ( -248 -64 64 )
+ }
+ edges { /* numEdges = */ 100
+ /* 0 */ ( 0 0 ) 0 0
+ /* 1 */ ( 0 1 ) 1 2
+ /* 2 */ ( 1 2 ) 0 2
+ /* 3 */ ( 2 3 ) 0 2
+ /* 4 */ ( 3 0 ) 0 2
+ /* 5 */ ( 4 5 ) 0 1
+ /* 6 */ ( 5 0 ) 1 1
+ /* 7 */ ( 3 4 ) 0 2
+ /* 8 */ ( 6 7 ) 1 2
+ /* 9 */ ( 7 8 ) 1 1
+ /* 10 */ ( 8 9 ) 1 2
+ /* 11 */ ( 9 6 ) 1 1
+ /* 12 */ ( 10 4 ) 1 2
+ /* 13 */ ( 2 10 ) 0 2
+ /* 14 */ ( 1 11 ) 1 1
+ /* 15 */ ( 11 10 ) 0 1
+ /* 16 */ ( 8 12 ) 1 1
+ /* 17 */ ( 12 13 ) 1 1
+ /* 18 */ ( 13 9 ) 1 1
+ /* 19 */ ( 14 15 ) 1 2
+ /* 20 */ ( 15 16 ) 0 1
+ /* 21 */ ( 16 4 ) 1 1
+ /* 22 */ ( 4 14 ) 0 2
+ /* 23 */ ( 17 15 ) 1 1
+ /* 24 */ ( 14 18 ) 1 2
+ /* 25 */ ( 18 17 ) 1 2
+ /* 26 */ ( 10 18 ) 0 2
+ /* 27 */ ( 10 19 ) 1 1
+ /* 28 */ ( 19 17 ) 1 1
+ /* 29 */ ( 20 21 ) 0 1
+ /* 30 */ ( 21 22 ) 0 2
+ /* 31 */ ( 22 23 ) 1 2
+ /* 32 */ ( 23 20 ) 0 2
+ /* 33 */ ( 14 24 ) 0 2
+ /* 34 */ ( 24 20 ) 1 1
+ /* 35 */ ( 23 14 ) 1 2
+ /* 36 */ ( 25 24 ) 1 2
+ /* 37 */ ( 14 18 ) 1 2
+ /* 38 */ ( 18 25 ) 0 2
+ /* 39 */ ( 22 18 ) 1 2
+ /* 40 */ ( 21 25 ) 1 1
+ /* 41 */ ( 26 27 ) 0 2
+ /* 42 */ ( 27 1 ) 0 1
+ /* 43 */ ( 0 26 ) 0 2
+ /* 44 */ ( 26 28 ) 0 2
+ /* 45 */ ( 28 29 ) 0 2
+ /* 46 */ ( 29 27 ) 0 2
+ /* 47 */ ( 24 28 ) 0 2
+ /* 48 */ ( 0 24 ) 0 1
+ /* 49 */ ( 25 29 ) 0 1
+ /* 50 */ ( 6 30 ) 1 1
+ /* 51 */ ( 30 31 ) 1 1
+ /* 52 */ ( 31 7 ) 1 1
+ /* 53 */ ( 32 1 ) 1 1
+ /* 54 */ ( 1 33 ) 1 1
+ /* 55 */ ( 33 34 ) 1 1
+ /* 56 */ ( 34 32 ) 1 2
+ /* 57 */ ( 35 36 ) 1 2
+ /* 58 */ ( 36 32 ) 0 1
+ /* 59 */ ( 34 35 ) 0 1
+ /* 60 */ ( 25 36 ) 1 1
+ /* 61 */ ( 35 17 ) 1 1
+ /* 62 */ ( 17 25 ) 1 1
+ /* 63 */ ( 17 33 ) 0 1
+ /* 64 */ ( 0 37 ) 1 1
+ /* 65 */ ( 37 38 ) 1 2
+ /* 66 */ ( 38 39 ) 1 1
+ /* 67 */ ( 39 0 ) 1 2
+ /* 68 */ ( 40 20 ) 1 1
+ /* 69 */ ( 20 0 ) 1 1
+ /* 70 */ ( 39 40 ) 0 1
+ /* 71 */ ( 37 31 ) 0 1
+ /* 72 */ ( 31 12 ) 1 1
+ /* 73 */ ( 12 38 ) 0 1
+ /* 74 */ ( 41 42 ) 1 1
+ /* 75 */ ( 42 43 ) 0 2
+ /* 76 */ ( 43 44 ) 1 1
+ /* 77 */ ( 44 41 ) 0 2
+ /* 78 */ ( 42 45 ) 1 1
+ /* 79 */ ( 45 46 ) 0 2
+ /* 80 */ ( 46 43 ) 1 1
+ /* 81 */ ( 45 47 ) 1 1
+ /* 82 */ ( 47 48 ) 0 2
+ /* 83 */ ( 48 46 ) 1 1
+ /* 84 */ ( 47 41 ) 1 1
+ /* 85 */ ( 44 48 ) 1 1
+ /* 86 */ ( 49 50 ) 0 2
+ /* 87 */ ( 50 51 ) 1 1
+ /* 88 */ ( 51 52 ) 0 2
+ /* 89 */ ( 52 49 ) 0 2
+ /* 90 */ ( 49 53 ) 0 2
+ /* 91 */ ( 53 54 ) 0 2
+ /* 92 */ ( 54 50 ) 1 1
+ /* 93 */ ( 55 53 ) 0 2
+ /* 94 */ ( 52 55 ) 0 2
+ /* 95 */ ( 55 56 ) 0 2
+ /* 96 */ ( 56 54 ) 1 1
+ /* 97 */ ( 51 56 ) 1 1
+ /* 98 */ ( 33 27 ) 0 1
+ /* 99 */ ( 29 17 ) 0 1
+ }
+ nodes {
+ ( 0 191.9999389648 )
+ ( 1 0 )
+ ( 2 128 )
+ ( -1 0 )
+ ( 1 192 )
+ ( -1 0 )
+ ( -1 0 )
+ ( -1 0 )
+ ( 1 64 )
+ ( -1 0 )
+ ( 1 -64 )
+ ( 2 64 )
+ ( 2 192 )
+ ( -1 0 )
+ ( -1 0 )
+ ( -1 0 )
+ ( -1 0 )
+ }
+ polygons /* polygonMemory = */ 2736 {
+ 4 ( -65 71 72 73 ) ( -1 0 0 ) -440 ( 440 -248 -0 ) ( 440 256 264 ) "textures/layout/wall01"
+ 4 ( 68 69 -67 70 ) ( 1 0 0 ) 448 ( 448 -248 0 ) ( 448 256 264 ) "textures/layout/wall01"
+ 4 ( 64 65 66 67 ) ( 0 0 1 ) 264 ( 440 -248 264 ) ( 448 256 264 ) "textures/layout/wall01"
+ 4 ( -8 50 51 52 ) ( 0 -1 0 ) -256 ( -248 256 0 ) ( 440 256 256 ) "textures/layout/wall01"
+ 4 ( 47 -44 -43 48 ) ( 1 0 0 ) 448 ( 448 256 -8 ) ( 448 264 264 ) "textures/layout/wall01"
+ 4 ( -41 44 45 46 ) ( 0 1 0 ) 264 ( -256 264 -8 ) ( 448 264 264 ) "textures/layout/wall01"
+ 4 ( 41 42 -1 43 ) ( 0 0 1 ) 264 ( -256 256 264 ) ( 448 264 264 ) "textures/layout/wall01"
+ 4 ( 8 9 10 11 ) ( 0 0 -1 ) -256 ( -248 -248 256 ) ( 440 256 256 ) "textures/layout/ceiling02"
+ 4 ( 5 6 -4 7 ) ( 1 0 0 ) 448 ( 448 -256 256 ) ( 448 256 264 ) "textures/layout/ceiling02"
+ 4 ( 1 2 3 4 ) ( 0 0 1 ) 264 ( -256 -256 264 ) ( 448 256 264 ) "textures/layout/ceiling02"
+ 4 ( 36 -33 37 38 ) ( 0 0 -1 ) 8 ( -256 -256 -8 ) ( 448 256 -8 ) "textures/layout/floor02"
+ 4 ( 33 34 -32 35 ) ( 1 0 0 ) 448 ( 448 -256 -8 ) ( 448 256 0 ) "textures/layout/floor02"
+ 4 ( 29 30 31 32 ) ( 0 0 1 ) 0 ( -256 -256 0 ) ( 448 256 0 ) "textures/layout/floor02"
+ 4 ( -75 78 79 80 ) ( 0 1 0 ) 192 ( 192 192 -0 ) ( 440 192 128 ) "textures/layout/stairs01"
+ 4 ( -45 -47 -36 49 ) ( 0 0 -1 ) 8 ( -256 256 -8 ) ( 448 264 -8 ) "textures/layout/wall01"
+ 4 ( 84 -77 85 -82 ) ( 0 -1 0 ) 0 ( 192 0 -0 ) ( 440 0 128 ) "textures/layout/stairs01"
+ 4 ( -79 81 82 83 ) ( 0.4472135901 0 -0.8944271803 ) 96.5981369019 ( 216.0000457764 -0 -0 ) ( 440 192 111.9999694824 ) "textures/layout/stairs01"
+ 4 ( 74 75 76 77 ) ( -0.4586429298 0 0.8886206746 ) -88.0594482422 ( 191.9999389648 -0 -0 ) ( 440 192 128 ) "textures/layout/stairs01"
+ 4 ( -37 -35 -31 39 ) ( 0 -1 0 ) 256 ( -256 -256 -8 ) ( 448 -256 0 ) "textures/layout/floor02"
+ 4 ( -24 -22 -12 26 ) ( 0 -1 0 ) 256 ( -256 -256 -8 ) ( 448 -256 256 ) "textures/layout/wall01"
+ 4 ( 23 -19 24 25 ) ( 0 0 -1 ) 8 ( -256 -256 -8 ) ( 448 -248 -8 ) "textures/layout/wall01"
+ 4 ( 19 20 21 22 ) ( 1 0 0 ) 448 ( 448 -256 -8 ) ( 448 -248 256 ) "textures/layout/wall01"
+ 4 ( -10 16 17 18 ) ( 0 1 0 ) -248 ( -248 -248 0 ) ( 440 -248 256 ) "textures/layout/wall01"
+ 4 ( 12 -7 -3 13 ) ( 0 -1 0 ) 256 ( -256 -256 256 ) ( 448 -256 264 ) "textures/layout/ceiling02"
+ 4 ( 99 63 98 -46 ) ( -1 0 0 ) 256 ( -256 -248 -8 ) ( -256 264 264 ) "textures/layout/wall01"
+ 4 ( 57 58 -56 59 ) ( 1 -0 0 ) -248 ( -248 -248 -8 ) ( -248 256 264 ) "textures/layout/wall01"
+ 4 ( -86 90 91 92 ) ( 0 1 0 ) 64 ( -248 64 64 ) ( -240 64 192 ) "textures/layout/wall02"
+ 4 ( 60 -57 61 62 ) ( 0 0 -1 ) 8 ( -256 -248 -8 ) ( -248 256 -8 ) "textures/layout/wall01"
+ 4 ( 53 54 55 56 ) ( 0 0 1 ) 264 ( -256 -248 264 ) ( -248 256 264 ) "textures/layout/wall01"
+ 4 ( -30 40 -38 -39 ) ( -1 0 0 ) 256 ( -256 -256 -8 ) ( -256 256 0 ) "textures/layout/floor02"
+ 4 ( -2 14 15 -13 ) ( -1 0 0 ) 256 ( -256 -256 256 ) ( -256 256 264 ) "textures/layout/ceiling02"
+ 4 ( 86 87 88 89 ) ( 0 0 1 ) 192 ( -248 -64 192 ) ( -240 64 192 ) "textures/layout/wall02"
+ 4 ( -95 -94 -88 97 ) ( 0 -1 0 ) 64 ( -248 -64 64 ) ( -240 -64 192 ) "textures/layout/wall02"
+ 4 ( -91 -93 95 96 ) ( 0 0 -1 ) -64 ( -248 -64 64 ) ( -240 64 64 ) "textures/layout/wall02"
+ 4 ( 93 -90 -89 94 ) ( 1 -0 0 ) -240 ( -240 -64 64 ) ( -240 64 192 ) "textures/common/mirror"
+ 4 ( 27 28 -25 -26 ) ( -1 0 0 ) 256 ( -256 -256 -8 ) ( -256 -248 256 ) "textures/layout/wall01"
+ }
+ brushes /* brushMemory = */ 1152 {
+ 6 {
+ ( 0 0 1 ) 264
+ ( 0 1 0 ) 256
+ ( 1 0 0 ) 448
+ ( 0 0 -1 ) 0
+ ( 0 -1 0 ) 248
+ ( -1 0 0 ) -440
+ } ( 440 -248 -0 ) ( 448 256 264 ) "solid,opaque"
+ 6 {
+ ( 0 0 1 ) 264
+ ( 0 1 0 ) 264
+ ( 1 0 0 ) 448
+ ( 0 0 -1 ) 8
+ ( 0 -1 0 ) -256
+ ( -1 0 0 ) 256
+ } ( -256 256 -8 ) ( 448 264 264 ) "solid,opaque"
+ 6 {
+ ( 0 0 1 ) 264
+ ( 0 1 0 ) 256
+ ( 1 0 0 ) 448
+ ( 0 0 -1 ) -256
+ ( 0 -1 0 ) 256
+ ( -1 0 0 ) 256
+ } ( -256 -256 256 ) ( 448 256 264 ) "solid,opaque"
+ 6 {
+ ( 0 0 1 ) 0
+ ( 0 1 0 ) 256
+ ( 1 0 0 ) 448
+ ( 0 0 -1 ) 8
+ ( 0 -1 0 ) 256
+ ( -1 0 0 ) 256
+ } ( -256 -256 -8 ) ( 448 256 0 ) "solid,opaque"
+ 6 {
+ ( -0.4586429298 0 0.8886206746 ) -88.0594482422
+ ( 0 1 0 ) 192
+ ( 1 0 0 ) 440
+ ( 0.4472135901 0 -0.8944271803 ) 96.5981369019
+ ( 0 -1 0 ) 0
+ ( 0 0 -1 ) 0
+ } ( 191.9999389648 0 -0 ) ( 440 192 128 ) "solid,opaque"
+ 6 {
+ ( 0 0 1 ) 256
+ ( 0 1 0 ) -248
+ ( 1 0 0 ) 448
+ ( 0 0 -1 ) 8
+ ( 0 -1 0 ) 256
+ ( -1 0 0 ) 256
+ } ( -256 -256 -8 ) ( 448 -248 256 ) "solid,opaque"
+ 6 {
+ ( 0 0 1 ) 264
+ ( 0 1 -0 ) 256
+ ( 1 -0 0 ) -248
+ ( 0 0 -1 ) 8
+ ( 0 -1 0 ) 248
+ ( -1 0 0 ) 256
+ } ( -256 -248 -8 ) ( -248 256 264 ) "solid,opaque"
+ 6 {
+ ( 0 0 1 ) 192
+ ( 0 1 0 ) 64
+ ( 1 -0 0 ) -240
+ ( 0 0 -1 ) -64
+ ( 0 -1 0 ) 64
+ ( -1 0 0 ) 248
+ } ( -248 -64 64 ) ( -240 64 192 ) "solid,opaque"
+ }
+}
diff --git a/sabase/maps/test.map b/sabase/maps/test.map
new file mode 100644
index 0000000..ce6f28a
--- /dev/null
+++ b/sabase/maps/test.map
@@ -0,0 +1,129 @@
+
+Version 2
+// entity 0
+{
+"classname" "worldspawn"
+// brush 0
+{
+brushDef3
+{
+( 0 0 1 -264 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 0 ) ) "textures/layout/ceiling02" 0 0 0
+( 0 1 0 -256 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 1.21875 ) ) "textures/layout/ceiling02" 0 0 0
+( 1 0 0 -448 ) ( ( 0.00390625 0 511.96875 ) ( 0 0.00390625 1.21875 ) ) "textures/layout/ceiling02" 0 0 0
+( 0 0 -1 256 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 511.9375 ) ) "textures/layout/ceiling02" 0 0 0
+( 0 -1 0 -256 ) ( ( 0.00390625 0 0.0625 ) ( 0 0.00390625 1.21875 ) ) "textures/layout/ceiling02" 0 0 0
+( -1 0 0 -256 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 1.21875 ) ) "textures/layout/ceiling02" 0 0 0
+}
+}
+// brush 1
+{
+brushDef3
+{
+( 0 0 1 -256 ) ( ( 0.00390625 0 2 ) ( 0 0.00390625 511.21875 ) ) "textures/layout/wall01" 0 0 0
+( 0 1 0 248 ) ( ( 0.00390625 0 0.03125 ) ( 0 0.00390625 511 ) ) "textures/layout/wall01" 0 0 0
+( 1 0 0 -448 ) ( ( 0.00390625 0 2 ) ( 0 0.00390625 0.03125 ) ) "textures/layout/wall01" 0 0 0
+( 0 0 -1 -8 ) ( ( 0.00390625 0 2 ) ( 0 0.00390625 511.96875 ) ) "textures/layout/wall01" 0 0 0
+( 0 -1 0 -256 ) ( ( 0.00390625 0 511.96875 ) ( 0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+( -1 0 0 -256 ) ( ( 0.00390625 0 510 ) ( 0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+}
+}
+// brush 2
+{
+brushDef3
+{
+( 0 0 1 -0 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 0 ) ) "textures/layout/floor02" 0 0 0
+( 0 1 0 -256 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 0.1875 ) ) "textures/layout/floor02" 0 0 0
+( 1 0 0 -448 ) ( ( 0.00390625 0 511.96875 ) ( 0 0.00390625 0.1875 ) ) "textures/layout/floor02" 0 0 0
+( 0 0 -1 -8 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 511.9375 ) ) "textures/layout/floor02" 0 0 0
+( 0 -1 0 -256 ) ( ( 0.00390625 0 0.0625 ) ( 0 0.00390625 0.1875 ) ) "textures/layout/floor02" 0 0 0
+( -1 0 0 -256 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 0.1875 ) ) "textures/layout/floor02" 0 0 0
+}
+}
+// brush 3
+{
+brushDef3
+{
+( 0 0 1 -264 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 511.28125 ) ) "textures/layout/wall01" 0 0 0
+( 0 1 0 -264 ) ( ( 0.00390625 0 0.03125 ) ( 0 0.00390625 0.0625 ) ) "textures/layout/wall01" 0 0 0
+( 1 0 0 -448 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 0.09375 ) ) "textures/layout/wall01" 0 0 0
+( 0 0 -1 -8 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 512.03125 ) ) "textures/layout/wall01" 0 0 0
+( 0 -1 0 256 ) ( ( 0.00390625 0 511.96875 ) ( 0 0.00390625 511 ) ) "textures/layout/wall01" 0 0 0
+( -1 0 0 -256 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 0.0625 ) ) "textures/layout/wall01" 0 0 0
+}
+}
+// brush 4
+{
+brushDef3
+{
+( 0 0 1 -264 ) ( ( 0.00390625 0 0.09375 ) ( 0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+( 0 1 -0 -256 ) ( ( 0.00390625 0 -0 ) ( -0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+( 1 -0 0 248 ) ( ( 0.00390625 0 -0 ) ( -0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+( 0 0 -1 -8 ) ( ( 0.00390625 0 -0 ) ( -0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+( 0 -1 0 -248 ) ( ( 0.00390625 0 -0 ) ( -0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+( -1 0 0 -256 ) ( ( 0.00390625 0 -0 ) ( -0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+}
+}
+// brush 5
+{
+brushDef3
+{
+( 0 0 1 -264 ) ( ( 0.00390625 0 0.09375 ) ( 0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+( 0 1 0 -256 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+( 1 0 0 -448 ) ( ( 0.00390625 0 511.96875 ) ( 0 0.00390625 511.96875 ) ) "textures/layout/wall01" 0 0 0
+( 0 0 -1 -0 ) ( ( 0.00390625 0 0.25 ) ( 0 0.00390625 0.125 ) ) "textures/layout/wall01" 0 0 0
+( 0 -1 0 -248 ) ( ( 0.00390625 0 -0 ) ( -0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+( -1 0 0 440 ) ( ( 0.00390625 0 -0 ) ( -0 0.00390625 0 ) ) "textures/layout/wall01" 0 0 0
+}
+}
+// brush 6
+{
+brushDef3
+{
+( -0.4586429298 0 0.8886206746 88.0594463156 ) ( ( 0.00390625 0 -0.25 ) ( -0 0.00390625 -0.3125 ) ) "textures/layout/stairs01" 0 0 0
+( 0 1 0 -192 ) ( ( 0.00390625 0 0.78125 ) ( 0 0.00390625 -0.09375 ) ) "textures/layout/stairs01" 0 0 0
+( 1 0 0 -440 ) ( ( 0.00390625 0 512 ) ( 0 0.00390625 -0.09375 ) ) "textures/layout/stairs01" 0 0 0
+( 0.4472135901 0 -0.8944271803 -96.5981331581 ) ( ( 0.00390625 0 512 ) ( 0 0.00390625 0.5625 ) ) "textures/layout/stairs01" 0 0 0
+( 0 -1 0 -0 ) ( ( 0.00390625 0 511.4375 ) ( 0 0.00390625 -0.09375 ) ) "textures/layout/stairs01" 0 0 0
+( 0 0 -1 -0 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 -0.09375 ) ) "textures/layout/stairs01" 0 0 0
+}
+}
+// brush 7
+{
+brushDef3
+{
+( 0 0 1 -192 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 0 ) ) "textures/layout/wall02" 0 0 0
+( 0 1 0 -64 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 0.03125 ) ) "textures/layout/wall02" 0 0 0
+( 1 -0 0 240 ) ( ( 0.03125 0 -0 ) ( -0 0.03125 0 ) ) "textures/common/mirror" 0 0 0
+( 0 0 -1 64 ) ( ( 0.00390625 0 0 ) ( 0 0.00390625 0 ) ) "textures/layout/wall02" 0 0 0
+( 0 -1 0 -64 ) ( ( 0.00390625 0 -0 ) ( -0 0.00390625 0 ) ) "textures/layout/wall02" 0 0 0
+( -1 0 0 -248 ) ( ( 0.00390625 0 -0 ) ( -0 0.00390625 0 ) ) "textures/layout/wall02" 0 0 0
+}
+}
+}
+// entity 1
+{
+"classname" "light"
+"name" "light_3"
+"origin" "-176.000000 96.000000 144.000000"
+"light_radius" "300.000000 300.000000 300.000000"
+}
+// entity 2
+{
+"classname" "info_player_start"
+"name" "info_player_start_1"
+"origin" "-16.000000 -88.000000 80.000000"
+}
+// entity 3
+{
+"classname" "light"
+"name" "light_1"
+"origin" "272.000000 168.000000 144.000000"
+"light_radius" "300.000000 300.000000 300.000000"
+}
+// entity 4
+{
+"classname" "light"
+"name" "light_2"
+"origin" "96.000000 -160.000000 144.000000"
+"light_radius" "300.000000 300.000000 300.000000"
+}
diff --git a/sabase/maps/test.proc b/sabase/maps/test.proc
new file mode 100644
index 0000000..029503b
--- /dev/null
+++ b/sabase/maps/test.proc
@@ -0,0 +1,150 @@
+mapProcFile003
+
+model { /* name = */ "_area0" /* numSurfaces = */ 6
+
+/* surface 0 */ { "textures/layout/ceiling02" /* numVerts = */ 4 /* numIndexes = */ 6
+( -248 -248 256 -0.96875 1.90625 0 0 -1 ) ( 440 -248 256 -0.96875 -0.78125 0 0 -1 ) ( 440 256 256 1 -0.78125 0 0 -1 )
+( -248 256 256 1 1.90625 0 0 -1 )
+0 1 2 0 2 3
+}
+
+/* surface 1 */ { "textures/layout/wall01" /* numVerts = */ 24 /* numIndexes = */ 60
+( -248 -248 0 1 0 0 1 0 ) ( 440 -248 0 -1.6875 0 0 1 0 ) ( 440 -248 256 -1.6875 -1 0 1 0 )
+( -248 -248 256 1 -1 0 1 0 ) ( -248 256 0 0 0 0 -1 0 ) ( -248 256 256 0 -1 0 -1 0 )
+( 440 256 256 2.6875 -1 0 -1 0 ) ( 440 256 0 2.6875 0 0 -1 0 ) ( -248 256 0 1 0 1 0 0 )
+( -248 64 64 0.25 -0.25 1 0 0 ) ( -248 64 192 0.25 -0.75 1 0 0 ) ( -248 256 256 1 -1 1 0 0 )
+( -248 -248 256 -0.96875 -1 1 0 0 ) ( -248 -64 192 -0.25 -0.75 1 0 0 ) ( -248 -248 0 -0.96875 0 1 0 0 )
+( -248 -64 64 -0.25 -0.25 1 0 0 ) ( 440 256 0 -1 0 -1 0 0 ) ( 440 256 256 -1 -1 -1 0 0 )
+( 440 192 128 -0.7499998212 -0.5 -1 0 0 ) ( 440 192 112 -0.7499998212 -0.4375 -1 0 0 ) ( 440 0 128 0 -0.4999999404 -1 0 0 )
+( 440 0 112 0 -0.4375000298 -1 0 0 ) ( 440 -248 256 0.9687501788 -1 -1 0 0 ) ( 440 -248 0 0.9687501788 0 -1 0 0 )
+0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11
+12 11 10 12 10 13 14 12 13 14 15 9 14 13 15 14 9 8
+16 17 18 16 18 19 20 18 17 21 16 19 22 20 17 23 16 21
+23 21 20 23 20 22
+}
+
+/* surface 2 */ { "textures/layout/floor02" /* numVerts = */ 8 /* numIndexes = */ 24
+( 440 256 0 1 1.71875 0 0 1 ) ( 216 192 0 0.75 0.84375 0 0 1 ) ( 192 192 0 0.75 0.75 0 0 1 )
+( 216 0 0 0 0.84375 0 0 1 ) ( 440 -248 0 -0.96875 1.71875 0 0 1 ) ( 192 0 0 0 0.7500000596 0 0 1 )
+( -248 256 0 1 -0.96875 0 0 1 ) ( -248 -248 0 -0.96875 -0.96875 0 0 1 )
+0 1 2 3 1 0 4 3 0 4 5 3 6 0 2 6 2 5
+7 6 5 7 5 4
+}
+
+/* surface 3 */ { "textures/layout/stairs01" /* numVerts = */ 16 /* numIndexes = */ 24
+( 440 0 128 2.15625 0.40625 0 -1 0 ) ( 440 0 112 2.15625 0.4687499702 0 -1 0 ) ( 216 0 0 1.28125 0.90625 0 -1 0 )
+( 192 0 0 1.1875 0.90625 0 -1 0 ) ( 440 0 112 0 -1.170452714 0.4472135901 0 -0.8944271803 ) ( 440 192 112 0.75 -1.170452714 0.4472135901 0 -0.8944271803 )
+( 216 192 0 0.75 -0.1921730042 0.4472135901 0 -0.8944271803 ) ( 216 0 0 0 -0.1921730042 0.4472135901 0 -0.8944271803 ) ( 440 192 128 -0.9375 0.40625 0 1 0 )
+( 192 192 0 0.0312499404 0.90625 0 1 0 ) ( 216 192 0 -0.062500298 0.90625 0 1 0 ) ( 440 192 112 -0.9375 0.46875 0 1 0 )
+( 440 192 128 0 -1.0691242218 -0.4586429298 0 0.8886206746 ) ( 440 0 128 0.7500001788 -1.0691242218 -0.4586429298 0 0.8886206746 ) ( 192 0 0 0.7500000596 0.0209824443 -0.4586429298 0 0.8886206746 )
+( 192 192 0 0 0.0209823847 -0.4586429298 0 0.8886206746 )
+0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11
+12 13 14 12 14 15
+}
+
+/* surface 4 */ { "textures/layout/wall02" /* numVerts = */ 16 /* numIndexes = */ 24
+( -240 -64 192 -0.9375 -0.75 0 -1 0 ) ( -240 -64 64 -0.9375 -0.25 0 -1 0 ) ( -248 -64 64 -0.96875 -0.25 0 -1 0 )
+( -248 -64 192 -0.96875 -0.75 0 -1 0 ) ( -248 -64 64 -0.25 0.96875 0 0 -1 ) ( -240 -64 64 -0.25 0.9375 0 0 -1 )
+( -240 64 64 0.25 0.9375 0 0 -1 ) ( -248 64 64 0.25 0.96875 0 0 -1 ) ( -240 64 64 0.9375 -0.21875 0 1 0 )
+( -240 64 192 0.9375 -0.71875 0 1 0 ) ( -248 64 192 0.96875 -0.71875 0 1 0 ) ( -248 64 64 0.96875 -0.21875 0 1 0 )
+( -240 -64 192 -0.25 -0.9374999404 0 0 1 ) ( -248 -64 192 -0.25 -0.9687499404 0 0 1 ) ( -248 64 192 0.25 -0.9687499404 0 0 1 )
+( -240 64 192 0.25 -0.9374999404 0 0 1 )
+0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11
+12 13 14 12 14 15
+}
+
+/* surface 5 */ { "textures/common/mirror" /* numVerts = */ 4 /* numIndexes = */ 6
+( -240 -64 192 -2 -6 1 0 0 ) ( -240 64 192 2 -6 1 0 0 ) ( -240 64 64 2 -2 1 0 0 )
+( -240 -64 64 -2 -2 1 0 0 )
+0 1 2 0 2 3
+}
+
+}
+
+shadowModel { /* name = */ "_prelight_light_3"
+
+/* numVerts = */ 104 /* noCaps = */ 72 /* noFrontCaps = */ 114 /* numIndexes = */ 156 /* planeBits = */ 42
+( -248 64 192 ) ( -476 -37.3333320618 344 ) ( -248 24 192 ) ( -476 -204 344 ) ( -248 64 192 )
+( -476 -37.3333320618 344 ) ( -245.647064209 26.3529396057 192 ) ( -476 -204 350.756652832 ) ( -240 64 192 ) ( -476 -54 369 )
+( -245.647064209 26.3529434204 192 ) ( -476 -204 350.756652832 ) ( -248 64 192 ) ( -476 -37.3333320618 344 ) ( -240 64 192 )
+( -476 -54 369 ) ( -240 32 192 ) ( -476 -204 369 ) ( -248 24 192 ) ( -476 -204 344 )
+( -248 64 192 ) ( -476 -37.3333320618 344 ) ( -240 64 192 ) ( -476 -54 369 ) ( -240 32 192 )
+( -476 -204 369 ) ( -240 -64 192 ) ( -296 -204 234 ) ( -248 -64 192 ) ( -311 -204 234 )
+( -240 -64 192 ) ( -296 -204 234 ) ( -248 -64 192 ) ( -311 -204 234 ) ( -248 24 192 )
+( -476 -204 344 ) ( -245.647064209 26.3529434204 192 ) ( -476 -204 350.7567749023 ) ( -240 -64 192 ) ( -296 -204 234 )
+( -245.647064209 26.3529434204 192 ) ( -476 -204 350.7567749023 ) ( -240 32 192 ) ( -476 -204 369 ) ( -248 -64 64 )
+( -311 -204 -6 ) ( -240 -64 64 ) ( -296 -204 -6 ) ( -248 -64 64 ) ( -311 -204 -6 )
+( -240 -64 64 ) ( -296 -204 -6 ) ( -240 16 64 ) ( -416 -204 -156 ) ( -243 16 64 )
+( -427.2499694824 -204 -156 ) ( -248 -64 64 ) ( -311 -204 -6 ) ( -243 16 64 ) ( -427.2499694824 -204 -156 )
+( -248 16 64 ) ( -446 -204 -156 ) ( -248 -64 192 ) ( -311 -204 234 ) ( -248 24 192 )
+( -476 -204 344 ) ( -240 32 192 ) ( -476 -204 369 ) ( -240 -64 192 ) ( -296 -204 234 )
+( -240 -64 64 ) ( -296 -204 -6 ) ( -240 16 64 ) ( -416 -204 -156 ) ( -248 16 64 )
+( -446 -204 -156 ) ( -248 -64 64 ) ( -311 -204 -6 ) ( -240 64 64 ) ( -416 -24 -156 )
+( -240 16 64 ) ( -416 -204 -156 ) ( -240 64 64 ) ( -416 -24 -156 ) ( -243 16 64 )
+( -427.25 -204 -156 ) ( -248 64 64 ) ( -446 -24 -156 ) ( -243 16 64 ) ( -427.25 -204 -156 )
+( -240 64 64 ) ( -416 -24 -156 ) ( -248 64 64 ) ( -446 -24 -156 ) ( -248 16 64 )
+( -446 -204 -156 ) ( -240 16 64 ) ( -416 -204 -156 ) ( -240 64 64 ) ( -416 -24 -156 )
+( -248 64 64 ) ( -446 -24 -156 ) ( -248 16 64 ) ( -446 -204 -156 )
+18 20 19 20 21 19 0 8 1 8 9 1 22 24 25 22 25 23
+62 64 63 64 65 63 66 68 69 66 69 67 70 72 71 72 73 71
+74 76 77 74 77 75 26 46 47 26 47 27 44 28 45 28 29 45
+96 98 97 98 99 97 78 86 87 78 87 79 100 102 103 100 103 101
+3 5 7 11 13 15 11 15 17 31 33 35 31 35 37 39 41 43
+49 51 53 49 53 55 57 59 61 27 47 45 27 45 29 81 83 85
+89 91 93 89 93 95 6 4 2 14 12 10 16 14 10 34 32 30
+36 34 30 42 40 38 52 50 48 54 52 48 60 58 56 44 46 26
+28 44 26 84 82 80 92 90 88 94 92 88
+}
+
+shadowModel { /* name = */ "_prelight_light_1"
+
+/* numVerts = */ 98 /* noCaps = */ 60 /* noFrontCaps = */ 108 /* numIndexes = */ 156 /* planeBits = */ 41
+( 440 192 128 ) ( 572 210.8571472168 115.4285736084 ) ( 440 192 128 ) ( 572 210.8571472168 115.4285736084 ) ( 339.7446594238 192 76.2553100586 )
+( 572 274.2814331055 -156 ) ( 343.2727050781 192 72.7272644043 ) ( 572 269.0204162598 -156 ) ( 440 192 112 ) ( 572 210.8571472168 86.8571472168 )
+( 440 192 128 ) ( 572 210.8571472168 115.4285736084 ) ( 343.2727050781 192 72.7272644043 ) ( 572 269.0204162598 -156 ) ( 349.3333129883 192 66.6666641235 )
+( 572 261.103515625 -156 ) ( 440 192 112 ) ( 572 210.8571472168 86.8571472168 ) ( 440 0 112 ) ( 572 -132 86.8571472168 )
+( 440 0 112 ) ( 572 -132 86.8571472168 ) ( 440 192 112 ) ( 572 210.8571472168 86.8571472168 ) ( 349.3333129883 192 66.6666564941 )
+( 572 261.103515625 -156 ) ( 349.3333129883 90.6666564941 66.6666564941 ) ( 572 -132 -156 ) ( 440 192 128 ) ( 572 210.8571472168 115.4285736084 )
+( 339.7446594238 192 76.2553100586 ) ( 572 274.2814331055 -156 ) ( 440 0 112 ) ( 572 -132 86.8571472168 ) ( 440 0 112 )
+( 572 -132 86.8571472168 ) ( 349.3333129883 90.6666564941 66.6666641235 ) ( 572 -132 -156 ) ( 339.7894897461 85.8947296143 61.894744873 ) ( 519.6923217773 -132 -156 )
+( 216 0 0 ) ( 172 -132 -113.1428604126 ) ( 440 0 112 ) ( 572 -132 86.8571472168 ) ( 339.7894897461 85.8947372437 61.8947372437 )
+( 519.6923217773 -132 -156 ) ( 216 24 0 ) ( 155.3333282471 -132 -156 ) ( 216 0 0 ) ( 172 -132 -113.1428604126 )
+( 440 0 128 ) ( 572 -132 115.4285736084 ) ( 192 0 0 ) ( 129.1428527832 -132 -113.1428604126 ) ( 216 24 0 )
+( 155.3333282471 -132 -156 ) ( 216 0 0 ) ( 172 -132 -113.1428604126 ) ( 192 192 0 ) ( 105.3333358765 218 -156 )
+( 216 192 0 ) ( 155.3333282471 218 -156 ) ( 339.7446594238 192 76.2553100586 ) ( 572 274.2814025879 -156 ) ( 192 192 0 )
+( 105.3333358765 218 -156 ) ( 216 192 0 ) ( 155.3333282471 218 -156 ) ( 343.2727050781 192 72.7272644043 ) ( 572 269.0203857422 -156 )
+( 343.2727050781 192 72.7272644043 ) ( 572 269.0203857422 -156 ) ( 216 192 0 ) ( 155.3333282471 218 -156 ) ( 349.3333129883 192 66.6666564941 )
+( 572 261.1034240723 -156 ) ( 349.3333129883 192 66.6666564941 ) ( 572 261.1034240723 -156 ) ( 216 192 0 ) ( 155.3333282471 218 -156 )
+( 339.7894897461 85.8947296143 61.8947372437 ) ( 519.6923217773 -132 -156 ) ( 349.3333129883 90.6666488647 66.6666564941 ) ( 572 -132 -156 ) ( 339.7894592285 85.8947296143 61.8947372437 )
+( 519.6922607422 -132 -156 ) ( 216 192 0 ) ( 155.3333282471 218 -156 ) ( 216 24 0 ) ( 155.3333282471 -132 -156 )
+( 339.7446594238 192 76.2553100586 ) ( 572 274.2814025879 -156 ) ( 192 192 0 ) ( 105.3333358765 218 -156 ) ( 216 192 0 )
+( 155.3333282471 218 -156 ) ( 216 24 0 ) ( 155.3333282471 -132 -156 )
+28 30 31 28 31 29 8 0 9 0 1 9 18 8 19 8 9 19
+54 56 57 54 57 55 50 32 33 50 33 51 40 52 53 40 53 41
+52 50 53 50 51 53 90 92 93 90 93 91 58 60 59 60 61 59
+94 96 97 94 97 95 3 5 7 11 13 15 11 15 17 21 23 25
+21 25 27 35 37 39 43 45 47 43 47 49 51 33 41 51 41 53
+63 65 67 63 67 69 71 73 75 77 79 81 77 81 83 85 87 89
+6 4 2 14 12 10 16 14 10 24 22 20 26 24 20 38 36 34
+46 44 42 48 46 42 40 32 50 52 40 50 66 64 62 68 66 62
+74 72 70 80 78 76 82 80 76 88 86 84
+}
+
+shadowModel { /* name = */ "_prelight_light_2"
+
+/* numVerts = */ 44 /* noCaps = */ 30 /* noFrontCaps = */ 45 /* numIndexes = */ 60 /* planeBits = */ 5
+( 396 0 90 ) ( 396 0 90 ) ( 396 140 90 ) ( 396 140 90 ) ( 396 0 90 )
+( 396 0 90 ) ( 396 140 90 ) ( 396 140 90 ) ( 317.25 61.25 50.625 ) ( 396 140 17.389831543 )
+( 396 0 90 ) ( 396 0 90 ) ( 317.25 61.25 50.625 ) ( 396 140 17.389831543 ) ( 256 0 20 )
+( 396 140 -88.5 ) ( 256 0 20 ) ( 396 140 -88.5 ) ( 396 0 90 ) ( 396 0 90 )
+( 396 140 90 ) ( 396 140 90 ) ( 216 140 0 ) ( 216 140 0 ) ( 396 140 90 )
+( 396 140 90 ) ( 216 140 0 ) ( 216 140 0 ) ( 317.25 61.25 50.625 ) ( 396 140 17.389831543 )
+( 216 0 0 ) ( 321 140 -126 ) ( 317.25 61.25 50.625 ) ( 396 140 17.389831543 ) ( 216 140 0 )
+( 216 140 0 ) ( 216 0 0 ) ( 321 140 -126 ) ( 256 0 20 ) ( 396 140 -88.5 )
+( 216 0 0 ) ( 321 140 -126 ) ( 256 0 20 ) ( 396 140 -88.5 )
+0 2 1 2 3 1 16 18 17 18 19 17 20 22 23 20 23 21
+22 30 31 22 31 23 40 42 41 42 43 41 5 7 9 11 13 15
+25 27 29 33 35 37 33 37 39 8 6 4 14 12 10 28 26 24
+36 34 32 38 36 32
+}
+
diff --git a/sabase/materials/base.mtr b/sabase/materials/base.mtr
new file mode 100644
index 0000000..e276a3c
--- /dev/null
+++ b/sabase/materials/base.mtr
@@ -0,0 +1,9 @@
+_default {
+ {
+ map _default
+ }
+}
+
+_tracemodel {
+ collision
+}
diff --git a/sabase/materials/common.mtr b/sabase/materials/common.mtr
new file mode 100644
index 0000000..85ea564
--- /dev/null
+++ b/sabase/materials/common.mtr
@@ -0,0 +1,326 @@
+// all that stuff in textures/common/ - invisible in the game, used in the editor
+// for clipping, some entites etc
+//
+// the materials have the same properties as the ones from Doom3 (I hope),
+// but were rewritten from scratch.
+//
+// (C) 2012 Daniel Gibson, licensed under WTPFL v2 (see COPYING.txt)
+
+// "// FIXME: TRANSPARENCY" means that I'd like this to be half-transparent
+// in the radiant - but I don't know how to do that in a portable way (so it
+// works in d3radiant, netradiant, DarkRadiant, ...) yet.
+
+
+// create obstacle in AAS
+textures/common/aasobstacle
+{
+ qer_editorimage textures/common/aasobstacle.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ aasobstacle
+
+ nonsolid
+ noShadows
+}
+
+// create solid brush in AAS
+textures/common/aassolid
+{
+ qer_editorimage textures/common/aassolid.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ aassolid
+
+ nonsolid
+ noShadows
+}
+
+// to be used by func_radiochatter
+textures/editor/radiochatter
+{
+ qer_editorimage textures/common/radiochatter.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+
+ noShadows
+}
+
+// this defines a portal, seperating areas of the map.
+// when within the players POV it's "open", else "closed".
+// if it's in a func_door it's closed when the door is closed.
+// see http://www.modwiki.net/wiki/Visportal
+textures/common/visportal
+{
+ qer_editorimage textures/common/visportal.tga
+ areaportal
+
+ noShadows
+}
+
+
+// ##################################################################################
+
+// use this to seal off places that cannot be possibly seen by the player.
+// e.g. behind patches (you can't see through them, but they don't seal off your
+// map to the void/other areas, thus possibly causing leaks).
+// http://www.modwiki.net/wiki/Caulk
+textures/common/caulk
+{
+ qer_editorimage textures/common/caulk.tga
+ forceOpaque
+
+ noShadows
+}
+
+// to be used with models: if they has faces (at least one..) with such a texture,
+// these faces (and not the visible ones) are used for collision detection
+textures/common/collision
+{
+ qer_editorimage textures/common/collision.tga
+ collision
+
noShadows
+}
+
+// invisible face that is solid to the player,
+// but doesn't deal falling damage. Kinda like a cushion..
+// Useful to put above jump pads etc
+textures/common/cushion
+{
+ qer_editorimage textures/common/cushion.tga
+ nodamage
+ nonsolid
+ playerclip
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// the player can climb brushes with this material.
+// mostly solid, but not for projectiles
+textures/common/ladder
+{
+ qer_editorimage textures/common/ladder.tga
+ ladder
+ playerclip
+ monsterclip
+ nonsolid
+ noimpact
+
+ noShadows
+}
+
+// a simple mirror
+textures/common/mirror
+{
+ qer_editorimage textures/common/mirror.tga
+ mirror
+
+ {
+ blend add
+ //map textures/common/mirror.tga
+ }
+
+ discrete
+ solid
+}
+
+// Faces with this texture aren't drawn and are not solid.
+// useful e.g. if you don't want all faces of your brush to be drawn
+// or for most sides of a visportal brush
+textures/common/nodraw
+{
+ qer_editorimage textures/common/nodraw.tga
+ nonsolid
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// For faces (or whole brushes) that are invisible but have collision
+// (i.e. nothing can pass them)
+textures/common/nodrawsolid
+{
+ qer_editorimage textures/common/nodrawsolid.tga
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// projectiles will just disappear into brushes with this texture
+// instead of exploding or similar
+textures/common/noimpact
+{
+ qer_editorimage textures/common/noimpact
+ noimpact
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// For brushes that are invisible but cast shadows anyway
+textures/common/shadow
+{
+ qer_editorimage textures/common/shadow.tga
+ forceShadows
+ nonsolid
+ // FIXME: TRANSPARENCY
+}
+
+// For brushes that are invisible but cast shadows anyway - *but* don't cast
+// shadows upon themselves or other faces with "noselfshadow" materials
+textures/common/shadow2
+{
+ qer_editorimage textures/common/shadow2.tga
+ forceshadows
+ noSelfShadow
+ nonsolid
+ // FIXME: TRANSPARENCY
+}
+
+// brushes with this (invisible) texture cause the player to slide
+textures/common/slick
+{
+ qer_editorimage textures/common/slick.tga
+ slick
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// ########## Clips ##########
+
+// solid for monsters and players, but not for missiles
+textures/common/clip
+{
+ qer_editorimage textures/common/clip.tga
+ monsterclip
+ playerclip
+ noimpact
+
+ nonsolid
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// clips everything, just like a solid brush
+textures/common/clip_full
+{
+ qer_editorimage textures/common/full_clip.tga
+ monsterclip
+ playerclip
+ moveableclip
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// solid only for inverse kinematics, i.e. makes feet stay on top of this
+// see http://www.iddevnet.com/doom3/walkik.php and
+// http://en.wikipedia.org/wiki/Inverse_kinematics#Inverse_kinematics_and_3D_animation
+textures/common/clip_ik
+{
+ qer_editorimage textures/common/ikclip.tga
+ ikclip
+
+ nonsolid
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// solid only for monsters
+textures/common/clip_monsters
+{
+ qer_editorimage textures/common/monster_clip.tga
+ monsterclip
+
+ nonsolid
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// only solid for moveables (e.g. articulated figures, rigid bodies)
+textures/common/clip_moveables
+{
+ qer_editorimage textures/common/moveable_clip.tga
+ moveableclip
+
+ nonsolid
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// solid only for players, not for monsters, projectiles etc
+textures/common/clip_player
+{
+ qer_editorimage textures/common/player_clip.tga
+ playerclip
+ noimpact
+
+ nonsolid
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// like normal clip, but also clips moveables (e.g. articulated figures, rigid bodies)
+textures/common/clip_plusmovables
+{
+ qer_editorimage textures/common/clipplus.tga
+ monsterclip
+ playerclip
+ noimpact
+ moveableclip
+
+ nonsolid
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+
+// ########## GUI surfaces ##########
+
+// for GUI (interactive) surfaces on entities.
+// the entity must have a "gui" key with a path to an
+// appropriate GUI file, e.g. "guis/wurst.gui"
+textures/common/entityGui
+{
+ qer_editorimage textures/common/entitygui.tga
+ guisurf entity
+
+ playerclip
+ discrete
+}
+
+// for additional (second) GUI (interactive) surfaces on entities.
+// the entity must have a "gui2" key with a path to an
+// appropriate GUI file, e.g. "guis/wurst2.gui"
+textures/common/entityGui2
+{
+ qer_editorimage textures/common/entitygui2.tga
+ guisurf entity2
+
+ playerclip
+ discrete
+}
+
+// for additional (third) GUI (interactive) surfaces on entities.
+// the entity must have a "gui3" key with a path to an
+// appropriate GUI file, e.g. "guis/wurst3.gui"
+textures/common/entityGui3
+{
+ qer_editorimage textures/common/entitygui3.tga
+ guisurf entity3
+
+ playerclip
+ discrete
+}
+
+// FIXME: not sure what this is for and if it's even used
+textures/common/pda_gui
+{
+ qer_editorimage textures/common/pdagui.tga
+
+ // guisurf TODO: path to gui for level-map or something like that
+
+ discrete
+}
+
+
+// TODO: particle (not even sure what that is supposed to do or if it's used)
+
+// Note: triggers are in another file
diff --git a/sabase/materials/deprecated.mtr b/sabase/materials/deprecated.mtr
new file mode 100644
index 0000000..6909872
--- /dev/null
+++ b/sabase/materials/deprecated.mtr
@@ -0,0 +1,206 @@
+// for backwards compatibility (with existing doom3 maps etc):
+// some materials that I renamed or moved to another dir.
+// These are the original paths and names
+//
+// The materials have the same properties as the ones from Doom3 (I hope),
+// but were rewritten from scratch.
+//
+// (C) 2012 Daniel Gibson, licensed under WTPFL v2 (see COPYING.txt)
+
+// "deprecated" means that another version of the shader (with a different
+// name or even in a different pseudo-dir) should be preferred
+
+// same as textures/common/aasobstacle
+textures/editor/aasobstacle
+{
+ qer_editorimage textures/common/aasobstacle.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ aasobstacle
+
+ nonsolid
+ noShadows
+}
+
+// same as textures/common/aassolid
+textures/editor/aassolid
+{
+ qer_editorimage textures/common/aassolid.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ aassolid
+
+ nonsolid
+ noShadows
+}
+
+// same as textures/common/visportal
+textures/editor/visportal
+{
+ qer_editorimage textures/common/visportal.tga
+ areaportal
+
+ noShadows
+}
+
+// ########## Clips ##########
+// I renamed some clips from blaclip or bla_clip to clip_bla so all clips start with clip
+
+// same as clip_full
+textures/common/full_clip
+{
+ qer_editorimage textures/common/full_clip.tga
+ monsterclip
+ playerclip
+ moveableclip
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// same as clip_ik
+textures/common/ik_clip
+{
+ qer_editorimage textures/common/ikclip.tga
+ ikclip
+
+ nonsolid
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// same as clip_monsters
+textures/common/monster_clip
+{
+ qer_editorimage textures/common/monster_clip.tga
+ monsterclip
+
+ nonsolid
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// same as clip_moveables
+textures/common/moveable_clip
+{
+ qer_editorimage textures/common/moveable_clip.tga
+ moveableclip
+
+ nonsolid
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+// same as clip_player
+textures/common/player_clip
+{
+ qer_editorimage textures/common/player_clip.tga
+ playerclip
+ noimpact
+
+ nonsolid
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+
+// ########## triggers ##########
+// prefer to use the ones in textures/triggers/
+
+textures/common/trigger
+{
+ qer_editorimage textures/triggers/trigger.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/common/trigentityname
+{
+ qer_editorimage textures/triggers/trigentityname.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/common/trigentityname_once
+{
+ qer_editorimage textures/triggers/trigentitynameonce.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/common/trigfade
+{
+ qer_editorimage textures/triggers/trigfade.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/common/trigflashlight
+{
+ qer_editorimage textures/triggers/trigflashlight.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ flashlight_trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/common/triggui
+{
+ qer_editorimage textures/triggers/triggui.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/common/trighurt
+{
+ qer_editorimage textures/triggers/trighurt.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/common/trigmulti
+{
+ qer_editorimage textures/triggers/trigmulti.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/common/trigonce
+{
+ qer_editorimage textures/triggers/trigonce.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/common/trigtimer
+{
+ qer_editorimage textures/triggers/trigtimer.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
diff --git a/sabase/materials/dummy.mtr b/sabase/materials/dummy.mtr
new file mode 100644
index 0000000..0fe1bc1
--- /dev/null
+++ b/sabase/materials/dummy.mtr
@@ -0,0 +1,16 @@
+textures/colors/black
+{
+ diffusemap textures/dummy_black.tga
+}
+
+textures/colors/white
+{
+ diffusemap textures/dummy_white.tga
+}
+
+lights/defaultPointLight {
+ lightFalloffImage makeintensity(textures/dummy_lighta.tga)
+ {
+ map textures/dummy_light.tga
+ }
+}
diff --git a/sabase/materials/layout.mtr b/sabase/materials/layout.mtr
new file mode 100644
index 0000000..b7cdb01
--- /dev/null
+++ b/sabase/materials/layout.mtr
@@ -0,0 +1,85 @@
+// Materials for Reflex's Layout Textures
+
+textures/layout/blend01
+{
+ qer_editorimage textures/layout/blend01_a.tga
+ {
+ blend diffusemap
+ map textures/layout/blend01_a.tga
+ vertexColor
+ }
+ {
+ blend diffusemap
+ map textures/layout/blend01_b.tga
+ inverseVertexColor
+ }
+}
+
+textures/layout/ceiling01
+{
+ qer_editorimage textures/layout/ceiling01.tga
+ diffusemap textures/layout/ceiling01.tga
+}
+
+textures/layout/ceiling02
+{
+ qer_editorimage textures/layout/ceiling02.tga
+ diffusemap textures/layout/ceiling02.tga
+}
+
+textures/layout/floor01
+{
+ qer_editorimage textures/layout/floor01.tga
+ diffusemap textures/layout/floor01.tga
+}
+
+textures/layout/floor02
+{
+ qer_editorimage textures/layout/floor02.tga
+ diffusemap textures/layout/floor02.tga
+}
+
+textures/layout/lift01
+{
+ qer_editorimage textures/layout/lift01.tga
+ diffusemap textures/layout/lift01.tga
+}
+
+textures/layout/pad01
+{
+ qer_editorimage textures/layout/pad01.tga
+ diffusemap textures/layout/pad01.tga
+}
+
+textures/layout/pad02
+{
+ qer_editorimage textures/layout/pad02.tga
+ diffusemap textures/layout/pad02.tga
+}
+
+textures/layout/stairs01
+{
+ qer_editorimage textures/layout/stairs01.tga
+ diffusemap textures/layout/stairs01.tga
+}
+
+textures/layout/wall01
+{
+ qer_editorimage textures/layout/wall01.tga
+ diffusemap textures/layout/wall01.tga
+}
+
+textures/layout/wall02
+{
+ qer_editorimage textures/layout/wall02.tga
+ diffusemap textures/layout/wall02.tga
+}
+
+// we have no wallwalk, so don't use the texture to prevent confusion
+// textures/layout/wallwalk01
+// {
+// qer_editorimage textures/layout/wallwalk01.tga
+// diffusemap textures/layout/wallwalk01.tga
+//
+// wallwalk
+// }
diff --git a/sabase/materials/triggers.mtr b/sabase/materials/triggers.mtr
new file mode 100644
index 0000000..a592f9c
--- /dev/null
+++ b/sabase/materials/triggers.mtr
@@ -0,0 +1,116 @@
+// all these textures are used by trigger entities and are otherwise (mostly?) useless I think.
+//
+// the materials have the same properties as the ones from Doom3 (I hope),
+// but were rewritten from scratch.
+//
+// (C) 2012 Daniel Gibson, licensed under WTPFL v2 (see COPYING.txt)
+
+textures/triggers/trigger
+{
+ qer_editorimage textures/triggers/trigger.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/triggers/trigentityname
+{
+ qer_editorimage textures/triggers/trigentityname.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/triggers/trigentityname_once
+{
+ qer_editorimage textures/triggers/trigentitynameonce.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/triggers/trigfade
+{
+ qer_editorimage textures/triggers/trigfade.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/triggers/trigflashlight
+{
+ qer_editorimage textures/triggers/trigflashlight.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ flashlight_trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/triggers/triggui
+{
+ qer_editorimage textures/triggers/triggui.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/triggers/trighurt
+{
+ qer_editorimage textures/triggers/trighurt.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/triggers/trigmulti
+{
+ qer_editorimage textures/triggers/trigmulti.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/triggers/trigonce
+{
+ qer_editorimage textures/triggers/trigonce.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/triggers/trigrelay
+{
+ qer_editorimage textures/triggers/trigrelay.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
+
+textures/triggers/trigtimer
+{
+ qer_editorimage textures/triggers/trigtimer.tga
+ qer_nocarve // disallow CSG operations on brushes with this texture
+ trigger
+
+ noShadows
+ // FIXME: TRANSPARENCY
+}
diff --git a/sabase/script/doom_defs.script b/sabase/script/doom_defs.script
new file mode 100644
index 0000000..e69de29
diff --git a/sabase/script/doom_main.script b/sabase/script/doom_main.script
new file mode 100644
index 0000000..14d4233
--- /dev/null
+++ b/sabase/script/doom_main.script
@@ -0,0 +1,29 @@
+object player {
+ void init();
+ boolean AI_FORWARD;
+ boolean AI_BACKWARD;
+ boolean AI_STRAFE_LEFT;
+ boolean AI_STRAFE_RIGHT;
+ boolean AI_ATTACK_HELD;
+ boolean AI_WEAPON_FIRED;
+ boolean AI_JUMP;
+ boolean AI_DEAD;
+ boolean AI_CROUCH;
+ boolean AI_ONGROUND;
+ boolean AI_ONLADDER;
+ boolean AI_RUN;
+ boolean AI_HARDLANDING;
+ boolean AI_SOFTLANDING;
+ boolean AI_RELOAD;
+ boolean AI_PAIN;
+ boolean AI_TELEPORT;
+ boolean AI_TURN_LEFT;
+ boolean AI_TURN_RIGHT;
+ void RaiseWeapon();
+};
+
+void player::init() {
+}
+
+void player::RaiseWeapon() {
+}
diff --git a/sabase/strings/english.lang b/sabase/strings/english.lang
new file mode 100644
index 0000000..381dec5
--- /dev/null
+++ b/sabase/strings/english.lang
@@ -0,0 +1,15 @@
+{
+ "#str_04343" "Loading.."
+ "#str_04344" "Event Initialization.."
+ "#str_04345" "Executing Startup Commands.."
+ "#str_04346" "Sound Initialization.."
+ "#str_04347" "Network Initialization.."
+ "#str_04348" "Render System Initialization.."
+ "#str_04349" "User Interface Initialization.."
+ "#str_04350" "Loading Game.."
+ "#str_04351" "Menu Initialization.."
+
+ "#str_07186" "Unknown"
+ // FIXME: the next string should be changed according to game, I guess
+ "#str_07212" "dhewm3"
+}
\ No newline at end of file
diff --git a/sabase/textures/bigchars.tga b/sabase/textures/bigchars.tga
new file mode 100644
index 0000000..ea525f2
Binary files /dev/null and b/sabase/textures/bigchars.tga differ
diff --git a/sabase/textures/common/aasobstacle.tga b/sabase/textures/common/aasobstacle.tga
new file mode 100644
index 0000000..c3b9286
Binary files /dev/null and b/sabase/textures/common/aasobstacle.tga differ
diff --git a/sabase/textures/common/aassolid.tga b/sabase/textures/common/aassolid.tga
new file mode 100644
index 0000000..e20c10c
Binary files /dev/null and b/sabase/textures/common/aassolid.tga differ
diff --git a/sabase/textures/common/caulk.tga b/sabase/textures/common/caulk.tga
new file mode 100644
index 0000000..a7c8204
Binary files /dev/null and b/sabase/textures/common/caulk.tga differ
diff --git a/sabase/textures/common/clip.tga b/sabase/textures/common/clip.tga
new file mode 100644
index 0000000..3cb2411
Binary files /dev/null and b/sabase/textures/common/clip.tga differ
diff --git a/sabase/textures/common/clipplus.tga b/sabase/textures/common/clipplus.tga
new file mode 100644
index 0000000..25b5175
Binary files /dev/null and b/sabase/textures/common/clipplus.tga differ
diff --git a/sabase/textures/common/collision.tga b/sabase/textures/common/collision.tga
new file mode 100644
index 0000000..6f1350d
Binary files /dev/null and b/sabase/textures/common/collision.tga differ
diff --git a/sabase/textures/common/cushion.tga b/sabase/textures/common/cushion.tga
new file mode 100644
index 0000000..9755214
Binary files /dev/null and b/sabase/textures/common/cushion.tga differ
diff --git a/sabase/textures/common/deprecated.tga b/sabase/textures/common/deprecated.tga
new file mode 100644
index 0000000..e71e2c9
Binary files /dev/null and b/sabase/textures/common/deprecated.tga differ
diff --git a/sabase/textures/common/entitygui.tga b/sabase/textures/common/entitygui.tga
new file mode 100644
index 0000000..030e8c1
Binary files /dev/null and b/sabase/textures/common/entitygui.tga differ
diff --git a/sabase/textures/common/entitygui2.tga b/sabase/textures/common/entitygui2.tga
new file mode 100644
index 0000000..b76e66b
Binary files /dev/null and b/sabase/textures/common/entitygui2.tga differ
diff --git a/sabase/textures/common/entitygui3.tga b/sabase/textures/common/entitygui3.tga
new file mode 100644
index 0000000..7ab2d0a
Binary files /dev/null and b/sabase/textures/common/entitygui3.tga differ
diff --git a/sabase/textures/common/full_clip.tga b/sabase/textures/common/full_clip.tga
new file mode 100644
index 0000000..1d99c2d
Binary files /dev/null and b/sabase/textures/common/full_clip.tga differ
diff --git a/sabase/textures/common/ikclip.tga b/sabase/textures/common/ikclip.tga
new file mode 100644
index 0000000..fa361d6
Binary files /dev/null and b/sabase/textures/common/ikclip.tga differ
diff --git a/sabase/textures/common/ladder.tga b/sabase/textures/common/ladder.tga
new file mode 100644
index 0000000..f2a8924
Binary files /dev/null and b/sabase/textures/common/ladder.tga differ
diff --git a/sabase/textures/common/mirror.tga b/sabase/textures/common/mirror.tga
new file mode 100644
index 0000000..c10b747
Binary files /dev/null and b/sabase/textures/common/mirror.tga differ
diff --git a/sabase/textures/common/monster_clip.tga b/sabase/textures/common/monster_clip.tga
new file mode 100644
index 0000000..bfe63ac
Binary files /dev/null and b/sabase/textures/common/monster_clip.tga differ
diff --git a/sabase/textures/common/moveable_clip.tga b/sabase/textures/common/moveable_clip.tga
new file mode 100644
index 0000000..706def9
Binary files /dev/null and b/sabase/textures/common/moveable_clip.tga differ
diff --git a/sabase/textures/common/nodraw.tga b/sabase/textures/common/nodraw.tga
new file mode 100644
index 0000000..9701698
Binary files /dev/null and b/sabase/textures/common/nodraw.tga differ
diff --git a/sabase/textures/common/nodrawsolid.tga b/sabase/textures/common/nodrawsolid.tga
new file mode 100644
index 0000000..50976a6
Binary files /dev/null and b/sabase/textures/common/nodrawsolid.tga differ
diff --git a/sabase/textures/common/noimpact.tga b/sabase/textures/common/noimpact.tga
new file mode 100644
index 0000000..302a431
Binary files /dev/null and b/sabase/textures/common/noimpact.tga differ
diff --git a/sabase/textures/common/pdagui.tga b/sabase/textures/common/pdagui.tga
new file mode 100644
index 0000000..a32930b
Binary files /dev/null and b/sabase/textures/common/pdagui.tga differ
diff --git a/sabase/textures/common/player_clip.tga b/sabase/textures/common/player_clip.tga
new file mode 100644
index 0000000..91b6f14
Binary files /dev/null and b/sabase/textures/common/player_clip.tga differ
diff --git a/sabase/textures/common/radiochatter.tga b/sabase/textures/common/radiochatter.tga
new file mode 100644
index 0000000..4e8cae8
Binary files /dev/null and b/sabase/textures/common/radiochatter.tga differ
diff --git a/sabase/textures/common/shadow.tga b/sabase/textures/common/shadow.tga
new file mode 100644
index 0000000..613e6c8
Binary files /dev/null and b/sabase/textures/common/shadow.tga differ
diff --git a/sabase/textures/common/shadow2.tga b/sabase/textures/common/shadow2.tga
new file mode 100644
index 0000000..01745ab
Binary files /dev/null and b/sabase/textures/common/shadow2.tga differ
diff --git a/sabase/textures/common/slick.tga b/sabase/textures/common/slick.tga
new file mode 100644
index 0000000..2204f39
Binary files /dev/null and b/sabase/textures/common/slick.tga differ
diff --git a/sabase/textures/common/speaker.tga b/sabase/textures/common/speaker.tga
new file mode 100644
index 0000000..1095d31
Binary files /dev/null and b/sabase/textures/common/speaker.tga differ
diff --git a/sabase/textures/common/visportal.tga b/sabase/textures/common/visportal.tga
new file mode 100644
index 0000000..4cc801f
Binary files /dev/null and b/sabase/textures/common/visportal.tga differ
diff --git a/sabase/textures/dummy_black.tga b/sabase/textures/dummy_black.tga
new file mode 100644
index 0000000..fb5c02c
Binary files /dev/null and b/sabase/textures/dummy_black.tga differ
diff --git a/sabase/textures/dummy_light.tga b/sabase/textures/dummy_light.tga
new file mode 100644
index 0000000..9936a69
Binary files /dev/null and b/sabase/textures/dummy_light.tga differ
diff --git a/sabase/textures/dummy_lighta.tga b/sabase/textures/dummy_lighta.tga
new file mode 100644
index 0000000..383e757
Binary files /dev/null and b/sabase/textures/dummy_lighta.tga differ
diff --git a/sabase/textures/dummy_white.tga b/sabase/textures/dummy_white.tga
new file mode 100644
index 0000000..bde2737
Binary files /dev/null and b/sabase/textures/dummy_white.tga differ
diff --git a/sabase/textures/layout/blend01_a.tga b/sabase/textures/layout/blend01_a.tga
new file mode 100644
index 0000000..4409eda
Binary files /dev/null and b/sabase/textures/layout/blend01_a.tga differ
diff --git a/sabase/textures/layout/blend01_b.tga b/sabase/textures/layout/blend01_b.tga
new file mode 100644
index 0000000..cd474ad
Binary files /dev/null and b/sabase/textures/layout/blend01_b.tga differ
diff --git a/sabase/textures/layout/ceiling01.tga b/sabase/textures/layout/ceiling01.tga
new file mode 100644
index 0000000..c259608
Binary files /dev/null and b/sabase/textures/layout/ceiling01.tga differ
diff --git a/sabase/textures/layout/ceiling02.tga b/sabase/textures/layout/ceiling02.tga
new file mode 100644
index 0000000..0e27656
Binary files /dev/null and b/sabase/textures/layout/ceiling02.tga differ
diff --git a/sabase/textures/layout/floor01.tga b/sabase/textures/layout/floor01.tga
new file mode 100644
index 0000000..7f3578e
Binary files /dev/null and b/sabase/textures/layout/floor01.tga differ
diff --git a/sabase/textures/layout/floor02.tga b/sabase/textures/layout/floor02.tga
new file mode 100644
index 0000000..74d0a00
Binary files /dev/null and b/sabase/textures/layout/floor02.tga differ
diff --git a/sabase/textures/layout/lift01.tga b/sabase/textures/layout/lift01.tga
new file mode 100644
index 0000000..b87e4cf
Binary files /dev/null and b/sabase/textures/layout/lift01.tga differ
diff --git a/sabase/textures/layout/pad01.tga b/sabase/textures/layout/pad01.tga
new file mode 100644
index 0000000..fefa24d
Binary files /dev/null and b/sabase/textures/layout/pad01.tga differ
diff --git a/sabase/textures/layout/pad02.tga b/sabase/textures/layout/pad02.tga
new file mode 100644
index 0000000..79aea66
Binary files /dev/null and b/sabase/textures/layout/pad02.tga differ
diff --git a/sabase/textures/layout/stairs01.tga b/sabase/textures/layout/stairs01.tga
new file mode 100644
index 0000000..141378a
Binary files /dev/null and b/sabase/textures/layout/stairs01.tga differ
diff --git a/sabase/textures/layout/wall01.tga b/sabase/textures/layout/wall01.tga
new file mode 100644
index 0000000..f214ad4
Binary files /dev/null and b/sabase/textures/layout/wall01.tga differ
diff --git a/sabase/textures/layout/wall02.tga b/sabase/textures/layout/wall02.tga
new file mode 100644
index 0000000..de0946d
Binary files /dev/null and b/sabase/textures/layout/wall02.tga differ
diff --git a/sabase/textures/layout/wallwalk01.tga b/sabase/textures/layout/wallwalk01.tga
new file mode 100644
index 0000000..908f261
Binary files /dev/null and b/sabase/textures/layout/wallwalk01.tga differ
diff --git a/sabase/textures/triggers/trigcount.tga b/sabase/textures/triggers/trigcount.tga
new file mode 100644
index 0000000..234b347
Binary files /dev/null and b/sabase/textures/triggers/trigcount.tga differ
diff --git a/sabase/textures/triggers/trigentityname.tga b/sabase/textures/triggers/trigentityname.tga
new file mode 100644
index 0000000..49324c7
Binary files /dev/null and b/sabase/textures/triggers/trigentityname.tga differ
diff --git a/sabase/textures/triggers/trigentitynameonce.tga b/sabase/textures/triggers/trigentitynameonce.tga
new file mode 100644
index 0000000..21e78dc
Binary files /dev/null and b/sabase/textures/triggers/trigentitynameonce.tga differ
diff --git a/sabase/textures/triggers/trigfacing.tga b/sabase/textures/triggers/trigfacing.tga
new file mode 100644
index 0000000..56a1779
Binary files /dev/null and b/sabase/textures/triggers/trigfacing.tga differ
diff --git a/sabase/textures/triggers/trigfade.tga b/sabase/textures/triggers/trigfade.tga
new file mode 100644
index 0000000..42e2f53
Binary files /dev/null and b/sabase/textures/triggers/trigfade.tga differ
diff --git a/sabase/textures/triggers/trigflashlight.tga b/sabase/textures/triggers/trigflashlight.tga
new file mode 100644
index 0000000..c9a2ebd
Binary files /dev/null and b/sabase/textures/triggers/trigflashlight.tga differ
diff --git a/sabase/textures/triggers/trigger.tga b/sabase/textures/triggers/trigger.tga
new file mode 100644
index 0000000..965ef81
Binary files /dev/null and b/sabase/textures/triggers/trigger.tga differ
diff --git a/sabase/textures/triggers/triggui.tga b/sabase/textures/triggers/triggui.tga
new file mode 100644
index 0000000..9b90a4e
Binary files /dev/null and b/sabase/textures/triggers/triggui.tga differ
diff --git a/sabase/textures/triggers/trighurt.tga b/sabase/textures/triggers/trighurt.tga
new file mode 100644
index 0000000..d8b04dd
Binary files /dev/null and b/sabase/textures/triggers/trighurt.tga differ
diff --git a/sabase/textures/triggers/trigmulti.tga b/sabase/textures/triggers/trigmulti.tga
new file mode 100644
index 0000000..b89b49e
Binary files /dev/null and b/sabase/textures/triggers/trigmulti.tga differ
diff --git a/sabase/textures/triggers/trigonce.tga b/sabase/textures/triggers/trigonce.tga
new file mode 100644
index 0000000..ee7e8ea
Binary files /dev/null and b/sabase/textures/triggers/trigonce.tga differ
diff --git a/sabase/textures/triggers/trigrelay.tga b/sabase/textures/triggers/trigrelay.tga
new file mode 100644
index 0000000..62fe1fa
Binary files /dev/null and b/sabase/textures/triggers/trigrelay.tga differ
diff --git a/sabase/textures/triggers/trigtimer.tga b/sabase/textures/triggers/trigtimer.tga
new file mode 100644
index 0000000..fe5112d
Binary files /dev/null and b/sabase/textures/triggers/trigtimer.tga differ
diff --git a/sabase/textures/triggers/trigtouch.tga b/sabase/textures/triggers/trigtouch.tga
new file mode 100644
index 0000000..d176c3f
Binary files /dev/null and b/sabase/textures/triggers/trigtouch.tga differ
diff --git a/standalone.patch b/standalone.patch
new file mode 100644
index 0000000..eba300c
--- /dev/null
+++ b/standalone.patch
@@ -0,0 +1,123 @@
+diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt
+index e159bcb..cb94029 100644
+--- a/neo/CMakeLists.txt
++++ b/neo/CMakeLists.txt
+@@ -26,6 +26,7 @@ include(GNUInstallDirs OPTIONAL RESULT_VARIABLE GNUINSTALLDIRS)
+
+ option(CORE "Build the core" ON)
+ option(BASE "Build the base game code" ON)
++option(SABASE "Build the standalone base game code" ON)
+ option(D3XP "Build the d3xp game code" ON)
+ option(DEDICATED "Build the dedicated server" OFF)
+ option(ONATIVE "Optimize for the host CPU" OFF)
+@@ -811,6 +812,24 @@ if(BASE)
+ endif()
+ endif()
+
++if(SABASE)
++ add_library(sabase SHARED ${src_d3xp})
++ set_target_properties(sabase PROPERTIES PREFIX "")
++ set_target_properties(sabase PROPERTIES COMPILE_DEFINITIONS "GAME_DLL;_D3XP;CTF")
++ set_target_properties(sabase PROPERTIES COMPILE_FLAGS "-I${CMAKE_SOURCE_DIR}/d3xp")
++ set_target_properties(sabase PROPERTIES LINK_FLAGS "${ldflags}")
++ set_target_properties(sabase PROPERTIES INSTALL_NAME_DIR "@executable_path")
++ target_link_libraries(sabase idlib)
++
++ if(NOT APPLE AND NOT WIN32)
++ install(TARGETS sabase
++ RUNTIME DESTINATION "${bindir}"
++ LIBRARY DESTINATION "${libdir}"
++ ARCHIVE DESTINATION "${libdir}"
++ )
++ endif()
++endif()
++
+ if(D3XP)
+ add_library(d3xp SHARED ${src_d3xp})
+ set_target_properties(d3xp PROPERTIES PREFIX "")
+diff --git a/neo/d3xp/Player.cpp b/neo/d3xp/Player.cpp
+index dc779df..5350496 100644
+--- a/neo/d3xp/Player.cpp
++++ b/neo/d3xp/Player.cpp
+@@ -1645,19 +1645,19 @@ void idPlayer::Init( void ) {
+ value = spawnArgs.GetString( "bone_hips", "" );
+ hipJoint = animator.GetJointHandle( value );
+ if ( hipJoint == INVALID_JOINT ) {
+- gameLocal.Error( "Joint '%s' not found for 'bone_hips' on '%s'", value, name.c_str() );
++ gameLocal.Warning( "Joint '%s' not found for 'bone_hips' on '%s'", value, name.c_str() );
+ }
+
+ value = spawnArgs.GetString( "bone_chest", "" );
+ chestJoint = animator.GetJointHandle( value );
+ if ( chestJoint == INVALID_JOINT ) {
+- gameLocal.Error( "Joint '%s' not found for 'bone_chest' on '%s'", value, name.c_str() );
++ gameLocal.Warning( "Joint '%s' not found for 'bone_chest' on '%s'", value, name.c_str() );
+ }
+
+ value = spawnArgs.GetString( "bone_head", "" );
+ headJoint = animator.GetJointHandle( value );
+ if ( headJoint == INVALID_JOINT ) {
+- gameLocal.Error( "Joint '%s' not found for 'bone_head' on '%s'", value, name.c_str() );
++ gameLocal.Warning( "Joint '%s' not found for 'bone_head' on '%s'", value, name.c_str() );
+ }
+
+ // initialize the script variables
+@@ -5003,7 +5003,11 @@ void idPlayer::UpdateWeapon( void ) {
+ if ( idealWeapon != -1 ) {
+ animPrefix = spawnArgs.GetString( va( "def_weapon%d", idealWeapon ) );
+ weapon.GetEntity()->GetWeaponDef( animPrefix, inventory.clip[ idealWeapon ] );
+- assert( weapon.GetEntity()->IsLinked() );
++ if ( ! weapon.GetEntity()->IsLinked() ) {
++ // as long as the standalone sdk has no weapons, this should be ignored..
++ // gameLocal.Warning( "Couldn't get a weapon!" );
++ return;
++ }
+ } else {
+ return;
+ }
+diff --git a/neo/framework/BuildDefines.h b/neo/framework/BuildDefines.h
+index 750fd37..8e5eb6d 100644
+--- a/neo/framework/BuildDefines.h
++++ b/neo/framework/BuildDefines.h
+@@ -75,13 +75,8 @@ If you have questions concerning this license or the applicable additional terms
+ #define ID_ALLOW_TOOLS
+ #endif
+
+-#ifndef ID_ENFORCE_KEY
+-# if !defined( ID_DEDICATED )
+-# define ID_ENFORCE_KEY 1
+-# else
+-# define ID_ENFORCE_KEY 0
+-# endif
+-#endif
++// disable cd-key check
++#define ID_ENFORCE_KEY 0
+
+ // async network
+
+diff --git a/neo/framework/FileSystem.cpp b/neo/framework/FileSystem.cpp
+index e09c89e..a7d59e3 100644
+--- a/neo/framework/FileSystem.cpp
++++ b/neo/framework/FileSystem.cpp
+@@ -1716,7 +1716,7 @@ idModList *idFileSystemLocal::ListMods( void ) {
+
+ dirs.Remove( "." );
+ dirs.Remove( ".." );
+- dirs.Remove( "base" );
++ dirs.Remove( BASE_GAMEDIR );
+ dirs.Remove( "pb" );
+
+ // see if there are any pk4 files in each directory
+diff --git a/neo/framework/Licensee.h b/neo/framework/Licensee.h
+index 9cc20fb..673faa1 100644
+--- a/neo/framework/Licensee.h
++++ b/neo/framework/Licensee.h
+@@ -39,7 +39,7 @@ If you have questions concerning this license or the applicable additional terms
+ #define ENGINE_VERSION "dhewm 1.3.1" // printed in console
+
+ // paths
+-#define BASE_GAMEDIR "base"
++#define BASE_GAMEDIR "sabase"
+
+ // filenames
+ #define CONFIG_FILE "dhewm.cfg"